硬件: 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卡的总扇区数
那么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卡中导出:
将生成的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卡的相应位置上,看是否能够正常启动,如果能启动,说明位置找对了.
经验证正常启动
结论: 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
发现一个问题:
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卡,测试了一下
uboot不作任何修改,并将生成的uboot.bin写到SD卡中
OK,正常启动,就是说这个u-boot.bin既支持SD卡又支持SDHC卡。
个人私下里猜测:三星的irom内部对SDHC卡偷偷的减了1024个扇区,就是为了u-boot能够支持多种卡,真是太替人着想了。
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
那么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
将生成的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
- #!/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
个人私下里猜测:三星的irom内部对SDHC卡偷偷的减了1024个扇区,就是为了u-boot能够支持多种卡,真是太替人着想了。
【参考文章】
1. 使uboot支持S3C6410的SD启动
2.s3c6410开发板研究笔记(一)从SD卡启动UBOOT
3. S3C6410开发全记录(一)《还原SD卡启动的真相》