Linux-Kernel-SD-Karte

In diesem Artikel wird beschrieben, wie Sie Kartentreiber auf drei Arten debuggen können.Linux SD

1. Einführung in die SD-Karte

SD Card(Secure Digital Memory Card): Die sichere digitale Karte ist eine neue Generation von Hochgeschwindigkeitsspeichergeräten, die auf Halbleiter-Flash-Speichern basieren.

SDDer Kartenaufbau ist wie folgt:

Im Folgenden finden Sie eine kurze Zusammenfassung der externen Pins, internen Register, Geschwindigkeits- und Kapazitätsgrade der Karte.SD

1. Externer Pin

SDDie Karte unterstützt drei Übertragungsmodi: Modus, Modus und Modus.SPI1bit SD4bit SD

Im eigentlichen Projekt debugge ich hauptsächlich die beiden letztgenannten Modi. Die Karte verfügt über insgesamt 9 Pins, die wie folgt zusammengefasst sind:SD

Pin-Name Pin-Beschreibung Anmerkung
CLK Taktsignal  
CMD Befehls-/Antwort-Pin  
DATUM0 ~ 3 Datenkabel 1bit SDModus: Nur verwenden : Kartenerkennung. Modus: Kartenerkennung/Daten 3DATA0CD4bit SDCD/DATA3
VDD Stromversorgung  
VSS1/2 Land  

2. Internes Register

Die SD-Karten-bezogenen Register sind wie folgt organisiert:

Registrieren Sie den Namen Beschreibung des Registers
OCR (Betriebsbedingungenregister) Betriebszustandsregister
CID (Kartenidentifikationsregister) Kartenidentifikationsnummernregister, jede Karte hat eine eindeutige Identifikationsnummer
CSD (Kartenspezifisches Datenregister) Beschreiben Sie das Datenregister
SCR (SD-Karten-Konfigurationsregister) Konfigurationsregister der SD-Karte
RCA (relative Kartenadresse) Kartenadressregister
DSR (Fahrerstufenregister) Fahrerebenenregister

3. Geschwindigkeitsstufe

Abhängig von der Datenübertragungsgeschwindigkeit weisen Karten unterschiedliche Geschwindigkeitsbewertungsdarstellungen auf.SD

Protokollspezifikationen Einführung
SD1.0 Wird zur Anzeige unterschiedlicher Geschwindigkeitsstufen verwendet und wird selten verwendet.X
SD2.0 Gewöhnliche Karten (Klasse 2, Klasse 4, Klasse 6) und Hochgeschwindigkeitskarten (Klasse 10).
SD3.0 Verwendet UHS-Geschwindigkeitsklassen 1 und 3.
SD4.0 Verwendung von UHS-II

4. Kapazitätsniveau

SDDie Kartenkapazität unterstützt derzeit: , und .SDSDHCSDXC

SD-Kartentyp Protokollspezifikationen Kapazität Unterstützte Dateiformate
SD SD1.0 ~2GB FETT 12,16
SDHC (SD mit hoher Kapazität) SD2.0 2 GB ~ 32 GB FETT 32
SDXC (SD eXtended Capacity) SD3.0 32 GB ~ 2 TB exFAT

 

2. Debuggen der SD-Karte

1. Schematische Darstellung

Um den Treiber voreinzustellen, schauen Sie sich zunächst das schematische Diagramm an.

Das Bild unten zeigt die Verbindungsmethode mit dem Kartensteckplatz .RK3568microSD

2. SDCard-Konfiguration

RK3568 SDKartenkonfigurationsdatei:

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

    sdmmc0: dwmmc@fe2b0000 { 
kompatibel = "rockchip,rk3568-dw-mshc",      "rockchip,rk3288-dw-mshc"; reg = <0x0 0xfe2b0000 0x0 0x4000>; interrupts = <GIC_SPI 98 IRQ_TYPE_LEVEL_HIGH>; maximale Frequenz = <150000000>; clocks = <&cru HCLK_SDMMC0>, <&cru CLK_SDMMC0>, <&cru SCLK_SDMMC0_DRV>, <&cru SCLK_SDMMC0_SAMPLE>; Clock-Names = „biu“, „ciu“, „ciu-drive“, „ciu-sample“; fifo-tiefe = <0x100>; resets = <&cru SRST_SDMMC0>; reset-names = "reset"; Status = „deaktiviert“; };        
            
        
        
        
        
            
        
        
        
        
        
    

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

    &sdmmc0 { 
    max-frequenz = <150000000>; 
    unterstützt-sd; 
    Busbreite = <4>; 
    cap-mmc-highspeed; 
    cap-sd-highspeed; 
    deaktivieren-wp; 
    sd-uhs-sdr104; 
    vmmc-supply = <&vcc3v3_sd>; 
    vqmmc-supply = <&vccio_sd>; 
    pinctrl-names = "default"; 
    pinctrl-0 = <&sdmmc0_bus4 &sdmmc0_clk &sdmmc0_cmd &sdmmc0_det>; 
    status = "okay"; 
};

