分析README可知
解压内核源码 tar xfJ linux-5.10.61.tar.xz
内核源码打补丁命令 for p in `ls -1 ../*.patch`; do patch -p1 < $p; done
配置内核源码补丁文件 make ARCH=arm multi_v7_defconfig fragment*.config
编译内核源码命令 make ARCH=arm uImage vmlinux dtbs LOADADDR=0xC2000040
需要安装库信息 mkimage工具 sudo apt-get install u-boot-tools
linux内核源码配置和编译
1.解压内核源码
2.进入linux内核源码
3.配置交叉编译工具链
4.内核源码打补丁命令
5.配置内核源码补丁文件
6.因为FSMP1A开发板是参考DK1公板进行设计的,所以需要复制DK1设备树相关内容
7.编译内核源码
1.解压内核源码
tar -vxf linux-5.10.61.tar.xz
2.进入linux内核源码
cd linux-5.10.61/
3.配置交叉编译工具链,打开Makefile文件,搜索:CROSS_COMPILE
370 ARCH ?= arm
371 CROSS_COMPILE:=arm-linux-gnueabihf-
4.内核源码打补丁命令
for p in `ls -1 ../*.patch`; do patch -p1 < $p; done
5.配置内核源码补丁文件
make ARCH=arm multi_v7_defconfig fragment*.config
6.因为FSMP1A开发板是参考DK1公板进行设计的,所以需要复制DK1设备树相关内容,复制为FSMP1A
1)进入到内核源码设备树目录下:linux-5.10.61/arch/arm/boot/dts
2)复制相关设备树内容
cp stm32mp157a-dk1.dts stm32mp157a-fsmp1a.dts
cp stm32mp15xx-dkx.dtsi stm32mp15xx-fsmp1x.dtsi
3)修改设备树文件: vi stm32mp157a-fsmp1a.dts
13 #include "stm32mp15xx-fsmp1x.dtsi"
16 model = "HQYJ STM32MP157A-FSMP1A Discovery Board";
17 compatible = "hqyj,stm32mp157a-fsmp1a", "st,stm32mp157";
4)进入到内核源码设备树目录下:linux-5.10.61/arch/arm/boot/dts,打开Makefile文件,添加FSMP1A设备树相关内容
1098 stm32mp157a-fsmp1a.dtb \ ------>添加这一行内容
7.编译内核源码
time make -j4 ARCH=arm uImage vmlinux dtbs LOADADDR=0xC2000000
测试步骤
1.将~/tftpboot目录下,创建一个20221213文件夹
2.将~/tftpboot目录下,uImage和stm32mp157a-fsmp1a.dtb拷贝到20221213文件夹
4.进入linux内核源码arch/arm/boot/目录下,将uImage 文件拷贝到~/tftpboot/
5.进入linux内核源码arch/arm/boot/dts目录下,将stm32mp157a-fsmp1a.dtb文件拷贝到~/tftpboot/
6.设置自启动参数bootargs
7.设置自启动命令bootcmd
8.将开发板重新上电,在倒计时时间进入0之前,不按下enter键,进入自启动模式
9.观察现象
内核错误方法解决
1.将设备树的源文件(stm32mp157a-fsmp1a.dts),和设备树的头文件(stm32mp15xx-fsmp1x.dtsi),复制到内核源码/arch/arm/boot/dts
2.需要打开这两个文件查看一下(更新时间戳)
测试
1.编译内核源码
time make -j4 ARCH=arm uImage vmlinux dtbs LOADADDR=0xC2000000
2.成功现象
DTC arch/arm/boot/dts/stm32mp157a-fsmp1a.dtb -------->是否生成新的设备树文件
Kernel: arch/arm/boot/uImage is ready -------->是否生成新的uImage镜像文件
3.进入linux内核源码arch/arm/boot/目录下,将uImage 文件拷贝到~/tftpboot/
4.进入linux内核源码arch/arm/boot/dts目录下,将stm32mp157a-fsmp1a.dtb文件拷贝到~/tftpboot/
5.设置自启动参数bootargs
6.设置自启动命令bootcmd
7.将开发板重新上电,在倒计时时间进入0之前,不按下enter键,进入自启动模式
8.观察现象
解决热插拔问题
1.错误现象:
/etc/init.d/rcS: line 6: can't create /proc/sys/kernel/hotplug: nonexistent directory
2.在内核源码源码目录下执行make menuconfig
Device Drivers --->
Generic Driver Options --->
[*] Support for uevent helper ---> 选择[*]
(/sbin/hotplug) path to uevent helper ---> 添加路径
makefile/Kconfig/.config三个文件关系
1.makefile文件作用:内核源码编译和配置文件
2.Kconfig文件作用:存放基于执行make menuconfig命令是,生成图形化界面配置信息内容
3..config文件作用:存放配置相关所有信息,给Makfile进行使用
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AfsJoAnJ-1670931700285)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20221213185809438.png)]
添加自己编写led灯驱动
1.添加自己的LED灯驱动程序选项
config LED_DRIVER
11 bool "led driver"
12 default y
13 help
14 this is DC22081 LED DRIVER
2.打开linux内核源码进入drivers/char目录下打开Makefile文件,在最后一行添加一句话
obj-$(CONFIG_LED_DRIVER) += fsmp157a_led.o
3.通过make menuconfig查看图形界面
4.在内核源码源码目录下执行make menuconfig
Device Drivers --->
Character devices --->
[*] led driver (NEW)
5.编译内核源码 time make -j4 ARCH=arm uImage vmlinux dtbs LOADADDR=0xC2000000
6.进入linux内核源码arch/arm/boot/目录下,将uImage 文件拷贝到~/tftpboot/
7.进入linux内核源码arch/arm/boot/dts目录下,将stm32mp157a-fsmp1a.dtb文件拷贝到~/tftpboot/
8.设置自启动参数bootargs
9.设置自启动命令bootcmd
10.将开发板重新上电,在倒计时时间进入0之前,不按下enter键,进入自启动模式
11.观察现象,led灯并没有点亮
led灯测试步骤
1.将群里下发fsmp157a_led_test.c和fsmp157a_led.h这两个文件拷贝到~/nfs/rootfs目录
2.编译led灯应用程序
arm-linux-gnueabihf-gcc fsmp157a_led_test.c
3.在串口工具执行./a.out
4.观察串口工具是否打印信息,并且LED1/LED2/LED3是否点亮
到~/nfs/rootfs目录
2.编译led灯应用程序
arm-linux-gnueabihf-gcc fsmp157a_led_test.c
3.在串口工具执行./a.out
4.观察串口工具是否打印信息,并且LED1/LED2/LED3是否点亮