mirror of
git://git.yoctoproject.org/meta-rockchip.git
synced 2025-07-05 05:04:47 +02:00

Rockchip provides a tool to customize the DDR bin blob which can prove to be extremely useful, for example if your HW doesn't follow the HW reference design and uses a different UART controller or UART mux for the serial console, or use a different baudrate. If RKBIN_DDR_RECONFIGURE is set to 1 for a machine, a ddrbin_params.txt needs to be provided for said machine and ddrbin_tool.py will be run against it to generate a new custom binary with the desired config. Note that future implementations may allow to provide configuration through a different mechanism than a simple and difficult to maintain/modify file. E.g. this doesn't really work well when one wants to have this in sync with SERIAL_CONSOLES for example. But that may be much harder to support as the serial controller index in SERIAL_CONSOLES does not necessarily match the hardware index expected by ddrbin_params.txt. It also doesn't provide the UART mux. In any case, I believe this is a decent start at allowing customization of the DDR bin blob without having to provide a blob directly in-tree. Signed-off-by: Quentin Schulz <quentin.schulz@cherry.de>
88 lines
3.5 KiB
BlitzBasic
88 lines
3.5 KiB
BlitzBasic
DESCRIPTION = "Rockchip Firmware for DDR init (TPL in U-Boot terms)"
|
|
|
|
require rockchip-rkbin.inc
|
|
|
|
DDRBIN_DIR:rk3308 ?= "bin/rk33/"
|
|
DDRBIN_VERS:rk3308 ?= "v2.10"
|
|
DDRBIN_FILE:rk3308 ?= "rk3308_ddr_589MHz_uart4_m0_${DDRBIN_VERS}.bin"
|
|
DDRBIN_DEPLOY_FILENAME:rk3308 ?= "ddr-rk3308.bin"
|
|
DDRBIN_TOOL_SOC:rk3308 ?= "rk3308"
|
|
|
|
do_deploy:rk3308() {
|
|
# Prebuilt U-Boot TPL (DDR init)
|
|
install -m 644 ${S}/${DDRBIN_DIR}${DDRBIN_FILE} ${DEPLOYDIR}/${DDRBIN_DEPLOY_FILENAME}
|
|
}
|
|
|
|
DDRBIN_DIR:rk3566 ?= "bin/rk35/"
|
|
DDRBIN_VERS:rk3566 ?= "v1.23"
|
|
DDRBIN_FILE:rk3566 ?= "rk3566_ddr_1056MHz_${DDRBIN_VERS}.bin"
|
|
DDRBIN_DEPLOY_FILENAME:rk3566 ?= "ddr-rk3566.bin"
|
|
DDRBIN_TOOL_SOC:rk3566 ?= "rk356x"
|
|
|
|
do_deploy:rk3566() {
|
|
# Prebuilt U-Boot TPL (DDR init)
|
|
install -m 644 ${S}/${DDRBIN_DIR}${DDRBIN_FILE} ${DEPLOYDIR}/${DDRBIN_DEPLOY_FILENAME}
|
|
}
|
|
|
|
DDRBIN_DIR:rk3568 ?= "bin/rk35/"
|
|
DDRBIN_VERS:rk3568 ?= "v1.23"
|
|
DDRBIN_FILE:rk3568 ?= "rk3568_ddr_1560MHz_${DDRBIN_VERS}.bin"
|
|
DDRBIN_DEPLOY_FILENAME:rk3568 ?= "ddr-rk3568.bin"
|
|
DDRBIN_TOOL_SOC:rk3568 ?= "rk356x"
|
|
|
|
do_deploy:rk3568() {
|
|
# Prebuilt U-Boot TPL (DDR init)
|
|
install -m 644 ${S}/${DDRBIN_DIR}${DDRBIN_FILE} ${DEPLOYDIR}/${DDRBIN_DEPLOY_FILENAME}
|
|
}
|
|
|
|
DDRBIN_DIR:rk3588s ?= "bin/rk35/"
|
|
DDRBIN_VERS:rk3588s ?= "v1.18"
|
|
DDRBIN_FILE:rk3588s ?= "rk3588_ddr_lp4_2112MHz_lp5_2400MHz_${DDRBIN_VERS}.bin"
|
|
DDRBIN_DEPLOY_FILENAME:rk3588s ?= "ddr-rk3588.bin"
|
|
DDRBIN_TOOL_SOC:rk3588s ?= "rk3588"
|
|
|
|
do_deploy:rk3588s() {
|
|
# Prebuilt U-Boot TPL (DDR init)
|
|
install -m 644 ${S}/${DDRBIN_DIR}${DDRBIN_FILE} ${DEPLOYDIR}/${DDRBIN_DEPLOY_FILENAME}
|
|
}
|
|
|
|
# The following is only required if DDR bin blob needs to be modified
|
|
# (e.g. different UART controller, UART mux, or baudrate)
|
|
# RKBIN_DDR_RECONFIGURE = "1" if it needs to be modified, all below logic needs to
|
|
# depend on that value be 1, and not run if 0.
|
|
RKBIN_DDR_RECONFIGURE ?= "0"
|
|
|
|
# The tool (ddrbin_tool.py) for modifying the DDR bin is from rockchip-rkbin-native...
|
|
DEPENDS += "${@'rockchip-rkbin-native' if d.getVar('RKBIN_DDR_RECONFIGURE') == '1' else ''}"
|
|
|
|
# ... and it expects a file as input, which is named ddrbin_param.txt in the tree.
|
|
SRC_URI += "${@'file://ddrbin_param.txt' if d.getVar('RKBIN_DDR_RECONFIGURE') == '1' else ''}"
|
|
|
|
python __anonymous() {
|
|
# Because rockchip-rkbin.inc inherits bin_package and we need to run some step before
|
|
# the install task re-enable do_configure task.
|
|
# We could use
|
|
# do_configure[noexec] = "${@'0' if d.getVar('RKBIN_DDR_RECONFIGURE') == '1' else '1'}"
|
|
# but this spams the console with deprecation warnings, see
|
|
# https://bugzilla.yoctoproject.org/show_bug.cgi?id=13808
|
|
if d.getVar('RKBIN_DDR_RECONFIGURE') == '1':
|
|
d.delVarFlag("do_configure", "noexec")
|
|
}
|
|
|
|
do_configure() {
|
|
if [ "${RKBIN_DDR_RECONFIGURE}" = "1" ]; then
|
|
# ddrbin_tool.py always modifies a date in the DDR blob, based on current time.
|
|
# This is bad for reproducibility and hashequiv usage, so use the commit author
|
|
# date of the last change made to the DDR bin.
|
|
# DATE must be max 17-character long!
|
|
RKBIN_DDR_DATE=$(git log --pretty=format:"%ad" --date=format:"%Y%m%d-%H:%M:%S" -1 -- ${S}/${DDRBIN_DIR}${DDRBIN_FILE})
|
|
# DDRBIN_TOOL_SOC is mostly useless except for rk3528 for now. It needs to match one string in the global
|
|
# chip_list array in ddrbin_tool.py.
|
|
if [ -z "${DDRBIN_TOOL_SOC}" ]; then
|
|
bbfatal "Non-empty DDRBIN_TOOL_SOC:<MACHINE> required!"
|
|
fi
|
|
# Modify blob with appropriate settings stored in ddrbin_params.txt
|
|
ddrbin_tool.py ${DDRBIN_TOOL_SOC} ${UNPACKDIR}/ddrbin_param.txt ${S}/${DDRBIN_DIR}${DDRBIN_FILE} --verinfo_editable "${RKBIN_DDR_DATE}"
|
|
fi
|
|
}
|