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