usb 固件+流程分析

通常来说USB设备(这里bai只分析USB设备,du而不针对USB HOST,USB OTG和USB
HUB)内部都有一zhi片USB的芯片和一个MCU,有些dao当然有些厂商提供的USB芯片已经集成了MCU在里边,如Cypress的CY68013就是这样的。这里考虑MCU和USB芯片分开的情况吧,集成的也类似,大家可以自己去分析。USB芯片完成USB底层的事物,接收的时候:将接收到的USB串行数据识别出来,解包后存放在内部的缓存中,然后通过中断的方式告知MCU收到数据包了,MCU通过和USB芯片的并行或串行接口读回接收到的数据并进行相应的分析和处理;发送数据的时候,MCU将需要发送的数据通过和USB芯片的接口写入到USB芯片内部的缓存,写入完成后,一般来说USB芯片会在接收到来自HOST的IN令牌包时,将缓存中的数据送到USB总线上去。当发送完成后,通常USB芯片也可以通过中断的方式告知MCU。
从这里看出,USB芯片只是完成数据的解包和打包,并不对数据进行任何分析和处理,数据包的分析和处理都是由MCU完成的。具体来说是由运行在MCU中的程序,也就是通常所说的USB
Firmware或者说USB固件程序完成的。
首先来分析一次简单的从HOST到Device的数据传输,即OUT型的传输,假设传输类型为BULK。
USB传输只能由HOST发起,HOST需要向Device发送一个OUT令牌包。在这个包里指定了接受数据的设备地址、端点。然后将数据包发送到USB总线上。不是目的接收器件的USB设备不会响应该数据包,目的接收设备如果能接收该数据包,则以ACK握手包响应,如果不能接收该数据包,则以
NAK握手包响应。
在上述过程中,USB芯片会在接收完数据包后中断MCU,然后MCU读取缓存在USB芯片中的数据包,再决定回复ACK,或者是NAK。
以上只是一次简单的BULK OUT传输,对于BULK
IN传输,HOST先发送一个IN的令牌包,USB芯片接收到该令牌包后会中断MCU,MCU如果有数据发回HOST,则将数据写入USB芯片内对应断点的缓存,然后USB芯片会自动将数据发送至USB总线。并等待接收来自HOST的握手包。
对于BLUK、Interrupt以及同步传输,传输过程都类似,整个传输过程由令牌包、数据包以及握手包组成。
对于控制传输,一次传输由三个阶段组成,即Setup阶段、可选的数据阶段以及状态阶段。
其中Setup阶段为一次OUT型的传输,HOST将8个字节的SETUP数据包发送给设备。这8个字节指定了这次控制传输的请求类型。Device会根据这8个字节做出相应的Action。
第二个阶段为数据阶段,有些控制传输没有这个阶段,如Set Address请求。
数据阶段,HOST将数据通过OUT型传输发送给Device,或者通过IN型传输向Device请求数据。
第三个阶段为状态阶段,即得到这次控制传输的状态,确认这次传输是否正常完成。HOST或者Device以一个长度为0的空数据包表示肯定的应答。
USB Firmware中大部分程序都在处理控制传输,具体来说是11种标准请求以及针对具体设备的类请求,如Mass
Storage 类的请求,还有些厂商自定义的请求。
USB
Firmware的设计和调试首先应从一次基本的传输开始。要能正常的完成一次传输,尤其是控制传输,否则连设备的枚举都不能完成,也就是说设备不能被计算机正确识别。

