安全数字输入/输出接口
1 功能概述
SDIO既支持作为Host控制TF卡,又可以作为slave无线网卡收发数据。作为Host时,SDK工程中使用fatfs文件系统对TF卡进行文件管理,用户只需要进行简单的配置就可以使用SD卡,本文档对操作fatfs文件系统的cli命令进行介绍。
2 代码路径
- demo路径:
components\bk_cli\cli_fatfs.ccomponents\fatfs\test_fatfs.c
- 驱动源码路径:
middleware\driver\sd_card\sd_card_driver.cmiddleware\driver\sdio_host\sdio_host_driver.c
3 SDIO相关宏配置
NAME
Description
File
value
CONFIG_FATFS
FATFS使能配置
middleware\soc\bk7258\bk7258.defconfigy
CONFIG_FATFS_SDCARD
FATFS使能SD卡存储方式配置
middleware\soc\bk7258\bk7258.defconfigy
CONFIG_SDCARD
SD卡使能配置
middleware\soc\bk7258\bk7258.defconfigy
CONFIG_SDCARD_DEFAULT_CLOCK_FREQ
SD卡读写数据时钟配置sdio_host_clock_freq_t,14对应20M, 时钟数值可根据需求进行调整,最大支持40MHz
middleware\soc\bk7258\bk7258.defconfig14
CONFIG_SDCARD_POWER_GPIO_CTRL
SD卡使能LDO低功耗投票配置
middleware\soc\bk7258\bk7258.defconfigy
CONFIG_SDCARD_DEBUG_SUPPORT
SD卡使能DEBUG dump寄存器配置
middleware\soc\bk7258\bk7258.defconfign
CONFIG_SDCARD_BUSWIDTH_4LINE
SD卡使能四线配置
middleware\soc\bk7258\bk7258.defconfign
CONFIG_SDIO_4LINES_EN
SDIO使能四线配置
middleware\soc\bk7258\bk7258.defconfign
CONFIG_SDIO
SDIO使能配置
middleware\soc\bk7258\bk7258.defconfign
CONFIG_SDIO_V1P0
SDIO使能V1P0版本配置
middleware\soc\bk7258\bk7258.defconfign
CONFIG_SDIO_V2P0
SDIO使能V2P0版本配置,通常建议Host使用v2p0
middleware\soc\bk7258\bk7258.defconfigy
CONFIG_SDIO_V2P1
SDIO使能V2P1版本配置,通常建议slave使用v2p1
middleware\soc\bk7258\bk7258.defconfign
CONFIG_SDIO_GDMA_EN
SDIO使能DMA配置,建议slave使能,Host关闭
middleware\soc\bk7258\bk7258.defconfign
CONFIG_SDIO_HOST
SDIO使能Host配置
middleware\soc\bk7258\bk7258.defconfigy
CONFIG_SDIO_HOST_DEFAULT_CLOCK_FREQ
SD卡初始化时钟配置sdio_host_clock_freq_t,7对应100K
middleware\soc\bk7258\bk7258.defconfig7
CONFIG_SDIO_HOST_CLR_WRITE_INT
无效宏配置,老项目用
middleware\soc\bk7258\bk7258.defconfign
CONFIG_SDIO_PM_CB_SUPPORT
SDIO Host使能低功耗投票配置
middleware\soc\bk7258\bk7258.defconfigy
CONFIG_PIN_SDIO_GROUP_1
SDIO Host使能PIN脚组合1配置,即P14~P19
middleware\soc\bk7258\bk7258.defconfign
CONFIG_SDIO_SLAVE
SDIO使能Slave配置
middleware\soc\bk7258\bk7258.defconfign
CONFIG_SDIO_CHANNEL_EN
SDIO Slave使能通道管理配置
middleware\soc\bk7258\bk7258.defconfign
CONFIG_SDIO_BIDIRECT_CHANNEL_EN
SDIO Slave使能双向收发配置
middleware\soc\bk7258\bk7258.defconfign
CONFIG_GPIO_NOTIFY_TRANSACTION_EN
SDIO Slave使能GPIO中断配置
middleware\soc\bk7258\bk7258.defconfign
CONFIG_SDIO_TEST_EN
SDIO Slave使能测试用例
middleware\soc\bk7258\bk7258.defconfign
CONFIG_SDIO_DEBUG_EN
SDIO Slave使能DEBUG配置
middleware\soc\bk7258\bk7258.defconfign
CONFIG_GPIO_1V8_EN
GPIO 切换至1.8V配置
middleware\soc\bk7258\bk7258.defconfign
CONFIG_GPIO_1V8_SRC_AUTO_SWITCH_EN
GPIO 1.8V低功耗相关配置
middleware\soc\bk7258\bk7258.defconfign
CONFIG_GPIO_DEFAULT_SET_SUPPORT
GPIO 按照GPIO map表进行初始化
middleware\soc\bk7258\bk7258.defconfign
- 适配TF卡注意事项:
作为Host要加外部上拉,上拉电阻通常为10K;
- SDIO Host接TF卡时,建议关闭如下两个宏,前者是为了确保时序正确,后者宏已默认禁用 防止TF卡使用时自动下电;
CONFIG_SDIO_GDMA_ENCONFIG_SDCARD_POWER_GPIO_CTRL_AUTO_POWERDOWN_WHEN_IDLE
作为Host搭载TF卡或SD Nand时宏配置示例:
## SDIO Host config#CONFIG_FATFS=yCONFIG_FATFS_SDCARD=yCONFIG_SDCARD=yCONFIG_SDCARD_DEFAULT_CLOCK_FREQ=14CONFIG_SDCARD_POWER_GPIO_CTRL=yCONFIG_SDCARD_DEBUG_SUPPORT=nCONFIG_SDCARD_BUSWIDTH_4LINE=nCONFIG_SDIO_4LINES_EN=nCONFIG_SDIO=yCONFIG_SDIO_V1P0=nCONFIG_SDIO_V2P0=yCONFIG_SDIO_V2P1=nCONFIG_SDIO_GDMA_EN=nCONFIG_SDIO_HOST=yCONFIG_SDIO_HOST_DEFAULT_CLOCK_FREQ=7CONFIG_SDIO_HOST_CLR_WRITE_INT=yCONFIG_SDIO_PM_CB_SUPPORT=yCONFIG_PIN_SDIO_GROUP_1=nCONFIG_SDIO_SLAVE=n# end of SDIO
- 作为Slave功能宏配置示例:
## SDIO slave config#CONFIG_FATFS=nCONFIG_FATFS_SDCARD=nCONFIG_SDCARD=nCONFIG_GPIO_DEFAULT_SET_SUPPORT=yCONFIG_SDIO=yCONFIG_SDIO_V1P0=nCONFIG_SDIO_V2P0=nCONFIG_SDIO_V2P1=yCONFIG_SDIO_HOST=nCONFIG_SDIO_SLAVE=yCONFIG_SDIO_CHANNEL_EN=yCONFIG_SDIO_BIDIRECT_CHANNEL_EN=yCONFIG_SDIO_GDMA_EN=yCONFIG_GPIO_NOTIFY_TRANSACTION_EN=yCONFIG_SDIO_4LINES_EN=nCONFIG_SDIO_TEST_EN=yCONFIG_SDIO_DEBUG_EN=yCONFIG_GPIO_1V8_EN=nCONFIG_GPIO_1V8_SRC_AUTO_SWITCH_EN=n# end of SDIO
4 SDIO相关PIN脚描述
SDIO对应两个PIN脚组合,用户可以根据硬件分布情况,使用其中一组:
PIN功能
组0
组1
CLK
GPIO2
GPIO14
CMD
GPIO3
GPIO15
Data0
GPIO4
GPIO16
Data1
GPIO5
GPIO17
Data2
GPIO10
GPIO18
Data3
GPIO11
GPIO19
5 cli命令简介
SDK工程中已经移植好fatfs文件系统,fatfs相关API介绍见:
http://elm-chan.org/fsw/ff/00index_e.htmldemo支持的cli命令如下表:
Command
Param
Description
fatfstest {M|U} {DISK_NUMBER}
{M|U}: mount|unmount
apply for or release the workspace for logical drivers
{DISK_NUMBER}:logical driver number
fatfstest G {DISK_NUMBER}
{DISK_NUMBER}:logical driver number
get the size of remaining disk space
fatfstest S {DISK_NUMBER}
{DISK_NUMBER}:logical driver number
scan all files on disk
fatfstest F {DISK_NUMBER}
{DISK_NUMBER}:logical driver number
format disk
fatfstest R {DISK_NUMBER}{file_name}
{length}
{DISK_NUMBER}:logical driver number
read specified length of data
from the file
{file_name}:file to story read data
{length}: length to be read
fatfstest W {DISK_NUMBER}{file_name}
{content_p}{content_len}
{DISK_NUMBER}:logical driver number
write data to a file
{file_name}:file to be written
{content_p}: pointer to the data to be written
{content_len}:length to be written
fatfstest D {DISK_NUMBER}{file_name}
{start_addr}{content_len}
{DISK_NUMBER}:logical driver number
read the specified length of data from the specified address and write it to the specified file
{file_name}:file to be written
{start_addr}: start address for reading
{content_len}:length to be written
fatfstest A {DISK_NUMBER}{file_name}
{content_len}{test_cnt} {start_addr}
{DISK_NUMBER}:logical driver number
auto test,write the data to the file and then read it, and compare the result
note: the data written to the SD card is read from the specified start_addr
{file_name}:file to be written
{content_len}: length of comparison
{test_cnt}:number of cycle tests
{start_addr}:start address for reading
disk_number的定义:
typedef enum { DISK_NUMBER_RAM = 0, DISK_NUMBER_SDIO_SD = 1, DISK_NUMBER_UDISK = 2, DISK_NUMBER_FLASH = 3, DISK_NUMBER_COUNT, } DISK_NUMBER;
6 演示介绍
demo执行的步骤如下:
1、将SD卡插入开发板,GPIO 连接方式如下(因为GPIO复用,此demo SDIO配置为单线模式):
SD_CLK----GPIO2 SD_CMD----GPIO3 SD_D0-----GPIO4 SD_D1-----GPIO5 SD_D2-----GPIO10 SD_D3-----GPIO112、SD卡操作
以下命令是基于CP的,AP侧可在命令前添加“cpu1”字段。
fatfstest M 1 //挂载SD卡
[16:06:10.103]发→◇fatfstest M 1 [16:06:10.108]收←◆fatfstest M 1 error file name,use defaultfilename.txt sd_card:I(203942):sd card has inited fmt=2 fmt2=0 Fatfs:I(203944):f_mount OK! Fatfs:I(203944):----- test_mount 1 over ----- - **fatfstest S 1** //扫描SD卡[16:11:39.041]发→◇fatfstest S 1 [16:11:39.046]收←◆fatfstest S 1 error file name,use defaultfilename.txt Fatfs:I(532878): ----- scan_file_system 1 start ----- Fatfs:I(532878):1:/ Fatfs:I(532880):1:/autotest_400.txt Fatfs:I(532882):1:/dump_1.txt Fatfs:I(532884):scan_files OK! Fatfs:I(532886):----- scan_file_system 1 over ----- - **fatfstest W 1 test.txt acl_bk7236_write_to_test 24** //向文件test.txt中写入字符串"acl_bk7236_write_to_test"[16:15:02.687]发→◇fatfstest W 1 test.txt acl_bk7236_write_to_test 24 [16:15:02.696]收←◆fatfstest W 1 test.txt acl_bkFatfs:I(736530): ----- test_fatfs 1 start ----- Fatfs:I(736530):f_open "1:/test.txt" Fatfs:I(736530):.7236_write_to_test 24 [16:15:02.837]收←◆TODO:FATFS sync feature Fatfs:I(736678):f_close OK Fatfs:I(736678):----- test_fatfs 1 over ----- append and write:test.txt [16:15:02.866]收←◆,acl_bk7236_write_to_test - **fatfstest R 1 test.txt 32** //从文件test.txt中读取32字节数据[16:18:30.473]发→◇fatfstest R 1 test.txt 32 [16:18:30.478]收←◆fatfstest R 1 test.txt 32 Fatfs:I(944312): ----- test_fatfs 1 start ----- Fatfs:I(944312):f_open "1:/test.txt" Fatfs:I(944314):will read left_len = 24 Fatfs:I(944314):f_read start:24 bytes ====== f_read one cycle - dump(len=24) begin ====== 61 63 6c 5f 62 6b 37 32 35 36 5f 77 72 69 74 65 5f 74 6f 5f 74 65 73 74 ====== f_read one cycle - dump(len=24) end ====== Fatfs:I(944328):f_read one cycle finish:left_len = 0 Fatfs:I(944332):f_read: read total byte = 24 Fatfs:I(944336):f_close OK Fatfs:I(944338):----- test_fatfs 1 over ----- read test.txt, len_h = 0, len_l = 32 - **fatfstest A 1 autotest.txt 2222 1 0** //从flash 0x0 地址读取2222字节数据保存到SD卡autotest.txt中,再将数据从autotest.txt中读取出来进行比较;此操作进行1次[16:31:11.077]发→◇fatfstest A 1 autotest.txt 2222 1 0 [16:31:11.083]收←◆fatfstest A 1 autotest.txt 2222 1 0 [16:31:11.143]收←◆TODO:FATFS sync feature Fatfs:I(195362):auto test succ - **fatfstest D 1 dump.txt 671285248 10240** //从0x0地址读取10240字节数据保存到文件dump.txt中[16:33:15.934]发→◇fatfstest D 1 dump.txt 671285248 10240 [16:33:15.939]收←◆fatfstest D 1 dump.txt 671285248 10240 Fatfs:I(320154): ----- test_fatfs_dump 1 start ----- Fatfs:I(320154):file_name=dump.txt,start_addr=0x28030000,len=10240 Fatfs:I(320154):f_open start "1:/dump.txt" Fatfs:I(320154):f_write start Fatfs:I(320158):f_write end len = 10240 Fatfs:I(320158):f_lseek start Fatfs:I(320158):f_close start - **fatfstest F 1** //对SD卡进行格式化[17:43:49.985]发→◇fatfstest F 1 [17:43:49.990]收←◆fatfstest F 1 error file name,use defaultfilename.txt sd_card:I(327564):sd card has inited part=0 sd_card:I(327564):card ver=2.0,size:0x01dacc00 sector(sector=512bytes) sdcard sector cnt=31116288 Fatfs:I(333054):f_mkfs OK! format :1