嵌入式Linux--U-Boot(四)MMC命令使用

一、EMMC和SD卡操作命令

uboot 支持 EMMC 和 SD 卡,因此也要提供 EMMC 和 SD 卡的操作命令。一般认为 EMMC和 SD 卡是同一个东西,所以没有特殊说明,本教程统一使用 MMC 来代指 EMMC 和 SD 卡。uboot 中常用于操作 MMC 设备的命令为“mmc”。

mmc 是一系列的命令,其后可以跟不同的参数,输入“?mmc”即可查看 mmc 有关的命令,如下所示:


=> ? mmc
mmc - MMC sub system

Usage:
mmc info - display info of the current MMC device
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
mmc hwpartition [args...] - does hardware partitioning
  arguments (sizes in 512-byte blocks):
    [user [enh start cnt] [wrrel {on|off}]] - sets user data area attributes
    [gp1|gp2|gp3|gp4 cnt [enh] [wrrel {on|off}]] - general purpose partition
    [check|set|complete] - mode, complete set partitioning completed
  WARNING: Partitioning is a write-once setting once it is set to complete.
  Power cycling is required to initialize partitions after set to complete.
mmc bootbus dev boot_bus_width reset_boot_bus_width boot_mode
 - Set the BOOT_BUS_WIDTH field of the specified device
mmc bootpart-resize <dev> <boot part size MB> <RPMB part size MB>
 - Change sizes of boot and RPMB partitions of specified device
mmc partconf dev boot_ack boot_partition partition_access
 - Change the bits of the PARTITION_CONFIG field of the specified device
mmc rst-function dev value
 - Change the RST_n_FUNCTION field of the specified device
   WARNING: This is a write-once field and 0 / 1 / 2 are the only valid values.
mmc setdsr <value> - set DSR register value

从上面可以看出,mmc 后面跟不同的参数可以实现不同的功能。

命令描述
mmc info输出 MMC 设备信息
mmc read读取 MMC 中的数据。
mmc wirte向 MMC 设备写入数据。
mmc rescan扫描 MMC 设备。
mmc part列出 MMC 设备的分区。
mmc dev切换 MMC 设备。
mmc list列出当前有效的所有 MMC 设备。
mmc hwpartition设置 MMC 设备的分区。
mmc bootbus……设置指定 MMC 设备的 BOOT_BUS_WIDTH 域的值。
mmc bootpart……设置指定 MMC 设备的 boot 和 RPMB 分区的大小。
mmc partconf……设置指定 MMC 设备的 PARTITION_CONFG 域的值。
mmc rst复位 MMC 设备
mmc setdsr设置 DSR 寄存器的值

1、mmc info命令

 mmc info 命令用于输出当前选中的 mmc info 设备的信息,输入命令“mmc info”即可,如:

=> mmc info
Device: FSL_SDHC
Manufacturer ID: 15
OEM: 100
Name: 8GTF4
Tran Speed: 52000000
Rd Block Len: 512
MMC version 4.0
High Capacity: Yes
Capacity: 7.3 GiB
Bus Width: 8-bit
Erase Group Size: 512 KiB

 从上可以看出,当前选中的MMC设备是EMMC,版本为4.5,容量为3.7GB(EMMC为 4GB),速度为 52000000Hz=52MHz,8 位宽的总线。还有一个与 mmc info 命令相同功能的命令:mmcinfo,“mmc”和“info”之间没有空格。

2、mmc rescan命令

 mmc rescan 命令用于扫描当前开发板上所有的 MMC 设备,包括 EMMC 和 SD 卡,输入“mmc rescan”即可。

3、mmc list命令

 mmc list 命令用于来查看当前开发板一共有几个 MMC 设备,输入“mmc list”,结果如下:

=> mmc list
FSL_SDHC: 0
FSL_SDHC: 1 (eMMC)

 可以看出当前开发板有两个 MMC 设备:FSL_SDHC:0 和 FSL_SDHC:1 (eMMC),这是因为我现在用的是 EMMC 版本的核心板,加上 SD 卡一共有两个 MMC 设备,FSL_SDHC:0 是 SD卡,FSL_SDHC:1(eMMC)是 EMMC。

 默认会将 EMMC 设置为当前 MMC 设备,这就是为什么输入“mmc info”查询到的是 EMMC 设备信息,而不是 SD 卡。

 要想查看 SD 卡信息,就要使用命令“mmc dev”来将 SD 卡设置为当前的 MMC 设备。

