這兩天在板子上載入模組的時候,遇到了各種問題,與我第一次載入模組時碰到的問題大同小異,故記錄在部落格,僅供查閱。
1.PC機和目標板核心版本不一致
問題提示:version magic '2.6.32.2 mod_unload modversions ARMv4 ' should be '2.6.32.2-FriendlyARM mod_unload ARMv4 '
準確來說,PC機上的核心所指的是用於編譯模組的核心的版本,並不一定就是運行在PC上linux系統上的核心版本。用指令 uname -r 所查詢到的版本號碼,就是後者。之前按照mini2440使用者手冊的流程,配置好PC機上用於實驗的核心,但由於一段時間以來的搗鼓,早已“面目全非”,先將其還原。
(1)在核心linux-2.6.xxxxxx # 目錄上,執行make distclean //清除,即還原
(2)在同一目錄上執行 cp config_mini2440_t35 .config //使用現成配置
(3)執行 make menuconfig 之後退出即可 //核心儲存配置資訊之用
(4)執行 make zImage //編譯核心
(5)執行 make modules //編譯模組
一般來說經過上述幾步即可與板子上的核心同一版本,前提當然是正在使用的核心版本與板載的核心版本相符。
2.測試程式在板上啟動並執行問題
問題提示:syntaxerror : "(" unexpected
剛開始以為是ftp傳送方式,導致檔案傳送不完整所引起的問題,後來再三驗證其他程式,並無異常,所以排除這個可能。瞎弄了一陣,突然發現是makefile的問題,我竟然把它用gcc而不是arm-linux-gcc編譯了!頓時暈了一陣!以下附上arm-linux-gcc編譯方式的簡單makefile檔案
CROSS=arm-linux-</p><p>all : jarvis_led #產生執行檔案的名字,可改<br />jarvis_led : jarvis_led.c #這裡給出原始碼檔案<br /> $(CROSS)gcc -o jarvis_led jarvis_led.c #此處注意縮排是一個tab</p><p>clean :<br /> @rm -vf led *.o *~
3.編譯驅動模組方法
這裡我們討論的是字元驅動,所以先把驅動程式複製到核心目錄下 /drivers/char 裡。接著就是對 /drivers/char 裡的Kconfig和Makefile進行改寫的操作了。
(1)Kconfig
我們在make menuconfig 介面上所看到的資訊就是在Kconfig檔案中定義的,所以我們需要編譯自己的驅動的話,總得先把自己的驅動放進介面,之後才能進行選擇是編譯模組(M)還是直接編譯進核心(*)吧。添加代碼如下
config LED_MODULE //與Makefile產生聯絡
tristate "jarvis_led_module" //在menuconfig 介面上我們就看到這個名字啦
depends on ARCH_S3C2410
default m if MACH_FRIENDLY_ARM_MINI2440
要想看到上面的資訊,我們需要進入menuconfig-->Device Drivers-->character devices,就能看到自己模組的資訊啦。
(2)Makefile
返回到 /drivers/char 目錄下,修改Makefile,實質只需添加一條語句即可,如下:
obj-$(CONFIG_LED_MODULE) += jarvis_led.o //紅色字型必須與Kconfig對應
至此,準備工作已做完,我們需要在核心目錄下,即linux-2.6.xx.xx #上執行 make modules。之後再返回 /drivers/char 應該就會看到我們所編譯的驅動模組有一個.ko檔案產生,that`s it!
最後,如何把模組送到板子上,載入、卸載、測試等工作,mini2440使用者手冊講解得十分清晰,遂不在此贅述。本人知識淺薄,還望大家多多指點!