本文记录将之前在台式机上运行的驱动程序移植到开发板上的过程
-
搭建交叉编译环境,解压工具链
-
修改环境变量
/etc/profile是整个系统所有用户的环境初始化文件,如果需要root用户能够执行的话,需要修改这个文件
-
linux-2.6.22.6/Makefile:416: *** mixed implicit and normal rules: deprecated syntax
解决方案:
ref:http://www.cnblogs.com/lovechen/p/5717322.html -
加载环境变量,可能需要重启系统才能生效
source /etc/profile
- 查看下PATH是否包含新增的交叉编译器路径
echo $PATH
因为我的Ubuntu是64位的,要下一个32位的库
sudo apt-get install lib32ncurses5
- 编译嵌入式内核,生成模块
在编译好的内核文件路径下,输入
make modules ARCH=arm CROSS_COMPILE=arm-linux-
(可以直接修改makefile文件)编译模块。
再输入
make modules_install
加载内核,用来解决/lib/modules/下无目标板内核版本文件夹及build文件的问题,也可以
make modules_install INSTALL_MOD_PATH=/指定模块安装路径
- 在自己编写好的模块文件Makefile中修改以下内容:
KDIR :=/lib/modules/2.6.22.6/build(此处为刚刚运行make modules_install 新生成的文件,与目标板内核版本一致)
因为开发板是arm系统,还需要用到交叉编译器,在Makefile中添加以下内容:
make -C $(KDIR) M=$(PWD) modules
ARCH:= arm CROSS_COMPILE:= /home/ubuntu/tools/gcc-3.4.5-glibc-2.3.6/bin/arm-linux-(路径根据自己的安装路径更改)
- 在虚拟机上查看/etc/exports,确认NFS共享文件夹
在开发板终端输入
mount -t nfs -o nolock 192.168.1.152:/home/ubuntu/nfs_root /mnt
注:192.168.1.152是虚拟机的IP地址。
当你用以上命令将开发板/mnt目录里的文件拷贝出来时,可能会很慢,然后还会报这样的错“NFS:server not responing ,still trying”
应该使用这样的挂载命令
mount -t nfs -o intr,nolock,rsize=1024,wsize=1024 192.168.1.152:/home/ubuntu/nfs_root /mnt
这时拷贝就正常了。
- 在开发板终端上插入新的模块
insmod xxx.ko
我在加载模块时,提示内核错误
由“Unable to handle kernel NULL pointer dereference at virtual address 00000000”可知内核是因为非法地址访问出错,使用了空指针。
栈回溯信息:
本来以为是内核烧写的问题,后来重新烧写了内核和文件系统,在加载模块时依旧报段错误,但是不影响驱动的使用,就暂且不管了。
最后在开发板上运行的结果如下:
能够正确打开设备进行写操作