#ifndef __flashIntel_h__ #define __flashIntel_h__ struct FlashIntel { volatile U8 base[0]; /* Read Array Write X FFH Read Identifier (Note 2) Write X 90H Read IA ID Read Status Register Write X 70H Read X SRD Clear Status Register Write X 50H Program (Note 3) Write X 40H/10H Write PA PD Block Erase/Confirm Write X 20H Write BA D0H Program/Erase Suspend Write X B0H Program/Erase Resume Write X D0H 2.Following the Intelligent Identifier command,two Read operations access manufacturer and device codes. A 0 =0 for manufacturer code,A 0 =1 for device code.A 1 –A 21 =0. 3.Either 40H or 10H command is valid although the standard is 40H. */ inline U8 wait() { U8 read; while(1) { base[0]=0x70U; asm volatile("wbinvd"); asm volatile("invd"); read=base[0]; if(read&0x80U) break; } base[0]=0xffU; asm volatile("wbinvd"); return 1; } inline void reset() { base[0]=0xffU; asm volatile("wbinvd"); } inline U8 manufactorId() { base[0]=0x90U; asm volatile("wbinvd"); asm volatile("invd"); return base[0]; } inline U8 deviceId() { base[1]=0x90U; asm volatile("wbinvd"); asm volatile("invd"); return base[1]; } inline U8 erase(U32 sector) { base[sector]=0x20U; asm volatile("wbinvd"); base[sector]=0xd0U; asm volatile("wbinvd"); return wait(); } inline U8 erase() { return erase(0xffff); } inline U8 write(U32 address,U8 value) { base[address]=0x40U; asm volatile("wbinvd"); base[address]=value; asm volatile("wbinvd"); wait(); return value; } inline const U8 operator[](U32 address) { return base[address]; } }; #endif /*__flashIntel_h__*/