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中注册了全部需要使用到的设备,其中成员如下:
name:设备名称的字符串(自定义名称)
ops:设备内部接口函数集合(不可更改)
priv_data:设备使用的底层硬件资源及相关模式配置(可根据需要自行配置)
如果要添加设备,直接在下图注册表中接着添加。开机时初始化程序会自动执行初始化。
如果要添加设备,直接在下图注册表中接着添加。开机时初始化程序会自动执行初始化,设备注册表定义及初始化如图31.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.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.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可选择的命令
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 接口。
备注
syd 和 norfs 文件系统 需要 字节读 和 字节写 接口。fat 文件系统 需要 块读 和 块写 接口。