From 92667dc2e57420a9960f80c80da7d3c49c8c7fd6 Mon Sep 17 00:00:00 2001
From: Damien George <damien.p.george@gmail.com>
Date: Fri, 22 Jun 2018 15:32:32 +1000
Subject: [PATCH] tools/pydfu.py: Add support for multiple memory segments.

Segments are separated by / and begin with the memory address.  This
follows how the ST DFU tool works.
---
 tools/pydfu.py | 35 ++++++++++++++++++-----------------
 1 file changed, 18 insertions(+), 17 deletions(-)

diff --git a/tools/pydfu.py b/tools/pydfu.py
index a33e49712..a7adda37c 100755
--- a/tools/pydfu.py
+++ b/tools/pydfu.py
@@ -394,24 +394,25 @@ def get_memory_layout(device):
     intf = cfg[(0, 0)]
     mem_layout_str = get_string(device, intf.iInterface)
     mem_layout = mem_layout_str.split('/')
-    addr = int(mem_layout[1], 0)
-    segments = mem_layout[2].split(',')
-    seg_re = re.compile(r'(\d+)\*(\d+)(.)(.)')
     result = []
-    for segment in segments:
-        seg_match = seg_re.match(segment)
-        num_pages = int(seg_match.groups()[0], 10)
-        page_size = int(seg_match.groups()[1], 10)
-        multiplier = seg_match.groups()[2]
-        if multiplier == 'K':
-            page_size *= 1024
-        if multiplier == 'M':
-            page_size *= 1024 * 1024
-        size = num_pages * page_size
-        last_addr = addr + size - 1
-        result.append(named((addr, last_addr, size, num_pages, page_size),
-                      "addr last_addr size num_pages page_size"))
-        addr += size
+    for mem_layout_index in range(1, len(mem_layout), 2):
+        addr = int(mem_layout[mem_layout_index], 0)
+        segments = mem_layout[mem_layout_index + 1].split(',')
+        seg_re = re.compile(r'(\d+)\*(\d+)(.)(.)')
+        for segment in segments:
+            seg_match = seg_re.match(segment)
+            num_pages = int(seg_match.groups()[0], 10)
+            page_size = int(seg_match.groups()[1], 10)
+            multiplier = seg_match.groups()[2]
+            if multiplier == 'K':
+                page_size *= 1024
+            if multiplier == 'M':
+                page_size *= 1024 * 1024
+            size = num_pages * page_size
+            last_addr = addr + size - 1
+            result.append(named((addr, last_addr, size, num_pages, page_size),
+                          "addr last_addr size num_pages page_size"))
+            addr += size
     return result
 
 
-- 
GitLab