]>
git.gir.st - tmk_keyboard.git/blob - protocol/ibm4704.c
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)
25 //while ( 0xA3 != ibm4704_recv() ) ;
32 uint8_t ibm4704_send(uint8_t data
)
34 bool parity
= true; // odd parity
42 /* wait for Start bit(Clock:lo/Data:hi) */
43 WAIT(data_hi
, 300, 0x30);
46 for (uint8_t i
= 0; i
< 8; i
++) {
47 WAIT(clock_hi
, 100, 0x31);
56 WAIT(clock_lo
, 100, 0x32);
60 WAIT(clock_hi
, 100, 4);
62 if (parity
) { data_hi(); } else { data_lo(); }
63 WAIT(clock_lo
, 100, 5);
66 WAIT(clock_hi
, 100, 4);
70 WAIT(data_lo
, 100, 6);
73 _delay_us(200); // wait to recover clock to hi
77 xprintf("x%02X ", ibm4704_error
);
78 _delay_us(200); // wait to recover clock to hi
82 /* receive data when host want else inhibit communication */
83 uint8_t ibm4704_recv_response(void)
85 // 250 * 100us(wait start bit in ibm4704_recv)
89 data
= ibm4704_recv();
90 } while (try-- && ibm4704_error
);
96 Clock ~~~~___~~_~~_~~_~~_~~_~~_~~_~~_~~_~~~~~~~~ H:60us/L:30us
98 Data ____~~X==X==X==X==X==X==X==X==X==X________
99 | 0 1 2 3 4 5 6 7 P(odd)
103 uint8_t ibm4704_recv(void)
106 bool parity
= true; // odd parity
107 ibm4704_error
= IBM4704_ERR_NONE
;
110 _delay_us(5); // wait for line settles
113 WAIT(clock_lo
, 100, 1); // wait for keyboard to send
114 WAIT(data_hi
, 100, 2); // can be delayed that long
116 WAIT(clock_hi
, 100, 3); // first rising edge which can take longer
118 for (uint8_t i
= 0; i
< 8; i
++) {
119 WAIT(clock_hi
, 100, 0x20+i
);
125 WAIT(clock_lo
, 150, 0x28+i
);
129 WAIT(clock_hi
, 100, 7);
130 if (data_in() != parity
) {
131 ibm4704_error
= IBM4704_ERR_PARITY
;
134 WAIT(clock_lo
, 150, 8);
137 WAIT(clock_hi
, 100, 9);
141 _delay_us(200); // wait to recover clock to hi
144 if (ibm4704_error
> 2) {
145 xprintf("x%02X ", ibm4704_error
);
148 _delay_us(200); // wait to recover clock to hi