Tarjeta SD del kernel de Linux

Este artículo presenta cómo depurar controladores de tarjetas de tres maneras.Linux SD

1. Introducción a la tarjeta SD

SD Card(Secure Digital Memory Card): La tarjeta digital segura es una nueva generación de dispositivo de almacenamiento de alta velocidad basado en memoria flash semiconductora.

SDLa estructura de la tarjeta es la siguiente:

El siguiente es un breve resumen de los pines externos, los registros internos, el grado de velocidad y el grado de capacidad de la tarjeta.SD

1. Pasador externo

SDLa tarjeta admite tres modos de transmisión: modo, modo y modo.SPI1bit SD4bit SD

En el proyecto real, depuro principalmente los dos últimos modos. La tarjeta tiene un total de 9 pines, que se resumen a continuación:SD

Nombre del pin Descripción del pin Observación
CLK señal de reloj  
CMD pin de comando/respuesta  
FECHA0 ~ 3 cable de datos 1bit SDModo: Usar sólo , : detección de tarjeta. Modo: :Detección de tarjeta/Datos 3DATA0CD4bit SDCD/DATA3
VDD fuente de alimentación  
VSS1/2 tierra  

2. Registro interno

Los registros relacionados con la tarjeta SD están organizados de la siguiente manera:

Nombre del registro Descripción del registro
OCR (Registro de condiciones de funcionamiento) registro de condiciones de funcionamiento
CID (Registro de identificación de tarjeta) Registro del número de identificación de la tarjeta, cada tarjeta tiene un número de identificación único
CSD (registro de datos específicos de la tarjeta) Describir el registro de datos
SCR (Registro de configuración de tarjeta SD) Registro de configuración de la tarjeta SD
RCA (Dirección de tarjeta relativa) registro de dirección de tarjeta
DSR (Registro de etapa del conductor) registro de nivel de conductor

3. Nivel de velocidad

Dependiendo de la velocidad de transferencia de datos, las tarjetas tienen diferentes representaciones de clasificación de velocidad.SD

Especificaciones del protocolo Introducción
SD1.0 Se utiliza para indicar diferentes niveles de velocidad, rara vez se utiliza.X
SD2.0 Tarjetas ordinarias (Clase2, Clase4, Clase6) y tarjetas de alta velocidad (Clase10).
SD3.0 Utiliza las clases de velocidad UHS 1 y 3.
SD4.0 Usando UHS-II

4. Nivel de capacidad

SDLa capacidad de la tarjeta actualmente admite: , y .SDSDHCSDXC

tipo de tarjeta SD Especificaciones del protocolo Capacidad Formatos de archivo admitidos
Dakota del Sur SD1.0 ~2GB GRASA 12,16
SDHC (SD de alta capacidad) SD2.0 2 GB ~ 32 GB grasa 32
SDXC (capacidad extendida SD) SD3.0 32GB~2TB exFAT

 

2. Depuración de tarjetas SD

1. Diagrama esquemático

Para preconfigurar el controlador, primero mire el diagrama esquemático.

La siguiente imagen muestra el método de conexión con la ranura para tarjetas .RK3568microSD

2. Configuración de la tarjeta SD

RK3568 SDArchivo de configuración de la tarjeta:

1)arch/arm64/boot/dts/rockchip/rk3568.dtsi

    sdmmc0: dwmmc@fe2b0000 { 
compatible = "rockchip,rk3568-dw-mshc",      "rockchip,rk3288-dw-mshc"; registro = <0x0 0xfe2b0000 0x0 0x4000>; interrupciones = <GIC_SPI 98 IRQ_TYPE_LEVEL_HIGH>; frecuencia máxima = <150000000>; relojes = <&cru HCLK_SDMMC0>, <&cru CLK_SDMMC0>, <&cru SCLK_SDMMC0_DRV>, <&cru SCLK_SDMMC0_SAMPLE>; nombres de reloj = "biu", "ciu", "ciu-drive", "ciu-sample"; profundidad quince = <0x100>; restablece = <&cru SRST_SDMMC0>; restablecer-nombres = "restablecer"; estado = "deshabilitado"; };        
            
        
        
        
        
            
        
        
        
        
        
    

