ARM uboot 的移植1-从三星官方 uboot 开始移植

news2024/11/18 16:07:27

一、移植初体验

1、直接编译三星移植版 uboot 尝试运行

(1) 复制到 linux 的源生目录下,然后解压开。

在这里插入图片描述

在这里插入图片描述


(2) 检查 Makefile 中的交叉编译工具链。

在这里插入图片描述


(3) 配置时使用:make smdkv210single_config,对应 include/configs/smdkv210single.h 头文件。

在这里插入图片描述


(4) 配置完成后直接 make 编译,编译完成后就进入烧录步骤。

make distclean
make smdkv210single_config
make -j8

(5) uboot/sd_fusing 目录下有 sd_fusing.sh 脚本,用来烧录。

在这里插入图片描述


2、代码分析 & 问题查找

在这里插入图片描述

在这里插入图片描述

运行结果是:第一,串口无输出;第二,开发板供电锁存成功。

分析运行结果:uboot 中串口最早的输出在 “OK”,在 lowlevel_init.S 中初始化串口时打印出来的;串口无输出 “O” ,说明在打印 “O” 之前代码已经死掉了;开发板供电锁存在 lowlevel_init.S 中,开发板供电锁存成功,说明这个代码之前的部分是没问题的。两个结合起来得到结论:错误在开发板供电锁存代码和串口初始化打印 “O” 代码之间。

整个程序运行是从 start.S 开始的,看代码也从这里开始。
实际上只要屏蔽掉 bl PMIC_InitIp 这一行代码,然后重新编译,整个 uboot 就启动起来了。但是很多配置信息是有问题的,很多功能应该也是不能用的,都要去一一查验。

在这里插入图片描述

make dstclean
make smdkv210single_config
make -j8
cd sd_fusing/
./sd_fusing.sh /dev/sdb

在这里插入图片描述


二、时钟和 DDR 的配置移植

1、更改 CONFIG_IDENT_STRING

在这里插入图片描述

在这里插入图片描述

更改 CONFIG_IDENT_STRING" for MY_ARMBOOT_V210",然后同步到 ubuntu 中的一份代码,然后 make distclean; make smdkv210single_config,然后make,然后烧录运行,检查打印出来的 banner 信息是否如我们改动的那样。

在这里插入图片描述

在这里插入图片描述


2、确认时钟部分的配置

(1) 时钟部分的运行结果本来就是对的,时钟部分的代码在 lowlevel_init.S 中的 bl system_clock_init 调用的这个函数中。函数的代码部分是没任何问题的,根本不需要改动,要改动的是寄存器写入的值,这些值都在配置头文件(smdkv210single.h)中用宏定义定义出来了。如果时钟部分要更改,关键是去更改头文件中的宏定义。

在这里插入图片描述


(2) 三星移植时已经把 210 常用的各种时钟配置全都计算好用宏开关来控制了。只要打开相应的宏开关就能将系统配置为各种不同的频率。

在这里插入图片描述


3、DDR 配置信息的更改

(1) 从运行信息以及 bdinfo 命令看到的结果,显示 DRAM bank0 和 1 的 size 值都设置错了。

在这里插入图片描述


(2) 使用 md 和 mw 命令测试内存,发现 20000000 和 40000000 开头的内存都是可以用的,说明代码中 DDR 初始化部分是正确的,只是 size 错了。

在这里插入图片描述


(3) 内存部分配置成:

在这里插入图片描述

#define CONFIG_NR_DRAM_BANKS    2          /* we have 2 bank of DRAM */
//#define SDRAM_BANK_SIZE         0x20000000    /* 512 MB */
#define SDRAM_BANK_SIZE         0x10000000    /* 256 MB */
#define PHYS_SDRAM_1            MEMORY_BASE_ADDRESS /* SDRAM Bank #1 */
#define PHYS_SDRAM_1_SIZE       SDRAM_BANK_SIZE
//#define PHYS_SDRAM_2            (MEMORY_BASE_ADDRESS + SDRAM_BANK_SIZE) /* SDRAM Bank #2 */
#define PHYS_SDRAM_2            0x40000000
#define PHYS_SDRAM_2_SIZE       SDRAM_BANK_SIZE

#define CFG_FLASH_BASE		0x80000000

在这里插入图片描述


三、DDR地址另外配置

1、目标:将DDR端口0的地址配置为30000000开头

(1) 更改有 2 个目的:第一是让大家体验内存配置的更改过程;第二是 3 开头的地址和DRAM bank1 上 40000000 开头的地址就连起来了。这样我们就得到了地址连续的 512MB 内存,而原来我们得到的 512MB 内存地址是断续的。


2、DDR 初始化参数更改

(1) 根据裸机中讲 DDR 初始化部分的课程,和 uboot 前面分析 uboot 中 DDR 初始化部分的代码的课程,得出结论就是:DDR 的初始化代码部分是在 lowlevel_init.S 中写的,是不用动的。代码部分就是对相应寄存器做相应值的初始化;要动的是值,而 uboot 为了具有可移植性,把值都宏定义在 include/configs/xxx.h 中了。因此我们只需要去这个配置头文件中更改配置值即可。


