iBoot/tools/config_seq.py

106 lines
4.2 KiB
Python
Raw Permalink Normal View History

2023-07-08 13:03:17 -07:00
#!/usr/bin/python
import argparse
import collections
import pipes
import sys
WRITE_COMMAND = 0
WRITE_COMPRESSED_COMMAND = 1
READ_COMMAND = 2
WRITE64_COMMAND = 3
DELAY_COMMAND = 4
def find_string(line, word):
t = line.split()
for x in t:
if word in x:
s = x.find('=')
addr = x[s+1:]
return addr
def convert_seqto_struct(filename, sequence):
a = []
with open (filename, 'rb') as config_seq_file:
for line in config_seq_file:
if sequence in line and 'comment' not in line:
for line in config_seq_file:
if 'cfg_end' in line:
break
elif 'comment' in line or 'write_start' in line or 'write_end' in line:
continue
elif 'poll' in line:
# poll command
addr = find_string(line, 'reg_addr')
value = find_string(line, 'reg_value')
mask = find_string(line, 'reg_mask')
retryEnable = find_string(line, 'retry_en')
retryCnt = find_string(line, 'retry_cnt')
a.append((addr, value, READ_COMMAND, mask, retryEnable, retryCnt))
elif 'write64' in line:
# 64 BIT write commands
addr = find_string(line, 'reg_addr')
value = find_string(line, 'reg_value')
a.append((addr, value, WRITE64_COMMAND))
elif 'cfg_cnt' in line:
value = line.split()[1]
a.append((0, value, DELAY_COMMAND))
else:
# write commands
addr = find_string(line, 'reg_addr')
value = find_string(line, 'reg_value')
a.append((addr, value, WRITE_COMMAND))
j = 0
print 'uint32_t %s[] = {' % (sequence.split()[1])
for i in xrange(len(a)):
if WRITE_COMMAND == a[i][2]:
wrCommand = ((int(a[i][0], 16)>>10)<<6) | (1)
offCommand = (int(a[i][0], 16)>>2) & 0xff
wrDword = int(a[i][1], 16)
print '\t0x{:X}, 0x{:X}, 0x{:X},\t\t\t\t// Write'.format(wrCommand, offCommand, wrDword)
j += 3
elif READ_COMMAND == a[i][2]:
rdCommand = ((int(a[i][0], 16)>>10)<<6) | (2)
offCommand = (int(a[i][4], 16)<<16) | ((int(a[i][5], 16) & 0xFF)<<8) | ((int(a[i][0], 16)>>2) & 0xFF)
rdDataMask = int(a[i][3], 16)
rdDword = int(a[i][1], 16)
print '\t0x{:X}, 0x{:X}, 0x{:X}, 0x{:X},\t\t// Read'.format(rdCommand, offCommand, rdDataMask, rdDword)
j += 4
elif WRITE64_COMMAND == a[i][2]:
wrCommand = ((int(a[i][0], 16)>>10)<<6) | (1<<1) | (1)
offCommand = (int(a[i][0], 16)>>2) & 0xff
wrDwordLow = int(a[i][1], 16) & 0xFFFFFFFF
wrDwordHigh = (int(a[i][1], 16) >> 32) & 0xFFFFFFFF
if ((j+2) % 8) :
print '\t0x{:X}, 0x{:X}, 0x{:X}, 0x{:X}, 0x{:X},\t\t\t\t// Write'.format(wrCommand, offCommand, 0x0, wrDwordLow, wrDwordHigh)
j += 5
else:
print '\t0x{:X}, 0x{:X}, 0x{:X}, 0x{:X},\t\t\t\t// Write'.format(wrCommand, offCommand, wrDwordLow, wrDwordHigh)
j += 4
elif DELAY_COMMAND == a[i][2]:
delayCommand = (int(a[i][1], 16)<<6) | 4
print '\t0x{:X}, \t\t// Delay'.format(delayCommand)
j += 1
print '};'
def main():
argparser = argparse.ArgumentParser(description='Converts config sequence to data structures to to be programmed')
argparser.add_argument('filename')
args = argparser.parse_args()
convert_seqto_struct(args.filename, 'seq_name: awake_to_aop_ddr_pre')
convert_seqto_struct(args.filename, 'seq_name: awake_to_aop_ddr_post')
convert_seqto_struct(args.filename, 'seq_name: aop_ddr_to_s2r_aop_pre')
convert_seqto_struct(args.filename, 'seq_name: s2r_aop_to_aop_ddr_post')
convert_seqto_struct(args.filename, 'seq_name: aop_ddr_to_awake_pre')
convert_seqto_struct(args.filename, 'seq_name: aop_ddr_to_awake_post')
return 0
if __name__ == '__main__':
main()