From a909d7435d9f8b71f76d35ee40fd1d2698b08d5e Mon Sep 17 00:00:00 2001 From: Robin Krens Date: Tue, 13 Feb 2024 20:08:16 +0100 Subject: [PATCH] RAFlasher.py: read functionality --- src/RAConnect.py | 8 ++++---- src/RAFlasher.py | 43 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 47 insertions(+), 4 deletions(-) diff --git a/src/RAConnect.py b/src/RAConnect.py index 136da14..883986d 100644 --- a/src/RAConnect.py +++ b/src/RAConnect.py @@ -3,7 +3,7 @@ import time import usb.core import usb.util -MAX_TRANSFER_SIZE = 64 +MAX_TRANSFER_SIZE = 2048 + 6 # include header and footer class RAConnect: def __init__(self, vendor_id, product_id): @@ -44,10 +44,10 @@ class RAConnect: if (ep.bmAttributes == 0x02): if ep.bEndpointAddress == self.ep_in: self.rx_ep = ep - print(ep) + #print(ep) elif ep.bEndpointAddress == self.ep_out: self.tx_ep = ep - print(ep) + #print(ep) return True raise ValueError("Device does not have a serial interface") @@ -101,7 +101,7 @@ class RAConnect: while received != exp_len: buf = self.rx_ep.read(exp_len, self.timeout_ms) msg += buf - print(buf, len(buf)) + #print(buf, len(buf)) received += len(buf) if received == exp_len: return msg diff --git a/src/RAFlasher.py b/src/RAFlasher.py index a42f237..b77268e 100644 --- a/src/RAFlasher.py +++ b/src/RAFlasher.py @@ -1,6 +1,8 @@ import os import math +import time import argparse +from tqdm import tqdm from RAConnect import * from RAPacker import * @@ -66,6 +68,46 @@ def get_dev_info(dev): def verify_img(dev, img, start_addr, end_addr): raise Exception("Not implemented") +def read_img(dev, img, start_addr, end_addr): + + # calculate / check start and end address + if start_addr == None or end_addr == None: + if start_addr == None: + start_addr = 0 + # align start addr + if start_addr % SECTOR_SIZE: + raise ValueError(f"start addr not aligned on sector size {SECTOR_SIZE}") + blocks = (file_size + SECTOR_SIZE - 1) // SECTOR_SIZE + end_addr = blocks * SECTOR_SIZE + start_addr + print(end_addr) + + if (start_addr > 0xFF800): # for RA4 series + raise ValueError("start address value error") + if (end_addr <= start_addr or end_addr > 0xFF800): + raise ValueError("end address value error") + + # setup initial communication + SAD = int_to_hex_list(start_addr) + EAD = int_to_hex_list(end_addr) + packed = pack_pkt(REA_CMD, SAD + EAD) + dev.send_data(packed) + + # calculate how many packets are have to be received + nr_packet = (end_addr - start_addr) // 1024 # TODO: set other than just 1024 + print(f'Sending {nr_packet} packets to MCU') + + with open('output.bin', 'wb') as f: + for i in tqdm(range(0, nr_packet+1), desc="Reading progess"): + ret = dev.recv_data(1024 + 6) + #print(f'Packet nr: {i}') + chunk = unpack_pkt(ret) + chunky = bytes(int(x, 16) for x in chunk) + f.write(chunky) + #print(ret) + packed = pack_pkt(REA_CMD, ['0x00'], ack=True) + dev.send_data(packed) + + def write_img(dev, img, start_addr, end_addr, verify=False): if os.path.exists(img): @@ -148,6 +190,7 @@ def main(): dev.confirm_connection() get_dev_info(dev) get_area_info(dev) + read_img(dev, "save.bin", 0x0000, 0x3FFFF) else: parser.print_help() -- 2.7.4