Skip to content

Commit 36cd459

Browse files
author
Bjoern Kerler
committed
MDM9x60 support. Multiple usb fixes. Improved streaming stuff
1 parent 39984f7 commit 36cd459

14 files changed

+529
-234
lines changed

Library/firehose.py

+10-9
Original file line numberDiff line numberDiff line change
@@ -190,9 +190,10 @@ def xmlsend(self, data, skipresponse=False):
190190
self.cdc.write(data, self.cfg.MaxXMLSizeInBytes)
191191
else:
192192
self.cdc.write(bytes(data, 'utf-8'), self.cfg.MaxXMLSizeInBytes)
193+
time.sleep(0.01)
193194
rdata = bytearray()
194195
counter = 0
195-
timeout = 3
196+
timeout = 30
196197
resp = {"value": "NAK"}
197198
status = False
198199
if not skipresponse:
@@ -201,7 +202,7 @@ def xmlsend(self, data, skipresponse=False):
201202
tmp = self.cdc.read(self.cfg.MaxXMLSizeInBytes)
202203
if tmp == b"":
203204
counter += 1
204-
time.sleep(0.3)
205+
time.sleep(0.05)
205206
if counter > timeout:
206207
break
207208
rdata += tmp
@@ -380,7 +381,7 @@ def cmd_program(self, physical_partition_number, start_sector, filename, display
380381
data += self.modules.addprogram()
381382
data += f"/>\n</data>"
382383
rsp = self.xmlsend(data)
383-
time.sleep(0.01)
384+
#time.sleep(0.01)
384385
if display:
385386
print_progress(prog, 100, prefix='Progress:', suffix='Complete', bar_length=50)
386387
if rsp[0]:
@@ -410,7 +411,7 @@ def cmd_program(self, physical_partition_number, start_sector, filename, display
410411
print_progress(prog, 100, prefix='Progress:', suffix='Complete', bar_length=50)
411412

412413
self.cdc.write(b'', self.cfg.MaxPayloadSizeToTargetInBytes)
413-
time.sleep(0.2)
414+
#time.sleep(0.2)
414415
info = self.xml.getlog(self.cdc.read(self.cfg.MaxXMLSizeInBytes))
415416
rsp = self.xml.getresponse(self.cdc.read(self.cfg.MaxXMLSizeInBytes))
416417
if "value" in rsp:
@@ -455,7 +456,7 @@ def cmd_program_buffer(self, physical_partition_number, start_sector, wfdata, di
455456
data += self.modules.addprogram()
456457
data += f"/>\n</data>"
457458
rsp = self.xmlsend(data)
458-
time.sleep(0.01)
459+
#time.sleep(0.01)
459460
if display:
460461
print_progress(prog, 100, prefix='Progress:', suffix='Complete', bar_length=50)
461462
if rsp[0]:
@@ -484,7 +485,7 @@ def cmd_program_buffer(self, physical_partition_number, start_sector, wfdata, di
484485
print_progress(prog, 100, prefix='Progress:', suffix='Complete', bar_length=50)
485486

486487
self.cdc.write(b'', self.cfg.MaxPayloadSizeToTargetInBytes)
487-
time.sleep(0.2)
488+
#time.sleep(0.2)
488489
info = self.xml.getlog(self.cdc.read(self.cfg.MaxXMLSizeInBytes))
489490
rsp = self.xml.getresponse(self.cdc.read(self.cfg.MaxXMLSizeInBytes))
490491
if "value" in rsp:
@@ -525,7 +526,7 @@ def cmd_erase(self, physical_partition_number, start_sector, num_partition_secto
525526
data += self.modules.addprogram()
526527
data += f"/>\n</data>"
527528
rsp = self.xmlsend(data)
528-
time.sleep(0.01)
529+
#time.sleep(0.01)
529530
if display:
530531
print_progress(prog, 100, prefix='Progress:', suffix='Complete', bar_length=50)
531532
if rsp[0]:
@@ -542,7 +543,7 @@ def cmd_erase(self, physical_partition_number, start_sector, num_partition_secto
542543
bytesToWrite -= wlen
543544
pos += wlen
544545
self.cdc.write(b'', self.cfg.MaxPayloadSizeToTargetInBytes)
545-
time.sleep(0.2)
546+
#time.sleep(0.2)
546547
info = self.xml.getlog(self.cdc.read(self.cfg.MaxXMLSizeInBytes))
547548
rsp = self.xml.getresponse(self.cdc.read(self.cfg.MaxXMLSizeInBytes))
548549
if "value" in rsp:
@@ -584,7 +585,7 @@ def cmd_read(self, physical_partition_number, start_sector, num_partition_sector
584585
f" start_sector=\"{cursector}\"/>\n</data>"
585586

586587
rsp = self.xmlsend(data, self.skipresponse)
587-
time.sleep(0.01)
588+
#time.sleep(0.01)
588589
if rsp[0]:
589590
if "value" in rsp[1]:
590591
if rsp[1]["value"] == "NAK":

Library/firehose_client.py

+17-17
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
from Library.xmlparser import xmlparser
99
from Library.utils import do_tcp_server
1010
from Config.qualcomm_config import memory_type
11-
from Library.utils import LogBase
11+
from Library.utils import LogBase, getint
1212
try:
1313
import xml.etree.cElementTree as ET
1414
from xml.etree import cElementTree as ElementTree
@@ -38,8 +38,8 @@ def __init__(self, arguments, cdc, sahara, loglevel, printer):
3838
self.cfg.ZLPAwareHost = 1
3939
self.cfg.SkipStorageInit = arguments["--skipstorageinit"]
4040
self.cfg.SkipWrite = arguments["--skipwrite"]
41-
self.cfg.MaxPayloadSizeToTargetInBytes = int(arguments["--maxpayload"], 16)
42-
self.cfg.SECTOR_SIZE_IN_BYTES = int(arguments["--sectorsize"], 16)
41+
self.cfg.MaxPayloadSizeToTargetInBytes = getint(arguments["--maxpayload"])
42+
self.cfg.SECTOR_SIZE_IN_BYTES = getint(arguments["--sectorsize"])
4343
self.cfg.bit64 = sahara.bit64
4444
devicemodel = ""
4545
skipresponse = False
@@ -427,8 +427,8 @@ def handle_firehose(self, cmd, options):
427427
self.__logger.error("Peek command isn't supported by edl loader")
428428
return False
429429
else:
430-
offset = int(options["<offset>"], 16)
431-
length = int(options["<length>"], 16)
430+
offset = getint(options["<offset>"])
431+
length = getint(options["<length>"])
432432
filename = options["<filename>"]
433433
self.firehose.cmd_peek(offset, length, filename, True)
434434
self.__logger.info(
@@ -441,8 +441,8 @@ def handle_firehose(self, cmd, options):
441441
self.__logger.error("Peek command isn't supported by edl loader")
442442
return False
443443
else:
444-
offset = int(options["<offset>"], 16)
445-
length = int(options["<length>"], 16)
444+
offset = getint(options["<offset>"])
445+
length = getint(options["<length>"])
446446
resp = self.firehose.cmd_peek(offset, length, "", True)
447447
self.printer("\n")
448448
self.printer(hexlify(resp))
@@ -454,7 +454,7 @@ def handle_firehose(self, cmd, options):
454454
self.__logger.error("Peek command isn't supported by edl loader")
455455
return False
456456
else:
457-
offset = int(options["<offset>"], 16)
457+
offset = getint(options["<offset>"])
458458
resp = self.firehose.cmd_peek(offset, 8, "", True)
459459
self.printer("\n")
460460
self.printer(hex(unpack("<Q", resp[:8])[0]))
@@ -466,7 +466,7 @@ def handle_firehose(self, cmd, options):
466466
self.__logger.error("Peek command isn't supported by edl loader")
467467
return False
468468
else:
469-
offset = int(options["<offset>"], 16)
469+
offset = getint(options["<offset>"])
470470
resp = self.firehose.cmd_peek(offset, 4, "", True)
471471
self.printer("\n")
472472
self.printer(hex(unpack("<I", resp[:4])[0]))
@@ -478,7 +478,7 @@ def handle_firehose(self, cmd, options):
478478
self.__logger.error("Poke command isn't supported by edl loader")
479479
return False
480480
else:
481-
offset = int(options["<offset>"], 16)
481+
offset = getint(options["<offset>"])
482482
filename = options["<filename>"]
483483
return self.firehose.cmd_poke(offset, "", filename, True)
484484
elif cmd == "pokehex":
@@ -488,7 +488,7 @@ def handle_firehose(self, cmd, options):
488488
self.__logger.error("Poke command isn't supported by edl loader")
489489
return False
490490
else:
491-
offset = int(options["<offset>"], 16)
491+
offset = getint(options["<offset>"])
492492
data = unhexlify(options["<data>"])
493493
return self.firehose.cmd_poke(offset, data, "", True)
494494
elif cmd == "pokeqword":
@@ -498,8 +498,8 @@ def handle_firehose(self, cmd, options):
498498
self.__logger.error("Poke command isn't supported by edl loader")
499499
return False
500500
else:
501-
offset = int(options["<offset>"], 16)
502-
data = pack("<Q", int(options["<data>"], 16))
501+
offset = getint(options["<offset>"])
502+
data = pack("<Q", getint(options["<data>"]))
503503
return self.firehose.cmd_poke(offset, data, "", True)
504504
elif cmd == "pokedword":
505505
if not self.check_param(["<offset>", "<data>"]):
@@ -508,17 +508,17 @@ def handle_firehose(self, cmd, options):
508508
self.__logger.error("Poke command isn't supported by edl loader")
509509
return False
510510
else:
511-
offset = int(options["<offset>"], 16)
512-
data = pack("<I", int(options["<data>"], 16))
511+
offset = getint(options["<offset>"])
512+
data = pack("<I", getint(options["<data>"]))
513513
return self.firehose.cmd_poke(offset, data, "", True)
514514
elif cmd == "memcpy":
515515
if not self.check_param(["<offset>", "<size>"]):
516516
return False
517517
if not self.check_cmd("poke"):
518518
self.printer("Poke command isn't supported by edl loader")
519519
else:
520-
srcoffset = int(options["<offset>"], 16)
521-
size = int(options["<size>"], 16)
520+
srcoffset = getint(options["<offset>"])
521+
size = getint(options["<size>"])
522522
dstoffset = srcoffset + size
523523
if self.firehose.cmd_memcpy(dstoffset, srcoffset, size):
524524
self.printer(f"Memcpy from {hex(srcoffset)} to {hex(dstoffset)} succeeded")

Library/hdlc.py

+2
Original file line numberDiff line numberDiff line change
@@ -197,6 +197,8 @@ def send_unframed_buf(self, outdata, prefixflag):
197197
# FlushFileBuffers(ser)
198198

199199
def send_cmd_base(self, outdata, prefixflag, nocrc=False):
200+
if isinstance(outdata,str):
201+
outdata=bytes(outdata,'utf-8')
200202
packet = self.convert_cmdbuf(bytearray(outdata))
201203
if self.send_unframed_buf(packet, prefixflag):
202204
if nocrc:

Library/nand_config.py

+14-6
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,19 @@
11
import ctypes
22
from enum import Enum
33
from struct import unpack, pack
4-
4+
from Config.qualcomm_config import secgen,secureboottbl
55
c_uint8 = ctypes.c_uint8
66

77
# nandbase MSM_NAND_BASE
88
# qfprom SECURITY_CONTROL_BASE_PHYS
99
config_tbl={
1010
# bam nandbase bcraddr secureboot pbl qfprom memtbl
11-
3: ["9x25",1,0xf9af0000,0xfc401a40,0xFC4B8000 + 0x6080,[0xFC010000, 0x18000],[0xFC4B8000, 0x6000], [0x200000, 0x24000]],
12-
8: ["9x35",1,0xf9af0000,0xfc401a40,0xFC4B8000 + 0x6080,[0xFC010000, 0x18000],[0xFC4B8000, 0x6000], [0x200000, 0x24000]],
13-
10: ["9x45",1,0x79B0000,0x183f000,0xFC4B8000 + 0x6080,[0xFC010000, 0x18000],[0x58000, 0x6000],[0x200000, 0x24000]],
14-
16: ["9x55",0,0x79B0000,0x183F000,0x000a01d0,[0x100000, 0x18000],[0x000A0000, 0x6000],[0x200000, 0x24000]], #9x6x as well
15-
12: ["9x07",0,0x79B0000,0x183F000,0x000a01d0,[0x100000, 0x18000],[0x000A0000, 0x6000],[0x200000, 0x24000]]
11+
3: ["9x25",1,0xf9af0000,0xfc401a40,secureboottbl["MDM9x25"],secgen[2][0],secgen[2][1],secgen[2][2]],
12+
8: ["9x35",1,0xf9af0000,0xfc401a40,secureboottbl["MDM9x35"],secgen[2][0],secgen[2][1],secgen[2][2]],
13+
10: ["9x45",1,0x79B0000,0x183f000,secureboottbl["MDM9x45"],secgen[2][0],secgen[2][1],secgen[2][2]],
14+
16: ["9x55",0,0x79B0000,0x183f000,secureboottbl["MDM9x45"],secgen[5][0],secgen[5][1],secgen[5][2]],
15+
17: ["9x60",0,0x79B0000,0x183f000,secureboottbl["MDM9x60"],secgen[5][0],secgen[5][1],secgen[5][2]],
16+
12: ["9x07",0,0x79B0000,0x183f000,secureboottbl["MDM9607"],secgen[5][0],secgen[5][1],secgen[5][2]]
1617
}
1718

1819
supported_flash = {
@@ -264,6 +265,11 @@ def __init__(self, parent, chipset):
264265
self.BAD_BLOCK_IN_SPARE_AREA = 0
265266
self.ECC_MODE = 0
266267
self.bad_loader = 1
268+
self.secureboot=secureboottbl["MDM9607"]
269+
self.pbl=secgen[5][0]
270+
self.qfprom=secgen[5][1]
271+
self.memtbl=secgen[5][2]
272+
self.chipname = "Unknown"
267273
if chipset in config_tbl:
268274
self.chipname, self.bam, self.nandbase, self.bcraddr, self.secureboot, self.pbl, self.qfprom, self.memtbl=config_tbl[chipset]
269275
self.bad_loader = 0
@@ -274,6 +280,8 @@ def __init__(self, parent, chipset):
274280
self.chipname, self.bam, self.nandbase, self.bcraddr, self.secureboot, self.pbl, self.qfprom, self.memtbl = \
275281
config_tbl[chipid]
276282
self.bad_loader = 0
283+
if chipset==0xFF:
284+
self.bad_loader=0
277285

278286
class nand_toshiba_ids(ctypes.LittleEndianStructure):
279287
_fields_ = [

Library/sahara.py

+25-13
Original file line numberDiff line numberDiff line change
@@ -367,10 +367,24 @@ def connect(self):
367367
return ["sahara", None]
368368
elif b"<?xml" in v:
369369
return ["firehose", None]
370+
elif v[0]==0x7E:
371+
return ["nandprg", None]
370372
else:
371373
data = b"<?xml version=\"1.0\" ?><data><nop /></data>"
372-
self.cdc.write(data, 4096)
374+
self.cdc.write(data, 0x80)
373375
res = self.cdc.read()
376+
if res==b"":
377+
try:
378+
data = b"\x7E\x06\x4E\x95\x7E" # Streaming nop
379+
self.cdc.write(data, 0x80)
380+
res = self.cdc.read()
381+
if b"\x7E\x0D\x16\x00\x00\x00\x00" in res or b"Invalid Command" in res:
382+
return ["nandprg", None]
383+
else:
384+
return ["", None]
385+
except Exception as e:
386+
self.__logger.error(str(e))
387+
return ["", None]
374388
if (b"<?xml" in res):
375389
return ["firehose", None]
376390
elif len(res)>0 and res[0] == self.cmd.SAHARA_END_TRANSFER:
@@ -388,17 +402,7 @@ def connect(self):
388402

389403
except Exception as e:
390404
self.__logger.error(str(e))
391-
try:
392-
data = b"\x7E\x06\x4E\x95\x7E" # Streaming nop
393-
self.cdc.write(data, 4096)
394-
res = self.cdc.read()
395-
if b"\x7E\x0D\x16\x00\x00\x00\x00" in res:
396-
return ["nandprg", None]
397-
else:
398-
return ["", None]
399-
except Exception as e:
400-
self.__logger.error(str(e))
401-
return ["", None]
405+
402406
self.cmd_modeswitch(self.sahara_mode.SAHARA_MODE_MEMORY_DEBUG)
403407
cmd, pkt = self.get_rsp()
404408
if cmd==-1 and pkt==-1:
@@ -471,6 +475,10 @@ def info(self):
471475
self.oem_str = "{:04x}".format(self.oem_id)
472476
self.model_id = "{:04x}".format(self.model_id)
473477
self.msm_str = "{:08x}".format(self.msm_id)
478+
if self.msm_id in msmids:
479+
cpustr=f"CPU detected: \"{msmids[self.msm_id]}\"\n"
480+
else:
481+
cpustr="Unknown CPU, please send log as issue to https://github.com/bkerler/edl\n"
474482
"""
475483
if self.version >= 2.4:
476484
self.__logger.info(f"\n------------------------\n" +
@@ -486,6 +494,7 @@ def info(self):
486494
f"HWID: 0x{self.hwidstr} (MSM_ID:0x{self.msm_str}," +
487495
f"OEM_ID:0x{self.oem_str}," +
488496
f"MODEL_ID:0x{self.model_id})\n" +
497+
cpustr +
489498
f"PK_HASH: 0x{self.pkhash}\n" +
490499
f"Serial: 0x{self.serials}\n")
491500
if self.programmer == "":
@@ -563,7 +572,10 @@ def cmd_done(self):
563572

564573
def cmd_reset(self):
565574
self.cdc.write(pack("<II", self.cmd.SAHARA_RESET_REQ, 0x8))
566-
cmd, pkt = self.get_rsp()
575+
try:
576+
cmd, pkt = self.get_rsp()
577+
except:
578+
return False
567579
if cmd["cmd"] == self.cmd.SAHARA_RESET_RSP:
568580
return True
569581
elif "status" in pkt:

0 commit comments

Comments
 (0)