u-boot-2010.09 for mini6410 (add MMC support)
在完成了LCD 控制器驱动之后,我决定搞定6410的MMC启动这一块,经过了我一个星期业余时间的努力,终于搞定了。这个的补丁包括
1、6410从SD/MMC启动
2、识别启动介质,自动跳转到Nandboot或者SD/MMC boot代码
3、进入uboot后的SD/MMC的读写,可以读取SD/MMC上的FAT32和EXT2文件系统中的文件。
4、支持在SD/MMC中存放ENV和LCD背景图片,自动读取背景文件。
注意:编译出的u-boot-nand.bin依然可以烧写到NAND中启动,因为是自动识别启动介质的。
注意配置文件中的
#define LCD_VIDEO_BACKGROUND_IN_NAND
#define CONFIG_ENV_IS_IN_NAND
#define LCD_VIDEO_BACKGROUND_IN_MMC
#define CONFIG_ENV_IS_IN_MMC
他们定义了背景图片和环境变量ENV的存放位置。
请确定你自己的背景图片和ENV存放位置,并对上面的配置作适当关闭和打开。
源码已经上传:
|
文件: | u-boot-2010.09_mini6410_tekkaman_mmcboot_mmc.patch.tar.bz2 |
大小: | 9KB |
下载: | 下载 |
|
对于三星针对6410的u-boot-1.6.1的MMC支持,代码不是现在uboot的MMC框架下的驱动,不具有移植性,所以这次我的MMC驱动是在现在uboot的MMC框架下的驱动,移植性好。
而这个驱动是基本复制了s5p芯片的驱动,因为这两个芯片的MMC模块是一样的,寄存器一模一样。我修复的一下其中的BUG,并在MMC上层代码中添加了SD卡的探测支持。
现在对这个补丁的一些设置进行解释:
关于SD/MMC的启动原理,请参考网上可以下载到的一份:《SMDK6410_IROM_APPLICATION NOTE_REV 1.00》的PDF文件(请在看下面的内容前阅读完),是三星的一份文档。看完了这份文档,你会对于6410的IROM启动有比较完全的了解。
在这份文档和网上的一份《使uboot支持S3C6410的SD启动》以及自己导出的可以启动的SD卡中的镜像,基本可以确定如何烧写编译好的镜像到SD卡:
现对于我的配置文件中:
#define MMC_UBOOT_POS_BACKWARD (0x300000)
#define MMC_ENV_POS_BACKWARD (0x280000)
#define MMC_BACKGROUND_POS_BACKWARD (0x260000)
我将编译好的代码了目录中的nand_spl/u-boot-spl-16k.bin烧写到BL1区(第一级引导,代码自拷贝部分),
将源码根目录下的u-boot.bin烧写到BL2(SD卡末尾向前3MB的位置)(0x300000)
ENV的位置是在SD卡末尾向前2.5MB的位置(在BL2后0.5MB)(0x280000)
背景图片的位置在SD卡末尾向前0x260000的位置。
对于从普通2G以下SD卡和2G以上的SDHC启动的区别:
其实在这两中SD卡中启动uboot的源码无须作任何修改,只是在烧写的时候位置不同而已。
为什么有这个区别呢?我猜想可能是IROM的bug,IROM在获取SDHC的总块数的时候会缺少1024块,也就是说在调用IROM的Device Copy Function的时候,IROM根本就不知道有最后的1024块,但是如果你自己去初始化SD/MMC控制器后去获取SDHC的总块数的时候就不会缺少这1024块。
所以如果在BL1中使用IROM的Device Copy Function中的CopyMMCtoMem去拷贝SDHC中的代码,你烧写的位置必须无视最后的1024块。但是在自己的uboot代码中SDHC最后的1024块是存在的。
关于镜像的烧写方法,uboot必须烧写到SD卡的最后,所以可能会破坏你的数据,请你保证SD卡最后的10M左右没有任何数据。
现在我的烧写暂时是使用Linux下的dd命令来实现的,比如一个8G的SD卡在Linux下的用fdisk读出的信息是
tekkaman@MAGI-Linux:~$ sudo fdisk /dev/sdb
[sudo] password for tekkaman:
Command (m for help): p
Disk /dev/sdb: 7969 MB, 7969177600 bytes
246 heads, 62 sectors/track, 1020 cylinders
Units = cylinders of 15252 * 512 = 7809024 bytes
Disk identifier: 0x00000000
Device Boot Start End Blocks Id System
/dev/sdb1 * 1 6 45755+ b W95 FAT32
/dev/sdb2 * 7 1020 7732764 83 Linux
所以总块数是7969177600/512=15564800
IROM所认为的总块数15563776(15564800-1024)(仅在SDHC时需要减去1024)
所以nand_spl/u-boot-spl-16k.bin烧写的位置是15563758块(15563776-18)
u-boot.bin烧写的位置是15557632块(15563776-6144(3MB))(根据我的Uboot配置文件)
烧写命令:
sudo dd if='(Uboot源码)/nand_spl/u-boot-spl-16k.bin' of=/dev/(SD卡的设备节点) bs=512 seek=15563758
sudo dd if='/(Uboot源码)/u-boot.bin' of=/dev/(SD卡的设备节点) bs=512 seek=15557632
2010年11月16日 00:03 修复一个MMC 中存储ENV和背景图片数据位置的BUG
|
文件: | u-boot-2010.09_mini6410_tekkaman_mmcboot_mmc_1.patch.tar.bz2 |
大小: | 0KB |
下载: | 下载 |
|
阅读(228) | 评论(0) | 转发(0) |