固件的功能
固件程序主要负责完成两项任务:一是作为驻留在设备中的内部应用程序,响应主机的列举请求,实现配置设备并将设备的配置信息(如支持哪些传输类型和端点)告知主机,进而为主机和设备之间进行数据通信做好准备工作:二是作为整个设备的控制中心,根据用户应用系统的特定要求,实现对外围设备的具体控制。USB控制器芯片借助CPU执行固件程序来控制芯片的活动,以实现数据传输功能。固件的设计就是使在USB总线上的传输能获得快速的、有效的数据传输速度。它的操作方式与硬件联系紧密,包括USB设备的连接、列举、重列举、USB协议和中断处理等等。当把设备连接到主机上(USB设备连接到主机上的集线器上)时,上位机可以发现新设备,然后建立连接。因此,编写固件程序的一个最主要的目的就是让Windows可以检测和识别设备。
固件并不是能包办一切的,它必须和硬件相互配合,才能完成USB所要求的传输等任务。USB器件在微控制器的控制下与主机进行通信,从而实现USB的数据收发,基本过程是这样的:当USB外设接到主机上时,主机首先列举设备,之后通过缺省端点EP0下载固件程序到其片内RAM,接下来重列举设备,用下载到其内部RAM的固件配置设备,即用户所设计的模式,根据用户定义的固件程序中的VID和PID,找到设备的功能驱动程序,从而完成设备的配置过程。传输数据过程中,发送的数据以包(Packet)的形式写入器件的缓冲区(FIFO Buffer),当缓冲区被写满或者数据发送完毕后,USB设置寄存器满标志。如果主机准备接受数据,则向功能设备端点发出读令牌包,端点通过判断端点类型,和是否准备发送数据响应请求,完成数据传输后通过握手包来完成整个通信过程。
设计概要
USB 作为一种数据通信标准,它的软件和固件的设计都要遵循一定的规则,作为设备端的固件有其确定的流程。USB的固件分为通用的枚举配置和协议部分。在USB的枚举配置阶段实现USB主机对设备的枚举识别和配置,使主机确认设备的功能,分配资源给设备。而协议部分则用来实现USB设备数据传输的功能,有相应的USB类协议和规定作为编程规范, USB接口芯片收到数据或发送出数据后都会产生中断,所以固件编程的核心就是编写中断服务程序。这项工作主要就是根据相关寄存器的标志来对各个端点缓冲区的数据进行处理。可以把中断服务程序分为一些功能模块(函数)来考虑:(1)端点0的响应。当设备插上USB接口后,主机会发出一系列的请求给设备的端点0,设备的固件程序应该能在端点0对这些要求进行正确响应。(2)其他端点的数据通信过程。通过(1)主机就能知道设备端点的使用情况,以后就可以通过其他端点以设定的传输方式来交换数据。(3)实现设备类别遵循的协议规范。例如,如果要设计U盘,则U盘的固件程序就要实现对Mass Storage Class规范中的UFI命令规范的支持。