要不要這樣,還沒寫好過驅(qū)動就要我去裁剪內(nèi)核? 好吧,看到用戶手冊上“LED 驅(qū)動已經(jīng)被編譯到缺省內(nèi)核中,因此不能再使用 insmod 方式加載。 ” 我重新把手冊上手工定制內(nèi)核走了一遍,把自己之后要寫的一些驅(qū)動給否掉,以便可以insmod去掉的驅(qū)動有:lcd驅(qū)動(包括其中有個logo的選項),觸摸屏驅(qū)動,音頻驅(qū)動,看門狗驅(qū)動,I2C驅(qū)動,pwm驅(qū)動,led驅(qū)動,按鍵驅(qū)動,A/D驅(qū)動,RTC驅(qū)動 ; 由于把lcd驅(qū)動否掉了,開發(fā)板里也就沒燒寫qt,之燒寫了文件系統(tǒng)rootfs,文件名為:rootfs_rtm_2440.img (光盤目錄:image/linux/rtm )
這是我的第一篇驅(qū)動,為了紀(jì)念下追劇一個暑假,越演越狗血的電視劇--古劍奇譚,就寫成驅(qū)動奇譚吧
系統(tǒng):Ubuntu 12.04
驅(qū)動交叉編譯內(nèi)核:linux-2.6.32.2 //建立交叉編譯
開發(fā)板:mini2440 (128M nandflash) //關(guān)于怎么燒寫linux到開發(fā)板請點擊,Linux RootFs 選擇rootfs_rtm_2440.img (光盤目錄:image/linux/rtm )
開發(fā)所需工具:NFS網(wǎng)絡(luò)文件 minicom
首先新建一個自己寫的驅(qū)動的文件夾
1. # mkdir /home/lianghuiyong/my2440drivers //新建文件夾
2. # cd /home/lianghuiyong/my2440drivers //進入文件夾
3. # VIM helloworld.c
helloworld.c 內(nèi)容為:
代碼中module_init ,module_exit是驅(qū)動模塊加載、卸載函數(shù),MODULE_LICENSE("Daul BSD/GPL");是模塊許可證聲明,依照 Daul BSD/GPL 協(xié)議
4. #VIM Makefile
Makefile內(nèi)容:(2.4內(nèi)核和2.6內(nèi)核的寫法有點不同,以下為2.6的寫法)
5、# make
6、# cp ./helloworld.ko /NFSboot/
注意二:由于編寫驅(qū)動的內(nèi)核是開發(fā)板的內(nèi)核(2.6),而ubuntu的內(nèi)核是3.2,所以這個驅(qū)動在ubuntu上是insmod不了的。附( 如果是用ubuntu的內(nèi)核寫的驅(qū)動的話,insmod后沒有打印相關(guān)信息,可以使用 cat /var/log/kern.log
| tail 查看日記 )
1丶 make: *** /opt/FriendlyARM/mini2440/linux-2.6.32.2M=/home/lianghuiyong/my2440driversmodeles: 沒有那個文件或目錄。 停止。
這個應(yīng)該是makefile書寫問題,不同的內(nèi)核版本,書寫有些不同,詳情點擊
2丶insmod: can't read 'helloworld': No such file or directory
insmod需要加文件后綴 .ko
3丶insmod: error inserting '****.ko': -1 File exists
之前insmod后沒有rmmod,解決方法:rmmod ****
4丶insmod: cannot insert 'helloworld.ko': invalid module format
這有可能是因為修改了makefile之后沒有將之前編譯所產(chǎn)生的文件刪除。除了makefile和 .c 文件,其余刪除,再make
也可能是KDIR路徑問題,KDIR要為開發(fā)板內(nèi)核所在的目錄,即linux-2.6.32.2的目錄