分类:TeenyUSB


使用微软系统描述符1.0制作免驱动自定义USB设备


本文介绍如何使用微软的操作系统描述符来实现自定义USB设备在Windows系统上的免驱动使用。

前言

在Linux上开发USB设备是不需要特别的驱动的,Linux内核的USB驱动会将USB设备的基本操作都暴露到应用层,由应用层来完成实际的业务逻辑。libusb就是这样的一种通用USB设备访问程序。

为了在Windows上也实现这样的效果,libusb最初提供了Windows上通用的内核态驱动程序,将基本访问接口暴露到应用层,由应用层来实现访问逻辑。随着发展,微软也提供了这样的驱动程序,那就是WinUSB通用驱动程序。

为了给设备安装WinUSB驱动,还需要使用包含设备VID和PID的inf文件,以及签名的cat文件(ST-Link就是使用WinUSB作为驱动的,它的驱动就是一个典型的WinUSB设备驱动)。

对于使用WinUSB驱动的设备来说,这些驱动文件做了两件事,1. 告诉系统使用这个设备使用了WinUSB驱动,2. 告诉系统我这个设备接口的GUID是什么,应用程序就能通过GUID来操作设备。

既然WinUSB的驱动程序只做了这两件事,能不能让这两件事更加自动化一些,这样不作编写驱动程序也可以安装。答案是肯定的,微软的操作系统描述符就是处理这个事情的。

Read More »


使用微软系统描述符2.0制作免驱动自定义USB设备


前言

在《使用微软系统描述符1.0制作免驱动自定义USB设备》一文中,介绍了如何使用1.0版本的系统描述符来制作免驱动设备,这里将介绍如何使用2.0版本的系统描述符来制作免驱动设备。无论是1.0还是2.0,都是为了让系统给设备安装WinUSB驱动,并且给接口指定GUID。2.0版本的系统描述符处理流程更加精简一些。2.0不再需要OS字符串描述符,而是使用了USB标准的BOS描述符来获取设备的vendor code。然后再通过一个叫做描述符集的描述符一次性返回所有接口所有配置的compat ID和属性。

Read More »


将TeenyUSB加入到CubeMX生成的工程中


ST为其旗下的STM32系列芯片提供了图形界面的初始化工具STM32CubeMX,使用这个工具能够以可视化的方式完成引脚分配,时钟配置,并生成相应的代码,能够大大提高工作效率。TeenyUSB是一个简化的USB协议栈。下面将介绍如何在CubeMX生成的工程中加入TeenyUSB协议栈。这里以STM32F723E-Discovery开发板为例来说明。

打开CubeMX后新建一个工程,选择芯片型号为STM32F723IEK6

Read More »

简单几步,让自定义USB设备也能免驱动运行


更完整的说明见《使用微软系统描述符1.0制作免驱动自定义USB设备》和《使用微软系统描述符2.0制作免驱动自定义USB设备

做过USB设备开发的人,对USB中的自定义HID设备一定不陌生。很多时候为了通过USB接口与上位机进行通讯,都会采用自定义HID设备的方式。采用这种方式的通讯设备,优点是不需要写驱动程序,Windows上也有相应的API进行操作。这种方式的缺点是通讯速率比较慢,因为HID设备采用中断方式传输数据,对全速设备而言最快一秒钟只能传64K字节数据。而USB全速设备的理论带宽能达到1M字节每秒,连10%的性能都没有达到。

如果采用Bulk传输,则可以达到理论最大带宽,榨干USB总线的性能。但是采用Bulk传输的时候,设备要么做成串口这样的标准设备,免去驱动的编写,这样设备就不是自定义的,使用起来不如自定义设备那么方便。要么做成Bulk传输的自定义设备,但是这样就得写编写驱动程序,而驱动开发也是一个大坑。

那么能不能既能获得自定义的好处,又不进行驱动开发呢?答案是肯定的。

Read More »

TeenyUSB问题反馈


TeenyUSB问题反馈

以下是TeenyUSB协议栈与《STM32 USB设备开发指南》中的常见问题,如果有新的问题也可以在评论中提出。

问:在哪里能获取TeenyUSB的完整代码?用什么工具编译?

答:TeenyUSB代码在 https://github.com/xtoolbox/teenyusb 可以获得,使用gcc进行编译,部分例程有Keil工程。

Read More »