Added Signal elements to PhysicalInterface elements in TDFs

This commit is contained in:
Nav
2024-10-03 22:45:24 +01:00
parent e522261991
commit af865d09e5
265 changed files with 2696 additions and 387 deletions

View File

@@ -1,6 +1,7 @@
<?php
namespace Targets\TargetDescriptionFiles\Services;
use Targets\TargetDescriptionFiles\PhysicalInterface;
use Targets\TargetDescriptionFiles\Pin;
use Targets\TargetDescriptionFiles\TargetDescriptionFile;
use Targets\TargetDescriptionFiles\AddressSpace;
@@ -21,6 +22,7 @@ use Targets\TargetDescriptionFiles\Pinout;
use Targets\TargetDescriptionFiles\PinoutType;
use Targets\TargetDescriptionFiles\Variant;
use Targets\TargetPeripheral;
use Targets\TargetPhysicalInterface;
use Targets\TargetRegisterGroup;
require_once __DIR__ . '/../TargetDescriptionFile.php';
@@ -77,6 +79,14 @@ class ValidationService
$processedAddressSpaceKeys[] = $addressSpace->key;
}
if (empty($tdf->physicalInterfaces)) {
$failures[] = 'Missing physical interfaces';
}
foreach ($tdf->physicalInterfaces as $physicalInterface) {
$failures = array_merge($failures, $this->validatePhysicalInterface($physicalInterface, $tdf));
}
if (empty($tdf->modules)) {
$failures[] = 'Missing modules';
}
@@ -634,6 +644,104 @@ class ValidationService
);
}
protected function validatePhysicalInterface(
PhysicalInterface $physicalInterface,
TargetDescriptionFile $tdf
): array {
$failures = [];
if (empty($physicalInterface->value)) {
$failures[] = 'Missing value';
}
$containsSignal = function (string $signalName) use ($physicalInterface): bool {
foreach ($physicalInterface->signals as $signal) {
if ($signal->name === $signalName) {
return true;
}
}
return false;
};
$enumValue = TargetPhysicalInterface::tryFrom($physicalInterface->value);
/*
* We only require ISP signals for debugWire targets, as we recommend using the ISP connection when debugging
* debugWire targets.
*/
if (
$enumValue === TargetPhysicalInterface::ISP
&& in_array(TargetPhysicalInterface::DEBUG_WIRE, $tdf->getSupportedPhysicalInterfaces())
) {
if (!$containsSignal('RESET')) {
$failures[] = 'Missing RESET signal';
}
if (!$containsSignal('SCK')) {
$failures[] = 'Missing SCK signal';
}
if (!$containsSignal('MOSI')) {
$failures[] = 'Missing MOSI signal';
}
if (!$containsSignal('MISO')) {
$failures[] = 'Missing MISO signal';
}
}
if ($enumValue === TargetPhysicalInterface::DEBUG_WIRE) {
if (!$containsSignal('dW')) {
$failures[] = 'Missing dW signal';
}
}
if ($enumValue === TargetPhysicalInterface::UPDI) {
if (!$containsSignal('UPDI')) {
$failures[] = 'Missing UPDI signal';
}
}
if ($enumValue === TargetPhysicalInterface::PDI) {
if (!$containsSignal('DATA')) {
$failures[] = 'Missing DATA signal';
}
if (!$containsSignal('CLOCK')) {
$failures[] = 'Missing CLOCK signal';
}
}
if ($enumValue === TargetPhysicalInterface::JTAG) {
if (!$containsSignal('TMS')) {
$failures[] = 'Missing TMS signal';
}
if (!$containsSignal('TDI')) {
$failures[] = 'Missing TDI signal';
}
if (!$containsSignal('TCK')) {
$failures[] = 'Missing TCK signal';
}
if (!$containsSignal('TDO')) {
$failures[] = 'Missing TDO signal';
}
}
foreach ($physicalInterface->signals as $signal) {
$failures = array_merge($failures, $this->validateSignal($signal, $tdf));
}
return array_map(
fn (string $failure): string => 'Physical Interface ("' . $physicalInterface->value
. '") validation failure: ' . $failure,
$failures
);
}
protected function validateModule(Module $module, TargetDescriptionFile $tdf): array
{
$failures = [];