IMX6ULL移植篇-EMMC与文件读写命令

一.  EMMC与文件操作命令
 

一般认为 EMMC 和 SD 卡是同一个东西,所以没有特殊说明,本文统一使用 MMC 来代指 EMMC 和 SD 卡。

uboot 中常用于操作 MMC 设备的命令为 mmc mmc 命令 是一系列的命令,其后可以跟不同的参数。

本文主要学习 EMMC 相关的文件操作命令:读数据命令与写数据命令。

二.  EMMC文件操作命令

1.  mmc read 命令

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

mmc read addr blk# cnt

addr 是数据读取到 DRAM 中的地址,blk 是要读取的块起始地址(十六进制),一个块是 512

字节,cnt 是要读取的块数量(十六进制)。

块:这里的块和扇区是一个意思,在 MMC 设备中我们通常说扇区。

例如,从 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 处所读取的数据。

 2.  mmc write 命令

mmc write 命令 要将数据写到 MMC 设备里面。

命令格式如下:

mmc write addr blk# cnt

addr 是要写入 MMC 中的数据在 DRAM 中的起始地址,blk 是要写入 MMC 的块起始地址

(十六进制),cnt 是要写入的块大小,一个块为 512 字节。

例如,可以使用命令 “mmc write” 命令 来升级 uboot。我们说uboot一般是存放在 EMMC(如果核心板上是 EMMC芯片)或 SD卡中。

具体做法如下:

大体思路:通过 nfs 或者 tftp 命令将新的 u-boot.bin 下载到开发板的 DRAM 中,然后再使用命令“mmc write”将其写入到 MMC 设备中。

(1)   首先,查看开发板上的当前使用 uboot版本,输入如下命令:

=> version

U-Boot 2016.03 (Jul 02 2023 - 14:37:52 +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

可以看出:当前设备中的 uboot的编译时间是2023-07月02日14:37分。

(2)   其次,重新编译一个 uboot.imx文件。进入ubuntu系统下的 uboot源码文件,进行编译。

如下所示:

(3)  将编译好的 u-boot.imx文件通过 NFS或 tftp 服务下载到开发板的 DRAM中,这里使用 tftp服务下载。

将 u-boot.imx 文件拷贝到 /home/wangtian/linux/tftp_file 文件夹下。

进入 开发板的uboot命令模式下,通过 tftp下载 u-boot.imx文件。

使用 tftp服务的前提:必须保证开发板可以 ping 通 ubuntu系统,如下结果:

=> ping 192.168.1.66
Using FEC1 device
host 192.168.1.66 is alive

下载 u-boot.imx 到开发板。如下操作:

=> tftp 80800000 u-boot.imx
Using FEC1 device
TFTP from server 192.168.1.66; our IP address is 192.168.1.50
Filename 'u-boot.imx'.
Load address: 0x80800000
Loading: #############################
	 641.6 KiB/s
done
Bytes transferred = 412672 (64c00 hex)

可以看出: uboot 已经下载到 开发板DRAM的 0x80800000开始的地址处。

u-boot.imx 大小为412672 字节,412672 / 512 = 806,所以我们要向 SD 卡中写入 806(十六进制即 0x0326) 个块,如果有小数的话就要加 1 个块。

使用 “mmc write” 命令 从 SD 卡分区 0 第 2 个块(扇区)开始烧写,操作如下:

=> mmc write 80800000 2 326

MMC write: dev # 0, block # 2, count 806 ... 806 blocks written: OK

(4)  开发板断电,拨码开关设置到  从 SD卡启动,再上电,进入开发板的 uboot 的命令模式。

结果如下:

U-Boot 2016.03 (Jul 07 2023 - 17:11:27 +0800)

CPU:   Freescale i.MX6ULL rev1.1 792 MHz (running at 396 MHz)
CPU:   Industrial temperature grade (-40C to 105C) at 45C
Reset cause: POR
Board: I.MX6U ALPHA|MINI
I2C:   ready
DRAM:  256 MiB
NAND:  512 MiB
MMC:   FSL_SDHC: 0
In:    serial
Out:   serial
Err:   serial
Net:   FEC1
Normal Boot
Hit any key to stop autoboot:  0

可以看出: uboot的编译时间为 2023年7月7日,即已经改变。说明 "mmc write "命令成功写入uboot到 SD卡。

切记:千万不要写 SD 卡或者 EMMC 的前两个块(扇区),里面保存着分区表!

猜你喜欢

转载自blog.csdn.net/wojiaxiaohuang2014/article/details/131602617