20:59:00 USB设备上电以后,固件程序就开始运行,首先要做的第一件事情自然是初始化,包括设备自身逻辑的初始化和USB芯片的初始化。一般来说,USB固件均被设计成为前后台的方式,前台程序为一个大的死循环,后台则为中断处理函数。当USB芯片产生中断信号时,微处理器进入到中断处理程序,并读取USB芯片的中断标记,判断中断的类型(如传输错误、收到Setup包、收到令牌包、传输完成等),然后设置相应的标志位。存储该标志位的变量应该是一个全局变量。前台程序中,固件不断的检测标志位,判断是否有中断事件发生,如果有的话则进入到相应的时间处理函数中。前面已经说过,USB固件程序大部分都是在处理来自HOST的请求,也就是HOST发来的SETUP数据包。当前台程序检测到SETUP事件时,会先从USB芯片的缓存中读回8个字节的SETUP包,然后根据USB规范中定义的结构,对数据包尽心解析,然后进行到相应的请求处理函数。基本可以总结成为如下的结构。========后台============ =============前台==================中断处理函数(ISR) 循环{ 读USB芯片的中断寄存器 【设备事务】 清USB芯片中断 如果有USB中断标志被置位 判断中断类型 {中断事件处理 置中断标志 读SETUP包======================= 解析SETUP包 调用相应的请求处理函数 } } ===================================在请求函数处理函数中,固件程序或将相应的描述符写入到USB芯片的断点缓冲,然后发送到HOST,或者通过从USB芯片的断点缓存中读回HOST发来的数据。下面来说明一次典型的getdescriptor请求。HOST发送SETUP令牌包--------->引起USB芯片中断MCU,中断事件为SETUP,MCU被中断,并设置中断标志HOST发送SETUP数据包--------->USB芯片接收数据包,并存放在断点缓存中,并自动以ACK响应主机 固件中,MCU检测到中断事件,且类型为SETUP事件,进入到SETUP事件处理函数,读回SETUP数据包,并解析之,将设备描述符填入到USB芯片的缓存,等待数据发送完成。HOST发送IN令牌包----------------->如果此时MCU已经完成数据的填充,则USB芯片将数据发回HOST,否则以NAK响应。循环上一步骤,直至数据被发送完成。HOST收到描述符,并以ACK响应USB设备------->此时USB芯片中断MCU,MCU将从此中断得知传输完成。MCU设置USB芯片,在收到下一个IN令牌包时自动回复一个长度为0的数据包。HOST发送IN令牌包---------------->USB芯片自动回复一个长度为0的数据包。HOST收到数据包,并回ACK。 -----------------> USB请求完成 上面【设备事务】指的是USB设备自身的事务,如AD采样数据的读取、处理等。以上即为USB固件程序的基本框架,完整的固件程序要处理的中断事务很多,但是基本的处理过程都是相似的。各USB子类设备,如大容量存储器、HID设备还有各自的请求类请需要处理。

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
AN039 - USB Firmware Programmer's Guide v1.1 Last updated 16 JUL 2003 To exercise the example firmware: 1. Extract the contents of the AN039.zip file (if using WinZip, use the "Extract" function to retain sub-directory information). 2. Open the Cygnal IDE (v1.72 or later). 3. From IDE menu Options->Debug Interface, select Cygnal 2-Wire. 4. Connect to the target C8051F32x device (Alt+C, or IDE menu Debug->Connect). 5. From the Project menu, select "Open Project" (a warning dialogue may appear; this is expected). 6. Browse to directory \AN039\Firmware and select file FirmwareProgramGuide.wsp. 7. Through IDE menu Project->Tool Chain Integration, select the path to your compiler and linker. The default is C:\Cygnal\IDEFiles\C51\Bin\. 8. Build the project (F7, or through IDE menu Project->Build/Make Project). 9. Download the firmware (Alt+D). 10. Connect a USB cable between the target device and the host PC. 11. Run (F5, or IDE menu Debug->Go). 12. When Windows detects the device and the driver installation wizard opens: a. Choose "Search for a suitable driver for my device", and click Next. b. Check the box "Specify a location", and click Next. c. Browse to directory \AN039\Application and select the file CygnalInt.inf, and click OK. d. Follow the dialogue to finish driver installation. 13. After the driver has been installed, run the USBTest.exe application from directory \AN039\Application. Notes: - Firmware works with the Cygnal IDE v1.71 or later and the Keil C51 tool chain. Project and code modifications will be necessary for use with different tool chains. - Compiler optimization emphasis is selected as "favor small code". This selection is necessary for the project to be compiled with the trial version of the Keil C51 Compiler (under 4k code space). - If using the C8051F320TB target board, jumper J2 should be installed if the board is wall-powered; jumper J11 should be installed if bus-powered. - Windows application and driver supports Win2K and XP only.

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值