LINUX下USB1.1设备学习小记(4)_uhci(4)
时间:2009-03-14 来源:superfight
register_root_hub负责根集线器的注册
register_root_hub在/drivers/usb/core/hcd.c中
static int register_root_hub(struct usb_hcd *hcd) |
struct usb_device_descriptor {
__u8 bLength; //描述符的长度
__u8 bDescriptorType; //描述符的类型 __le16 bcdUSB; //表示usb设备所遵循的usb规范
__u8 bDeviceClass; //表示usb设备所属的标准设备类
__u8 bDeviceSubClass; //表示usb设备所属的标准设备子类
__u8 bDeviceProtocol; //表示usb设备所使用的设备类协议
__u8 bMaxPacketSize0; //表示0号端点包的最大大小
__le16 idVendor; //表示usb设备的生厂商id
__le16 idProduct; //表示usb设备的产品id
__le16 bcdDevice; //表示usb设备的版本号
__u8 iManufacturer; //表示生产商字符串描述符的索引值
__u8 iProduct; //表示产品字符串描述符的索引值
__u8 iSerialNumber; //表示设备序列号字符串描述符的索引值
__u8 bNumConfigurations; //表示usb设备的配置数
} __attribute__ ((packed)); usb_get_device_descriptor在/drivers/usb/core/messgae.c中
int usb_get_device_descriptor(struct usb_device *dev, unsigned int size) |
usb_get_descriptor在/drivers/usb/core/messgae.c中
int usb_get_descriptor(struct usb_device *dev, unsigned char type, |
usb_control_msg在/drivers/usb/core/messgae.c中
int usb_control_msg(struct usb_device *dev, unsigned int pipe, __u8 request, |
static int usb_internal_control_msg(struct usb_device *usb_dev, |
static int usb_start_wait_urb(struct urb *urb, int timeout, int *actual_length) |
usb_submit_urb在/drivers/usb/core/urb.c中
又臭又长........抱怨一下 Orz
int usb_submit_urb(struct urb *urb, gfp_t mem_flags) |
走完这堆代码之后终于到了usb_hcd_submit_urb,一看还是submit....... 还没发送出去啊?倒~
usb_hcd_submit_urb在/drivers/usb/core/hcd.c中
int usb_hcd_submit_urb (struct urb *urb, gfp_t mem_flags) |
按fudan_abc的说法,带usbmon的都是usb监控相关的,既然和架构无关,我就无视这些函数好了 = 3=
我们的发送目标为根集线器,呢么调用的当然是rh_urb_enqueue了 rh_urb_enqueue在/drivers/usb/core/hcd.c中
static int rh_urb_enqueue (struct usb_hcd *hcd, struct urb *urb) |
这里为控制传输,呢么调用的就是rh_call_control了
rh_call_control在/drivers/usb/core/hcd.c中
static int rh_call_control (struct usb_hcd *hcd, struct urb *urb) |
呢么目标就是DeviceRequest | USB_REQ_GET_DESCRIPTOR中的USB_DT_DEVICE << 8了
uhci为1.1设备,呢么就是HCD_USB11了
千辛万苦,终于拿到了我们的设备描述符usb11_rh_dev_descriptor,结构如下 static const u8 usb11_rh_dev_descriptor [18] = {
0x12, /* __u8 bLength; */
0x01, /* __u8 bDescriptorType; Device */
0x10, 0x01, /* __le16 bcdUSB; v1.1 */ 0x09, /* __u8 bDeviceClass; HUB_CLASSCODE */
0x00, /* __u8 bDeviceSubClass; */
0x00, /* __u8 bDeviceProtocol; [ low/full speeds only ] */
0x40, /* __u8 bMaxPacketSize0; 64 Bytes */ 0x6b, 0x1d, /* __le16 idVendor; Linux Foundation */
0x01, 0x00, /* __le16 idProduct; device 0x0001 */
KERNEL_VER, KERNEL_REL, /* __le16 bcdDevice */ 0x03, /* __u8 iManufacturer; */
0x02, /* __u8 iProduct; */
0x01, /* __u8 iSerialNumber; */
0x01 /* __u8 bNumConfigurations; */
}; 说明都在旁边,大家当锻炼一下英文吧 Orz
把usb11_rh_dev_descriptor复制到ubuf中,ubuf也就是urb->transfer_buffer,这样就把设备描述符复制到了urb中 到usb_hcd_giveback_urb,这个函数中有大玄机
usb_hcd_giveback_urb在/drivers/usb/core/hcd.c中
void usb_hcd_giveback_urb(struct usb_hcd *hcd, struct urb *urb, int status) |
usb_get_device_descriptor执行完毕之后, usb11_rh_dev_descriptor就在usb_device. descriptor中了 接下来到usb_new_device
usb_new_device在/drivers/usb/core/hub.c中
int usb_new_device(struct usb_device *udev) |
usb_configure_device在/drivers/usb/core/hub.c中
static int usb_configure_device(struct usb_device *udev) |