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);
                }
            }
Example #2
0
 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;
 }
Example #3
0
            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);
            }
Example #4
0
            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);
                    }
                }
            }
Example #5
0
            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);
                    }
                }
            }
Example #6
0
 private void ScanRegistersAndClusters(XElement node, RegisterSettings defaultRegisterSettings, SVDPeripheral peripheral)
 {
     ScanClusters(node, defaultRegisterSettings, peripheral);
     ScanRegisters(node, defaultRegisterSettings, peripheral);
 }