diff --git a/build/scripts/Targets/TargetDescriptionFiles/Avr8/Services/ValidationService.php b/build/scripts/Targets/TargetDescriptionFiles/Avr8/Services/ValidationService.php index 798f1f25..67c1469d 100644 --- a/build/scripts/Targets/TargetDescriptionFiles/Avr8/Services/ValidationService.php +++ b/build/scripts/Targets/TargetDescriptionFiles/Avr8/Services/ValidationService.php @@ -37,8 +37,12 @@ class ValidationService extends \Targets\TargetDescriptionFiles\Services\Validat $failures[] = 'Program memory address space exceeds 1M bytes'; } - if ($tdf->getProgramMemorySegment() === null) { + $programMemorySegment = $tdf->getProgramMemorySegment(); + if ($programMemorySegment === null) { $failures[] = 'Missing "internal_program_memory" memory segment'; + + } elseif ($programMemorySegment->pageSize === null) { + $failures[] = 'Missing page size in program memory segment'; } if (($gprSegment = $tdf->getGpRegistersMemorySegment()) === null) { diff --git a/build/scripts/Targets/TargetDescriptionFiles/RiscV/Services/ValidationService.php b/build/scripts/Targets/TargetDescriptionFiles/RiscV/Services/ValidationService.php index c78cd54a..1bf4126a 100644 --- a/build/scripts/Targets/TargetDescriptionFiles/RiscV/Services/ValidationService.php +++ b/build/scripts/Targets/TargetDescriptionFiles/RiscV/Services/ValidationService.php @@ -50,8 +50,24 @@ class ValidationService extends \Targets\TargetDescriptionFiles\Services\Validat $failures[] = 'Missing "programming_opcode_key" property'; } - if ($tdf->getProperty('wch_link_interface', 'programming_block_size') === null) { - $failures[] = 'Missing "programming_block_size" property'; + $programmingBlockSize = $tdf->getPropertyValue('wch_link_interface', 'programming_block_size'); + if (!is_numeric($programmingBlockSize)) { + $failures[] = 'Missing/invalid "programming_block_size" property'; + + } else { + if ( + $mainProgramSegment !== null + && ($mainProgramSegment->addressRange->startAddress % (int)$programmingBlockSize) !== 0 + ) { + $failures[] = 'Main program memory segment start address does not align with programming block size'; + } + + if ( + $bootProgramSegment !== null + && ($bootProgramSegment->addressRange->startAddress % (int)$programmingBlockSize) !== 0 + ) { + $failures[] = 'Boot program memory segment start address does not align with programming block size'; + } } if ($tdf->getProperty('riscv_debug_module', 'trigger_count') === null) { diff --git a/build/scripts/Targets/TargetDescriptionFiles/Services/ValidationService.php b/build/scripts/Targets/TargetDescriptionFiles/Services/ValidationService.php index 80b12e85..eee5e313 100644 --- a/build/scripts/Targets/TargetDescriptionFiles/Services/ValidationService.php +++ b/build/scripts/Targets/TargetDescriptionFiles/Services/ValidationService.php @@ -357,6 +357,17 @@ class ValidationService $failures[] = 'Invalid size (' . $segment->size() . ')'; } + if ($segment->pageSize !== null) { + if (($segment->addressRange->startAddress % $segment->pageSize) !== 0) { + $failures[] = 'Start address is not a multiple of the page size'; + } + + if ($segment->size() !== null && ($segment->size() % $segment->pageSize) !== 0) { + $failures[] = 'Size (' . $segment->size() . ') is not a multiple of the page size (' + . $segment->pageSize . ')'; + } + } + if ($segment->executable === null) { $failures[] = 'Missing executable'; }