From c7401b32b4800cdcd62f151201f171050248bf8c Mon Sep 17 00:00:00 2001 From: remittor Date: Sun, 3 Mar 2024 13:34:25 +0300 Subject: [PATCH] [install_fw] Add support for ubi-loader --- install_fw.py | 102 ++++++++++++++++++++++++++++++++------------------ 1 file changed, 66 insertions(+), 36 deletions(-) diff --git a/install_fw.py b/install_fw.py index c4fc21d..009f44b 100644 --- a/install_fw.py +++ b/install_fw.py @@ -467,7 +467,7 @@ class XqFlash(): fit_size = get_dtb_totalsize(data, offset) if fit_size <= 0: die('FIT: Incorrect image (1)') - if fit_size < 1*1024*1024: + if fit_size < 200*1024: die('FIT: Incorrect image (2)') data = data[offset:offset+fit_size] if image: @@ -487,46 +487,76 @@ class XqFlash(): def_cfg_name = cfg_list.get_property('default').value print(f'FIT: def_cfg: "{def_cfg_name}"') def_cfg = fit_dt.get_node(f'/configurations/{def_cfg_name}') - def_fdt_name = def_cfg.get_property('fdt').value - print(f'FIT: def_fdt: "{def_fdt_name}"') - fdt1 = self.get_fdt_node(fit_dt, f'/images/{def_fdt_name}') - print('FDT: desc = "{}"'.format(fdt1.get_property('description').value)) - print('FDT: type = "{}"'.format(fdt1.get_property('type').value)) - print('FDT: arch = "{}"'.format(fdt1.get_property('arch').value)) - if fdt1.get_property('type').value != 'flat_dt': - die('FIT: Incorrect image (6)') - if fdt1.get_property('compression').value != 'none': - die('FIT: Incorrect image (7)') - kernel.hdr.arch = fdt1.get_property('arch').value - krn1 = self.get_fdt_node(fit_dt, '/images/kernel*1') - print('KRN: desc = "{}"'.format(krn1.get_property('description').value)) - print('KRN: type = "{}"'.format(krn1.get_property('type').value)) - print('KRN: arch = "{}"'.format(krn1.get_property('arch').value)) - print('KRN: compression = "{}"'.format(krn1.get_property('compression').value)) - krn_size = len(krn1.get_property("data")) - print(f'KRN: data = {krn_size} bytes') - - krn_dt_data = fdt1.get_property('data') - if hasattr(krn_dt_data, 'raw_value'): - krn_dt_data = krn_dt_data.raw_value + def_cfg_desc = def_cfg.get_property('description').value + print(f'FIT: def_cfg desc = "{def_cfg_desc}"') + + ubi_loader = False + fit_model = '' + if 'xiaomi_' in def_cfg_desc: + x = def_cfg_desc.find('xiaomi_') + fit_model = 'xiaomi,' + def_cfg_desc[x+7:] + print(f'FIT: model = "{fit_model}"') + + def_fdt = def_cfg.get_property('fdt') + + if not def_fdt: + krn1 = self.get_fdt_node(fit_dt, '/images/kernel*1') + krn1desc = krn1.get_property('description').value + print(f'KRN: desc = "{krn1desc}"') + if 'Linux-u-boot' not in krn1desc: + die('FIT: Incorrect image (5)') + print(f'Linux-u-boot image founded! (detect ubi-loader)') + ubi_loader = True + if not fit_model: + die('FIT: Incorrect image (5)(1) ') else: - krn_dt_data = krn_dt_data.data - dt = fdt.parse_dtb(krn_dt_data) - self.krn_dt = dt - dt_tree = dt.info(props = True) - #with open('dt_tree.txt', "w") as file: - # file.write(dt_tree) - dt_compat = dt.get_property('compatible') - print('FDT:', dt_compat) - dt_model = dt.get_property('model').value - print(f'FDT: model = "{dt_model}"') + def_fdt_name = def_fdt.value + print(f'FIT: def_fdt: "{def_fdt_name}"') + fdt1 = self.get_fdt_node(fit_dt, f'/images/{def_fdt_name}') + print('FDT: desc = "{}"'.format(fdt1.get_property('description').value)) + print('FDT: type = "{}"'.format(fdt1.get_property('type').value)) + print('FDT: arch = "{}"'.format(fdt1.get_property('arch').value)) + if fdt1.get_property('type').value != 'flat_dt': + die('FIT: Incorrect image (6)') + if fdt1.get_property('compression').value != 'none': + die('FIT: Incorrect image (7)') + kernel.hdr.arch = fdt1.get_property('arch').value + krn1 = self.get_fdt_node(fit_dt, '/images/kernel*1') + print('KRN: desc = "{}"'.format(krn1.get_property('description').value)) + print('KRN: type = "{}"'.format(krn1.get_property('type').value)) + print('KRN: arch = "{}"'.format(krn1.get_property('arch').value)) + print('KRN: compression = "{}"'.format(krn1.get_property('compression').value)) + krn_size = len(krn1.get_property("data")) + print(f'KRN: data = {krn_size} bytes') + + krn_dt_data = fdt1.get_property('data') + if hasattr(krn_dt_data, 'raw_value'): + krn_dt_data = krn_dt_data.raw_value + else: + krn_dt_data = krn_dt_data.data + dt = fdt.parse_dtb(krn_dt_data) + self.krn_dt = dt + dt_tree = dt.info(props = True) + #with open('dt_tree.txt', "w") as file: + # file.write(dt_tree) + dt_compat = dt.get_property('compatible') + print('FDT:', dt_compat) + dt_model = dt.get_property('model').value + print(f'FDT: model = "{dt_model}"') + + if ubi_loader: + dt = None + dt_compat = [ fit_model ] + dt_model = None + if not self.img_stock: cm = self.check_model(dt_compat, dt_model) if cm < 0: die(f'FIT: Loaded firmware not compatible with "{gw.device_name}" !!!') - dt_part = self.get_fdt_node_by_name(dt, 'partitions', 'fixed-partitions') - print(f'FDT: dt_part: {dt_part}') + if dt: + dt_part = self.get_fdt_node_by_name(dt, 'partitions', 'fixed-partitions') + print(f'FDT: dt_part: {dt_part}') kernel.fit = True if self.img_stock: @@ -724,7 +754,7 @@ class XqFlash(): return 0 # unknown compat_list = compat if isinstance(compat, str): - compat_list = [ x.strip() for x in compat.split(',') ] + compat_list = [ x.strip() for x in compat.split(';') ] dn = gw.device_name if dn not in xqmodel.xqModelList: return 0 # unknown