你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32MP157系列教程连载-Linux系统移植篇8:STM32MP1微处理器之Linux内核配置及编译

[复制链接]
STMCU小助手 发布时间:2022-9-21 13:40
第 1 章 Linux内核配置及编译

1.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
复制代码

20201123182336169.png

该目录下以patch结尾的文件为ST官方提供的补丁文件,linux-5.4.31.tar.xz为标准linux源码包。
解压标准内核源码
  1. linux@ubuntu:$ tar -xvf linux-5.4.31.tar.xz
复制代码

20201123182403494.png

进入内核源码目录下

  1. linux@ubuntu:$ cd linux-5.4.31
复制代码

20201123182427813.png

1.2 添加STMicroelectronics官方补丁

解压linux内核源码后得到的是Linux社区的标准内核源码,接下来需要将ST官方提供的源码补丁添加到标准内核中。

  1. linux@ubuntu:$ for p in `ls -1 ../*.patch`; do patch -p1 < $p; done
复制代码

该命令会将上层目录下所有的patch补丁文件应用到当前的内核中。

1.3 生成标准板配置文件
生成multi_v7_defconfig默认配置

  1. linux@ubuntu:$ make ARCH=arm multi_v7_defconfig "fragment*.config"
复制代码

在默认multi_v7_defconfig配置中加入ST官方提供的fragment config

  1. linux@ubuntu:$ for f in `ls -1 ../fragment*.config`; do scripts/kconfig/merge_config.sh -m -r .config $f; done
  2. linux@ubuntu:$ yes '' | make ARCH=arm oldconfig
复制代码

生成自己的默认配置文件

  1. linux@ubuntu:$ cp .config arch/arm/configs/stm32_fsmp1a_defconfig
复制代码

取消git中的SHA1

  1. linux@ubuntu:$ echo "" > .scmversion
复制代码

1.4 配置内核
导入交叉编译工具链(如果还未安装SDK可参考《SDK工具链安装》章节进行安装)

  1. linux@ubuntu:$ source /opt/st/stm32mp1/3.1-openstlinux-5.4-dunfell-mp1-20-06-24/environment-setup-cortexa7t2hf-neon-vfpv4-ostl-linux-gnueabi
复制代码

验证开发工具是否安装正确,显示版本信息如下图所示。

  1. linux@ubuntu:$ $CC --version
复制代码

20201123182648549.png

在编译前如果需要编译额外的功能或者驱动,可以使用meunconfig来对内核进行配置。

  1. linux@ubuntu:$ make menuconfig
复制代码

20201123182715818.png

可以在如上菜单中对内核进行详细的配置。
1.5 编译内核

  1. linux@ubuntu:$ make -j4 ARCH=arm uImage vmlinux LOADADDR=0xC2000040
复制代码

20201123182743858.png

编译后在内核源码目录下,能够在生成一个vmlinux文件,该文件是没有经过压缩的内核镜像,这个镜像导出了所有的内核符号可以用作仿真调试。
20201123182800288.png

此外在arch/arm/boot目录下还生成了一个uImage文件,这就是经过压缩的内核镜像。可以用作系统启动。

20201123182817429.png

1.6 编译内核模块

  1. linux@ubuntu:$ make ARCH=arm modules
复制代码

该操作会将内核中配置为模块的源码进行编译,最终得到ko文件。

