分類: 嵌入式
當我們編寫完一個驅動後,我們要把它以模塊形式編譯或者直接編譯進內核時,需要修改相關文件,其中最重要的便是kconfig ,makefile。
主要是分析一下三者之間的關係,然後就其語法簡要的談一下。
當我們在內核源碼目錄下執行make (或者make menuconfig等命令)命令時,實際上是根據makefile 來進行編譯的。
在mini2440開發板上編寫了一個按鍵控制led燈的驅動。文件名爲buttons_leds.c屬於字符驅動,因此在/driver/char/目錄下的makefile部分最後添加一行
obj-$(CONFIG_BUTTONS_LEDS) += buttons_leds.o
如下:
obj-y += mem.o random.o tty_io.o n_tty.o tty_ioctl.o tty_ldisc.o tty_buffer.o tty_port.o
obj-$(CONFIG_BFIN_JTAG_COMM) += bfin_jtag_comm.o
obj-$(CONFIG_CONSOLE_TRANSLATIONS) += consolemap.o consolemap_deftbl.o
obj-$(CONFIG_HW_CONSOLE) += vt.o defkeymap.o
obj-$(CONFIG_AUDIT) += tty_audit.o
obj-$(CONFIG_BUTTONS_LEDS) += buttons_leds.o
其中第一行obj-y 中的y表示編譯進內核,而obj-$(CONFIG_BUTTONS_LEDS) 中CONFIG_BUTTONS_LEDS則表示一個變量,類似於我們C語言中的變量,用$( )來表示,它一般可以取三種值y ,m ,n。y表示編譯進內核,而m則表示以模塊的方式進行編譯,n表示不編譯進內核。obj-y += 等號後面的.o後綴文件則是由該目錄下的對應名稱的.c文件編譯而來。
上面CONFIG_BUTTONS_LEDSS變量的取值則是通過.config文件來集中賦值的。
.config部分內容如下
# Character devices
#
CONFIG_VT=y
CONFIG_CONSOLE_TRANSLATIONS=y
CONFIG_VT_CONSOLE=y
CONFIG_HW_CONSOLE=y
# CONFIG_VT_HW_CONSOLE_BINDING is not set
# CONFIG_DEVKMEM is not set
CONFIG_MINI2440_HELLO_MODULE=m
CONFIG_BUTTONS_LEDS=m
CONFIG_LEDS_MINI2440=m
CONFIG_MINI2440_BUTTONS=m
CONFIG_MINI2440_BUZZER=y
CONFIG_MINI2440_ADC=y
# CONFIG_SERIAL_NONSTANDARD is not set
從上面幾行我們可以看到,在makefile裏面的變量都是在.config中賦值的。當我們在源代碼目錄下輸入make命令時,都是默認從.config中讀入。
因此,在輸入make之前,用ls -a 查看一下是否有該文件。對於只包含幾個文件的工程來說,手動寫.config和makefile並不是一件很難的事情,但如果是一個包含有幾百個文件的項目來說,則是一件比較困難的事情。可以用autoconf來自動生成.config,automake來製作makefile。看起來問題是解決的,但實際上,這種做法缺乏一定的靈活性,不能實現按需定製的要求。如果要添加或刪掉某個驅動,將要在.config文件中找到相應的項進行修改。非常的不方便。因此,便出現了kconfig。
當我們在內核源碼目錄下輸入make menuconfig時,出現如下內容:
.config - Linux Kernel v2.6.32.2 Configuration
──────────────────────────────────────────────
┌──────────Linux Kernel Configuration────────────────────┐
│ Arrow keys navigate the menu. selects submenus --->. Highlighted letters are hotkeys. Pressing includes, excludes, modularizes features. Press to exit, for Help, for Search. Legend: [*] built-in [ ] excluded module < > module capable
│ ┌───────────────────────────────────────────┐
│ │ General setup ---> │
│ │ [*] Enable loadable module support ---> │
│ │ -*- Enable the block layer ---> │
│ │ System Type ---> │
│ │ Bus support ---> │
│ │ Kernel Features ---> │
│ │ Boot options ---> │
│ │ CPU Power Management ---> │
│ │ Floating point emulation ---> │
│ │ Userspace binary formats ---> │
│ │ Power management options ---> │
│ │ [*] Networking support ---> │
│ │ Device Drivers ---> │
│ │ File systems ---> │
│ └─────────┴(+)───────────────────────────────│
├────────────────────────────────────────────┤
│