void ws_flash_read_byte(uint32_t addr, uint8_t *buf) { uint8_t sreg; sreg = SREG; cli(); eeprom_busy_wait(); _WAIT_FOR_SPM(); eeprom_busy_wait(); boot_spm_busy_wait(); _ENABLE_RWW_SECTION(); *buf = pgm_read_byte_far(addr); boot_rww_enable(); SREG = sreg; return; }
void ws_flash_read_page(uint32_t addr, uint8_t *buf) { uint8_t sreg; uint32_t i; sreg = SREG; cli(); eeprom_busy_wait(); for (i=0;i<PAGESIZE;i++) { _WAIT_FOR_SPM(); eeprom_busy_wait(); boot_spm_busy_wait(); _ENABLE_RWW_SECTION(); buf[i] = pgm_read_byte_far(addr+i); } boot_rww_enable(); SREG = sreg; return; }
C_TASK void main(void) { ADDR_T address; unsigned int temp_int; unsigned char val; /* Initialization */ void (*funcptr)( void ) = 0x0000; // Set up function pointer to RESET vector. PROGPORT |= (1<<PROG_NO); // Enable pull-up on PROG_NO line on PROGPORT. initbootuart(); // Initialize UART. DDRB |= _BV(PB0); //status LED /* Branch to bootloader or application code? */ if( !(PROGPIN & (1<<PROG_NO)) ) // If PROGPIN is pulled low, enter programmingmode. { PORTB |= _BV(PB0); //set the status led ON /* Main loop */ for(;;) { val=recchar(); // Wait for command character. // Check autoincrement status. if(val=='a') { sendchar('Y'); // Yes, we do autoincrement. } // Set address. else if(val=='A') // Set address... { // NOTE: Flash addresses are given in words, not bytes. address=(recchar()<<8) | recchar(); // Read address high and low byte. sendchar('\r'); // Send OK back. } // Chip erase. else if(val=='e') { for(address = 0; address < APP_END;address += PAGESIZE) { // NOTE: Here we use address as a byte-address, not word-address, for convenience. _WAIT_FOR_SPM(); #ifdef __ICCAVR__ #pragma diag_suppress=Pe1053 // Suppress warning for conversion from long-type address to flash ptr. #endif _PAGE_ERASE( address ); #ifdef __ICCAVR__ #pragma diag_default=Pe1053 // Back to default. #endif } sendchar('\r'); // Send OK back. } #ifndef REMOVE_BLOCK_SUPPORT // Check block load support. else if(val=='b') { sendchar('Y'); // Report block load supported. sendchar((BLOCKSIZE>>8) & 0xFF); // MSB first. sendchar(BLOCKSIZE&0xFF); // Report BLOCKSIZE (bytes). } // Start block load. else if(val=='B')