基于Hikey的"Boot from USB"调试
作者:wowo 发布于:2016-12-20 22:36 分类:X Project
1. 前言
话说在半年前,乐美客送给蜗窝几块Hikey(乐美客版)开发板[1],不过由于太忙,就一直把它们放在角落里思考人生,因此甚是愧疚。这几天,闲来无事,翻了下Hikey的资料,觉得挺有意思,就想花点时间让“X Project”在这个板子上跑起来。当然,按照“规矩”,先从“【任务1】启动过程-Boot from USB”做起,记录如下。
2. Hikey介绍
说实话,作为一块开发板,Hikey有着国产平台的通病----资料匮乏,但它的source code却非常完整:
除ROM code之外的所有代码,都能在github上看到源码,这对ARM linux的学习(“X Project”的关注点)来说,是非常有用的。
另外,之所以觉得这块板子很有意思,是因为海思的这颗SOC----Hi6220V100[2],它有如下的处理器架构:
图片1 Hi6220V100 SOC Architecture
该SOC包含两个处理器子系统:
MCU subsystem,里面有一个Cortex-M3的核,用于充电管理、电源管理等,也包括Boot code的USB download协议(猜测);
ACPU(这个缩写也太逗了,哈哈) subsystem,采用CCI-400互联总线(CoreLink)协议,支持8个Cortex-A53核(2个cluster[3],每个cluster包含4个完全一样 A53核)。
基于上述的架构,Hikey USB boot的流程如下:
图片2 Hi6220V100 USB BOOT
注1:网上没有官方的spec介绍USB boot流程,上面的流程是我根据github上的开源代码,推测出来的,具体可参考:
1)l-loader,https://github.com/96boards/l-loader.git,其中的start.S即为上面图片中的“l-loader”,它是一段运行于Cortex-M3的汇编代码。另外由链接脚本(l-loader.lds)可知,它的执行位置0xf9800800。
2)ARM Trusted Firmware BL1,https://github.com/96boards/arm-trusted-firmware/tree/hikey/bl1,l-loader正确初始化Cortex-A53之后,会将A53的控制权交给ARM Trusted Firmware,首先运行的是BL1,对Hikey来说,BL1的运行地址为0xf9801000(参考BL1_RO_BASE的定义)。
3)https://github.com/96boards/l-loader.git中有一个脚本(gen_loader.py),可以将l-loader和BL1打包生成一个二进制文件,然后通过hisi-idt.py脚本,将这个二进制文件下载到0xf9800800处执行。
注2:Hikey的官方Image并没有使用常规的bootloader(u-boot等),而是用ARM Trusted Firmware代替了bootloader的功能,因此它的boot过程为:l-loader---->ARM Trusted Firmware(BL1, BL2, BL3等)---->Linux kernel。另外,ARM Trusted Firmware也集成了Android的fast boot功能,用起来还是很方便的。感兴趣的同学可以研究一下相关的source code。
3. 移植u-boot SPL到Hikey中
本章将根据第2章罗列的信息,基于“X Project”有关的文档,尝试将u-boot的SPL跑在Hikey开发板上,并点亮一盏灯,步骤如下。
3.1 修改“X Project”的编译脚本,加入对Hikey的支持
不再详细描述修改步骤,具体可参考下面的patch:
3.2 修改“X Project”的u-boot,增加对Hikey SPL的支持
mainline的u-boot已经支持了Hikey,但没有使能SPL功能,这刚好给我们大显身手的机会,步骤如下:
1)修改“arch/arm/Kconfig”,找到config TARGET_HIKEY配置项,增加select SUPPORT_SPL和select SPL,以支持SPL功能
config TARGET_HIKEY
bool "Support HiKey 96boards Consumer Edition Platform"
select ARM64
+ select SUPPORT_SPL
+ select SPL
select DM
select DM_GPIO
select DM_SERIAL
2)修改完成后,在build目录执行make uboot-config,打开配置界面后,直接保存退出,从新生成config文件,具体可参考:
3)修改include/configs/hikey.h文件,增加SPL有关的TEXT配置,如下(黄色部分比较重要):
#define CONFIG_SPL_TEXT_BASE 0xf9801000
#define CONFIG_SPL_MAX_SIZE (1024 * 20)
#define CONFIG_SPL_BSS_START_ADDR (CONFIG_SPL_TEXT_BASE + \
CONFIG_SPL_MAX_SIZE)
#define CONFIG_SPL_BSS_MAX_SIZE (1024 * 12)
#define CONFIG_SPL_STACK (CONFIG_SPL_BSS_START_ADDR + \
CONFIG_SPL_BSS_MAX_SIZE + \
1024 * 12)
4)修改board/hisilicon/hikey/hikey.c,加入两个和SPL有关的函数实现,board_init_f和panic,并在board_init_f中点亮一盏LED灯,代码如下:
+#ifdef CONFIG_SPL_BUILD
+void board_init_f(ulong bootflag)
+{
+ /* GPIO4_2(User LED3), 0xF7020000, GPIODIR(0x400), GPIODAT2(0x10) */
+ writel(readl(0xF7020400) | (1 << 2), 0xF7020400);
+ writel(readl(0xF7020010) | 0xFF, 0xF7020010);
+ while (1);
+}
+
+void panic(const char *fmt, ...)
+{
+}
+#endif
其中LED有关的配置可参考Hikey(乐美客版)的原理图[7]以及Hi6220V100的spec[2]。
修改完毕后,编译生成u-boot-spl.bin,留作后用。
3.3 单独编译出l-loader
从https://github.com/96boards/l-loader.git中将l-loader单独编译出,并保存在“X Project”的tools/hisilicon目录中,留作后用,如下:
https://github.com/wowotechX/tools/blob/hikey/hisilicon/img_loader.bin
注3:l-loader的编译方法,这里不再详细介绍(无非就是下载一个gcc-arm-linux-gnueabihf交叉编译器,稍微修改一下l-loader.git的Makefile文件)。
3.4 将gen_loader.py和hisi-idt.py保存到“X Project”的tools/hisilicon目录中
如下:
https://github.com/wowotechX/tools/blob/hikey/hisilicon/gen_loader.py
https://github.com/wowotechX/tools/blob/hikey/hisilicon/hisi-idt.py
3.5 修改“X Project”的编译脚本,增加Hikey u-boot-spl的运行命令
如下:
img-loader=$(TOOLS_DIR)/$(BOARD_VENDOR)/img_loader.bin
uboot-spl-bin=$(UBOOT_OUT_DIR)/spl/u-boot-spl.bin
gen-loader=$(TOOLS_DIR)/$(BOARD_VENDOR)/gen_loader.py
hisi-idt=$(TOOLS_DIR)/$(BOARD_VENDOR)/hisi-idt.py
spl-run:
# generate SPL image
sudo python $(gen-loader) -o spl.img --img_loader=$(img-loader) --img_bl1=$(uboot-spl-bin)
sudo python $(hisi-idt) --img1=spl.img -d /dev/ttyUSB0
rm -f spl.img
主要思路为:
1)使用gen_loader.py脚本将img_loader.bin和u-boot-spl.bin打包在一起,生成spl.img文件。
2)使用hisi-idt.py将spl.img下载到板子中运行。
3.6 运行并测试
按照[1]中的步骤,为Hikey供电,并让它进入USB boot模式,然后在“X Project”的build目录中执行make spl-run即可。观察Hikey的LED灯,应该有一个亮了,说明移植成功。
4. 参考文档
[1] http://wiki.lemaker.org/HiKey(LeMaker_version):Quick_Start/zh-hans
[2] Hi6220V100
[3] Linux CPU core的电源管理(2)_cpu topology
[4] Hikey l-loader,https://github.com/96boards/l-loader.git
[5] Hikey USB download脚本,http://builds.96boards.org/releases/reference-platform/aosp/hikey/15.10/bootloader/hisi-idt.py
[6] ARM Trusted Firmware, https://github.com/96boards/arm-trusted-firmware.git
[7] Hikey(乐美客版)原理图,http://mirror.lemaker.org/LeMaker%20Hikey%20Schematic.pdf
原创文章,转发请注明出处。蜗窝科技,www.wowotech.net。
标签: USB boot u-boot spl hikey Hi6220V100

