设备管理 ===================================== AD16N支持的设备有:内置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()并传入指定设备号,关闭对应设备; ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 设备注册表 ################################ 设备注册表device_tab中注册了全部需要使用到的设备,其中成员如下: 1. name:设备名称的字符串(自定义名称) 2. ops:设备内部接口函数集合(不可更改) 3. priv_data:设备使用的底层硬件资源及相关模式配置(可根据需要自行配置) 如果要添加设备,直接在下图注册表中接着添加。开机时初始化程序会自动执行初始化。 如果要添加设备,直接在下图注册表中接着添加。开机时初始化程序会自动执行初始化,设备注册表定义及初始化如图31.1所示。 .. image:: device_regedit.png :alt: "图1.1 设备注册表" :align: center .. centered:: 图1.1 设备注册表 上图对SD接口的配置包括了所使用的IO口、波特率、检测模式(包含检测方式和检测函数等)、数据宽度(可支持1线宽和4线宽)、中断优先级(0-7,数字越大,优先级越高)。 注册norflash_dev_ops接口时,起始地址及长度以512字节为单位,比如读取(dev_bulk_read)时带入地址1实际是从1*512=512开始读取,且写函数内部自带擦除操作,可以直接写入。 *注:读写flash设备操作不是调用图1.2中函数,而是调用dev_bulk_read/dev_bulk_write执行读写* .. image:: norflash_dev_ops.png :alt: "图1.2 flash设备norflash_dev_ops接口" :align: center .. centered:: 图1.2 flash设备norflash_dev_ops接口 .. image:: norflash_dev_ops.png :alt: "图1.3 flash设备norfs_dev_ops接口" :align: center .. centered:: 图1.3 flasflash设备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执行读写) 图1.1中设备详细数据配置信息介绍见下图,SD接口配置信息见图1.4,flash配置信息图5。 .. image:: sd_config.png :alt: "图1.4 SD接口配置信息" :align: center .. centered:: 图1.4 SD接口配置信息 .. image:: flash_config.png :alt: "图1.5 flash配置信息" :align: center .. centered:: 图1.5 flash配置信息 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 设备函数 ################################ 函数int devices_init_api_() ***************************************************************** 应用层函数,该函数会将device_table设备表中注册的设备全部初始化,这一步一般在开机时进行。其内部会调用驱动层函数devices_init()。 函数void \*dev_open(u32 index) ***************************************************************** 应用层函数,此函数会根据传入的设备号,打开对应的设备并返回设备句柄,其内部会调用驱动层函数dev_open(),其中参数: :: 1、index:dev_open函数返回的设备句柄; ① SD0_INDEX:SD卡设备号; ② UDISK_INDEX:U盘设备号; 2、返回值: 成功,返回对应设备句柄; 失败,返回NULL; 函数u32 device_close(u32 index) **************************************************************************** 应用层函数,此函数会根据传入的设备号,关闭对应的设备,其内部会调用驱动层函数dev_close(),其中参数。 :: 1、index:dev_open函数返回的设备句柄; ① SD0_INDEX:SD卡设备号; ② UDISK_INDEX:U盘设备号; 2、返回值: 成功,返回对应设备句柄; 失败,返回NULL; 函数void \*device_obj(u32 index) ************************************************************************************* 应用层函数,此函数会根据传入的设备号,返回对应的设备句柄,其中参数。 :: 1、index:dev_open函数返回的设备句柄; ① SD0_INDEX:SD卡设备号; ② UDISK_INDEX:U盘设备号; 2、返回值: 成功,返回对应设备句柄; 失败,返回NULL; 函数u32 device_online(void) ************************************************************************************* 应用层函数,此函数会返回一个u32变量,每一个bit置1代表对应设备在线。 函数u32 device_status(u32 index, bool mode) ************************************************************************************* 应用层函数,此函数会根据传入的设备号,返回对应的设备状态,根据mode参数选择当发现设备不在线时是否关闭对应设备模块,其中参数: :: 1、index:dev_open函数返回的设备句柄; ① SD0_INDEX:SD卡设备号; ② UDISK_INDEX:U盘设备号; 2、mdde:查询模式; ① 0:只查询状态; ② 1:查询到对应设备不在线时,关闭对应设备模块; 3、返回值: 设备在线,返回0; 设备离线,返回响应错误值; 函数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; 函数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定义的起始地址和大小范围内才能正常操作设备。* 函数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 对设备整片擦除 =========================== ========================== .. image:: cmd.png :alt: "图2.1 cmd可选择的命令" :align: center .. centered:: 图2.1 cmd可选择的命令 函数int dev_close(void \*device) ************************************************************************************* 本函数实现关闭设备的功能,对于一些设备调用此函数能省电。 :: 1、device:dev_open返回的设备句柄; 2、返回值:暂无意义