1. EMMC e comandos de operação de arquivo
Geralmente acredita-se que EMMC e cartão SD são a mesma coisa, então não há nenhuma explicação especial. Este artigo usa MMC para se referir a EMMC e cartão SD.
O comando comumente usado para operar dispositivos MMC no uboot é " mmc " . O comando mmc é uma série de comandos, que podem ser seguidos por diferentes parâmetros.
Este artigo aprende principalmente os comandos de operação de arquivo relacionados ao EMMC: comando de leitura de dados e comando de gravação de dados.
2. Comando de operação de arquivo EMMC
1. comando de leitura mmc
O comando mmc read é usado para ler os dados do dispositivo mmc, o formato do comando é o seguinte:
mmc read addr blk# cnt
addr é o endereço onde os dados são lidos na DRAM, blk é o endereço inicial do bloco a ser lido (hexadecimal) e um bloco é 512
bytes, cnt é o número de blocos a serem lidos (em hexadecimal).
Bloco: O bloco e o setor aqui significam a mesma coisa.Nos dispositivos MMC, costumamos dizer setor.
Por exemplo, partindo do bloco 1536 (0x600) do EMMC, leia os dados de 16 (0x10) blocos para o endereço 0X80800000 da DRAM, o comando é o seguinte:
mmc dev 1 0 //切换到 MMC 分区 0
mmc read 80800000 600 10 //读取数据
O resultado é o seguinte:
=> 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
Aqui ainda não conseguimos ver se a leitura está correta ou não, verifique os dados lidos em 0x80800000 através do comando md.b.
2. comando de gravação mmc
O comando mmc write é para gravar dados no dispositivo MMC.
O formato do comando é o seguinte:
mmc write addr blk# cnt
addr é o endereço inicial dos dados a serem gravados no MMC na DRAM, blk é o endereço inicial do bloco a ser gravado no MMC
(hexadecimal), cnt é o tamanho do bloco a ser gravado, um bloco tem 512 bytes.
Por exemplo, você pode usar o comando "mmc write" para atualizar o uboot. Dizemos que o uboot geralmente é armazenado em EMMC (se a placa principal for um chip EMMC) ou cartão SD.
O método específico é o seguinte:
Idéia geral: Baixe o novo u-boot.bin para a DRAM da placa de desenvolvimento por meio do comando nfs ou tftp e, em seguida, use o comando "mmc write" para gravá-lo no dispositivo MMC.
(1) Primeiro, verifique a versão atual do uboot na placa de desenvolvimento e digite o seguinte 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
Pode-se ver que o tempo de compilação do uboot no dispositivo atual é 14:37 em 2 de julho de 2023.
(2) Segundo, recompile um arquivo uboot.imx. Digite o arquivo de código-fonte uboot no sistema ubuntu e compile-o.
Do seguinte modo:
(3) Faça o download do arquivo u-boot.imx compilado para a DRAM da placa de desenvolvimento por meio do serviço NFS ou tftp, aqui use o serviço tftp para fazer o download.
Copie o arquivo u-boot.imx para a pasta /home/wangtian/linux/tftp_file.
Entre no modo de comando uboot da placa de desenvolvimento e baixe o arquivo u-boot.imx através do tftp.
A premissa de usar o serviço tftp: você deve garantir que a placa de desenvolvimento possa executar ping no sistema ubuntu, os resultados são os seguintes:
=> ping 192.168.1.66
Using FEC1 device
host 192.168.1.66 is alive
Baixe u-boot.imx para a placa de desenvolvimento. Faça o seguinte:
=> 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)
Pode-se ver que o uboot foi baixado para o endereço a partir de 0x80800000 da DRAM da placa de desenvolvimento.
O tamanho de u-boot.imx é 412672 bytes, 412672 / 512 = 806, então precisamos escrever 806 (hexadecimal é 0x0326) blocos no cartão SD, se houver um decimal, precisamos adicionar 1 bloco.
Use o comando "mmc write" para iniciar a programação a partir do segundo bloco (setor) da partição 0 do cartão SD, a operação é a seguinte:
=> mmc write 80800000 2 326
MMC write: dev # 0, block # 2, count 806 ... 806 blocks written: OK
(4) Desligue a placa de desenvolvimento, defina o interruptor DIP para inicializar a partir do cartão SD e, em seguida, ligue para entrar no modo de comando uboot da placa de desenvolvimento.
O resultado é o seguinte:
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
Pode-se observar que o tempo de compilação do uboot é 7 de julho de 2023, ou seja, mudou. Isso significa que o comando "mmc write" grava com sucesso o uboot no cartão SD.
Lembre-se: Nunca escreva nos dois primeiros blocos (setores) do cartão SD ou EMMC, onde a tabela de partições está armazenada!