blob: 30a7ee800da60aa2dbbff3e1787539577831ec42 [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);
Ollie Lho184a4042005-11-26 21:55:36 +00008extern int block_erase_m29f400bt(volatile uint8_t *bios, volatile uint8_t *dst);
9extern int write_m29f400bt(struct flashchip *flash, uint8_t *buf);
Ollie Lho761bf1b2004-03-20 16:46:10 +000010extern int write_linuxbios_m29f400bt(struct flashchip *flash,
Ollie Lho184a4042005-11-26 21:55:36 +000011 uint8_t *buf);
Ronald G. Minnichb1934902002-06-11 19:15:55 +000012
Ollie Lho184a4042005-11-26 21:55:36 +000013extern __inline__ void toggle_ready_m29f400bt(volatile uint8_t *dst)
Ronald G. Minnichb1934902002-06-11 19:15:55 +000014{
15 unsigned int i = 0;
Ollie Lho184a4042005-11-26 21:55:36 +000016 uint8_t tmp1, tmp2;
Ronald G. Minnichb1934902002-06-11 19:15:55 +000017
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 Lho184a4042005-11-26 21:55:36 +000029extern __inline__ void data_polling_m29f400bt(volatile uint8_t *dst,
30 uint8_t data)
Ronald G. Minnichb1934902002-06-11 19:15:55 +000031{
32 unsigned int i = 0;
Ollie Lho184a4042005-11-26 21:55:36 +000033 uint8_t tmp;
Ronald G. Minnichb1934902002-06-11 19:15:55 +000034
35 data &= 0x80;
36
37 while (i++ < 0xFFFFFF) {
38 tmp = *dst & 0x80;
39 if (tmp == data) {
40 break;
41 }
42 }
43}
44
Ollie Lho184a4042005-11-26 21:55:36 +000045extern __inline__ void protect_m29f400bt(volatile uint8_t *bios)
Ronald G. Minnichb1934902002-06-11 19:15:55 +000046{
Ollie Lho184a4042005-11-26 21:55:36 +000047 *(volatile uint8_t *) (bios + 0xAAA) = 0xAA;
48 *(volatile uint8_t *) (bios + 0x555) = 0x55;
49 *(volatile uint8_t *) (bios + 0xAAA) = 0xA0;
Ronald G. Minnichb1934902002-06-11 19:15:55 +000050
51 usleep(200);
52}
53
Ollie Lho184a4042005-11-26 21:55:36 +000054extern __inline__ void write_page_m29f400bt(volatile uint8_t *bios, uint8_t *src,
55 volatile uint8_t *dst,
Ollie Lho761bf1b2004-03-20 16:46:10 +000056 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++) {
Ollie Lho184a4042005-11-26 21:55:36 +000061 *(volatile uint8_t *) (bios + 0xAAA) = 0xAA;
62 *(volatile uint8_t *) (bios + 0x555) = 0x55;
63 *(volatile uint8_t *) (bios + 0xAAA) = 0xA0;
Ronald G. Minnichb1934902002-06-11 19:15:55 +000064
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",
Ollie Lho184a4042005-11-26 21:55:36 +000072 (uint8_t *) (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__ */