In:

clocks: Zeigt die Uhr des Kartencontrollers und die Uhr an.SDdriversample

max-frequency: Die maximale Betriebsfrequenz der Karte, angepasst an verschiedene Modi.SD

supports-sd: Zeigt eine Kartenfunktion an und muss hinzugefügt werden. Andernfalls kann die Karte nicht initialisiert werden.SDSD

bus-width: Die Karte verwendet den 4-Draht-Modus. Wenn nicht konfiguriert, ist die Standardeinstellung der 1-Draht-Modus.SD

cap-mmc-highspeed/cap-sd-highspeed:Unterstützte Karten .highspeedSD

vmmc-supply、vqmmc-supply: Kartenleistungsdomäne.SD

SD3.0Geschwindigkeitsmodus:

sd-uhs-sdr12: Taktfrequenz überschreitet nicht 24 M, Signalspannung 1,8 V 
sd-uhs-sdr25: Taktfrequenz überschreitet nicht 50 M, Signalspannung 1,8 V 
sd-uhs-sdr50: Taktfrequenz überschreitet nicht 100 M, Signalspannung 1,8 V 
sd-uhs-ddr50: Taktfrequenz überschreitet nicht 50 M, verwendet Double-Edge-Sampling, Signalspannung 1,8 V 
sd-uhs-sdr104: Taktfrequenz überschreitet nicht 208 M, Signalspannung 1,8 V

pinctrl-0: Kartenkonfiguration .SDpinmux

3. SDCard-Treiber

RK3568Treiberdatei: konzentriert sich hauptsächlich auf: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, ## Konfigurieren Sie Uhr, Gesamtleitung, Stromversorgung, Chipauswahl , Timing usw.execute_tuning                     
    = dw_mci_rk3288_execute_tuning, ## Anpassen Treiber-CLK und Beispiel-CLK-Phase      
    .parse_dt = dw_mci_rk3288_parse_dt,        
    .init = dw_mci_rockchip_init,            
};

RK3568 SDDie Controller-Nutzung konzentriert sich hauptsächlich auf: und .Synopsys IPdw_mci_rk3288_set_ios()dw_mci_rk3288_execute_tuning()

Nach dem Systemstart können Sie die Karteneigenschaften mit dem folgenden Befehl anzeigen (Treiberimplementierung:) :SDdrivers/mmc/core/debugfs.c

[root@xiaotianbsp:/]# cat /sys/kernel/debug/mmc1/ios 
Takt: 150000000 Hz 
tatsächlicher Takt: 148500000 Hz 
vdd: 21 (3,3 ~ 3,4 V) 
Busmodus: 2 (Push-Pull) 
Chipauswahl: 0 (egal) 
Energiemodus: 2 (ein) 
Busbreite: 2 (4 Bits) 
Timing-Spezifikation: 6 (sd uhs SDR104) 
Signalspannung: 1 (1,80 V) 
Treibertyp: 0 (Treibertyp B)

 

3. SDCard-Test

Der folgende Test wird anhand der Karte durchgeführt.SanDisk Ultra 1 32G SD

1. SD-Kartenerkennung

Nach dem Systemstart lautet das Startprotokoll der Karte wie folgt:SD


[ 1.225398 ] dwmmc_rockchip fe2b0000.dwmmc: Phase erfolgreich auf 266 [ 1.225420] abgestimmt 1: 
p1

Wenn die Karte nicht normal initialisiert wird, erscheint das folgende Protokoll:SD