(2) 更改内容是:#define DMC0_MEMCONFIG_0 0x20E01323 改为:
#define DMC0_MEMCONFIG_0 0x30E01323 注意 20 改为 30 了。

在这里插入图片描述

在这里插入图片描述


3、smdkv210single.h 中相关宏定义修改

(1) 寄存器的值改了后,相当于是硬件配置部分做了更改。但是 uboot 中 DDR 相关的一些软件配置值还没更改,还在原来位置,所以要去更改。

(2) #define MEMORY_BASE_ADDRESS 0x20000000 改为:
#define MEMORY_BASE_ADDRESS 0x30000000。

在这里插入图片描述


4、虚拟地址映射表中相应修改

(1) uboot 中开启了 MMU 对内存进行了段式映射,有一张内存映射表。

(2) 经过实际分析,发现这个内存映射只是把 20000000 开始的 256MB 映射到 C0000000 开头的 256MB。我们更改方法是将 2 改成 3.

在这里插入图片描述


(3) 为了安全起见,再去配置头文件 smdkv210single.h 中查一遍,看看有没有其他的宏定义值和内存配置有关联的。

在这里插入图片描述

重新配置编译,烧录运行查看结果,发现还有问题。

在这里插入图片描述


四、DDR 初始化参数更改2

1、修改 DMC0 的配置参数

(1) 修改 DDR 中 DMC0 的 memconfig_0 寄存器的配置值,将
#define DMC0_MEMCONFIG_0 0x30E01323 改为:
#define DMC0_MEMCONFIG_0 0x30F01323
在这里插入图片描述


(2) 然后重新同步、编译烧写运行,发现 uboot 第二阶段运行了,但是整个 uboot 还是不成功。
在这里插入图片描述


(3) 分析问题,寻找解决方案。分析方法有 2 种:第一种靠经验、靠发现能力、靠直觉去找;第二种就是在整个代码中先基本定位错误地方,然后通过在源代码中添加打印信息来精确定位出错的代码,然后找到精确的出错位置后再去分析错误原因,从而找到解决方案。


2、修改虚拟地址到物理地址的映射函数

在这里插入图片描述

在这里插入图片描述

(1) 修改 uboot/board/samsung/smdkc110/smdkc110.c 中的 virt_to_phy_smdkc110,将其中的 20000000 改为 30000000 即可。

(2) 同步代码,然后重新编译烧录运行。

现象跟三星官方移植的那份源码效果是相同的。

在这里插入图片描述


源自朱友鹏老师.

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

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

相关文章

力扣(LeetCode)430. 扁平化多级双向链表(2023.03.04)

你会得到一个双链表,其中包含的节点有一个下一个指针、一个前一个指针和一个额外的 子指针 。这个子指针可能指向一个单独的双向链表,也包含这些特殊的节点。这些子列表可以有一个或多个自己的子列表,以此类推,以生成如下面的示例…

javaWeb核心01-HTTPTomcatServlet

文章目录HTTP&Tomcat&Servlet1,Web概述1.1 Web和JavaWeb的概念1.2 JavaWeb技术栈1.2.1 B/S架构1.2.2 静态资源1.2.3 动态资源1.2.4 数据库1.2.5 HTTP协议1.2.6 Web服务器1.3 Web核心课程安排2, HTTP2.1 简介2.2 请求数据格式2.2.1 格式介绍2.2.2 实例演示2.…

区块链学习

hash函数 一种算法任意长度的二进制数据映射为固定长度的二进制数据 hash函数的特点 确定性------对同一个输入数据每次都能得到相同的结果单向性------对一个数据可以很容易计算出hash值,但是对于一个hash值非常难反推出数据隐秘性------没有可行的方法算出hash…

OpenCV入门(三)快速学会OpenCV2图像处理基础

OpenCV入门(三)快速学会OpenCV2图像处理基础 1.颜色变换cvtColor imgproc的模块名称是由image(图像)和process(处理)两个单词的缩写组合而成的,是重要的图像处理模块,主要包括图像…

VSCode问题记录

20230304 - 0. 引言 这几年的编程方式还真是各种变化,从一开始直接VIM,到后面使用jupyter进行机器学习相关,然后再过渡到vim的形式并加以tmux批量化,最后去年使用了vscode作为IDE。随着工具的变化,那么很多习惯也都随…

PyQGIS自定义应用程序打包

路径准备ps:打包时需要根据自己的安装路径进行相应修改QGIS3.22.16的安装路径:D:\QGIS3.22.16QGIS3.22.16中python-qgis.bat的路径:D:\QGIS3.22.16\bin\python-qgis-ltr.bat准备打包的工程所在目录:E:\Crater_DamageEstimation0303安装pyinst…

Python基础—文件操作

Python基础—文件操作 文件操作 文件是指为了重复使用或长期使用的目的,以文本或二进制形式存放于外部存储器(硬盘、U盘、光盘等)中的数据保存形式,文件是信息交换的重要途径,也是利用程序解决实际问题的重要媒介。 …

