第 1 章 Linux内核配置及编译
1.1 解压内核
建立源码目录
- linux@ubuntu:$ cd ~/FS-MP1A/stm32mp1-openstlinux-5.4-dunfell-mp1-20-06-24/sources/arm-ostl-linux-gnueabi/linux-stm32mp-5.4.31-r0
复制代码
该目录下以patch结尾的文件为ST官方提供的补丁文件,linux-5.4.31.tar.xz为标准linux源码包。
解压标准内核源码- linux@ubuntu:$ tar -xvf linux-5.4.31.tar.xz
复制代码
进入内核源码目录下
- linux@ubuntu:$ cd linux-5.4.31
复制代码
1.2 添加STMicroelectronics官方补丁
解压linux内核源码后得到的是Linux社区的标准内核源码,接下来需要将ST官方提供的源码补丁添加到标准内核中。
- linux@ubuntu:$ for p in `ls -1 ../*.patch`; do patch -p1 < $p; done
复制代码
该命令会将上层目录下所有的patch补丁文件应用到当前的内核中。
1.3 生成标准板配置文件
生成multi_v7_defconfig默认配置
- linux@ubuntu:$ make ARCH=arm multi_v7_defconfig "fragment*.config"
复制代码
在默认multi_v7_defconfig配置中加入ST官方提供的fragment config
- linux@ubuntu:$ for f in `ls -1 ../fragment*.config`; do scripts/kconfig/merge_config.sh -m -r .config $f; done
- linux@ubuntu:$ yes '' | make ARCH=arm oldconfig
复制代码
生成自己的默认配置文件
- linux@ubuntu:$ cp .config arch/arm/configs/stm32_fsmp1a_defconfig
复制代码
取消git中的SHA1
- linux@ubuntu:$ echo "" > .scmversion
复制代码
1.4 配置内核
导入交叉编译工具链(如果还未安装SDK可参考《SDK工具链安装》章节进行安装)
- linux@ubuntu:$ source /opt/st/stm32mp1/3.1-openstlinux-5.4-dunfell-mp1-20-06-24/environment-setup-cortexa7t2hf-neon-vfpv4-ostl-linux-gnueabi
复制代码
验证开发工具是否安装正确,显示版本信息如下图所示。
- linux@ubuntu:$ $CC --version
复制代码
在编译前如果需要编译额外的功能或者驱动,可以使用meunconfig来对内核进行配置。
- linux@ubuntu:$ make menuconfig
复制代码
可以在如上菜单中对内核进行详细的配置。
1.5 编译内核
- linux@ubuntu:$ make -j4 ARCH=arm uImage vmlinux LOADADDR=0xC2000040
复制代码
编译后在内核源码目录下,能够在生成一个vmlinux文件,该文件是没有经过压缩的内核镜像,这个镜像导出了所有的内核符号可以用作仿真调试。
此外在arch/arm/boot目录下还生成了一个uImage文件,这就是经过压缩的内核镜像。可以用作系统启动。
1.6 编译内核模块
- linux@ubuntu:$ make ARCH=arm modules
复制代码
该操作会将内核中配置为模块的源码进行编译,最终得到ko文件。
1.7 生成设备树
以参考板DK1设备树文件stm32mp15xx-dkx.dtsi和stm32mp157a-dk1.dts为参考,增加stm32mp15xx-fsmp1x.dtsi和stm32mp157a-fsmp1a.dts:
对stm32mp15xx-fsmp1x.dtsi内容进行整理,去掉没有被使用的节点信息和明显与FS-MP1A的硬件没有关系的节点信息。下文内容是删掉了所有暂不使用的节点信息,整理出一个相对简单的设备树文件,确保内核可以正常启动。后续各个外设移植时会陆续增加文件的相关内容。
在arch/arm/boot/dts/ 目录下新建
stm32mp15xx-fsmp1x.dtsi:
在arch/arm/boot/dts/ 目录下新建
stm32mp157a-fsmp1a.dts:
- /dts-v1/;
- #include "stm32mp157.dtsi"
- #include "stm32mp15xa.dtsi"
- #include "stm32mp15-pinctrl.dtsi"
- #include "stm32mp15xxac-pinctrl.dtsi"
- #include "stm32mp15xx-fsmp1x.dtsi"
- / {
- model = "HQYJ STM32MP157 FSMP1A Discovery Board";
- compatible = "st,stm32mp157a-dk1", "st,stm32mp157";
- aliases {
- serial0 = &uart4;
- };
- chosen {
- stdout-path = "serial0:115200n8";
- };
- reserved-memory {
- gpu_reserved: gpu@da000000 {
- reg = <0xda000000 0x4000000>;
- no-map;
- };
- optee_memory: optee@0xde000000 {
- reg = <0xde000000 0x02000000>;
- no-map;
- };
- };
- };
- &optee {
- status = "okay";
- };
复制代码 添加了新文件需修改Makefile才能编译,修改arch/arm/boot/dts/Makefile,添加stm32mp157a-fsmp1a.dts的编译选项(红色字体部分为添加内容
- dtb-$(CONFIG_ARCH_STM32) += \
- stm32f429-disco.dtb \
- …….
- stm32h743i-disco.dtb \
- stm32mp157a-avenger96.dtb \
- stm32mp157a-dk1.dtb \
- stm32mp157a-fsmp1a.dtb \
- stm32mp157d-dk1.dtb \
复制代码
重新编译设备树文件
- linux@ubuntu:$ make ARCH=arm dtbs
复制代码
编译完成后会在arch/arm/boot/dts/目录下生成stm32mp157a-fsmp1a.dtb文件
将编译好的设备树文件与内核的uImage文件,复制到ubuntu主机的/tftpboot文件夹下,当使用tftp方式下载内核与设备树文件时会用到。
- linux@ubuntu:$ cp arch/arm/boot/uImage /tftpboot/
- linux@ubuntu:$ cp arch/arm/boot/dts/stm32mp157a-fsmp1a.dtb /tftpboot/
复制代码
1.8 配置tftp
在linux系统移植中,我们使用tftp下载的方式来验证结果。使用tftp下载需要构建pxelinux相关的目录。此部分可参考《通过tftp方式下载linux内核及设备树》章节进行搭建。
如果环境搭建已经搭建完成,需要将ubuntu主机中的/tftpboot/pxelinux.cfg/01-00-80-e1-42-60-17文件内容,暂时替换为如下内容,在后续的移植过程中会根据不同的需求进行修改。
- /tftpboot/pxelinux.cfg/01-00-80-e1-42-60-17
- # Generic Distro Configuration file generated by OpenEmbedded
- menu title Select the boot mode
- TIMEOUT 20
- DEFAULT stm32mp157a-fsmp1a-emmc
- LABEL stm32mp157a-fsmp1a-emmc
- KERNEL /uImage
- FDT /stm32mp157a-fsmp1a.dtb
- APPEND root=/dev/mmcblk1p4 rootwait rw console=ttySTM0,115200
复制代码
修改01-00-80-e1-42-60-17文件后,继续按照《通过tftp方式下载linux内核及设备树》章节中的描述进行启动。
由于目前还未对源码进行任何修改,在内核启动过程中会停留在如下地方。
后续会通过对系统源码的修改,逐渐完成整个系统的启动和对外围设备的驱动。
————————————————
版权声明:左月先生
|