Portabilidad IMX6ULL: EMMC y comandos de lectura y escritura de archivos

1. EMMC y comandos de operación de archivos
 

En general, se cree que EMMC y la tarjeta SD son lo mismo, por lo que no hay una explicación especial.Este artículo usa MMC para referirse a EMMC y tarjeta SD.

El comando comúnmente utilizado para operar dispositivos MMC en uboot es " mmc " . El comando mmc es una serie de comandos, que pueden ser seguidos por diferentes parámetros.

Este artículo aprende principalmente los comandos de operación de archivos relacionados con EMMC: comando de lectura de datos y comando de escritura de datos.

2. Comando de operación de archivo EMMC

1. comando de lectura mmc

El comando mmc read se usa para leer los datos del dispositivo mmc, el formato del comando es el siguiente:

mmc read addr blk# cnt

addr es la dirección donde se leen los datos en DRAM, blk es la dirección inicial del bloque que se va a leer (hexadecimal) y un bloque es 512

bytes, cnt es el número de bloques a leer (en hexadecimal).

Bloque: El bloque y el sector aquí significan lo mismo.En los dispositivos MMC, generalmente decimos sector.

Por ejemplo, a partir del bloque 1536 (0x600) de EMMC, lea los datos de 16 (0x10) bloques a la dirección 0X80800000 de DRAM, el comando es el siguiente:

mmc dev 1 0 //切换到 MMC 分区 0
mmc read 80800000 600 10 //读取数据

El resultado es el siguiente:

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

Aquí todavía no podemos ver si la lectura es correcta o no, verifique los datos leídos en 0x80800000 a través del comando md.b.

 2. comando de escritura mmc

El comando mmc write es para escribir datos en el dispositivo MMC.

El formato del comando es el siguiente:

mmc write addr blk# cnt

addr es la dirección inicial de los datos que se escribirán en la MMC en DRAM, blk es la dirección inicial del bloque que se escribirá en la MMC

(hexadecimal), cnt es el tamaño del bloque a escribir, un bloque tiene 512 bytes.

Por ejemplo, puede usar el comando "mmc write" para actualizar uboot. Decimos que uboot generalmente se almacena en EMMC (si la placa central es un chip EMMC) o en una tarjeta SD.

El método específico es el siguiente:

Idea general: descargue el nuevo u-boot.bin en la DRAM de la placa de desarrollo a través del comando nfs o tftp y luego use el comando "mmc write" para escribirlo en el dispositivo MMC.

(1) Primero, verifique la versión actual de uboot en la placa de desarrollo e ingrese el siguiente comando:

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

Se puede ver que la hora de compilación de uboot en el dispositivo actual es a las 14:37 del 2 de julio de 2023.

(2) En segundo lugar, vuelva a compilar un archivo uboot.imx. Ingrese el archivo de código fuente de uboot en el sistema ubuntu y compílelo.

Como sigue:

(3) Descargue el archivo u-boot.imx compilado a la DRAM de la placa de desarrollo a través del servicio NFS o tftp, aquí use el servicio tftp para descargar.

Copie el archivo u-boot.imx en la carpeta /home/wangtian/linux/tftp_file.

Ingrese al modo de comando uboot de la placa de desarrollo y descargue el archivo u-boot.imx a través de tftp.

La premisa de usar el servicio tftp: debe asegurarse de que la placa de desarrollo pueda hacer ping al sistema ubuntu, los resultados son los siguientes:

=> ping 192.168.1.66
Using FEC1 device
host 192.168.1.66 is alive

Descargue u-boot.imx a la placa de desarrollo. Haz lo siguiente:

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

Se puede ver que uboot se ha descargado a la dirección a partir de 0x80800000 de la DRAM de la placa de desarrollo.

El tamaño de u-boot.imx es 412672 bytes, 412672/512 = 806, por lo que debemos escribir 806 (el hexadecimal es 0x0326) bloques en la tarjeta SD, si hay un decimal, debemos agregar 1 bloque.

Utilice el comando "mmc write" para iniciar la programación desde el segundo bloque (sector) de la partición 0 de la tarjeta SD, el funcionamiento es el siguiente:

=> mmc write 80800000 2 326

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

(4) Apague la placa de desarrollo, configure el interruptor DIP para iniciar desde la tarjeta SD y luego enciéndala para ingresar al modo de comando uboot de la placa de desarrollo.

El resultado es el siguiente:

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

Se puede ver que el tiempo de compilación de uboot es el 7 de julio de 2023, es decir ha cambiado. Significa que el comando "mmc write" escribe correctamente uboot en la tarjeta SD.

Recuerde: ¡Nunca escriba en los primeros dos bloques (sectores) de la tarjeta SD o EMMC, donde se almacena la tabla de particiones!

Supongo que te gusta

Origin blog.csdn.net/wojiaxiaohuang2014/article/details/131602617
Recomendado
Clasificación