blob: addd720d3d6e7e197550a064a6e5c394bd69a3fd [file] [log] [blame]
#!/bin/sh
####################################################################
#
# Copyright (c) 2017 NXP
# All rights reserved.
#
####################################################################
# usage:
# cat ../../imx-sc-firmware/firmware/platform/board/mx8qm_val/ddrc/ddrc_mem_map.h | ./expand_c_define.sh > ddrc_mem_map.h
# cat ../../imx-sc-firmware/firmware/platform/board/mx8qm_val/ddrc/ddr_phy_mem_map.h | ./expand_c_define.sh > ddr_phy_mem_map.h
# This script parses a register mapping file from imx-sc-firmware (C header
# file with register base addresse and register offset definitions).
#
# This script evaluates an arithmetic expression to get the register
# addresses for iMX8QM.
# Its creates new C #define for each instance of the DDR (#0, #1).
#
# This script parses a C header file like:
# '#define DDRC_MSTR(X) REG32(DDRC_BASE_ADDR(X) + 0x00)'
# and converts it to (last arithmetic expression is evaluated)
# '#define DDRC_MSTR_0 0x5c000000'
# '#define DDRC_MSTR_1 0x5c100000'
# search for the register map BASE_ADDR definition
# Search for a line like:
# #define DDR_PHY_BASE_ADDR(X) 0x5c000000 + ((X * 0x100000) + 0x10000)
base_found=0
while IFS= read -r line
do
echo "$line"
base_addr_name=$(echo "$line" | sed -n -e "s/^#define *\([^ ]*_BASE_ADDR(X)\) *\(.*\)/\1/p")
#base_addr_expr="$(echo $line | sed -n -e 's/^#define *\([^ ]*_BASE_ADDR(X)\) *\(.*\)/\2/p')"
base_addr_expr=$(echo "$line" | sed -n -e 's/^#define *\([^ ]*_BASE_ADDR(X)\) *\(.*\)$/\2/p')
#echo "$base_addr_expr"
if [ "${base_addr_name}X" != "X" ]
then
base_found=1
break
fi
done
# find register definitions and evaluate register addresses
# For example the following line:
# #define DDRC_MSTR(X) REG32(DDRC_BASE_ADDR(X) + 0x00)
# is expanded to:
# #define DDRC_MSTR_0 0x5c000000
# #define DDRC_MSTR_1 0x5c100000
while IFS= read -r line
do
echo "$line"
# substitute BASE_ADDR(X) with the macro value
line=$(echo "$line" | sed -n -e "s/${base_addr_name}/${base_addr_expr}/p")
# extract register name and arithmetic expression
reg_name=$(echo "$line" | sed -n -e "s/^#define *\([^(]*\)(X)[[:space:]]*REG32(\(.*\))$/\1/p")
reg_value=$(echo "$line" | sed -n -e "s/^#define *\([^(]*\)(X)[[:space:]]*REG32(\(.*\))$/\2/p")
#echo "$reg_name" "$reg_value"
if [ "${reg_name}X" != "X" ]
then
# enumerate X from 0 to the number of DDR
for instance in 0 1
do
tmp=$(echo "$reg_value" | sed -n -e "s/(X/(${instance}/p")
printf "#define %-23s 0x%x\n" "${reg_name}_${instance}" $(($tmp))
done
fi
done
exit 0