X-002-HW-S900芯片boot from USB有关的硬件描述
作者:wowo 发布于:2016-5-12 22:01 分类:X Project
1. 前言
本文将以S900芯片[1]为例,介绍和“【任务1】启动过程-Boot from USB”有关的硬件行为。其它人可以借鉴该文档,描述自己所使用平台的硬件特性,以完成该任务。
为了方便操作,这里以“填空题”的形式,给出我们关心的key point,只要我们能够把这些填空题完成,就可以放心的去coding了。题目如下:
1)CPU上电后,从哪种设备( )的哪个地址( )开始执行。
2)用( )方式,可以让CPU进入USB download(或者UART download)模式。
3)进入USB download之后,设备使用哪个USB接口( )和主机通信。
4)进入download模式后,哪一段地址范围(通常为SRAM)可以用来执行程序:( )~( ),size有多大( )。
5)用什么协议( )可以通过USB将bin文件上传到指定的地址。
6)用什么协议( )可以让CPU跳转到到指定地址继续执行。
注1:Boot这一块的资料,国内的IC设计厂商给出的资料都是语焉不详,从哪里得到有用的信息,是一个相当困难的事情。大家只能各显神通了。
2. 答题过程
2.1 Boot from ROM
由“S900 IC Spec1.6小节 System Boot[1]”的描述可知,S900在上电后,会从BROM的初始地址执行boot code(此code可称为Initial Boot Loader,IPL)。同时,由“1.7小节Address Mapping[1]“的描述可知,BROM的地址范围为[0xFFFF0000, 0xFFFFFFFF]。因此,题目1的答案就出来了:
CPU上电后,从(Boot ROM)的(0xFFFF0000)开始执行。
注2:Boot ROM的执行地址,和本文的任务没有直接关系,因此大家不用太在意。
2.2 进入USB download(DFU)模式
同样,由“SoC_bubblegum96.pdf 1.6小节 System Boot[1]”的描述可知,Boot ROM的代码开始执行之后,会依次从NAND Flash、SPI NOR 和SD/MMC/eMMC等存储介质中查找有效的boot code(此code可称为Second Boot Loader,SPL,这个过程会在后面Boot from eMMC等任务中介绍),如果没有找到,则将名称为ADFULauncher的代码从Boot ROM中加载到SRAM并执行。ADFULauncher负责通过USB接口和主机通信,以便将主机上的bin文件加载到板子上并运行,这就是传说的“Boot from USB”。
因此,进入USB download(后面简称DFU,Device Firmware Upgrade)的方法,就是各种存储介质中,都没有有效的boot code。对S900 96board来说,可用于boot的存储介质是SD卡和eMMC[2],因此,只要不插SD卡,同时eMMC中不存在有效数据即可。不插SD卡好办,eMMC中没有有效数据是什么意思呢?
其实Boot ROM从存储介质中读取boot code的时候,会进行一些校验(如固定的标识、checksum等),如果校验失败,则认为boot code无效。因此,对S900 96board就采用了比较粗暴的方法进入DFU模式:将eMMC控制器的data0接地(就无法读到有效数据了),如下(具体可参考S900 96board原理图[3]):
图片1 s900_96board_adfu_key
上图SW3按下的时候,data0会对地短路,因此,在S900 96board上电的过程中,按住SW3,就可以进入DFU模式(图中称作ADFU,是Action DFU的简称)。所以,题目2的答案也出来了:
(上电的过程中,按住SW3按键),可以让CPU进入USB download(或者UART download)模式。
注3:ADFULauncher是一段固化在Boot ROM的代码,会在ADFU的时候被拷贝到SRAM中执行,负责通过USB接口和主机通信,以加载firmware。
注4:有关SW3按键在开发板上的位置,可以参考“S900 96board硬件手册[2]”的“2 PCB TOP & BOT Side”章节的说明。
2.3 使用哪个USB接口和主机通信
由“S900 96board硬件手册[2]”的“4.8.1 USB-Host ports”章节的说明可知,S900使用TypeA接口的JUSB1(USB3.0)进行ADFU操作。因此,题目3的答案是:
进入USB download之后,设备使用(JUSB1接口)和主机通信。
注5:有关JUSB1在开发板上的位置,可以参考“S900 96board硬件手册[2]”的“2 PCB TOP & BOT Side”章节的说明。
注6:USB TypeA接口和我们电脑上常用的哪种插U盘的接口一样,因此需要特殊的USB连接线(两端都和U盘的连接头一样)才能连接S900 96board开发板和电脑,这种线材不是很常用,只能说这是个SB设计了!!
2.4 SRAM地址范围
“S900 IC Spec[1]”在“1.7 Address Mapping”章节有关SRAM地址范围的描述如下:
0xE4060000 0xE40BFFFF 384K ShareSRAM
1. 0xE4060000~0xE4067FFF
(Independent 32KB SRAM for secure world)
2. 0xE4068000~0xE407FFFF
(96KB SRAM shared from DE)
由此可知,S900 IC具有384K的SRAM,其中前面32K(0xE4060000~0xE4067FFF)保留给secure world使用,0xE4068000~0xE407FFFF之间的96K,和DE(Display Engine)共用。按理说boot阶段不需要显示的话,和DE共用的SRAM应该可以使用,因此,可供使用的SRAM范围就是0xE4068000~0xE40BFFFF的352K?
好吧,我承认我失败了,实际情况不是这样的,请看下面一张图片(这些信息在公共渠道是拿不到,我们也是多方打听,费尽心思才收集到,如果大家手上的板子也有类似情况,这个任务就麻烦了……):
图片2 S900 ADFULauncher执行情况
由上面图片可知,Boot ROM代码会在进行ADFU的时候,将12.5KB大小的ADFULancher拷贝到SRAM的0xe4068000~0xe406b1ff处执行(为什么不直接在Boot ROM执行????),并使用0xe407efff为堆栈的基址(向上递增)。另外,0xe407f000~0xe407ffff处不知道被什么东西占用了。所以能够使用的SRAM空间是(问题4的答案?):
0xe406b200往下的,不能超过80K(不太确定)的范围?
另外,0xe4080000到0xE40BFFFF共256K的地址范围呢?能不能用?鬼知道,后面写代码试一下好了。
2.5 通过ADFU将主机上的bin文件上传到SRAM的指定地址并执行
问题5和问题6属于DFU USB download protocol的范围,按理说,一个正常的芯片,需要把这个协议开放出来给大家使用,这样才能编写boot有关的代码,但遗憾的是,我们没有拿到S900这方面的资料。只能说国内的IC设计厂商是相当的奇葩啊。
不过总有办法,经过绞尽脑汁的搜索,我发现了Linaro写的一份ADFU的代码[4],通过猜测加想象,我在代码中找到了我想要的东西,总结如下:
1)USB download protocol使用地址为0x1的端点(Out类型的Endpoint)上传数据(主机到开发板方向),使用地址为0x82的端点(IN类型的Endpoint)返回结果(开发板到主机方向)。
2)USB的传输类型为bulk。
3)数据交互的过程,利用了USB Mass Storage协议,具体过程后续会结合USB Mass Storage协议以及Linaro的代码[4]再详细说明。因此,问题5和问题6的答案,暂时不在这里总结了。
注7:有关USB的知识,会在后续的文章中介绍,或许蜗窝USB子系统的分析文章,也可以顺势展开了。
3. 总结
受限于IC厂商的莫名其妙,提供的boot有关的资料少之又少,本文完成的并不理想,但总算勉强可以继续“【任务1】启动过程-Boot from USB”。希望大家在自己的板子上,能够得到尽量多的信息和资源。同时在这里呼吁,国内的IC设计商,应能尽量的包容和开发,只有这样才能越来越强大。
4. 参考文档
[1] S900 IC Spec,https://github.com/96boards/documentation/blob/master/bubblegum-96/SoC_bubblegum96.pdf
[2] S900 96board硬件手册,https://github.com/96boards/documentation/blob/master/bubblegum-96/HardwareManual_Bubblegum96.pdf
[3] S900 96board原理图,https://github.com/96boards/documentation/blob/master/bubblegum-96/bubblegum-96_Schematic_V1.0.pdf
[4] linaro-adfu-tool,https://github.com/96boards-bubblegum/linaro-adfu-tool/blob/master/src/linaro-adfu-tool-bg96.c
原创文章,转发请注明出处。蜗窝科技,www.wowotech.net。

