diff options
| author | Franklin Wei <frankhwei536@gmail.com> | 2016-06-13 22:32:55 +0100 |
|---|---|---|
| committer | Franklin Wei <frankhwei536@gmail.com> | 2016-06-14 19:34:08 -0400 |
| commit | 475a26c6f6f723e080cbbb65f45eea5210f324de (patch) | |
| tree | 2c39038c98ec3daae396a07394bfeafdf0935170 | |
| parent | c7a561e9f16b9c14631b448510297ffa912c298c (diff) | |
| download | rockbox-475a26c6f6f723e080cbbb65f45eea5210f324de.zip rockbox-475a26c6f6f723e080cbbb65f45eea5210f324de.tar.gz rockbox-475a26c6f6f723e080cbbb65f45eea5210f324de.tar.bz2 rockbox-475a26c6f6f723e080cbbb65f45eea5210f324de.tar.xz | |
usb: implement blocking receive
XXX explain why this is useful
Change-Id: I680fc8daf3b97e311dcb05baac8628cee2abf70e
| -rw-r--r-- | firmware/export/usb_drv.h | 1 | ||||
| -rw-r--r-- | firmware/target/arm/usb-drv-arc.c | 5 | ||||
| -rw-r--r-- | firmware/target/arm/usb-s3c6400x.c | 11 | ||||
| -rw-r--r-- | firmware/usbstack/usb_hid.c | 8 |
4 files changed, 24 insertions, 1 deletions
diff --git a/firmware/export/usb_drv.h b/firmware/export/usb_drv.h index 6ec9ac0..f0c2002 100644 --- a/firmware/export/usb_drv.h +++ b/firmware/export/usb_drv.h @@ -33,6 +33,7 @@ bool usb_drv_stalled(int endpoint,bool in); int usb_drv_send(int endpoint, void* ptr, int length); int usb_drv_send_nonblocking(int endpoint, void* ptr, int length); int usb_drv_recv(int endpoint, void* ptr, int length); +int usb_drv_recv_blocking(int endpoint, void* ptr, int length); void usb_drv_ack(struct usb_ctrlrequest* req); void usb_drv_set_address(int address); void usb_drv_reset_endpoint(int endpoint, bool send); diff --git a/firmware/target/arm/usb-drv-arc.c b/firmware/target/arm/usb-drv-arc.c index 44d006b..238c999 100644 --- a/firmware/target/arm/usb-drv-arc.c +++ b/firmware/target/arm/usb-drv-arc.c @@ -595,6 +595,11 @@ int usb_drv_recv(int endpoint, void* ptr, int length) return prime_transfer(EP_NUM(endpoint), ptr, length, false, false); } +int usb_drv_recv_blocking(int endpoint, void* ptr, int length) +{ + return prime_transfer(EP_NUM(endpoint), ptr, length, false, true); +} + int usb_drv_port_speed(void) { return (REG_PORTSC1 & 0x08000000) ? 1 : 0; diff --git a/firmware/target/arm/usb-s3c6400x.c b/firmware/target/arm/usb-s3c6400x.c index 920d1a6..556c143 100644 --- a/firmware/target/arm/usb-s3c6400x.c +++ b/firmware/target/arm/usb-s3c6400x.c @@ -621,3 +621,14 @@ int usb_drv_send(int ep, void *ptr, int len) semaphore_wait(&endpoint->complete, HZ); return endpoint->status; } + +int usb_drv_recv_blocking(int ep, void *ptr, int len) +{ + ep = EP_NUM(ep); + struct ep_type *endpoint = &endpoints[ep][0]; + endpoint->done = false; + ep_transfer(ep, ptr, len, true); + while (endpoint->busy && !endpoint->done && usb_detect() != USB_EXTRACTED) + semaphore_wait(&endpoint->complete, HZ); + return endpoint->status; +} diff --git a/firmware/usbstack/usb_hid.c b/firmware/usbstack/usb_hid.c index ed08163..2b05f5c 100644 --- a/firmware/usbstack/usb_hid.c +++ b/firmware/usbstack/usb_hid.c @@ -169,6 +169,7 @@ typedef struct } usb_hid_report_t; static usb_hid_report_t usb_hid_reports[REPORT_ID_COUNT]; +static uint8_t usb_hid_led_buf; static unsigned char report_descriptor[HID_BUF_SIZE_REPORT] USB_DEVBSS_ATTR __attribute__((aligned(32))); @@ -668,7 +669,7 @@ static int usb_hid_set_report(struct usb_ctrlrequest *req) } memset(buf, 0, length); - usb_drv_recv(EP_CONTROL, buf, length); + usb_drv_recv_blocking(EP_CONTROL, buf, length); #ifdef LOGF_ENABLE if (buf[1] & 0x01) @@ -688,6 +689,11 @@ static int usb_hid_set_report(struct usb_ctrlrequest *req) return 0; } +uint8_t usb_hid_leds(void) +{ + return usb_hid_led_buf; +} + /* called by usb_core_control_request() */ bool usb_hid_control_request(struct usb_ctrlrequest *req, unsigned char *dest) { |