pymcuprog.serialupdi package¶
Submodules¶
pymcuprog.serialupdi.application module¶
Application layer for UPDI stack
- class pymcuprog.serialupdi.application.UpdiApplication(serialport, baud, device=None, timeout=None)¶
- Bases: - object- Generic application layer for UPDI - Parameters:
- serialport (str) – serial port to communicate over 
- baud (int) – baud rate to use 
- device (dict) – device information 
- timeout (int) – read timeout for serial port in seconds 
 
 - enter_progmode()¶
- Enters into NVM programming mode 
 - in_prog_mode()¶
- Checks whether the NVM PROG flag is up - Returns:
- True if in NVM PROG, False otherwise 
- Return type:
- bool 
 
 - leave_progmode()¶
- Disables UPDI which releases any keys enabled 
 - read_data(address, size)¶
- Reads a number of bytes of data from UPDI - Parameters:
- address (int) – address to write to 
- size (int) – number of bytes to read 
 
- Returns:
- data requested 
- Return type:
- list of bytes 
 
 - read_data_words(address, words)¶
- Reads a number of words of data from UPDI - Parameters:
- address (int) – address to write to 
- words (int) – number of words to read 
 
- Returns:
- data requested 
- Return type:
- list of bytes 
 
 - read_device_info()¶
- Reads out device information from various sources 
 - reset(apply_reset)¶
- Applies or releases an UPDI reset condition - Parameters:
- apply_reset (bool) – True to apply, False to release 
 
 - unlock()¶
- Unlock by chip erase - Raises:
- PymcuprogSerialUpdiError if an error occurs 
 
 - wait_unlocked(timeout_ms)¶
- Waits for the device to be unlocked. All devices boot up as locked until proven otherwise. - Parameters:
- timeout_ms (int) – number of milliseconds to wait 
- Returns:
- True if success, False otherwise 
- Return type:
- bool 
 
 - wait_urow_prog(timeout_ms, wait_for_high)¶
- Waits for the device to be in user row write mode. User row is writeable on a locked device using this mechanism. - Parameters:
- timeout_ms (int) – number of milliseconds to wait 
- wait_for_high (bool) – set True to wait for bit to go high; False to wait for low 
 
- Returns:
- True if success, False otherwise 
- Return type:
- bool 
 
 - write_data(address, data)¶
- Writes a number of bytes to memory - Parameters:
- address (int) – address to write to 
- data (list of bytes) – data to write 
 
 
 - write_data_words(address, data)¶
- Writes a number of words to memory - Parameters:
- address (int) – address to write to 
- data (list of bytes) – data to write 
 
 
 - write_user_row_locked_device(address, data)¶
- Writes data to the user row when the device is locked, using a key. - Parameters:
- address (int) – address to write to 
- data (list of bytes) – data to write 
 
- Raises:
- PymcuprogSerialUpdiError if an error occurs 
 
 
- pymcuprog.serialupdi.application.decode_sib(sib)¶
- Turns the SIB into something readable - Parameters:
- sib (str) – SIB data to decode 
 
pymcuprog.serialupdi.constants module¶
UPDI protocol constants
pymcuprog.serialupdi.link module¶
Link layer in UPDI protocol stack
- class pymcuprog.serialupdi.link.UpdiDatalink¶
- Bases: - object- UPDI data link class handles the UPDI data protocol within the device - LDCS_RESPONSE_BYTES = 1¶
 - init_datalink()¶
- Init DL layer - Raises:
- PymcuprogSerialUpdiError if initialization fails 
 
 - key(size, key)¶
- Write a key - Parameters:
- size (int) – size of key (0=64B, 1=128B, 2=256B) 
- key (list of bytes) – key value 
 
 
 - ld_ptr_inc(size)¶
- Loads a number of bytes from the pointer location with pointer post-increment - Parameters:
- size (int) – number of bytes to load 
- Returns:
- values read 
- Return type:
- list of bytes 
 
 - ld_ptr_inc16(words)¶
