网站建设和设计,wordpress情侣,山东手机网站建设电话,手机网站引导页js插件概述 Felis USB 是一个嵌入式USB协议栈。它不依赖于软件系统支持#xff0c;可以轻量级迁移使用。 Felis USB is an USB stack for embedded system. See introduction in English here. 源码链接#xff1a;season-studio/FelisUSB:null_C - GitCode开源社区 为什么开发Feli…概述 Felis USB 是一个嵌入式USB协议栈。它不依赖于软件系统支持可以轻量级迁移使用。 Felis USB is an USB stack for embedded system. See introduction in English here. 源码链接season-studio/FelisUSB:null_C - GitCode开源社区 为什么开发Felis USB
在开发Felis USB之前我所在的公司有个技术预研的项目需要用STM32单片机开发一个UVC和HID设备杂合的USB设备样机。STM32 HAL库中所带的USB协议栈抽象层实现稍微繁琐了一些造成较多的空间资源消耗而且默认没有实现多接口设备类的框架。我尝试了TinyUSB协议栈以及TeenyUSB协议栈。然而TinyUSB协议栈没有支持ISOC端点的分配TeenyUSB似乎存在一些问题造成USB设备枚举速度慢、UVC接口多次切换后控制端点通讯异常等BUG。并且这些协议栈都存在没有合理规划常数据和可变数据存储空间的问题有部分常数据占用RAM空间一定程度上带来RAM空间的浪费。 所以经过综合考虑我在中秋假期中自行开发了这款USB设备协议栈的第一个版本。
特点
FelisUSB协议栈不需要软件系统支持可以在裸机和带OS的工程中自由迁移FelisUSB协议栈支持多个USB配置支持多个USB接口设备类的分模块实现确保设备类接口层协议实现时的模块化和可伸缩性FelisUSB协议栈归一化USB相关配置在USB设备描述符和USB配置描述符中已配置的信息就不需要在代码中另行配置确保了工程配置信息修改时能够一步到位减少配置不同步可能造成的BUGFelisUSB协议栈进行了抽象倡导从设备类接口层开始的代码不再关注端点号等硬件细节只需要面向类对象、端点对象等抽象抽象体进行编程让应用与硬件、逻辑与配置可以充分分离
主要功能更新与计划
目前版本中
Felis USB协议栈只支持USB 2.0的Device端协议硬件适配层只提供了STM32F4的实现设备类接口只提供了自定义HID、非压缩帧的UVC设备类的实现
后续计划
这个真说不好。我的所学比较杂目前也不主做嵌入式产品研发了。而且说实在的以中国大多数企业的现状来看我所处的岗位甚至可能都不应该动手去写这样的协议栈。所以我做这个可以说是用爱发电。后续计划就真谈不上明确的时间表。暂时的想法是可能会先补充一些设备协议类的实现以及WCID的实现吧。
如何使用
使用Felis USB构建应用
可按照以下步骤使用Felis USB协议栈构建应用
新建应用工程并添加必要的板级支持代码例如在STM32处理器环境下用STM32Cube新建工程并启用USB设备功能使能USB中断生成默认USB中断处理程序向工程中添加协议栈源码FelisUsbDevice.c向工程中添加设备类源码例如FelisUsbDClassHID.c向工程中添加目标板适配层源码例如stm32f4_hal_adapter.c新建目标板配置头文件FelisUsbBoard.h并在其中添加对目标板适配层的引用以及其他全局配置新建代码文件定义设备描述符、配置描述符、字符串描述符等各类USB描述符数据在应用源码中引用协议栈头文件FelisUSB.h在应用源码中引用使用到的设备类头文件例如FelisUsbDClassHID.h在应用源码中声明设备类实例并进行应用回调代码的编写在应用源码中声明协议栈设备实例关联描述符和设备类示例在应用源码中调用启动协议栈的代码
以下是示例代码片段完整示例代码可以sample目录下的内容
///
/// FeliseUsbBoard.h 示例
#if !defined(__FELIS_USB_BOARD_H__)
#define __FELIS_USB_BOARD_H__#include adapters/stm32f4_hal_adapter.h#define FUSBD_ADPT_SPEED (PCD_SPEED_FULL)#define FUSB_DEBUG_OUT (3)#endif // __FELIS_USB_BOARD_H__///
/// 应用代码示例
#include FelisUSB.h
#include classes/FelisUsbDClassHID.h
#include desc.hextern fusbd_device_t gUsbDev;uint8_t HidBuf[64];static int OnHidReceived(fusbd_hid_pt pHid, void * pBuf)
{// TODO: ...
}const fusbd_hid_t gHidClass FUSBD_HID_CLASS(gUsbDev,HidReportDescriptor, FUSBD_HID_CLASS_RUNTIME(HidBuf),.OnReceived OnHidReceived
);fusbd_device_t gUsbDev FUSBD_DEVICE(FUSBD_DEVICE_CONFIG(FUsbDeviceDescriptors,(fusbd_class_pt)gHidClass)
);...int main()
{...fusbd_device_init(gUsbDev);fusbd_device_start(gUsbDev);fusbd_device_check_configed(gUsbDev, FUSBD_TIMEOUT_INFINITY);// TODO: after the usb device is configed by the host...
}向Felis USB添加新的设备类
向Felis USB添加新的设备类主要包括以下三项工作 设计设备类的设计时数据 设备类的设计时数据指的是不随设备类运行状态变化而变化的数据比如设备类所需的额外的配置信息、设备类自定义的应用回调、设备类需要使用的额外缓冲区等等。 设备类的设计时数据需要继承基础设备类设计时数据。在结构体定义时所有成员之前插入一句INHERIT_FUSBD_CLASS;即可实现继承关系。 将设备类的设计时数据与运行时数据分离是为了有效节省对RAM的开销。 设计设备类的运行时数据 设备类的运行时数据指的是在设备运行过程中发生变化的数据比如设备的运行状态、与主机交互的过程数据等等。 设备类的运行时数据需要继承基础设备类运行时数据。在结构体定义时所有成员之前插入一句INHERIT_FUSBD_CLASS_RUNTIME;即可实现继承关系。 合理规划运行时数据有助于控制RAM的开销。 实现设备类关注的各项回调函数 设备类的所有协议栈标准回调定义在fusbd_class_methods_t结构体中设备类可根据自身的实际需求来实现其中的部分或所有回调函数。
示例 请参考src/classes下的设备类实现文件。
详情使用介绍
请参考 usage_cn.md
设计说明
请参考 design_cn.md
参考与借鉴
正如前文所说我在开发Felis USB之前已经看过STM32 HAL库中的USB协议栈实现也尝试过TinyUSB和TeenyUSB。所以我的实现中对这三者有所参考和借鉴。 主要内容如下
对于USB底层通讯逻辑的实现参考了STM32 HAL库的代码主要是其中HAL几个回调的处理以及Setup Request的处理借鉴了TinyUSB中对于配置描述符的解析处理即遇到接口描述符时由设备类接口回调进行匹配并越过被设备类接口回调所处理过的描述符借鉴了TeenyUSB在Set Config过程中进行端点PMA/FiFo缓冲区配置的思路借鉴了TeenyUSB中HID对Setup Request的处理逻辑
移植教程后续补上蟹蟹参阅