Linux MMC 開(kāi)發(fā)指南
1 前言
1.1 文檔簡(jiǎn)介
介紹 Linux 內(nèi)核中 SD/MMC 子系統(tǒng)的接口及使用方法,為 SD/MMC 設(shè)備驅(qū)動(dòng)的開(kāi)發(fā)提供參考。
1.2 目標(biāo)讀者
SD/MMC 驅(qū)動(dòng)的開(kāi)發(fā)/維護(hù)人員。
1.3 適用范圍
產(chǎn)品名稱(chēng) | 內(nèi)核版本 | 驅(qū)動(dòng)文件 |
---|---|---|
A133 | Linux-5.4 | sunxi_mmc* |
h616 | Linux-5.4 | sunxi_mmc* |
v853 | Linux-4.9 | sunxi_mmc* |
R853 | Linux-4.9 | sunxi_mmc* |
F133 | Linux-5.4 | sunxi_mmc* |
2 模塊介紹
2.1 模塊功能介紹
Linux 提供了 MMC 子系統(tǒng)來(lái)實(shí)現(xiàn)對(duì)各種 SD/MMC/EMMC/SDIO 設(shè)備訪問(wèn),MMC 子系統(tǒng)由上到下可以分為三層,MMC/SD card 層,MMC/SD core 層以及 MMC/SD host 層,它們之間的層次關(guān)系如下所示。
MMC/SD card 層負(fù)主要是按照 LINUX 塊設(shè)備驅(qū)動(dòng)程序的框架實(shí)現(xiàn)一個(gè)卡的塊設(shè)備驅(qū)動(dòng)。負(fù)責(zé)塊設(shè)備請(qǐng)求的處理,以及請(qǐng)求隊(duì)列的管理。
MMC/SD core 層負(fù)責(zé)通信協(xié)議的處理,包括 SD/MMC/eMMC/SDIO,為上一層提供具體讀寫(xiě)接口,同時(shí)為下一層提供 host 端接口。
MMC/SD host 層是實(shí)現(xiàn)對(duì) SD/MMC 控制器相關(guān)的操作,直接操作硬件,也是主要實(shí)現(xiàn)部分。
2.2 相關(guān)術(shù)語(yǔ)介紹
2.2.1 硬件術(shù)語(yǔ)
術(shù)語(yǔ) | 解釋說(shuō)明 |
---|---|
Sunxi | 指 Allwinner 的一系列 SOC 硬件平臺(tái)。 |
SD | Secure Digital Memory Card |
MMC | Multimedia Card |
eMMC | Embedded MultiMediaCard |
host | 指具體的 SD/MMC 控制器 |
2.2.2 軟件術(shù)語(yǔ)
無(wú)
2.3 模塊配置介紹
2.3.1 sys_config.fex 配置說(shuō)明
[card0_boot_para]
card_ctrl = 0
card_high_speed = 1
card_line = 4
sdc_d1 = port:PF0<2><1><3>
sdc_d0 = port:PF1<2><1><3>
sdc_clk = port:PF2<2><1><3>
sdc_cmd = port:PF3<2><1><3>
sdc_d3 = port:PF4<2><1><3>
sdc_d2 = port:PF5<2><1><3>
各個(gè)配置項(xiàng)的意義如下:
配置項(xiàng) | 配置項(xiàng)含義 |
---|---|
card_ctrl | 0:選擇卡量產(chǎn)相關(guān)的控制器 |
card_high_speed | 速度模式 0 為低速,1 為高速 |
card_line | 代表卡總線寬度,分別有 1,4,8 |
sdc_d1 | sdc data1 的 GPIO 配置 |
sdc_d0 | sdc data0 的 GPIO 配置 |
sdc_clk | sdc clk 的 GPIO 配置 |
sdc_cmd | sdc cmd 的 GPIO 配置 |
sdc_d3 | sdc data3 的 GPIO 配置 |
sdc_d2 | sdc data2 的 GPIO 配置 |
[card2_boot_para]
card_ctrl = 2
card_high_speed = 1
card_line = 8
sdc_clk = port:PC5<3><1><3>
sdc_cmd = port:PC6<3><1><3>
sdc_d0 = port:PC10<3><1><3>
sdc_d1 = port:PC13<3><1><3>
sdc_d2 = port:PC15<3><1><3>
sdc_d3 = port:PC8<3><1><3>
sdc_d4 = port:PC9<3><1><3>
sdc_d5 = port:PC11<3><1><3>
sdc_d6 = port:PC14<3><1><3>
sdc_d7 = port:PC16<3><1><3>
sdc_emmc_rst = port:PC1<3><1><3>
sdc_ds = port:PC0<3><2><3>
sdc_ex_dly_used = 2
sdc_io_1v8 = 1
各個(gè)配置項(xiàng)的意義如下:
配置項(xiàng) | 配置項(xiàng)含義 |
---|---|
card_ctrl | 0:選擇卡量產(chǎn)相關(guān)的控制器 |
card_high_speed | 速度模式 0 為低速,1 為高速 |
card_line | 代表卡總線寬度,分別有 1,4,8 |
sdc_clk | sdc clk 的 GPIO 配置 |
sdc_cmd | sdc cmd 的 GPIO 配置 |
sdc_d0 | sdc data0 的 GPIO 配置 |
sdc_d1 | sdc data1 的 GPIO 配置 |
sdc_d3 | sdc data3 的 GPIO 配置 |
sdc_d4 | sdc data4 的 GPIO 配置 |
sdc_d5 | sdc data5 的 GPIO 配置 |
sdc_d6 | sdc data6 的 GPIO 配置 |
sdc_d7 | sdc data7 的 GPIO 配置 |
sdc_emmc_rst | emmc 復(fù)位信號(hào)的 GPIO 配置 |
sdc_ds | sdc ds 線的 GPIO 配置 |
sdc_ex_dly_used | 采樣模式控制,2: tune 采樣點(diǎn);1:固定采樣點(diǎn)方式,燒寫(xiě)階段和啟動(dòng)階段,通過(guò) sys_config 配置采樣點(diǎn);其它值:燒寫(xiě)階段和啟動(dòng)階段使用預(yù)設(shè)的采樣點(diǎn),通常用 2,不建議修改 |
sdc_io_1v8 | 1: 表示 eMMC IO 電平是 1.8V ,需要根據(jù)實(shí)際 emmc io 供電配置 |
sdc_force_boot_tuning | 1: 強(qiáng)制啟動(dòng) tuning |
sdc_tm4_win_th | Tune 采樣最小可選窗口 |
sdc_dis_host_caps | 禁止某一種速度模式,bit1:Host 不支持 HS-SDR;Bit3:Host不支持 8 線模式;bit6:Host 不支持 HS-DDR;bit7:Host 不支持HS200;bit8:Host 不支持 HS400;其他值,不建議使用 |
2.3.2 Device Tree 配置說(shuō)明
2.3.2.1 1.uboot 階段
放到板級(jí)目錄下面:uboot-board.dts
2.3.2.1.1(1)sdc0
&sdc0_pins_a {
allwinner,pins = "PF0", "PF1", "PF2",
"PF3", "PF4", "PF5";
allwinner,function = "sdc0";
allwinner,muxsel = <2>;
allwinner,drive = <3>;
allwinner,pull = <1>;
};
&card0_boot_para {
/* reg = <0x0 0x2 0x0 0x0>; */
device_type = "card0_boot_para";
card_ctrl = <0x0>;
card_high_speed = <0x1>;
card_line = <0x4>;
pinctrl-0 = <&sdc0_pins_a>;
};
配置項(xiàng) | 配置項(xiàng)含義 |
---|---|
card_ctrl | 0:選擇卡量產(chǎn)相關(guān)的控制器 |
card_high_speed | 速度模式 0 為低速,1 為高速 |
card_line | 代表卡總線寬度,分別有 1,4,8 |
pinctrl-0 | 代表卡的 pin 設(shè)置 |
sdc0_pins_a | 具體卡的 pin 設(shè)置,allwinner,pins 代表具體的 pin 名字,allwinner,function 表示 pin 選擇的功能,這里選擇 sdc0,allwinner,muxsel 代表 sdc0 對(duì)應(yīng) spec 里面的功能值,allwinner,drive 代表去掉能力,allwinner,pull 代表上下拉 |
2.3.2.1.2 (2)sdc2
&sdc2_pins_a {
allwinner,pins = "PC1", "PC5", "PC6",
"PC8", "PC9", "PC10", "PC11",
"PC13", "PC14", "PC15", "PC16";
allwinner,function = "sdc2";
allwinner,muxsel = <3>;
allwinner,drive = <3>;
allwinner,pull = <1>;
};
&sdc2_pins_b {
allwinner,pins = "PC0", "PC1", "PC5", "PC6",
"PC8", "PC9", "PC10", "PC11",
"PC13", "PC14", "PC15", "PC16";
allwinner,function = "io_disabled";
allwinner,muxsel = <7>;
allwinner,drive = <1>;
allwinner,pull = <1>;
};
&sdc2_pins_c {
allwinner,pins = "PC0";
allwinner,function = "sdc2";
allwinner,muxsel = <3>;
allwinner,drive = <3>;
allwinner,pull = <2>;
};
&card2_boot_para {
/*reg = <0x0 0x3 0x0 0x0>; */
device_type = "card2_boot_para";
card_ctrl = <0x2>;
card_high_speed = <0x1>;
card_line = <0x8>;
pinctrl-0 = <&sdc2_pins_a &sdc2_pins_c>;
sdc_ex_dly_used = <0x2>;
sdc_io_1v8 = <0x1>;
sdc_tm4_win_th = <0x08>;
sdc_tm4_hs200_max_freq = <150>;
sdc_tm4_hs400_max_freq = <100>;
sdc_type = "tm4";
};
配置項(xiàng) | 配置項(xiàng)含義 |
---|---|
card_ctrl | 0:選擇卡量產(chǎn)相關(guān)的控制器 |
card_high_speed | 速度模式 0 為低速,1 為高速 |
card_line | 代表卡總線寬度,分別有 1,4,8 |
sdc_ex_dly_used | 采樣模式控制,2: tune 采樣點(diǎn);1:固定采樣點(diǎn)方式,燒寫(xiě)階段和啟動(dòng)階段,通過(guò) sys_config 配置采樣點(diǎn);其它值:燒寫(xiě)階段和啟動(dòng)階段使用預(yù)設(shè)的采樣點(diǎn),通常用 2 |
sdc_io_1v8 | 1: 表示 eMMC IO 電平是 1.8V, 需要根據(jù)實(shí)際 emmc io 供電配置 |
sdc_tm4_win_th | Tune 采樣最小可選窗口 |
sdc_tm4_hs200_max_freq/ | 代表 emmc 的 hs200/hs400 最大頻率設(shè)置, 不建議修改 |
sdc_tm4_hs400_max_freq | |
sdc2_pins_a, sdc2_pins_c | 具體卡的 pin 設(shè)置,allwinner,pins 代表具體的 pin 名字,allwinner,function 表示 pin 選擇的功能,這里選擇 sdc0,allwinner,muxsel 代表sdc0 對(duì)應(yīng) spec 里面的功能值,allwinner,drive代表去掉能力,allwinner,pull 代表上下拉 |
2.3.2.2 2. 內(nèi)核階段
存放在 board.dts 或者內(nèi)核目錄下面 arch/armXX/boot/dts/sunxi/sunxiXiwXpX 中在不同的 Sunxi 硬件平臺(tái)中,SD/MMC 控制器的數(shù)目也不一定相同,但對(duì)于每一個(gè) SD/MMC 控制器來(lái)說(shuō),在 board.dts 中配置的參數(shù)相似。各個(gè)項(xiàng)目的意義如下
2.3.2.2.1 [sdc0] 通常用作 SD 卡
sdc0: sdmmc@04020000 {
device_type = "sdc0";
cd-used-24M;
disable-wp;
pinctrl-0 = <&sdc0_pins_a>;
bus-width = <4>;
cd-gpios = <&pio PF 6 6 1 3 0xffffffff>;
/*non-removable;*/
/*broken-cd;*/
/*cd-inverted*/
/*data3-detect;*/
cap-sd-highspeed;
sd-uhs-sdr50;
sd-uhs-ddr50;
sd-uhs-sdr104;
no-sdio;
no-mmc;
sunxi-power-save-mode;
/*sunxi-dis-signal-vol-sw;*/
max-frequency = <150000000>;
ctl-spec-caps = <0x8>;
vmmc-supply = ;
vqmmc33sw-supply = ;
vdmmc33sw-supply = ;
vqmmc18sw-supply = ;
vdmmc18sw-supply = ;
status = "okay";
};
各個(gè)配置項(xiàng)的意義如下:
配置項(xiàng) | 配置項(xiàng)含義 |
---|---|
device_type | phy 索引值的選擇 |
cd-used-24M | 使用 24M 時(shí)鐘檢測(cè)插拔卡中斷 |
disable-wp | 卡設(shè)置寫(xiě)保護(hù),ro |
pinctrl-0 | 第一組 pin 腳的 GPIO 配置 |
bus-width | bus-width |
cd-gpios | 卡檢測(cè)的 GPIO 配置 |
non-removable | 不可移除 |
broken-cd | sd 卡檢測(cè)方式:輪訓(xùn) |
cd-inverted | 卡檢測(cè)的高電平有效還是低電平有效 |
data3-detect | data3 線檢測(cè)卡 |
cap-sd-highspeed | SD 卡的 High speed |
sd-uhs-sdr50 | SD 卡的 uhs-sdr50 |
sd-uhs-ddr50 | SD 卡的 uhs-ddr50 |
sd-uhs-sdr104 | SD 卡的 uhs-sdr104 |
no-sdio | 無(wú) sdio |
no-mmc | 無(wú) mmc |
sunxi-power-save-mode | 發(fā)送數(shù)據(jù)或者命令才有時(shí)鐘輸出 |
sunxi-dis-signal-vol-sw | 關(guān)閉電壓切換 |
max-frequency | 最大頻率 |
ctl-spec-caps | 控制 spec 能力 |
vmmc-supply | 供電電壓、工作電壓,需要根據(jù)實(shí)際 pmu 供電方案修改 |
vqmmc33sw-supply | 3.3V 的 IO 電壓,需要根據(jù)實(shí)際 pmu 供電方案修改 |
vdmmc33sw-supply | 3.3V 的卡檢測(cè)電壓,需要根據(jù)實(shí)際 pmu 供電方案修改 |
vqmmc18sw-supply | 1.8V 的 IO 電壓,需要根據(jù)實(shí)際 pmu 供電方案修改 |
vdmmc18sw-supply | 1.8V 的卡檢測(cè)電壓,需要根據(jù)實(shí)際 pmu 供電方案修改 |
status | 設(shè)備樹(shù)的狀態(tài) |
2.3.2.2.2 [sdc1] 通常用作 SDIO WIFI
sdc1: sdmmc@04021000 {
pinctrl-0 = <&sdc0_pins_a>;
bus-width = <4>;
cap-sd-highspeed;
sd-uhs-sdr50;
sd-uhs-ddr50;
sd-uhs-sdr104;
no-sd;
no-mmc;
/*sunxi-power-save-mode;*/
/*sunxi-dis-signal-vol-sw;*/
cap-sdio-irq;
keep-power-in-suspend;
ignore-pm-notify;
max-frequency = <150000000>;
ctl-spec-caps = <0x8>;
sunxi-dly-208M = <1 1 0 0 0 1>;
vmmc-supply = ;
vqmmc33sw-supply = ;
vdmmc33sw-supply = ;
vqmmc18sw-supply = ;
vdmmc18sw-supply = ;
status = "okay";
};
各個(gè)配置項(xiàng)的意義如下:
配置項(xiàng) | 配置項(xiàng)含義 |
---|---|
pinctrl-0 | 第一組 pin 腳的 GPIO 配置 |
bus-width | 線寬 |
cap-sd-highspeed | SDIO 卡的 High speed |
sd-uhs-sdr50 | SDIO 卡的 uhs-sdr50 |
sd-uhs-ddr50 | SDIO 卡的 uhs-ddr50 |
sd-uhs-sdr104 | SDIO 卡的 uhs-sdr104 |
no-sd | 無(wú) sd |
no-mmc | 無(wú) mmc |
sunxi-power-save-mode | 發(fā)送數(shù)據(jù)或者命令才有時(shí)鐘輸出 |
sunxi-dis-signal-vol-sw | 關(guān)閉電壓切換 |
cap-sdio-irq | 開(kāi)啟 SDIO 中斷 |
keep-power-in-suspend | 休眠時(shí)保持電源 |
ignore-pm-notify | 忽略電源管理的通知 |
max-frequency | 最大頻率 |
ctl-spec-caps | 控制 spec 能力 |
sunxi-dly-208M | <1(cmd driver phase) 1(data driver phase) 00 0(data sample phase) 0(cmd sample phase)> |
vmmc-supply | 供電電壓、工作電壓,需要根據(jù)實(shí)際 pmu 供電方案修改 |
vqmmc33sw-supply | 3.3V 的 IO 電壓,需要根據(jù)實(shí)際 pmu 供電方案修改 |
vdmmc33sw-supply | 3.3V 的卡檢測(cè)電壓,需要根據(jù)實(shí)際 pmu 供電方案修改 |
vqmmc18sw-supply | 1.8V 的 IO 電壓,需要根據(jù)實(shí)際 pmu 供電方案修改 |
vdmmc18sw-supply | 1.8V 的卡檢測(cè)電壓,需要根據(jù)實(shí)際 pmu 供電方案修改 |
status | 設(shè)備樹(shù)的狀態(tài) |
2.3.2.2.3 [sdc2] 通常用作 eMMC
sdc2: sdmmc@04022000 {
pinctrl-0 = <&sdc0_pins_a &sdc0_pins_c>;
bus-width = <8>;
non-removable;
cap-mmc-highspeed;
mmc-ddr-1_8v;
mmc-hs200-1_8v;
mmc-hs400-1_8v;
no-sdio;
no-sd;
sunxi-power-save-mode;
sunxi-dis-signal-vol-sw;
max-frequency = <100000000>;
ctl-spec-caps = <0x308>;
vmmc-supply = ;
vqmmc-supply = ;
fixed-emmc-driver-type = <0x1>;
sdc_tm4_sm0_freq0 = <0>;
status = "disabled";
};
各個(gè)配置項(xiàng)的意義如下:
配置項(xiàng) | 配置項(xiàng)含義 |
---|---|
pinctrl-0 | 第一組 pin 腳的 GPIO 配置 |
bus-width | 線寬 |
non-removable | 不可移除 |
cap-mmc-highspeed | MMC 卡的 High speed |
mmc-ddr-1_8v | MMC 卡的 ddr50 |
mmc-hs200-1_8v | MMC 卡的 hs200 |
mmc-hs400-1_8v | MMC 卡的 hs400 |
no-sdio | 無(wú) sdio |
no-sd | 無(wú) sd |
sunxi-power-save-mode | 發(fā)送數(shù)據(jù)或者命令才有時(shí)鐘輸出 |
sunxi-dis-signal-vol-sw | 關(guān)閉電壓切換 |
max-frequency | 最大頻率 |
vmmc-supply | 供電電壓、工作電壓,需要根據(jù)實(shí)際 pmu 供電方案修改 |
vqmmc-supply | IO 電壓,需要根據(jù)實(shí)際 pmu 供電方案修改 |
fixed-emmc-driver-type | 驅(qū)動(dòng)能力等級(jí)調(diào)整,對(duì)應(yīng)設(shè)置 Extended CSD register 中 HS_TIMING |
sdc_tm4_sm0_freqn | host timing setting |
status | 設(shè)備樹(shù)的狀態(tài) |
2.3.3 kernel menuconfig 配置說(shuō)明
在命令行中進(jìn)入內(nèi)核 longan 根目錄,執(zhí)行./build.sh menuconfig 進(jìn)入配置界面,并按以下步驟操作:
1.menuconfig 主界面
圖 2-1: menuconfig 主界面
進(jìn)入 Device Drivers,并選中 MMC/SD/SDIO card support 為 “ * ”
圖 2-2: Device drivers 界面
選擇 Allwinner sunxi SD/MMC Host Controller support 為 “ * ”,編譯進(jìn)內(nèi)核(M 為編譯進(jìn)模塊)
圖 2-3: sdmmc 支持界面
2.4 源碼結(jié)構(gòu)介紹
SD/MMC 總線驅(qū)動(dòng)的源代碼位于內(nèi)核在 drivers/mmc/host 目錄下:drivers/mmc/host
├── sunxi-mmc.c // 集中了所有的的控制器的公共部分以及主要的控制邏輯代碼,以及大部分的資源申請(qǐng)和使用,包括中斷,pin,ccmu 等
├── sunxi-mmc.h // 為 Sunxi 平臺(tái)的 SD/MMC 控制器驅(qū)動(dòng)定義了一些公共的宏、數(shù)據(jù)結(jié)構(gòu)
|—— sunxi-mmc-v4p1x.c // 部分平臺(tái)的 sdc0、sdc1 的控制器差異部分驅(qū)動(dòng)代碼
|—— sunxi-mmc-v4p1x.h // 部分平臺(tái)的 sdc0、sdc1 的控制器驅(qū)動(dòng)定義了一些的宏、數(shù)據(jù)結(jié)構(gòu)
|—— sunxi-mmc-v4p5x.c // sdc2 的控制器差異部分驅(qū)動(dòng)代碼
|—— sunxi-mmc-v4p5x.h // sdc2 的控制器驅(qū)動(dòng)定義了一些的宏、數(shù)據(jù)結(jié)構(gòu)
|—— sunxi-mmc-v5p3x.c /部分平臺(tái)的 sdc0、sdc1 的控制器差異部分驅(qū)動(dòng)代碼
|—— sunxi-mmc-v5p3x.h//部分平臺(tái)的 sdc0、sdc1 的控制器驅(qū)動(dòng)定義了一些的宏、數(shù)據(jù)結(jié)構(gòu)
|—— sunxi-mmc-debug.c 用于 debug 的代碼
|—— sunxi-mmc-export.c 提供給其他模塊的獨(dú)立接口
2.5 驅(qū)動(dòng)框架介紹
如源碼結(jié)構(gòu)介紹
3 模塊接口說(shuō)明
對(duì)外函數(shù)接口
3.1 sunxi_mmc_rescan_card()
? 作用:用于其他模塊手動(dòng)掃描 sd/sdio,主要提供給 wifi 驅(qū)動(dòng)使用
? 參數(shù):
? 參數(shù) 1:id 對(duì)于的物理控制器 id
? 返回:
? 無(wú)
4 模塊使用范例
無(wú)
5 FAQ
1、問(wèn):sd 卡和 wifi 經(jīng)常出現(xiàn) retry:start 等打印的原因和原理;
答:出現(xiàn)這種情況是因?yàn)?sdio 通信失敗了,一般是數(shù)據(jù) crc 校驗(yàn)錯(cuò)誤;對(duì)于這種錯(cuò)誤主要懷疑,
硬件信號(hào)受到干擾;而這個(gè) retry 機(jī)制是通過(guò)重發(fā)改變相位等方法來(lái)規(guī)避單次通信失??;在通信
無(wú)法回復(fù)的情況下,會(huì)出現(xiàn)大量的 retrylog,此時(shí)請(qǐng)檢查硬件信號(hào),供電等關(guān)鍵信息。
5.1 調(diào)試方法
5.1.1 調(diào)試工具
5.1.2 調(diào)試節(jié)點(diǎn)
5.1.2.1 1. 寄存器信息
linux5.4 內(nèi)核
a.sdc2
(1).sdc2 gpio 寄存器信息
cat /sys/devices/platform/soc@2900000/4022000.sdmmc/sunxi_dump_gpio_register
(2).sdc2 ccmu 寄存器信息
cat /sys/devices/platform/soc@2900000/4022000.sdmmc/sunxi_dump_ccmu_register
(3).sdc2 host 寄存器信息
cat /sys/devices/platform/soc@2900000/4022000.sdmmc/sunxi_dump_host_register
b.sdc0
(1).sdc0 gpio 寄存器信息
cat /sys/devices/platform/soc@2900000/4020000.sdmmc/sunxi_dump_gpio_register
(2).sdc0 ccmu 寄存器信息
cat /sys/devices/platform/soc@2900000/4020000.sdmmc/sunxi_dump_ccmu_register
(3).sdc0 host 寄存器信息
cat /sys/devices/platform/soc@2900000/4020000.sdmmc/sunxi_dump_host_register
(4)手動(dòng)掃描卡接口
echo 1 > /sys/devices/platform/soc@2900000/4020000.sdmmc/sunxi_insert
c.sdc1
(1).sdc1 gpio 寄存器信息
cat /sys/devices/platform/soc@2900000/4021000.sdmmc/sunxi_dump_gpio_register
(2).sdc1 ccmu 寄存器信息
cat /sys/devices/platform/soc@2900000/4021000.sdmmc/sunxi_dump_ccmu_register
(3).sdc1 host 寄存器信息
cat /sys/devices/platform/soc@2900000/4021000.sdmmc/sunxi_dump_host_register
linux4.9 內(nèi)核
a.sdc2
(1).sdc2 gpio 寄存器信息
cat /sys/devices/platform/soc/sdc2/sunxi_dump_gpio_register
(2).sdc2 ccmu 寄存器信息
cat /sys/devices/platform/soc/sdc2/sunxi_dump_ccmu_register
(3).sdc2 host 寄存器信息
cat /sys/devices/platform/soc/sdc2/sunxi_dump_host_register
b.sdc0
(1).sdc0 gpio 寄存器信息
cat /sys/devices/platform/soc/sdc0/sunxi_dump_gpio_register
(2).sdc0 ccmu 寄存器信息
cat /sys/devices/platform/soc/sdc0/sunxi_dump_ccmu_register
(3).sdc0 host 寄存器信息
cat /sys/devices/platform/soc/sdc0/sunxi_dump_host_register
(4)手動(dòng)掃描卡接口
echo 1 > /sys/devices/platform/soc/sdc0/sunxi_insert
c.sdc1
(1).sdc1 gpio 寄存器信息
cat /sys/devices/platform/soc/sdc1/sunxi_dump_gpio_register
(2).sdc1 ccmu 寄存器信息
cat /sys/devices/platform/soc/sdc1/sunxi_dump_ccmu_register
(3).sdc1 host 寄存器信息
cat /sys/devices/platform/soc/sdc1/sunxi_dump_host_register
5.1.2.2 2.emmc 信息
(1)獲取路徑:cd /sys/block/mmcblk0/device. 這里包含了大部分的 emmc 信息
block ffu_capable preferred_erase_size cid fwrev prv cmdq_en hwrev raw_rpmb_size_mult csd life_time rca date manfid rel_sectors driver mmcblk0rpmb rev dsr name serial enhanced_area_offset ocr subsystem enhanced_area_size oemid type enhanced_rpmb_supported power uevent erase_size pre_eol_info
(2)cat 需要的信息,
例如獲取壽命信息
cat life_time
cat pre_eol_info
獲取 emmc 名字
cat namd
獲取生產(chǎn)日期
cat data
獲取唯一識(shí)別碼
cat cid
獲取制造商 id
cat manfid
5.1.2.3 3、性能驗(yàn)證節(jié)點(diǎn)
該節(jié)點(diǎn)主要是用來(lái)記錄底層存儲(chǔ)的讀寫(xiě)性能,該節(jié)點(diǎn)記錄的數(shù)據(jù)不參含調(diào)度以及文件系統(tǒng)的影響。
為了描述方便,這里設(shè)定 base 目錄這一概念,其中 X 代表控制器號(hào);
內(nèi)核 linux4.9 base=/sys/devices/platform/soc/sdcX
內(nèi)核 linux5.4 base=/sys/devices/platform/soc@2900000/402X000.sdmmc
(1) 開(kāi)始測(cè)量:echo 1 > /$base/sunxi_host_perf
(2) 進(jìn)行讀寫(xiě)操作
(3) 獲取測(cè)試結(jié)果:cat /$base/sunxi_host_perf
圖 5-1: sunxi_host_perf
(4) 速度計(jì)算:1073741824byte/105978400us = 9.66MB/s
(5) 清除測(cè)量數(shù)據(jù):echo 0 > /$base/sunxi_host_perf
動(dòng)態(tài)設(shè)置
以下動(dòng)態(tài)設(shè)置的節(jié)點(diǎn)均于 base 目錄下:
sunxi_host_perf 總開(kāi)關(guān),打開(kāi)后下面設(shè)置才有效
sunxi_host_filter_w_sector:?jiǎn)喂P數(shù)據(jù)傳輸?shù)臄?shù)據(jù)大于等于這個(gè)數(shù)據(jù)量,
sunxi_host_filter_w_speed 才生效,單位是扇區(qū)
sunxi_host_filter_w_speed:速度低于這個(gè)值就打印出來(lái),單位是 B/S
參考
echo 20971520 > /$base/sunxi_host_filter_w_speed
echo 8 > /$base/sunxi_host_filter_w_sector
echo 1 > /$base/sunxi_host_perf
效果
20190322_17:24:37.207 [ 64.922940] c=25,a=0x 3fc00,bs= 2560,t= 105463us,sp=12136KB/s
20190322_17:24:37.586 [ 65.301113] c=25,a=0x 43800,bs= 2560,t= 92740us,sp=13802KB/s
20190322_17:24:37.829 [ 65.544155] c=25,a=0x 46000,bs= 2560,t= 94162us,sp=13593KB/s
20190322_17:24:37.967 [ 65.682744] c=25,a=0x 47400,bs= 2560,t= 77371us,sp=16543KB/s
20190322_17:24:38.041 [ 65.755126] c=25,a=0x 47e00,bs= 2560,t= 64860us,sp=19734KB/s
開(kāi)機(jī)默認(rèn)啟動(dòng)
在 dts 或者 sysconfig.fex 里面加入下面配置
per_enable:總開(kāi)關(guān),打開(kāi)后下面設(shè)置才有效
fiter_sector :傳輸?shù)臄?shù)據(jù)大于等于這個(gè)數(shù)據(jù)量,
fiter_speed 才生效,單位是扇區(qū)
fiter_speed:速度低于這個(gè)值就打印出來(lái),單位是 B/S
參考
圖 5-2: sysconfig 性能測(cè)試配置
效果
20190322_17:24:37.207 [ 64.922940] c=25,a=0x 3fc00,bs= 2560,t= 105463us,sp=12136KB/s
20190322_17:24:37.586 [ 65.301113] c=25,a=0x 43800,bs= 2560,t= 92740us,sp=13802KB/s
20190322_17:24:37.829 [ 65.544155] c=25,a=0x 46000,bs= 2560,t= 94162us,sp=13593KB/s
20190322_17:24:37.967 [ 65.682744] c=25,a=0x 47400,bs= 2560,t= 77371us,sp=16543KB/s
20190322_17:24:38.041 [ 65.755126] c=25,a=0x 47e00,bs= 2560,t= 64860us,sp=19734KB/s
5.2 常見(jiàn)問(wèn)題
參考《MMC 量產(chǎn)問(wèn)題快速排查指南》《eMMC 硬件排查指南》
-
內(nèi)核
+關(guān)注
關(guān)注
3文章
1360瀏覽量
40185 -
接口
+關(guān)注
關(guān)注
33文章
8447瀏覽量
150724 -
Linux
+關(guān)注
關(guān)注
87文章
11209瀏覽量
208721 -
MMC
+關(guān)注
關(guān)注
0文章
76瀏覽量
30443
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論