blob: efe0953701b6c0d54adab3b41d7a8b0247a05f4c [file] [log] [blame]
Ronald G. Minnicheaab50b2003-09-12 22:41:53 +00001#ifndef __M29F400BT_H__
2#define __M29F400BT_H__ 1
3
4#include <stdio.h>
5
Ollie Lho761bf1b2004-03-20 16:46:10 +00006extern int probe_m29f400bt(struct flashchip *flash);
7extern int erase_m29f400bt(struct flashchip *flash);
8extern int block_erase_m29f400bt(volatile char *bios, volatile char *dst);
9extern int write_m29f400bt(struct flashchip *flash, unsigned char *buf);
10extern int write_linuxbios_m29f400bt(struct flashchip *flash,
11 unsigned char *buf);
Ronald G. Minnichb1934902002-06-11 19:15:55 +000012
Ollie Lho761bf1b2004-03-20 16:46:10 +000013extern __inline__ void toggle_ready_m29f400bt(volatile char *dst)
Ronald G. Minnichb1934902002-06-11 19:15:55 +000014{
15 unsigned int i = 0;
16 char tmp1, tmp2;
17
18 tmp1 = *dst & 0x40;
19
20 while (i++ < 0xFFFFFF) {
21 tmp2 = *dst & 0x40;
22 if (tmp1 == tmp2) {
23 break;
24 }
25 tmp1 = tmp2;
26 }
27}
28
Ollie Lho761bf1b2004-03-20 16:46:10 +000029extern __inline__ void data_polling_m29f400bt(volatile char *dst,
30 unsigned char data)
Ronald G. Minnichb1934902002-06-11 19:15:55 +000031{
32 unsigned int i = 0;
33 char tmp;
34
35 data &= 0x80;
36
37 while (i++ < 0xFFFFFF) {
38 tmp = *dst & 0x80;
39 if (tmp == data) {
40 break;
41 }
42 }
43}
44
Ollie Lho761bf1b2004-03-20 16:46:10 +000045extern __inline__ void protect_m29f400bt(volatile char *bios)
Ronald G. Minnichb1934902002-06-11 19:15:55 +000046{
47 *(volatile char *) (bios + 0xAAA) = 0xAA;
48 *(volatile char *) (bios + 0x555) = 0x55;
49 *(volatile char *) (bios + 0xAAA) = 0xA0;
50
51 usleep(200);
52}
53
Ollie Lho761bf1b2004-03-20 16:46:10 +000054extern __inline__ void write_page_m29f400bt(volatile char *bios, char *src,
55 volatile char *dst,
56 int page_size)
Ronald G. Minnichb1934902002-06-11 19:15:55 +000057{
58 int i;
Ollie Lho761bf1b2004-03-20 16:46:10 +000059
Ronald G. Minnichb1934902002-06-11 19:15:55 +000060 for (i = 0; i < page_size; i++) {
61 *(volatile char *) (bios + 0xAAA) = 0xAA;
62 *(volatile char *) (bios + 0x555) = 0x55;
63 *(volatile char *) (bios + 0xAAA) = 0xA0;
64
65 /* transfer data from source to destination */
66 *dst = *src;
67 //*(volatile char *) (bios) = 0xF0;
68 //usleep(5);
69 toggle_ready_m29f400bt(dst);
Ollie Lho761bf1b2004-03-20 16:46:10 +000070 printf
71 ("Value in the flash at address %p = %#x, want %#x\n",
72 (char *) (dst - bios), *dst, *src);
Ronald G. Minnichb1934902002-06-11 19:15:55 +000073 dst++;
74 src++;
75 }
76
77}
Ronald G. Minnicheaab50b2003-09-12 22:41:53 +000078
Ollie Lho761bf1b2004-03-20 16:46:10 +000079#endif /* !__M29F400BT_H__ */