Device-AVR-UPDI
view release on metacpan or search on metacpan
lib/Device/AVR/UPDI.pm view on Meta::CPAN
ADJUST
{
$_partinfo = $_updi->partinfo;
}
async method nvmctrl_command ( $cmd )
{
await $_updi->sts8( $_partinfo->baseaddr_nvmctrl + NVMCTRL_CTRLA, $cmd );
}
async method await_nvm_not_busy ()
{
my $timeout = 50;
while( --$timeout ) {
last if not( NVMCTRL_STATUS_FBUSY & await $_updi->lds8(
$_partinfo->baseaddr_nvmctrl + NVMCTRL_STATUS ) );
await Future::IO->sleep( 0.01 );
}
}
}
lib/Device/AVR/UPDI.pm view on Meta::CPAN
async method read_eeprom_page ( $addr, $len )
{
return await $_updi->ld( $_partinfo->baseaddr_eeprom + $addr, $len );
}
async method _write_page ( $addr, $data, $wordsize, $cmd )
{
# clear page buffer
await $self->nvmctrl_command( NVMCTRL_CMD_PBC );
await $self->await_nvm_not_busy;
# Disable response sig for speed
await $_updi->set_rsd( 1 );
if( $wordsize == 8 ) {
await $_updi->st8( $addr, $data );
}
elsif( $wordsize == 16 ) {
await $_updi->st16( $addr, $data );
}
else {
croak "Invalid word size";
}
# Re-enable response sig again
await $_updi->set_rsd( 0 );
await $self->nvmctrl_command( $cmd );
await $self->await_nvm_not_busy;
}
async method write_flash_page ( $addr, $data )
{
await $self->_write_page( $_partinfo->baseaddr_flash + $addr, $data, 16, NVMCTRL_CMD_WP );
}
async method write_eeprom_page ( $addr, $data )
{
await $self->_write_page( $_partinfo->baseaddr_eeprom + $addr, $data, 8, NVMCTRL_CMD_ERWP );
lib/Device/AVR/UPDI.pm view on Meta::CPAN
my $baseaddr = $_partinfo->baseaddr_nvmctrl;
# Oddly, this works but an attempt at STS16 does not. Unsure why
await $_updi->sts8 ( $baseaddr + NVMCTRL_ADDR , $addr & 0xFF );
await $_updi->sts8 ( $baseaddr + NVMCTRL_ADDR+1, $addr >> 8 );
await $_updi->sts8 ( $baseaddr + NVMCTRL_DATA, $value );
await $self->nvmctrl_command( NVMCTRL_CMD_WFU );
await $self->await_nvm_not_busy;
}
}
class # hide from indexer
Device::AVR::UPDI::_NVMCtrlv2 {
inherit Device::AVR::UPDI::_NVMCtrl qw( $_updi $_partinfo );
use Carp;
lib/Device/AVR/UPDI.pm view on Meta::CPAN
elsif( $wordsize == 16 ) {
await $_updi->st16( $addr, $data );
}
else {
croak "Invalid word size";
}
# Re-enable response sig again
await $_updi->set_rsd( 0 );
await $self->await_nvm_not_busy;
# clear command
await $self->nvmctrl_command( NVMCTRL_CMD_NOCMD );
await $self->await_nvm_not_busy;
}
async method write_flash_page ( $addr, $data )
{
await $self->_set_flmap( $addr >> 15 );
$addr &= 0x7FFF;
await $self->_write_page( $_partinfo->baseaddr_flash + $addr, $data, 16, NVMCTRL_CMD_FLWR );
}
( run in 1.119 second using v1.01-cache-2.11-cpan-87723dcf8b7 )