start.S是所有armv7架构的cpu共用的,在start.S中的应该都不需要太多的改动。分析到下面,对uboot有了解的朋友,应该都知道这几个函数主要干嘛的
cpu_init_cp15:对cp15寄存器进行初始化的,这个不去动它。
cpu_init_crit:分析进去这个函数,可以发现最后它调用的就是我们板级目录下的
lowlevel_init.S文件,这个得好好改改。
_main:这个函数在crt0.S,用来初始化内存的栈,然后去执行board_f函数。
接下来就进入lowlevel_init中分析,
lowlevel_init.s路径:
/board/samsung/x210,在这里面主要做了关看门狗、禁止中断、设置SRAM、设置串口等,参考开发板厂商的uboot,设置相应的电源置锁代码。设置完成后再打印一个O来表示成功。
这时候就需要将uboot拷贝到sd卡中去启动,要不然之前的uboot启动时已经制锁了电源按键,我们自己测就测不出效果了。
由于官方的uboot没有sd卡烧录工具,所以将之前uboot中的sd卡安装包拷贝一份进去,至于使用方法,之前写过一个帖子
http://blog.csdn.net/tainjau/article/details/75050964
当然,结果还是不能启动,这时候需要分析一下,之前我们使用tftp下载,能够正常启动,那应该就能说明这个新版的uboot是没有问题的,但是用sd卡启动却启动不了。
假设1:sd卡通道坏了。 于是我用之前编译过的旧版的uboot烧录到sd卡中,能够正常启动。
排除上述假设之后,想起之前学习x210裸机的时候提及到:
S5PV210启动时,会先运行内部IROM中的固化代码进行一些必要的初始化,执行完后硬件上会自动读取NAND Flash或sd卡等启动设备的前16K的数据到IRAM中,这16K数据中的前16byte中保存了一个叫校验和的值,拷贝数据时S5PV210会统计出待运行的bin文件中含‘1’的个数,然后和校验和做比较,如果相等则继续运行程序,否则停止运行。
在sd卡烧录镜像的制作工具中,会拆分uboot.bin为BL1和BL2,然后将BL1这部分的文件的前16个字节填充,填充格式如下
因此在编译
uboot.bin的时候,要在uboot前面加上16字节的无用信息占位,要不然烧录工具制作的时候,就会将前16字节给覆盖了。
怎么添加16字节的无效数据占位呢?首先在
/arch/arm/cpu/uboot.lds中找到整个uboot的入口为_start。
然后找到_start在
arch/arm/lib下的
vectors.S中,然后在_start前面加上16字节的无效数据作为填充。
(ps:之前的uboot的start在
start.s下,一开始的时候,直接就在start.s前面加填充字节,结果无效,后来才意识到要找_start这个入口)
修改完vectors.S后,再次编译,然后查看主目录下的
system.map文件,可以看到_start的入口地址挪动了16个字节了。
烧录到sd卡中,启动后,打印出了O,松开电源键,电源也被锁住了。算是成功了一小步。