| 今天做到如何自己編寫第一個(gè)Helloworld驅(qū)動(dòng),結(jié)果遇到一些問題。。可是花了一個(gè)晚上,找遍了論壇的帖子,還是沒有找到一個(gè)清楚明白的解決方案。  這里就先小小的抱怨一下吧。呵呵 不過,在經(jīng)過其它地方查找資料之后,總算解決了這些問題?,F(xiàn)在就先總結(jié)一下,希望后面大家再遇到類似問題的時(shí)候,可以少走彎路,有所收獲吧 第一點(diǎn)、如果輸入make modules后,發(fā)現(xiàn)沒有編譯出相應(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.o 3.在drivers\i2c\chips\Kconfig 中,添加如下內(nèi)容: ---------------------------------------------- config AS352X_AFE_CHG tristate "AS352X AFE Charger Driver" depends on I2C_AS352X && AS352X_AFE help 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ì)說,那不如,直接把它注釋掉就好了嘛,這個(gè)方法可以,但是,它不是解決問題的根本方法。 最后,這幾份文件到底真正的存放在哪里的,這里以我的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í)際存放在哪里了,這樣就可以舉一反三的解決問題了。。。 好了,這是我的簡單總結(jié),作拋磚引玉之用,如果大家還有什么不同的見解,或者新的地方,歡迎繼續(xù)補(bǔ)充!??! | 
|  |