歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Android內核驅動開發中的Kconfig文件結構分析(圖文)

Android內核驅動開發中的Kconfig文件結構分析(圖文)

日期:2017/3/1 10:41:15   编辑:Linux編程

1 Kconfig和Makefile

毫不誇張地說,Kconfig和Makefile是我們浏覽內核代碼時最為依仗的兩個文件。基本上,Linux 內核中每一個目錄下邊都會有一個Kconfig文件和一個Makefile文件。Kconfig和Makefile就好似一個城市的地圖,地圖引導我們去 認識一個城市,而Kconfig和Makefile則可以讓我們了解一個內核目錄下面的結構。在希望研究內核的某個子系統、某個驅動或其他某個部分時,都 有必要首先仔細閱讀一下相關目錄下的Kconfig和Makefile文件。

分布到各目錄的Kconfig構成了一個分布式的內核配置數據庫,每個Kconfig分別描述了所屬目錄源文檔相關的內核配置菜單。在內核配置make menuconfig時,從Kconfig中讀出菜單,用戶選擇後保存到.config的內核配置文檔中。 在內核編譯時,主Makefile調用這個.config,就知道了用戶的選擇。

假如想使這個驅動被編譯,則要修改Makefile文件,因此,需要添加新的驅動時,需要修改的文件有兩個:Kconfig,Makefile.

2 菜單組織結構

一般一個Kconfig文件表示的就是一個菜單,一個菜單由多個菜單項組成,其格式如下:

  1. menu 菜單名
  2. 菜單項或菜單鏈接1
  3. 菜單項或菜單鏈接2
  4. ...
  5. 菜單項或菜單鏈接n
  6. endmenu
其中菜單項就是指菜單的子菜單,所謂菜單鏈接就是指鏈接到另一個Kconfig文件,如此一下,菜單就可以實現隨意嵌套了.

例如:

  1. # drivers/Kconfig
  2. menu "Device Drivers"
  3. source "drivers/base/Kconfig"
  4. source "drivers/connector/Kconfig"
  5. source "drivers/mtd/Kconfig"
  6. source "drivers/of/Kconfig"
  7. source "drivers/parport/Kconfig"
  8. source "drivers/pnp/Kconfig"
  9. source "drivers/block/Kconfig"
  10. source "drivers/hello/Kconfig"
  11. config test
  12. bool "提示字符串"
  13. default y
  14. ...
  15. endmenu

2.1 菜單項

語法:

  1. config <symbol>
  2. <config options>
<symbol>為一符號,就好像代碼中的局部變量x一樣,可用於後邊的表達式中.

例如:

  1. config UEVENT_HELPER_PATH
  2. string "path to uevent helper"
  3. depends on HOTPLUG
  4. default "/sbin/hotplug"
  5. help
  6. Path to uevent helper program forked by the kernel for
  7. every uevent.
上面菜單項的屬性string表示菜單的類型,每一個菜單項必須有一個類型.

注:每個config菜單項都會產生一個配置選項CONFIG_XXX, XXX即為<symbol>. 如上,則會產生一個配置項:CONFIG_UEVENT_HELPER_PATH,此配置項的值記錄在內核根目錄下的隱藏文件.config內, 例:~/WORKING_DIRECTORY/kernel/goldfish/.config文件內.

2.2 菜單鏈接

菜單鏈接的格式如下:

  1. source "路徑"
如:
  1. source "drivers/pnp/Kconfig"

2.3 菜單屬性

2.3.1 類型

類型可以是:bool、tristate、string、hex和int。

bool類型的只能選中或不選中,選中為y,不選中為n.

tristate類型的菜單項為值可為三種值,多了編譯成內核模塊的選項。其值可為y,n,m.

string類型表示需要用戶輸入一串字符串。

hex類型則需要用戶輸入一個16進制數。

int類型表示用戶輸入一個整型.

總結:

菜單類型屬性就好比一個控件,bool相當於單選框,trstate相當於有三種狀態的復選框,string相當於供用戶輸入字符串的文本編輯框,hex相當於供用戶輸入16進制數的文本編輯框,而int就相當於供用戶輸入整型數的文本編輯框。

類型關鍵字後邊可跟隨提示字符,也可以不跟隨,取決於情況。如:

  1. string "path to uevent helper"
  1. bool "Prevent firmware from being built"
注:每一個菜單項必須有類型屬性。

2.3.2 默認值

默認值屬性default一般在類型屬性後邊,如:

  1. config UEVENT_HELPER_PATH
  2. string "path to uevent helper"
  3. default "/sbin/hotplug"
表示當前菜單項若用戶沒有選擇或輸入任何值時,所取的默認值.上述所示為當前的默認值為"/sbin/totplug".

2.3.3 依賴

依賴可以是"depends on"或"requires".

語法:

  1. depends on/requires <expr>
<expre>為表達式,可為之前定義的菜單項名.

如:

  1. depends on HOTPLUG
表示此菜單項顯示與否取決於另外一個菜單項HOTPLUG ,只有當菜單項HOTPLUG這個菜單項有效顯示,當前菜單項才會顯示。

例如:

  1. config MODULES
  2. bool "Enable loadable module support"
  3. config MODVERSIONS
  4. bool "Set version information on all module symbols"
  5. depends on MODULES
  6. comment "module support disabled"
  7. depends on !MODULES
菜單項MODVERSIONS的顯示與否取決於菜單項MODULES。這種信賴關系常用在子菜單項中。

2.3.4 選擇

語法:

  1. choice
  2. 選擇項
  3. ..
  4. endchoice

2.3.5 提示

語法:

  1. comment "提示信息字符串"
  2. comment選項

comment只是用來給用戶提示信息的,後跟字符串,此字符串也可以在終端中顯示。

comment選項只可以是deponds on。

Copyright © Linux教程網 All Rights Reserved