[read_info] Fix detect partition addr on QCOM devices

pull/24/head
remittor 2 years ago
parent 5b45358a6d
commit 0a6ab6d992

@ -130,24 +130,31 @@ class DevInfo():
def get_part_addr_dmesg(self, partlist): def get_part_addr_dmesg(self, partlist):
if not self.dmesg: if not self.dmesg:
return [ ] return -1
x = self.dmesg.find(" MTD partitions on ") x = self.dmesg.find(" MTD partitions on ")
if x <= 0: if x <= 0:
return [ ] return -2
parttbl = re.findall(r'0x0000(.*?)-0x0000(.*?) : "(.*?)"', self.dmesg) parttbl = re.findall(r'0x0000(.*?)-0x0000(.*?) : "(.*?)"', self.dmesg)
if len(parttbl) <= 0: if len(parttbl) <= 0:
return [ ] return -3
addr_list = [ -1 ] * len(partlist) k = 0
for i, part in enumerate(parttbl): for i, part in enumerate(parttbl):
addr = int(part[0], 16) addr = int(part[0], 16)
size = int(part[1], 16) - addr size = int(part[1], 16) - addr
name = part[2] name = part[2]
for p, data in enumerate(partlist): for p, data in enumerate(partlist):
if data['name'] == name: if data['name'] == name:
addr_list[p] = addr #print(f"{name:12S}: {addr:08X} {size:08X}")
if size != data['size']: if size != data['size']:
x = re.findall(f'mtd: partition "{name}" extends beyond the end of device "', self.dmesg)
if len(parttbl) <= 0:
raise ValueError(f"Incorrect size into partition table ({name})") raise ValueError(f"Incorrect size into partition table ({name})")
return addr_list if addr != data['addr'] and data['addr'] >= 0:
raise ValueError(f"Incorrect addr for partition ({name})")
if data['addr'] < 0:
data['addr'] = addr
k += 1
return k
def get_part_table(self, verbose = None): def get_part_table(self, verbose = None):
verbose = verbose if verbose is not None else self.verbose verbose = verbose if verbose is not None else self.verbose
@ -160,23 +167,27 @@ class DevInfo():
if len(mtdtbl) <= 1: if len(mtdtbl) <= 1:
return [ ] return [ ]
partlist = [ ] partlist = [ ]
mtd_max_num = len(mtdtbl) - 1
addr_list = self.get_part_addr_table(mtd_max_num, verbose)
for i, mtd in enumerate(mtdtbl): for i, mtd in enumerate(mtdtbl):
mtdid = int(mtd[0]) mtdid = int(mtd[0])
if mtdid != i: if mtdid != i:
raise ValueError("Incorrect mtd id") raise ValueError(f"Incorrect mtd id = {mtdid}")
addr = -1
size = int(mtd[1], 16) size = int(mtd[1], 16)
name = mtd[3] name = mtd[3]
partlist.append( {'addr': -1, 'size': size, 'name': name} ) if addr_list and len(addr_list) > 1:
mtd_max_num = len(mtdtbl) - 1 addr = addr_list[i]
addr_list = self.get_part_addr_table(mtd_max_num, verbose) partlist.append( {'addr': addr, 'size': size, 'name': name} )
if not addr_list or len(addr_list) <= 1 or addr_list[1] < 0: pass
addr_list = self.get_part_addr_dmesg(partlist) self.get_part_addr_dmesg(partlist)
if not addr_list or len(addr_list) <= 1 or addr_list[1] < 0: if partlist[0]['addr'] < 0:
return [ ]
if addr_list and addr_list[0] < 0:
if partlist[0]['name']: if partlist[0]['name']:
if partlist[0]['size'] > 0x00800000: # 8MiB if partlist[0]['size'] > 0x00800000: # 8MiB
addr_list[0] = 0 # detect "ALL" part partlist[0]['addr'] = 0 # detect "ALL" part
if partlist[0]['addr'] == 0:
if partlist[0]['size'] > 0x00800000: # 8MiB:
self.allpartnum = 0 # detect "ALL" part
ro_list = self.get_part_readonly(mtd_max_num) ro_list = self.get_part_readonly(mtd_max_num)
if self.verbose: if self.verbose:
print("MTD partitions:") print("MTD partitions:")
@ -184,10 +195,7 @@ class DevInfo():
for i, part in enumerate(partlist): for i, part in enumerate(partlist):
size = part['size'] size = part['size']
name = part['name'] name = part['name']
addr = addr_list[i] addr = part['addr']
if i == 0 and addr == 0 and size > 0x00800000: # 8MiB
self.allpartnum = 0 # detect "ALL" part
part['addr'] = addr
if ro_list and ro_list[i] >= 0: if ro_list and ro_list[i] >= 0:
part['ro'] = False if ro_list[i] == 0 else True part['ro'] = False if ro_list[i] == 0 else True
if verbose: if verbose:

Loading…
Cancel
Save