blob: 0b00c266989c2a592f19752716cb8e5af2d3d839 [file] [log] [blame]
Ronald G. Minnicheaab50b2003-09-12 22:41:53 +00001#ifndef __JEDEC_H__
2#define __JEDEC_H__ 1
3
Ronald G. Minnich5e5f75e2002-01-29 18:21:41 +00004extern int probe_jedec (struct flashchip * flash);
5extern int erase_jedec (struct flashchip * flash);
Ronald G. Minnicheaab50b2003-09-12 22:41:53 +00006extern int write_jedec (struct flashchip * flash, unsigned char * buf);
Ronald G. Minnich5e5f75e2002-01-29 18:21:41 +00007
Ronald G. Minnichef5779d2002-01-29 20:18:02 +00008extern __inline__ void toggle_ready_jedec (volatile char * dst)
Ronald G. Minnich5e5f75e2002-01-29 18:21:41 +00009{
10 unsigned int i = 0;
11 char tmp1, tmp2;
12
13 tmp1 = *dst & 0x40;
14
15 while (i++ < 0xFFFFFF) {
16 tmp2 = *dst & 0x40;
17 if (tmp1 == tmp2) {
18 break;
19 }
20 tmp1 = tmp2;
21 }
22}
23
Ronald G. Minnichef5779d2002-01-29 20:18:02 +000024extern __inline__ void data_polling_jedec (volatile char * dst, char data)
Ronald G. Minnich5e5f75e2002-01-29 18:21:41 +000025{
26 unsigned int i = 0;
27 char tmp;
28
29 data &= 0x80;
30
31 while (i++ < 0xFFFFFF) {
32 tmp = *dst & 0x80;
33 if (tmp == data) {
34 break;
35 }
36 }
37}
38
Ronald G. Minnichef5779d2002-01-29 20:18:02 +000039extern __inline__ void protect_jedec (volatile char * bios)
Ronald G. Minnich5e5f75e2002-01-29 18:21:41 +000040{
Ronald G. Minnichef5779d2002-01-29 20:18:02 +000041 *(volatile char *) (bios + 0x5555) = 0xAA;
42 *(volatile char *) (bios + 0x2AAA) = 0x55;
43 *(volatile char *) (bios + 0x5555) = 0xA0;
Ronald G. Minnich5e5f75e2002-01-29 18:21:41 +000044
45 usleep(200);
46}
47
Ollie Lho73eca802004-03-19 22:10:07 +000048extern int erase_sector_jedec (volatile char * bios, unsigned int page);
49
Ronald G. Minnichef5779d2002-01-29 20:18:02 +000050extern __inline__ void write_page_jedec (volatile char * bios, char * src, volatile char * dst,
Ronald G. Minnich5e5f75e2002-01-29 18:21:41 +000051 int page_size)
52{
53 int i;
54
Ronald G. Minnichef5779d2002-01-29 20:18:02 +000055 *(volatile char *) (bios + 0x5555) = 0xAA;
56 *(volatile char *) (bios + 0x2AAA) = 0x55;
57 *(volatile char *) (bios + 0x5555) = 0xA0;
Ronald G. Minnich5e5f75e2002-01-29 18:21:41 +000058
59 for (i = 0; i < page_size; i++) {
60 /* transfer data from source to destination */
61 *dst++ = *src++;
62 }
63
64 usleep(100);
65 toggle_ready_jedec(dst-1);
66}
Ronald G. Minnicheaab50b2003-09-12 22:41:53 +000067
Ollie Lho73eca802004-03-19 22:10:07 +000068static __inline__ int write_sector_jedec(volatile char * bios,
69 unsigned char * src,
70 volatile unsigned char * dst,
71 unsigned int page_size)
72{
73 int i;
74 volatile char *Temp;
75
76 for (i = 0; i < page_size; i++) {
77 if (*dst != 0xff) {
78 printf("FATAL: dst %p not erased (val 0x%x\n", dst, *dst);
79 return(-1);
80 }
81 /* transfer data from source to destination */
82 if (*src == 0xFF) {
83 dst++, src++;
84 /* If the data is 0xFF, don't program it */
85 continue;
86 }
87 Temp = (bios + 0x5555);
88 *Temp = 0xAA;
89 Temp = bios + 0x2AAA;
90 *Temp = 0x55;
91 Temp = bios + 0x5555;
92 *Temp = 0xA0;
93 *dst = *src;
94 toggle_ready_jedec(bios);
95 if (*dst != *src)
96 printf("BAD! dst 0x%lx val 0x%x src 0x%x\n",
97 (unsigned long)dst, *dst, *src);
98 dst++, src++;
99 }
100
101 return(0);
102}
103
Ronald G. Minnicheaab50b2003-09-12 22:41:53 +0000104#endif /* !__JEDEC_H__ */