writing hex files to flash should work now ...
[my-code/arm.git] / betty / fwflash.c
index f138dc1..ebf7190 100644 (file)
@@ -193,6 +193,17 @@ u8 uart0_get_byte(void) {
        return rx;
 }
 
+void flash_reset(u8 bank) {
+
+       if((bank!='0')&(bank!='2'))
+               return;
+
+       if(bank=='0')
+               B0F=0xf0;
+       else
+               B2F=0xf0;
+}
+
 void flash_sector_erase(u8 flash,u8 sector) {
 
        u32 a18_12;
@@ -233,6 +244,8 @@ void flash_sector_erase(u8 flash,u8 sector) {
 
 void flash_chip_erase(u8 bank) {
 
+       u8 status;
+
        if((bank!='0')&(bank!='2'))
                return;
 
@@ -252,6 +265,16 @@ void flash_chip_erase(u8 bank) {
                B2F2AA=0x55;
                B2F555=0x10;
        }
+
+       while(1) {
+               if(bank=='0')
+                       status=B0F;
+               else
+                       status=B2F;
+
+               if(status&0x80)
+                       break;
+       }
 }
 
 void unlock_bypass(u8 bank) {
@@ -286,19 +309,30 @@ void unlock_bypass_reset(u8 bank) {
        }
 }
 
-void flash_write(u32 addr,u16 data) {
+int flash_write(u32 addr,u16 data) {
+
+       u16 check;
+
+       *((unsigned volatile short *)addr)=0xa0;
+       *((unsigned volatile short *)addr)=data;
+       while(1) {
+               check=*((unsigned short *)addr);
+               if((data&0x80)==(check&0x80))
+                       break;
+       }
+       if(data!=check)
+               return -1;
 
-       *((volatile unsigned short *)addr)=0xa0;
-       *((volatile unsigned short *)addr)=data;
+       return 0;
 }
 
-void receive_data_and_write_to_flash(u32 addr,u32 datalen) {
+int receive_data_and_write_to_flash(u32 addr,u32 datalen) {
 
        u8 bank;
-       u32 i;
+       u32 i,ret;
        u16 data;
-       u8 byte;
        u8 cksm;
+       u8 byte;
 
        /* which bank to program */
        if(addr<0x82000000)
@@ -311,23 +345,31 @@ void receive_data_and_write_to_flash(u32 addr,u32 datalen) {
 
        /* receive and write data */
        cksm=0;
+       ret=0;
        for(i=0;i<datalen/2;i++) {
                byte=uart0_get_byte();
+               uart0_send_byte(byte);
                data=byte;
                cksm+=byte;
                byte=uart0_get_byte();
+               uart0_send_byte(byte);
                cksm+=byte;
                data|=byte<<8;
-               *((unsigned volatile short *)addr)=0xa0;
-               *((unsigned volatile short *)addr)=data;
+               if(flash_write(addr,data)<0)
+                       ret=-1;
                addr+=2;
        }
 
        /* relock bypass */
        unlock_bypass_reset(bank);
 
-       /* send an ack */
+       /* modify cksm on purpose, so the user knows ... */
+       cksm+=1;
+
+       /* send the cksm */
        uart0_send_byte(cksm);
+
+       return ret;
 }
 
 /*