08 TF卡
1 TF卡介绍
SD卡由松下、东芝和SanDisk于1999年推出的非易失性存储卡格式。它被广泛用于数码相机、摄像机、游戏机和大量嵌入式设备中。TF卡(Micro SD卡)由SanDisk公司于2004年推出的产品,在实现相同功能的情况下,体积大幅度缩减,成为目前最主流的移动设备存储卡,我们的M4-R1 开发板就搭载了一个TF卡槽,方便进行数据存储。 这个卡槽通过PCB上的走线直接连接到RK3568芯片的 SDMMC引脚(包括 CMD, CLK, DATA0-DATA3 以及电源和地)。
提示
SDMMC接口是SD卡和MMC卡的标准接口,SD卡是SDMMC接口的一种,MMC卡是SDMMC接口的另一种。

在软件层面,Linux内核已经包含了完善的SDMMC控制器驱动和SD卡协议栈。Rockchip也为其芯片提供了良好的主线内核支持。
2 TF卡板卡接口

3 TF卡使用---命令行方式
3.1 设备树解析
提示
下文的文件路径:out/kernel/src_tmp/linux-5.10/arch/arm64/boot/dts/rockchip/ 需要先编译码源。
基础控制器定义( rk3568.dtsi
):
sdmmc0: dwmmc@fe2b0000 {
compatible = "rockchip,rk3568-dw-mshc", "rockchip,rk3288-dw-mshc";
reg = <0x0 0xfe2b0000 0x0 0x4000>;
interrupts = <GIC_SPI 98 IRQ_TYPE_LEVEL_HIGH>;
max-frequency = <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-depth = <0x100>;
resets = <&cru SRST_SDMMC0>;
reset-names = "reset";
status = "disabled";
};
RK3568芯片定义了4个SDMMC控制器,这里以TF卡使用的sdmmc0控制器为例进行讲解,其余控制器只是最大频率和寄存器地址有所区别:
compatible
: 兼容性字符串,指定驱动程序reg
: 寄存器地址范围(0xfe2b0000-0xfe2b3fff)interrupts
: 中断号98,高电平触发max-frequency
: 最大工作频率150MHzclocks
: 四个时钟源(总线时钟、接口时钟、驱动时钟、采样时钟)fifo-depth
: FIFO深度256字节resets
: 复位控制status
: 默认禁用状态
引脚复用配置(引脚层 - rk3568-pinctrl.dtsi):
sdmmc0 {
sdmmc0_bus4: sdmmc0-bus4 {
rockchip,pins =
/* sdmmc0_d0 */
<1 RK_PD5 1 &pcfg_pull_up_drv_level_2>,
/* sdmmc0_d1 */
<1 RK_PD6 1 &pcfg_pull_up_drv_level_2>,
/* sdmmc0_d2 */
<1 RK_PD7 1 &pcfg_pull_up_drv_level_2>,
/* sdmmc0_d3 */
<2 RK_PA0 1 &pcfg_pull_up_drv_level_2>;
};
sdmmc0_clk: sdmmc0-clk {
rockchip,pins =
/* sdmmc0_clk */
<2 RK_PA2 1 &pcfg_pull_up_drv_level_2>;
};
sdmmc0_cmd: sdmmc0-cmd {
rockchip,pins =
/* sdmmc0_cmd */
<2 RK_PA1 1 &pcfg_pull_up_drv_level_2>;
};
sdmmc0_det: sdmmc0-det {
rockchip,pins =
/* sdmmc0_det */
<0 RK_PA4 1 &pcfg_pull_up>;
};
sdmmc0_pwren: sdmmc0-pwren {
rockchip,pins =
/* sdmmc0_pwren */
<0 RK_PA5 1 &pcfg_pull_none>;
};
};
SDMMC0引脚组:
sdmmc0_bus4
: 4位数据线(D0-D3)sdmmc0_d0
: RK_PD5 (GPIO1_D5)sdmmc0_d1
: RK_PD6 (GPIO1_D6)sdmmc0_d2
: RK_PD7 (GPIO1_D7)sdmmc0_d3
: RK_PA0 (GPIO2_A0)sdmmc0_clk
: 时钟线 RK_PA2 (GPIO2_A2)sdmmc0_cmd
: 命令线 RK_PA1 (GPIO2_A1)sdmmc0_det
: 卡检测 RK_PA4 (GPIO0_A4)sdmmc0_pwren
: 电源使能 RK_PA5 (GPIO0_A5)
板级配置( rk3568-toybrick.dtsi
):
&sdmmc0 {
max-frequency = <150000000>;
supports-sd;
bus-width = <4>;
cap-mmc-highspeed;
cap-sd-highspeed;
disable-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";
};
supports-sd
: 支持SD卡bus-width = <4>
: 4位数据总线cap-sd-highspeed
: 支持高速模式sd-uhs-sdr104
: 支持UHS-I SDR104模式vmmc-supply
: 主电源供应vqmmc-supply
: I/O电压供应pinctrl-0
: 指定使用的引脚组
3.2 应用层使用TF卡的方法
当SD卡(TF卡)插入时,系统会检测到插入事件(通过引脚轮询检测),并发送信号对卡进行识别,识别成功后在系统中创建一个块设备,过去的开发中,内核识别到SD卡以后,我们需要手动使用 mount
命令将SD卡挂载到指定路径下方便后续进行读取,读取完成后需要使用 umount
命令取消挂载。现在大部分的操作系统以及支持对TF卡和U盘设备的自动挂载。
对于应用开发来说,我们并不需要关心硬件和内核是如何配置SD卡的,只需要调用Linux下的文件操作API即可完成对SD卡中的内容进行访问
实际使用时,对于本开发板,只需要插入TF卡到TF卡座(支持热插拔),然后通过 df -h
命令即可查看系统上所有已挂载的磁盘、分区、存储设备的总容量、已用空间、剩余空间以及挂载点等信息。我们进入相应的挂载点即可对TF卡的内容进行读取和操作
3.3 具体功能演示
测试使用的TF卡如下:

输入df -h 查看挂载目录:
df -h

进入对应的挂载点即可查看TF卡的内容
