Linux Kernel 之四 移植过程详解、STM32F769I-EVAL 开发板适配

  在之前的博文 Linux Kernel 之一 完整嵌入式 Linux 环境、构建工具、编译工具链、CPU 体系架构 中说了要一步步搭建整个嵌入式 Linux 运行环境,今天主要学习一下将 Linux 内核适配 STM32F769I-EVAL 开发板。

源码

  文中涉及的源代码均放到了我个人的 Github 上:https://github.com/ZCShou/BOARD-STM32F769I-EVAL这个仓库中包含了要搭建的完整嵌入式 Linux 环境的所有源代码,后续博文均以该仓库中的源码为基础来学习!
在这里插入图片描述

开发环境

  我这里使用的基本开发环境依旧是在之前博文中多次说明的 Ubuntu 22.04.1 LTS + Arm GNU Toolchain 11.3.Rel1,对应的 J-link 也依旧是 J-Link_Linux_V764e_x86_64.deb。该环境下需要注意的问题说明如下:
在这里插入图片描述

  1. 由于 Ubuntu 22.04 LTS 默认是标配 OpenSSL 3.x,而旧版 U-Boot 使用的是 OpenSSL 1.x,所以,该环境编译旧版 U-Boot(从 commit e927e21c 开始添加了相关处理) 将出现一堆警告,因此,后续使用 u-boot-v2022.10 这个版本为主:
    在这里插入图片描述
  2. Arm GNU Toolchain 10.2-2022.02 存在 BUG,导致编译 U-Boot 报错,不要使用这个版本!
    在这里插入图片描述
  3. 新版(Arm GNU Toolchain 10.3 之后的版本)的 Arm GNU Toolchain 在 Linux 上 GDB 需要 Python3.8 支持。然而,Ubuntu 22.04 默认的 Python 是 3.10。直接运行 arm-none-eabi-gdb 报错如下:
    在这里插入图片描述
    解决方法就是直接手动安装 Python3.8 即可。 旧版的 Arm GNU Toolchain 10.3 -2021.10 不需要 Python 支持
    sudo add-apt-repository ppa:deadsnakes/ppa -y
    sudo apt install python3.8
    

  我使用的是 VSCode 来查看 U-Boot + Kernel 源代码,为了查看方便,我把不需要的文件进行了隐藏,通过将不需要的文件排除在外,加快搜索等操作的执行,也避免了过多无用结果。以下是我的 VSCode 配置:

