If the type of property is a 'string-list' we should generate defines as
if its a list even if theres only a single element in the list.
Signed-off-by: Kumar Gala <kumar.gala@linaro.org>
Several bindings have an expectation of sub-nodes that describe the
actual infomation. The sub-nodes don't have any compatiable so we can't
key on that.
So we can add the concept of a sub-node to the YAML to handle cases like
'gpio-keys', 'gpio-leds', 'pwm-leds', etc..
The sub-node in the YAML is effective the "binding" params that describe
what properties should exist in the sub-node.
Signed-off-by: Kumar Gala <kumar.gala@linaro.org>
The alias generation wasn't doing the right thing with regards to
keeping the names consistent. We would drop the index from the define
name for aliases.
So we'd get
DT_NXP_KINETIS_GPIO_GPIO_D_IRQ
which should be
DT_NXP_KINETIS_GPIO_GPIO_D_IRQ_0
Signed-off-by: Kumar Gala <kumar.gala@linaro.org>
Add a deprecate flag to add_prop_aliases so we can make the aliases it
generates as deprecated if needed.
Signed-off-by: Kumar Gala <kumar.gala@linaro.org>
Think I understand it now, and that was the goal.
- _extract_partition() adds index-based entries. extract_partition()
adds label-based entries.
Rename them to _add_partition_index_entries() and
_add_partition_label_entries(), and call them from a top-level
extract_partition() function.
This makes the logic clearer. It took me a long time to spot it.
- Generate indicies with a simple counter and remove the _flash_area
logic. This would break if partitions were extracted more than once,
but they aren't, and now you know that they can't be.
- Rename _create_legacy_label() to add_legacy_alias() and make it
global. It doesn't use 'self'.
- Break the logic for finding the flash controller into a separate
helper function
- Add doc-comments for the new functions
- Misc. other small clean-ups
generated_dts_board.conf and generated_dts_board_unfixed.h were verified
to be identical for disco_l475_iot1 and frdm_kw41z before and after the
cleanup.
Signed-off-by: Ulf Magnusson <Ulf.Magnusson@nordicsemi.no>
Found a few annoying typos and figured I better run script and
fix anything it can find, here are the results...
Signed-off-by: Anas Nashif <anas.nashif@intel.com>
Clean up the code a bit:
- Simplify the loops over the flash 'reg' properties by using range()
- Build identifier names with a plain .format() where possible. This
makes them stand out better in the code.
- Remove redundant variables
- Move variables close to where they're used
- Misc. other minor improvements
generated_dts_board.conf and generated_dts_board_unfixed.h were verified
to be identical for disco_l475_iot1 and frdm_kw41z before and after the
cleanup.
Signed-off-by: Ulf Magnusson <Ulf.Magnusson@nordicsemi.no>
DT_ALIAS_<ALIAS>_<PROP> defines are a convenient and portable way to get
the device instance name despite different naming conventions used by
the device drivers.
Signed-off-by: Piotr Mienkowski <piotr.mienkowski@gmail.com>
Its possible that the <INSTANCE> number could conflict with the register
number. This is shown to happen for a device like soc-nv-flash at
address 0.
So change naming convention to DT_INST_<INSTANCE>_<COMPAT>_<PROP> and
make DT_<COMPAT>_<INSTANCE>_<PROP> as deprecated.
Signed-off-by: Kumar Gala <kumar.gala@linaro.org>
Because of how generate defines for instances its possible that we have
a name conflict if the instance ID and reg addr space clash.
For example on qemu_x86 there are current two 'soc-nv-flash' nodes and
one is at reg addr 0, but instance id 1, the other is reg addr 0x1000
and instance id 0. We'd possibly get this conflict:
For the 'soc-nv-flash' at 0x1000 (instance 0):
(instance define)
#define DT_SOC_NV_FLASH_0_BASE_ADDRESS 0x1000
For the 'soc-nv-flash' at 0x0 (instance 1):
(address define)
#define DT_SOC_NV_FLASH_0_BASE_ADDRESS 0x0
To deal with this we make sure that the lower reg address is instance 0,
than things work out ok. To handle this case, if we sort the instance
IDs based on reg addr than if we have something at reg addr 0, it will
also than be an instand ID 0.
The longer term solution will be to deprecated the old defines and
remove the conflict between instance ID defines and normal DT defines.
Signed-off-by: Kumar Gala <kumar.gala@linaro.org>
We added generation of aliases for "alt-label" (which was the outer
label of a node) for use with shields and connectors. However we've
never used these defines and the generation is a bit inconsistent.
This removes generation of defines like for label 'arduino_spi':
#define ARDUINO_SPI_BASE_ADDRESS ... (already deprecated)
#define DT_ST_STM32_SPI_FIFO_ARDUINO_SPI_BASE_ADDRESS ...
Signed-off-by: Kumar Gala <kumar.gala@linaro.org>
If we have something like:
#address-cells = <1>;
#size-cells = <0>;
intc: ioapic@fec00000 {
compatible = "intel,ioapic";
reg = <0xfec00000 0x100000>;
};
We should generate:
DT_INTEL_IOAPIC_FEC00000_BASE_ADDRESS_0
DT_INTEL_IOAPIC_FEC00000_BASE_ADDRESS_1
Instead we generated:
DT_INTEL_IOAPIC_FEC00000_BASE_ADDRESS
DT_INTEL_IOAPIC_FEC00000_BASE_ADDRESS_1
This was due to logic deciding if '_0' should be used not taking into
account #address-cells & #size-cells correctly.
Fixes: #16296
Signed-off-by: Kumar Gala <kumar.gala@linaro.org>
We generated some alias defines for children of a bus in which we had a
path alias for the bus node. We never used these defines, we don't
recommend they get used (child of busses should use instance defines)
and they were only generated in small handful of cases (for dts that had
path aliases to the bus node - i2c or spi).
Remove this as effectively dead code.
Signed-off-by: Kumar Gala <kumar.gala@linaro.org>
Add specific enum generation support related to usb 'maximum-speed'
property. This will generate a define with _ENUM with the integer
value of the enum as its ordered in the YAML. The assumption right
now is that there's a matching enum in the code.
Signed-off-by: Kumar Gala <kumar.gala@linaro.org>
Allow a device tree node to be child on one bus and parent on another
bus (e.g. an I2C slave device with multiple sub-devices).
Signed-off-by: Henrik Brix Andersen <henrik@brixandersen.dk>
gpio-map is a property of "nexus node", defined in dts v0.3.
It allows to describe a pin connector so it can be referenced
through phandles and hence used in expansion device nodes like a
shield header (typically implemented through overlays).
This change implements gpio controller resolution through these maps.
Few assumptions were taken in order to simplify the implementation.
These assumptions bring some limitations to the use of gpio-map
but my understanding is that this should still allow to cover most
use cases.
Assumptions:
-gpio-size is the same for all gpio-controllers referenced in a map
-optional properties gpio-map-mask and gpio-map-pass-thru are
supposed to be omitted
The understanding of this last assumption is that flags provided in
the expansion device node will overwrite the connector flags.
In a latter stage, when need happen, these limitations can be
revisited to unlock fully fledged gpio-map usage.
Fixes#15637
Signed-off-by: Erwan Gouriou <erwan.gouriou@linaro.org>
The /memreserve/ code would crash if it ever ran, because 'name' isn't
defined (seems to be some copy-paste here). There are no /memreserve/s
in Zephyr though, so it works out.
'name' seems to be the node name. Not sure what to put for a
/memreserve/, but make it '<memreserve>' to make it stand out.
Fixes a pylint warning.
Signed-off-by: Ulf Magnusson <Ulf.Magnusson@nordicsemi.no>
Discovered with pylint3.
Use the placeholder name '_' for unproblematic unused variables. It's
what I'm used to, and pylint knows not to flag it.
Also improve the naming a bit in devicetree.py. If a key/value is known
to be a specific thing (like a node), then it's helpful to call it that
instead of something generic like "value".
Signed-off-by: Ulf Magnusson <Ulf.Magnusson@nordicsemi.no>
- Remove DTFlash.extract(), which was just dispatching to either
_extract_flash() or _extract_code_partition() depending on which
magic string was passed in. Call them directly instead.
- Fold constant and globally available parameter values into functions
- Remove DTFlash._flash_node. It's easy to derive wherever it's needed,
and it makes it clearer where it comes from (and means functions can
be called in any order).
- Remove DTFlash._flash_base_address, which is unused
- Remove various unused parameters to functions
Signed-off-by: Ulf Magnusson <Ulf.Magnusson@nordicsemi.no>
def_label is the name used for macros and .conf file values. It can
never have a slash in it.
Signed-off-by: Ulf Magnusson <Ulf.Magnusson@nordicsemi.no>
- Fix broken code that was meant to turn the
'interrupts'/'interrupts-extended' value into a list if it wasn't.
list(123) will error out instead of creating [123].
- Remove weird .split('/') on macro name
- Rename 'props' to 'vals'. It's the value of a single property.
- Get rid of a bare 'except:'
- Rename l_fqn to full_name. Accidentally stumbled upon 'fqn' probably
standing for "fully qualified name", but it's not obvious.
Signed-off-by: Ulf Magnusson <Ulf.Magnusson@nordicsemi.no>
- Have get_parent_path() return None for the root ('/'). This is handy
when looping over path components.
- Move _find_parent_irq_node() out of the class, call it
parent_irq_node(), and use get_parent_path() in it.
- Add a global err() function for reporting errors. Use it if a node
unexpectedly has no interrupt-parent.
Previously, this would give a Python error instead.
Signed-off-by: Ulf Magnusson <Ulf.Magnusson@nordicsemi.no>
PyYAML 5.1 was just released and it doesn't support !include as
previous versions do. This breaks our DTS bindings parsing.
Let's fix our extract_dts_include.py script to work with both
3.13 and 5.1.
Also, update the pyyaml requirement to >=3.13 to be sure we're
compatible.
Fixes: https://github.com/zephyrproject-rtos/zephyr/issues/14496
Signed-off-by: Michael Scott <mike@foundries.io>
To reproduce the issue this addresses, run "cmake -B96b_nitrogen"
twice with Python 3.5. Observe the order of the flash partition table
changing in:
"build{1,2}/zephyr/include/generated/generated_dts_board.conf" and
"generated_dts_board_unfixed.h"
Dictionaries are iterated in a random order by Python 3.5 and before.
This could have caused "Unstable" CI in PR #13921 and maybe others.
Anyway we want builds to be determimistic by default. Explicit
randomness can be added for better coverage but not by default.
Signed-off-by: Marc Herbert <marc.herbert@intel.com>
insert_defs() is the only function that adds keys to 'defs', and they
always get added with an 'aliases' key.
This function could get super simple if the duplicate-removal code could
be removed. It only seems to be needed to prevent duplicates for some
(unfortunately tricky) flash-related stuff now.
Signed-off-by: Ulf Magnusson <Ulf.Magnusson@nordicsemi.no>
- No deep copying is needed. The deepcopy() is just a hack to work
around that the value might not be a list. That deserves a comment at
least.
- A catch-all try/except will hide stuff like misspelled variables as
well. It's usually a bad idea.
Rewrite things to be more explicit, and add some comments.
reg.py was indirectly using the deepcopy() imported in global.py,
because it does 'from global import *'. Have it import deepcopy() itself
instead. reg.py is the only remaining user of deepcopy().
reg.py relying on the deepcopy() import in global.py was super hard to
discover, due to another catch-all try/except around the deepcopy()
call.
Signed-off-by: Ulf Magnusson <Ulf.Magnusson@nordicsemi.no>
All nodes have a 'children' key.
Also simplify a bit. The loop is copying a dictionary verbatim.
Signed-off-by: Ulf Magnusson <Ulf.Magnusson@nordicsemi.no>
'/foo' was turned into ''. Turn it into '/' instead. That's how the root
is represented in 'reduced' too.
Also remove some code from get_addr_size_cells() that was only there to
work around the bug.
Signed-off-by: Ulf Magnusson <Ulf.Magnusson@nordicsemi.no>
If a binding specifies 'generate: define' for 'interrupt-names' (like
some bindings do), then that ought to generate #defines for it, but the
scripts/dts code currently hardcodes 'interrupt-names' to be ignored
(along with some other properties).
Maybe the 'generate: define' in those bindings is a mistake, but the
code still ought to respect it. That also gets rid of some mystery code.
Signed-off-by: Ulf Magnusson <Ulf.Magnusson@nordicsemi.no>
Add some short doc comments at the beginning so that people can quickly
get an idea of what they're about.
Signed-off-by: Ulf Magnusson <Ulf.Magnusson@nordicsemi.no>
It's confusing that "address" is often used within the same function to
refer to both node paths and e.g. address cells.
Make things easier to understand by calling /foo/bar a path instead.
Signed-off-by: Ulf Magnusson <Ulf.Magnusson@nordicsemi.no>
extract_property() is meant to generate #defines for a single property,
like 'foo = <1 2 3>'. Currently, it also generates node-level #defines
related to parent buses.
That makes the intent of the code hard to understand, and also means
that identical node-level #defines get redundantly added multiple times
(once per property).
Generate the node-level bus #defines before processing properties, in
generate_node_defines(). Use a new generate_bus_defines() helper.
Signed-off-by: Ulf Magnusson <Ulf.Magnusson@nordicsemi.no>
Due to the way the code was structured,
flash.extract_partition(node_path) was called multiple times for the
same 'node_path'.
That must've been a mistake to begin with (but was hard to spot before
the code was cleaned up). Move the generation of per-node #defines out
of the property loop.
Signed-off-by: Ulf Magnusson <Ulf.Magnusson@nordicsemi.no>
generate_node_defines() immediately returns if the node's 'compatible'
is not in the binding.
Signed-off-by: Ulf Magnusson <Ulf.Magnusson@nordicsemi.no>
Derive 'node_compat' and 'prop_val' (the dictionary for the property
from the YAML binding) inside extract_property().
That gives it just two parameters and makes it clearer that it's just
generating #define's for a single device tree property. 'prop_val' was
only used to look up prop_val['type'].
Signed-off-by: Ulf Magnusson <Ulf.Magnusson@nordicsemi.no>
Moves it closer to where it's used, and will allow other simplifications
in generate_node_defines().
Signed-off-by: Ulf Magnusson <Ulf.Magnusson@nordicsemi.no>
After lots of reverse-engineering, I understand why deepcopy() is used:
1) Various functions defined in scripts/dts/extract/* modify the list
of names in-place
2) A plain list.copy() won't work when the *-names property happens to
have a single name in it, because devicetree.py gives a string
instead of a list in that case
Using deepcopy() to solve (2) is very confusing (especially with no
comments), because no deep copying is actually needed.
Get rid of deepcopy(), add a helper function for fetching the names, and
some comments.
Signed-off-by: Ulf Magnusson <Ulf.Magnusson@nordicsemi.no>
- Remove dead "if 'props' in nodes" check
- Rename the 'nodes' parameter to 'node'. It represents a single node.
- Use a defaultdict(int) for 'last_used_id' (makes unset keys give 0)
- Use a global for 'last_used_id'
- Move some related code so it appears together
Signed-off-by: Ulf Magnusson <Ulf.Magnusson@nordicsemi.no>
Turn
if a:
if b:
...
into
if a and b:
...
Simplify some error messages with .format() as well, and get rid of some
redundant str()s. '{0} {1} {1}'.format('foo', 'bar') gives
'foo bar bar'.
Signed-off-by: Ulf Magnusson <Ulf.Magnusson@nordicsemi.no>
- Reduce the indentation and remove the awkward line breaks. This is
possible now that there's no recursion.
- Be consistent with quotes
- Move some initialization closer to where it's used
Signed-off-by: Ulf Magnusson <Ulf.Magnusson@nordicsemi.no>
The recursion was used to implement 'properties:' within 'properties:'
in binding files, which seems to be a dead leftover (and undocumented).
Removing it gets rid of code and makes things more transparent.
Signed-off-by: Ulf Magnusson <Ulf.Magnusson@nordicsemi.no>
Use more descriptive naming, get rid of unused 'v' variable, and an
unnecessary None check (None won't appear in get_binding_compats()).
Signed-off-by: Ulf Magnusson <Ulf.Magnusson@nordicsemi.no>
...to generate_node_defines().
More explicit. "extract node include info" can be read in many ways:
- Extract a node's "include info"
- Extract node and include info
- etc.
Signed-off-by: Ulf Magnusson <Ulf.Magnusson@nordicsemi.no>
That way it consistently generates all #define's.
Add some related clarifying comments to main() too.
Signed-off-by: Ulf Magnusson <Ulf.Magnusson@nordicsemi.no>
It's special-cased for merging bindings and not a general dictionary
merging function.
Also simplify the documentation a bit.
Signed-off-by: Ulf Magnusson <Ulf.Magnusson@nordicsemi.no>
The Bindings class was only used to implement '!include foo.yaml'
(easier to see after some things were moved out of it). Use plain
functions instead, which might be a bit more transparent and gives
simpler code.
Also remove the recursive '!include' detection for now, which is broken
in that the same .yaml being included twice will always trigger it, even
for non-circular cases.
Signed-off-by: Ulf Magnusson <Ulf.Magnusson@nordicsemi.no>
As written, this function could take e.g. '!include bar', find 'foo-bar'
(due to the endswith()), and include it. This is undocumented and
doesn't seem to be used, so I'm guessing that it isn't intentional.
Removing that bug/feature also makes the code much simpler.
Signed-off-by: Ulf Magnusson <Ulf.Magnusson@nordicsemi.no>
load_bindings() is trivial, and it allows some stuff to simplified, like
the check for no bindings being found, and the assignments to the
extract.globals.{bindings,bus_bindings,bindings_compat}.
Signed-off-by: Ulf Magnusson <Ulf.Magnusson@nordicsemi.no>
This is (probably) a temporary change just to be able to move some stuff
out of the Bindings class.
Signed-off-by: Ulf Magnusson <Ulf.Magnusson@nordicsemi.no>
Only write out to the .conf file if the define starts with "DT_". The
the conf file should only be used by sanitycheck, west, and
kconfigfunctions at this time. In the future we should remove it, so
lets limit what's it exposing at this time.
Signed-off-by: Kumar Gala <kumar.gala@linaro.org>
DT_FLASH_AREA_<X>_DEV should be the label of the flash controller. For
flashes that are "jedec,spi-nor" the flash itself is considered the
controller. For "soc-nv-flash" the parent of the flash is assumed to be
the controller.
Rework the logic in how we determined DT_FLASH_AREA_<X>_DEV to handle
both cases.
Signed-off-by: Kumar Gala <kumar.gala@linaro.org>
Removes some logic from merge_included_bindings() and makes it easier to
follow.
Also remove an outdated comment ('id' no longer exists) and some
comments that might not be helpful.
Signed-off-by: Ulf Magnusson <Ulf.Magnusson@nordicsemi.no>
The yaml_list dictionary is three regular variables in disguise, as keys
are never added. Use regular variables instead, which is less confusing.
Hopefully the naming makes sense.
Signed-off-by: Ulf Magnusson <Ulf.Magnusson@nordicsemi.no>
The consistency checks at the beginning of the function were not done
for "leaf" .yaml files.
Signed-off-by: Ulf Magnusson <Ulf.Magnusson@nordicsemi.no>
...to merge_included_bindings().
This gives a better hint to what it does (merges properties from
!include'd files).
Signed-off-by: Ulf Magnusson <Ulf.Magnusson@nordicsemi.no>
Remove the '!include {foo: bar}' support from Bindings._include(). Only
'!include foo.yaml' and '!include [foo.yaml, bar.yaml]' are documented,
and yaml_traverse_inherited() doesn't implement the dict case either.
Signed-off-by: Ulf Magnusson <Ulf.Magnusson@nordicsemi.no>
Mark any define that doesn't start with DT_, LED, SW, or have PWM_LED in
the name as deprecated via __DEPRECATED_MACRO.
Signed-off-by: Kumar Gala <kumar.gala@linaro.org>
Some more work will be done here later (yaml_list could be replaced by a
few plain variables, for example), but this is a start:
- Extract the compat string from the 'compatible:' line directly in the
regex, instead of separately
- Flatten the code, turning
if a:
...
if b:
...
if c:
...
into
if not a:
continue
...
if not b:
continue
...
if not c:
continue
...
- Add some comments
- Use clearer naming
Signed-off-by: Ulf Magnusson <Ulf.Magnusson@nordicsemi.no>
Previously, all_compats() returned a dictionary mapping nodes to their
'compatible' values. This dictionary was then (only) used to generate a
set() of all 'compatible' strings.
Save a step and get rid of some code by having all_compats() return a
set() with all 'compatible' strings directly.
Signed-off-by: Ulf Magnusson <Ulf.Magnusson@nordicsemi.no>
- Rename to all_compats(). The "compats" part is consistent with
elsewhere.
- Don't require an empty dictionary to be passed in. Build the
result within the function instead.
- Use more specific names (k, v -> child_name, child_node)
Signed-off-by: Ulf Magnusson <Ulf.Magnusson@nordicsemi.no>
It creates the global 'phandles' dictionary. get_*() makes it sound like
it returns a value.
Signed-off-by: Ulf Magnusson <Ulf.Magnusson@nordicsemi.no>
It creates the global 'reduced' dictionary. get_*() makes it sound like
it returns a value.
Fix a comment that might make people think the global dictionaries are
Python lists too.
Signed-off-by: Ulf Magnusson <Ulf.Magnusson@nordicsemi.no>
Check if the node is missing from 'defs' first, and insert it if not.
That way, later code can assume it exists.
Signed-off-by: Ulf Magnusson <Ulf.Magnusson@nordicsemi.no>
Its possible that a reg property is address only. If that's the case we
should produce any alias information for the size. We should check
nr_size_cells to decide to handle the alias case or not.
Signed-off-by: Kumar Gala <kumar.gala@linaro.org>
If we have an alias pointing to another alias we would get None in the
resulting conf file. However that alias might exist, so try looking it
up again in the aliases db.
Signed-off-by: Kumar Gala <kumar.gala@linaro.org>
We generate the following FLASH prefixed defines:
FLASH_AREA_MCUBOOT_LABEL
FLASH_AREA_MCUBOOT_OFFSET
FLASH_AREA_MCUBOOT_OFFSET_0
FLASH_AREA_MCUBOOT_READ_ONLY
FLASH_AREA_MCUBOOT_SIZE
FLASH_AREA_MCUBOOT_SIZE_0
Now we generate DT_ prefixed versions:
DT_FLASH_AREA_MCUBOOT_LABEL
DT_FLASH_AREA_MCUBOOT_OFFSET
DT_FLASH_AREA_MCUBOOT_OFFSET_0
DT_FLASH_AREA_MCUBOOT_READ_ONLY
DT_FLASH_AREA_MCUBOOT_SIZE
DT_FLASH_AREA_MCUBOOT_SIZE_0
And will deprecate the non DT_ prefixed versions in the future. We keep
them around as aliases for the time being.
Signed-off-by: Kumar Gala <kumar.gala@linaro.org>
We generate the following FLASH prefixed defines:
FLASH_LABEL
FLASH_ERASE_BLOCK_SIZE
FLASH_WRITE_BLOCK_SIZE
Now we generate DT_ prefixed versions:
DT_FLASH_LABEL
DT_FLASH_ERASE_BLOCK_SIZE
DT_FLASH_WRITE_BLOCK_SIZE
And will deprecate the non DT_ prefixed versions in the future. We keep
them around as aliases for the time being.
Signed-off-by: Kumar Gala <kumar.gala@linaro.org>
We've removed all references to base_label in dts bindings and are
removing the functionality. We should depend on DT_ prefixed defines
going forward.
Signed-off-by: Kumar Gala <kumar.gala@linaro.org>
Replace generating CONFIG_ symbols with DT_ symbols for chosen
properties like 'zephyr,console' or 'zephyr,bt-mon-uart'. We now use a
kconfigfunctions (dt_str_val) to extract the info from dts into Kconfig.
Signed-off-by: Kumar Gala <kumar.gala@linaro.org>
Since we know do DTS before Kconfig we should try and remove dts from
creating Kconfig namespaced symbols and leave that to Kconfig. So
rename CONFIG_CCM_<FOO> to DT_CCM_<FOO>.
Signed-off-by: Kumar Gala <kumar.gala@linaro.org>
As in "#define string". More explicit.
Rename the parameters to name/value instead of k/v too.
Signed-off-by: Ulf Magnusson <Ulf.Magnusson@nordicsemi.no>
That the 'aliases' key isn't a regular property makes things a bit
confusing. Write the aliases separately, which should be a bit clearer.
That also makes it clear that the order doesn't matter.
The 'aliases' key always exists in defs[node], so use [] instead of
.get(). Also write "'aliases'" instead of "prop" when the value is
known.
Signed-off-by: Ulf Magnusson <Ulf.Magnusson@nordicsemi.no>
Probably easier to understand.
Also rename 'fd' to 'f'. "File descriptor" might make it sound like an
integer.
Signed-off-by: Ulf Magnusson <Ulf.Magnusson@nordicsemi.no>
That the 'aliases' key isn't a regular property makes things a bit
confusing. Write the aliases separately, which should be a bit clearer.
That also makes it clear that the order doesn't matter.
Also write "'aliases'" instead of "prop" when the value is known.
The .get() seems to be needed to work around a bug, and sometimes you
get DT_...=None in the output. Might look into that later.
extract_string_prop() could generate 'defs' entries without 'aliases'
keys. Make it add an empty 'aliases' dict instead, to remove existence
checks elsewhere.
Signed-off-by: Ulf Magnusson <Ulf.Magnusson@nordicsemi.no>
Returns the empty string for '/foo' and '/', but the old version did
that too, so maybe it's intended.
Signed-off-by: Ulf Magnusson <Ulf.Magnusson@nordicsemi.no>
Inline load_and_parse_dts() and generate_{keyvalue,include}_file().
Also specify UTF-8 for writing files, and fix some mis-indentation.
Signed-off-by: Ulf Magnusson <Ulf.Magnusson@nordicsemi.no>
Flags take a single argument by default, and removing nargs=1 avoids
getting it as a single-element list.
Signed-off-by: Ulf Magnusson <Ulf.Magnusson@nordicsemi.no>
Get rid of the parent_label variable.
Also avoid using "label" in two different senses (DT label and name of
define macro) within the same comment.
Signed-off-by: Ulf Magnusson <Ulf.Magnusson@nordicsemi.no>
This Patch add functionality for automatic generation of the flash map
using DTS description. Automatic generation allows to replace
C-hardcoded flash_map.
We generate a set of defines based on the index of a partiion:
#define DT_FLASH_AREA_<IDX>_OFFSET 0
#define DT_FLASH_AREA_<IDX>_SIZE 131072
#define DT_FLASH_AREA_<IDX>_DEV "FLASH_CTRL"
#define DT_FLASH_AREA_<IDX>_LABEL MCUBOOT
Additionally we also define:
#define DT_FLASH_AREA_NUM 4
and:
#define DT_FLASH_AREA_<PARTNAME>_ID 0
Signed-off-by: Findlay Feng <i@fengch.me>
Signed-off-by: Kumar Gala <kumar.gala@linaro.org>
Less spammy and as easy to understand ("label" seems a bit confusing
though, but it's consistent with other code).
Also simplify some surrounding code, and clean up the implementation of
str_to_label() a bit.
Signed-off-by: Ulf Magnusson <Ulf.Magnusson@nordicsemi.no>
Pass the dictionary of definitions directly. Shorter and clearer.
Also get rid of some other temporary variables, a redundant str() call,
and some mysterious commented-out code in _extract_flash().
Signed-off-by: Ulf Magnusson <Ulf.Magnusson@nordicsemi.no>
- Maybe the code is trying to turn integers into single-element list,
but it won't work (needs to be [value] rather than list(value)).
Don't think you could ever end up with an integer either.
- extract_controller() assumes that prop_values is a list, so
reduced[...].get(prop) should be reduced[...][prop]. get() means it's
okay for the key to be missing, which makes the code confusing.
Signed-off-by: Ulf Magnusson <Ulf.Magnusson@nordicsemi.no>
- The 'props' key is known to exist (and 'if enabled == ...:' would
crash if it ever was missing)
- 'd' is always a dictionary
- There's no need to test if d['children'] is non-empty before looping
through it
Signed-off-by: Ulf Magnusson <Ulf.Magnusson@nordicsemi.no>
- The 'props' key is known to exist (and 'if enabled == ...:' would
crash if it ever was missing)
- 'd' is always a dictionary
- There's no need to test if d['children'] is non-empty before looping
through it
Signed-off-by: Ulf Magnusson <Ulf.Magnusson@nordicsemi.no>
dict.get(key) signals to people reading the code that you're not sure
whether the key exists. It returns None if it doesn't.
When the key is known to exist, dict[key] should be used. This also
helps catch bugs by raising an exception if the key is missing.
Similarly, whether a key in a dict should be tested with
if key in dict:
instead of with
if dict.get(key):
The second version signals that you both want to make sure that the
exists and that it's truthy (e.g., non-empty). That's confusing if a
simple existence check was meant.
There seems to be a bug in output_keyvalue_lines() where
fd.write("%s=%s\n" % (entry, defs[node].get(a)))
can end up writing '...=None'. Removing the .get() makes it throw an
exception instead. Keep the .get() for now and don't attempt to fix the
bug.
Signed-off-by: Ulf Magnusson <Ulf.Magnusson@nordicsemi.no>
dts will now generate DT_SRAM_BASE_ADDRESS, DT_SRAM_SIZE,
DT_FLASH_BASE_ADDRESS, and DT_FLASH_SIZE defines. Kconfig can utilize
these defines to set defaults for the CONFIG_ variants.
Signed-off-by: Kumar Gala <kumar.gala@linaro.org>
As a step to completing removing use of Kconfig defines in dts files we
need to change how we configure/set CONFIG_FLASH_LOAD_{OFFSET,SIZE}.
Previously we would set them based on how the chosen property
'zephyr,code-partition' was set to. If 'zephyr,code-partition' wasn't
set we would default the values to 0. We had some generic overlay logic
which would define 'zephyr,code-partition' based on
CONFIG_BOOTLOADER_MCUBOOT.
Going forward if the DTS has 'zephyr,code-partition' set we will
generate DT_CODE_PARTITION_OFFSET & DT_CODE_PARTITION_SIZE defines. We
will leave it to Kconfig to set CONFIG_FLASH_LOAD_OFFSET &
CONFIG_FLASH_LOAD_SIZE.
We introduce a python script that allows Kconfig to extract data from
the DTS and thus we can utilize DT_CODE_PARTITION_OFFSET and
DT_CODE_PARTITION_SIZE values to set defaults for
CONFIG_FLASH_LOAD_OFFSET & CONFIG_FLASH_LOAD_SIZE.
Signed-off-by: Kumar Gala <kumar.gala@linaro.org>
Signed-off-by: Carles Cufi <carles.cufi@nordicsemi.no>
Rework extract_{controller,cells} so they aren't recursive. As part of
this change we take the flat cell array property and build a proper list
based on what the number of cells each element would represent.
Fixes#12724
Signed-off-by: Kumar Gala <kumar.gala@linaro.org>
Because of differents in dtc versions the output of a list property may
vary. We would flatten the list of lists to a single list to match how
older dtc versions did things. Rather than doing that flattening in
multiple places, move it to get_reduced() so we do it just once.
Signed-off-by: Kumar Gala <kumar.gala@linaro.org>
The header comment in 'generated_dts_board_unfixed.h' was including
'compatible' as a helpful text.
But something has been broken with how we extract 'compatible' because
it was being evaluated to 'q'. Giving a confusing header text:
Generated include file q
Since the mechanism is broken, and does not appear to be important, we
remove it.
Also, modernize how we generate multi-line strings.
Signed-off-by: Sebastian Bøe <sebastian.boe@nordicsemi.no>
extract_dts_includes.py has been generating DT output and then
concatenating it with fixup header files to create
'generated_dts_board.h'.
In this patch we instead introduce a source file named
'generated_dts_board.h' and have it \#include the appropriate DT
output and fixup files.
This results in a simpler system because users can now read
'generated_dts_board.h' as C source code to see how fixup files and
generated DT output relate to each other. Whereas before they would
have to either read documentation or python code to gain the same
understanding.
Also, it reduces the scope and complexity of one of our most bloated
python scripts, extract_dts_includes.py.
Signed-off-by: Sebastian Bøe <sebastian.boe@nordicsemi.no>
Add support to generation script to generate defines for GPIO CS
[WIP], need to clarify some issues on how CS's look when we mix GPIO-CS
and HW CS.
Signed-off-by: Kumar Gala <kumar.gala@linaro.org>
Add the ability to extract just a single instance from extract_cells and
extract_controller. This lets us pass in a prop_values like:
cs-gpios = < 0x02 0x11 0x00 >, < 0x03 0x05 0x00 >;
and extract just index = 1 if we want < 0x03 0x05 0x00 >.
Signed-off-by: Kumar Gala <kumar.gala@linaro.org>
Move extract_cells and extract_controller functions into globals so they
can be utilized outside of just the main extract_dts_includes script.
Signed-off-by: Kumar Gala <kumar.gala@linaro.org>
We get warnings like:
foo.yaml('BAH') merge of property 'category': 'required'
overwrites 'optional'
This warning isn't meaningful as its reasonable to change the 'category'
of a property from 'optional' to 'required'. So don't warn in the case
anymore.
Signed-off-by: Kumar Gala <kumar.gala@linaro.org>
The Intel S1000 board has a SPI flash that isn't directly MMIO
addressable. For this case we shouldn't generate CONFIG_FLASH_SIZE or
CONFIG_FLASH_BASE_ADDRESS.
We use the heuristic of assuming if the flash node #size-cells is 0, its
a SPI flash. Than if the parent node (SPI controller) has only a single
reg element we assume its a non-MMIO addressable SPI flash. If there is
more than one reg element we assume the last reg element is the MMIO
address region for access to the flash.
Fixes#12530
Signed-off-by: Kumar Gala <kumar.gala@linaro.org>
Changed arg parsing so you can invoke the script and only generate the
include file or conf file as desired.
Signed-off-by: Kumar Gala <kumar.gala@linaro.org>
Add support to generate defines of the form
DT_<COMPAT>_<INSTANCE>_<PROP>. The idea is that we can utilize this in
drivers to remove the need for dts_fixup.h. The <INSTANCE> value is
determined by the script and starts at 0 and counts up for each instance
of a given <COMPAT>.
Signed-off-by: Kumar Gala <kumar.gala@linaro.org>
If an aliases already exists in the defs we should filter it out. Also
if an alias exists in the new_def we should filter the alias out.
Signed-off-by: Kumar Gala <kumar.gala@linaro.org>
The information message when processing the yaml files is
cryptic when there is an override. This change adds filenmae
of yaml file being processed and the parent tuple with
the override.
Signed-off-by: David Leach <david.leach@nxp.com>
We need to refactor how we determine CONFIG_FLASH_{SIZE,BASE_ADDRESS}
for when we have a QSPI that is memory mapped. "zephyr,flash" is going
to point the actual flash component that will be on a SPI bus and thus
the device node's reg property tells us which CS on the SPI bus its on,
not the memory mapped address/size of the flash.
So we make a few assumptions to handle this case:
1. If the #size-cells for the flash node is 0, we assume its a QSPI
memory mapped flash
2. That the QSPI memory mapped node (parent of what "zephyr,flash" is
point to, will contain a reg propery where the second reg pair will
be the memory mapped region for the flash.
We move handling of CONFIG_FLASH_{SIZE,BASE_ADDRESS} into flash.extract
so its all in one place.
Signed-off-by: Kumar Gala <kumar.gala@linaro.org>
The original version of get_binding didn't handle the case of having a
child node on a SPI or I2C device node. The example is a SPI flash and
having a partition node under that.
Re-work the binding lookup logic to first look in the master bindings
dict, and if not found there we assume it must be in the bus specific
dictionary, and we can use the parent node to find the bus type.
Signed-off-by: Kumar Gala <kumar.gala@linaro.org>
There are cases in which we get the parents compat and thus we might
have a binding available for the actual node. An example is having a
SPI or I2C controller with a child node, but that node doesn't have a
binding associated with it. We'll end up getting the parent compat, so
return the parent binding in this case.
Signed-off-by: Kumar Gala <kumar.gala@linaro.org>
For devices on buses like I2C or SPI its possible that a sensor might
support being on either bus type. In the dts we can tell this by
looking at the parent bus of the device. Its useful for a driver to
know this so can we build support into the driver accordingly.
For example if the LSM6DSL sensor ("st,lsm6dsl") is in the dts on a spi
bus we now generate:
#define DT_ST_LPS22HB_PRESS_BUS_SPI 1
Its possible that a system exists in which multiple of the same sensor
exist but on different busses, so drivers should handle that case
accordingly. For the LSM6DSL example we'd end up with:
#define DT_ST_LPS22HB_PRESS_BUS_I2C 1
#define DT_ST_LPS22HB_PRESS_BUS_SPI 1
Signed-off-by: Kumar Gala <kumar.gala@linaro.org>
There are a number of cases in which we a sensor can be either connected
on I2C or SPI. We've been treating these cases as different compatiable
properties, but they really should use the same compatiable and just
determine the info based on the parent bus in the device tree. We can
now support having two different binding files for the same compatiable
to handle the case of a sensor supporting either I2C or SPI as how its
connected.
We put "sensor" nodes in a bus specific dict bus_bindings[bus] that
we can than lookup later based on the DTS and determining the bus type
that the "sensor" node is on.
Fixes#11375
Signed-off-by: Kumar Gala <kumar.gala@linaro.org>
Have the yaml_list now have 'node', 'bus', and 'compat' information
instead of just the 'node' info. For now we have all YAML nodes under
yaml_list['node'], however this will change to support sensors that
can be on I2C or SPI, since they will have the same compat, but
different YAML nodes.
This also introduces yaml_list['bus'] which has YAML nodes for any
compatiables on a given 'parent' bus (ie, 'i2c', or 'spi').
Finally, we also have yaml_list['compat'] with all the compatiables
that we parsed and matched to a YAML.
Signed-off-by: Kumar Gala <kumar.gala@linaro.org>
Change get_binding to take the node address instead of the
compatiable. This is in prep for having get_binding be able to look
at the parent of the node and determine which bus specific binding to
utilize (for cases like sensors that support both I2C & SPI).
Signed-off-by: Kumar Gala <kumar.gala@linaro.org>
Add accessor functions get_binding and get_binding_compats to
encapsulate access to binding database info. Cleanup all direct access
to binding info and replace with calls to get_binding() and
get_binding_compats()
Signed-off-by: Kumar Gala <kumar.gala@linaro.org>
Various functions like add_prop_aliases, extract_single_prop,
extract_single, reg.extract, compatible.extract, default.extract, and
flash.extract don't use the yaml argument that is passed to them.
Remove passing the argument, this is the first step in making access to
the yaml node information go through an accessor function.
Signed-off-by: Kumar Gala <kumar.gala@linaro.org>
Move the handling of 'inherits' in the YAML to right when we load. This
allows us to remove yaml_collapse function and will allow us to look
into the yaml right after we load it for things like if the yaml is for
a child bus.
Signed-off-by: Kumar Gala <kumar.gala@linaro.org>
Removed Console dependencies from shell uart backend.
Generated define: CONFIG_UART_SHELL_ON_DEV_NAME for each board.
Fixes#10191
Signed-off-by: Jakub Rzeszutko <jakub.rzeszutko@nordicsemi.no>
With python3.7 we get the following warning:
extract_dts_includes.py:496: DeprecationWarning: Using or
importing the ABCs from 'collections' instead of from
'collections.abc' is deprecated, and in 3.8 it will stop
working.
Fix this by using 'from collections.abc import Mapping' instead of
'import collections'.
Signed-off-by: Kumar Gala <kumar.gala@linaro.org>
Default for a unavailable cell name was an empty list, whereas a
given name is a string. Leads to a runtime error if the name is given.
Make the default an empty string.
Names for cells are taken from the yaml binding. The key used is
"#cells" which clashes if there are different cell based properties
for a device. Readout names from the more specific "#xxx-cells" if
given and fall back to "#cells" if not given.
Signed-off-by: Bobby Noelte <b0661n0e17e@gmail.com>
Almost all labels generated by the extracting script are now prefixed
with DT_. The only exceptions are:
- stuff with 'base_label' specified in yaml bindings
- items specified by 'regs_config' and 'name_config' dictionaries
in globals.py module
- FLASH related labels generated by flash.extract() called separately
from generate_node_definitions(), e.g. FLASH_WRITE_BLOCK_SIZE -
these are used directly, not through fixups, from existing code
so I didn't want to touch them now
Labels generated for aliases are additionally prefixed with information
from the 'compatible' property, e.g. DT_GPIO_LEDS_LED0_* is generated
instead of LED0_*. To provide backward compatibility for code that uses
LEDx_* and SWx_* labels in their previous forms, a command line option
named 'old-alias-names' is added to the extraction script. This option
causes that the labels for aliases are generated in both old and new
forms. Currently this option is always enabled in dts.cmake.
Signed-off-by: Andrzej Głąbek <andrzej.glabek@nordicsemi.no>
Case when bus parent has more than one compatible was not treated
correctly. Use get_compat() method which returns first compat
in case several compats are available
Fixes#11121
Signed-off-by: Erwan Gouriou <erwan.gouriou@linaro.org>
Allow directly calling the flash partition extraction function and
remove passing any arguments that the function doesn't actually use.
Signed-off-by: Kumar Gala <kumar.gala@linaro.org>
Reworked flash partition extraction so we call it when we see a
node that is 'partiton@' instead of per property. We also handle the
'read-only' property in the flash partition extraction function which
lets us remove 'use-property-label' handling.
Signed-off-by: Kumar Gala <kumar.gala@linaro.org>
We don't have any cases that need 'use-property-label' related to
handling of reg extraction so lets remove it.
Signed-off-by: Kumar Gala <kumar.gala@linaro.org>
Add support to the extract script to handle 'pwms' client properties.
This is pretty much identical to how we hand 'gpios'.
Signed-off-by: Kumar Gala <kumar.gala@linaro.org>
Before dtc 1.4.7 we'd get something like the following for an gpios
property:
reg = <1 2 3 4>;
After dtc 1.4.7 we get:
cs-gpios = <0x05 0x0d 0x00>, < 0x06 0x00 0x00>;
We should handle both cases in the extract reg handling code. So if
we see a list of lists, we flatten it to a single list to normalize
the property.
Signed-off-by: Kumar Gala <kumar.gala@linaro.org>
Compat define is generated without value. This should not harm,
but since generated flag is a "Kconfig like" define, we migth need it
to hold a value.
Signed-off-by: Erwan Gouriou <erwan.gouriou@linaro.org>
Heuristic for populating an alias string for a subnode
of an alias node was wrong as there was no check if
alias already existed and string created was not in line
with device tree specfication (allowed chars: [0-9],[a-z], '-').
Fix these two points.
Signed-off-by: Erwan Gouriou <erwan.gouriou@linaro.org>
We can replace the method get_node_label_string in DTDirective with the
global function get_node_label. This way we have a single place that
labels for defines are being generated.
Signed-off-by: Kumar Gala <kumar.gala@linaro.org>
Don't based the compat to get_node_label, we can just figure out based
on the node address we are passed.
Signed-off-by: Kumar Gala <kumar.gala@linaro.org>
Standard device tree properties like 'reg-names', 'interrupt-names', and
'phandle' should be handled by other extract mechanisms or ignored. So
filter them out before we even call extract_property
Signed-off-by: Kumar Gala <kumar.gala@linaro.org>
We've never handled boolean properties well, if we had a boolean that
existed we'd generate a define of 'True' and if the boolean didn't exist
than nothing would be generated. So there was no easy way to tell that
the boolean wasn't defined.
Now if we mark a property as boolean in the yaml, we will generate a
define for it regardless if it exists or not. If it exists we'll
set the value to 1, and if it doesn't to 0.
Fixes#8376
Signed-off-by: Kumar Gala <kumar.gala@linaro.org>
Add a function that given a node address we get a list of compats back
instead of just the first. This is in prep for eDTS support.
Signed-off-by: Kumar Gala <kumar.gala@linaro.org>
Before dtc 1.4.7 we'd get something like the following for an reg
property:
reg = <1 2 3 4>;
After dtc 1.4.7 we get:
reg = <1 2>, <3 4>;
We should handle both cases in the extract reg handling code. So if
we see a list of lists, we flatten it to a single list to normalize
the property.
Signed-off-by: Kumar Gala <kumar.gala@linaro.org>
Python's open() by default using "system character encoding", which
may vary from system to system (e.g. LOCALE=C aka "ascii" on bare-OS
systems, something on Windows, etc.). But Zephyr files are utf-8, so
read them as such, by explicitly specifying encoding.
This is similar to changes earlier done to another script in 94620bd.
Signed-off-by: Paul Sokolovsky <paul.sokolovsky@linaro.org>
The 'id' field was never used and tended to just have the compat of the
node. Lets remove it and removed some code in extract_dts_includes.py
related to it. Added a warning if 'id' is set in a yaml so we can
remove it going forward.
Signed-off-by: Kumar Gala <kumar.gala@linaro.org>
For now we've used range properties as a pass through. However range
properties can translate from one address space to another. This is
typically used one address spaces translate from one physical bus to
another (For example going from PCI address space to internal SoC memory
map). However, we can also use this for cases where we want to reduce
duplication (For example with ARMv8-M for secure v non-secure MMIO
registers).
'ranges' takes either the form of:
ranges; /* pass through translation */
or:
ranges = <child-bus-address parent-bus-address length>;
Signed-off-by: Kumar Gala <kumar.gala@linaro.org>
We use to walk to the full tree in search of addr/size cells. We should
only have to look at the parent of the node for these properties.
Signed-off-by: Kumar Gala <kumar.gala@linaro.org>
Given the path address to a node return the address/size cells. In
theory this should just be looking up the #{address,size}-cells in
the parent node, we'll make that cleanup next.
Signed-off-by: Kumar Gala <kumar.gala@linaro.org>
In case of having more than one reg, aliases would not generate
properly. Number of register at the end of define was missing.
Signed-off-by: Mieszko Mierunski <mieszko.mierunski@nordicsemi.no>
When the code partition is not at the beginning of the flash, the load
offset is wrongly computed. The address in the device tree is already
relative to the beginning of the parent node, ie the beginning of the
flash memory space. There is therefore no need to subtract it.
Signed-off-by: Aurelien Jarno <aurelien@aurel32.net>
The node name parsing for the _LABEL #define does not parse the unique
node portion in the same fashion between @<unit_address> and _<number>.
This change normalizes the two modes.
Signed-off-by: David Leach <david.leach@nxp.com>
If size or address cells happened to be 2 we'd get the wrong value since
we where shift the least significant 32-bit's up. Adjust the math based
on the value of the cell amount to fix things.
Signed-off-by: Kumar Gala <kumar.gala@linaro.org>
Rename address / size cell variable to clarify that its the number
of address / size cells.
Signed-off-by: Bobby Noelte <b0661n0e17e@gmail.com>
Signed-off-by: Kumar Gala <kumar.gala@linaro.org>
reg class is updated to take into account whole use cases
of reg extraction so extract_reg_prop could be removed.
Signed-off-by: Erwan Gouriou <erwan.gouriou@linaro.org>
Parameter 'names' is provided as argument of several property
extract functions. Thought it is actually used only once.
Remove when not needed.
Signed-off-by: Erwan Gouriou <erwan.gouriou@linaro.org>
Signed-off-by: Kumar Gala <kumar.gala@linaro.org>
Any word started with underscore followed by and uppercase letter or a
second underscore is a reserved word according with C99.
With have *many* violations on Zephyr's code, this commit is tackling
only the violations caused by headers guards. It also takes the
opportunity to normalize them using the filename in uppercase and
replacing dot with underscore. e.g file.h -> FILE_H
Signed-off-by: Flavio Ceolin <flavio.ceolin@intel.com>
Generate CONFIG_DT_COMPAT flags using available nodes
'compatible' property.
Store them in a bogus node_address key of defs dict so
duplicates could be removed.
Signed-off-by: Bobby Noelte <b0661n0e17e@gmail.com>
Signed-off-by: Erwan Gouriou <erwan.gouriou@linaro.org>
Before dtc 1.4.7 we'd get something like the following for an interrupt
property in which #interrupt-cells is 2.
interrupts = <1 2 3 4>;
After dtc 1.4.7 we get:
interrupts = <1 2>, <3 4>;
We should handle both cases in the extract interrupt handling code. So
if we see a list of lists, we flatten it to a single list to normalize
the property.
Fixes: #9558
Signed-off-by: Kumar Gala <kumar.gala@linaro.org>
A node alias name should be applied to the all property names.
Before this patch, the alias name is applied erroneously
just for CLOCK_CONTROLLER, skipping the CLOCK_BITS and CLOCK_BUS
property names.
Signed-off-by: Istvan Bisz <istvan.bisz@t-online.hu>
In addtion to zephyr/dts/bindings als scan the dts/bindings
directory within the application source directory for bindings.
Allows to have application specific bindings and drivers.
Signed-off-by: Bobby Noelte <b0661n0e17e@gmail.com>
When a DTS node has no 'compatible' property and its parent node has a
list for its compatible property, return only the first element of the
parent's compatible list.
Signed-off-by: Nathaniel Graff <nathaniel.graff@sifive.com>
Variables 'names' is copying value from 'reduced' dict and gives
illusion that any computation could be done on copied data.
Problem is that later computation on 'names' will modify data in
'reduced'.
Use deepcopy in order to avoid erasing thing in reduced.
Signed-off-by: Erwan Gouriou <erwan.gouriou@linaro.org>
'defs' variable is used and passed as a parameter in the vast
majority of the functions of extract_dts_includes script.
Set this variable global
Do the same with 'struct' variable for upcoming change.
Signed-off-by: Erwan Gouriou <erwan.gouriou@linaro.org>
Treat new generated dtc element 'alt-name' as usual aliases.
Aim is not to duplicate generation of node elements but provide
pointers using generic alternate names.
For instance, defining following overriding node:
arduino_i2c : i2c1 {};
Will generate following definition:
#define ARDUINO_I2C_LABEL ST_STM32_I2C_V1_40005400_LABEL
Then 'ARDUINO_I2C_LABEL' could be use a generic binding.
Signed-off-by: Erwan Gouriou <erwan.gouriou@linaro.org>
Allow use of new element of dtc grammar called overriding nodes:
i2cexp: &i2c2 {};
It allows a node to assign an alternate label to a node that
could be generic and used for adapter boards.
This commit is a derivative of a dtc commit from dtc v1.4.2 [1]
[1] https://bit.ly/2GFLLOa
Signed-off-by: Erwan Gouriou <erwan.gouriou@linaro.org>
Do not provide info message if node type, title, version,
node description is overwritten.
This is the expected behaviour.
Fixes#8360
Signed-off-by: Bobby Noelte <b0661n0e17e@gmail.com>
In some cases, node label could be generated with "/" character
in name string, which prevents compilation
Signed-off-by: Erwan Gouriou <erwan.gouriou@linaro.org>
Signed-off-by: Florian Vaussard <florian.vaussard@gmail.com>
Commit 93d3a42776 changed the interface
of extract_controller() but did not change the recursive call within.
Signed-off-by: Bobby Noelte <b0661n0e17e@gmail.com>
Correctly process multiple include files given to the
!include command of the YAML loader.
The fix only targets the sequential definition of include files.
Fixes#7067
Signed-off-by: Bobby Noelte <b0661n0e17e@gmail.com>
'cell_string' yaml attribute has been introduced in order to
help enforcement of specific string during defines generation.
This adds complexity in understanding script behavior as a black
box and create additional dependency which is not strictly required.
For node specific generation functions (pinctrl and interrupts),
this could be replaced directly by an hardcoded version
(as everyone used the same 'cell_string' anyway).
For extract_cells functions, string could be replaced by extracted
property name. As a consequence, we're now able to generate defines
for properties refering to these controllers via phandle.
For instance, in following node
spbtle-rf@0 {
compatible = "st,spbtle-rf";
reg = <0>;
reset-gpios = <&gpioa 8 0>;
};
We'll be able to generate:
#define ST_STM32_SPI_...LE_RF_0_RESET_GPIOS_CONTROLLER "GPIOA"
#define ST_STM32_SPI_...PBTLE_RF_0_RESET_GPIOS_FLAGS_0 0
#define ST_STM32_SPI_..._SPBTLE_RF_0_RESET_GPIOS_PIN_0 8
Only impact for this whole change is for NXP clocks which were the
only ones using 'cell_string' attribute with a value different than
the default one.
Signed-off-by: Erwan Gouriou <erwan.gouriou@linaro.org>
extract_controller only handle the first phandle in a cell property.
However we could easily have something like this where the phandles
vary:
gpios = <&gpiod 13 GPIO_INT_ACTIVE_LOW
&gpioc 14 GPIO_INT_ACTIVE_LOW>;
So we need to walk the property list for each phandle and produce a
define associated with it.
Also, if alias to the node is defined, indexed alias define
is generated for every indexed controller define:
#define GPIO_LEDS_0_GPIO_CONTROLLER_0 "GPIOA"
#define GPIO_LEDS_0_GPIO_CONTROLLER_1 "GPIOB"
#define LED1_GPIO_CONTROLLER_0 GPIO_LEDS_0_GPIO_CONTROLLER_0
#define LED1_GPIO_CONTROLLER_1 GPIO_LEDS_0_GPIO_CONTROLLER_1
Signed-off-by: Kumar Gala <kumar.gala@linaro.org>
If we had something like:
gpios = <&gpiod 13 GPIO_INT_ACTIVE_LOW
&gpiod 14 GPIO_INT_ACTIVE_LOW>;
The script blows up in extract_cells. While extract_cells attempted to
handle more than a single item in such a list, it didn't manipulate the
prop list for the recursive calls properly.
Since we pop off items from the prop list as we use them we can easily
pass the prop list to the rescurive call to fix things.
Besides, if alias is defined for the node, indexed aliases defines are
generated:
#define GPIO_LEDS_0_GPIO_FLAGS_0 4
#define GPIO_LEDS_0_GPIO_FLAGS_1 0
#define GPIO_LEDS_0_GPIO_PIN_0 5
#define GPIO_LEDS_0_GPIO_PIN_1 6
#define LED1_GPIO_FLAGS_0 GPIO_LEDS_0_GPIO_FLAGS_0
#define LED1_GPIO_FLAGS_1 GPIO_LEDS_0_GPIO_FLAGS_1
#define LED1_GPIO_PIN_0 GPIO_LEDS_0_GPIO_PIN_0
#define LED1_GPIO_PIN_1 GPIO_LEDS_0_GPIO_PIN_1
Signed-off-by: Kumar Gala <kumar.gala@linaro.org>
Indexed defines were systematically generated even when there
was only one element to generate.
So we ended up generated a lot of _0 defines.
Then we needed to generate aliases to these _0 indexed defines,
in order to get useful defines.
For instance:
#define GPIO_LEDS_0_GPIO_FLAGS_0 4
#define GPIO_LEDS_0_GPIO_PIN_0 5
#define GPIO_LEDS_0_GPIO_FLAGS GPIO_LEDS_0_GPIO_FLAGS_0
#define GPIO_LEDS_0_GPIO_PIN GPIO_LEDS_0_GPIO_PIN_0
This commit allows to generate _0 indexed define only if a
property has more than one elements to define.
Aliases generation to _0 indexed defines are also removed.
Note: IRQ are left untouched since this is frequent to handle
multiple IRQs in a driver
Signed-off-by: Erwan Gouriou <erwan.gouriou@linaro.org>
Some functions were using y_key and y_val as argument. This was not
quite easy to read. Rename argument into more informative versions.
Signed-off-by: Erwan Gouriou <erwan.gouriou@linaro.org>
When a node is referencing to a parent node and this node is
reported as controller, generate a #define to declare this controller.
Value is controller property 'label'
For instance, if following gpio controller is referenced in board dts:
green_led_1: led@1 {
gpios = <&gpioa 5 GPIO_INT_ACTIVE_HIGH>;
label = "User LD1";
};
Following will be generated:
\#define GPIO_LEDS_1_GPIO_CONTROLLER "GPIOA"
Besides, if defined, alias label will be generated as well for this
controller:
aliases {
led0 = &green_led_1;
};
will trigger generation of:
\#define LED0_GPIO_CONTROLLER GPIO_LEDS_1_GPIO_CONTROLLER
Signed-off-by: Erwan Gouriou <erwan.gouriou@linaro.org>
Modify get_compat function to look for 'compatible' property
in parent nodes if not available at node level.
Since this operation is quite common, this allows some code
factorization. As a consequence, get_compat takes 'node_address'
as argument instead of 'node'.
Signed-off-by: Erwan Gouriou <erwan.gouriou@linaro.org>
Apply extract_cells function also when property name
contains "gpio" (could be cs-gpio, rst-gpio, gpio-irq, ..)
Signed-off-by: Erwan Gouriou <erwan.gouriou@linaro.org>
In order to generate defs for references in aliases dts node,
add some treatment in extract_xxx functions to generate
aliases #define's
Signed-off-by: Erwan Gouriou <erwan.gouriou@linaro.org>
During yaml collapse step, convert inherited 'id' key to 'node_type'.
With this new 'node_type', it's is more easy to apply common treatment
to all bindings that include the same base yaml file but might not
have similar bindings/constraint naming convention.
Signed-off-by: Erwan Gouriou <erwan.gouriou@linaro.org>
Prepare to split extract_dts_includes in modules.
extract_dts_includes design is based on globals. Every module must be
able to use (import) them.
Signed-off-by: Bobby Noelte <b0661n0e17e@gmail.com>
Moving logical parts into dedicated functions for clarity.
Factorizing a bit the code for potential future changes (more
'zephyr,xxxx' directives related to CONFIG_ option).
Signed-off-by: Tomasz Bursztyka <tomasz.bursztyka@linux.intel.com>
Thus no need to parse twice the .dtsi, .dts and .yaml files.
Simplify provided arguments relevancy, letting argparse generating usage
message by itself.
Signed-off-by: Tomasz Bursztyka <tomasz.bursztyka@linux.intel.com>
Mandated by Python PEP-8.
(And normalize the way we write python in dts scripts also)
Signed-off-by: Tomasz Bursztyka <tomasz.bursztyka@linux.intel.com>
We should be able to run the script without requiring a zephyr,flash
property in the choosen node. Qualify insert based on having the
choosen property.
Signed-off-by: Kumar Gala <kumar.gala@linaro.org>
When building in Windows, extract_dts_includes.py failed with an
exception on boards that have dts sensor bindings. This was caused by
path handling to search for i2c-device.yaml that worked in Linux, but
not in Windows.
Affected boards were disco_l475_iot1, frdm_k64f, frdm_kw41z, and
hexiwear_k64.
Signed-off-by: Maureen Helm <maureen.helm@nxp.com>
When we determine the address and size cells to determine how to parse a
reg property, we need to stop at the parent of the node, not at the node
itself. If we have #address-cells or #size-cells in a node its meant
for the children of that node and not the node itself.
Fixes#4568
Signed-off-by: Kumar Gala <kumar.gala@linaro.org>
Added a label for soc-nv-flash nodes. Made some updates to the
generation to maintain creating defines for properties like
erase-block-size and write-block-size so they we get both
FLASH_ERASE_BLOCK_SIZE and FLASH_${LABEL}_ERASE_BLOCK_SIZE (same for
WRITE_BLOCK_SIZE).
Signed-off-by: Kumar Gala <kumar.gala@linaro.org>
Its possible we have dashes in interrupt names that we need to convert
to underscores when we generate defines. Make sure we do that otherwise
things aren't going to build.
Signed-off-by: Kumar Gala <kumar.gala@linaro.org>
When node has 'bus' as 'parent' attribute, change base label to
include parent address in label prefix.
Besides, generates a "_BUS_NAME" define which equals parent label.
Signed-Off-by: Erwan Gouriou <erwan.gouriou@linaro.org>
According to yaml syntaxic rules, 'properties' described in dts
bindings yaml files could be seen as 'mapping'(key/value couple),
instead of 'series' (list of single elements).
yaml 'mappings' will then be converted by yaml python library as
python 'dict' which will ease treatment (instead of current list
as were before this commit).
Same treatment is applied to 'inherits'.
script extract_dts_inlcude is updated to take change of yaml_list
structre into account. This allows some code simplification. Largest
impact is yaml_collapse function which works now allow complete
overload method on all the attributes of a yaml nodes.
Signed-off-by: Erwan Gouriou <erwan.gouriou@linaro.org>
Cleanup how we find the yaml files for device tree bindings. Move to a
recursive dir search of the dts/ dir. This will be useful for
supporting re-organizing of the yaml files to match binding dir
structure.
Signed-off-by: Kumar Gala <kumar.gala@linaro.org>
Allow the script to take multiple -f (fixup) file options. We output
the fixup files in order that the -f options are passed. This will
allow us to have a common soc fixup and board fixup if we desire.
Signed-off-by: Kumar Gala <kumar.gala@linaro.org>
If there's any key in the alias which length is larger than other keys
in the node, the include file will be incorrect, there will be no tab
between the key and value.
We need to take into account the max length of alias keys.
Signed-off-by: Aska Wu <aska.wu@linaro.org>