]>
Commit | Line | Data |
---|---|---|
2d00de40 WD |
1 | #ifndef I2C_H |
2 | #define I2C_H | |
3 | ||
4 | /**************************************************** | |
5 | * | |
6 | * Copyright Motrola 1999 | |
7 | * | |
8 | ****************************************************/ | |
9 | #define get_eumbbar() CFG_EUMB_ADDR | |
10 | ||
11 | #define I2CADR 0x00003000 | |
12 | #define I2CFDR 0x00003004 | |
13 | #define I2CCR 0x00003008 | |
14 | #define I2CSR 0x0000300C | |
15 | #define I2CDR 0x00003010 | |
16 | ||
17 | typedef enum _i2cstatus | |
18 | { | |
19 | I2CSUCCESS = 0x3000, | |
20 | I2CADDRESS, | |
21 | I2CERROR, | |
22 | I2CBUFFFULL, | |
23 | I2CBUFFEMPTY, | |
24 | I2CXMITERROR, | |
25 | I2CRCVERROR, | |
26 | I2CBUSBUSY, | |
27 | I2CALOSS, | |
28 | I2CNOEVENT, | |
29 | } I2CStatus; | |
30 | ||
31 | typedef enum i2c_control | |
32 | { | |
33 | MEN = 0x00000080, | |
34 | MIEN = 0x00000040, | |
35 | MSTA = 0x00000020, | |
36 | MTX = 0x00000010, | |
37 | TXAK = 0x00000008, | |
38 | RSTA = 0x00000004, | |
39 | } I2C_CONTROL; | |
40 | ||
41 | typedef enum i2c_status | |
42 | { | |
43 | MCF = 0x00000080, | |
44 | MAAS = 0x00000040, | |
45 | MBB = 0x00000020, | |
46 | MAL = 0x00000010, | |
47 | SRW = 0x00000004, | |
48 | MIF = 0x00000002, | |
49 | RXAK = 0x00000001, | |
50 | } I2C_STATUS; | |
51 | ||
52 | typedef struct _i2c_ctrl | |
53 | { | |
54 | unsigned int reserved0 : 24; | |
55 | unsigned int men : 1; | |
56 | unsigned int mien : 1; | |
57 | unsigned int msta : 1; | |
58 | unsigned int mtx : 1; | |
59 | unsigned int txak : 1; | |
60 | unsigned int rsta : 1; | |
61 | unsigned int reserved1 : 2; | |
62 | } I2C_CTRL; | |
63 | ||
64 | typedef struct _i2c_stat | |
65 | { | |
66 | unsigned int rsrv0 : 24; | |
67 | unsigned int mcf : 1; | |
68 | unsigned int maas : 1; | |
69 | unsigned int mbb : 1; | |
70 | unsigned int mal : 1; | |
71 | unsigned int rsrv1 : 1; | |
72 | unsigned int srw : 1; | |
73 | unsigned int mif : 1; | |
74 | unsigned int rxak : 1; | |
75 | } I2C_STAT; | |
76 | ||
77 | typedef enum _i2c_mode | |
78 | { | |
79 | RCV = 0, | |
80 | XMIT = 1, | |
81 | } I2C_MODE; | |
82 | ||
83 | /******************** App. API ******************** | |
84 | * The application API is for user level application | |
85 | * to use the funcitonality provided by I2C driver | |
86 | * | |
87 | * Note: Its App.s responsibility to swap the data | |
88 | * byte. In our API, we just transfer whatever | |
89 | * we are given | |
90 | **************************************************/ | |
91 | /** | |
92 | * Note: | |
93 | * | |
94 | * In all following functions, | |
95 | * the caller shall pass the configured embedded utility memory | |
96 | * block base, EUMBBAR. | |
97 | **/ | |
98 | ||
99 | /* Send a buffer of data to the intended rcv_addr. | |
100 | * If stop_flag is set, after the whole buffer | |
101 | * is sent, generate a STOP signal provided that the | |
102 | * receiver doesn't signal the STOP in the middle. | |
103 | * I2C is the master performing transmitting. If | |
104 | * no STOP signal is generated at the end of current | |
105 | * transaction, the master can generate a START signal | |
106 | * to another slave addr. | |
107 | * | |
108 | * return I2CSUCCESS if no error. | |
109 | */ | |
110 | static I2CStatus I2C_put( unsigned int eumbbar, | |
111 | unsigned char rcv_addr, /* receiver's address */ | |
8bde7f77 | 112 | unsigned char *buffer_ptr, /* pointer of data to be sent */ |
2d00de40 WD |
113 | unsigned int length, /* number of byte of in the buffer */ |
114 | unsigned int stop_flag, /* 1 - signal STOP when buffer is empty | |
8bde7f77 WD |
115 | * 0 - no STOP signal when buffer is empty |
116 | */ | |
2d00de40 | 117 | unsigned int is_cnt ); /* 1 - this is a restart, don't check MBB |
8bde7f77 | 118 | * 0 - this is a new start, check MBB |
2d00de40 WD |
119 | */ |
120 | ||
121 | /* Receive a buffer of data from the desired sender_addr | |
122 | * If stop_flag is set, when the buffer is full and the | |
123 | * sender does not signal STOP, generate a STOP signal. | |
124 | * I2C is the master performing receiving. If no STOP signal | |
125 | * is generated, the master can generate a START signal | |
126 | * to another slave addr. | |
127 | * | |
128 | * return I2CSUCCESS if no error. | |
129 | */ | |
130 | static I2CStatus I2C_get( unsigned int eumbbar, | |
131 | unsigned char sender_addr, /* sender's address */ | |
132 | unsigned char *buffer_ptr, /* pointer of receiving buffer */ | |
8bde7f77 | 133 | unsigned int length, /* length of the receiving buffer */ |
2d00de40 | 134 | unsigned int stop_flag, /* 1 - signal STOP when buffer is full |
8bde7f77 | 135 | * 0 - no STOP signal when buffer is full |
2d00de40 WD |
136 | */ |
137 | unsigned int is_cnt ); /* 1 - this is a restart, don't check MBB | |
8bde7f77 | 138 | * 0 - this is a new start, check MBB |
2d00de40 WD |
139 | */ |
140 | ||
141 | #if 0 /* the I2C_write and I2C_read functions are not active */ | |
142 | /* Send a buffer of data to the requiring master. | |
143 | * If stop_flag is set, after the whole buffer is sent, | |
144 | * generate a STOP signal provided that the requiring | |
145 | * receiver doesn't signal the STOP in the middle. | |
146 | * I2C is the slave performing transmitting. | |
147 | * | |
148 | * return I2CSUCCESS if no error. | |
149 | * | |
150 | * Note: due to the Kahlua design, slave transmitter | |
151 | * shall not signal STOP since there is no way | |
152 | * for master to detect it, causing I2C bus hung. | |
153 | * | |
154 | * For the above reason, the stop_flag is always | |
155 | * set, i.e., 1. | |
156 | * | |
157 | * programmer shall use the timer on Kahlua to | |
158 | * control the interval of data byte at the | |
159 | * master side. | |
160 | */ | |
161 | static I2CStatus I2C_write( unsigned int eumbbar, | |
162 | unsigned char *buffer_ptr, /* pointer of data to be sent */ | |
8bde7f77 WD |
163 | unsigned int length, /* number of byte of in the buffer */ |
164 | unsigned int stop_flag ); /* 1 - signal STOP when buffer is empty | |
165 | * 0 - no STOP signal when buffer is empty | |
166 | */ | |
2d00de40 WD |
167 | |
168 | /* Receive a buffer of data from the sending master. | |
169 | * If stop_flag is set, when the buffer is full and the | |
170 | * sender does not signal STOP, generate a STOP signal. | |
171 | * I2C is the slave performing receiving. | |
172 | * | |
173 | * return I2CSUCCESS if no error. | |
174 | */ | |
175 | static I2CStatus I2C_read(unsigned int eumbbar, | |
176 | unsigned char *buffer_ptr, /* pointer of receiving buffer */ | |
177 | unsigned int length, /* length of the receiving buffer */ | |
8bde7f77 WD |
178 | unsigned int stop_flag ); /* 1 - signal STOP when buffer is full |
179 | * 0 - no STOP signal when buffer is full | |
2d00de40 WD |
180 | */ |
181 | #endif /* of if0 for turning off I2C_read & I2C_write */ | |
182 | ||
183 | /* if interrupt is not used, this is the timer event handler. | |
184 | * After each fixed time interval, this function can be called | |
185 | * to check the I2C status and call appropriate function to | |
186 | * handle the status event. | |
187 | */ | |
188 | static I2CStatus I2C_Timer_Event( unsigned int eumbbar, I2CStatus (*handler)( unsigned int ) ); | |
189 | ||
190 | /********************* Kernel API ************************ | |
191 | * Kernel APIs are functions I2C driver provides to the | |
192 | * O.S. | |
193 | *********************************************************/ | |
194 | ||
195 | /******************* device I/O function ***************/ | |
196 | ||
197 | /* Generate a START signal in the desired mode. | |
198 | * I2C is the master. | |
199 | * | |
200 | * return I2CSUCCESS if no error. | |
201 | * I2CERROR if i2c unit is not enabled. | |
202 | * I2CBUSBUSY if bus cannot be granted | |
203 | */ | |
204 | static I2CStatus I2C_Start( unsigned int eumbbar, | |
205 | unsigned char slave_addr, /* address of the receiver */ | |
8bde7f77 WD |
206 | I2C_MODE mode, /* XMIT(1) - put (write) |
207 | * RCV(0) - get (read) | |
2d00de40 WD |
208 | */ |
209 | unsigned int is_cnt ); /* 1 - this is a restart, don't check MBB | |
210 | * 0 - this is a new start, check MBB | |
8bde7f77 | 211 | */ |
2d00de40 WD |
212 | |
213 | /* Generate a STOP signal to terminate the transaction. */ | |
214 | static I2CStatus I2C_Stop( unsigned int eumbbar ); | |
215 | ||
216 | /* Do a one-byte master transmit. | |
217 | * | |
218 | * return I2CBUFFEMPTY if this is the last byte. | |
219 | * Otherwise return I2CSUCCESS | |
220 | */ | |
221 | static I2CStatus I2C_Master_Xmit( unsigned int eumbbar ); | |
222 | ||
223 | /* Do a one-byte master receive. | |
224 | * | |
225 | * return I2CBUFFFULL if this is the last byte. | |
226 | * Otherwise return I2CSUCCESS | |
227 | */ | |
228 | static I2CStatus I2C_Master_Rcv( unsigned int eumbbar ); | |
229 | ||
230 | /* Do a one-byte slave transmit. | |
231 | * | |
232 | * return I2CBUFFEMPTY if this is the last byte. | |
233 | * Otherwise return I2CSUCCESS | |
234 | * | |
235 | */ | |
236 | static I2CStatus I2C_Slave_Xmit( unsigned int eumbbar ); | |
237 | ||
238 | /* Do a one-byte slave receive. | |
239 | * | |
240 | * return I2CBUFFFULL if this is the last byte. | |
241 | * Otherwise return I2CSUCCESS | |
242 | */ | |
243 | static I2CStatus I2C_Slave_Rcv( unsigned int eumbbar ); | |
244 | ||
245 | /* Process slave address phase. | |
246 | * | |
247 | * return I2CADDRESS if this is slave receiver's address phase | |
248 | * Otherwise return the result of slave xmit one byte. | |
249 | */ | |
250 | static I2CStatus I2C_Slave_Addr( unsigned int eumbbar ); | |
251 | ||
252 | /******************* Device Control Fucntion ****************/ | |
253 | /* Initialize I2C unit with desired frequency divider, | |
254 | * driver's slave address w/o interrupt enabled. | |
255 | * | |
256 | * This function must be called before I2C unit can | |
257 | * be used. | |
258 | */ | |
259 | static I2CStatus I2C_Init( unsigned int eumbbar, | |
260 | unsigned char fdr, /* frequency divider */ | |
8bde7f77 WD |
261 | unsigned char addr, /* driver's address used for receiving */ |
262 | unsigned int en_int); /* 1 - enable I2C interrupt | |
263 | * 0 - disable I2C interrup | |
264 | */ | |
2d00de40 WD |
265 | |
266 | /* I2C interrupt service routine. | |
267 | * | |
268 | * return I2CADDRESS if it is receiver's (either master or slave) address phase. | |
269 | * return the result of xmit or receive one byte | |
270 | */ | |
271 | static I2CStatus I2C_ISR(unsigned int eumbbar ); | |
272 | ||
273 | /* Set I2C Status, i.e., write to I2CSR */ | |
274 | static void I2C_Set_Stat( unsigned int eumbbar, I2C_STAT stat ); | |
275 | ||
276 | /* Query I2C Status, i.e., read I2CSR */ | |
277 | static I2C_STAT I2C_Get_Stat( unsigned int eumbbar ); | |
278 | ||
279 | /* Change I2C Control bits, i.e., write to I2CCR */ | |
280 | static void I2C_Set_Ctrl( unsigned int eumbbar, I2C_CTRL ); /* new control value */ | |
281 | ||
282 | /* Query I2C Control bits, i.e., read I2CCR */ | |
283 | static I2C_CTRL I2C_Get_Ctrl( unsigned int eumbbar ); | |
284 | ||
285 | /* This function performs the work for I2C_do_transaction. The work is | |
286 | * split into this function to enable I2C_do_transaction to first transmit | |
287 | * the data address to the I2C slave device without putting the data address | |
288 | * into the first byte of the buffer. | |
289 | * | |
290 | * en_int controls interrupt/polling mode | |
291 | * act is the type of transaction | |
292 | * i2c_addr is the I2C address of the slave device | |
293 | * len is the length of data to send or receive | |
294 | * buffer is the address of the data buffer | |
295 | * stop = I2C_NO_STOP, don't signal STOP at end of transaction | |
296 | * I2C_STOP, signal STOP at end of transaction | |
297 | * retry is the timeout retry value, currently ignored | |
298 | * rsta = I2C_NO_RESTART, this is not continuation of existing transaction | |
299 | * I2C_RESTART, this is a continuation of existing transaction | |
300 | */ | |
301 | static I2C_Status I2C_do_buffer( I2C_INTERRUPT_MODE en_int, | |
8bde7f77 WD |
302 | I2C_TRANSACTION_MODE act, |
303 | unsigned char i2c_addr, | |
304 | int len, | |
305 | unsigned char *buffer, | |
306 | I2C_STOP_MODE stop, | |
307 | int retry, | |
308 | I2C_RESTART_MODE rsta); | |
2d00de40 | 309 | #endif |