- Load a 16-bit word value from the pointer location with pointer post-increment - Parameters:
- words (int) – number of words to load 
- Returns:
- values read 
- Return type:
- list of bytes 
 
 - ldcs(address)¶
- Load data from Control/Status space - Parameters:
- address (int) – address to load 
 
 - read_sib()¶
- Read the SIB - Returns:
- SIB string 
- Return type:
- bytearray 
 
 - repeat(repeats)¶
- Store a value to the repeat counter - Parameters:
- repeats (int) – number of repeats requested 
 
 - set_physical(physical)¶
- Inject a serial-port based physical layer for use by this DL - Parameters:
- physical (UpdiPhysical) – physical object to use 
 
 - st_ptr_inc(data)¶
- Store data to the pointer location with pointer post-increment - Parameters:
- data (list of bytes) – data to store 
 
 - st_ptr_inc16(data)¶
- Store a 16-bit word value to the pointer location with pointer post-increment. ACK is disabled for blocks (> 2 bytes) - Parameters:
- data (list of bytes) – data to store 
 
 - stcs(address, value)¶
- Store a value to Control/Status space - Parameters:
- address (int) – address to store to 
- value (byte) – value to write 
 
 
 
- class pymcuprog.serialupdi.link.UpdiDatalink16bit¶
- Bases: - UpdiDatalink- UPDI data link layer in 16-bit version. This means that all addresses and pointers contain 2 bytes. - ld(address)¶
- Load a single byte direct from a 16-bit address - Parameters:
- address (int) – address to load from 
- Returns:
- value read 
- Return type:
- bytes 
 
 - ld16(address)¶
- Load a 16-bit word directly from a 16-bit address - Parameters:
- address (int) – address to load from 
- Returns:
- values read 
- Return type:
- list of bytes 
 
 - st(address, value)¶
- Store a single byte value directly to a 16-bit address - Parameters:
- address (int) – address to write to 
- value (byte) – value to write 
 
 
 - st16(address, value)¶
- Store a 16-bit word value directly to a 16-bit address - Parameters:
- address (int) – address to write to 
- value (byte) – value to write 
 
 
 - st_ptr(address)¶
- Set the pointer location - Parameters:
- address (int) – address to write 
 
 
- class pymcuprog.serialupdi.link.UpdiDatalink24bit¶
- Bases: - UpdiDatalink- UPDI data link layer in 24-bit version. This means that all addresses and pointers contain 3 bytes - ld(address)¶
- Load a single byte direct from a 24-bit address - Parameters:
- address (int) – address to load from 
- Returns:
- value read 
- Return type:
- bytes 
 
 - ld16(address)¶
- Load a 16-bit word directly from a 24-bit address - Parameters:
- address (int) – address to load from 
- Returns:
- values read 
- Return type:
- list of bytes 
 
 - st(address, value)¶
- Store a single byte value directly to a 24-bit address - Parameters:
- address (int) – address to write to 
- value (byte) – value to write 
 
 
 - st16(address, value)¶
- Store a 16-bit word value directly to a 24-bit address - Parameters:
- address (int) – address to write to 
- value (byte) – value to write 
 
 
 - st_ptr(address)¶
- Set the pointer location - Parameters:
- address (int) – address to write 
 
 
pymcuprog.serialupdi.nvm module¶
NVM implementations on various UPDI device families
- class pymcuprog.serialupdi.nvm.NvmUpdi(readwrite, device)¶
- Bases: - object- Base class for NVM - chip_erase()¶
- Does a chip erase using the NVM controller 
 - erase_eeprom()¶
- Erase EEPROM memory only 
 - erase_flash_page(address)¶
- Erasing single flash page using the NVM controller - Parameters:
- address (int) – Start address of page to erase 
 
 - erase_user_row(address, size)¶
