@ -1,4 +1,4 @@
#!/usr/bin/env python2
#!/usr/bin/env python
"""
"""
A script to generate FIT image source for rockchip boards
A script to generate FIT image source for rockchip boards
with ARM Trusted Firmware
with ARM Trusted Firmware
@ -34,7 +34,7 @@ DT_HEADER="""// SPDX-License-Identifier: GPL-2.0+ OR X11
#address-cells = <1>;
#address-cells = <1>;
images {
images {
uboot @ 1 {
uboot {
description = " U-Boot (64-bit) " ;
description = " U-Boot (64-bit) " ;
data = / incbin / ( " u-boot-nodtb.bin " ) ;
data = / incbin / ( " u-boot-nodtb.bin " ) ;
type = " standalone " ;
type = " standalone " ;
@ -43,6 +43,7 @@ DT_HEADER="""// SPDX-License-Identifier: GPL-2.0+ OR X11
compression = " none " ;
compression = " none " ;
load = < 0 x % 08 x > ;
load = < 0 x % 08 x > ;
} ;
} ;
"""
"""
DT_IMAGES_NODE_END = """
DT_IMAGES_NODE_END = """
@ -53,23 +54,23 @@ DT_END="""
} ;
} ;
"""
"""
def append_atf_node ( file , atf_index , phy_addr ) :
def append_atf_node ( file , atf_index , phy_addr , elf_entry ) :
"""
"""
Append ATF DT node to input FIT dts file .
Append ATF DT node to input FIT dts file .
"""
"""
data = ' bl31_0x %08x .bin ' % phy_addr
data = ' bl31_0x %08x .bin ' % phy_addr
print >> file , ' \t \t atf@ %d { ' % atf_index
file . write ( ' \t \t atf_ %d { \n ' % atf_index )
print >> file , ' \t \t \t description = \" ARM Trusted Firmware \" ; '
file . write ( ' \t \t \t description = \" ARM Trusted Firmware \" ; \n ')
print >> file , ' \t \t \t data = /incbin/( " %s " ); ' % data
file . write ( ' \t \t \t data = /incbin/( " %s " ); \n ' % data )
print >> file , ' \t \t \t type = " firmware " ; '
file . write ( ' \t \t \t type = " firmware " ; \n ')
print >> file , ' \t \t \t arch = " arm64 " ; '
file . write ( ' \t \t \t arch = " arm64 " ; \n ')
print >> file , ' \t \t \t os = " arm-trusted-firmware " ; '
file . write ( ' \t \t \t os = " arm-trusted-firmware " ; \n ')
print >> file , ' \t \t \t compression = " none " ; '
file . write ( ' \t \t \t compression = " none " ; \n ')
print >> file , ' \t \t \t load = <0x %08x >; ' % phy_addr
file . write ( ' \t \t \t load = <0x %08x >; \n ' % phy_addr )
if atf_index == 1 :
if atf_index == 1 :
print >> file , ' \t \t \t entry = <0x %08x >; ' % phy_addr
file . write ( ' \t \t \t entry = <0x %08x >; \n ' % elf_entry )
print >> file , ' \t \t }; '
file . write ( ' \t \t }; \n ')
print >> file , ' '
file . write ( ' \n ')
def append_fdt_node ( file , dtbs ) :
def append_fdt_node ( file , dtbs ) :
"""
"""
@ -78,43 +79,43 @@ def append_fdt_node(file, dtbs):
cnt = 1
cnt = 1
for dtb in dtbs :
for dtb in dtbs :
dtname = os . path . basename ( dtb )
dtname = os . path . basename ( dtb )
print >> file , ' \t \t fdt@ %d { ' % cnt
file . write ( ' \t \t fdt_ %d { \n ' % cnt )
print >> file , ' \t \t \t description = " %s " ; ' % dtname
file . write ( ' \t \t \t description = " %s " ; \n ' % dtname )
print >> file , ' \t \t \t data = /incbin/( " %s " ); ' % dtb
file . write ( ' \t \t \t data = /incbin/( " %s " ); \n ' % dtb )
print >> file , ' \t \t \t type = " flat_dt " ; '
file . write ( ' \t \t \t type = " flat_dt " ; \n ')
print >> file , ' \t \t \t compression = " none " ; '
file . write ( ' \t \t \t compression = " none " ; \n ')
print >> file , ' \t \t }; '
file . write ( ' \t \t }; \n ')
print >> file , ' '
file . write ( ' \n ')
cnt = cnt + 1
cnt = cnt + 1
def append_conf_section ( file , cnt , dtname , atf_cnt ) :
def append_conf_section ( file , cnt , dtname , atf_cnt ) :
print >> file , ' \t \t config@ %d { ' % cnt
file . write ( ' \t \t config_ %d { \n ' % cnt )
print >> file , ' \t \t \t description = " %s " ; ' % dtname
file . write ( ' \t \t \t description = " %s " ; \n ' % dtname )
print >> file , ' \t \t \t firmware = " atf@ 1 " ; '
file . write ( ' \t \t \t firmware = " atf_ 1 " ; \n ')
print >> file , ' \t \t \t loadables = " uboot@1 " , ' ,
file . write ( ' \t \t \t loadables = " uboot " , ' )
for i in range ( 1 , atf_cnt ) :
for i in range ( 1 , atf_cnt ) :
print >> file , ' " atf@ %d " ' % ( i + 1 ) ,
file . write ( ' " atf_ %d " ' % ( i + 1 ) )
if i != ( atf_cnt - 1 ) :
if i != ( atf_cnt - 1 ) :
print >> file , ' , ' ,
file . write ( ' , ' )
else :
else :
print >> file , ' ; '
file . write ( ' ; \n ')
print >> file , ' \t \t \t fdt = " fdt@ 1 " ; '
file . write ( ' \t \t \t fdt = " fdt_ 1 " ; \n ')
print >> file , ' \t \t }; '
file . write ( ' \t \t }; \n ')
print >> file , ' '
file . write ( ' \n ')
def append_conf_node ( file , dtbs , atf_cnt ) :
def append_conf_node ( file , dtbs , atf_cnt ) :
"""
"""
Append configeration nodes .
Append configeration nodes .
"""
"""
cnt = 1
cnt = 1
print >> file , ' \t configurations { '
file . write ( ' \t configurations { \n ')
print >> file , ' \t \t default = " config@ 1 " ; '
file . write ( ' \t \t default = " config_ 1 " ; \n ')
for dtb in dtbs :
for dtb in dtbs :
dtname = os . path . basename ( dtb )
dtname = os . path . basename ( dtb )
append_conf_section ( file , cnt , dtname , atf_cnt )
append_conf_section ( file , cnt , dtname , atf_cnt )
cnt = cnt + 1
cnt = cnt + 1
print >> file , ' \t }; '
file . write ( ' \t }; \n ')
print >> file , ' '
file . write ( ' \n ')
def generate_atf_fit_dts ( fit_file_name , bl31_file_name , uboot_file_name , dtbs_file_name ) :
def generate_atf_fit_dts ( fit_file_name , bl31_file_name , uboot_file_name , dtbs_file_name ) :
"""
"""
@ -127,7 +128,7 @@ def generate_atf_fit_dts(fit_file_name, bl31_file_name, uboot_file_name, dtbs_fi
num_load_seg = 0
num_load_seg = 0
p_paddr = 0xFFFFFFFF
p_paddr = 0xFFFFFFFF
with open ( uboot_file_name ) as uboot_file :
with open ( uboot_file_name , ' rb ' ) as uboot_file :
uboot = ELFFile ( uboot_file )
uboot = ELFFile ( uboot_file )
for i in range ( uboot . num_segments ( ) ) :
for i in range ( uboot . num_segments ( ) ) :
seg = uboot . get_segment ( i )
seg = uboot . get_segment ( i )
@ -137,27 +138,28 @@ def generate_atf_fit_dts(fit_file_name, bl31_file_name, uboot_file_name, dtbs_fi
assert ( p_paddr != 0xFFFFFFFF and num_load_seg == 1 )
assert ( p_paddr != 0xFFFFFFFF and num_load_seg == 1 )
print >> fit_file , DT_HEADER % p_paddr
fit_file . write ( DT_HEADER % p_paddr )
with open ( bl31_file_name ) as bl31_file :
with open ( bl31_file_name , ' rb ' ) as bl31_file :
bl31 = ELFFile ( bl31_file )
bl31 = ELFFile ( bl31_file )
elf_entry = bl31 . header [ ' e_entry ' ]
for i in range ( bl31 . num_segments ( ) ) :
for i in range ( bl31 . num_segments ( ) ) :
seg = bl31 . get_segment ( i )
seg = bl31 . get_segment ( i )
if ( ' PT_LOAD ' == seg . __getitem__ ( ELF_SEG_P_TYPE ) ) :
if ( ' PT_LOAD ' == seg . __getitem__ ( ELF_SEG_P_TYPE ) ) :
paddr = seg . __getitem__ ( ELF_SEG_P_PADDR )
paddr = seg . __getitem__ ( ELF_SEG_P_PADDR )
p = seg . __getitem__ ( ELF_SEG_P_PADDR )
p = seg . __getitem__ ( ELF_SEG_P_PADDR )
append_atf_node ( fit_file , i + 1 , paddr )
append_atf_node ( fit_file , i + 1 , paddr , elf_entry )
atf_cnt = i + 1
atf_cnt = i + 1
append_fdt_node ( fit_file , dtbs_file_name )
append_fdt_node ( fit_file , dtbs_file_name )
print >> fit_file , ' %s ' % DT_IMAGES_NODE_END
fit_file . write ( ' %s \n ' % DT_IMAGES_NODE_END )
append_conf_node ( fit_file , dtbs_file_name , atf_cnt )
append_conf_node ( fit_file , dtbs_file_name , atf_cnt )
print >> fit_file , ' %s ' % DT_END
fit_file . write ( ' %s \n ' % DT_END )
if fit_file_name != sys . stdout :
if fit_file_name != sys . stdout :
fit_file . close ( )
fit_file . close ( )
def generate_atf_binary ( bl31_file_name ) :
def generate_atf_binary ( bl31_file_name ) :
with open ( bl31_file_name ) as bl31_file :
with open ( bl31_file_name , ' rb ' ) as bl31_file :
bl31 = ELFFile ( bl31_file )
bl31 = ELFFile ( bl31_file )
num = bl31 . num_segments ( )
num = bl31 . num_segments ( )
@ -178,17 +180,17 @@ def get_bl31_segments_info(bl31_file_name):
bl31 = ELFFile ( bl31_file )
bl31 = ELFFile ( bl31_file )
num = bl31 . num_segments ( )
num = bl31 . num_segments ( )
print ' Number of Segments : %d ' % bl31 . num_segments ( )
print ( ' Number of Segments : %d ' % bl31 . num_segments ( ) )
for i in range ( num ) :
for i in range ( num ) :
print ' Segment %d ' % i
print ( ' Segment %d ' % i )
seg = bl31 . get_segment ( i )
seg = bl31 . get_segment ( i )
ptype = seg [ ELF_SEG_P_TYPE ]
ptype = seg [ ELF_SEG_P_TYPE ]
poffset = seg [ ELF_SEG_P_OFFSET ]
poffset = seg [ ELF_SEG_P_OFFSET ]
pmemsz = seg [ ELF_SEG_P_MEMSZ ]
pmemsz = seg [ ELF_SEG_P_MEMSZ ]
pfilesz = seg [ ELF_SEG_P_FILESZ ]
pfilesz = seg [ ELF_SEG_P_FILESZ ]
print ' type: %s \n filesz: %08x \n memsz: %08x \n offset: %08x ' % ( ptype , pfilesz , pmemsz , poffset )
print ( ' type: %s \n filesz: %08x \n memsz: %08x \n offset: %08x ' % ( ptype , pfilesz , pmemsz , poffset ) )
paddr = seg [ ELF_SEG_P_PADDR ]
paddr = seg [ ELF_SEG_P_PADDR ]
print ' paddr: %08x ' % paddr
print ( ' paddr: %08x ' % paddr )
def main ( ) :
def main ( ) :
uboot_elf = " ./u-boot "
uboot_elf = " ./u-boot "
@ -204,7 +206,7 @@ def main():
elif opt == " -b " :
elif opt == " -b " :
bl31_elf = val
bl31_elf = val
elif opt == " -h " :
elif opt == " -h " :
print __doc__
print ( __doc__ )
sys . exit ( 2 )
sys . exit ( 2 )
dtbs = args
dtbs = args