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

全志 T113 驱动 SDNAND 详细步骤

SD NAND-贴片式TF卡-贴片式SD卡-免费测试2025-06-1619

一、硬件接线

全志 T113 与 SDNAND 的典型连接方式如下:

T113 引脚SDNAND 引脚描述
GPIO0_A0CLK时钟线
GPIO0_A1CMD命令线
GPIO0_A2DAT0数据线 0
GPIO0_A3DAT1数据线 1
GPIO0_A4DAT2数据线 2
GPIO0_A5DAT3数据线 3
VDD_3V3VCC电源(3.3V)
GNDGND

注意事项:

  1. 建议在 CLK 线上串联 22Ω 电阻用于信号匹配

  2. 数据线和命令线建议上拉 10KΩ 到 3.3V

  3. 确保电源稳定,建议使用 10μF 和 0.1μF 电容并联滤波

二、内核配置与驱动编译

  1. 获取 T113 内核源码

git clone https://github.com/allwinner-zh/linux-5.4.git -b t113-v1.0cd linux-5.4

配置内核

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- t113_evb_defconfigmake ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig

在菜单配置中选择:

Device Drivers --->
    <*> MMC/SD/SDIO card support --->
        <*> MMC block device driver
        <*> Secure Digital Host Controller Interface support
        <*> Allwinner SD/MMC Host Controller support

编译内核与驱动

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- uImage dtbs modules -j4

三、设备树配置

修改arch/arm/boot/dts/sunxi-t113.dtsi文件,添加 SDNAND 控制器配置:

sdmmc1: mmc@1c13000 {
    compatible = "allwinner,sun8i-h3-mmc";
    reg = <0x01c13000 0x1000>;
    interrupts = <GIC_SPI 36 IRQ_TYPE_LEVEL_HIGH>;
    clocks = <&ccu CLK_BUS_MMC1>, <&ccu CLK_MMC1>;
    clock-names = "ahb", "mmc";
    resets = <&ccu RST_BUS_MMC1>;
    reset-names = "mmc";
    bus-width = <4>;
    vmmc-supply = <&reg_vcc3v3>;
    non-removable;
    status = "okay";
    
    pinctrl-names = "default";
    pinctrl-0 = <&mmc1_pins>;
};

&pio {
    mmc1_pins: mmc1-pins {
        allwinner,pins = "PA0", "PA1", "PA2", "PA3", "PA4", "PA5";
        allwinner,function = "mmc1";
        allwinner,pull = <1 1 1 1 1 1>;  // 上拉
    };
};

四、SDNAND 读写测试程序

下面是一个简单的 SDNAND 读写测试程序:

#include <stdio.h>#include <stdlib.h>#include <fcntl.h>#include <unistd.h>#include <string.h>#define BLOCK_SIZE 512#define TEST_BLOCKS 10int main(int argc, char *argv[]) {
    int fd;
    char *device = "/dev/mmcblk0";
    unsigned char buffer[BLOCK_SIZE * TEST_BLOCKS];
    unsigned char read_buffer[BLOCK_SIZE * TEST_BLOCKS];
    int i, ret;
    
    // 检查参数
    if (argc > 1) {
        device = argv[1];
    }
    
    // 打开设备
    fd = open(device, O_RDWR);
    if (fd < 0) {
        perror("无法打开设备");
        return -1;
    }
    
    // 填充测试数据
    for (i = 0; i < BLOCK_SIZE * TEST_BLOCKS; i++) {
        buffer[i] = i % 256;
    }
    
    // 写入测试数据
    printf("写入测试数据到块设备...
");
    ret = write(fd, buffer, BLOCK_SIZE * TEST_BLOCKS);
    if (ret != BLOCK_SIZE * TEST_BLOCKS) {
        perror("写入失败");
        close(fd);
        return -1;
    }
    
    // 重新定位到开始位置
    lseek(fd, 0, SEEK_SET);
    
    // 读取测试数据
    printf("从块设备读取数据...
");
    ret = read(fd, read_buffer, BLOCK_SIZE * TEST_BLOCKS);
    if (ret != BLOCK_SIZE * TEST_BLOCKS) {
        perror("读取失败");
        close(fd);
        return -1;
    }
    
    // 验证数据
    printf("验证数据...
");
    for (i = 0; i < BLOCK_SIZE * TEST_BLOCKS; i++) {
        if (buffer[i] != read_buffer[i]) {
            printf("数据验证失败!偏移量:%d,期望值:0x%02X,实际值:0x%02X
", 
                   i, buffer[i], read_buffer[i]);
            close(fd);
            return -1;
        }
    }
    
    printf("SDNAND读写测试成功!
");
    
    close(fd);
    return 0;}

五、编译与运行测试程序

  1. 编译测试程序

arm-linux-gnueabihf-gcc -o sdnand_test sdnand_test.c
  • 将程序复制到开发板
    使用 scp 或 U 盘将生成的sdnand_test可执行文件复制到开发板上

  • 运行测试

# 确保有执行权限chmod +x sdnand_test# 运行测试(需要root权限)sudo ./sdnand_test /dev/mmcblk0

六、故障排除

  1. 设备未识别

    • 检查硬件连接是否正确

    • 确认设备树配置无误

    • 使用dmesg命令查看内核日志

  2. 读写失败

    • 检查电源是否稳定

    • 尝试降低 SDNAND 的工作频率

    • 使用hexdump工具手动验证数据

通过以上步骤,你应该能够成功驱动全志 T113 上的 SDNAND 设备。

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


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

深圳市芯存者科技有限公司

售前咨询
售前咨询
售后服务
售后服务
联系我们

电话:176-6539-0767

Q Q:135-0379-986

邮箱:1350379986@qq.com

地址:深圳市南山区蛇口街道后海大道1021号C座C422W8

在线客服 在线客服 QQ客服 微信客服 淘宝店铺 联系我们 返回顶部