linux命令行改写时钟飞思卡尔,飞思卡尔linux-emmc 实现memery map的不同 及emmc read/write的不同...

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

你可能感兴趣的:(linux命令行改写时钟飞思卡尔,飞思卡尔linux-emmc 实现memery map的不同 及emmc read/write的不同...)