TeenyUSB问题反馈
TeenyUSB问题反馈
以下是TeenyUSB协议栈与《STM32 USB设备开发指南》中的常见问题,如果有新的问题也可以在评论中提出。
问:在哪里能获取TeenyUSB的完整代码?用什么工具编译?
答:TeenyUSB代码在 https://github.com/xtoolbox/teenyusb 可以获得,使用gcc进行编译,部分例程有Keil工程。
问:TeenyUSB支持哪些芯片?支持哪些USB内核?
答:TeenyUSB目标是支持STM32全系列的芯片,目前已经在STM32F072,STM32F103,STM32F107,STM32F303,STM32F407以及STM32F723上进行了测试。上述的芯片涵盖了USB FS,USB FS+,OTG FS,OTG HS + ULPI Phy,OTG HS + 内置高速Phy这些内核。
问:TeenyUSB支持主机模式吗?
答:TeenyUSB支持主机模式,目前主机支持HUB、CDC(虚拟串口)、MSC(U盘)和HID类(键盘、鼠标、自定义设备)。
问:TeenyUSB中的PC端测试工具有源代码吗?
答:PC端测试工具是由一个名为XToolbox的Qt Lua框架编写的,框架的Qt源代码在 https://github.com/xtoolbox/qtlua 。工具的业务逻辑代码为lua格式,在https://github.com/xtoolbox/TeenyUSB_pc_tool 。
问:TeenyUSB中的USB描述符生成工具有源代码吗?
答:TeenyDT使用lua编写,源代码在 https://github.com/teenydt/teenydt.github.io,也可以在http://dt.tusb.org或http://dt1.tusb.org上进行在线使用。
问:在哪里能看到《STM32 USB设备开发指南》的完整电子版本文档?
答:在www.tusb.org可以获取到《STM32 USB设备开发指南》的完整电子版,目前文档还在编写中。
问:TeenyUSB能够与HAL库一起使用吗?能够与CubeMX自动生成的代码一起使用吗?
答:TeenyUSB依赖HAL库的头文件,可以与HAL库一起使用。TeenyUSB能够与CubeMX自动生成的代码一起工作,《将TeenyUSB加入到CubeMX生成的工程中》 这篇文章介绍了如何将TeenyUSB加入到CubeMX自动生成的工程中。
162 Responses
lishiyu says:
TeenyUSB支持哪些芯片,能不能在STM32F107上用?
2019-02-18 at 10:00
xtoolbox says:
支持STM32全系列的芯片,STM32F107上运行的例程在这里
https://github.com/xtoolbox/TeenyUSB/tree/master/demo
例程使用的是CubeMX 生成的初始化代码。
2019-02-21 at 11:05
Linch says:
您好,请问下,有没有计划在RTOS环境的兼容。比如FreeRTOS。
2019-02-18 at 15:26
xtoolbox says:
有支持RTOS的计划,在设备端支持RTOS比较简单,在回调函数中调用RTOS的通知机制。近期会出一个在rtthread上的使用的例程,包含设备和主机部分功能。
感谢您的关注
2019-03-02 at 15:28
Linch says:
您好,TeenyUSB如何在RTOS中使用?
2019-02-19 at 21:10
xtoolbox says:
你好,RTOS与TeenyUSB的集成demo正在开发中,这里有一个基于rt-thread示例:host_rtt
在这个demo中的 teeny_usb_class.c 文件中,演示了如何在RTOS中处理TeenyUSB中产生的事件。
主要是处理下面这四个函数:
tusb_reconfig 在设备枚举时调用,在这个函数中初始化端点,和设备相关数据
tusb_class_request 这这里处理设备相关的请求
tusb_on_tx_done 数据发送完成时调用,如果在rtos中使用的阻塞式等待发送结束,可以在这里通知等待的线程发送完成
tusb_on_rx_done 接收到数据时调用,在这里通道监听的线程,有数据到来
2019-03-02 at 16:32
沈秋实 says:
我在移植rtt例程到f429时,遇到u盘容量识别正常,挂载到romfs的udisc0节点成功,但是之后bluk读取csw大小错误,有时大小正常但是cswtype和签名都错误的情况
2019-04-17 at 20:47
xtoolbox says:
你好,关于你说的问题我在STM32F723的开发板也有发现。目前我观察到的现象是,开启HS模块的DMA后出现这样的问题,而关闭DMA后没有这个问题。猜测原因是Bulk传输的Nak处理有问题。没有开启DMA时,一次只传输一个包,如果收到NAK后重传当前包。而开启DMA后,NAK处理由DMA控制器来完成,这部分代码还有问题,而关于USB专用DMA控制器的文档资料很少,因此一直没有找到原因。
在FS模块上没有这个问题,不知道你发现的问题是否是这样的。
2019-04-19 at 21:28
xbear says:
atmel的sama5d27芯片DMA控制器的文档资料比较齐全,可以考虑使用。
2019-08-21 at 10:18
maker says:
请问下,这里为什么在发送数据之前一定要检查data_cnt值才能正常接收数据。
while(1){
// if(data_cnt)
{
while(1)
{
int ret = tusb_send_data(dev, TX_EP, send_buff, len, TUSB_TXF_ZLP);
tusb_delay_ms(1000);
ret = 0;
}
}
}
上面代码中,// if(data_cnt),这里注释掉了后就接收不到数据了,加了这个判断,然后需要在上位机发送几个数据后才能在上位机正常接收数据;我想直接发送数据而不是先发送再接收
2019-02-26 at 15:35
xtoolbox says:
示例中的处理流程是收到数据后再调用tusb_send_data发送数据,如果需要直接发送。可以直接调用tusb_send_data进行发送,需要注意的是,在tusb_on_tx_done调用前,不能再次使用相同的端点发送数据。
2019-03-02 at 16:34
hellousb says:
XToolbox.exe,无法生成inf文件,怎么解决?
2019-03-20 at 14:10
xtoolbox says:
能否说一下具体是什么问题,生成inf文件时需要在接口中选择驱动的类型。
2019-03-23 at 21:26
dddggg says:
bulk例子,设备端是一收一发, 假设我只用来发送, 必须在枚举完成后并且是正常非挂起非拔出状态可用, 是否有对应的状态变量可以告知当前的设备状态,这样在TX前可查询状态判断。
2019-05-03 at 12:09
xtoolbox says:
方法1:
USB设备一般是在处理完Set Configuration请求后可以正常使用,可以检测tusb_device_t中的config字段,检测是否配置成功。
方法2:
重新实现tusb_class_request函数,检测到Set Configuration请求后,设置相关标志。
方法3:
USB设备端的发送其实也是由主机发起的,在设备中调用发送接口后,只是将数据准备在缓存中,等待主机来读取。因此也可以不用考虑设备是否枚举成功,直接调用发送接口。在发送成功回调函数中做进一步处理。
2019-05-07 at 17:54
Byron says:
在国内看到这样的技术人员真的很开心。我本来想用Linux做的一个小东西,也许不用上Linux了。
我需要一个单片机HOST主机,通过自定义HID协议与4个外设通信(4个外设是TI已经设计好的外设)。TI的外设是用过Libusb + hidapi来实现与PC通信的,枚举完直接用类似你说的RAW方式通信。看到你这个协议栈,我觉得应该也可以用STM32F4实现。有几个问题向你请教:
1、我看了你写的关于HUB那一部分,不知道我这种RAW用法会不会有问题,或者我把描述文件给你看一下,能否帮我确认一下。
2、如果我外设是固定的4个,类型一样,通过HUB来扩展,这种拓扑可靠度以你的判断可以尝试么?
以上感谢,我本人对USB只是了解皮毛。
2019-05-10 at 11:12
xtoolbox says:
Raw方式不包含USB的枚举和设置,如果是Ti设计的标准外设可能会有问题。建议使用标准的处理方式。Raw只是一个用来演示主机如何与从机通讯例子,不能用在实际项目中。
1. 不建议在实际项目中使用Raw这种通讯方式,兼容性和可靠性都没有保障
2. USB设备不建议使用在工业环境下,如果一定要用,需要做好断线后重新枚举的工作。
2019-05-13 at 10:42
Byron says:
另外关于HUB那个例程,怎么使用。
我现在的拓扑是:
STM32F4 FS HOST
——> HUB
——>DEV1
——>DEV2
这样的连接,请问参考你HUB 和 RAW例程,怎么把他们管理起来。谢谢
2019-05-10 at 15:16
xtoolbox says:
STM32F4的FS主机接口接在HUB的上行接口上,HUB的下行接口再接Dev1, Dev2等
这种复杂的结构不能使用HUB和RAW的例程了,需要使用host_rtt例程。
原因是USB对设备的枚举和数据传输有要求 ,需要按照一定的节奏来处理,rt thread中有一个USB主机栈,我在它的基础之上做了一些修改。如果你要使用的话,最好是从这个例程开始。
目前host rtt 的例程只测试了HID键盘鼠标,HUB和U盘设备,例程还在完善中。
2019-05-13 at 10:49
Byron says:
HI
我在STM32F4上尝试使用你的demo/host_input 例子。
使用的是FS接口,HUB能正常枚举,但是无法枚举HUB上的HID设备。
出错的位置:
当调用HUB的handle中 enum_device 时会出现失败:
// Step5 setup control pipe for device
if( tusb_pipe_open(host, &device->ctrl_pipe.ctrl_in, device->addr, 0x80, EP_TYPE_CTRL, device->device_desc[7], device->speed) != 0
|| tusb_pipe_open(host, &device->ctrl_pipe.ctrl_out, device->addr, 0x00, EP_TYPE_CTRL, device->device_desc[7], device->speed) != 0)
{
USBH_ErrLog(“fail to open control pipe”);
goto dev_fail;
}
失败的原因是hc_num = 0xff,似乎是说找不到通信通道了。
2019-05-11 at 00:17
erick says:
这个winUSB的通讯速率能达到多少啊
2019-07-14 at 22:22
xtoolbox says:
数据如果只做回环,不做其它处理,USB全速的速度可以跑满,高速可以跑到20MBytes左右。
2019-07-16 at 14:08
scmycjm says:
请教下,我现在想用F407的板子做主机,处理通过hub扩展的多个U盘里的数据。因为只有hub接hid的例程,我想改成hub接msc的话,调用cube的host库里面的usbh_msc里面的函数会很麻烦吗,还是说需要在teenyusb库的基础上修改。因为对USB不是很了解,之前找主机hub库发现资料很少,自己从头写也感到无从下手。
PS:如果大大能出个主机msc例程就太好了,感激不尽
2019-08-08 at 14:11
xtoolbox says:
你好,Cube库中例程增加hub功能比较复杂,不建议在Cube库基础上修改。
TeenyUSB目前包含主机通过hub接U盘的例程,用的是修改后的rt-thread USB主机协议栈。例程在 这里https://github.com/xtoolbox/TeenyUSB/tree/master/usb_stack/demo/host_rtt。
例程支持主机支持通过HUB接键盘、鼠标、U盘,或是不用HUB直接接这些设备。
2019-08-11 at 18:01
scmycjm says:
打扰一下,我自行移植rtt例程到EVK407I这个板子上之后一直调试不成功。目前的表现是rt_usbh_class_driver_init,与rt_usbh_hub_init这两个函数走不通。
1.rt_usbh_class_driver_init下,是为了注册各个usb设备,分别对三种设备进行绿以下这句代码
drv=rt_usbh_class_driver_xxx();这句代码分别对应了
xxx_driver.enable = rt_usbh_xxx_enable;例如hub在这里应该会启动rt_usbh_hub_enable(struct uhintf *arg)这个函数,但是始终进不去。因此后面的功能都不能用。
2.rt_usbh_hub_init(uhcd_t hcd)建立了hub的线程rt_usbh_hub_thread_entry,
但是这个线程里面走过一次rt_usbh_hub_port_change之后break出去就再也不进这个线程了
虽然为了减少因为我知识不足而造成的错误买了你提到测试过的EVK407I这个板子,但是文件比较多,而且我对操作系统也还在学习中,而rtt例程在开发指南里也没有说明,可能移植的过程导致了这些问题,麻烦大大解答一下,或者有没有比较不容易出错的移植方法,十分感谢。如果rtt例程能出个指导说明就更好了,感激不尽
2019-08-15 at 19:09
xtoolbox says:
你使用的是原生的rt-thread还是我修改过USB部分的rt-thread。原生rt-thread的USB Host在处理HUB逻辑的时候有一些问题,我做了一下修改。会不会是这个原因导致你的port_chaged只能执行一次。
2019-08-27 at 10:59
xbear says:
有2个问题请教:
1,你这个移植到ATMEL SAM5D27的MCU上实现USB host,要改动哪些文件夹的文件啊?
2,为什么不考虑把Linux的host驱动直接移植到stm32上来用呢?是不是难度太大?有哪些困难需要克服呢?
谢谢!
2019-08-20 at 18:39
xtoolbox says:
1. 需要把ST芯片相关的操作部分进行移植,最后暴露出端点读写的接口。
2. Linux的Host驱动涉及到大量的系统相关接口,需要将这些Linux系统相关的接口都进行移植。使用rt-thread是因为rt-thread本来就提供了完整的USB Host驱动,只需要将TeenyUSB的主机接口与rt-thread进行对接就行了。
2019-08-27 at 10:53
JunQi says:
你好,我参考你的教程使用cubemx创建了STM32F411工程,移植了自定义USB免驱设备的程序,测试是正常的。但是我想做一个Bulk传输和HID 键盘的复合设备,应该参考什么资料呢,demo里面复合设备只有5个CDC串口的例程,HID设备只有自定义设备的例程,希望能指点一下,谢谢。
另外,之前没有接触过USB设备,看了你文档有很多收获,不过好像在你的博客没有找到赞赏通道,希望给作者买杯咖啡支持一下!
2019-10-11 at 17:14
xtoolbox says:
如果要做复合设备,描述符可以直接将CDC和HID的结合在一起。以5个CDC串口为例,在描述符的lua脚本中,将其余四个接口删除,然后将HID设备的接口加入进去,注意端点不要冲突了。
请求处理部,将hid_class和cdc_class中的tusb_class_request部分进行合并,然后根据接口号判断。
复合设备的demo正在计划中,预计年底前会出一个复合设备的例程。
2019-10-12 at 11:18
scmycjm says:
请教一下rtt例程移植到rt-thread的原生BSP上开发的工程需要做哪些改动,这个例程除了USBhost做过修改还有其他对原生进行改动的地方吗
2019-10-17 at 10:26
xtoolbox says:
我改了rt thread中HUB端口枚举部分的代码,增减了对多个HOST控制器的支持。对rtt其它的原生的内容没有修改。
2019-10-22 at 20:37
王生 says:
大神,您好,
我手上刚好有一块F723disco,试了一下F723dap,
CMSIS-DAP V1, HID windows见不到,用不成。
CMSIS-DAP v2,Windows见到,但是是null设备,用不成。
我是用Keil编译的,有一些warnings,没有errors。CDC5,正常。
2019-10-24 at 10:12
王生 says:
谢谢,好像收到回复您的回复,不过一闪就不见了,50MHz什么的,请重新发给我一次。
v2的WinUSB模式的UUID没有起作用,Windows不能自动识别为DAP。
2019-10-24 at 11:48
xtoolbox says:
我看了一下pyocd的代码,V2并不是通过GUID来识别的,而是通过接口的描述符来识别的,并且对IO和OUT端点的顺序有要求。 V1是一个标准HID设备,正常情况下Windows下都能识别到。
2019-10-26 at 21:44
王生 says:
我是用Keil来测试的,在CMSIS-DAP下面,都用不成。再说吧,这个不重要,有时间把您的库完善起来更重要。
2019-10-27 at 19:11
王生 says:
发现您的TeenyUSB,Keil编译出来的代码尺寸很小,节省60%以上!
我想用TeenyUSB的高速库,替换ARM的RL_USB,也就是RTE内嵌的USB库,不知您有没有计划实现这个?谢谢。
2019-10-24 at 12:05
xtoolbox says:
因为keil免费版有32K的限制,只能往小了写:)
尺寸小是因为裁剪了很多的功能,比如多Config和接口的Alternate Setting就没有实现。
如果要做到RL_USB那么完善,需要花大量的时间来进行测试。目前精力不允许,但是会慢慢完善这个库。
对于STM32而言,USB部分的文档并不是很完善,有一些处理机制文档中并没有说明,遇到问题解决起来就更麻烦了。
2019-10-26 at 21:50
王生 says:
谢谢,希望您的API接口能够接近一种目前大量使用的中间件,这样便于无缝替换,我希望是RL_USB,其他公司的ARM也可以使用。像DAPLink一样,只要更换底层就可以用了。
您的TeenyUSB驱动部分,很像DAPLink的,配置部分比较有特色,我正在学习中。
很遗憾您的Demo在我的Keil下面编译出来后,除了CDC5其他都不能正常工作,我认为主要是我的编译环境设置与您的有不同,我又不知道如何修改。
2019-10-27 at 19:30
xtoolbox says:
有可能是最近增加了gcc的编译支持,导致部分keil的功能不正常了。我后续会将demo中的例子在gcc和keil下测试一遍,看看问题在哪里。usb_stack/demo中的例子后面不会再支持了,晚些时候所有的例程都会移到外面的demo中。
感谢你的反馈
2019-10-28 at 19:23
Ted says:
你好,我想请教一下像F723是内置了高速芯片的,如果移植到其他外置HS芯片的mcu如F4上面,想要使用OTG HS的话,drv_teeny_usb.c中HS的VBUS与PWR相关逻辑应该怎样处理?目前使用的EVK407I这个板子在测试,发现fs/hs模式切换的函数涉及到队VBUS与PWR的识别与处理,于是想请教下ULPI应该怎么处理这部分逻辑。
2019-10-28 at 18:22
xtoolbox says:
VBUS和PWR的识别主要是用来做主从切换的,FS/HS模式目前还不能动态切换,当选择HS Core时,默认会使用HS模式。如果要使用HS Core的FS模式,需要修改代码中的宏定义,在编译时确定。
2019-10-28 at 19:20
Ted says:
现在移植完调试后遇到几个问题
1. OTG fs 主机模式能够识别到U盘等插入,并获取容量等信息,但挂载文件系统失败, 在这一句 if ((*ops)->mount(fs, rwflag, data) < 0)后进入mount error。
2. OTG fs 主机模式插上hub后,在hub上接一个u盘能正常读出容量,接第二个U盘后变提示get full device descriptor failed及get device descriptor head failed,调换顺序也是第二个U盘无法读取描述符。同样两个U盘都无法挂载文件系统
请教一下这个可能是什么原因造成的
2019-10-29 at 17:44
xtoolbox says:
主机的DEMO在兼容性方面还有问题,mount失败有可能是因为收到一些不支持的命令后,U盘将端点设置为STALL,之后主机没有正确处理端点的状态。
后面会计划重新写一个不依赖于rtt的主机协议栈。
我在测试时也会出现获取设备描述符失败的情况,主机这部分的代码还需要更多的测试及调整。
ST手册上对OTG主机的介绍太简单了,很多地方需要靠测试才能知道是什么情况。ST这个OTG内核应该在其它MCU上也有使用,不知道其他厂家有没有更详细点的手册。
2019-10-29 at 23:18
Ted says:
挂载的问题解决了,就是描述符获取失败有点头疼,现在hub上挂任意设备都很正常,当挂第二个设备之后两个设备会一起挂掉提示描述符获取失败,但是hub还是正常的,两个设备一起拔掉再插一个就又好了。看了下hub获取描述符和device获取描述符的函数就type不一样,感觉只能慢慢捋描述符这块代码了?
2019-10-31 at 18:33
xtoolbox says:
计划出一个不含RTOS的主机例程,重点解决兼容性方面的问题。目前发现在主机通道通讯出错后,重传机制还有一些问题。
2019-11-05 at 10:13
xtoolbox says:
最近刚发现一个高速USB的问题,在F723上,HS USB做主机,当从设备拔下后再插上,会一直进入transaction error状态,无法恢复。解决办法就是根设备拔出后,先reset HS core,再重新初始化HS Core。
2019-11-12 at 10:12
SUPER_CRJ says:
你好,最近准备使用,但是发现:USB描述符生成工具页面是:404。也没有在github中找个这个软件。请问是删除了吗?
2019-11-18 at 10:36
xtoolbox says:
描述生成工具的页面移到了dt.tusb.org,如果访问慢使用国内镜像dt1.tusb.org。
2019-11-19 at 12:23
SUPER_CRJ says:
你好,还想请问下:我想做USB的复合设备,应该如何下手?我对USB不是太熟悉,测试了你的几个例程,希望使用:自定义USB设备(高速)与HID设备(低速,但是整个windows都可以免驱使用。)的复合设备。
另外:发现你的CDC例程,在安装驱动方面不是太理想:win10下说明:试图将程序添加到存储区时遇到问题,不知道可以不可以优化下。(用jlink还有cubemx生成的VCP都是直接使用的。)
2019-11-18 at 15:02
xtoolbox says:
复合设备的例程目前做了一些底层修改,解决了一些枚举问题。在demo目录下的所有板子上都可以正确枚举和使用了。
2019-11-19 at 12:25
SUPER_CRJ says:
我今天测试了F0的CDC,发现生成的驱动程序在安装后:并没有显示串口,而是显示在:通用串行总线设备中。请教,这是什么原因?
2019-11-19 at 17:05
xtoolbox says:
这是因为没有使用IAD描述符,Windows默认驱动不认识了。目前经过测试的demo在 https://github.com/xtoolbox/TeenyUSB/tree/master/demo 这里,以前usb_stack/demo中的示例将不再维护了。最新的代码解决了几个在F0/F1设备上枚举失败的问题,你可更新后试试。
2019-11-21 at 10:22
Watt says:
您好,我看到评论里有提到之前的例程不会维护了,而新的主机栈不包含MSC,那么以后新主机例程有添加MSC存储功能的计划吗,或者直接使用以前的rtt例程?
2019-11-26 at 17:07
xtoolbox says:
msc主机功能目前正在测试中,测试通过之后会更新到项目中。
2019-11-28 at 22:15
SUPER_CRJ says:
你好,我在测试:STM32F0的CUSTOM HID设备时候发现(用的DEMO),如果电脑主机向单片机进行发送,但是如果不返回数据的话(就是把接收的数据+1返回的那个指令屏蔽),电脑的下一次发送就卡住,已测试了几个。应该是单片机程序的问题,但是我不是太理解USB协议栈,想问这是什么原因?
2019-12-05 at 15:31
xtoolbox says:
例程的回环数据测试流程是电脑发给MCU,MCU将接收端点停掉,MCU再回电脑,发送成功后再重新使能接收端点。这样有流控的效果,保证数据不会丢失。
如果在收到数据后不希望关掉接收端点,可以在tusb_on_rx_done回调函数中返回0。
2019-12-07 at 20:19
Watt says:
主机MSC接HUB之后,通过HUB接两个以上设备会出现错误。
具体表现为
1.若同时插入两个设备(如先将两个U盘插入HUB,再将HUB接入主机)则均获取描述符失败提示
DEV FS.00 Setup stage fail, TUSB_CS_TRANSACTION_ERROR
DEV FS.00 Fail to get device descriptor
2. 若先后插入两个设备,则第一个能识别并挂载文件系统,第二个插入后提示
ENDP FS.03.02 Fail to allocate pipe
ITF FS.03.0-0 Fail to allocate pipe for MSC out
但输入lsusb后则均能显示ID等信息
2019-12-10 at 16:22
xtoolbox says:
Fail to allocate pipe
说明主机的PIPE资源已经用完了,你用的是什么型号的芯片做host
2019-12-12 at 14:59
Watt says:
使用的F407,这表示需要换芯片才能支持HUB下游挂多个设备吗?
2019-12-13 at 11:17
xtoolbox says:
能不能将完成的输出日志贴上来,我看一下是哪一步出的问题。
我这边测试HUB的时候发现兼容性还有一些问题。比如有的HUB接键盘可以枚举,有的就不行,需要在SETUP包和后续数据包之间做一些延时,目前还没想好延时的机制该怎么做。
Fail to allocate pipe这样的错误很少会出现。
2019-12-13 at 11:46
Watt says:
首先是依次插入两个msc设备
TeenyUSB > RHUB FS:0 Connect
RHUB FS:0 Enable
DEV FS.00 Allocate pipe, in = 0, out = 1
DEV FS.01 Re-allocate pipe, in = 0, out = 1
DEV FS.01 FS device, VID:0bda PID:5411
ITF FS.01.0-0 HUB interface init, port num = 4
DEV FS.01 Device has 1 interfaces
SHUB FS.01:0 HUB port state = 04
SHUB FS.01:2 HUB get port 2 status
SHUB FS.01:2 Connect
SHUB FS.01:0 HUB port state = 04
SHUB FS.01:2 HUB get port 2 status
SHUB FS.01:2 Enabled
DEV FS.00 Allocate pipe, in = 3, out = 4
DEV FS.02 Re-allocate pipe, in = 3, out = 4
DEV FS.02 FS device, VID:0951 PID:1665
ITF FS.02.0-0 MSC lun(0) Kingston – DataTraveler 2.0 – 1.00
ITF FS.02.0-0 MSC lun(0) Block Count:60437492 Size:512
MSC mount [0:] r = 0
ITF FS.02.0-0 MSC interface init
DEV FS.02 Device has 1 interfaces
SHUB FS.01:0 HUB port state = 10
SHUB FS.01:4 HUB get port 4 status
SHUB FS.01:4 Connect
SHUB FS.01:0 HUB port state = 10
SHUB FS.01:4 HUB get port 4 status
SHUB FS.01:4 Enabled
DEV FS.00 Allocate pipe, in = 3, out = 4
DEV FS.03 Re-allocate pipe, in = 3, out = 4
DEV FS.03 FS device, VID:14cd PID:1212
ENDP FS.03.02 Fail to allocate pipe
ITF FS.03.0-0 Fail to allocate pipe for MSC out
ITF FS.03.0-0 MSC interface init
DEV FS.03 Device has 1 interfaces
lsusb
Device of FS root hub
Device VID:0bda PID:5411, Parent: ROOT FS:0
Interface 0: HUB
Device VID:0951 PID:1665, Parent: Dev 01:2
Interface 0: Mass Storage
Device VID:14cd PID:1212, Parent: Dev 01:4
Interface 0: Mass Storage
然后是同时插入HUB及两个设备
TeenyUSB > RHUB FS:0 Connect
RHUB FS:0 Enable
DEV FS.00 Allocate pipe, in = 0, out = 1
DEV FS.01 Re-allocate pipe, in = 0, out = 1
DEV FS.01 FS device, VID:0bda PID:5411
ITF FS.01.0-0 HUB interface init, port num = 4
DEV FS.01 Device has 1 interfaces
SHUB FS.01:0 HUB port state = 14
SHUB FS.01:2 HUB get port 2 status
SHUB FS.01:2 Connect
SHUB FS.01:4 HUB get port 4 status
SHUB FS.01:4 Connect
SHUB FS.01:0 HUB port state = 14
SHUB FS.01:2 HUB get port 2 status
SHUB FS.01:2 Enabled
DEV FS.00 Allocate pipe, in = 3, out = 4
DEV FS.00 Setup stage fail, TUSB_CS_TRANSACTION_ERROR
DEV FS.00 Fail to get device descriptor
SHUB FS.01:2 Device attach failed
SHUB FS.01:4 HUB get port 4 status
SHUB FS.01:4 Enabled
DEV FS.00 Allocate pipe, in = 3, out = 4
DEV FS.00 Setup stage fail, TUSB_CS_TRANSACTION_ERROR
DEV FS.00 Fail to get device descriptor
SHUB FS.01:4 Device attach failed
lsusb
Device of FS root hub
Device VID:0bda PID:5411, Parent: ROOT FS:0
Interface 0: HUB
Device VID:0000 PID:0000, Parent: Dev 01:2
Device VID:0000 PID:0000, Parent: Dev 01:4
2019-12-16 at 09:28
xtoolbox says:
1。 依次插入两个msc设备失败的问题
根据日志中的记录,是主机的PIPE不够用了,STM32F407一共8个PIPE。PIPE使用情况如下:
0,1 HUB的控制端点,2 HUB中断端点。HUB初始化完成后释放0,1 PIPE。 (占用2PIPE)
第一个U盘接入,0,1 HUB控制端点。 3,4 第一个U盘控制端点,5,6第一个U盘传输端点。 U盘初始化完成后 0,1,3,4释放。(占用2,5,6 PIPE)
第二个U盘接入,0,1 HUB控制端点。 3,4 第二个U盘控制端点,7,第二个U盘IN端点,8(没有了)第个二个U盘OUT端点(此处失败)。 U盘初始化完成后 0,1,3,4释放。
这里尝试两个U盘的控制端点都复用HUB的,减少对PIPE的需求。
2。同时插入HUB及两个设备的问题
因为HUB上电同时两个U盘也启动,设置地址时SETUP传输失败。这个原因可能是因为U盘还未准备好,应该加入重试机制。
感谢你的反馈,近期会针对这两个问题进行修复。
2019-12-16 at 10:44
hacklinshell says:
你好,我准备做STM32F429的usb接一个 usb接口的4G模块,准备研究下,能否大概说下我需要做什么,我还没仔细看teenyusb,看到有厂家自定义设备,是不是只需要你这个移植进去,然后进行收发AT命令就可以了。 很抱歉 还没看就直接问了
2019-12-16 at 14:59
hacklinshell says:
我大概知道了,需要CDC ACM 和CDC RNDIS
2019-12-16 at 17:06
xtoolbox says:
4G模块一般是用的虚拟串口来发AT命令,需要先用CDC HOST配合PPP协议将4G模块驱动起来。
2019-12-17 at 10:25
rsltek says:
您好,非常感谢提供了如此优秀的USB库,目前遇到了一个问题,我修改STM32F205外挂USB3300作为高速采集应用,已经调试成功,但是速度很慢,跟芯片自带的USB FS差不多,请问应该如何优化?目前跑的是最简单的WINUSB BULK的例子,double buffer,64字节。
board_config.h已经按照要求修改为实际的引脚以及定义
配置文件是这个
return Device {
strManufacturer = “TeenyUSB”,
strProduct = “TeenyUSB Custom Bulk”,
strSerial = “TUSB123456”,
idVendor = 0x0483,
idProduct = 0x0001,
prefix = “BULK”,
Config {
Interface{
WCID=WinUSB,
GUID=”{1D4B2365-4749-48EA-B38A-7C6FDDDD7E26}”,
EndPoint(IN(1), BulkDouble, 64),
EndPoint(OUT(2), BulkDouble, 64),
},
}
}
2019-12-26 at 14:24
rsltek says:
#ifndef __BOARD_CONFIG_H__
#define __BOARD_CONFIG_H__
/* Use external phy for high speed core */
#define OTG_HS_EXTERNAL_PHY
/* Use embedded phy for high speed core */
//#define OTG_HS_EMBEDDED_PHY
/* Use embedded phy for full speed core */
#define OTG_FS_EMBEDDED_PHY
/* Enable DMA for High speed phy */
#define OTG_HS_ENABLE_DMA
/* Support for other speed config and device qualifier descriptor */
#define SUPPORT_OTHER_SPEED
/* Setup descriptor buffer size, used for other speed config and DMA */
#define DESCRIPTOR_BUFFER_SIZE 256
/* USB core ID used in test app, 0 – FS core, 1 – HS core */
#define USB_CORE_ID_FS 0
#define USB_CORE_ID_HS 1
#define TEST_APP_USB_CORE USB_CORE_ID_HS
#if defined(USE_RTTHREAD)
#include
#define RTOS_INTERRUPT_ENTER() rt_interrupt_enter()
#define RTOS_INTERRUPT_LEAVE() rt_interrupt_leave()
#define TUSB_PRINTF rt_kprintf
#define TUSB_HAS_OS
#endif
/**USB_OTG_HS GPIO Configuration
PA3 ——> USB_OTG_HS_ULPI_D0
PB0 ——> USB_OTG_HS_ULPI_D1
PB1 ——> USB_OTG_HS_ULPI_D2
PB10 ——> USB_OTG_HS_ULPI_D3
PB11 ——> USB_OTG_HS_ULPI_D4
PB12 ——> USB_OTG_HS_ULPI_D5
PB13 ——> USB_OTG_HS_ULPI_D6
PB5 ——> USB_OTG_HS_ULPI_D7
PI11 ——> USB_OTG_HS_ULPI_DIR
PC0 ——> USB_OTG_HS_ULPI_STP
PH4 ——> USB_OTG_HS_ULPI_NXT
PA5 ——> USB_OTG_HS_ULPI_CK
*/
#define OTG_HS_ULPI_IO_CLK_ENABLE() \
do { \
__IO uint32_t tmpreg = 0x00U; \
SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOAEN \
|RCC_AHB1ENR_GPIOBEN \
|RCC_AHB1ENR_GPIOCEN \
|RCC_AHB1ENR_GPIOHEN \
|RCC_AHB1ENR_GPIOIEN);\
/* Delay after an RCC peripheral clock enabling */ \
tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOAEN);\
UNUSED(tmpreg); \
} while(0U)
#define OTG_HS_ULPI_D0 GPIOA, 3, GPIO_AF10_OTG_HS
#define OTG_HS_ULPI_D1 GPIOB, 0, GPIO_AF10_OTG_HS
#define OTG_HS_ULPI_D2 GPIOB, 1, GPIO_AF10_OTG_HS
#define OTG_HS_ULPI_D3 GPIOB, 10, GPIO_AF10_OTG_HS
#define OTG_HS_ULPI_D4 GPIOB, 11, GPIO_AF10_OTG_HS
#define OTG_HS_ULPI_D5 GPIOB, 12, GPIO_AF10_OTG_HS
#define OTG_HS_ULPI_D6 GPIOB, 13, GPIO_AF10_OTG_HS
#define OTG_HS_ULPI_D7 GPIOB, 5, GPIO_AF10_OTG_HS
#define OTG_HS_ULPI_DIR GPIOC, 2, GPIO_AF10_OTG_HS
#define OTG_HS_ULPI_STP GPIOC, 0, GPIO_AF10_OTG_HS
#define OTG_HS_ULPI_NXT GPIOC, 3, GPIO_AF10_OTG_HS
#define OTG_HS_ULPI_CK GPIOA, 5, GPIO_AF10_OTG_HS
#endif
2019-12-26 at 14:24
xtoolbox says:
1. 高速接口建议将包长设置为512字节,即
EndPoint(IN(1), BulkDouble, 512),
EndPoint(OUT(2), BulkDouble, 512),
2. 将接收缓存设置得大一些,比如4096或者8192或者更大
3. 上位机发送时一次性发送的数据多一些
可以偿试用pc_test_tool作收发测试,这个测试工具的底层也是用的libusb
2019-12-30 at 10:41
rsltek says:
我现在只是按照要求测试了最简单的环回 发现不太理想,请问问题大概在什么地方,测试上位机是使用libusb完成的,每次64字节不停读写。
2019-12-26 at 14:26
王生 says:
今天有时间测试了F723的DAP,WinUSB的v2就正常。
HID的v1就在Win10的DeviceManager里面似乎正常,Keil里面认不到,不知什么原因不能使用。
2020-01-01 at 23:35
xtoolbox says:
Keil不认有可能是描述符没有匹配上,V1是由FS模块实现的,修改一下FS接口的描述符。
2020-01-04 at 20:50
王生 says:
不知道如何修改,试了两个地方,
1. FS 的 PID改为0x0205,以区分HS的0204
2. TeenyUSB FS CMSIS-DAP 改为 CMSIS-DAP FS TeenyUSB
还是不行。
2020-01-04 at 22:37
xtoolbox says:
你的Keil版本是多少
2020-01-05 at 11:50
王生 says:
5.28a
2020-01-06 at 01:48
xtoolbox says:
我的5.25测试是可以的,你的这个版本更高更应该没有问题才对
2020-01-08 at 15:30
KDX says:
您好,我使用drdrtt例程时发现mcu做主机通过hub同时接一个以上msc设备时上电会出现
DEV FS.00 Setup stage fail, TUSB_CS_TRANSACTION_ERROR
DEV FS.00 Fail to get device descriptor
SHUB FS.01:2 Device attach failed
这样的报错,拔掉之后分别插入则不会。我想做的project需要设备始终挂在mcu上不能插拔,请问应该如何解决?
2020-01-07 at 15:36
xtoolbox says:
这个问题我这边也发现了,一些设备接上HUB之后就会出现TRANSACTION_ERROR。
STM32有关于TT传输的寄存器但是没有相关的说明,不知道是否和这个有关。
要解决这个问题,可能要用USB分析仪抓包分析一下STM32发给HUB的数据和电脑发给HUB的数据有什么区别,导致了这种差异。 这个处理起来会比较繁琐。
2020-01-08 at 15:38
KDX says:
如果比较麻烦的话,我想搞个临时的方案,就是每次只单独使用某个设备的时候,单独挂载对应的port,屏蔽其他port。不过目前我没法在硬件上开关hub的各个port,软件上做的话在哪个位置关闭不需要的port呢。
2020-01-08 at 17:02
xtoolbox says:
简单做法是把 tusbh.h中的TUSBH_MAX_CHILD这个宏定义为1,这样只请允许一个设备连在hub上,但是也只能连在HUB的1号端口上。
复杂点的做法是在tusbh_hub.c,对hub上挂的设备进行计数,当不为零时则认为已有设备连接,不再枚举新设备。
2020-01-09 at 09:54
王生 says:
楼主,使用F723板和demo/composite代码,两个问题:
1. 如何使MSC的RAM盘初始化时,自动实现format,而不需要在PC端做format。
2. 如何令PC端识别出来的RAM盘带有特别的名字,比如F723(F:)。 谢谢。
2020-02-03 at 12:05
xtoolbox says:
1. 如何使MSC的RAM盘初始化时,自动实现format,而不需要在PC端做format。
预先在RAM中写入FAT文件数据,可以使用fatfs将一段RAM做为存储区,然后执行格式化命令。然后将MSC的block_read和block_write定位到这块区域
2. 如何令PC端识别出来的RAM盘带有特别的名字,比如F723(F:)。
与上面操作类似,使用fatfs格式化的时候写入盘符的卷标。
2020-02-04 at 14:32
tpu says:
今天在F405上试用成功。发现一点小问题:OTG_HS_EMBEDDED_PHY对应的,实际上是F7xx系列上的HS_PHY。相应的初始化代码不匹配F4系列上的FS_PHY。可能代码没有在更多的F4平台测试吧。
2020-02-05 at 21:43
xtoolbox says:
是的,F4系列不应该有OTG_HS_EMBEDDED_PHY,感谢你的反馈
2020-02-07 at 21:26
tpu says:
tusbh.c中, 920行:
for(uint32_t j=0;jep_num;j++){
tusbh_ep_info_t* ep = &itf->endpoints[i]; // <– 这里因该是j
一旦HID设备不在interface0上面,这个问题就暴露了.
2020-02-12 at 11:25
xtoolbox says:
确实,这个地方笔误了,一旦不在Inerface 0上面,就出问题了。谢谢你的反馈,已在
b28fca0 中修改此问题。
2020-02-12 at 14:58
tpu says:
某些设备对control out响应比较慢,具体表现为多次nak后才成功.目前代码里面nak后在irq里面直接重传了.但实际上重传两次后,就不再有irq产生了(f405上面表现如此).此时在主线程里面重传,还是可以成功的.
所以比较好的做法是,把nak后的重传从irq里面拿出放到主线程里面.
2020-02-12 at 11:32
xtoolbox says:
重传这部分需要重新设计,现在做法还很简单,失败了直接开始,没有考虑对端设备的处理能力。
2020-02-12 at 15:11
ARMDev says:
下载最新的查看了,例程是复合设备,数据结构也比较多。
可不可以出些单独的例程。这些设备交织在一起。而且不同的宏定义,指针交织,你代码是你一步一步搭建起来的,对于新手来说理解起来还需要很多时间。
希望出些单独的设备例程
2020-02-14 at 12:59
xtoolbox says:
后面有时间会出一些单独的例程。
目前的Composite例程要去掉不需要的功能,需要在composite_desc.lua中去掉不需要的描述符,然后重新make desc。
在composite_device.c文件中device_interfaces数组中,去掉不需要的接口。
解决掉编译错误就可以使用了。
2020-02-14 at 21:03
ARMDev says:
再请教一个问题:现在的例程中的CDC串口,在设备管理器显示的是:USB 串行设备,想改成自己名称,比如jlink的串口显示的就是:jlink cdc UART Port,请教这个应该怎么改?
据说是要改驱动的inf文件,但是CDC也算是通用的驱动了。可以通过改STM32代码实现吗?
2020-02-14 at 23:04
xtoolbox says:
可以试一下增加接口的字符描述,在接口中添加strInterface=”your description”
不过系统自带的CDC驱动好像是不会将这个字符显示出来的
JLink的这个名字是在inf文件中通过修改注册表的形式写上去的
2020-02-15 at 15:25
exculivor says:
接口里面加上了,但是转换后并没有增加Descriptor,手动加上之后修改哪里才能让字符串和interface对应啊?
2020-12-24 at 15:18
ARMDev says:
在用STM32F0的复合设备实验的MSC时:
1:使用的Flash大小是48KB,(2K * 24),但是模拟的U盘大小是:24KB。而且右键格式化的时候,也显示的是48KB,格式化完毕后就是24KB。是不是哪里存在什么BUG?
2:如何更改使用的Flash?在更改:#define START_ADDR (const uint8_t*)(0x08000000ul + 16*1024ul),这个宏定义,改变起始地址时,发现U盘和没有更改是一样的,也是24KB,而且也可以进行存储。
2020-02-15 at 14:53
xtoolbox says:
要使用其它存储空间做为U盘,需要更改MSC类的三个函数,分别是tusb_msc_device_t结构体中的
.get_cap 获取存储空间大小
.block_read 块读
.block_write 块写
你里空间大小不对,可能是get_cap没有返回正确的值
2020-02-15 at 15:32
ARMDev says:
今天测试了下STM32F0的CDC,但是发现:定义的line_coding.bitrate还有其他几个参数,在使用串口助手时候调试的时候,至始至终都是0。虽然实现了循环发送,但是没有实际的参数,日后不好做真实的USB转硬件串口。
2020-02-17 at 20:31
xtoolbox says:
使用真实硬件串口需要在on_line_coding_change函数中处理line coding的变化,设置为真实的速率
2020-02-18 at 18:01
ARMDev says:
已看到了,但是我看这个函数是空函数,希望下次可以更新一下。感谢!
2020-02-20 at 16:04
KDX says:
想问一下在F427外接用ULPI的PHY做USB DEVICE使用,类型是MSC读卡器,插上电脑后 显示“该设备无法启动。 (代码 10)”,可能是什么原因?尝试使用其他类型如鼠标等也是无法启动,偶尔会显示“未知设备,描述符请求失败”
在F407上用FS测试时能正常读取。
2020-02-25 at 14:00
xtoolbox says:
“未知设备,描述符请求失败”这个有可能是phy初始化失败造成,因为第一个取设备描述的请求就没有正确响应。
2020-02-27 at 15:44
徐超 says:
您好,想问一下,上位机开发,我用您的工具能正常通讯,然后我想自己开发一个上位机软件,用的是VS2017,然后USB库用的是libusb1.0.22,然后我用libusb库里的函数能找到设备,也能打开,但是用libusb_kernel_driver_active的时候,它返回是-12LIBUSB_ERROR_NOT_SUPPORTED,然后端口我想问一下您有遇到这样的问题吗,我改怎么解决。
2020-03-07 at 22:10
xtoolbox says:
设备是不是被其它程序打开了,或者是驱动安装不正确
我的工具用的是1.0.22修改版本,增加了同步通讯的功能
2020-03-09 at 17:23
徐超 says:
上次的问题已经解决了,谢谢,我想问一下,我想用一个设备,多个bulk端口,修改了多次都不成功,麻烦问一下在复合设备例程上怎么修改,谢谢
2020-04-10 at 15:47
xtoolbox says:
1. 修改描述述,在一个接口中增加多个bulk端点
2. 修改相应的接口处理函数,添加新增端点的处理
2020-04-11 at 21:55
yenext says:
您好,我在测试您的composite例程时,使用STM32F407开发板,计算机WIN10系统,设备管理器中默认识别为“USB串行设备(COM91)”我在使用XToolbox.exe的CDC能够进行通信,返回数据为传出+3。但是我用第三方的串口调试助手却无法打开该串口进行通信,您知道是为何吗?
2020-03-19 at 16:46
yenext says:
问题以及解决,利用在线工具从新生成设备描述符后解决了该问题。
2020-03-20 at 08:27
xtoolbox says:
感谢你的反馈。
Windows会根据设备描述符中的VID,PID以及版本信息对设备信息做缓存。如果有相同VID,PID以及版本的设备,不会再次做全部信息的枚举,所以有时修改了一些功能需要在设备管理器中卸载了驱动再安装才能使用。
2020-03-23 at 10:14
gamepader says:
您好,我在测试您的composite例程时,发现Windows主机能正常识别所有的设备,包括HID,CDC,Win-USB和MassStorage设备,但是在linux下无法识别出CDC设备,请问是缺少linux下对应的驱动吗?
linux内核:Linux raspberrypi 4.19.75-v7+ #1270 SMP Tue Sep 24 18:45:11 BST 2019 armv7l GNU/Linux
附上内核调试信息:
[ 44.781834] usb 1-1.3: new full-speed USB device number 6 using dwc_otg
[ 44.912976] usb 1-1.3: not running at top speed; connect to a high speed hub
[ 44.917680] usb 1-1.3: New USB device found, idVendor=0483, idProduct=0011, bcdDevice= 1.00
[ 44.917689] usb 1-1.3: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[ 44.917693] usb 1-1.3: Product: TeenyUSB Composite DEMO
[ 44.917697] usb 1-1.3: Manufacturer: TeenyUSB
[ 44.917701] usb 1-1.3: SerialNumber: TUSB123456
[ 44.925660] hid-generic 0003:0483:0011.0001: hiddev96,hidraw0: USB HID v1.11 Device [TeenyUSB TeenyUSB Composite DEMO] on usb-3f980000.usb-1.3/input0
[ 44.926900] usb-storage 1-1.3:1.4: USB Mass Storage device detected
[ 44.929248] scsi host1: usb-storage 1-1.3:1.4
[ 44.991329] cdc_acm: probe of 1-1.3:1.1 failed with error -22
[ 44.991391] usbcore: registered new interface driver cdc_acm
[ 44.991394] cdc_acm: USB Abstract Control Model driver for USB modems and ISDN adapters
[ 45.992751] scsi 1:0:0:0: Direct-Access TeenyUSB MSC BOT DEMO 1.0 PQ: 0 ANSI: 2
[ 45.993237] sd 1:0:0:0: Attached scsi generic sg1 type 0
[ 46.001406] sd 1:0:0:0: [sdb] 248 2048-byte logical blocks: (508 kB/496 KiB)
[ 46.003314] sd 1:0:0:0: [sdb] Write Protect is off
[ 46.003324] sd 1:0:0:0: [sdb] Mode Sense: 03 00 00 00
[ 46.003743] sd 1:0:0:0: [sdb] No Caching mode page found
[ 46.003750] sd 1:0:0:0: [sdb] Assuming drive cache: write through
[ 46.020129] sd 1:0:0:0: [sdb] Attached SCSI removable disk
2020-03-24 at 13:17
xtoolbox says:
看日志中有这么一行内容
cdc_acm: probe of 1-1.3:1.1 failed with error -22
这个应该是有一个请求没有正确响应导致的。Windows可能忽略了这个错误,在Linux上报错了。
你有没有抓包工具,能不能看一下是哪个请求报错
2020-03-24 at 18:00
gamepader says:
我尝试linux下抓USB包试试,后续给您反馈。
另外:如果您有条件的话,可以用虚拟机或者树莓派之类的测试一下,感觉是个通用的BUG,我重新写的HID+CDC也是报这个错误
2020-03-24 at 20:29
gamepader says:
我抓了两次枚举的USB包,您有空帮忙分析看看是什么原因
文件在此,可以用Wireshark打开: //tmp.link/f/5e7a23527de32
请注意:该USB控制器上还接了一个u盘,可以在Wireshark中用此筛选器过滤掉:
“!(usb.src == “1.4.2” || usb.dst == “1.4.2” || usb.src == “1.4.1” || usb.dst == “1.4.1”)”
2020-03-24 at 23:15
xtoolbox says:
你好,在这个抓包数据中,你的设备地址是多少。我看了一下里面有很多其它设备的包
2020-03-25 at 19:56
gamepader says:
您好,看起来应该是1.6.0,第一次大约从包序号245左右开始,第二次从包序号大约9079左右开始
2020-03-25 at 21:57
Tonny says:
你好,我使用drd_rtt例程在F427上外接USB没有3300做HS device读卡器使用时遇到一个问题,设备能在设备管理器中看到,但是盘符读取相当慢甚至读不出来,磁盘管理界面最后卡死。鼠标等其他不涉及存储的设备倒是很快能正常使用,如果不指定块设备直接接电脑的话也能快速读出盘符(虽然因为没有块设备不能打开),请问可能是由于什么原因造成的
2020-03-27 at 14:39
xtoolbox says:
指定了块设备之后,会响应read命令,PC会通过Read和GetCap命令来获取U盘的参数。目前TeenyUSB的MSC的主机和从机都有一些问题,没有正确处理STALL响应,这导致PC机只能通过超时来处理一些状态,表现出来就是很慢。
近期会重构MSC的主机和从机部分,重新处理STALL和Sense流程。
2020-03-31 at 09:05
Tonny says:
您好,我在使用drd_rtt例程做HS device读卡器时发现选择SD卡作为块设备后盘符读取很慢甚至会卡死。使用鼠标等不涉及存储的设备时就很正常。请问这种情况可能什么原因导致的,有没有什么解决方法
2020-03-27 at 15:03
Tonny says:
抱歉,网络卡了以为没发出来重复发了
2020-03-27 at 15:07
MDK says:
请问有MultiConfig的例程吗? 最好能有Keil版本的, 谢谢!
2020-03-27 at 20:53
xtoolbox says:
TeenyUSB暂时不支持MultiConfig。
这部分工作量比较,需要对描述符生成和代码框架做修改。
2020-03-31 at 09:09
KDX says:
您好,请问一下F427外挂USB3300高速phy制作读卡器,插在电脑上需要大约30多秒才完全刷出盘符,这正常吗?另外读写速度我测试了下大概只有355kb/s,如果想提升速度需要在哪着手?还有如果想要修改接收缓存的话在哪个地方修改呢?
2020-03-28 at 16:53
xtoolbox says:
30秒出盘符不正常,这是因为TeenyUSB没有正确处理MSC的Stall状态导致的。
读写速度慢这个问题可以从介质速度和USB协议栈速度这两方面入手来测试。
如果你的系统上有大块的RAM,可以先用RAM模拟存储介质,测试USB协议栈速度是多少。然后再挂上真实的介质去测试介质的速度。
2020-03-31 at 09:13
yenext says:
你好我再次尝试将代码移植到STM32H743开发板中能正常运行CDC,计算机能正常显示COM号且串口调试助手能正常收发。但是我移植到STM32H750上则不行,计算机显示“未知USB设备(设备描述符请求失败)”,我将750的代码未做改动,下载至743开发板中则能正常工作!不知为何?
2020-03-30 at 17:23
xtoolbox says:
有可能是H750和H743的硬件初始化逻辑不同,我手上没有H系列的片子,H系列我也没有测试过。
2020-03-31 at 09:23
yenext says:
你好!我调整了部分硬件配置相关的源码,目前H750和H743运行良好。我的板子同时具有FS和HS两个USB口子,请问如何实现两个口子都能运行CDC实现双路虚拟串口,即插上USB-HS时计算机出现COM1,再插入USB-FS计算机出现COM2,COM1和COM2能同时工作!
2020-03-31 at 17:22
xtoolbox says:
你可以参考drd_rtt这个demo中关于TeenyUSB初始化的部分。
在这个demo中实现了FS和HS同时工作,并且可以根据连接器不同分别切换为主机或从机模式。
从机的设备类型也可以通过命令行动态切换。
2020-04-01 at 11:21
老干部 says:
目前我是用tusb 407外挂3300链接在arm64的linux系统,目前遇到的问题是,如果进入debug模式,就必须拔掉usb重新重新插入,已经尝试强制拉3300的reset,win可用了,但是linux依然无法解决,请问应该怎么处理呢?
2020-04-01 at 07:28
老干部 says:
stm32芯片进入debug模式或者重新烧录程序就必须重新插入才能识别,上位机使用的libusb驱动,传输模式是bulk模式
2020-04-01 at 07:30
xtoolbox says:
Windows下USBreset后会给程序发DEVICE_CHANGE消息,linux下好像需要不停地刷新设备列表,手动检测设备变化。可以拉长复位时间试试。
在tusb_close和tusb_open之间插入一个比较长的延时(>200ms),看看linux能否正常。
2020-04-01 at 11:26
ARMDev says:
最近测试HID设备,发现一个通用问题:系统每次能识别设备,但是:不是每次都能识别出:厂商字符串,序列号,之类。请问这有可能是什么原因?
2020-04-10 at 13:18
xtoolbox says:
有可能是获取描述失败导致的,能不能抓包看看
2020-04-11 at 21:55
ARMDev says:
我个人对USB不是太熟悉,请问怎么抓包?用BUSBound吗?
2020-04-15 at 10:55
xtoolbox says:
BusHound可以看到为什么获取这些描述符失败
2020-04-20 at 21:17
crolin says:
你好,我想把这个用到rt-thread上面,用host 模式下的RNDIS 或者ECM 有没有rt-thread的使用例子,我看到git上面说支持了host模式下的RNDIS但是这个页面没说支持嗯
2020-05-27 at 11:58
crolin says:
我已经找到了。不用回复了嗯
2020-05-27 at 12:01
xtoolbox says:
现在的rndis功能还有一些bug,会出现很长时间才会连接上的情况。
2020-06-03 at 15:49
TC COM says:
你好, 首先对你提供了如此优秀USB库表示感谢.我在F723E-Disco上尝试了composite例程,Win10(ver19041.329),MDK(5.30),HS Device Mode,初次win10可以识别出所有设备而且测试使用正常,拔出后再次插入win10没有反应,DeviceManager中没有识别出任何设备, 请问是不是和WINUSB相关设置有关?
2020-06-22 at 18:44
xtoolbox says:
你好,如果是任何设备都没有,看超来像是设备描述获取失败,都没有走到设置地址那一步。这个可能需要先排除一下设备连接方面的原因。
2020-06-28 at 11:14
TC COM says:
全速情况下没有任何问题~ 高速内置phy会出现这样的情况~ 用CubeMX生成的VCP代码在同样的条件下可以正常使用~ 可能是高速核的配置使用存在问题~USB协议栈没有问题~
2020-07-01 at 11:49
TC COM says:
debug 一下 程序停在了 Wait_CoreReset(USB_OTG_GlobalTypeDef *USBx)中的这句
while ((USBx->GRSTCTL & USB_OTG_GRSTCTL_CSRST) == USB_OTG_GRSTCTL_CSRST); 一直在等待复位完成。
2020-07-01 at 21:36
xtoolbox says:
TeenyUSB的设备部分采用了新的框架,OTG设备使用了HAL库作为USB设备的驱动层。这样可以跟随官方库更新驱动。
新框架将驱动和USB库作了进一步的隔离,可以更容易地移植到其它MCU平台上。
2020-08-22 at 15:47
hy317 says:
你好!请问CDC如何判断电脑端串口是否打开和关闭?
2020-06-24 at 09:32
xtoolbox says:
你好,当PC端打开串口后,在Bulk IN端点上会出现In Token,没有数据设备会返回Nak。但是常见USB设备内核没有办法知道这种返回Nak的状态。
可以试试在In端点上挂一个长度为的包,当有Ack时说明PC端打开了设备。
2020-06-28 at 11:12
hy317 says:
你好,PC端串口打开一般都有串口参数设置,比如波特率和校验位等,所以串口打开是否可以用这个方法来代替?串口关闭有检测的方法吗?另外我在测试中发现在串口打开前将数据从CDC发送出去,在串口打开时串口终端似乎并不能直接接收到数据,直到后面再有数据从CDC发送出去,串口终端才将之前发的数据和后来发的数据一起接收到,不知这个现象是否真实存在,有避免的方法吗?
2020-06-29 at 11:12
xtoolbox says:
在Windows上,串口在打开前也会有参数设置,目的是用来探测支持的波特率,所以这个方案会有问题。
这个应该是应用程序的问题,Windows上的串口只要超时或接收到短包都会立即返回数据的。
2020-06-29 at 15:06
hy317 says:
“可以试试在In端点上挂一个长度为的包,当有Ack时说明PC端打开了设备。”这个是否就是判断“tusb_cdc_device_send(&cdc_dev, buf, 0)”的返回值?我在实际发送过程中有时需要多次调用这个发送函数才能成功发送,这时串口并没有被关闭啊!
2020-06-29 at 11:16
xtoolbox says:
如果应用程序不读串口,也不会有IN Token。因此需要保证应用程序在打开串口后马上就去读数据。调用这个函数前要保证上一次的数据已经成功发送了。
2020-06-29 at 15:07
hy317 says:
大致明白了,现在的串口终端基本上都是类似中断方式接收数据,就是有新数据到来才读取数据,所以前面发送的数据会有堆积。至于电脑端串口的打开和关闭在单片机这边不会有准确的状态标志,最多只能通过能否成功发送数据来探测。
多谢解答!
2020-06-30 at 11:59
Kevincoooool says:
能否使用F103把 HID CDC MSC fatfs集中做一个demo吗,我想基于teenyusb做一个三合一DAP,包含有线、无线、脱机,要把SPI FLASH模拟给U盘
2020-08-21 at 15:27
xtoolbox says:
你好,这个可以在composite的demo基础上进行修改,将描述符修改为如下:
下面的描述符可以在 http://dt1.tusb.org 转成C语言格式
return Device {
strManufacturer = “TeenyUSB”,
strProduct = “TeenyUSB DEMO”,
strSerial = “TUSB123456HS”,
idVendor = 0x0d28,
idProduct = 0x0204,
bcdUSB = 0x200,
prefix = “COMP”,
Config {
USB_HID{
ReadEp = EndPoint(IN(1), Interrupt, 64),
WriteEp = EndPoint(OUT(1), Interrupt, 64),
report = HID_InOut(16),
},
CDC_ACM{
EndPoint(IN(4), Interrupt, 16),
EndPoint(IN(2), BulkDouble, 32),
EndPoint(OUT(2), BulkDouble, 32),
},
Interface{
bInterfaceClass = 0x08, — MSC
bInterfaceSubClass = 0x06, — SCSI
bInterfaceProtocol = 0x50, — BOT
EndPoint(IN(3), BulkDouble, 64),
EndPoint(OUT(3), BulkDouble, 64),
},
}
}
将Composite中的设备类修改为如下:
static tusb_device_interface_t* device_interfaces[] = {
(tusb_device_interface_t*)&hid_dev,
(tusb_device_interface_t*)&cdc_dev, 0, // CDC need two interfaces
(tusb_device_interface_t*)&msc_dev,
};
各Interface中的端点号也按照描述符中的内容进行修改
2020-08-21 at 22:08
xtoolbox says:
做DAP的话建议使用免驱动的bulk传输,比HID速度更快,在Win8以后的系统上也不用安装驱动,自动就能识别为WinUSB设备。
只需要要把上面的HID部分改成
Interface{
strInterface = "CMSIS-DAP v2",
-- DAP link GUID
extDesc=WinUSB("{CDB3B5AD-293B-4663-AA36-1AAE46463776}"),
bInterfaceClass = 0xff,
bInterfaceSubClass = 0x00,
-- DO NOT change the Endpoint sequence, PyOCD will check it
EndPoint(OUT(1), Bulk, 64),
EndPoint(IN(1), Bulk, 64),
},
2020-08-21 at 22:11
Kevincoooool says:
您好,我现在已经实现了无线的烧录,在进一步脱机烧录的时候,在demo中没找到挂载fatfs的例程,现在可以在PC上虚拟出U盘来正常读写W25Q,但是无法挂载fatfs给FLASH,请问下有MSC和FATFS结合的demo吗
2020-10-16 at 20:17
Kevincoooool says:
刚刚又看了下,可以挂载fatfs了,但是fatfs创建出来的文件,PC上的U盘里面看不到,但是fatfs可以打开这个文件并且读取里面的内容,就好像msc和fatfs是分开的两套系统,不是同一个
2020-10-16 at 21:18
Kevincoooool says:
已解决,基于teenyusb的脱机下载搞定了,可以正常挂载fatfs,block size需要设置为512
2020-10-18 at 16:37
exculivor says:
是否有考虑过制作RT-thread的软件包?那会方便很多的
2020-11-19 at 20:36
xtoolbox says:
正在考虑中,目前在重构主机部分的代码,这部分工作完成后就会出RTT的相关demo。
2020-11-24 at 11:45
exculivor says:
大佬,新的Master代码CDC有问题,我直接把demo烧录到板子上,CDC不能用
2020-12-25 at 17:31
exculivor says:
旧版本的就正常
2020-12-26 at 11:10
exculivor says:
有没有QQ群可以交流下
2021-01-15 at 16:59
xtoolbox says:
有一个USB技术交流的Q群,733863085,进群答案:通用串行总线
2021-02-23 at 12:22
STM32F103标准库可以使用TeenyUSB吗 says:
STM32F103标准库可以使用TeenyUSB吗?现有STM32F103项目是用标准库开发的不是用的HAL库.
2021-09-30 at 17:25
xtoolbox says:
可以的,TeenyUSB的设备驱动与协议栈是完全独立的,只要能实现10个左右设备相关函数就可以使用。
2021-10-11 at 15:38
feelingcode says:
您好,
使用STM32h7芯片,移植了teenyusb,发现能够枚举出hub信息,在hub上插入鼠标设备没有任何反应(PS:usb供电5V正常,使用修改过支持hub的ST库可以正常识别到鼠标),用逻辑分析仪看到查询hub状态一直返回NAK,没有报告端口插入状态。
打印状态信息:
[D] [HOST] HS RHB:00 Conntected
[D] [HOST] HS RHB:00 Enabled, FS device
[D] [HOST] HS DEV:00 Set device address to 01
[D] [HOST] HS DEV:01 Device VID:0424 PID:2514
[D] [HOST] HS DEV:01 Class (0x09,0x00,0x00) not found, init it as raw device
[D] [HOST] HS DEV:01 Interface (0x09,0x00,0x00) has 1 endpoints:
[D] [HOST] HS DEV:01 Ep addr:0x81, attr:INTR, mps:1
[D] [HOST] HS DEV:01 Device has 1 interfaces
[D] [HOST] HS DEV:01 Set to configuration 1(1)
2022-02-14 at 10:54