[ 182.501273] mmc_host mmc1: Busgeschwindigkeit (Steckplatz 0) = 375.000 Hz (Steckplatzanforderung 400.000 Hz, tatsächlich 375.000 Hz div = 0) 
[ 182.672282] mmc1: Fehler -123 beim Initialisieren der SD-Karte 
[ 182.686489] mmc_host mmc1: Busgeschwindigkeit (Steckplatz 0 ) = 375000 Hz (Steckplatzanforderung 300000 Hz, tatsächlich 187500 Hz Div = 1) 
[ 182,699318] mmc_host mmc1: Busgeschwindigkeit (Steckplatz 0) = 375000 Hz (Steckplatzanforderung 375000 Hz, tatsächlich 375000 Hz Div = 0) 
[ 182,717513] mmc_host c1: Busgeschwindigkeit (Steckplatz 0) = 375.000 Hz (Steckplatzanforderung 200.000 Hz, tatsächlich 187.500 Hz Div = 1)

Grund: Fehler. Definition der Fehlermeldung ( ):mmc_sd_init_card()include/uapi/asm-generic/errno.h

#define ETIMEDOUT 110 /* Verbindungszeitüberschreitung */ 
... 
#define ENOMEDIUM 123 /* Kein Medium gefunden */

2. SD-Kartenregister

Mit dem folgenden Befehl können Sie die Werte kartenbezogener Register anzeigen.SD

[root@xiaotianbsp:/]# cd /sys/class/mmc_host/mmc1/mmc1:aaaa 
[root@xiaotianbsp:/sys/devices/platform/fe2b0000.dwmmc/mmc_host/mmc1/mmc1:aaaa]# ls- 
Blocktreiber hwrev oemid scr type 
cid dsr manfid power serial uevent 
csd erase_size name favorite_erase_size ssr 
date fwrev ocr rca subsystem 
[root@xiaotianbsp:/sys/devices/platform/fe2b0000.dwmmc/mmc_host/mmc1/mmc1:aaaa]# cat cid. 
03534453443332478 
554c 496d501636f ## Andere Die Methode zur Registeranzeige ähnelt

SDDie Methode zum Anzeigen anderer Parameter der Karte ist wie folgt:

[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]# cat name 
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]# Cat-Typ 
SD

3. Ein-/Aushängen

SDBefehl zum Mounten der Kartenpartition:

[root@xiaotianbsp:/]# mount -t vfat /dev/mmcblk1p1 /tmp/ 
[ 244.746983] FAT-fs (mmcblk1p1): utf8 ist kein empfohlener E/A-Zeichensatz für FAT-Dateisysteme, das Dateisystem unterscheidet zwischen Groß- und Kleinschreibung! 
[ 244.749331] FAT-fs (mmcblk1p1): Volume wurde nicht ordnungsgemäß ausgehängt. Einige Daten sind möglicherweise beschädigt. Bitte führen Sie fsck aus. 
[root@xiaotianbsp:/]# mount 
... 
/dev/mmcblk1p1 auf /tmp type vfat (rw,relatime,fmask=0022,dmask=0022,codepage=936,iocharset=utf8,shortname=mixed,errors=remount- ro)

SDBefehl zur Deinstallation der Kartenpartition:

umount /dev/mmcblk1p1

4. Partitionen erstellen

Mit dem Befehl können Partitionen auf der Karte neu erstellt werden .fdiskSD

[root@xiaotianbsp:/]# fdisk /dev/mmcblk1 
... 
Befehl (m für Hilfe): p ## 1. Sehen Sie sich die vorhandene Partition an. 
Disk /dev/mmcblk1: 30 GB, 31914983424 Bytes, 62333952 Sektoren 
3880 Zylinder, 255 Köpfe, 63 Sektoren/Spur 
Einheiten: Zylinder von 16065 * 512 = 8225280 BytesDevice 
Boot
 StartCHS EndCHS StartLBA EndLBA Sektoren Größe Id Typ 
/dev/mmcblk1p1 0,0,17 1023,254,63 16 62333951 62333936 29,7G c FAT32 (LBA) 
​Befehl
 (m für Hilfe): d ## 2. Löschen Sie die Partition. 
Ausgewählte Partition 1 
​Befehl
 (m für Hilfe): p 
Festplatte /dev/mmcblk1: 30 GB, 31914983424 Bytes, 62333952 Sektoren 
3880 Zylinder, 255 Köpfe, 63 Sektoren /track 
Einheiten: Zylinder von 16065 * 512 = 8225280 BytesDevice 
Boot
 StartCHS EndCHS StartLBA EndLBA Sectors Size Id TypeCommand 
