分析一下s3c6410的SD卡启动过程

1、资料上说SD卡分两种,一种是普通的SD卡,一种是SDHC卡,主要区别是后者支持大容量,高速;但是文件系统必须都是FAT32,所以无法格式化为FAT32文件系统的卡是无法使用的,这主要是为了兼容SDHC卡,因为只有FAT32的系统才能管理大容量的存储设备,所以SDHC卡都必须使用FAT32,但是s3c6410有一个缺点,就是在识别SDHC卡的时候会忽略后面的1024的块,也就是512K的空间,所以在往SDHC卡内部存储程序时只能抛弃后面的512K的空间,这个地方要注意啦,磁盘格式化仅仅是删除的文件目录区,实际数据还在,而文件目录还有一个备份,这就是为什么删除的文件可以恢复的原因,但是烧写软件可是不知道你的卡是不是SDHC,只会一味的按照你的选择往不同的地址烧写程序,所以说如果你的卡是普通SD卡,而你又烧写过程序,而且你的文件总的大小小于512K,那么即使你再次烧写普通的SD卡的时候选择了SDHC卡,那么还是可以启动的,因为你以前的程序还在,所以会让人误认为随便一个卡用两种方式烧写都可以,
所以切记,使用之前要知道你的卡是什么卡,因为有的不正规的SDHC卡是不会给标示的。
    2、关于boot的启动流程,分为三段:BL0,BL1,BL2,BL0被厂商固化到了处理器当中,启动会先执行这一段代码,具体做什么请看数据手册,他会将BL1拷贝到内部SRAM中,这里就是体现启动方式的时候了,因为处理器会根据你的选择模式去到指定位置加载程序,这里比如选择了SD卡,那么处理器就会到SD中的倒数第18个块开始取数据,这里指出,如果是SDHC卡,其实是到1024+18个块处取程序,因为处理器根本就看不到最后的1024个块,这应该是6410内部固化代码存在的bug或者是故意为之,SD卡一个块是512个字节,所以18个块就是9K,但是6410要求最后必须空出来1K,不知道用意何在,也许是为了以后的产品升级吧,所以正好是从倒是第18个块开始取8K的数据到内部的SRAM中,在前8K当中一定要做一件很重要的事情,就是将整个uboot的加载和重定位到SDRAM当中去最后跳转到绝对地址运行,这样即使你的BL1还没执行完,也可以到SDRAM中继续干活啦,前面是汇编,在重定位之前必须是位置无关代码,至于什么是位置无关,请百度吧,这一段完成一些基本初始化,最主要就是要加载和重定位,另外就是堆栈的初始化,因为后面的C语言阶段是需要堆栈的,具体每个阶段都需要完成哪些东西,根据具体情况会有差别,当然第二阶段加载内核和参数传递时必须有的,其实这些就好像我们的系统一样,有最小系统之说,基本必须的一定要有,其他都是根据具体情况而定。所以我们有的人会认为BL1是汇编部分,BL2是C语言部分,其实不对,更合适的理解应该是这是UBOOT代码的完成任务的两个阶段。BL0在完成一些低级初始化之后就是将BL1拷贝到SRAM,BL1在完成一些初始化之后将uboot代码拷贝到SDRAM中,重定位到编译器编译指定是位置,然后跳转,BL2就是完成一些复杂的初始化,以及很多辅助调试功能,比如网络命令,usb命令,nand命令等等,最后执行你的bootcmd,将内核加载到指定位置,将bootargs放到指定位置,传递给内核mach_type,bootargs的存放地址,然后跳转到内核执行,到这里uboot就完成使命然后消失了。所以说BLx我们可以认为是uboot功能的几个阶段,其实如果只是基本功能的话,完全可以将代码压缩到8K以内,那么就不需要重定位。编译的时候直接从0地址开始就行了。
    3、另外有一个误区,我们在使用SD卡启动的时候,这个代码必须是拼接够256K然后再接上BL1的8K,形成一个264K的代码,然后通过软件烧写到SD卡中,其实这个都是由于三星官网提供的UBOOt代码给忽悠的,因为代码里面前8K在重新加载完整UBOOT代码的时候是从256K+8K开始,然后加载256K到SDRAM,其实我们不能决定的地址只有那个8K的位置,因为这是BL0决定的,我们无法改变,但是拷贝BL2我们是可以自己决定的,也不一定必须是256K,不需要去拼接代码,我们可以放到整个SD卡的任何位置,另外我们还可以放一些其他的东西,比如开始动画,logo啥的,只要你在UBOOT里面配置一下这个地址就行啦。过两天我会发布一个简化版的UBOOT,只完成基本功能,结构很简单也很清晰,帮助大家去理解启动过程。接着还会发布一个我修改过的UBOOT源码,我加入了自定义的菜单,我会出一个相关的说明书,告诉大家怎么用,都需要修改那些东西。今天很晚了,时间紧,就不说了!说的有的有一点模糊,大家谁有啥意见尽管说,或者我有错的地方,一定要帮忙指正一下,我们一起讨论!

你可能感兴趣的:(c,汇编,存储,语言,编译器,磁盘)