日期:2014-05-16 浏览次数:20699 次
花了半个月,才搞定驱动中的枚举部分,现在说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