You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

71 lines
1.9 KiB
Python

3 years ago
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import os
import sys
sys.path.append(os.path.dirname(os.path.abspath(__file__)))
import gateway
from gateway import die
import read_info
if len(sys.argv) <= 1:
die("Bootloader name not specified!")
bl_name = sys.argv[1]
bl_name = bl_name.strip().lower()
gw = gateway.Gateway()
dname = gw.device_name
if not gw.device_name:
die("Xiaomi Mi Wi-Fi device not found! (IP: {})".format(gateway.ip_addr))
fn_dir = 'bootloader/'
fn_remote = '/tmp/bootloader.bin'
fn_local = None
if bl_name == 'breed':
if dname != 'r3g' and dname != 'r3p' and dname != 'rm2100':
die("Breed bootloader cannot be installed on this device!")
fn_local = fn_dir + 'breed_r3g_eng.bin'
if bl_name == 'uboot':
fn_local = fn_dir + 'uboot_{}.bin'.format(gw.device_name)
if not fn_local:
die('Incorrect bootloader name!')
if not os.path.exists(fn_local):
die('File "{}" not found'.format(fn_local))
dev = read_info.DevInfo(verbose = 0, infolevel = 1)
if dev.info.cpu_arch != 'mips':
die("Currently support only MIPS arch!")
dev.get_bootloader()
if not dev.bl.img:
die("Can't dump current bootloader!")
if dev.bl.spi_rom:
die("Not support SPI Flash ROM! (now supported only NAND)")
addr = None
for p, part in enumerate(dev.partlist):
if part['addr'] == 0 and part['size'] > 0x00800000: # 8MiB
continue # skip "ALL" part
if part['addr'] == 0:
name = part['name']
fname = ''.join(e for e in name if e.isalnum())
addr = part['addr']
size = part['size']
if addr is None:
die("No matching partition found!")
gw.upload(fn_local, fn_remote)
print ('Writing data to partition "{}" (addr: {}) ...'.format(name, "0x%08X" % addr))
gw.run_cmd('mtd write {bin} "{name}"'.format(bin=fn_remote, name=name))
print('Ready! Bootloader "{}" installation is complete.'.format(bl_name))