文章目录

  • 前言
  • 一、重新编写脚本
    • 1. init_env.sh
    • 2. build.sh
    • 3. sdflush.sh
  • 二、spl 启动流程
    • 1. start.S
    • 2. board_init_f()
      • 2.1 setup_global_data()
      • 2.2 do_lowlevel_init()
      • 2.3 power_exit_wakeup()
      • 2.4 copy_uboot_to_ram()
      • 2.5 jump to uboot
  • 三、点灯
    • 1. 问题:spl.bin 不正确
    • 2. 问题:灯亮一瞬间后熄灭
    • 3. 亮一段时间后发生 reset
  • 补充

前言

   在 移植 u-boot-2020.07 到 iTOP-4412(一)地址无关码点灯 文中,因为三星比较恶心的 boot 方式(对学习而言),使用了 MOV 等地址无关指令点灯成功,因为不知道 bl2.bin 最终将 u-boot-spl 重定位在哪里,始终无法使用 ldr 等指令点灯。

   对讯为提供的资料经行一番搜索查找发现,讯为有帮助把 bl1 中的安全校验等恶心人的地方去掉,这方便了学习,并且可以看出 spl 的链接地址。所以才能有这一篇文章。

   本文主要讲 spl 的方面。

一、重新编写脚本

1. init_env.sh

   这绝对是一个大坑,最开始我是在 build.sh 中 export 环境变量,第一次编译没有问题,然后发现需要 make menuconfig 或是想手动 make 时发生了错误,肯定是编译器不对,胡乱编译后 make distclean 也不起效果。

   只好用 Beyond Compare 手动和原 u-boot 文件对比一个一个修改后才能正常编译,所以很有必要使用同一的脚本初始化环境变量。

  • . init_env.sh

2. build.sh

为了方便,build.sh 主要实现这几个功能:

  • make xhr4412_defconfig
  • make
  • 检查编译是否成功
  • 反汇编
  • 连接 bl1 spl uboot

反汇编非常重要,调试的时候需要分析。

3. sdflush.sh

用于制作 tf 启动卡:

  • 检查 bin 文件存在
  • 使用 dd 命令将 bin 刷写到 tf card

二、spl 启动流程

[u-boot 2020.07] README

1. start.S

文件流程:

  1. arch/arm/lib/vectors.S
  2. arch/arm/cpu/armv7/start.S
  3. arch/arm/lib/crt0.S

vectors 中的其他 arm 向量不去关心。

   跳转到 reset 后,又跳转了几次看起来是无用功,应该是设计来增加函数的,还没研究怎么添加。最后由 save_boot_params_ret 跳转到 _main

   _main 中会根据 CONFIG_SPL_STACK 的值设置 SP,最后跳转到 board_init_f

2. board_init_f()

函数定义在:

  • arch/arm/mach-exynos/spl_boot.c

该初始化函数主要作用:

  1. 初始化全局变量
  2. lowlevel init
  3. 重定位 u-boot
  4. 跳转到 u-boot,不再返回

2.1 setup_global_data()

定义在 arch/arm/mach-exynos/spl_boot.c

初始化结构体 __aligned(8) gd_t local_gd; ,该结构体存放在堆栈中,具体什么用处还没搞懂。

2.2 do_lowlevel_init()

定义在 arch/arm/mach-exynos/lowlevel_init.c

   首先调用 get_reset_status() 获取 reset 状态,根据 reset 状态来判断需要完成哪些初始化操作。如果是正常启动,要做如下操作:

  • DO_POWER
    set_ps_hold_ctrl()
  • DO_CLOCKS
    system_clock_init()
  • DO_MEM_RESET
    mem_ctrl_init(actions & DO_MEM_RESET)

   如果配置了 UART ,将会初始化 UART,需要注意初始化哪一个 UART。最后初始化 TrustZone,这里修改代码,添加宏,不编译它。

#ifndef CONFIG_XHR4412tzpc_init();
#endif

2.3 power_exit_wakeup()

定义在:arch/arm/mach-exynos/power.c

该函数在 do_lowlevel_init() 返回非零时执行。

2.4 copy_uboot_to_ram()

调用 get_boot_mode() 函数判断从哪里 boot,然后将代码重定位。

