要不要這樣,還沒寫好過驅動就要我去裁剪核心? 好吧,看到使用者手冊上“LED 驅動已經被編譯到預設核心中,是以不能再使用 insmod 方式加載。 ” 我重新把手冊上手工定制核心走了一遍,把自己之後要寫的一些驅動給否掉,以便可以insmod去掉的驅動有:lcd驅動(包括其中有個logo的選項),觸摸屏驅動,音頻驅動,看門狗驅動,I2C驅動,pwm驅動,led驅動,按鍵驅動,A/D驅動,RTC驅動 ; 由于把lcd驅動否掉了,開發闆裡也就沒燒寫qt,之燒寫了檔案系統rootfs,檔案名為:rootfs_rtm_2440.img (CD光牒目錄:image/linux/rtm )
這是我的第一篇驅動,為了紀念下追劇一個暑假,越演越狗血的電視劇--古劍奇譚,就寫成驅動奇譚吧
系統:Ubuntu 12.04
驅動交叉編譯核心:linux-2.6.32.2 //建立交叉編譯
開發闆:mini2440 (128M nandflash) //關于怎麼燒寫linux到開發闆請點選,Linux RootFs 選擇rootfs_rtm_2440.img (CD光牒目錄:image/linux/rtm )
開發所需工具:NFS網絡檔案 minicom
linux檔案目錄:/opt/FriendlyARM/mini2440/linux-2.6.32.2
自己驅動目錄: /home/lianghuiyong/my2440drivers
pc端:
首先建立一個自己寫的驅動的檔案夾
1. # mkdir /home/lianghuiyong/my2440drivers //建立檔案夾
2. # cd /home/lianghuiyong/my2440drivers //進入檔案夾
3. # VIM helloworld.c
helloworld.c 内容為:
#include<linux/init.h>
#include<linux/module.h>
static int hello_init(void)
{
printk(KERN_ALERT "Hello,mini2440 module is installed!\n");
return 0;
}
static void hello_cleanup(void)
{
printk(KERN_ALERT "Good-bye,mini2440 module was removed!\n");
}
module_init(hello_init);
module_exit(hello_cleanup);
MODULE_LICENSE("Daul BSD/GPL");
代碼中module_init ,module_exit是驅動子產品加載、解除安裝函數,MODULE_LICENSE("Daul BSD/GPL");是子產品許可證聲明,依照 Daul BSD/GPL 協定
4. #VIM Makefile
Makefile内容:(2.4核心和2.6核心的寫法有點不同,以下為2.6的寫法)
PWD = $(shell pwd)
KDIR =/opt/FriendlyARM/mini2440/linux-2.6.32.2/
obj-m:= helloworld.o
all:
$(MAKE) -C $(KDIR) M=$(PWD) CONFIG_DEBUG_SECTION_MISMATCH=y
clean:
rm -rf *.o *~core.depend. *.cmd *.ko *.mod.c .tmp_versions
rm -rf *.order Module.*
insmod:
insmod helloworld.ko
rmmod:
rmmod helloworld
active:
echo -e "$(MAKE) \n"
$(MAKE) -C $(KDIR) M=$(PWD)
注意一:KDIR 後接的目錄要為友善之臂提供的核心所安裝的目錄,之前我使用網友的一段:KDIR :=/lib/modules/$(shell uname -r)/build,其實這裡的目錄是 ubuntu 核心目錄,ubuntu 核心版本(3.2)和開發闆的核心版本(2.6)是不相同的,是以如果在 ubuntu 核心下編譯生成的驅動是不能在開發闆上 insmod 的!會提示 invalid module format錯誤,其中三個 helloworld 要随 helloworld.c 檔案名更改
5、# make
6、# cp ./helloworld.ko /NFSboot/
注意二:由于編寫驅動的核心是開發闆的核心(2.6),而ubuntu的核心是3.2,是以這個驅動在ubuntu上是insmod不了的。附( 如果是用ubuntu的核心寫的驅動的話,insmod後沒有列印相關資訊,可以使用 cat /var/log/kern.log | tail 檢視日記 )
開發闆端:
1、打開minicom (minicom帶顔色啟動是:minicom -c on),開發闆上電 2、# mount -t nfs -o nolock 192.168.1.102:/NFSboot /mnt //挂載 /NFSboot 目錄到開發闆 /mnt 下 //配置NFS網絡檔案 3、# cd /mnt 4、# ls 5、# insmod helloworld.ko 6、# lsmod 7、# rmmod helloworld
有可能第一次加載驅動時出現:
helloworld: module license 'Daul BSD/GPL' taints kernel.
Disabling lock debugging due to kernel taint
Hello,mini2440 module is installed!
隻是核心的一個提示,沒關系的,第三行就是我們要的資訊,當我第二次insmod的時候,上面兩行就沒了
錯誤筆記:
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的目錄