全志 T113 与 SDNAND 的典型连接方式如下:
| T113 引脚 | SDNAND 引脚 | 描述 |
|---|---|---|
| GPIO0_A0 | CLK | 时钟线 |
| GPIO0_A1 | CMD | 命令线 |
| GPIO0_A2 | DAT0 | 数据线 0 |
| GPIO0_A3 | DAT1 | 数据线 1 |
| GPIO0_A4 | DAT2 | 数据线 2 |
| GPIO0_A5 | DAT3 | 数据线 3 |
| VDD_3V3 | VCC | 电源(3.3V) |
| GND | GND | 地 |
注意事项:
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 = <®_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 读写测试程序:
#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;}arm-linux-gnueabihf-gcc -o sdnand_test sdnand_test.c
将程序复制到开发板
使用 scp 或 U 盘将生成的sdnand_test可执行文件复制到开发板上
运行测试
# 确保有执行权限chmod +x sdnand_test# 运行测试(需要root权限)sudo ./sdnand_test /dev/mmcblk0
通过以上步骤,你应该能够成功驱动全志 T113 上的 SDNAND 设备。
电话:176-6539-0767
Q Q:135-0379-986
邮箱:1350379986@qq.com
地址:深圳市南山区后海大道1021号C座