Linux設備驅動開發環境的搭建(轉)

聲明:複製這篇文章只是爲了做個筆記,如有問題,請聯繫我刪除

轉自:http://www.cnblogs.com/hoys/archive/2010/10/29/1864536.html


經過兩週的摸索,終於對Linux設備驅動開發有了個初步的認識,下面對Linux設備驅動開發環境的搭建做個小結,以方便自己以後查詢,同時也能給同道的初學者一點幫助。

剛接觸Linux設備驅動時,初學者往往連如何編譯驅動程序都不懂,更別說編譯進內核或加載測試了。一般都是在網上找個最簡單的 helloworld驅動程序,然後嚴格按照網上所說的步驟編譯,結果卻得到一大堆見都沒見過的錯誤,更不要說根據錯誤信息來解決問題了,很多人到這裏就 不知道如何往下進行了。十幾天前我也卡在這裏很長時間,現在知道所以然了就記下來,些許對一些同道者有幫助。

一個基本的Linux設備驅動開發環境由宿主機和目標機組成,宿主機就是用來做驅動開發工作的主機,目標機就是用來運行和測試設備驅動的主機,在宿 主機上需要有開發工具(gcc,gdb,make等)和linux源碼(版本要對應目標機上的linux內核),而目標機上只要運行linux即可。由於 步驟有所不同,下面分爲普通Linux設備驅動開發和嵌入式Linux設別驅動開發兩種情況來講述環境的搭建和驅動程序的編譯:

(一)普通Linux設備驅動開發

普通Linux主要是區分於嵌入式Linux(一般指uClinux),在這種開發中宿主機和目標機可以是一臺主機,即在本機上開發編譯然後在本機 上加載運行(Linux設備驅動也可以直接編譯進內核,但爲了開發工作方便,一般採用動態加載的方式),當然也可以是兩臺主機,如果是兩臺主機的話,要保 證宿主機上的linux源碼的版本號與目標機中的linux內核版本一致。普通Linux設備驅動開發的步驟如下:

  1. 在宿主機上安裝開發工具和下載linux源碼(要求版本號和目標機上的linux內核版本一致)。開發工具主要有gcc、gdb、make等,這些工具在redhat或fc中默認就安裝了,在debian或Ubuntu中可以通過下面這個命令安裝:
    apt-get install build-essential
    linux源碼可以通過以下幾種途徑獲得:
    • 直接去www.kernel.org下載
    • 通過包管理工具下載源碼,在debian和Ubuntu中可以通過下面這個命令下載,
      apt-get install linux-source-(版本號) ,下載後的文件在/usr/src目錄中,解壓到該目錄即可

    將源碼解壓到/usr/src/目錄後,進入linux-source-(版本號)目錄中執行下面幾個命令:
    make oldconfig
    make prepare
    make scripts

  2. 編寫Linux驅動程序,以一個最簡單的hello.c爲例,hello.c的內容如下:
    
    #include "linux/init.h"
    #include "linux/module.h"
    
    static int hello_init(void)
    {
        printk(KERN_ALERT "Hello World linux_driver_module\n");
        return 0;
    }
    
    static void hello_exit(void)
    {
        printk(KERN_ALERT "Goodbey linux_driver_module\n");
    }
    
    module_init(hello_init);
    module_exit(hello_exit);
    MODULE_LICENSE("GPL");
    MODULE_AUTHOR("lpj");
  3. 寫Makefile文件,一個示例如下,裏面各項參數根據實際情況更改:
    
    #sample driver module
    obj-m := hello.o
    KDIR = /usr/src/linux-source-2.6.24/
    
    all:
         $(MAKE) -C $(KDIR) M=$(PWD)
    
    .PHONY:clean
    clean:
         rm -f *.mod.c *.mod.o *.ko *.o *.tmp_versions
    
  4. 編譯,在hello.c和Makefile所在目錄下執行 make 即可,編譯後在當前目錄生成hello.ko文件
  5. 加載並測試:加載使用insmod或modprobe命令來實現,如在當前路徑執行如下代碼:
    insmod hello.ko 或 modprobe hello
    注意,如果在虛擬終端加載內核的話,將看不到內核打印信息,因爲內核打印信息不會輸出到虛擬終端,而是輸出到/proc/kmsg文件中,所以可以通過以下方式查看內核信息:
    • cat /proc/kmsg 會一直打印,需要Ctrl-C手動終止
    • dmesg 或 dmesg | tail -N ,N爲一數字,表示顯示最後N行
  6. 卸載:使用rmmod命令卸載驅動模塊,如 rmmod hello

