【轉】Linux驅動模塊編譯進內核中


原文網址:http://blog.chinaunix.net/uid-29287950-id-4573481.html

BQ27501驅動編譯進內核

 

一、       驅動程序編譯進內核的步驟

在 linux 內核中增加程序需要完成以下三項工作:

1. 將編寫的源代碼復制到 Linux 內核源代碼的相應目錄;

2. 在目錄的 Kconfig 文件中增加新源代碼對應項目的編譯配置選項;

3. 在目錄的 Makefile 文件中增加對新源代碼的編譯條目。

 

bq27501驅動編譯到內核中具體步驟如下:

1.      先將驅動代碼bq27501文件夾復制到 ti-davinci/drivers/ 目錄下。

確定bq27501驅動模塊應在內核源代碼樹中處於何處。

設備驅動程序存放在內核源碼樹根目錄 drivers/ 的子目錄下,在其內部,設備驅動文件進一步按照類別,類型等有序地組織起來。

a. 字符設備存在於 drivers/char/ 目錄下

b. 塊設備存放在 drivers/block/ 目錄下

c. USB 設備則存放在 drivers/usb/ 目錄下。

注意:

(1) 此處的文件組織規則並非絕對不變,例如: USB 設備也屬於字符設備,也可以存放在 drivers/usb/ 目錄下。

(2) 在 drivers/char/ 目錄下,在該目錄下同時存在大量的 C 源代碼文件和許多其他目錄。所有對於僅僅只有一兩個源文件的設備驅動程序,可以直接存放在該目錄下,但如果驅動程序包含許多源文件和其他輔助文件,那么可以創建一個新子目錄。

(3) bq27501的驅動是屬於字符設備驅動類別,雖然驅動相關的文件只有兩個,但是為了方面查看,將相關文件放在了bq27501的文件夾中。在 drivers/char/目錄下增加新的設備過程比較簡單,但是在drivers/下直接添加新的設備稍微復雜點。所以下面首先給出在drivers /下添加bq27501驅動的過程,然后再簡單說明在drivers/char/目錄下添加的過程。

 

2.      在/bq27501下面新建一個Makefile文件。向里面添加代碼:

obj-$(CONFIG_BQ27501)+=bq27501.o

此時,構建系統運行就將會進入 bq27501/ 目錄下,並且將bq27501.c 編譯為 bq27501.o

3.      在/bq27501下面新建Kconfig文件。添加代碼:

menu "bq27501 driver"

 

config BQ27501

tristate"BQ27501"

default y

---help---

  Say 'Y' here, it will be compiled into thekernel; If you choose 'M', it will be compiled into a module named asbq27501.ko.

endmenu

注意:help中的文字不能加回車符,否則make menuconfig編譯的時候會報錯。

4.     修改/drivers目錄下的Kconfig文 件,在endmenu之前添加一條語句‘source drivers/bq27501/Kconfig’ 對於驅動程序,Kconfig 通常和源代碼處於同一目錄。 若建立了一個新的目錄,而且也希望 Kconfig 文件存在於該目錄中的話,那么就必須在一個已存在的 Kconfig 文件中將它引入,需要用上面的語句將其掛接在 drivers 目錄中的Kconfig 中。

 

5.      修改/drivers目下Makefile文件,添加‘obj-$(CONFIG_BQ27501)         +=bq27501/’。這行編譯指令告訴模塊構建系統在編譯模塊時需要進入 bq27501/ 子目錄中。此時的驅動程序的編譯取決於一個特殊配置 CONFIG_BQ27501 配置選項。

 

6.      修改arch/arm目錄下的Kconfig文件,在menu "Device Drivers……endmenu"直接添加語句

[cpp]  view plain copy
  1. source "drivers/bq27501/Kconfig"  

 

 

7.      正確配置好之后,使用make menuconfig命令,在DeviceDrivers菜單下面,可以找到bq27501 driver的選項,如下圖(1)所示:

圖(1)

 

使用“空格”鍵選擇“*”號,表示將該模塊編譯進內核中。如下圖(2)所示:

圖(2)

 

8.      刪除驅動模塊。首先刪除drivers目錄下的bq27501文件夾,然后再刪除Makefile和Kconfig中添加的語句。

9.      以上將bq27501的驅動放在drivers目錄下,若將該驅動模塊放在drivers/char目錄下,那么修改的是drivers/char下的Makefile和Kconfig文件,arch/arm/Kconfig不需要修改。

二、        驅動模塊自動執行

bq27501驅動作為模塊動態加載到內核中的時候,是使用“insmod bq27501.ko”這個命令手動加載。bq27501驅動選擇編入到內核中,在內核啟動過程中會自動加載內核並且調用module_init函數指向 的驅動模塊初始化函數。所以在不需要添加額外的代碼來加載驅動模塊。

三、        自動創建設備節點

在動態加載驅動模塊時,是利用mknod命令手動創建設備節點,Linux內核提供了一組函數,可以在模塊加載時自動在/dev目錄下創建相應的設備節點,並在卸載該模塊時刪除該節點。

在bq27501_init函數中的register_chrdev后面添加下面語句:

bq27501_class=class_create(THIS_MODULE,"bq27501_class");

       if(IS_ERR(bq27501_class)){

              printk(KERN_ALERT"Err:failed in creating class.\n");

              return-1;

       }

       class_device_create(bq27501_class,MKDEV(BQ27501_MAJOR,0),NULL,"bq27501",0);

class_create函數,在/sysfs下面創建自己的類,第一參數指定類的所有者是哪個模塊,第二個參數指定類名。

class_device_create函數,在sysfs中注冊設備,並會創建一個相應的節點;第一參數指定所要創建的設備所從屬的類,第二個參 數是設備號,第三個參數是這個設備的父設備,如果沒有就指定為NULL,第四個參數是設備名稱,第五個參數是從設備號。(新的內核版本該函數為 device_create,參數的順序有所變化)。

內核啟動完成之后,使用“cat /proc/devices”命令,可以查看到bq27501已經成功添加到系統中。如下:

Character devices:

  1 mem

  2 pty

  3 ttyp

  4 /dev/vc/0

  4 tty

  4 ttyS

  5 /dev/tty

  5 /dev/console

  5 /dev/ptmx

  7 vcs

 10 misc

 13 input

 14 sound

 29 fb

 81 video4linux

 89 i2c

 90 mtd

128 ptm

136 pts

225 bq27501

249 csl

250 DM355_IPC_MSGQ

251 dm350mmap

252 cmem

253 DM355AEW

254 DM355IPIPE

 

Block devices:

  1 ramdisk

  7 loop

  8 sd

 31 mtdblock

 65 sd

 66 sd

 67 sd

 68 sd

 69 sd

 70 sd

 71 sd

128 sd

129 sd

130 sd

131 sd

132 sd

133 sd

134 sd

135 sd

253 sbull

254 mmc

有部分知識參考http://blog.csdn.net/tigerjb/article/details/6426321,在此表示感謝!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM