在新ARM板上移植U-Boot和Linux指南

news2024/11/18 17:45:32

序言

  • 从支持一个定制板子在U-Boot和Linux中的过程中得到经验
  • 以一个带有知名SoC(i.MX6)且IP已经得到支持的板子为例,这次讨论几乎不涉及编码技能,
  • 更多地聚焦在U-Boot部分

一般原则

  • 如果您有您的BSP(板级支持包)的源代码,请编译并运行BSP以:
    1. 验证您正在工作的IP(知识产权/硬件模块)能够与某些代码一起工作
    2. 拥有一个参考代码
    3. 拥有一个您可以用于调试的代码
  • 专注于正确配置RAM和UART
  • 提交
  • 一次处理一个IP
  • 提交

定制板介绍

  • 基于i.MX6的模块,带有扩展板,
  • 以太网,I2C,SPI,NAND,eMMC,SD卡读卡器,USB设备,EEPROM,
    GPIO,UART,音频(I2S),HDMI,LVDS,PCIe,USB主机,RTC,电源管理集成电路(PMIC)

U-Boot移植

U-Boot 状态

  • 持续从板头文件定义迁移到Kconfig选项,
  • 持续从手动驱动探测迁移到驱动模型

U-Boot 目录结构

  • arch/
    与架构或平台相关的所有内容:设备树(DTS)、CPU初始化、引脚复用控制器、DRAM、时钟等…
  • board/
    特定于板子的代码(初始化、引脚复用配置等),指定板头文件的Kconfig文件,板文件,路径,板文件的Makefile,
  • configs/
    所有板子的默认配置(defconfigs)
  • drivers/
  • include/
    所有头文件
  • include/configs/
    所有板子的头文件

U-Boot新板支持工作流程

  1. 创建板文件
  2. 创建板Kconfig文件
  3. 创建板Makefile
  4. 创建板defconfig
  5. 创建板头文件
  6. 在架构的Kconfig中包含板的Kconfig
  7. 在其CPU的Kconfig中定义TARGET Kconfig选项
    一些平台共享公共文件,因此只需要一个defconfig

创建板文件

board/my_vendor/my_board/my_board.c
在这里插入图片描述

  • 声明全局数据指针
  • 可以在代码中使用全局变量gd
  • 在ARM架构中,对于ARM32等于硬件寄存器r9,对于ARM64等于x18
  • 用于在启动后非常早期的“某些内存”中存储信息,这些内存在系统初始化期间可用(直到我们设置好内存控制器,可以使用RAM)
  • 查看include/asm-generic/global_data.h可以了解它能存储哪些类型的信息。

创建板Kconfig文件

board/my_vendor/my_board/Kconfig

在这里插入图片描述

  • SYS_VENDOR 和 SYS_BOARD 用于标识目录,这样 make 命令能找到编译所需的文件
    - 如果两者都存在
    board/SYS_VENDOR/SYS_BOARD/
    - 如果省略了 SYS_VENDOR
    board/SYS_BOARD/
    - 如果省略了 SYS_BOARD
    board/SYS_VENDOR/common/
  • SYS_CONFIG_NAME 用于标识板头文件
    include/configs/SYS_CONFIG_NAME.h

创建板Makefile文件

board/my_vendor/my_board/Makefile
在这里插入图片描述

创建板defconfig文件

configs/my_board_defconfig

在这里插入图片描述

  • 在这里放置任何可以在Kconfig(菜单配置)中选择的内容
  • 驱动程序、特性、U-Boot行为、库等

创建板header文件

include/configs/my_board.h
在这里插入图片描述

引入板子的Kconfig文件

arch/arm/Kconfig or
arch/arm/mach-imx/mx6/Kconfig
在这里插入图片描述

定义板子的TARGET Kconfig选项

arch/arm/mach-imx/mx6/Kconfig
在这里插入图片描述

U-Boot初始化序列

  • U-Boot会运行两组函数列表,其目的是在用户访问控制台之前初始化或配置特定的IP
  • 第一个列表定义在common/board_f.c文件中的static init_fnc_t init_sequence_f[]数组
  • 第一个列表负责初始化DRAM,映射它,并在工作后重新定位引导程序代码
  • 第二个列表定义在common/board_r.c文件中的static init_fnc_t init_sequence_r[]数组
  • 只有当定义了常量时,才会运行某些函数(例如,定义CONFIG_BOARD_EARLY_INIT_F以运行board_early_init_f())
  • 任何返回非零值的函数都会停止初始化序列,并使U-Boot无法启动
  • 在初始化序列有问题时定义DEBUG
  • 并非所有”特性”在所有函数中都可用(例如,board_early_init_f()中没有udelay)。

