Device-AVR-UPDI
view release on metacpan or search on metacpan
lib/Device/AVR/UPDI.pm view on Meta::CPAN
830831832833834835836837838839840841842843844845846847848849850
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
877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916async 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
923924925926927928929930931932933934935936937938939940941942
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 )
;
lib/Device/AVR/UPDI.pm view on Meta::CPAN
9839849859869879889899909919929939949959969979989991000100110021003100410051006
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 )