1.不同点:
The MMC/SD/SATA 作为存储介质与NAND and NOR flash不同,NAND and NOR flash一般会在bsp代码里详细写明uboot uimage rootfs param各自地址
如:mini2440:
static struct mtd_partition friendly_arm_default_nand_part[] = {
[0] = {
.name = "supervivi",//;这里是 bootloader 所在的分区,可以放置 u-boot, supervivi 等内容,对应/dev/mtdblock0
.size = 0x00040000,
.offset = 0,
},
[1] = {
.name = "param",//;这里是 supervivi 的参数区,其实也属于 bootloader 的一部分,如果 u-boot 比较大,可以把此区域覆盖掉,不会影响系统启动,对应/dev/mtdblock1
.offset = 0x00040000,
.size = 0x00020000,
},
[2] = {
.name = "Kernel",//;内核所在的分区,大小为 5M,足够放下大部分自己定制的巨型内核了,比如内核使用了更大的 Linux Logo 图片等,对应/dev/mtdblock2
.offset = 0x00060000,
.size = 0x00500000,
},
[3] = {
.name = "root",//;文件系统分区,友善之臂主要用来存放 yaffs2 文件系统内容,对应/dev/mtdblock3
.offset = 0x00560000,
.size = 1024 * 1024 * 1024,
},
[4] = {
.name = "nand",//此区域代表了整片的 nand flash,主要是预留使用,比如以后可以通过应用程序访问读取/dev/mtdblock4 就能实现备份整片 nand flash 了。
.offset = 0x00000000,
.size = 1024 * 1024 * 1024,
}
};而MMC/SD/SATA 为了作为rootfs存储则第一个扇区必须保留作为MBR(每次启动mbr都要查找分区表 决定哪个区用来启动),uboot必须在MBR后面
kernel与rootfs可以存储在uboot后面任意地址。
MBR可以用fdisk命令创建分区时来生成。
MMC/SD/SATA 各uboot rootfs kernel dbt存储分布主要通过uboot引导参数实现
2.uboot引导参数:
setenv loadaddr 10009000
setenv fdt_addr 0x18000000
setenv fdt_high 0xffffffff
setenv bootargs_base 'setenv bootargs console=ttymxc0,115200'
setenv bootcmd_mmc 'run bootargs_base bootargs_mmc;mmc dev 2;mmc read ${loadaddr} 0x800 0x3000;mmc read ${fdt_addr} 0x600 0x100;bootm ${loadaddr} - ${fdt_addr}'
setenv bootargs_mmc 'setenv bootargs ${bootargs} root=/dev/mmcblk0p1 rootwait rw video=mxcfb0,CLAA-WVGA ip=none'
setenv bootcmd 'run bootcmd_mmc'
saveenv
run bootcmd
3.mftools烧录脚本:
write U-Boot to sd card-->
write kernel image to sd card
write DTB to sd card
Formatting rootfs partition
Sending and writting rootfs
-->
4.imx6 镜像存储分布:
5.U-BOOT emmc读写命令格式:
mmc dev 2 (设置2为当前设备)
mmc read用来读取mmc内容到内存,
mmc write用来写入内存内容到mmc中
具体用法,
mmc read addr blk# cnt [partition]
mmc write addr blk# cnt [partition]
mmc list
device num是mmc的设备号,可以通过mmc list查询
addr是内存地址
blk# 是mmc内的块号
cnt 块数目
使用范例:
mmc write 2 0x90000000 0x600 0x10
把内存0x90000000开始,长度为16x512大小的数据,写入到第2个mmc设备块偏移位置为0x600处
mmc read 2 0x90000000 0x600 0x10
把第二个mmc设备块偏移为0x600处开始,长度为16x512大小的数据,读出到内存0x90000000处
mmc命令的帮助信息如下:
U-Boot> mmc
mmc - MMC sub system
Usage:
mmc read addr blk# cnt
mmc write addr blk# cnt
mmc erase blk# cnt
mmc rescan
mmc part - lists available partition on current mmc device
mmc dev [dev] [part] - show or set current mmc device [partition]
mmc list - lists available devices
当系统启动后,系统会将mci0设置为当前设备。使用mmcinfo就可以看到插入到mmc controller 0的sdcard信息。
U-Boot> mmcinfo
Device: mci
Manufacturer ID: 3
OEM: 5344
Name: SD04G
Tran Speed: 25000000
Rd Block Len: 512
SD version 2.0
High Capacity: Yes
Capacity: 3.8 GiB
Bus Width: 4-bit
如果SoC支持多个mmc controller并且使能,使用mmc list来查看使能了几个, 可以通过mmc dev来查看当前是那个设备,或者通过mmc dev 来切换。
像我的系统支持两个mmc controller.
U-Boot> mmc list (显示有几个mmc controller)
mci 0
mci 1
U-Boot> mmc dev (显示当前是那个device)
mmc1 is current device
U-Boot> mmc dev 0 (设置0为当前设备)
mmc0 is current device
如果,换sdcard,则使用mmc rescan来重新获取sdcard信息
U-Boot> mmc rescan (重新scan当前设备)
mci: setting clock 257812 Hz, block size 512
mci: setting clock 22000000 Hz, block size 512
mci: setting clock 257812 Hz, block size 512
gen_atmel_mci: CMDR 00001048 ( 8) ARGR 000001aa (SR: 0c100025) Command Failed
mci: setting clock 257812 Hz, block size 512
mci: setting clock 22000000 Hz, block size 512
U-Boot> mmcinfo (列出当前设备的信息)
Device: mci
Manufacturer ID: 1
OEM: 5041
Name: SK512
Tran Speed: 25000000
Rd Block Len: 512
SD version 1.10
High Capacity: No
Capacity: 472.5 MiB
Bus Width: 4-bit