天天看點

mini2440驅動奇譚——helloworld

        要不要這樣,還沒寫好過驅動就要我去裁剪核心?  好吧,看到使用者手冊上“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/

mini2440驅動奇譚——helloworld

注意二:由于編寫驅動的核心是開發闆的核心(2.6),而ubuntu的核心是3.2,是以這個驅動在ubuntu上是insmod不了的。附( 如果是用ubuntu的核心寫的驅動的話,insmod後沒有列印相關資訊,可以使用   cat /var/log/kern.log | tail  檢視日記   )

mini2440驅動奇譚——helloworld

開發闆端:

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 

mini2440驅動奇譚——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的目錄

繼續閱讀