From b42fc9640862e668a3ca420c655e42cea54ccefb Mon Sep 17 00:00:00 2001 From: uestczyh222 Date: Wed, 13 Dec 2017 15:58:11 +0800 Subject: [PATCH] [host first] --- components/drivers/include/drivers/usb_host.h | 105 ++++++------------ components/drivers/usb/usbhost/SConscript | 2 +- components/drivers/usb/usbhost/core/hub.c | 81 ++++++++------ components/drivers/usb/usbhost/core/usbhost.c | 27 ----- 4 files changed, 77 insertions(+), 138 deletions(-) diff --git a/components/drivers/include/drivers/usb_host.h b/components/drivers/include/drivers/usb_host.h index 0e6c21432b..a79254c9b7 100644 --- a/components/drivers/include/drivers/usb_host.h +++ b/components/drivers/include/drivers/usb_host.h @@ -37,14 +37,17 @@ extern "C" { #define USB_HUB_PORT_NUM 0x04 #define SIZEOF_USB_REQUEST 0x08 -#define DEV_STATUS_IDLE 0x00 -#define DEV_STATUS_BUSY 0x01 -#define DEV_STATUS_ERROR 0x02 +#define DEV_STATUS_IDLE 0x00 +#define DEV_STATUS_BUSY 0x01 +#define DEV_STATUS_ERROR 0x02 #define UPIPE_STATUS_OK 0x00 #define UPIPE_STATUS_STALL 0x01 #define UPIPE_STATUS_ERROR 0x02 +#define USBH_PID_SETUP 0x00 +#define USBH_PID_DATA 0x01 + struct uhcd; struct uintf; struct uhub; @@ -74,10 +77,15 @@ typedef struct uprotocal* uprotocal_t; struct uinstance { + struct rt_device parent; + struct udevice_descriptor dev_desc; ucfg_desc_t cfg_desc; struct uhcd *hcd; + upipe_t pipe_ep0_out; + upipe_t pipe_ep0_in; + rt_uint8_t status; rt_uint8_t type; rt_uint8_t index; @@ -86,12 +94,12 @@ struct uinstance rt_uint8_t max_packet_size; rt_uint8_t port; - struct uhub* parent; - struct uintf* intf[USB_MAX_INTERFACE]; + struct uhub* parent_hub; + struct uhintf* intf[USB_MAX_INTERFACE]; }; typedef struct uinstance* uinst_t; -struct uintf +struct uhintf { struct uinstance* device; uintf_desc_t intf_desc; @@ -102,9 +110,10 @@ struct uintf struct upipe { + rt_uint8_t pipe_index; rt_uint32_t status; struct uendpoint_descriptor ep; - struct uintf* intf; + struct uhintf* intf; func_callback callback; void* user_data; }; @@ -127,23 +136,16 @@ typedef struct uhub* uhub_t; struct uhcd_ops { - int (*ctl_xfer)(struct uinstance* inst, ureq_t setup, void* buffer, int nbytes, - int timeout); - int (*bulk_xfer)(upipe_t pipe, void* buffer, int nbytes, int timeout); - int (*int_xfer)(upipe_t pipe, void* buffer, int nbytes, int timeout); - int (*iso_xfer)(upipe_t pipe, void* buffer, int nbytes, int timeout); - - rt_err_t (*alloc_pipe)(struct upipe** pipe, struct uintf* intf, uep_desc_t ep, - func_callback callback); - rt_err_t (*free_pipe)(upipe_t pipe); - rt_err_t (*hub_ctrl)(rt_uint16_t port, rt_uint8_t cmd, void *args); + int (*pipe_xfer) (upipe_t pipe, rt_uint8_t token, void* buffer, int nbytes, int timeout); + rt_err_t (*alloc_pipe) (struct upipe* pipe, uep_desc_t ep); + rt_err_t (*free_pipe) (upipe_t pipe); }; - +typedef struct uhcd_ops* uhcd_ops_t; struct uhcd { struct rt_device parent; - struct uhcd_ops* ops; - struct uhub* roothub; + uhcd_ops_t ops; + uhub_t roothub; }; typedef struct uhcd* uhcd_t; @@ -177,16 +179,13 @@ void rt_usbh_hub_init(void); struct uinstance* rt_usbh_alloc_instance(void); rt_err_t rt_usbh_attatch_instance(struct uinstance* device); rt_err_t rt_usbh_detach_instance(struct uinstance* device); -rt_err_t rt_usbh_get_descriptor(struct uinstance* device, rt_uint8_t type, void* buffer, - int nbytes); +rt_err_t rt_usbh_get_descriptor(struct uinstance* device, rt_uint8_t type, void* buffer, int nbytes); rt_err_t rt_usbh_set_configure(struct uinstance* device, int config); rt_err_t rt_usbh_set_address(struct uinstance* device); rt_err_t rt_usbh_set_interface(struct uinstance* device, int intf); rt_err_t rt_usbh_clear_feature(struct uinstance* device, int endpoint, int feature); -rt_err_t rt_usbh_get_interface_descriptor(ucfg_desc_t cfg_desc, int num, - uintf_desc_t* intf_desc); -rt_err_t rt_usbh_get_endpoint_descriptor(uintf_desc_t intf_desc, int num, - uep_desc_t* ep_desc); +rt_err_t rt_usbh_get_interface_descriptor(ucfg_desc_t cfg_desc, int num, uintf_desc_t* intf_desc); +rt_err_t rt_usbh_get_endpoint_descriptor(uintf_desc_t intf_desc, int num, uep_desc_t* ep_desc); /* usb class driver interface */ rt_err_t rt_usbh_class_driver_init(void); @@ -197,19 +196,10 @@ rt_err_t rt_usbh_class_driver_disable(ucd_t drv, void* args); ucd_t rt_usbh_class_driver_find(int class_code, int subclass_code); /* usb class driver implement */ -ucd_t rt_usbh_class_driver_hid(void); ucd_t rt_usbh_class_driver_hub(void); ucd_t rt_usbh_class_driver_storage(void); -ucd_t rt_usbh_class_driver_adk(void); -/* usb hid protocal implement */ -uprotocal_t rt_usbh_hid_protocal_kbd(void); -uprotocal_t rt_usbh_hid_protocal_mouse(void); -/* usb adk class driver interface */ -rt_err_t rt_usbh_adk_set_string(const char* manufacturer, const char* model, - const char* description, const char* version, const char* uri, - const char* serial); /* usb hub interface */ rt_err_t rt_usbh_hub_get_descriptor(struct uinstance* device, rt_uint8_t *buffer, @@ -225,57 +215,24 @@ rt_err_t rt_usbh_hub_reset_port(uhub_t uhub, rt_uint16_t port); rt_err_t rt_usbh_event_signal(struct uhost_msg* msg); /* usb host controller driver interface */ -rt_inline rt_err_t rt_usb_hcd_alloc_pipe(uhcd_t hcd, upipe_t* pipe, - struct uintf* intf, uep_desc_t ep, func_callback callback) +rt_inline rt_err_t rt_usb_hcd_alloc_pipe(uhcd_t hcd, upipe_t pipe, uep_desc_t ep) { - if(intf == RT_NULL) return -RT_EIO; - - return hcd->ops->alloc_pipe(pipe, intf, ep, callback); + return hcd->ops->alloc_pipe(pipe, ep); } rt_inline rt_err_t rt_usb_hcd_free_pipe(uhcd_t hcd, upipe_t pipe) { RT_ASSERT(pipe != RT_NULL); - return hcd->ops->free_pipe(pipe); } -rt_inline int rt_usb_hcd_bulk_xfer(uhcd_t hcd, upipe_t pipe, void* buffer, - int nbytes, int timeout) +rt_inline int rt_usb_hcd_pipe_xfer(uhcd_t hcd, upipe_t pipe, void* buffer, int nbytes, int timeout) { - if(pipe == RT_NULL) return -1; - if(pipe->intf == RT_NULL) return -1; - if(pipe->intf->device == RT_NULL) return -1; - if(pipe->intf->device->status == DEV_STATUS_IDLE) - return -1; - - return hcd->ops->bulk_xfer(pipe, buffer, nbytes, timeout); + return hcd->ops->pipe_xfer(pipe, USBH_PID_DATA, buffer, nbytes, timeout); } - -rt_inline int rt_usb_hcd_control_xfer(uhcd_t hcd, struct uinstance* device, ureq_t setup, - void* buffer, int nbytes, int timeout) +rt_inline int rt_usb_hcd_setup_xfer(uhcd_t hcd, upipe_t pipe, ureq_t setup, int timeout) { - if(device->status == DEV_STATUS_IDLE) return -1; - - return hcd->ops->ctl_xfer(device, setup, buffer, nbytes, timeout); -} - -rt_inline int rt_usb_hcd_int_xfer(uhcd_t hcd, upipe_t pipe, void* buffer, - int nbytes, int timeout) -{ - if(pipe == RT_NULL) return -1; - if(pipe->intf == RT_NULL) return -1; - if(pipe->intf->device == RT_NULL) return -1; - if(pipe->intf->device->status == DEV_STATUS_IDLE) - return -1; - - return hcd->ops->int_xfer(pipe, buffer, nbytes, timeout); -} - -rt_inline rt_err_t rt_usb_hcd_hub_control(uhcd_t hcd, rt_uint16_t port, - rt_uint8_t cmd, void *args) -{ - return hcd->ops->hub_ctrl(port, cmd, args); + return hcd->ops->pipe_xfer(pipe, USBH_PID_SETUP, (void *)setup, 8, timeout); } #ifdef __cplusplus diff --git a/components/drivers/usb/usbhost/SConscript b/components/drivers/usb/usbhost/SConscript index e8ba3c4a84..b12adfc5ad 100644 --- a/components/drivers/usb/usbhost/SConscript +++ b/components/drivers/usb/usbhost/SConscript @@ -29,6 +29,6 @@ if GetDepend('RT_USBH_HID_KEYBOARD'): CPPPATH = [cwd, cwd + '/class', cwd + '/core', \ cwd + '/include', cwd + '../../../include'] -group = DefineGroup('rt_usbh', src, depend = ['RT_USING_USBH'], CPPPATH = CPPPATH) +group = DefineGroup('rt_usbh', src, depend = ['RT_USING_USB_HOST'], CPPPATH = CPPPATH) Return('group') diff --git a/components/drivers/usb/usbhost/core/hub.c b/components/drivers/usb/usbhost/core/hub.c index 24ce980bbf..16a20d8852 100644 --- a/components/drivers/usb/usbhost/core/hub.c +++ b/components/drivers/usb/usbhost/core/hub.c @@ -40,8 +40,7 @@ static struct uclass_driver hub_driver; * * @return the error code, RT_EOK on successfully. */ -rt_err_t rt_usbh_hub_get_descriptor(struct uinstance* device, rt_uint8_t *buffer, - rt_size_t nbytes) +rt_err_t rt_usbh_hub_get_descriptor(struct uinstance* device, rt_uint8_t *buffer, rt_size_t nbytes) { struct urequest setup; int timeout = 100; @@ -49,16 +48,20 @@ rt_err_t rt_usbh_hub_get_descriptor(struct uinstance* device, rt_uint8_t *buffer /* parameter check */ RT_ASSERT(device != RT_NULL); - setup.request_type = USB_REQ_TYPE_DIR_IN | USB_REQ_TYPE_CLASS | - USB_REQ_TYPE_DEVICE; + setup.request_type = USB_REQ_TYPE_DIR_IN | USB_REQ_TYPE_CLASS | USB_REQ_TYPE_DEVICE; setup.bRequest = USB_REQ_GET_DESCRIPTOR; setup.wIndex = 0; setup.wLength = nbytes; setup.wValue = USB_DESC_TYPE_HUB << 8; - if(rt_usb_hcd_control_xfer(device->hcd, device, &setup, buffer, nbytes, - timeout) == nbytes) return RT_EOK; - else return -RT_FALSE; + if(rt_usb_hcd_setup_xfer(device->hcd, device->pipe_ep0_out, &setup, timeout) == 8) + { + if(rt_usb_hcd_pipe_xfer(device->hcd, device->pipe_ep0_in, buffer, nbytes, timeout) == nbytes) + { + return RT_EOK; + } + } + return -RT_FALSE; } /** @@ -70,25 +73,27 @@ rt_err_t rt_usbh_hub_get_descriptor(struct uinstance* device, rt_uint8_t *buffer * * @return the error code, RT_EOK on successfully. */ -rt_err_t rt_usbh_hub_get_status(struct uinstance* device, rt_uint8_t* buffer) +rt_err_t rt_usbh_hub_get_status(struct uinstance* device, rt_uint32_t* buffer) { struct urequest setup; int timeout = 100; - int length = 4; /* parameter check */ RT_ASSERT(device != RT_NULL); - setup.request_type = USB_REQ_TYPE_DIR_IN | USB_REQ_TYPE_CLASS | - USB_REQ_TYPE_DEVICE; + setup.request_type = USB_REQ_TYPE_DIR_IN | USB_REQ_TYPE_CLASS | USB_REQ_TYPE_DEVICE; setup.bRequest = USB_REQ_GET_STATUS; setup.wIndex = 0; - setup.wLength = length; + setup.wLength = 4; setup.wValue = 0; - - if(rt_usb_hcd_control_xfer(device->hcd, device, &setup, buffer, length, - timeout) == length) return RT_EOK; - else return -RT_FALSE; + if(rt_usb_hcd_setup_xfer(device->hcd, device->pipe_ep0_out, &setup, timeout) == 8) + { + if(rt_usb_hcd_pipe_xfer(device->hcd, device->pipe_ep0_in, buffer, 4, timeout) == 4) + { + return RT_EOK; + } + } + return -RT_FALSE; } /** @@ -101,12 +106,10 @@ rt_err_t rt_usbh_hub_get_status(struct uinstance* device, rt_uint8_t* buffer) * * @return the error code, RT_EOK on successfully. */ -rt_err_t rt_usbh_hub_get_port_status(uhub_t hub, rt_uint16_t port, - rt_uint8_t* buffer) +rt_err_t rt_usbh_hub_get_port_status(uhub_t hub, rt_uint16_t port, rt_uint32_t* buffer) { struct urequest setup; int timeout = 100; - int length = 4; /* parameter check */ RT_ASSERT(hub != RT_NULL); @@ -119,16 +122,20 @@ rt_err_t rt_usbh_hub_get_port_status(uhub_t hub, rt_uint16_t port, return RT_EOK; } - setup.request_type = USB_REQ_TYPE_DIR_IN | USB_REQ_TYPE_CLASS | - USB_REQ_TYPE_OTHER; + setup.request_type = USB_REQ_TYPE_DIR_IN | USB_REQ_TYPE_CLASS | USB_REQ_TYPE_OTHER; setup.bRequest = USB_REQ_GET_STATUS; setup.wIndex = port; setup.wLength = 4; setup.wValue = 0; - if(rt_usb_hcd_control_xfer(hub->hcd, hub->self, &setup, buffer, - length, timeout) == timeout) return RT_EOK; - else return -RT_FALSE; + if(rt_usb_hcd_setup_xfer(hub->hcd, hub->self->pipe_ep0_out, &setup, timeout) == 8) + { + if(rt_usb_hcd_pipe_xfer(hub->hcd, hub->self->pipe_ep0_in, buffer, 4, timeout) == 4) + { + return RT_EOK; + } + } + return -RT_FALSE; } /** @@ -141,8 +148,7 @@ rt_err_t rt_usbh_hub_get_port_status(uhub_t hub, rt_uint16_t port, * * @return the error code, RT_EOK on successfully. */ -rt_err_t rt_usbh_hub_clear_port_feature(uhub_t hub, rt_uint16_t port, - rt_uint16_t feature) +rt_err_t rt_usbh_hub_clear_port_feature(uhub_t hub, rt_uint16_t port, rt_uint16_t feature) { struct urequest setup; int timeout = 100; @@ -165,9 +171,11 @@ rt_err_t rt_usbh_hub_clear_port_feature(uhub_t hub, rt_uint16_t port, setup.wLength = 0; setup.wValue = feature; - if(rt_usb_hcd_control_xfer(hub->hcd, hub->self, &setup, RT_NULL, 0, - timeout) == 0) return RT_EOK; - else return -RT_FALSE; + if(rt_usb_hcd_setup_xfer(hub->hcd, hub->self->pipe_ep0_out, &setup, timeout) == 8) + { + return RT_EOK; + } + return -RT_FALSE; } /** @@ -204,8 +212,10 @@ rt_err_t rt_usbh_hub_set_port_feature(uhub_t hub, rt_uint16_t port, setup.wLength = 0; setup.wValue = feature; - if(rt_usb_hcd_control_xfer(hub->hcd, hub->self, &setup, RT_NULL, 0, - timeout) == 0) return RT_EOK; + if(rt_usb_hcd_setup_xfer(hub->hcd, hub->self->pipe_ep0_out, &setup, timeout) == 8) + { + return RT_EOK; + } else return -RT_FALSE; } @@ -341,7 +351,7 @@ static rt_err_t rt_usbh_hub_port_change(uhub_t hub) /* set usb device speed */ device->speed = (pstatus & PORT_LSDA) ? 1 : 0; - device->parent = hub; + device->parent_hub = hub; device->hcd = hub->hcd; hub->child[i] = device; @@ -366,7 +376,7 @@ static rt_err_t rt_usbh_hub_port_change(uhub_t hub) static void rt_usbh_hub_irq(void* context) { upipe_t pipe; - struct uintf* intf; + struct uhintf* intf; uhub_t hub; int timeout = 100; @@ -389,8 +399,7 @@ static void rt_usbh_hub_irq(void* context) /* parameter check */ RT_ASSERT(pipe->intf->device->hcd != RT_NULL); - rt_usb_hcd_int_xfer(intf->device->hcd, pipe, hub->buffer, - pipe->ep.wMaxPacketSize, timeout); + rt_usb_hcd_pipe_xfer(intf->device->hcd, pipe, hub->buffer, pipe->ep.wMaxPacketSize, timeout); } /** @@ -408,7 +417,7 @@ static rt_err_t rt_usbh_hub_enable(void *arg) uep_desc_t ep_desc; uhub_t hub; struct uinstance* device; - struct uintf* intf = (struct uintf*)arg; + struct uhintf* intf = (struct uhintf*)arg; int timeout = 300; /* paremeter check */ diff --git a/components/drivers/usb/usbhost/core/usbhost.c b/components/drivers/usb/usbhost/core/usbhost.c index dcfdf6a127..17e34474fc 100644 --- a/components/drivers/usb/usbhost/core/usbhost.c +++ b/components/drivers/usb/usbhost/core/usbhost.c @@ -40,9 +40,6 @@ rt_err_t rt_usb_host_init(void) { ucd_t drv; rt_device_t uhc; -#ifdef RT_USBH_HID - uprotocal_t protocal; -#endif uhc = rt_device_find(USB_HOST_CONTROLLER_NAME); if(uhc == RT_NULL) @@ -63,30 +60,6 @@ rt_err_t rt_usb_host_init(void) rt_usbh_class_driver_register(drv); #endif -#ifdef RT_USBH_HID - /* register hid class driver */ - drv = rt_usbh_class_driver_hid(); - rt_usbh_class_driver_register(drv); - -#ifdef RT_USBH_HID_KEYBOARD - /* register hid keyboard protocal */ - protocal = rt_usbh_hid_protocal_kbd(); - rt_usbh_hid_protocal_register(protocal); -#endif - -#ifdef RT_USBH_HID_MOUSE - /* register hid mouse protocal */ - protocal = rt_usbh_hid_protocal_mouse(); - rt_usbh_hid_protocal_register(protocal); -#endif -#endif - -#ifdef RT_USBH_ADK - /* register adk class driver */ - drv = rt_usbh_class_driver_adk(); - rt_usbh_class_driver_register(drv); -#endif - /* register hub class driver */ drv = rt_usbh_class_driver_hub(); rt_usbh_class_driver_register(drv); -- GitLab