- Erase User Row memory only - Parameters:
- address (int) – Start address of user row 
- size (int) – Size of user row 
 
 
 - write_eeprom(address, data)¶
- Write data to EEPROM - Parameters:
- address – address to write to 
- data – data to write 
 
 
 - write_flash(address, data)¶
- Writes data to flash - Parameters:
- address – address to write to 
- data – data to write 
 
 
 - write_fuse(address, data)¶
- Writes one fuse value - Parameters:
- address – address to write to 
- data – data to write 
 
 
 - write_user_row(address, data)¶
- Writes data to user row - Parameters:
- address – address to write to 
- data – data to write 
 
 
 
pymcuprog.serialupdi.nvmp0 module¶
NVM controller implementation for P:0.
Present on tiny0, 1, 2 and mega0 (eg: tiny817 -> mega4809)
- class pymcuprog.serialupdi.nvmp0.NvmUpdiP0(readwrite, device)¶
- Bases: - NvmUpdi- Version P:0 UPDI NVM properties - NVMCMD_CHIP_ERASE = 5¶
 - NVMCMD_ERASE_EEPROM = 6¶
 - NVMCMD_ERASE_PAGE = 2¶
 - NVMCMD_ERASE_WRITE_PAGE = 3¶
 - NVMCMD_NOP = 0¶
 - NVMCMD_PAGE_BUFFER_CLR = 4¶
 - NVMCMD_WRITE_FUSE = 7¶
 - NVMCMD_WRITE_PAGE = 1¶
 - NVMCTRL_ADDR = 8¶
 - NVMCTRL_CTRLA = 0¶
 - NVMCTRL_CTRLB = 1¶
 - NVMCTRL_DATA = 6¶
 - NVMCTRL_INTCTRL = 3¶
 - NVMCTRL_INTFLAGS = 4¶
 - NVMCTRL_STATUS = 2¶
 - STATUS_EEPROM_BUSY_bp = 1¶
 - STATUS_FLASH_BUSY_bp = 0¶
 - STATUS_WRITE_ERROR_bp = 2¶
 - chip_erase()¶
- Does a chip erase using the NVM controller - Note that on locked devices this is not possible and the ERASE KEY has to be used instead, see the unlock method 
 - erase_eeprom()¶
- Erase EEPROM memory only 
 - erase_flash_page(address)¶
- Erasing single flash page using the NVM controller - Parameters:
- address (int) – Start address of page to erase 
 
 - erase_user_row(address, size)¶
- Erase User Row memory only - Parameters:
- address (int) – Start address of user row 
- size (int) – Size of user row 
 
 
 - execute_nvm_command(command)¶
- Executes an NVM COMMAND on the NVM CTRL - Parameters:
- command – command to execute 
 
 - wait_nvm_ready(timeout_ms=100)¶
- Waits for the NVM controller to be ready - Parameters:
- timeout_ms (int, defaults to 100) – Timeout period in milliseconds 
- Returns:
- True if ‘ready’, False if timeout occurred before ready 
- Return type:
- bool 
- Raises:
- PymcuprogSerialUpdiNvmError if an error condition is encountered 
 
 - write_eeprom(address, data)¶
- Write data to EEPROM - Parameters:
- address (int) – address to write to 
- data (list of bytes) – data to write 
 
 
 - write_flash(address, data)¶
- Writes data to flash - Parameters:
- address (int) – address to write to 
- data (list of bytes) – data to write 
 
 
 - write_fuse(address, data)¶
- Writes one fuse value - Parameters:
- address (int) – address to write to 
- data (list of bytes) – data to write 
 
 
 - write_nvm(address, data, use_word_access=True, nvmcommand=1)¶
- Writes a page of data to NVM - By default the PAGE_WRITE command is used, which requires that the page is already erased. By default word access is used (required for flash) - Parameters:
- address (int) – address to write to 
- data (list of bytes) – data to write 
- use_word_access (bool, defaults to True) – True for 16-bit writes (eg: flash) 
- nvmcommand (int, defaults to NVMCMD_PAGE_WRITE) – command to use for commit 
 
