Update the firmware of Arduino boards based on Atmel AVR
Project description
PyArduinoFlash
PyArduinoFlash is an open source library in Python for updating the firmware
of Arduino boards that use the ATmegaBOOT_168.c
bootloader, for example Arduino Nano.
The intention is to have a class that can be imported into any python project to update the Arduinos through the serial port.
It implements a subset of Atmel's STK-500 protocol, using as reference the source code of all Arduino bootloaders that use Atmel as a processor. ArduinoCore-avr
As an example of use, there is an APP in KivyMd and Kivy that exposes through a GUI all the methods required to update and verify the firmware.
Installation
Installation, Documentation and Examples
For now it consists of copying the arduinobotloader.py file to the Python project
Documentation and Examples
from intelhex import IntelHex
from arduinobootloader.arduinobootloader import ArduinoBootloader
ih = IntelHex()
ab = ArduinoBootloader()
if ab.open():
if not ab.board_request():
ab.close()
return
print("botloader version: {} hardware version: {}".format(ab.sw_version, ab.hw_version))
if not ab.cpu_signature():
ab.close()
return
print("cpu name: {}".format(ab.cpu_name) )
ih.fromfile("firmware_file.hex", format='hex')
for address in range(0, ih.maxaddr(), ab.cpu_page_size):
buffer = ih.tobinarray(start=address, size=ab.cpu_page_size)
if not ab.write_memory(buffer, address):
print("Write error")
ab.leave_prg_mode()
ab.close()
return
for address in range(0, ih.maxaddr(), ab.cpu_page_size):
buffer = ih.tobinarray(start=address, size=ab.cpu_page_size)
read_buffer = ab.read_memory(address, ab.cpu_page_size)
if not len(read_buffer):
print("Read error")
break
if buffer != read_buffer:
print("File not match")
break
ab.leave_prg_mode()
ab.close()
The parsing of the file in Intel hexadecimal format is done with the IntelHex library.
To have an instance of the class use ab = ArduinoBootloader()
The next step is to establish the connection with the bootloader of the Arduino board with ab.open()
that returns True
when it is successful.
As the library needs the information of the CPU to know the size of the page, it is necessary to use the functions ab.board_request()
and ab.cpu_signature()
If the previous functions were executed successfully (they return True
), now you have to open the hexadecimal file with the ih.fromfile("firmware_file.hex", format='hex')
function. If there are errors in the format or the file path is invalid, exceptions are thrown.
As the CPU is flashed by pages, with the function ih.tobinarray(start=address, size=ab.cpu_page_size)
the current page is obtained (according to the address).
For the bootloader to write it, use the function ab.write_memory(buffer, address)
which take the buffer and the current address as parameters. Returns True
when completed successfully.
The reading to verify the recording is done in the same way, with the exception that the function returns the buffer read. If it is None
it indicates that there were problems.
The bootloader begins the execution of the firmware after a period of time without receiving communication; nevertheless it is convenient to execute the function ab.leave_prg_mode()
.
Finally, to release the serial port, you have to execute the function ab.close()
.
Scripts
The Script folder contains arduinoflash.py file that allows update or read the firmware of Arduino boards.
One of the purposes is to show the use of the PyArduinoBootloader library in conjunction with the IntelHex library to process hexadecimal files.
Use the argparse library, to read the command line (file and options).
And to indicate the progress the progressbar2 library.
usage: arduinoflash.py [-h] [--version] [-r | -u] filename
arduino flash utility
positional arguments:
filename filename in hexadecimal Intel format
optional arguments:
-h, --help show this help message and exit
--version script version
-b BAUDRATE, --baudrate BAUDRATE
old bootolader (57600) Optiboot (115200)
-r, --read read the cpu flash memory
-u, --update update cpu flash memory
The following capture shows the reading of the flash memory of an Arduino Nano board.
And the next shows the firmware update of an Arduino Nano board.
Support
If you need assistance, contact me:
- Email : juanschiavoni@gmail.com
Contributing
Licenses
- PyArduinoFlash is released under the terms of the MIT License. Please refer to the LICENSE file.
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distributions
Built Distribution
Hashes for arduinobootloader-0.0.3-py3-none-any.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | ba66d938cbcac9a10e3c812c45a4695504bb4def2d2053b7286deaf3123fd540 |
|
MD5 | 35caf8396e42e628b8cf8e5efd42f022 |
|
BLAKE2b-256 | 3aa9246f4110f4e88cd6d3cfc21a405f8c0aee4250af097075c98fedd0c8ec29 |