complete postbuild process for IAR

also reduce replicated code
pull/4438/head
Yuguo Zou 2017-02-28 19:15:49 +08:00 committed by Martin Kojtal
parent d0488c1076
commit 0894548b3d
1 changed files with 87 additions and 93 deletions

View File

@ -27,108 +27,98 @@ from datetime import datetime
RAM2_RSVD = 0x3131373835393138
def write_fixed_width_string(value, width, output):
# cut string to list & reverse
line = [value[i:i+2] for i in range(0, len(value), 2)]
output.write("".join([chr(long(b, 16)) for b in line]))
# cut string to list & reverse
line = [value[i:i+2] for i in range(0, len(value), 2)]
output.write("".join([chr(long(b, 16)) for b in line]))
def write_fixed_width_value(value, width, output):
# convert to string
line = format(value, '0%dx' % (width))
if len(line) > width:
print "[ERROR] value 0x%s cannot fit width %d" % (line, width)
sys.exit(-1)
# cut string to list & reverse
line = [line[i:i+2] for i in range(0, len(line), 2)]
line.reverse()
# convert to write buffer
output.write("".join([chr(long(b, 16)) for b in line]))
# convert to string
line = format(value, '0%dx' % (width))
if len(line) > width:
print "[ERROR] value 0x%s cannot fit width %d" % (line, width)
sys.exit(-1)
# cut string to list & reverse
line = [line[i:i+2] for i in range(0, len(line), 2)]
line.reverse()
# convert to write buffer
output.write("".join([chr(long(b, 16)) for b in line]))
def append_image_file(image, output):
input = open(image, "rb")
output.write(input.read())
input.close()
# ----------------------------
# main function
# ----------------------------
def prepend(image, sym_addr, image_prepend):
# parse input arguments
offset = 44
output_file = image_prepend
output = open(output_file, "wb")
write_fixed_width_value(os.stat(image).st_size, 8, output)
write_fixed_width_value(int(sym_addr), 8, output)
write_fixed_width_value(RAM2_RSVD, 16, output)
append_image_file(image, output)
def prepend(image, image_prepend, toolchain, info):
output = open(image_prepend, "wb")
if toolchain in ["GCC_ARM", "ARM_STD", "ARM", "ARM_MICRO"]:
write_fixed_width_value(os.stat(image).st_size, 8, output)
write_fixed_width_value(info['addr'], 8, output)
write_fixed_width_value(RAM2_RSVD, 16, output)
append_image_file(image, output)
elif toolchain == "IAR":
write_fixed_width_value(int(info['size']), 8, output)
write_fixed_width_value(int(info['addr']), 8, output)
write_fixed_width_value(RAM2_RSVD, 16, output)
with open(image, "rb") as input:
input.seek(int(info['addr']))
output.write(input.read(int(info['size'])))
output.close()
def find_section(toolchain, elf, section):
ret = None
mapfile = elf.rsplit(".", 1)[0] + ".map"
if toolchain == "GCC_ARM":
# .image2.table 0x[00000000]30000000 0x18
# 0x[00000000]30000000 __image2_start__ = .
# 0x[00000000]30000000 __image2_entry_func__ = .
with open(mapfile, 'r') as infile:
# Search area to parse
for line in infile:
if line.startswith(section):
match = re.match(r'^' + section + \
r'\s+0x0{,8}(?P<addr>[0-9A-Fa-f]{8})\s+.*$', line)
if match:
ret = match.group("addr")
break
elif toolchain in ["ARM_STD", "ARM", "ARM_MICRO"]:
# Memory Map of the image
# Load Region LR_DRAM (Base: 0x30000000, Size: 0x00006a74, Max: 0x00200000, ABSOLUTE)
# Execution Region IMAGE2_TABLE (Base: 0x30000000, Size: 0x00000018, Max: 0xffffffff, ABSOLUTE, FIXED)
# Base Addr Size Type Attr Idx E Section Name Object
# 0x30000000 0x00000004 Data RO 5257 .image2.ram.data rtl8195a_init.o
with open(mapfile, 'r') as infile:
# Search area to parse
for line in infile:
if line.startswith('Memory Map of the image'):
break
# Search section(block)
for line in infile:
match = re.match(r'^.*Region\s+' + section + \
r'\s+\(Base: 0x(?P<addr>[0-9A-Fa-f]{8}),\s+Size:.*\)$', line)
if match:
ret = match.group("addr")
break
elif toolchain == "IAR":
# Section Kind Address Size Object
# ------- ---- ------- ---- ------
# "A3": 0x8470
# IMAGE2 0x10006000 0x5d18 <Block>
# .ram_image2.text 0x10006000 0x5bbc <Block>
# .rodata const 0x10006000 0x14 retarget.o [17]
with open(mapfile, 'r') as infile:
# Search area to parse
for line in infile:
if line.startswith(' Section '):
break
# Search section(block)
for line in infile:
match = re.match(r'^\s+' + section + \
r'\s+0x(?P<addr>[0-9A-Fa-f]{8})\s+.*<Block>$', line)
if match:
ret = match.group("addr")
break
else:
def parse_section(toolchain, elf, section):
info = {'addr':None, 'size':None};
ret1 = ret2 = None
if toolchain not in ["GCC_ARM", "ARM_STD", "ARM", "ARM_MICRO", "IAR"]:
print "[ERROR] unsupported toolchain " + toolchain
sys.exit(-1)
mapfile = elf.rsplit(".", 1)[0] + ".map"
with open(mapfile, 'r') as infile:
# Search area to parse
for line in infile:
if toolchain == "GCC_ARM":
# .image2.table 0x[00000000]30000000 0x18
# 0x[00000000]30000000 __image2_start__ = .
# 0x[00000000]30000000 __image2_entry_func__ = .
match = re.match(r'^' + section + \
r'\s+0x0{,8}(?P<addr>[0-9A-Fa-f]{8})\s+.*$', line)
elif toolchain in ["ARM_STD", "ARM", "ARM_MICRO"]:
# Memory Map of the image
# Load Region LR_DRAM (Base: 0x30000000, Size: 0x00006a74, Max: 0x00200000, ABSOLUTE)
# Execution Region IMAGE2_TABLE (Base: 0x30000000, Size: 0x00000018, Max: 0xffffffff, ABSOLUTE, FIXED)
# Base Addr Size Type Attr Idx E Section Name Object
# 0x30000000 0x00000004 Data RO 5257 .image2.ram.data rtl8195a_init.o
match = re.match(r'^.*Region\s+' + section + \
r'\s+\(Base: 0x(?P<addr>[0-9A-Fa-f]{8}),\s+Size:.*\)$', line)
elif toolchain == "IAR":
# Section Kind Address Size Object
# ------- ---- ------- ---- ------
# "A3": 0x8470
# IMAGE2 0x10006000 0x5d18 <Block>
# .ram_image2.text 0x10006000 0x5bbc <Block>
# .rodata const 0x10006000 0x14 retarget.o [17]
match = re.match(r'^\s+' + section + \
r'\s+0x(?P<addr>[0-9A-Fa-f]{8})\s+0x(?P<size>[0-9A-Fa-f]+)\s+.*<Block>$', line)
if match:
ret1 = match.group("addr")
try:
ret2 = match.group("size")
except IndexError:
pass
break
if not ret:
if not ret1:
print "[ERROR] cannot find the address of section " + section
return 0
return int(ret, 16)
elif not ret2:
ret2 = '0'
if toolchain == "IAR":
print "[WARNING] cannot find the size of section " + section
info['addr'] = int(ret1, 16)
info['size'] = int(ret2, 16)
return info
# ----------------------------
# main function
@ -142,20 +132,24 @@ def rtl8195a_elf2bin(toolchain, image_elf, image_bin):
# actually it's block
img2_section = "IMAGE2"
else:
return
printf("[error] unsupported toolchain") + toolchain
return
ram2_info = {'addr':None, 'size':None}
image_name = os.path.splitext(image_elf)[0]
ram1_prepend_bin = os.path.join(TOOLS_BOOTLOADERS, "REALTEK_RTL8195AM", "ram_1_prepend.bin")
ram2_prepend_bin = image_name + '-ram_2_prepend.bin'
ram2_bin = image_name + '.bin'
ram2_addr = find_section(toolchain, image_elf, img2_section)
#print("toolchain = %s, ram2_bin = %s, ram2_addr = 0x%x" % (toolchain, ram2_bin, ram2_addr))
old_bin = image_name + '.bin'
ram2_info = parse_section(toolchain, image_elf, img2_section)
prepend(ram2_bin, ram2_addr, ram2_prepend_bin)
#print("toolchain = %s, bin name = \"%s, ram2_addr = 0x%x, ram2_size = 0x%x" % (toolchain, old_bin, ram2_info['addr'], ram2_info['size']))
prepend(old_bin, ram2_prepend_bin, toolchain, ram2_info)
# write output file
output = open(image_bin, "wb")
append_image_file(ram1_prepend_bin, output)
append_image_file(ram2_prepend_bin, output)
output.close()
#print("post built done")