- Raises:
- PymcuprogSerialUpdiNvmTimeout if a timeout occurred 
- Raises:
- PymcuprogSerialUpdiNvmError if an error condition is encountered 
 
 - write_user_row(address, data)¶
- Writes data to user row - Parameters:
- address (int) – address to write to 
- data (list of bytes) – data to write 
 
 
 
pymcuprog.serialupdi.nvmp2 module¶
NVM controller implementation for P:2.
Present on, for example, AVR DA, DB, DD
- class pymcuprog.serialupdi.nvmp2.NvmUpdiP2(readwrite, device)¶
- Bases: - NvmUpdi- Version P:2 UPDI NVM properties - NVMCMD_CHIP_ERASE = 32¶
 - NVMCMD_EEPROM_BYTE_ERASE = 24¶
 - NVMCMD_EEPROM_ERASE = 48¶
 - NVMCMD_EEPROM_ERASE_WRITE = 19¶
 - NVMCMD_EEPROM_WRITE = 18¶
 - NVMCMD_FLASH_PAGE_ERASE = 8¶
 - NVMCMD_FLASH_WRITE = 2¶
 - NVMCMD_NOCMD = 0¶
 - NVMCMD_NOOP = 1¶
 - NVMCTRL_ADDR = 8¶
 - NVMCTRL_CTRLA = 0¶
 - NVMCTRL_CTRLB = 1¶
 - NVMCTRL_DATA = 6¶
 - NVMCTRL_INTCTRL = 3¶
 - NVMCTRL_INTFLAGS = 4¶
 - NVMCTRL_STATUS = 2¶
 - STATUS_EEPROM_BUSY_bp = 1¶
 - STATUS_FLASH_BUSY_bp = 0¶
 - STATUS_WRITE_ERROR_bm = 48¶
 - STATUS_WRITE_ERROR_bp = 4¶
 - chip_erase()¶
- Does a chip erase using the NVM controller - Note that on locked devices this it not possible and the ERASE KEY has to be used instead 
 - erase_eeprom()¶
- Erase EEPROM memory only 
 - erase_flash_page(address)¶
- Erasing single flash page using the NVM controller - Parameters:
- address (int) – Start address of page to erase 
 
 - erase_user_row(address, size=0)¶
- Erase User Row memory only - Parameters:
- address (int) – Start address of user row 
- size (int, optional, not used for this variant) – Size of user row 
 
 
 - execute_nvm_command(command)¶
- Executes an NVM COMMAND on the NVM CTRL - Parameters:
- command – command to execute 
 
 - wait_nvm_ready(timeout_ms=100)¶
- Waits for the NVM controller to be ready - Parameters:
- timeout_ms (int, defaults to 100) – Timeout period in milliseconds 
- Returns:
- True if ‘ready’, False if timeout occurred before ready 
- Return type:
- bool 
- Raises:
- PymcuprogSerialUpdiNvmError if an error condition is encountered 
 
 - write_eeprom(address, data)¶
- Writes data to NVM (EEPROM) - Parameters:
- address (int) – address to write to 
- data (list of bytes) – data to write 
 
 
 - write_flash(address, data)¶
- Writes data to flash - Parameters:
- address (int) – address to write to 
- data (list of bytes) – data to write 
 
 
 - write_fuse(address, data)¶
- Writes one fuse value - Parameters:
- address (int) – address to write to 
- data (list of bytes) – data to write 
 
 
 - write_nvm(address, data, use_word_access=True)¶
- Writes data to NVM. - This version of the NVM block has no page buffer, so words are written directly. - Parameters:
- address (int) – address to write to 
- data (list of bytes) – data to write 
- use_word_access (bool, defaults to True) – True for 16-bit writes (eg: flash) 
 
