LinuxカーネルSDカード

この記事では、3 つの方法でカード ドライバーをデバッグする方法を紹介します。Linux SD

1.SDカードの紹介

SD Card(Secure Digital Memory Card): セキュア デジタル カードは、半導体フラッシュ メモリをベースにした新世代の高速ストレージ デバイスです。

SDカードの構成は次のとおりです。

以下は、カードの外部ピン、内部レジスタ、スピード グレード、および容量グレードの簡単な概要です。SD

1. 外部端子

SDこのカードは、モード、モード、およびモードの 3 つの伝送モードをサポートします。SPI1bit SD4bit SD

実際のプロジェクトでは、主に後者の 2 つのモードをデバッグします。カードには合計 9 つのピンがあり、それらは次のように要約されます。SD

ピン名 ピンの説明 述べる
CLK クロック信号  
CMD コマンド/リプライピン  
日付0~3 データケーブル 1bit SDモード: 、 : カード検出のみを使用しますモード: :カード検出/データ 3DATA0CD4bit SDCD/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カード容量は現在と をサポートしていますSDSDHCSDXC

SDカードの種類 プロトコル仕様 容量 サポートされているファイル形式
SD SD1.0 ~2GB ファット12、16
SDHC(SD大容量) SD2.0 2GB~32GB ファット32
SDXC(SD拡張容量) SD3.0 32GB~2TB exFAT

 

2.SDカードのデバッグ

1. 概略図

ドライバーを事前に設定するには、まず回路図を確認します。

下の図はカードスロットとの接続方法を示していますRK3568microSD

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カードコントローラのクロッククロックを示します。SDdriversample

max-frequency:カードの最大動作周波数。さまざまなモードに従って調整されます。SD

supports-sdカード機能を示しており、必ず追加する必要があります。そうしないとカードを初期化できません。SDSD

bus-width:カードは 4 線式モードを使用します。設定されていない場合、デフォルトは 1 線モードです。SD

cap-mmc-highspeed/cap-sd-highspeed:対応カードhighspeedSD

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:カード構成。SDpinmux

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 IPdw_mci_rk3288_set_ios()dw_mci_rk3288_execute_tuning()

システムが起動したら、次のコマンド (ドライバー実装: ) を使用してカードのプロパティを表示できます。SDdrivers/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. パーティションの作成

コマンドを使用してカード上にパーティションを再作成できます。fdiskSD

[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秒

上記のコマンドで設定されたおよび属性は、ファイル システムを回避し、それらを使用せずに直接読み取りおよび書き込みを行うことができますiflagoflagcachebuffer cache

注:転載する場合は、著者と出典を明記してください。

RustDesk、詐欺横行のため 国内サービス淘宝網(taobao.com)を停止、ウェブバージョンの最適化作業を再開、 アップルがM4チップをリリース、 高校生が成人式として独自のオープンソースプログラミング言語を作成 - ネチズンのコメント:弁護側は、 ユンフェン氏がアリババを辞任し、将来的にはWindowsプラットフォーム上で Visual Studio Code 1.89を開発する予定であると、 独立系ゲームプログラマーの目標となる Yu Chengdong氏の雇用調整が 「FFmpegの恥の柱」に釘付けになったと正式に発表した15年前、しかし今日彼は私たちに感謝しなければなりません - Tencent QQ Videoは以前の恥を晴らしますか?華中科技大学のオープンソースミラーステーションが外部ネットワークアクセスに正式にオープン
{{名前}}
{{名前}}

おすすめ

転載: my.oschina.net/u/4702401/blog/5566478