2.5 jump to uboot

最后直接跳转到重定位的 u-boot 上执行。

三、点灯

   嵌入式大神鲁迅曾经说过:没有什么是点灯不能解决的,如果有,那就点两个流水灯。

   没想到这么简单的点灯程序仍然不简单。

void led_test(void)
{volatile unsigned long * GPL2CON;volatile unsigned long * GPL2DAT;GPL2CON = (volatile unsigned long *)0x11000100;GPL2DAT = (volatile unsigned long *)0x11000104;*GPL2CON = 1;*GPL2DAT = 1;while (1) ;
}

1. 问题:spl.bin 不正确

   在 out/spl/ 目录中会自动生成 xhr4412-spl.bin,一开始没弄懂这个文件怎么来的,不过就是普通的 u-boot-spl.bin,加了 header 和 padding。

   因为这个 header,导致 spl 被 bl1 重定位后无法执行到 reset,一直没能点灯成功。

   对整个 u-boot 文件夹搜索 grep -nr xhr4412,发现了之前添加的 board 文件夹中有 mkxhr4412spl.c 源文件,应该就是该文件编译后制作的 xhr4412-spl.bin,所以对它进行修改,注释掉 header 部分。

   并且仿造讯为提供的 u-boot 添加 checksum,可能 bl1 还是会对 xhr4412-spl.bin 进行简单校验。

   注意:需要 make distclean 后才能使上述修改生效。

2. 问题:灯亮一瞬间后熄灭

   最开始以为是 watchdog 的原因导致 cpu reset,但是关闭 watchdog 后也是这样的现象。

   后来发现 4412 比简单的 2440 复杂很多,需要电源管理芯片供电,看来应该是设置不对,供电断开了。

   设置 PS_HOLD_CONTROL 寄存器,并且我发现不能在设置该寄存器前 disable watchdog,不然灯完全不会亮,具体原因还没分析出来。

3. 亮一段时间后发生 reset

   设置了 PS_HOLD 后仍然是有问题的,现在可以亮一阵子,但是 6 7 秒后会熄灭重新亮,具体是 watchdog 还是电源管理芯片引起的还未分析出来,下一篇文章再研究这个问题,这里就先闪一闪灯吧。

void led_test(void)
{volatile unsigned long i; // volatile 不会被优化volatile unsigned long * GPL2CON;volatile unsigned long * GPL2DAT;volatile unsigned long * PS_HOLD;GPL2CON = (volatile unsigned long *)0x11000100;GPL2DAT = (volatile unsigned long *)0x11000104;PS_HOLD = (volatile unsigned long *)0x1002330C;*GPL2CON  = 1;*GPL2DAT  = 0;*PS_HOLD |= 0x300;while (1){*GPL2DAT ^= 1;for (i = 0; i < 500000; i++) ;}
}

补充

   只是为了之后点灯不用去翻原理图和芯片手册。。。

static void doled1(int en)
{unsigned long x;if (en) x = 1;else x = 0;*(volatile unsigned long *)0x11000100 = 1; // GPL2CON*(volatile unsigned long *)0x11000104 = x; // GPL2DAT
}static void doled2(int en)
{unsigned long x;if (en) x = 2;else x = 0;*(volatile unsigned long *)0x11000068 = 0;    // GPK1PUD*(volatile unsigned long *)0x11000060 = 0x10; // GPK1CON*(volatile unsigned long *)0x11000064 = x;    // GPK1DAT
}