2020112318285188.png

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:

  1. #include "stm32mp157-m4-srm.dtsi"
  2. #include "stm32mp157-m4-srm-pinctrl.dtsi"
  3. #include <dt-bindings/mfd/st,stpmic1.h>

  4. / {
  5.     memory@c0000000 {
  6.         device_type = "memory";
  7.         reg = <0xc0000000 0x20000000>;
  8.     };

  9.     reserved-memory {
  10.         #address-cells = <1>;
  11.         #size-cells = <1>;
  12.         ranges;

  13.         mcuram2: mcuram2@10000000 {
  14.             compatible = "shared-dma-pool";
  15.             reg = <0x10000000 0x40000>;
  16.             no-map;
  17.         };

  18.         vdev0vring0: vdev0vring0@10040000 {
  19.             compatible = "shared-dma-pool";
  20.             reg = <0x10040000 0x1000>;
  21.             no-map;
  22.         };

  23.         vdev0vring1: vdev0vring1@10041000 {
  24.             compatible = "shared-dma-pool";
  25.             reg = <0x10041000 0x1000>;
  26.             no-map;
  27.         };

  28.         vdev0buffer: vdev0buffer@10042000 {
  29.             compatible = "shared-dma-pool";
  30.             reg = <0x10042000 0x4000>;
  31.             no-map;
  32.         };

  33.         mcuram: mcuram@30000000 {
  34.             compatible = "shared-dma-pool";
  35.             reg = <0x30000000 0x40000>;
  36.             no-map;
  37.         };

  38.         retram: retram@38000000 {
  39.             compatible = "shared-dma-pool";
  40.             reg = <0x38000000 0x10000>;
  41.             no-map;
  42.         };
  43.     };

  44.     vin: vin {
  45.         compatible = "regulator-fixed";
  46.         regulator-name = "vin";
  47.         regulator-min-microvolt = <5000000>;
  48.         regulator-max-microvolt = <5000000>;
  49.         regulator-always-on;
  50.     };

  51.     v3v3: regulator-3p3v {
  52.         compatible = "regulator-fixed";
  53.         regulator-name = "v3v3";
  54.         regulator-min-microvolt = <3300000>;
  55.         regulator-max-microvolt = <3300000>;
  56.         regulator-always-on;
  57.         regulator-boot-on;
  58.     };

  59.     vdd: regulator-vdd {
  60.          compatible = "regulator-fixed";
  61.          regulator-name = "vdd";
  62.          regulator-min-microvolt = <3300000>;
  63.          regulator-max-microvolt = <3300000>;
  64.          regulator-always-on;
  65.          regulator-boot-on;
  66.      };

  67. };

  68. /*HDMI CEC控制器*/
  69. &cec {
  70.     pinctrl-names = "default", "sleep";
  71.     pinctrl-0 = <&cec_pins_b>;
  72.     pinctrl-1 = <&cec_pins_sleep_b>;
  73.     status = "okay";
  74. };

  75. /*循环冗余校验计算单元*/
  76. &crc1 {
  77.     status = "okay";
  78. };

  79. &dma1 {
  80.     sram = <&dma_pool>;
  81. };

  82. &dma2 {
  83.     sram = <&dma_pool>;
  84. };
  85. /*数字钟温度传感器*/
  86. &dts {
  87.     status = "okay";
  88. };
  89. /*图像处理单元*/
  90. &gpu {
  91.     contiguous-area = <&gpu_reserved>;
  92.     status = "okay";
  93. };
  94. /*哈希处理器*/
  95. &hash1 {
  96.     status = "okay";
  97. };

  98. /*处理器间通信控制器*/
  99. &ipcc {
  100.     status = "okay";
  101. };

  102. /*看门狗*/
  103. &iwdg2 {
  104.     timeout-sec = <32>;
  105.     status = "okay";
  106. };

  107. /*随机数发生器*/
  108. &rng1 {
  109.     status = "okay";
  110. };

  111. /*实时时钟*/
  112. &rtc {
  113.     status = "okay";
  114. };

  115. /*sdmmc1 TF卡*/
  116. &sdmmc1 {
  117.     pinctrl-names = "default", "opendrain", "sleep";
  118.     pinctrl-0 = <&sdmmc1_b4_pins_a>;
  119.     pinctrl-1 = <&sdmmc1_b4_od_pins_a>;
  120.     pinctrl-2 = <&sdmmc1_b4_sleep_pins_a>;
  121.     cd-gpios = <&gpioh 3 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>;
  122.     disable-wp;
  123.     st,neg-edge;
  124.     bus-width = <4>;
  125.     vmmc-supply = <&v3v3>;
  126.     status = "okay";
  127. };

  128. &sram {
  129.     dma_pool: dma_pool@0 {
  130.         reg = <0x50000 0x10000>;
  131.         pool;
  132.     };
  133. };

  134. /*命令行终端*/
  135. &uart4 {
  136.     pinctrl-names = "default", "sleep", "idle";
  137.     pinctrl-0 = <&uart4_pins_a>;
  138.     pinctrl-1 = <&uart4_sleep_pins_a>;
  139.     pinctrl-2 = <&uart4_idle_pins_a>;
  140.     pinctrl-3 = <&uart4_pins_a>;
  141.     /delete-property/dmas;
  142.     /delete-property/dma-names;
  143.     status = "okay";
  144. };

  145. /*电源基准缓冲器*/
  146. &vrefbuf {
  147.     regulator-min-microvolt = <2500000>;
  148.     regulator-max-microvolt = <2500000>;
  149.     vdda-supply = <&vdd>;
  150.     status = "okay";
  151. };
