在基于bf609開發(fā)驅(qū)動時,先做了最簡單的字符型設(shè)備驅(qū)動嘗試。編譯環(huán)境是在PCxp下運(yùn)行的vmware ubuntu10.04。交叉編譯環(huán)境為bfin-uclinux,linuxkernel為ADI網(wǎng)站提供的最新代碼。
在驅(qū)動代碼寫好后,配置好konfig文件和makefile文件,設(shè)置為module。make menuconfig后,進(jìn)行makemodules SUBDIRS=drivers/char。將module型的驅(qū)動生成.ko文件。
將.ko文件下載到板上后,進(jìn)行insmod操作。發(fā)現(xiàn)反饋的信息為:
mydevice: version magic '3.3.0-ADI-2012R1-pre+ mod_unloadmodversions ' should be '3.3.0-ADI-2012R1-pre-00619-gab55153-dirtymod_unload '
insmod: can't insert 'mydevice.ko': invalid module format
在網(wǎng)上查了很多資料,知道是模塊的編譯工具版本和內(nèi)核的編譯工具版本不對所導(dǎo)致。但是之前沒有做過驅(qū)動開發(fā)。很多知識不太清楚。不知道哪兒出錯了。由于進(jìn)行blackfin開發(fā)時,軟件開發(fā)環(huán)境根據(jù)官網(wǎng)提供的信息,可有兩種情況。一種是通過官網(wǎng)提供的uClinux包來開發(fā)uClinux。一種是通過官網(wǎng)提供的buildroot包來開發(fā)linux。由于ADI從bf60X開始,對于bf60X的開發(fā)支持只在buildroot上進(jìn)行。因為我的開發(fā)包為buildroot。針對剛才insmod的問題,經(jīng)過仔細(xì)檢查,發(fā)現(xiàn)在環(huán)境變量設(shè)置toolschain時,出現(xiàn)了問題。板上下載好的uImage文件是buildroot編譯所得,模塊編譯是在linuxkernel下編譯所得,而環(huán)境變量設(shè)置時又出現(xiàn)了問題,導(dǎo)致了版本信息不同。
不過從給出的message來看,模塊的vermagic信息為3.3.0-ADI-2012R1-pre+ mod_unload modversions。它是有kernel目錄下的include/linux/vermagic.h文件決定的。其中具體的信息又由文件中vermagicstring決定。
另外在進(jìn)行menuconfig時,進(jìn)行module設(shè)置時,有以下幾項:
再由打印出來的module vermagic:3.3.0-ADI-2012R1-pre+ mod_unloadmodversions 可知。3.3.0-ADI-2012R1-pre+為kernelversion信息。至于后面的那個+號是沒有顯示kernel的補(bǔ)丁信息。mod_unload 為上圖modulemenuconfig時設(shè)置的,保證模塊與內(nèi)核此處一致就行,還有后面的modversions與此類似。但是非常重要的一點是,在vermagicstring里面的第一條UTS_RELEASE,規(guī)定了模塊中kernelversion的信息,UTS_RELEASE在include/generated/UTSRELEASE.h中可以查看。但是該文件只有在menuconfig時,配置了
此項才會生成。這樣編譯生成的.ko文件vermagic信息才會對應(yīng)kernel完整的version信息。
至此,insmod關(guān)于版本信息的問題解決了。
但是這個問題后,insmod時,又出現(xiàn)
Unknown symbol _mcount (err 0)的錯誤。