2024-02-09 23:35:26 +00:00
|
|
|
<?php
|
|
|
|
|
namespace Targets\TargetDescriptionFiles\AVR8\Services;
|
|
|
|
|
|
|
|
|
|
use Targets\TargetDescriptionFiles\Avr8\Avr8TargetDescriptionFile;
|
|
|
|
|
use Targets\TargetDescriptionFiles\Avr8\AvrFamily;
|
|
|
|
|
use Targets\TargetDescriptionFiles\Avr8\AvrPhysicalInterface;
|
|
|
|
|
use Targets\TargetDescriptionFiles\Avr8\DebugWireParameters;
|
|
|
|
|
use Targets\TargetDescriptionFiles\Avr8\IspParameters;
|
|
|
|
|
use Targets\TargetDescriptionFiles\Avr8\JtagParameters;
|
|
|
|
|
use Targets\TargetDescriptionFiles\Avr8\PdiParameters;
|
|
|
|
|
use Targets\TargetDescriptionFiles\Avr8\UpdiParameters;
|
2024-06-02 21:29:57 +01:00
|
|
|
use Targets\TargetDescriptionFiles\MemorySegment;
|
2024-02-09 23:35:26 +00:00
|
|
|
use Targets\TargetRegister;
|
|
|
|
|
use Targets\TargetRegisterGroup;
|
|
|
|
|
|
|
|
|
|
require_once __DIR__ . '/../../Services/ValidationService.php';
|
|
|
|
|
require_once __DIR__ . '/../Avr8TargetDescriptionFile.php';
|
|
|
|
|
|
|
|
|
|
class ValidationService extends \Targets\TargetDescriptionFiles\Services\ValidationService
|
|
|
|
|
{
|
|
|
|
|
public function validateAvr8Tdf(Avr8TargetDescriptionFile $tdf): array
|
|
|
|
|
{
|
2024-04-29 20:27:47 +01:00
|
|
|
$failures = parent::validateTdf($tdf);
|
2024-02-09 23:35:26 +00:00
|
|
|
|
2024-06-02 21:30:11 +01:00
|
|
|
if ($tdf->getProgramMemorySegment() === null) {
|
2024-03-25 18:55:03 +00:00
|
|
|
$failures[] = 'Missing "internal_program_memory" memory segment';
|
|
|
|
|
}
|
|
|
|
|
|
2024-06-02 21:30:11 +01:00
|
|
|
if ($tdf->getRamSegment() === null) {
|
2024-03-25 18:55:03 +00:00
|
|
|
$failures[] = 'Missing "internal_ram" memory segment';
|
|
|
|
|
}
|
|
|
|
|
|
2024-06-02 21:30:11 +01:00
|
|
|
if ($tdf->getEepromSegment() === null) {
|
2024-03-25 18:55:03 +00:00
|
|
|
$failures[] = 'Missing "internal_eeprom" memory segment';
|
|
|
|
|
}
|
|
|
|
|
|
2024-06-02 21:30:11 +01:00
|
|
|
if ($tdf->getGpRegistersMemorySegment() === null) {
|
2024-04-06 19:04:45 +01:00
|
|
|
$failures[] = 'Missing "gp_registers" memory segment';
|
|
|
|
|
}
|
|
|
|
|
|
2024-06-02 21:30:11 +01:00
|
|
|
if ($tdf->getIoMemorySegment() === null) {
|
2024-03-25 18:55:03 +00:00
|
|
|
$failures[] = 'Missing IO memory segment';
|
|
|
|
|
}
|
|
|
|
|
|
2024-06-02 21:30:11 +01:00
|
|
|
if ($tdf->getSignaturesMemorySegment() === null) {
|
2024-04-04 22:49:00 +01:00
|
|
|
$failures[] = 'Missing "signatures" memory segment';
|
2024-03-28 20:54:23 +00:00
|
|
|
}
|
|
|
|
|
|
2024-06-02 21:30:11 +01:00
|
|
|
if ($tdf->getFusesMemorySegment() === null) {
|
2024-04-06 19:04:22 +01:00
|
|
|
$failures[] = 'Missing "fuses" memory segment';
|
|
|
|
|
}
|
|
|
|
|
|
2024-02-09 23:35:26 +00:00
|
|
|
if ($tdf->getSignature() === null) {
|
|
|
|
|
$failures[] = "Missing or incomplete AVR signature.";
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
$physicalInterfaces = $tdf->getSupportedPhysicalInterfaces();
|
|
|
|
|
$debugPhysicalInterfaces = $tdf->getSupportedDebugPhysicalInterfaces();
|
|
|
|
|
|
|
|
|
|
if (empty($debugPhysicalInterfaces)) {
|
|
|
|
|
$failures[] = 'Target does not support any known AVR8 debug interface - the TDF will need to be deleted.'
|
|
|
|
|
. ' Aborting validation';
|
|
|
|
|
return $failures;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
$family = $tdf->getAvrFamily();
|
|
|
|
|
if ($family === null) {
|
|
|
|
|
$failures[] = 'Unknown AVR8 family';
|
|
|
|
|
}
|
|
|
|
|
|
2024-03-30 19:39:57 +00:00
|
|
|
// The target must have at least one SP register, and it must reside in the CPU peripheral.
|
|
|
|
|
$spRegisters = array_filter([
|
|
|
|
|
$tdf->getTargetRegister("cpu", "cpu", "sp"),
|
|
|
|
|
$tdf->getTargetRegister("cpu", "cpu", "spl"),
|
|
|
|
|
$tdf->getTargetRegister("cpu", "cpu", "sph"),
|
|
|
|
|
]);
|
|
|
|
|
|
|
|
|
|
if (empty($spRegisters)) {
|
|
|
|
|
$failures[] = 'Missing stack pointer register(s) in CPU peripheral';
|
|
|
|
|
}
|
|
|
|
|
|
2024-06-02 14:05:34 +01:00
|
|
|
// 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';
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2024-03-30 19:39:57 +00:00
|
|
|
/*
|
|
|
|
|
* GDB allows for a maximum SP size of 2 bytes. We enforce this here.
|
|
|
|
|
*
|
|
|
|
|
* For more, see GDB's read/write register packets for AVR targets.
|
|
|
|
|
*/
|
|
|
|
|
$spRegisterSize = array_sum(array_map(fn (TargetRegister $register): int => $register->size, $spRegisters));
|
|
|
|
|
if ($spRegisterSize > 2) {
|
|
|
|
|
$failures[] = 'Stack pointer register size exceeds 2 bytes (actual size: ' . $spRegisterSize . ' bytes)';
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// The target's status register must reside in the CPU peripheral
|
2024-06-02 14:05:34 +01:00
|
|
|
if (($sreg = $tdf->getTargetRegister("cpu", "cpu", "sreg")) === null) {
|
2024-03-30 19:39:57 +00:00
|
|
|
$failures[] = 'Missing status (SREG) register in CPU peripheral';
|
2024-06-02 14:05:34 +01:00
|
|
|
|
|
|
|
|
} 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)';
|
2024-03-30 19:39:57 +00:00
|
|
|
}
|
|
|
|
|
|
2024-02-09 23:35:26 +00:00
|
|
|
if (in_array(AvrPhysicalInterface::DEBUG_WIRE, $debugPhysicalInterfaces)) {
|
2024-06-02 21:29:57 +01:00
|
|
|
$failures = array_merge(
|
|
|
|
|
$failures,
|
|
|
|
|
$this->validateDebugWireParameters($tdf->getDebugWireParameters(), $tdf)
|
|
|
|
|
);
|
|
|
|
|
|
2024-02-09 23:35:26 +00:00
|
|
|
$failures = array_merge($failures, $this->validateIspParameters($tdf->getIspParameters()));
|
|
|
|
|
|
|
|
|
|
if (!in_array(AvrPhysicalInterface::ISP, $physicalInterfaces)) {
|
|
|
|
|
$failures[] = 'Missing ISP interface for debugWIRE target';
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
$dwenFuseBitDescriptor = $tdf->getFuseBitsDescriptor('dwen');
|
|
|
|
|
if (empty($dwenFuseBitDescriptor)) {
|
|
|
|
|
$failures[] = 'Could not find DWEN fuse bit field for debugWIRE target';
|
|
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
static $validFuseTypes = [
|
|
|
|
|
'low',
|
|
|
|
|
'high',
|
|
|
|
|
'extended',
|
|
|
|
|
];
|
|
|
|
|
|
|
|
|
|
if (!in_array($dwenFuseBitDescriptor->fuseType, $validFuseTypes)) {
|
|
|
|
|
$failures[] = 'Invalid/unknown fuse byte type for DWEN fuse bit';
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (
|
|
|
|
|
in_array(AvrPhysicalInterface::JTAG, $debugPhysicalInterfaces)
|
|
|
|
|
&& $family == AvrFamily::MEGA
|
|
|
|
|
) {
|
2024-06-02 21:29:57 +01:00
|
|
|
$failures = array_merge($failures, $this->validateJtagParameters($tdf->getJtagParameters(), $tdf));
|
2024-02-09 23:35:26 +00:00
|
|
|
|
|
|
|
|
if (empty($tdf->getFuseBitsDescriptor('ocden'))) {
|
|
|
|
|
$failures[] = 'Could not find OCDEN fuse bit field for JTAG target';
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (empty($tdf->getFuseBitsDescriptor('jtagen'))) {
|
|
|
|
|
$failures[] = 'Could not find JTAGEN fuse bit field for JTAG target';
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (in_array(AvrPhysicalInterface::PDI, $debugPhysicalInterfaces)) {
|
|
|
|
|
$failures = array_merge($failures, $this->validatePdiParameters($tdf->getPdiParameters()));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (in_array(AvrPhysicalInterface::UPDI, $debugPhysicalInterfaces)) {
|
|
|
|
|
$failures = array_merge($failures, $this->validateUpdiParameters($tdf->getUpdiParameters()));
|
2024-06-05 19:33:06 +01:00
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* In Bloom's EDBG driver, we assume that the device signature memory segment resides in the 'data'
|
|
|
|
|
* address space, for all UPDI targets.
|
|
|
|
|
*
|
|
|
|
|
* We confirm this here.
|
|
|
|
|
*/
|
|
|
|
|
if ($tdf->getAddressSpace("data")?->getMemorySegment("signatures") === null) {
|
|
|
|
|
$failures[] = 'Device signature memory segment should reside in data address space';
|
|
|
|
|
}
|
2024-02-09 23:35:26 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (
|
|
|
|
|
in_array(AvrPhysicalInterface::JTAG, $debugPhysicalInterfaces)
|
|
|
|
|
|| in_array(AvrPhysicalInterface::UPDI, $debugPhysicalInterfaces)
|
|
|
|
|
) {
|
|
|
|
|
if (empty($tdf->getFuseBitsDescriptor('eesave'))) {
|
|
|
|
|
$failures[] = 'Could not find EESAVE fuse bit field for JTAG/UPDI target';
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Ensure that all port peripherals have at least one signal and a port register group.
|
|
|
|
|
foreach ($tdf->getPeripheralsOfModule('gpio_port') as $portPeripheral) {
|
|
|
|
|
if (
|
|
|
|
|
stripos($portPeripheral->name, 'vport') !== false
|
|
|
|
|
|| stripos($portPeripheral->name, 'port_cfg') !== false
|
|
|
|
|
) {
|
|
|
|
|
// Ignore virtual port and port config peripherals
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (empty($portPeripheral->signals)) {
|
|
|
|
|
$failures[] = 'No signals defined for port peripheral "' . $portPeripheral->name . '"';
|
|
|
|
|
}
|
|
|
|
|
|
2024-04-29 20:27:07 +01:00
|
|
|
if (count($portPeripheral->registerGroupInstances) !== 1) {
|
|
|
|
|
$failures[] = 'Unexpected number of register group instances in port peripheral "'
|
|
|
|
|
. $portPeripheral->name . '"';
|
|
|
|
|
}
|
|
|
|
|
|
2024-02-09 23:35:26 +00:00
|
|
|
$alternativePortRegisterGroupKey = 'port' . substr(strtolower($portPeripheral->name), -1);
|
|
|
|
|
$portRegisterGroup = $tdf->getTargetRegisterGroup($portPeripheral->key, 'port')
|
|
|
|
|
?? $tdf->getTargetRegisterGroup($portPeripheral->key, $alternativePortRegisterGroupKey);
|
|
|
|
|
|
|
|
|
|
if (!$portRegisterGroup instanceof TargetRegisterGroup) {
|
|
|
|
|
$failures[] = 'Missing port register group in port peripheral "' . $portPeripheral->name . '"';
|
|
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
$alternativePortRegisterKey = 'port' . substr(strtolower($portPeripheral->name), -1);
|
|
|
|
|
$portRegister = $portRegisterGroup->getRegister('out')
|
|
|
|
|
?? $portRegisterGroup->getRegister($alternativePortRegisterKey);
|
|
|
|
|
|
|
|
|
|
if (!$portRegister instanceof TargetRegister) {
|
2024-04-29 20:27:47 +01:00
|
|
|
$failures[] = 'Missing port/out register in port peripheral "' . $portPeripheral->name . '"';
|
2024-02-09 23:35:26 +00:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return $failures;
|
|
|
|
|
}
|
|
|
|
|
|
2024-06-02 21:29:57 +01:00
|
|
|
private function validateDebugWireParameters(
|
|
|
|
|
DebugWireParameters $parameters,
|
|
|
|
|
Avr8TargetDescriptionFile $tdf
|
|
|
|
|
): array {
|
2024-02-09 23:35:26 +00:00
|
|
|
$failures = [];
|
|
|
|
|
|
|
|
|
|
if ($parameters->flashPageSize === null) {
|
|
|
|
|
$failures[] = 'Missing flash page size';
|
2024-03-25 18:57:05 +00:00
|
|
|
|
|
|
|
|
} elseif ($parameters->flashPageSize > 0xFFFF) {
|
|
|
|
|
$failures[] = 'Flash page size exceeds 0xFFFF - corresponding EDBG device parameter size is 16 bits';
|
2024-02-09 23:35:26 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if ($parameters->flashSize === null) {
|
|
|
|
|
$failures[] = 'Missing flash size';
|
2024-03-25 18:57:05 +00:00
|
|
|
|
|
|
|
|
} elseif ($parameters->flashSize > 0xFFFFFFFF) {
|
|
|
|
|
$failures[] = 'Flash size exceeds 0xFFFFFFFF - corresponding EDBG device parameter size is 32 bits';
|
2024-02-09 23:35:26 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if ($parameters->flashStartAddress === null) {
|
|
|
|
|
$failures[] = 'Missing flash start address';
|
2024-03-25 18:57:05 +00:00
|
|
|
|
|
|
|
|
} elseif ($parameters->flashStartAddress > 0xFFFFFFFF) {
|
|
|
|
|
$failures[] = 'Flash start address exceeds 0xFFFFFFFF - corresponding EDBG device parameter size'
|
|
|
|
|
. ' is 32 bits';
|
2024-02-09 23:35:26 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if ($parameters->ramStartAddress === null) {
|
2024-03-25 18:57:05 +00:00
|
|
|
$failures[] = 'Missing RAM start address';
|
|
|
|
|
|
|
|
|
|
} elseif ($parameters->ramStartAddress > 0xFFFF) {
|
|
|
|
|
$failures[] = 'RAM start address exceeds 0xFFFF - corresponding EDBG device parameter size is 16 bits';
|
2024-02-09 23:35:26 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if ($parameters->eepromSize === null) {
|
2024-03-25 18:57:05 +00:00
|
|
|
$failures[] = 'Missing EEPROM size';
|
|
|
|
|
|
|
|
|
|
} elseif ($parameters->eepromSize > 0xFFFF) {
|
|
|
|
|
$failures[] = 'EEPROM size exceeds 0xFFFF - corresponding EDBG device parameter size is 16 bits';
|
2024-02-09 23:35:26 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if ($parameters->eepromPageSize === null) {
|
2024-03-25 18:57:05 +00:00
|
|
|
$failures[] = 'Missing EEPROM page size';
|
|
|
|
|
|
|
|
|
|
} elseif ($parameters->eepromPageSize > 0xFF) {
|
|
|
|
|
$failures[] = 'EEPROM page size exceeds 0xFF - corresponding EDBG device parameter size is 8 bits';
|
2024-02-09 23:35:26 +00:00
|
|
|
}
|
|
|
|
|
|
2024-03-29 15:52:12 +00:00
|
|
|
if ($parameters->eearAddressHigh === null) {
|
2024-03-25 18:57:05 +00:00
|
|
|
$failures[] = 'Missing EEARH address';
|
|
|
|
|
|
2024-03-29 15:52:12 +00:00
|
|
|
} elseif ($parameters->eearAddressHigh > 0xFF) {
|
2024-03-25 18:57:05 +00:00
|
|
|
$failures[] = 'EEARH address size exceeds 0xFF - corresponding EDBG device parameter size is 8 bits';
|
2024-02-09 23:35:26 +00:00
|
|
|
}
|
|
|
|
|
|
2024-03-29 15:52:12 +00:00
|
|
|
if ($parameters->eearAddressLow === null) {
|
2024-03-25 18:57:05 +00:00
|
|
|
$failures[] = 'Missing EEARL address';
|
|
|
|
|
|
2024-03-29 15:52:12 +00:00
|
|
|
} elseif ($parameters->eearAddressLow > 0xFF) {
|
2024-03-25 18:57:05 +00:00
|
|
|
$failures[] = 'EEARL address size exceeds 0xFF - corresponding EDBG device parameter size is 8 bits';
|
2024-02-09 23:35:26 +00:00
|
|
|
}
|
|
|
|
|
|
2024-03-29 15:52:12 +00:00
|
|
|
if ($parameters->eecrAddress === null) {
|
2024-03-25 18:57:05 +00:00
|
|
|
$failures[] = 'Missing EECR address';
|
|
|
|
|
|
2024-03-29 15:52:12 +00:00
|
|
|
} elseif ($parameters->eecrAddress > 0xFF) {
|
2024-03-25 18:57:05 +00:00
|
|
|
$failures[] = 'EECR address size exceeds 0xFF - corresponding EDBG device parameter size is 8 bits';
|
2024-02-09 23:35:26 +00:00
|
|
|
}
|
|
|
|
|
|
2024-03-29 15:52:12 +00:00
|
|
|
if ($parameters->eedrAddress === null) {
|
2024-03-25 18:57:05 +00:00
|
|
|
$failures[] = 'Missing EEDR address';
|
|
|
|
|
|
2024-03-29 15:52:12 +00:00
|
|
|
} elseif ($parameters->eedrAddress > 0xFF) {
|
2024-03-25 18:57:05 +00:00
|
|
|
$failures[] = 'EEDR address size exceeds 0xFF - corresponding EDBG device parameter size is 8 bits';
|
2024-02-09 23:35:26 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if ($parameters->ocdRevision === null) {
|
|
|
|
|
$failures[] = 'Missing OCD revision';
|
2024-03-25 18:57:05 +00:00
|
|
|
|
|
|
|
|
} elseif ($parameters->ocdRevision > 0xFF) {
|
|
|
|
|
$failures[] = 'OCD revision size exceeds 0xFF - corresponding EDBG device parameter size is 8 bits';
|
2024-02-09 23:35:26 +00:00
|
|
|
}
|
|
|
|
|
|
2024-03-29 15:52:12 +00:00
|
|
|
if ($parameters->ocdDataRegisterAddress === null) {
|
2024-03-25 18:57:05 +00:00
|
|
|
$failures[] = 'Missing OCDR address';
|
|
|
|
|
|
2024-03-29 15:52:12 +00:00
|
|
|
} elseif ($parameters->ocdDataRegisterAddress > 0xFF) {
|
2024-03-25 18:57:05 +00:00
|
|
|
$failures[] = 'OCDR address size exceeds 0xFF - corresponding EDBG device parameter size is 8 bits';
|
2024-02-09 23:35:26 +00:00
|
|
|
}
|
|
|
|
|
|
2024-03-29 15:52:12 +00:00
|
|
|
if ($parameters->spmcrAddress === null) {
|
2024-03-25 18:57:05 +00:00
|
|
|
$failures[] = 'Missing SPMCR start address';
|
|
|
|
|
|
2024-03-29 15:52:12 +00:00
|
|
|
} elseif ($parameters->spmcrAddress > 0xFF) {
|
2024-03-25 18:57:05 +00:00
|
|
|
$failures[] = 'SPMCR address size exceeds 0xFF - corresponding EDBG device parameter size is 8 bits';
|
2024-02-09 23:35:26 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if ($parameters->osccalAddress === null) {
|
2024-03-25 18:57:05 +00:00
|
|
|
$failures[] = 'Missing OSCCAL register address';
|
|
|
|
|
|
|
|
|
|
} elseif ($parameters->osccalAddress > 0xFF) {
|
|
|
|
|
$failures[] = 'OSCCALR address size exceeds 0xFF - corresponding EDBG device parameter size is 8 bits';
|
2024-02-09 23:35:26 +00:00
|
|
|
}
|
|
|
|
|
|
2024-06-02 21:29:57 +01:00
|
|
|
/*
|
|
|
|
|
* Bloom removes the IO memory segment offset when sending some of these params to the debug tool. This means
|
|
|
|
|
* we assume that the offset has already been applied to the params. We enforce this here.
|
|
|
|
|
*/
|
|
|
|
|
if (($ioMemorySegment = $tdf->getIoMemorySegment()) instanceof MemorySegment) {
|
|
|
|
|
if ($parameters->osccalAddress < $ioMemorySegment->startAddress) {
|
|
|
|
|
$failures[] = 'OSCCAL address does not have IO memory segment offset applied';
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if ($parameters->eearAddressLow < $ioMemorySegment->startAddress) {
|
|
|
|
|
$failures[] = 'EEARL address does not have IO memory segment offset applied';
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if ($parameters->eearAddressHigh < $ioMemorySegment->startAddress) {
|
|
|
|
|
$failures[] = 'EEARH address does not have IO memory segment offset applied';
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if ($parameters->eecrAddress < $ioMemorySegment->startAddress) {
|
|
|
|
|
$failures[] = 'EECR address does not have IO memory segment offset applied';
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if ($parameters->eedrAddress < $ioMemorySegment->startAddress) {
|
|
|
|
|
$failures[] = 'EEDR address does not have IO memory segment offset applied';
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
$failures[] = 'Could not verify address offset of debugWire parameters - IO memory segment missing';
|
|
|
|
|
}
|
|
|
|
|
|
2024-02-09 23:35:26 +00:00
|
|
|
return $failures;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private function validateIspParameters(IspParameters $parameters): array
|
|
|
|
|
{
|
|
|
|
|
$failures = [];
|
|
|
|
|
|
|
|
|
|
if ($parameters->programModeTimeout === null) {
|
|
|
|
|
$failures[] = 'Missing ispenterprogmode_timeout ISP parameter';
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if ($parameters->programModeStabilizationDelay === null) {
|
|
|
|
|
$failures[] = 'Missing ispenterprogmode_stabdelay ISP parameter';
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if ($parameters->programModeCommandExecutionDelay === null) {
|
|
|
|
|
$failures[] = 'Missing ispenterprogmode_cmdexedelay ISP parameter';
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if ($parameters->programModeSyncLoops === null) {
|
|
|
|
|
$failures[] = 'Missing ispenterprogmode_synchloops ISP parameter';
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if ($parameters->programModeByteDelay === null) {
|
|
|
|
|
$failures[] = 'Missing ispenterprogmode_bytedelay ISP parameter';
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if ($parameters->programModePollValue === null) {
|
|
|
|
|
$failures[] = 'Missing ispenterprogmode_pollvalue ISP parameter';
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if ($parameters->programModePollIndex === null) {
|
|
|
|
|
$failures[] = 'Missing ispenterprogmode_pollindex ISP parameter';
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if ($parameters->programModePreDelay === null) {
|
|
|
|
|
$failures[] = 'Missing ispleaveprogmode_predelay ISP parameter';
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if ($parameters->programModePostDelay === null) {
|
|
|
|
|
$failures[] = 'Missing ispleaveprogmode_postdelay ISP parameter';
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if ($parameters->readSignaturePollIndex === null) {
|
|
|
|
|
$failures[] = 'Missing ispreadsign_pollindex ISP parameter';
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if ($parameters->readFusePollIndex === null) {
|
|
|
|
|
$failures[] = 'Missing ispreadfuse_pollindex ISP parameter';
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if ($parameters->readLockPollIndex === null) {
|
|
|
|
|
$failures[] = 'Missing ispreadlock_pollindex ISP parameter';
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return $failures;
|
|
|
|
|
}
|
|
|
|
|
|
2024-06-02 21:29:57 +01:00
|
|
|
private function validateJtagParameters(JtagParameters $parameters, Avr8TargetDescriptionFile $tdf): array
|
2024-02-09 23:35:26 +00:00
|
|
|
{
|
|
|
|
|
$failures = [];
|
|
|
|
|
|
|
|
|
|
if ($parameters->flashPageSize === null) {
|
|
|
|
|
$failures[] = 'Missing flash page size';
|
2024-03-25 18:57:05 +00:00
|
|
|
|
|
|
|
|
} elseif ($parameters->flashPageSize > 0xFFFF) {
|
|
|
|
|
$failures[] = 'Flash page size exceeds 0xFFFF - corresponding EDBG device parameter size is 16 bits';
|
2024-02-09 23:35:26 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if ($parameters->flashSize === null) {
|
|
|
|
|
$failures[] = 'Missing flash size';
|
2024-03-25 18:57:05 +00:00
|
|
|
|
|
|
|
|
} elseif ($parameters->flashSize > 0xFFFFFFFF) {
|
|
|
|
|
$failures[] = 'Flash size exceeds 0xFFFFFFFF - corresponding EDBG device parameter size is 32 bits';
|
2024-02-09 23:35:26 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if ($parameters->flashStartAddress === null) {
|
|
|
|
|
$failures[] = 'Missing flash start address';
|
|
|
|
|
|
2024-03-25 18:57:05 +00:00
|
|
|
} elseif ($parameters->flashStartAddress > 0xFFFFFFFF) {
|
|
|
|
|
$failures[] = 'Flash start address exceeds 0xFFFFFFFF - corresponding EDBG device parameter size'
|
|
|
|
|
. ' is 32 bits';
|
2024-02-09 23:35:26 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if ($parameters->ramStartAddress === null) {
|
2024-03-25 18:57:05 +00:00
|
|
|
$failures[] = 'Missing RAM start address';
|
|
|
|
|
|
|
|
|
|
} elseif ($parameters->ramStartAddress > 0xFFFF) {
|
|
|
|
|
$failures[] = 'RAM start address exceeds 0xFFFF - corresponding EDBG device parameter size is 16 bits';
|
2024-02-09 23:35:26 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if ($parameters->eepromSize === null) {
|
2024-03-25 18:57:05 +00:00
|
|
|
$failures[] = 'Missing EEPROM size';
|
|
|
|
|
|
|
|
|
|
} elseif ($parameters->eepromSize > 0xFFFF) {
|
|
|
|
|
$failures[] = 'EEPROM size exceeds 0xFFFF - corresponding EDBG device parameter size is 16 bits';
|
2024-02-09 23:35:26 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if ($parameters->eepromPageSize === null) {
|
2024-03-25 18:57:05 +00:00
|
|
|
$failures[] = 'Missing EEPROM page size';
|
|
|
|
|
|
|
|
|
|
} elseif ($parameters->eepromPageSize > 0xFF) {
|
|
|
|
|
$failures[] = 'EEPROM page size exceeds 0xFF - corresponding EDBG device parameter size is 8 bits';
|
2024-02-09 23:35:26 +00:00
|
|
|
}
|
|
|
|
|
|
2024-03-29 15:52:12 +00:00
|
|
|
if ($parameters->eearAddressHigh === null) {
|
2024-03-25 18:57:05 +00:00
|
|
|
$failures[] = 'Missing EEARH address';
|
|
|
|
|
|
2024-03-29 15:52:12 +00:00
|
|
|
} elseif ($parameters->eearAddressHigh > 0xFF) {
|
2024-03-25 18:57:05 +00:00
|
|
|
$failures[] = 'EEARH address size exceeds 0xFF - corresponding EDBG device parameter size is 8 bits';
|
2024-02-09 23:35:26 +00:00
|
|
|
}
|
|
|
|
|
|
2024-03-29 15:52:12 +00:00
|
|
|
if ($parameters->eearAddressLow === null) {
|
2024-03-25 18:57:05 +00:00
|
|
|
$failures[] = 'Missing EEARL address';
|
|
|
|
|
|
2024-03-29 15:52:12 +00:00
|
|
|
} elseif ($parameters->eearAddressLow > 0xFF) {
|
2024-03-25 18:57:05 +00:00
|
|
|
$failures[] = 'EEARL address size exceeds 0xFF - corresponding EDBG device parameter size is 8 bits';
|
2024-02-09 23:35:26 +00:00
|
|
|
}
|
|
|
|
|
|
2024-03-29 15:52:12 +00:00
|
|
|
if ($parameters->eecrAddress === null) {
|
2024-03-25 18:57:05 +00:00
|
|
|
$failures[] = 'Missing EECR address';
|
|
|
|
|
|
2024-03-29 15:52:12 +00:00
|
|
|
} elseif ($parameters->eecrAddress > 0xFF) {
|
2024-03-25 18:57:05 +00:00
|
|
|
$failures[] = 'EECR address size exceeds 0xFF - corresponding EDBG device parameter size is 8 bits';
|
2024-02-09 23:35:26 +00:00
|
|
|
}
|
|
|
|
|
|
2024-03-29 15:52:12 +00:00
|
|
|
if ($parameters->eedrAddress === null) {
|
2024-03-25 18:57:05 +00:00
|
|
|
$failures[] = 'Missing EEDR address';
|
|
|
|
|
|
2024-03-29 15:52:12 +00:00
|
|
|
} elseif ($parameters->eedrAddress > 0xFF) {
|
2024-03-25 18:57:05 +00:00
|
|
|
$failures[] = 'EEDR address size exceeds 0xFF - corresponding EDBG device parameter size is 8 bits';
|
2024-02-09 23:35:26 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if ($parameters->ocdRevision === null) {
|
|
|
|
|
$failures[] = 'Missing OCD revision';
|
2024-03-25 18:57:05 +00:00
|
|
|
|
|
|
|
|
} elseif ($parameters->ocdRevision > 0xFF) {
|
|
|
|
|
$failures[] = 'OCD revision size exceeds 0xFF - corresponding EDBG device parameter size is 8 bits';
|
2024-02-09 23:35:26 +00:00
|
|
|
}
|
|
|
|
|
|
2024-03-29 15:52:12 +00:00
|
|
|
if ($parameters->ocdDataRegisterAddress === null) {
|
2024-03-25 18:57:05 +00:00
|
|
|
$failures[] = 'Missing OCDR address';
|
|
|
|
|
|
2024-03-29 15:52:12 +00:00
|
|
|
} elseif ($parameters->ocdDataRegisterAddress > 0xFF) {
|
2024-03-25 18:57:05 +00:00
|
|
|
$failures[] = 'OCDR address size exceeds 0xFF - corresponding EDBG device parameter size is 8 bits';
|
2024-02-09 23:35:26 +00:00
|
|
|
}
|
|
|
|
|
|
2024-03-29 15:52:12 +00:00
|
|
|
if ($parameters->spmcrAddress === null) {
|
2024-03-25 18:57:05 +00:00
|
|
|
$failures[] = 'Missing SPMCR start address';
|
|
|
|
|
|
2024-03-29 15:52:12 +00:00
|
|
|
} elseif ($parameters->spmcrAddress > 0xFF) {
|
2024-03-25 18:57:05 +00:00
|
|
|
$failures[] = 'SPMCR address size exceeds 0xFF - corresponding EDBG device parameter size is 8 bits';
|
2024-02-09 23:35:26 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if ($parameters->osccalAddress === null) {
|
2024-03-25 18:57:05 +00:00
|
|
|
$failures[] = 'Missing OSCCAL register address';
|
|
|
|
|
|
|
|
|
|
} elseif ($parameters->osccalAddress > 0xFF) {
|
|
|
|
|
$failures[] = 'OSCCALR address size exceeds 0xFF - corresponding EDBG device parameter size is 8 bits';
|
2024-02-09 23:35:26 +00:00
|
|
|
}
|
|
|
|
|
|
2024-06-02 21:29:57 +01:00
|
|
|
/*
|
|
|
|
|
* Bloom removes the IO memory segment offset when sending some of these params to the debug tool. This means
|
|
|
|
|
* we assume that the offset has already been applied to the params. We enforce this here.
|
|
|
|
|
*/
|
|
|
|
|
if (($ioMemorySegment = $tdf->getIoMemorySegment()) instanceof MemorySegment) {
|
|
|
|
|
if ($parameters->osccalAddress < $ioMemorySegment->startAddress) {
|
|
|
|
|
$failures[] = 'OSCCAL address does not have IO memory segment offset applied';
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if ($parameters->eearAddressLow < $ioMemorySegment->startAddress) {
|
|
|
|
|
$failures[] = 'EEARL address does not have IO memory segment offset applied';
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if ($parameters->eearAddressHigh < $ioMemorySegment->startAddress) {
|
|
|
|
|
$failures[] = 'EEARH address does not have IO memory segment offset applied';
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if ($parameters->eecrAddress < $ioMemorySegment->startAddress) {
|
|
|
|
|
$failures[] = 'EECR address does not have IO memory segment offset applied';
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if ($parameters->eedrAddress < $ioMemorySegment->startAddress) {
|
|
|
|
|
$failures[] = 'EEDR address does not have IO memory segment offset applied';
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
$failures[] = 'Could not verify address offset of debugWire parameters - IO memory segment missing';
|
|
|
|
|
}
|
|
|
|
|
|
2024-02-09 23:35:26 +00:00
|
|
|
return $failures;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private function validatePdiParameters(PdiParameters $parameters): array
|
|
|
|
|
{
|
|
|
|
|
$failures = [];
|
|
|
|
|
|
|
|
|
|
if ($parameters->appSectionOffset === null) {
|
|
|
|
|
$failures[] = 'Missing app section PDI offset';
|
2024-03-25 18:57:05 +00:00
|
|
|
|
|
|
|
|
} elseif ($parameters->appSectionOffset > 0xFFFFFFFF) {
|
|
|
|
|
$failures[] = 'App section offset exceeds 0xFFFFFFFF - corresponding EDBG device parameter size is 32 bits';
|
2024-02-09 23:35:26 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if ($parameters->bootSectionOffset === null) {
|
|
|
|
|
$failures[] = 'Missing boot section PDI offset';
|
2024-03-25 18:57:05 +00:00
|
|
|
|
|
|
|
|
} elseif ($parameters->bootSectionOffset > 0xFFFFFFFF) {
|
|
|
|
|
$failures[] = 'Boot section offset exceeds 0xFFFFFFFF - corresponding EDBG device parameter size'
|
|
|
|
|
. ' is 32 bits';
|
2024-02-09 23:35:26 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if ($parameters->eepromOffset === null) {
|
2024-03-25 18:57:05 +00:00
|
|
|
$failures[] = 'Missing EEPROM PDI offset';
|
|
|
|
|
|
|
|
|
|
} elseif ($parameters->eepromOffset > 0xFFFFFFFF) {
|
|
|
|
|
$failures[] = 'EEPROM PDI offset exceeds 0xFFFFFFFF - corresponding EDBG device parameter size is 32 bits';
|
2024-02-09 23:35:26 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if ($parameters->fuseRegistersOffset === null) {
|
|
|
|
|
$failures[] = 'Missing fuse PDI offset';
|
2024-03-25 18:57:05 +00:00
|
|
|
|
|
|
|
|
} elseif ($parameters->fuseRegistersOffset > 0xFFFFFFFF) {
|
|
|
|
|
$failures[] = 'Fuse register offset exceeds 0xFFFFFFFF - corresponding EDBG device parameter size'
|
|
|
|
|
. ' is 32 bits';
|
2024-02-09 23:35:26 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if ($parameters->lockRegistersOffset === null) {
|
|
|
|
|
$failures[] = 'Missing lock registers PDI offset';
|
2024-03-25 18:57:05 +00:00
|
|
|
|
|
|
|
|
} elseif ($parameters->lockRegistersOffset > 0xFFFFFFFF) {
|
|
|
|
|
$failures[] = 'Lock register offset exceeds 0xFFFFFFFF - corresponding EDBG device parameter size'
|
|
|
|
|
. ' is 32 bits';
|
2024-02-09 23:35:26 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if ($parameters->userSignaturesOffset === null) {
|
|
|
|
|
$failures[] = 'Missing user signatures PDI offset';
|
2024-03-25 18:57:05 +00:00
|
|
|
|
|
|
|
|
} elseif ($parameters->userSignaturesOffset > 0xFFFFFFFF) {
|
|
|
|
|
$failures[] = 'User signature offset exceeds 0xFFFFFFFF - corresponding EDBG device parameter size'
|
|
|
|
|
. ' is 32 bits';
|
2024-02-09 23:35:26 +00:00
|
|
|
}
|
|
|
|
|
|
2024-03-25 18:57:05 +00:00
|
|
|
if ($parameters->productionSignaturesOffset === null) {
|
2024-02-09 23:35:26 +00:00
|
|
|
$failures[] = 'Missing product signatures PDI offset';
|
2024-03-25 18:57:05 +00:00
|
|
|
|
|
|
|
|
} elseif ($parameters->productionSignaturesOffset > 0xFFFFFFFF) {
|
|
|
|
|
$failures[] = 'Prod signature offset exceeds 0xFFFFFFFF - corresponding EDBG device parameter size'
|
|
|
|
|
. ' is 32 bits';
|
2024-02-09 23:35:26 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if ($parameters->ramOffset === null) {
|
|
|
|
|
$failures[] = 'Missing datamem PDI offset';
|
2024-03-25 18:57:05 +00:00
|
|
|
|
|
|
|
|
} elseif ($parameters->ramOffset > 0xFFFFFFFF) {
|
|
|
|
|
$failures[] = 'RAM offset exceeds 0xFFFFFFFF - corresponding EDBG device parameter size is 32 bits';
|
2024-02-09 23:35:26 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if ($parameters->appSectionSize === null) {
|
|
|
|
|
$failures[] = 'Missing app section size';
|
2024-03-25 18:57:05 +00:00
|
|
|
|
|
|
|
|
} elseif ($parameters->appSectionSize > 0xFFFFFFFF) {
|
|
|
|
|
$failures[] = 'App section size exceeds 0xFFFFFFFF - corresponding EDBG device parameter size is 32 bits';
|
2024-02-09 23:35:26 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if ($parameters->bootSectionSize === null) {
|
|
|
|
|
$failures[] = 'Missing boot section size';
|
2024-03-25 18:57:05 +00:00
|
|
|
|
|
|
|
|
} elseif ($parameters->bootSectionSize > 0xFFFF) {
|
|
|
|
|
$failures[] = 'Boot section size exceeds 0xFFFF - corresponding EDBG device parameter size is 16 bits';
|
2024-02-09 23:35:26 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if ($parameters->flashPageSize === null) {
|
|
|
|
|
$failures[] = 'Missing flash page size';
|
2024-03-25 18:57:05 +00:00
|
|
|
|
|
|
|
|
} elseif ($parameters->flashPageSize > 0xFFFF) {
|
|
|
|
|
$failures[] = 'Flash page size exceeds 0xFFFF - corresponding EDBG device parameter size is 16 bits';
|
2024-02-09 23:35:26 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if ($parameters->eepromSize === null) {
|
|
|
|
|
$failures[] = 'Missing EEPROM size';
|
2024-03-25 18:57:05 +00:00
|
|
|
|
|
|
|
|
} elseif ($parameters->eepromSize > 0xFFFF) {
|
|
|
|
|
$failures[] = 'EEPROM size exceeds 0xFFFF - corresponding EDBG device parameter size is 16 bits';
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if ($parameters->eepromPageSize === null) {
|
|
|
|
|
$failures[] = 'Missing EEPROM page size';
|
|
|
|
|
|
|
|
|
|
} elseif ($parameters->eepromPageSize > 0xFF) {
|
|
|
|
|
$failures[] = 'EEPROM page size exceeds 0xFF - corresponding EDBG device parameter size is 8 bits';
|
2024-02-09 23:35:26 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if ($parameters->flashPageSize === null) {
|
|
|
|
|
$failures[] = 'Missing flash page size';
|
2024-03-25 18:57:05 +00:00
|
|
|
|
|
|
|
|
} elseif ($parameters->flashPageSize > 0xFFFF) {
|
|
|
|
|
$failures[] = 'Flash page size exceeds 0xFFFF - corresponding EDBG device parameter size is 16 bits';
|
2024-02-09 23:35:26 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if ($parameters->nvmModuleBaseAddress === null) {
|
|
|
|
|
$failures[] = 'Missing NVM module base address';
|
2024-03-25 18:57:05 +00:00
|
|
|
|
|
|
|
|
} elseif ($parameters->nvmModuleBaseAddress > 0xFFFF) {
|
|
|
|
|
$failures[] = 'NVM module address size exceeds 0xFFFF - corresponding EDBG device parameter size'
|
|
|
|
|
. ' is 16 bits';
|
2024-02-09 23:35:26 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if ($parameters->signatureOffset === null) {
|
|
|
|
|
$failures[] = 'Missing signature PDI offset';
|
2024-03-25 18:57:05 +00:00
|
|
|
|
|
|
|
|
} elseif ($parameters->signatureOffset > 0xFFFF) {
|
|
|
|
|
$failures[] = 'Signature offset size exceeds 0xFFFF - corresponding EDBG device parameter size is 16 bits';
|
2024-02-09 23:35:26 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return $failures;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private function validateUpdiParameters(UpdiParameters $parameters): array
|
|
|
|
|
{
|
|
|
|
|
$failures = [];
|
|
|
|
|
|
|
|
|
|
if ($parameters->programMemoryOffset === null) {
|
|
|
|
|
$failures[] = 'Missing UPDI program memory offset';
|
|
|
|
|
|
|
|
|
|
} elseif ($parameters->programMemoryOffset > 0xFFFFFF) {
|
|
|
|
|
/*
|
|
|
|
|
* Due to size constraints of EDBG AVR8 parameters for UPDI sessions, the program memory offset must
|
|
|
|
|
* fit into a 24-bit integer.
|
|
|
|
|
*/
|
2024-03-25 18:57:05 +00:00
|
|
|
$failures[] = 'Program memory offset exceeds 0xFFFFFF - corresponding EDBG device parameter size'
|
|
|
|
|
. ' is 24 bits';
|
2024-02-09 23:35:26 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if ($parameters->flashPageSize === null) {
|
|
|
|
|
$failures[] = 'Missing flash page size';
|
|
|
|
|
|
|
|
|
|
} elseif ($parameters->flashPageSize > 0xFFFF) {
|
2024-03-25 18:57:05 +00:00
|
|
|
$failures[] = 'Flash page size exceeds 0xFFFF - corresponding EDBG device parameter size is 16 bits';
|
2024-02-09 23:35:26 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if ($parameters->eepromPageSize === null) {
|
|
|
|
|
$failures[] = 'Missing EEPROM page size';
|
2024-03-25 18:57:05 +00:00
|
|
|
|
|
|
|
|
} elseif ($parameters->eepromPageSize > 0xFF) {
|
|
|
|
|
$failures[] = 'EEPROM page size exceeds 0xFF - corresponding EDBG device parameter size is 8 bits';
|
2024-02-09 23:35:26 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if ($parameters->nvmModuleBaseAddress === null) {
|
|
|
|
|
$failures[] = 'Missing NVM base address';
|
2024-03-25 18:57:05 +00:00
|
|
|
|
|
|
|
|
} elseif ($parameters->nvmModuleBaseAddress > 0xFFFF) {
|
|
|
|
|
$failures[] = 'NVM module address size exceeds 0xFFFF - corresponding EDBG device parameter size'
|
|
|
|
|
. ' is 16 bits';
|
2024-02-09 23:35:26 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if ($parameters->ocdBaseAddress === null) {
|
|
|
|
|
$failures[] = 'Missing OCD base address';
|
|
|
|
|
|
|
|
|
|
} elseif ($parameters->ocdBaseAddress > 0xFFFF) {
|
2024-03-25 18:57:05 +00:00
|
|
|
$failures[] = 'OCD base address size exceeds 0xFFFF - corresponding EDBG device parameter size is 16 bits';
|
2024-02-09 23:35:26 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if ($parameters->flashSize === null) {
|
|
|
|
|
$failures[] = 'Missing flash size';
|
2024-03-25 18:57:05 +00:00
|
|
|
|
|
|
|
|
} elseif ($parameters->flashSize > 0xFFFFFFFF) {
|
|
|
|
|
$failures[] = 'Flash size exceeds 0xFFFFFFFF - corresponding EDBG device parameter size is 32 bits';
|
2024-02-09 23:35:26 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if ($parameters->eepromSize === null) {
|
|
|
|
|
$failures[] = 'Missing EEPROM size';
|
2024-03-25 18:57:05 +00:00
|
|
|
|
|
|
|
|
} elseif ($parameters->eepromSize > 0xFFFF) {
|
|
|
|
|
$failures[] = 'EEPROM size exceeds 0xFFFF - corresponding EDBG device parameter size is 16 bits';
|
2024-02-09 23:35:26 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if ($parameters->eepromStartAddress === null) {
|
|
|
|
|
$failures[] = 'Missing EEPROM start address';
|
2024-03-25 18:57:05 +00:00
|
|
|
|
|
|
|
|
} elseif ($parameters->eepromStartAddress > 0xFFFF) {
|
|
|
|
|
$failures[] = 'EEPROM start address size exceeds 0xFFFF - corresponding EDBG device parameter size'
|
|
|
|
|
. ' is 16 bits';
|
2024-02-09 23:35:26 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if ($parameters->signatureSegmentStartAddress === null) {
|
|
|
|
|
$failures[] = 'Missing signature segment start address';
|
2024-03-25 18:57:05 +00:00
|
|
|
|
|
|
|
|
} elseif ($parameters->signatureSegmentStartAddress > 0xFFFF) {
|
|
|
|
|
$failures[] = 'Signature segment start address size exceeds 0xFFFF - corresponding EDBG device parameter'
|
|
|
|
|
. ' size is 16 bits';
|
2024-02-09 23:35:26 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if ($parameters->fuseSegmentStartAddress === null) {
|
|
|
|
|
$failures[] = 'Missing fuses segment start address';
|
2024-03-25 18:57:05 +00:00
|
|
|
|
|
|
|
|
} elseif ($parameters->fuseSegmentStartAddress > 0xFFFF) {
|
|
|
|
|
$failures[] = 'Fuse segment start address size exceeds 0xFFFF - corresponding EDBG device parameter size'
|
|
|
|
|
. ' is 16 bits';
|
2024-02-09 23:35:26 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if ($parameters->fuseSegmentSize === null) {
|
|
|
|
|
$failures[] = 'Missing fuse segment size';
|
2024-03-25 18:57:05 +00:00
|
|
|
|
|
|
|
|
} elseif ($parameters->fuseSegmentSize > 0xFFFF) {
|
|
|
|
|
$failures[] = 'Fuse segment size exceeds 0xFFFF - corresponding EDBG device parameter size is 16 bits';
|
2024-02-09 23:35:26 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if ($parameters->lockbitsSegmentStartAddress === null) {
|
|
|
|
|
$failures[] = 'Missing lockbits segment start address';
|
2024-03-25 18:57:05 +00:00
|
|
|
|
|
|
|
|
} elseif ($parameters->lockbitsSegmentStartAddress > 0xFFFF) {
|
|
|
|
|
$failures[] = 'Lockbit segment start address size exceeds 0xFFFF - corresponding EDBG device parameter'
|
|
|
|
|
. ' size is 16 bits';
|
2024-02-09 23:35:26 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return $failures;
|
|
|
|
|
}
|
|
|
|
|
}
|