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