前一章我们简单讲了一下怎么通过硬件来配制芯片启动方式,在硬件配制好后自然要了解一下这个软件启是过程是怎么样的。接触过S5P4412的朋友一定都知道IROM boot启动,烧写启动代码时有四个文件要烧写(BL1,BL2,u-boot.bin,TSZW).其实4418也一样采用的是IROM启动方式,但是镜像这一块还有有点不一样,因为s5p4418不支持trustzone功能,所以在烧写代码时就没有TSZW这个文件。
启动过程其实比较简单,如下图:
-
芯片电上
-
当上电后运行的第一个代码就是IROM里的代码,加为芯片里面都有一个小的ROM存储空间,里面是有代码的,具体做些什么也没有看到有介绍资料,但是估计也和4412一样,侦测启动脚的配制,从启动存储里抓取2nboot代码。
-
运行内部RAM 中的2nboot代码(复制u-boot.bin到DDR3中)
-
运行u-boot.bin
上面就是一个代码运行的过程。
知道上面的一个流程我们再来对比的一下S5P4412和S5P4418镜像有什么区别
S5p4412 | S5p4418 |
BL1.bin | 2nboot.bin |
TSZW.bin | NC |
BL2.bin | u-boot.bin |
u-boot.bin |
从这个图表中我们就很易容看出来两平台的镜像有什么区别,4412的BL1相当于4418的2nboot.bin.但是s5p4412 BL2.bin+u-boot.bin相当于s5p4418的u-boot.bin
其实4418中还有一个很重要的文件NSIH.TXT.这个文件也算是启动镜像的一部分。如果少了这个你的u-boot同样跑不起来。这样就很清楚了其实s5p4418里也有三个文件2nboot.bin,u-boot.bin,nsih.txt.
我使用的是九鼎的4418开发板,九鼎在uboot编译的时候已经把这三个文件打包成了一个文件ubootpak.bin。这样我们只要写一个文件就可以了。这三个文件是怎么存放的呢?
加为开发板上是EMMC,EMMC和SD卡其实是一样的,block 0是卡的相关信息,这部分是不能改的,如果改了block 0卡可能就费了。大家一家要注意。所有的有镜像文件都是烧写在block 1以后的。
下面是一个镜像在EMMC中分布图:
Block 0 | Sd/emmc卡信息 |
Block 1 | Nsih.bin |
Block2 | 2nboot.bin |
Block63 | Nsih.bin |
Block64 | u-boot.bin |
这样看就比较清楚看镜像所以具体位置。
U-boot.bin可能大家都知道,这是用u-boot代码编译出来的,这个我就不介绍了。我们来简单说一个nsih.bin这个文件。
Nsih.bin这个文件其实就是对芯片一些简单寄存器的配制,包括(启动方式,PLL,DDR)。
这是我从nsih.txt中截取的一段。
// Vector Code Area
{设置值} {地址} {注释}
E59FF018//0x000 : MOV PC, ResetV
E59FF018//0x004 : MOV PC, UndefV
E59FF018//0x008 : MOV PC, SWIV
E59FF018//0x00C : MOV PC, PAbortV
E59FF018//0x010 : MOV PC, DAbortV
E59FF018//0x014 : MOV PC, NotUsed
E59FF018//0x018 : MOV PC, IRQV
E59FF018//0x01C : MOV PC, FIQV
我已经用红色的标注了各列是什么。我们最终要写入EMMC/SD中的就是前面的这个值。从nsih.txt这个文件中来看我们并不清楚怎么来设定相关的值,这个大家不用担心,三星已经提供了一个excel表格给大家,大家只要通过个表格来设置就自动生成nsih.txt文件。
2nboot.bin这个文件也是一样,我们可以在android代码中找到一个2NBOOT文件夹。是编译这个代码来生成的。
好这一节先介绍到这里,这样大家会更明白怎么来烧写镜像。无论是用专门的工具还是我们直接在ubuntu下用dd命令来烧写我们都可以实现。