[read_info] Fix generate partition table

pull/24/head
remittor 1 year ago
parent 6f380157c5
commit 8d3a70781a

@ -52,6 +52,7 @@ class DevInfo():
dmesg = None # text
info = BaseInfo()
partlist = [] # list of {addr, size, name}
allpartnum = -1 # "ALL" partition number
kcmdline_s = "" # original kernel command line
kcmdline = {} # key=value
nvram = {} # key=value
@ -127,60 +128,76 @@ class DevInfo():
print(f'ERROR on downloading "/tmp/dmesg.log"')
return self.dmesg
def get_part_table_dmesg(self, verbose = None):
verbose = verbose if verbose is not None else self.verbose
self.partlist = []
def get_part_addr_dmesg(self, partlist):
if not self.dmesg:
return self.partlist
return [ ]
x = self.dmesg.find(" MTD partitions on ")
if x <= 0:
return self.partlist
return [ ]
parttbl = re.findall(r'0x0000(.*?)-0x0000(.*?) : "(.*?)"', self.dmesg)
if len(parttbl) <= 0:
return self.partlist
if verbose:
print("MTD partitions:")
return [ ]
addr_list = [ -1 ] * len(partlist)
for i, part in enumerate(parttbl):
addr = int(part[0], 16)
size = int(part[1], 16) - addr
name = part[2]
self.partlist.append({'addr': addr, 'size': size, 'name': name})
if verbose:
print(' %2d > addr: 0x%08X size: 0x%08X name: "%s"' % (i, addr, size, name))
if verbose:
print(" ")
self.get_part_readonly()
return self.partlist
for p, data in enumerate(partlist):
if data['name'] == name:
addr_list[p] = addr
if size != data['size']:
raise ValueError(f"Incorrect size into partition table ({name})")
return addr_list
def get_part_table(self, verbose = None):
verbose = verbose if verbose is not None else self.verbose
self.partlist = []
self.partlist = [ ]
self.allpartnum = -1
mtd_list = self.run_command('cat /proc/mtd', 'mtd_list.txt')
if not mtd_list or len(mtd_list) <= 1:
return self.get_part_table_dmesg(verbose)
return [ ]
mtdtbl = re.findall(r'mtd([0-9]+): ([0-9a-fA-F]+) ([0-9a-fA-F]+) "(.*?)"', mtd_list)
if len(mtdtbl) <= 1:
return self.get_part_table_dmesg(verbose)
addr_list = self.get_part_addr_table(len(mtdtbl) - 1, verbose)
if not addr_list or addr_list[0] < 0:
return self.get_part_table_dmesg(verbose)
mtdlist = []
if self.verbose:
print("MTD partitions :")
return [ ]
partlist = [ ]
for i, mtd in enumerate(mtdtbl):
mtdid = int(mtd[0])
if mtdid != i:
raise ValueError("Incorrect mtd id")
size = int(mtd[1], 16)
name = mtd[3]
addr = addr_list[mtdid]
self.partlist.append( {'addr': addr, 'size': size, 'name': name} )
partlist.append( {'addr': -1, 'size': size, 'name': name} )
mtd_max_num = len(mtdtbl) - 1
addr_list = self.get_part_addr_table(mtd_max_num, verbose)
if not addr_list or len(addr_list) <= 1 or addr_list[1] < 0:
addr_list = self.get_part_addr_dmesg(partlist)
if not addr_list or len(addr_list) <= 1 or addr_list[1] < 0:
return [ ]
if addr_list and addr_list[0] < 0:
if partlist[0]['name']:
if partlist[0]['size'] > 0x00800000: # 8MiB
addr_list[0] = 0 # detect "ALL" part
if self.verbose:
print("MTD partitions:")
err_addr = -1
for i, part in enumerate(partlist):
size = part['size']
name = part['name']
addr = addr_list[i]
if i == 0 and addr == 0 and size > 0x00800000: # 8MiB
self.allpartnum = 0 # detect "ALL" part
part['addr'] = addr
if verbose:
print(' %2d > addr: 0x%08X size: 0x%08X name: "%s"' % (i, addr, size, name))
xaddr = ("0x%08X" % addr) if addr >= 0 else "??????????"
ro = '?'
print(' %2d > addr: %s size: 0x%08X ro:%s name: "%s"' % (i, xaddr, size, ro, name))
if addr < 0:
return []
err_addr = mtdid
if verbose:
print(" ")
if err_addr >= 0:
return [ ]
self.partlist = partlist
self.get_part_readonly()
return self.partlist
@ -225,7 +242,7 @@ class DevInfo():
if isinstance(name_or_addr, int):
addr = name_or_addr
for i, part in enumerate(self.partlist):
if part['addr'] == 0 and part['size'] > 0x00800000:
if self.allpartnum >= 0 and i == self.allpartnum:
continue # skip "ALL" part
if comptype and comptype == '#': # range
if addr >= part['addr'] and addr < part['addr'] + part['size']:
@ -673,7 +690,7 @@ class DevInfo():
else:
env.addr = part['addr']
data_size = part['size']
env.max_size = data_size
env.max_size = data_size
fn_local = 'outdir/mtd{id}_{name}.bin'.format(id=p, name=name)
fn_remote = '/tmp/env_{name}.bin'.format(name=name)
if part['size'] < 128*1024:

Loading…
Cancel
Save