日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > linux >内容正文

linux

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

發(fā)布時間:2024/1/8 linux 56 豆豆
生活随笔 收集整理的這篇文章主要介紹了 嵌入式Linux--U-Boot(四)MMC命令使用 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

目錄

  • 一、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 卡的操作命令。一般認(rèn)為 EMMC和 SD 卡是同一個東西,所以沒有特殊說明,本教程統(tǒng)一使用 MMC 來代指 EMMC 和 SD 卡。uboot 中常用于操作 MMC 設(shè)備的命令為“mmc”。

mmc 是一系列的命令,其后可以跟不同的參數(shù),輸入“?mmc”即可查看 mmc 有關(guān)的命令,如下所示:

=> ? 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 后面跟不同的參數(shù)可以實(shí)現(xiàn)不同的功能。

命令描述
mmc info輸出 MMC 設(shè)備信息
mmc read讀取 MMC 中的數(shù)據(jù)。
mmc wirte向 MMC 設(shè)備寫入數(shù)據(jù)。
mmc rescan掃描 MMC 設(shè)備。
mmc part列出 MMC 設(shè)備的分區(qū)。
mmc dev切換 MMC 設(shè)備。
mmc list列出當(dāng)前有效的所有 MMC 設(shè)備。
mmc hwpartition設(shè)置 MMC 設(shè)備的分區(qū)。
mmc bootbus……設(shè)置指定 MMC 設(shè)備的 BOOT_BUS_WIDTH 域的值。
mmc bootpart……設(shè)置指定 MMC 設(shè)備的 boot 和 RPMB 分區(qū)的大小。
mmc partconf……設(shè)置指定 MMC 設(shè)備的 PARTITION_CONFG 域的值。
mmc rst復(fù)位 MMC 設(shè)備
mmc setdsr設(shè)置 DSR 寄存器的值

1、mmc info命令

?mmc info 命令用于輸出當(dāng)前選中的 mmc info 設(shè)備的信息,輸入命令“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

?從上可以看出,當(dāng)前選中的MMC設(shè)備是EMMC,版本為4.5,容量為3.7GB(EMMC為 4GB),速度為 52000000Hz=52MHz,8 位寬的總線。還有一個與 mmc info 命令相同功能的命令:mmcinfo,“mmc”和“info”之間沒有空格。

2、mmc rescan命令

?mmc rescan 命令用于掃描當(dāng)前開發(fā)板上所有的 MMC 設(shè)備,包括 EMMC 和 SD 卡,輸入“mmc rescan”即可。

3、mmc list命令

?mmc list 命令用于來查看當(dāng)前開發(fā)板一共有幾個 MMC 設(shè)備,輸入“mmc list”,結(jié)果如下:

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

?可以看出當(dāng)前開發(fā)板有兩個 MMC 設(shè)備:FSL_SDHC:0 和 FSL_SDHC:1 (eMMC),這是因?yàn)槲椰F(xiàn)在用的是 EMMC 版本的核心板,加上 SD 卡一共有兩個 MMC 設(shè)備,FSL_SDHC:0 是 SD卡,FSL_SDHC:1(eMMC)是 EMMC。

?默認(rèn)會將 EMMC 設(shè)置為當(dāng)前 MMC 設(shè)備,這就是為什么輸入“mmc info”查詢到的是 EMMC 設(shè)備信息,而不是 SD 卡。

?要想查看 SD 卡信息,就要使用命令“mmc dev”來將 SD 卡設(shè)置為當(dāng)前的 MMC 設(shè)備。

4、mmc dev命令

mmc dev 命令用于切換當(dāng)前 MMC 設(shè)備,命令格式如下:

mmc dev [dev] [part]
  • [dev]用來設(shè)置要切換的 MMC 設(shè)備號
  • [part]是分區(qū)號。

如果不寫分區(qū)號的話默認(rèn)為分區(qū) 0。使用如下命令切換到 SD 卡:

mmc dev 0 //切換到 SD 卡,0 為 SD 卡,1 為 eMMC
  • 0 :SD卡
  • 1:MMC設(shè)備

輸入命令“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

從上面可以看出當(dāng)前 MMC設(shè)備為 4.0 版本的,容量為 7.3GiB(8GB 的 EMMC),8 位寬的總線。

5、mmc part命令

?有時候 SD 卡或者 EMMC 會有多個分區(qū),可以使用命令“mmc part”來查看其分區(qū),比如查看 EMMC 的分區(qū)情況,輸入如下命令:

mmc dev 1 //切換到 EMMC mmc part //查看 EMMC 分區(qū) => 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 有兩個分區(qū):

  • 扇區(qū) 20480 ~ 262144 為第一個分區(qū)
  • 扇區(qū) 282624~14987264 為第二個分區(qū)

