diff options
Diffstat (limited to 'tmk_core/protocol/adb.c')
| -rw-r--r-- | tmk_core/protocol/adb.c | 171 | 
1 files changed, 66 insertions, 105 deletions
| diff --git a/tmk_core/protocol/adb.c b/tmk_core/protocol/adb.c index 5c6c99b4fc..a23c919619 100644 --- a/tmk_core/protocol/adb.c +++ b/tmk_core/protocol/adb.c @@ -42,11 +42,10 @@ POSSIBILITY OF SUCH DAMAGE.  #include <avr/interrupt.h>  #include "adb.h" -  // GCC doesn't inline functions normally -#define data_lo() (ADB_DDR |=  (1<<ADB_DATA_BIT)) -#define data_hi() (ADB_DDR &= ~(1<<ADB_DATA_BIT)) -#define data_in() (ADB_PIN &   (1<<ADB_DATA_BIT)) +#define data_lo() (ADB_DDR |= (1 << ADB_DATA_BIT)) +#define data_hi() (ADB_DDR &= ~(1 << ADB_DATA_BIT)) +#define data_in() (ADB_PIN & (1 << ADB_DATA_BIT))  #ifdef ADB_PSW_BIT  static inline void psw_lo(void); @@ -54,18 +53,16 @@ static inline void psw_hi(void);  static inline bool psw_in(void);  #endif -static inline void attention(void); -static inline void place_bit0(void); -static inline void place_bit1(void); -static inline void send_byte(uint8_t data); +static inline void     attention(void); +static inline void     place_bit0(void); +static inline void     place_bit1(void); +static inline void     send_byte(uint8_t data);  static inline uint16_t wait_data_lo(uint16_t us);  static inline uint16_t wait_data_hi(uint16_t us);  static inline uint16_t adb_host_dev_recv(uint8_t device); - -void adb_host_init(void) -{ -    ADB_PORT &= ~(1<<ADB_DATA_BIT); +void adb_host_init(void) { +    ADB_PORT &= ~(1 << ADB_DATA_BIT);      data_hi();  #ifdef ADB_PSW_BIT      psw_hi(); @@ -73,10 +70,7 @@ void adb_host_init(void)  }  #ifdef ADB_PSW_BIT -bool adb_host_psw(void) -{ -    return psw_in(); -} +bool adb_host_psw(void) { return psw_in(); }  #endif  /* @@ -105,11 +99,11 @@ bool adb_host_psw(void)  // bit0:  //    70us bit cell:  //      ____________~~~~~~ -//      42-49        21-28   +//      42-49        21-28  //  //    130us bit cell:  //      ____________~~~~~~ -//      78-91        39-52   +//      78-91        39-52  //  // bit1:  //    70us bit cell: @@ -122,66 +116,50 @@ bool adb_host_psw(void)  //  // [from Apple IIgs Hardware Reference Second Edition] -enum { -    ADDR_KEYB  = 0x20, -    ADDR_MOUSE = 0x30 -}; +enum { ADDR_KEYB = 0x20, ADDR_MOUSE = 0x30 }; -uint16_t adb_host_kbd_recv(void) -{ -    return adb_host_dev_recv(ADDR_KEYB); -} +uint16_t adb_host_kbd_recv(void) { return adb_host_dev_recv(ADDR_KEYB); }  #ifdef ADB_MOUSE_ENABLE -void adb_mouse_init(void) { -	    return; -} +void adb_mouse_init(void) { return; } -uint16_t adb_host_mouse_recv(void) -{ -    return adb_host_dev_recv(ADDR_MOUSE); -} +uint16_t adb_host_mouse_recv(void) { return adb_host_dev_recv(ADDR_MOUSE); }  #endif -static inline uint16_t adb_host_dev_recv(uint8_t device) -{ +static inline uint16_t adb_host_dev_recv(uint8_t device) {      uint16_t data = 0;      cli();      attention(); -    send_byte(device|0x0C);     // Addr:Keyboard(0010)/Mouse(0011), Cmd:Talk(11), Register0(00) -    place_bit0();               // Stopbit(0) -    if (!wait_data_hi(500)) {    // Service Request(310us Adjustable Keyboard): just ignored +    send_byte(device | 0x0C);  // Addr:Keyboard(0010)/Mouse(0011), Cmd:Talk(11), Register0(00) +    place_bit0();              // Stopbit(0) +    if (!wait_data_hi(500)) {  // Service Request(310us Adjustable Keyboard): just ignored          sei(); -        return -30;             // something wrong +        return -30;  // something wrong      } -    if (!wait_data_lo(500)) {   // Tlt/Stop to Start(140-260us) +    if (!wait_data_lo(500)) {  // Tlt/Stop to Start(140-260us)          sei(); -        return 0;               // No data to send +        return 0;  // No data to send      } -     -    uint8_t n = 17; // start bit + 16 data bits + +    uint8_t n = 17;  // start bit + 16 data bits      do { -        uint8_t lo = (uint8_t) wait_data_hi(130); -        if (!lo) -            goto error; -         -        uint8_t hi = (uint8_t) wait_data_lo(lo); -        if (!hi) -            goto error; -         +        uint8_t lo = (uint8_t)wait_data_hi(130); +        if (!lo) goto error; + +        uint8_t hi = (uint8_t)wait_data_lo(lo); +        if (!hi) goto error; +          hi = lo - hi;          lo = 130 - lo; -         +          data <<= 1;          if (lo < hi) {              data |= 1; -        } -        else if (n == 17) { +        } else if (n == 17) {              sei();              return -20;          } -    } -    while ( --n ); +    } while (--n);      // Stop bit can't be checked normally since it could have service request lenghtening      // and its high state never goes low. @@ -197,76 +175,66 @@ error:      return -n;  } -void adb_host_listen(uint8_t cmd, uint8_t data_h, uint8_t data_l) -{ +void adb_host_listen(uint8_t cmd, uint8_t data_h, uint8_t data_l) {      cli();      attention();      send_byte(cmd); -    place_bit0();               // Stopbit(0) -    _delay_us(200);             // Tlt/Stop to Start -    place_bit1();               // Startbit(1) -    send_byte(data_h);  +    place_bit0();    // Stopbit(0) +    _delay_us(200);  // Tlt/Stop to Start +    place_bit1();    // Startbit(1) +    send_byte(data_h);      send_byte(data_l); -    place_bit0();               // Stopbit(0); +    place_bit0();  // Stopbit(0);      sei();  }  // send state of LEDs -void adb_host_kbd_led(uint8_t led) -{ +void adb_host_kbd_led(uint8_t led) {      // Addr:Keyboard(0010), Cmd:Listen(10), Register2(10)      // send upper byte (not used)      // send lower byte (bit2: ScrollLock, bit1: CapsLock, bit0: -    adb_host_listen(0x2A,0,led&0x07); +    adb_host_listen(0x2A, 0, led & 0x07);  } -  #ifdef ADB_PSW_BIT -static inline void psw_lo() -{ -    ADB_DDR  |=  (1<<ADB_PSW_BIT); -    ADB_PORT &= ~(1<<ADB_PSW_BIT); +static inline void psw_lo() { +    ADB_DDR |= (1 << ADB_PSW_BIT); +    ADB_PORT &= ~(1 << ADB_PSW_BIT);  } -static inline void psw_hi() -{ -    ADB_PORT |=  (1<<ADB_PSW_BIT); -    ADB_DDR  &= ~(1<<ADB_PSW_BIT); +static inline void psw_hi() { +    ADB_PORT |= (1 << ADB_PSW_BIT); +    ADB_DDR &= ~(1 << ADB_PSW_BIT);  } -static inline bool psw_in() -{ -    ADB_PORT |=  (1<<ADB_PSW_BIT); -    ADB_DDR  &= ~(1<<ADB_PSW_BIT); -    return ADB_PIN&(1<<ADB_PSW_BIT); +static inline bool psw_in() { +    ADB_PORT |= (1 << ADB_PSW_BIT); +    ADB_DDR &= ~(1 << ADB_PSW_BIT); +    return ADB_PIN & (1 << ADB_PSW_BIT);  }  #endif -static inline void attention(void) -{ +static inline void attention(void) {      data_lo(); -    _delay_us(800-35); // bit1 holds lo for 35 more +    _delay_us(800 - 35);  // bit1 holds lo for 35 more      place_bit1();  } -static inline void place_bit0(void) -{ +static inline void place_bit0(void) {      data_lo();      _delay_us(65);      data_hi();      _delay_us(35);  } -static inline void place_bit1(void) -{ +static inline void place_bit1(void) {      data_lo();      _delay_us(35);      data_hi();      _delay_us(65);  } -static inline void send_byte(uint8_t data) -{ +static inline void send_byte(uint8_t data) {      for (int i = 0; i < 8; i++) { -        if (data&(0x80>>i)) +        if (data & (0x80 >> i))              place_bit1();          else              place_bit0(); @@ -275,29 +243,22 @@ static inline void send_byte(uint8_t data)  // These are carefully coded to take 6 cycles of overhead.  // inline asm approach became too convoluted -static inline uint16_t wait_data_lo(uint16_t us) -{ +static inline uint16_t wait_data_lo(uint16_t us) {      do { -        if ( !data_in() ) -            break; +        if (!data_in()) break;          _delay_us(1 - (6 * 1000000.0 / F_CPU)); -    } -    while ( --us ); +    } while (--us);      return us;  } -static inline uint16_t wait_data_hi(uint16_t us) -{ +static inline uint16_t wait_data_hi(uint16_t us) {      do { -        if ( data_in() ) -            break; +        if (data_in()) break;          _delay_us(1 - (6 * 1000000.0 / F_CPU)); -    } -    while ( --us ); +    } while (--us);      return us;  } -  /*  ADB Protocol  ============ @@ -375,7 +336,7 @@ Commands      A A A A 1 1 R R     Talk(read from a device)      The command to read keycodes from keyboard is 0x2C which -    consist of keyboard address 2 and Talk against register 0.  +    consist of keyboard address 2 and Talk against register 0.      Address:      2:  keyboard @@ -457,7 +418,7 @@ Keyboard Data(Register0)  Keyboard LEDs & state of keys(Register2)      This register hold current state of three LEDs and nine keys.      The state of LEDs can be changed by sending Listen command. -     +      1514 . . . . . . 7 6 5 . 3 2 1 0       | | | | | | | | | | | | | | | +-   LED1(NumLock)       | | | | | | | | | | | | | | +---   LED2(CapsLock) | 
