本篇将对u-boot启动汇编部分做个大概的分析,望批评指正!重点分析Nand_flash启动部分,其他部分与一般的启动代码大同小异!

中断向量表的设置

Reset后进入管理模式,关闭看门狗(默认是打开的),禁止所有中断,设置主频以及外围总线时钟!

这就是支持nand_flash启动,代码copy的部分!S3C2410开发板支持nandflash自启动,复位后将nandflash前4k空间自动拷贝到从零地址开始的4Kram区,sunsamg叫这个为Steppingstone!~再讲一下nand_falsh, S3C2410开发板的NAND闪存由NAND闪存控制器(集成在S3C2410 CPU中)和NAND闪存芯片(K9F1208U0A)两大部分组成。当要访问NAND闪存芯片中的数据时,必须通过NAND闪存控制器发送命令才能完成。所以, NAND闪存相当于S3C2410的一个外设,而不位于它的内存地址区。
NAND闪存(K9F1208U0A)的数据存储结构分层为:1设备(Device) = 4096 块(Block);1块= 32页/行(Page/row);1页= 528B = 数据块 (512B) + OOB块 (16B)在每一页中,最后16个字节(又称OOB)在NAND闪存命令执行完毕后设置状态,剩余512个字节又分为前半部分和后半部分。可以通过NAND闪存命令00h/01h/50h分别对前半部、后半部、OOB进行定位,通过NAND闪存内置的指针指向各自的首地址。
NAND闪存的操作特点为:擦除操作的最小单位是块;NAND闪存芯片每一位只能从1变为0,而不能从0变为1,所以在对其进行写入操作之前一定要将相应块擦除;OOB部分的第6字节为坏快标志,即如果不是坏块该值为FF,否则为坏块;除OOB第6字节外,通常用OOB的前3个字节存放NAND闪存的硬件ECC(校验寄存器)码。
知道原理分析起流程来就简单的多了!首先初始化nand_flash使用0xff命令,然后将nand的前128K空间内容拷贝到NAND_BOOT_TEXT_BASE(ram)定义的空间!然后再对nanflash前4K的空间进行一次正确性检验,就完成了!期间如果任何一步发生错误就会导致无限循环!个人觉得这部分应该再加上一步坏区检查,因为nanflash出现坏区是稀松平常的事,不过如果在前4K空间出现坏区,那这块nanflash就肯定不能用了,不过绝大部分厂商都保证前4K是不会出现坏区的!检测坏区就要使用0x50h命令,看oob的返回值,如果有坏区则跳过一个block!
重中之重已经讲完,下面部分就是设置栈,bss段清零等启动代码都会做的工作!完毕就开始进入C语言部分即跳到_start_armboot,C语言部分将在下篇进行简单的分析!
ldr pc, _start_armboot
_start_armboot: .word start_armboot

1万+

被折叠的 条评论
为什么被折叠?



