Cleanup and reduce size

This commit is contained in:
Olaf Rempel 2020-02-01 22:45:26 +01:00
parent cde9bf0a5b
commit 0416a2f536
2 changed files with 28 additions and 31 deletions

View File

@ -3,17 +3,17 @@ twiboot is a simple/small bootloader for AVR MCUs with integrated TWI peripheral
It was originally created to update I2C controlled BLMCs (Brushless Motor Controller) without an AVR ISP adapter. It was originally created to update I2C controlled BLMCs (Brushless Motor Controller) without an AVR ISP adapter.
twiboot acts as a slave device on a TWI/I2C bus and allows reading/writing of the internal flash memory. twiboot acts as a slave device on a TWI/I2C bus and allows reading/writing of the internal flash memory.
As a compile time option twiboot also allows reading/writing of the whole internal EEPROM memory. As a compile time option (EEPROM_SUPPORT) twiboot also allows reading/writing of the whole internal EEPROM memory.
The bootloader is not able to update itself (only application flash memory region accessible). The bootloader is not able to update itself (only application flash memory region accessible).
Currently the following AVR MCUs are supported: Currently the following AVR MCUs are supported:
AVR MCU | Flash bytes used (.text + .data) | Bootloader region size AVR MCU | Flash bytes used (.text + .data) | Bootloader region size
--- | --- | --- --- | --- | ---
atmega8 | 724 (0x2D4) | 512 words atmega8 | 706 (0x2C2) | 512 words
atmega88 | 744 (0x2E8) | 512 words atmega88 | 726 (0x2D6) | 512 words
atmega168 | 744 (0x2E8) | 512 words atmega168 | 726 (0x2D6) | 512 words
atmega328p | 744 (0x2E8) | 512 words atmega328p | 726 (0x2D6) | 512 words
(Compiled on Ubuntu 18.04 LTS (gcc 5.4.0 / avr-libc 2.0.0) with EEPROM and LED support) (Compiled on Ubuntu 18.04 LTS (gcc 5.4.0 / avr-libc 2.0.0) with EEPROM and LED support)
@ -33,7 +33,7 @@ A TWI/I2C master can use the protocol to
- write the internal eeprom (byte wise) - write the internal eeprom (byte wise)
- exit the bootloader and start the application - exit the bootloader and start the application
As a compile time option twiboot can output its state with two LEDs. As a compile time option (LED_SUPPORT) twiboot can output its state with two LEDs.
One LED will flash with a frequency of 20Hz while twiboot is active (including boot wait time). One LED will flash with a frequency of 20Hz while twiboot is active (including boot wait time).
A second LED will flash when the bootloader is addressed on the TWI/I2C bus. A second LED will flash when the bootloader is addressed on the TWI/I2C bus.
@ -85,6 +85,7 @@ Write 1+ eeprom bytes | **SLA+W**, 0x02, 0x02, addrh, addrl, {* bytes}, **STO**
The multiboot_tool repository contains a simple linux application that uses The multiboot_tool repository contains a simple linux application that uses
this protocol to access the bootloader over linux i2c device. this protocol to access the bootloader over linux i2c device.
The ispprog programming adapter can also be used as a avr910/butterfly to twiboot protocol bridge.
## Development ## ## Development ##
Issue reports, feature requests, patches or simply success stories are much appreciated. Issue reports, feature requests, patches or simply success stories are much appreciated.

46
main.c
View File

@ -141,26 +141,24 @@ static void write_flash_page(void)
uint8_t size = SPM_PAGESIZE; uint8_t size = SPM_PAGESIZE;
uint8_t *p = buf; uint8_t *p = buf;
if (pagestart >= BOOTLOADER_START) if (pagestart < BOOTLOADER_START)
{ {
return; boot_page_erase(pagestart);
boot_spm_busy_wait();
do {
uint16_t data = *p++;
data |= *p++ << 8;
boot_page_fill(addr, data);
addr += 2;
size -= 2;
} while (size);
boot_page_write(pagestart);
boot_spm_busy_wait();
boot_rww_enable();
} }
boot_page_erase(pagestart);
boot_spm_busy_wait();
do {
uint16_t data = *p++;
data |= *p++ << 8;
boot_page_fill(addr, data);
addr += 2;
size -= 2;
} while (size);
boot_page_write(pagestart);
boot_spm_busy_wait();
boot_rww_enable();
} /* write_flash_page */ } /* write_flash_page */
@ -168,12 +166,11 @@ static void write_flash_page(void)
/* ************************************************************************* /* *************************************************************************
* read_eeprom_byte * read_eeprom_byte
* ************************************************************************* */ * ************************************************************************* */
static uint8_t read_eeprom_byte(void) static uint8_t read_eeprom_byte(uint16_t address)
{ {
EEARL = addr; EEARL = address;
EEARH = (addr >> 8); EEARH = (address >> 8);
EECR |= (1<<EERE); EECR |= (1<<EERE);
addr++;
return EEDR; return EEDR;
} /* read_eeprom_byte */ } /* read_eeprom_byte */
@ -223,6 +220,7 @@ static uint8_t TWI_data_write(uint8_t bcnt, uint8_t data)
case CMD_WAIT: case CMD_WAIT:
/* abort countdown */ /* abort countdown */
boot_timeout = 0; boot_timeout = 0;
cmd = data;
break; break;
default: default:
@ -231,8 +229,6 @@ static uint8_t TWI_data_write(uint8_t bcnt, uint8_t data)
ack = 0x00; ack = 0x00;
break; break;
} }
cmd = data;
break; break;
case 1: case 1:
@ -334,7 +330,7 @@ static uint8_t TWI_data_read(uint8_t bcnt)
#if (EEPROM_SUPPORT) #if (EEPROM_SUPPORT)
case CMD_ACCESS_EEPROM: case CMD_ACCESS_EEPROM:
data = read_eeprom_byte(); data = read_eeprom_byte(addr++);
break; break;
#endif /* (EEPROM_SUPPORT) */ #endif /* (EEPROM_SUPPORT) */