当前位置: 首页>新闻资讯>技术问答

rk3568 驱动sdnand

SD NAND-贴片式TF卡-贴片式SD卡-免费测试2025-09-159

在RK3568平台上驱动SD NAND,本质上和驱动标准的SD卡或eMMC存储设备类似,因为SD NAND遵循相同的SD协议。下面我将为你梳理一下主要的开发要点和步骤。

RK3568 驱动 SD NAND 开发指南

核心要点概览

SD NAND 在 RK3568 上的驱动开发主要涉及 Linux 内核中的 SD/MMC 主机控制器驱动以及设备树配置。由于其遵循标准 SD 协议,内核通常已经提供了支持,你需要做的关键是正确配置。下表汇总了核心环节:

关键方面具体说明参考命令/配置示例
硬件连接确保 SD NAND 的 CMD, CLK, DAT0-DAT3 信号线正确连接到 RK3568 的 SDMMC 控制器 引脚,并检查电源和上拉-
内核驱动启用确保内核配置启用了 RK3568 的 SD/MMC 控制器驱动以及通用的 SDHCI 支持。Device Drivers → MMC/SD/SDIO card support → Rockchip SDMMC Controller support
设备树配置配置 SDMMC 控制器的节点,设置兼容性、时钟频率、总线宽度、引脚控制等参数。compatible = "rockchip,rk3568-dw-mshc"; max-frequency = <150000000>; bus-width = <4>;
设备识别检查系统启动后查看内核日志或使用命令检查设备是否被正确识别。dmesg | grep -i mmc ls /dev/mmcblk* lsblk
分区与格式化对识别到的块设备进行分区和文件系统格式化。fdisk /dev/mmcblk0 mkfs.vfat /dev/mmcblk0p1 mkfs.ext4 /dev/mmcblk0p2
读写方式挂载后使用文件操作命令,或使用 dd 命令进行块设备操作,也可在程序中使用标准 I/O 或文件 I/O 接口。mount /dev/mmcblk0p1 /mnt/sdcard dd if=/dev/zero of=/dev/mmcblk0p1 bs=1M count=10

详细开发步骤

1. 硬件连接与检查

确保你的SD NAND芯片正确连接到RK3568的SDMMC控制器接口上,包括:

  • CMD(命令线)、CLK(时钟线)、DAT0-DAT3(数据线)等信号线的连接是否正确可靠。

  • 电源供应是否稳定,符合SD NAND芯片的要求。

  • 根据硬件设计,检查是否需要上拉电阻以及是否正确连接CD(卡检测)和WP(写保护)引脚(如果使用的话)。

2. 内核驱动配置

RK3568的Linux内核通常已经包含了SD/MMC控制器驱动(dw_mmc_rockchip或相关驱动),你需要确保相关配置是开启的:

  1. 进入内核配置菜单:

make ARCH=arm64 menuconfig

2.找到并启用以下配置(路径可能略有不同,请根据你的内核版本调整):

    • Device Drivers -> MMC/SD/SDIO card support -> Rockchip SDMMC Controller support (通常被标记为 CONFIG_MMC_DW_ROCKCHIP)

    • 确保通用的SDHCI和支持也包含在内(例如 CONFIG_MMC_SDHCICONFIG_MMC_SDHCI_PLTFM 等)。

    • 如果需要SDIO中断DMA支持,也请一并启用。

3. 设备树 (DTS) 配置

这是关键的一步,需要在设备树中正确配置SDMMC控制器节点。RK3568的SDMMC控制器节点通常已经定义,你可能需要根据你的板级硬件进行调整或确认。

  • 查找正确的控制器节点:RK3568通常有多个SDMMC控制器(如sdmmc0sdmmc1),请根据你的硬件连接选择正确的那个。

  • 配置节点参数:一个基本的SDMMC控制器配置示例(位于 arch/arm64/boot/dts/rockchip/rk3568-your-board.dts 或类似文件中):

&sdmmc0 { /* 根据实际使用的控制器修改,可能是sdmmc0, sdmmc1等 */
    status = "okay"; /* 确保状态为"okay" */
    bus-width = <4>; /* 数据线宽度:4线或8线,根据你的硬件设计 */
    cap-sd-highspeed; /* 支持SD高速模式 */
    cap-mmc-highspeed; /* 支持MMC高速模式 */
    /* 如果SD NAND需要1.8V信号,则启用 cap-sd-uhs-sdr12; cap-sd-uhs-sdr25; 等 */
    /* cap-sd-uhs-sdr104; */ /* 如果支持SDR104则启用 */
    /* cap-sd-uhs-ddr50; */  /* 如果支持DDR50则启用 */
    cd-gpios = <&gpio0 RK_PA4 GPIO_ACTIVE_LOW>; /* 卡检测GPIO(如果使用的话),根据实际硬件修改 */
    /* 如果你的设计没有CD引脚,或者SD NAND是永久连接的,可以考虑加上 broken-cd; 属性 */
    /* broken-cd; */ /* 表示忽略CD信号 */
    pinctrl-names = "default";
    pinctrl-0 = <&sdmmc0_bus4 &sdmmc0_clk &sdmmc0_cmd>; /* 引脚控制组,确保与你的硬件引脚复用一致! */
    vmmc-supply = <&vcc3v3_sd>; /* SD卡电源 regulator,根据实际硬件修改 */
    /* vqmmc-supply = <&vcc_1v8>; */ /* 如果支持1.8V UHS信号,需要IO电源 */
    clock-frequency = <150000000>; /* 最大时钟频率,单位Hz */
    disable-wp; /* 禁用写保护检查(如果硬件没有WP引脚) */
    //no-sdio;
    //no-mmc;
    // 更多属性请参考内核文档 Documentation/devicetree/bindings/mmc/rockchip,dw-mshc.yaml
};