4、mmc dev命令

mmc dev 命令用于切换当前 MMC 设备,命令格式如下:

mmc dev [dev] [part]
  • [dev]用来设置要切换的 MMC 设备号
  • [part]是分区号。

如果不写分区号的话默认为分区 0。使用如下命令切换到 SD 卡:

mmc dev 0  //切换到 SD 卡,0 为 SD 卡,1 为 eMMC
  • 0 :SD卡
  • 1:MMC设备

输入命令“mmc info”即可查看 SD 卡的信息:

=> mmc dev 1
switch to partitions #0, OK
mmc1(part 0) is current device
=> mmc info
Device: FSL_SDHC
Manufacturer ID: 15
OEM: 100
Name: 8GTF4
Tran Speed: 52000000
Rd Block Len: 512
MMC version 4.0
High Capacity: Yes
Capacity: 7.3 GiB
Bus Width: 8-bit
Erase Group Size: 512 KiB

从上面可以看出当前 MMC设备为 4.0 版本的,容量为 7.3GiB(8GB 的 EMMC),8 位宽的总线。

5、mmc part命令

 有时候 SD 卡或者 EMMC 会有多个分区,可以使用命令“mmc part”来查看其分区,比如查看 EMMC 的分区情况,输入如下命令:

mmc dev 1  //切换到 EMMC
mmc part //查看 EMMC 分区
=> mmc dev 1
switch to partitions #0, OK
mmc1(part 0) is current device
=> mmc part

Partition Map for MMC device 1  --   Partition Type: DOS

Part    Start Sector    Num Sectors     UUID            Type
  1     20480           262144          3092ce11-01     0c
  2     282624          14987264        3092ce11-02     83

从上面可以看出,此时 EMMC 有两个分区:

  • 扇区 20480 ~ 262144 为第一个分区
  • 扇区 282624~14987264 为第二个分区

 如果 EMMC 里面烧写了 Linux 系统的话,EMMC 是有3 个分区的:

  • 第 0 个分区存放 uboot
  • 第 1 个分区存放 Linux 镜像文件和设备树
  • 第 2 个分区存放根文件系统

 但是在上面只有两个分区,那是因为第 0 个分区没有格式化,所以识别不出来,实际上第 0 个分区是存在的。一个新的 SD 卡默认只有一个分区,那就是分区 0,所以前面讲解的 uboot 烧写到 SD 卡,其实就是将 u-boot.bin 烧写到了 SD 卡的分区 0 里面。后面学习 Linux 内核移植的时候再讲解怎么在 SD 卡中创建并格式化第二个分区,并将 Linux 镜像文件和设备树文件存放到第二个分区中。

如果要将 EMMC 的分区 2 设置为当前 MMC 设置,可以使用如下命令:

mmc dev 1 2

如下:

=> mmc dev 1 2
switch to partitions #2, OK
mmc1(part 2) is current device

6、mmc read命令

 mmc read 命令用于读取 mmc 设备的数据,命令格式如下:

mmc read addr blk# cnt

 addr 是数据读取到 DRAM 中的地址,blk 是要读取的块起始地址(十六进制),一个块是 512字节,这里的块和扇区是一个意思,在 MMC 设备中我们通常说扇区,cnt 是要读取的块数量(十六进制)。比如从 EMMC 的第 1536(0x600)个块开始,读取 16(0x10)个块的数据到 DRAM 的0X80800000 地址处,命令如下:

mmc dev 1 0 //切换到 MMC 分区 0
mmc read 80800000 600 10 //读取数据
=> mmc dev 1 0
switch to partitions #0, OK
mmc1(part 0) is current device
=> mmc read 80800000 600 10

MMC read: dev # 1, block # 1536, count 16 ... 16 blocks read: OK

 这里我们还看不出来读取是否正确,通过 md.b 命令查看 0x80800000 处的数据就行了,查看 16*512=8192(0x2000)个字节的数据,命令如下:

