Device::AVR::UPDI - interact with an AVR microcontroller over UPDI
Device::AVR::UPDI
This module provides a class for interacting with an AVR microcontroller in one of the newer ATmega 0-series, or ATtiny 0-series or 1-series types, which uses the UPDI programming and debug interface.
This code expects to find a serial port connected to the UPDI pin of the microcontroller as a shared single-wire interface. Suitable hardware to provide this can be created using a USB-UART adapter, connecting the RX line directly to the MCU's UPDI pin, and connecting TX via a current-limiting resistor of 4.7 kohm.
RX
UPDI
TX
+------------+ +-------------------+ | RX-|-------------+ | | | USB-UART | +------|-UPDI | | TX-|---[ 4k7 ]---+ | ATmega or ATtiny | +------------+ +-------------------|
$updi = Device::AVR::UPDI->new( ... )
Constructs and returns a new Device::AVR::UPDI instance.
Takes the following named arguments:
Path to the device node representing the serial port connection.
Alternative to dev, provides an IO handle directly. This should be an instance of IO::Termios, or at least, provide the same interface.
dev
Name of the AVR chip to interact with. This is used to define parameters like memory size and location of internal peripherals.
Any of the following forms are accepted
part => "ATtiny814" | "attiny814" | "t814" part => "ATmega4809" | "atmega4809" | "m4809"
After construction, the link must be initialised by calling "init_link" before any of the command methods are used.
$partinfo = $updi->partinfo
Returns the Part Info structure containing base addresses and other parameters which may be useful for interacting with the chip.
The returned structure provides the following fields
$sig = $partinfo->signature $addr = $partinfo->baseaddr_nvmctrl $addr = $partinfo->baseaddr_fuse $addr = $partinfo->baseaddr_flash $addr = $partinfo->baseaddr_sigrow $bytes = $partinfo->pagesize $fusenames = $partinfo->fusenames
$updi->init_link->get
Initialise the UPDI link for proper communication.
This method must be invoked after the object is constructed, before using any of the other commands.
$rev = $updi->read_updirev->get
Reads the UPDIREV field of the STATUSA register.
UPDIREV
STATUSA
Reads the ASI_SYS_STATUS register.
ASI_SYS_STATUS
$sib = $updi->read_sib->get
Reads the System Information Block.
This is returned in a HASH reference, containing four keys:
{ family => "tinyAVR", nvm_version => "P:0", ocd_version => "D:0", dbg_osc_freq => 3, }
$signature = $updi->read_signature->get
Reads the three signature bytes from the Signature Row of the device. This is returned as a plain byte string of length 3.
$updi->request_reset( $reset )->get
Sets or clears the system reset request. Typically used to issue a system reset by momentarilly toggling the request on and off again:
await $updi->request_reset( 1 ); await $updi->request_reset( 0 );
$updi->erase_chip->get
Requests a full chip erase, waiting until the erase is complete.
After this, the chip will be unlocked.
$updi->enable_nvmprog->get
Requests the chip to enter NVM programming mode.
$updi->write_nvm_page( $addr, $data )->get
Writes a single page into NVM flash using the NVM controller.
$updi->write_fuse( $idx, $value )->get
Writes a fuse value. $idx is the index of the fuse within the FUSES memory segment, from 0 onwards.
$idx
$value = $updi->read_fuse( $idx )->get
Reads a fuse value. $idx is the index of the fuse within the FUSES memory segment, from 0 onwards.
"AVR UPDI Programming Cable"
An adapter cable to flash firmware onto an AVR microcontroller chip via UPDI, compatible with this module.
https://www.tindie.com/products/16571/
Paul Evans <leonerd@leonerd.org.uk>
To install Device::AVR::UPDI, copy and paste the appropriate command in to your terminal.
cpanm
cpanm Device::AVR::UPDI
CPAN shell
perl -MCPAN -e shell install Device::AVR::UPDI
For more information on module installation, please visit the detailed CPAN module installation guide.