特别注意

  • pinctrl-0:必须与你硬件上SDMMC控制器引脚所复用的功能完全匹配。错误的pinctrl设置是导致设备无法被识别的常见原因。请参考RK3568的TRM和你的板级原理图。

  • cd-gpios:如果你的硬件没有卡检测引脚,或者SD NAND是永久连接的,你可能需要添加 broken-cd; 属性,或者配置CD引脚为无效状态。

  • 电源 (vmmc-supplyvqmmc-supply):确保这些Regulator在你的设备树中正确定义并且能够正常上电。

  • 编译更新设备树后,务必将其包含到最终boot.img中并烧录到板子上

4. 构建内核与烧录

配置好设备树后,编译内核和设备树,然后将生成的boot.img等文件烧录到RK3568开发板上。

5. 系统启动与验证

系统启动后,通过以下命令检查SD NAND是否被成功识别:

# 查看内核启动信息,过滤MMC相关日志
dmesg | grep -i mmc
# 你应该能看到类似识别到SD卡或MMC设备的信息,以及分配的设备节点(如mmcblk0)

# 列出块设备
lsblk
# 或使用
fdisk -l

如果一切顺利,你应该能看到你的SD NAND设备(例如 /dev/mmcblk0),并且可以看到它的容量等信息。

6. 分区与文件系统

识别到设备后(如 /dev/mmcblk0),你可以对其进行分区和创建文件系统:

# 使用fdisk或parted进行分区
sudo fdisk /dev/mmcblk0
# 在交互界面中,常用命令:n (新建), p (打印), w (保存并退出), q (不保存退出)

# 创建文件系统,例如对第一个分区创建FAT32和ext4
sudo mkfs.vfat /dev/mmcblk0p1  # 创建FAT32文件系统
sudo mkfs.ext4 /dev/mmcblk0p2  # 创建ext4文件系统:cite[1]:cite[2]

7. 挂载与测试

创建文件系统后,可以挂载并进行读写测试:

# 创建挂载点
sudo mkdir -p /mnt/sd_nand

# 挂载分区(例如第一个分区)
sudo mount /dev/mmcblk0p1 /mnt/sd_nand

# 进行简单的读写测试
echo "Hello RK3568 SD NAND" > /mnt/sd_nand/test.txt
cat /mnt/sd_nand/test.txt

# 卸载
sudo umount /mnt/sd_nand

三种读写操作方式

根据 的介绍,对SD NAND进行读写操作主要有三种方式:

  1. 使用 dd 命令

    • 写入镜像或备份sudo dd if=your_image.img of=/dev/mmcblk0 bs=4M status=progress

    • 备份整个设备sudo dd if=/dev/mmcblk0 of=backup.img bs=4M status=progress

    • 注意:直接对块设备(如 /dev/mmcblk0)使用 dd 会绕过文件系统,操作需谨慎,否则可能导致数据丢失

  2. 使用块设备的标准接口(文件I/O或标准I/O)

    • 已挂载文件系统的分区上,就像操作普通文件一样使用 openwritereadclose(文件I/O)或 fopenfwritefreadfclose(标准I/O)。

    • 也可以直接对未挂载的块设备节点(如 /dev/mmcblk0p1)进行文件I/O操作,但这需要应用程序自行处理块大小、偏移等,不推荐常规文件存储使用。

  3. 使用 ioctl 系统调用

    • 这种方式允许对SD NAND进行更底层的控制,例如发送特定的SD命令、查询设备信息等,通常用于驱动开发或特定调试场景,一般应用程序不需要使用。

常见问题与排查

  • 问题:系统启动后找不到 /dev/mmcblk* 设备节点

    • status 是否为 "okay"

    • pinctrl-0 引用的引脚配置是否正确,是否与其他功能冲突。

    • 电源配置(vmmc-supply)是否正确,对应的Regulator是否 enable。

    • 排查

    1. 首先使用 dmesg | grep -i mmc 或 dmesg | grep -i sd 查看内核日志,检查控制器初始化是否成功,以及是否检测到卡。

    2. 检查设备树配置:

    3. 检查硬件连接,包括电源、时钟线和数据线。

    4. 确认内核配置中相关驱动已编译进内核或已以模块形式加载。

  • 问题:识别到的容量不正确或读写性能差

    • 排查

    1. 检查设备树中的 bus-width 和 cap-sd-highspeed/cap-mmc-highspeed 等属性是否配置正确。

    2. 检查时钟频率 (clock-frequency) 是否设置合理。

    3. 检查电源供电是否稳定充足。

  • 问题:读写操作出现错误(I/O Error)

    • 排查

    1. 检查硬件连接可靠性,是否存在虚焊或干扰。

    2. 检查电源质量。

    3. 尝试降低设备树中的时钟频率 (clock-frequency)。

    4. 检查文件系统是否损坏(尝试 fsck)。

总结

在RK3568上驱动SD NAND,核心工作在于正确的设备树配置,包括引脚控制、总线宽度、时钟和电源等。RK3568的Linux内核通常已经包含了所需的控制器驱动,你只需确保其启用并正确配置设备树即可。完成这些后,SD NAND的识别、分区、格式化和挂载使用就与普通的SD卡或eMMC存储基本一致了。

热门标签:SD NAND FLASH 贴片式TF卡 贴片式SD卡 SD FLASH NAND FLASH


下一篇:没有了!