硬件: OK6410 + SDHC (8G)
TQ2440有两块flash,nor_flash与nand_flash,当需要烧写uboot的时候,只需要把开关切到nor_flash启动,在
nor_flash的uboot中就可以烧写uboot到nand_flash,非常方便。但是现在的6410没有nor_flash,每次烧写
nand_flash中的uboot的时候非常麻烦,那有没有一种方法使SD卡提供以前nor_flash的功能呢?
一、确定SD_Writer.exe写SD卡的位置
1.1 思路
利用6410提供了SD_Writer.exe工具将mmc_ram256.bin烧到SD卡中是可以直接从SD卡启动的,然后从SD卡中导出数据分析BL1与BL2的具体位置.
图出自
从上图可以看出:
SDHC卡的 BL1是在:Total_sector-Reserved-sigature-BL1=倒数第1042个扇区中
SDHC卡的 BL1是在:Total_sector-Reserved-sigature-BL1-BL2=倒数第1042+BL2个扇区中
1.2 确定SDHC卡的总扇区数
-
sun@ubuntu:/work/6410/uboot1.1.6$ sudo fdisk -l /dev/sdb
-
Disk /dev/sdb: 7948 MB, 7948206080 bytes
-
240 heads, 32 sectors/track, 2021 cylinders, total 15523840 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: 0x9139e7a9
-
-
Device Boot Start End Blocks Id System
-
/dev/sdb1 2048 15523839 7760896 b W95 FAT32
那么BL1=Total_sector-Reserved-sigature-BL1=15523840-1042=15522798
那么BL2=Total_sector-Reserved-sigature-BL1-BL2=倒数第1042+512=1554个扇区中(这儿不能确定BL2是多大,初步定为256K)=15523840-1554=15522286
将数据从SDHC卡中导出:
-
total_sectors=15523840
-
将bl1写到sd卡15523840-1042=15522798,大小为8K
-
sudo dd if=./bl1.bin of=/dev/sdb seek=15522798 bs=512 count=16
-
将bl2写到sd卡15523840-1554=15522286, 大小为512
-
sudo dd if=./bl2.bin of=/dev/sdb seek=15522286 bs=512 count=512
将生成的bl1.bin与mmc_ram256.bin相比较发现,的确是前8K
将生成的bl2.bin与mmc_ram256.bin相比较发现不正确,好像是少了点什么.
经过多次试验发现,少了32个sector, 这个在u-boot中定义为MOVI_ENV_BLKCNT
1.3 确认BL1与BL2的位置
将SDHC卡的BL1与BL2清除,然后从mmc_ram256.bin中分割出BL1.bin与BL2.bin,最后烧到SDHC卡的相应位置上,看是否能够正常启动,如果能启动,说明位置找对了.
-
a. 清除sd卡的bl1 bl2
-
sudo dd if=/dev/zero of=/dev/sdb seek=15522254 bs=512 count=544
-
b. 查看bl2与bl1(544+16=560)
-
sudo dd if=/dev/sdb of=bl.bin skip=15522254 bs=512 count=560
-
c. 将mmc_ram256.bin分割为bl1 bl2
-
分出BL1: sudo dd if=mmc_ram256.bin of=bl1.bin skip=544 bs=512 count=16
-
分出BL2: sudo dd if=mmc_ram256.bin of=bl2.bin bs=512 count=544
-
d. 将分出的BL1与BL2烧到相应的位置上
-
将bl1写到sd卡15523840-1042=15522798,大小为8K
sudo dd if=./bl1.bin of=/dev/sdb seek=15522798 bs=512 count=16
将bl2写到sd卡15523840-1586=15522254, 大小为256+16k=544 (1586=1042+512+32)
sudo dd if=./bl2.bin of=/dev/sdb seek=15522254 bs=512 count=544
经验证正常启动
结论: SDHC中BL1的位置是TOTAL_SECTOR-1042
SDHC中BL2的位置是TOTAL_SECTOR-1042-BL2_Sector-ENV_sector=TOTAL_SECTOR-1586
二、烧写uboot到SD卡
make forlinx_sd_ram256_config
make
生成u-boot.bin
-
a. 将u-boot.bin分割成bl1与bl2
-
分出BL1: sudo dd if=u-boot.bin of=bl1.bin bs=512 count=16
-
分出BL2: 就是u-boot.bin
-
b. 将分割好后的bl1 bl2写到sd卡中
-
写bl1: sudo dd if=./bl1.bin of=/dev/sdb seek=15522798 bs=512 count=16
-
写bl2: sudo dd if=./u-boot.bin of=/dev/sdb seek=15522254 bs=512 count=544
-
注:上述命令中 /dev/sdb在不同机子可能不一样
发现一个问题:
OK6410 给的uboot虽然可以支持SDHC卡启动的,但是uboot中拷贝BL2的部分却有一点想不明白:
start.S --> movi_bl2_copy --> CopyMovitoMem(HSMMC_CHANNEL,
MOVI_BL2_POS, MOVI_BL2_BLKCNT+MOVI_ENV_BLKCNT, (uint *)BL2_BASE,
MOVI_INIT_REQUIRED);
中的 MOVI_BL2_POS
按照上图来说是: MOVI_BL2_POS=total_sector_fdisk -BL2-ENV-BL1-1026
而uboot中却是:
MOVI_BL2_POS=total_sector_uboot -BL2-ENV-BL1-(eFUSE_SIZE / MOVI_BLKSIZE)=MOVI_BL2_POS=total_sector -BL2-ENV-BL1-2
这两个都能得到正确的BL2的位置,因为在UBOOT中total_sector_uboot 比 total_sector_fdisk少了1024个.
不知道为什么total_sector_uboot比total_sector_fdisk少1024个?
三、补充2G
最近找了一张2G的SD卡,测试了一下
-
卡的信息如下:
-
SD 2.0 / Manufacturer: 0x03,OEM: "SD/SD02G",REV: 8.0,S/N: 1889267482,DATE: 2009/6 MMC/SD size: 1886 MiB
-
fdisk中查看到的sector: total 3862528 sectors
-
打印MOVI_TOTAL_BLKCNT是: 3AF000=3862528
uboot不作任何修改,并将生成的uboot.bin写到SD卡中
-
#!/bin/sh
-
sudo dd if=u-boot.bin of=bl1.bin bs=512 count=16
-
sudo dd if=./bl1.bin of=/dev/sdb seek=3862510 bs=512 count=16
-
sudo dd if=./u-boot.bin of=/dev/sdb seek=3861966 bs=512 count=544
-
sync
-
-
#total=3862528
-
#BL1=total-reserv-BL1=3862528-2-16=3862510
-
#BL2=total-reserv-BL1-ENV-BL2=3862528-2-16-32-256*2=3861966
OK,正常启动,就是说这个u-boot.bin既支持SD卡又支持SDHC卡。
个人私下里猜测:三星的irom内部对SDHC卡偷偷的减了1024个扇区,就是为了u-boot能够支持多种卡,真是太替人着想了。
【参考文章】
1. 使uboot支持S3C6410的SD启动
2.s3c6410开发板研究笔记(一)从SD卡启动UBOOT
3. S3C6410开发全记录(一)《还原SD卡启动的真相》
阅读(1290) | 评论(0) | 转发(0) |