Este artigo apresenta como depurar drivers de placa de três maneiras.Linux SD
1. Introdução ao cartão SD
SD Card(Secure Digital Memory Card)
: O cartão digital seguro é uma nova geração de dispositivos de armazenamento de alta velocidade baseados em memória flash semicondutora.
SD
A estrutura do cartão é a seguinte:
A seguir está um breve resumo dos pinos externos da placa, registros internos, grau de velocidade e grau de capacidade.SD
1. Pino externo
SD
O cartão suporta três modos de transmissão: modo, modo e modo.SPI
1bit SD
4bit SD
No projeto real, depuro principalmente os dois últimos modos. A placa tem um total de 9 pinos, que são resumidos da seguinte forma:SD
Nome do alfinete | Descrição do alfinete | Observação |
---|---|---|
CLK | sinal de relógio | |
DMC | pino de comando/resposta | |
DATA0 ~ 3 | cabo de dados | 1bit SD Modo: Use apenas , : detecção de cartão. Modo:: Detecção de Cartão/Dados 3DATA0 CD 4bit SD CD/DATA3 |
VDD | fonte de energia | |
VSS1/2 | terra |
2. Cadastro interno
Os registros relacionados ao cartão SD são organizados da seguinte forma:
Registrar nome | Descrição do registro |
---|---|
OCR (Registro de Condições Operacionais) | registro de condição operacional |
CID (Registro de Identificação de Cartão) | Registro do número de identificação do cartão, cada cartão possui um número de identificação exclusivo |
CSD (Registro de Dados Específicos do Cartão) | Descrever o registro de dados |
SCR (registro de configuração do cartão SD) | Registro de configuração do cartão SD |
RCA (endereço relativo do cartão) | registro de endereço de cartão |
DSR (Registro de Estágio do Motorista) | registro de nível de motorista |
3. Nível de velocidade
Dependendo da velocidade de transferência de dados, os cartões têm diferentes representações de classificação de velocidade.SD
Especificações do protocolo | Introdução |
---|---|
SD1.0 | Usado para indicar diferentes níveis de velocidade, raramente usado.X |
SD2.0 | Cartões comuns (Class2, Class4, Class6) e cartões de alta velocidade (Class10). |
SD3.0 | Utiliza classes de velocidade UHS 1 e 3. |
SD4.0 | Usando UHS-II |
4. Nível de capacidade
SD
A capacidade do cartão atualmente suporta: , e .SD
SDHC
SDXC
Tipo de cartão SD | Especificações do protocolo | Capacidade | Formatos de arquivo suportados |
---|---|---|---|
SD | SD1.0 | ~ 2 GB | GORDURA 12,16 |
SDHC (SD de alta capacidade) | SD2.0 | 2 GB a 32 GB | GORDURA 32 |
SDXC(SD capacidade estendida) | SD3.0 | 32 GB ~ 2 TB | exFAT |
2. Depuração de cartão SD
1. Diagrama esquemático
Para pré-configurar o driver, primeiro observe o diagrama esquemático.
A imagem abaixo mostra o método de conexão com o slot de cartão .RK3568
microSD
2. Configuração do cartão SDC
RK3568 SD
Arquivo de configuração do cartão:
1)arch/arm64/boot/dts/rockchip/rk3568.dtsi
sdmmc0: dwmmc@fe2b0000 { compatível = "rockchip,rk3568-dw-mshc", "rockchip,rk3288-dw-mshc"; registro = <0x0 0xfe2b0000 0x0 0x4000>; interrupções = <GIC_SPI 98 IRQ_TYPE_LEVEL_HIGH>; frequência máxima = <150000000>; relógios = <&cru HCLK_SDMMC0>, <&cru CLK_SDMMC0>, <&cru SCLK_SDMMC0_DRV>, <&cru SCLK_SDMMC0_SAMPLE>; nomes-relógio = "biu", "ciu", "ciu-drive", "ciu-sample"; profundidade fifo = <0x100>; redefinições = <&cru SRST_SDMMC0>; redefinir-nomes = "redefinir"; estado = "desabilitado"; };
2)arch/arm64/boot/dts/rockchip/rk3568-firefly-core.dtsi
&sdmmc0 { frequência máxima = <150000000>; suporta-sd; largura do barramento = <4>; cap-mmc-alta velocidade; cap-sd-alta velocidade; desabilitar-wp; sd-uhs-sdr104; fornecimento vmmc = <&vcc3v3_sd>; fornecimento vqmmc = <&vccio_sd>; pinctrl-names = "padrão"; pinctrl-0 = <&sdmmc0_bus4 &sdmmc0_clk &sdmmc0_cmd &sdmmc0_det>; estado = "ok"; };
em:
clocks
: Indica o relógio e o relógio do controlador da placa .SD
driver
sample
max-frequency
: A frequência máxima de operação da placa, ajustada de acordo com os diferentes modos.SD
supports-sd
: Indica uma função do cartão e deve ser adicionada. Caso contrário, o cartão não poderá ser inicializado.SD
SD
bus-width
: A placa usa o modo de 4 fios. Se não estiver configurado, o padrão será o modo de 1 fio.SD
cap-mmc-highspeed/cap-sd-highspeed
: Cartões suportados .highspeed
SD
vmmc-supply、vqmmc-supply
: Domínio de potência do cartão.SD
SD3.0
Modo de velocidade:
sd-uhs-sdr12: frequência do relógio não excede 24M, tensão do sinal 1,8V sd-uhs-sdr25: frequência do relógio não excede 50M, tensão do sinal 1,8V sd-uhs-sdr50: frequência do relógio não excede 100M, tensão do sinal 1,8 V sd-uhs-ddr50: frequência de clock não excede 50M, usa amostragem de borda dupla, tensão de sinal 1,8V sd-uhs-sdr104: frequência de clock não excede 208M, tensão de sinal 1,8V
pinctrl-0
: Configuração do cartão .SD
pinmux
3. Driver do cartão SDC
RK3568
Arquivo de driver:, foco principalmente em:drivers/mmc/host/dw_mmc-rockchip.c
static const struct dw_mci_drv_data rk3288_drv_data = { .caps = dw_mci_rk3288_dwmmc_caps, .num_caps = ARRAY_SIZE(dw_mci_rk3288_dwmmc_caps), .set_ios = dw_mci_rk3288_set_ios, ## Configurar relógio, linha total, fonte de alimentação, seleção, tempo, etc. execute_tuning = dw_mci_rk3288_execute_tuning, ## Ajustar driver clk e amostra de fase clk .parse_dt = dw_mci_rk3288_parse_dt, .init = dw_mci_rockchip_init, };
RK3568 SD
Uso do controlador , foco principalmente em: e .Synopsys IP
dw_mci_rk3288_set_ios()
dw_mci_rk3288_execute_tuning()
Após a inicialização do sistema, você pode visualizar as propriedades do cartão através do seguinte comando (implementação do driver: ):SD
drivers/mmc/core/debugfs.c
[root@xiaotianbsp:/]# cat /sys/kernel/debug/mmc1/ios relógio: 150000000 Hz relógio real: 148500000 Hz vdd: 21 (3,3 ~ 3,4 V) modo de barramento: 2 (push-pull) seleção de chip: 0 (não me importo) modo de energia: 2 (ligado) largura do barramento: 2 (4 bits) especificação de tempo: 6 (sd uhs SDR104) tensão do sinal: 1 (1,80 V) tipo de driver: 0 (driver tipo B)
3. Teste de cartão SDC
O teste a seguir é concluído com base no cartão.SanDisk Ultra 1 32G SD
1. Detecção de cartão SD
Após a inicialização do sistema, o log de inicialização do cartão é o seguinte:SD
[1.225398] dwmmc_rockchip fe2b0000.dwmmc: Fase ajustada com sucesso para 266 [1.225420] mmc1: novo cartão SDHC SDR104 de ultra alta velocidade no endereço aaaa [1.226456] mmcblk1: mmc1: aaaa SD32G 29,7 GiB [1.227643] mmcblk1: 1
Se o cartão não for inicializado normalmente, aparecerá o seguinte log:SD
[182.501273] mmc_host mmc1: Velocidade do barramento (slot 0) = 375000 Hz (slot necessário 400000 Hz, 375000 Hz real div = 0) [182.672282] mmc1: erro -123 ao inicializar o cartão SD [182.686489] mmc_host mmc1: Velocidade do barramento (slot 0 ) = 375000Hz (slot necessário 300000Hz, 187500HZ div real = 1) [182.699318] mmc_host mmc1: Velocidade do barramento (slot 0) = 375000Hz (slot req 375000Hz, 375000HZ div real = 0) [182.717513] mmc1: Velocidade do barramento (slot 0) = 375.000 Hz (slot necessário 200.000 Hz, div real de 187.500 Hz = 1)
Motivo: Falha. Definição de mensagem de erro ( ):mmc_sd_init_card()
include/uapi/asm-generic/errno.h
#define ETIMEDOUT 110 /* Tempo limite de conexão esgotado */ ... #define ENOMEDIUM 123 /* Nenhuma mídia encontrada */
2. Registro do cartão SD
Através do comando a seguir, você pode visualizar os valores dos registros relacionados ao cartão.SD
[root@xiaotianbsp:/]# cd /sys/class/mmc_host/mmc1/mmc1:aaaa [root@xiaotianbsp:/sys/devices/platform/fe2b0000.dwmmc/mmc_host/mmc1/mmc1:aaaa]# ls bloquear driver hwrev oemid scr tipo cid dsr manfid power serial uevent csd erase_size nome preferido_erase_size ssr data fwrev ocr subsistema rca [root@xiaotianbsp:/sys/devices/platform/fe2b0000.dwmmc/mmc_host/mmc1/mmc1:aaaa]# cat cid 03534453443332478554c 496d501636f## Outros O método de visualização do registro é semelhante ao
SD
O método para visualizar outros parâmetros do cartão é o seguinte:
[root@xiaotianbsp:/sys/devices/platform/fe2b0000.dwmmc/mmc_host/mmc1/mmc1:aaaa]# cat erase_size 512 [root@xiaotianbsp:/sys/devices/platform/fe2b0000.dwmmc/mmc_host/mmc1/mmc1: aaaa]# cat fwrev 0x5 [root@xiaotianbsp:/sys/devices/platform/fe2b0000.dwmmc/mmc_host/mmc1/mmc1:aaaa]# cat hwrev 0x8 [root@xiaotianbsp:/sys/devices/platform/fe2b0000.dwmmc/ mmc_host/mmc1/mmc1:aaaa]# gato manfid 0x000003 [root@xiaotianbsp:/sys/devices/platform/fe2b0000.dwmmc/mmc_host/mmc1/mmc1:aaaa]# nome de gato SD32G [root@xiaotianbsp:/sys/devices/ platform/fe2b0000.dwmmc/mmc_host/mmc1/mmc1:aaaa]# cat oemid 0x5344 [root@xiaotianbsp:/sys/devices/platform/fe2b0000.dwmmc/mmc_host/mmc1/mmc1:aaaa]# cat serial 0x54c496d5 [root@xiaotianbsp :/sys/devices/platform/fe2b0000.dwmmc/mmc_host/mmc1/mmc1:aaaa]# gato tipo SD
3. Montar/desmontar
SD
Comando de montagem da partição do cartão:
[root@xiaotianbsp:/]# mount -t vfat /dev/mmcblk1p1 /tmp/ [ 244.746983] FAT-fs (mmcblk1p1): utf8 não é um conjunto de caracteres IO recomendado para sistemas de arquivos FAT, o sistema de arquivos diferencia maiúsculas de minúsculas! [244.749331] FAT-fs (mmcblk1p1): O volume não foi desmontado corretamente. Alguns dados podem estar corrompidos. Por favor, execute fsck. [root@xiaotianbsp:/]# mount ... /dev/mmcblk1p1 em /tmp digite vfat (rw,relatime,fmask=0022,dmask=0022,codepage=936,iocharset=utf8,shortname=mixed,errors=remount- ro)
SD
Comando de desinstalação da partição do cartão:
desmontar /dev/mmcblk1p1
4. Crie partições
As partições podem ser recriadas no cartão usando o comando.fdisk
SD
[root@xiaotianbsp:/]# fdisk /dev/mmcblk1 ... Comando (m para ajuda): p ## 1. Visualize a partição existente Disco /dev/mmcblk1: 30 GB, 31914983424 bytes, 62333952 setores 3880 cilindros, 255 cabeças, 63 setores/trilha Unidades: cilindros de 16065 * 512 = 8225280 bytesDevice Boot StartCHS EndCHS StartLBA EndLBA Setores Tamanho Id Tipo /dev/mmcblk1p1 0,0,17 1023,254,63 16 62333951 62333936 29,7G c FAT32 (LBA) Comando (m para ajuda): d ## 2. Exclua a partição Partição selecionada 1 Comando (m para ajuda): p Disco /dev/mmcblk1: 30 GB, 31914983424 bytes, 62333952 setores 3880 cilindros, 255 cabeçotes, 63 setores /track Unidades: cilindros de 16065 * 512 = 8225280 bytesDevice Boot StartCHS EndCHS StartLBA EndLBA Setores Tamanho Id TypeCommand ( m para ajuda): n ## 3. Crie uma nova partição, um total de 2 partições são criadasAção de comando e partição primária estendida p (1-4) p Número da partição (1-4): 1 Primeiro cilindro (1-3880, padrão 1): Usando o valor padrão 1 Último cilindro ou +tamanho ou +tamanhoM ou +tamanhoK (1-3880, padrão 3880): 1940 Comando (m para ajuda): p Disco /dev/mmcblk1: 30 GB, 31914983424 bytes, 62333952 setores 3880 cilindros, 255 cabeçotes, 63 setores/pista Unidades: cilindros de 16065 * 512 = 8225280 bytes Inicialização do dispositivo /dev/mmcblk1p1 0,1,1 1023,254,63 63 31166099 31166037 14.8G 83 Comando Linux (m para ajuda): n Ação do comando e estendida p partição primária (1-4) p Número da partição (1-4): 2 Primeiro cilindro (1941-3880, padrão 1941): Usando o valor padrão 1941 Último cilindro ou +tamanho ou +tamanhoM ou +tamanhoK (1941-3880, padrão 3880): Usando o valor padrão 3880 Comando (m para obter ajuda): p Disco /dev/mmcblk1: 30 GB, 31914983424 bytes, 62333952 setores 3880 cilindros, 255 cabeçotes, 63 setores/pista Unidades: cilindros de 16065 * 512 = 8225280 bytes Boot do dispositivo /dev/mmcblk1p1 0,1,1 1023,254,63 63 31166099 31166037 14,8G 83 Linux Comando Linux 14.8G 83 (m para ajuda) : w ## 4. Salve a nova partição
5. Teste de leitura e escrita
Comando de escrita do cartão de teste :SD
[root@RK356X:/]# time dd oflag=direct,nonblock if=/dev/zero of=/dev/mmcblk1p1 bs=1M count=100 100+0 registros em 100+0 registros em 104857600 bytes (105 MB, 100 MiB) copiado, 3,4844 s, 30,1 MB/s real 0m 3,49s usuário 0m 0,00s sys 0m 0,16s
Comando de leitura do cartão de teste :SD
[root@RK356X:/]# time dd iflag=direct,nonblock if=/dev/mmcblk1p1 of=/dev/null bs=1M count=100 100+0 registros em 100+0 registros em 104857600 bytes (105 MB, 100 MiB) copiado, 1,65236 s, 63,5 MB/s real 0m 1,65s usuário 0m 0,00s sys 0m 0,03s
Os atributos e configurados no comando acima podem evitar o sistema de arquivos e ler e gravar diretamente sem usá-los .iflag
oflag
cache
buffer cache
Nota: Por favor, indique o autor e a fonte ao reimprimir.
RustDesk suspendeu o serviço doméstico Taobao (taobao.com) devido a fraude desenfreada, reiniciou o trabalho de otimização da versão web, a Apple lançou o chip M4, estudantes do ensino médio criaram sua própria linguagem de programação de código aberto como uma cerimônia de maioridade - Internautas comentaram: Confiando em a defesa, Yunfeng renunciou ao Alibaba e planeja produzir no futuro o destino para programadores de jogos independentes o Visual Studio Code 1.89, é oficialmente anunciado pela Huawei. O ajuste de trabalho de Yu Chengdong foi pregado no “Pilar da Vergonha FFmpeg. ” 15 anos atrás, mas hoje ele tem que nos agradecer - Tencent QQ Video vinga sua vergonha anterior? A estação espelho de código aberto da Universidade de Ciência e Tecnologia Huazhong está oficialmente aberta ao acesso à rede externa