首页 > 代码库 > 6410开发板sd卡启动时烧写u-boot.bin以及u-boot-spl-16k.bin步骤

6410开发板sd卡启动时烧写u-boot.bin以及u-boot-spl-16k.bin步骤

参考文档:《SMDK6410_IROM_APPLICATION NOTE_REV 1.00》(可以从这里下载到》

参考博客:Tekkaman的博文《u-boot-2010.09 for mini6410 (add MMC support)

                  《Tiny6410_SMDK从SD卡直接启动裸板代码

                 《使uboot支持S3C6410的SD启动

                 《S3C6410开发全纪录(一)《还原SD卡启动的真相》

 

 sd卡启动布局方式(假定一个扇区是512个字节):

File System Kernel BL2 BL1(16个扇区) Signature(1个扇区) Reserved(1个或者1025个扇区)

我的配置文件中关于mmc相关定义:

/* **************************************************************** *
 * mmc spl config
 * **************************************************************** */
#define CONFIG_S3C64X0_MMC        1
#define CONFIG_CMD_MMC
//#define CONFIG_ENV_IS_IN_MMC        1
#define CONFIG_SYS_MMC_ENV_DEV        0
#define CONFIG_SYS_MMC_U_BOOT_SIZE    (512 *1024)
#define CONFIG_SYS_MMC_U_BOOT_OFFS    (4 * 1024)
#define MMC_BOOT_CHANNEL        0
#define MMC_INIT_REQUIRED        0
#define CONFIG_GENERIC_MMC    

#define TCM_BASE        (0x0C004000)

/* movinand definitions */
#define MMC_BLKSIZE        (512)

#define MMC_SIGNATURE_SIZE    (512)
#define MMC_RESERVED_SIZE     (512)
#define MMC_TOTAL_BL12        (400 * 1024 + 8 * 1024)
#define MMC_TOTAL_UNUSE        (MMC_SIGNATURE_SIZE + MMC_RESERVED_SIZE)

#define MMC_TOTAL_BLKCNT    (*((volatile unsigned int*)(TCM_BASE - 0x4)))
#define MMC_HIGH_CAPACITY    (*((volatile unsigned int*)(TCM_BASE - 0x8)))

#define MMC_UBOOT_POS_BACKWARD            (0x300000)
#define MMC_ENV_POS_BACKWARD            (0x280000)
#define MMC_BACKGROUND_POS_BACKWARD        (0x260000)

#define MMC_UBOOT_POS        (MMC_TOTAL_BLKCNT - MMC_TOTAL_BL12/MMC_BLKSIZE - MMC_TOTAL_UNUSE/MMC_BLKSIZE)

//#define MMC_UBOOT_POS        (MMC_TOTAL_BLKCNT - (MMC_UBOOT_POS_BACKWARD/MMC_BLKSIZE))
#define MMC_ENV_POS        (MMC_TOTAL_BLKCNT - (MMC_ENV_POS_BACKWARD/MMC_BLKSIZE))

#define MMC_UBOOT_BLKCNT    (400 * 1024/ MMC_BLKSIZE)
#define MMC_ENV_BLKCNT        (CONFIG_ENV_SIZE / MMC_BLKSIZE)
//#define CONFIG_MMC_ENV_DST    (CONFIG_SYS_UBOOT_BASE + CONFIG_SYS_UBOOT_SIZE)

#define CONFIG_SYS_MMC_U_BOOT_DST    CONFIG_SYS_PHY_UBOOT_BASE    /* NUB load-addr      */
#define CONFIG_SYS_MMC_U_BOOT_START    CONFIG_SYS_MMC_U_BOOT_DST    /* NUB start-addr     */

#define CONFIG_MOVINAND

u-boot代码占据400个1024字节,即800个扇区。

 

如果使用1G的sd卡,那么最后的RESERVED只需要一个扇区就够了,而2G及以上的SD卡则需要多用1024个扇区。

将1G容量sd卡放入到读卡器中插入到pc的usb接口,然后使用下面命令查看信息:

host@debian:~$ sudo fdisk  -l /dev/sdb

Disk /dev/sdb: 1015 MB, 1015808000 bytes
158 heads, 36 sectors/track, 348 cylinders, total 1984000 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x000d8a6f

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1            2048     1953791      975872    b  W95 FAT32

其中最关键的就是扇区数目,我的sd卡扇区数目为1984000个扇区。

而BL1中存放u-boot-spl-16k.bin,其起始位置应该是1984000-18=1983982个扇区(18=16+1+1,16个扇区BL1,1个扇区signature,1个扇区Reserved)。

BL2中存放u-boot.bin,其起始位置应该是1983982-800=1983182个扇区(前面的配置文件中uboot偏移位置是800个扇区)。

 

另外有个4G容量sd卡,将其装入读卡器插入usb口,然后查看信息:

host@debian:~$ sudo fdisk  -l /dev/sdc

Disk /dev/sdc: 3934 MB, 3934257152 bytes
114 heads, 49 sectors/track, 1375 cylinders, total 7684096 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000

   Device Boot      Start         End      Blocks   Id  System
/dev/sdc1            8192     7684095     3837952    b  W95 FAT32

其中扇区数目为7684096。而IROM能识别的扇区数目是7684096-1024=7683072个扇区。

BL1中u-boot-spl-16k.bin起始位置是7683072-18=7683054

BL2中u-boot.bin存放起始位置是7683054-800=7682254

 

还有个容量为4g的sd卡,将其装入读卡器插入usb口,查看信息:

host@debian:~$ sudo fdisk  -l /dev/sdb
[sudo] password for host: 

Disk /dev/sdb: 3965 MB, 3965190144 bytes
49 heads, 48 sectors/track, 3292 cylinders, total 7744512 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1            8192     7744511     3868160    b  W95 FAT32

总扇区数目是7744512个扇区,而IROM能识别的扇区数目是7744512-1024=7743488个扇区。

BL1中u-boot-spl-16k.bin起始位置是7743488-18=7743470

BL2中u-boot.bin存放起始位置是7743470-800=7742670

 

我制作了一个脚本(名为create_sd.sh)来自动完成烧写,内容如下:

 

#!/bin/bash
#  sd卡最后部分内容布局(假定一个扇区大小为512个字节):
# =-=================================================================================================================
#   BL2(u-boot.bin)   BL1(u-boot-spl-16k.bin,16个扇区) Signature(1个扇区) Reserved(1个或者1025个扇区,跟sd卡大小相关)
# =================================================================================================================== 
# 其中,Reserved扇区在SD卡小于等于1G时为1个字节,在4G及以上情况下为1025个字节)(我仅仅测试了1G和4G容量sd卡,其他大小未测试)
#
# 使用当前脚本时需要注意需要配置SD_DEV,SD_IS_1G,UBOOT_SECTORS,UBOOT_ROOT这几个变量的值

SD_DEV=/dev/sdb   #sd卡分区名称
SD_IS_1G=n        #sd卡是否1G(只能是y或者n)
UBOOT_SECTORS=800 #uboot所占大小,通常在开发板配置文件(请查看CONFIG_SYS_MMC_U_BOOT_SIZE的配置,转换成扇区数)
UBOOT_ROOT=.      #uboot根目录路径

TOTAL_SECTORS=`sudo fdisk -l $SD_DEV | grep total.*sectors | tr -d [:lower:][:upper:][:punct:]| awk {print $4}`
case $SD_IS_1G in 
    "n") IROM_SECTORS=`expr $TOTAL_SECTORS - 1024` ;; #如果sd卡大于1G,那么IROM能识别的扇区数需要减去1024. 
    "y") IROM_SECTORS=$TOTAL_SECTORS ;; #如果sd卡小于等于1G,那么IROM能识别的扇区数等于sd卡的扇区数目
     *) IROM_SECTORS=$TOTAL_SECTORS ;; #如果sd卡小于等于1G,那么IROM能识别的扇区数等于sd卡的扇区数目
esac
LAST1M_OFF=`expr $TOTAL_SECTORS - 2000` #最后1M字节开始地址
SPL_START=`expr $IROM_SECTORS - 18`  #u-boot-spl-16k.bin文件的开始地址
UBOOT_START=`expr $SPL_START - $UBOOT_SECTORS` #u-boot.bin文件的开始地址
#echo $TOTAL_SECTORS  $IROM_SECTORS $LAST1M_OFF $SPL_START $UBOOT_START

sudo dd if=/dev/zero of=$SD_DEV bs=512 seek=$LAST1M_OFF count=2000
sudo dd if=$UBOOT_ROOT/mmc_spl/u-boot-spl-16k.bin of=$SD_DEV bs=512 seek=$SPL_START conv=fdatasync
sudo dd if=$UBOOT_ROOT/u-boot.bin of=$SD_DEV bs=512 seek=$UBOOT_START conv=fdatasync

 

在使用该脚本前需要先编译uboot,生成u-boot.bin和u-boot-spl-16k.bin,然后再用该脚本将这两个文件烧写到sd卡即可。

由于1G的sd卡磁条有些问题(导致sd卡在pc中是只读的),我测试了4G和8G的sd卡,烧写后都能从sd卡启动uboot。