复制代码

在arch/arm/boot/dts/ 目录下新建
stm32mp157a-fsmp1a.dts:

  1. /dts-v1/;
  2. #include "stm32mp157.dtsi"
  3. #include "stm32mp15xa.dtsi"
  4. #include "stm32mp15-pinctrl.dtsi"
  5. #include "stm32mp15xxac-pinctrl.dtsi"
  6. #include "stm32mp15xx-fsmp1x.dtsi"
  7. / {
  8.     model = "HQYJ STM32MP157 FSMP1A Discovery Board";
  9.     compatible = "st,stm32mp157a-dk1", "st,stm32mp157";

  10.     aliases {
  11.         serial0 = &uart4;
  12.     };

  13.     chosen {
  14.         stdout-path = "serial0:115200n8";
  15.     };

  16.     reserved-memory {
  17.         gpu_reserved: gpu@da000000 {
  18.             reg = <0xda000000 0x4000000>;
  19.             no-map;
  20.         };

  21.         optee_memory: optee@0xde000000 {
  22.             reg = <0xde000000 0x02000000>;
  23.             no-map;
  24.         };
  25.     };
  26. };

  27. &optee {
  28.     status = "okay";
  29. };
复制代码
添加了新文件需修改Makefile才能编译,修改arch/arm/boot/dts/Makefile,添加stm32mp157a-fsmp1a.dts的编译选项(红色字体部分为添加内容

  1.         dtb-$(CONFIG_ARCH_STM32) += \
  2.         stm32f429-disco.dtb \
  3.         …….
  4.         stm32h743i-disco.dtb \
  5.         stm32mp157a-avenger96.dtb \
  6.         stm32mp157a-dk1.dtb \
  7.         stm32mp157a-fsmp1a.dtb \
  8.         stm32mp157d-dk1.dtb \
复制代码

重新编译设备树文件

  1. linux@ubuntu:$ make ARCH=arm dtbs
复制代码

编译完成后会在arch/arm/boot/dts/目录下生成stm32mp157a-fsmp1a.dtb文件

20201123183049633.png

将编译好的设备树文件与内核的uImage文件,复制到ubuntu主机的/tftpboot文件夹下,当使用tftp方式下载内核与设备树文件时会用到。

  1. linux@ubuntu:$ cp arch/arm/boot/uImage /tftpboot/
  2. 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文件内容,暂时替换为如下内容,在后续的移植过程中会根据不同的需求进行修改。

  1. /tftpboot/pxelinux.cfg/01-00-80-e1-42-60-17

  2. # Generic Distro Configuration file generated by OpenEmbedded
  3. menu title Select the boot mode
  4. TIMEOUT 20
  5. DEFAULT stm32mp157a-fsmp1a-emmc
  6. LABEL stm32mp157a-fsmp1a-emmc
  7.         KERNEL /uImage
  8.         FDT /stm32mp157a-fsmp1a.dtb
  9.         APPEND root=/dev/mmcblk1p4 rootwait rw console=ttySTM0,115200
复制代码

修改01-00-80-e1-42-60-17文件后,继续按照《通过tftp方式下载linux内核及设备树》章节中的描述进行启动。

由于目前还未对源码进行任何修改,在内核启动过程中会停留在如下地方。

20201123183151849.png

后续会通过对系统源码的修改,逐渐完成整个系统的启动和对外围设备的驱动。
————————————————
版权声明:左月先生


收藏 评论0 发布时间:2022-9-21 13:40

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版