RK356X RKAndroid12 TF卡配置 自动挂载
RK3568 有三个SDMMC接口,分别为SDMMC0 SDMMC1 SDMMC2
DTS 配置
1. max-frequency = <150000000>;
此配置设置 SD 卡的运行频率,虽然设置为 150M ,但是还要根据 SD 卡的不同模式进行调整。这部分不
需要用户关心,实际运行频率和模块的关系软件会关联。最大不超过 150MHz 。
2. supports-sd;
此配置标识此插槽为 SD 卡功能,为必须添加项。否则无法初始化 SD 卡。
3. bus - width = <4> ;
此配置标识需要使用 SD 卡的线宽。 SD 卡最大支持 4 线模式,如果不配置就模式使用 1 线模式。另外这个位只支持的数值为 1 , 4 ,配置其他数值会认为是非法数值,强制按照 1 线模式进行使用。
4. cap-mmc-highspeed; cap-sd-highspeed;
此配置为标识此卡槽支持 highspeed 的 SD 卡。 如果不配置,表示不支持 highspeed 的 SD 卡。
5. 配置使用 SD3.0
首先确保芯片支持 SD3.0 模式 (3288,3328,3399,3368) ,并且需要配置 vqmmc 这一路的 SDMMC 控制器的 IO 电源,并添加如下一些 SD3.0 的速度模式
sd-uhs-sdr12: 时钟频率不超过24M
sd-uhs-sdr25: 时钟频率不超过50M
sd-uhs-sdr50: 时钟频率不超过100M
sd-uhs-ddr50: 时钟频率不超过50M,并且采用双沿采样
sd-uhs-sdr104: 时钟频率不超过208M
7. 配置 SD 卡热拔插检测脚
如果检测脚是直接连接到芯片的 SDMMC 控制器的 sdmmc_cd 脚,则请直接将该脚位配置为功能脚,并 在 sdmmc 节点的 default 的 pinctrl 内进行引用即可。
如果检测脚是使用其他 GPIO ,则需要在 sdmmc 节点内使用 cd-gpios 来进配置,例如
cd - gpios = <&gpio4 24 GPIO_ACTIVE_LOW> ;
如果使用 GPIO 的检测脚,但是又要求反向检测方式 ( 即 SD 卡插入时检测脚为高电平 ) ,则需要追加
cd- inverted ;
通用RK TF设备树配置如下:
cpp
&sdmmc2 {
max-frequency = <150000000>;
supports-sd;
bus-width = <4>;
cap-mmc-highspeed;
cap-sd-highspeed;
disable-wp;
vmmc-supply = <&vcc3v3_sd>;//默认可以去掉
vqmmc-supply = <&vccio_sd>;//默认可以去掉
pinctrl-names = "default";
pinctrl-0 = <&sdmmc2m0_bus4 &sdmmc2m0_cmd &sdmmc2m0_clk &sdmmc2m0_det>;
status = "okay";
};
&sdmmc1 {
max-frequency = <150000000>;
supports-sd;
bus-width = <4>;
cap-mmc-highspeed;
cap-sd-highspeed;
disable-wp;
vmmc-supply = <&vcc3v3_sd>;//默认可以去掉
vqmmc-supply = <&vccio_sd>;//默认可以去掉
pinctrl-names = "default";
pinctrl-0 = <&sdmmc1_bus4 &sdmmc1_clk &sdmmc1_cmd &sdmmc1_det>;
status = "okay";
};
&sdmmc0 {
max-frequency = <150000000>;
supports-sd;
bus-width = <4>;
cap-mmc-highspeed;
cap-sd-highspeed;
disable-wp;
vmmc-supply = <&vcc3v3_sd>;//默认可以去掉
vqmmc-supply = <&vccio_sd>;//默认可以去掉
pinctrl-names = "default";
pinctrl-0 = <&sdmmc0_bus4 &sdmmc0_clk &sdmmc0_cmd &sdmmc0_det>;
status = "okay";
};
插卡正常出现的日志:
cpp
[ 293.194013] mmc1: new high speed SDXC card at address 59b4
[ 293.198185] mmcblk1: mmc1:59b4 00000 59.6 GiB
[ 293.204351] mmcblk1: p1
如果在内核看到这样的打印,说明 SD 卡已经被正确识别,并且已经有一个可用的分区 p1 。
如果在用户界面看不到 SD 卡设备或者设备不可使用,请排查用户态磁盘守护进程,如 vold 。
另外可手动验证分区是否可以使用
mount - t vfat /dev/block/mmcblk1p1 /mnt
或者
mount - t vfat /dev/block/mmcblk1 /mnt
然后到 mnt 目录下看下是否有 SD 卡里面的文件
常见问题排查
问题1:无法识别128GTF卡,只能识别64G以下TF卡
可能是你配置了SD3.0模式,检查硬件原理图 vccio_sd所接的供电能否进行3.3V/1.8V切换
如果不支持去掉sd-uhs-sdr104。
1. SD 卡
从左到右依次是:
DET ---- 检测脚
DATA1 ---- 数据线
DATA0
GND
CLK ---- 时钟
VCC_SD ---- SD 卡供电电源
VCCIO_SD ---- 数据线的 IO 供电电源
CMD ---- 命令线
DATA3
DATA2
除了 DET/CLK/GND 外,其它的 DATA0-3/VCC_SD/VCCIO_SD/CMD 必须都为 3.3v 左右,最小不能低
于 3v ; DET 脚插入为低,拔出为高; DATA0-3/CMD 的电压都是 VCCIO_SD 供给的,所以 DATA0-
3/CMD 必须跟 VCCIO_SD 保持一致,而 VCC_SD 和 VCCIO_SD 要保持一致( NOTE: SD 3.0 ,要求
VCCIO_SD 为 1.8v );
如果 VCC_SD/VCCIO_SD 的电源是长供电,那么请保证 VCC_SD 和 VCCIO_SD 在卡拔插时不会有塌 陷;
2. 开机不读卡,运行时拔插 OK:大概率时电源问题
例如:拔掉所有电源,发现查着 HDMI 发现有漏电到 VCC_SD 卡里面;或者使用外接电源进行测试。
3. 概率性不识别:
cpp
mmc1: new high speed SD card at address b368
mmcblk1: mmc1:b368 SMI 486 MiB
[mmc1] Data transmission error !!!! MINTSTS: [0x00002000]
dwmmc_rockchip ff0c0000.rksdmmc: data FIFO error (status=00002000)
mmcblk1: error -110 sending status command, retrying
need_retune:0,brq->retune_retry_done:0.
降频和增加卡检测延时增强电源稳定性,如果降频 OK 的话,请检查硬件 layout
cpp
&sdmmc {
card-detect-delay = <1200>;
}
自动挂载
RKAndroid12默认支持SDMMC0的TF自动挂载,接入TF可以在/storage/目录下见到
SDMMC1自动挂载( sdmmc2类同)在 device/rockchip/common/scripts/fstab_tools/fstab.in 这个里面修改,或者可以用get_build_var PRODUCT_FSTAB_TEMPLATE 看看是否这个路径
cpp
//sdmmc1
/devices/platform/fe2c0000.dwmmc/mmc_host* auto auto defaults voldmanaged=sdcard1:auto