歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

移植Linux驅動Kconfig文檔與Makefile的作用

一 :移植設備驅動兩種方式  二:Kconfig文檔與Makefile的作用

linux允許設備驅動在編譯時候靜態的連接在內核中,一如傳統的驅動程序;也允許動態地在運行時安裝,被稱為模塊;還允許在運行狀態下當需要某模塊時候,有系統自動安裝。故而做驅動移植時候,有兩種方式:一種是直接加到kernel 中編譯,另一種是以模塊的形式掛接。


如果把驅動編譯到內核,會涉及到Kconfig 和Makefile 兩文件的修改。


2.6內核的源碼樹目錄下一般都會有兩個文件:Kconfig和Makefile。其中分布在各目錄下的Kconfig構成了一個分布式的內核配置數據庫,每個Kconfig分別描述了所屬目錄源文件相關的內核配置菜單。在內核配置make menuconfig(或xconfig等)時,從Kconfig中讀出配置菜單,用戶配置完後保存到.config(在頂層目錄下生成)中。在內核編譯時,主Makefile調用這個.config,就知道了用戶對內核的配置情況。

Kconfig對應著內核的配置菜單。假如要想添加新的驅動到內核的源碼中,需要修改Kconfig來增加對我們驅動的配置菜單,這樣就有途徑選擇我們的驅動,假如想使這個驅動被編譯,還要修改該驅動所在目錄下的Makefile。
  因此,一般添加新的驅動時需要修改的文件有兩種(注意不只是兩個)
  *Kconfig
  *Makefile
  要想知道怎麼修改這兩種文件,就要知道兩種文檔的語法結構。
  First:   Kconfig

每個菜單項都有一個關鍵字標識,最常見的就是config。
  語法:
  config symbol
  options
  <!--[if !supportLineBreakNewLine]-->
  <!--[endif]-->
  symbol就是新的菜單項,options是在這個新的菜單項下的屬性和選項
  其中options部分有:
  1、類型定義:
  每個config菜單項都要有類型定義,bool:布爾類型, tristate三態:內建、模塊、移除, string:字符串, hex:十六進制, integer:整型
  例如config HELLO_MODULE
  bool "hello test module"

  bool類型的只能選中或不選中,tristate 有三態 :假如選擇編譯成內核模塊,則會在.config中生成一個CONFIG_HELLO_MODULE=m的配置;假如選擇內建,就是直接編譯成內核影響,就會在.config中生成一個CONFIG_HELLO_MODULE=y的配置;tristate  沒有對選項做任何限定,默認它是不選的,為 "n" 。


  2、依賴型定義depends on或requires
  指此菜單的出現是否依賴於另一個定義
  config HELLO_MODULE
  bool "hello test module"
  depends on ARCH_PXA

  這個例子表明HELLO_MODULE這個菜單項只對XScale處理器有效,即只有在選擇了ARCH_PXA,該菜單才可見(可配置)。

  3、幫助性定義
  只是增加幫助用關鍵字help或---help---
  


  例如: config HAVE_IDE
                         bool

                  menuconfig IDE

                         tristate "ATA/ATAPI/MFM/RLL support"

                        depends on HAVE_IDE
                         depends on BLOCK

                          ---help---

                 This provides a 'mapping' driver which supports the way in
      which user-programmable flash chips are .......
     


Second:  內核的Makefile

  內核的Makefile分為5個組成部分:
  Makefile     最頂層的Makefile
  .config        內核的當前配置文檔,編譯時成為頂層Makefile的一部分
  arch/$(ARCH)/Makefile 和體系結構相關的Makefile
  s/ Makefile.*    一些Makefile的通用規則
  kbuild Makefile      各級目錄下的大概約500個文檔,編譯時根據上層Makefile傳下來的宏定義和其他編譯規則,將源代碼編譯成模塊或編入內核。
  頂層的Makefile文檔讀取 .config文檔的內容,並總體上負責build內核和模塊。Arch Makefile則提供補充體系結構相關的信息。 s目錄下的Makefile文檔包含了任何用來根據kbuild Makefile 構建內核所需的定義和規則。
  (其中.config的內容是在make menuconfig的時候,通過Kconfig文檔配置的結果)

  在linux2.6.x/Documentation/kbuild目錄下有詳細的介紹有關kernel makefile的知識。

把驅動編譯進內核 舉例:
  
  假設想把自己寫的一個flash的驅動程式加載到工程中,而且能夠通過menuconfig配置內核時選擇該驅動該怎麼辦呢?

能夠分三步:
  第一:將您寫的flashtest.c 文檔添加到/driver/mtd/maps/ 目錄下。
  第二:修改/driver/mtd/maps目錄下的kconfig文檔:
  config MTD_flashtest
  tristate “ap71 flash"
  這樣當make menuconfig時 ,將會出現 ap71 flash選項。
  第三:修改該目錄下makefile文檔。
  添加如下內容:obj-$(CONFIG_MTD_flashtest)    += flashtest.o
  這樣,當您運行make menucofnig時,您將發現ap71 flash選項,假如您選擇了此項。該選擇就會保存在.config文檔中。當您編譯內核時,將會讀取.config文檔,當發現ap71 flash 選項為yes 時,系統在調用/driver/mtd/maps/下的makefile 時,將會把 flashtest.o 加入到內核中。即可達到您的目的。

Copyright © Linux教程網 All Rights Reserved