usb固件程序指的什么

usb固件程序指的什么,第1张

通常来说USB设备(这里只分析USB设备,而不针对USB HOST,USB OTG和USB

HUB)内部都有一片USB的芯片和一个MCU,有些当然有些厂商提供的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的设计和调试首先应从一次基本的传输开始。要能正常的完成一次传输,尤其是控制传输,否则连设备的枚举都不能完成,也就是说设备不能被计算机正确识别。  

USB Firmware的流程(二)By topone 发表于 2008-7-21

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设备还有各自的请求类请需要处理。

固件程序有问题,根本不能让芯片完成重枚举,所以68013没有工作,那么电脑就会显示是PID VID都为0号。要能让电脑识别设备, 必须断开EEPROM后连接电脑,这个时候设备是出厂默认的PID VID,重新安装对应PID VID的驱动就能重现连接上电脑了。

如果你的固件里VID ,PID是04B4,1002(或者其他,具体看ezusbw2k.inf文件的支持),那么这个时候你对应的驱动就是EZUSB驱动文件 ezusb.sys、ezusbw2k.inf,这个驱动就是所谓的通用驱动GPD( General Purpose Drive);相应的,控制台使用EZ-USB Control Panel进行调试,如下图:

[喝小酒的网摘]http://blog.const.net.cn/a/9033.htm

这个时候后,上位机变成就使用Winapi编程,也就是标准IOCTL函数。

EZUSB驱动文件、控制台软件,固件例子,上位机例子可以通过安装CypressEZ-USBDevelopmentKit开发包得到,版本号是261700,可以到CYPRESS官网下载。

相应的,如果你的VID,PID是04B4,1004(或者其他,具体看inf文件 支持),那么你对应的驱动应该是cyusb.sys,cyusbpre.inf,控制台使用Cypress USB Console,如下图:

上位机变成使用cyapi函数,以上可以通过安装Cy3684开发包得到,至Cypress官网下载。

另外,还有三个开发包, Suite USB 3.4.1,使用C#的朋友可以在里面得到USB C#上位机编程,

然后还有 DVK_1004开发包,有很多slave fifo的例子,需要的可以安装该开发包参考里面的例子;再就是GPIF_Designer_version_1_06_October_2003开发 包,专门用来进行GPIF调试的工具,也有很多GPIF的例子可以参考。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11916993.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-19
下一篇 2023-05-19

发表评论

登录后才能评论

评论列表(0条)

保存