* functions
*/
+void uart0_send_byte(u8 send);
+
void mmap_init(u8 memtype) {
MEMMAP=memtype;
continue;
}
-int flash_sector_erase(u8 flash,u8 sector) {
-
- u32 a18_12;
- u32 base;
-
- if(sector>18)
- return -1;
- a18_12=sector_address[sector]<<1;
-
- if((flash!='0')|(flash!='2'))
- return -1;
-
- 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 -1;
- }
-
- return 0;
-}
-
-int flash_chip_erase(u8 bank) {
-
- if((bank!='0')|(bank!='2'))
- return -1;
-
- 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;
-}
-
void ext_mem_bank_init(void) {
BCFG0=0x10000420; // flash 1
return rx;
}
+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;
+}
+
void receive_data_and_write_to_flash(u32 addr,u32 datalen) {
u8 bank;
u32 i;
u16 data;
+ u8 byte;
+ u8 cksm;
/* which bank to program */
if(addr<0x82000000)
unlock_bypass(bank);
/* receive and write data */
+ cksm=0;
for(i=0;i<datalen/2;i++) {
- data=uart0_get_byte();
- data=uart0_get_byte()<<8;
+ byte=uart0_get_byte();
+ data=byte;
+ cksm+=byte;
+ byte=uart0_get_byte();
+ cksm+=byte;
+ data|=byte<<8;
*((unsigned volatile short *)addr)=0xa0;
*((unsigned volatile short *)addr)=data;
addr+=2;
/* relock bypass */
unlock_bypass_reset(bank);
+
+ /* send an ack */
+ uart0_send_byte(cksm);
}
/*