Chinaunix首页 | 论坛 | 博客
  • 博客访问: 61892
  • 博文数量: 4
  • 博客积分: 202
  • 博客等级: 入伍新兵
  • 技术积分: 78
  • 用 户 组: 普通用户
  • 注册时间: 2010-12-14 00:11
文章分类
文章存档

2012年(1)

2011年(3)

我的朋友

分类: LINUX

2011-08-26 00:14:38

    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源码,我加入了自定义的菜单,我会出一个相关的说明书,告诉大家怎么用,都需要修改那些东西。今天很晚了,时间紧,就不说了!说的有的有一点模糊,大家谁有啥意见尽管说,或者我有错的地方,一定要帮忙指正一下,我们一起讨论!
  
阅读(4667) | 评论(6) | 转发(0) |
给主人留下些什么吧!~~

wangshumao12342011-08-31 16:59:46

匿名: 我的硬件完全是由开发板来的,所以boot应该是通用的,GPN(15-13)都为0,选择SD为通道0,硬件配置启动方式是正确的,我是怕内存方面有问题,BL0进行设备的一些初.....
我的日志里面有我的QQ群,你加群吧,首先你需要确定问题,为什么会消失,你说你的硬件和开发板一样,用的也是一个SD卡,这个你一定要确定,是不是针对完全一样,如果真的完全一样,哪就有可能是你的硬件出问题了,建议你多做几套都试一下,如果有的行就有可能是焊接问题,如果都不行,就有可能是你的硬件问题,可能是哪里没弄好,其实确定问题很简单,你在BL1段加入一些串口打印信息,看有没有输出,借此来确定问题是出现在BL0还是BL1,如果没有输出,不过你要确定是在BL1啊,就是需要在你的汇编阶段打印信息,用汇编语言。你试一下吧,不行你就加群吧,我晚上会上QQ。

2011-08-31 09:20:33

wangshumao1234: /**
  * This Function copies SD/MMC Card Data to memory.
  * Always use EPLL source clock.
* @param channel : HSMMC Controller channel number ( No.....
我的硬件完全是由开发板来的,所以boot应该是通用的,GPN(15-13)都为0,选择SD为通道0,硬件配置启动方式是正确的,我是怕内存方面有问题,BL0进行设备的一些初始化,BL0开始copy BL1到STEPING STONE中,验证BL1,然后跳到BL1,会不会从SD卡读取的数据不能将这些初始化,串口是没有输出的,能否给个QQ号请教下!

wangshumao12342011-08-30 16:56:18

匿名: 我看了楼主的文章,我现在遇到一个问题,从SD卡启动,量DATA0-4从示波器里可以看到一段波形,然后就消失了,我试着量了正常启动动的DATA引脚,从示波器里也可以.....
/**
  * This Function copies SD/MMC Card Data to memory.
  * Always use EPLL source clock.
* @param channel : HSMMC Controller channel number ( Not support. Depend on GPN15, GPN14 and GPN13 )
  * @param StartBlkAddress : Source card(SD/MMC) Address.(It must block address.)
  

2011-08-30 15:48:03

我看了楼主的文章,我现在遇到一个问题,从SD卡启动,量DATA0-4从示波器里可以看到一段波形,然后就消失了,我试着量了正常启动动的DATA引脚,从示波器里也可以看见一段波形,然后又有一段波形。为什么我的板子只有一段波形就消失了呢!