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.
SD
Der 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
SD
Die Karte unterstützt drei Übertragungsmodi: Modus, Modus und Modus.SPI
1bit SD
4bit 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 SD Modus: Nur verwenden : Kartenerkennung. Modus: Kartenerkennung/Daten 3DATA0 CD 4bit SD CD/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
SD
Die Kartenkapazität unterstützt derzeit: , und .SD
SDHC
SDXC
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 .RK3568
microSD
2. SDCard-Konfiguration
RK3568 SD
Kartenkonfigurationsdatei:
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.SD
driver
sample
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.SD
SD
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 .highspeed
SD
vmmc-supply、vqmmc-supply
: Kartenleistungsdomäne.SD
SD3.0
Geschwindigkeitsmodus:
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 .SD
pinmux
3. SDCard-Treiber
RK3568
Treiberdatei: 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 SD
Die Controller-Nutzung konzentriert sich hauptsächlich auf: und .Synopsys IP
dw_mci_rk3288_set_ios()
dw_mci_rk3288_execute_tuning()
Nach dem Systemstart können Sie die Karteneigenschaften mit dem folgenden Befehl anzeigen (Treiberimplementierung:) :SD
drivers/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
SD
Die 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
SD
Befehl 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)
SD
Befehl zur Deinstallation der Kartenpartition:
umount /dev/mmcblk1p1
4. Partitionen erstellen
Mit dem Befehl können Partitionen auf der Karte neu erstellt werden .fdisk
SD
[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 .iflag
oflag
cache
buffer 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