编译内核和程序烧写
一.编译和替换内核 (1).驱动程序依赖于内核 (2).为什么编译驱动程序需要先编译内核 [1].驱动程序头文件需要用到内核文件 [2].编译驱动时用到的内核需要和开发板上运行的内核一致 [3].更新板子上的其他驱动为新编译出来的驱动
(3) 编译驱动程序的步骤 [1].编译内核 [2].编译内核模块 [3].安装内核模块到ubuntu某个目录下 [4].将安装的内核放入板子中 [5].编译驱动程序 [6].测试程序
二.构建系统和烧写系统(根文件系统)--BOOTLOADER和内核构建以后补充 (1).配置文件说明 (2).编译系统 (3).烧写系统 [1].设置启动方式 [2].连接并配置ubuntu [3].使用烧录工具进行烧写
一.编译和替换内核
(1).驱动程序依赖于内核
驱动程序中这些头文件来自内核,所以驱动程序依赖于内核。
编译驱动程序的前提:
1.在编译驱动程序前,需要有内核的源码. 2.要事先编译和配置这个内核的源码,且内核源码必须编译过才能编译这个驱动程序.
(2).为什么编译驱动程序需要先编译内核
主要是三点原因:
[1].驱动程序头文件需要用到内核文件
头文件中有asm链接文件时,需要确定指向的具体架构(ARM还是x86)。 此时需要去配置内核才能确定具体的架构并且才能生成asm这个链接文件
asm链接文件如下所示
asm链接文件
[2].编译驱动时用到的内核需要和开发板上运行的内核一致
开发板上运行的内核是出厂时烧录的,编译的驱动时自己编译的,两个不能不一致,否则会出错 为了防止这个错误,需要将配置编译后的内核替换掉原来的内核
[3].更新板子上的其他驱动为新编译出来的驱动
也就是在编译驱动程序前,需要编译内核,模块,并放到板子上才能运行驱动程序
(3) 编译驱动程序的步骤
大致可以分为三个步骤
STEP1:编译配置内核,设备树,驱动 STEP2:将编译内核放入板子中 STEP3:编译测试驱动
详细步骤如下:
[1].编译内核
A.逐个执行以下命令,来编译内核
cd /home/book/100ask_imx6ull-sdk
cd linux-4.9.88
make mrproper
make 100ask_imx6ull_defconfig //配置内核架构
make zImage -j4 //编译内核
make dtbs //编译设备数
cp arch/arm/boot/zImage ~/nfs_rootfs //内核拷贝到nfs备用
cp arch/arm/boot/dts/100ask_imx6ull-14x14.dtb ~/nfs_rootfs //设备树拷贝到nfs备用
编译命令如下图所示
编译过程
B.编译后的拷贝操作
[2].编译内核模块
编译内核模块的命令
cd ~/100ask_imx6ull-sdk/Linux-4.9.88/
make modules //编译内核模块
编译内核模块命令和完成图
[3].安装内核模块到ubuntu某个目录下
A.安装tree的命令
sudo apt install tree
B.安装模块的命令
cd ~/100ask_imx6ull-sdk/Linux-4.9.88/
sudo make ARCH=arm INSTALL_MOD_PATH=/home/book/nfs_rootfs modules_install
安装内核模块的命令如下图所示
[4].将安装的内核放入板子中
A.查看板子上的当前linux内核版本
B.挂载内核到开发板的命令
挂载内核到开发板的指令如下图所示
mount -t nfs -o nolock,ver=3 192.168.5.11:/home/book/nfs_rootfs /mnt
C.将文件复制到开发板,并进行重启,就可以使用新的zimage和dtb模块了(更新了内核和设备树)
复制到开发板的命令如下所示
cp /mnt/zImage /boot //复制内核到开发板
cp /mnt/*.dtb /boot //复制设备树到开发板
cp /mnt/lib/modules /lib -rfd //将linux内核文件覆盖开发板的内核文件 d表示链接文件按照链接文件复制
sync //进行同步(漏掉的,拷贝之后还在内存里,执行这个命令将内存里的数据强制刷到flash)
D.再次查看板子上的当前linux内核版本
再次检查内核版本如下,检查如果和新编译的内核版本一致,那么则成功
[5].编译驱动程序
A.将驱动程序通过filezila 从pc传给ubuntu
放入ubuntu的nfs 目录里,然后在pc端进行上传
B.修改驱动程序里的makefile
1.复制当前linux内核目录路径,然后来修改makefile
2.修改修改的路径位置如下(stm32mp157的内核路径修改位置也是这里),将刚才复制的路径填入即可
3.通过make 来编译驱动程序(drv.ko-驱动程序,hello_drv_test是测试程序)
[6].测试程序
1.启动开发板之后,挂载nfs文件系统,并且切到生成的驱动文件目录进行驱动的挂载
如果没有内核打印的话按照以下方式打开
检查驱动挂载是否成功
检查设备节点是否打开,如下所示已经打开
检查驱动程序是否运行
检查正在运行的程序命令
在列出的程序中找的了已装载并运行的hello驱动,表示hello驱动程序运行成功
2.运行驱动测试程序
二.构建系统和烧写系统(根文件系统)–BOOTLOADER和内核构建以后补充
(1).配置文件说明
(2).编译系统
配置buildroot生成文件系统过程
1.配置buildroot的代码
cd /home/book/100ask_imx6ull-sdk
cd Buildroot_2020.02.x
make clean
make 100ask_imx6ull_pro_ddr512m_systemV_qt5_defconfig
make all -j4
编译完成之后的显示
2.编译后生成的文件,uboot,内核(zImage),设备树(dtb),文件系统(ext4)
文档介绍的生成的文件
3.作用:下面所述的系统镜像可以放入烧写工具进行烧写
(3).烧写系统
[1].设置启动方式
如下图所示,可以设置不同的启动方式,本例采用usb启动方式
A.USB模式的作用
B.USB启动的注意事项,要先设置启动方式,再去连接usb otg口
C.usb otg的实现
1.pc的烧录工具会利用usb otg接口将uboot传输给板子上固件模拟出来的默认usb设备 2.默认的usb设备会将传过来的uboot下载到板子上并运行(在内存运行)
3.uboot 利用otg模拟出download设备。 4.uboot利用这个模拟download设备和usb otg口接受和烧写文件,烧写到emmc或者sd卡.
[2].连接并配置ubuntu
连接usb otg线之后ubuntu的配置
选择错误则点击断开即可
检查是否有usb驱动,如下就是有驱动设备
如果没有则需要安装驱动程序
[3].使用烧录工具进行烧写
烧录工具路径如下:
烧录工具文件名
1.模拟usb download设备的生成方法,按下图所示
A.如果故意连接到虚拟机
会导致usb驱动是虚拟的usb 设备驱动,根本无法使用
无法将固件烧录到emmc中,打开usb 虚拟download设备失败,因为设备被虚拟机接管了
B.修改这个错误的方法
首先忘记之前的设置,开发板重新上电 重新下载uboot,用uboot模拟新的usb设备 重新设置usb设备的连接 正确的显示,显示之后需要重新上电
3;搬运要烧录的文件到pc
烧写目录详解,确认哪些需要搬到烧写工具进行烧录,img,boot,zimage 用filezila搬到pc 烧写前需要改为emmc.img(烧写到emmc),烧写到sdcrad(改为sdcard.img) 用工具烧写
4.烧写成功显示
5.此时设置板子为emmc启动,重新上电,则使用新的系统进行启动
新的内核名称表示成功 检查内核是否一致,此为开发板内核 下图为ubunut内核,对比发现一致,则烧写成功
6.使用qt文件进行验证
1 lvgl的文件,使用命令移到上册目录 2.qt 文件 3.然后reboot重启系统,即可看到llvgl的界面 界面如下图所示