2)arch/arm64/boot/dts/rockchip/rk3568-firefly-core.dtsi

    &sdmmc0 { 
    frecuencia máxima = <150000000>; 
    soportes-sd; 
    ancho de bus = <4>; 
    cap-mmc-alta velocidad; 
    cap-sd-alta velocidad; 
    desactivar-wp; 
    sd-uhs-sdr104; 
    suministro-vmmc = <&vcc3v3_sd>; 
    suministro-vqmmc = <&vccio_sd>; 
    pinctrl-names = "predeterminado"; 
    pinctrl-0 = <&sdmmc0_bus4 &sdmmc0_clk &sdmmc0_cmd &sdmmc0_det>; 
    estado = "bien"; 
};

en:

clocks: Indica el reloj del controlador de la tarjeta y el reloj.SDdriversample

max-frequency: La frecuencia máxima de funcionamiento de la tarjeta, ajustada según los diferentes modos.SD

supports-sd: Indica una función de tarjeta y debe agregarse. De lo contrario, la tarjeta no podrá inicializarse.SDSD

bus-width: La tarjeta utiliza el modo de 4 cables. Si no está configurado, el valor predeterminado es el modo de 1 cable.SD

cap-mmc-highspeed/cap-sd-highspeed: Tarjetas compatibles .highspeedSD

vmmc-supply、vqmmc-supply: Dominio de poder de la tarjeta.SD

SD3.0Modo de velocidad:

sd-uhs-sdr12: la frecuencia del reloj no supera los 24 M, voltaje de la señal 1,8 V 
sd-uhs-sdr25: la frecuencia del reloj no supera los 50 M, voltaje de la señal 1,8 V 
sd-uhs-sdr50: la frecuencia del reloj no supera los 100 M, voltaje de la señal 1,8 V 
sd-uhs-ddr50: la frecuencia del reloj no supera los 50 M, utiliza muestreo de doble filo, voltaje de señal 1,8 V 
sd-uhs-sdr104: la frecuencia del reloj no supera los 208 M, voltaje de señal 1,8 V

pinctrl-0: Configuración de la tarjeta .SDpinmux

3. Controlador de tarjeta SD

RK3568Archivo de controlador:, se centra principalmente en: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 reloj, línea total, fuente de alimentación, seleccionar, cronometrar, etc.                     
    ejecutar_tuning = dw_mci_rk3288_execute_tuning, ## Ajustar clk del controlador y fase clk de muestra      
    .parse_dt = dw_mci_rk3288_parse_dt,        
    .init = dw_mci_rockchip_init,            
};

RK3568 SDEl uso del controlador se centra principalmente en: y .Synopsys IPdw_mci_rk3288_set_ios()dw_mci_rk3288_execute_tuning()

Después de que se inicie el sistema, puede ver las propiedades de la tarjeta mediante el siguiente comando (implementación del controlador:) :SDdrivers/mmc/core/debugfs.c

[root@xiaotianbsp:/]# cat /sys/kernel/debug/mmc1/ios 
reloj: 150000000 Hz 
reloj real: 148500000 Hz 
vdd: 21 (3,3 ~ 3,4 V) 
modo bus: 2 (push-pull) 
selección de chip: 0 (no importa) 
modo de energía: 2 (encendido) 
ancho de bus: 2 (4 bits) 
especificación de tiempo: 6 (sd uhs SDR104) 
voltaje de señal: 1 (1,80 V) 
tipo de controlador: 0 (tipo de controlador B)

 

3. Prueba de tarjeta SD

La siguiente prueba se completa según la tarjeta.SanDisk Ultra 1 32G SD

1. Detección de tarjeta SD

Después de que se inicia el sistema, el registro de inicio de la tarjeta es el siguiente:SD

[ 1.225398] dwmmc_rockchip fe2b0000.dwmmc: Fase ajustada exitosamente a 266 
[ 1.225420] mmc1: nueva tarjeta SDHC SDR104 de ultra alta velocidad en la dirección aaaa 
[ 1.226456] mmcblk1: mmc1:aaaa SD32G 29.7 GiB 
[ 1.227643] lk1: p1

Si la tarjeta no se inicializa normalmente, aparecerá el siguiente registro:SD

