今天做到如何自己編寫第一個Helloworld驅(qū)動,結(jié)果遇到一些問題。??墒腔艘粋€晚上,找遍了論壇的帖子,還是沒有找到一個清楚明白的解決方案。
這里就先小小的抱怨一下吧。呵呵
不過,在經(jīng)過其它地方查找資料之后,總算解決了這些問題。現(xiàn)在就先總結(jié)一下,希望后面大家再遇到類似問題的時候,可以少走彎路,有所收獲吧
第一點、如果輸入make modules后,發(fā)現(xiàn)沒有編譯出相應(yīng)的xxx.ko文件,請看解決方法:如何把設(shè)備驅(qū)動文件添加到Linux內(nèi)核編譯選項配置的menuconfig中【目的】把一個字符設(shè)備驅(qū)動文件,添加到內(nèi)核中,希望編譯成模塊,而非build-in。【參考資料】內(nèi)核的源碼樹目錄下一般都會有兩個文件:Kconfig和Makefile。http://blog.sina.com.cn/s/blog_4a377e150100c896.html【具體步驟】1.首先保證已經(jīng)有驅(qū)動源文件了:as352x_afe_charger.c放在和其他你所要添加的模塊放在一個目錄下,此處是drivers\i2c\chips下。2.在drivers\i2c\chips\makefile中,添加:obj-$(CONFIG_AS352X_AFE_CHG) += as352x_afe_charger.o3.在drivers\i2c\chips\Kconfig中,添加如下內(nèi)容:----------------------------------------------config AS352X_AFE_CHGtristate "AS352X AFE Charger Driver"depends on I2C_AS352X && AS352X_AFEhelp If you say yes here you get support for AS352X AFE Charger. This driver can also be built as a module. If so, the module will be called AS352X AFE Charger.----------------------------------------------解釋如下:(1)AS352X_AFE_CHG是自己定義的名字,當(dāng)然要盡量保證有意義。同時,你會注意到,在上面的makefile中添加的obj-$(CONFIG_AS352X_AFE_CHG) += as352x_afe_charger.o中的CONFIG_AS352X_AFE_CHG,是CONFIG_加上我們在kconfig下寫的config變量。這兩個要匹配,才能實現(xiàn)你在menconfig定義的結(jié)果,傳遞到makefile中,以便決定編譯的時候是如何編譯:不編譯/編譯進(jìn)內(nèi)核/編譯成模塊(2)tristate 表示我此處添加的模塊,可以在make ARCH=arm menuconfig中看到的,選擇之后:* 編譯到內(nèi)核中M 編譯成模塊,即生成XXX.ko不選中,就不編譯該文件(3)depends on I2C_AS352X && AS352X_AFE是前面自己找到的,表示此編譯選項只有當(dāng)I2C_AS352X 和AS352X_AFE都選中,才會出現(xiàn)。當(dāng)然,如果此模塊不依賴于其他模塊,則不需要加上這個depends on了。【附錄】1.如果設(shè)置成M,module模式,則要用make ARCH=arm編譯出as352x_afe_charger.ko而make ARCH=arm uImage只能編譯內(nèi)核,而不編譯模塊。第二點、好了,現(xiàn)在相信大家已經(jīng)可以進(jìn)行編譯工作了。但是,這時候,可能大家還會遇上諸如這樣的錯誤drivers/char/EmbedSky_hello.c:12:32: error: asm/arch/regs-gpio.h: No such file or directory
[root@localhost linux-2.6.30.4]# clear
[root@localhost linux-2.6.30.4]# ky_hello.o] Error 1
make[1]: *** [drivers/char] Error 2
make: *** [drivers] Error 2
這是因為,對于Linux2.6.25.8的內(nèi)核,這三個頭文件存放的路徑是
#include <asm/irqs.h>
#include <asm/arch/regs-gpio.h>
#include <asm/hardware.h>但是,對于Linux2.6.30.4的內(nèi)核,它的存放路徑在
#include <mach/irqs.h>
#include <mach/regs-gpio.h>
#include <mach/hardware.h>因此,需要這樣修改一下。。寫到這里,也許大家會說,那不如,直接把它注釋掉就好了嘛,這個方法可以,但是,它不是解決問題的根本方法。最后,這幾份文件到底真正的存放在哪里的,這里以我的Linux2.6.30.4的內(nèi)核為例,他是實際存放在Linux2.6.30.4/arch/arm/mach-s3c2410/include/mach/hardware.h中這樣,以后我們在寫驅(qū)動時,就知道他調(diào)用的頭文件實際存放在哪里了,這樣就可以舉一反三的解決問題了。。。好了,這是我的簡單總結(jié),作拋磚引玉之用,如果大家還有什么不同的見解,或者新的地方,歡迎繼續(xù)補(bǔ)充?。?!
本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請
點擊舉報。