summaryrefslogtreecommitdiff
path: root/components/drivers
diff options
context:
space:
mode:
authorLeeChunHei <[email protected]>2021-02-02 11:28:03 +0800
committerLeeChunHei <“[email protected]”>2021-02-13 18:50:58 +0800
commitb51c6339f0f16e5780482b32d020db4f18642e0f (patch)
tree63ad8fc02445a1a9a7c7bd26745e87010eeec4f6 /components/drivers
parentfa5c8e15021e06ec9114e51da17b6aa8698b3ea9 (diff)
finish testing
Diffstat (limited to 'components/drivers')
-rwxr-xr-xcomponents/drivers/Kconfig8
-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/hub.c1
-rw-r--r--components/drivers/usb/usbhost/core/usbhost.c10
6 files changed, 118 insertions, 66 deletions
diff --git a/components/drivers/Kconfig b/components/drivers/Kconfig
index 006497519f..b0caabc73c 100755
--- a/components/drivers/Kconfig
+++ b/components/drivers/Kconfig
@@ -642,6 +642,14 @@ menu "Using USB"
string "Udisk mount dir"
default "/"
endif
+ config RT_USBH_HID
+ bool "Enable HID Drivers"
+ default n
+ if RT_USBH_HID
+ config RT_USBH_HID_MOUSE
+ bool "Enable HID mouse protocol"
+ default n
+ endif
endif
config RT_USING_USB_DEVICE
bool "Using USB device"
diff --git a/components/drivers/usb/usbhost/class/hid.c b/components/drivers/usb/usbhost/class/hid.c
index e16096877f..1abc82184f 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 uintf* intf, int duration, int report_id)
+rt_err_t rt_usbh_hid_set_idle(struct uhintf* intf, int duration, int report_id)
{
struct urequest setup;
struct uinstance* device;
@@ -40,14 +40,15 @@ rt_err_t rt_usbh_hid_set_idle(struct uintf* intf, int duration, int report_id)
setup.request_type = USB_REQ_TYPE_DIR_OUT | USB_REQ_TYPE_CLASS |
USB_REQ_TYPE_INTERFACE;
- setup.request = USB_REQ_SET_IDLE;
- setup.index = 0;
- setup.length = 0;
- setup.value = (duration << 8 )| report_id;
+ setup.bRequest = USB_REQ_SET_IDLE;
+ setup.wIndex = 0;
+ setup.wLength = 0;
+ setup.wValue = (duration << 8 )| report_id;
- if(rt_usb_hcd_control_xfer(device->hcd, device, &setup, RT_NULL, 0,
- timeout) == 0) return RT_EOK;
- else return -RT_FALSE;
+ if (rt_usb_hcd_setup_xfer(device->hcd, device->pipe_ep0_out, &setup, timeout) == 8)
+ return RT_EOK;
+ else
+ return -RT_FALSE;
}
/**
@@ -59,7 +60,7 @@ rt_err_t rt_usbh_hid_set_idle(struct uintf* intf, int duration, int report_id)
*
* @return the error code, RT_EOK on successfully.
*/
-rt_err_t rt_usbh_hid_get_report(struct uintf* intf, rt_uint8_t type,
+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)
{
struct urequest setup;
@@ -74,14 +75,24 @@ rt_err_t rt_usbh_hid_get_report(struct uintf* intf, rt_uint8_t type,
setup.request_type = USB_REQ_TYPE_DIR_IN | USB_REQ_TYPE_CLASS |
USB_REQ_TYPE_INTERFACE;
- setup.request = USB_REQ_GET_REPORT;
- setup.index = intf->intf_desc->bInterfaceNumber;
- setup.length = size;
- setup.value = (type << 8 ) + id;
+ setup.bRequest = USB_REQ_GET_REPORT;
+ setup.wIndex = intf->intf_desc->bInterfaceNumber;
+ setup.wLength = size;
+ setup.wValue = (type << 8 ) + id;
- if(rt_usb_hcd_control_xfer(device->hcd, device, &setup, buffer, size,
- timeout) == size) 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, 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;
}
/**
@@ -93,7 +104,7 @@ rt_err_t rt_usbh_hid_get_report(struct uintf* intf, rt_uint8_t type,
*
* @return the error code, RT_EOK on successfully.
*/
-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_report(struct uhintf* intf, rt_uint8_t *buffer, rt_size_t size)
{
struct urequest setup;
struct uinstance* device;
@@ -107,14 +118,15 @@ rt_err_t rt_usbh_hid_set_report(struct uintf* intf, rt_uint8_t *buffer, rt_size_
setup.request_type = USB_REQ_TYPE_DIR_OUT | USB_REQ_TYPE_CLASS |
USB_REQ_TYPE_INTERFACE;
- setup.request = USB_REQ_SET_REPORT;
- setup.index = intf->intf_desc->bInterfaceNumber;
- setup.length = size;
- setup.value = 0x02 << 8;
+ setup.bRequest = USB_REQ_SET_REPORT;
+ setup.wIndex = intf->intf_desc->bInterfaceNumber;
+ setup.wLength = size;
+ setup.wValue = 0x02 << 8;
- if(rt_usb_hcd_control_xfer(device->hcd, device, &setup, buffer, size,
- timeout) == size) return RT_EOK;
- else return -RT_FALSE;
+ if (rt_usb_hcd_setup_xfer(device->hcd, device->pipe_ep0_out, &setup, timeout) == 8)
+ return RT_EOK;
+ else
+ return -RT_FALSE;
}
/**
@@ -125,7 +137,7 @@ rt_err_t rt_usbh_hid_set_report(struct uintf* intf, rt_uint8_t *buffer, rt_size_
*
* @return the error code, RT_EOK on successfully.
*/
-rt_err_t rt_usbh_hid_set_protocal(struct uintf* intf, int protocol)
+rt_err_t rt_usbh_hid_set_protocal(struct uhintf* intf, int protocol)
{
struct urequest setup;
struct uinstance* device;
@@ -139,14 +151,15 @@ rt_err_t rt_usbh_hid_set_protocal(struct uintf* intf, int protocol)
setup.request_type = USB_REQ_TYPE_DIR_OUT | USB_REQ_TYPE_CLASS |
USB_REQ_TYPE_INTERFACE;
- setup.request = USB_REQ_SET_PROTOCOL;
- setup.index = 0;
- setup.length = 0;
- setup.value = protocol;
+ setup.bRequest = USB_REQ_SET_PROTOCOL;
+ setup.wIndex = 0;
+ setup.wLength = 0;
+ setup.wValue = protocol;
- if(rt_usb_hcd_control_xfer(device->hcd, device, &setup, RT_NULL, 0,
- timeout) == 0) return RT_EOK;
- else return -RT_FALSE;
+ if (rt_usb_hcd_setup_xfer(device->hcd, device->pipe_ep0_out, &setup, timeout) == 8)
+ return RT_EOK;
+ else
+ return -RT_FALSE;
}
/**
@@ -159,7 +172,7 @@ rt_err_t rt_usbh_hid_set_protocal(struct uintf* intf, int protocol)
*
* @return the error code, RT_EOK on successfully.
*/
-rt_err_t rt_usbh_hid_get_report_descriptor(struct uintf* intf,
+rt_err_t rt_usbh_hid_get_report_descriptor(struct uhintf* intf,
rt_uint8_t *buffer, rt_size_t size)
{
struct urequest setup;
@@ -174,14 +187,24 @@ rt_err_t rt_usbh_hid_get_report_descriptor(struct uintf* intf,
setup.request_type = USB_REQ_TYPE_DIR_IN | USB_REQ_TYPE_STANDARD|
USB_REQ_TYPE_INTERFACE;
- setup.request = USB_REQ_GET_DESCRIPTOR;
- setup.index = 0;
- setup.length = size;
- setup.value = USB_DESC_TYPE_REPORT << 8;
+ setup.bRequest = USB_REQ_GET_DESCRIPTOR;
+ setup.wIndex = 0;
+ setup.wLength = size;
+ setup.wValue = USB_DESC_TYPE_REPORT << 8;
- if(rt_usb_hcd_control_xfer(device->hcd, device, &setup, buffer, size,
- timeout) == size) 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, 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;
}
/**
@@ -220,16 +243,16 @@ static void rt_usbh_hid_callback(void* context)
RT_ASSERT(context != RT_NULL);
pipe = (upipe_t)context;
- hid = (struct uhid*)pipe->intf->user_data;
+ hid = (struct uhid*)((struct uhintf*)pipe->inst)->user_data;
/* invoke protocal callback function */
hid->protocal->callback((void*)hid);
/* parameter check */
- RT_ASSERT(pipe->intf->device->hcd != RT_NULL);
+ RT_ASSERT(((struct uhintf*)pipe->inst)->device->hcd != RT_NULL);
- rt_usb_hcd_int_xfer(pipe->intf->device->hcd, pipe, hid->buffer,
- pipe->ep.wMaxPacketSize, timeout);
+ rt_usb_hcd_pipe_xfer(((struct uhintf*)pipe->inst)->device->hcd, pipe,
+ hid->buffer, pipe->ep.wMaxPacketSize, timeout);
}
/**
@@ -268,9 +291,7 @@ static rt_err_t rt_usbh_hid_enable(void* arg)
int i = 0, pro_id;
uprotocal_t protocal;
struct uhid* hid;
- struct uintf* intf = (struct uintf*)arg;
- int timeout = USB_TIMEOUT_BASIC;
- upipe_t pipe;
+ struct uhintf* intf = (struct uhintf*)arg;
/* parameter check */
if(intf == RT_NULL)
@@ -319,19 +340,13 @@ 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, rt_usbh_hid_callback);
+ intf, ep_desc);
if(ret != RT_EOK) return ret;
}
/* initialize hid protocal */
- hid->protocal->init((void*)intf);
- pipe = hid->pipe_in;
+ hid->protocal->init((void*)intf);
- /* 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;
}
@@ -346,7 +361,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 uintf* intf = (struct uintf*)arg;
+ struct uhintf* intf = (struct uhintf*)arg;
RT_ASSERT(intf != RT_NULL);
@@ -364,9 +379,6 @@ 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 8e446c8cea..04c67aa42b 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 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_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_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 e769475a98..7f50c0451f 100644
--- a/components/drivers/usb/usbhost/class/umouse.c
+++ b/components/drivers/usb/usbhost/class/umouse.c
@@ -126,15 +126,36 @@ 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 uintf* intf = (struct uintf*)arg;
+ struct uhintf* intf = (struct uhintf*)arg;
RT_ASSERT(intf != RT_NULL);
rt_usbh_hid_set_protocal(intf, 0);
- rt_usbh_hid_set_idle(intf, 10, 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_DEBUG_LOG(RT_DEBUG_USB, ("start usb mouse\n"));
#ifdef RT_USING_RTGUI
diff --git a/components/drivers/usb/usbhost/core/hub.c b/components/drivers/usb/usbhost/core/hub.c
index 2a9fc20111..c0e025ba7e 100644
--- a/components/drivers/usb/usbhost/core/hub.c
+++ b/components/drivers/usb/usbhost/core/hub.c
@@ -701,6 +701,7 @@ 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;
diff --git a/components/drivers/usb/usbhost/core/usbhost.c b/components/drivers/usb/usbhost/core/usbhost.c
index b4caad710c..b9e6a7a4b1 100644
--- a/components/drivers/usb/usbhost/core/usbhost.c
+++ b/components/drivers/usb/usbhost/core/usbhost.c
@@ -45,6 +45,16 @@ 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();