aboutsummaryrefslogtreecommitdiffstats
path: root/tmk_core/protocol/ps2_interrupt.c
diff options
context:
space:
mode:
Diffstat (limited to 'tmk_core/protocol/ps2_interrupt.c')
-rw-r--r--tmk_core/protocol/ps2_interrupt.c112
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;
}
-