mini2440 usb device controller 驱动的分析--gadget设备(三)--- usb device framework

本文详细分析了USB Device Framework中的Composite Driver和Class Driver,探讨了Configuration和Interface的概念,并以Zero设备为例,阐述了如何在device端添加Configuration以及实现Loopback和Sourcesink功能。在Composite Driver的初始化过程中,重点关注了如何通过usb_ep_autoconfig分配endpoint,并通过usb_add_config和usb_add_function将function添加到configuration中。
摘要由CSDN通过智能技术生成

下面接着分析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用于将

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值