uboot1.1.6移植SDHC驱动、Fat支持

1、原始的uboot1.1.6只支持mmc不支持SDHC!

cpu/s3c64xx/hs_mmc.c 此驱动文件比较旧,不支持SDHC卡和SD2.0协议,SD/MMC(2G或以下)可以;

需要修改初始化函数hsmmc_init(),

SD2.0初始化卡顺序

SD rest CMD0 -> SD_SEND_IF_COND CMD8 -> 选中SD ...    具体参考移植好的代码,

更详细可以搜索SD2.0协议

SDMA也有问题,它是大块一次读完,我测试当文件大于16M时,读取的数据就不正确了。需要修改movi_read()函数,

改成每次按512Byte字节读,直到把block num读完为止,为什么要这样,我仔细看过datasheet,

原本程序应该也是没有问题,估计三星的SDMA没有做好或有BUG,网上也可以搜到,但不多。

2、用hs_mmc.c替换cpu/s3c64xx/hs_mmc.c 

在Y:\urbetter-u-boot-1.1.6-v1.0\include添加linux-mmc-protocol.h和glamo-mmc.h!

在Y:\urbetter-u-boot-1.1.6-v1.0\include\asm\arch下添加:mmc.h


驱动下载地址:http://download.csdn.net/detail/longtian635241/5974279

重新编译即支持SDHC了!

3、支持大于2G的SDHC卡!

SD启动的bin文件会被分成BL1,BL2两块,移植好的uboot目录下有mkmovi脚本工具可以生成u-boot-movi.bin可供SD_Write.exe烧录;

也可以使用三星提供的IROM_Fusing_Tool工具(网上可以下载到源码,可以自己修改)烧录;

uboot的bl1和bl2的分布在Y:\urbetter-u-boot-1.1.6-v1.0\include的movi.h中定义!如果使用飞凌的SD_Write.exe的修改为:

#define PART_UBOOT_OFFSET 0x0
#define PART_ZIMAGE_OFFSET 0x40000
#define PART_ROOTFS_OFFSET 0x200000
#define PART_EXTRA_OFFSET 0x3200000

//#define MOVI_BL2_BLKCNT (PART_SIZE_BL / MOVI_BLKSIZE)
//#define MOVI_ZIMAGE_BLKCNT (PART_SIZE_KERNEL / MOVI_BLKSIZE)


#define MOVI_BL2_BLKCNT (((PART_ZIMAGE_OFFSET - PART_UBOOT_OFFSET) / MOVI_BLKSIZE) - MOVI_ENV_BLKCNT)
#define MOVI_ZIMAGE_BLKCNT ((PART_ROOTFS_OFFSET - PART_ZIMAGE_OFFSET) / MOVI_BLKSIZE)


如果没有工具也可以使用WinHex工具直接写SD卡,注意SD ,SDHC写入的偏移不一样,都是写在SD尾部,

卡的块大小可通过IROM code 全局变量globalBlockSizeHide得到,

具体看三星IROM boot文档,这些uboot代码已经写好了;

到此,sd uboot 应该可以跑起来了

3、支持FAT命令!

在smdk6410.h中添加

#define CONFIG_COMMANDS \
(CONFIG_CMD_DFL| \
CFG_CMD_CACHE | \
CFG_CMD_USB | \
CFG_CMD_REGINFO| \
CFG_CMD_LOADS | \
CFG_CMD_LOADB | \
CFG_CMD_ENV | \
CFG_CMD_NAND | \
CFG_CMD_MOVINAND| \
CFG_CMD_ONENAND| \
CFG_CMD_DATE | \
CFG_CMD_PING | \
CFG_CMD_FAT| \
CFG_CMD_ELF) \
& ~(CFG_CMD_AUTOSCRIPT| \
CFG_CMD_BOOTD | \
CFG_CMD_IMI | \
CFG_CMD_RUN | \
CFG_CMD_CONSOLE| \
CFG_CMD_DOCG3P3 | \
CFG_CMD_EEPROM | \
CFG_CMD_I2C | \
0)

其次添加:

#define    CONFIG_MMC 1        //fs/fat/fat.c中有用到!

你可能感兴趣的:(uboot)