嵌入式Linux--U-Boot(四)MMC命令使用
目錄
- 一、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 systemUsage: 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 partitioningarguments (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 completedWARNING: 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 deviceWARNING: 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 partPartition Map for MMC device 1 -- Partition Type: DOSPart Start Sector Num Sectors UUID Type1 20480 262144 3092ce11-01 0c2 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 device6、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 10MMC 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 => versionU-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 2EEMMC write: dev # 1, block # 2, count 750 ... 750 blocks written: OK => mmc partconf 1 1 0 0燒寫成功,重啟開發板,重啟以后再輸入version來查看版本號,結果如下:
=> versionU-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 設備相關的命令就講解到這里。
總結
以上是生活随笔為你收集整理的嵌入式Linux--U-Boot(四)MMC命令使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 从零开始足球战术分析
- 下一篇: docker | 基于 WSL2 在 W