- Raises:
- PymcuprogSerialUpdiNvmTimeout if a timeout occurred 
- Raises:
- PymcuprogSerialUpdiNvmError if an error condition is encountered 
 
 - write_user_row(address, data)¶
- Writes data to user row - Parameters:
- address (int) – address to write to 
- data (list of bytes) – data to write 
 
 
 
pymcuprog.serialupdi.nvmp3 module¶
NVM controller implementation for P:3.
Present on, for example, AVR EA
- class pymcuprog.serialupdi.nvmp3.NvmUpdiP3(readwrite, device)¶
- Bases: - NvmUpdi- Version P:3 UPDI NVM properties - NVMCMD_CHIP_ERASE = 32¶
 - NVMCMD_EEPROM_ERASE = 48¶
 - NVMCMD_EEPROM_PAGE_BUFFER_CLEAR = 31¶
 - NVMCMD_EEPROM_PAGE_ERASE = 23¶
 - NVMCMD_EEPROM_PAGE_ERASE_WRITE = 21¶
 - NVMCMD_EEPROM_PAGE_WRITE = 20¶
 - NVMCMD_FLASH_PAGE_BUFFER_CLEAR = 15¶
 - NVMCMD_FLASH_PAGE_ERASE = 8¶
 - NVMCMD_FLASH_PAGE_ERASE_WRITE = 5¶
 - NVMCMD_FLASH_PAGE_WRITE = 4¶
 - NVMCMD_NOCMD = 0¶
 - NVMCMD_NOOP = 1¶
 - NVMCTRL_ADDR = 12¶
 - NVMCTRL_CTRLA = 0¶
 - NVMCTRL_CTRLB = 1¶
 - NVMCTRL_DATA = 8¶
 - NVMCTRL_INTCTRL = 4¶
 - NVMCTRL_INTFLAGS = 5¶
 - NVMCTRL_STATUS = 6¶
 - STATUS_EEPROM_BUSY_bp = 0¶
 - STATUS_FLASH_BUSY_bp = 1¶
 - STATUS_WRITE_ERROR_bm = 112¶
 - STATUS_WRITE_ERROR_bp = 4¶
 - chip_erase()¶
- Does a chip erase using the NVM controller - Note that on locked devices this is not possible and the ERASE KEY has to be used instead, see the unlock method 
 - erase_eeprom()¶
- Erase EEPROM memory only 
 - erase_flash_page(address)¶
- Erasing single flash page using the NVM controller - Parameters:
- address (int) – Start address of page to erase 
 
 - erase_user_row(address, size=0)¶
- Erase User Row memory only - Parameters:
- address (int) – Start address of user row 
- size (int, optional, not used for this variant) – Size of user row 
 
 
 - execute_nvm_command(command)¶
- Executes an NVM COMMAND on the NVM CTRL - Parameters:
- command – command to execute 
 
 - wait_nvm_ready(timeout_ms=100)¶
- Waits for the NVM controller to be ready - Parameters:
- timeout_ms (int, defaults to 100) – Timeout period in milliseconds 
- Returns:
- True if ‘ready’, False if timeout occurred before ready 
- Return type:
- bool 
- Raises:
- PymcuprogSerialUpdiNvmError if an error condition is encountered 
 
 - write_eeprom(address, data)¶
- Write data to EEPROM - Parameters:
- address (int) – address to write to 
- data (list of bytes) – data to write 
 
 
 - write_flash(address, data)¶
- Writes data to flash - Parameters:
- address (int) – address to write to 
- data (list of bytes) – data to write 
 
 
 - write_fuse(address, data)¶
- Writes one fuse value - Parameters:
- address (int) – address to write to 
- data (list of bytes) – data to write 
 
 
 - write_nvm(address, data, use_word_access, nvmcommand=4, erasebuffer_command=15)¶
