]> git.donarmstrong.com Git - tmk_firmware.git/blob - protocol/ibm4704.h
Add Initial files of 4704_usb
[tmk_firmware.git] / protocol / ibm4704.h
1 /*
2 Copyright 2014 Jun WAKO <wakojun@gmail.com>
3 */
4 #ifndef IBM4704_H
5 #define IBM4704_H
6
7 #define IBM4704_ERR_NONE        0
8 #define IBM4704_ERR_STARTBIT    1
9 #define IBM4704_ERR_PARITY      0x70
10
11
12 void ibm4704_init(void);
13 uint8_t ibm4704_send(uint8_t data);
14 uint8_t ibm4704_recv_response(void);
15 uint8_t ibm4704_recv(void);
16
17
18 /* Check pin configuration */
19 #if !(defined(IBM4704_CLOCK_PORT) && \
20       defined(IBM4704_CLOCK_PIN) && \
21       defined(IBM4704_CLOCK_DDR) && \
22       defined(IBM4704_CLOCK_BIT))
23 #   error "ibm4704 clock pin configuration is required in config.h"
24 #endif
25
26 #if !(defined(IBM4704_DATA_PORT) && \
27       defined(IBM4704_DATA_PIN) && \
28       defined(IBM4704_DATA_DDR) && \
29       defined(IBM4704_DATA_BIT))
30 #   error "ibm4704 data pin configuration is required in config.h"
31 #endif
32
33
34 /*--------------------------------------------------------------------
35  * static functions
36  *------------------------------------------------------------------*/
37 static inline void clock_lo(void)
38 {
39     IBM4704_CLOCK_PORT &= ~(1<<IBM4704_CLOCK_BIT);
40     IBM4704_CLOCK_DDR  |=  (1<<IBM4704_CLOCK_BIT);
41 }
42 static inline void clock_hi(void)
43 {
44     /* input with pull up */
45     IBM4704_CLOCK_DDR  &= ~(1<<IBM4704_CLOCK_BIT);
46     IBM4704_CLOCK_PORT |=  (1<<IBM4704_CLOCK_BIT);
47 }
48 static inline bool clock_in(void)
49 {
50     IBM4704_CLOCK_DDR  &= ~(1<<IBM4704_CLOCK_BIT);
51     IBM4704_CLOCK_PORT |=  (1<<IBM4704_CLOCK_BIT);
52     _delay_us(1);
53     return IBM4704_CLOCK_PIN&(1<<IBM4704_CLOCK_BIT);
54 }
55 static inline void data_lo(void)
56 {
57     IBM4704_DATA_PORT &= ~(1<<IBM4704_DATA_BIT);
58     IBM4704_DATA_DDR  |=  (1<<IBM4704_DATA_BIT);
59 }
60 static inline void data_hi(void)
61 {
62     /* input with pull up */
63     IBM4704_DATA_DDR  &= ~(1<<IBM4704_DATA_BIT);
64     IBM4704_DATA_PORT |=  (1<<IBM4704_DATA_BIT);
65 }
66 static inline bool data_in(void)
67 {
68     IBM4704_DATA_DDR  &= ~(1<<IBM4704_DATA_BIT);
69     IBM4704_DATA_PORT |=  (1<<IBM4704_DATA_BIT);
70     _delay_us(1);
71     return IBM4704_DATA_PIN&(1<<IBM4704_DATA_BIT);
72 }
73
74 static inline uint16_t wait_clock_lo(uint16_t us)
75 {
76     while (clock_in()  && us) { asm(""); _delay_us(1); us--; }
77     return us;
78 }
79 static inline uint16_t wait_clock_hi(uint16_t us)
80 {
81     while (!clock_in() && us) { asm(""); _delay_us(1); us--; }
82     return us;
83 }
84 static inline uint16_t wait_data_lo(uint16_t us)
85 {
86     while (data_in() && us)  { asm(""); _delay_us(1); us--; }
87     return us;
88 }
89 static inline uint16_t wait_data_hi(uint16_t us)
90 {
91     while (!data_in() && us)  { asm(""); _delay_us(1); us--; }
92     return us;
93 }
94
95 /* idle state that device can send */
96 static inline void idle(void)
97 {
98     clock_hi();
99     data_hi();
100 }
101
102 /* inhibit device to send 
103  * keyboard checks Data line on start bit(Data:hi) and it stops sending if Data line is low.
104  */
105 static inline void inhibit(void)
106 {
107     clock_hi();
108     data_lo();
109 }
110
111 #endif