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 )