前言:
使用的开发板为韦东山老师的 IMX6ULL
为什么编译驱动程序之前要先编译内核?
1.驱动程序要用到内核文件:
比如驱动程序中这样包含头文件:#include ,其中的 asm 是 一个链接文件,指向 asm-arm 或 asm-mips,这需要先配置、编译内核才会生成 asm 这个链接文件。
2.编译驱动时用的内核、开发板上运行到内核,要一致:
开发板上运行到内核是出厂时烧录的,你编译驱动时用的内核是你自己编译的,这两个内核不一致时会导致一些问题。所以我们编译驱动程序前,要把自己 编译出来到内核放到板子上去,替代原来的内核。
3.更换板子上的内核后,板子上的其他驱动也要更换:
板子使用新编译出来的内核时,板子上原来的其他驱动也要更换为新编译出来的。所以在编译我们自己的第 1 个驱动程序之前,要先编译内核、模块,并且放到板子上去。
编译内核步骤
不同 的 开 发 板 对 应 不 同 的 配 置 文 件 , 配 置 文 件 位 于 内 核 源 码 arch/arm/configs/目录。
内核(kernel) 的编译过程如下(按顺序):
- make mrproper: Linux下面去编译项目之前,一般常会用make mrproper去先删除之前编译所生成的文件和配置文件,备份文件等
- make 100ask_imx6ull_defconfig:配置给哪个板子编译
- make zImage -j4: 编译内核 -j4加快编译速度
- make dtbs: 编译设备树文件
编译完成后生成的文件如下图:
在 arch/arm/boot 目录下生成 zImage 内核文件, 在 arch/arm/boot/dts 目录下生成设备树的二进制文件 100ask_imx6ull-14x14.dtb。
把这 2 个文件复制到/home/book/nfs_rootfs 目录下备用,
编译内核模块
进入内核源码目录后,就可以编译内核模块了:
内核模块编译完成后如图:
安装内核模块到 Ubuntu 某个目录下备用
可以先把内核模块安装到 nfs 目录(/home/book/nfs_rootfs)
安装好驱动后的/home/book/nfs_rootfs/目录结构如图 5.6 所示:
安装内核和模块到开发板上
1.先在开发板挂载 Ubuntu 的 NFS 目录
不知道如何挂载可以看 :开发板挂载 Ubuntu 的 NFS 目录
2.输入命令 uname -a 显示内核版本修改时间 2020
3.复制文件到开发板上
在上面 Ubuntu 的/home/book/nfs_rootfs 目录下,已经有了 zImage、 dtb 文件,并且有 lib/modules 子目录(里面含有各种模块)。
接下来要把这些文件复制到开发板上
假设 Ubuntu IP 为 192.168.5.11, 在开发板上执行以下命令(按顺序)