以下是针对全志T113-S3驱动SD NAND的完整指南,涵盖硬件设计(SDIO/SPI模式)、软件驱动开发流程、常见问题排查及注意事项:
适用场景:
需要高速数据传输(如大文件读写)
支持4位或8位总线宽度
引脚连接:
T113-S3引脚 | SD NAND引脚 | 功能描述 | 注意事项 |
---|---|---|---|
PC0 | CLK | 时钟信号 | 信号线短,阻抗匹配 |
PC1 | CMD | 命令/响应线 | 上拉电阻(10kΩ) |
PC2-PC5 | DAT0-DAT3 | 数据线 | 等长处理(误差≤50mil) |
VCC3.3 | VCC | 电源(3.3V) | 需确认NAND电压规格 |
GND | GND | 地 | 就近接地 |
关键设计:
阻抗匹配:CLK信号线串联33Ω电阻,避免反射干扰。
电源滤波:在VCC引脚并联0.1μF+10μF电容滤除高频/低频噪声。
适用场景:
引脚资源有限
低速数据读写需求
引脚连接:
T113-S3引脚 | SD NAND引脚 | 功能描述 | 注意事项 |
---|---|---|---|
PC2 | SCK | 时钟信号 | 降低频率防干扰 |
PC4 | MOSI | 主发从收 | 建议使用屏蔽线 |
PC5 | MISO | 主收从发 | 避免与高速信号并行 |
PC3 | CS | 片选信号 | 上拉电阻(4.7kΩ) |
PC6 | WP | 写保护(可选) | 接地禁用保护 |
PC7 | HOLD | 保持(可选) | 上拉电阻(10kΩ) |
关键设计:
上拉电阻:CS、WP、HOLD必须上拉,防止信号悬空。
时钟频率:建议初始设置为24MHz,稳定后逐步提升。
SDIO模式配置:
// 文件路径:arch/arm/boot/dts/sun8i-t113s3.dtsi &mmc0 { pinctrl-names = "default"; pinctrl-0 = <&mmc0_pins>; // 绑定SDIO引脚组 vmmc-supply = <®_vcc3v3>; // 电源控制 bus-width = <4>; // 4位数据线 max-frequency = <50000000>; // 50MHz cap-sd-highspeed; non-removable; // 固定设备(如eMMC/NAND) status = "okay"; };
SPI模式配置:
// 文件路径:arch/arm/boot/dts/sun8i-t113s3.dtsi &spi0 { pinctrl-names = "default"; pinctrl-0 = <&spi0_pins>; // 绑定SPI引脚组 status = "okay"; spi-max-frequency = <24000000>; // 24MHz spi_nand: spi-nand@0 { compatible = "spi-nand"; reg = <0>; // 片选0 spi-tx-bus-width = <1>; // 单线发送 spi-rx-bus-width = <1>; // 单线接收 nand-ecc-engine = <&nand_ecc>; // ECC引擎 }; };
启用驱动模块:
bash
make menuconfig
SDIO模式:
make -j8 && make dtbs # 编译内核与设备树sudo dd if=u-boot-sunxi-with-spl.bin of=/dev/sdX bs=1k seek=8 # 烧录到SD卡
Device Drivers → MMC/SD/SDIO card support → [*] Sunxi MMC controller support (MMC0) [*] MMC block device driver
SPI模式:
Device Drivers → MTD → [*] SPI-NAND device support [*] Cached read support
编译与烧录:
make -j8 && make dtbs # 编译内核与设备树sudo dd if=u-boot-sunxi-with-spl.bin of=/dev/sdX bs=1k seek=8 # 烧录到SD卡
检查步骤:
测量VCC电压是否稳定(3.3V±5%)。
使用示波器检测CLK/SCK信号是否存在且频率正确。
执行dmesg | grep mmc
(SDIO)或dmesg | grep spi
(SPI)查看驱动加载日志。
典型日志分析:
[ 2.560000] mmc0: new high-speed SDIO card at address 0001 # SDIO识别成功[ 3.120000] spi-nand spi0.0: SPI NAND ID: 0xef 0xaa 0x21 # SPI识别成功
解决方案:
降低时钟频率:在设备树中将max-frequency
减半测试。
调整驱动强度:在DTS的引脚配置中添加drive-strength = <30>;
(单位mA)。
ECC配置:修改ECC算法(如从软ECC切换到硬件引擎):
nand-ecc-mode = "hw"; nand-ecc-strength = <4>; // 根据NAND规格调整
根文件系统挂载失败:
检查bootargs
中的root=/dev/mtdblockX
是否与实际分区一致。
使用mtdinfo /dev/mtd0
确认分区表正确性。
硬件设计:
SDIO数据线长度差控制在±5%以内,避免时序偏移。
SPI模式下,CS信号线长度应短于其他信号线,减少片选延迟。
软件调试:
优先使用全志官方SDK(如Tina Linux),避免社区内核兼容性问题。
使用mmc-utils
(SDIO)或mtd-utils
(SPI)工具验证底层通信。
量产建议:
对NAND进行坏块扫描,预留至少2%的冗余块。
启用UBI文件系统(如ubifs
)以提高NAND寿命。
调试工具:
spidev_test
:SPI通信测试工具(需内核启用CONFIG_SPI_SPIDEV
)。
mmc_test
:SDIO协议层测试模块。
文档链接:
全志T113芯片手册:Allwinner T113 Datasheet
Linux MTD文档:MTD Subsystem Documentation