標籤:
原文網址: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 plaincopy
- 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,在此表示感謝!
【轉】Linux驅動模組編譯進核心中