106 lines
4.2 KiB
Python
106 lines
4.2 KiB
Python
|
#!/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()
|
||
|
|