使用Kconfig時,需要注意的地方
- 1.在Kconfig中定義的配置宏,前綴都沒有"CONFIG_",只有編譯內核時,自動生成autoconf.h才會出現前綴.
- 2.如果XX_defconfig板卡配置文件中定義新的宏=y時,而在Kconfig並沒有聲明它,則內核編譯出來的autoconf.h里也不會定義它的.
- 3.如果XX_defconfig板卡配置文件中沒有設置CONFIG_MODULES=y,則編譯make modules時將會失敗,而make menuconfig時, Kconfig中的tristate參數也會被讀寫為bool參數(也就是不能設置m)
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外,還可以實現菜單效果(能回車進入該項內部)
示例1-創建復選框(多選多)-探索宏變量參數
接下來我們來試試如何給不同宏設置不同參數,以MY_SYMBOL1~ MY_SYMBOL5為例
設置MY_SYMBOL3~ MY_SYMBOL5依賴於MY_SYMBOL2
修改內核頂層Kconfig文件,添加內容:
menuconfig MY_SYMBOL_TEST #生成一個菜單宏項 bool "MY_SYMBOL_TEST" default y config MY_SYMBOL1 bool "my symbol is bool" default y depends on MY_SYMBOL_TEST config MY_SYMBOL2 tristate "my symbo2 is tristate" default m depends on MY_SYMBOL_TEST config MY_SYMBOL3 string "my symbo3 is string" default "test symbo3" depends on MY_SYMBOL2 && MY_SYMBOL_TEST config MY_SYMBOL4 hex "my symbo4 is hex" range 0 0x2000 #設置hex區間 default 0x1234 depends on MY_SYMBOL2 && MY_SYMBOL_TEST config MY_SYMBOL5 int "my symbo5 is int" range 0 2000 #設置int區間 default 1234 depends on MY_SYMBOL2 && MY_SYMBOL_TEST
效果如下所示:
如上圖所示,可以看到我們設置my symbol5超出區間[0,2000]時,直接數據報錯
編譯內核后,查看自動生成的autoconf.h,定義如下:
其中上面的CONFIG_MY_SYMBOL2_MODULE宏是因為我們在Kconfig設置它為default m,所以CONFIG_MY_SYMBOL2_MODULE是個模塊宏.
示例2-通過choice創建單選框(多選一)
choice prompt "choice example" #作為該單選框入口點的標簽 default y default MY_SYMBOL3 #默認選擇MY_SYMBOL3配置項 config MY_SYMBOL1 bool "my symbol1 is bool" help MY_SYMBOL1 example config MY_SYMBOL2 bool "my symbo2 is bool" help MY_SYMBOL2 example config MY_SYMBOL3 tristate "my symbo3 is tristate" help MY_SYMBOL3 example
endchoice
編譯內核后,查看autoconf.h,如下圖所示,可以看到對於choice單選框來說,tristate屬性其實並沒有module功能,只有y/n
未完,后續再遇到不懂的再總結~