?如果 EMMC 里面燒寫了 Linux 系統(tǒng)的話,EMMC 是有3 個分區(qū)的:

  • 第 0 個分區(qū)存放 uboot
  • 第 1 個分區(qū)存放 Linux 鏡像文件和設(shè)備樹
  • 第 2 個分區(qū)存放根文件系統(tǒng)

?但是在上面只有兩個分區(qū),那是因?yàn)榈?0 個分區(qū)沒有格式化,所以識別不出來,實(shí)際上第 0 個分區(qū)是存在的。一個新的 SD 卡默認(rèn)只有一個分區(qū),那就是分區(qū) 0,所以前面講解的 uboot 燒寫到 SD 卡,其實(shí)就是將 u-boot.bin 燒寫到了 SD 卡的分區(qū) 0 里面。后面學(xué)習(xí) Linux 內(nèi)核移植的時候再講解怎么在 SD 卡中創(chuàng)建并格式化第二個分區(qū),并將 Linux 鏡像文件和設(shè)備樹文件存放到第二個分區(qū)中。

如果要將 EMMC 的分區(qū) 2 設(shè)置為當(dāng)前 MMC 設(shè)置,可以使用如下命令:

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 設(shè)備的數(shù)據(jù),命令格式如下:

mmc read addr blk# cnt

?addr 是數(shù)據(jù)讀取到 DRAM 中的地址,blk 是要讀取的塊起始地址(十六進(jìn)制),一個塊是 512字節(jié),這里的塊和扇區(qū)是一個意思,在 MMC 設(shè)備中我們通常說扇區(qū),cnt 是要讀取的塊數(shù)量(十六進(jìn)制)。比如從 EMMC 的第 1536(0x600)個塊開始,讀取 16(0x10)個塊的數(shù)據(jù)到 DRAM 的0X80800000 地址處,命令如下:

mmc dev 1 0 //切換到 MMC 分區(qū) 0 mmc read 80800000 600 10 //讀取數(shù)據(jù) => 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 處的數(shù)據(jù)就行了,查看 16*512=8192(0x2000)個字節(jié)的數(shù)據(jù),命令如下:

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 中的環(huán)境變量。EMMC 核心板 uboot 環(huán)境變量的存儲起始地址就是1536*512=786432。

7、mmc write命令

?要將數(shù)據(jù)寫到 MMC 設(shè)備里面,可以使用命令“mmc write”,格式如下:

mmc write addr blk# cnt
  • addr 是要寫入 MMC 中的數(shù)據(jù)在 DRAM 中的起始地址
  • blk 是要寫入 MMC 的塊起始地址(十六進(jìn)制)
  • cnt 是要寫入的塊大小,一個塊為 512 字節(jié)

?我們可以使用命令“mmc write”來升級 uboot,也就是在 uboot 中更新 uboot。這里要用到 nfs 或者 tftp 命令,通過 nfs 或者 tftp 命令將新的 u-boot.bin 下載到開發(fā)板的 DRAM 中,然后再使用命令“mmc write”將其寫入到 MMC設(shè)備中。

?我們就來更新一下 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

可以看出當(dāng)前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 字節(jié),384000/512=750,所以我們要向 EMMC 中寫入750 個塊,如果有小數(shù)的話就要加 1 個塊。使用命令“mmc write”從 EMMC分區(qū) 0 第 2 個塊(扇區(qū))開始燒寫,一共燒寫 750(0x2EE)個塊,命令如下:

mmc dev 1 0 //切換到 EMMC 分區(qū) 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 //分區(qū)配置,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

燒寫成功,重啟開發(fā)板,重啟以后再輸入version來查看版本號,結(jié)果如下:

=> 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

可以看出當(dāng)前EMMC中的uboot是(Dec 12 2020 - 20:40:10 +0800)編譯的,說明Uboot更新成功。

EMMC更新

mmc dev 1 0 //切換到 EMMC 分區(qū) 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 //分區(qū)配置,EMMC 需要這一步!

SD卡更新

mmc dev 0 0 //切換到 SD卡 分區(qū) 0 tftp 80800000 u-boot.imx //下載 u-boot.imx 到 DRAM mmc write 80800000 2 2EE //燒寫 u-boot.imx 到 SD卡 中

8、mmc erase命令

如果要擦除 MMC 設(shè)備的指定塊就是用命令“mmc erase”,命令格式如下:

mmc erase blk# cnt
  • blk 為要擦除的起始塊
  • cnt 是要擦除的數(shù)量

?沒事不要用 mmc erase 來擦除 MMC 設(shè)備!!!
?關(guān)于 MMC 設(shè)備相關(guān)的命令就講解到這里。

總結(jié)

以上是生活随笔為你收集整理的嵌入式Linux--U-Boot(四)MMC命令使用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。