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.
SD
La 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
SD
La tarjeta admite tres modos de transmisión: modo, modo y modo.SPI
1bit SD
4bit 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 SD Modo: Usar sólo , : detección de tarjeta. Modo: :Detección de tarjeta/Datos 3DATA0 CD 4bit SD CD/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
SD
La capacidad de la tarjeta actualmente admite: , y .SD
SDHC
SDXC
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 .RK3568
microSD
2. Configuración de la tarjeta SD
RK3568 SD
Archivo 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.SD
driver
sample
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.SD
SD
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 .highspeed
SD
vmmc-supply、vqmmc-supply
: Dominio de poder de la tarjeta.SD
SD3.0
Modo 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 .SD
pinmux
3. Controlador de tarjeta SD
RK3568
Archivo 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 SD
El uso del controlador se centra principalmente en: y .Synopsys IP
dw_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:) :SD
drivers/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
SD
El 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
SD
Comando 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)
SD
Comando 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.fdisk
SD
[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 .iflag
oflag
cache
buffer 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