驱动选择

  • 从具有相同IP的板子中获取灵感
  • 检查相应子系统中的驱动程序
  1. 专注于驱动程序的行为
  2. 然后查看寄存器、位偏移、掩码等
  3. 检查未定义的宏或常量
  4. 查找被ifdef块包围的代码片段
    - 在子系统的Makefile中查找这个驱动程序的对象文件在这里插入图片描述
  • 使用grep搜索CONFIG_MY_DRIVER
    - 如果在某些Kconfig文件中是可见符号 => 添加到板子的defconfig中
    - 如果在某些Kconfig文件中是非可见符号或未定义 => 添加到板头文件中
  • 确保你的驱动程序被编译(查找my_driver.o)
  • 驱动程序文件位于drivers/mtd/nand/nand_mxs.c
  • 使用CONFIG_NAND_MXS来编译驱动程序
  • 使用CONFIG_SYS_MAX_NAND_DEVICE和CONFIG_SYS_NAND_BASE常量来配置设备

驱动选择 - NAND示例

configs/my_board_defconfig
在这里插入图片描述
include/configs/my_board.h
在这里插入图片描述
board/my_vendor/my_board.c
在这里插入图片描述

关于设备树的说明

  • 设备树的迁移始于2012年,代码正逐渐迁移,逐个驱动程序,逐个子系统
  • 驱动模型需要使用设备树
  • 大多数驱动程序有大量的CONFIG_DM条件编译块
    - 你不能真正基于每个驱动程序选择启用DM支持
  • 子系统核心代码也是如此
  • 我没有深入研究,因为我们要么不需要,要么需要完全支持设备树,而NAND框架还没有迁移到DM。

Linux Kernel 移植

Linux内核新板支持工作流程

1. 创建板子的设备树
2. 将板子的DTB添加到架构DTS Makefile中
3. 为你的板子创建一个默认配置(defconfig)

Device Tree

  • 一个特殊DTS(设备树源)格式的文件
  • 纯粹描述了你的板子的硬件
  • 通过兼容字符串将IP与驱动程序匹配
  • 文档可以在Documentation/devicetree/bindings中找到
  • 有关设备树是什么以及如何编写的更深入解释,请访问:设备树详细介绍视频。

创建板子的设备树

arch/arm/boot/dts/imx6s-my-board.dts
在这里插入图片描述

将DTB添加到架构DTS Makefile中

arch/arm/boot/dts/Makefile
在这里插入图片描述

为你的板子创建一个默认配置(defconfig)

  • 从SoC系列的defconfig开始(例如imx_v6_v7_defconfig),如果没有,从架构的defconfig开始(例如multi_v7_defconfig)
  • 从defconfig中删除无用的SoC系列、驱动程序和特性
  • 添加你想要编译的驱动程序的CONFIG
    - 使用grep搜索驱动程序的基本名称是正确的方法
    - 大多数驱动程序依赖于子系统或其他选项,如果你的驱动程序没有选择它们,你也需要将它们添加到你的defconfig中
  • PCIe驱动程序正在探测但未枚举设备
    - 驱动程序在BSP中工作,发现缺少对电源管理器的支持是罪魁祸首
    - 迅速编写了一个40行的补丁并提交给了上游
  • 以太网驱动程序缺少在BSP中设置的PHY复位后延迟
    - 迅速编写了一个20行的补丁并提交给了上游。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

推荐、nlp、算法题等相关复习(0922-0929)

1. 算法题:路径总和三 求一棵树中所有路径和为targetsum的值,其实有点像和为k的数组,用前缀和来做 先求出前缀和数组,再类似两数之和问题,每次插入一个数,如果target-当前数在哈希表里存在,更…

Vscode: reason: oom, code: -536870904

最近使用github+插件github copilot开发时遇到这个问题, 出现原因:在chat窗口输入了过大的内容。 现象是:每次打开vscode后正常,且打开其他文件夹,再打开chat窗口运行正常。但当再次打开原来的文件夹并打开chat窗口时,则出现此崩溃问题。 尝试以下办法: 1、将D盘虚拟…

Android——添加联系人

概述 第一步 往手机联系人应用中的raw_contacts表添加一条记录 raw_contacts表 ContentValues values new ContentValues();// 往 raw_contacts 添加联系人记录,并获取添加后的联系人编号Uri uri resolver.insert(ContactsContract.RawContacts.CONTENT_URI, …

AI绘画相似风格的作品

目标:根据一张图风格,画出更好的图片 步骤一 等待几分钟,就出来了,点击获取第一个关键词并复制 然后会得到这个四张图片 选中其中的一张,比如第一张 很快就拿到了结果

图解FTP服务器配置:实体用户方式访问案例

任务要求: 某企业搭建一个内部ftp服务器,要求实现如下功能: 用户登录时显示一些欢迎信息;系统账户root、bin不能登录主机;实体用户ligang、liuqiang能够登录ftp服务器;实体用户ligang、liuqiang不能登录本…

数据治理005-血缘关系

数据血缘是元数据产品的核心能力,但数据血缘是典型的看起来很美好但用起来门槛很高的技术,只要你采买过元数据产品就知道了。这篇文章对数据血缘的特征、价值、用途和方法做了系统阐述: 1、特征:归属性、多源性、可追溯及层次性 2…

