diff options
| author | heyuanjie87 <[email protected]> | 2013-05-23 12:33:22 +0800 |
|---|---|---|
| committer | heyuanjie87 <[email protected]> | 2013-05-23 12:33:22 +0800 |
| commit | 8aa4eb792457375f156bea1807fd3e495b7df8cc (patch) | |
| tree | 8b47ca492bd270267fe705868066f398fba0c28e /components/drivers/usb/usbdevice | |
| parent | 49404aceeb2bdd7dd949a047a3406132027fa13e (diff) | |
make Host can halt endpoints
Diffstat (limited to 'components/drivers/usb/usbdevice')
| -rw-r--r-- | components/drivers/usb/usbdevice/core/core.c | 38 |
1 files changed, 30 insertions, 8 deletions
diff --git a/components/drivers/usb/usbdevice/core/core.c b/components/drivers/usb/usbdevice/core/core.c index 0982f86cc0..f228a1a2bf 100644 --- a/components/drivers/usb/usbdevice/core/core.c +++ b/components/drivers/usb/usbdevice/core/core.c @@ -256,7 +256,8 @@ static rt_err_t _set_interface(struct udevice* device, ureq_t setup) dcd_ep_stop(device->dcd, ep); dcd_ep_run(device->dcd, ep); } - + dcd_send_status(device->dcd); + return RT_EOK; } @@ -454,10 +455,11 @@ static rt_err_t _standard_request(struct udevice* device, ureq_t setup) dcd_ep_write(device->dcd, 0, &value, 2); break; case USB_REQ_CLEAR_FEATURE: - dcd_clear_feature(dcd, setup->value); + dcd_clear_feature(dcd, setup->value, setup->index); + dcd_send_status(dcd); break; case USB_REQ_SET_FEATURE: - dcd_set_feature(dcd, setup->value); + dcd_set_feature(dcd, setup->value, setup->index); break; case USB_REQ_SET_ADDRESS: _set_address(device, setup); @@ -504,15 +506,35 @@ static rt_err_t _standard_request(struct udevice* device, ureq_t setup) switch(setup->request) { case USB_REQ_GET_STATUS: + { /* TODO */ + uep_t ep; + + ep = rt_usbd_find_endpoint(device, RT_NULL, setup->index); + value = ep->is_stall; dcd_ep_write(dcd, 0, &value, 2); - break; + } + break; case USB_REQ_CLEAR_FEATURE: - dcd_clear_feature(dcd, setup->value); - break; + { + uep_t ep; + + ep = rt_usbd_find_endpoint(device, RT_NULL, setup->index); + ep->is_stall = 0; + dcd_clear_feature(dcd, setup->value, setup->index); + dcd_send_status(dcd); + } + break; case USB_REQ_SET_FEATURE: - dcd_set_feature(dcd, setup->value); - break; + { + uep_t ep; + + ep = rt_usbd_find_endpoint(device, RT_NULL, setup->index); + ep->is_stall = 1; + dcd_set_feature(dcd, setup->value, setup->index); + dcd_send_status(dcd); + } + break; case USB_REQ_SYNCH_FRAME: break; default: |
