mirror of
https://github.com/openwrt-xiaomi/xmir-patcher.git
synced 2026-09-22 22:57:55 +03:00
[read_info] Fix detect partition addr on QCOM devices
This commit is contained in:
+29
-21
@@ -130,24 +130,31 @@ class DevInfo():
|
||||
|
||||
def get_part_addr_dmesg(self, partlist):
|
||||
if not self.dmesg:
|
||||
return [ ]
|
||||
return -1
|
||||
x = self.dmesg.find(" MTD partitions on ")
|
||||
if x <= 0:
|
||||
return [ ]
|
||||
return -2
|
||||
parttbl = re.findall(r'0x0000(.*?)-0x0000(.*?) : "(.*?)"', self.dmesg)
|
||||
if len(parttbl) <= 0:
|
||||
return [ ]
|
||||
addr_list = [ -1 ] * len(partlist)
|
||||
return -3
|
||||
k = 0
|
||||
for i, part in enumerate(parttbl):
|
||||
addr = int(part[0], 16)
|
||||
size = int(part[1], 16) - addr
|
||||
name = part[2]
|
||||
for p, data in enumerate(partlist):
|
||||
if data['name'] == name:
|
||||
addr_list[p] = addr
|
||||
#print(f"{name:12S}: {addr:08X} {size:08X}")
|
||||
if size != data['size']:
|
||||
raise ValueError(f"Incorrect size into partition table ({name})")
|
||||
return addr_list
|
||||
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})")
|
||||
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):
|
||||
verbose = verbose if verbose is not None else self.verbose
|
||||
@@ -160,23 +167,27 @@ class DevInfo():
|
||||
if len(mtdtbl) <= 1:
|
||||
return [ ]
|
||||
partlist = [ ]
|
||||
mtd_max_num = len(mtdtbl) - 1
|
||||
addr_list = self.get_part_addr_table(mtd_max_num, verbose)
|
||||
for i, mtd in enumerate(mtdtbl):
|
||||
mtdid = int(mtd[0])
|
||||
if mtdid != i:
|
||||
raise ValueError("Incorrect mtd id")
|
||||
raise ValueError(f"Incorrect mtd id = {mtdid}")
|
||||
addr = -1
|
||||
size = int(mtd[1], 16)
|
||||
name = mtd[3]
|
||||
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 addr_list and len(addr_list) > 1:
|
||||
addr = addr_list[i]
|
||||
partlist.append( {'addr': addr, 'size': size, 'name': name} )
|
||||
pass
|
||||
self.get_part_addr_dmesg(partlist)
|
||||
if partlist[0]['addr'] < 0:
|
||||
if partlist[0]['name']:
|
||||
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)
|
||||
if self.verbose:
|
||||
print("MTD partitions:")
|
||||
@@ -184,10 +195,7 @@ class DevInfo():
|
||||
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
|
||||
addr = part['addr']
|
||||
if ro_list and ro_list[i] >= 0:
|
||||
part['ro'] = False if ro_list[i] == 0 else True
|
||||
if verbose:
|
||||
|
||||
Reference in New Issue
Block a user