md.b 80800000 2000
=> md.b 80800000 2000
80800000: aa 47 28 f9 62 61 75 64 72 61 74 65 3d 31 31 35    .G(.baudrate=115
80800010: 32 30 30 00 62 6f 61 72 64 5f 6e 61 6d 65 3d 45    200.board_name=E
80800020: 56 4b 00 62 6f 61 72 64 5f 72 65 76 3d 31 34 58    VK.board_rev=14X
80800030: 31 34 00 62 6f 6f 74 5f 66 64 74 3d 74 72 79 00    14.boot_fdt=try.
80800040: 62 6f 6f 74 63 6d 64 3d 66 61 74 6c 6f 61 64 20    bootcmd=fatload
80800050: 6d 6d 63 20 31 3a 31 20 38 30 38 30 30 30 30 30    mmc 1:1 80800000
80800060: 20 7a 49 6d 61 67 65 3b 20 66 61 74 6c 6f 61 64     zImage; fatload
80800070: 20 6d 6d 63 20 31 3a 31 20 38 33 30 30 30 30 30     mmc 1:1 8300000
80800080: 30 20 69 6d 78 36 75 6c 6c 2d 31 34 78 31 34 2d    0 imx6ull-14x14-
80800090: 65 6d 6d 63 2d 34 2e 33 2d 38 30 30 78 34 38 30    emmc-4.3-800x480
808000a0: 2d 63 2e 64 74 62 3b 20 62 6f 6f 74 7a 20 38 30    -c.dtb; bootz 80
808000b0: 38 30 30 30 30 30 20 2d 20 38 33 30 30 30 30 30    800000 - 8300000
808000c0: 30 00 62 6f 6f 74 63 6d 64 5f 6d 66 67 3d 72 75    0.bootcmd_mfg=ru
808000d0: 6e 20 6d 66 67 74 6f 6f 6c 5f 61 72 67 73 3b 62    n mfgtool_args;b
808000e0: 6f 6f 74 7a 20 24 7b 6c 6f 61 64 61 64 64 72 7d    ootz ${loadaddr}
808000f0: 20 24 7b 69 6e 69 74 72 64 5f 61 64 64 72 7d 20     ${initrd_addr}
80800100: 24 7b 66 64 74 5f 61 64 64 72 7d 3b 00 62 6f 6f    ${fdt_addr};.boo
80800110: 74 64 65 6c 61 79 3d 34 00 62 6f 6f 74 73 63 72    tdelay=4.bootscr
80800120: 69 70 74 3d 65 63 68 6f 20 52 75 6e 6e 69 6e 67    ipt=echo Running
80800130: 20 62 6f 6f 74 73 63 72 69 70 74 20 66 72 6f 6d     bootscript from
80800140: 20 6d 6d 63 20 2e 2e 2e 3b 20 73 6f 75 72 63 65     mmc ...; source
80800150: 00 63 6f 6e 73 6f 6c 65 3d 74 74 79 6d 78 63 30    .console=ttymxc0
80800160: 00 65 74 68 61 63 74 3d 46 45 43 31 00 65 74 68    .ethact=FEC1.eth
80800170: 61 64 64 72 3d 64 65 3a 62 34 3a 37 63 3a 64 65    addr=de:b4:7c:de
80800180: 3a 64 63 3a 30 37 00 65 74 68 70 72 69 6d 65 3d    :dc:07.ethprime=
80800190: 46 45 43 00 66 64 74 5f 61 64 64 72 3d 30 78 38    FEC.fdt_addr=0x8
808001a0: 33 30 30 30 30 30 30 00 66 64 74 5f 66 69 6c 65    3000000.fdt_file
808001b0: 3d 69 6d 78 36 75 6c 6c 2d 31 34 78 31 34 2d 65    =imx6ull-14x14-e
808001c0: 6d 6d 63 2d 34 2e 33 2d 38 30 30 78 34 38 30 2d    mmc-4.3-800x480-
808001d0: 63 2e 64 74 62 00 66 64 74 5f 68 69 67 68 3d 30    c.dtb.fdt_high=0
808001e0: 78 66 66 66 66 66 66 66 66 00 66 69 6e 64 66 64    xffffffff.findfd
808001f0: 74 3d 69 66 20 74 65 73 74 20 24 66 64 74 5f 66    t=if test $fdt_f
80800200: 69 6c 65 20 3d 20 75 6e 64 65 66 69 6e 65 64 3b    ile = undefined;
80800210: 20 74 68 65 6e 20 69 66 20 74 65 73 74 20 24 62     then if test $b
80800220: 6f 61 72 64 5f 6e 61 6d 65 20 3d 20 45 56 4b 20    oard_name = EVK
80800230: 26 26 20 74 65 73 74 20 24 62 6f 61 72 64 5f 72    && test $board_r
80800240: 65 76 20 3d 20 39 58 39 3b 20 74 68 65 6e 20 73    ev = 9X9; then s
80800250: 65 74 65 6e 76 20 66 64 74 5f 66 69 6c 65 20 69    etenv fdt_file i
80800260: 6d 78 36 75 6c 6c 2d 39 78 39 2d 65 76 6b 2e 64    mx6ull-9x9-evk.d
80800270: 74 62 3b 20 66 69 3b 20 69 66 20 74 65 73 74 20    tb; fi; if test
80800280: 24 62 6f 61 72 64 5f 6e 61 6d 65 20 3d 20 45 56    $board_name = EV
80800290: 4b 20 26 26 20 74 65 73 74 20 24 62 6f 61 72 64    K && test $board
808002a0: 5f 72 65 76 20 3d 20 31 34 58 31 34 3b 20 74 68    _rev = 14X14; th
808002b0: 65 6e 20 73 65 74 65 6e 76 20 66 64 74 5f 66 69    en setenv fdt_fi
808002c0: 6c 65 20 69 6d 78 36 75 6c 6c 2d 31 34 78 31 34    le imx6ull-14x14
808002d0: 2d 65 76 6b 2e 64 74 62 3b 20 66 69 3b 20 69 66    -evk.dtb; fi; if
808002e0: 20 74 65 73 74 20 24 66 64 74 5f 66 69 6c 65 20     test $fdt_file
808002f0: 3d 20 75 6e 64 65 66 69 6e 65 64 3b 20 74 68 65    = undefined; the
80800300: 6e 20 65 63 68 6f 20 57 41 52 4e 49 4e 47 3a 20    n echo WARNING:
80800310: 43 6f 75 6c 64 20 6e 6f 74 20 64 65 74 65 72 6d    Could not determ
80800320: 69 6e 65 20 64 74 62 20 74 6f 20 75 73 65 3b 20    ine dtb to use;
80800330: 66 69 3b 20 66 69 3b 00 67 61 74 65 77 61 79 69    fi; fi;.gatewayi
80800340: 70 3d 31 39 32 2e 31 36 38 2e 30 2e 31 00 69 6d    p=192.168.0.1.im
80800350: 61 67 65 3d 7a 49 6d 61 67 65 00 69 6e 69 74 72    age=zImage.initr
80800360: 64 5f 61 64 64 72 3d 30 78 38 33 38 30 30 30 30    d_addr=0x8380000
80800370: 30 00 69 6e 69 74 72 64 5f 68 69 67 68 3d 30 78    0.initrd_high=0x
80800380: 66 66 66 66 66 66 66 66 00 69 70 5f 64 79 6e 3d    ffffffff.ip_dyn=
80800390: 79 65 73 00 69 70 61 64 64 72 3d 31 39 32 2e 31    yes.ipaddr=192.1
808003a0: 36 38 2e 30 2e 31 32 31 00 6c 6f 61 64 61 64 64    68.0.121.loadadd
808003b0: 72 3d 30 78 38 30 38 30 30 30 30 30 00 6c 6f 61    r=0x80800000.loa
808003c0: 64 62 6f 6f 74 73 63 72 69 70 74 3d 66 61 74 6c    dbootscript=fatl
808003d0: 6f 61 64 20 6d 6d 63 20 24 7b 6d 6d 63 64 65 76    oad mmc ${mmcdev
808003e0: 7d 3a 24 7b 6d 6d 63 70 61 72 74 7d 20 24 7b 6c    }:${mmcpart} ${l
808003f0: 6f 61 64 61 64 64 72 7d 20 24 7b 73 63 72 69 70    oadaddr} ${scrip
80800400: 74 7d 3b 00 6c 6f 61 64 66 64 74 3d 66 61 74 6c    t};.loadfdt=fatl
80800410: 6f 61 64 20 6d 6d 63 20 24 7b 6d 6d 63 64 65 76    oad mmc ${mmcdev
80800420: 7d 3a 24 7b 6d 6d 63 70 61 72 74 7d 20 24 7b 66    }:${mmcpart} ${f
80800430: 64 74 5f 61 64 64 72 7d 20 24 7b 66 64 74 5f 66    dt_addr} ${fdt_f
80800440: 69 6c 65 7d 00 6c 6f 61 64 69 6d 61 67 65 3d 66    ile}.loadimage=f
80800450: 61 74 6c 6f 61 64 20 6d 6d 63 20 24 7b 6d 6d 63    atload mmc ${mmc
80800460: 64 65 76 7d 3a 24 7b 6d 6d 63 70 61 72 74 7d 20    dev}:${mmcpart}
80800470: 24 7b 6c 6f 61 64 61 64 64 72 7d 20 24 7b 69 6d    ${loadaddr} ${im
80800480: 61 67 65 7d 00 6c 6f 67 6f 5f 66 69 6c 65 3d 61    age}.logo_file=a
80800490: 6c 69 65 6e 74 65 6b 2e 62 6d 70 00 6d 66 67 74    lientek.bmp.mfgt
808004a0: 6f 6f 6c 5f 61 72 67 73 3d 73 65 74 65 6e 76 20    ool_args=setenv
808004b0: 62 6f 6f 74 61 72 67 73 20 63 6f 6e 73 6f 6c 65    bootargs console
808004c0: 3d 24 7b 63 6f 6e 73 6f 6c 65 7d 2c 24 7b 62 61    =${console},${ba
808004d0: 75 64 72 61 74 65 7d 20 72 64 69 6e 69 74 3d 2f    udrate} rdinit=/
808004e0: 6c 69 6e 75 78 72 63 20 67 5f 6d 61 73 73 5f 73    linuxrc g_mass_s
808004f0: 74 6f 72 61 67 65 2e 73 74 61 6c 6c 3d 30 20 67    torage.stall=0 g
80800500: 5f 6d 61 73 73 5f 73 74 6f 72 61 67 65 2e 72 65    _mass_storage.re
80800510: 6d 6f 76 61 62 6c 65 3d 31 20 67 5f 6d 61 73 73    movable=1 g_mass
80800520: 5f 73 74 6f 72 61 67 65 2e 66 69 6c 65 3d 2f 66    _storage.file=/f
80800530: 61 74 20 67 5f 6d 61 73 73 5f 73 74 6f 72 61 67    at g_mass_storag
80800540: 65 2e 72 6f 3d 31 20 67 5f 6d 61 73 73 5f 73 74    e.ro=1 g_mass_st
80800550: 6f 72 61 67 65 2e 69 64 56 65 6e 64 6f 72 3d 30    orage.idVendor=0
80800560: 78 30 36 36 46 20 67 5f 6d 61 73 73 5f 73 74 6f    x066F g_mass_sto
80800570: 72 61 67 65 2e 69 64 50 72 6f 64 75 63 74 3d 30    rage.idProduct=0
80800580: 78 33 37 46 46 20 67 5f 6d 61 73 73 5f 73 74 6f    x37FF g_mass_sto
80800590: 72 61 67 65 2e 69 53 65 72 69 61 6c 4e 75 6d 62    rage.iSerialNumb
808005a0: 65 72 3d 22 22 20 63 6c 6b 5f 69 67 6e 6f 72 65    er="" clk_ignore
808005b0: 5f 75 6e 75 73 65 64 20 00 6d 6d 63 61 72 67 73    _unused .mmcargs
808005c0: 3d 73 65 74 65 6e 76 20 62 6f 6f 74 61 72 67 73    =setenv bootargs
808005d0: 20 63 6f 6e 73 6f 6c 65 3d 24 7b 63 6f 6e 73 6f     console=${conso
808005e0: 6c 65 7d 2c 24 7b 62 61 75 64 72 61 74 65 7d 20    le},${baudrate}
808005f0: 72 6f 6f 74 3d 24 7b 6d 6d 63 72 6f 6f 74 7d 00    root=${mmcroot}.
80800600: 6d 6d 63 61 75 74 6f 64 65 74 65 63 74 3d 79 65    mmcautodetect=ye
80800610: 73 00 6d 6d 63 62 6f 6f 74 3d 65 63 68 6f 20 42    s.mmcboot=echo B
80800620: 6f 6f 74 69 6e 67 20 66 72 6f 6d 20 6d 6d 63 20    ooting from mmc
80800630: 2e 2e 2e 3b 20 72 75 6e 20 6d 6d 63 61 72 67 73    ...; run mmcargs
80800640: 3b 20 69 66 20 74 65 73 74 20 24 7b 62 6f 6f 74    ; if test ${boot
80800650: 5f 66 64 74 7d 20 3d 20 79 65 73 20 7c 7c 20 74    _fdt} = yes || t
80800660: 65 73 74 20 24 7b 62 6f 6f 74 5f 66 64 74 7d 20    est ${boot_fdt}
80800670: 3d 20 74 72 79 3b 20 74 68 65 6e 20 69 66 20 72    = try; then if r
80800680: 75 6e 20 6c 6f 61 64 66 64 74 3b 20 74 68 65 6e    un loadfdt; then
80800690: 20 62 6f 6f 74 7a 20 24 7b 6c 6f 61 64 61 64 64     bootz ${loadadd
808006a0: 72 7d 20 2d 20 24 7b 66 64 74 5f 61 64 64 72 7d    r} - ${fdt_addr}
808006b0: 3b 20 65 6c 73 65 20 69 66 20 74 65 73 74 20 24    ; else if test $
808006c0: 7b 62 6f 6f 74 5f 66 64 74 7d 20 3d 20 74 72 79    {boot_fdt} = try
808006d0: 3b 20 74 68 65 6e 20 62 6f 6f 74 7a 3b 20 65 6c    ; then bootz; el
808006e0: 73 65 20 65 63 68 6f 20 57 41 52 4e 3a 20 43 61    se echo WARN: Ca
808006f0: 6e 6e 6f 74 20 6c 6f 61 64 20 74 68 65 20 44 54    nnot load the DT
80800700: 3b 20 66 69 3b 20 66 69 3b 20 65 6c 73 65 20 62    ; fi; fi; else b
80800710: 6f 6f 74 7a 3b 20 66 69 3b 00 6d 6d 63 64 65 76    ootz; fi;.mmcdev
80800720: 3d 31 00 6d 6d 63 70 61 72 74 3d 31 00 6d 6d 63    =1.mmcpart=1.mmc
80800730: 72 6f 6f 74 3d 2f 64 65 76 2f 6d 6d 63 62 6c 6b    root=/dev/mmcblk
80800740: 31 70 32 20 72 6f 6f 74 77 61 69 74 20 72 77 00    1p2 rootwait rw.
80800750: 6e 65 74 61 72 67 73 3d 73 65 74 65 6e 76 20 62    netargs=setenv b
80800760: 6f 6f 74 61 72 67 73 20 63 6f 6e 73 6f 6c 65 3d    ootargs console=
80800770: 24 7b 63 6f 6e 73 6f 6c 65 7d 2c 24 7b 62 61 75    ${console},${bau
80800780: 64 72 61 74 65 7d 20 72 6f 6f 74 3d 2f 64 65 76    drate} root=/dev
80800790: 2f 6e 66 73 20 69 70 3d 64 68 63 70 20 6e 66 73    /nfs ip=dhcp nfs
808007a0: 72 6f 6f 74 3d 24 7b 73 65 72 76 65 72 69 70 7d    root=${serverip}
808007b0: 3a 24 7b 6e 66 73 72 6f 6f 74 7d 2c 76 33 2c 74    :${nfsroot},v3,t
808007c0: 63 70 00 6e 65 74 62 6f 6f 74 3d 65 63 68 6f 20    cp.netboot=echo
808007d0: 42 6f 6f 74 69 6e 67 20 66 72 6f 6d 20 6e 65 74    Booting from net
808007e0: 20 2e 2e 2e 3b 20 72 75 6e 20 6e 65 74 61 72 67     ...; run netarg
808007f0: 73 3b 20 69 66 20 74 65 73 74 20 24 7b 69 70 5f    s; if test ${ip_
80800800: 64 79 6e 7d 20 3d 20 79 65 73 3b 20 74 68 65 6e    dyn} = yes; then
80800810: 20 73 65 74 65 6e 76 20 67 65 74 5f 63 6d 64 20     setenv get_cmd
80800820: 64 68 63 70 3b 20 65 6c 73 65 20 73 65 74 65 6e    dhcp; else seten
80800830: 76 20 67 65 74 5f 63 6d 64 20 74 66 74 70 3b 20    v get_cmd tftp;
80800840: 66 69 3b 20 24 7b 67 65 74 5f 63 6d 64 7d 20 24    fi; ${get_cmd} $
80800850: 7b 69 6d 61 67 65 7d 3b 20 69 66 20 74 65 73 74    {image}; if test
80800860: 20 24 7b 62 6f 6f 74 5f 66 64 74 7d 20 3d 20 79     ${boot_fdt} = y
80800870: 65 73 20 7c 7c 20 74 65 73 74 20 24 7b 62 6f 6f    es || test ${boo
80800880: 74 5f 66 64 74 7d 20 3d 20 74 72 79 3b 20 74 68    t_fdt} = try; th
80800890: 65 6e 20 69 66 20 24 7b 67 65 74 5f 63 6d 64 7d    en if ${get_cmd}
808008a0: 20 24 7b 66 64 74 5f 61 64 64 72 7d 20 24 7b 66     ${fdt_addr} ${f
808008b0: 64 74 5f 66 69 6c 65 7d 3b 20 74 68 65 6e 20 62    dt_file}; then b
808008c0: 6f 6f 74 7a 20 24 7b 6c 6f 61 64 61 64 64 72 7d    ootz ${loadaddr}
808008d0: 20 2d 20 24 7b 66 64 74 5f 61 64 64 72 7d 3b 20     - ${fdt_addr};
808008e0: 65 6c 73 65 20 69 66 20 74 65 73 74 20 24 7b 62    else if test ${b
808008f0: 6f 6f 74 5f 66 64 74 7d 20 3d 20 74 72 79 3b 20    oot_fdt} = try;
80800900: 74 68 65 6e 20 62 6f 6f 74 7a 3b 20 65 6c 73 65    then bootz; else
80800910: 20 65 63 68 6f 20 57 41 52 4e 3a 20 43 61 6e 6e     echo WARN: Cann
80800920: 6f 74 20 6c 6f 61 64 20 74 68 65 20 44 54 3b 20    ot load the DT;
80800930: 66 69 3b 20 66 69 3b 20 65 6c 73 65 20 62 6f 6f    fi; fi; else boo
80800940: 74 7a 3b 20 66 69 3b 00 6e 65 74 6d 61 73 6b 3d    tz; fi;.netmask=
80800950: 32 35 35 2e 32 35 35 2e 32 35 35 2e 30 00 70 61    255.255.255.0.pa
80800960: 6e 65 6c 3d 41 54 4b 2d 4c 43 44 2d 34 2e 33 2d    nel=ATK-LCD-4.3-
80800970: 38 30 30 78 34 38 30 00 73 63 72 69 70 74 3d 62    800x480.script=b
80800980: 6f 6f 74 2e 73 63 72 00 73 65 72 76 65 72 69 70    oot.scr.serverip
80800990: 3d 31 39 32 2e 31 36 38 2e 30 2e 31 32 30 00 73    =192.168.0.120.s
808009a0: 70 6c 61 73 68 69 6d 61 67 65 3d 30 78 38 38 30    plashimage=0x880
808009b0: 30 30 30 30 30 00 73 70 6c 61 73 68 70 6f 73 3d    00000.splashpos=
808009c0: 6d 2c 6d 00 00 00 00 00 00 00 00 00 00 00 00 00    m,m.............
808009d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................

从上面可以看到“D$…baudrate=115200.board_name=EVK.board_rev=14X14.”等字样,这个就是 uboot 中的环境变量。EMMC 核心板 uboot 环境变量的存储起始地址就是1536*512=786432。

7、mmc write命令

 要将数据写到 MMC 设备里面,可以使用命令“mmc write”,格式如下:

mmc write addr blk# cnt
  • addr 是要写入 MMC 中的数据在 DRAM 中的起始地址
  • blk 是要写入 MMC 的块起始地址(十六进制)
  • cnt 是要写入的块大小,一个块为 512 字节

 我们可以使用命令“mmc write”来升级 uboot,也就是在 uboot 中更新 uboot。这里要用到 nfs 或者 tftp 命令,通过 nfs 或者 tftp 命令将新的 u-boot.bin 下载到开发板的 DRAM 中,然后再使用命令“mmc write”将其写入到 MMC设备中。

 我们就来更新一下 SD 中的 uboot,先查看一下 SD 卡中的 uboot 版本号,注意编译时间,输入命令:

mmc dev 0  //切换到 SD 卡
version //查看版本号
=> mmc dev 1
switch to partitions #0, OK
mmc1(part 0) is current device
=> version

U-Boot 2016.03 (Dec 12 2020 - 13:19:46 +0800)
arm-linux-gnueabihf-gcc (Linaro GCC 4.9-2017.01) 4.9.4
GNU ld (Linaro_Binutils-2017.01) 2.24.0.20141017 Linaro 2014_11-3-git

可以看出当前EMMC中的uboot是(Dec 12 2020 - 13:19:46 +0800)编译的。使用 tftp 命令将一个新编译的u-boot.imx通过tft方式下载到 0x80800000 地址处,如下:

=> tftp 80800000 u-boot.imx
FEC1 Waiting for PHY auto negotiation to complete.... done
Using FEC1 device
TFTP from server 192.168.0.120; our IP address is 192.168.0.121
Filename 'u-boot.imx'.
Load address: 0x80800000
Loading: ###########################
         36.1 KiB/s
done
Bytes transferred = 384000 (5dc00 hex)

u-boot.imx 大小为 384000 字节,384000/512=750,所以我们要向 EMMC 中写入750 个块,如果有小数的话就要加 1 个块。使用命令“mmc write”从 EMMC分区 0 第 2 个块(扇区)开始烧写,一共烧写 750(0x2EE)个块,命令如下:

mmc dev 1 0               //切换到 EMMC 分区 0
tftp 80800000 u-boot.imx  //下载 u-boot.imx 到 DRAM
mmc write 80800000 2 2EE  //烧写 u-boot.imx 到 EMMC 中
mmc partconf 1 1 0 0      //分区配置,EMMC 需要这一步!

=> mmc dev 1 0
switch to partitions #0, OK
mmc1(part 0) is current device
=> tft 80800000 u-boot.imx
FEC1 Waiting for PHY auto negotiation to complete.... done
Using FEC1 device
TFTP from server 192.168.0.120; our IP address is 192.168.0.121
Filename 'u-boot.imx'.
Load address: 0x80800000
Loading: ###########################
         36.1 KiB/s
done
Bytes transferred = 384000 (5dc00 hex)
=> mmc write 80800000 2 2EE

MMC write: dev # 1, block # 2, count 750 ... 750 blocks written: OK
=> mmc partconf 1 1 0 0

烧写成功,重启开发板,重启以后再输入version来查看版本号,结果如下:

=> version

U-Boot 2016.03 (Dec 12 2020 - 20:40:10 +0800)
arm-linux-gnueabihf-gcc (Linaro GCC 4.9-2017.01) 4.9.4
GNU ld (Linaro_Binutils-2017.01) 2.24.0.20141017 Linaro 2014_11-3-git

可以看出当前EMMC中的uboot是(Dec 12 2020 - 20:40:10 +0800)编译的,说明Uboot更新成功。

EMMC更新

mmc dev 1 0               //切换到 EMMC 分区 0
tftp 80800000 u-boot.imx  //下载 u-boot.imx 到 DRAM
mmc write 80800000 2 2EE  //烧写 u-boot.imx 到 EMMC 中
mmc partconf 1 1 0 0      //分区配置,EMMC 需要这一步!

SD卡更新

mmc dev 0 0               //切换到 SD卡 分区 0
tftp 80800000 u-boot.imx  //下载 u-boot.imx 到 DRAM
mmc write 80800000 2 2EE  //烧写 u-boot.imx 到 SD卡 中

8、mmc erase命令

如果要擦除 MMC 设备的指定块就是用命令“mmc erase”,命令格式如下:

mmc erase blk# cnt
  • blk 为要擦除的起始块
  • cnt 是要擦除的数量

 没事不要用 mmc erase 来擦除 MMC 设备!!!
 关于 MMC 设备相关的命令就讲解到这里。

  • 8
    点赞
  • 57
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值