Chinaunix首页 | 论坛 | 博客
  • 博客访问: 14260
  • 博文数量: 5
  • 博客积分: 255
  • 博客等级: 二等列兵
  • 技术积分: 55
  • 用 户 组: 普通用户
  • 注册时间: 2010-05-14 10:15
文章存档

2010年(5)

我的朋友

分类: 嵌入式

2010-05-31 15:44:13

参考tekkaman的linux设备驱动程序学习:http://blog.chinaunix.net/u1/34474/showart.php?id=407202
    今天实验了第一个设备驱动Hello,world!模块,期间碰到了几个问题,在此分享下经验,希望以后的朋友碰到了类似问题能少走弯路.

实验环境:
主机:Ubuntu10.04,emacs,minicom等.
板子:mini2440(128M的nandflash)
交叉编译:arm-linux-gcc-4.3.2(友善提供的)
内核:linux-2.6.32.2

hello.c文件的代码如下:

#include <linux/init.h>
#include <linux/module.h>
MODULE_LICENSE("Dual BSD/GPL");

static int hello_init(void)
{
  printk(KERN_ALERT "Hello,yuzexi001!\n");
  return 0;
}

static void hello_exit(void)
{
  printk(KERN_ALERT "Goodbye,yuzexi001~\n");
}

module_init(hello_init);
module_exit(hello_exit);


将hello.c保存在自己的工作目录下.并编写一个Makefile文件(自己还不会,基本参考了tekkaman的),内容如下:
KERNELDIR = /home/yuzexi/Working/mini2440/linux-2.6.32.2
PWD := $(shell pwd)
INSTALLDIR = /home/yuzexi/Working/rootfs/lib/modules

CROSS_COMPILE = /usr/local/arm/4.3.2/bin/arm-none-linux-gnueabi-
CC = $(CROSS_COMPILE)gcc

obj-m := hello.o

modules:
    $(MAKE) -C $(KERNELDIR) M=$(PWD) modules

modules_install:
    cp hello.ko $(INSTALLDIR)

clean:
    rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions

.PHONY:modules modules_install clean


/*几点说明:
**1,在编译该模块之前,请确保你的内核源码树已经搭建好,也就是给驱动开发的环境是否搭建好了.这个可以参考我们arm9之家论坛里的资料--文件名是"Mini2440 Linux移植开发实战指南.pdf"具体的链接下载地址自己也忘了.
**2,Makefile中的KERNELDIR就是内核源码树的位置,根据自己的实际情况来定.
**3,网上有个搭建设备驱动程序开发环境的帖子:http://blog.sina.com.cn/s/blog_66e7d9b70100i26v.html,可以试试看.
*/
最后,在工作目录下执行
#make modules
#make modules_install
执行的结果如下所示:
root@Ubuntu10-04:/home/yuzexi/Working/myproject/drivers/HelloWorld# make modules
make -C /home/yuzexi/Working/mini2440/linux-2.6.32.2 M=/home/yuzexi/Working/myproject/drivers/HelloWorld modules
make[1]: 正在进入目录 `/home/yuzexi/Working/mini2440/linux-2.6.32.2'
  CC [M]  /home/yuzexi/Working/myproject/drivers/HelloWorld/hello.o
  Building modules, stage 2.
  MODPOST 1 modules
  CC      /home/yuzexi/Working/myproject/drivers/HelloWorld/hello.mod.o
  LD [M]  /home/yuzexi/Working/myproject/drivers/HelloWorld/hello.ko
make[1]:正在离开目录 `/home/yuzexi/Working/mini2440/linux-2.6.32.2'
root@Ubuntu10-04:/home/yuzexi/Working/myproject/drivers/HelloWorld# make modules_install
cp    hello.ko /home/yuzexi/Working/rootfs/lib/modules
root@Ubuntu10-04:/home/yuzexi/Working/myproject/drivers/HelloWorld# ls
hello.c   hello.mod.c  hello.o   modules.order
hello.ko  hello.mod.o  Makefile  Module.symvers
root@Ubuntu10-04:/home/yuzexi/Working/myproject/drivers/HelloWorld#

    到此,就生成了hello.ko文件,可以通过FTP或者网络或者U盘将hello.ko文件拷贝到开发板(mini2440)中,注意:这里需要拷贝到开发板的/lib/modules/2.6.32.2-FriendlyARM目录下面(参考mini2440用户手册7.3.3,第374页).
     好了,现在假设你已经登录了开发板,并且hello.ko文件已经拷贝到了/lib/modules/2.6.32.2-FriendlyARM/目录下面.下面是执行过程:
#cd /lib/modules/2.6.32.2-FriendlyARM
[root@FriendlyARM 2.6.32.2-FriendlyARM]# ls
hello.ko
[root@FriendlyARM 2.6.32.2-FriendlyARM]# insmod hello.ko
Hello,yuzexi001!
[root@FriendlyARM 2.6.32.2-FriendlyARM]# lsmod
hello 656 0 - Live 0xbf000000
[root@FriendlyARM 2.6.32.2-FriendlyARM]# rmmod hello    
rmmod: chdir(2.6.32.2): No such file or directory
到这里,问题就出现了,rmmod: chdir(2.6.32.2): No such file or directory
注意这里的问题提示目录为:chdir(2.6.32.2),根据置顶帖"驱动的加载与卸载中常见问题:rmmod chdir no such file or directory 的最终解决办法"11楼wbweb的提示,于是我大胆的将开发板的/lib/modules/2.6.32.2-FriendlyARM/目录 修改为 /lib/modules/2.6.32.2/ 后,重新测试后,成功.
测试如下:
[root@FriendlyARM 2.6.32.2]# pwd
/lib/modules/2.6.32.2
[root@FriendlyARM 2.6.32.2]# ls
hello.ko
[root@FriendlyARM 2.6.32.2]# insmod hello.ko
Hello,yuzexi001!
[root@FriendlyARM 2.6.32.2]# lsmod
hello 656 0 - Live 0xbf006000
[root@FriendlyARM 2.6.32.2]# rmmod hello    
Goodbye,yuzexi001~
[root@FriendlyARM 2.6.32.2]# lsmod
[root@FriendlyARM 2.6.32.2]#

OK,到此为止,第一个HelloWorld驱动模块测试结束~ 希望更多学驱动的朋友越来越顺利~~

置顶帖子的地址:
阅读(555) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~