void flash_store(u16 addr, u16 count, u8 *data) { u8 i; u16 saddr, daddr; // Check sanity of write to make sure it fits within one 64-byte chunk of flash and does not cross boundaries: assert(((addr) & ~63) == (((addr + count - 1)) & ~63)); // Make sure write is in flash memory range: assert(addr + count < WRITABLE_SEG_LEN); // Copy 64 byte aligned chunk of ROM into RAM so it can be put back in after ERASE completes. saddr = addr & ~63; for (i = 0; i < 64; i++, saddr++) { ProgmemBuffer[i] = ROM_SAVEDATA[saddr]; } // Copy new data into RAM buffer, assuming we don't cross a 64-byte chunk boundary: saddr = addr & ~63; daddr = addr - saddr; for (i = 0; i < count; i++, daddr++) ProgmemBuffer[daddr] = data[i]; // Start the ERASE operation: // +512 for debugging.. ProgMemAddr.s_form = (addr & ~63) + WRITABLE_SEG_ADDR; EraseProgMem(); // arb will catch this and handle it later... Write0Pending = true; Write32Pending = true; }
void BootService(void) { BlinkUSBStatus(); if((usb_device_state < CONFIGURED_STATE)||(UCONbits.SUSPND==1)) return; if(trf_state == SENDING_RESP) { if(!mBootTxIsBusy()) { BOOT_BD_OUT.Cnt = sizeof(dataPacket); mUSBBufferReady(BOOT_BD_OUT); trf_state = WAIT_FOR_CMD; }//end if return; }//end if if(!mBootRxIsBusy()) { counter = 0; switch(dataPacket.CMD) { case READ_VERSION: ReadVersion(); counter=0x04; break; case READ_FLASH: case READ_CONFIG: ReadProgMem(); counter+=0x05; break; case WRITE_FLASH: WriteProgMem(); counter=0x01; break; case ERASE_FLASH: EraseProgMem(); counter=0x01; break; case READ_EEDATA: ReadEE(); counter+=0x05; break; case WRITE_EEDATA: WriteEE(); counter=0x01; break; case WRITE_CONFIG: WriteConfig(); counter=0x01; break; case RESET: //When resetting, make sure to drop the device off the bus //for a period of time. Helps when the device is suspended. UCONbits.USBEN = 0; big_counter = 0; while(--big_counter); Reset(); break; case UPDATE_LED: if(dataPacket.led_num == 3) { mLED_3 = dataPacket.led_status; counter = 0x01; }//end if if(dataPacket.led_num == 4) { mLED_4 = dataPacket.led_status; counter = 0x01; }//end if break; default: break; }//end switch() trf_state = SENDING_RESP; if(counter != 0) { BOOT_BD_IN.Cnt = counter; mUSBBufferReady(BOOT_BD_IN); }//end if }//end if }//end BootService