评论:
功能
最新评论
- wangjing
写得太好了 - wangjing
写得太好了! - DRAM
圖面都沒辦法顯示出來好像掛點了。 - Simbr
bus至少是不是还有个subsystem? - troy
@testtest:只要ldrex-modify-strex... - gh
Linux 内核在 sparse 内存模型基础上实现了vme...
文章分类
随机文章
文章存档
- 2025年4月(5)
- 2024年2月(1)
- 2023年5月(1)
- 2022年10月(1)
- 2022年8月(1)
- 2022年6月(1)
- 2022年5月(1)
- 2022年4月(2)
- 2022年2月(2)
- 2021年12月(1)
- 2021年11月(5)
- 2021年7月(1)
- 2021年6月(1)
- 2021年5月(3)
- 2020年3月(3)
- 2020年2月(2)
- 2020年1月(3)
- 2019年12月(3)
- 2019年5月(4)
- 2019年3月(1)
- 2019年1月(3)
- 2018年12月(2)
- 2018年11月(1)
- 2018年10月(2)
- 2018年8月(1)
- 2018年6月(1)
- 2018年5月(1)
- 2018年4月(7)
- 2018年2月(4)
- 2018年1月(5)
- 2017年12月(2)
- 2017年11月(2)
- 2017年10月(1)
- 2017年9月(5)
- 2017年8月(4)
- 2017年7月(4)
- 2017年6月(3)
- 2017年5月(3)
- 2017年4月(1)
- 2017年3月(8)
- 2017年2月(6)
- 2017年1月(5)
- 2016年12月(6)
- 2016年11月(11)
- 2016年10月(9)
- 2016年9月(6)
- 2016年8月(9)
- 2016年7月(5)
- 2016年6月(8)
- 2016年5月(8)
- 2016年4月(7)
- 2016年3月(5)
- 2016年2月(5)
- 2016年1月(6)
- 2015年12月(6)
- 2015年11月(9)
- 2015年10月(9)
- 2015年9月(4)
- 2015年8月(3)
- 2015年7月(7)
- 2015年6月(3)
- 2015年5月(6)
- 2015年4月(9)
- 2015年3月(9)
- 2015年2月(6)
- 2015年1月(6)
- 2014年12月(17)
- 2014年11月(8)
- 2014年10月(9)
- 2014年9月(7)
- 2014年8月(12)
- 2014年7月(6)
- 2014年6月(6)
- 2014年5月(9)
- 2014年4月(9)
- 2014年3月(7)
- 2014年2月(3)
- 2014年1月(4)
2022-06-26 09:38