Device-AVR-UPDI

 view release on metacpan or  search on metacpan

lib/Device/AVR/UPDI.pm  view on Meta::CPAN

830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
   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

877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
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

923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
      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

983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
   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 0.244 second using v1.01-cache-2.11-cpan-05444aca049 )