Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
USB
USB Stack问题请教
发布于 2017-12-03 22:13:24 浏览:3559
订阅该版
rtt3.0.1发布了,实现了很多usb Class,刚好最近要用到USB,这两天在看,有几点疑问想请教大家: 1、接口描述符中的USB_DYNAMIC | USB_DIR_OUT中的USB_DYNAMIC 应该是要替换成实际使用的端点号,但是我并没找到相关的代码,请教下那部分代码将USB_DYNAMIC替换成实际的端点号了. ```/* data interface descriptor */ const static struct ucdc_data_descriptor _data_desc = { /* interface descriptor */ USB_DESC_LENGTH_INTERFACE, USB_DESC_TYPE_INTERFACE, USB_DYNAMIC, 0x00, 0x02, USB_CDC_CLASS_DATA, 0x00, 0x00, 0x00, /* endpoint, bulk out */ USB_DESC_LENGTH_ENDPOINT, USB_DESC_TYPE_ENDPOINT, USB_DYNAMIC | USB_DIR_OUT, USB_EP_ATTR_BULK, USB_CDC_BUFSIZE, 0x00, /* endpoint, bulk in */ USB_DESC_LENGTH_ENDPOINT, USB_DESC_TYPE_ENDPOINT, USB_DYNAMIC | USB_DIR_IN, USB_EP_ATTR_BULK, USB_CDC_BUFSIZE, 0x00, };``` 2、以下是stm32f10x-HAL bsp中drv_usb.c中代码,不太明白_ep_read这个函数有什么用,感觉什么都没干. ```static rt_size_t _ep_read(rt_uint8_t address, void *buffer) { rt_size_t size = 0; RT_ASSERT(buffer != RT_NULL); return size; } static rt_size_t _ep_read_prepare(rt_uint8_t address, void *buffer, rt_size_t size) { HAL_PCD_EP_Receive(&_stm_pcd, address, buffer, size); return size; }```
查看更多
11
个回答
默认排序
按发布时间排序
word天
2017-12-04
这家伙很懒,什么也没写!
你好你的第一个问题:rt_usbd_ep_assign中替换的,EP_ADDRESS(ep) |= device->dcd->ep_pool[i].addr;
word天
2017-12-04
这家伙很懒,什么也没写!
_ep_read的确没有用 在这个bsp里 但是对于其他的芯片可能会被用到 当产生out中断返回的size是0的话协议栈会调用这个函数来读取完整的数据
word天
2017-12-04
这家伙很懒,什么也没写!
顺带一说的是 还好用不?
flz615
2017-12-05
这家伙很懒,什么也没写!
谢谢,第一个问题已经明白了; 第二问题还有不理解,按照usb的协议,一个transfer的数据阶段的结束标识是数据的size为0或者size小于max packet size,感觉应该和芯片没关系啊; 整个usb device的框架大致明白了,编译了下winusb,PC上能够成功安装驱动,但是还有不太明白这个应该如何和自己的实际应用联系起来,比如 _ep_in_handler什么都没干,要实现自己功能是不是还得修改这部分的代码呢 ``` static rt_err_t _ep_in_handler(ufunction_t func, rt_size_t size) { return RT_EOK; } ``` 还有一个需要完善的就是目前采用menuconfig配置usb device,无法添加自定义的USB class
aozima
2017-12-05
调网络不抓包,调I2C等时序不上逻辑分析仪,就像电工不用万用表!多用整理的好的文字,比截图更省流量,还能在整理过程中思考。
>还有不太明白这个应该如何和自己的实际应用联系起来 --- 参考现有的class实现呗 >无法添加自定义的USB class --- 照原来那样,把自己的实现的class增加一条就可以了吧。
lymzzyh
2017-12-19
这家伙很懒,什么也没写!
>谢谢,第一个问题已经明白了; >第二问题还有不理解,按照usb的协议,一个transfer的数据阶段的结束标识是数 ... --- ep_in_handler 是发送完成回调winusb是用于自定义功能的想干嘛都可以 就是一个Windows下免驱的自定义功能。
lymzzyh
2017-12-19
这家伙很懒,什么也没写!
>谢谢,第一个问题已经明白了; >第二问题还有不理解,按照usb的协议,一个transfer的数据阶段的结束标识是数 ... --- 包括你想要修改端点类型什么的都无所谓 完全可以自定义 增加减少端点,修改描述符,包括一定程度上的修改setup的响应都不影响枚举
flz615
2019-06-02
这家伙很懒,什么也没写!
时隔一年再次回来研究研究USB框架,USB这部分可能难度比较大,使用者较少的原因USB框架更新的不多。这次产品切换到HAL库了,因此准备把RTT的usb框架用起来。 我的理解,框架中ep0的枚举过程都已经实现,用户编程只需处理数据收发部分即可,框架中数据收发的处理在“rt_usbd_thread_entry” 线程的 _data_notify 函数中,USB_DIR_IN 的代码较好理解,USB_DIR_IN的代码有疑问: 1、只有dcd_ep_read_prepare 这个函数才是从USB控制器的Buffer中读取数据到 ep 的缓冲区中的,如果请求类型是UIO_REQUEST_READ_BEST(这个请求类型具体什么意思也不太明白),还没有调用dcd_ep_read_prepare 函数就进入到 EP_HANDLER ,那岂不是什么数据都没有读到? 2、ep->request.remain_size -= size; ep->request.buffer += size; 这两句是在dcd_ep_read_prepare 之前调用的,也就是说数据还没读到ep的缓冲区中,就提前改变了ep的buffer指针,是否有问题? 3、else if(ep->request.remain_size == 0) { EP_HANDLER(ep, func, ep->request.size); }这一句只有remain_size为0 才会调用EP_HANDLER,实际当接收到的usb数据包的大小 小于max_package_size时,本次usb传输就结束了,如果request.remain_size 还不为0,EP_HANDLER就一直得到调用, ``` else { size = ep_msg->size; if(ep->request.remain_size == 0) { return RT_EOK; } if(size == 0) { size = dcd_ep_read(device->dcd, EP_ADDRESS(ep), ep->request.buffer); } ep->request.remain_size -= size; ep->request.buffer += size; if(ep->request.req_type == UIO_REQUEST_READ_BEST) { EP_HANDLER(ep, func, size); } else if(ep->request.remain_size == 0) { EP_HANDLER(ep, func, ep->request.size); } else { dcd_ep_read_prepare(device->dcd, EP_ADDRESS(ep), ep->request.buffer, ep->request.remain_size > EP_MAXPACKET(ep) ? EP_MAXPACKET(ep) : ep->request.remain_size); } } ```
flz615
2019-06-02
这家伙很懒,什么也没写!
>包括你想要修改端点类型什么的都无所谓 完全可以自定义 增加减少端点,修改描述符,包括一定程度上的修改 ... --- 内容见上贴
flz615
2020-06-02
这家伙很懒,什么也没写!
[i=s] 本帖最后由 flz615 于 2020-6-2 19:33 编辑 [/i] 总结下,经过各位热心网友的帮助实现了自定义USB功能,但是有一点不足:进行usb传输测试,4096字节传输耗时约65ms(63KB/s),计算4096字节的数据拷贝占的时间只有us级别,因此数据拷贝不是速度瓶颈,分析发现rtt 的usb协议栈采用usbd线程进行消息的分发,usb中断/块传输packetmax=64byte,4096字节对应64次中断请求,rtt调度周期为1ms,响应64次请求需要64ms,因此64KB/s是rtt usb协议栈的速度极限了。 因为我们的应用对传输速度要求比较到,基于上面的原因最后没有采用rtt的协议USB协议栈,采用STM32的HAL库自己实现了自定义的协议传输。
撰写答案
登录
注册新账号
关注者
0
被浏览
3.6k
关于作者
flz615
这家伙很懒,什么也没写!
提问
10
回答
10
被采纳
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
CherryUSB的bootuf2配置
2
在用clangd开发RTT吗,快来试试如何简单获得清晰干净的工作区
3
GD32F450 片内 flash驱动适配
4
STM32H7R7运行CherryUSB
5
RT-Smart首次线下培训,锁定2024 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
ESP8266
I2C_IIC
UART
WIZnet_W5500
ota在线升级
PWM
freemodbus
flash
cubemx
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
flashDB
GD32
socket
中断
编译报错
Debug
SFUD
rt_mq_消息队列_msg_queue
msh
keil_MDK
ulog
C++_cpp
MicroPython
本月问答贡献
a1012112796
12
个答案
1
次被采纳
踩姑娘的小蘑菇
6
个答案
1
次被采纳
红枫
4
个答案
1
次被采纳
张世争
4
个答案
1
次被采纳
Ryan_CW
4
个答案
1
次被采纳
本月文章贡献
catcatbing
3
篇文章
6
次点赞
lizimu
2
篇文章
7
次点赞
YZRD
2
篇文章
5
次点赞
qq1078249029
2
篇文章
2
次点赞
xnosky
2
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部