at32 usb设备协议库
这部分主要介绍at32 usb设备库的结构和库的使用方法,at32 usb是基于usb2.0全速设备,不支持usb2.0高速设备。这里库的作用是用来管理usb外设和实现usb的基本协议,使开发者能够更快的上手开发。usb deivce库包含以下几个模块如图1:
用户应用程序
此部分为开发者根据应用具体需求开发应用程序。
usb core driver和usb设备类
usb core driver:此部分实现usb设备标准协议栈,标准请求等接口。
usb设备类:此部分实现一个具体usb设备的描述和设备请求。
usb硬件底层接口
此部分实现硬件寄存器抽象接口
usb/otg外设
图1. usb库结构
at32 usb库文件
如下是at32 usb应用工程结构图:图2. at32工程结构core driver库路径:otgfs-->middlewares\usb_driversusbfs-->middlewares\usbd_driversdevice class库路径:middlewares\usbd_class如下是usb库文件列表:表1. usb库文件列表表2. usb设备类型文件列表
usb设备库文件说明
usb库实现usb设备标准请求,同时实现usb规格里面的4种传输类型(control,interrupt,bulk,isochronous)的函数接口。图3. usb库文件结构
usb设备文件函数接口
usbd_int.c函数接口usbd_int.c主要处理底层中断,不同usb外设,此部分会根据外设不同而有所改变。at32系列芯片usb外设存在usbfs和otgfs两种外设,此部分函数接口基本相同。表3. usbd_int函数接口usbd_core.c函数接口usbd_core.c此文件封装不同的usb接口用于不同的地方调用,包括一些接收,发送函数等。表4. usbd_core函数接口usbd_sdr.c函数接口usbd_sdr.c此文件处理usb一些标准请求。表5. usbd_sdr函数接口支持的标志设备请求如下表:表6. 标准设备请求usbd_xx_class.c函数接口usbd_xx_class.c 此文件为具体设备类型的数据处理,通过结构体函数来实现不同设备类型数据的处理。开发者根据不同的设备类型,来实现下面函数结构体中的函数,达到不同应用结果。函数结构体如下:表7. 设备class函数结构体表8. 设备class函数接口usbd_xx_desc.c函数接口usbd_xx_desc.c此文件为设备描述文件,设备描述信息都通过此文件的函数接口返回给主机。表9. 设备描述函数结构体表10. 设备描述接口函数其它参数函数的参数结构体如下,usb设备库中参数传递使用结构体usbd_core_type,如下图:图4. 全局结构体usb设备的连接状态如下图:连接状态包含:
默认状态
地址状态
配置状态
挂起状态
可使用usbd_connect_state_get函数查询当前usb设备的连接状态。图5. usb设备连接状态usb设备返回值,usb函数接口使用如下函数返回值。图6. 函数返回值
端点fifo分配
usb要正常收发数据,在初始化时需要为每个端点分配发送/接收的fifo,fifo的大小可以根据端点上传输的最大包长度确认。注意,分配给所有端点fifo大小的和不能超过系统分配给usb缓冲区的最大长度,具体usb的缓冲区大小参考rm上的描述。开发者可以参考例程usb_conf.h为每个端点自定义分配fifo。另外使用usbfs和otgfs两种不同的外设时,usb_conf.h中对端点fifo分配稍有不同。usbfs外设端点fifo分配usbfs外设端点分配实现了两种分配方式,一种自动分配,一种是用户自定义分配。
自动分配:1. 通过打开usb_conf.h中usb_ept_auto_malloc_buffer宏开启自动分配功能
2. 在调用打开端点函数(usbd_ept_open)时自动根据传入的最大包长度自动分配fifo
3. 如果使用双缓冲模式(同步端点,双缓冲bulk)时,在打开端点前先调用(usbd_ept_dbuffer_enable)表示使用双缓冲模式,可参考audio例程。
4. 自动分配audio例程配置如下:
usb_conf.h
audio_class.c:端点打开
自定义分配:1. 关闭usb_conf.h中usb_ept_auto_malloc_buffer宏开启自定义分配
2. 在调用打开端点函数(usbd_ept_open)时调用usbd_ept_buf_custom_define函数自定义为端点分配fifo,参考vcp_loopback例程。
3. vcp_loopback例程自定义分配配置
usb_conf.h:
cdc_class.c端点打开:
otgfs外设端点fifo分配otgfs对于端点的接收缓冲是共享的,因此对于所有的out端点,只需要分配一个接收fifo。对发送缓冲区则需要为每个发送端点分配一块自己专用的fifo。支持的端点个数请参考对应型号的rm。otgfs的端点分配都需要开发者根据端点支持的最大包长度进行分配,注意usb_conf.h中对端点分配的fifo大小单位为word(byte)。以vcp_loopback例程为例:
usb设备初始化
在使用usb时,需要对usb的寄存器做一些基本的初始化,通过调用usb的初始化函数完成这部分的操作,对于外设usbfs和otgfs在初始化时所调用的函数一定的区别。usbfs外设初始化usbfs初始化函数usbd_core_init包含5个参数:例程vcp_loopback的初始化如下:usbd_core_init(&usb_core_dev, usb, &class_handler, &desc_handler, 0);otgfs外设初始化otgfs初始化函数usbd_init包含5个参数:例程vcp_loopback的初始化如下:
usb设备中断处理
usb中断入口函数usbd_irq_handler处理所有usb中断,包括reset,端点收发数据,sof,挂起,唤醒等中断,下面介绍一些典型的中断处理。图7. usb中断处理函数reset中断处理当usb设备在总线上检测到reset信号时,将产生reset中断。软件在收到reset中断时,需要做基本的初始化,用于后面的枚举处理。reset中断处理函数usbd_reset_handler:
端点fifo初始化
设备地址设置为0
端点0初始化
调用设备类的事件函数
udev->class_handler->event_handler(udev, usbd_reset_event);
端点中断处理当usb端点收发数据完成时,将产生对应的端点完成中断,端点完成中断处理发送和接收的数据。中断处理函数:usbd_xeptx_handlersof中断处理打开sof中断之后,usb设备在每收到一个主机发送的sof就会产生sof中断。中断处理函数:usbd_sof_handler
中断处理函数会调用设备类的sof处理函数
udev->class_handler->sof_handler(udev);
suspend中断处理当总线满足挂起条件时,usb设备会产生一个挂起中断,开发者可根据此中断判断是否需要进入低功耗模式。中断处理函数:usbd_suspend_handler
连接状态设置为挂起状态
设置设备进入挂起状态
调用设备类的事件处理函数
udev->class_handler->event_handler(udev, usbd_suspend_event);
wakeup中断处理当设备在挂起状态时,如果总线上有wakeup信号,usb设备将产生wakeup中断。中断处理函数:usbd_wakeup_handler
设备退出挂起状态
连接状态设置为进入挂起之前的状态
调用设备类事件处理函数
udev->class_handler->event_handler(udev, usbd_wakeup_event);
usb设备端点数据处理流程
usb设备在收到主机发送的数据包之后,对应端点0的数据(in/out/setup)会做单独处理,其它端点的数据会调用设备类的in/out handler进行数据处理。如下图所示数据的处理过程:图8. 端点数据处理流程图9. setup处理流程usb控制端点枚举流程当设备接到主机之后,通过控制端点(端点0)进行枚举动作,典型的枚举流程图如下:图10. usb枚举流程usb控制传输过程包含setup-data-status三个阶段,如下是一个主机获取设备信息的传输过程get_descriptor:图11 get descriptor如下是usb库处理上图get descriptor的流程:图12. usb库处理get descriptor调用流程usb设备请求格式(setup请求)图13. setup请求格式usb应用端点处理流程应用端点指客户实际应用使用到的非0端点,包括bulk,interrupt,iso等端点类型,这些端点的数据通回调函数in_handler和out_handler进行处理。开发者只需要在xxx_class.c中class_in_handler和class_out_handler里面实现具体端点的数据处理即可。in端点数据处理:图14. in端点数据处理out端点数据处理:图15. out端点数据处理
usb设备类型例程
本章将说明使用at32 usb设备库实现不同的设备类型的例程。目前实现的设备例程如下:
audio
custom_hid
keyboard
mouse
msc(mass strorage)
printer
vcp_loopback
virtual_msc_iap
composite_vcp_keyboard
hid_iap
audio例程
audio例程使用audio v1.0的协议实现一个speaker和microphone,传输audio数据使用同步传输,speaker使用同步out传输,microphone使用同步in传输。audio的例程运行在at-start评估板上,audio speaker和mircophone是基于audio arduino demo board进行实现,实验过程中需要连接at-start和audio arduino board,更多开发板信息请参考《um_audio arduino daughter board_v1.0/v2.0》,audio协议请参数《universal serial bus device class define for audio device v1.0》。实现功能实现一个speaker和microphone的audio复合设备,可以同时进行音频播放和录音。speaker功能:
支持16k,48k采样率
支持采样率切换
支持16bit采样
支持静音
支持音量调节
支持feedback功能
支持双通道
microphone功能:
支持16k,48k采样率
支持采样率切换
支持16bit采样
支持静音
支持音量调节
支持双通道
外设资源使用usb外设:
端点0 in/out:用于usb枚举以及audio部分控制。
端点1 in:用于microphone录音数据
端点1 out:用于speaker播放数据
端点2 in:用于feedback数据
i2c:
使用i2c发送控制信息到音频board
i2s:
使用i2s1发送数据到音频board(speaker)
使用i2s2从音频board接收数据(microphone)
dma:
使用dma1通道3传输i2s1的数据
使用dma1通道4传输i2s2的数据
timer:
使用timer产生codec所需要的时钟
audio设备实现usb audio设备类实现源文件在audio_class.c和audio_desc.c中,外部codec的控制以及音频数据的处理都在audio_codec.c中实现,根据主机的请求设置会调用到audio_codec.c中具体的设置函数。另外需要特别注意关于usb设备端点fifo大小的分配在usb_conf.h中配置,此部分根据具体端点传输的最大包长度进行分配。1. 设备描述:(audio_desc.c/h)
audio设备的描述(g_usbd_descriptor)
audio设备的配置描述信息(g_usbd_configuration)
ac interface
mricrophone streaming interface
microphone terminal input/output
microphone feature unit
microphone endpoint
speaker streaming interface
speaker terminal input/output
speaker feature unit
speaker endpoint
feedback endpoint
lang id (g_string_lang_id)
序列号(g_string_serial)
厂商产品id(audio_desc.h)
制造商、产品名、配置描述、接口描述(audio_desc.h)
2. 数据处理部分(audio_class.c/h audio_codec.c/h)
端点初始化(class_init_handler)
端点清除(class_clear_handler)
audio控制请求(class_setup_handler)
实现如下audio控制请求:
audio音量、静音、采样率设置(class_ept0_rx_handler)
此函数用于接收完主机发送的设置数据之后进行处理,包括设置音量,静音,以及采样率的设置。
microphone和feedback数据传输(class_in_handler)
speaker数据接收(class_out_handler)
audio_codec.c中实现codec具体的控制以及数据处理,需要实现如下函数:
以上函数可根据例程里的方式进行实现,也可以根据开发者实际使用的codec来进行修改,对于codec的初始化部分,在这里将不再讲述。
audio例程功能配置
audio_conf.h中可以对当前audio例程进行配置,例如:是否需要speaker功能,支持采样率等,有如下选项配置:
如何根据audio例程进行开发本章将简单描述如何修改audio例程的代码来进行开发,根据应用具体的需求来修改代码。
根据功能需求修改audio配置(audio_conf.h)
根据功能需求修改设备描述信息(audio_desc.c, audio_desc.h)
设备描述信息(g_usbd_descriptor)
设备配置描述信息(g_usbd_configuration)
其它描述
根据功能修改要使用端点(audio_class.c, audio_class.h)
端点定义(audio_class.h)
端点初始化(class_init_handler,class_clear_handler)
修改使用的audio控制请求
控制请求修改(class_setup_handler)
控制请求设置处理(class_ept0_rx_handler)
audio数据处理修改
in数据处理(class_in_handler)
out数据处理(class_out_handler)
根据需求修改端点fifo大小分配(usb_conf.h)
根据具体需求实现codec函数接口(audio_codec.c)
custom_hid例程
custom_hid实现一个hid(human interface device)功能,与上位机(artery_usbhid_demo)通信完成一些简单的交互操作,hid使用中断传输与上位机通信,例程在at-start开发板上运行,上位机可在官网下载,关于hid协议参考《human interface devices (hid) v1.11》。实现功能
上位机显示按键状态
通过上位机控制开发板led等开关状态
hid数据回环功能
外设资源使用usb外设:
端点0 in/out:用于usb枚举
端点1 in:用于数据发送
端点1 out:用于数据接收
custom_hid设备实现custom_hid设备类实现源代码主要在custom_hid_class.c和custom_hid_desc.c中,这两个源文件实现了对设备的描述和设备的处理。1. 设备描述:(custom_hid_desc.c/h)
custom hid设备描述(g_usbd_descriptor)
custom hid设备配置描述(g_usbd_configuration)
hid interface
hid endpoint
custom hid report描述(g_usbd_hid_report)
hid_report_id_2(led2)
hid_report_id_3(led3)
hid_report_id_4(led4)
hid_report_id_5(button)
hid_report_id_6(loopback data)
lang id(g_string_lang_id)
序列号(g_string_serial)
厂商产品id(custom_hid_desc.h
制造商、产品名、配置描述、接口描述(custom_hid_desc.h)
2. 数据处理部分(custom_hid_class.c/h)
端点初始化(class_init_handler)
端点清除(class_clear_handler)
hid设备类请求(class_setup_handler)
实现如下请求:
set_protocol
get_protocol
set_idle
get_idle
set_report
代码如下:
custom_hid发送数据
custom_hid接收数据
数据处理
如何根据custom hid例程进行开发本章将简单描述如何修改custom_hid例程的代码来进行开发,根据应用具体的需求来修改代码。
根据功能需求修改设备描述信息(custom_hid_desc.c, custom_hid_desc.h)
设备描述信息(g_usbd_descriptor)
设备配置描述信息(g_usbd_configuration)
设备报告描述符(g_usbd_hid_report)
其它描述
根据功能修改要使用端点(custom_hid_class.c, custom_hid_class.h)
端点定义(custom_hid_class.h)
端点初始化(class_init_handler,class_clear_handler)
修改使用的custom_hid控制请求
控制请求修改(class_setup_handler)
控制请求设置处理(class_ept0_rx_handler)
custom_hid发送接收数据处理修改
in数据处理(class_in_handler)
out数据处理(class_out_handler)
根据需求修改端点fifo大小分配(usb_conf.h)
修改数据处理部分
keyboard例程
keyboard实现一个键盘功能,使用中断传输与上位机通信,例程在at-start开发板上运行,通过按键发送字符串到主机。实现功能
通过按键发送字符串(”keyboard demo”)到主机
外设资源使用usb外设:
端点0 in/out:用于usb枚举
端点1 in:用于数据发送
keyboard设备实现keyboard设备类实现源代码主要在keyboard_class.c和keyboard_desc.c中,这两个源文件实现了对设备的描述和设备的处理。1. 设备描述:(keyboard_desc.c/h)
keyboard设备描述(g_usbd_descriptor)
keyboard设备配置描述(g_usbd_configuration)
keyboard interface
keyboard endpoint
keyboard report描述(g_usbd_hid_report)
lang id(g_string_lang_id)
序列号(g_string_serial)
厂商产品id(keyboard_desc.h)
制造商、产品名、配置描述、接口描述(keyboard_desc.h)
2. 数据处理部分(keyboard_class.c/h)
端点初始化(class_init_handler)
端点清除(class_clear_handler)
hid设备类请求(class_setup_handler)
实现如下请求:
set_protocol
get_protocol
set_idle
get_idle
set_report
keyboard发送数据
keyboard字符数据处理
如何根据keyboard例程进行开发本章将简单描述如何修改keyboard例程的代码来进行开发,根据应用具体的需求来修改代码。
根据功能需求修改设备描述信息(keyboard_desc.c, keyboard_desc.h)
设备描述信息(g_usbd_descriptor)
设备配置描述信息(g_usbd_configuration)
设备报告描述符(g_usbd_hid_report)
其它描述
根据功能修改要使用端点(keyboard_class.c, keyboard_class.h)
端点定义(keyboard_class.h)
端点初始化(class_init_handler,class_clear_handler)
修改使用的keyboard控制请求
控制请求修改(class_setup_handler)
控制请求设置处理(class_ept0_rx_handler)
keyboard发送接收数据处理修改
in数据处理(class_in_handler)
out数据处理(class_out_handler)
根据需求修改端点fifo大小分配(usb_conf.h)
修改数据处理部分
mouse例程
实现功能mouse实现一个简单的鼠标功能,使用中断传输与上位机通信,例程在at-start开发板上运行,通过开发板上的按键发送鼠标右键功能。图16. 鼠标传输格式鼠标d通常是通过设置x和y值来控制pc鼠标移动。外设资源使用usb外设:
端点0 in/out:用于usb枚举
端点1 in:用于数据发送
mouse设备实现mouse设备实现源代码主要在mouse_class.c和mouse_desc.c中,这两个源文件实现了对设备的描述和设备的处理。1. 设备描述:(mouse_desc.c/h)
mouse设备描述(g_usbd_descriptor)
mouse设备配置描述(g_usbd_configuration)
mouseinterface
mouseendpoint
mouse report描述(g_usbd_hid_report)
lang id(g_string_lang_id)
序列号(g_string_serial)
厂商产品id(mouse_desc.h)
制造商、产品名、配置描述、接口描述(keyboard_desc.h)
2. 数据处理部分(mouse_class.c/h)
端点初始化(class_init_handler)
端点清除(class_clear_handler)
hid设备类请求(class_setup_handler)
实现如下请求:
set_protocol
get_protocol
set_idle
get_idle
set_report
keyboard发送数据
mouse数据处理
如何根据mouse例程进行开发本章将简单描述如何修改mouse例程的代码来进行开发,根据应用具体的需求来修改代码。
根据功能需求修改设备描述信息(mouse_desc.c, mouse_desc.h)
设备描述信息(g_usbd_descriptor)
设备配置描述信息(g_usbd_configuration)
设备报告描述符(g_usbd_hid_report)
其它描述
根据功能修改要使用端点(mouse_class.c, mouse_class.h)
端点定义(mouse_class.h)
端点初始化(class_init_handler,class_clear_handler)
修改使用的mouse控制请求
控制请求修改(class_setup_handler)
控制请求设置处理(class_ept0_rx_handler)
mouse发送接收数据处理修改
in数据处理(class_in_handler)
out数据处理(class_out_handler)
根据需求修改端点fifo大小分配(usb_conf.h)
修改数据处理部分
msc例程
msc(mass storage)例程展示如何通过usb bulk传输,进行pc主机和at-start通信,该例程支持bot(bulk only transfer)协议和scsi(small computer system interface)指令。图17. bot 命令/数据/状态 流程图18. bot命令格式图19. bot状态格式实现功能
将内部flash虚拟成一个磁盘
实现bulk-only传输协议
实现subclass scsi传输命令
msc_cmd_inquiry
msc_cmd_start_stop
msc_cmd_mode_sense6
msc_cmd_mode_sense10
msc_cmd_allow_medium_removal
msc_cmd_read_10
msc_cmd_read_capacity
msc_cmd_request_sense
msc_cmd_test_unit
msc_cmd_verify
msc_cmd_write_10
msc_cmd_read_format_capacity
外设资源使用usb外设:
端点0 in/out:用于usb枚举
端点1 in:用于数据发送
端点1 out:用于数据接收
msc设备实现1. 设备描述:(msc_desc.c/h)
msc设备描述(g_usbd_descriptor)
msc设备配置描述(g_usbd_configuration)
msc interface
msc endpoint
lang id(g_string_lang_id)
序列号(g_string_serial)
厂商产品id(custom_hid_desc.h)
制造商、产品名、配置描述、接口描述(msc_desc.h)
2. 数据处理部分(msc_class.c/h)
端点初始化(class_init_handler)
端点清除(class_clear_handler)
msc设备请求(class_setup_handler)
get_max_lun
bo_reset
代码如下:
in传输处理
out传输处理(接收数据)
3. bot和scsi命令处理bulk-only transfer和scsi的命令处理在库文件msc_bot_scsi.c/h中。表11. msc_bot_scsi函数列表4. diskio处理此部分主要处理与存储设备间接口,例程里面以内部flash的存储控制作为说明,msc_diskio.c/h根据开发者使用存储不同,只需要实现对应存储的读写函数即可。表12. inquiry描述表13 diskio操作函数如何根据msc例程进行开发本章将简单描述如何修改msc例程的代码来进行开发,根据应用具体的需求来修改代码。
根据功能需求修改设备描述信息(msc_desc.c, msc_desc.h)
设备描述信息(g_usbd_descriptor)
设备配置描述信息(g_usbd_configuration)
其它描述
根据功能修改要使用端点(msc_class.c, msc_class.h)
端点定义(msc_class.h)
端点初始化(class_init_handler,class_clear_handler)
修改使用的msc控制请求
控制请求修改(class_setup_handler)
控制请求设置处理(class_ept0_rx_handler)
msc发送接收数据处理修改
in数据处理(class_in_handler)
out数据处理(class_out_handler)
根据需求修改端点fifo大小分配(usb_conf.h)
修改diskio部分,实现表13里面的函数(msc_diskio.c/h)
printer例程
printer例程展示了使用usb device作为打印机设备,此demo可在pc端识别到一个打印机设备并且可应答pc端发送的关于printer类的状态请求命令(例如打印机的有纸/无纸状态)
实现功能
实现一个打印机设备
外设资源使用usb外设:
端点0 in/out:用于usb枚举
端点1 in:用于数据发送
端点1 out:用于数据接收
printer设备实现1. 设备描述(printer_desc.c/h)
printer设备描述(g_usbd_descriptor)
printer设备配置描述(g_usbd_configuration)
printer interface
printer endpoint
lang id(g_string_lang_id)
序列号(g_string_serial)
厂商产品id(custom_hid_desc.h)
制造商、产品名、配置描述、接口描述(msc_desc.h)
2. 数据处理(printer_class.c/h)
端点初始化(class_init_handler)
端点清除(class_clear_handler)
printer设备请求(class_setup_handler)
get_device_id
port_status
soft_reset
代码如下:
in传输处理
out传输处理(接收数据)
如何根据printer例程进行开发本章将简单描述如何修改printer例程的代码来进行开发,根据应用具体的需求来修改代码。
根据功能需求修改设备描述信息(printer_desc.c, printer_desc.h)
设备描述信息(g_usbd_descriptor)
设备配置描述信息(g_usbd_configuration)
其它描述
根据功能修改要使用端点(printer_class.c, printer_class.h)
端点定义(printer_class.h)
端点初始化(class_init_handler,class_clear_handler)
修改使用的printer控制请求
控制请求修改(class_setup_handler)
控制请求设置处理(class_ept0_rx_handler)
printer发送接收数据处理修改
in数据处理(class_in_handler)
out数据处理(class_out_handler)
根据需求修改端点fifo大小分配(usb_conf.h)
vcp loopback例程
在现代pc中,usb是和绝大部分外设通信的标准接口。尽管如此,大部分的工业软件依旧使用com接口(uart)通信。vcp_loopback例程提供使用usb设备模拟com接口方法,解决了该问题, vcp_loopback例程展示了如何通过cdc协议进行usb数据收发。改例程需要使用虚拟串口驱动,可在官网下载。实现功能
实现一个虚拟串口
外设资源使用usb外设:
端点0 in/out:用于usb枚举
端点1 in:用于数据发送
端点1 out:用于数据接收
端点2 in:监控中断传输
vcp_loopback设备实现1. 设备描述(cdc_desc.c/h)
cdc设备描述(g_usbd_descriptor)
cdc设备配置描述(g_usbd_configuration)
cdc interface
cdc endpoint
lang id(g_string_lang_id)
序列号(g_string_serial)
厂商产品id(custom_hid_desc.h)
制造商、产品名、配置描述、接口描述(msc_desc.h)
2. 数据处理(cdc_class.c/h)
端点初始化(class_init_handler)
端点清除(class_clear_handler)
cdc设备请求(class_setup_handler)
set_line_coding
get_line_coding
代码如下:
in传输处理
out传输处理(接收数据)
如何根据vcp_loopback例程进行开发本章将简单描述如何修改cdc例程的代码来进行开发,根据应用具体的需求来修改代码。
根据功能需求修改设备描述信息(cdc_desc.c, cdc_desc.h)
设备描述信息(g_usbd_descriptor)
设备配置描述信息(g_usbd_configuration)
其它描述
根据功能修改要使用端点(cdc_class.c, cdc_class.h)
端点定义(cdc_class.h)
端点初始化(class_init_handler,class_clear_handler)
修改使用的cdc控制请求
控制请求修改(class_setup_handler)
控制请求设置处理(class_ept0_rx_handler)
cdc发送接收数据处理修改
in数据处理(class_in_handler)
out数据处理(class_out_handler)
根据需求修改端点fifo大小分配(usb_conf.h)
virtual_msc_iap例程
virtual msc iap实现一个升级功能的设备,不依赖上位机,当接入pc之后,通过将固件拷贝到磁盘以达到升级目的。实现功能
将flash虚拟成磁盘进行升级
iap保留使用20k byte空间
升级完成之后reset usb设备返回升级状态
支持下载地址设置
支持升级完成之后跳转到app运行
支持bin文件升级
外设资源使用usb外设:
端点0 in/out:用于usb枚举
端点1 in:用于数据发送
端点1 out:用于数据接收
virtual_msc_iap设备实现1. 设备描述(msc_desc.c/h)参考3.5.3.12. 数据处理部分(msc_class.c/h)参考3.5.3.23. bot和scsi命令处理参考3.5.3.34. diskio处理参考3.5.3.45. flash升级部分(flash_fat16.c/h)
升级状态
当连接host之后,在响应磁盘上通过txt文档显示当前状态
准备升级状态(ready.txt)
升级成功(success.txt)
升级失败(failed.txt)
未知文件或错误(unkonwn.txt)
升级文件大于flash大小(large.txt)
fat16分区表描述
升级接口函数如何根据virtual_msc_iap例程进行开发本章将简单描述如何修改virtual_msc_iap例程的代码来进行开发,根据应用具体的需求来修改代码。
根据功能需求修改设备描述信息(msc_desc.c, msc_desc.h)设备描述信息(g_usbd_descriptor)设备配置描述信息(g_usbd_configuration)其它描述根据功能修改要使用端点(msc_class.c, msc_class.h)端点定义(msc_class.h)端点初始化(class_init_handler,class_clear_handler)修改使用的msc控制请求控制请求修改(class_setup_handler)控制请求设置处理(class_ept0_rx_handler)msc发送接收数据处理修改in数据处理(class_in_handler)out数据处理(class_out_handler)根据需求修改端点fifo大小分配(usb_conf.h)修改diskio部分,实现表13里面的函数(msc_diskio.c/h)修改flash_fat16.c/h升级参数,包括app起始地址,iap占用空间等,要保证iap和app地址不重合。composive_vcp_keyboard例程
复合设备定义如下:拥有多个相互独立接口的设备被称为复合设备。当使用该设备时,该设备上拥有多个组合的功能。例如,composite vcp keyboard demo 提供的复合设备包含hid和cdc功能(键盘和串口通信)实现功能
实现一个usb虚拟串口(参考3.7)实现一个usb键盘设备(参考3.3)外设资源使用usb外设:
端点0 in/out:用于usb枚举端点1 in:用于数据发送端点1 out:用于数据接收端点2 in:cdc命令中断传输端点3 in:keyboard发送数据composite_vcp_keyboard设备实现1. 设备描述(cdc_keyboard_desc.c/h)
cdc_keyboard设备描述(g_usbd_descriptor)cdc_keyboard设备配置描述(g_usbd_configuration)cdc interfacecdc endpointkeyboard interfacekeyboard endpointlang id(g_string_lang_id)序列号(g_string_serial)厂商产品id(custom_hid_desc.h)制造商、产品名、配置描述、接口描述(msc_desc.h)2. 数据处理(cdc_keyboard_class.c/h)
端点初始化(class_init_handler)端点清除(class_clear_handler)设备请求(class_setup_handler)cdc设备类请求:set_line_codingget_line_codinkeyboard hid设备类请求:
set_protocolget_protocolset_idleget_idleset_report代码如下:
in传输处理out传输处理(接收数据)如何根据composite_vcp_keyboard例程进行开发本章将简单描述如何修改composite_vcp_keyboard例程的代码来进行复合设备开发,根据应用具体的需求来修改代码。
根据功能需求修改设备描述信息(cdc_keyboard_desc.c, cdc_keyboard_desc.h)设备描述信息(g_usbd_descriptor)设备配置描述信息(g_usbd_configuration)其它描述根据功能修改要使用端点(cdc_keyboard_class.c, cdc_keyboard_class.h)端点定义(cdc_class.h)端点初始化(class_init_handler,class_clear_handler)修改使用的cdc控制请求控制请求修改(class_setup_handler)控制请求设置处理(class_ept0_rx_handler)cdc_keyboard发送接收数据处理修改in数据处理(class_in_handler)out数据处理(class_out_handler)根据需求修改端点fifo大小分配(usb_conf.h)hid_iap例程
hid_iap例程使用usb hid实现iap升级功能,需要搭配上位机使用,上位机可在官网下载iap_programmer。hid iap的例程代码位于bsp固件库utilities\at32f435_437_usb_iap_demo中,使用方法可参考《an0007_at32_iap_using_the_usb_hid_zh_v2.x.x.pdf》1. 实现功能
实现使用hid进行设备升级2. 外设资源使用usb 外设:
端点0 in/out:用于usb枚举端点1 in:用于数据发送端点1 out:用于数据接收hid_iap设备实现1. 设备描述(hid_iap_desc.c/h)
hid iap设备描述(g_usbd_descriptor)hid iap设备配置描述(g_usbd_configuration)hid interfacehid endpointhid iap report描述(g_usbd_hid_report)lang id(g_string_lang_id)序列号(g_string_serial)厂商产品id(hid_iap_desc.h)制造商、产品名、配置描述、接口描述(hid_iap_desc.h)2. 数据处理(hid_iap_class.c/h)
端点初始化(class_init_handler)端点清除(class_clear_handler)hid设备类请求(class_setup_handler)实现如下请求:set_protocolget_protocolset_idleget_idleset_report代码如下:hid iap发送数据
hid iap接收数据升级命令数据处理3. hid iap升级协议表14. hid iap升级命令
0x5aa0进入iap模式
作为一个特定的命令,当用户app收到这个命令之后将进入iap模式。实现方式为收到这个命令之后擦除flag然后reset
上位机:[0x5a, 0xa0]
iap设备响应:[0x5a, 0xa0, ack/nack]
0x5aa1开始下载
上位机:[0x5a,0xa1]
iap设备响应:[0x5a,0xa1,ack/nack]
0x5aa2设置下载地址
设置下载地址需按照1kb对齐,每下载1kbyte数据之后,都需要重新设置下载地址。
上位机(命令+地址):[0x5a, 0xa2, 0x08, 0x00, 0x40, 0x00]
iap设备响应:[0x5a,0xa2, ack/nack]
0x5aa3下载数据命令(1kb 对齐多个包发送)
下载数据命令采用命令+长度+数据的格式进行发送,每包最大数据量为60byte(64–命令–长度),当发送数据达到1kb时,上位机需要等待设备的ack响应。此时设备需将1kb的数据写到flash。
上位机(命令(2byte)+长度(2 byte)+数据(n byte)):[0x5a,0xa3,len1,len0,data0….datan]
收完1kb数据后iap设备响应:[0x5a, 0xa3, ack/nack]
0x5aa4下载结束
上位机:[0x5a, 0xa4]
iap设备响应:[0x5a, 0xa4, ack/nack]
0x5aa5固件crc校验
上位机传输固件起始地址和固件大小/1kb(固件大小按1kb对齐,不足补0xff),由iap计算crc之后返回给上位机。
上位机:[0x5a,0xa5, 0x08, 0x00, 0x40, 0x00, len1, len0]
iap设备响应: [0x5a, 0xa5, ack/nack, crc3, crc2, crc1, crc0]
0x5aa6跳转命令
跳转命令将跳转到用户代码进行运行
上位机:[0x5a,0xa6, 0x08, 0x00, 0x40, 0x00]
iap设备响应:[0x5a,0xa6,ack/nack]
0x5aa7获取iap设置的app地址
返回iap设置的app地址
上位机:[0x5a, 0xa7]
iap设备响应:[0x5a, 0xa7, ack/nack, 0x08, 0x00, 0x40, 0x00]
如何根据hid_iap例程进行开发本章将简单描述如何修改hid_iap例程的代码来进行开发,根据应用具体的需求来修改代码。
根据功能需求修改设备描述信息(hid_iap_desc.c, hid_iap_desc.h)设备描述信息(g_usbd_descriptor)设备配置描述信息(g_usbd_configuration)其它描述根据功能修改要使用端点(hid_iap_class.c, hid_iap_class.h)端点定义(hid_iap_class.h)端点初始化(class_init_handler,class_clear_handler)修改使用的hid控制请求控制请求修改(class_setup_handler)控制请求设置处理(class_ept0_rx_handler)hid_iap发送接收数据处理修改in数据处理(class_in_handler)out数据处理(class_out_handler)根据需求修改端点fifo大小分配(usb_conf.h)修改hid_iap_user.h中的升级参数,包括app起始地址等,iap占用空间等,保证app地址和iap的地址不要重合。关于雅特力雅特力科技于2016年成立,是一家致力于推动全球市场32位微控制器(mcu)创新趋势的芯片设计公司,专注于arm cortex-m4/m0+的32位微控制器研发与创新,全系列采用55nm先进工艺及arm cortex-m4高效能或m0+低功耗内核,缔造m4业界最高主频288mhz运算效能,并支持工业级别芯片工作温度范围(-40°~105°)。雅特力目前已累积相当多元的终端产品成功案例:如微型打印机、扫地机、光流无人机、热成像仪、激光雷达、工业缝纫机、伺服驱控、电竞周边市场、断路器、adas、t-box、数字电源、电动工具等终端设备应用,广泛地覆盖5g、物联网、消费、商务及工控等领域。
SUSE已经完成与投资公司EQT之间的交易,成为业界最大的独立开源公司
2020年11月我国HEV乘用车销量合计约为4.4万辆,同比增长54%
关于芯片量产工程师需要掌握的知识概览
如何利用树莓派zero实现AirPlay扬声器的设计
曝E3 2020已决定取消 或采取线上直播形式
AT32讲堂046 | 雅特力AT32 MCU USB设备库的架构和使用方法
在视频应用的新领域,CPU和FPGA或将胜过GPU
业内首个小程序AR导航上线
消防器材的管理怎样利用好rfid技术
笔记本电脑散热器DIY图解
基于StratixⅡEP2S30484C5芯片的乘除法和开方运算算法的实现
iPhone8全新设计,售价达6900元
智能制造发展过程中仍需破除的一系列难题
浅析DCDC电路设计技巧和调制方式
模式识别技术有哪些_模式识别技术的应用
pcb中的泪滴指的是什么 pcb泪滴怎么设计出来的
华为是5G电信设备领域的领导者美国限制华为只会伤害美国的利益
升级ios10.3正式版后出现商店乱码怎么办?苹果神速放出ios10.3.3测试版,值得更新吗?
华为P40系列原型机曝光 配备潜望式长焦镜头并拥有一颗超广角镜头
集成无线收发器和 8 位 RISC MCU 的 SOC 芯片CI2454/CI2451参数-遥控玩具汽车方案