diff --git a/Buildscripts/DevicetreeCompiler/source/generator.py b/Buildscripts/DevicetreeCompiler/source/generator.py index bbbd3dc36..1f3af5b2e 100644 --- a/Buildscripts/DevicetreeCompiler/source/generator.py +++ b/Buildscripts/DevicetreeCompiler/source/generator.py @@ -178,7 +178,9 @@ def write_device_structs(file, device: Device, parent_device: Device, bindings: # Write config struct write_config(file, device, bindings, devices, type_name) # Write device struct + address_value = device.node_address if device.node_address is not None else "0" file.write(f"static struct Device {node_name}" " = {\n") + file.write(f"\t.address = {address_value},\n") file.write(f"\t.name = \"{device.node_name}\",\n") # Use original name file.write(f"\t.config = &{config_variable_name},\n") file.write(f"\t.parent = {parent_value},\n") diff --git a/Buildscripts/DevicetreeCompiler/source/grammar.lark b/Buildscripts/DevicetreeCompiler/source/grammar.lark index e2a0493ff..1b9fdeb0c 100644 --- a/Buildscripts/DevicetreeCompiler/source/grammar.lark +++ b/Buildscripts/DevicetreeCompiler/source/grammar.lark @@ -40,10 +40,11 @@ array: NUMBER+ property_value: quoted_text_array | QUOTED_TEXT | "<" value ">" | "<" values ">" | "[" array "]" | PHANDLE device_property: PROPERTY_NAME ["=" property_value] ";" -NODE_ALIAS: /[a-zA-Z0-9_\-\/@]+/ -NODE_NAME: /[a-zA-Z0-9_\-\/@]+/ +NODE_ALIAS: /[a-zA-Z0-9_\-\/]+/ +NODE_NAME: /[a-zA-Z0-9_\-\/]+/ +NODE_ADDRESS: /[0-9a-zA-Z_]+/ -device: (NODE_ALIAS ":")? NODE_NAME "{" (device | device_property)* "};" +device: (NODE_ALIAS ":")? NODE_NAME ("@" NODE_ADDRESS)? "{" (device | device_property)* "};" dts_version: /[0-9a-zA-Z\-]+/ diff --git a/Buildscripts/DevicetreeCompiler/source/models.py b/Buildscripts/DevicetreeCompiler/source/models.py index 47d063d90..761d25caf 100644 --- a/Buildscripts/DevicetreeCompiler/source/models.py +++ b/Buildscripts/DevicetreeCompiler/source/models.py @@ -8,6 +8,7 @@ class DtsVersion: class Device: node_name: str node_alias: str + node_address: str status: str properties: list devices: list diff --git a/Buildscripts/DevicetreeCompiler/source/transformer.py b/Buildscripts/DevicetreeCompiler/source/transformer.py index 7b2c2df25..076d5872e 100644 --- a/Buildscripts/DevicetreeCompiler/source/transformer.py +++ b/Buildscripts/DevicetreeCompiler/source/transformer.py @@ -29,6 +29,7 @@ class DtsTransformer(Transformer): def device(self, tokens: list): node_name = None node_alias = None + node_address = None status = None properties = list() child_devices = list() @@ -37,6 +38,8 @@ class DtsTransformer(Transformer): node_name = item.value elif type(item) is Token and item.type == 'NODE_ALIAS': node_alias = item.value + elif type(item) is Token and item.type == 'NODE_ADDRESS': + node_address = item.value elif type(item) is DeviceProperty: if item.name == "status": status = item.value @@ -44,7 +47,7 @@ class DtsTransformer(Transformer): properties.append(item) elif type(item) is Device: child_devices.append(item) - return Device(node_name, node_alias, status, properties, child_devices) + return Device(node_name, node_alias, node_address, status, properties, child_devices) def device_property(self, objects: List[object]): name = objects[0] # Boolean property has no value as the value is implied to be true diff --git a/TactilityKernel/include/tactility/device.h b/TactilityKernel/include/tactility/device.h index 1ebc97aaa..e60986d6f 100644 --- a/TactilityKernel/include/tactility/device.h +++ b/TactilityKernel/include/tactility/device.h @@ -26,6 +26,9 @@ struct DeviceType { /** Represents a piece of hardware */ struct Device { + /** Device address. Can represent an index, a memory address, or some kind of offset */ + int32_t address; + /** The name of the device. Valid characters: a-z a-Z 0-9 - _ . */ const char* name;