diff --git a/build/scripts/TargetDescriptionFiles/AVR8/Avr8TargetDescriptionFile.php b/build/scripts/TargetDescriptionFiles/AVR8/Avr8TargetDescriptionFile.php index 7be158a8..4323c9ce 100644 --- a/build/scripts/TargetDescriptionFiles/AVR8/Avr8TargetDescriptionFile.php +++ b/build/scripts/TargetDescriptionFiles/AVR8/Avr8TargetDescriptionFile.php @@ -6,6 +6,7 @@ use Bloom\BuildScripts\TargetDescriptionFiles\TargetDescriptionFile; require_once __DIR__ . "/../TargetDescriptionFile.php"; require_once __DIR__ . "/Signature.php"; +require_once __DIR__ . "/FuseBitDescriptor.php"; class Avr8TargetDescriptionFile extends TargetDescriptionFile { @@ -85,6 +86,9 @@ class Avr8TargetDescriptionFile extends TargetDescriptionFile public ?int $ispReadFusePollIndex = null; public ?int $ispReadLockPollIndex = null; + public ?FuseBitDescriptor $dwenFuseBitDescriptor = null; + + protected function init() { parent::init(); @@ -231,6 +235,19 @@ class Avr8TargetDescriptionFile extends TargetDescriptionFile } } + $fuseModule = $this->modulesByName['fuse'] ?? null; + if (!empty($fuseModule)) { + $fuseRegisterGroup = $fuseModule->registerGroupsMappedByName['fuse'] ?? null; + if (!empty($fuseRegisterGroup)) { + foreach ($fuseRegisterGroup->registersMappedByName as $fuseType => $fuseRegister) { + if (isset($fuseRegister->bitFieldsByName['dwen'])) { + $this->dwenFuseBitDescriptor = new FuseBitDescriptor(); + $this->dwenFuseBitDescriptor->fuseType = $fuseType; + } + } + } + } + $progAddressSpace = $this->addressSpacesById['prog'] ?? null; if (!empty($progAddressSpace)) { $flashMemorySegment = $progAddressSpace->memorySegmentsByTypeAndName['flash']['flash'] @@ -580,6 +597,21 @@ class Avr8TargetDescriptionFile extends TargetDescriptionFile if (is_null($this->ispReadLockPollIndex)) { $failures[] = 'Missing ispreadlock_pollindex ISP parameter.'; } + + if (empty($this->dwenFuseBitDescriptor)) { + $failures[] = 'Could not find DWEN fuse bit field for debugWire target.'; + + } else { + static $validFuseTypes = [ + FuseBitDescriptor::FUSE_TYPE_LOW, + FuseBitDescriptor::FUSE_TYPE_HIGH, + FuseBitDescriptor::FUSE_TYPE_EXTENDED, + ]; + + if (!in_array($this->dwenFuseBitDescriptor->fuseType, $validFuseTypes)) { + $failures[] = 'Invalid/unknown fuse byte type for DWEN fuse bit.'; + } + } } if (is_null($this->stackPointerRegisterLowAddress)) { diff --git a/build/scripts/TargetDescriptionFiles/AVR8/FuseBitDescriptor.php b/build/scripts/TargetDescriptionFiles/AVR8/FuseBitDescriptor.php new file mode 100644 index 00000000..912a6fb1 --- /dev/null +++ b/build/scripts/TargetDescriptionFiles/AVR8/FuseBitDescriptor.php @@ -0,0 +1,11 @@ +