diff options
| author | sakumisu <[email protected]> | 2024-06-02 11:20:13 +0800 |
|---|---|---|
| committer | GitHub <[email protected]> | 2024-06-02 11:20:13 +0800 |
| commit | 62d321caa028dee04bf0b43fc0abb68b40e80ddd (patch) | |
| tree | 31fa88156af25b434a194398154dc8027d6b413d /components/drivers/usb/usbhost/class | |
| parent | 658813213e5ad1dc81739746f6001099c6cc9e41 (diff) | |
refactor(drivers/usb):replace rtt usb stack with cherryusb (#8799)
Diffstat (limited to 'components/drivers/usb/usbhost/class')
| -rw-r--r-- | components/drivers/usb/usbhost/class/adk.c | 426 | ||||
| -rw-r--r-- | components/drivers/usb/usbhost/class/adk.h | 43 | ||||
| -rw-r--r-- | components/drivers/usb/usbhost/class/hid.c | 410 | ||||
| -rw-r--r-- | components/drivers/usb/usbhost/class/hid.h | 41 | ||||
| -rw-r--r-- | components/drivers/usb/usbhost/class/mass.c | 647 | ||||
| -rw-r--r-- | components/drivers/usb/usbhost/class/mass.h | 50 | ||||
| -rw-r--r-- | components/drivers/usb/usbhost/class/udisk.c | 456 | ||||
| -rw-r--r-- | components/drivers/usb/usbhost/class/ukbd.c | 93 | ||||
| -rw-r--r-- | components/drivers/usb/usbhost/class/umouse.c | 190 |
9 files changed, 0 insertions, 2356 deletions
diff --git a/components/drivers/usb/usbhost/class/adk.c b/components/drivers/usb/usbhost/class/adk.c deleted file mode 100644 index 4c51fa8692..0000000000 --- a/components/drivers/usb/usbhost/class/adk.c +++ /dev/null @@ -1,426 +0,0 @@ -/* - * Copyright (c) 2006-2023, RT-Thread Development Team - * - * SPDX-License-Identifier: Apache-2.0 - * - * Change Logs: - * Date Author Notes - * 2011-12-12 Yi Qiu first version - */ - -#include <rtthread.h> -#include <drivers/usb_host.h> -#include "adk.h" - -#ifdef RT_USBH_ADK - -#define DBG_TAG "usbhost.adk" -#define DBG_LVL DBG_INFO -#include <rtdbg.h> - -static struct uclass_driver adk_driver; -static const char* _adk_manufacturer = RT_NULL; -static const char* _adk_model = RT_NULL; -static const char* _adk_description = RT_NULL; -static const char* _adk_version = RT_NULL; -static const char* _adk_uri = RT_NULL; -static const char* _adk_serial = RT_NULL; - -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) -{ - _adk_manufacturer = manufacturer; - _adk_model = model; - _adk_description = description; - _adk_version = _version; - _adk_uri = uri; - _adk_serial = serial; - - return RT_EOK; -} - -#ifdef RT_USING_MODULE -#include <rtm.h> - -RTM_EXPORT(rt_usbh_adk_set_string); -#endif - -/** - * This function will do USB_REQ_GET_PROTOCOL request to set idle period to the usb adk device - * - * @param intf the interface instance. - * @duration the idle period of requesting data. - * @report_id the report id - * - * @return the error code, RT_EOK on successfully. -*/ -static rt_err_t rt_usbh_adk_get_protocol(struct uintf* intf, rt_uint16_t *protocol) -{ - struct urequest setup; - uinst_t device; - int timeout = USB_TIMEOUT_BASIC; - - /* parameter check */ - RT_ASSERT(intf != RT_NULL); - RT_ASSERT(intf->device != RT_NULL); - - device = intf->device; - - setup.request_type = USB_REQ_TYPE_DIR_IN | USB_REQ_TYPE_VENDOR | - USB_REQ_TYPE_DEVICE; - setup.request = USB_REQ_GET_PROTOCOL; - setup.index = 0; - setup.length = 2; - setup.value = 0; - - if(rt_usb_hcd_control_xfer(device->hcd, device, &setup, (void*)protocol, 2, - timeout) == 0) return RT_EOK; - else return -RT_FALSE; -} - -/** - * This function will do USB_REQ_SEND_STRING request to set idle period to the usb adk device - * - * @param intf the interface instance. - * @duration the idle period of requesting data. - * @report_id the report id - * - * @return the error code, RT_EOK on successfully. -*/ -static rt_err_t rt_usbh_adk_send_string(struct uintf* intf, rt_uint16_t index, - const char* str) -{ - struct urequest setup; - uinst_t device; - int timeout = USB_TIMEOUT_BASIC; - - /* parameter check */ - RT_ASSERT(intf != RT_NULL); - RT_ASSERT(intf->device != RT_NULL); - - device = intf->device; - - setup.request_type = USB_REQ_TYPE_DIR_OUT | USB_REQ_TYPE_VENDOR | - USB_REQ_TYPE_DEVICE; - setup.request = USB_REQ_SEND_STRING; - setup.index = index; - setup.length = rt_strlen(str) + 1; - setup.value = 0; - - if(rt_usb_hcd_control_xfer(device->hcd, device, &setup, (void*)str, - rt_strlen(str) + 1, timeout) == 0) return RT_EOK; - else return -RT_FALSE; -} - -/** - * This function will do USB_REQ_START request to set idle period to the usb adk device - * - * @param intf the interface instance. - * @duration the idle period of requesting data. - * @report_id the report id - * - * @return the error code, RT_EOK on successfully. -*/ -static rt_err_t rt_usbh_adk_start(struct uintf* intf) -{ - struct urequest setup; - uinst_t device; - int timeout = USB_TIMEOUT_BASIC; - - /* parameter check */ - RT_ASSERT(intf != RT_NULL); - RT_ASSERT(intf->device != RT_NULL); - - device = intf->device; - - setup.request_type = USB_REQ_TYPE_DIR_OUT | USB_REQ_TYPE_VENDOR | - USB_REQ_TYPE_DEVICE; - setup.request = USB_REQ_START; - setup.index = 0; - setup.length = 0; - setup.value = 0; - - if(rt_usb_hcd_control_xfer(device->hcd, device, &setup, RT_NULL, 0, - timeout) == 0) return RT_EOK; - else return -RT_FALSE; -} - -/** - * This function will read data from usb adk device - * - * @param intf the interface instance. - * - * @return the error code, RT_EOK on successfully. -*/ -static rt_ssize_t rt_usbh_adk_read(rt_device_t device, rt_off_t pos, void* buffer, - rt_size_t size) -{ - uadk_t adk; - rt_size_t length; - struct uintf* intf; - - /* check parameter */ - RT_ASSERT(device != RT_NULL); - RT_ASSERT(buffer != RT_NULL); - - intf = (struct uintf*)device->user_data; - adk = (uadk_t)intf->user_data; - - length = rt_usb_hcd_bulk_xfer(intf->device->hcd, adk->pipe_in, - buffer, size, 300); - - return length; - -} - -/** - * This function will write data to usb adk device - * - * @param intf the interface instance. - * - * @return the error code, RT_EOK on successfully. -*/ -static rt_ssize_t rt_usbh_adk_write (rt_device_t device, rt_off_t pos, const void* buffer, - rt_size_t size) -{ - uadk_t adk; - rt_size_t length; - struct uintf* intf; - - RT_ASSERT(buffer != RT_NULL); - - intf = (struct uintf*)device->user_data; - adk = (uadk_t)intf->user_data; - - length = rt_usb_hcd_bulk_xfer(intf->device->hcd, adk->pipe_out, - (void*)buffer, size, 300); - - return length; -} - -#ifdef RT_USING_DEVICE_OPS -const static struct rt_device_ops adk_device_ops = -{ - RT_NULL; - RT_NULL; - RT_NULL; - rt_usbh_adk_read; - rt_usbh_adk_write; - RT_NULL; -}; -#endif - -/** - * This function will run adk class driver when usb device is detected and identified - * as a adk class device, it will continue the enumulate process. - * - * @param arg the argument. - * - * @return the error code, RT_EOK on successfully. - */ -static rt_err_t rt_usbh_adk_enable(void* arg) -{ - int i = 0; - uadk_t adk; - struct uintf* intf = (struct uintf*)arg; - udev_desc_t dev_desc; - rt_uint16_t protocol; - rt_err_t ret; - - /* parameter check */ - if(intf == RT_NULL) - { - rt_kprintf("the interface is not available\n"); - return -RT_EIO; - } - - LOG_D("rt_usbh_adk_run"); - - dev_desc = &intf->device->dev_desc; - if(dev_desc->idVendor == USB_ACCESSORY_VENDOR_ID && - (dev_desc->idProduct == USB_ACCESSORY_PRODUCT_ID || - dev_desc->idProduct == USB_ACCESSORY_ADB_PRODUCT_ID)) - { - if(intf->intf_desc->bInterfaceSubClass != 0xFF) return -RT_ERROR; - - LOG_D("found android accessory device"); - } - else - { - LOG_D("switch device"); - - if((ret = rt_usbh_adk_get_protocol(intf, &protocol)) != RT_EOK) - { - rt_kprintf("rt_usbh_adk_get_protocol failed\n"); - return ret; - } - - if(protocol != 1) - { - rt_kprintf("read protocol failed\n"); - return -RT_ERROR; - } - - rt_usbh_adk_send_string(intf, - ACCESSORY_STRING_MANUFACTURER, _adk_manufacturer); - rt_usbh_adk_send_string(intf, - ACCESSORY_STRING_MODEL, _adk_model); - rt_usbh_adk_send_string(intf, - ACCESSORY_STRING_DESCRIPTION, _adk_description); - rt_usbh_adk_send_string(intf, - ACCESSORY_STRING_VERSION, _adk_version); - rt_usbh_adk_send_string(intf, - ACCESSORY_STRING_URI, _adk_uri); - rt_usbh_adk_send_string(intf, - ACCESSORY_STRING_SERIAL, _adk_serial); - - LOG_D("manufacturer %s", _adk_manufacturer); - LOG_D("model %s", _adk_model); - LOG_D("description %s", _adk_description); - LOG_D("version %s", _adk_version); - LOG_D("uri %s", _adk_uri); - LOG_D("serial %s", _adk_serial); - - if((ret = rt_usbh_adk_start(intf)) != RT_EOK) - { - rt_kprintf("rt_usbh_adk_start failed\n"); - return ret; - } - - return RT_EOK; - } - - adk = rt_malloc(sizeof(struct uadkinst)); - RT_ASSERT(adk != RT_NULL); - - /* initilize the data structure */ - rt_memset(adk, 0, sizeof(struct uadkinst)); - intf->user_data = (void*)adk; - - for(i=0; i<intf->intf_desc->bNumEndpoints; i++) - { - uep_desc_t ep_desc; - - /* get endpoint descriptor from interface descriptor */ - rt_usbh_get_endpoint_descriptor(intf->intf_desc, i, &ep_desc); - if(ep_desc == RT_NULL) - { - rt_kprintf("rt_usb_get_endpoint_descriptor error\n"); - return -RT_ERROR; - } - - /* the endpoint type of adk class should be BULK */ - if((ep_desc->bmAttributes & USB_EP_ATTR_TYPE_MASK) != USB_EP_ATTR_BULK) - continue; - - /* allocate pipes according to the endpoint type */ - if(ep_desc->bEndpointAddress & USB_DIR_IN) - { - /* allocate an in pipe for the adk instance */ - ret = rt_usb_hcd_alloc_pipe(intf->device->hcd, &adk->pipe_in, - intf, ep_desc, RT_NULL); - if(ret != RT_EOK) return ret; - } - else - { - /* allocate an output pipe for the adk instance */ - ret = rt_usb_hcd_alloc_pipe(intf->device->hcd, &adk->pipe_out, - intf, ep_desc, RT_NULL); - if(ret != RT_EOK) return ret; - } - } - - /* check pipes infomation */ - if(adk->pipe_in == RT_NULL || adk->pipe_out == RT_NULL) - { - rt_kprintf("pipe error, unsupported device\n"); - return -RT_ERROR; - } - - /* set configuration */ - ret = rt_usbh_set_configure(intf->device, 1); - if(ret != RT_EOK) return ret; - - /* register adk device */ - adk->device.type = RT_Device_Class_Char; -#ifdef RT_USING_DEVICE_OPS - adk->device.ops = &adk_device_ops; -#else - adk->device.init = RT_NULL; - adk->device.open = RT_NULL; - adk->device.close = RT_NULL; - adk->device.read = rt_usbh_adk_read; - adk->device.write = rt_usbh_adk_write; - adk->device.control = RT_NULL; -#endif - adk->device.user_data = (void*)intf; - - rt_device_register(&adk->device, "adkdev", RT_DEVICE_FLAG_RDWR); - - return RT_EOK; -} - -/** - * This function will be invoked when usb device plug out is detected and it would clean - * and release all hub class related resources. - * - * @param arg the argument. - * - * @return the error code, RT_EOK on successfully. - */ -static rt_err_t rt_usbh_adk_disable(void* arg) -{ - uadk_t adk; - struct uintf* intf = (struct uintf*)arg; - - RT_ASSERT(intf != RT_NULL); - - LOG_D("rt_usbh_adk_stop"); - - adk = (uadk_t)intf->user_data; - if(adk == RT_NULL) - { - rt_free(intf); - return RT_EOK; - } - - if(adk->pipe_in != RT_NULL) - rt_usb_hcd_free_pipe(intf->device->hcd, adk->pipe_in); - - if(adk->pipe_out != RT_NULL) - rt_usb_hcd_free_pipe(intf->device->hcd, adk->pipe_out); - - /* unregister adk device */ - rt_device_unregister(&adk->device); - - /* free adk instance */ - if(adk != RT_NULL) - { - rt_free(adk); - } - - /* free interface instance */ - rt_free(intf); - - return RT_EOK; -} - -/** - * This function will register adk class driver to the usb class driver manager. - * and it should be invoked in the usb system initialization. - * - * @return the error code, RT_EOK on successfully. - */ -ucd_t rt_usbh_class_driver_adk(void) -{ - adk_driver.class_code = USB_CLASS_ADK; - - adk_driver.enable = rt_usbh_adk_enable; - adk_driver.disable = rt_usbh_adk_disable; - - return &adk_driver; -} - -#endif - diff --git a/components/drivers/usb/usbhost/class/adk.h b/components/drivers/usb/usbhost/class/adk.h deleted file mode 100644 index 67c3392d7a..0000000000 --- a/components/drivers/usb/usbhost/class/adk.h +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Copyright (c) 2006-2023, RT-Thread Development Team - * - * SPDX-License-Identifier: Apache-2.0 - * - * Change Logs: - * Date Author Notes - * 2011-12-12 Yi Qiu first version - */ - -#ifndef __ADK_H__ -#define __ADK_H__ - -#include <rtthread.h> - -struct uadkinst -{ - upipe_t pipe_in; - upipe_t pipe_out; - - struct rt_device device; -}; -typedef struct uadkinst* uadk_t; - -#define USB_ACCESSORY_VENDOR_ID 0x18D1 -#define USB_ACCESSORY_PRODUCT_ID 0x2D00 -#define USB_ACCESSORY_ADB_PRODUCT_ID 0x2D01 - -#define ACCESSORY_STRING_MANUFACTURER 0 -#define ACCESSORY_STRING_MODEL 1 -#define ACCESSORY_STRING_DESCRIPTION 2 -#define ACCESSORY_STRING_VERSION 3 -#define ACCESSORY_STRING_URI 4 -#define ACCESSORY_STRING_SERIAL 5 - -#define USB_REQ_GET_PROTOCOL 51 -#define USB_REQ_SEND_STRING 52 -#define USB_REQ_START 53 - -#define USB_CLASS_ADK 0xff - -#endif - diff --git a/components/drivers/usb/usbhost/class/hid.c b/components/drivers/usb/usbhost/class/hid.c deleted file mode 100644 index 5911faf1aa..0000000000 --- a/components/drivers/usb/usbhost/class/hid.c +++ /dev/null @@ -1,410 +0,0 @@ -/* - * Copyright (c) 2006-2023, RT-Thread Development Team - * - * SPDX-License-Identifier: Apache-2.0 - * - * Change Logs: - * Date Author Notes - * 2011-12-12 Yi Qiu first version - * 2021-02-23 Leslie Lee update with current usb api - */ - -#include <rtthread.h> -#include <drivers/usb_host.h> -#include "hid.h" - -#ifdef RT_USBH_HID - -#define DBG_TAG "usbhost.hid" -#define DBG_LVL DBG_INFO -#include <rtdbg.h> - -static struct uclass_driver hid_driver; -static rt_list_t _protocal_list; - -/** - * This function will do USB_REQ_SET_IDLE request to set idle period to the usb hid device - * - * @param intf the interface instance. - * @duration the idle period of requesting data. - * @report_id the report id - * - * @return the error code, RT_EOK on successfully. -*/ -rt_err_t rt_usbh_hid_set_idle(struct uhintf* intf, int duration, int report_id) -{ - struct urequest setup; - struct uinstance* device; - int timeout = USB_TIMEOUT_BASIC; - - /* parameter check */ - RT_ASSERT(intf != RT_NULL); - RT_ASSERT(intf->device != RT_NULL); - - device = intf->device; - - 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; - - 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, RT_NULL, 0, timeout) == 0) - return RT_EOK; - - return -RT_FALSE; -} - -/** - * This function will do USB_REQ_GET_REPORT request to get report from the usb hid device - * - * @param intf the interface instance. - * @buffer the data buffer to save usb report descriptor. - * @param nbytes the size of buffer - * - * @return the error code, RT_EOK on successfully. -*/ -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; - struct uinstance* device; - int timeout = USB_TIMEOUT_BASIC; - - /* parameter check */ - RT_ASSERT(intf != RT_NULL); - RT_ASSERT(intf->device != RT_NULL); - - device = intf->device; - - 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; - - 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; -} - -/** - * This function will do USB_REQ_SET_REPORT request to set report to the usb hid device - * - * @param intf the interface instance. - * @buffer the data buffer to save usb report descriptor. - * @param nbytes the size of buffer - * - * @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) -{ - struct urequest setup; - struct uinstance* device; - int timeout = USB_TIMEOUT_BASIC; - - /* parameter check */ - RT_ASSERT(intf != RT_NULL); - RT_ASSERT(intf->device != RT_NULL); - - device = intf->device; - - 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; - - if (rt_usb_hcd_setup_xfer(device->hcd, device->pipe_ep0_out, &setup, timeout) == 8) - return RT_EOK; - else - return -RT_FALSE; -} - -/** - * This function will do USB_REQ_SET_PROTOCOL request to set protocal to the usb hid device. - * - * @param intf the interface instance. - * @param protocol the protocol id. - * - * @return the error code, RT_EOK on successfully. - */ -rt_err_t rt_usbh_hid_set_protocal(struct uhintf* intf, int protocol) -{ - struct urequest setup; - struct uinstance* device; - int timeout = USB_TIMEOUT_BASIC; - - /* parameter check */ - RT_ASSERT(intf != RT_NULL); - RT_ASSERT(intf->device != RT_NULL); - - device = intf->device; - - 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; - - if (rt_usb_hcd_setup_xfer(device->hcd, device->pipe_ep0_out, &setup, timeout) == 8) - return RT_EOK; - else - return -RT_FALSE; -} - -/** - * This function will do USB_REQ_GET_DESCRIPTOR request for the device instance - * to set feature of the hub port. - * - * @param intf the interface instance. - * @buffer the data buffer to save usb report descriptor. - * @param nbytes the size of buffer - * - * @return the error code, RT_EOK on successfully. - */ -rt_err_t rt_usbh_hid_get_report_descriptor(struct uhintf* intf, - rt_uint8_t *buffer, rt_size_t size) -{ - struct urequest setup; - struct uinstance* device; - int timeout = USB_TIMEOUT_BASIC; - - /* parameter check */ - RT_ASSERT(intf != RT_NULL); - RT_ASSERT(intf->device != RT_NULL); - - device = intf->device; - - 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; - - 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; -} - -/** - * This function will register specified hid protocal to protocal list - * - * @param protocal the specified protocal. - * - * @return the error code, RT_EOK on successfully. - */ -rt_err_t rt_usbh_hid_protocal_register(uprotocal_t protocal) -{ - RT_ASSERT(protocal != RT_NULL); - - if (protocal == RT_NULL) return -RT_ERROR; - - /* insert class driver into driver list */ - rt_list_insert_after(&_protocal_list, &(protocal->list)); - - return RT_EOK; -} - -/** - * This function is the callback function of hid's int endpoint, it is invoked when data comes. - * - * @param context the context of the callback function. - * - * @return none. - */ -static void rt_usbh_hid_callback(void* context) -{ - upipe_t pipe; - struct uhid* hid; - int timeout = USB_TIMEOUT_LONG; - - /* parameter check */ - RT_ASSERT(context != RT_NULL); - - pipe = (upipe_t)context; - hid = (struct uhid*)((struct uhintf*)pipe->inst)->user_data; - - /* invoke protocal callback function */ - hid->protocal->callback((void*)hid); - - /* parameter check */ - RT_ASSERT(((struct uhintf*)pipe->inst)->device->hcd != RT_NULL); - - rt_usb_hcd_pipe_xfer(((struct uhintf*)pipe->inst)->device->hcd, pipe, - hid->buffer, pipe->ep.wMaxPacketSize, timeout); -} - -/** - * This function will find specified hid protocal from protocal list - * - * @param pro_id the protocal id. - * - * @return the found protocal or RT_NULL if there is no this protocal. - */ -static uprotocal_t rt_usbh_hid_protocal_find(int pro_id) -{ - struct rt_list_node *node; - - /* try to find protocal object */ - for (node = _protocal_list.next; node != &_protocal_list; node = node->next) - { - uprotocal_t protocal = - (uprotocal_t)rt_list_entry(node, struct uprotocal, list); - if (protocal->pro_id == pro_id) return protocal; - } - - /* not found */ - return RT_NULL; -} - -/** - * This function will run hid class driver when usb device is detected and identified - * as a hid class device, it will continue the enumulate process. - * - * @param arg the argument. - * - * @return the error code, RT_EOK on successfully. - */ -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; - - /* parameter check */ - if(intf == RT_NULL) - { - rt_kprintf("the interface is not available\n"); - return -RT_EIO; - } - - pro_id = intf->intf_desc->bInterfaceProtocol; - - LOG_D("HID device enable, protocal id %d", pro_id); - - protocal = rt_usbh_hid_protocal_find(pro_id); - if(protocal == RT_NULL) - { - rt_kprintf("can't find hid protocal %d\n", pro_id); - intf->user_data = RT_NULL; - return -RT_ERROR; - } - - hid = rt_malloc(sizeof(struct uhid)); - RT_ASSERT(hid != RT_NULL); - - /* initilize the data structure */ - rt_memset(hid, 0, sizeof(struct uhid)); - intf->user_data = (void*)hid; - hid->protocal = protocal; - - for(i=0; i<intf->intf_desc->bNumEndpoints; i++) - { - rt_err_t ret; - uep_desc_t ep_desc; - - /* get endpoint descriptor */ - rt_usbh_get_endpoint_descriptor(intf->intf_desc, i, &ep_desc); - if(ep_desc == RT_NULL) - { - rt_kprintf("rt_usbh_get_endpoint_descriptor error\n"); - return -RT_ERROR; - } - - if(USB_EP_ATTR(ep_desc->bmAttributes) != USB_EP_ATTR_INT) - continue; - - if(!(ep_desc->bEndpointAddress & USB_DIR_IN)) continue; - - ret = rt_usb_hcd_alloc_pipe(intf->device->hcd, &hid->pipe_in, - intf->device, ep_desc); - if(ret != RT_EOK) return ret; - } - - /* initialize hid protocal */ - hid->protocal->init((void*)intf); - - return RT_EOK; -} - -/** - * This function will be invoked when usb device plug out is detected and it would clean - * and release all hub class related resources. - * - * @param arg the argument. - * - * @return the error code, RT_EOK on successfully. - */ -static rt_err_t rt_usbh_hid_disable(void* arg) -{ - struct uhid* hid; - struct uhintf* intf = (struct uhintf*)arg; - - RT_ASSERT(intf != RT_NULL); - - LOG_D("rt_usbh_hid_disable"); - - hid = (struct uhid*)intf->user_data; - if(hid != RT_NULL) - { - if(hid->pipe_in != RT_NULL) - { - /* free the HID in pipe */ - rt_usb_hcd_free_pipe(intf->device->hcd, hid->pipe_in); - } - - /* free the hid instance */ - rt_free(hid); - } - - return RT_EOK; -} - -/** - * This function will register hid class driver to the usb class driver manager. - * and it should be invoked in the usb system initialization. - * - * @return the error code, RT_EOK on successfully. - */ -ucd_t rt_usbh_class_driver_hid(void) -{ - rt_list_init(&_protocal_list); - - hid_driver.class_code = USB_CLASS_HID; - - hid_driver.enable = rt_usbh_hid_enable; - hid_driver.disable = rt_usbh_hid_disable; - - return &hid_driver; -} - -#endif - diff --git a/components/drivers/usb/usbhost/class/hid.h b/components/drivers/usb/usbhost/class/hid.h deleted file mode 100644 index c7e88b66b8..0000000000 --- a/components/drivers/usb/usbhost/class/hid.h +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright (c) 2006-2023, RT-Thread Development Team - * - * SPDX-License-Identifier: Apache-2.0 - * - * Change Logs: - * Date Author Notes - * 2011-12-12 Yi Qiu first version - */ - -#ifndef __HID_H__ -#define __HID_H__ - -#include <rtthread.h> - -struct uhid -{ - upipe_t pipe_in; - rt_uint8_t buffer[8]; - uprotocal_t protocal; -}; -typedef struct uhid uhid_t; - -#define USB_REQ_GET_REPORT 0x01 -#define USB_REQ_GET_IDLE 0x02 -#define USB_REQ_GET_PROTOCOL 0x03 -#define USB_REQ_SET_REPORT 0x09 -#define USB_REQ_SET_IDLE 0x0a -#define USB_REQ_SET_PROTOCOL 0x0b - -#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_protocal_register(uprotocal_t protocal); - -#endif diff --git a/components/drivers/usb/usbhost/class/mass.c b/components/drivers/usb/usbhost/class/mass.c deleted file mode 100644 index c29cd30ee4..0000000000 --- a/components/drivers/usb/usbhost/class/mass.c +++ /dev/null @@ -1,647 +0,0 @@ -/* - * Copyright (c) 2006-2023, RT-Thread Development Team - * - * SPDX-License-Identifier: Apache-2.0 - * - * Change Logs: - * Date Author Notes - * 2011-12-12 Yi Qiu first version - */ - -#include <rtthread.h> -#include <drivers/usb_host.h> -#include "mass.h" - -#ifdef RT_USBH_MSTORAGE - -#define DBG_TAG "usbhost.mass" -#define DBG_LVL DBG_INFO -#include <rtdbg.h> - -extern rt_err_t rt_udisk_run(struct uhintf* intf); -extern rt_err_t rt_udisk_stop(struct uhintf* intf); - -static struct uclass_driver storage_driver; - -/** - * This function will do USBREQ_GET_MAX_LUN request for the usb interface instance. - * - * @param intf the interface instance. - * @param max_lun the buffer to save max_lun. - * - * @return the error code, RT_EOK on successfully. - */ -static rt_err_t _pipe_check(struct uhintf* intf, upipe_t pipe) -{ - struct uinstance* device; - rt_err_t ret; - ustor_t stor; - int size = 0; - struct ustorage_csw csw; - - if(intf == RT_NULL || pipe == RT_NULL) - { - rt_kprintf("the interface is not available\n"); - return -RT_EIO; - } - - /* get usb device instance from the interface instance */ - device = intf->device; - - /* get storage instance from the interface instance */ - stor = (ustor_t)intf->user_data; - - /* check pipe status */ - if(pipe->status == UPIPE_STATUS_OK) return RT_EOK; - - if(pipe->status == UPIPE_STATUS_ERROR) - { - rt_kprintf("pipe status error\n"); - return -RT_EIO; - } - if(pipe->status == UPIPE_STATUS_STALL) - { - /* clear the pipe stall status */ - ret = rt_usbh_clear_feature(device, pipe->ep.bEndpointAddress, - USB_FEATURE_ENDPOINT_HALT); - if(ret != RT_EOK) return ret; - } - - - rt_thread_delay(50); - - rt_kprintf("pipes1 0x%x, 0x%x\n", stor->pipe_in, stor->pipe_out); - - stor->pipe_in->status = UPIPE_STATUS_OK; - - LOG_D("clean storage in pipe stall"); - - /* it should receive csw after clear the stall feature */ - size = rt_usb_hcd_pipe_xfer(stor->pipe_in->inst->hcd, - stor->pipe_in, &csw, SIZEOF_CSW, 100); - if(size != SIZEOF_CSW) - { - rt_kprintf("receive the csw after stall failed\n"); - return -RT_EIO; - } - - return -RT_ERROR; -} - -/** - * This function will do USBREQ_GET_MAX_LUN request for the usb interface instance. - * - * @param intf the interface instance. - * @param max_lun the buffer to save max_lun. - * - * @return the error code, RT_EOK on successfully. - */ -static rt_err_t rt_usb_bulk_only_xfer(struct uhintf* intf, - ustorage_cbw_t cmd, rt_uint8_t* buffer, int timeout) -{ - rt_size_t size; - rt_err_t ret; - upipe_t pipe; - struct ustorage_csw csw; - ustor_t stor; - - RT_ASSERT(cmd != RT_NULL); - - if(intf == RT_NULL) - { - rt_kprintf("the interface is not available\n"); - return -RT_EIO; - } - - /* get storage instance from the interface instance */ - stor = (ustor_t)intf->user_data; - - do - { - /* send the cbw */ - size = rt_usb_hcd_pipe_xfer(stor->pipe_out->inst->hcd, stor->pipe_out, - cmd, SIZEOF_CBW, timeout); - if(size != SIZEOF_CBW) - { - rt_kprintf("CBW size error\n"); - return -RT_EIO; - } - if(cmd->xfer_len != 0) - { - pipe = (cmd->dflags == CBWFLAGS_DIR_IN) ? stor->pipe_in : - stor->pipe_out; - size = rt_usb_hcd_pipe_xfer(pipe->inst->hcd, pipe, (void*)buffer, - cmd->xfer_len, timeout); - if(size != cmd->xfer_len) - { - rt_kprintf("request size %d, transfer size %d\n", - cmd->xfer_len, size); - break; - } - } - - /* receive the csw */ - size = rt_usb_hcd_pipe_xfer(stor->pipe_in->inst->hcd, stor->pipe_in, - &csw, SIZEOF_CSW, timeout); - if(size != SIZEOF_CSW) - { - rt_kprintf("csw size error\n"); - return -RT_EIO; - } - }while(0); - - /* check in pipes status */ - ret = _pipe_check(intf, stor->pipe_in); - if(ret != RT_EOK) - { - rt_kprintf("in pipe error\n"); - return ret; - } - - /* check out pipes status */ - ret = _pipe_check(intf, stor->pipe_out); - if(ret != RT_EOK) - { - rt_kprintf("out pipe error\n"); - return ret; - } - - /* check csw status */ - if(csw.signature != CSW_SIGNATURE || csw.tag != CBW_TAG_VALUE) - { - rt_kprintf("csw signature error\n"); - return -RT_EIO; - } - - if(csw.status != 0) - { - //rt_kprintf("csw status error:%d\n",csw.status); - return -RT_ERROR; - } - - return RT_EOK; -} - -/** - * This function will do USBREQ_GET_MAX_LUN request for the usb interface instance. - * - * @param intf the interface instance. - * @param max_lun the buffer to save max_lun. - * - * @return the error code, RT_EOK on successfully. - */ -rt_err_t rt_usbh_storage_get_max_lun(struct uhintf* intf, rt_uint8_t* max_lun) -{ - struct uinstance* device; - struct urequest setup; - int timeout = USB_TIMEOUT_BASIC; - - if(intf == RT_NULL) - { - rt_kprintf("the interface is not available\n"); - return -RT_EIO; - } - - /* parameter check */ - RT_ASSERT(intf->device != RT_NULL); - LOG_D("rt_usbh_storage_get_max_lun"); - - /* get usb device instance from the interface instance */ - device = intf->device; - - /* construct the request */ - setup.request_type = USB_REQ_TYPE_DIR_IN | USB_REQ_TYPE_CLASS | - USB_REQ_TYPE_INTERFACE; - setup.bRequest = USBREQ_GET_MAX_LUN; - setup.wValue = intf->intf_desc->bInterfaceNumber; - setup.wIndex = 0; - setup.wLength = 1; - - /* do control transfer request */ - if(rt_usb_hcd_setup_xfer(device->hcd, device->pipe_ep0_out, &setup, timeout) != 8) - { - return -RT_EIO; - } - if(rt_usb_hcd_pipe_xfer(device->hcd, device->pipe_ep0_in, max_lun, 1, timeout) != 1) - { - return -RT_EIO; - } - if(rt_usb_hcd_pipe_xfer(device->hcd, device->pipe_ep0_out, RT_NULL, 0, timeout) != 0) - { - return -RT_EIO; - } - return RT_EOK; -} - -/** - * This function will do USBREQ_MASS_STORAGE_RESET request for the usb interface instance. - * - * @param intf the interface instance. - * - * @return the error code, RT_EOK on successfully. - */ -rt_err_t rt_usbh_storage_reset(struct uhintf* intf) -{ - struct urequest setup; - struct uinstance* device; - int timeout = USB_TIMEOUT_BASIC; - - /* parameter check */ - if(intf == RT_NULL) - { - rt_kprintf("the interface is not available\n"); - return -RT_EIO; - } - - RT_ASSERT(intf->device != RT_NULL); - LOG_D("rt_usbh_storage_reset"); - - /* get usb device instance from the interface instance */ - device = intf->device; - - /* construct the request */ - setup.request_type = USB_REQ_TYPE_DIR_OUT | USB_REQ_TYPE_CLASS | - USB_REQ_TYPE_INTERFACE; - setup.bRequest = USBREQ_MASS_STORAGE_RESET; - setup.wIndex = intf->intf_desc->bInterfaceNumber; - setup.wLength = 0; - setup.wValue = 0; - - if(rt_usb_hcd_setup_xfer(device->hcd, device->pipe_ep0_out, &setup, timeout) != 8) - { - return -RT_EIO; - } - if(rt_usb_hcd_pipe_xfer(device->hcd, device->pipe_ep0_in, RT_NULL, 0, timeout) != 0) - { - return -RT_EIO; - } - return RT_EOK; -} - -/** - * This function will execute SCSI_READ_10 command to read data from the usb device. - * - * @param intf the interface instance. - * @param buffer the data buffer to save read data - * @param sector the start sector address to read. - * @param sector the sector count to read. - * - * @return the error code, RT_EOK on successfully. - */ -rt_err_t rt_usbh_storage_read10(struct uhintf* intf, rt_uint8_t *buffer, - rt_uint32_t sector, rt_size_t count, int timeout) -{ - struct ustorage_cbw cmd; - - /* parameter check */ - if(intf == RT_NULL) - { - rt_kprintf("interface is not available\n"); - return -RT_EIO; - } - - RT_ASSERT(intf->device != RT_NULL); - LOG_D("rt_usbh_storage_read10"); - - /* construct the command block wrapper */ - rt_memset(&cmd, 0, sizeof(struct ustorage_cbw)); - cmd.signature = CBW_SIGNATURE; - cmd.tag = CBW_TAG_VALUE; - cmd.xfer_len = SECTOR_SIZE * count; - cmd.dflags = CBWFLAGS_DIR_IN; - cmd.lun = 0; - cmd.cb_len = 10; - cmd.cb[0] = SCSI_READ_10; - cmd.cb[1] = 0; - cmd.cb[2] = (rt_uint8_t)(sector >> 24); - cmd.cb[3] = (rt_uint8_t)(sector >> 16); - cmd.cb[4] = (rt_uint8_t)(sector >> 8); - cmd.cb[5] = (rt_uint8_t)sector; - cmd.cb[6] = 0; - cmd.cb[7] = (count & 0xff00) >> 8; - cmd.cb[8] = (rt_uint8_t) count & 0xff; - - return rt_usb_bulk_only_xfer(intf, &cmd, buffer, timeout); -} - -/** - * This function will execute SCSI_WRITE_10 command to write data to the usb device. - * - * @param intf the interface instance. - * @param buffer the data buffer to save write data - * @param sector the start sector address to write. - * @param sector the sector count to write. - * - * @return the error code, RT_EOK on successfully. - */ -rt_err_t rt_usbh_storage_write10(struct uhintf* intf, rt_uint8_t *buffer, - rt_uint32_t sector, rt_size_t count, int timeout) -{ - struct ustorage_cbw cmd; - - /* parameter check */ - if(intf == RT_NULL) - { - rt_kprintf("the interface is not available\n"); - return -RT_EIO; - } - - RT_ASSERT(intf->device != RT_NULL); - LOG_D("rt_usbh_storage_write10"); - - /* construct the command block wrapper */ - rt_memset(&cmd, 0, sizeof(struct ustorage_cbw)); - cmd.signature = CBW_SIGNATURE; - cmd.tag = CBW_TAG_VALUE; - cmd.xfer_len = SECTOR_SIZE * count; - cmd.dflags = CBWFLAGS_DIR_OUT; - cmd.lun = 0; - cmd.cb_len = 10; - cmd.cb[0] = SCSI_WRITE_10; - cmd.cb[1] = 0; - cmd.cb[2] = (rt_uint8_t)(sector >> 24); - cmd.cb[3] = (rt_uint8_t)(sector >> 16); - cmd.cb[4] = (rt_uint8_t)(sector >> 8); - cmd.cb[5] = (rt_uint8_t)sector; - cmd.cb[6] = 0; - cmd.cb[7] = (count & 0xff00) >> 8; - cmd.cb[8] = (rt_uint8_t) count & 0xff; - - return rt_usb_bulk_only_xfer(intf, &cmd, buffer, timeout); -} - -/** - * This function will execute SCSI_REQUEST_SENSE command to get sense data. - * - * @param intf the interface instance. - * @param buffer the data buffer to save sense data - * - * @return the error code, RT_EOK on successfully. - */ -rt_err_t rt_usbh_storage_request_sense(struct uhintf* intf, rt_uint8_t* buffer) -{ - struct ustorage_cbw cmd; - int timeout = USB_TIMEOUT_LONG; - - /* parameter check */ - if(intf == RT_NULL) - { - rt_kprintf("the interface is not available\n"); - return -RT_EIO; - } - - RT_ASSERT(intf->device != RT_NULL); - LOG_D("rt_usbh_storage_request_sense"); - - /* construct the command block wrapper */ - rt_memset(&cmd, 0, sizeof(struct ustorage_cbw)); - cmd.signature = CBW_SIGNATURE; - cmd.tag = CBW_TAG_VALUE; - cmd.xfer_len = 18; - cmd.dflags = CBWFLAGS_DIR_IN; - cmd.lun = 0; - cmd.cb_len = 6; - cmd.cb[0] = SCSI_REQUEST_SENSE; - cmd.cb[4] = 18; - - return rt_usb_bulk_only_xfer(intf, &cmd, buffer, timeout); -} - -/** - * This function will execute SCSI_TEST_UNIT_READY command to get unit ready status. - * - * @param intf the interface instance. - * - * @return the error code, RT_EOK on successfully. - */ -rt_err_t rt_usbh_storage_test_unit_ready(struct uhintf* intf) -{ - struct ustorage_cbw cmd; - int timeout = USB_TIMEOUT_LONG; - - /* parameter check */ - if(intf == RT_NULL) - { - rt_kprintf("the interface is not available\n"); - return -RT_EIO; - } - - RT_ASSERT(intf->device != RT_NULL); - LOG_D("rt_usbh_storage_test_unit_ready"); - - /* construct the command block wrapper */ - rt_memset(&cmd, 0, sizeof(struct ustorage_cbw)); - cmd.signature = CBW_SIGNATURE; - cmd.tag = CBW_TAG_VALUE; - cmd.xfer_len = 0; - cmd.dflags = CBWFLAGS_DIR_OUT; - cmd.lun = 0; - cmd.cb_len = 12; - cmd.cb[0] = SCSI_TEST_UNIT_READY; - - return rt_usb_bulk_only_xfer(intf, &cmd, RT_NULL, timeout); -} - -/** - * This function will execute SCSI_INQUIRY_CMD command to get inquiry data. - * - * @param intf the interface instance. - * @param buffer the data buffer to save inquiry data - * - * @return the error code, RT_EOK on successfully. - */ -rt_err_t rt_usbh_storage_inquiry(struct uhintf* intf, rt_uint8_t* buffer) -{ - struct ustorage_cbw cmd; - int timeout = USB_TIMEOUT_LONG; - - /* parameter check */ - if(intf == RT_NULL) - { - rt_kprintf("the interface is not available\n"); - return -RT_EIO; - } - - RT_ASSERT(intf->device != RT_NULL); - LOG_D("rt_usbh_storage_inquiry"); - - /* construct the command block wrapper */ - rt_memset(&cmd, 0, sizeof(struct ustorage_cbw)); - cmd.signature = CBW_SIGNATURE; - cmd.tag = CBW_TAG_VALUE; - cmd.xfer_len = 36; - cmd.dflags = CBWFLAGS_DIR_IN; - cmd.lun = 0; - cmd.cb_len = 6;//12 - cmd.cb[0] = SCSI_INQUIRY_CMD; - cmd.cb[4] = 36; - - return rt_usb_bulk_only_xfer(intf, &cmd, buffer, timeout); -} - -/** - * This function will execute SCSI_READ_CAPACITY command to get capacity data. - * - * @param intf the interface instance. - * @param buffer the data buffer to save capacity data - * - * @return the error code, RT_EOK on successfully. - */ -rt_err_t rt_usbh_storage_get_capacity(struct uhintf* intf, rt_uint8_t* buffer) -{ - struct ustorage_cbw cmd; - int timeout = USB_TIMEOUT_LONG; - - /* parameter check */ - if(intf == RT_NULL) - { - rt_kprintf("the interface is not available\n"); - return -RT_EIO; - } - - RT_ASSERT(intf->device != RT_NULL); - LOG_D("rt_usbh_storage_get_capacity"); - - /* construct the command block wrapper */ - rt_memset(&cmd, 0, sizeof(struct ustorage_cbw)); - cmd.signature = CBW_SIGNATURE; - cmd.tag = CBW_TAG_VALUE; - cmd.xfer_len = 8; - cmd.dflags = CBWFLAGS_DIR_IN; - cmd.lun = 0; - cmd.cb_len = 12; - cmd.cb[0] = SCSI_READ_CAPACITY; - - return rt_usb_bulk_only_xfer(intf, &cmd, buffer, timeout); -} - -/** - * This function will run mass storage class driver when usb device is detected - * and identified as a mass storage class device, it will continue to do the enumulate - * process. - * - * @param arg the argument. - * - * @return the error code, RT_EOK on successfully. - */ -static rt_err_t rt_usbh_storage_enable(void* arg) -{ - int i = 0; - rt_err_t ret; - ustor_t stor; - struct uhintf* intf = (struct uhintf*)arg; - - /* parameter check */ - if(intf == RT_NULL) - { - rt_kprintf("the interface is not available\n"); - return -RT_EIO; - } - - LOG_D("subclass %d, protocal %d", - intf->intf_desc->bInterfaceSubClass, - intf->intf_desc->bInterfaceProtocol); - - LOG_D("rt_usbh_storage_run"); - - /* only support SCSI subclass and bulk only protocal */ - - stor = rt_malloc(sizeof(struct ustor)); - RT_ASSERT(stor != RT_NULL); - - /* initilize the data structure */ - rt_memset(stor, 0, sizeof(struct ustor)); - intf->user_data = (void*)stor; - - for(i=0; i<intf->intf_desc->bNumEndpoints; i++) - { - uep_desc_t ep_desc; - - /* get endpoint descriptor from interface descriptor */ - rt_usbh_get_endpoint_descriptor(intf->intf_desc, i, &ep_desc); - if(ep_desc == RT_NULL) - { - rt_kprintf("rt_usb_get_endpoint_descriptor error\n"); - return -RT_ERROR; - } - - /* the endpoint type of mass storage class should be BULK */ - if((ep_desc->bmAttributes & USB_EP_ATTR_TYPE_MASK) != USB_EP_ATTR_BULK) - continue; - - /* allocate pipes according to the endpoint type */ - if(ep_desc->bEndpointAddress & USB_DIR_IN) - { - /* alloc an in pipe for the storage instance */ - stor->pipe_in = rt_usb_instance_find_pipe(intf->device,ep_desc->bEndpointAddress); - } - else - { - /* alloc an output pipe for the storage instance */ - stor->pipe_out = rt_usb_instance_find_pipe(intf->device,ep_desc->bEndpointAddress); - } - } - - /* check pipes infomation */ - if(stor->pipe_in == RT_NULL || stor->pipe_out == RT_NULL) - { - rt_kprintf("pipe error, unsupported device\n"); - return -RT_ERROR; - } - - /* should implement as callback */ - ret = rt_udisk_run(intf); - if(ret != RT_EOK) return ret; - - return RT_EOK; -} - -/** - * This function will be invoked when usb device plug out is detected and it would clean - * and release all mass storage class related resources. - * - * @param arg the argument. - * - * @return the error code, RT_EOK on successfully. - */ -static rt_err_t rt_usbh_storage_disable(void* arg) -{ - ustor_t stor; - struct uhintf* intf = (struct uhintf*)arg; - - /* parameter check */ - RT_ASSERT(intf != RT_NULL); - RT_ASSERT(intf->user_data != RT_NULL); - RT_ASSERT(intf->device != RT_NULL); - - LOG_D("rt_usbh_storage_stop"); - - /* get storage instance from interface instance */ - stor = (ustor_t)intf->user_data; - - rt_udisk_stop(intf); - - - /* free storage instance */ - if(stor != RT_NULL) rt_free(stor); - return RT_EOK; -} - -/** - * This function will register mass storage class driver to the usb class driver manager. - * and it should be invoked in the usb system initialization. - * - * @return the error code, RT_EOK on successfully. - */ -ucd_t rt_usbh_class_driver_storage(void) -{ - storage_driver.class_code = USB_CLASS_MASS_STORAGE; - - storage_driver.enable = rt_usbh_storage_enable; - storage_driver.disable = rt_usbh_storage_disable; - - return &storage_driver; -} - -#endif - diff --git a/components/drivers/usb/usbhost/class/mass.h b/components/drivers/usb/usbhost/class/mass.h deleted file mode 100644 index 6d54dd66a7..0000000000 --- a/components/drivers/usb/usbhost/class/mass.h +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright (c) 2006-2023, RT-Thread Development Team - * - * SPDX-License-Identifier: Apache-2.0 - * - * Change Logs: - * Date Author Notes - * 2011-12-12 Yi Qiu first version - */ - -#ifndef __MASS_H__ -#define __MASS_H__ - -#include <rtthread.h> -#include "dfs_fs.h" - -#define MAX_PARTITION_COUNT 4 -#define SECTOR_SIZE 512 - -struct ustor_data -{ - struct dfs_partition part; - struct uhintf* intf; - int udisk_id; - const char path; -}; - -struct ustor -{ - upipe_t pipe_in; - upipe_t pipe_out; - rt_uint32_t capicity[2]; - - struct rt_device dev[MAX_PARTITION_COUNT]; - rt_uint8_t dev_cnt; -}; -typedef struct ustor* ustor_t; - -rt_err_t rt_usbh_storage_get_max_lun(struct uhintf* intf, rt_uint8_t* max_lun); -rt_err_t rt_usbh_storage_reset(struct uhintf* intf); -rt_err_t rt_usbh_storage_read10(struct uhintf* intf, rt_uint8_t *buffer, - rt_uint32_t sector, rt_size_t count, int timeout); -rt_err_t rt_usbh_storage_write10(struct uhintf* intf, rt_uint8_t *buffer, - rt_uint32_t sector, rt_size_t count, int timeout); -rt_err_t rt_usbh_storage_request_sense(struct uhintf* intf, rt_uint8_t* buffer); -rt_err_t rt_usbh_storage_test_unit_ready(struct uhintf* intf); -rt_err_t rt_usbh_storage_inquiry(struct uhintf* intf, rt_uint8_t* buffer); -rt_err_t rt_usbh_storage_get_capacity(struct uhintf* intf, rt_uint8_t* buffer); - -#endif diff --git a/components/drivers/usb/usbhost/class/udisk.c b/components/drivers/usb/usbhost/class/udisk.c deleted file mode 100644 index 07815e5996..0000000000 --- a/components/drivers/usb/usbhost/class/udisk.c +++ /dev/null @@ -1,456 +0,0 @@ -/* - * Copyright (c) 2006-2023, RT-Thread Development Team - * - * SPDX-License-Identifier: Apache-2.0 - * - * Change Logs: - * Date Author Notes - * 2011-12-12 Yi Qiu first version - */ - -#include <rtthread.h> -#include <dfs_fs.h> -#include <drivers/usb_host.h> -#include "mass.h" - -#define DBG_TAG "usbhost.udisk" -#define DBG_LVL DBG_INFO -#include <rtdbg.h> - -#ifdef RT_USBH_MSTORAGE - -#define UDISK_MAX_COUNT 8 -static rt_uint8_t _udisk_idset = 0; - -static int udisk_get_id(void) -{ - int i; - - for(i=0; i< UDISK_MAX_COUNT; i++) - { - if((_udisk_idset & (1 << i)) != 0) continue; - else break; - } - - /* it should not happen */ - if(i == UDISK_MAX_COUNT) RT_ASSERT(0); - - _udisk_idset |= (1 << i); - return i; -} - -static void udisk_free_id(int id) -{ - RT_ASSERT(id < UDISK_MAX_COUNT) - - _udisk_idset &= ~(1 << id); -} - -/** - * This function will initialize the udisk device - * - * @param dev the pointer of device driver structure - * - * @return RT_EOK - */ -static rt_err_t rt_udisk_init(rt_device_t dev) -{ - return RT_EOK; -} - -/** - * This function will read some data from a device. - * - * @param dev the pointer of device driver structure - * @param pos the position of reading - * @param buffer the data buffer to save read data - * @param size the size of buffer - * - * @return the actually read size on successful, otherwise negative returned. - */ -static rt_ssize_t rt_udisk_read(rt_device_t dev, rt_off_t pos, void* buffer, - rt_size_t size) -{ - rt_err_t ret; - struct uhintf* intf; - struct ustor_data* data; - int timeout = USB_TIMEOUT_LONG; - - /* check parameter */ - RT_ASSERT(dev != RT_NULL); - RT_ASSERT(buffer != RT_NULL); - - if(size > 4096) timeout *= 2; - - data = (struct ustor_data*)dev->user_data; - intf = data->intf; - - ret = rt_usbh_storage_read10(intf, (rt_uint8_t*)buffer, pos, size, timeout); - - if (ret != RT_EOK) - { - rt_kprintf("usb mass_storage read failed\n"); - return 0; - } - - return size; -} - -/** - * This function will write some data to a device. - * - * @param dev the pointer of device driver structure - * @param pos the position of written - * @param buffer the data buffer to be written to device - * @param size the size of buffer - * - * @return the actually written size on successful, otherwise negative returned. - */ -static rt_ssize_t rt_udisk_write (rt_device_t dev, rt_off_t pos, const void* buffer, - rt_size_t size) -{ - rt_err_t ret; - struct uhintf* intf; - struct ustor_data* data; - int timeout = USB_TIMEOUT_LONG; - - /* check parameter */ - RT_ASSERT(dev != RT_NULL); - RT_ASSERT(buffer != RT_NULL); - - if(size * SECTOR_SIZE > 4096) timeout *= 2; - - data = (struct ustor_data*)dev->user_data; - intf = data->intf; - - ret = rt_usbh_storage_write10(intf, (rt_uint8_t*)buffer, pos, size, timeout); - if (ret != RT_EOK) - { - rt_kprintf("usb mass_storage write %d sector failed\n", size); - return 0; - } - - return size; -} - -/** - * This function will execute SCSI_INQUIRY_CMD command to get inquiry data. - * - * @param intf the interface instance. - * @param buffer the data buffer to save inquiry data - * - * @return the error code, RT_EOK on successfully. - */ -static rt_err_t rt_udisk_control(rt_device_t dev, int cmd, void *args) -{ - ustor_t stor; - struct ustor_data* data; - - /* check parameter */ - RT_ASSERT(dev != RT_NULL); - - data = (struct ustor_data*)dev->user_data; - stor = (ustor_t)data->intf->user_data; - - if (cmd == RT_DEVICE_CTRL_BLK_GETGEOME) - { - struct rt_device_blk_geometry *geometry; - - geometry = (struct rt_device_blk_geometry *)args; - if (geometry == RT_NULL) return -RT_ERROR; - - geometry->bytes_per_sector = SECTOR_SIZE; - geometry->block_size = stor->capicity[1]; - geometry->sector_count = stor->capicity[0]; - } - - return RT_EOK; -} - -#ifdef RT_USING_DEVICE_OPS -const static struct rt_device_ops udisk_device_ops = -{ - rt_udisk_init, - RT_NULL, - RT_NULL, - rt_udisk_read, - rt_udisk_write, - rt_udisk_control -}; -#endif - -/** - * This function will run udisk driver when usb disk is detected. - * - * @param intf the usb interface instance. - * - * @return the error code, RT_EOK on successfully. - */ -rt_err_t rt_udisk_run(struct uhintf* intf) -{ - int i = 0; - rt_err_t ret; - char dname[8]; - char sname[8]; - rt_uint8_t max_lun, *sector, sense[18], inquiry[36]; - struct dfs_partition part[MAX_PARTITION_COUNT]; - ustor_t stor; - - /* check parameter */ - RT_ASSERT(intf != RT_NULL); - - /* set interface */ -// ret = rt_usbh_set_interface(intf->device, intf->intf_desc->bInterfaceNumber); -// if(ret != RT_EOK) -// rt_usbh_clear_feature(intf->device, 0, USB_FEATURE_ENDPOINT_HALT); - /* reset mass storage class device */ - ret = rt_usbh_storage_reset(intf); - if(ret != RT_EOK) return ret; - - stor = (ustor_t)intf->user_data; - - /* get max logic unit number */ - ret = rt_usbh_storage_get_max_lun(intf, &max_lun); - if(ret != RT_EOK) - rt_usbh_clear_feature(intf->device, 0, USB_FEATURE_ENDPOINT_HALT); - - /* reset pipe in endpoint */ - if(stor->pipe_in->status == UPIPE_STATUS_STALL) - { - ret = rt_usbh_clear_feature(intf->device, - stor->pipe_in->ep.bEndpointAddress, USB_FEATURE_ENDPOINT_HALT); - if(ret != RT_EOK) return ret; - } - - - /* reset pipe out endpoint */ - if(stor->pipe_out->status == UPIPE_STATUS_STALL) - { - ret = rt_usbh_clear_feature(intf->device, - stor->pipe_out->ep.bEndpointAddress, USB_FEATURE_ENDPOINT_HALT); - if(ret != RT_EOK) return ret; - } - - while((ret = rt_usbh_storage_inquiry(intf, inquiry)) != RT_EOK) - { - if(ret == -RT_EIO) return ret; - - rt_thread_delay(5); - if(i++ < 10) continue; - rt_kprintf("rt_usbh_storage_inquiry error\n"); - return -RT_ERROR; - } - - i = 0; - - /* wait device ready */ - while((ret = rt_usbh_storage_test_unit_ready(intf)) != RT_EOK) - { - if(ret == -RT_EIO) return ret; - - ret = rt_usbh_storage_request_sense(intf, sense); - if(ret == -RT_EIO) return ret; - - rt_thread_delay(10); - if(i++ < 10) continue; - - rt_kprintf("rt_usbh_storage_test_unit_ready error\n"); - return -RT_ERROR; - } - - i = 0; - rt_memset(stor->capicity, 0, sizeof(stor->capicity)); - - /* get storage capacity */ - while((ret = rt_usbh_storage_get_capacity(intf, - (rt_uint8_t*)stor->capicity)) != RT_EOK) - { - if(ret == -RT_EIO) return ret; - - rt_thread_delay(50); - if(i++ < 10) continue; - - stor->capicity[0] = 2880; - stor->capicity[1] = 0x200; - - rt_kprintf("rt_usbh_storage_get_capacity error\n"); - break; - } - - stor->capicity[0] = uswap_32(stor->capicity[0]); - stor->capicity[1] = uswap_32(stor->capicity[1]); - stor->capicity[0] += 1; - - LOG_D("capicity %d, block size %d", - stor->capicity[0], stor->capicity[1]); - - /* get the first sector to read partition table */ - sector = (rt_uint8_t*) rt_malloc (SECTOR_SIZE); - if (sector == RT_NULL) - { - rt_kprintf("allocate partition sector buffer failed\n"); - return -RT_ERROR; - } - - rt_memset(sector, 0, SECTOR_SIZE); - - LOG_D("read partition table"); - - /* get the partition table */ - ret = rt_usbh_storage_read10(intf, sector, 0, 1, USB_TIMEOUT_LONG); - if(ret != RT_EOK) - { - rt_kprintf("read parition table error\n"); - - rt_free(sector); - return -RT_ERROR; - } - - LOG_D("finished reading partition"); - - for(i=0; i<MAX_PARTITION_COUNT; i++) - { - /* get the first partition */ - ret = dfs_filesystem_get_partition(&part[i], sector, i); - if (ret == RT_EOK) - { - struct ustor_data* data = rt_malloc(sizeof(struct ustor_data)); - if (data == RT_NULL) - { - LOG_E("Allocate partition data buffer failed."); - continue; - } - rt_memset(data, 0, sizeof(struct ustor_data)); - data->intf = intf; - data->udisk_id = udisk_get_id(); - rt_snprintf(dname, 6, "ud%d-%d", data->udisk_id, i); - rt_snprintf(sname, 8, "sem_ud%d", i); - data->part.lock = rt_sem_create(sname, 1, RT_IPC_FLAG_FIFO); - - /* register sdcard device */ - stor->dev[i].type = RT_Device_Class_Block; -#ifdef RT_USING_DEVICE_OPS - stor->dev[i].ops = &udisk_device_ops; -#else - stor->dev[i].init = rt_udisk_init; - stor->dev[i].read = rt_udisk_read; - stor->dev[i].write = rt_udisk_write; - stor->dev[i].control = rt_udisk_control; -#endif - stor->dev[i].user_data = (void*)data; - - rt_device_register(&stor->dev[i], dname, RT_DEVICE_FLAG_RDWR | - RT_DEVICE_FLAG_REMOVABLE | RT_DEVICE_FLAG_STANDALONE); - - stor->dev_cnt++; - if (dfs_mount(stor->dev[i].parent.name, UDISK_MOUNTPOINT, "elm", - 0, 0) == 0) - { - LOG_D("udisk part %d mount successfully", i); - } - else - { - LOG_D("udisk part %d mount failed", i); - } - } - else - { - if(i == 0) - { - struct ustor_data* data = rt_malloc(sizeof(struct ustor_data)); - if (data == RT_NULL) - { - LOG_E("Allocate partition data buffer failed."); - break; - } - rt_memset(data, 0, sizeof(struct ustor_data)); - data->udisk_id = udisk_get_id(); - - /* there is no partition table */ - data->part.offset = 0; - data->part.size = 0; - data->intf = intf; - data->part.lock = rt_sem_create("sem_ud", 1, RT_IPC_FLAG_FIFO); - - rt_snprintf(dname, 7, "udisk%d", data->udisk_id); - - /* register sdcard device */ - stor->dev[0].type = RT_Device_Class_Block; -#ifdef RT_USING_DEVICE_OPS - stor->dev[i].ops = &udisk_device_ops; -#else - stor->dev[0].init = rt_udisk_init; - stor->dev[0].read = rt_udisk_read; - stor->dev[0].write = rt_udisk_write; - stor->dev[0].control = rt_udisk_control; -#endif - stor->dev[0].user_data = (void*)data; - - rt_device_register(&stor->dev[0], dname, - RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_REMOVABLE - | RT_DEVICE_FLAG_STANDALONE); - - stor->dev_cnt++; - if (dfs_mount(stor->dev[0].parent.name, UDISK_MOUNTPOINT, - "elm", 0, 0) == 0) - { - rt_kprintf("Mount FAT on Udisk successful.\n"); - } - else - { - rt_kprintf("Mount FAT on Udisk failed.\n"); - } - } - - break; - } - } - - rt_free(sector); - - return RT_EOK; -} - -/** - * This function will be invoked when usb disk plug out is detected and it would clean - * and release all udisk related resources. - * - * @param intf the usb interface instance. - * - * @return the error code, RT_EOK on successfully. - */ -rt_err_t rt_udisk_stop(struct uhintf* intf) -{ - int i; - ustor_t stor; - struct ustor_data* data; - - /* check parameter */ - RT_ASSERT(intf != RT_NULL); - RT_ASSERT(intf->device != RT_NULL); - - stor = (ustor_t)intf->user_data; - RT_ASSERT(stor != RT_NULL); - - for(i=0; i<stor->dev_cnt; i++) - { - rt_device_t dev = &stor->dev[i]; - data = (struct ustor_data*)dev->user_data; - - /* unmount filesystem */ - dfs_unmount(UDISK_MOUNTPOINT); - - /* delete semaphore */ - rt_sem_delete(data->part.lock); - udisk_free_id(data->udisk_id); - rt_free(data); - - /* unregister device */ - rt_device_unregister(&stor->dev[i]); - } - - return RT_EOK; -} - -#endif - diff --git a/components/drivers/usb/usbhost/class/ukbd.c b/components/drivers/usb/usbhost/class/ukbd.c deleted file mode 100644 index db080ed406..0000000000 --- a/components/drivers/usb/usbhost/class/ukbd.c +++ /dev/null @@ -1,93 +0,0 @@ -/* - * Copyright (c) 2006-2023, RT-Thread Development Team - * - * SPDX-License-Identifier: Apache-2.0 - * - * Change Logs: - * Date Author Notes - * 2012-01-03 Yi Qiu first version - */ - -#include <rtthread.h> -#include <drivers/usb_host.h> -#include "hid.h" - -#if defined(RT_USBH_HID) && defined(RT_USBH_HID_KEYBOARD) - -#define DBG_TAG "usbhost.ukbd" -#define DBG_LVL DBG_INFO -#include <rtdbg.h> - -static struct uprotocal kbd_protocal; - -static rt_err_t rt_usbh_hid_kbd_callback(void* arg) -{ - int int1, int2; - struct uhid* hid; - - hid = (struct uhid*)arg; - - int1 = *(rt_uint32_t*)hid->buffer; - int2 = *(rt_uint32_t*)(&hid->buffer[4]); - - if(int1 != 0 || int2 != 0) - { - LOG_D("key down 0x%x, 0x%x", int1, int2); - } - - return RT_EOK; -} - -static rt_thread_t kbd_thread; -static void kbd_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_kbd_callback(intf->user_data); - } -} - - -static rt_err_t rt_usbh_hid_kbd_init(void* 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); - - LOG_D("start usb keyboard"); - - kbd_thread = rt_thread_create("kbd0", kbd_task, intf, 1024, 8, 100); - rt_thread_startup(kbd_thread); - - return RT_EOK; -} - -/** - * This function will define the hid keyboard protocal, it will be register to the protocal list. - * - * @return the keyboard protocal structure. - */ -uprotocal_t rt_usbh_hid_protocal_kbd(void) -{ - kbd_protocal.pro_id = USB_HID_KEYBOARD; - - kbd_protocal.init = rt_usbh_hid_kbd_init; - kbd_protocal.callback = rt_usbh_hid_kbd_callback; - - return &kbd_protocal; -} - -#endif - diff --git a/components/drivers/usb/usbhost/class/umouse.c b/components/drivers/usb/usbhost/class/umouse.c deleted file mode 100644 index dfd6e9081c..0000000000 --- a/components/drivers/usb/usbhost/class/umouse.c +++ /dev/null @@ -1,190 +0,0 @@ -/* - * Copyright (c) 2006-2023, RT-Thread Development Team - * - * SPDX-License-Identifier: Apache-2.0 - * - * Change Logs: - * Date Author Notes - * 2012-01-03 Yi Qiu first version - */ - -#include <rtthread.h> -#include <drivers/usb_host.h> -#include "hid.h" - -#ifdef RT_USING_RTGUI -#include <rtgui/event.h> -#include <rtgui/rtgui_server.h> -#include "drv_lcd.h" -#endif - -#if defined(RT_USBH_HID) && defined(RT_USBH_HID_MOUSE) - -#define DBG_TAG "usbhost.umouse" -#define DBG_LVL DBG_INFO -#include <rtdbg.h> - -static struct uprotocal mouse_protocal; - -#ifdef RT_USING_RTGUI -#define LKEY_PRESS 0x01 -#define RKEY_PRESS 0x02 -#define MKEY_PRESS 0x04 -#define MOUSE_SCALING 0x02 - -static rt_bool_t lkey_down=RT_FALSE; -//static rt_bool_t rkey_down=RT_FALSE; -//static rt_bool_t mkey_down=RT_FALSE; -static struct rtgui_event_mouse emouse; -#endif - -static rt_err_t rt_usbh_hid_mouse_callback(void* arg) -{ - struct uhid* hid; -#ifdef RT_USING_RTGUI - rt_uint16_t xoffset=0; - rt_uint16_t yoffset=0; -#endif - hid = (struct uhid*)arg; - - LOG_D("hid 0x%x 0x%x", - *(rt_uint32_t*)hid->buffer, - *(rt_uint32_t*)(&hid->buffer[4])); -#ifdef RT_USING_RTGUI - if(hid->buffer[1]!=0) - { - if(hid->buffer[1]>127) - { - xoffset=(256-hid->buffer[1])*MOUSE_SCALING; - if(emouse.x>xoffset) - { - emouse.x-=xoffset; - } - else - { - emouse.x=0; - } - } - else - { - xoffset=(hid->buffer[1])*MOUSE_SCALING; - if((emouse.x+xoffset)<480) - { - emouse.x+=xoffset; - } - else - { - emouse.x=480; - } - } - } - if(hid->buffer[2]!=0) - { - - if(hid->buffer[2]>127) - { - yoffset=(256-hid->buffer[2])*MOUSE_SCALING; - if(emouse.y>yoffset) - { - emouse.y-=yoffset; - } - else - { - emouse.y=0; - } - } - else - { - yoffset=hid->buffer[2]*MOUSE_SCALING; - if(emouse.y+yoffset<272) - { - emouse.y+=yoffset; - } - else - { - emouse.y=272; - } - } - } - if(xoffset!=0||yoffset!=0) - { - cursor_set_position(emouse.x,emouse.y); - } - if(hid->buffer[0]&LKEY_PRESS) - { - if(lkey_down==RT_FALSE) - { - // rt_kprintf("mouse left key press down\n"); - emouse.button = (RTGUI_MOUSE_BUTTON_LEFT | RTGUI_MOUSE_BUTTON_DOWN); - rtgui_server_post_event(&emouse.parent, sizeof(struct rtgui_event_mouse)); - lkey_down=RT_TRUE; - } - } - else if(lkey_down==RT_TRUE) - { - // rt_kprintf("mouse left key press up\n"); - emouse.button = (RTGUI_MOUSE_BUTTON_LEFT | RTGUI_MOUSE_BUTTON_UP); - rtgui_server_post_event(&emouse.parent, sizeof(struct rtgui_event_mouse)); - lkey_down=RT_FALSE; - } -#endif - return RT_EOK; -} - -static rt_thread_t mouse_thread; -static 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; - - 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, 1024, 8, 100); - rt_thread_startup(mouse_thread); - - LOG_D("start usb mouse"); -#ifdef RT_USING_RTGUI - RTGUI_EVENT_MOUSE_BUTTON_INIT(&emouse); - emouse.wid = RT_NULL; - cursor_display(RT_TRUE); -#endif - return RT_EOK; -} - -/** - * This function will define the hid mouse protocal, it will be register to the protocal list. - * - * @return the keyboard protocal structure. - */ -uprotocal_t rt_usbh_hid_protocal_mouse(void) -{ - mouse_protocal.pro_id = USB_HID_MOUSE; - - mouse_protocal.init = rt_usbh_hid_mouse_init; - mouse_protocal.callback = rt_usbh_hid_mouse_callback; - - return &mouse_protocal; -} - -#endif - |
