LINUX驱动学习——内核USB驱动编写一USB驱动的简介
开发USB的驱动,无外乎有以下几种类型:
1、USB的HOST驱动(或者说主机驱动)。
2、USB的设备驱动(或者说从端驱动)。
3、OTG。
另外,还有主机端的设备驱动开发,这块儿基本上都已经由操作系统抽象出来,提供了接口,而主机驱动,基本上操作系统也提供了,嵌入式设备一般是作为slave设备来工作的,当然,如果你需要作为
HOST来工作,那只好自己来实现了。
具体说,主机控制器驱动程序实现的功能包括以下几点:
1) 解析,维护urb,根据不同的端点分类缓存urb。
2) 实现不同USB传输类型的调度工作。
3) USB数据的实际传输工作。
4) 实现虚拟根HUB的功能。
而从实际情况来看,更多的是作为设备驱动(SLAVE)进行驱动开发。也就是USB GADGET驱动,Linux Gadget子系统主要分为三层:第一层为芯片驱动层,负责将各种USB device控制器抽象为统一的函数
接口,以供上层驱动程序调用;第二层主要是对操作函数的简单封装;第三层为设备驱动层,可根据系统的需求实现所对应的功能。图1所示是Linux Gadget子系统的驱动层次。(基本不以WIN的USB情况
来讲,整个流程是一样的,但是WIN封装的更高)
而OTG是为了满足现在的USB设备特别是一些便携设备的互通互连,这些USB设备既有HOST也有SLAVE端,他们会自动的判断是转到哪一方。
所以说,基本学习的最多的还是USB的设备驱动。这也是最多,用得最广的。从键盘、鼠标到U盘,移动硬盘,音乐设备等等。其中HID设备(人机工程学设备,前面的键盘啥的)是最最常见的。
USB的驱动又向后延迟了一下,不要紧,目标盯紧了就行。慢慢预热,慢慢来。