summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFranklin Wei <frankhwei536@gmail.com>2016-06-13 22:32:55 +0100
committerFranklin Wei <frankhwei536@gmail.com>2016-06-14 19:34:08 -0400
commit475a26c6f6f723e080cbbb65f45eea5210f324de (patch)
tree2c39038c98ec3daae396a07394bfeafdf0935170
parentc7a561e9f16b9c14631b448510297ffa912c298c (diff)
downloadrockbox-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.h1
-rw-r--r--firmware/target/arm/usb-drv-arc.c5
-rw-r--r--firmware/target/arm/usb-s3c6400x.c11
-rw-r--r--firmware/usbstack/usb_hid.c8
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)
{