この記事では、3 つの方法でカード ドライバーをデバッグする方法を紹介します。Linux SD
1.SDカードの紹介
SD Card(Secure Digital Memory Card)
: セキュア デジタル カードは、半導体フラッシュ メモリをベースにした新世代の高速ストレージ デバイスです。
SD
カードの構成は次のとおりです。
以下は、カードの外部ピン、内部レジスタ、スピード グレード、および容量グレードの簡単な概要です。SD
1. 外部端子
SD
このカードは、モード、モード、およびモードの 3 つの伝送モードをサポートします。SPI
1bit SD
4bit SD
実際のプロジェクトでは、主に後者の 2 つのモードをデバッグします。カードには合計 9 つのピンがあり、それらは次のように要約されます。SD
ピン名 | ピンの説明 | 述べる |
---|---|---|
CLK | クロック信号 | |
CMD | コマンド/リプライピン | |
日付0~3 | データケーブル | 1bit SD モード: 、 : カード検出のみを使用します。モード: :カード検出/データ 3DATA0 CD 4bit SD CD/DATA3 |
VDD | 電源 | |
VSS1/2 | 土地 |
2. 内部レジスタ
SD カード関連のレジスタは次のように構成されています。
レジスタ名 | レジスタの説明 |
---|---|
OCR(動作条件レジスタ) | 動作条件レジスタ |
CID(カード識別レジスタ) | カード識別番号レジスター、各カードには固有の識別番号があります |
CSD(カード固有データレジスタ) | データレジスタの記述 |
SCR(SDカードコンフィギュレーションレジスタ) | SDカード構成レジスタ |
RCA(相対カードアドレス) | カードアドレス登録 |
DSR(ドライバーステージレジスター) | ドライバーレベルレジスタ |
3. 速度レベル
データ転送速度に応じて、カードの速度定格の表記が異なります。SD
プロトコル仕様 | 導入 |
---|---|
SD1.0 | 異なる速度レベルを示すために使用されますが、めったに使用されません。X |
SD2.0 | 一般カード(Class2、Class4、Class6)と高速カード(Class10)。 |
SD3.0 | UHSスピードクラス1および3を採用。 |
SD4.0 | UHS-IIを使用する |
4. 容量レベル
SD
カード容量は現在、と をサポートしています。SD
SDHC
SDXC
SDカードの種類 | プロトコル仕様 | 容量 | サポートされているファイル形式 |
---|---|---|---|
SD | SD1.0 | ~2GB | ファット12、16 |
SDHC(SD大容量) | SD2.0 | 2GB~32GB | ファット32 |
SDXC(SD拡張容量) | SD3.0 | 32GB~2TB | exFAT |
2.SDカードのデバッグ
1. 概略図
ドライバーを事前に設定するには、まず回路図を確認します。
下の図はカードスロットとの接続方法を示しています。RK3568
microSD
2. SDカードの設定
RK3568 SD
カード構成ファイル:
1)arch/arm64/boot/dts/rockchip/rk3568.dtsi
sdmmc0: dwmmc@fe2b0000 { 互換性 = "rockchip,rk3568-dw-mshc", "rockchip,rk3288-dw-mshc"; reg = <0x0 0xfe2b0000 0x0 0x4000>;割り込み = <GIC_SPI 98 IRQ_TYPE_LEVEL_HIGH>;最大周波数 = <150000000>;クロック = <&cru HCLK_SDMMC0>、<&cru CLK_SDMMC0>、<&cru SCLK_SDMMC0_DRV>、<&cru SCLK_SDMMC0_SAMPLE>;クロック名 = "biu"、"ciu"、"ciu-drive"、"ciu-sample"; fifo 深さ = <0x100>;リセット = <&cru SRST_SDMMC0>;リセット名 = "リセット";ステータス = "無効"; };
2)arch/arm64/boot/dts/rockchip/rk3568-firefly-core.dtsi
&sdmmc0 { 最大周波数 = <150000000>; SD をサポートします。 バス幅 = <4>; キャップ-mmc-高速; キャップ-SD-高速; WP を無効にする; sd-uhs-sdr104; vmmc-supply = <&vcc3v3_sd>; vqmmc-supply = <&vccio_sd>; pinctrl-names = "デフォルト"; pinctrl-0 = <&sdmmc0_bus4 &sdmmc0_clk &sdmmc0_cmd &sdmmc0_det>; ステータス = "大丈夫"; };
で:
clocks
:カードコントローラのクロックとクロックを示します。SD
driver
sample
max-frequency
:カードの最大動作周波数。さまざまなモードに従って調整されます。SD
supports-sd
:カード機能を示しており、必ず追加する必要があります。そうしないとカードを初期化できません。SD
SD
bus-width
:カードは 4 線式モードを使用します。設定されていない場合、デフォルトは 1 線モードです。SD
cap-mmc-highspeed/cap-sd-highspeed
:対応カード。highspeed
SD
vmmc-supply、vqmmc-supply
:カードの電源ドメイン。SD
SD3.0
スピードモード:
sd-uhs-sdr12: クロック周波数 24M を超えない、信号電圧 1.8V sd-uhs-sdr25: クロック周波数 50M を超えない、信号電圧 1.8V sd-uhs-sdr50: クロック周波数 100M を超えない、信号電圧 1.8V V sd-uhs-ddr50: クロック周波数は 50M を超えず、ダブルエッジ サンプリングを使用、信号電圧 1.8V sd-uhs-sdr104: クロック周波数は 208M を超えず、信号電圧 1.8V
pinctrl-0
:カード構成。SD
pinmux
3.SDカードドライバー
RK3568
ドライバー ファイル: 、主に以下に焦点を当てます: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, ## クロック、合計ライン、電力 を 構成します電源、チップ選択、タイミングなど。execute_tuning = dw_mci_rk3288_execute_tuning, ## 調整ドライバー clk とサンプル clk フェーズ .parse_dt = dw_mci_rk3288_parse_dt, .init = dw_mci_rockchip_init, };
RK3568 SD
コントローラーの使用法、主に以下に焦点を当てます:と。Synopsys IP
dw_mci_rk3288_set_ios()
dw_mci_rk3288_execute_tuning()
システムが起動したら、次のコマンド (ドライバー実装: ) を使用してカードのプロパティを表示できます。SD
drivers/mmc/core/debugfs.c
[root@xiaotianbsp:/]# cat /sys/kernel/debug/mmc1/ios クロック: 150000000 Hz 実際のクロック: 148500000 Hz vdd: 21 (3.3 ~ 3.4 V) バスモード: 2 (プッシュプル) チップセレクト: 0 (ドントケア) パワーモード: 2 (オン) バス幅: 2 (4 ビット) タイミング仕様: 6 (SD UHS SDR104) 信号電圧: 1 (1.80 V) ドライバータイプ: 0 (ドライバータイプ B)
3.SDカードテスト
次のテストはカードに基づいて完了します。SanDisk Ultra 1 32G SD
1.SDカードの検出
システム起動後のカード起動ログは次のようになります。SD
[ 1.225398] dwmmc_rockchip fe2b0000.dwmmc: 位相を 266 に正常に調整しました [ 1.225420] mmc1: アドレス aaaa の新しい超高速 SDR104 SDHC カード [ 1.226456] mmcblk1: mmc1:aaaa SD32G 29.7 GiB [ 1.227643] 1:p1
カードが正常に初期化されなかった場合、次のようなログが表示されます。SD
[ 182.501273] mmc_host mmc1: バス速度 (スロット 0) = 375000Hz (スロット要求 400000Hz、実際の 375000HZ div = 0) [ 182.672282] mmc1: SD カードの初期化中にエラー -123 [ 182.686489] mmc_host mmc1: バス速度 (秒)ロット0) = 375000Hz (スロット要求 300000Hz、実際の 187500HZ div = 1) [ 182.699318] mmc_host mmc1: バス速度 (スロット 0) = 375000Hz (スロット要求 375000Hz、実際の 375000HZ div = 0) [182.717513] mmc1: バス速度 (スロット 0) = 375000Hz (スロット要求 200000Hz、実際の 187500HZ div = 1)
理由:失敗。エラーメッセージの定義 ( ):mmc_sd_init_card()
include/uapi/asm-generic/errno.h
#define ETIMEDOUT 110 /* 接続がタイムアウトしました */ ... #define ENOMEDIUM 123 /* メディアが見つかりません */
2. SDカードレジスタ
次のコマンドを通じて、カード関連のレジスタの値を表示できます。SD
[root@xiaotianbsp:/]# cd /sys/class/mmc_host/mmc1/mmc1:aaaa [root@xiaotianbsp:/sys/devices/platform/fe2b0000.dwmmc/mmc_host/mmc1/mmc1:aaaa]# ls ブロック ドライバー hwrev oemid scr タイプ cid dsr manfid 電源シリアル uevent csd Erase_size 名preferred_erase_size ssr 日付 fwrev ocr rca サブシステム [root@xiaotianbsp:/sys/devices/platform/fe2b0000.dwmmc/mmc_host/mmc1/mmc1:aaaa]# cat cid 03534453443332478554c 4 96d501636f ##その他 レジスターの閲覧方法は同様です
SD
カードの他のパラメータを表示する方法は次のとおりです。
[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 シリアル 0x54c496d5 [root@xiaotianbsp :/sys/devices/platform/fe2b0000.dwmmc/mmc_host/mmc1/mmc1:aaaa]# 猫型 SD
3. マウント/アンマウント
SD
カードパーティションマウントコマンド:
[root@xiaotianbsp:/]# mount -t vfat /dev/mmcblk1p1 /tmp/ [ 244.746983] FAT-fs (mmcblk1p1): utf8 は FAT ファイルシステムに推奨される IO 文字セットではありません。ファイルシステムでは大文字と小文字が区別されます。 [ 244.749331] FAT-fs (mmcblk1p1): ボリュームが適切にアンマウントされませんでした。一部のデータが破損している可能性があります。 fsckを実行してください。 [root@xiaotianbsp:/]# mount ... /dev/mmcblk1p1 on /tmp type vfat (rw,relatime,fmask=0022,dmask=0022,codepage=936,iocharset=utf8,shortname=mixed,errors=remount-ロ)
SD
カードパーティションのアンインストールコマンド:
/dev/mmcblk1p1 をアンマウントします
4. パーティションの作成
コマンドを使用してカード上にパーティションを再作成できます。fdisk
SD
[root@xiaotianbsp:/]# fdisk /dev/mmcblk1 ... コマンド (ヘルプの場合は m): p ## 1. 既存のパーティションを表示します ディスク /dev/mmcblk1: 30 GB、31914983424 バイト、62333952 セクター 3880 シリンダー、255ヘッド、63 セクター/トラック 単位: 16065 * 512 = 8225280 バイトのシリンダーデバイス ブート StartCHS EndCHS StartLBA EndLBA セクター サイズ ID タイプ /dev/mmcblk1p1 0,0,17 1023,254,63 16 62333951 62333936 29.7G c Win95 2 (LBA)コマンド ( m でヘルプ ): d ## 2. パーティションを削除します。 選択したパーティション1 /track単位: 16065 * 512 = 8225280 バイトのシリンダーDevice Boot StartCHS EndCHS StartLBA EndLBA Sectors Size Id TypeCommand ( m for help): n ## 3. 新しいパーティションを作成します。合計 2 つのパーティションが作成されます。コマンド アクション e 拡張 p プライマリ パーティション(1-4) pパーティション番号 (1-4): 1最初のシリンダ (1-3880、デフォルト 1): デフォルト値 1 を使用最後のシリンダ、または +size または +sizeM または +sizeK (1-3880、デフォルト 3880): 1940コマンド(mのためのm):Pディスク/dev/mmcblk1:30 gb、31914983424バイト、62333952セクター3880シリンダー、255ヘッド、63セクター/トラックユニット:16065 * 512 = 8225280 bytes device bo bo bro bro bro bro bro bro bro bo bro bro bro bo bo bo ot bo bo bo buit device buit bytes EndLBA セクター サイズ ID タイプ/dev/mmcblk1p1 0,1,1 1023,254,63 63 31166099 31166037 14.8G 83 Linuxコマンド(ヘルプの場合は m): nコマンド アクション e 拡張 p プライマリ パーティション (1-4 ) pパーティション番号(1-4): 2最初のシリンダー (1941-3880、デフォルト 1941): デフォルト値 1941 を使用します。最後のシリンダー、+size または +sizeM または +sizeK (1941-3880、デフォルト 3880): デフォルト値 3880 を使用します。コマンド(mヘルプ用): pディスク /dev/mmcblk1: 30 GB、31914983424 バイト、62333952 セクター3880 シリンダー、255 ヘッド、63 セクター/トラックユニット: 16065 * 512 = 8225280 バイトのシリンダーデバイスブート StartCHS EndCHS StartLBA EndLBA セクター サイズ ID タイプ/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 8G 83 Linuxコマンド(ヘルプの場合は m) : w ## 4. 新しいパーティションを保存します。
5. 読み書きテスト
テストカード書き込みコマンド:SD
[root@RK356X:/]# time dd oflag=direct,nonblock if=/dev/zero of=/dev/mmcblk1p1 bs=1M count=100 100+0 レコード入力 100+0 レコード出力 104857600 バイト (105 MB、100 MiB) コピー、3.4844 秒、30.1 MB/秒 実数 0 分 3.49 秒 ユーザー 0 分 0.00 秒 システム 0 分 0.16 秒
カード読み取りコマンドのテスト:SD
[root@RK356X:/]# time dd iflag=direct,nonblock if=/dev/mmcblk1p1 of=/dev/null bs=1M count=100 100+0 レコード入力 100+0 レコード出力 104857600 バイト (105 MB、100 MiB) コピー、1.65236 秒、63.5 MB/秒 実数 0分 1.65秒 ユーザー 0分 0.00秒 システム 0分 0.03秒
上記のコマンドで設定されたおよび属性は、ファイル システムを回避し、それらを使用せずに直接読み取りおよび書き込みを行うことができます。iflag
oflag
cache
buffer cache
注:転載する場合は、著者と出典を明記してください。
RustDesk、詐欺横行のため 国内サービス淘宝網(taobao.com)を停止、ウェブバージョンの最適化作業を再開、 アップルがM4チップをリリース、 高校生が成人式として独自のオープンソースプログラミング言語を作成 - ネチズンのコメント:弁護側は、 ユンフェン氏がアリババを辞任し、将来的にはWindowsプラットフォーム上で Visual Studio Code 1.89を開発する予定であると、 独立系ゲームプログラマーの目標となる Yu Chengdong氏の雇用調整が 「FFmpegの恥の柱」に釘付けになったと正式に発表した。15年前、しかし今日彼は私たちに感謝しなければなりません - Tencent QQ Videoは以前の恥を晴らしますか?華中科技大学のオープンソースミラーステーションが外部ネットワークアクセスに正式にオープン