X-Git-Url: https://git.friedersdorff.com/?a=blobdiff_plain;f=ps2.c;h=99749cf6ba4fc1aac707fa81b791fd0b39192029;hb=60052acc0fe3e6429f5c1d24073b1f6af019bd19;hp=52ee1691fbe2b5ac5eab58a4498d66d95cb81795;hpb=239bdbf41936566c0ae5b0cbd8c6bf7dd824f7fb;p=max%2Ftmk_keyboard.git diff --git a/ps2.c b/ps2.c index 52ee1691..99749cf6 100644 --- a/ps2.c +++ b/ps2.c @@ -187,6 +187,9 @@ static inline void pbuf_enqueue(uint8_t data) { if (!data) return; + + uint8_t sreg = SREG; + cli(); uint8_t next = (pbuf_head + 1) % PBUF_SIZE; if (next != pbuf_tail) { pbuf[pbuf_head] = data; @@ -194,10 +197,12 @@ static inline void pbuf_enqueue(uint8_t data) } else { debug("pbuf: full\n"); } + SREG = sreg; } static inline uint8_t pbuf_dequeue(void) { uint8_t val = 0; + uint8_t sreg = SREG; cli(); if (pbuf_head != pbuf_tail) { @@ -205,17 +210,20 @@ static inline uint8_t pbuf_dequeue(void) pbuf_tail = (pbuf_tail + 1) % PBUF_SIZE; } SREG = sreg; + return val; } /* get data received by interrupt */ uint8_t ps2_host_recv(void) { - // TODO: release clock line after 100us when inhibited by error if (ps2_error) { + print("x"); + phex(ps2_error); ps2_host_send(0xFE); // request to resend ps2_error = PS2_ERR_NONE; } + idle(); return pbuf_dequeue(); } @@ -281,7 +289,7 @@ ISR(PS2_INT_VECT) } goto RETURN; ERROR: - DEBUGP(0xFF); + DEBUGP(0x0F); inhibit(); ps2_error = state; DONE: