加载TQ2440驱动-Hello World 模块

开发平台:
 
Ubuntu 10.04,内核版本2.6.32-33-generic,
 
交叉编译器:天嵌公司提供的arm-linux-gcc 4.3.3,
 
内核树:/opt/EmbedSky/linux-2.6.30.4/
 
目标平台:
 
天嵌公司的TQ2440开发板ARM9,内核版本2.6.30.4
 
1.      首先解压天嵌公司提供的内核源码包linux-2.6.30.4_20100531.tar.bz2,

 


 

 


tar xvfj linux-2.6.30.4_20100531.tar.bz2 –C /
 
-C是指定解压目录,后面的/代表在根目录解压归档文件。
 
之后内核树会被解压到/opt/EmbedSky/linux-2.6.30.4/
 
编译内核:
 

 


1.cd /opt/EmbedSky/linux-2.6.30.4 
 2.cp config_EmbedSky_W35 .config 
 3.make zImage
 


在此,config_EmbdeSky_W35为天嵌公司提供的内核配置文件,开始时可暂时拿来用。
 
至此,内核树已经准备好了,这是编译内核驱动模块的前提工作,如果在自己的文件系统中没有准备好内核树,则无法构造可装载的模块。
 
2.      安装交叉编译器4.3.3
 
解压天嵌公司提供的EABI-4.3.3_EmbedSky_20100610.tar.bz2,
 

 


 tar xvfj EABI-4.3.3_EmbedSky_20100610.tar.bz2 –C / 


 
之后交叉编译器会被解压到/opt/EmbedSky/4.3.3/,
 
修改环境变量配置文件/etc/environment,
 
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/opt/EmbedSky/4.3.3/bin"
 
LANGUAGE="zh_CN:zh:en_US:en"
 
LANG="zh_CN.utf8"
 

 
使用命令
 

 


 export PATH=$PATH:/opt/EmbedSky/4.3.3/bin


 
保存重启即生效,若不想重启可使用
 

 


 source /etc/environment 


 
但是此命令只对该终端生效,所以若没其他问题,推荐重启
 
3.编写hello world 驱动模块
 

 


1.cd /home/shanks/modules 
 2.mkdir hello 
 3.cd hello 
 


驱动模块不一定要放在内核树里,只要你的Makefile指定了内核树的路径就没问题,所以我这里在/home/shanks/里建立了一个modules目录专门用来开发驱动模块
 
hello.c 源码:
 

 


  1.#include <linux/init.h>  
 2.#include <linux/module.h>  
 3.MODULE_LICENSE("Dual BSD/GPL"); 
 4. 
 5.static int hello_init(void) 
 6.{ 
 7.   printk(KERN_ALERT "Hello, world\n"); 
 8.   return 0; 
 9.} 
 10.  
 11.static void hello_exit(void) 
 12.{ 
 13.   printk(KERN_ALERT "Goodbye, cruel world\n"); 
 14.   return 0; 
 15.} 
 16. 
 17.module_init(hello_init); 
 18.module_exit(hello_exit); 
 


Makefile:

 

 


  1.KERNELDIR=/opt/EmbedSky/linux-2.6.30.4    
 2.PWD:=$(shell pwd)    
 3.INSTALLDIR=$(PWD)     
 4.CC=arm-linux-gcc   
 5.obj-m := hello.o    
 6.modules:    
 7.    $(MAKE) -C $(KERNELDIR) M=$(PWD) modules    
 8.clean:    
 9.    rm -rf *.o *.ko *.mod.c *.markers *.order *.symvers    
 10..PHONY:modules clean  
 


然后,
 

 


 make 


 
生成了几个文件,其中hello.ko就是我们需要的用来加载的模块文件。
 
这里注意,make之前必须要先准备好内核树,否则make会出错。
 
连上开发板,这里我把PC的根目录挂载到板子的/mnt下,
 

 


  1.cp /mnt/home/shanks/modules/hello/hello.ko/tmp 
 2.cd /tmp 
 


好了,加载模块!

 
[root@www.linuxidc.com /tmp]# insmod hello.ko

Hello, world
 
[root@www.linuxidc.com /tmp]# rmmod hello
 
Goodbye, cruel world
 
insmod时可能出现的错误:
 
I.
 
hello: version magic '2.6.30.4 mod_unload ARMv4 ' should be'2.6.30.4-EmbedSky mod_unload ARMv4 '
 
insmod: cannot insert 'hello.ko': invalid module format
 
出错原因:模块版本与内核版本不匹配!
 
解决办法:导入预设配置信息,进入menuconfig 继续配置General config ->( )Local version -> 括号中加入如下内容:“-EmbedSky”退出保存为 .config ,重新编译内核、驱动模块,再来加载模块
 
ii.
 
hello: Unknown symbol__aeabi_unwind_cpp_pr0
insmod: cannot insert 'hello.ko': unknown symbol in module, or unknown
parameter
 
出错原因:模块和内核镜像不匹配
 

解决方法:尽量用和你同时用来编译驱动而生成的内核镜像zImage,zImage烧到板子上。Ldd3上有句话:尽管并不是必需的,但最好运行和模块对应的内核。
 
刚开始学驱动,终于成功加载了hello world 模块!
 
这是学习驱动的一小步,但是对我来说却是一大步!

本篇文章来源于 Linux公社网站

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值