summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ao_usb.c33
-rw-r--r--cc1111.h6
2 files changed, 28 insertions, 11 deletions
diff --git a/ao_usb.c b/ao_usb.c
index 69f87fc4..315eea08 100644
--- a/ao_usb.c
+++ b/ao_usb.c
@@ -23,7 +23,20 @@ struct ao_task __xdata ao_usb_task;
static __xdata uint16_t ao_usb_in_bytes;
static __xdata uint16_t ao_usb_out_bytes;
static __xdata uint8_t ao_usb_iif;
-static __xdata uint8_t ao_usb_oif;
+static __xdata uint8_t ao_usb_running;
+
+static void
+ao_usb_set_interrupts(void)
+{
+ /* IN interrupts on the control an IN endpoints */
+ USBIIE = (1 << AO_USB_CONTROL_EP) | (1 << AO_USB_IN_EP);
+
+ /* OUT interrupts on the OUT endpoint */
+ USBOIE = (1 << AO_USB_OUT_EP);
+
+ /* Only care about reset */
+ USBCIE = USBCIE_RSTIE;
+}
/* This interrupt is shared with port 2,
* so when we hook that up, fix this
@@ -38,9 +51,11 @@ ao_usb_isr(void) interrupt 6
if (ao_usb_iif & (1 << AO_USB_IN_EP))
ao_wakeup(&ao_usb_in_bytes);
- ao_usb_oif |= USBOIF;
- if (ao_usb_oif & (1 << AO_USB_OUT_EP))
+ if (USBOIF & (1 << AO_USB_OUT_EP))
ao_wakeup(&ao_usb_out_bytes);
+
+ if (USBCIF & USBCIF_RSTIF)
+ ao_usb_set_interrupts();
}
struct ao_usb_setup {
@@ -136,6 +151,7 @@ ao_usb_ep0_queue_byte(uint8_t a)
void
ao_usb_set_address(uint8_t address)
{
+ ao_usb_running = 1;
USBADDR = address | 0x80;
while (USBADDR & 0x80)
;
@@ -318,6 +334,8 @@ ao_usb_flush(void) __critical
void
ao_usb_putchar(char c) __critical
{
+ if (!ao_usb_running)
+ return;
for (;;) {
USBINDEX = AO_USB_IN_EP;
if ((USBCSIL & USBCSIL_INPKT_RDY) == 0)
@@ -362,15 +380,8 @@ ao_usb_enable(void)
ao_usb_set_configuration();
- /* IN interrupts on the control an IN endpoints */
- USBIIE = (1 << AO_USB_CONTROL_EP) | (1 << AO_USB_IN_EP);
+ ao_usb_set_interrupts();
- /* OUT interrupts on the OUT endpoint */
- USBOIE = (1 << AO_USB_OUT_EP);
-
- /* Ignore control interrupts */
- USBCIE = 0;
-
/* enable USB interrupts */
IEN2 |= IEN2_USBIE;
diff --git a/cc1111.h b/cc1111.h
index 2045c716..4e451465 100644
--- a/cc1111.h
+++ b/cc1111.h
@@ -337,6 +337,12 @@ __xdata __at (0xde02) volatile uint8_t USBIIF;
__xdata __at (0xde04) volatile uint8_t USBOIF;
__xdata __at (0xde06) volatile uint8_t USBCIF;
+
+# define USBCIF_SOFIF (1 << 3)
+# define USBCIF_RSTIF (1 << 2)
+# define USBCIF_RESUMEIF (1 << 1)
+# define USBCIF_SUSPENDIF (1 << 0)
+
__xdata __at (0xde07) volatile uint8_t USBIIE;
__xdata __at (0xde09) volatile uint8_t USBOIE;