+void flash_sector_erase(u8 flash,u8 sector) {
+
+ u32 a18_12;
+ u32 base;
+
+ if(sector>18)
+ return;
+ a18_12=sector_address[sector]<<1;
+
+ if((flash!='0')&(flash!='2'))
+ return;
+
+ switch(flash) {
+ case '0':
+ base=0x80000000;
+ B0F555=0xaa;
+ B0F2AA=0x55;
+ B0F555=0x80;
+ B0F555=0xaa;
+ B0F2AA=0x55;
+ *((volatile u16 *)(base|a18_12))=0x30;
+ break;
+ case '2':
+ base=0x82000000;
+ B2F555=0xaa;
+ B2F2AA=0x55;
+ B2F555=0x80;
+ B2F555=0xaa;
+ B2F2AA=0x55;
+ *((volatile u16 *)(base|a18_12))=0x30;
+ break;
+ default:
+ return;
+ }
+
+ return;
+}
+
+void flash_chip_erase(u8 bank) {
+
+ if((bank!='0')&(bank!='2'))
+ return;
+
+ if(bank=='0') {
+ B0F555=0xaa;
+ B0F2AA=0x55;
+ B0F555=0x80;
+ B0F555=0xaa;
+ B0F2AA=0x55;
+ B0F555=0x10;
+ }
+ else {
+ B2F555=0xaa;
+ B2F2AA=0x55;
+ B2F555=0x80;
+ B2F555=0xaa;
+ B2F2AA=0x55;
+ B2F555=0x10;
+ }
+}
+
+void unlock_bypass(u8 bank) {
+
+ if((bank!='0')&(bank!='2'))
+ return;
+
+ if(bank=='0') {
+ B0F555=0xaa;
+ B0F2AA=0x55;
+ B0F555=0x20;
+ }
+ else {
+ B2F555=0xaa;
+ B2F2AA=0x55;
+ B2F555=0x20;
+ }
+}
+
+void unlock_bypass_reset(u8 bank) {
+
+ if((bank!='0')&(bank!='2'))
+ return;
+
+ if(bank=='0') {
+ B0F=0x90;
+ B0F=0x00;
+ }
+ else {
+ B2F=0x90;
+ B2F=0x00;
+ }
+}
+
+void flash_write(u32 addr,u16 data) {
+
+ *((volatile unsigned short *)addr)=0xa0;
+ *((volatile unsigned short *)addr)=data;
+}
+