Cleanup and reduce size
This commit is contained in:
parent
cde9bf0a5b
commit
0416a2f536
13
README.md
13
README.md
@ -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
46
main.c
@ -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) */
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user