private void ScanPeripheral(XElement node, RegisterSettings defaultRegisterSettings) { var name = GetMandatoryField(node, "name"); var newRegisterSettings = GetRegisterSettings(node, defaultRegisterSettings); var peripheral = new SVDPeripheral(name, this); Peripherals.Add(peripheral); var registersElement = node.Element("registers"); if(registersElement != null) { ScanRegistersAndClusters(registersElement, newRegisterSettings, peripheral); } }
public SVDRegister(XElement node, string name, RegisterSettings settings, SVDPeripheral peripheral) { Name = name; path = GetPath(node); Peripheral = peripheral; Size = settings.Size ?? throw new RecoverableException($"Size not provided for register '{path}'."); // Register's size can be not dividable by 8 SizeInBytes = (uint)Math.Ceiling(Size / 8.0); // Reset value assumed to be 0 if not provided. Maximum size of the register cropped to 32 bits. ResetValue = (settings.ResetValue & 0xFFFFFFFF) ?? 0u; if (Size > 32) { ResetValue = 0u; Peripheral.ParentDevice.Parent.currentSystemBus.Log( LogLevel.Warning, "Register {0} size set to {1} bits. Registers larger than 32 bits are not supported. Reset value for this register is set to {2}.", Name, Size, ResetValue ); } Address = settings.Address ?? throw new RecoverableException($"Address not provided for register '{path}'."); Access = settings.Access ?? PermittedAccess.Read | PermittedAccess.Write; }
private void ScanRegister(XElement node, RegisterSettings defaultRegisterSettings, SVDPeripheral peripheral) { var address = CalculateOffset( defaultRegisterSettings.Address, GetAddressOffset(node) ); var newRegisterSettings = GetRegisterSettings(node, defaultRegisterSettings, address); var name = GetMandatoryField(node, "name"); var newRegister = new SVDRegister(node, name, newRegisterSettings, peripheral); peripheral.Registers.Add(newRegister); }
private void ScanRegisters(XElement node, RegisterSettings defaultRegisterSettings, SVDPeripheral peripheral) { var registerItems = node.Elements("register"); foreach (var register in registerItems) { var derivedAttribute = register.Attribute("derivedFrom"); if (derivedAttribute == null) { ScanRegister(register, defaultRegisterSettings, peripheral); } else { var derivedRegisterName = derivedAttribute.Value; var derivedRegister = FindDerivedElement(NestingType.Register, register, derivedAttribute.Value, defaultRegisterSettings, out var outRegisterSettings); ScanRegister(register, outRegisterSettings, peripheral); } } }
private void ScanClusters(XElement node, RegisterSettings defaultRegisterSettings, SVDPeripheral peripheral) { var clusterItems = node.Elements("cluster"); foreach (var cluster in clusterItems) { var derivedAttribute = cluster.Attribute("derivedFrom"); if (derivedAttribute == null) { ScanCluster(cluster, defaultRegisterSettings, peripheral); } else { var derivedClusterName = derivedAttribute.Value; var derivedCluster = FindDerivedElement(NestingType.Cluster, cluster, derivedAttribute.Value, defaultRegisterSettings, out var outRegisterSettings); if (!cluster.Elements("register").Any()) { cluster.Add(derivedCluster.Elements("register")); } if (!cluster.Elements("cluster").Any()) { cluster.Add(derivedCluster.Elements("cluster")); } ScanCluster(cluster, outRegisterSettings, peripheral); } } }
private void ScanRegistersAndClusters(XElement node, RegisterSettings defaultRegisterSettings, SVDPeripheral peripheral) { ScanClusters(node, defaultRegisterSettings, peripheral); ScanRegisters(node, defaultRegisterSettings, peripheral); }