分析內核源碼 -- mass_storage.c


分析 mass_storage.c

struct usb_composite_driver {
	const char				*name;
	const struct usb_device_descriptor	*dev;
	struct usb_gadget_strings		**strings;
	enum usb_device_speed			max_speed;
	unsigned		needs_serial:1;

	int			(*bind)(struct usb_composite_dev *cdev);
	int			(*unbind)(struct usb_composite_dev *);

	void			(*disconnect)(struct usb_composite_dev *);

	/* global suspend hooks */
	void			(*suspend)(struct usb_composite_dev *);
	void			(*resume)(struct usb_composite_dev *);
	struct usb_gadget_driver		gadget_driver;
};

static struct usb_composite_driver msg_driver = {
	.name		= "g_mass_storage",
	.dev		= &msg_device_desc,
	.max_speed	= USB_SPEED_SUPER_PLUS,
	.needs_serial	= 1,
	.strings	= dev_strings,
	.bind		= msg_bind,
	.unbind		= msg_unbind,
};




msg_init
	usb_composite_probe(&msg_driver)
			//構造 struct usb_gadget_driver  結構體。 關聯 usb_composite_driver 和 usb_gadget_driver 結構體
			driver->gadget_driver = composite_driver_template;
			gadget_driver = &driver->gadget_driver;
			gadget_driver->function =  (char *) driver->name;
			gadget_driver->driver.name = driver->name;
			gadget_driver->max_speed = driver->max_speed;
			//最終會調用 usb_gadget_probe_driver 函數
			usb_gadget_probe_driver(gadget_driver)
				list_for_each_entry(udc, &udc_list, list) //查找 struct usb_udc	(即udc),如果找到,則調用 udc_bind_to_driver 
					/* For now we take the first one */
					if (!udc->driver)
						udc_bind_to_driver(struct usb_udc *udc, struct usb_gadget_driver *driver)
							//構造 usb_udc 結構體,  關聯 usb_udc 與 usb_gadget_driver
							udc->driver = driver;
							udc->dev.driver = &driver->driver;
							udc->gadget->dev.driver = &driver->driver;
							//綁定
							driver->bind(udc->gadget, driver)  //實際調用的是 composite_driver_template 裏的 composite_bind 函數
												composite_bind  //這個是最重要的函數
													composite_dev_prepare
														usb_ep_alloc_request
														cdev->req->buf = kmalloc(USB_COMP_EP0_BUFSIZ, GFP_KERNEL); //請求發送的內容保存在此
														cdev->req->complete = composite_setup_complete;
														
														
													composite->bind(cdev)  //也就是調用  msg_bind 函數 ( mass_storage.c)
													
							usb_gadget_udc_start(udc)
								udc->gadget->ops->udc_start(udc->gadget, udc->driver);
								
							usb_udc_connect_control(udc)
								usb_gadget_connect(udc->gadget)
									gadget->ops->pullup(gadget, 1) // Change Data+ pullup status



 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章