Cartão SD do kernel Linux

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.

SDA 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

SDO cartão suporta três modos de transmissão: modo, modo e modo.SPI1bit SD4bit 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 SDModo: Use apenas , : detecção de cartão. Modo:: Detecção de Cartão/Dados 3DATA0CD4bit SDCD/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

SDA capacidade do cartão atualmente suporta: , e .SDSDHCSDXC

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 .RK3568microSD

2. Configuração do cartão SDC

RK3568 SDArquivo 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 .SDdriversample

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.SDSD

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 .highspeedSD

vmmc-supply、vqmmc-supply: Domínio de potência do cartão.SD

SD3.0Modo 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 .SDpinmux

3. Driver do cartão SDC

RK3568Arquivo 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 SDUso do controlador , foco principalmente em: e .Synopsys IPdw_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: ):SDdrivers/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

SDO 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

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

SDComando 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.fdiskSD

[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 .iflagoflagcachebuffer 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
{{o.nome}}
{{m.nome}}

Acho que você gosta

Origin my.oschina.net/u/4702401/blog/5566478
Recomendado
Clasificación