diff --git a/build/scripts/Targets/TargetDescriptionFiles/AVR8/Avr8TargetDescriptionFile.php b/build/scripts/Targets/TargetDescriptionFiles/AVR8/Avr8TargetDescriptionFile.php index f9efc506..fcdf2195 100644 --- a/build/scripts/Targets/TargetDescriptionFiles/AVR8/Avr8TargetDescriptionFile.php +++ b/build/scripts/Targets/TargetDescriptionFiles/AVR8/Avr8TargetDescriptionFile.php @@ -483,19 +483,24 @@ class Avr8TargetDescriptionFile extends TargetDescriptionFile return $output; } + public function getFuseTargetPeripheral(): ?TargetPeripheral + { + return $this->getTargetPeripheral('fuse'); + } + + public function getFuseTargetRegisterGroup(): ?TargetRegisterGroup + { + return $this->getFuseTargetPeripheral()?->getRegisterGroup("fuse"); + } + public function getFuseBitsDescriptor(string $fuseBitFieldKey): ?FuseBitsDescriptor { - $peripheral = $this->getTargetPeripheral('fuse') ?? $this->getTargetPeripheral('nvm'); - if ($peripheral instanceof TargetPeripheral) { - $fuseRegisterGroup = $peripheral->getRegisterGroup('fuse') - ?? $peripheral->getRegisterGroup('nvm_fuses'); - - if ($fuseRegisterGroup instanceof TargetRegisterGroup) { - foreach ($fuseRegisterGroup->registers as $fuseRegister) { - foreach ($fuseRegister->bitFields as $bitField) { - if ($bitField->key === $fuseBitFieldKey) { - return new FuseBitsDescriptor($fuseRegister->name); - } + $fuseRegisterGroup = $this->getFuseTargetRegisterGroup(); + if ($fuseRegisterGroup instanceof TargetRegisterGroup) { + foreach ($fuseRegisterGroup->registers as $fuseRegister) { + foreach ($fuseRegister->bitFields as $bitField) { + if ($bitField->key === $fuseBitFieldKey) { + return new FuseBitsDescriptor($fuseRegister->name); } } } diff --git a/build/scripts/Targets/TargetDescriptionFiles/AVR8/Services/ValidationService.php b/build/scripts/Targets/TargetDescriptionFiles/AVR8/Services/ValidationService.php index 14ff488f..ba35fcab 100644 --- a/build/scripts/Targets/TargetDescriptionFiles/AVR8/Services/ValidationService.php +++ b/build/scripts/Targets/TargetDescriptionFiles/AVR8/Services/ValidationService.php @@ -93,6 +93,13 @@ class ValidationService extends \Targets\TargetDescriptionFiles\Services\Validat $failures[] = 'Missing stack pointer register(s) in CPU peripheral'; } + // SPL and SPH registers should 1 byte in size + foreach ($spRegisters as $register) { + if (($register->key === 'spl' || $register->key === 'sph') && $register->size !== 1) { + $failures[] = 'Invalid SP register (' . $register->key . ') size - should be 1 byte'; + } + } + /* * GDB allows for a maximum SP size of 2 bytes. We enforce this here. * @@ -104,8 +111,29 @@ class ValidationService extends \Targets\TargetDescriptionFiles\Services\Validat } // The target's status register must reside in the CPU peripheral - if ($tdf->getTargetRegister("cpu", "cpu", "sreg") === null) { + if (($sreg = $tdf->getTargetRegister("cpu", "cpu", "sreg")) === null) { $failures[] = 'Missing status (SREG) register in CPU peripheral'; + + } elseif ($sreg->size !== 1) { + // The SREG should always be 1 byte in size + $failures[] = 'Unexpected SREG register size - expected 1 byte, actual size: ' . $sreg->size . ' bytes'; + } + + if ($tdf->getFuseTargetPeripheral() === null) { + $failures[] = 'Missing fuse peripheral'; + } + + $fuseRegisterGroup = $tdf->getFuseTargetRegisterGroup(); + if ($fuseRegisterGroup instanceof TargetRegisterGroup) { + // All fuse registers should be 1 byte in size + foreach ($tdf->getFuseTargetRegisterGroup()->registers as $fuseRegister) { + if ($fuseRegister->size != 1) { + $failures[] = 'Fuse register ("' . $fuseRegister->key . '") is not 1 byte in size.'; + } + } + + } else { + $failures[] = 'Missing fuse register group (in fuse peripheral)'; } if (in_array(AvrPhysicalInterface::DEBUG_WIRE, $debugPhysicalInterfaces)) { diff --git a/build/scripts/Targets/TargetDescriptionFiles/Services/ValidationService.php b/build/scripts/Targets/TargetDescriptionFiles/Services/ValidationService.php index b1e61a82..c4b90de1 100644 --- a/build/scripts/Targets/TargetDescriptionFiles/Services/ValidationService.php +++ b/build/scripts/Targets/TargetDescriptionFiles/Services/ValidationService.php @@ -606,6 +606,11 @@ class ValidationService $failures[] = 'Invalid size (' . $register->size . ')'; } + if ($register->size > 8) { + // We only support a maximum of 64-bit width for registers, for now + $failures[] = 'Width exceeds 64-bit'; + } + $processedBitFieldKeys = []; foreach ($register->bitFields as $bitField) { $failures = array_merge($failures, $this->validateBitField($bitField));