`

驱动和协议的关系(以USB为例)

阅读更多

    和网卡,交换机等网络设备的驱动不同,USB驱动里对协议的体现是非常明显的。前者因为体系太庞大,所以采用严格分层方式,所以其驱动被定义在物理层等偏下的层次,主要负责数据通道的建立,和信包的收发。而USB就不是如此,它不仅要管信包的收发,还要解决信包的组织等等。因此USB的驱动必须严格按协议所要求的操作流程来写。目前的USB1.1和USB2.0从USB 的HOST,根HUB及device的硬件组成到通讯过程都写的非常详细明确。不仅有包的组织连寄存器的定义与设置都有相关规定,而USB HOST芯片提供商也基本是遵从它的。但它过于庞大,所以依协议从头写一个USB驱动工作量太大了。我不知你是在什么平台上开发的,我是在Linux下开发的所以我参照了Linux的源码和Vxworks的源码,在此基础上实现了EHCI驱动。
    驱动大致是linux/drivers/usb/usb.c,linux/drivers/usb/hub.c,linux/drivers/usb/hcd.c和自己开发的ehci.c文件。前面三个文件最后编成usbcore.o。这只是host的驱动,devices的驱动你可以参照其具体的源码来改,如U盘,我改的是usb-storage.c
    驱动的流程非常复杂,至少是我目前碰到过的最复杂的一个外设驱动。代码的追踪的进入方向是三个方面进行。Host & Bus initialize,root hub initialize,还有devices initialize。还是要花不少时间的。
这里还要注意的是,普通PC平台USB Host是作为一个字符设备挂载在PCI总线的。而很多嵌入式系统则不是,所以针对自己的硬件平台要去掉这部分。

    PCI总线本身是一套复杂的规范,USB对其的应用仅是一个数据通道,在在PC机上CPU是通过PCI总线和大多数外围设备进行通讯,USB的HOST也就依此规范做。但嵌入式设备上由于系统的精简,建立通讯通道可以用其他更为简单灵活的方式。如LPC总线等(我的板子上用的就是它)。好像三星的2410上也不是采用PCI。当然从规范化角度用PCI做会好些,但工作量反而加大了不少。所以根据具体的硬件平台可以更灵活的采用具体的解决方法。

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics