就自己在學習驅動過程中的一些錯誤和解決辦法的記錄:
我的操作環境是虛擬機 Ubuntu 10.10 。 測試內核 2.6.28 和 2.6.34
今天就只寫菜鳥最簡單的:如何在make menuconfig 後能添加自己的驅動模塊。網上Linux驅動學習的帖子都太多了,但是寫給菜鳥的很少。而我自己在寫完成make menuconfig時也入到了不少的錯誤。現在將自己的錯誤記錄如下,只為幫助後來者。
1、修改頂層Makefile時出現的錯誤
在設置cpu類型,修改交叉編譯器路徑的時候修改為
ARCH ?= arm
CROSS_COMPILE ?= /usr/local/arm/4.2.2-eabi/usr/bin/arm-linux-
時,進行make menuconfig 測試的時候在 這一行報錯,報錯提示arm不能為一個目錄
出現原因和解決辦法:在這裡極有可能是因為你在 ?= arm 的最後面有一個空格,刪掉空格就可以正常編譯
這個錯誤一般很難發現。
2、添加 ledtest 驅動模塊到make menuconfig 菜單
在這一步我出現錯誤是 那網上的添加方法添加好了,make menuconfig 後並沒有出現我添加的 ledtest 的驅動模塊選項。最後我發現了其中的錯誤,網上的其他帖子並未提及。
首先: 我先來描述一下我最開始嘗試的方法,
1)、在drivers下添加自己的驅動模塊文件目錄, 我自己用的是 ledtest 。然後將你寫的驅動 ledtest.c拷貝到這個目錄下,在這個目錄下
vi Makefile 然後添加內容為 obj-$(CONFIG_LEDTEST) += ledtest.o
然後 vi Kconfig 添加內容為
menu MENU_LEDTEST
config LEDTEST
tristate "Ledtest"
---help---
This is ARM Ledtest driver file
endmenu
2)、返回上一級 drivers 目錄修改目錄下的Makefile 和 Kconfig
在 Makefile 的文件末尾加上: obj-$(CONFIG_LEDTEST) += ledtest/ (注意其名稱的依賴關系)
在 Kconfig 的倒數第二行,也就是 endmenu 的前一行加上:
source "drivers/ledtest/Kconfig" (注意其名稱的依賴關系)
做到這裡我就開始 make menuconfig 了,但是 make 後的菜單Drivers下沒有自己要的MENU_LEDTSET 目錄選項。
而這裡可能大多數的人已經得到了他們自己想看到的測試模塊選項了,但有的用這種方法沒有的預期結果。
如果你是那個沒有得到結果的人,那麼繼續下一步:
3)、修改 arch/arm/Kconfig 文件 在 menu "Device Drives" 和 endmenu 之間加上
source “drivers/ledtest/Kconfig” 然後make menuconfig 後,在Device Drives 下就能出現MENU_LEDTEST選項
所以我就是那個沒有得到結果的人,但是我最後找到問題之所以出的原因和解決辦法,我還是覺得這個路繞的值。在這裡的原理,我總結如下:
在前兩步,得到預期結果的人,所使用的內核可能是新版內核,或已經打過補丁的內核。
要完成 低三步才能得到結果的人,所使用的內核可能是舊版內核,並且沒有打過補丁,我開始用的內核就是。
在新版內核 arch/arm/Kconfig 的文件中 沒有menu "Device Drives" ,,,,,,,,,,,,,,,,endmenu 這些文件。而僅僅是只用添加了source “drivers/Kconfig” 這一項。自己的理解是: 在新版內核arch/arm/Kconfig 沒有完成對應驅動的加載任務,而是加他交給下層 drivers/Kconfig 來完成。 所以新版內核不需要進行第三步就能得到結構,而舊版不行。