118
118
#define EP_TYPE_BULK_OUT 0x80
119
119
#define EP_TYPE_INTERRUPT_IN 0xC1
120
120
121
+ #define TX_RX_LED_INIT DDRD |= (1<<5), DDRB |= (1<<0)
122
+ #define TXLED0 PORTD |= (1<<5)
123
+ #define TXLED1 PORTD &= ~(1<<5)
124
+ #define RXLED0 PORTB |= (1<<0)
125
+ #define RXLED1 PORTB &= ~(1<<0)
126
+
127
+ #define TX_RX_LED_PULSE_MS 100
128
+
121
129
/**************************************************************************
122
130
*
123
131
* Descriptor Data
@@ -330,6 +338,8 @@ serial_init()
330
338
331
339
UDCON = 0 ; // enable attach resistor
332
340
UDIEN = (1 <<EORSTE )|(1 <<SOFE );
341
+
342
+ TX_RX_LED_INIT ;
333
343
}
334
344
335
345
@@ -351,6 +361,7 @@ serial_reset_read_buffer()
351
361
// Misc functions to wait for ready and send/receive packets
352
362
#define usb_wait_in_ready () while (!(UEINTX & (1<<TXINI ))) ;
353
363
#define usb_wait_receive_out () while (!(UEINTX & (1<<RXOUTI))) ;
364
+ #define usb_wait_io () while (!(UEINTX & ((1<<TXINI)|(1<<RXOUTI)))) ;
354
365
#define usb_send_in () UEINTX = ~(1<<TXINI );
355
366
#define usb_ack_out () UEINTX = ~(1<<RXOUTI);
356
367
@@ -359,11 +370,12 @@ static uint8_t transmit_previous_timeout=0;
359
370
360
371
#define TRANSMIT_TIMEOUT 25 /* in milliseconds */
361
372
#define TRANSMIT_FLUSH_TIMEOUT 5 /* in milliseconds */
362
-
373
+ volatile uint8_t tx_led_pulse , rx_led_pulse ;
363
374
// transmit a character.
364
375
void
365
376
serial_write (uint8_t c )
366
377
{
378
+ #if 1
367
379
uint8_t timeout , intr_state ;
368
380
369
381
// if we're not online (enumerated and configured), error
@@ -413,6 +425,53 @@ serial_write(uint8_t c)
413
425
UEINTX = 0x3A ;
414
426
transmit_flush_timer = TRANSMIT_FLUSH_TIMEOUT ;
415
427
SREG = intr_state ;
428
+ #else
429
+ if (!usb_configuration )
430
+ return ;
431
+
432
+ u8 timeout = 250 ; // 250ms timeout on send? TODO
433
+ while (len )
434
+ {
435
+ u8 n = USB_SendSpace (ep );
436
+ if (n == 0 )
437
+ {
438
+ if (!(-- timeout ))
439
+ return -1 ;
440
+ delay (1 );
441
+ continue ;
442
+ }
443
+
444
+ if (n > len )
445
+ n = len ;
446
+ {
447
+ LockEP lock (ep );
448
+ // Frame may have been released by the SOF interrupt handler
449
+ if (!ReadWriteAllowed ())
450
+ continue ;
451
+ len -= n ;
452
+ if (ep & TRANSFER_ZERO )
453
+ {
454
+ while (n -- )
455
+ Send8 (0 );
456
+ }
457
+ else if (ep & TRANSFER_PGM )
458
+ {
459
+ while (n -- )
460
+ Send8 (pgm_read_byte (data ++ ));
461
+ }
462
+ else
463
+ {
464
+ while (n -- )
465
+ Send8 (* data ++ );
466
+ }
467
+ if (!ReadWriteAllowed () || ((len == 0 ) && (ep & TRANSFER_RELEASE ))) // Release full buffer
468
+ ReleaseTX ();
469
+ }
470
+ }
471
+
472
+ #endif
473
+ TXLED1 ;
474
+ tx_led_pulse = TX_RX_LED_PULSE_MS ;
416
475
}
417
476
418
477
// Fetches the first byte in the serial read buffer. Called by main program.
@@ -427,16 +486,20 @@ serial_read()
427
486
intr_state = SREG ;
428
487
UENUM = CDC_RX_ENDPOINT ;
429
488
430
- while (!( UEINTX & (( 1 << TXINI )|( 1 << RXOUTI )))); // wait for rx/tx
489
+ usb_wait_io ();
431
490
if ((UEBCLX == 0 )) { // Empty buffer => flush it
432
491
UEINTX = 0x6B ;
433
492
goto exit ;
434
493
}
435
494
436
495
// take one byte out of the buffer
437
496
ret = UEDATX ;
497
+
498
+ RXLED1 ;
499
+ rx_led_pulse = TX_RX_LED_PULSE_MS ;
438
500
exit :
439
501
SREG = intr_state ;
502
+
440
503
return ret ;
441
504
}
442
505
@@ -476,6 +539,12 @@ ISR(USB_GEN_vect)
476
539
UEINTX = 0x3A ;
477
540
}
478
541
}
542
+ // check whether the one-shot period has elapsed. if so, turn off the LED
543
+ if (tx_led_pulse && !(-- tx_led_pulse ))
544
+ TXLED0 ;
545
+ if (rx_led_pulse && !(-- rx_led_pulse ))
546
+ RXLED0 ;
547
+
479
548
}
480
549
}
481
550
@@ -501,7 +570,7 @@ get_descriptor(uint16_t value, uint16_t index, uint16_t len)
501
570
if (len > desc_length ) len = desc_length ;
502
571
do {
503
572
// wait for host ready for IN packet
504
- while (!( UEINTX & (( 1 << TXINI )|( 1 << RXOUTI )))); // wait for rx/tx
573
+ usb_wait_io ();
505
574
// send IN packet
506
575
n = len < ENDPOINT0_SIZE ? len : ENDPOINT0_SIZE ;
507
576
for (i = n ; i ; i -- ) {
0 commit comments