网络编程面试相关内容

1.什么是网络编程网络编程的本质是多台计算机之间的数据交换。数据传递本身没有多大的难度,不就是把一个设备中的数据发送给其他设备,然后接受另外一个设备反馈的数据。现在的网络编程基本上都是基于请求/响应方式的,也就是一个设备发送请求数…

RPC框架笔记

文章目录RPC概述一次RPC的完整过程RPC的优缺点分层设计编解码层——数据格式协议层——概念网络通信层——网络库RPC框架的关键指标稳定性易用性扩展性观测性高性能Kitex框架解读整体框架自研网络库——Netpoll扩展性设计性能优化——网络库优化性能优化——编解码优化合并部署…

【Flutter入门到进阶】Flutter基础篇---组件生命周期与状态

1 Android界面渲染流程UI树与FlutterUI树的设计思路对比 1.1 android渲染流程中的树的组织 1.1.1 XML加载与解析 1.1.2 ViewRootImpl组织树结构 1.1.3 编舞者掌控调用时机 1.1.4 View负责UI渲染 1.1.5 底层surfacefiling负责沟通硬件 1.2 flutter组件设计思路&#xff0c…

Canal实时监控案例

Canal实时监控案例 文章目录Canal实时监控案例0. 写在前面1. TCP 模式测试1.1 IDEA创建项目canal-module1.2 通用监视类——CanalClient1.2.1 Canal 封装的数据结构1.2.2 在 canal-module 模块下创建 cn.canal 包,并在该包下创建 CanalClient.java文件2. Kafka 模式…

前后端身份验证

1、web 开发模式 【】基于服务端渲染的传统 Web 开发模式 【】基于前后端分离的新型 Web 开发模式:依赖于 Ajax 技术的广泛应用。后端只负责提供 API 接口,前端使用 Ajax 调用接口的开发模式 2、身份认证 【】服务端渲染推荐使用 Session 认证机制 【】…

《堆的应用》TOP-K问题

TOP-K问题:即求数据中前k个最大的元素或者最小的元素,一般情况下,这些数据量是非常大的。 比如:专业前10名、世界500强、世界富豪榜、游戏中前100名等这些排名都是TOP-K问题。 来源于《财富》世界500强排行榜。 对于TOP-k问题,能想到的最简…

【XXL-JOB】XXL-JOB定时处理视频转码

【XXL-JOB】XXL-JOB定时处理视频转码 文章目录【XXL-JOB】XXL-JOB定时处理视频转码1. 准备工作1.1 高级配置1.2 分片广播2. 需求分析2.1 作业分片方案2.2 保证任务不重复执行2.2.1 保证幂等性3. 视频处理业务流程3.1 添加待处理任务3.2 查询待处理任务3.3 更新任务状态3.4 工具…

考研还是工作?两战失败老道有话说

老道入职第一周自我介绍谈谈考研谈谈工作新的启程自我介绍 大家好!在下是一枚考研失败两次的自认为聪明能干的有点小帅的实则超级垃圾的三非名校毕业的自动化渣男。大一下就加入实验室,在实验室焊板子、画板子、培训、打比赛外加摸鱼;参加过…

Swagger扩展 - 同一个接口生成多份Swagger API文档

为同一个ApiOperation生成多份不同Swagger API文档。 0. 目录1. 背景2. 效果展示3. 实现3.1 关键逻辑 - 让接口自解释3.2 关键逻辑 - 如何生成相应的ApiDescription3.3 关键逻辑 - 如何为生成的ApiDescription 赋值3.4 关键逻辑 - 如何动态生成Docket4. 继续优化5. 参考1. 背景…

【Spark分布式内存计算框架——Structured Streaming】3. Structured Streaming —— 入门案例:WordCount

1.3 入门案例:WordCount 入门案例与SparkStreaming的入门案例基本一致:实时从TCP Socket读取数据(采用nc)实时进行词频统计WordCount,并将结果输出到控制台Console。 文档:http://spark.apache.org/docs/2…

一个Bug让人类科技倒退几十年?

大家好,我是良许。 前几天在直播的时候,问了直播间的小伙伴有没人知道「千年虫」这种神奇的「生物」的,居然没有一人能够答得上来的。 所以,今天就跟大家科普一下这个人类历史上最大的 Bug 。 1. 全世界的恐慌 一个Bug会让人类…

Java中的自动类型提升与强制类型转换

一、自动类型提升 自动类型提升是指在程序运行时因为某种情况需要,JVM将较小的数据类型自动转换为较大的数据类型,以保证精度和正确性。在Java中,需要进行类型提升的情况有以下几种: 1. byte、short和char提升为int类型 当运算…

spark sql(五)sparksql支持查询哪些数据源,查询hive与查询mysql的区别

1、数据源介绍 sparksql默认查询的数据源是hive数据库,除此之外,它还支持其它类型的数据源查询,具体的到源码中看一下: 可以看到sparksql支持查询的数据源有CSV、parquet、json、orc、txt、jdbc。这些数据源中前面五个我还能理解&…