一,编译的需要和流程
为什么编译驱动程序之前要先编译内核?
- 驱动程序要用到内核文件:
比如驱动程序中这样包含头文件:#include <asm/io.h>,其中的 asm 是
一个链接文件,指向 asm-arm 或 asm-mips,这需要先配置、编译内核才会生成
asm 这个链接文件。
编译驱动时用的内核、开发板上运行到内核,要一致:
开发板上运行到内核是出厂时烧录的,你编译驱动时用的内核是你自己编译
的,这两个内核不一致时会导致一些问题。所以我们编译驱动程序前,要把自己
编译出来到内核放到板子上去,替代原来的内核。 - 更换板子上的内核后,板子上的其他驱动也要更换:
板子使用新编译出来的内核时,板子上原来的其他驱动也要更换为新编译出
来的。所以在编译我们自己的第 1 个驱动程序之前,要先编译内核、模块,并且
放到板子上去。
配置编译的流程: - 内核,设备树,驱动
- 将三者放到板子上
3 . 编译测试第一个驱动程序
二, 编译内核与设备树

第一行命令:
进入到内核源码的目录
第二行命令:mrproper 是内核源码的清理目标
彻底清理源码目录中之前编译生成的所有文件、配置文件和临时文件,把源码恢复到 "干净" 的初始状态,避免旧的编译产物干扰新的编译。
第三行命令:
作用:加载针对 100ask_imx6ull 开发板 的默认配置文件,生成内核编译的核心配置文件 .config
第四行命令:
zImage 是生成压缩格式的 ARM 内核镜像 ,是嵌入式设备常用的内核镜像格式。
-j4 表示用 4 个线程并行编译,利用多核 CPU 加快编译速度
第五行命令:
dtbs 是编译 Device Tree Blob(设备树文件)的目标 。
作用:编译描述开发板硬件信息的设备树文件,生成 .dtb 文件。设备树会告诉内核开发板的硬件布局、外设信息等,是内核识别硬件的关键。
第六行:
把弄好的文件放到~/nfs_rootfs目录下进行保存

这里只展示了一个拷贝,另外一个设备树也要进行拷贝
然后编译这个驱动程序模块
然后安装模块

5.4****安装内核和模块到开发板上
假设:在 Ubuntu 的/home/book/nfs_rootfs 目录下,已经有了 zImage、
dtb 文件,并且有 lib/modules 子目录(里面含有各种模块)。
接下来要把这些文件复制到开发板上,在 Ubuntu 上使用 adb 命令:
cd /home/book/nfs_rootfs
adb push zImage /boot
adb push 100ask_imx6ull-14x14.dtb /boot
adb push lib/modules /lib
最后,在开发板上执行"sync"命令,再重启开发板,它就使用新的 zImage、 dtb、模块了
三,开发板的第一个驱动程序
首 先 , 进入100ask_imx6ull_src_bin目录,修改Makefile文件 "KERN_DIR"为自己的内核所在路径。如图5.7红框所示,如果你的内核源码 不在此目录则根据你的实际情况进行修改:

然后我们把对应的文件进行编译,然后扔到开发板子上使用对应的功能就好了
ls dev/----- 这个是用来检查是否生成设备节点的
cat proc/devices 这个也是