diff options
Diffstat (limited to 'tmk_core/protocol/ps2_interrupt.c')
-rw-r--r-- | tmk_core/protocol/ps2_interrupt.c | 112 |
1 files changed, 52 insertions, 60 deletions
diff --git a/tmk_core/protocol/ps2_interrupt.c b/tmk_core/protocol/ps2_interrupt.c index 8114442ba..5afc8a82e 100644 --- a/tmk_core/protocol/ps2_interrupt.c +++ b/tmk_core/protocol/ps2_interrupt.c @@ -46,26 +46,22 @@ POSSIBILITY OF SUCH DAMAGE. #include "ps2_io.h" #include "print.h" - -#define WAIT(stat, us, err) do { \ - if (!wait_##stat(us)) { \ - ps2_error = err; \ - goto ERROR; \ - } \ -} while (0) - +#define WAIT(stat, us, err) \ + do { \ + if (!wait_##stat(us)) { \ + ps2_error = err; \ + goto ERROR; \ + } \ + } while (0) uint8_t ps2_error = PS2_ERR_NONE; - static inline uint8_t pbuf_dequeue(void); -static inline void pbuf_enqueue(uint8_t data); -static inline bool pbuf_has_data(void); -static inline void pbuf_clear(void); +static inline void pbuf_enqueue(uint8_t data); +static inline bool pbuf_has_data(void); +static inline void pbuf_clear(void); - -void ps2_host_init(void) -{ +void ps2_host_init(void) { idle(); PS2_INT_INIT(); PS2_INT_ON(); @@ -73,26 +69,25 @@ void ps2_host_init(void) //_delay_ms(2500); } -uint8_t ps2_host_send(uint8_t data) -{ +uint8_t ps2_host_send(uint8_t data) { bool parity = true; - ps2_error = PS2_ERR_NONE; + ps2_error = PS2_ERR_NONE; PS2_INT_OFF(); /* terminate a transmission if we have */ inhibit(); - _delay_us(100); // 100us [4]p.13, [5]p.50 + _delay_us(100); // 100us [4]p.13, [5]p.50 /* 'Request to Send' and Start bit */ data_lo(); clock_hi(); - WAIT(clock_lo, 10000, 10); // 10ms [5]p.50 + WAIT(clock_lo, 10000, 10); // 10ms [5]p.50 /* Data bit[2-9] */ for (uint8_t i = 0; i < 8; i++) { _delay_us(15); - if (data&(1<<i)) { + if (data & (1 << i)) { parity = !parity; data_hi(); } else { @@ -104,7 +99,11 @@ uint8_t ps2_host_send(uint8_t data) /* Parity bit */ _delay_us(15); - if (parity) { data_hi(); } else { data_lo(); } + if (parity) { + data_hi(); + } else { + data_lo(); + } WAIT(clock_hi, 50, 4); WAIT(clock_lo, 50, 5); @@ -129,8 +128,7 @@ ERROR: return 0; } -uint8_t ps2_host_recv_response(void) -{ +uint8_t ps2_host_recv_response(void) { // Command may take 25ms/20ms at most([5]p.46, [3]p.21) uint8_t retry = 25; while (retry-- && !pbuf_has_data()) { @@ -140,8 +138,7 @@ uint8_t ps2_host_recv_response(void) } /* get data received by interrupt */ -uint8_t ps2_host_recv(void) -{ +uint8_t ps2_host_recv(void) { if (pbuf_has_data()) { ps2_error = PS2_ERR_NONE; return pbuf_dequeue(); @@ -151,16 +148,22 @@ uint8_t ps2_host_recv(void) } } -ISR(PS2_INT_VECT) -{ +ISR(PS2_INT_VECT) { static enum { INIT, START, - BIT0, BIT1, BIT2, BIT3, BIT4, BIT5, BIT6, BIT7, + BIT0, + BIT1, + BIT2, + BIT3, + BIT4, + BIT5, + BIT6, + BIT7, PARITY, STOP, - } state = INIT; - static uint8_t data = 0; + } state = INIT; + static uint8_t data = 0; static uint8_t parity = 1; // TODO: abort if elapse 100us from previous interrupt @@ -173,8 +176,7 @@ ISR(PS2_INT_VECT) state++; switch (state) { case START: - if (data_in()) - goto ERROR; + if (data_in()) goto ERROR; break; case BIT0: case BIT1: @@ -192,16 +194,13 @@ ISR(PS2_INT_VECT) break; case PARITY: if (data_in()) { - if (!(parity & 0x01)) - goto ERROR; + if (!(parity & 0x01)) goto ERROR; } else { - if (parity & 0x01) - goto ERROR; + if (parity & 0x01) goto ERROR; } break; case STOP: - if (!data_in()) - goto ERROR; + if (!data_in()) goto ERROR; pbuf_enqueue(data); goto DONE; break; @@ -212,68 +211,61 @@ ISR(PS2_INT_VECT) ERROR: ps2_error = state; DONE: - state = INIT; - data = 0; + state = INIT; + data = 0; parity = 1; RETURN: return; } /* send LED state to keyboard */ -void ps2_host_set_led(uint8_t led) -{ +void ps2_host_set_led(uint8_t led) { ps2_host_send(0xED); ps2_host_send(led); } - /*-------------------------------------------------------------------- * Ring buffer to store scan codes from keyboard *------------------------------------------------------------------*/ #define PBUF_SIZE 32 -static uint8_t pbuf[PBUF_SIZE]; -static uint8_t pbuf_head = 0; -static uint8_t pbuf_tail = 0; -static inline void pbuf_enqueue(uint8_t data) -{ +static uint8_t pbuf[PBUF_SIZE]; +static uint8_t pbuf_head = 0; +static uint8_t pbuf_tail = 0; +static inline void pbuf_enqueue(uint8_t data) { uint8_t sreg = SREG; cli(); uint8_t next = (pbuf_head + 1) % PBUF_SIZE; if (next != pbuf_tail) { pbuf[pbuf_head] = data; - pbuf_head = next; + pbuf_head = next; } else { print("pbuf: full\n"); } SREG = sreg; } -static inline uint8_t pbuf_dequeue(void) -{ +static inline uint8_t pbuf_dequeue(void) { uint8_t val = 0; uint8_t sreg = SREG; cli(); if (pbuf_head != pbuf_tail) { - val = pbuf[pbuf_tail]; + val = pbuf[pbuf_tail]; pbuf_tail = (pbuf_tail + 1) % PBUF_SIZE; } SREG = sreg; return val; } -static inline bool pbuf_has_data(void) -{ +static inline bool pbuf_has_data(void) { uint8_t sreg = SREG; cli(); bool has_data = (pbuf_head != pbuf_tail); - SREG = sreg; + SREG = sreg; return has_data; } -static inline void pbuf_clear(void) -{ +static inline void pbuf_clear(void) { uint8_t sreg = SREG; cli(); pbuf_head = pbuf_tail = 0; - SREG = sreg; + SREG = sreg; } - |