Carte SD du noyau Linux

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.

SDLa 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

SDLa carte prend en charge trois modes de transmission : mode, mode et mode.SPI1bit SD4bit 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 SDMode : Utilisation uniquement , : détection de carte. Mode : Détection de carte/Données 3DATA0CD4bit SDCD/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é

SDLa capacité de la carte prend actuellement en charge : , et .SDSDHCSDXC

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

2. Configuration de la carte SD

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

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

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

vmmc-supply、vqmmc-supply: Domaine de puissance de la carte.SD

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

3. Pilote de carte SD

RK3568Fichier 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 SDUtilisation du contrôleur , principalement axée sur : et .Synopsys IPdw_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 : ) :SDdrivers/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 à

SDLa 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

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

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

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

Je suppose que tu aimes

Origine my.oschina.net/u/4702401/blog/5566478
conseillé
Classement