天天看點

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檔案,一個示例如下,裡面各項參數根據實際情況更改:
  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檔案中的"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...是配置應用程式的,按空格鍵或Enter鍵可以進入選項進行配置,用上下鍵移動到Kernel/Library...菜單上

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

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

    Linux裝置驅動開發環境的搭建

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

    用M鍵使選項前的尖括号裡顯示M表示該子產品要動态加載,也可以按y鍵選擇直接編輯進核心,選擇完後exit退出,選擇yes或no的對話框通一選yes。

    make romfs 

    #第一次編譯核心前一定要有該步驟

    make

  6. 加載測試:将生成的zImage檔案下載下傳到開發闆,開發闆上的嵌入式Linux啟動後可以用insmod或modprobe加載驅動子產品,測試完畢後可以通過rmmod指令解除安裝驅動子產品

繼續閱讀