目录
- 一、EMMC和SD卡操作命令
- 1、mmc info命令
- 2、mmc rescan命令
- 3、mmc list命令
- 4、mmc dev命令
- 5、mmc part命令
- 6、mmc read命令
- 7、mmc write命令
- EMMC更新
- SD卡更新
- 8、mmc erase命令
一、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 设备相关的命令就讲解到这里。