Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
USB
USB组件之USB device框架简单概览
发布于 2017-12-18 13:11:41 浏览:46265
订阅该版
* 本帖最后由 有梦为马 于 2017-12-21 09:06 编辑 * 分享下最近学习rtt下USB做的简单总结,具体的文字描述分享会在之后补齐。抛砖引玉,方便大家讨论。 ![TIM截图20171218130632.png](/uploads/201712/18/130701a62hr846zq2zzhof.png) [rt-thread-USB device简单结构框图.pdf](/uploads/201712/18/130732wpotzvizozpxsidv.attach) 结合上图和代码分析:个人理解,rtt将USB分为了硬件接口层,USB核心层,软件应用层。文字描述可与结构图对照着看,然后再去源码中分析,条理就比较清楚了。首先看硬件接口层,具体的描述结构就是udcd结构体。struct udcd{ struct rt_device parent; const struct udcd_ops* ops; struct uendpoint ep0; uep0_stage_t stage; struct ep_id* ep_pool;};其中udcd_ops是具体硬件相关的实现函数,如发送,接收等。ep_pool指向一个数组,其中是板级可用的端点资源。具体应用在写端点描述符时加上USB_DYNAMIC即可从该数组中获取可使用的端点资源。 ```c int stm_usbd_register(void) { …… _stm_udc.ops = &_udc_ops; /* Register endpoint infomation */ _stm_udc.ep_pool = _ep_pool; _stm_udc.ep0.id = &_ep_pool[0]; …… rt_device_register((rt_device_t)&_stm_udc, "usbd", 0); rt_usb_device_init(); return RT_EOK; } ``` 下面是USB核心层内容,从rt_usb_device_init(已简化)开始看: ```c rt_err_t rt_usb_device_init(void) { rt_device_t udc; udevice_t udevice; uconfig_t cfg; ufunction_t func; /* 创建USB device线程,处理USB各种事件 */ rt_usbd_core_init(); /* 创建udevice,其中包括设备描述符 */ udevice = rt_usbd_device_new(); /*找到同名的硬件驱动,此处是usbd*/ udc = rt_device_find(USB_DEVICE_CONTROLLER_NAME); /* 为udevice绑定udc */ rt_usbd_device_set_controller(udevice, (udcd_t)udc); /* 创建配置描述符 */ cfg = rt_usbd_config_new(); #ifdef RT_USB_DEVICE_MSTORAGE { /* 创建具体的软件应用,接口描述符和和端点描述符在软件应用层中指定*/ func = rt_usbd_function_mstorage_create(udevice); /*将该应用挂接在当前配置上 */ rt_usbd_config_add_function(cfg, func); } #endif /* 为USB设备绑定配置描述符 */ rt_usbd_device_add_config(udevice, cfg); /*调用硬件接口层的初始化函数 */ rt_device_init(udc); /*选择默认的配置 */ rt_usbd_set_config(udevice, 1); return RT_EOK; } ``` 软件应用层: ```c ufunction_trt_usbd_function_mstorage_create(udevice_t device) { uintf_t intf; struct mstorage *data; ufunction_t func; ualtsetting_t setting; umass_desc_t mass_desc; rt_usbd_device_set_string(device, _ustring); //字符串描述符 func = rt_usbd_function_new(device, &dev_desc, &ops);//创建具体应用类,此处是mstorage device->dev_qualifier = &dev_qualifier; data = (struct mstorage *)rt_malloc(sizeof(struct mstorage)); func->user_data = (void *)data; //将具体应用类挂接在ufunction结构上的user_data上 intf =rt_usbd_interface_new(device, _interface_handler);//接口描述符//一个配置可有多个接口,使用ualtsetting管理接口描述符和指定当前用的接口 setting = rt_usbd_altsetting_new(sizeof(struct umass_descriptor));//动态设置描述 /* config desc in alternate setting */ rt_usbd_altsetting_config_descriptor(setting, &_mass_desc,(rt_off_t)&((umass_desc_t)0)->intf_desc); /* configure the msc interface descriptor */ _mstorage_descriptor_config(setting->desc, intf->intf_num); /* create a bulk out and a bulk in endpoint */ mass_desc = (umass_desc_t)setting->desc; //分配端点描述符结构,并设置端点对应的具体应用的处理函数 data->ep_in = rt_usbd_endpoint_new(&mass_desc->ep_in_desc, _ep_in_handler); data->ep_out = rt_usbd_endpoint_new(&mass_desc->ep_out_desc, _ep_out_handler); /* 将端点绑定到动态设置描述符上 */ rt_usbd_altsetting_add_endpoint(setting, data->ep_out); rt_usbd_altsetting_add_endpoint(setting, data->ep_in); rt_usbd_interface_add_altsetting(intf, setting); /* 为接口添加动态设置*/ rt_usbd_set_altsetting(intf, 0);//为接口选择默认设置 rt_usbd_function_add_interface(func, intf); /*为应用类设置接口*/ return func; } ``` 简单看一个函数细节rt_usbd_device_add_config(udevice, cfg) 来理下思路,验证一下结构图: ```c uep_t rt_usbd_find_endpoint(udevice_tdevice, ufunction_t *pfunc, rt_uint8_t ep_addr) { …….for (i = cfg->func_list.next; i != &cfg->func_list; i = i->next) { func = (ufunction_t)rt_list_entry(i, struct ufunction, list); for (j = func->intf_list.next; j != &func->intf_list; j = j->next) { intf = (uintf_t)rt_list_entry(j, struct uinterface, list); cfg->cfg_desc.bNumInterfaces++; for (k = intf->curr_setting->ep_list.next; k != &intf->curr_setting->ep_list; k = k->next) { ep = (uep_t)rt_list_entry(k, struct uendpoint, list); //在ep_pool中找可用的端点资源 if (rt_usbd_ep_assign(device, ep) != RT_EOK) { rt_kprintf("endpointassign error
"); } } rt_list_insert_before(&device->cfg_list, &cfg->list); } ``` 对照一下结构图,可以发现查找过程和结构图关系是一致的。最后简单总结一下数据流向(此处说明不包括枚举过程):1. USB中断,通知USB device事件处理线程2. rt_usbd_find_endpoint函数找到事件发生的端点,然后调用端点回调函数。3. 回调函数对应于应用类的数据in(ep_in_handler)和out(ep_out_handler)处理。
查看更多
32
个回答
默认排序
按发布时间排序
bernard
2017-12-18
这家伙很懒,什么也没写!
这个赞,一些笔记实际上还是得多靠大家,这样大家用起来更方面的
MurphyZhao
认证专家
2017-12-18
这家伙很懒,什么也没写!
赞,MARK下
armink
2017-12-19
这家伙很懒,什么也没写!
清晰明了,揭开了 RT-Thread 的 USB device 驱动 “面纱” 这种学习方法是非常有效的,积累下来的设计文档对 RT-Thread 也是宝贵的财富。多谢分享啦~
lymzzyh
2017-12-19
这家伙很懒,什么也没写!
非常犀利 连微软OS描述符都标记出来了 有兴趣的话可以加我好友QQ928882442 我是usb协议栈的维护者
有梦为马
2017-12-21
这家伙很懒,什么也没写!
>这个赞,一些笔记实际上还是得多靠大家,这样大家用起来更方面的 --- 谢谢熊大
有梦为马
2017-12-21
这家伙很懒,什么也没写!
>非常犀利 连微软OS描述符都标记出来了 有兴趣的话可以加我好友QQ928882442 我是usb协议栈的维护者 ... --- 已加:)
有梦为马
2017-12-21
这家伙很懒,什么也没写!
>清晰明了,揭开了 RT-Thread 的 USB device 驱动 “面纱” > >这种学习方法是非常有效的,积累下来的设计文档 ... --- 是的,这样自己也收获很多。
有梦为马
2017-12-21
这家伙很懒,什么也没写!
>赞,MARK下 --- 谢谢
yytyu
2017-12-22
这家伙很懒,什么也没写!
请问下,能放些应用教程出来吗
lymzzyh
2017-12-24
这家伙很懒,什么也没写!
>请问下,能放些应用教程出来吗 --- 我在做
撰写答案
登录
注册新账号
关注者
2
被浏览
46.3k
关于作者
有梦为马
这家伙很懒,什么也没写!
提问
2
回答
9
被采纳
0
关注TA
发私信
相关问题
1
请教USB Host
2
STM32F4调试USB 读卡器(Slave)提示格式化
3
急求 STM32F4 USB Device MSC+SD 的相关问题
4
USB 框架问题
5
USB键盘
6
LPC17xx 如何添加USB HOST设备
7
RT-Thread目前支持USB HOST了吗?
8
USB HOST的支持问题
9
RTT 2.0.1 USB存储设备问题,枚举到USBREQ_GET_MAX_LUN后复位
10
USB库已经很久没更新了
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
最新文章
1
ulog 日志 LOG_HEX 输出时间改为本地日期时间
2
在RT-Thread Studio中构建前执行python命令
3
研究一了一段时间RTT,直接标准版上手太难,想用nano,但又舍不得组件
4
CherryUSB开发笔记(一):FSDEV USB IP核的 HID Remote WakeUp (USB HID 远程唤醒) 2025-01-18 V1.1
5
RT-thread 缩写字典
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
I2C_IIC
ESP8266
UART
WIZnet_W5500
ota在线升级
PWM
cubemx
flash
freemodbus
BSP
packages_软件包
潘多拉开发板_Pandora
定时器
ADC
flashDB
GD32
socket
编译报错
中断
Debug
rt_mq_消息队列_msg_queue
SFUD
msh
keil_MDK
ulog
C++_cpp
MicroPython
本月问答贡献
踩姑娘的小蘑菇
1
个答案
2
次被采纳
用户名由3_15位
7
个答案
1
次被采纳
xusiwei1236
5
个答案
1
次被采纳
bernard
4
个答案
1
次被采纳
张世争
1
个答案
1
次被采纳
本月文章贡献
聚散无由
2
篇文章
15
次点赞
catcatbing
2
篇文章
5
次点赞
Wade
2
篇文章
2
次点赞
Ghost_Girls
1
篇文章
6
次点赞
YZRD
1
篇文章
2
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部