移植 u-boot-2020.07 到 iTOP-4412(二)地址相关码 boot相关推荐

  1. 嵌入式设备NFS挂载目录(基于iTop 4412)

    嵌入式设备NFS挂载目录(基于iTop 4412) 文章目录 嵌入式设备NFS挂载目录(基于iTop 4412) 1. 背景 2. 工作量分析 3. 上位机搭建NFS Server 3.1 上位机环境 ...

  2. 2020.07 学习日记

    废话 寒假到现在,在家里玩了5个月,来学校又玩了大半个月.以为会做点东西了就什么都懂了,竟然没做准备就投了字节秋招提前批.结果被挂了之后,又被捞起来面试.可以说十分幸运了,但机会都是留给有准备的人 2 ...

  3. 第十弹:网络公开课,免费学习资源,2020.07.05更新

    第十弹:网络公开课,免费学习资源,2020.07.05更新 按照个人兴趣整理的网络公开课资源导航网址:http://www.trochilidaetechnology.com/ 以下为[网络公开课]领 ...

  4. 猎人手游最新服务器,【猎人mm服务端】2020.07月升级經典手工制作搭建网游服务器...

    [猎人mm服务端]2020.07月升级經典手工制作搭建网游服务器 修改标的物的设置,并修改标的物的销售和价格.修改精制道具的价格,并与掉落的道具统一. 无人岛的经验值增加了紫圣诞鹿(经验值是圣诞怪物的 ...

  5. 312戳气球——力扣算法系列2020.07.19 Python

    第25天 2020.07.19 周日 难度系数:困难 题目:有n个气球,编号为0到n-1,每个气球上都标有一个数字,这些数字存在数组nums中. 现在要求你戳破所有的气球.如果你戳破气球i,就可以获得 ...

  6. Spring Boot教程(二十):Spring Boot使用String Task定时任务

    一.JAVA常见的几种定时任务比较 Timer:jdk自带的java.util.Timer类,这个类允许你调度一个java.util.TimerTask任务.使用这种方式可以让程序按照某一个频度执行, ...

  7. Linux移植:正点原子阿尔法IMX6ULL开发板Linux内核源码移植详细步骤(4.1.15版本内核)

    Linux移植:正点原子阿尔法IMX6ULL开发板Linux内核源码移植详细步骤(4.1.15版本内核) 文章目录 Linux移植:正点原子阿尔法IMX6ULL开发板Linux内核源码移植详细步骤(4 ...

  8. 厉害了!Spring Boot + Vue 开发移动端商城(附源码、文档、视频)!

      Java大联盟 致力于最高效的Java学习 关注 B 站搜索:楠哥教你学Java 获取更多优质视频教程 前言 最近有不少小伙伴留言希望楠哥出一套 Spring Boot + Vue 项目实战教程, ...

  9. Gut:粪便病毒组移植减轻2型糖尿病和肥胖症模型小鼠的相关症状

    本文转自无菌动物,原文 链接 https://mp.weixin.qq.com/s/1hfXTQg9U3HmXAvcXyUgyA 粪便病毒组移植减轻2型糖尿病和肥胖症模型小鼠的相关症状 供稿人:张行 ...

最新文章

  1. ANSYS——后处理中单元表(ELEMENT table)的作用、创建、使用
  2. 通讯网关 api网关_API网关正在经历身份危机
  3. 每天一个linux命令(性能、优化):【转载】free命令
  4. 爬虫-10-响应对象的常用属性
  5. css3 -- 过渡与动画
  6. Linux 基本命令(十)--grep 常用命令
  7. 《Java 多线程编程核心技术》- 笔记
  8. 自媒体时代,人人可做的自媒体(附自媒体教程,少走弯路)
  9. 3种方法解决txt文档乱码
  10. Mina中的ledger proof
  11. 实施360绩效评估的的3个关键事项
  12. Unity Shader(一) Lowpoly动态低多边形 (QQ登录界面低边动画)
  13. 不用扫描仪!纸质文档秒变电子档,微信这招绝对好用!
  14. 数据结构中各种排序算法的稳定性比较
  15. 使用tar命令进行磁带备份的命令汇总
  16. 【原生js】动态添加class
  17. webjar的详细使用方式
  18. Rails 内置方法大全(慢慢积累中)
  19. 因为瞬间,所以永恒!
  20. 行云管家V4.8版本正式发布:一键唤醒本地工具

热门文章

  1. 比较全的一个项目(PC端)
  2. 软件开发经验总结(容错性)
  3. 计算机组成原理语言方框图,计算机组成原理实验报告3 语言方框图
  4. 机器学习-常用回归算法归纳(全网之最)
  5. Mac打不开别人的.one文件
  6. 驱动专题:第四章MTD及Flash驱动 3. nandflash 详细硬件特性
  7. python爬虫模板(个人总结)
  8. 【蓝桥杯单片机组实战】2、高级计算器
  9. VC/MFC如何设置对话框、static背景颜色
  10. 记录下echarts Map3D地图渐变