diff options
Diffstat (limited to 'protocol')
| -rw-r--r-- | protocol/ibm4704.c | 45 | ||||
| -rw-r--r-- | protocol/lufa/lufa.c | 47 | ||||
| -rw-r--r-- | protocol/next_kbd.c | 16 | ||||
| -rw-r--r-- | protocol/pjrc/main.c | 2 | ||||
| m--------- | protocol/usb_hid/USB_Host_Shield_2.0/examples/testusbhostFAT/Arduino_Makefile_master | 0 | ||||
| m--------- | protocol/usb_hid/USB_Host_Shield_2.0/examples/testusbhostFAT/RTClib | 0 | ||||
| m--------- | protocol/usb_hid/USB_Host_Shield_2.0/examples/testusbhostFAT/generic_storage | 0 | ||||
| m--------- | protocol/usb_hid/USB_Host_Shield_2.0/examples/testusbhostFAT/xmem2 | 0 | ||||
| -rw-r--r-- | protocol/usb_hid/leonardo_led.h | 10 | ||||
| -rw-r--r-- | protocol/usb_hid/parser.cpp | 27 | 
10 files changed, 91 insertions, 56 deletions
| diff --git a/protocol/ibm4704.c b/protocol/ibm4704.c index a10a5e74d9..6a03cd4419 100644 --- a/protocol/ibm4704.c +++ b/protocol/ibm4704.c @@ -21,9 +21,10 @@ uint8_t ibm4704_error = 0;  void ibm4704_init(void)  { +    inhibit();  // keep keyboard from sending      IBM4704_INT_INIT();      IBM4704_INT_ON(); -    idle(); +    idle();     // allow keyboard sending  }  /* @@ -104,51 +105,44 @@ uint8_t ibm4704_recv_response(void)      return rbuf_dequeue();  } +uint8_t ibm4704_recv(void) +{ +    if (rbuf_has_data()) { +        return rbuf_dequeue(); +    } else { +        return -1; +    } +} +  /*  Keyboard to Host  ----------------  Data bits are LSB first and Parity is odd. Clock has around 60us high and 30us low part. -        ____      __   __   __   __   __   __   __   __   __   ________ -Clock       \____/  \_/  \_/  \_/  \_/  \_/  \_/  \_/  \_/  \_/ +        ____       __   __   __   __   __   __   __   __   __   _______ +Clock       \_____/  \_/  \_/  \_/  \_/  \_/  \_/  \_/  \_/  \_/               ____ ____ ____ ____ ____ ____ ____ ____ ____ ____      Data    ____/    X____X____X____X____X____X____X____X____X____X________              Start   0    1    2    3    4    5    6    7    P  Stop  Start bit:  can be long as 300-350us.  Inhibit:    Pull Data line down to inhibit keyboard to send. -Timing:     Host reads bit while Clock is hi. +Timing:     Host reads bit while Clock is hi.(rising edge)  Stop bit:   Keyboard pulls down Data line to lo after 9th clock.  */ -uint8_t ibm4704_recv(void) -{ -    if (rbuf_has_data()) { -        return rbuf_dequeue(); -    } else { -        return -1; -    } -} -  ISR(IBM4704_INT_VECT)  {      static enum { -        INIT, START, BIT0, BIT1, BIT2, BIT3, BIT4, BIT5, BIT6, BIT7, PARITY, -    } state = INIT; +        BIT0, BIT1, BIT2, BIT3, BIT4, BIT5, BIT6, BIT7, PARITY, STOP +    } state = BIT0;      // LSB first      static uint8_t data = 0;      // Odd parity      static uint8_t parity = false;      ibm4704_error = 0; -    // return unless falling edge -    if (clock_in()) { goto RETURN; }    // why this occurs? -    state++;      switch (state) { -        case START: -            // Data:Low -            WAIT(data_hi, 10, state); -            break;          case BIT0:          case BIT1:          case BIT2: @@ -169,6 +163,10 @@ ISR(IBM4704_INT_VECT)              }              if (!parity)                  goto ERROR; +            break; +        case STOP: +            // Data:Low +            WAIT(data_lo, 100, state);              rbuf_enqueue(data);              ibm4704_error = IBM4704_ERR_NONE;              goto DONE; @@ -176,13 +174,14 @@ ISR(IBM4704_INT_VECT)          default:              goto ERROR;      } +    state++;      goto RETURN;  ERROR:      ibm4704_error = state;      while (ibm4704_send(0xFE)) _delay_ms(1); // resend      xprintf("R:%02X%02X\n", state, data);  DONE: -    state = INIT; +    state = BIT0;      data = 0;      parity = false;  RETURN: diff --git a/protocol/lufa/lufa.c b/protocol/lufa/lufa.c index cdfc7bc6ad..345630aa90 100644 --- a/protocol/lufa/lufa.c +++ b/protocol/lufa/lufa.c @@ -53,6 +53,7 @@  #include "lufa.h"  uint8_t keyboard_idle = 0; +/* 0: Boot Protocol, 1: Report Protocol(default) */  uint8_t keyboard_protocol = 1;  static uint8_t keyboard_led_stats = 0; @@ -179,7 +180,6 @@ void EVENT_USB_Device_Reset(void)  void EVENT_USB_Device_Suspend()  {      print("[S]"); -    matrix_power_down();  #ifdef SLEEP_LED_ENABLE      sleep_led_enable();  #endif @@ -197,13 +197,30 @@ void EVENT_USB_Device_WakeUp()  #endif  } +#ifdef CONSOLE_ENABLE +static bool console_flush = false; +#define CONSOLE_FLUSH_SET(b)   do { \ +    uint8_t sreg = SREG; cli(); console_flush = b; SREG = sreg; \ +} while (0) + +// called every 1ms  void EVENT_USB_Device_StartOfFrame(void)  { +    static uint8_t count; +    if (++count % 50) return; +    count = 0; + +    if (!console_flush) return;      Console_Task(); +    console_flush = false;  } +#endif  /** Event handler for the USB_ConfigurationChanged event.   * This is fired when the host sets the current configuration of the USB device after enumeration. + * + * ATMega32u2 supports dual bank(ping-pong mode) only on endpoint 3 and 4, + * it is safe to use singl bank for all endpoints.   */  void EVENT_USB_Device_ConfigurationChanged(void)  { @@ -228,7 +245,7 @@ void EVENT_USB_Device_ConfigurationChanged(void)  #ifdef CONSOLE_ENABLE      /* Setup Console HID Report Endpoints */      ConfigSuccess &= ENDPOINT_CONFIG(CONSOLE_IN_EPNUM, EP_TYPE_INTERRUPT, ENDPOINT_DIR_IN, -                                     CONSOLE_EPSIZE, ENDPOINT_BANK_DOUBLE); +                                     CONSOLE_EPSIZE, ENDPOINT_BANK_SINGLE);  #if 0      ConfigSuccess &= ENDPOINT_CONFIG(CONSOLE_OUT_EPNUM, EP_TYPE_INTERRUPT, ENDPOINT_DIR_OUT,                                       CONSOLE_EPSIZE, ENDPOINT_BANK_SINGLE); @@ -333,10 +350,7 @@ void EVENT_USB_Device_ControlRequest(void)                      Endpoint_ClearSETUP();                      Endpoint_ClearStatusStage(); -                    keyboard_protocol = ((USB_ControlRequest.wValue & 0xFF) != 0x00); -#ifdef NKRO_ENABLE -                    keyboard_nkro = !!keyboard_protocol; -#endif +                    keyboard_protocol = (USB_ControlRequest.wValue & 0xFF);                      clear_keyboard();                  }              } @@ -383,7 +397,7 @@ static void send_keyboard(report_keyboard_t *report)      /* Select the Keyboard Report Endpoint */  #ifdef NKRO_ENABLE -    if (keyboard_nkro) { +    if (keyboard_protocol && keyboard_nkro) {          /* Report protocol - NKRO */          Endpoint_SelectEndpoint(NKRO_IN_EPNUM); @@ -491,6 +505,10 @@ int8_t sendchar(uint8_t c)      // Because sendchar() is called so many times, waiting each call causes big lag.      static bool timeouted = false; +    // prevents Console_Task() from running during sendchar() runs. +    // or char will be lost. These two function is mutually exclusive. +    CONSOLE_FLUSH_SET(false); +      if (USB_DeviceState != DEVICE_STATE_Configured)          return -1; @@ -524,8 +542,12 @@ int8_t sendchar(uint8_t c)      Endpoint_Write_8(c);      // send when bank is full -    if (!Endpoint_IsReadWriteAllowed()) +    if (!Endpoint_IsReadWriteAllowed()) { +        while (!(Endpoint_IsINReady()));          Endpoint_ClearIN(); +    } else { +        CONSOLE_FLUSH_SET(true); +    }      Endpoint_SelectEndpoint(ep);      return 0; @@ -544,7 +566,7 @@ int8_t sendchar(uint8_t c)  /*******************************************************************************   * main   ******************************************************************************/ -static void SetupHardware(void) +static void setup_mcu(void)  {      /* Disable watchdog if enabled by bootloader/fuses */      MCUSR &= ~(1 << WDRF); @@ -552,7 +574,10 @@ static void SetupHardware(void)      /* Disable clock division */      clock_prescale_set(clock_div_1); +} +static void setup_usb(void) +{      // Leonardo needs. Without this USB device is not recognized.      USB_Disable(); @@ -566,7 +591,9 @@ static void SetupHardware(void)  int main(void)  __attribute__ ((weak));  int main(void)  { -    SetupHardware(); +    setup_mcu(); +    keyboard_setup(); +    setup_usb();      sei();      /* wait for USB startup & debug output */ diff --git a/protocol/next_kbd.c b/protocol/next_kbd.c index a5a07a7a85..fa3034b3fe 100644 --- a/protocol/next_kbd.c +++ b/protocol/next_kbd.c @@ -59,10 +59,16 @@ static inline void query(void);  static inline void reset(void);  static inline uint32_t response(void); -#define out_hi_delay(intervals)  do { out_hi(); _delay_us(NEXT_KBD_TIMING * intervals); } while (0); -#define out_lo_delay(intervals)  do { out_lo(); _delay_us(NEXT_KBD_TIMING * intervals); } while (0); -#define query_delay(intervals)   do { query();  _delay_us(NEXT_KBD_TIMING * intervals); } while (0); -#define reset_delay(intervals)   do { reset();  _delay_us(NEXT_KBD_TIMING * intervals); } while (0); +/* The keyboard sends signal with 50us pulse width on OUT line + * while it seems to miss the 50us pulse on In line. + * next_kbd_set_leds() often fails to sync LED status with 50us + * but it works well with 51us(+1us) on TMK converter(ATMeaga32u2) at least. + * TODO: test on Teensy and Pro Micro configuration + */ +#define out_hi_delay(intervals)  do { out_hi(); _delay_us((NEXT_KBD_TIMING+1) * intervals); } while (0); +#define out_lo_delay(intervals)  do { out_lo(); _delay_us((NEXT_KBD_TIMING+1) * intervals); } while (0); +#define query_delay(intervals)   do { query();  _delay_us((NEXT_KBD_TIMING+1) * intervals); } while (0); +#define reset_delay(intervals)   do { reset();  _delay_us((NEXT_KBD_TIMING+1) * intervals); } while (0);  void next_kbd_init(void)  { @@ -79,6 +85,7 @@ void next_kbd_init(void)  void next_kbd_set_leds(bool left, bool right)  { +    cli();      out_lo_delay(9);      out_hi_delay(3); @@ -98,6 +105,7 @@ void next_kbd_set_leds(bool left, bool right)      out_lo_delay(7);      out_hi(); +    sei();  }  #define NEXT_KBD_READ (NEXT_KBD_IN_PIN&(1<<NEXT_KBD_IN_BIT)) diff --git a/protocol/pjrc/main.c b/protocol/pjrc/main.c index e7bdcc059a..45eb17d4cd 100644 --- a/protocol/pjrc/main.c +++ b/protocol/pjrc/main.c @@ -46,6 +46,8 @@ int main(void)      // set for 16 MHz clock      CPU_PRESCALE(0); +    keyboard_setup(); +      // Initialize the USB, and then wait for the host to set configuration.      // If the Teensy is powered without a PC connected to the USB port,      // this will wait forever. diff --git a/protocol/usb_hid/USB_Host_Shield_2.0/examples/testusbhostFAT/Arduino_Makefile_master b/protocol/usb_hid/USB_Host_Shield_2.0/examples/testusbhostFAT/Arduino_Makefile_master deleted file mode 160000 -Subproject 94c560c854c7a1dfc35e9de9db05de1b202de6c diff --git a/protocol/usb_hid/USB_Host_Shield_2.0/examples/testusbhostFAT/RTClib b/protocol/usb_hid/USB_Host_Shield_2.0/examples/testusbhostFAT/RTClib deleted file mode 160000 -Subproject c30fcdf1f112de581de7b145a97630539e5cff4 diff --git a/protocol/usb_hid/USB_Host_Shield_2.0/examples/testusbhostFAT/generic_storage b/protocol/usb_hid/USB_Host_Shield_2.0/examples/testusbhostFAT/generic_storage deleted file mode 160000 -Subproject 77762338286535dabb9c94b87060e33e487ff0f diff --git a/protocol/usb_hid/USB_Host_Shield_2.0/examples/testusbhostFAT/xmem2 b/protocol/usb_hid/USB_Host_Shield_2.0/examples/testusbhostFAT/xmem2 deleted file mode 160000 -Subproject 77b033420485f7d3d35430c0e8d4d844aa89483 diff --git a/protocol/usb_hid/leonardo_led.h b/protocol/usb_hid/leonardo_led.h deleted file mode 100644 index 6f67a88f5b..0000000000 --- a/protocol/usb_hid/leonardo_led.h +++ /dev/null @@ -1,10 +0,0 @@ -#ifndef LEONARDO_LED_H -#define LEONARDO_LED_H - -// Leonardo "TX" LED for debug -#define LED_TX_INIT    (DDRD  |=  (1<<5)) -#define LED_TX_ON      (PORTD &= ~(1<<5)) -#define LED_TX_OFF     (PORTD |=  (1<<5)) -#define LED_TX_TOGGLE  (PORTD ^=  (1<<5)) - -#endif diff --git a/protocol/usb_hid/parser.cpp b/protocol/usb_hid/parser.cpp index 28151f9d59..1a152ff3f2 100644 --- a/protocol/usb_hid/parser.cpp +++ b/protocol/usb_hid/parser.cpp @@ -10,15 +10,24 @@ uint16_t usb_hid_time_stamp;  void KBDReportParser::Parse(HID *hid, bool is_rpt_id, uint8_t len, uint8_t *buf)  { -    ::memcpy(&usb_hid_keyboard_report, buf, sizeof(report_keyboard_t)); -    usb_hid_time_stamp = millis(); +    bool is_error = false; +    report_keyboard_t *report = (report_keyboard_t *)buf; + +    dprintf("KBDReport: %02X %02X", report->mods, report->reserved); +    for (uint8_t i = 0; i < KEYBOARD_REPORT_KEYS; i++) { +        if (IS_ERROR(report->keys[i])) { +            is_error = true; +        } +        dprintf(" %02X", report->keys[i]); +    } +    dprint("\r\n"); -    debug("KBDReport: "); -    debug_hex(usb_hid_keyboard_report.mods); -    debug(" --"); -    for (uint8_t i = 0; i < 6; i++) { -        debug(" "); -        debug_hex(usb_hid_keyboard_report.keys[i]); +    // ignore error and not send report to computer +    if (is_error) { +        dprint("Error usage! \r\n"); +        return;      } -    debug("\r\n"); + +    ::memcpy(&usb_hid_keyboard_report, buf, sizeof(report_keyboard_t)); +    usb_hid_time_stamp = millis();  } | 
