下面接着分析class driver 和 usb device framework。
首先需要说明的是 这两部分其实是可以合并在一起的。对于我们的例子:zero.c和composite.c 是把这两部分分开进行了实现,实现了composite_driver和gadget_driver。但是对于file_storage.c里面,就是将这两部分功能合并在一起,只实现了gadget_driver。这些都是可以的。
首先看composite.c 这个文件。composite就是一个中间层,只实现逻辑,不实现具体的功能。
static struct usb_gadget_driver composite_driver = {
.speed = USB_SPEED_HIGH,
.bind = composite_bind,
.unbind = __exit_p(composite_unbind),
.setup = composite_setup,
.disconnect = composite_disconnect,
.suspend = composite_suspend,
.resume = composite_resume,
.driver = {
.owner = THIS_MODULE,
},
};
在上一节中已经顺带介绍了composite_driver。它实现的函数中bind用于register driver时候,进行初始化。setup用于实现枚举的过程。
下面是composite driver初始化的过程:
下面看add_configuration的过程。在usb的驱动中,有configuration和interface是与usb设备的具体功能相关的。其中,interface是一个非常重要的概念。按照LDD中所述,一个USB接口代表了一个基本功能,而(在host端的)每个USB驱动程序控制一个(在gadget端的)接口,后面看到host的驱动时,可以看到多数函数的参数都是interface。几个interface捆绑为一个configuration,一个USB设备可以有多个configuration,这个设备可以在多种configuration之间进行切换,但通常来讲,一个设备只实现一种configuration。
下面,具体来看zero的实现。
与zero相关的还有两个文件:f_loopback.c f_sourcesink.c。在这两个文件中,各实现了一个configuration,因此,g_zero设备就有两个configuration。其中,loopback用于将