On 08/02/2022 21:49, Simon Glass wrote: > Add a new function to add a string list. > > Signed-off-by: Simon Glass <s...@chromium.org> > --- > > tools/dtoc/fdt.py | 18 ++++++++++++++++++ > tools/dtoc/test_fdt.py | 8 ++++++++ > 2 files changed, 26 insertions(+) > > diff --git a/tools/dtoc/fdt.py b/tools/dtoc/fdt.py > index 32a7aa9829..e7197f8f12 100644 > --- a/tools/dtoc/fdt.py > +++ b/tools/dtoc/fdt.py > @@ -501,6 +501,24 @@ class Node: > val = bytes(val, 'utf-8') > return self.AddData(prop_name, val + b'\0') > > + def AddStringList(self, prop_name, val): > + """Add a new string-list property to a node > + > + The device tree is marked dirty so that the value will be written to > + the blob on the next sync. > + > + Args: > + prop_name: Name of property to add > + val (list of str): List of strings to add > + > + Returns: > + Prop added > + """ > + out = b'' > + for string in val: > + out += bytes(string, 'utf-8') + b'\0' > + return self.AddData(prop_name, out)
If val is an empty list this would try to set a zero-byte data, but then the Prop class considers that a boolean True. Perhaps use "s" as the variable name as there's a "string" module (though not imported here). Also, b'\0'.join() works just like in strings if you prefer that to a loop. > + > def AddInt(self, prop_name, val): > """Add a new integer property to a node > > diff --git a/tools/dtoc/test_fdt.py b/tools/dtoc/test_fdt.py > index 55b70e9876..1a7e73ffce 100755 > --- a/tools/dtoc/test_fdt.py > +++ b/tools/dtoc/test_fdt.py > @@ -531,6 +531,14 @@ class TestProp(unittest.TestCase): > self.node.AddData('data', tools.GetBytes(65, 20000)) > self.dtb.Sync(auto_resize=True) > > + def test_string_list(self): > + """Test adding string-list property to a node""" > + val = ['123', '456'] > + self.node.AddStringList('stringlist', val) > + self.dtb.Sync(auto_resize=True) > + data = self.fdt.getprop(self.node.Offset(), 'stringlist') > + self.assertEqual(b'123\x00456\0', data) > + > def testFromData(self): > dtb2 = fdt.Fdt.FromData(self.dtb.GetContents()) > self.assertEqual(dtb2.GetContents(), self.dtb.GetContents())