On 18/02/2022 19:50, Jan Kiszka wrote: > On 15.02.22 18:06, Jan Kiszka wrote: >> On 15.02.22 17:50, Jan Kiszka wrote: >>> On 15.02.22 13:27, Alper Nebi Yasak wrote: >>>> The AddMissingProperties() and SetCalculatedProperties() methods were >>>> disabled for FIT as a fixup to this patch, that's why image-pos etc. >>>> aren't available. See comments at [1] for some context. >>>> >>>> Hopefully my two patches [2][3] fix things, can you test with them? >>>> >>>> [1] "binman: Correct the error message for a bad hash algorithm" >>>> https://patchwork.ozlabs.org/project/uboot/patch/20220208105941.1.I8f212a1150defebaf8b7b15a79f7a2fc62c276b2@changeid/ >>>> >>>> [2] "binman: Skip processing "hash" subnodes of FIT subsections" >>>> https://patchwork.ozlabs.org/project/uboot/patch/20220209190236.26479-1-alpernebiya...@gmail.com/ >>>> >>> >>> This one helped, indeed. >>> >> >> ...not completely: >> >> $ source/tools/binman/binman replace -i flash.bin -f f...@0x380000.fit >> fit@0x380000binman: [Errno 13] Permission denied: '/.f...@0x380000.itb' >> > > Ping. > > $ source/tools/binman/binman -D replace -i flash.bin -f f...@0x380000.fit > fit@0x380000 > binman: [Errno 13] Permission denied: '/.f...@0x380000.itb' > > Traceback (most recent call last): > File "source/tools/binman/binman", line 141, in RunBinman > ret_code = control.Binman(args) > File "u-boot/tools/binman/control.py", line 644, in Binman > allow_resize=not args.fix_size, write_map=args.map) > File "u-boot/tools/binman/control.py", line 404, in ReplaceEntries > allow_resize=allow_resize, write_map=write_map) > File "u-boot/tools/binman/control.py", line 341, in WriteEntryToImage > AfterReplace(image, allow_resize=allow_resize, write_map=write_map) > File "u-boot/tools/binman/control.py", line 333, in AfterReplace > get_contents=False, allow_resize=allow_resize) > File "u-boot/tools/binman/control.py", line 560, in ProcessImage > image.PackEntries() > File "u-boot/tools/binman/image.py", line 155, in PackEntries > super().Pack(0) > File "u-boot/tools/binman/etype/section.py", line 385, in Pack > self._PackEntries() > File "u-boot/tools/binman/etype/section.py", line 403, in _PackEntries > offset = entry.Pack(offset) > File "u-boot/tools/binman/etype/section.py", line 390, in Pack > data = self.BuildSectionData(True) > File "u-boot/tools/binman/etype/fit.py", line 265, in BuildSectionData > tools.write_file(input_fname, data) > File "u-boot/tools/patman/tools.py", line 482, in write_file > with open(filename(fname), binary and 'wb' or 'w') as fd: > PermissionError: [Errno 13] Permission denied: '/.f...@0x380000.itb' > > Something seems fairly broken here. That '/.' does not come from the > output directory name, it's generated by Entry.GetUniqueName. Looks like > this path should not been taken under these conditions.
I can reproduce this and tried a few things, but more issues just kept popping up (outside u-boot as well). I got it to a point where the command re-packs the FIT and the image but quite wrongly. The offset and image-pos properties get added in the FIT, and the image main-section just concatenates all entries without regard to set offsets. I'll need more time to work those out, then to add tests and send patches. Here's the diff I got so far in case it helps: diff --git a/tools/binman/control.py b/tools/binman/control.py index a179f7812988..24ec89b26302 100644 --- a/tools/binman/control.py +++ b/tools/binman/control.py @@ -390,6 +390,7 @@ def ReplaceEntries(image_fname, input_fname, indir, entry_paths, """ image_fname = os.path.abspath(image_fname) image = Image.FromFile(image_fname) + image.CollectBintools() # Replace an entry from a single file, as a special case if input_fname: diff --git a/tools/binman/entry.py b/tools/binman/entry.py index 631215dfc88a..8173e91af96a 100644 --- a/tools/binman/entry.py +++ b/tools/binman/entry.py @@ -767,7 +767,7 @@ def GetUniqueName(self): node = self._node while node.parent: node = node.parent - if node.name == 'binman': + if node.name == 'binman' or node.name == '/': break name = '%s.%s' % (node.name, name) return name diff --git a/tools/binman/etype/fit.py b/tools/binman/etype/fit.py index 1e957023f354..9b2c33bc2b34 100644 --- a/tools/binman/etype/fit.py +++ b/tools/binman/etype/fit.py @@ -137,10 +137,6 @@ def __init__(self, section, etype, node): str)])[0] self.mkimage = None - def ReadNode(self): - self.ReadEntries() - super().ReadNode() - def ReadEntries(self): def _AddNode(base_node, depth, node): """Add a node to the FIT @@ -184,11 +180,12 @@ def _AddNode(base_node, depth, node): # section entries for them here to merge the content subnodes # together and put the merged contents in the subimage node's # 'data' property later. - entry = Entry.Create(self.section, node, etype='section') + entry = Entry.Create(self, node, etype='section') entry.ReadNode() # The hash subnodes here are for mkimage, not binman. entry.SetUpdateHash(False) - self._entries[rel_path] = entry + image_name = rel_path[len('/images/'):] + self._entries[image_name] = entry for subnode in node.subnodes: if has_images and not (subnode.name.startswith('hash') or @@ -284,7 +281,8 @@ def _BuildInput(self, fdt): Returns: New fdt contents (bytes) """ - for path, section in self._entries.items(): + for image_name, section in self._entries.items(): + path = f"/images/{image_name}" node = fdt.GetNode(path) data = section.GetData() node.AddData('data', data) @@ -312,7 +310,8 @@ def SetImagePos(self, image_pos): fdt = Fdt.FromData(self.GetData()) fdt.Scan() - for path, section in self._entries.items(): + for image_name, section in self._entries.items(): + path = f"/images/{image_name}" node = fdt.GetNode(path) data_prop = node.props.get("data")