{"files.exclude": {"**/.git": true,"**/.svn": true,"**/.hg": true,"**/CVS": true,"**/.DS_Store": true,"u-boot-v2021.10":true,// arch"**/mips": true,"**/powerpc": true,"**/riscv": true,"**/ti": true,"**/x86": true,"**/sandbox": true,"**/arch/{arc,m68k,microblaze,mips,nios2,powerpc,riscv,sandbox,sh,x86,xtensa,um,sparc,s390,parisc,openrisc,nds32,ia64,hexagon,h8300,csky,arm64,alpha}": true,// cpu"**/arch/arm/cpu/{arm11,arm720t,arm920t,arm926ejs,arm946es,arm1136,arm1176,armv7,armv8}": true,// machine"**/arch/arm/mach-[^s]*": true,"**/arch/arm/mach-s[^t]*": true,"**/arch/arm/mach-st[^m]*": true,"**/arch/arm/mach-stm32[$^m]*": true,// dts"**/dts/[^s|^M|^i|^a|^d|^.]*": true,"**/dts/d[^t]*": true,"**/dts/i[^n]*": true,"**/dts/in[^c]*": true,"**/dts/a[^r]*": true,"**/dts/ar[^m]*": true,"**/dts/arm[^v]*": true,"**/dts/s[^t]*": true,"**/dts/st[^m|^-]*": true,"**/dts/stm32[^f]*": true,"**/dts/stm32f[^7]*": true,"**/dts/stm32f7[^6|4|^-]*": true,"**/dts/stm32f769-[^e|d|p]*": true,// configs"**/configs/[^s]*": true,"**/configs/s[^t]*": true,"**/configs/st[^m]*": true,"**/configs/stm[^3]*": true,// "**/configs/stm3[^2]*": true,"**/configs/stm32[^f|^_]*": true,"**/configs/stm32f[^7]*": true,// "**/configs/stm32f7[^6|^4]*": true,// "**/configs/stm32f769-[^e]*": true,// board"**/board/[^s]*": true,"**/board/s[^t]*": true,"**/board/ste": true,"**/board/sto*": true,"**/board/st/st[^m]*": true,"**/board/st/stm32[^f]*": true,// "**/board/st/stm32f[^7]*": true,// "**/board/st/stm32f7[^6|^4]*": true,},"editor.insertSpaces": false
}

运行环境

  我使用的嵌入式环境是 STM32F769I-EVAL 板子。STM32F769I-EVAL 板子使用的 STM32F769NI 这个 MCU,STM32F769NI 这款 MCU 采用的是 ARM Cortex-M7 的核心,指令集架构是 ARMv7m。此外,还需要注意,这个板子上的的串口的 RX 默认是断开,需要用短路帽连接起来。
在这里插入图片描述
  Linux 内核本身提供了对于 STM32 的支持,不过并没有提供 STM32F769I-EVAL 板子对应的设备树文件。配置文件是 ./arch/arm/configs/stm32_defconfig。不过,这个文件更像是一个 DEMO,其中的有些内容并不符合我们的 STM32F769I-EVAL 开发板,本篇博文的移植主要就是添加对于 STM32F769I-EVAL 板子的支持。

移植过程

  绝大多数情况下,移植工作都不是从零开始。Linux Kernel 中默认提供了对于 STM32F769-disco 的支持,STM32F769I-EVAL 的移植完全可以参考它来进行。此外,在博文 U-Boot 之二 移植过程详解、 STM32F769I-EVAL 开发板适配 已经将学习过设备树相关的适配,而 U-Boot 的设备数文件和 Linux 内核中的是基本一致的。
在这里插入图片描述

  1. 增加 STM32F769-eval 设备树文件:./arch/arm/boot/dts/stm32f769.dtsi./arch/arm/boot/dts/stm32f769-eval.dtsstm32f769.dtsi 是直接复制的 stm32f746.dtsi 然后更名的,没有任何修改;stm32f769-pinctrl.dtsi 原来就存在,不需要改动;stm32f769-eval.dts 是直接复制的 stm32f769-disco.dts,然后做了如下更改:
    在这里插入图片描述

  2. 将新增的 stm32f769-eval.dts 添加到 ./arch/arm/boot/dts/Makefile 中,否则编译系统不会编译我们新增的设备树文件。
    在这里插入图片描述

  3. 编辑 ./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 中手动更改,效果是一样的。
    在这里插入图片描述

  4. 将 STM32 的配置添加到 ARM 架构这一级的 ./arch/arm/Kconfig 配置系统中。同样,由于 Linux 本身提供了对于 STM32F769-disco 开发板的支持,因此这里面已经有了 ./arch/arm/mach-stm32/Kconfig,因此,不需要更改。
    在这里插入图片描述
    这里需要注意,我们的 STM32F769 是没有 mmu 的,因此,实际在 ./arch/arm/Kconfig-nommu 文件中有很多真多我们的 MCU 的默认配置,这里不需要修改,后面可以直接使用 stm32_deconfig 文件中的配置覆盖这些默认配置。
    在这里插入图片描述

  5. 将 ARM 架构添加到架构一级的总的 Kconfig 系统 ./arch/Kconfig 中。同样,由于 Linux 本身提供了对于 STM32 的支持,这里不需要改动。
    在这里插入图片描述

  6. 修改默认的配置文件:./arch/arm/configs/stm32_defconfig。在 Linux Kernel 中,所有 STM32 共用这一个配置文件,这个文件中的部分内容并不能适合我们的开发板。如果不想修改这个文件,我们可以直接新建一个 stm32f769_defconfig,主要修改如下:
    在这里插入图片描述

    1. 修改 DRAM 的地址和大小
    2. 取消 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 -> SDMMC1SD2 -> SDMMC2。而 Discovery 板子只有一个 SD卡插槽:SD -> SDMMC2。关键在于 SDMMC2 的管脚使用是不一样的!

  1. EVAL 板子需要我们修改一下板子的硬件,如上图红色框中所示。从修改便捷性来说,我们直接使用 SD2 即可,只需要配置 JP7 即可
    在这里插入图片描述
  2. MicroSDcard _detect 引脚需要更改。但是这里有个问题。EVAL 板子中,这个引脚是连接到扩展 IO 的,如何配置到设备树还没处理!不过,我们可以找个临时处理方法:我们借用 PC13 这个引脚,因为正好这个引脚是高电平,正好可以表示 SD 卡插入。
    在这里插入图片描述

参考

  1. Linux 官方文档
  2. https://linux-kernel-labs.github.io/refs/pull/187/merge/lectures/intro.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/138569.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SmartNews 基于 Flink 的 Iceberg 实时数据湖实践

摘要:本文整理自 SmartNews 数据平台架构师 Apache Iceberg Contributor 戢清雨,在 Flink Forward Asia 2022 实时湖仓专场的分享。本篇内容主要分为五个部分: SmartNews 数据湖介绍基于 Icebergv1 格式的数据湖实践基于 Flink 实时更新的数据…

C | atexit函数

C | atexit函数 文章目录 C | atexit函数atexit区别进程终止的方式Reference 欢迎关注公众号“三戒纪元” atexit main函数是整个程序的入口,但是其实可以在内核中可以使用链接器来设置程序的开始地方。 当内核使用⼀个exec函数执行C程序时,在调⽤main…

BI系统上的报表怎么导出来?附方法步骤

在BI系统上做好的数据可视化分析报表,怎么导出来给别人看?方法有二,分别是1使用报表分享功能,2使用报表导出功能。下面就以奥威BI系统为例,简明扼要地介绍这两个功能。 1、报表分享功能 作用: 让其他同事…

Android查看公钥与MD5

参考:填写App特征信息_备案-阿里云帮助中心 安卓应用获取App特征信息指导 包名、公钥和签名MD5获取方式有多种,本文以使用JadxGUI工具获取为例。 下载JadxGUI工具:GitHub - skylot/jadx: Dex to Java decompiler下载安装完成后,使…

【C++】String类基本接口介绍及模拟实现(多看英文文档)

string目录 如果你很赶时间,那么就直接看我本标题下的内容即可!! 一、STL简介 1.1什么是STL 1.2STL版本 1.3STL六大组件 1.4STL重要性 1.5如何学习STL 二、什么是string??(本质上是一个类&#xff0…

模式分类与“组件协作模式”

1. GOF-23 模式分类 从目的来看: 创建型(Creational)模式:将对象的部分创建工作延迟到子类或者其他对象,从而应对需求变化为对象创建时具体类型实现引来的冲击。结构型(Structural)模式&#…

爱分析《商业智能最佳实践案例》

近日,国内知名数字化市场研究咨询机构爱分析发布《2023爱分析商业智能最佳实践案例》,此评选活动面向落地商业智能的各行企业和商业智能厂商,以第三方专业视角深入调研,评选出具有参考价值的创新案例。永达汽车集团与数聚股份合作…

计算机竞赛 深度学习LSTM新冠数据预测

文章目录 0 前言1 课题简介2 预测算法2.1 Logistic回归模型2.2 基于动力学SEIR模型改进的SEITR模型2.3 LSTM神经网络模型 3 预测效果3.1 Logistic回归模型3.2 SEITR模型3.3 LSTM神经网络模型 4 结论5 最后 0 前言 🔥 优质竞赛项目系列,今天要分享的是 …

nginx反向代理

nginx反向代理8.反向代理8.1 实现http反向代理8.1.1 反向代理配置参数8.1.2 反向代理单台web服务器8.1.2.1 端口号后加"/"8.1.2.2 端口号后不加"/" 8.1.3指定location 实现反向代理,动静分离8.1.4 反向代理实例:缓存功能8.1.4.1 举例 8.1.5 实现…

Python:Tornado框架之获取get和post的传参

一、获取get方式传参 import tornado.ioloop #导入tornado包 import tornado.web class MainHandle(tornado.web.RequestHandler):def get(self,id): #定义请求函数self.write("Hello %s!" %id)apptornado.web.Application([ #定义应用配置函数(r"/…

HCL Domino LEAP与新的软件下载门户站点

大家好,才是真的好。 还记得Domino Volt吗?是的,我前面花了不少时间来讲基于Domino平台上的低代码开发工具Volt,不下十篇,我记得最后一篇是《Domino Volt 1.0.5中的可视化流程设计器》。结果就在去年11月,…

Android存储权限完美适配(Android11及以上适配)

一、Bug简述 一个很普通的需求,需要下载图片到本地,我的三个测试机(荣耀Android10,红米 11 和小米Android 13都没有问题)。 然后,主角登场了,测试的三星Android 13 死活拉不起存储权限弹窗。 …

A股风格因子看板 (2023.09 第07期)

该因子看板跟踪A股风格因子,该因子主要解释沪深两市的市场收益、刻画市场风格趋势的系列风格因子,用以分析市场风格切换、组合风格景露等。 今日为该因子跟踪第7期,指数组合数据截止日2023-08-31,要点如下 近1年A股风格因子收益走…

springboot集成mybatis-plus

一、在spring boot中配置mybatis-plus 1、创建一个spring boot项目&#xff0c;注意勾选mysql 2、在pom.xml文件中添加mybatis-plus的依赖包 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0&qu…

Linux C 网络基础

为什么需要网络通信&#xff1f; 进程间通信解决的是本机内通信 网络通信解决的是任意不同机器的通信 实现网络通信需要哪些支持 1.通信设备&#xff1a;网卡&#xff08;PC机自带&#xff09;&#xff1b; 路由器和交换机&#xff1b; 光纤…

MySQL的sql_mode合理设置

MySQL的sql_mode合理设置 1、sql_mode设置介绍说明 sql_mode是个很容易被忽视的变量&#xff0c;默认值是空值&#xff0c;在这种设置下是可以允许一些非法操作的&#xff0c;比如允许一些非法数据的插入。在生产环境必须将这个值设置为严格模式&#xff0c;所以开发、测试环…

jdk 21发布的意义

jdk 21 最大的功能是虚拟线程&#xff0c;是一种绿色线程&#xff08;具体可以看周志明老师的书籍《深入理解java虚拟机》&#xff09;&#xff0c;目前 jvm 与操作系统的线程是一一对应的关系。 使用了虚拟线程可以减少资源消耗&#xff0c;减少操作系统上下文切换&#xff0…

分享demo:Vue3 使用element plus + vue-i18实现国际化

&#x1f447;面是demo展示 PS&#xff1a;点赞关注私信获取demo

AVR 单片机 调试环境 JTAG MKII

注意 驱动 的厂家: 如果驱动备改变为其他厂家的驱动 就与 AVR Studio7不兼容 保证驱动选择正确是 能够使用硬件调试的关键 如果驱动不对&#xff0c;使用 USB驱动修改工具 修改 比如 UsbDriverTool.exe

2022年贵州省职业院校技能大赛中职组网络安全赛项规程

2022年贵州省职业院校技能大赛中职组 网络安全赛项规程 一、赛项名称 赛项名称&#xff1a;网络安全 赛项归属&#xff1a; 信息技术类 二、竞赛目的 为检验中职学校网络信息安全人才培养成效&#xff0c;促进网络信息安全专业教学改革&#xff0c;培养大批既满足国家网络…