DOM元素导出图片与PDF:多种方案对比与实现

背景 在日常前端开发中,经常会有把页面的 DOM 元素作为 PNG 或者 PDF 下载到本地的需求。例如海报功能,简历导出功能等等。在我们自家的产品「代码小抄」中,就使用了 html2canvas 来实现代码片段导出为图片: 是不是还行&#xff…

【项目经验分享】深度学习自然语言处理技术毕业设计项目案例定制

以下毕业设计是与深度学习自然语言处理(NLP)相关的毕业设计项目案例,涵盖文本分类、生成式模型、语义理解、机器翻译、对话系统、情感分析等多个领域: 实现案例截图: 基于深度学习的文本分类系统基于BERT的情感分析系…

RabbitMQ 界面管理说明

1.RabbitMQ界面访问端口和后端代码连接端口不一样 界面端口是15672 http://localhost:15672/ 后端端口是 5672 默认账户密码登录 guest 2.总览图 3.RabbitMq数据存储位置 4.队列 4.客户端消费者连接状态 5.队列运行状态 6.整体运行状态

【SpringCloud】环境和工程搭建

环境和工程搭建 1. 案例介绍1.1 需求1.2 服务拆分服务拆分原则服务拆分⽰例 1. 案例介绍 1.1 需求 实现⼀个电商平台(不真实实现, 仅为演⽰) ⼀个电商平台包含的内容⾮常多, 以京东为例, 仅从⾸⻚上就可以看到巨多的功能 我们该如何实现呢? 如果把这些功能全部写在⼀个服务…

基于大数据技术的足球数据分析与可视化系统

作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码 精品专栏:Java精选实战项目…

java计算机毕设课设—博网即时通讯软件(附源码、文章、相关截图、部署视频)

这是什么系统? 资源获取方式在最下方 java计算机毕设课设—博网即时通讯软件(附源码、文章、相关截图、部署视频) 博网即时通讯软件是一款功能丰富的实时通讯平台,旨在提升用户的交流效率与体验。在服务器端,该软件支持运行监控功能&#…

Java中的Junit、类加载时机与机制、反射、注解及枚举

目录 Java中的Junit、类加载时机与机制、反射、注解及枚举 Junit Junit介绍与使用 Junit注意事项 Junit其他注解 类加载时机与机制 类加载时机 类加载器介绍 获取类加载器对象 双亲委派机制和缓存机制 反射 获取类对象 获取类对象的构造方法 使用反射获取的构造方法创建对象 获…

无环SLAM系统集成后端回环检测模块(loop):SC-A-LOAM以及FAST_LIO_SLAM

最近在研究SLAM目标检测相关知识,看到一篇论文,集成了SC-A-LOAM作为后端回环检测模块,在学习了论文相关内容后决定看一下代码知识,随后将其移植,学习过程中发现我找的论文已经集成了回环检测模块,但是我的另…

Postgresql源码(136)syscache/relcache 缓存及失效机制

相关 《Postgresql源码(45)SysCache内存结构与搜索流程分析》 0 总结速查 syscache:缓存系统表的行。通用数据结构,可以缓存一切数据(hash dlist)。可以分别缓存单行和多行查询。 syscache使用CatCache数…

Hadoop框架及应用场景说明

Hadoop是一个开源的分布式系统基础架构。由多个组件组成,组件之间协同工作,进行大规模数据集的存储和处理。 本文将探讨Hadoop的架构以及应用场景。 一Hadoop框架 Hadoop的核心组件包含: 1. Hadoop分布式文件系统(HDFS&#xff…

windows10使用bat脚本安装前后端环境之msyql5.7安装配置并重置用户密码

首先需要搞清楚msyql在本地是怎么安装配置、然后在根据如下步骤编写bat脚本: 思路 1.下载mysql5.7 zip格式安装包 2.新增data文件夹与my.ini配置文件 3.初始化数据库 4.安装mysql windows服务 5.启动并修改root密码(新增用户初始化授予权限&#xff09…

浅拷贝深拷贝

📋目录 📚引入📚浅拷贝📖定义📖实现方式📖特点 📚深拷贝📖 定义📖实现方式📖特点 📚拓展📖Object类✈️toString()方法✈️equals()方…

预防工作场所的违规政策

违规政策是指未经管理层制定或批准的工作场所政策。 它们也可能直接违反公司政策。如果管理不善,这些政策可能会对您的业务产生负面影响。 最常见的流氓政策来源是 试图绕过现有政策框架的员工,或 经理们未经高层领导批准,擅自制定自己的…

《凡人歌》中的IT职业启示录

《凡人歌》是由中央电视台、正午阳光、爱奇艺出品,简川訸执导,纪静蓉编剧,侯鸿亮任制片,殷桃、王骁领衔主演,章若楠、秦俊杰、张哲华、陈昊宇主演的都市话题剧 ,改编自纪静蓉的小说《我不是废柴》。该剧于2…