aboutsummaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/README4
-rw-r--r--lib/pjrc_usb_serial/usb_serial.c12
-rw-r--r--lib/pjrc_usb_serial/usb_serial.patch39
3 files changed, 49 insertions, 6 deletions
diff --git a/lib/README b/lib/README
index 90c38ede..e6bdb7fd 100644
--- a/lib/README
+++ b/lib/README
@@ -3,7 +3,9 @@ This directory contains external library code.
The pjrc_usb_serial directory contains code from:
http://www.pjrc.com/teensy/usb_serial.html
version 1.7 (extracted on 20160605). It has been modified to compile
-on recent versions of gcc. See usb_serial.patch for the modifications.
+on recent versions of gcc, to support asynchronous notification of
+incoming data, and to not use SOF interrupts. See usb_serial.patch for
+the modifications.
The cmsis-sam3x8e directory contains code from the Arduino project:
https://www.arduino.cc/
diff --git a/lib/pjrc_usb_serial/usb_serial.c b/lib/pjrc_usb_serial/usb_serial.c
index ac5bc8a2..0c2488d5 100644
--- a/lib/pjrc_usb_serial/usb_serial.c
+++ b/lib/pjrc_usb_serial/usb_serial.c
@@ -325,7 +325,7 @@ void usb_init(void)
UDCON = 0; // enable attach resistor
usb_configuration = 0;
cdc_line_rtsdtr = 0;
- UDIEN = (1<<EORSTE)|(1<<SOFE);
+ UDIEN = (1<<EORSTE);
sei();
}
@@ -359,6 +359,7 @@ int16_t usb_serial_getchar(void)
UEINTX = 0x6B;
goto retry;
}
+ UEIENX = (1<<RXOUTE);
SREG = intr_state;
return -1;
}
@@ -775,7 +776,14 @@ static inline void usb_ack_out(void)
//
ISR(USB_COM_vect)
{
- uint8_t intbits;
+ uint8_t intbits = UEINT;
+ if (intbits & (1<<CDC_RX_ENDPOINT)) {
+ UENUM = CDC_RX_ENDPOINT;
+ UEIENX = 0;
+ extern void sched_wake_tasks(void);
+ sched_wake_tasks();
+ return;
+ }
const uint8_t *list;
const uint8_t *cfg;
uint8_t i, n, len, en;
diff --git a/lib/pjrc_usb_serial/usb_serial.patch b/lib/pjrc_usb_serial/usb_serial.patch
index 5aaa08e8..73fef81a 100644
--- a/lib/pjrc_usb_serial/usb_serial.patch
+++ b/lib/pjrc_usb_serial/usb_serial.patch
@@ -1,5 +1,5 @@
---- usb_serial.c 2011-04-19 05:54:12.000000000 -0400
-+++ usb_serial.c 2016-06-04 23:48:52.590001697 -0400
+--- ../../../lib/pjrc/usb_serial/usb_serial.c 2011-04-19 05:54:12.000000000 -0400
++++ usb_serial.c 2017-08-07 11:32:47.106357362 -0400
@@ -30,6 +30,7 @@
// Version 1.6: fix zero length packet bug
// Version 1.7: fix usb_serial_set_control
@@ -62,7 +62,24 @@
uint16_t wValue;
uint16_t wIndex;
const uint8_t *addr;
-@@ -646,7 +647,9 @@
+@@ -324,7 +325,7 @@
+ UDCON = 0; // enable attach resistor
+ usb_configuration = 0;
+ cdc_line_rtsdtr = 0;
+- UDIEN = (1<<EORSTE)|(1<<SOFE);
++ UDIEN = (1<<EORSTE);
+ sei();
+ }
+
+@@ -358,6 +359,7 @@
+ UEINTX = 0x6B;
+ goto retry;
+ }
++ UEIENX = (1<<RXOUTE);
+ SREG = intr_state;
+ return -1;
+ }
+@@ -646,7 +648,9 @@
// communication
uint32_t usb_serial_get_baud(void)
{
@@ -73,3 +90,19 @@
}
uint8_t usb_serial_get_stopbits(void)
{
+@@ -772,7 +776,14 @@
+ //
+ ISR(USB_COM_vect)
+ {
+- uint8_t intbits;
++ uint8_t intbits = UEINT;
++ if (intbits & (1<<CDC_RX_ENDPOINT)) {
++ UENUM = CDC_RX_ENDPOINT;
++ UEIENX = 0;
++ extern void sched_wake_tasks(void);
++ sched_wake_tasks();
++ return;
++ }
+ const uint8_t *list;
+ const uint8_t *cfg;
+ uint8_t i, n, len, en;