1. 程式人生 > >Linux-Kconfig總結與分析

Linux-Kconfig總結與分析

con 復選框 有效 內容 生成 clas 修改 依賴 width

使用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

技術分享圖片


未完,後續再遇到不懂的再總結~

Linux-Kconfig總結與分析