- Writes a page of data to NVM - By default the PAGE_WRITE command is used, which requires that the page is already erased. By default word access is used (required for flash) - Parameters:
- address (int) – address to write to 
- data (list of bytes) – data to write 
- use_word_access (bool, defaults to True) – True for 16-bit writes (eg: flash) 
- nvmcommand (int, defaults to NVMCMD_PAGE_WRITE) – command to use for commit 
- erasebuffer_command (int, defaults to NVMCMD_FLASH_PAGE_BUFFER_CLEAR) – command to use for erasing the page buffer 
 
- Raises:
- PymcuprogSerialUpdiNvmTimeout if a timeout occurred 
- Raises:
- PymcuprogSerialUpdiNvmError if an error condition is encountered 
 
 - write_user_row(address, data)¶
- Writes data to user row - Parameters:
- address (int) – address to write to 
- data (list of bytes) – data to write 
 
 
 
pymcuprog.serialupdi.physical module¶
Serial driver for UPDI stack
- class pymcuprog.serialupdi.physical.UpdiPhysical(port, baud=115200, timeout=None)¶
- Bases: - object- PDI physical driver using a given serial port at a given baud - initialise_serial(port, baud, timeout)¶
- Standard serial port initialisation - Parameters:
- port (str) – Serial port name to connect to 
- baud (int) – Baud rate in bps to use for communications 
- timeout (float) – Timeout value for serial reading. When UPDI is not enabled, attempting to read will return after this timeout period. 
 
 
 - receive(size)¶
- Receives a frame of a known number of chars from UPDI - Parameters:
- size (int) – bytes to receive 
 
 - send(command)¶
- Sends a char array to UPDI without inter-byte delay Note that the byte will echo back - Parameters:
- command (list of bytes) – command to send 
 
 - send_double_break()¶
- Sends a double break to reset the UPDI port - BREAK is actually just a slower zero frame A double break is guaranteed to push the UPDI state machine into a known state, albeit rather brutally 
 - sib()¶
- System information block is just a string coming back from a SIB command 
 
pymcuprog.serialupdi.readwrite module¶
Read/write access provider for UPDI
- class pymcuprog.serialupdi.readwrite.UpdiReadWrite(datalink)¶
- Bases: - object- Provides various forms of reads and writes for UPDI applications Makes us of the datalink provided - read_byte(address)¶
- Read a single byte from UPDI - Parameters:
- address (int) – address to read from 
- Returns:
- value read 
- Return type:
- byte 
 
 - read_cs(address)¶
- Read from Control/Status space - Parameters:
- address (int) – address (index) to read 
- Returns:
- value read 
- Return type:
- byte 
 
 - read_data(address, size)¶
- Reads a number of bytes of data from UPDI - Parameters:
- address (int) – address to write to 
- size (int) – number of bytes to read 
 
 
 - read_data_words(address, words)¶
- Reads a number of words of data from UPDI - Parameters:
- address (int) – address to write to 
- words (int) – number of words to read 
 
 
 - read_sib()¶
- Read the SIB from UPDI - Returns:
- SIB string read 
- Return type:
- bytearray 
 
 - write_byte(address, value)¶
- Writes a single byte to UPDI - Parameters:
- address (int) – address to write to 
- value (byte) – value to write 
 
 
 - write_cs(address, value)¶
- Write to Control/Status space - Parameters:
- address (int) – address (index) to write 
- value (byte) – 8-bit value to write 
 
 
 - write_data(address, data)¶
- Writes a number of bytes to memory - Parameters:
- address (int) – address to write to 
- data (list of bytes) – data to write 
 
 
 - write_data_words(address, data)¶
- Writes a number of words to memory - Parameters:
- address (int) – address to write to 
- data (list of bytes) – data to write 
 
 
 - write_key(size, key)¶
- Write a KEY into UPDI - Parameters:
- size (int) – size of key to send 
- key – key value 
 
- Type:
- key bytearray 
 
 
pymcuprog.serialupdi.timeout module¶
Simple timer helper for UPDI stack
