1,硬件连接 2,使用MHC配置USB服务 增加一个USB处理服务 3,使用USB的实现,就是USB枚举的实现过程。 简单描述一下枚举过程: A,设备连接,USB设备接入USB总线,主机USB根集线器的两个信号线(D+,D-)上都有一个15K的下拉电阻,一个设备在D+上有一个1.5K的上拉电阻,连接设备时,信号线上为高电平,这样主机检测到设备的接入。 B,设备上电,可以由USB总线供电,也可以外部电源。 C,主机检测到设备后,发出复位; D,设备默认状态,需要从总线上接收到一个复位信号后才可以对总线操作做出响应; E,主机以默认地址0x00和端口0读取设备描述符,以确认有设备接入; F,设备向主机发送设备描述符; G,主机确认有设备介入后,向设备分配新地址; H,设备进行地址设置,以后只对该地址进行响应。 i,主机通过新地址向设备发出获取设备描述符的请求,确定USB设备熟悉; J,设备向主机发送设备描述符; K,主机请求获取配置描述符; L,设备返回配置描述符; M,主机对设备进行配置; N,主机读取设备状态及端口状态; O,挂起,为了省电。 4,不管是实现什么样的USB功能,都是一个枚举过程。枚举过程中最主要的就是USB描述符。USB描述符包括标准描述符、HID描述符、HUB描述符等,最主要的标准描述符包括:设备描述符、配置描述符、字符串描述符、接口描述符、端点描述符、设备限定描述符、其他速率配置描述符。 我这里主要说标准描述符。 这七种描述符具有类似的格式,比如说它们的第一个字段都是 bLength, 第二个字段都是 bDescriptorType 。 七种描述符在使用时以 bDescriptorType 字段来区分。 描述符类型与对应的 bDescriptorType 字段值对应关系为 : A,设备描述符 设备描述符描述的是设备的整体信息, 与设备本身一一对应, 一个设备只能有一个设备描述符。 在主机对 USB 设备枚举的过程中, 首先要做的就是获取设备描述符, 以对设备有一个整体的了解。设备描述符由14个字段组成,总长度是18个字节。 通过MHC配置后,在firmware\src\system_config\code下的system_init.c中已经完成描述符的配置。 B,配置描述符 一个 USB 设备可以有多种配置, 不同的配置使设备工作在不同的状态下, 每个配置必须有一个配置描述符。其格式包括 8 个字段, 共 9 字节。 C,字符串描述符 在 USB 协议中字符串描述符是可选的。字符串描述符用于保存一些供应商名称、 产品序列号等文本信息。它的长度是不固定的, 随字符串的数量和信息的长度变化而变化。 D,接口描述符 接口是端点的集合, 负责完成 USB 的特定功能, 例如数据的输入输出。 接口描述符用于描述一个接口, 包含了接口的特性,如端点个数,所属设备类和子类等。它有 9 个字段, 共 9 字节 E,端点描述符 端点描述符用于指出 USB 端点的特性,包括其所支持的传输类型、 传输方向等信息。 USB 中规定,端点 0 没有端点描述符,其余端点必须包含端点描述符。 端点描述符由 6 个字段组成,共 7 个字节 。 F,设备限定描述符 设备限定描述符用于指定另一传输速率下该设备的总体信息, 如果高速 USB 设备既需要采用高速传输又需要全速传输, 则它必须支持设备限定描述符 (Device_Qualifier) 。 设备限定描述符包含 9 个字段, 长度固定为 10 个字节。 G,其他速率配置描述符 其他速率配置描述符用于指定另一传输速率下该设备的配置信息, 如果高速 USB 设备既需要采用高速传输又需要全速传输, 则它必须支持其他速率配置描述符。 其他速率配置描述符包含 8 个字段, 长度固定为 9 个字节 一把除了设备描述符外,其他全部描述符初始化在一个结构中,我们这里也不例外。 描述符定义好之后就是开始实现枚举过程了。 5,源码分析 USB任务处理 任务也是安装状态机来实现,初始化状态机为USB_STATE_INIT。 在初始化状态机USB_STATE_INIT下,开启USB设备:USB_DEVICE_Open,开启成功后,注册USB端口0的事件回调函数:APP_USBDeviceEventHandler,在回调函数中在注册回调函数APP_USBDeviceCDCEventHandler,处理枚举过程的回调函数。 然后进入等待配置状态 配置成功后,就可以通过USB传输数据了。 我这里实现的CDC虚拟串口功能。实现接收到什么数据就发送什么数据出去。 接收的数据放到usbData.readBuffer缓存下。 然后把接收的数据发送出去 这样就实现了USB虚拟串口的收发数据。编译下载程序。 5,体验 这时候需要连接两根USB线 上电后提示安装驱动 驱动安装成功后就可以使用了 使用串口工具证实了数据正确性。 更详细的内容需要自己去琢磨,这里只是说明了大概的思路过程。有了思路,一定能成功。
|