(二)嵌入式Linux設備驅動開發

這種開發中一般目標機爲帶有嵌入式處理器的開發板,而宿主機爲PC,開發環境需要在宿主機上搭建,嵌入式Linux設備驅動開發的步驟如下:

  1. 在宿主機上下載嵌入式Linux的源碼,並安裝嵌入式Linux開發工具(針對於不同的嵌入式處理器,工具也有所不同,如對應於Arm的arm-gcc系列,針對nios2處理器的nios2-cc系列)
  2. 編寫Linux設備驅動驅動程序,還以上面給出的hello.c爲例,將該文件複製到(linux 源碼目錄)/drivers/(目標文件夾)/中
  3. 在(目標文件夾)中創建Makefile和Kconfig(菜單配置文件),內容分別如下:

    #makefile
    obj-$(CONFIG_HELLODRV) += hello.o
    
    #Kconfig
    menu  USER_DEVICE_DRIVERS
    config HELLODRV
     tristate "Hello"
     ---help---
       This is a sample driver programme.
    endmenu
    

    注意,如果Kconfig文件中的"tristate"寫成"bool",則該模塊只能選爲Y(編譯進內核)或N(不選擇),不能選爲M(編譯爲模塊,可動態加載)

  4. 修改上層目錄( linux內核源碼目錄/drivers/)中的Makefile和Kconfig文件,Makefile中加入如下語句:

    #makefile
    obj-y += (目標文件夾)

    (此處有多種寫法,這只是其中一種)
    Kconfig中加入如下語句:

    #Kconfig
    source "drivers/(目標文件夾)/Kconfig"
  5. 編譯內核:幾個基本的命令及選擇界面如下:
    make menuconfig 執行到這一步後,會看到下面這個界面:

     
其中Vendor/Product...是選擇處理器廠家和型號的,Kernel/Library...是配置應用程序的,按空格鍵或回車鍵可以進入選項進行配置,用上下鍵移動到Kernel/Library...菜單上,按空格或回車進入下面的內核配置界面:
  


在該界面有兩個Customize...選項,第一個是選擇自定義配置內核,第二個是選擇自定義配置應用程序,按空格鍵可以選擇這些選項,選擇後按 exit鍵退出,選擇是否保存的時候選擇“yes“,如果選擇了第一個Customize...,則退出後會自動進入內核配置界面,如下圖:
 


該界面有很多選項,這裏不細講,我們要配置驅動模塊,就用上下鍵移動到Device Drivers上,然後按回車或空格鍵進入,設備驅動配置界面如下圖:
 


這裏就是linux-2.X/drivers/Kconfig裏的內容了,下面那個綠色的V(+)表示這一頁沒顯示完,可以用下鍵繼續往下瀏覽,找到我們自己的菜單名,然後按回車或空格進入,我的模塊配置界面如下:
 


用M鍵使選項前的尖括號裏顯示M表示該模塊要動態加載,也可以按y鍵選擇直接編輯進內核,選擇完後exit退出,選擇yes或no的對話框通一選yes。
make romfs #第一次編譯內核前一定要有該步驟
make

  1. 加載測試:將生成的zImage文件下載到開發板,開發板上的嵌入式Linux啓動後可以用insmod或modprobe加載驅動模塊,測試完畢後可以通過rmmod命令卸載驅動模塊 

發佈了30 篇原創文章 · 獲贊 5 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章