scripts: sd_fusing: Add support for writing image at specified absolute sector 44/315644/2
authorMarek Szyprowski <m.szyprowski@samsung.com>
Mon, 5 Aug 2024 15:42:12 +0000 (17:42 +0200)
committerMarek Szyprowski <m.szyprowski@samsung.com>
Tue, 6 Aug 2024 12:21:06 +0000 (14:21 +0200)
Add support for writing raw images at the specified absolute sector of the
target device without the need to create a MBR or GPT partition for it.

Signed-off-by: Marek Szyprowski <m.szyprowski@samsung.com>
Change-Id: Ia3a8f1eb9ba12d0541700cf4e9358f33290f3ec8

scripts/tizen/sd_fusing.py

index dc0015e492225de4263052b36efeafc1257d555a..a0c6bef867677810102aac869b1a9e706c3e3f19 100755 (executable)
@@ -177,6 +177,12 @@ class SdFusingTarget:
             sys.exit(1)
         return [self.binaries.get(binary, None)]
 
+    def get_raw_binary_sector(self, binary):
+        for entry in self.raw_binary_table:
+            if entry['binaries'] == binary:
+                return entry['start_sector'];
+        return None
+
     def ensure_parttable(self):
         logging.notice(f"Verifying that partition table on {Device} matches target specification")
         for partnum, part in enumerate(self.part_table, 1):
@@ -1081,7 +1087,33 @@ def get_device_kname(device):
     logging.error("kname entry not found")
     sys.exit(1)
 
+def do_fuse_raw(f, name, target, sector):
+    argv = ['dd', 'bs=512',
+            'oflag=direct',
+            f'seek={sector}',
+            'conv=nocreat',
+            'status=progress',
+            f"of={Device}"]
+    logging.debug(" ".join(argv))
+    proc_dd = subprocess.Popen(argv,
+                               bufsize=(1 << 9),
+                               stdin=subprocess.PIPE,
+                               stdout=None, stderr=None)
+    logging.notice(f"Writing {name} to {Device} at sector {sector}")
+    f.seek(0)
+    buf = f.read(1 << 9)
+    while len(buf) > 0:
+        proc_dd.stdin.write(buf)
+        buf = f.read(1 << 9)
+    proc_dd.communicate()
+    logging.info("Done")
+    #TODO: verification
+
 def do_fuse_file(f, name, target):
+    sector = target.get_raw_binary_sector(name)
+    if sector is not None:
+        do_fuse_raw(f, name, target, sector)
+        return
     indexes = target.get_partition_index_list(name)
     if len(indexes) == 0:
         logging.info(f"No partition defined for {name}, skipping.")