1. 设备管理

AD16N、AW30N支持的设备有:系统flash、数据flash、SDMMC、u盘。

设备

otp方案

flash方案

系统flash

支持

数据flash

不支持

支持

SDMMC

支持

支持

u盘

支持

支持

设备管理模块依赖的头文件有:

apps\include_lib\dev_mg\device.h;
apps\app\bsp\device\device_app.h;

设备模块涉及的文件有:

apps\app\bsp\device\device_list.c;
apps\app\bsp\device\device_app.c;

其中应用层主要的函数有:

void *device_open(u32 index);
u32 device_close(u32 index);
void *device_obj(u32 index);
u32 device_online(void);
u32 device_status(u32 index, bool mode);

其中驱动层主要的函数有:

int devices_init_api();
bool dev_online(const char *name);
void *dev_open(const char *name, void *arg);
int dev_ioctl(void *device, int cmd, u32 arg);
int dev_close(void *device);
int dev_byte_read(void *_device, void *buf, u32 offset, u32 len);
int dev_byte_write(void *_device, void *buf, u32 offset, u32 len);
int dev_bulk_read(void *_device, void *buf, u32 sector, u32 sector_num);
int dev_bulk_write(void *_device, void *buf, u32 sector, u32 sector_num);
一般设备使用流程:
  • a.定义并赋值设备表;

  • b.开机调用函数devices_init_api()完成对所有设备的初始化;

  • c.调用函数device_open()并传入指定设备号,得到对应设备句柄;

  • d.调用函数dev_bulk_read() / dev_bulk_write()对设备进行读写等操作;

  • e.操作完成后,调用函数device_close()并传入指定设备号,关闭对应设备;


1.1. 设备注册表

设备注册表device_tab中注册了全部需要使用到的设备,其中成员如下:

  1. name:设备名称的字符串(自定义名称)

  2. ops:设备内部接口函数集合(不可更改)

  3. priv_data:设备使用的底层硬件资源及相关模式配置(可根据需要自行配置)

如果要添加设备,直接在下图注册表中接着添加。开机时初始化程序会自动执行初始化。

如果要添加设备,直接在下图注册表中接着添加。开机时初始化程序会自动执行初始化,设备注册表定义及初始化如图31.1所示。

"图1.1 设备注册表"

图1.1 设备注册表

上图对SD接口的配置包括了所使用的IO口、波特率、检测模式(包含检测方式和检测函数等)、数据宽度(可支持1线宽和4线宽)、中断优先级(0-7,数字越大,优先级越高)。

注册norflash_dev_ops接口时,起始地址及长度以512字节为单位,比如读取(dev_bulk_read)时带入地址1实际是从1*512=512开始读取,且写函数内部自带擦除操作,可以直接写入。

"图1.2  flash设备norflash_dev_ops接口"

图1.2 flash设备norflash_dev_ops接口

"图1.3 flash设备norfs_dev_ops接口"

图1.3 flash设备norfs_dev_ops接口配置信息

注意flash注册时有两组接口:norflash_dev_ops、norfs_dev_ops(位置见图1.2/图1.3)。

注册norflash_dev_ops接口时,起始地址及长度以512字节为单位,比如读取(dev_bulk_read)时带入地址1实际是从1*512=512开始读取,且写函数内部自带擦除操作,可以直接写入。

注册norfs_dev_ops接口时,起始地址及长度以1字节为单位,写函数内部没有擦除,调写函数前需确定要写入的内存地址中没有存入数据,如果有数据要自己写擦除操作。

(注意:读写flash设备操作不是调用图1.2/图1.3中函数,而是调用设备管理接口执行读写,块读写调用dev_bulk_read/dev_bulk_write,字节读写调用dev_byte_read/dev_byte_write)

图1.1中设备详细数据配置信息介绍见下图,SD接口配置信息见图1.4,flash配置信息图5。

"图1.4 SD接口配置信息"

图1.4 SD接口配置信息

"图1.5 外挂数据flash配置信息"

图1.5 外挂数据flash配置信息


1.2. 设备函数

1.2.1. 函数int devices_init_api()

应用层函数,该函数会将device_table设备表中注册的设备全部初始化,这一步一般在开机时进行。其内部会调用驱动层函数devices_init()。

1.2.2. 函数void *dev_open(u32 index)

应用层函数,此函数会根据传入的设备号,打开对应的设备并返回设备句柄,其内部会调用驱动层函数dev_open(),其中参数:

1、index:dev_open函数返回的设备句柄;
    ① SD0_INDEX:SD卡设备号;
    ② UDISK_INDEX:U盘设备号;
2、返回值:
    成功,返回对应设备句柄;
    失败,返回NULL;

1.2.3. 函数u32 device_close(u32 index)

