花了两天时间,终于搭建好了板子上的linux驱动开发环境,不容易呀,做个笔记。
首先搭建PC上的编译环境,因为编译的驱动是在板子上运行的,第一步当然需要安装交叉编译器,即arm-none-linux-gnueabi-gcc等或者是arm-linux-gcc等。其实比较简单,可以从网上下载或者光盘中得到,给出一个网址http://wiki.emsym.com/wiki/%E6%90%AD%E5%BB%BALinux%E5%BC%80%E5%8F%91%E7%8E%AF%E5%A2%83#.E4.BA.A4.E5.8F.89.E7.BC.96.E8.AF.91.E5.B7.A5.E5.85.B7gcc-arm-linux-gnueabi.E5.AE.89.E8.A3.85
对照第一个来就对了,得到编译器的包后拷贝到/usr/loca/ 解压缩,关键的步骤是设置环境变量,即使其他程序能找到arm gcc,有好几方式设置环境变量:
(1) 用文本编辑器打开/etc/profile
在最后面加上
ARM_PATH=/usr/local/arm-2009q1/bin/ #(这个是你编译器的路径)
PATH=$ARM_PATH/bin:$PATH
export ARM_PATH
需要注销重新登录
(2)修改.bashrc文件
这种方法更为安全,它可以把使用这些环境变量的权限控制到用户级别,如果你需要给某个用户权限使用这些环境变量,你只需要修改其个人用户主目录下的.bashrc文件就可以了。
加的东西和上面一样
也需要注销重新登录,生效。
(3)本人用的是第三种方法
打开/etc/environment 在最后一项添加:/usr/local/arm-2009q1/bin/ 各项间以:分隔,还是注销重新登录。
试验一下,在终端中输入arm- 然后tab键,如果能补全就ok了。
编译器装好了,下一步就应该是目标机的库环境,因为最终驱动是运行在板子上,所以需要有板子的linux内核代码,构建库。板子是借同事的TQ2440,从天嵌论坛上下载内核源代码,放在/usr/src 目录下解压后进入代码目录,这里需要敲三个命令:
make oldconfig;
make prepare
这个时候可能会提示出错,找不到arm-linux-gcc, 如果安装的是arm-none-linux-gnueabi-gcc的话 需要修改内核源码目录下的Makefile 中的
CROSS_COMPILE = arm-linux- 改成
CROSS_COMPILE = arm-none-linux-gnueabi 即可。
最后 make scripts/
这样编译环境就搭建好了,接下来就是测试一下,把《linux设备驱动程序》中的hello 程序拿来用,修改Makefile
ifneq ($(KERNELRELEASE),)
# call from kernel build system
obj-m := hello.o
else
KERNELDIR ?= /usr/src/linux-2.6.30.4/
#KERNELDIR ?= /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)
default:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules
endif
clean:
rm -rf *.o *~core .depend .*.cmd *.ko *.mod.c .tmp_versions
红色标起来的地方就是以前编写本机驱动需要调库的路径,现在改成板上内核源码路径。
#make
得到hello.ko
接下来就是要把hello.ko弄到板子上去,有两种方式一种是通过tftp,另一种是u盘直接拷,我先试的第一种,#ftp 我电脑ip
但是奇怪的是,板子访问我的win7上的tftp服务器老是被拒绝,搞了一个晚上还没成功。第二天工作看到vxworks下的wftp32程序,因为vxworks的板子程序是用这个下载的,试着用一下,发现可以,激动了一下,回去就猛上,程序终于下到板子上去了然后 #insmod ./hello.ko 结果老是提示./hello.ko': invalid module,又去网上查了一下,有很多说法,最多的就是编译环境的版本号可能和板子上运行内核的版本号不一致,但是用uname -a
看了下版本号是一致的呀,找呀找,实在没办法,想到看一下日志.在板子上
敲#cat /proc/kmsg 提示Module len 3060 truncated 好像是长度出错,怀疑ftp传过来时出错,查看pc上的文件长度果然比板子上大1,不好办呀,ftp弄不好,暂时先用u盘拷过去吧,拷到板子上#insmod ./hello.ko 还是有问题提示hello: version magic '2.6.30.4briup mod_unload ARMv4 ' should be '2.6.30.4-EmbedSky mod_unload ARMv4 '
insmod: cannot insert './hello.ko': invalid module format
应该是版本号名字不同,想想应该可以在内核源码配置中修改,于是又到pc上板子内核源码目录下#grep briup ./ -r 果然找到./.config文件中有CONFIG_LOCALVERSION=briup 将其值改成-EmbedSky保存,然后#make oldconfig; #make prepare #make scripts
重新编译hello.ko,拷到板子上 #insmod ./hello.ko,终于终端显示
hello: module license 'Dual/GPL' taints kernel.
Disabling lock debugging due to kernel taint
hello,world
Hello,linux
成功了。