(
 m für Hilfe): n ## 3. Erstellen Sie eine neue Partition, insgesamt werden 2 Partitionen erstelltBefehlsaktion 
e 
   erweiterte 
   p primäre Partition (1-4) 
p 
Partitionsnummer (1-4): 1 
Erster Zylinder (1-3880, Standard 1): Standardwert verwenden 1 
Letzter Zylinder oder +Größe oder +GrößeM oder +GrößeK (1-3880, Standard 3880): 1940 
​Befehl
 (m für Hilfe): p 
Disk /dev/mmcblk1: 30 GB, 31914983424 Bytes, 62333952 Sektoren 
3880 Zylinder, 255 Köpfe, 63 Sektoren/Spur 
Einheiten: Zylinder von 16065 * 512 = 8225280 Bytes 
​Device
 Boot StartCHS EndCHS StartLBA EndLBA Sektoren Größe ID Typ 
/dev/mmcblk1p1 0,1,1 1023,254,63 63 31166099 31166037 14.8G 83 Linux 
​Befehl
 (m für Hilfe): n 
Befehlsaktion 
   e erweitert 
   p primäre Partition (1-4) 
p 
Partitionsnummer (1-4): 2 
Erster Zylinder (1941-3880, Standard 1941): Standardwert 1941 verwenden 
Letzter Zylinder oder +Größe oder +GrößeM oder +GrößeK (1941-3880, Standard 3880): Standardwert 3880 verwenden 
​Befehl
 (m für Hilfe): p 
Disk /dev/mmcblk1: 30 GB, 31914983424 Bytes, 62333952 Sektoren 
3880 Zylinder, 255 Köpfe, 63 Sektoren/Spur 
Einheiten: Zylinder von 16065 * 512 = 8225280 Bytes 
​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. 14.8G 83 Linux- 
Befehl
 (m für Hilfe) :w ## 4. Speichern Sie die neue Partition

5. Lese- und Schreibtest

Befehl zum Schreiben der Testkarte :SD

[root@RK356X:/]# time dd oflag=direct,nonblock if=/dev/zero of=/dev/mmcblk1p1 bs=1M count=100 
100+0 Datensätze ein 
100+0 Datensätze aus 
104857600 Bytes (105 MB, 100 MiB) kopiert, 3,4844 s, 30,1 MB/s 
real 0 m 3,49 s 
Benutzer 0 m 0,00 s 
sys 0 m 0,16 s

Befehl zum Testen der Kartenlesung:SD

[root@RK356X:/]# time dd iflag=direct,nonblock if=/dev/mmcblk1p1 of=/dev/null bs=1M count=100 
100+0 Datensätze in 
100+0 Datensätze aus 
104857600 Bytes (105 MB, 100 MiB) kopiert, 1,65236 s, 63,5 MB/s 
real 0 m 1,65 s 
Benutzer 0 m 0,00 s 
sys 0 m 0,03 s

Die im obigen Befehl konfigurierten und- Attribute können das Dateisystem umgehen und direkt lesen und schreiben, ohne sie zu verwenden .iflagoflagcachebuffer cache

Hinweis: Bitte geben Sie beim Nachdruck den Autor und die Quelle an.

RustDesk hat den inländischen Dienst Taobao (taobao.com) aufgrund von grassierendem Betrug eingestellt, die Arbeit zur Optimierung der Webversion wurde wieder aufgenommen, Apple veröffentlichte den M4-Chip, High-School-Schüler erstellten im Rahmen einer Coming-of-Age-Zeremonie ihre eigene Open-Source-Programmiersprache – Netizens kommentierten: Verlassen auf Die Verteidigung, Yunfeng sei von Alibaba zurückgetreten und plane, in Zukunft das Ziel für unabhängige Spieleprogrammierer Visual Studio Code 1.89 zu produzieren, wurde von Huawei offiziell bekannt gegeben. Yu Chengdongs Jobanpassung wurde an die „FFmpeg-Säule der Schande“ genagelt „Vor 15 Jahren, aber heute muss er sich bei uns bedanken – Tencent QQ Video rächt seine bisherige Schande?“ Die Open-Source-Spiegelstation der Huazhong University of Science and Technology ist offiziell für den externen Netzwerkzugriff geöffnet
{{o.name}}
{{m.name}}

Ich denke du magst

Origin my.oschina.net/u/4702401/blog/5566478
Empfohlen
Rangfolge