Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4250484
  • 博文数量: 241
  • 博客积分: 15936
  • 博客等级: 上将
  • 技术积分: 25293
  • 用 户 组: 普通用户
  • 注册时间: 2007-03-27 11:22
个人简介

Fedora-ARM

文章分类
文章存档

2016年(3)

2014年(1)

2013年(3)

2012年(50)

2011年(61)

2010年(26)

2009年(27)

2008年(21)

2007年(49)

分类: LINUX

2010-11-14 20:56:41

已经移植最新的2010.12,此版本停止开发
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存放位置,并对上面的配置作适当关闭和打开。

源码已经上传:

 为了部分无法下载git源码的朋友,上传了补丁(请先打上basic补丁LCD补丁):
文件: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
下载:下载

阅读(11207) | 评论(5) | 转发(8) |
给主人留下些什么吧!~~

wangshumao12342011-09-29 11:46:30

如果那两个参数不修改,提示是
MMC:   SAMSUNG SD/MMC: Host controler CH0
Card did not respond to voltage select!                                         
MMC init failed

wangshumao12342011-09-29 11:14:37

您好,我使用了您的UBOOT用于一个6410的板子,可是我的mmc的通道是1,我开始只修改了MMC_BOOT_CHANNEL为1,可是后来我发现好像ENV需要另外指定通道,因为总是出现说检测不到mmc卡,比如
MMC:   SAMSUNG SD/MMC: Host controler CH0                                       
MMC Host control CH1 not found                              

cgha2011-01-24 09:28:29

另外,我把这个编译好的u-boot.bin烧录到友坚开发板上,串口一点反应没有。
我对照了一下硬件,跟mini6410基本差不多的,128M MDDR,256M NAND,串口1等。

cgha2011-01-22 16:00:21

请问该如何做一个能从sd卡烧录镜像的uboot,如果我的板子没有串口,是否可以使用这种方式来自升级,就好象手机中的升级镜像一样???我看友善之臂有个什么superboot,它的原理是咋样的?