目录
前言:
编译驱动程序之前,要先编译内核。
①驱动程序要用到内核的文件。
②编译驱动时用的内核与开发板上运行的内核要一致。
③板子更新内核后,相应的驱动也要更换。
注:imx6ull pro开发板 韦东山老师的课程视频
11_编译替换内核_设备树_驱动_IMX6ULL_Pro_哔哩哔哩_bilibili
一、配置编译内核的流程步骤:
cd /home/book/100ask_imx6ull-sdk/Linux-4.9.88//先进行配置,对应上设备armbook@100ask: ~/100ask_imx6ull-sdk/Linux-4.9.88$ make mrproperbook@100ask: ~/100ask_imx6ull-sdk/Linux-4.9.88$ make 100ask_imx6ull_defconfig//编译内核,生成zImage内核文件book@100ask: ~/100ask_imx6ull-sdk/Linux-4.9.88$ make zImage -j4//编译设备树,生成设备树的二进制文件book@100ask: ~/100ask_imx6ull-sdk/Linux-4.9.88$ make dtbs//拷贝文件到nfs_rootfs里,板子可以通过nfs来访问这些文件book@100ask: ~/100ask_imx6ull-sdk/Linux-4.9.88$ cp arch/arm/boot/zImage ~/nfs_rootfsbook@100ask: ~/100ask_imx6ull-sdk/Linux-4.9.88$ cp arch/arm/boot/dts/100ask_imx6ull-14x14.dtb ~/nfs_rootfs
二、编译安装内核模块
(1)编译内核模块
book@100ask: ~/100ask_imx6ull-sdk/Linux-4.9.88$ make modules
(2)安装内核模块到Ubuntu某个目录下备用
①后面的步骤要用到tree命令,你可以先试一下,看是否有下载tree命令。
没有tree命令,执行下面的命令下载
sudo apt install tree
②安装模块
//设置设备为arm,并在nfs_rootfs目录下安装模块book@100ask: ~/100ask_imx6ull-sdk/Linux-4.9.88$ make ARCH=arm INSTALL_MOD_PATH=/home/book/nfs_rootfs modules_install
③tree查询目录
三、安装内核和模块到开发板上
打开开发板,执行以下的命令,复制之前的zImage、 dtb 文件以及lib/modules 子目录(里面含有各种模块)。
//挂载nfsmount -t nfs -o nolock,vers=3 192.168.5.11 :/home/book/nfs_rootfs /mnt//复制相应的文件cp /mnt/zImage /bootcp /mnt/100ask_imx6ull-14x14.dtb /bootcp /mnt/lib/modules /lib -rfd//最后同步一下,文件可能还在内存里,同步后强制的刷到flash中去syncreboot
四、编译led驱动
①通过FileZila将下面目录下的02led-drive文件传输到ubuntu里nfs_rootfs文件夹里。
01_all_series_quickstart/05_ 嵌入式 Linux 驱动开发基础知识 /source/02_led_drv/02_led_drv_for_boards/100ask_imx6ull_src_bin
②修改文件里的Makefile文件,指定使用那个内核源码目录
cd ~/100ask_imx6ull-sdk/Linux-4.9.88
//得到相应内核当前路径
pwd
cd -
vi Makefile
//编译
make
//拷贝到nfs_rootfs
cp 100ask_led.ko ledtest ~/nfs_rootfs
五、在开发板安装驱动模块
①将100ask_led.ko、ledtest文件复制到开发板上
mount -t nfs -o nolock,vers=3 192.168.5.11:/home/book/nfs_rootfs /mnt
//复制到开发板上
cp /mnt/100ask_led.ko ./
cp /mnt/ledtest ./
②安装驱动模块并用lsmod查询
insmod 100ask_led.ko
lsmod
六、执行测试程序(最后一步)
可以使用测试程序来控制led灯的状态。
chmod +x ./ledtest
./ledtest
//打开led0灯
./ledtest /dev/100ask_led0 on
//关闭led0灯
./ledtest /dev/100ask_led0 off