RAFlasher.py: argparse setup
[renesas-ra-flasher] / src / RAFlasher.py
1 import os
2 import math
3 import argparse
4 from RAConnect import *
5 from RAPacker import *
6
7 SECTOR_SIZE = 2048
8
9 def verify_img(dev, img, start_addr, end_addr):
10     raise Exception("Not implemented")
11
12 def write_img(dev, img, start_addr, end_addr, verify=False):
13
14     if os.path.exists(img):
15         file_size = os.path.getsize(img)
16     else:
17         raise Exception(f'file {img} does not exist')
18
19     # calculate / check start and end address 
20     if start_addr == None or end_addr == None:
21         if start_addr == None:
22             start_addr = 0
23         # align start addr
24         if start_addr % SECTOR_SIZE:
25             raise ValueError(f"start addr not aligned on sector size {SECTOR_SIZE}")
26         blocks = (file_size + SECTOR_SIZE - 1) // SECTOR_SIZE
27         end_addr = blocks * SECTOR_SIZE + start_addr
28         print(end_addr)
29     
30     chunk_size = 64 # max is 1024
31     if (start_addr > 0xFF800): # for RA4 series
32         raise ValueError("start address value error")
33     if (end_addr <= start_addr or end_addr > 0xFF800):
34         raise ValueError("end address value error")
35     with open(img, 'rb') as f:
36         chunk = f.read(chunk_size)
37         while chunk:
38             packed = pack_pkt(WRI_CMD, chunk)
39             print(f'Sending {len(chunk)} bytes')
40             dev.send_data(packed)
41             reply_len = 7
42             reply = dev.recv_data(reply_len)
43             #reply = b'\x81\x00\x02\x00\x00\xFE\x03' # test reply
44             if not reply == False:
45                 msg = unpack_pkt(reply)
46                 print(msg)
47             chunk = f.read(chunk_size)
48
49 def main():
50     parser = argparse.ArgumentParser(description="RA Flasher Tool")
51
52     subparsers = parser.add_subparsers(dest="command", title="Commands")
53
54     # Subparser for the write command
55     write_parser = subparsers.add_parser("write", help="Write data to flash")
56     write_parser.add_argument("--start_address", type=int, default=0x0000, help="Start address")
57     write_parser.add_argument("--end_address", type=int, help="End address")
58     write_parser.add_argument("--verify", action="store_true", help="Verify after writing")
59     write_parser.add_argument("file_name", type=str, help="File name")
60
61     # Subparser for the read command
62     read_parser = subparsers.add_parser("read", help="Read data from flash")
63     read_parser.add_argument("--start_address", type=int, default=0x000, help="Start address")
64     read_parser.add_argument("--size", type=int, default=1024, help="Size in bytes")
65     read_parser.add_argument("file_name", type=str, help="File name")
66
67     # Subparser for the info command
68     subparsers.add_parser("info", help="Show flasher information")
69
70     args = parser.parse_args()
71
72     if args.command == "write":
73         dev = RAConnect(vendor_id=0x1a86, product_id=0x7523)
74         print(args)
75         write_img(dev, args.file_name, args.start_address, args.end_address, args.verify)
76     elif args.command == "read":
77         print('read command')
78     elif args.command == "info":
79         print('info command')
80     else:
81         parser.print_help()
82
83 if __name__ == "__main__":
84     main()
85