前段时间我新来的同事弄SD卡启动的时候,按照三星Internal ROM Booting的Application Note弄得,也和网上的文章写的一样,irom启动完了以后开始u-boot的汇编初始化的代码,配置PLL、配置RAM...,然后到C语言段的时候开始调用irom自己提供的CopyMMCtoMem函数将代码复制到内存开始运行。但无论如何跑不起来,还报了4.2 Verification failure of BL1 integrity的错误。后来找了好久,用Jlink连上以后一步一步的看irom的代码才发现了是启动时候的Secure mode的问题。手册里面对于这方面什么都没写,就把我们知道的一点东西写一下吧。
在IROM的手册里面 1.1 Feature 里面写到:
Secure mode support(Verify Integrity of Bootloader for all boot-up device)
但具体是什么他里面没有说。但按后来看irom的代码来看,应该是包括在 2.3 iROM(BL0) boot-up diagram里面画的 Verify integrity of BL1 Success? 这一步的判断里面。
具体检验的内容是什么呢?在 2.7.1 SD/MMC Device Boot Block Assignment 里面的提到的倒数第二个块是 Signature,具体作用就写了一句,也不知所云。
- One block has to be assigned for signature which is located at offset [LAST – 2]
根据我们跟踪Irom汇编的代码的结果来看,在6410手册里面有一段寄存器 0x7E00_D000 ~ 0x7E00_DFFF,他写的功能是 E-Fused register of the SECURE KEY。具体内容和功能也没讲。但我们看到在启动的时候,他会判断这段寄存器区域的前16 Bytes是否为0,如果不为0的话,他会将这段寄存器和上面提到的SD卡里面的Signature区域的数据做一个校验,校验算法具体就没看了。当校验通过才会运行BL1,否则会报报 4.2 Verification failure of BL1 integrity的错误。如果这段区域为0,则不校验,直接运行BL1。
我们的板子就是这出的错。当时我们很奇怪,为啥我们买的开发板能跑呢?我们新买的片子,又没做任何设置,跟别说刻意去设置这种不知道的寄存器了。后来找了开发板的技术支持,他们也没接触过。发贴也没人回。但我们很偏向于是我们自己的板子6410的某个引脚的上电的初始配置和开发板的不一致。但也不可能全部对一遍吧。后来同事在搜索手册的时候有了一个很意外的发现。
他根据0x7E00_D000寄存器说明里面出现的e-fuse搜索6410的手册,搜efuse搜到htr00,其中的说明如下:
htr00(pvhtbr00_efuse) 1.8V~3.3V wide range analog bi-direction path- through PAD without resistor for efuse memory
再搜htr00搜到XEFFVDD的管脚。
我们的板子的这个脚是10K的,开发板是10欧的。直接把电阻短了,在u-boot下读这段寄存器的值,大部分时间为0。再从SD卡启动,OK了。
htr00的描述我们不是很明白,感觉可能是里面是个AD,通过AD采样XEFFVDD上的电压,进行离散化以后产生的0x7E00_D000的值。我们最后把XEFFVDD直接对地短路了,有的时候值也不是全零,具体原因不详。但至少它可以启动了。
这很多东西都是猜测了,写出来希望能给以后做个参考吧。