diff options
Diffstat (limited to 'tmk_core/protocol/ps2_usart.c')
-rw-r--r-- | tmk_core/protocol/ps2_usart.c | 88 |
1 files changed, 39 insertions, 49 deletions
diff --git a/tmk_core/protocol/ps2_usart.c b/tmk_core/protocol/ps2_usart.c index 6936ca7b8..6a66dc4a1 100644 --- a/tmk_core/protocol/ps2_usart.c +++ b/tmk_core/protocol/ps2_usart.c @@ -46,53 +46,48 @@ 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) -{ - idle(); // without this many USART errors occur when cable is disconnected +void ps2_host_init(void) { + idle(); // without this many USART errors occur when cable is disconnected PS2_USART_INIT(); PS2_USART_RX_INT_ON(); // POR(150-2000ms) plus BAT(300-500ms) may take 2.5sec([3]p.20) //_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_USART_OFF(); /* terminate a transmission if we have */ inhibit(); - _delay_us(100); // [4]p.13 + _delay_us(100); // [4]p.13 /* '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); @@ -131,8 +130,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()) { @@ -141,8 +139,7 @@ uint8_t ps2_host_recv_response(void) return pbuf_dequeue(); } -uint8_t ps2_host_recv(void) -{ +uint8_t ps2_host_recv(void) { if (pbuf_has_data()) { ps2_error = PS2_ERR_NONE; return pbuf_dequeue(); @@ -152,11 +149,10 @@ uint8_t ps2_host_recv(void) } } -ISR(PS2_USART_RX_VECT) -{ +ISR(PS2_USART_RX_VECT) { // TODO: request RESEND when error occurs? - uint8_t error = PS2_USART_ERROR; // USART error should be read before data - uint8_t data = PS2_USART_RX_DATA; + uint8_t error = PS2_USART_ERROR; // USART error should be read before data + uint8_t data = PS2_USART_RX_DATA; if (!error) { pbuf_enqueue(data); } else { @@ -165,59 +161,53 @@ ISR(PS2_USART_RX_VECT) } /* 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; } |