+ /* receive (only if there is) more data from uart0 */
+ addr=0;
+ for(i=0;i<addrlen;i++) {
+ txrx=uart0_get_byte();
+ addr|=(txrx<<((addrlen-i-1)*8));
+ }
+
+ for(i=0;i<datalen;i++)
+ buf[i]=uart0_get_byte();
+
+ /* process the cmd */
+ switch(cmd) {
+ case CMD_SECTOR_ERASE:
+ flash_sector_erase(buf[0],buf[1]);
+ break;
+ case CMD_READ:
+ /* data length to read */
+ datalen=buf[0]<<24|buf[1]<<16|buf[2]<<8|buf[3];
+ /* check addr and datalen */
+ if((addr>=BANK0)&(addr+datalen<=BANK0+BANK_SIZE))
+ uart0_send_buf16((u16 *)addr,datalen);
+ if((addr>=BANK2)&(addr+datalen<=BANK2+BANK_SIZE))
+ uart0_send_buf16((u16 *)addr,datalen);
+ if((addr>=BOOTLOADER)&
+ (addr+datalen<BOOTLOADER-1+BL_SIZE))
+ uart0_send_buf32((u32 *)addr,datalen);
+ break;
+ case CMD_WRITE:
+ /* data length */
+ datalen=buf[0]<<24|buf[1]<<16|buf[2]<<8|buf[3];
+ /* check addr and data len */
+ if(((addr>=BANK0)&(addr+datalen<=BANK0+BANK_SIZE))|
+ ((addr>=BANK2)&(addr+datalen<=BANK2+BANK_SIZE)))
+ receive_data_and_write_to_flash(addr,datalen);
+ break;
+ case CMD_CHIP_ERASE:
+ flash_chip_erase(buf[0]);
+ break;
+ case CMD_CHIP_ID:
+ if(buf[0]=='0') {
+ B0F555=0xaa;
+ B0F2AA=0x55;
+ B0F555=0x90;
+ data=*((u16 *)BANK0);
+ uart0_send_buf16(&data,2);
+ data=*((u16 *)(BANK0|0x200));
+ uart0_send_buf16(&data,2);
+ }
+ else if(buf[0]=='2') {
+ B2F555=0xaa;
+ B2F2AA=0x55;
+ B2F555=0x90;
+ data=*((u16 *)BANK2);
+ uart0_send_buf16(&data,2);
+ data=*((u16 *)(BANK2|0x200));
+ uart0_send_buf16(&data,2);
+ }
+ break;
+ default:
+ break;
+ }
+
+ }
+
+ return 0;