一个驱动文件的头文件来自内核,所以驱动文件来自于内核,必须要有内核源码,而且内核需要编译过,因为有些需要的文件是一个链接文件。编译的内核要放到开发板上,还要把板子上的其他驱动程序更换掉,然后编译测试第一个驱动程序。
编译之前执行make mrproper
make mrproper
的作用
-
它会彻底清理内核源代码目录,删除以下内容:
-
编译生成的目标文件(object files)。
-
内核配置文件(
.config
文件)。 -
其他临时文件和生成的文件。
-
-
执行后,内核源代码目录会恢复到“初始状态”,就像刚解压出来的源码一样干净
执行 make 100ask_imx6ull_mini_defconfig
make 100ask_imx6ull_mini_defconfig
是一个用于配置 Linux 内核的命令,专门针对 100ask_imx6ull_mini 开发板的默认配置文件。以下是详细说明和步骤:
命令的作用
-
make 100ask_imx6ull_mini_defconfig
会使用预定义的配置文件(100ask_imx6ull_mini_defconfig
)来配置 Linux 内核。 -
这个配置文件通常包含了针对 100ask_imx6ull_mini 开发板的优化设置和默认选项。
执行 make zImage-j4
make zImage -j4
是一个用于编译 Linux 内核并生成 zImage 格式内核镜像的命令。以下是详细说明和步骤:
命令的作用
-
make zImage
:编译 Linux 内核,并生成 zImage 格式的内核镜像。-
zImage 是一种压缩的内核镜像格式,适用于大多数 ARM 平台。
-
它是 Linux 内核的标准输出格式之一。
-
-
-j4
:指定使用 4 个线程并行编译,以加快编译速度。你可以根据你的 CPU 核心数调整这个数字(例如-j8
表示使用 8 个线程)。
执行make btbs
make dtbs
是一个用于编译 设备树二进制文件(Device Tree Blobs, DTBs) 的命令。设备树文件用于描述硬件平台的硬件信息,例如 CPU、内存、外设等。以下是详细说明和步骤:
命令的作用
-
make dtbs
:编译设备树源文件(.dts
)为设备树二进制文件(.dtb
)。-
设备树源文件(
.dts
)是文本文件,描述了硬件平台的硬件信息。 -
设备树二进制文件(
.dtb
)是编译后的二进制文件,内核在启动时会加载它来识别硬件。
-
cp arch/arm/boot/zImage ~/nfs_rootfs
cp arch/arm/boot/dts/100ask_imx6 ull_mini.dtb ~/nfs_rootfs
编译完成后,在 arch/arm/boot 目录下生成 zImage 内核文件,在 arch/arm/boot/dts 目 录 下 生 成 设 备 树 的 二 进 制 文 件 100ask_imx6ull_mini.dtb。把这2个文件复制到/home/book/nfs_rootfs目 录下备用。
执行make modules
在Linux内核开发或系统配置中,make modules
命令用于编译内核模块。内核模块是内核的一部分,但它们在需要时可以被加载或卸载,而不是像内核本身那样在启动时加载。这允许系统在不重新编译整个内核的情况下添加新的功能或硬件支持。
安装内核模块到Ubuntu某个目录下备用 可以先把内核模块安装到nfs目(/home/book/nfs_rootfs)。 注意:后面会使用tree命令查看目录结构,如果提示没有该命令,需要执行以 下命令安装tree命令:sudo apt install tree
-
sudo
:这是一个命令行程序,允许普通用户以超级用户(通常是root)的权限运行程序。在这个上下文中,它用于安装软件包,这通常需要管理员权限。 -
apt
:这是Advanced Package Tool的缩写,是Debian及其衍生版(如Ubuntu)上用于处理软件包的命令行工具。它可以用来安装、更新、升级和删除软件包。 -
install
:这是apt
命令的一个选项,指示apt
要执行的操作是安装软件包。 -
tree
:这是要安装的软件包的名称。
执行make ARCH=arm INSTALL_MOD_PATH=/home/book/nfs_rootfs modules_install
-
make
: 调用 Makefile 来执行编译或安装操作。 -
ARCH=arm
: 指定目标架构为 ARM。 -
INSTALL_MOD_PATH=/home/book/nfs_rootfs
: 指定模块安装的根目录路径。编译后的内核模块会被安装到该路径下的lib/modules/
目录中。 -
modules_install
: 目标操作,表示安装编译好的内核模块。
假设:在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
将Ubuntu的:/home/book/nfs_rootfs文件挂载在开发板/mnt上
cp /mnt/zImage /boot
它执行的操作是将位于/mnt
目录下的zImage
文件复制到/boot
目录下。
cp /mnt/100ask_imx6ull_mini.dtb /boot
在Linux系统中用于将一个设备树二进制文件(Device Tree Blob,简称DTB)从/mnt
目录复制到/boot
目录。
cp /mnt/lib/modules /lib -rfd(-r递归复制,f强制复制,d复制之前是链接文件,复制之后也是链接文件)
递归地强制复制/mnt/lib/modules
目录及其内容到/lib
目录
sync
sync
是 Linux 和 Unix 操作系统中的一个命令,它的主要作用是将文件系统中的修改数据(缓冲区中的数据)写入磁盘,以确保数据的一致性和持久性
最后重启开发板,它就使用新的zImage、dtb、模块了
把驱动程序放在nfs_rootfs目录下,进入01_hello_drv,查看里面有什么文件,然后修改Makefile文件,在makefile里面制定你使用哪个内核源码目录
修改 Makefile 文件 “KERN_DIR”为自己的内核所在路径。
修改完内核所在目录后,就可以编译led模块驱动了,如图 5.9所示,执 行“make all”命令就可以编译,编译完成后会生成hello_drv
.ko和hello_drv_test
两个文件,把这两个文件拷贝到 Ubuntu nfs目录下备用
cp hello_drv
.ko hello_drv_test
~/nfs_rootfs
下载驱动程序
将生成的这两个文件拷贝到开发板上
安装驱动模块
insmod hello_drv
.ko
insmod
命令用于在 Linux 操作系统中手动加载内核模块。当你有一个编译好的内核模块(通常以 .ko
为扩展名,代表 kernel object)时,你可以使用 insmod
命令将其加载到内核中。
在你提供的命令 insmod hello_drv.ko
中,hello_drv.ko
是一个内核模块文件。执行这个命令会将 100ask_led.ko
模块加载到当前运行的内核中。
ls一下设备结点出来了
测试驱动程序