以下内容源于朱有鹏嵌入式课程的学习与整理,如有侵权请告知删除。
步骤1:获取编译后的内核源码与镜像
描述
该内核源码主要用来编译驱动源码。该内核源码必须与开发板运行的内核源码的版本一致,否则编译后的驱动程序在开发版上运行时,会遇到不匹配的问题。
操作
(1)将x210kernel.tar.bz2解压至合适的目录
我这里解压至目录:~/iot/embedded_basic/kernel/x210_kernel。
(2)配置与编译,得到内核源码与镜像
操作步骤见:内核编译初体验_天糊土的博客-CSDN博客
得到的内核镜像在arch/arm/boot目录中,镜像名是zImage。
步骤2:将内核镜像下载至开发板
描述
可以利用fastboot或者tftp,将此内核镜像下载至开发板,且能正常运行。
操作
操作步骤见:利用tftp将镜像下载到开发板_天糊土的博客-CSDN博客
步骤3:驱动源代码的编写与编译
描述
(1)此步骤主要是完成驱动源代码的编写、Makefile文件的编写。
(2)驱动源代码的例子,见:简单的驱动源代码分析_天糊土的博客-CSDN博客
(3)驱动源代码的Makefile文件具有普适性。典型的Makefile文件内容如下:
#这是ubuntu提供的在本Ubuntu环境下开发驱动的内核源码树, #因此如果想在此Ubuntu中开发驱动,则内核源码树目录就是它 #KERN_VER = $(shell uname -r) #KERN_DIR = /lib/modules/$(KERN_VER)/build#开发板的linux内核的源码树在ubuntu中的目录 #它表示用来编译这个模块的内核源码树的目录 #注意根据实际路径来改写此目录(kernel的Makefile所在的路径) KERN_DIR = /home/xjh/iot/embedded_basic/kernel/x210_kernel#注意这里的文件名(module_test)要修改成你实际所取的名字 #-m表示将module_test.c文件编译成一个单独的模块; obj-m += module_test.o#此命令用来编译模块 #利用make -C $(KERN_DIR)进入指定的内核源码树目录, #然后在源码目录树下,借用内核源码中定义的模块编译规则,去编译该模块modules。 #其实就是make modules。modules是内核中的一个目标。 #中间的是参数,表明到某个目录下进行编译,编译完后回到当前目录。 #使用make driver和直接make,都是执行这个规则 driver:make -C $(KERN_DIR) M=`pwd` modules #此命令用来编译应用层程序 #注意是利用交叉编译工具链来编译,而非ubuntu的gcc #另外注意这里名字确定为app.c,注意修改 #其实这么短的命令,直接在ubuntu中调用arm-linux-gcc来编译就好 #写在这里,是为了说明要使用交叉编译工具链来编译应用层程序 app:arm-linux-gcc app.c -o app#用来清除编译痕迹 .PHONY: clean clean:make -C $(KERN_DIR) M=`pwd` modules clean
操作
(1)编写驱动源码、Makefile文件
比如在/home/xjh/iot/embedded_basic/rootfs/tmp目录中编写驱动源码module_test.c,其内容见上面描述中的链接。然后在同路径编写Makefile文件,其内容见上面描述中的内容。
(2)进行编译
即执行make命令,得到module_test.ko这个驱动文件。
(3)将驱动文件转移到开发板系统目录
将ubuntu的/home/xjh/iot/embedded_basic/rootfs/tmp目录挂载到开发板系统的/mnt。在ubuntu的这个tmp目录中更新驱动程序时,通过开发板系统的/mnt目录可以获取这个驱动文件。一般我们将这个驱动文件复制到开发板系统的/tmp目录中再进行操作。
附:实现挂载的方法
在(ubuntu中将被下载的根文件系统中的)etc/profile文件中添加下面代码:
mount -t nfs -o nolock 192.168.1.141:/home/xjh/iot/embedded_basic/rootfs/tmp /mnt
然后在ubuntu系统中的/etc/exports文件中添加下面代码:
/home/xjh/iot/embedded_basic/rootfs/tmp *(rw,sync,no_root_squash,no_subtree_check)
然后重启NFS服务:
sudo /etc/init.d/nfs-kernel-server restart
步骤4:利用NFS下载根文件系统至开发版
描述
可以利用NFS下载根文件系统至开发版。
操作
操作步骤见:以NFS方式挂载rootfs的设置方法_天糊土的博客-CSDN博客
步骤5:测试
描述
开发板的系统完全启动后,在SCRT上使用insmod命令来装载模块,然后测试,测试完毕使用rmmod命令卸载模块。
操作
[root@xjh tmp]# rmmod module_test.ko [ 501.367827] chrdev_exit helloworld exit [root@xjh tmp]# lsmodNot tainted [root@xjh tmp]# insmod module_test.ko [ 520.115699] chrdev_init helloworld init [ 520.118058] register_chrdev success... [root@xjh tmp]# lsmod Not tainted module_test 1059 0 - Live 0xbf00c000 [root@xjh tmp]# rmmod module_test [ 549.628315] chrdev_exit helloworld exit [root@xjh tmp]# lsmod Not tainted [root@xjh tmp]]#