#ifndef __flashAmd_h__ #define __flashAmd_h__ struct FlashAmd { volatile U8 base[0]; /* Cycles Read (Note 5) 1 RA RD Reset (Note 6) 1 XXX F0 Autoselect (Note 7) Manufacturer ID 4 555 AA 2AA 55 555 90 X00 01 Device ID 4 555 AA 2AA 55 555 90 X01 4F Sector Protect Verify (Note 8) 4 555 AA 2AA 55 555 90 (SA)X02 00/01 Program 4 555 AA 2AA 55 555 A0 PA PD Unlock Bypass 3 555 AA 2AA 55 555 20 Unlock Bypass Program (Note 9) 2 XXX A0 PA PD Unlock Bypass Reset (Note 10) 2 XXX 90 XXX 00 Chip Erase 6 555 AA 2AA 55 555 80 555 AA 2AA 55 555 10 Sector Erase 6 555 AA 2AA 55 555 80 555 AA 2AA 55 SA 30 Erase Suspend (Note 11) 1 XXX B0 Erase Resume (Note 12) 1 XXX 30 */ inline void reset() { base[0x000]=0xf0; asm("wbinvd"); } inline U8 wait(U32 address,U8 v) { U8 read; while(1) { asm("invd"); read=base[address]; if(((read^v)&0x80)==0x00) goto result; if(read&(1<<5)) break; } asm("wbinvd"); read=base[address]; if(((read^v)&0x80)==0x00) goto result; reset(); result: asm("wbinvd"); return base[address]; } inline void key() { base[0x555]=0xaa; asm("wbinvd"); base[0x2aa]=0x55; asm("wbinvd"); } inline U8 manufactorId() { key(); base[0x555]=0x90; asm("wbinvd"); return base[00]; } inline U8 deviceId() { key(); base[0x555]=0x90; asm("wbinvd"); return base[01]; } inline U8 isProtected(U32 sector) { key(); base[0x555]=0x90; asm("wbinvd"); return base[(sector<<16)|0x02]; } inline U8 erase() { reset(); key(); base[0x555]=0x80; asm("wbinvd"); key(); base[0x555]=0x30; asm("wbinvd"); return wait(0,0xff); } inline U8 erase(U32 sector) { sector<<=16; key(); base[0x555]=0x80; asm("wbinvd"); key(); base[sector]=0x30; asm("wbinvd"); return wait(sector,0xff); } inline U8 write(U32 address,U8 value) { key(); base[0x555]=0xa0; asm("wbinvd"); base[address]=value; asm("wbinvd"); return wait(address,value); } inline const U8 operator[](U32 address) { return base[address]; } }; #endif /*__flashAmd_h__*/