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