目录
为什么编译驱动程序之前要先编译内核?
驱动程序要用到内核文件:
编译内核
编译安装内核模块
编译内核模块
安装内核模块到 Ubuntu 某个目录下备用
安装内核和模块到开发板上
Bootloader 介绍
编译 u-boot 镜像
为什么编译驱动程序之前要先编译内核?
驱动程序要用到内核文件:
比如驱动程序中这样包含头文件:
#include <asm/io.h>
,其中的
asm
是 一个链接文件,指向 asm-arm
或
asm-mips
,这需要先配置、编译内核才会生成 asm 这个链接文件。
⚫
编译驱动时用的内核、开发板上运行到内核,要一致:
开发板上运行到内核是出厂时烧录的,你编译驱动时用的内核是你自己编译 的,这两个内核不一致时会导致一些问题。所以我们编译驱动程序前,要把自己 编译出来到内核放到板子上去,替代原来的内核。
⚫
更换板子上的内核后,板子上的其他驱动也要更换:
板子使用新编译出来的内核时,板子上原来的其他驱动也要更换为新编译出 来的。所以在编译我们自己的第 1
个驱动程序之前,要先编译内核、模块,并且放到板子上去。
编译内核
不 同 的 开 发 板 对 应 不 同 的 配 置 文 件 , 配 置 文 件 位 于 内 核 源 码 arch/arm/configs/目录。
kernel
的编译过程如下:
make mrproper
make 100ask_imx6ull_defconfig
make zImage -j4
make dtbs
cp arch/arm/boot/zImage /home/book/nfs_rootfs
cp arch/arm/boot/dts/100ask_imx6ull-14x14.dtb /home/book/nfs_rootfs
编译完成 zImage
后才可编译设备树文件。
编译完成后生成的文件如图
5.2
所示:
编译完成后,在
arch/arm/boot
目录下生成
zImage
内核文件
,
在 arch/arm/boot/dts 目录下生成设备树的二进制文件
100ask_imx6ull-
14x14.dtb
。把这
2
个文件复制到
/home/book/nfs_rootfs
目录下备用,如图 5.3:
编译安装内核模块
编译内核模块
进入内核源码目录后,就可以编译内核模块了
make ARCH=arm CROSS_COMPILE-arm=buildroot-linux-gnueabihf-modulese
内核模块编译完成后如图
安装内核模块到 Ubuntu 某个目录下备用
可以先把内核模块安装到
nfs
目录
(/home/book/nfs_rootfs)
。
执行以下命令安装模块:
sudo make ARCH=arm INSTALL_MOD_PATH=/home/book/nfs_rootfs modules_install
把模块安装在
nfs
目录“
/home/book/nfs_rootfs/
”下:
安装好驱动后的/home/book/nfs_rootfs/目录结构如图 5.6 所示:
安装内核和模块到开发板上
假设:在
Ubuntu
的
/home/book/nfs_rootfs
目录下,已经有了
zImage
、 dtb 文件,并且有
lib/modules
子目录
(
里面含有各种模块
)
。
接下来要把这些文件复制到开发板上。假设
Ubuntu IP
为
192.168.5.11
, 在开发板上执行以下命令:
mount -t nfs -o nolock,vers=3 192.168.5.11:/home/book/nfs_rootfs/ /mnt
cp /mnt/zImage /boot
cp /mnt/100ask_imx6ull-14x14.dtb /boot
cp /mnt/lib/modules /lib -rfd
sync //同步
lsmod //查看内核模块
Bootloader 介绍
Bootloader
是在操作系统运行之前运行的一段代码,用于引导操作系统。
通常每个操作系统都有一组专属的引导加载程序。引导加载程序通常可以通过多
种方式引导操作系统内核,还有各种命令用于调试或修改内核运行环境。
U-Boot
是一个开源的主引导加载程序,用于引导设备的操作系统内核,并
含有多种命令以便调试系统。它适用于多种计算机体系结构,包括
68k
,
ARM
,
Blackfin
,
MicroBlaze
,
MIPS
,
Nios
,
SuperH
,
PPC
,
RISC-V
和
x86
。
U-boot
官网:
https://www.denx.de/wiki/U-Boot
源码下载页面:
http://ftp.denx.de/pub/u-boot/
NXP
官方
uboot
源码
Git
地址:
https://source.codeaurora.org/external/imx/uboot-imx
本开发使用的
U-boot
位于
Git
仓库,地址为:
https://e.coding.net/weidongshan/imx-uboot2017.03.git
注意
:
我们使用的版本针对板子进行过修改,
u-boot
官网下载的源码不能直接使用。
编译 u-boot 镜像
不同的开发板对应不同的配置文件,配置文件位于
u-boot
源码的 “configs/
”目录。对于
IMX6ULL Pro
版,
u-boot
的编译过程如下
(
编译
uboot 前必须先配置好工具链等开发环境)
:
cd /home/book/100ask_imx6ull-sdk
book@100ask: ~/100ask_imx6ull-sdk$cd Uboot-2017.03
book@100ask: ~/100ask_imx6ull-sdk/Uboot-2017.03$ make distclean
book@100ask: ~/100ask_imx6ull-sdk/Uboot-2017.03$ make mx6ull_14x14_evk_defconfig
book@100ask: ~/100ask_imx6ull-sdk/Uboot-2017.03$ make -j4
图
6.1
编译镜像文件为具体的执行步骤:
编译完成后生成的文件如图 6.2 所示。
编译完成之后生成 u-boot-dtb.imx,可以烧在 TF 卡、EMMC 上。以下命令是将
u-boot-dtb.imx
文件烧写到
EMMC
上:
cp u-boot-dtb.imx /home/book/nfs_rootfs
cp /mnt/u-boot-dtb.imx .
echo 0 > /sys/block/mmcblk1boot0/force_ro //取消读写保护
dd if=u-boot-dtb.imx of=/dev/mmcblk1boot0 bs=512 seek=2
echo 1 > /sys/block/mmcblk1boot0/force_ro //恢复读写保护