]>
git.gir.st - tmk_keyboard.git/blob - protocol/ibm4704.c
d3fbcc541dcf85918cbc571fbdd11a3375a3e0a5
2 Copyright 2010,2011,2012,2013 Jun WAKO <wakojun@gmail.com>
5 #include <util/delay.h>
10 #define WAIT(stat, us, err) do { \
11 if (!wait_##stat(us)) { \
12 ibm4704_error = err; \
18 uint8_t ibm4704_error
= 0;
21 void ibm4704_init(void)
26 uint8_t ibm4704_send(uint8_t data
)
28 bool parity
= true; // odd parity
35 /* wait for Start bit(Clock:lo/Data:hi) */
36 WAIT(data_hi
, 300, 0x30);
39 for (uint8_t i
= 0; i
< 8; i
++) {
40 WAIT(clock_hi
, 100, 0x40+i
);
48 WAIT(clock_lo
, 100, 0x48+i
);
52 WAIT(clock_hi
, 100, 0x34);
53 if (parity
) { data_hi(); } else { data_lo(); }
54 WAIT(clock_lo
, 100, 0x35);
57 WAIT(clock_hi
, 100, 0x34);
61 WAIT(data_lo
, 100, 0x36);
64 _delay_us(200); // wait to recover clock to hi
68 if (ibm4704_error
>= 0x30) {
69 xprintf("x%02X ", ibm4704_error
);
71 _delay_us(200); // wait to recover clock to hi
75 /* receive data when host want else inhibit communication */
76 uint8_t ibm4704_recv_response(void)
78 // 250 * 100us(wait start bit in ibm4704_recv)
82 data
= ibm4704_recv();
83 } while (try-- && ibm4704_error
);
89 Clock ~~~~___~~_~~_~~_~~_~~_~~_~~_~~_~~_~~~~~~~~ H:60us/L:30us
91 Data ____~~X==X==X==X==X==X==X==X==X==X________
92 | 0 1 2 3 4 5 6 7 P(odd)
96 uint8_t ibm4704_recv(void)
99 bool parity
= true; // odd parity
100 ibm4704_error
= IBM4704_ERR_NONE
;
103 _delay_us(5); // wait for line settles
106 WAIT(clock_lo
, 100, 0x11); // wait for keyboard to send
107 WAIT(data_hi
, 100, 0x12); // can be delayed that long
109 WAIT(clock_hi
, 100, 0x13); // first rising edge which can take longer
111 for (uint8_t i
= 0; i
< 8; i
++) {
112 WAIT(clock_hi
, 100, 0x20+i
);
118 WAIT(clock_lo
, 150, 0x28+i
);
122 WAIT(clock_hi
, 100, 0x17);
123 if (data_in() != parity
) {
124 ibm4704_error
= IBM4704_ERR_PARITY
;
127 WAIT(clock_lo
, 150, 0x18);
130 WAIT(clock_hi
, 100, 0x19);
131 WAIT(data_lo
, 1, 0x19);
134 _delay_us(200); // wait to recover clock to hi
137 if (ibm4704_error
> 0x12) {
138 xprintf("x%02X ", ibm4704_error
);
141 _delay_us(200); // wait to recover clock to hi