Updated TDF validation script to include validation of UPDI parameters
This commit is contained in:
@@ -61,6 +61,15 @@ class Avr8TargetDescriptionFile extends TargetDescriptionFile
|
|||||||
public ?int $productSignaturesPdiOffset = null;
|
public ?int $productSignaturesPdiOffset = null;
|
||||||
public ?int $nvmBaseAddress = null;
|
public ?int $nvmBaseAddress = null;
|
||||||
|
|
||||||
|
// UPDI specific target params
|
||||||
|
public ?int $ocdBaseAddress = null;
|
||||||
|
public ?int $programMemoryUpdiStartAddress = null;
|
||||||
|
public ?int $signatureSegmentStartAddress = null;
|
||||||
|
public ?int $signatureSegmentSize = null;
|
||||||
|
public ?int $fuseSegmentStartAddress = null;
|
||||||
|
public ?int $fuseSegmentSize = null;
|
||||||
|
public ?int $lockbitsSegmentStartAddress = null;
|
||||||
|
|
||||||
protected function init()
|
protected function init()
|
||||||
{
|
{
|
||||||
parent::init();
|
parent::init();
|
||||||
@@ -363,6 +372,61 @@ class Avr8TargetDescriptionFile extends TargetDescriptionFile
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (in_array(Avr8TargetDescriptionFile::AVR8_PHYSICAL_INTERFACE_UPDI, $this->debugPhysicalInterface)) {
|
||||||
|
if (isset($this->peripheralModulesByName['nvmctrl'])) {
|
||||||
|
$nvmModule = $this->peripheralModulesByName['nvmctrl'];
|
||||||
|
|
||||||
|
if (isset($nvmModule->instancesMappedByName['nvmctrl'])) {
|
||||||
|
$nvmInstance = $nvmModule->instancesMappedByName['nvmctrl'];
|
||||||
|
|
||||||
|
if (isset($nvmInstance->registerGroupsMappedByName['nvmctrl'])) {
|
||||||
|
$this->nvmBaseAddress = $nvmInstance->registerGroupsMappedByName['nvmctrl']->offset;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isset($this->propertyGroupsByName['updi_interface'])) {
|
||||||
|
$updiInterfacePropertyGroup = $this->propertyGroupsByName['updi_interface'];
|
||||||
|
$updiInterfacePropertiesByName = $updiInterfacePropertyGroup->propertiesMappedByName;
|
||||||
|
|
||||||
|
if (isset($updiInterfacePropertiesByName['ocd_base_addr'])) {
|
||||||
|
$this->ocdBaseAddress = isset($updiInterfacePropertiesByName['ocd_base_addr']->value)
|
||||||
|
? $this->rawValueToInt($updiInterfacePropertiesByName['ocd_base_addr']->value) : null;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isset($updiInterfacePropertiesByName['progmem_offset'])) {
|
||||||
|
$this->programMemoryUpdiStartAddress = isset($updiInterfacePropertiesByName['progmem_offset']->value)
|
||||||
|
? $this->rawValueToInt($updiInterfacePropertiesByName['progmem_offset']->value) : null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!is_null($dataAddressSpace)) {
|
||||||
|
if (isset($dataAddressSpace->memorySegmentsByTypeAndName['signatures']['signatures'])) {
|
||||||
|
$signatureMemSegment = $dataAddressSpace->memorySegmentsByTypeAndName['signatures']['signatures'];
|
||||||
|
$this->signatureSegmentSize = isset($signatureMemSegment->size)
|
||||||
|
? $this->rawValueToInt($signatureMemSegment->size) : null;
|
||||||
|
|
||||||
|
$this->signatureSegmentStartAddress = isset($signatureMemSegment->startAddress)
|
||||||
|
? $this->rawValueToInt($signatureMemSegment->startAddress) : null;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isset($dataAddressSpace->memorySegmentsByTypeAndName['fuses']['fuses'])) {
|
||||||
|
$fusesMemSegment = $dataAddressSpace->memorySegmentsByTypeAndName['fuses']['fuses'];
|
||||||
|
$this->fuseSegmentSize = isset($fusesMemSegment->size)
|
||||||
|
? $this->rawValueToInt($fusesMemSegment->size) : null;
|
||||||
|
|
||||||
|
$this->fuseSegmentStartAddress = isset($fusesMemSegment->startAddress)
|
||||||
|
? $this->rawValueToInt($fusesMemSegment->startAddress) : null;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isset($dataAddressSpace->memorySegmentsByTypeAndName['lockbits']['lockbits'])) {
|
||||||
|
$lockbitsMemSegment = $dataAddressSpace->memorySegmentsByTypeAndName['lockbits']['lockbits'];
|
||||||
|
$this->lockbitsSegmentStartAddress = isset($lockbitsMemSegment->startAddress)
|
||||||
|
? $this->rawValueToInt($lockbitsMemSegment->startAddress) : null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public function validate(): array
|
public function validate(): array
|
||||||
@@ -480,7 +544,55 @@ class Avr8TargetDescriptionFile extends TargetDescriptionFile
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (is_null($this->nvmBaseAddress)) {
|
if (is_null($this->nvmBaseAddress)) {
|
||||||
$failures[] = 'Missing nvm start address.';
|
$failures[] = 'Missing NVM start address.';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (in_array(Avr8TargetDescriptionFile::AVR8_PHYSICAL_INTERFACE_UPDI, $this->debugPhysicalInterface)) {
|
||||||
|
if (is_null($this->nvmBaseAddress)) {
|
||||||
|
$failures[] = 'Missing NVM base address.';
|
||||||
|
}
|
||||||
|
|
||||||
|
if (is_null($this->programMemoryUpdiStartAddress)) {
|
||||||
|
$failures[] = 'Missing UPDI program memory offset.';
|
||||||
|
|
||||||
|
} else if ($this->programMemoryUpdiStartAddress > 0xFFFFFF) {
|
||||||
|
/*
|
||||||
|
* Due to size constraints of EDBG AVR8 parameters for UPDI sessions, the program memory offset must
|
||||||
|
* fit into a 24-bit integer.
|
||||||
|
*/
|
||||||
|
$failures[] = 'UPDI program memory offset exceeds maximum value for 24-bit unsigned integer.';
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!is_null($this->flashPageSize) && $this->flashPageSize > 0xFFFF) {
|
||||||
|
$failures[] = 'Flash page size exceeds maximum value for 16-bit unsigned integer.';
|
||||||
|
}
|
||||||
|
|
||||||
|
if (is_null($this->ocdBaseAddress)) {
|
||||||
|
$failures[] = 'Missing OCD base address.';
|
||||||
|
|
||||||
|
} else if ($this->ocdBaseAddress > 0xFFFF) {
|
||||||
|
$failures[] = 'UPDI OCD base address exceeds maximum value for 16-bit unsigned integer.';
|
||||||
|
}
|
||||||
|
|
||||||
|
if (is_null($this->signatureSegmentStartAddress)) {
|
||||||
|
$failures[] = 'Missing signature segment start address.';
|
||||||
|
}
|
||||||
|
|
||||||
|
if (is_null($this->fuseSegmentSize)) {
|
||||||
|
$failures[] = 'Missing fuse segment size.';
|
||||||
|
}
|
||||||
|
|
||||||
|
if (is_null($this->fuseSegmentStartAddress)) {
|
||||||
|
$failures[] = 'Missing fuses segment start address.';
|
||||||
|
}
|
||||||
|
|
||||||
|
if (is_null($this->fuseSegmentSize)) {
|
||||||
|
$failures[] = 'Missing fuses segment size.';
|
||||||
|
}
|
||||||
|
|
||||||
|
if (is_null($this->lockbitsSegmentStartAddress)) {
|
||||||
|
$failures[] = 'Missing lockbits segment start address.';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user