summaryrefslogtreecommitdiff
path: root/components/drivers/usb
diff options
context:
space:
mode:
authorBernard Xiong <[email protected]>2021-02-23 09:44:27 +0800
committerGitHub <[email protected]>2021-02-23 09:44:27 +0800
commit4426af03f8f93ecb1fd7926d18771de5d0dfe9df (patch)
tree6f3ac9fce672749976bbd5803149f850468c4ba9 /components/drivers/usb
parentd9c3459e1108ab4111ead3b0c8d92cb0d8318bc9 (diff)
Revert "添加imxrt的pulse encoder和usb host驅動"
Diffstat (limited to 'components/drivers/usb')
-rw-r--r--components/drivers/usb/usbhost/class/hid.c130
-rw-r--r--components/drivers/usb/usbhost/class/hid.h10
-rw-r--r--components/drivers/usb/usbhost/class/umouse.c25
-rw-r--r--components/drivers/usb/usbhost/core/driver.c15
-rw-r--r--components/drivers/usb/usbhost/core/hub.c30
-rw-r--r--components/drivers/usb/usbhost/core/usbhost.c16
6 files changed, 87 insertions, 139 deletions
diff --git a/components/drivers/usb/usbhost/class/hid.c b/components/drivers/usb/usbhost/class/hid.c
index 1abc82184f..e16096877f 100644
--- a/components/drivers/usb/usbhost/class/hid.c
+++ b/components/drivers/usb/usbhost/class/hid.c
@@ -26,7 +26,7 @@ static rt_list_t _protocal_list;
*
* @return the error code, RT_EOK on successfully.
*/
-rt_err_t rt_usbh_hid_set_idle(struct uhintf* intf, int duration, int report_id)
+rt_err_t rt_usbh_hid_set_idle(struct uintf* intf, int duration, int report_id)
{
struct urequest setup;
struct uinstance* device;
@@ -40,15 +40,14 @@ rt_err_t rt_usbh_hid_set_idle(struct uhintf* intf, int duration, int report_id)
setup.request_type = USB_REQ_TYPE_DIR_OUT | USB_REQ_TYPE_CLASS |
USB_REQ_TYPE_INTERFACE;
- setup.bRequest = USB_REQ_SET_IDLE;
- setup.wIndex = 0;
- setup.wLength = 0;
- setup.wValue = (duration << 8 )| report_id;
+ setup.request = USB_REQ_SET_IDLE;
+ setup.index = 0;
+ setup.length = 0;
+ setup.value = (duration << 8 )| report_id;
- if (rt_usb_hcd_setup_xfer(device->hcd, device->pipe_ep0_out, &setup, timeout) == 8)
- return RT_EOK;
- else
- return -RT_FALSE;
+ if(rt_usb_hcd_control_xfer(device->hcd, device, &setup, RT_NULL, 0,
+ timeout) == 0) return RT_EOK;
+ else return -RT_FALSE;
}
/**
@@ -60,7 +59,7 @@ rt_err_t rt_usbh_hid_set_idle(struct uhintf* intf, int duration, int report_id)
*
* @return the error code, RT_EOK on successfully.
*/
-rt_err_t rt_usbh_hid_get_report(struct uhintf* intf, rt_uint8_t type,
+rt_err_t rt_usbh_hid_get_report(struct uintf* intf, rt_uint8_t type,
rt_uint8_t id, rt_uint8_t *buffer, rt_size_t size)
{
struct urequest setup;
@@ -75,24 +74,14 @@ rt_err_t rt_usbh_hid_get_report(struct uhintf* intf, rt_uint8_t type,
setup.request_type = USB_REQ_TYPE_DIR_IN | USB_REQ_TYPE_CLASS |
USB_REQ_TYPE_INTERFACE;
- setup.bRequest = USB_REQ_GET_REPORT;
- setup.wIndex = intf->intf_desc->bInterfaceNumber;
- setup.wLength = size;
- setup.wValue = (type << 8 ) + id;
+ setup.request = USB_REQ_GET_REPORT;
+ setup.index = intf->intf_desc->bInterfaceNumber;
+ setup.length = size;
+ setup.value = (type << 8 ) + id;
- 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, size, timeout) == size)
- {
- if (rt_usb_hcd_pipe_xfer(device->hcd, device->pipe_ep0_out, RT_NULL, 0, timeout) == 0)
- {
- return RT_EOK;
- }
- }
- }
- else
- return -RT_FALSE;
- return -RT_FALSE;
+ if(rt_usb_hcd_control_xfer(device->hcd, device, &setup, buffer, size,
+ timeout) == size) return RT_EOK;
+ else return -RT_FALSE;
}
/**
@@ -104,7 +93,7 @@ rt_err_t rt_usbh_hid_get_report(struct uhintf* intf, rt_uint8_t type,
*
* @return the error code, RT_EOK on successfully.
*/
-rt_err_t rt_usbh_hid_set_report(struct uhintf* intf, rt_uint8_t *buffer, rt_size_t size)
+rt_err_t rt_usbh_hid_set_report(struct uintf* intf, rt_uint8_t *buffer, rt_size_t size)
{
struct urequest setup;
struct uinstance* device;
@@ -118,15 +107,14 @@ rt_err_t rt_usbh_hid_set_report(struct uhintf* intf, rt_uint8_t *buffer, rt_size
setup.request_type = USB_REQ_TYPE_DIR_OUT | USB_REQ_TYPE_CLASS |
USB_REQ_TYPE_INTERFACE;
- setup.bRequest = USB_REQ_SET_REPORT;
- setup.wIndex = intf->intf_desc->bInterfaceNumber;
- setup.wLength = size;
- setup.wValue = 0x02 << 8;
+ setup.request = USB_REQ_SET_REPORT;
+ setup.index = intf->intf_desc->bInterfaceNumber;
+ setup.length = size;
+ setup.value = 0x02 << 8;
- if (rt_usb_hcd_setup_xfer(device->hcd, device->pipe_ep0_out, &setup, timeout) == 8)
- return RT_EOK;
- else
- return -RT_FALSE;
+ if(rt_usb_hcd_control_xfer(device->hcd, device, &setup, buffer, size,
+ timeout) == size) return RT_EOK;
+ else return -RT_FALSE;
}
/**
@@ -137,7 +125,7 @@ rt_err_t rt_usbh_hid_set_report(struct uhintf* intf, rt_uint8_t *buffer, rt_size
*
* @return the error code, RT_EOK on successfully.
*/
-rt_err_t rt_usbh_hid_set_protocal(struct uhintf* intf, int protocol)
+rt_err_t rt_usbh_hid_set_protocal(struct uintf* intf, int protocol)
{
struct urequest setup;
struct uinstance* device;
@@ -151,15 +139,14 @@ rt_err_t rt_usbh_hid_set_protocal(struct uhintf* intf, int protocol)
setup.request_type = USB_REQ_TYPE_DIR_OUT | USB_REQ_TYPE_CLASS |
USB_REQ_TYPE_INTERFACE;
- setup.bRequest = USB_REQ_SET_PROTOCOL;
- setup.wIndex = 0;
- setup.wLength = 0;
- setup.wValue = protocol;
+ setup.request = USB_REQ_SET_PROTOCOL;
+ setup.index = 0;
+ setup.length = 0;
+ setup.value = protocol;
- if (rt_usb_hcd_setup_xfer(device->hcd, device->pipe_ep0_out, &setup, timeout) == 8)
- return RT_EOK;
- else
- return -RT_FALSE;
+ if(rt_usb_hcd_control_xfer(device->hcd, device, &setup, RT_NULL, 0,
+ timeout) == 0) return RT_EOK;
+ else return -RT_FALSE;
}
/**
@@ -172,7 +159,7 @@ rt_err_t rt_usbh_hid_set_protocal(struct uhintf* intf, int protocol)
*
* @return the error code, RT_EOK on successfully.
*/
-rt_err_t rt_usbh_hid_get_report_descriptor(struct uhintf* intf,
+rt_err_t rt_usbh_hid_get_report_descriptor(struct uintf* intf,
rt_uint8_t *buffer, rt_size_t size)
{
struct urequest setup;
@@ -187,24 +174,14 @@ rt_err_t rt_usbh_hid_get_report_descriptor(struct uhintf* intf,
setup.request_type = USB_REQ_TYPE_DIR_IN | USB_REQ_TYPE_STANDARD|
USB_REQ_TYPE_INTERFACE;
- setup.bRequest = USB_REQ_GET_DESCRIPTOR;
- setup.wIndex = 0;
- setup.wLength = size;
- setup.wValue = USB_DESC_TYPE_REPORT << 8;
+ setup.request = USB_REQ_GET_DESCRIPTOR;
+ setup.index = 0;
+ setup.length = size;
+ setup.value = USB_DESC_TYPE_REPORT << 8;
- 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, size, timeout) == size)
- {
- if (rt_usb_hcd_pipe_xfer(device->hcd, device->pipe_ep0_out, RT_NULL, 0, timeout) == 0)
- {
- return RT_EOK;
- }
- }
- }
- else
- return -RT_FALSE;
- return -RT_FALSE;
+ if(rt_usb_hcd_control_xfer(device->hcd, device, &setup, buffer, size,
+ timeout) == size) return RT_EOK;
+ else return -RT_FALSE;
}
/**
@@ -243,16 +220,16 @@ static void rt_usbh_hid_callback(void* context)
RT_ASSERT(context != RT_NULL);
pipe = (upipe_t)context;
- hid = (struct uhid*)((struct uhintf*)pipe->inst)->user_data;
+ hid = (struct uhid*)pipe->intf->user_data;
/* invoke protocal callback function */
hid->protocal->callback((void*)hid);
/* parameter check */
- RT_ASSERT(((struct uhintf*)pipe->inst)->device->hcd != RT_NULL);
+ RT_ASSERT(pipe->intf->device->hcd != RT_NULL);
- rt_usb_hcd_pipe_xfer(((struct uhintf*)pipe->inst)->device->hcd, pipe,
- hid->buffer, pipe->ep.wMaxPacketSize, timeout);
+ rt_usb_hcd_int_xfer(pipe->intf->device->hcd, pipe, hid->buffer,
+ pipe->ep.wMaxPacketSize, timeout);
}
/**
@@ -291,7 +268,9 @@ static rt_err_t rt_usbh_hid_enable(void* arg)
int i = 0, pro_id;
uprotocal_t protocal;
struct uhid* hid;
- struct uhintf* intf = (struct uhintf*)arg;
+ struct uintf* intf = (struct uintf*)arg;
+ int timeout = USB_TIMEOUT_BASIC;
+ upipe_t pipe;
/* parameter check */
if(intf == RT_NULL)
@@ -340,13 +319,19 @@ static rt_err_t rt_usbh_hid_enable(void* arg)
if(!(ep_desc->bEndpointAddress & USB_DIR_IN)) continue;
ret = rt_usb_hcd_alloc_pipe(intf->device->hcd, &hid->pipe_in,
- intf, ep_desc);
+ intf, ep_desc, rt_usbh_hid_callback);
if(ret != RT_EOK) return ret;
}
/* initialize hid protocal */
- hid->protocal->init((void*)intf);
+ hid->protocal->init((void*)intf);
+ pipe = hid->pipe_in;
+ /* parameter check */
+ RT_ASSERT(pipe->intf->device->hcd != RT_NULL);
+
+ rt_usb_hcd_int_xfer(pipe->intf->device->hcd, hid->pipe_in,
+ hid->buffer, hid->pipe_in->ep.wMaxPacketSize, timeout);
return RT_EOK;
}
@@ -361,7 +346,7 @@ static rt_err_t rt_usbh_hid_enable(void* arg)
static rt_err_t rt_usbh_hid_disable(void* arg)
{
struct uhid* hid;
- struct uhintf* intf = (struct uhintf*)arg;
+ struct uintf* intf = (struct uintf*)arg;
RT_ASSERT(intf != RT_NULL);
@@ -379,6 +364,9 @@ static rt_err_t rt_usbh_hid_disable(void* arg)
/* free the hid instance */
rt_free(hid);
}
+
+ /* free the instance */
+ rt_free(intf);
return RT_EOK;
}
diff --git a/components/drivers/usb/usbhost/class/hid.h b/components/drivers/usb/usbhost/class/hid.h
index 04c67aa42b..8e446c8cea 100644
--- a/components/drivers/usb/usbhost/class/hid.h
+++ b/components/drivers/usb/usbhost/class/hid.h
@@ -31,11 +31,11 @@ typedef struct uhid uhid_t;
#define USB_HID_KEYBOARD 1
#define USB_HID_MOUSE 2
-rt_err_t rt_usbh_hid_set_idle(struct uhintf* intf, int duration, int report_id);
-rt_err_t rt_usbh_hid_get_report(struct uhintf* intf, rt_uint8_t type, rt_uint8_t id, rt_uint8_t *buffer, rt_size_t size);
-rt_err_t rt_usbh_hid_set_report(struct uhintf* intf, rt_uint8_t *buffer, rt_size_t size);
-rt_err_t rt_usbh_hid_set_protocal(struct uhintf* intf, int protocol);
-rt_err_t rt_usbh_hid_get_report_descriptor(struct uhintf* intf, rt_uint8_t *buffer, rt_size_t size);
+rt_err_t rt_usbh_hid_set_idle(struct uintf* intf, int duration, int report_id);
+rt_err_t rt_usbh_hid_get_report(struct uintf* intf, rt_uint8_t type, rt_uint8_t id, rt_uint8_t *buffer, rt_size_t size);
+rt_err_t rt_usbh_hid_set_report(struct uintf* intf, rt_uint8_t *buffer, rt_size_t size);
+rt_err_t rt_usbh_hid_set_protocal(struct uintf* intf, int protocol);
+rt_err_t rt_usbh_hid_get_report_descriptor(struct uintf* intf, rt_uint8_t *buffer, rt_size_t size);
rt_err_t rt_usbh_hid_protocal_register(uprotocal_t protocal);
#endif
diff --git a/components/drivers/usb/usbhost/class/umouse.c b/components/drivers/usb/usbhost/class/umouse.c
index 7f50c0451f..e769475a98 100644
--- a/components/drivers/usb/usbhost/class/umouse.c
+++ b/components/drivers/usb/usbhost/class/umouse.c
@@ -126,36 +126,15 @@ static rt_err_t rt_usbh_hid_mouse_callback(void* arg)
return RT_EOK;
}
-rt_thread_t mouse_thread;
-void mouse_task(void* param)
-{
- struct uhintf* intf = (struct uhintf*)param;
- while (1)
- {
- if (rt_usb_hcd_pipe_xfer(intf->device->hcd, ((struct uhid*)intf->user_data)->pipe_in,
- ((struct uhid*)intf->user_data)->buffer, ((struct uhid*)intf->user_data)->pipe_in->ep.wMaxPacketSize,
- USB_TIMEOUT_BASIC) == 0)
- {
- break;
- }
-
- rt_usbh_hid_mouse_callback(intf->user_data);
- }
-}
-
-
static rt_err_t rt_usbh_hid_mouse_init(void* arg)
{
- struct uhintf* intf = (struct uhintf*)arg;
+ struct uintf* intf = (struct uintf*)arg;
RT_ASSERT(intf != RT_NULL);
rt_usbh_hid_set_protocal(intf, 0);
- rt_usbh_hid_set_idle(intf, 0, 0);
-
- mouse_thread = rt_thread_create("mouse0", mouse_task, intf, 500, 8, 100);
- rt_thread_startup(mouse_thread);
+ rt_usbh_hid_set_idle(intf, 10, 0);
RT_DEBUG_LOG(RT_DEBUG_USB, ("start usb mouse\n"));
#ifdef RT_USING_RTGUI
diff --git a/components/drivers/usb/usbhost/core/driver.c b/components/drivers/usb/usbhost/core/driver.c
index 871a7b578a..37327108c1 100644
--- a/components/drivers/usb/usbhost/core/driver.c
+++ b/components/drivers/usb/usbhost/core/driver.c
@@ -13,7 +13,6 @@
#include <drivers/usb_host.h>
static rt_list_t _driver_list;
-static rt_bool_t _driver_list_created = RT_FALSE;
/**
* This function will initilize the usb class driver related data structure,
@@ -23,11 +22,8 @@ static rt_bool_t _driver_list_created = RT_FALSE;
*/
rt_err_t rt_usbh_class_driver_init(void)
{
- if (_driver_list_created == RT_FALSE)
- {
- rt_list_init(&_driver_list);
- _driver_list_created = RT_TRUE;
- }
+ rt_list_init(&_driver_list);
+
return RT_EOK;
}
@@ -43,11 +39,8 @@ rt_err_t rt_usbh_class_driver_register(ucd_t drv)
{
if (drv == RT_NULL) return -RT_ERROR;
- if (rt_usbh_class_driver_find(drv->class_code, drv->subclass_code) == RT_NULL)
- {
- /* insert class driver into driver list */
- rt_list_insert_after(&_driver_list, &(drv->list));
- }
+ /* insert class driver into driver list */
+ rt_list_insert_after(&_driver_list, &(drv->list));
return RT_EOK;
}
diff --git a/components/drivers/usb/usbhost/core/hub.c b/components/drivers/usb/usbhost/core/hub.c
index c0e025ba7e..eefa571472 100644
--- a/components/drivers/usb/usbhost/core/hub.c
+++ b/components/drivers/usb/usbhost/core/hub.c
@@ -13,9 +13,9 @@
#define USB_THREAD_STACK_SIZE 4096
-// static struct rt_messagequeue *usb_mq;
+static struct rt_messagequeue *usb_mq;
static struct uclass_driver hub_driver;
-// static struct uhub root_hub;
+static struct uhub root_hub;
static rt_err_t root_hub_ctrl(struct uhcd *hcd, rt_uint16_t port, rt_uint8_t cmd, void *args)
{
@@ -92,7 +92,7 @@ void rt_usbh_root_hub_connect_handler(struct uhcd *hcd, rt_uint8_t port, rt_bool
{
hcd->roothub->port_status[port - 1] |= PORT_LSDA;
}
- rt_usbh_event_signal(hcd, &msg);
+ rt_usbh_event_signal(&msg);
}
void rt_usbh_root_hub_disconnect_handler(struct uhcd *hcd, rt_uint8_t port)
@@ -102,7 +102,7 @@ void rt_usbh_root_hub_disconnect_handler(struct uhcd *hcd, rt_uint8_t port)
msg.content.hub = hcd->roothub;
hcd->roothub->port_status[port - 1] |= PORT_CCSC;
hcd->roothub->port_status[port - 1] &= ~PORT_CCS;
- rt_usbh_event_signal(hcd, &msg);
+ rt_usbh_event_signal(&msg);
}
/**
@@ -647,13 +647,12 @@ ucd_t rt_usbh_class_driver_hub(void)
*/
static void rt_usbh_hub_thread_entry(void* parameter)
{
- uhcd_t hcd = (uhcd_t)parameter;
while(1)
{
struct uhost_msg msg;
/* receive message */
- if(rt_mq_recv(hcd->usb_mq, &msg, sizeof(struct uhost_msg), RT_WAITING_FOREVER)
+ if(rt_mq_recv(usb_mq, &msg, sizeof(struct uhost_msg), RT_WAITING_FOREVER)
!= RT_EOK ) continue;
//RT_DEBUG_LOG(RT_DEBUG_USB, ("msg type %d\n", msg.type));
@@ -680,12 +679,12 @@ static void rt_usbh_hub_thread_entry(void* parameter)
*
* @return the error code, RT_EOK on successfully.
*/
-rt_err_t rt_usbh_event_signal(uhcd_t hcd, struct uhost_msg* msg)
+rt_err_t rt_usbh_event_signal(struct uhost_msg* msg)
{
RT_ASSERT(msg != RT_NULL);
/* send message to usb message queue */
- rt_mq_send(hcd->usb_mq, (void*)msg, sizeof(struct uhost_msg));
+ rt_mq_send(usb_mq, (void*)msg, sizeof(struct uhost_msg));
return RT_EOK;
}
@@ -699,17 +698,16 @@ rt_err_t rt_usbh_event_signal(uhcd_t hcd, struct uhost_msg* msg)
void rt_usbh_hub_init(uhcd_t hcd)
{
rt_thread_t thread;
- /* create root hub for hcd */
- hcd->roothub = rt_malloc(sizeof(struct uhub));
- rt_memset(hcd->roothub, 0, sizeof(struct uhub));
- hcd->roothub->is_roothub = RT_TRUE;
- hcd->roothub->hcd = hcd;
- hcd->roothub->num_ports = hcd->num_ports;
+ /* link root hub to hcd */
+ root_hub.is_roothub = RT_TRUE;
+ hcd->roothub = &root_hub;
+ root_hub.hcd = hcd;
+ root_hub.num_ports = hcd->num_ports;
/* create usb message queue */
- hcd->usb_mq = rt_mq_create(hcd->parent.parent.name, 32, 16, RT_IPC_FLAG_FIFO);
+ usb_mq = rt_mq_create("usbh", 32, 16, RT_IPC_FLAG_FIFO);
/* create usb hub thread */
- thread = rt_thread_create(hcd->parent.parent.name, rt_usbh_hub_thread_entry, hcd,
+ thread = rt_thread_create("usbh", rt_usbh_hub_thread_entry, RT_NULL,
USB_THREAD_STACK_SIZE, 8, 20);
if(thread != RT_NULL)
{
diff --git a/components/drivers/usb/usbhost/core/usbhost.c b/components/drivers/usb/usbhost/core/usbhost.c
index b9e6a7a4b1..f0294238c4 100644
--- a/components/drivers/usb/usbhost/core/usbhost.c
+++ b/components/drivers/usb/usbhost/core/usbhost.c
@@ -22,15 +22,15 @@
*
* @return none.
*/
-rt_err_t rt_usb_host_init(const char *name)
+rt_err_t rt_usb_host_init(void)
{
ucd_t drv;
rt_device_t uhc;
- uhc = rt_device_find(name);
+ uhc = rt_device_find(USB_HOST_CONTROLLER_NAME);
if(uhc == RT_NULL)
{
- rt_kprintf("can't find usb host controller %s\n", name);
+ rt_kprintf("can't find usb host controller %s\n", USB_HOST_CONTROLLER_NAME);
return -RT_ERROR;
}
@@ -45,16 +45,6 @@ rt_err_t rt_usb_host_init(const char *name)
drv = rt_usbh_class_driver_storage();
rt_usbh_class_driver_register(drv);
#endif
-#ifdef RT_USBH_HID
- /* register mass storage class driver */
- drv = rt_usbh_class_driver_hid();
- rt_usbh_class_driver_register(drv);
-#ifdef RT_USBH_HID_MOUSE
- uprotocal_t protocal;
- protocal = rt_usbh_hid_protocal_mouse();
- rt_usbh_hid_protocal_register(protocal);
-#endif
-#endif
/* register hub class driver */
drv = rt_usbh_class_driver_hub();