summaryrefslogtreecommitdiff
path: root/components/drivers/usb
diff options
context:
space:
mode:
authorguozhanxin <[email protected]>2019-09-19 20:58:58 +0800
committerguozhanxin <[email protected]>2019-09-19 20:58:58 +0800
commitcde81a296d30d0b927b30393bf98c3fe4cbbb258 (patch)
tree5132d134824b5ee660d2c231b2eafe7e817c30fa /components/drivers/usb
parentae7a33c27cf4356b4ba4936eafc8e6b9368d3e3e (diff)
[usbd] Fixed an error where change the interface did not call handler.|修正了改变接口不调用回调的问题
Diffstat (limited to 'components/drivers/usb')
-rw-r--r--components/drivers/usb/usbdevice/core/core.c18
1 files changed, 15 insertions, 3 deletions
diff --git a/components/drivers/usb/usbdevice/core/core.c b/components/drivers/usb/usbdevice/core/core.c
index d57295effc..584556303f 100644
--- a/components/drivers/usb/usbdevice/core/core.c
+++ b/components/drivers/usb/usbdevice/core/core.c
@@ -237,7 +237,8 @@ static rt_err_t _get_interface(struct udevice* device, ureq_t setup)
{
rt_uint8_t value;
uintf_t intf;
-
+ ufunction_t func;
+
/* parameter check */
RT_ASSERT(device != RT_NULL);
RT_ASSERT(setup != RT_NULL);
@@ -251,12 +252,17 @@ static rt_err_t _get_interface(struct udevice* device, ureq_t setup)
}
/* find the specified interface and its alternate setting */
- intf = rt_usbd_find_interface(device, setup->wIndex & 0xFF, RT_NULL);
+ intf = rt_usbd_find_interface(device, setup->wIndex & 0xFF, &func);
value = intf->curr_setting->intf_desc->bAlternateSetting;
/* send the interface alternate setting to endpoint 0*/
rt_usbd_ep0_write(device, &value, 1);
+ if (intf->handler)
+ {
+ intf->handler(func, setup);
+ }
+
return RT_EOK;
}
@@ -270,6 +276,7 @@ static rt_err_t _get_interface(struct udevice* device, ureq_t setup)
*/
static rt_err_t _set_interface(struct udevice* device, ureq_t setup)
{
+ ufunction_t func;
uintf_t intf;
uep_t ep;
struct rt_list_node* i;
@@ -288,7 +295,7 @@ static rt_err_t _set_interface(struct udevice* device, ureq_t setup)
}
/* find the specified interface */
- intf = rt_usbd_find_interface(device, setup->wIndex & 0xFF, RT_NULL);
+ intf = rt_usbd_find_interface(device, setup->wIndex & 0xFF, &func);
/* set alternate setting to the interface */
rt_usbd_set_altsetting(intf, setup->wValue & 0xFF);
@@ -303,6 +310,11 @@ static rt_err_t _set_interface(struct udevice* device, ureq_t setup)
}
dcd_ep0_send_status(device->dcd);
+ if (intf->handler)
+ {
+ intf->handler(func, setup);
+ }
+
return RT_EOK;
}