| #!/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 |