aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNIIBE Yutaka <gniibe@fsij.org>2016-04-07 14:44:58 +0900
committerNIIBE Yutaka <gniibe@fsij.org>2016-04-07 14:52:39 +0900
commit92e17d3bdf2371031967f949659edb91b72fb63f (patch)
tree741147d6b21e019d77e2a095ea53f034717f0b3e
parent674c19c495feb6cba9d87515a2ae9daed84e754f (diff)
USB stack for STM32F103 improvement
-rw-r--r--ChangeLog11
-rw-r--r--example-cdc/sample.c20
-rw-r--r--example-cdc/sample.ld8
-rw-r--r--example-cdc/usb-cdc.c96
-rw-r--r--example-cdc/usb_lld.h2
-rw-r--r--example-cdc/usb_stm32f103.c43
6 files changed, 93 insertions, 87 deletions
diff --git a/ChangeLog b/ChangeLog
index 5177b3b..a0717af 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,16 @@
2016-04-07 Niibe Yutaka <gniibe@fsij.org>
+ * example-cdc/usb-cdc.c: Update.
+
+ * example-cdc/usb_stm32f103.c (usb_handle_transfer): Don't use
+ weak symbols for callbacks, but use explicit callbacks of
+ usb_cb_tx_done and usb_cb_rx_ready.
+
+ * example-cdc/usb_lld.h (usb_cb_tx_done, usb_cb_rx_ready): New
+ callbacks.
+
+2016-04-07 Niibe Yutaka <gniibe@fsij.org>
+
* chopstx.c (chx_cpu_sched_lock, chx_cpu_sched_unlock): Use SVC
for Cortex-M3, because of ICI/IT of ESPR.
(chx_sched): Invoke svc for Cortex-M3.
diff --git a/example-cdc/sample.c b/example-cdc/sample.c
index 4e61980..7a6b99f 100644
--- a/example-cdc/sample.c
+++ b/example-cdc/sample.c
@@ -129,6 +129,7 @@ main (int argc, const char *argv[])
{
struct stream *st;
uint8_t count;
+ extern uint32_t bDeviceState;
(void)argc;
(void)argv;
@@ -153,11 +154,14 @@ main (int argc, const char *argv[])
chopstx_cond_signal (&cnd1);
chopstx_mutex_unlock (&mtx);
- count= 0;
+ u = 1;
+ while (bDeviceState != CONFIGURED)
+ chopstx_usec_wait (500*1000);
+
+ count = 0;
while (1)
{
uint8_t s[64];
- u = 1;
if (stream_wait_connection (st) < 0)
{
@@ -165,6 +169,11 @@ main (int argc, const char *argv[])
continue;
}
+ chopstx_usec_wait (500*1000);
+
+ /* Send ZLP at the beginning. */
+ stream_send (st, s, 0);
+
memcpy (s, "xx: Hello, World with Chopstx!\r\n\000", 32);
s[0] = hexchar (count >> 4);
s[1] = hexchar (count & 0x0f);
@@ -180,8 +189,11 @@ main (int argc, const char *argv[])
if (size < 0)
break;
- if (stream_send (st, s, size) < 0)
- break;
+ if (size >= 0)
+ {
+ if (stream_send (st, s, size) < 0)
+ break;
+ }
u ^= 1;
}
diff --git a/example-cdc/sample.ld b/example-cdc/sample.ld
index 322165b..dd53a0e 100644
--- a/example-cdc/sample.ld
+++ b/example-cdc/sample.ld
@@ -2,10 +2,10 @@
* ST32F103 memory setup.
*/
__main_stack_size__ = 0x0100; /* Exception handlers */
-__process0_stack_size__ = 0x0100; /* Main program */
-__process1_stack_size__ = 0x0100; /* first thread program */
-__process2_stack_size__ = 0x0100; /* second thread program */
-__process3_stack_size__ = 0x0100; /* third thread program */
+__process0_stack_size__ = 0x0200; /* Main program */
+__process1_stack_size__ = 0x0200; /* first thread program */
+__process2_stack_size__ = 0x0200; /* second thread program */
+__process3_stack_size__ = 0x0200; /* third thread program */
MEMORY
{
diff --git a/example-cdc/usb-cdc.c b/example-cdc/usb-cdc.c
index 5b569b4..d2c4961 100644
--- a/example-cdc/usb-cdc.c
+++ b/example-cdc/usb-cdc.c
@@ -157,7 +157,7 @@ static const uint8_t vcom_string3[28] = {
#define NUM_INTERFACES 2
-static uint32_t bDeviceState = UNCONNECTED; /* USB device status */
+uint32_t bDeviceState = UNCONNECTED; /* USB device status */
void
@@ -400,35 +400,38 @@ usb_cb_interface (uint8_t cmd, struct req_args *arg)
void
-EP1_IN_Callback (void)
+usb_cb_tx_done (uint8_t ep_num)
{
- chopstx_mutex_lock (&stream.mtx);
- if ((stream.flags & FLAG_SEND_AVAIL))
+ if (ep_num == ENDP1)
+ {
+ chopstx_mutex_lock (&stream.mtx);
+ if ((stream.flags & FLAG_SEND_AVAIL))
+ {
+ stream.flags &= ~FLAG_SEND_AVAIL;
+ chopstx_cond_signal (&stream.cnd);
+ }
+ chopstx_mutex_unlock (&stream.mtx);
+ }
+ else if (ep_num == ENDP2)
{
- stream.flags &= ~FLAG_SEND_AVAIL;
- chopstx_cond_signal (&stream.cnd);
}
- chopstx_mutex_unlock (&stream.mtx);
-}
-
-void
-EP2_IN_Callback (void)
-{
}
void
-EP3_OUT_Callback (void)
+usb_cb_rx_ready (uint8_t ep_num)
{
- chopstx_mutex_lock (&stream.mtx);
- if ((stream.flags & FLAG_RECV_AVAIL) == 0)
+ if (ep_num == ENDP3)
{
- stream.flags |= FLAG_RECV_AVAIL;
- chopstx_cond_signal (&stream.cnd);
+ chopstx_mutex_lock (&stream.mtx);
+ if ((stream.flags & FLAG_RECV_AVAIL) == 0)
+ {
+ stream.flags |= FLAG_RECV_AVAIL;
+ chopstx_cond_signal (&stream.cnd);
+ }
+ chopstx_mutex_unlock (&stream.mtx);
}
- chopstx_mutex_unlock (&stream.mtx);
}
-
struct stream *
stream_open (void)
{
@@ -441,7 +444,7 @@ int
stream_wait_connection (struct stream *st)
{
chopstx_mutex_lock (&st->mtx);
- if ((stream.flags & FLAG_CONNECTED) == 0)
+ while ((stream.flags & FLAG_CONNECTED) == 0)
chopstx_cond_wait (&st->cnd, &st->mtx);
chopstx_mutex_unlock (&st->mtx);
stream.flags &= ~FLAG_SEND_AVAIL;
@@ -452,46 +455,63 @@ stream_wait_connection (struct stream *st)
int
stream_send (struct stream *st, uint8_t *buf, uint8_t count)
{
+ int r = 0;
+
chopstx_mutex_lock (&st->mtx);
if ((stream.flags & FLAG_CONNECTED) == 0)
- {
- chopstx_mutex_unlock (&st->mtx);
- return -1;
- }
+ r = -1;
else
{
usb_lld_write (ENDP1, buf, count);
stream.flags |= FLAG_SEND_AVAIL;
- while ((stream.flags & FLAG_SEND_AVAIL))
- chopstx_cond_wait (&st->cnd, &st->mtx);
+ do
+ {
+ chopstx_cond_wait (&st->cnd, &st->mtx);
+ if ((stream.flags & FLAG_SEND_AVAIL) == 0)
+ break;
+ else if ((stream.flags & FLAG_CONNECTED) == 0)
+ {
+ r = -1;
+ break;
+ }
+ }
+ while (1);
}
chopstx_mutex_unlock (&st->mtx);
- return 0;
+ return r;
}
int
stream_recv (struct stream *st, uint8_t *buf)
{
- int recv_size;
+ int r;
chopstx_mutex_lock (&st->mtx);
if ((stream.flags & FLAG_CONNECTED) == 0)
- {
- chopstx_mutex_unlock (&st->mtx);
- return -1;
- }
+ r = -1;
else
{
usb_lld_rx_enable (ENDP3);
stream.flags &= ~FLAG_RECV_AVAIL;
- while ((stream.flags & FLAG_RECV_AVAIL) == 0)
- chopstx_cond_wait (&st->cnd, &st->mtx);
-
- recv_size = usb_lld_rx_data_len (ENDP3);
- usb_lld_rxcpy (buf, ENDP3, 0, recv_size);
+ do
+ {
+ chopstx_cond_wait (&st->cnd, &st->mtx);
+ if ((stream.flags & FLAG_RECV_AVAIL))
+ {
+ r = usb_lld_rx_data_len (ENDP3);
+ usb_lld_rxcpy (buf, ENDP3, 0, r);
+ break;
+ }
+ else if ((stream.flags & FLAG_CONNECTED) == 0)
+ {
+ r = -1;
+ break;
+ }
+ }
+ while (1);
}
chopstx_mutex_unlock (&st->mtx);
- return recv_size;
+ return r;
}
diff --git a/example-cdc/usb_lld.h b/example-cdc/usb_lld.h
index 34a1068..86de9bc 100644
--- a/example-cdc/usb_lld.h
+++ b/example-cdc/usb_lld.h
@@ -63,6 +63,8 @@ int usb_cb_get_descriptor (uint8_t rcp, uint8_t desc_type, uint8_t desc_index,
int usb_cb_handle_event (uint8_t event_type, uint16_t value);
void usb_cb_ctrl_write_finish (uint8_t req, uint8_t req_no,
struct req_args *arg);
+void usb_cb_tx_done (uint8_t ep_num);
+void usb_cb_rx_ready (uint8_t ep_num);
enum {
USB_EVENT_ADDRESS,
diff --git a/example-cdc/usb_stm32f103.c b/example-cdc/usb_stm32f103.c
index cf494e9..2dac791 100644
--- a/example-cdc/usb_stm32f103.c
+++ b/example-cdc/usb_stm32f103.c
@@ -843,27 +843,6 @@ static void handle_out0 (void)
dev_p->state = STALLED;
}
-static void nop_proc (void)
-{
-}
-
-#define WEAK __attribute__ ((weak, alias ("nop_proc")))
-void WEAK EP1_IN_Callback (void);
-void WEAK EP2_IN_Callback (void);
-void WEAK EP3_IN_Callback (void);
-void WEAK EP4_IN_Callback (void);
-void WEAK EP5_IN_Callback (void);
-void WEAK EP6_IN_Callback (void);
-void WEAK EP7_IN_Callback (void);
-
-void WEAK EP1_OUT_Callback (void);
-void WEAK EP2_OUT_Callback (void);
-void WEAK EP3_OUT_Callback (void);
-void WEAK EP4_OUT_Callback (void);
-void WEAK EP5_OUT_Callback (void);
-void WEAK EP6_OUT_Callback (void);
-void WEAK EP7_OUT_Callback (void);
-
static void
usb_handle_transfer (uint16_t istr_value)
{
@@ -901,31 +880,13 @@ usb_handle_transfer (uint16_t istr_value)
if ((ep_value & EP_CTR_RX))
{
st103_ep_clear_ctr_rx (ep_index);
- switch ((ep_index - 1))
- {
- case 0: EP1_OUT_Callback (); break;
- case 1: EP2_OUT_Callback (); break;
- case 2: EP3_OUT_Callback (); break;
- case 3: EP4_OUT_Callback (); break;
- case 4: EP5_OUT_Callback (); break;
- case 5: EP6_OUT_Callback (); break;
- case 6: EP7_OUT_Callback (); break;
- }
+ usb_cb_rx_ready (ep_index);
}
if ((ep_value & EP_CTR_TX))
{
st103_ep_clear_ctr_tx (ep_index);
- switch ((ep_index - 1))
- {
- case 0: EP1_IN_Callback (); break;
- case 1: EP2_IN_Callback (); break;
- case 2: EP3_IN_Callback (); break;
- case 3: EP4_IN_Callback (); break;
- case 4: EP5_IN_Callback (); break;
- case 5: EP6_IN_Callback (); break;
- case 6: EP7_IN_Callback (); break;
- }
+ usb_cb_tx_done (ep_index);
}
}
}