summaryrefslogtreecommitdiffstats
path: root/firmware/main.c
diff options
context:
space:
mode:
authorcpldcpu <cpldcpu@gmail.com>2014-01-05 13:04:08 +0100
committercpldcpu <cpldcpu@gmail.com>2014-01-05 13:04:08 +0100
commit2b63296c16739cb720f3c6990b5516ca43ed9851 (patch)
tree850e902f7c23cc44b12f2e3247fb827606c27a81 /firmware/main.c
parenta1a11ed4888bfd84f2215321489b25944404b6ab (diff)
downloadmicronucleus-2b63296c16739cb720f3c6990b5516ca43ed9851.tar.gz
micronucleus-2b63296c16739cb720f3c6990b5516ca43ed9851.tar.bz2
micronucleus-2b63296c16739cb720f3c6990b5516ca43ed9851.zip
firmware: cleaning up
Diffstat (limited to 'firmware/main.c')
-rw-r--r--firmware/main.c81
1 files changed, 8 insertions, 73 deletions
diff --git a/firmware/main.c b/firmware/main.c
index a09bb4c..d3b1ce4 100644
--- a/firmware/main.c
+++ b/firmware/main.c
@@ -273,33 +273,6 @@ static inline void leaveBootloader(void) {
for (;;); // Make sure function does not return to help compiler optimize
}
-
-static void wait_usb_interrupt( void )
-{
- // Clear any stale pending interrupt, then wait for interrupt flag
- USB_INTR_PENDING = 1<<USB_INTR_PENDING_BIT;
- while ( !(USB_INTR_PENDING & (1<<USB_INTR_PENDING_BIT)) )
- wdt_reset();
-
- for ( ;; )
- {
- // Vector interrupt manually
- USB_INTR_PENDING = 1<<USB_INTR_PENDING_BIT;
- USB_INTR_VECTOR();
-
- // Wait a little while longer in case another one comes
- uchar n = 50; // about 90us timeout
- do {
- if ( !--n )
- goto handled;
- }
- while ( !(USB_INTR_PENDING & (1<<USB_INTR_PENDING_BIT)) );
- }
-handled:
- command=cmd_local_nop;
- usbPoll();
-}
-
int main(void) {
bootLoaderInit();
@@ -318,22 +291,6 @@ int main(void) {
}
do {
-// USB_INTR_PENDING = 1<<USB_INTR_PENDING_BIT; // <--
-
-/*
- uint8_t n=200;
- while (--n)
- {
- if (USB_INTR_PENDING & (1<<USB_INTR_PENDING_BIT))
- {
- // Vector interrupt manually
- USB_INTR_PENDING = 1<<USB_INTR_PENDING_BIT;
- USB_INTR_VECTOR();
- n=50; // 25µs
- }
- }
- */
-
while ( !(USB_INTR_PENDING & (1<<USB_INTR_PENDING_BIT)) );
USB_INTR_VECTOR();
@@ -347,7 +304,7 @@ int main(void) {
// Test whether another interrupt occured during the processing of USBpoll.
// If yes, we missed a data packet on the bus. This is not a big issue, since
// USB seems to allow timeout of up the two packets. (On my machine an USB
- // error is triggers after the third missed packet.)
+ // error is triggered after the third missed packet.)
// The most critical situation occurs when a PID IN packet is missed due to
// it's short length. Each packet + timeout takes around 45µs, meaning that
// usbpoll must take less than 90µs or resyncing is not possible.
@@ -355,11 +312,14 @@ int main(void) {
// a packet is transmitted. Therefore we have to wait until the bus is idle again.
//
// Just waiting for EOP (SE0) or no activity for 6 bus cycles is not enough,
- // as the host may have been sending a multi-packet transmisstion (eg. OUT, DATA0/1)
- // Restarting at the DATA packet may lead to errors.
+ // as the host may have been sending a multi-packet transmission (eg. OUT or SETUP)
+ // In that case we may resynch within a transmission, causing errors.
+ //
+ // A safer way is to wait until the bus was idle for the time it takes to send
+ // an ACK packet by the client (10.5µs on D+) but not as long as bus
+ // time out (12µs)
//
- // A safer way is to wait until the bus was idle for the the host-timeout
- // period (18 bit times = 12µs).
+ // TODO: Fix usb receiver to discard DATA1/0 packets without preceding OUT or SETUP
if (USB_INTR_PENDING & (1<<USB_INTR_PENDING_BIT)) // Usbpoll intersected with data packe
{
@@ -373,7 +333,6 @@ int main(void) {
uint8_t usbin=USBIN;
if (usbin&(1<<USB_CFG_DPLUS_BIT)) {tx=timeout;}
- // if (!(usbin&USBMASK)) {t=2;}
}
USB_INTR_PENDING = 1<<USB_INTR_PENDING_BIT;
@@ -396,12 +355,6 @@ int main(void) {
}
}
}
-
-// _delay_us(100);
- // wdt_reset(); // Only necessary if WDT is fused on
-
-// command=cmd_local_nop;
- // usbPoll();
idlePolls.w++;
@@ -410,24 +363,6 @@ int main(void) {
LED_MACRO( idlePolls.b[1] );
- // Wait for USB traffic to finish before a blocking event is executed
- // All events will render the MCU unresponsive to USB traffic for a while.
- /*
- if (command!=cmd_local_nop) {
- // Make sure all USB activity has finished before running any blocking events
- uint16_t n=1000;
- while (--n)
- {
- if (USB_INTR_PENDING & (1<<USB_INTR_PENDING_BIT))
- {
- // Vector interrupt manually
- USB_INTR_PENDING = 1<<USB_INTR_PENDING_BIT;
- USB_INTR_VECTOR();
- n=1000;
- }
- }
- }
- */
if (command==cmd_erase_application)
eraseApplication();
else if (command==cmd_write_page)