NAME
Device::AVR::UPDI
- interact with an AVR microcontroller over UPDI
DESCRIPTION
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.
Hardware 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-|-------------+ | |
| USB-UART | +------|-UPDI |
| TX-|---[ 4k7 ]---+ | ATmega or ATtiny |
+------------+ +-------------------|
CONSTRUCTORS
new
$updi = Device::AVR::UPDI->new( ... )
Constructs and returns a new Device::AVR::UPDI
instance.
Takes the following named arguments:
- dev => STRING
-
Path to the device node representing the serial port connection.
- fh => IO
-
Alternative to
dev
, provides an IO handle directly. This should be an instance of IO::Termios, or at least, provide the same interface. - part => STRING
-
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.
ACCESSORS
partinfo
$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
METHODS
init_link
$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.
read_updirev
$rev = $updi->read_updirev->get
Reads the UPDIREV
field of the STATUSA
register.
read_asi_sys_status
Reads the ASI_SYS_STATUS
register.
read_sib
$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,
}
read_signature
$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.
request_reset
$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 );
erase_chip
$updi->erase_chip->get
Requests a full chip erase, waiting until the erase is complete.
After this, the chip will be unlocked.
enable_nvmprog
$updi->enable_nvmprog->get
Requests the chip to enter NVM programming mode.
write_nvm_page
$updi->write_nvm_page( $addr, $data )->get
Writes a single page into NVM flash using the NVM controller.
write_fuse
$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.
read_fuse
$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.
SEE ALSO
"AVR UPDI Programming Cable"
An adapter cable to flash firmware onto an AVR microcontroller chip via UPDI, compatible with this module.
AUTHOR
Paul Evans <leonerd@leonerd.org.uk>