评论:
2016-05-14 09:27
就像s900,通过usb master storage 的话,pc端肯定有配合的pc软件吧?这个软件哪里有?
2016-05-14 09:41
PC端是需要软件,我们会面会一起做。顺便学习一下USB的一些知识。
2016-05-13 10:13
我的猜想是:代码在ROM中执行效率太低, 所以要拷贝到SRAM里面
在SoC里面,ROM的时钟频率要比SRAM,DDR要低得多(比如说DDR是800MHz,ROM里面只有400MHz)
2016-05-13 10:03
1.首先,从公司利益角度,是有所谓的“安全”因素,
一些boot rom要处理secure boot(Trust boot,即对下一级的bootloader做完整性,合法性的校验),这个过程如果公布太多细节,可能会遭到破解而影响到芯片的安全。
2.其次,boot rom的逻辑/流程等技术细节是固化的,私有的。一般用户并不需要了解其中的细枝末节。 甚至会留有后门!(哈哈,你没听错,就是后门),当然不愿意公开了。
就像芯片内部很多寄存器是没有在IC spec里面公布的一样,是用于debug用于的。
3.最后,就是懒,懒得公开...
是的,没错,IC厂商应该包容开放,对于一个开发人员看来,从长远来看是有益的,
但是这事开发人员拍不了板, 公司毕竟都是将利益放第一位,尤其是小公司(IC是烧钱的,承担不起试错的成本)
功能
最新评论
- 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-10-21 17:55