1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28#include <common.h>
29#ifdef CONFIG_MPC8260
30#include <ioports.h>
31#include <asm/io.h>
32#endif
33#if defined(CONFIG_AVR32)
34#include <asm/arch/portmux.h>
35#endif
36#if defined(CONFIG_AT91FAMILY)
37#include <asm/io.h>
38#include <asm/arch/hardware.h>
39#include <asm/arch/at91_pio.h>
40#ifdef CONFIG_AT91_LEGACY
41#include <asm/arch/gpio.h>
42#endif
43#endif
44#ifdef CONFIG_IXP425
45#include <asm/arch/ixp425.h>
46#endif
47#if defined(CONFIG_MPC852T) || defined(CONFIG_MPC866)
48#include <asm/io.h>
49#endif
50#include <i2c.h>
51
52#if defined(CONFIG_SOFT_I2C_GPIO_SCL)
53# include <asm/gpio.h>
54
55# ifndef I2C_GPIO_SYNC
56# define I2C_GPIO_SYNC
57# endif
58
59# ifndef I2C_INIT
60# define I2C_INIT \
61 do { \
62 gpio_request(CONFIG_SOFT_I2C_GPIO_SCL, "soft_i2c"); \
63 gpio_request(CONFIG_SOFT_I2C_GPIO_SDA, "soft_i2c"); \
64 } while (0)
65# endif
66
67# ifndef I2C_ACTIVE
68# define I2C_ACTIVE do { } while (0)
69# endif
70
71# ifndef I2C_TRISTATE
72# define I2C_TRISTATE do { } while (0)
73# endif
74
75# ifndef I2C_READ
76# define I2C_READ gpio_get_value(CONFIG_SOFT_I2C_GPIO_SDA)
77# endif
78
79# ifndef I2C_SDA
80# define I2C_SDA(bit) \
81 do { \
82 if (bit) \
83 gpio_direction_input(CONFIG_SOFT_I2C_GPIO_SDA); \
84 else \
85 gpio_direction_output(CONFIG_SOFT_I2C_GPIO_SDA, 0); \
86 I2C_GPIO_SYNC; \
87 } while (0)
88# endif
89
90# ifndef I2C_SCL
91# define I2C_SCL(bit) \
92 do { \
93 gpio_direction_output(CONFIG_SOFT_I2C_GPIO_SCL, bit); \
94 I2C_GPIO_SYNC; \
95 } while (0)
96# endif
97
98# ifndef I2C_DELAY
99# define I2C_DELAY udelay(5)
100# endif
101
102#endif
103
104
105
106#ifdef DEBUG_I2C
107DECLARE_GLOBAL_DATA_PTR;
108#endif
109
110
111
112
113
114#define RETRIES 0
115
116#define I2C_ACK 0
117#define I2C_NOACK 1
118
119
120#ifdef DEBUG_I2C
121#define PRINTD(fmt,args...) do { \
122 printf (fmt ,##args); \
123 } while (0)
124#else
125#define PRINTD(fmt,args...)
126#endif
127
128#if defined(CONFIG_I2C_MULTI_BUS)
129static unsigned int i2c_bus_num __attribute__ ((section (".data"))) = 0;
130#endif
131
132
133
134
135#if !defined(CONFIG_SYS_I2C_INIT_BOARD)
136static void send_reset (void);
137#endif
138static void send_start (void);
139static void send_stop (void);
140static void send_ack (int);
141static int write_byte (uchar byte);
142static uchar read_byte (int);
143
144#if !defined(CONFIG_SYS_I2C_INIT_BOARD)
145
146
147
148
149
150static void send_reset(void)
151{
152 I2C_SOFT_DECLARATIONS
153 int j;
154
155 I2C_SCL(1);
156 I2C_SDA(1);
157#ifdef I2C_INIT
158 I2C_INIT;
159#endif
160 I2C_TRISTATE;
161 for(j = 0; j < 9; j++) {
162 I2C_SCL(0);
163 I2C_DELAY;
164 I2C_DELAY;
165 I2C_SCL(1);
166 I2C_DELAY;
167 I2C_DELAY;
168 }
169 send_stop();
170 I2C_TRISTATE;
171}
172#endif
173
174
175
176
177static void send_start(void)
178{
179 I2C_SOFT_DECLARATIONS
180
181 I2C_DELAY;
182 I2C_SDA(1);
183 I2C_ACTIVE;
184 I2C_DELAY;
185 I2C_SCL(1);
186 I2C_DELAY;
187 I2C_SDA(0);
188 I2C_DELAY;
189}
190
191
192
193
194static void send_stop(void)
195{
196 I2C_SOFT_DECLARATIONS
197
198 I2C_SCL(0);
199 I2C_DELAY;
200 I2C_SDA(0);
201 I2C_ACTIVE;
202 I2C_DELAY;
203 I2C_SCL(1);
204 I2C_DELAY;
205 I2C_SDA(1);
206 I2C_DELAY;
207 I2C_TRISTATE;
208}
209
210
211
212
213static void send_ack(int ack)
214{
215 I2C_SOFT_DECLARATIONS
216
217 I2C_SCL(0);
218 I2C_DELAY;
219 I2C_ACTIVE;
220 I2C_SDA(ack);
221 I2C_DELAY;
222 I2C_SCL(1);
223 I2C_DELAY;
224 I2C_DELAY;
225 I2C_SCL(0);
226 I2C_DELAY;
227}
228
229
230
231
232static int write_byte(uchar data)
233{
234 I2C_SOFT_DECLARATIONS
235 int j;
236 int nack;
237
238 I2C_ACTIVE;
239 for(j = 0; j < 8; j++) {
240 I2C_SCL(0);
241 I2C_DELAY;
242 I2C_SDA(data & 0x80);
243 I2C_DELAY;
244 I2C_SCL(1);
245 I2C_DELAY;
246 I2C_DELAY;
247
248 data <<= 1;
249 }
250
251
252
253
254 I2C_SCL(0);
255 I2C_DELAY;
256 I2C_SDA(1);
257 I2C_TRISTATE;
258 I2C_DELAY;
259 I2C_SCL(1);
260 I2C_DELAY;
261 I2C_DELAY;
262 nack = I2C_READ;
263 I2C_SCL(0);
264 I2C_DELAY;
265 I2C_ACTIVE;
266
267 return(nack);
268}
269
270#if defined(CONFIG_I2C_MULTI_BUS)
271
272
273
274unsigned int i2c_get_bus_num(void)
275{
276 return i2c_bus_num;
277}
278
279int i2c_set_bus_num(unsigned int bus)
280{
281#if defined(CONFIG_I2C_MUX)
282 if (bus < CONFIG_SYS_MAX_I2C_BUS) {
283 i2c_bus_num = bus;
284 } else {
285 int ret;
286
287 ret = i2x_mux_select_mux(bus);
288 i2c_init_board();
289 if (ret == 0)
290 i2c_bus_num = bus;
291 else
292 return ret;
293 }
294#else
295 if (bus >= CONFIG_SYS_MAX_I2C_BUS)
296 return -1;
297 i2c_bus_num = bus;
298#endif
299 return 0;
300}
301#endif
302
303
304
305
306
307static uchar read_byte(int ack)
308{
309 I2C_SOFT_DECLARATIONS
310 int data;
311 int j;
312
313
314
315
316 I2C_TRISTATE;
317 I2C_SDA(1);
318 data = 0;
319 for(j = 0; j < 8; j++) {
320 I2C_SCL(0);
321 I2C_DELAY;
322 I2C_SCL(1);
323 I2C_DELAY;
324 data <<= 1;
325 data |= I2C_READ;
326 I2C_DELAY;
327 }
328 send_ack(ack);
329
330 return(data);
331}
332
333
334
335
336
337
338
339
340void i2c_init (int speed, int slaveaddr)
341{
342#if defined(CONFIG_SYS_I2C_INIT_BOARD)
343
344
345
346 i2c_init_board();
347#else
348
349
350
351
352
353
354 send_reset ();
355#endif
356}
357
358
359
360
361
362
363int i2c_probe(uchar addr)
364{
365 int rc;
366
367
368
369
370
371 send_start();
372 rc = write_byte ((addr << 1) | 0);
373 send_stop();
374
375 return (rc ? 1 : 0);
376}
377
378
379
380
381int i2c_read(uchar chip, uint addr, int alen, uchar *buffer, int len)
382{
383 int shift;
384 PRINTD("i2c_read: chip %02X addr %02X alen %d buffer %p len %d\n",
385 chip, addr, alen, buffer, len);
386
387#ifdef CONFIG_SYS_I2C_EEPROM_ADDR_OVERFLOW
388
389
390
391
392
393
394
395
396
397
398
399 chip |= ((addr >> (alen * 8)) & CONFIG_SYS_I2C_EEPROM_ADDR_OVERFLOW);
400
401 PRINTD("i2c_read: fix addr_overflow: chip %02X addr %02X\n",
402 chip, addr);
403#endif
404
405
406
407
408
409
410
411 send_start();
412 if(alen > 0) {
413 if(write_byte(chip << 1)) {
414 send_stop();
415 PRINTD("i2c_read, no chip responded %02X\n", chip);
416 return(1);
417 }
418 shift = (alen-1) * 8;
419 while(alen-- > 0) {
420 if(write_byte(addr >> shift)) {
421 PRINTD("i2c_read, address not <ACK>ed\n");
422 return(1);
423 }
424 shift -= 8;
425 }
426
427
428
429
430
431
432#ifdef CONFIG_SOFT_I2C_READ_REPEATED_START
433 send_start();
434#else
435 send_stop();
436 send_start();
437#endif
438 }
439
440
441
442
443
444 write_byte((chip << 1) | 1);
445 while(len-- > 0) {
446 *buffer++ = read_byte(len == 0);
447 }
448 send_stop();
449 return(0);
450}
451
452
453
454
455int i2c_write(uchar chip, uint addr, int alen, uchar *buffer, int len)
456{
457 int shift, failures = 0;
458
459 PRINTD("i2c_write: chip %02X addr %02X alen %d buffer %p len %d\n",
460 chip, addr, alen, buffer, len);
461
462 send_start();
463 if(write_byte(chip << 1)) {
464 send_stop();
465 PRINTD("i2c_write, no chip responded %02X\n", chip);
466 return(1);
467 }
468 shift = (alen-1) * 8;
469 while(alen-- > 0) {
470 if(write_byte(addr >> shift)) {
471 PRINTD("i2c_write, address not <ACK>ed\n");
472 return(1);
473 }
474 shift -= 8;
475 }
476
477 while(len-- > 0) {
478 if(write_byte(*buffer++)) {
479 failures++;
480 }
481 }
482 send_stop();
483 return(failures);
484}
485