基本环境
我这里的基本环境是在博文 Linux Kernel 之二 零基础构建流程、Image 介绍、Image 使用说明 中配置好的。嵌入式 Linux 运行环境搭建系列博文涉及的所有源代码均放到了我个人的 Gitee 上:https://gitee.com/itexp/BOARD-STM32F769I-EVAL。这个仓库中包含了的所有源代码会根据后续博文一步步进行各种适配,如果你是纯学习则可以直接 clone 该仓库来学习!
其中,为了在适配 Buildroot、Yocto 等工具时方便,该仓库采用了 git submodule 来进行基本的组织。本篇博文我们重点是学习 Linux Kernel,因此,也可以直接使用 https://gitee.com/itexp/linux-5.15.52 这个子仓库来学习。
移
植过程
绝大多数情况下,移植工作都不是从零开始。Linux Kernel 中默认提供了对于 STM32F769-disco 的支持,STM32F769I-EVAL 的移植完全可以参考它来进行。此外,在博文 U-Boot 之三 移植过程详解、 STM32F769I-EVAL 开发板适配 已经将学习过设备树相关的适配,而 U-Boot 的设备数文件和 Linux 内核中的是基本一致的。
增加 STM32F769-eval 设备树文件:./arch/arm/boot/dts/stm32f769.dtsi 和 ./arch/arm/boot/dts/stm32f769-eval.dts。stm32f769.dtsi 是直接复制的 stm32f746.dtsi 然后更名的,没有任何修改;stm32f769-pinctrl.dtsi 原来就存在,不需要改动;stm32f769-eval.dts 是直接复制的 stm32f769-disco.dts,然后做了如下更改:
将新增的 stm32f769-eval.dts 添加到 ./arch/arm/boot/dts/Makefile 中,否则编译系统不会编译我们新增的设备树文件。
编辑 ./arch/arm/mach-stm32/board-dt.c,在其中增加自己的 MCU 。由于 Linux 本身提供了对于 STM32F769-disco 开发板的支持,因此这里面已经有了 STM32F769,因此,我们 board-dt.c 不要更改。
此外,还需要在 MCU 这一级的 Kconfig 文件 ./arch/arm/mach-stm32/Kconfig 中添加我们的 MCU。同样,由于 Kconfig 中已经存在 MAC_STM32F769 了,这里我也不需要更改。此外,这里默认选择了全部 MCU,我修改为只选中 STM32F769。也可以后面在 menuconfig 中手动更改,效果是一样的。
将 STM32 的配置添加到 ARM 架构这一级的 ./arch/arm/Kconfig 配置系统中。同样,由于 Linux 本身提供了对于 STM32F769-disco 开发板的支持,因此这里面已经有了 ./arch/arm/mach-stm32/Kconfig,因此,不需要更改。
这里需要注意,我们的 STM32F769 是没有 mmu 的,因此,实际在 ./arch/arm/Kconfig-nommu 文件中有很多真多我们的 MCU 的默认配置,这里不需要修改,后面可以直接使用 stm32_deconfig 文件中的配置覆盖这些默认配置。
将 ARM 架构添加到架构一级的总的 Kconfig 系统 ./arch/Kconfig 中。同样,由于 Linux 本身提供了对于 STM32 的支持,这里不需要改动。
修改默认的配置文件:./arch/arm/configs/stm32_defconfig。在 Linux Kernel 中,所有 STM32 共用这一个配置文件,这个文件中的部分内容并不能适合我们的开发板。如果不想修改这个文件,我们可以直接新建一个 stm32f769_defconfig,主要修改如下:
修改 DRAM 的地址和大小
取消 XIP,因为 STM32F769 的内部 FLASH 放不开我们的 Image。
之所以在这个配置文件中修改配置是为了不用每次编译都在 ARCH=arm CROSS_COMPILE=arm-none-eabi- make O=build_stm32 menuconfig 进行修改,一劳永逸!
开发板适配
上面的移植仅仅是在 Linux Kernel 中添加了 STM32F769I-EVAL 的支持,接下来还需要根据 STM32F769I-EVAL 的手册修改移植的文件内容,使其完全符合 STM32F769I-EVAL 中各种资源的定义。
注意,Linux Kernel 中的设备树与 U-Boot 中的基本是一致的(U-Boot 的文件就来自于 Linux Kernel),因此,完全可以直接参照在在博文 U-Boot 之二 移植过程详解、 STM32F769I-EVAL 开发板适配 中的适配过程。甚至直接对比文件复制相关改动即可。
DRAM: 16 MiB
根据 STM32F769I-EVAL 手册说明,DRAM 应该是 32MB,这里显示是 16 MiB,显然是不对的。
STM32F769I-EVAL 手册中说 DRAM 芯片是 IS42S32800G-6BLI,我们需要根据手册,修改 FMC 在设备树文件中有描述。
MMC: no card present
STM32F769-EVAL 开发板上是有 SD 卡的。但是这里显示没有卡。不出意外的话,这里是由于 STM32F769-Disco 与 STM32F769-EVAL 在这方面配置不同导致。下图是两款开发板关于 SD 卡的说明:
从中我们可以看出,两款开发板使用的 SDMMC 并不相同!EVAL 开发板有两个 SD 卡插槽:SD1 -> SDMMC1,SD2 -> SDMMC2。而 Discovery 板子只有一个 SD卡插槽:SD -> SDMMC2。关键在于 SDMMC2 的管脚使用是不一样的!
EVAL 板子需要我们修改一下板子的硬件,如上图红色框中所示。从修改便捷性来说,我们直接使用 SD2 即可,只需要配置 JP7 即可
MicroSDcard _detect 引脚需要更改。但是这里有个问题。EVAL 板子中,这个引脚是连接到扩展 IO 的,如何配置到设备树还没处理!不过,我们可以找个临时处理方法:我们借用 PC13 这个引脚,因为正好这个引脚是高电平,正好可以表示 SD 卡插入。
————————————————
版权声明:本文为CSDN博主「ZC·Shou」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/ZCShouCSDN/article/details/128440756
|