在Linux內核中,添加驅動代碼一般有3部:
-
將代碼拷貝到Linux內核代碼恰當的地方
-
新建或者修改對應的kconfig文件
-
新建或修改對應的makefile文件
下面先介紹這些文件的用途,然後以具體的例子加以說明,最後解釋一下它們的語法。
一、作用
Kconfig ---> (每個源碼目錄下)提供編譯選項 .config ---> (源碼頂層目錄下)保存選擇結果 Makefile---> (每個源碼目錄下)根據.config中的內容來告知編譯系統如何編譯
1.deconfig 文件
一般由平臺廠商提供,內核編譯用做.config的參考,注意:如果,缺少該文件,無法進行編譯。
文件位於:\kernel..\arch\arm\configs\xxx_defconfig
2.kconfig
分佈在各目錄下的Kconfig構成了一個分佈式的內核配置數據庫,每個Kconfig分別描述了所屬目錄源文件相關的內核配置菜單。在內核配置make menuconfig(或xconfig等)時,從Kconfig中讀出配置菜單,用戶配置完後保存到.config(在頂層目錄下生成)中。
3.makefile
分佈在各個目錄下,用於集成編譯。
4.config 文件
在內核編譯時,主Makefile調用這個.config,用於或者用於的內核編譯配置。當我們在內核源碼目錄下輸入make menuconfig時,在出現的菜單界面中選擇一項時,它會自動更新.config相應項的值。如果我們沒有選擇,則會在.config問下插入一行註釋(# CONFIG_TOUCHSCREEN_GT9xx is not set)
文件位於 :kernel...\out\xxx_defconfig.config
二、例子
1、在driver目錄下新建一個目錄
mkdir driver/test 1
進入test目錄,創建Kconfig文件
config TEST bool "Test Driver" help test hao test
2、第二步 配置Makefile
在同樣的目錄中,新建一個Makefile
obj-$(CONFIG_TEST) += test.o
Obj-$(CONFIG選項名) += xxx.o /*當CONFIG選項名=y時,表示對應目錄下的xxx.c將被編譯進內核 當CONFIG_選項名=m時對應目錄下的xxx.c將被編譯成模塊*/
3、配置上層目錄的Makefile與Kconfig
kconfig末尾添加:
source "drivers/test/Kconfig"
makefile添加:
obj-$(CONFIG_TEST) += test/
或者
obj-y += test/
到這裏就加完了,還需要讓它能夠在編譯內核時會被編譯到,還需
4、使能之
有兩個方法:
(1)、deconfig文件
在該文件中添加
CONFIG_TEST=y/m
(2)、Kconfig文件
修改驅動對應目錄下的kconfig文件
config TEST bool "Test Driver" + default y help test hao test
三、語法
1、kconfig文件
CONFIG宏變量參數
-
bool: 表示該CONFIG宏只能選擇y(編譯內核)或者n(不編譯),不能選擇m(編譯爲模塊)
-
tristate: 表示該CONFIG宏可以設置y/m/n三種模式(tristate)
-
string: 表示該CONFIG宏可以設爲一串字符,比如#define CONFIG_XXX "config test"
-
hex: 表示該CONFIG宏可以設爲一個十六進制,比如#define CONFIG_XXX 0x1234
-
int: 表示該CONFIG宏可以設爲一個整數,比如#define CONFIG_XXX 1234
常用參數
-
default y: 表示默認是勾上的,當然也可以寫爲default m或者default n
-
help: 幫助提示信息
-
depends on:依賴項,比如depends on XXX 表示當前宏需要CONFIG_ XXX宏打開的前提下,才能設置它 (注意依賴項的config參數只有bool或tristate纔有效)
-
select : 反依賴項,和depends on剛好相反,比如 selecton XXX表示當前宏如果是y或者m,則會自動設置XXX=y或者m(注意參數只有bool或tristate纔有效)
-
choice: 會生成一個單選框,裏面通過多選一方式選擇config,需要注意choice中的config參數只能bool或tristate
-
prompt: 提示信息,如果對於choice而言,則會用來當做一個單選框入口點的標籤
-
range : 設置用戶輸入的數據範圍,比如range 0 100表示數據只能位於0~100
-
menuconfig: menuconfig XXX和config XXX類似,唯一不同的是該選項除了能設置y/m/n外,還可以實現菜單效果(能回車進入該項內部)
2、makefile