Cet article explique comment déboguer les pilotes de carte de trois manières.Linux SD
1. Présentation de la carte SD
SD Card(Secure Digital Memory Card)
: La carte numérique sécurisée est une nouvelle génération de dispositif de stockage à haut débit basé sur une mémoire flash à semi-conducteur.
SD
La structure de la carte est la suivante :
Ce qui suit est un bref résumé des broches externes de la carte, des registres internes, du niveau de vitesse et du niveau de capacité.SD
1. Broche externe
SD
La carte prend en charge trois modes de transmission : mode, mode et mode.SPI
1bit SD
4bit SD
Dans le projet actuel, je débogue principalement les deux derniers modes. La carte possède un total de 9 broches, qui se résument comme suit :SD
Nom de la broche | Description de la broche | Remarque |
---|---|---|
CLK | signal d'horloge | |
CMD | broche de commande/réponse | |
DATE0 ~ 3 | câble de données | 1bit SD Mode : Utilisation uniquement , : détection de carte. Mode : Détection de carte/Données 3DATA0 CD 4bit SD CD/DATA3 |
VDD | source de courant | |
VSS1/2 | atterrir |
2. Registre interne
Les registres liés à la carte SD sont organisés comme suit :
Nom du registre | Description du registre |
---|---|
OCR (registre des conditions d'exploitation) | registre des conditions de fonctionnement |
CID (registre d'identification de carte) | Registre des numéros d'identification de la carte, chaque carte a un numéro d'identification unique |
CSD (registre de données spécifiques à la carte) | Décrire le registre de données |
SCR (registre de configuration de la carte SD) | Registre de configuration de la carte SD |
RCA (adresse relative de la carte) | registre d'adresses de carte |
DSR (registre des étapes du pilote) | registre du niveau conducteur |
3. Niveau de vitesse
En fonction de la vitesse de transfert des données, les cartes ont différentes représentations d'indice de vitesse.SD
Spécifications du protocole | Introduction |
---|---|
SD1.0 | Utilisé pour indiquer différents niveaux de vitesse, rarement utilisé.X |
SD2.0 | Cartes ordinaires (Class2, Class4, Class6) et cartes à grande vitesse (Class10). |
SD3.0 | Utilise les classes de vitesse UHS 1 et 3. |
SD4.0 | Utiliser UHS-II |
4. Niveau de capacité
SD
La capacité de la carte prend actuellement en charge : , et .SD
SDHC
SDXC
Type de carte SD | Spécifications du protocole | Capacité | Formats de fichiers pris en charge |
---|---|---|---|
Dakota du Sud | SD1.0 | ~2 Go | GRAISSES 12,16 |
SDHC (SD haute capacité) | SD2.0 | 2 Go ~ 32 Go | GRAISSE 32 |
SDXC (capacité étendue SD) | SD3.0 | 32 Go ~ 2 To | exFAT |
2. Débogage de la carte SD
1. Diagramme schématique
Pour prédéfinir le pilote, regardez d’abord le diagramme schématique.
L'image ci-dessous montre la méthode de connexion avec l'emplacement pour carte .RK3568
microSD
2. Configuration de la carte SD
RK3568 SD
Fichier de configuration de la carte :
1)arch/arm64/boot/dts/rockchip/rk3568.dtsi
sdmmc0 : dwmmc@fe2b0000 { compatible = "rockchip,rk3568-dw-mshc", "rockchip,rk3288-dw-mshc" ; reg = <0x0 0xfe2b0000 0x0 0x4000> ; interruptions = <GIC_SPI 98 IRQ_TYPE_LEVEL_HIGH> ; fréquence maximale = <150000000> ; horloges = <&cru HCLK_SDMMC0>, <&cru CLK_SDMMC0>, <&cru SCLK_SDMMC0_DRV>, <&cru SCLK_SDMMC0_SAMPLE>; noms d'horloge = "biu", "ciu", "ciu-drive", "ciu-sample" ; fifo-profondeur = <0x100> ; réinitialise = <&cru SRST_SDMMC0>; réinitialiser les noms = "réinitialiser" ; statut = "désactivé" ; } ;
2)arch/arm64/boot/dts/rockchip/rk3568-firefly-core.dtsi
&sdmmc0 { fréquence maximale = <150000000>; prend en charge-sd ; largeur du bus = <4> ; cap-mmc-haute vitesse ; cap-sd-haute vitesse ; désactiver-wp ; sd-uhs-sdr104 ; vmmc-supply = <&vcc3v3_sd>; vqmmc-supply = <&vccio_sd>; pinctrl-names = "par défaut" ; pinctrl-0 = <&sdmmc0_bus4 &sdmmc0_clk &sdmmc0_cmd &sdmmc0_det>; statut = « ok » ; } ;
dans:
clocks
: Indique l'horloge du contrôleur de carte et l'horloge.SD
driver
sample
max-frequency
: La fréquence maximale de fonctionnement de la carte, ajustée selon différents modes.SD
supports-sd
: Indique une fonction de carte et doit être ajouté. Sinon, la carte ne pourra pas être initialisée.SD
SD
bus-width
: La carte utilise le mode 4 fils. S'il n'est pas configuré, la valeur par défaut est le mode 1 fil.SD
cap-mmc-highspeed/cap-sd-highspeed
: Cartes prises en charge .highspeed
SD
vmmc-supply、vqmmc-supply
: Domaine de puissance de la carte.SD
SD3.0
Mode vitesse :
sd-uhs-sdr12 : la fréquence d'horloge ne dépasse pas 24 M, tension du signal 1,8 V sd-uhs-sdr25 : la fréquence d'horloge ne dépasse pas 50 M, tension du signal 1,8 V sd-uhs-sdr50 : la fréquence d'horloge ne dépasse pas 100 M, tension du signal 1,8 V sd-uhs-ddr50 : la fréquence d'horloge ne dépasse pas 50 M, utilise un échantillonnage à double bord, tension du signal 1,8 V sd-uhs-sdr104 : la fréquence d'horloge ne dépasse pas 208 M, tension du signal 1,8 V
pinctrl-0
: Configuration de la carte .SD
pinmux
3. Pilote de carte SD
RK3568
Fichier du pilote : , se concentre principalement sur :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, ## Configurer l'horloge, la ligne totale, l'alimentation, la sélection de la puce, , etc.execute_tuning = dw_mci_rk3288_execute_tuning, ## Ajuster pilote clk et exemple de phase clk .parse_dt = dw_mci_rk3288_parse_dt, .init = dw_mci_rockchip_init, } ;
RK3568 SD
Utilisation du contrôleur , principalement axée sur : et .Synopsys IP
dw_mci_rk3288_set_ios()
dw_mci_rk3288_execute_tuning()
Après le démarrage du système, vous pouvez afficher les propriétés de la carte via la commande suivante (implémentation du pilote : ) :SD
drivers/mmc/core/debugfs.c
[root@xiaotianbsp:/]# cat /sys/kernel/debug/mmc1/ios horloge : 150000000 Hz horloge réelle : 148500000 Hz vdd : 21 (3,3 ~ 3,4 V) mode bus : 2 (push-pull) sélection de puce : 0 (ne s'en soucie pas) mode d'alimentation : 2 (on) largeur du bus : 2 (4 bits) spécifications de synchronisation : 6 (sd uhs SDR104) tension du signal : 1 (1,80 V) type de pilote : 0 (type de pilote B)
3. Test de la carte SD
Le test suivant est effectué en fonction de la carte.SanDisk Ultra 1 32G SD
1. Détection de la carte SD
Après le démarrage du système, le journal de démarrage de la carte est le suivant :SD
[ 1.225398] dwmmc_rockchip fe2b0000.dwmmc : phase réglée avec succès sur 266 [ 1.225420] mmc1 : nouvelle carte SDHC SDR104 ultra haute vitesse à l'adresse aaaa [ 1.226456] mmcblk1 : mmc1:aaaa SD32G 29,7 Gio [ 1.227643] lk1 : p1
Si la carte n'est pas initialisée normalement, le journal suivant apparaîtra :SD
[ 182.501273] mmc_host mmc1 : vitesse du bus (slot 0) = 375 000 Hz (slot requis 400 000 Hz, réel 375 000 Hz div = 0) [ 182.672282] mmc1 : erreur -123 lors de l'initialisation de la carte SD [ 182.686489] mmc_host mmc1 : vitesse du bus (slot 0) = 375 000 Hz (emplacement requis 300 000 Hz, div réel de 187 500 Hz = 1) [ 182.699318] mmc_host mmc1 : Vitesse du bus (emplacement 0) = 375 000 Hz (emplacement requis 375 000 Hz, div réel de 375 000 Hz = 0) [ 182.717513] mmc_host mmc 1 : Vitesse du bus (emplacement 0) = 375 000 Hz (emplacement requis 200 000 Hz, div réel 187 500 Hz = 1)
Raison : Échec. Définition du message d'erreur ( ) :mmc_sd_init_card()
include/uapi/asm-generic/errno.h
#define ETIMEDOUT 110 /* Délai de connexion expiré */ ... #define ENOMEDIUM 123 /* Aucun support trouvé */
2. Registre de la carte SD
Grâce à la commande suivante, vous pouvez afficher les valeurs des registres liés à la carte.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 type cid dsr manfid puissance série uevent csd effacer_size nom préféré_erase_size ssr date fwrev ocr rca sous-système [root@xiaotianbsp:/sys/devices/platform/fe2b0000.dwmmc/mmc_host/mmc1/mmc1:aaaa]# cat cid 03534453443332478554c 496d501636f ## Autres La méthode de visualisation du registre est similaire à
SD
La méthode pour visualiser les autres paramètres de la carte est la suivante :
[root@xiaotianbsp:/sys/devices/platform/fe2b0000.dwmmc/mmc_host/mmc1/mmc1:aaaa]# cat erasable_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]# nom de chat SD32G [root@xiaotianbsp:/sys/devices/ platform/fe2b0000.dwmmc/mmc_host/mmc1/mmc1:aaaa]# chat oemid 0x5344 [root@xiaotianbsp:/sys/devices/platform/fe2b0000.dwmmc/mmc_host/mmc1/mmc1:aaaa]# cat série 0x54c496d5 [root@xiaotianbsp :/sys/devices/platform/fe2b0000.dwmmc/mmc_host/mmc1/mmc1:aaaa]# type de chat SD
3. Monter/démonter
SD
Commande de montage de partition de carte :
[root@xiaotianbsp:/]# mount -t vfat /dev/mmcblk1p1 /tmp/ [ 244.746983] FAT-fs (mmcblk1p1) : utf8 n'est pas un jeu de caractères IO recommandé pour les systèmes de fichiers FAT, le système de fichiers sera sensible à la casse ! [ 244.749331] FAT-fs (mmcblk1p1) : le volume n'a pas été correctement démonté. Certaines données peuvent être corrompues. Veuillez exécuter fsck. [root@xiaotianbsp:/]# mount ... /dev/mmcblk1p1 sur /tmp tapez vfat (rw,relatime,fmask=0022,dmask=0022,codepage=936,iocharset=utf8,shortname=mixed,errors=remount- ro)
SD
Commande de désinstallation de partition de carte :
umount /dev/mmcblk1p1
4. Créer des partitions
Les partitions peuvent être recréées sur la carte à l'aide de la commande.fdisk
SD
[root@xiaotianbsp:/]# fdisk /dev/mmcblk1 ... Commande (m pour aide) : p ## 1. Afficher la partition existante Disque /dev/mmcblk1 : 30 Go, 31914983424 octets, 62333952 secteurs 3880 cylindres, 255 têtes, 63 secteurs/piste Unités : cylindres de 16065 * 512 = 8225280 octetsDevice Boot StartCHS EndCHS StartLBA EndLBA Secteurs Taille Id Type /dev/mmcblk1p1 0,0,17 1023,254,63 16 62333951 62333936 29.7G c Win95 FAT32 ( BA) Commande (m pour aide) : d ## 2. Supprimer la partition Partition sélectionnée 1 Commande (m pour aide) : p Disque /dev/mmcblk1 : 30 Go, 31914983424 octets, 62333952 secteurs 3880 cylindres, 255 têtes, 63 secteurs /track Unités : cylindres de 16065 * 512 = 8225280 octetsDevice Boot StartCHS EndCHS StartLBA EndLBA Sectors Size Id TypeCommand ( m pour aide) : n ## 3. Créez une nouvelle partition, un total de 2 partitions sont crééesAction de commande e partition primaire p étendue (1-4) p Numéro de partition (1-4) : 1 Premier cylindre (1-3880, par défaut 1) : Utilisation de la valeur par défaut 1 Dernier cylindre ou +size ou +sizeM ou +sizeK (1-3880, par défaut 3880) : 1940 Commande (m pour aide) : p Disque /dev/mmcblk1 : 30 Go, 31914983424 octets, 62333952 secteurs 3880 cylindres, 255 têtes, 63 secteurs/piste Unités : cylindres de 16065 * 512 = 8225280 octets Device Boot StartCHS EndCHS StartLBA Secteurs EndLBA Taille Id Type /dev/mmcblk1p1 0,1,1 1023,254,63 63 31166099 31166037 14.8G 83 Commande Linux (m pour aide) : n Action de commande e partition principale p étendue (1-4) p Numéro de partition (1-4) : 2 Premier cylindre (1941-3880, par défaut 1941) : en utilisant la valeur par défaut 1941 Dernier cylindre ou +size ou +sizeM ou +sizeK (1941-3880, par défaut 3880) : en utilisant la valeur par défaut 3880 Commande (m pour obtenir de l'aide) : p Disque /dev/mmcblk1 : 30 Go, 31914983424 octets, 62333952 secteurs 3880 cylindres, 255 têtes, 63 secteurs/piste Unités : cylindres de 16065 * 512 = 8225280 octets Device Boot StartCHS EndCHS StartLBA EndLBA Sectors Size Id Type /dev/mmcblk1p1 0,1,1 1023,254,63 63 31166099 31166037 14.8G 83 Linux /dev/mmcblk1p2 1023,254,63 1023,254,63 31166100 62332199 3116 6100 Commande Linux 4.8G 83 (m pour aide) : w ## 4. Enregistrez la nouvelle partition
5. Test de lecture et d'écriture
Commande d'écriture de la carte de test :SD
[root@RK356X:/]# time dd oflag=direct,nonblock if=/dev/zero of=/dev/mmcblk1p1 bs=1M count=100 100+0 enregistrements dans 100+0 enregistrements sur 104857600 octets (105 Mo, 100 MiB) copié, 3,4844 s, 30,1 Mo/s réel 0m 3,49s utilisateur 0m 0,00s sys 0m 0,16s
Commande de lecture de carte test :SD
[root@RK356X:/]# time dd iflag=direct,nonblock if=/dev/mmcblk1p1 of=/dev/null bs=1M count=100 100+0 enregistrements dans 100+0 enregistrements sur 104857600 octets (105 Mo, 100 MiB) copié, 1,65236 s, 63,5 Mo/s réel 0m 1,65s utilisateur 0m 0,00s sys 0m 0,03s
Les attributs et configurés dans la commande ci-dessus peuvent éviter le système de fichiers et lire et écrire directement sans les utiliser .iflag
oflag
cache
buffer cache
Remarque : Veuillez indiquer l’auteur et la source lors de la réimpression.
RustDesk a suspendu le service national Taobao (taobao.com) en raison d'une fraude généralisée, a repris le travail d'optimisation de la version Web, Apple a publié la puce M4, les lycéens ont créé leur propre langage de programmation open source en guise de cérémonie de passage à l'âge adulte - Les internautes ont commenté : S'appuyer sur Selon la défense, Yunfeng a démissionné d'Alibaba et envisage de produire à l'avenir la destination des programmeurs de jeux indépendants Visual Studio Code 1.89, a été officiellement annoncé par Huawei. L'ajustement du poste de Yu Chengdong a été cloué au « pilier de la honte FFmpeg ». « Il y a 15 ans, mais aujourd'hui il doit nous remercier - Tencent QQ Video venge sa honte précédente ? La station miroir open source de l'Université des sciences et technologies de Huazhong est officiellement ouverte à l'accès au réseau externe