setup.py: directory setup with pytest
[renesas-ra-flasher] / flasher / flasher.py
1 import struct
2
3 INQ_CMD = 0x00
4 ERA_CMD = 0x12
5 WRI_CMD = 0x13
6 REA_CMD = 0x15
7 IDA_CMD = 0x30
8 BAU_CMD = 0x34
9 SIG_CMD = 0x3A
10 ARE_CMD = 0x3B
11
12 OK_READ_RES = 0x15
13 OK_WRITE_RES = 0x13
14
15 LOW_PULSE = 0x00
16 GENERIC_CODE = 0x55
17 BOOT_CODE = 0xC3
18
19 TESTID = [
20     "0xF0", "0xF1", "0xF2", "0xF3",
21     "0xE4", "0xE5", "0xE6", "0xE7",
22     "0xD8", "0xD9", "0xDA", "0xDB",
23     "0xCC", "0xCD", "0xCE", "0xCF"
24 ]
25
26 def calc_sum(cmd, data):
27     data_len = len(data)
28     lnh = data_len + 1 & 0xFF00
29     lnl = data_len + 1 & 0x00FF
30     res = lnh + lnl + cmd
31     for i in range(data_len):
32             if isinstance(data[i], str):
33                 res += int(data[i], 16)
34             else:
35                 res += ord(data[i])
36     res = ~(res - 1) & 0xFF # two's complement
37     return (lnh, lnl, res)
38
39
40 # format of data packet is [SOD|LNH|LNL|COM|byte_data|SUM|ETX]
41 def format_command(cmd, data):
42     SOD = 0x01
43     COM = cmd
44
45     if isinstance(data, str):
46         byte_data = bytes(data.encode('utf-8'))
47     else:
48         byte_data = bytes([int(x, 16) for x in data])
49     
50     LNH, LNL, SUM = calc_sum(int(cmd), data)
51     ETX = 0x03
52     fmt_header = '<BBBB'
53     fmt_footer = 'BB'
54     fmt = fmt_header + str(len(data)) + 's' + fmt_footer
55     pack = struct.pack(fmt, SOD, LNH, LNL, COM, byte_data, SUM, ETX)
56     print(fmt, pack, len(pack))
57     return fmt
58
59 # format of data packet is [SOD|LNH|LNL|RES|DAT|SUM|ETX]
60 def format_data(res, data):
61     SOD = 0x81
62     if (len(data) >= 1024):
63         raise Exception(f'Data packet too large, data length is {DATA_LEN} (>1024)')
64     LNH, LNL, SUM = calc_sum(int(res), data)
65     DAT = bytes([int(x, 16) for x in data])
66     RES = res
67     ETX = 0x03
68     fmt_header = '<BBBB'
69     fmt_footer = 'BB'
70     fmt = fmt_header + str(len(data)) + 's' + fmt_footer
71     pack = struct.pack(fmt, SOD, LNH, LNL, RES, DAT, SUM, ETX)
72     print(fmt, pack, len(pack))
73
74 cmd = format_command(INQ_CMD, "")
75
76 cmd = format_command(BAU_CMD, ['0x00','0x1E'])
77
78 cmd = format_command(IDA_CMD, TESTID)
79
80 format_data(0x13, ['0x00','0x01','0x02'])
81 format_data(0x34, ['0x00'])
82 format_data(0x00, ['0x00'])
83 format_data(0x12, ['0x00'])
84
85
86