在RK3568平台上驱动SD NAND,本质上和驱动标准的SD卡或eMMC存储设备类似,因为SD NAND遵循相同的SD协议。下面我将为你梳理一下主要的开发要点和步骤。
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 |
确保你的SD NAND芯片正确连接到RK3568的SDMMC控制器接口上,包括:
CMD(命令线)、CLK(时钟线)、DAT0-DAT3(数据线)等信号线的连接是否正确可靠。
电源供应是否稳定,符合SD NAND芯片的要求。
根据硬件设计,检查是否需要上拉电阻以及是否正确连接CD(卡检测)和WP(写保护)引脚(如果使用的话)。
RK3568的Linux内核通常已经包含了SD/MMC控制器驱动(dw_mmc_rockchip
或相关驱动),你需要确保相关配置是开启的:
进入内核配置菜单:
make ARCH=arm64 menuconfig
2.找到并启用以下配置(路径可能略有不同,请根据你的内核版本调整):
Device Drivers -> MMC/SD/SDIO card support -> Rockchip SDMMC Controller support
(通常被标记为 CONFIG_MMC_DW_ROCKCHIP
)
确保通用的SDHCI和支持也包含在内(例如 CONFIG_MMC_SDHCI
, CONFIG_MMC_SDHCI_PLTFM
等)。
如果需要SDIO中断或DMA支持,也请一并启用。
这是关键的一步,需要在设备树中正确配置SDMMC控制器节点。RK3568的SDMMC控制器节点通常已经定义,你可能需要根据你的板级硬件进行调整或确认。
查找正确的控制器节点:RK3568通常有多个SDMMC控制器(如sdmmc0
, sdmmc1
),请根据你的硬件连接选择正确的那个。
配置节点参数:一个基本的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-supply
, vqmmc-supply
):确保这些Regulator在你的设备树中正确定义并且能够正常上电。
编译更新设备树后,务必将其包含到最终boot.img中并烧录到板子上。
配置好设备树后,编译内核和设备树,然后将生成的boot.img
等文件烧录到RK3568开发板上。
系统启动后,通过以下命令检查SD NAND是否被成功识别:
# 查看内核启动信息,过滤MMC相关日志
dmesg | grep -i mmc
# 你应该能看到类似识别到SD卡或MMC设备的信息,以及分配的设备节点(如mmcblk0)
# 列出块设备
lsblk
# 或使用
fdisk -l
如果一切顺利,你应该能看到你的SD NAND设备(例如 /dev/mmcblk0
),并且可以看到它的容量等信息。
识别到设备后(如 /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]
创建文件系统后,可以挂载并进行读写测试:
# 创建挂载点
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
使用 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
会绕过文件系统,操作需谨慎,否则可能导致数据丢失。
使用块设备的标准接口(文件I/O或标准I/O):
在已挂载文件系统的分区上,就像操作普通文件一样使用 open
, write
, read
, close
(文件I/O)或 fopen
, fwrite
, fread
, fclose
(标准I/O)。
也可以直接对未挂载的块设备节点(如 /dev/mmcblk0p1
)进行文件I/O操作,但这需要应用程序自行处理块大小、偏移等,不推荐常规文件存储使用。
使用 ioctl
系统调用:
这种方式允许对SD NAND进行更底层的控制,例如发送特定的SD命令、查询设备信息等,通常用于驱动开发或特定调试场景,一般应用程序不需要使用。
问题:系统启动后找不到 /dev/mmcblk*
设备节点
status
是否为 "okay"
。
pinctrl-0
引用的引脚配置是否正确,是否与其他功能冲突。
电源配置(vmmc-supply
)是否正确,对应的Regulator是否 enable。
排查:
首先使用 dmesg | grep -i mmc
或 dmesg | grep -i sd
查看内核日志,检查控制器初始化是否成功,以及是否检测到卡。
检查设备树配置:
检查硬件连接,包括电源、时钟线和数据线。
确认内核配置中相关驱动已编译进内核或已以模块形式加载。
问题:识别到的容量不正确或读写性能差
排查:
检查设备树中的 bus-width
和 cap-sd-highspeed
/cap-mmc-highspeed
等属性是否配置正确。
检查时钟频率 (clock-frequency
) 是否设置合理。
检查电源供电是否稳定充足。
问题:读写操作出现错误(I/O Error)
排查:
检查硬件连接可靠性,是否存在虚焊或干扰。
检查电源质量。
尝试降低设备树中的时钟频率 (clock-frequency
)。
检查文件系统是否损坏(尝试 fsck
)。
在RK3568上驱动SD NAND,核心工作在于正确的设备树配置,包括引脚控制、总线宽度、时钟和电源等。RK3568的Linux内核通常已经包含了所需的控制器驱动,你只需确保其启用并正确配置设备树即可。完成这些后,SD NAND的识别、分区、格式化和挂载使用就与普通的SD卡或eMMC存储基本一致了。
上一篇:sdnand的cmd13使用注意
下一篇:没有了!