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