Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
USB
USB Device BSP 移植异常——VCOM设备无法正确响应Get LineCoding...
发布于 2020-04-18 15:23:59 浏览:1715
订阅该版
大家好,最近在对接 RTT 的 USB Device BSP驱动时,遇到一个奇怪的问题,希望大家不吝赐教: 我当前以USB VCOM 为上层的设备类进行调试,BSP可以进行前期的 获取设备描述符、获取配置描述符请求等的响应 异常的现象是:过程中,在处理完成两个类特殊请求 SetControlLineState(0x22)、SetControlLineState(0x20) 后,下一个请求 GetControlLineCoding(0x21) 就无法正常响应了 通过串口打印的调试信息得到,BSP 在收到SetControlLineState(0x22)、SetControlLineState(0x20) 两个请求的 Setup包后,通过接口 ```rt_err_t rt_usbd_ep0_setup_handler(udcd_t dcd, struct urequest* setup);```回传对应的 Setup 包给核心层后,核心层并没有正确的跳转到核心处理函数 static void rt_usbd_thread_entry(void* parameter); 中进行相关内容的处理 而后续收到 SetControlLineState(0x20) 的Setup 包后,一样出现了跳转异常的问题。从现象看,请求 SetControlLineState(0x20) 响应异常,是因为核心层没有正确的对 Setup包 做处理导致的。 [hr] 综上,我的问题是:什么情况下会导致,Setup 包已通过 rt_usbd_ep0_setup_handler() 接口回传,但是核心层不对其进行处理?
查看更多
2
个回答
默认排序
按发布时间排序
jh442755
2020-04-18
这家伙很懒,什么也没写!
如下是我抓取的,异常过程中的枚举数据
jh442755
2020-04-18
这家伙很懒,什么也没写!
如下是我对 setup 数据包处理的伪代码 ``` switch (端点0控制传输阶段) { // 空闲状态: 收到的数据包为 setup case 空闲阶段: { if (端点0 接收完成中断) { // 读 FIFO recv_len = read_ep_fifo(0, (u8 *)p_ctrl_req_buf, sizeof(标准Setup包)); if (recv_len == sizeof(标准Setup包)) { log_udc_dbg("0 i: r su\r\n"); /* 如果没有数据过程,那么响应 0长度包 */ if(p_ctrl_req_buf->wLength == 0) { log_udc_dbg("su n d p\r\n"); 响应 0 长度包,清中断 } /* 有数据过程 */ else { log_udc_dbg("su h d p\r\n"); // 如果数据过程的方向是 主机->设备,那么修改阶段位 if(ctrl_req_dir == CTRL_REQ_DIR_HOST_TO_DEVICE) { g_udc.ep0state = 数据OUT阶段; } 响应 0长度包,清中断 } log_udc_dbg("su t 0x%02x\r\n", p_ctrl_req_buf->bRequest); // 将setup请求回传给核心层进行处理 rt_usbd_ep0_setup_handler(&g_mr100_udc, (struct urequest*)p_ctrl_req_buf); } else if(recv_len == 0) { log_udc_info("ep0_st idle: r zlp\r\n"); } // 非预期的中断,发送 STALL else { log_udc_info("ep0_st idle: tx stall\r\n"); 发送 STALL goto stall; } } break; } // 数据 IN 阶段 -> 数据阶段发送数据到主机 case 数据 IN 阶段: { if (数据发送完成) { max_pkt_size = _get_ep_max_packet_size(0); log_udc_dbg("0 d w c\r\n"); // 发送完成的数据长度 < 最大包长,那么说明发送的是最后一个数据包 if (g_udc.ep0.previous_write_len < max_pkt_size) { g_udc.ep0.previous_write_len = 0; log_udc_dbg("p w len
idle\r\n"); // 切换到传输阶段 g_udc.ep0state = 空闲阶段; } // 回传告知核心层 rt_usbd_ep0_in_handler(&g_mr100_udc); } break; } // 数据 OUT 阶段 -> 数据阶段接收主机的数据 case 数据OUT阶段: { if (数据接收完成中断) { /** * 1. 如果上层指定了数据接收任务,那么将数据读出,进行后续处理 * 否则,直接将数据丢弃 */ p_ep0 = &(g_xxx_udc.ep0); if ((p_ep0->request.buffer != NULL) && (p_ep0->request.remain_size > 0)) { max_pkt_size = _get_ep_max_packet_size(0); recv_len = read_ep_fifo(0, p_ep0->request.buffer, p_ep0->request.remain_size); /** * 读到的数据包 < 最大包长,那么是最后一个数据包 * ....下一阶段回到 IDLE,准备接收主机的下一个 setup * 否则,后续还可能需要继续接收数据 * ....下一阶段依然是 OUT_DATA,准备接收后续的数据包 */ if (recv_len < max_pkt_size) { g_udc.ep0state = 空闲阶段; 清中断标志位,硬件其余操作 } else { g_udc.ep0state = 数据OUT阶段; 清中断标志位,硬件其余操作 } rt_usbd_ep0_out_handler(&g_xxx_udc, recv_len); } } break; } default: break; } static rt_size_t _ep_write(rt_uint8_t address, void *buffer, rt_size_t size) { u8 ep_id = address & 0x0f; bool is_need_zlp = false; u32 ep_max_pkt_size = 0; u32 remain_byte = 0; if (ep_id == 0) { /* 存档本次发送的数据长度,以便在发送完成中断中进行状态机切换 */ g_udc.ep0.previous_write_len = size; g_udc.ep0state = 数据 IN 阶段; ep_max_pkt_size = _get_ep_max_packet_size(0); if (size < ep_max_pkt_size) { is_need_zlp = false; } else if (size == ep_max_pkt_size) { /* 本次传输总的剩余长度 == 当前传输长度 * 那么当前传输的就是最后一个数据包,因此需要传输一个 zlp 作为结束 * */ remain_byte = g_xxx_udc.ep0.request.remain_size; if (remain_byte == size) { is_need_zlp = true; } else { is_need_zlp = false; } } } write_ep_fifo(ep_id, buffer, size, is_need_zlp); return size; } ```
撰写答案
登录
注册新账号
关注者
0
被浏览
1.7k
关于作者
jh442755
这家伙很懒,什么也没写!
提问
1
回答
4
被采纳
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
RT-Thread项目助手v0.2.0 - 支持Env Windows
2
RttreadV5.10上,GD32F450Z RTC时间显示问题
3
rt-smart启动流程分析
4
EtherKit快速上手PROFINET
5
RTThread USB转串口无法接收数据
热门标签
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
cubemx
flash
freemodbus
BSP
packages_软件包
潘多拉开发板_Pandora
定时器
ADC
flashDB
GD32
socket
编译报错
中断
Debug
rt_mq_消息队列_msg_queue
SFUD
msh
keil_MDK
ulog
MicroPython
C++_cpp
本月问答贡献
出出啊
1517
个答案
342
次被采纳
小小李sunny
1444
个答案
290
次被采纳
张世争
813
个答案
177
次被采纳
crystal266
547
个答案
161
次被采纳
whj467467222
1222
个答案
149
次被采纳
本月文章贡献
出出啊
1
篇文章
2
次点赞
小小李sunny
1
篇文章
1
次点赞
张世争
1
篇文章
3
次点赞
crystal266
2
篇文章
2
次点赞
whj467467222
2
篇文章
2
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部