[ 182.501273] mmc_host mmc1: velocidad del bus (ranura 0) = 375000 Hz (ranura requerida 400000 Hz, 375000 HZ real div = 0) 
[ 182.672282] mmc1: error -123 al inicializar la tarjeta SD 
[ 182.686489] mmc_host mmc1: velocidad del bus (ranura 0 ) = 375000 Hz (ranura requerida 300 000 Hz, 187 500 HZ real div = 1) 
[ 182.699318] mmc_host mmc1: Velocidad del bus (ranura 0) = 375 000 Hz (ranura requerida 375 000 Hz, 375 000 HZ real div = 0) 
[ 182.717513] mmc_host mmc 1: Velocidad del bus (ranura 0) = 375000 Hz (requiere ranura 200 000 Hz, 187 500 HZ real div = 1)

Motivo: Fracaso. Definición del mensaje de error ( ):mmc_sd_init_card()include/uapi/asm-generic/errno.h

#define ETIMEDOUT 110 /* Se agotó el tiempo de conexión */ 
... 
#define ENOMEDIUM 123 /* No se encontró ningún medio */

2. Registro de tarjeta SD

Mediante el siguiente comando, puede ver los valores de los registros relacionados con tarjetas.SD

[root@xiaotianbsp:/]# cd /sys/class/mmc_host/mmc1/mmc1:aaaa 
[root@xiaotianbsp:/sys/devices/platform/fe2b0000.dwmmc/mmc_host/mmc1/mmc1:aaaa]# ls 
block driver hwrev oemid scr tipo 
cid dsr manfid power serial uevent 
csd erase_size nombre selected_erase_size ssr 
fecha fwrev ocr rca subsistema 
[root@xiaotianbsp:/sys/devices/platform/fe2b0000.dwmmc/mmc_host/mmc1/mmc1:aaaa]# cat cid 
035344534433324785 
54c 496d501636f## Otros El método de visualización de registros es similar a

SDEl método para ver otros parámetros de la tarjeta es el siguiente:

[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]# cat manfid 
0x000003 
[root@xiaotianbsp:/sys/devices/platform/fe2b0000.dwmmc/mmc_host/mmc1/mmc1:aaaa]# nombre de gato 
SD32G 
[root@xiaotianbsp:/sys/devices/ plataforma/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]# tipo de gato 
SD

3. Montar/desmontar

SDComando de montaje de partición de tarjeta:

[root@xiaotianbsp:/]# mount -t vfat /dev/mmcblk1p1 /tmp/ 
[ 244.746983] FAT-fs (mmcblk1p1): utf8 no es un conjunto de caracteres IO recomendado para sistemas de archivos FAT, ¡el sistema de archivos distinguirá entre mayúsculas y minúsculas! 
[244.749331] FAT-fs (mmcblk1p1): el volumen no se desmontó correctamente. Algunos datos pueden estar corruptos. Ejecute fsck. 
[root@xiaotianbsp:/]# montar 
... 
/dev/mmcblk1p1 en /tmp escriba vfat (rw,relatime,fmask=0022,dmask=0022,codepage=936,iocharset=utf8,shortname=mixed,errors=remount- ro)

SDComando de desinstalación de partición de tarjeta:

desmontar /dev/mmcblk1p1

4. Crear particiones

Las particiones se pueden recrear en la tarjeta usando el comando.fdiskSD

[root@xiaotianbsp:/]# fdisk /dev/mmcblk1 
... 
Comando (m para ayuda): p ## 1. Ver la partición existente 
Disco /dev/mmcblk1: 30 GB, 31914983424 bytes, 62333952 sectores 
3880 cilindros, 255 cabezas, 63 sectores/pista 
Unidades: cilindros de 16065 * 512 = 8225280 bytes Arranque 
del
 dispositivo Inicio CHS Fin CHS Inicio LBA Fin LBA Sectores Tamaño Id Tipo 
/dev/mmcblk1p1 0,0,17 1023,254,63 16 62333951 62333936 29.7G c Win95 FAT32 ( licenciatura) 
​Comando
 (m para ayuda): d ## 2. Eliminar la partición 
Partición seleccionada 1 
​Comando
 (m para ayuda): p 
