1、说USB驱动之前,先说一下windows系统的驱动开发
在windows系统下,一般不能直接对硬件接口进行操作,必须以驱动程序作为桥梁,即主机的“应用程序——驱动程序——硬件接口”,对于USB设备,需要开发USB设备驱动。
WDM(Windows Driver Model)是Windows驱动程序模型,WDM是分层的,主要包括两个驱动程序:设备功能驱动程序和总线驱动程序。总线驱动程序直接和硬件接口通信,由操作系统提供,用户需要开发的是功能设备驱动程序,面向的是总线驱动程序,而不是硬件物理层通信协议。
开发USB驱动,也就是开发 function driver 。
在USB的通信中,可以看成是一个分层的协议。分为三个层次,即最底层USB总线接口层、USB设备层、功能通信层,如图所示。
以USB摄像头设备为例,视频播放软件想通过USB总线得到USB摄像头捕捉的视频数据,这就相当于在功能层上。Clinet SW是视频播放软件,Function是USB摄像头。而这些数据的读取需要USB设备层提供的服务,在这一层上,主要是USB设备的驱动调度Host控制器向USB摄像头发出读请求。每个USB设备会有多个管道,使用哪个管道,传输的大小都需要指定。这个层次的USB System SW就是USB摄像头的驱动程序。而在USB设备一端一般会有小单片机或者处理芯片负责响应这种读请求,而这一层的传输又依赖于USB总线接口层的服务。在这一层,完全是USB的物理协议,包括如何分成更小的包(packages)传输,如何保证每次包传输不丢失数据等。
对于USB设备驱动程序员,主要是工作在USB设备层(即功能驱动程序),向“上”对应用程序提供读写等接口,向“下”将读取某个管道的请求发往USB Host控制器驱动程序(此总线驱动程序由操作系统提供),它实现了最底层的传输请求。
2、对于Linux 系统设备的驱动程序,也是同样的道理,Linux内核提供了USB核心,直接和硬件通信,用户开发的是此基础上的设备驱动程序。
总之,无论哪种操作系统,最底层的物理协议(总线驱动程序)由系统提供,开发驱动程序都是功能驱动程序,不用考虑复杂的物理协议,比如USB协议等,大致了解即可。
3、再说, USB 设备驱动:
对于高速USB2.0设备,bulk传输最大512字节一个数据包,即wMaxPacketSize,这是该端点一次可以处理的最大字节数。注意,设备驱动程序可以发送数量大于此值的数据到端点,但是在实际传输到设备的时候,数据将被分割为wMaxPacketSize大小的块(总线驱动程序负责),分成多个数据包发送。
4、以FT2232H 为例,此芯片公司提供了驱动程序,即设备功能驱动FTDIBUS.sys,不用自己写驱动,使用很方便。
FTDIBUS.sys是设备驱动程序,最下层的是Windows系统的总线驱动程序。
开发上位机的应用程序,比如工作在 FT245FIFO 模式(即bulk传输模式),FT芯片的缓冲区大小是2*512字节,而上位机端发送数据缓存可以最大为64KB,也就是一次可以发送数据量为64KB ,而在bulk模式下一个数据包最大512字节,那么64KB是怎么回事?
64KB是上位机端缓冲区大小,应用程序可以一次发送64KB数据给设备驱动FTDIBUS.sys,然后设备驱动把64KB数据一次性传给USB总线驱动,最后总线驱动把数据分成512字节一个包,分包下传给FT2232H芯片。
对FT2232H配置成 FT245FIFO 模式,用bus hound可以看到,就是bulk传输模式,如下
最大字节数为 MaxPacket=0x200 ,即512字节。
5、以cy7c68013为例,设备端点的信息,以及传输方式,配置信息等,都在固件中。接上设备后,系统根据VID PID加载对应的驱动(设备功能驱动),此设备功能驱动cypress公司也提供了cyusb.sys,只需修改cyusb.inf中的VID PID 即可。
如果固件中是bulk传输方式,上位机设置的缓冲可以是2048字节,一次传2048字节给驱动,最底层的USB总线驱动程序进行分包处理,分包传输。
开发上位机应用程序可以直接调用cyAPI 函数库,此库中的函数是面向cyusb.sys的。
当然也可以不用提供的cyusb.sys驱动,完全自己开发功能设备驱动,应用程序也不用cyAPI函数,但是工作量就大大增加了!
残弈悟恩 2014-8-4 08:44