1. 两种大小的BL1是怎么回事
关于4412的BL1,有说8k的,也有说15k的,到底哪一个是对的呢?
这要追溯一下4412的版本,Exynos4412一共有两个版本,一个是Exynos 4412,另一个是Exynos 4412 Prime。网上大多数文章都是基于8k来介绍BL1的。我只在关于Exynos4412 SoC的启动分析 | 点滴汇聚 (chasinglulu.github.io)和Exynos4412 的启动过程详解(四)看到过关于Exynos 4412 Prime的介绍,但是没到找到对应的官方资料。两者的主要差异就在于BL1的大小。Exynos 4412 Prime可以支持15k的BL1,也向后兼容,支持8k的BL1。
desc | 8k | size | 15k | size |
---|---|---|---|---|
ProductID, iROM version, function pointer | 0x0202_0000 | 0x0202_0000 | ||
iROM stack | 0x0202_0100 | 1.75K | 0x0202_0100 | 1.75K |
iROM ZI/RW | 0x0202_0800 | 3KiB | 0x0202_0800 | 3K |
BL1 | 0x0202_1400 | 8K | 0x0202_1400 | 15K |
BL2+padding | 0x0202_3400 | 16K | 0x0202_5000 | 16K |
free space | 0x0202_7400 | 0x0202_9000 | ||
END | 0x0206_0000 | 0x0206_0000 |
1.1. 维基百科给出的介绍
这里摘抄一下维基百科介绍:
2011年推出的Exynos 4210才是Exynos系列的第一款产品,它之前被人熟知的名字是Orion(猎户座)。Exynos 4210采用45nm制程,拥有两枚主频为1.2 GHz的Cortex-A9通用处理核心,拥有32/32 KB I/D Cache, 1 MB L2 Cache,并且集成ARM Mali-400 MP图形处理核心。在视频方面,Exynos 4210支持单路WXGA和双路WSVGA视频输出,支持HDMI v1.3a高清标准,可以拍摄1080p、30fps标准高清视频;Exynos 4210提供了6.4GB/s的内存带宽,支持LPDDR2/DDR2/DDR3内存。代表产品有三星Galaxy Tab 7.7、Galaxy S II(i9100)、Galaxy Note和魅族MX等。
2011年9月发布的Exynos 4212在Exynos 4210的基础上再加改进:首先制程变为32nm,比起之前的45nm能够节省超过50%的能源。而且虽然同样为Cortex-A9架构,但Exynos 4212主频升至1.5GHz,比起4210更为强劲,3D性能约为后者的2倍,可用在手机及平板电脑上。
2012年初,三星正式推出了自家的首款四核移动处理器Exynos 4412。这款新Exynos四核处理器,拥有32nm HKMG(高K金属栅极技术)制程,支持双通道LPDDR2 1066。新的32nm HKMG技术可以帮助降低功耗,按照官方的说法,和其前代比会减低20% 的功耗。三星Exynos 4412四核处理器仍然集成Mali-400MP图形处理器,但三星公司已将这颗图形处理器主频由此前的266MHz提升至400MHz,新闻稿指出会比现有的双核机型整体性能提升60%,图像处理提升 50%。2012年5月,首款采用Exynos 4412处理器的智能手机三星Galaxy S III正式上市,以及于6月上市的魅族MX四核版和12月上市的纽曼N2。
SoC | CPU | GPU | 内存技术 | 供货时间 | 应用设备 |
---|---|---|---|---|---|
型号 | 制程 | 指令集 | 架构 | 核心 | 频率 (GHz) |
Exynos 4 Dual 45 nm``(Exynos 4210) [[7]](https://zh.wikipedia.org/zh-cn/%E4%B8%89%E6%98%9FExynos#cite_note-4212page-7) | 45 nm | ARMv7 | Cortex-A9 | 2 | 1.2 或 1.4 |
Exynos 4 Dual 32 nm``(Exynos 4212) [[7]](https://zh.wikipedia.org/zh-cn/%E4%B8%89%E6%98%9FExynos#cite_note-4212page-7) | 32 nm HKMG | Cortex-A9 | 2 | 1.5 | Mali-400MP4[[10]](https://zh.wikipedia.org/zh-cn/%E4%B8%89%E6%98%9FExynos#cite_note-10) (quad-core) @ 400 MHz; 16 GFLOPS |
Exynos 4 Quad[[13]](https://zh.wikipedia.org/zh-cn/%E4%B8%89%E6%98%9FExynos#cite_note-SE4Quad-13)`` (Exynos 4412) [[14]](https://zh.wikipedia.org/zh-cn/%E4%B8%89%E6%98%9FExynos#cite_note-SGSIII-14) | 32 nm HKMG | Cortex-A9 | 4 | 1.4 | ARM Mali-400MP4[[15]](https://zh.wikipedia.org/zh-cn/%E4%B8%89%E6%98%9FExynos#cite_note-4412Manual-15) (quad-core) @ 440 MHz ; 17.6 GFLOPS |
Exynos 4 Quad[[13]](https://zh.wikipedia.org/zh-cn/%E4%B8%89%E6%98%9FExynos#cite_note-SE4Quad-13)`` (Exynos 4412 Prime) [[14]](https://zh.wikipedia.org/zh-cn/%E4%B8%89%E6%98%9FExynos#cite_note-SGSIII-14) | 32 nm HKMG | Cortex-A9 | 4 | 1.6 | ARM Mali-400MP4[[15]](https://zh.wikipedia.org/zh-cn/%E4%B8%89%E6%98%9FExynos#cite_note-4412Manual-15) (quad-core) @ 533 MHz; 21.32 GFLOPS |
2. Exynos4412的启动
关于Exynos4412的启动模式、启动流程、文件布局等,在Android_Exynos4412_iROM_Secure_Booting_Guide_Ver.1.00.00.pdf介绍的很清楚。
关于文件布局,Exynos 4412对BL1进行了限定,如果是使用官方的BL1,则BL2也需要满足指定的要求。如果是自制的BL1,只需要关心BL1的限定即可,BL2可以根据自制的BL1来进行布局。官方给出的布局是BL1+BL1+u-boot+tzsw。
BL1和BL2在存储介质中的block小结。
SD(8k) | eMMC(8k) | SD(15k) | eMMC(15k) | |
---|---|---|---|---|
BL1 | 1~16 | 0~15 | 1~30 | 0~29 |
BL2 | 17~48 | 16~47 | 31~62 | 30~61 |
3. 函数介绍
三星提供了一组从外部介质加载数据的函数,可以在BL1或BL2中直接使用,相关介绍在Android_Exynos4412_iROM_Secure_Booting_Guide_Ver.1.00.00.pdf。
看一下文档中提到的注意事项:
- 在启动时提供给SDMMC和eMMC的时钟是20Mhz,MPLL是这些时钟的源头。
- 如果SDMMC和eMMC被选中为启动设备,那么iROM中SDMMC或eMMC拷贝函数在BL1和BL2阶段是可以使用的。如果你要使用这两函数,那么在使用前请不要修改SDMMC或eMMC的时钟。
另外不要修改SDMMC或eMMC相关的PLL时钟配置。如果你修改了SDMMC或eMMC相关的时钟配置,那么正确的拷贝我们无法保证。
addr | name |
---|---|
0x02020030 | SDMMC_ReadBlocks |
0x0202003C | LoadBL2FromEmmc43Ch0 |
0x02020044 | MSH_ReadFromFIFO_eMMC |
0x02020048 | MSH_EndBootOp_eMMC |
0x02020070 | LoadImageFromUsb |
这里特别说明一下MSH_ReadFromFIFO_eMMC和MSH_EndBootOp_eMMC。
MSH_EndBootOp_eMMC是从eMMC中复制数据到指定位置,这个函数首先从eMMC偏移为0的位置读取,再次调用时,会以上一次读取的结尾为偏移再进行读取。
MSH_EndBootOp_eMMC是所有读取动作完成后调用的。Exynos4412要求启动时从eMMC的boot分区读取数据,个人猜测这个函数是用来将eMMC的读写分区切换到userdata的。如果要烧录boot分区,可以用U-Boot的 mmc partconf
命令来切换要读写的物理分区或设置eMMC上电后的默认读写分区。
如设置为boot0分区启动:
mmc partconf 0 1 1 1
3.1. SDMMC_ReadBlocks
这个接口功能是从SD或MMC类型设备拷贝数据到目的地址中;
返回1=True,0=False;参数(u32 SrcBlock,u32 NumofSrcBlock,void * DstByte)
SrcBlock:start block number.(0 ~ n)拷贝起始块的编号从0开始
NumofSrcBlock:拷贝块的数目
DstByte:目的地址(System Memory)
3.2. LoadBL2FromEmmc43Ch0
这个接口从emmc 4.3拷贝BL2启动区数据到内部RAM;
返回1=True,0=False;参数(u32 SrcBlock,u32 * DstByte )
0x02020040 Emmc43_EndBootOp_eMMC
这个接口结束emmc 4.3启动模式;
返回和参数都是void
3.3. MSH_ReadFromFIFO_eMMC
这个接口从emmc 4.4拷贝启动区数据到目的地址;
返回1=True,0=False;参数(u32 uNumofBlocks,void * uDstAddr)
uNumofBlocks:传输的总块数,1块=512B
uDstAddr:目的地址(System Memory)
3.4. MSH_EndBootOp_eMMC
这个接口结束emmc 4.4启动模式;
返回和参数都是void,这个函数会等待上面读函数的结束。
3.5. LoadImageFromUsb
这个接口从USB拷贝数据,如果在iROM中枚举成功,这个功能就能用;
返回1=True,0=False;参数void