Disco /dev/mmcblk1: 30 GB, 31914983424 bytes, 62333952 sectores 
3880 cilindros, 255 cabezales, 63 sectores /track 
Unidades: cilindros de 16065 * 512 = 8225280 bytes Arranque 
del
 dispositivo Inicio CHS Fin CHS Inicio LBA Fin LBA Sectores Tamaño Id Tipo Comando 
(
 m para ayuda): n ## 3. Cree una nueva partición, se crean un total de 2 particiones 
Acción de comando e 
   partición primaria p    extendida 
(1-4) 
p 
Número de partición (1-4): 1 
Primer cilindro (1-3880, predeterminado 1): Usando el valor predeterminado 1 
Último cilindro o +tamaño o +tamañoM o +tamañoK (1-3880, predeterminado 3880): 1940 
​Comando
 (m para ayuda): p 
Disco /dev/mmcblk1: 30 GB, 31914983424 bytes, 62333952 sectores 
3880 cilindros, 255 cabezales, 63 sectores/pista 
Unidades: cilindros de 16065 * 512 = 8225280 bytes 
​Device
 Boot StartCHS EndCHS StartLBA Sectores EndLBA Tamaño Id Tipo 
/dev/mmcblk1p1 0,1,1 1023,254,63 63 31166099 31166037 14.8G 83 
Comando
 Linux (m para ayuda): n 
Acción del comando 
   e extendido 
   p partición primaria (1-4) 
p 
Número de partición (1-4): 2 
Primer cilindro (1941-3880, predeterminado 1941): usando el valor predeterminado 1941 
Último cilindro o +tamaño o +tamañoM o +tamañoK (1941-3880, predeterminado 3880): usando el valor predeterminado 3880 
​Comando
 (m para ayuda): p 
Disco /dev/mmcblk1: 30 GB, 31914983424 bytes, 62333952 sectores 
3880 cilindros, 255 cabezas, 63 sectores/pista 
Unidades: cilindros de 16065 * 512 = 8225280 bytes 
​Arranque del dispositivo
 /dev/mmcblk1p1 0,1,1 1023,254,63 63 31166099 31166037 14.8G 83 Comando Linux 4.8G 83 (m para ayuda) : w ## 4. Guarde la nueva partición



5. Prueba de lectura y escritura

Comando de escritura de tarjeta de prueba :SD

[root@RK356X:/]# time dd oflag=direct,nonblock if=/dev/zero of=/dev/mmcblk1p1 bs=1M count=100 
100+0 registros en 
100+0 registros fuera 
104857600 bytes (105 MB, 100 MiB) copiado, 3,4844 s, 30,1 MB/s 
real 0m 3,49s 
usuario 0m 0,00s 
sistema 0m 0,16s

Comando de lectura de tarjeta de prueba :SD

[root@RK356X:/]# time dd iflag=direct,nonblock if=/dev/mmcblk1p1 of=/dev/null bs=1M count=100 
100+0 registros en 
100+0 registros fuera 
104857600 bytes (105 MB, 100 MiB) copiado, 1,65236 s, 63,5 MB/s 
real 0m 1,65s 
usuario 0m 0,00s 
sistema 0m 0,03s

Los atributos y configurados en el comando anterior pueden evitar el sistema de archivos y leer y escribir directamente sin usarlos .iflagoflagcachebuffer cache

Nota: indique el autor y la fuente al reimprimir.

RustDesk suspendió el servicio doméstico Taobao (taobao.com) debido a un fraude desenfrenado, reinició el trabajo de optimización de la versión web, Apple lanzó el chip M4, los estudiantes de secundaria crearon su propio lenguaje de programación de código abierto como una ceremonia de mayoría de edad - Los internautas comentaron: Confiando en La defensa, Yunfeng renunció a Alibaba y planea producir en el futuro el destino para programadores de juegos independientes Visual Studio Code 1.89, según anunció oficialmente Huawei. El ajuste laboral de Yu Chengdong fue clavado en el “FFmpeg Pillar of Shame”. "Hace 15 años, pero hoy tiene que agradecernos: ¿Tencent QQ Video se venga de su vergüenza anterior? La estación espejo de código abierto de la Universidad de Ciencia y Tecnología de Huazhong está oficialmente abierta al acceso a la red externa
{{o.nombre}}
{{m.nombre}}

Supongo que te gusta

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