1 /*!*****************************************************************************
2 *!
3 *! Implements an interface for i2c compatible eeproms to run under Linux.
4 *! Supports 2k, 8k(?) and 16k. Uses adaptive timing adjustments by
5 *! Johan.Adolfsson@axis.com
6 *!
7 *! Probing results:
8 *! 8k or not is detected (the assumes 2k or 16k)
9 *! 2k or 16k detected using test reads and writes.
10 *!
11 *!------------------------------------------------------------------------
12 *! HISTORY
13 *!
14 *! DATE NAME CHANGES
15 *! ---- ---- -------
16 *! Aug 28 1999 Edgar Iglesias Initial Version
17 *! Aug 31 1999 Edgar Iglesias Allow simultaneous users.
18 *! Sep 03 1999 Edgar Iglesias Updated probe.
19 *! Sep 03 1999 Edgar Iglesias Added bail-out stuff if we get interrupted
20 *! in the spin-lock.
21 *!
22 *! (c) 1999 Axis Communications AB, Lund, Sweden
23 *!*****************************************************************************/
24
25 #include <linux/kernel.h>
26 #include <linux/sched.h>
27 #include <linux/fs.h>
28 #include <linux/init.h>
29 #include <linux/delay.h>
30 #include <linux/interrupt.h>
31 #include <linux/wait.h>
32 #include <asm/uaccess.h>
33 #include "i2c.h"
34
35 #define D(x)
36
37 /* If we should use adaptive timing or not: */
38 /* #define EEPROM_ADAPTIVE_TIMING */
39
40 #define EEPROM_MAJOR_NR 122 /* use a LOCAL/EXPERIMENTAL major for now */
41 #define EEPROM_MINOR_NR 0
42
43 /* Empirical sane initial value of the delay, the value will be adapted to
44 * what the chip needs when using EEPROM_ADAPTIVE_TIMING.
45 */
46 #define INITIAL_WRITEDELAY_US 4000
47 #define MAX_WRITEDELAY_US 10000 /* 10 ms according to spec for 2KB EEPROM */
48
49 /* This one defines how many times to try when eeprom fails. */
50 #define EEPROM_RETRIES 10
51
52 #define EEPROM_2KB (2 * 1024)
53 /*#define EEPROM_4KB (4 * 1024)*/ /* Exists but not used in Axis products */
54 #define EEPROM_8KB (8 * 1024 - 1 ) /* Last byte has write protection bit */
55 #define EEPROM_16KB (16 * 1024)
56
57 #define i2c_delay(x) udelay(x)
58
59 /*
60 * This structure describes the attached eeprom chip.
61 * The values are probed for.
62 */
63
64 struct eeprom_type
65 {
66 unsigned long size;
67 unsigned long sequential_write_pagesize;
68 unsigned char select_cmd;
69 unsigned long usec_delay_writecycles; /* Min time between write cycles
70 (up to 10ms for some models) */
71 unsigned long usec_delay_step; /* For adaptive algorithm */
72 int adapt_state; /* 1 = To high , 0 = Even, -1 = To low */
73
74 /* this one is to keep the read/write operations atomic */
75 struct mutex lock;
76 int retry_cnt_addr; /* Used to keep track of number of retries for
77 adaptive timing adjustments */
78 int retry_cnt_read;
79 };
80
81 static int eeprom_open(struct inode * inode, struct file * file);
82 static loff_t eeprom_lseek(struct file * file, loff_t offset, int orig);
83 static ssize_t eeprom_read(struct file * file, char * buf, size_t count,
84 loff_t *off);
85 static ssize_t eeprom_write(struct file * file, const char * buf, size_t count,
86 loff_t *off);
87 static int eeprom_close(struct inode * inode, struct file * file);
88
89 static int eeprom_address(unsigned long addr);
90 static int read_from_eeprom(char * buf, int count);
91 static int eeprom_write_buf(loff_t addr, const char * buf, int count);
92 static int eeprom_read_buf(loff_t addr, char * buf, int count);
93
94 static void eeprom_disable_write_protect(void);
95
96
97 static const char eeprom_name[] = "eeprom";
98
99 /* chip description */
100 static struct eeprom_type eeprom;
101
102 /* This is the exported file-operations structure for this device. */
103 const struct file_operations eeprom_fops =
104 {
105 .llseek = eeprom_lseek,
106 .read = eeprom_read,
107 .write = eeprom_write,
108 .open = eeprom_open,
109 .release = eeprom_close
110 };
111
112 /* eeprom init call. Probes for different eeprom models. */
113
eeprom_init(void)114 int __init eeprom_init(void)
115 {
116 mutex_init(&eeprom.lock);
117
118 #ifdef CONFIG_ETRAX_I2C_EEPROM_PROBE
119 #define EETEXT "Found"
120 #else
121 #define EETEXT "Assuming"
122 #endif
123 if (register_chrdev(EEPROM_MAJOR_NR, eeprom_name, &eeprom_fops))
124 {
125 printk(KERN_INFO "%s: unable to get major %d for eeprom device\n",
126 eeprom_name, EEPROM_MAJOR_NR);
127 return -1;
128 }
129
130 printk("EEPROM char device v0.3, (c) 2000 Axis Communications AB\n");
131
132 /*
133 * Note: Most of this probing method was taken from the printserver (5470e)
134 * codebase. It did not contain a way of finding the 16kB chips
135 * (M24128 or variants). The method used here might not work
136 * for all models. If you encounter problems the easiest way
137 * is probably to define your model within #ifdef's, and hard-
138 * code it.
139 */
140
141 eeprom.size = 0;
142 eeprom.usec_delay_writecycles = INITIAL_WRITEDELAY_US;
143 eeprom.usec_delay_step = 128;
144 eeprom.adapt_state = 0;
145
146 #ifdef CONFIG_ETRAX_I2C_EEPROM_PROBE
147 i2c_start();
148 i2c_outbyte(0x80);
149 if(!i2c_getack())
150 {
151 /* It's not 8k.. */
152 int success = 0;
153 unsigned char buf_2k_start[16];
154
155 /* Im not sure this will work... :) */
156 /* assume 2kB, if failure go for 16kB */
157 /* Test with 16kB settings.. */
158 /* If it's a 2kB EEPROM and we address it outside it's range
159 * it will mirror the address space:
160 * 1. We read two locations (that are mirrored),
161 * if the content differs * it's a 16kB EEPROM.
162 * 2. if it doesn't differ - write different value to one of the locations,
163 * check the other - if content still is the same it's a 2k EEPROM,
164 * restore original data.
165 */
166 #define LOC1 8
167 #define LOC2 (0x1fb) /*1fb, 3ed, 5df, 7d1 */
168
169 /* 2k settings */
170 i2c_stop();
171 eeprom.size = EEPROM_2KB;
172 eeprom.select_cmd = 0xA0;
173 eeprom.sequential_write_pagesize = 16;
174 if( eeprom_read_buf( 0, buf_2k_start, 16 ) == 16 )
175 {
176 D(printk("2k start: '%16.16s'\n", buf_2k_start));
177 }
178 else
179 {
180 printk(KERN_INFO "%s: Failed to read in 2k mode!\n", eeprom_name);
181 }
182
183 /* 16k settings */
184 eeprom.size = EEPROM_16KB;
185 eeprom.select_cmd = 0xA0;
186 eeprom.sequential_write_pagesize = 64;
187
188 {
189 unsigned char loc1[4], loc2[4], tmp[4];
190 if( eeprom_read_buf(LOC2, loc2, 4) == 4)
191 {
192 if( eeprom_read_buf(LOC1, loc1, 4) == 4)
193 {
194 D(printk("0 loc1: (%i) '%4.4s' loc2 (%i) '%4.4s'\n",
195 LOC1, loc1, LOC2, loc2));
196 #if 0
197 if (memcmp(loc1, loc2, 4) != 0 )
198 {
199 /* It's 16k */
200 printk(KERN_INFO "%s: 16k detected in step 1\n", eeprom_name);
201 eeprom.size = EEPROM_16KB;
202 success = 1;
203 }
204 else
205 #endif
206 {
207 /* Do step 2 check */
208 /* Invert value */
209 loc1[0] = ~loc1[0];
210 if (eeprom_write_buf(LOC1, loc1, 1) == 1)
211 {
212 /* If 2k EEPROM this write will actually write 10 bytes
213 * from pos 0
214 */
215 D(printk("1 loc1: (%i) '%4.4s' loc2 (%i) '%4.4s'\n",
216 LOC1, loc1, LOC2, loc2));
217 if( eeprom_read_buf(LOC1, tmp, 4) == 4)
218 {
219 D(printk("2 loc1: (%i) '%4.4s' tmp '%4.4s'\n",
220 LOC1, loc1, tmp));
221 if (memcmp(loc1, tmp, 4) != 0 )
222 {
223 printk(KERN_INFO "%s: read and write differs! Not 16kB\n",
224 eeprom_name);
225 loc1[0] = ~loc1[0];
226
227 if (eeprom_write_buf(LOC1, loc1, 1) == 1)
228 {
229 success = 1;
230 }
231 else
232 {
233 printk(KERN_INFO "%s: Restore 2k failed during probe,"
234 " EEPROM might be corrupt!\n", eeprom_name);
235
236 }
237 i2c_stop();
238 /* Go to 2k mode and write original data */
239 eeprom.size = EEPROM_2KB;
240 eeprom.select_cmd = 0xA0;
241 eeprom.sequential_write_pagesize = 16;
242 if( eeprom_write_buf(0, buf_2k_start, 16) == 16)
243 {
244 }
245 else
246 {
247 printk(KERN_INFO "%s: Failed to write back 2k start!\n",
248 eeprom_name);
249 }
250
251 eeprom.size = EEPROM_2KB;
252 }
253 }
254
255 if(!success)
256 {
257 if( eeprom_read_buf(LOC2, loc2, 1) == 1)
258 {
259 D(printk("0 loc1: (%i) '%4.4s' loc2 (%i) '%4.4s'\n",
260 LOC1, loc1, LOC2, loc2));
261 if (memcmp(loc1, loc2, 4) == 0 )
262 {
263 /* Data the same, must be mirrored -> 2k */
264 /* Restore data */
265 printk(KERN_INFO "%s: 2k detected in step 2\n", eeprom_name);
266 loc1[0] = ~loc1[0];
267 if (eeprom_write_buf(LOC1, loc1, 1) == 1)
268 {
269 success = 1;
270 }
271 else
272 {
273 printk(KERN_INFO "%s: Restore 2k failed during probe,"
274 " EEPROM might be corrupt!\n", eeprom_name);
275
276 }
277
278 eeprom.size = EEPROM_2KB;
279 }
280 else
281 {
282 printk(KERN_INFO "%s: 16k detected in step 2\n",
283 eeprom_name);
284 loc1[0] = ~loc1[0];
285 /* Data differs, assume 16k */
286 /* Restore data */
287 if (eeprom_write_buf(LOC1, loc1, 1) == 1)
288 {
289 success = 1;
290 }
291 else
292 {
293 printk(KERN_INFO "%s: Restore 16k failed during probe,"
294 " EEPROM might be corrupt!\n", eeprom_name);
295 }
296
297 eeprom.size = EEPROM_16KB;
298 }
299 }
300 }
301 }
302 } /* read LOC1 */
303 } /* address LOC1 */
304 if (!success)
305 {
306 printk(KERN_INFO "%s: Probing failed!, using 2KB!\n", eeprom_name);
307 eeprom.size = EEPROM_2KB;
308 }
309 } /* read */
310 }
311 }
312 else
313 {
314 i2c_outbyte(0x00);
315 if(!i2c_getack())
316 {
317 /* No 8k */
318 eeprom.size = EEPROM_2KB;
319 }
320 else
321 {
322 i2c_start();
323 i2c_outbyte(0x81);
324 if (!i2c_getack())
325 {
326 eeprom.size = EEPROM_2KB;
327 }
328 else
329 {
330 /* It's a 8kB */
331 i2c_inbyte();
332 eeprom.size = EEPROM_8KB;
333 }
334 }
335 }
336 i2c_stop();
337 #elif defined(CONFIG_ETRAX_I2C_EEPROM_16KB)
338 eeprom.size = EEPROM_16KB;
339 #elif defined(CONFIG_ETRAX_I2C_EEPROM_8KB)
340 eeprom.size = EEPROM_8KB;
341 #elif defined(CONFIG_ETRAX_I2C_EEPROM_2KB)
342 eeprom.size = EEPROM_2KB;
343 #endif
344
345 switch(eeprom.size)
346 {
347 case (EEPROM_2KB):
348 printk("%s: " EETEXT " i2c compatible 2kB eeprom.\n", eeprom_name);
349 eeprom.sequential_write_pagesize = 16;
350 eeprom.select_cmd = 0xA0;
351 break;
352 case (EEPROM_8KB):
353 printk("%s: " EETEXT " i2c compatible 8kB eeprom.\n", eeprom_name);
354 eeprom.sequential_write_pagesize = 16;
355 eeprom.select_cmd = 0x80;
356 break;
357 case (EEPROM_16KB):
358 printk("%s: " EETEXT " i2c compatible 16kB eeprom.\n", eeprom_name);
359 eeprom.sequential_write_pagesize = 64;
360 eeprom.select_cmd = 0xA0;
361 break;
362 default:
363 eeprom.size = 0;
364 printk("%s: Did not find a supported eeprom\n", eeprom_name);
365 break;
366 }
367
368
369
370 eeprom_disable_write_protect();
371
372 return 0;
373 }
374
375 /* Opens the device. */
eeprom_open(struct inode * inode,struct file * file)376 static int eeprom_open(struct inode * inode, struct file * file)
377 {
378 if(iminor(inode) != EEPROM_MINOR_NR)
379 return -ENXIO;
380 if(imajor(inode) != EEPROM_MAJOR_NR)
381 return -ENXIO;
382
383 if( eeprom.size > 0 )
384 {
385 /* OK */
386 return 0;
387 }
388
389 /* No EEprom found */
390 return -EFAULT;
391 }
392
393 /* Changes the current file position. */
394
eeprom_lseek(struct file * file,loff_t offset,int orig)395 static loff_t eeprom_lseek(struct file * file, loff_t offset, int orig)
396 {
397 /*
398 * orig 0: position from begning of eeprom
399 * orig 1: relative from current position
400 * orig 2: position from last eeprom address
401 */
402
403 switch (orig)
404 {
405 case 0:
406 file->f_pos = offset;
407 break;
408 case 1:
409 file->f_pos += offset;
410 break;
411 case 2:
412 file->f_pos = eeprom.size - offset;
413 break;
414 default:
415 return -EINVAL;
416 }
417
418 /* truncate position */
419 if (file->f_pos < 0)
420 {
421 file->f_pos = 0;
422 return(-EOVERFLOW);
423 }
424
425 if (file->f_pos >= eeprom.size)
426 {
427 file->f_pos = eeprom.size - 1;
428 return(-EOVERFLOW);
429 }
430
431 return ( file->f_pos );
432 }
433
434 /* Reads data from eeprom. */
435
eeprom_read_buf(loff_t addr,char * buf,int count)436 static int eeprom_read_buf(loff_t addr, char * buf, int count)
437 {
438 return eeprom_read(NULL, buf, count, &addr);
439 }
440
441
442
443 /* Reads data from eeprom. */
444
eeprom_read(struct file * file,char * buf,size_t count,loff_t * off)445 static ssize_t eeprom_read(struct file * file, char * buf, size_t count, loff_t *off)
446 {
447 int read=0;
448 unsigned long p = *off;
449
450 unsigned char page;
451
452 if(p >= eeprom.size) /* Address i 0 - (size-1) */
453 {
454 return -EFAULT;
455 }
456
457 if (mutex_lock_interruptible(&eeprom.lock))
458 return -EINTR;
459
460 page = (unsigned char) (p >> 8);
461
462 if(!eeprom_address(p))
463 {
464 printk(KERN_INFO "%s: Read failed to address the eeprom: "
465 "0x%08X (%i) page: %i\n", eeprom_name, (int)p, (int)p, page);
466 i2c_stop();
467
468 /* don't forget to wake them up */
469 mutex_unlock(&eeprom.lock);
470 return -EFAULT;
471 }
472
473 if( (p + count) > eeprom.size)
474 {
475 /* truncate count */
476 count = eeprom.size - p;
477 }
478
479 /* stop dummy write op and initiate the read op */
480 i2c_start();
481
482 /* special case for small eeproms */
483 if(eeprom.size < EEPROM_16KB)
484 {
485 i2c_outbyte( eeprom.select_cmd | 1 | (page << 1) );
486 }
487
488 /* go on with the actual read */
489 read = read_from_eeprom( buf, count);
490
491 if(read > 0)
492 {
493 *off += read;
494 }
495
496 mutex_unlock(&eeprom.lock);
497 return read;
498 }
499
500 /* Writes data to eeprom. */
501
eeprom_write_buf(loff_t addr,const char * buf,int count)502 static int eeprom_write_buf(loff_t addr, const char * buf, int count)
503 {
504 return eeprom_write(NULL, buf, count, &addr);
505 }
506
507
508 /* Writes data to eeprom. */
509
eeprom_write(struct file * file,const char * buf,size_t count,loff_t * off)510 static ssize_t eeprom_write(struct file * file, const char * buf, size_t count,
511 loff_t *off)
512 {
513 int i, written, restart=1;
514 unsigned long p;
515
516 if (!access_ok(VERIFY_READ, buf, count))
517 {
518 return -EFAULT;
519 }
520
521 /* bail out if we get interrupted */
522 if (mutex_lock_interruptible(&eeprom.lock))
523 return -EINTR;
524 for(i = 0; (i < EEPROM_RETRIES) && (restart > 0); i++)
525 {
526 restart = 0;
527 written = 0;
528 p = *off;
529
530
531 while( (written < count) && (p < eeprom.size))
532 {
533 /* address the eeprom */
534 if(!eeprom_address(p))
535 {
536 printk(KERN_INFO "%s: Write failed to address the eeprom: "
537 "0x%08X (%i) \n", eeprom_name, (int)p, (int)p);
538 i2c_stop();
539
540 /* don't forget to wake them up */
541 mutex_unlock(&eeprom.lock);
542 return -EFAULT;
543 }
544 #ifdef EEPROM_ADAPTIVE_TIMING
545 /* Adaptive algorithm to adjust timing */
546 if (eeprom.retry_cnt_addr > 0)
547 {
548 /* To Low now */
549 D(printk(">D=%i d=%i\n",
550 eeprom.usec_delay_writecycles, eeprom.usec_delay_step));
551
552 if (eeprom.usec_delay_step < 4)
553 {
554 eeprom.usec_delay_step++;
555 eeprom.usec_delay_writecycles += eeprom.usec_delay_step;
556 }
557 else
558 {
559
560 if (eeprom.adapt_state > 0)
561 {
562 /* To Low before */
563 eeprom.usec_delay_step *= 2;
564 if (eeprom.usec_delay_step > 2)
565 {
566 eeprom.usec_delay_step--;
567 }
568 eeprom.usec_delay_writecycles += eeprom.usec_delay_step;
569 }
570 else if (eeprom.adapt_state < 0)
571 {
572 /* To High before (toggle dir) */
573 eeprom.usec_delay_writecycles += eeprom.usec_delay_step;
574 if (eeprom.usec_delay_step > 1)
575 {
576 eeprom.usec_delay_step /= 2;
577 eeprom.usec_delay_step--;
578 }
579 }
580 }
581
582 eeprom.adapt_state = 1;
583 }
584 else
585 {
586 /* To High (or good) now */
587 D(printk("<D=%i d=%i\n",
588 eeprom.usec_delay_writecycles, eeprom.usec_delay_step));
589
590 if (eeprom.adapt_state < 0)
591 {
592 /* To High before */
593 if (eeprom.usec_delay_step > 1)
594 {
595 eeprom.usec_delay_step *= 2;
596 eeprom.usec_delay_step--;
597
598 if (eeprom.usec_delay_writecycles > eeprom.usec_delay_step)
599 {
600 eeprom.usec_delay_writecycles -= eeprom.usec_delay_step;
601 }
602 }
603 }
604 else if (eeprom.adapt_state > 0)
605 {
606 /* To Low before (toggle dir) */
607 if (eeprom.usec_delay_writecycles > eeprom.usec_delay_step)
608 {
609 eeprom.usec_delay_writecycles -= eeprom.usec_delay_step;
610 }
611 if (eeprom.usec_delay_step > 1)
612 {
613 eeprom.usec_delay_step /= 2;
614 eeprom.usec_delay_step--;
615 }
616
617 eeprom.adapt_state = -1;
618 }
619
620 if (eeprom.adapt_state > -100)
621 {
622 eeprom.adapt_state--;
623 }
624 else
625 {
626 /* Restart adaption */
627 D(printk("#Restart\n"));
628 eeprom.usec_delay_step++;
629 }
630 }
631 #endif /* EEPROM_ADAPTIVE_TIMING */
632 /* write until we hit a page boundary or count */
633 do
634 {
635 i2c_outbyte(buf[written]);
636 if(!i2c_getack())
637 {
638 restart=1;
639 printk(KERN_INFO "%s: write error, retrying. %d\n", eeprom_name, i);
640 i2c_stop();
641 break;
642 }
643 written++;
644 p++;
645 } while( written < count && ( p % eeprom.sequential_write_pagesize ));
646
647 /* end write cycle */
648 i2c_stop();
649 i2c_delay(eeprom.usec_delay_writecycles);
650 } /* while */
651 } /* for */
652
653 mutex_unlock(&eeprom.lock);
654 if (written == 0 && p >= eeprom.size){
655 return -ENOSPC;
656 }
657 *off = p;
658 return written;
659 }
660
661 /* Closes the device. */
662
eeprom_close(struct inode * inode,struct file * file)663 static int eeprom_close(struct inode * inode, struct file * file)
664 {
665 /* do nothing for now */
666 return 0;
667 }
668
669 /* Sets the current address of the eeprom. */
670
eeprom_address(unsigned long addr)671 static int eeprom_address(unsigned long addr)
672 {
673 int i;
674 unsigned char page, offset;
675
676 page = (unsigned char) (addr >> 8);
677 offset = (unsigned char) addr;
678
679 for(i = 0; i < EEPROM_RETRIES; i++)
680 {
681 /* start a dummy write for addressing */
682 i2c_start();
683
684 if(eeprom.size == EEPROM_16KB)
685 {
686 i2c_outbyte( eeprom.select_cmd );
687 i2c_getack();
688 i2c_outbyte(page);
689 }
690 else
691 {
692 i2c_outbyte( eeprom.select_cmd | (page << 1) );
693 }
694 if(!i2c_getack())
695 {
696 /* retry */
697 i2c_stop();
698 /* Must have a delay here.. 500 works, >50, 100->works 5th time*/
699 i2c_delay(MAX_WRITEDELAY_US / EEPROM_RETRIES * i);
700 /* The chip needs up to 10 ms from write stop to next start */
701
702 }
703 else
704 {
705 i2c_outbyte(offset);
706
707 if(!i2c_getack())
708 {
709 /* retry */
710 i2c_stop();
711 }
712 else
713 break;
714 }
715 }
716
717
718 eeprom.retry_cnt_addr = i;
719 D(printk("%i\n", eeprom.retry_cnt_addr));
720 if(eeprom.retry_cnt_addr == EEPROM_RETRIES)
721 {
722 /* failed */
723 return 0;
724 }
725 return 1;
726 }
727
728 /* Reads from current address. */
729
read_from_eeprom(char * buf,int count)730 static int read_from_eeprom(char * buf, int count)
731 {
732 int i, read=0;
733
734 for(i = 0; i < EEPROM_RETRIES; i++)
735 {
736 if(eeprom.size == EEPROM_16KB)
737 {
738 i2c_outbyte( eeprom.select_cmd | 1 );
739 }
740
741 if(i2c_getack())
742 {
743 break;
744 }
745 }
746
747 if(i == EEPROM_RETRIES)
748 {
749 printk(KERN_INFO "%s: failed to read from eeprom\n", eeprom_name);
750 i2c_stop();
751
752 return -EFAULT;
753 }
754
755 while( (read < count))
756 {
757 if (put_user(i2c_inbyte(), &buf[read++]))
758 {
759 i2c_stop();
760
761 return -EFAULT;
762 }
763
764 /*
765 * make sure we don't ack last byte or you will get very strange
766 * results!
767 */
768 if(read < count)
769 {
770 i2c_sendack();
771 }
772 }
773
774 /* stop the operation */
775 i2c_stop();
776
777 return read;
778 }
779
780 /* Disables write protection if applicable. */
781
782 #define DBP_SAVE(x)
783 #define ax_printf printk
eeprom_disable_write_protect(void)784 static void eeprom_disable_write_protect(void)
785 {
786 /* Disable write protect */
787 if (eeprom.size == EEPROM_8KB)
788 {
789 /* Step 1 Set WEL = 1 (write 00000010 to address 1FFFh */
790 i2c_start();
791 i2c_outbyte(0xbe);
792 if(!i2c_getack())
793 {
794 DBP_SAVE(ax_printf("Get ack returns false\n"));
795 }
796 i2c_outbyte(0xFF);
797 if(!i2c_getack())
798 {
799 DBP_SAVE(ax_printf("Get ack returns false 2\n"));
800 }
801 i2c_outbyte(0x02);
802 if(!i2c_getack())
803 {
804 DBP_SAVE(ax_printf("Get ack returns false 3\n"));
805 }
806 i2c_stop();
807
808 i2c_delay(1000);
809
810 /* Step 2 Set RWEL = 1 (write 00000110 to address 1FFFh */
811 i2c_start();
812 i2c_outbyte(0xbe);
813 if(!i2c_getack())
814 {
815 DBP_SAVE(ax_printf("Get ack returns false 55\n"));
816 }
817 i2c_outbyte(0xFF);
818 if(!i2c_getack())
819 {
820 DBP_SAVE(ax_printf("Get ack returns false 52\n"));
821 }
822 i2c_outbyte(0x06);
823 if(!i2c_getack())
824 {
825 DBP_SAVE(ax_printf("Get ack returns false 53\n"));
826 }
827 i2c_stop();
828
829 /* Step 3 Set BP1, BP0, and/or WPEN bits (write 00000110 to address 1FFFh */
830 i2c_start();
831 i2c_outbyte(0xbe);
832 if(!i2c_getack())
833 {
834 DBP_SAVE(ax_printf("Get ack returns false 56\n"));
835 }
836 i2c_outbyte(0xFF);
837 if(!i2c_getack())
838 {
839 DBP_SAVE(ax_printf("Get ack returns false 57\n"));
840 }
841 i2c_outbyte(0x06);
842 if(!i2c_getack())
843 {
844 DBP_SAVE(ax_printf("Get ack returns false 58\n"));
845 }
846 i2c_stop();
847
848 /* Write protect disabled */
849 }
850 }
851 device_initcall(eeprom_init);
852