应用层函数,此函数会根据传入的设备号,关闭对应的设备,其内部会调用驱动层函数dev_close(),其中参数。

1、index:dev_open函数返回的设备句柄;
    ① SD0_INDEX:SD卡设备号;
    ② UDISK_INDEX:U盘设备号;
2、返回值:
    成功,返回对应设备句柄;
    失败,返回NULL;

1.2.4. 函数void *device_obj(u32 index)

应用层函数,此函数会根据传入的设备号,返回对应的设备句柄,其中参数。

1、index:dev_open函数返回的设备句柄;
① SD0_INDEX:SD卡设备号;
② UDISK_INDEX:U盘设备号;
2、返回值:
    成功,返回对应设备句柄;
    失败,返回NULL;

1.2.5. 函数u32 device_online(void)

应用层函数,此函数会返回一个u32变量,每一个bit置1代表对应设备在线。

1.2.6. 函数u32 device_status(u32 index, bool mode)

应用层函数,此函数会根据传入的设备号,返回对应的设备状态,根据mode参数选择当发现设备不在线时是否关闭对应设备模块,其中参数:

1、index:dev_open函数返回的设备句柄;
    ① SD0_INDEX:SD卡设备号;
    ② UDISK_INDEX:U盘设备号;
2、mdde:查询模式;
    ① 0:只查询状态;
    ② 1:查询到对应设备不在线时,关闭对应设备模块;
3、返回值:
    设备在线,返回0;
    设备离线,返回响应错误值;

1.2.7. 函数int dev_bulk_read(void *_device, void *buf, u32 offset, u32 len)

本函数实现从设备某个地址offset读取长度为len的数据到buf的功能。

1、_device:dev_open函数返回的设备句柄;
2、buf:缓存,保存读出的数据,需自定义;
3、offset:读取起始设备地址;
4、len:需要读取的长度;
5、返回值:正常情况返回长度即形参Len,错误时返回0;

1.2.8. 函数int dev_bulk_write(void *_device, void *buf, u32 offset, u32 len)

本函数实现把长度为len的buf数据写入设备的功能,写入起始地址为offset。

1、_device:dev_open函数返回的设备句柄;
2、Buf    :缓存,保存着需写入的数据;
3、Offset :写入起始设备地址;
4、Len    :需要写入的长度。
5、返回值:正常情况返回长度即形参Len,错误时返回0
*注意:形参offset、len范围要在图3.7定义的起始地址和大小范围内才能正常操作设备。*

1.2.9. 函数int dev_ioctl(void *device, int cmd, u32 arg)

本函数实现获取设备信息或设置设备信息,擦除设备等功能。

1、device:设备句柄;
2、cmd:命令,include_lib/dev_mg/ioctl_cmds.h内能查到定义;详细命令表参见图2.1。
    常用命令如下表,(注:不同设备支持命令会有差别,并不是支持所有命令)
3、arg:获取信息时:用作保存返回的设备信息如容量、ID等;
    擦出时:用作带入要擦除的地址。
4、返回值:反应函数运行状态。
    0:表示正常
    其他值:出错

cmd 命令

命令含义

IOCTL_CMD_SUSPEND

设备挂起

IOCTL_CMD_RESUME

设备解挂

IOCTL_GET_ID

获取设备ID

IOCTL_GET_SECTOR_SIZE

获取设备扇区大小

IOCTL_GET_BLOCK_SIZE

获取设备块大小

IOCTL_GET_CAPACITY

获取设备容量

IOCTL_GET_STATUS

获取设备状态

IOCTL_ERASE_SECTOR

擦除设备扇区

IOCTL_ERASE_BLOCK

擦除设备块

IOCTL_ERASE_CHIP

对设备整片擦除

"图2.1 cmd可选择的命令"

图2.1 cmd可选择的命令

1.2.10. 函数int dev_close(void *device)

本函数实现关闭设备的功能,对于一些设备调用此函数能省电。

1、device:dev_open返回的设备句柄;
2、返回值:暂无意义

1.2.11. 设备管理常见问题介绍

1.2.11.1. 外挂flash有两套 OPS 接口函数

默认SDK下,外挂flash使用的是 norfs_dev_ops 接口,
app_config.h 里打开 TCFG_USB_EXFLASH_UDISK_ENABLE 宏后, 外挂flash使用的是 norflash_dev_ops 接口。

备注

norfs_dev_ops 接口 在读写接口里只有 字节读字节写
norflash_dev_ops 接口 在 读写接口里只有 块读块写
使用不同文件系统时,要求的读写接口不一样,如:
syd 和 norfs 文件系统 需要 字节读字节写 接口。
fat 文件系统 需要 块读块写 接口。
因此在默认的SDK下 使用不同的接口时,支持的文件系统不同。