日期:2014-05-16  浏览次数:20624 次

自娱自乐7之Linux UDC驱动2(自编udc驱动,现完成枚举过程,从驱动代码分析枚举过程)

花了半个月,才搞定驱动中的枚举部分,现在说linux的枚举,windows可能有差别。

代码我会贴在后面,现在只是实现枚举,你可能对代码不感兴趣,我就不分析代码了,你可以看看

在《自娱自乐1》中的模板,比较一下,我做了什么,这会给你写udc驱动提供个思路。我直接分析

调试打印,就是枚举过程,我们从代码看枚举。打印位置可以在下面的代码里找到。

如果你要弄懂驱动代码中涉及枚举的地方,你就仔细看看代码在那打印的,这个对你完成一个udc驱

动有帮助。

如果你只是想简单了解枚举你就看看我分析的调试打印就可以了。

http://wenku.baidu.com/view/87064d244b35eefdc8d333dc.html

这个是枚举过程,对照着上面说的看我的调试打印,提示我的是从机,他说的是主机。

# insmod s3c2440_add_udc.ko

UPLLCON = 38022, wxl add//驱动usb的时钟源

# insmod s3c2440_udc.ko

# insmod gadget_transfer.ko

s3c2440_start//调用s3c2440_start(),在此会PULL_UP

s3c2440_udc_alloc_request//分配请求结构体内存

gadget_transfer gadget: gadget_transfer ready

# USB reset//pc检测到PULL_UP 复位设备

USB ep0 irq//ep0中断

Host: bRequest = 06 bRequestType = 80 wValue = 0x100wIndex=0x0 wLength=0x40//请求信息

//bRequest = 06是请求描述符,bRequestType = 80输入方向(输入是对主机而言) 端点0

//请求长度64(微软的策略,这里linux学微软的)。

//wValue = 0x100: 这个前面的1表示设备描述符

 

USB_REQ_GET_DESCRIPTOR//第一次请求主要是获取最大包长度,此值在设备描述符第8个字节

USB_DT_DEVICE//设备描述符请求

s3c2440_udc_queue//调用了s3c2440_udc_queue()

Slave: length = 18 Vendor = ff0 Product = ff0 Device =212 iManufacturer = 1 iProduct = 2 iSerialNumber = 3 bNumConfigurations = 1

// Vendor = ff0 Product = ff0 Device = 212 这个在上一篇的gadget_transfer驱动中可以看到

// iManufacturer = 1 iProduct = 2iSerialNumber = 3 这个是字符串描述符引索

// bNumConfigurations = 1 你看看我上一篇的gadget_transfar驱动写的是2,这里却是1

/*

bNumConfigurations是配置数,是用count_configs()统计的,和你在gadget驱动中赋值无关

     多配置很少,不过还是有,例如multi.c可以配置为RNDIS或ECM。

*/

8bytes USB USB reset //一次发出8个字节,我的ep0最大包长度是8,还有下面的xbytes都是已发的字节数。微软的策略后面没发完的不要了,直接复位设备。没有按usb spec来做。Windows要接受16个才复位。

USB ep0 irq

Host: bRequest = 05 bRequestType