Brian Sune 3ba9b1f7bd Cyclone V Board handsoff script
Since turning from old build flow.
New Altera SoCFPGA requires converting handsoff
conversion via the python script. This is from
official provided, and now sync to U-Boot with
better location at tools/cv_xxxx. Meantime,
requirement.txt is also provided to further
explain the libraries require for these scripts.

Signed-off-by: Brian Sune <briansune@gmail.com>
Reviewed-by: Tien Fong Chee <tien.fong.chee@altera.com>
2025-12-01 14:01:12 +08:00

197 lines
8.2 KiB
Python
Executable File

# SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
"""
Document renderer class for preloader source files
Each document renderer takes care of a full construction of
a specific file format using the required data model.
Copyright (C) 2022 Intel Corporation <www.intel.com>
Author: Lee, Kah Jing <kah.jing.lee@intel.com>
"""
import collections
import doc
class pll_config_h:
"""
pll_config.h renderer.
"""
def __init__(self, hpsModel, emifModel):
""" renderer initialization """
self.hpsModel = hpsModel
self.emifModel = emifModel
self.doc = doc.generated_c_source("__SOCFPGA_PLL_CONFIG_H__")
def createContent(self):
""" add the content based on settings parsed. eventually it will be
written to pll_config.h file
"""
doc.c_source.line(self.doc)
id = "CFG_HPS_DBCTRL_STAYOSC1"
valueString = self.hpsModel.getSystemConfig("dbctrl_stayosc1")
# Unfortunately hps.xml never tells us the data type of values
# attributes. Here we workaround this type of problem, often
# this is case-by-case, i.e. having to know which parameter that
# we're dealing with, hence this ugly parameter-specific
# if-statement needs here to workaround the data type inconsistency
if valueString.lower() == "true":
value = "1"
else:
value = "0"
doc.c_source.define(self.doc, id, value )
doc.c_source.line(self.doc)
self.addMainPllSettings()
doc.c_source.line(self.doc)
self.addPeriphPllSettings()
doc.c_source.line(self.doc)
self.addSdramPllSettings()
doc.c_source.line(self.doc)
self.addClockFreq()
doc.c_source.line(self.doc)
self.addAlteraSettings()
doc.c_source.line(self.doc)
def addMainPllSettings(self):
""" add pll settings to the file """
paramMap = collections.OrderedDict()
paramMap["VCO_DENOM"] = "main_pll_n"
paramMap["VCO_NUMER"] = "main_pll_m"
for key in paramMap.keys():
id = "CFG_HPS_MAINPLLGRP_" + key
value = self.hpsModel.getSystemConfig(paramMap[key])
doc.c_source.define(self.doc, id, value )
# main_pll_c0, main_pll_c1, main_pll_c2 are fixed counters,
doc.c_source.define(self.doc, "CFG_HPS_MAINPLLGRP_MPUCLK_CNT", "0")
doc.c_source.define(self.doc, "CFG_HPS_MAINPLLGRP_MAINCLK_CNT", "0")
doc.c_source.define(self.doc, "CFG_HPS_MAINPLLGRP_DBGATCLK_CNT", "0")
paramMap = collections.OrderedDict()
paramMap["MAINQSPICLK_CNT"] = "main_pll_c3"
paramMap["MAINNANDSDMMCCLK_CNT"] = "main_pll_c4"
paramMap["CFGS2FUSER0CLK_CNT"] = "main_pll_c5"
paramMap["MAINDIV_L3MPCLK"] = "l3_mp_clk_div"
paramMap["MAINDIV_L3SPCLK"] = "l3_sp_clk_div"
paramMap["MAINDIV_L4MPCLK"] = "l4_mp_clk_div"
paramMap["MAINDIV_L4SPCLK"] = "l4_sp_clk_div"
paramMap["DBGDIV_DBGATCLK"] = "dbg_at_clk_div"
paramMap["DBGDIV_DBGCLK"] = "dbg_clk_div"
paramMap["TRACEDIV_TRACECLK"] = "dbg_trace_clk_div"
paramMap["L4SRC_L4MP"] = "l4_mp_clk_source"
paramMap["L4SRC_L4SP"] = "l4_sp_clk_source"
for key in paramMap.keys():
id = "CFG_HPS_MAINPLLGRP_" + key
value = self.hpsModel.getSystemConfig(paramMap[key])
doc.c_source.define(self.doc, id, value )
def addPeriphPllSettings(self):
""" add peripheral pll settings to the file """
paramMap = collections.OrderedDict()
paramMap["VCO_DENOM"] = "periph_pll_n"
paramMap["VCO_NUMER"] = "periph_pll_m"
paramMap["VCO_PSRC"] = "periph_pll_source"
paramMap["EMAC0CLK_CNT"] = "periph_pll_c0"
paramMap["EMAC1CLK_CNT"] = "periph_pll_c1"
paramMap["PERQSPICLK_CNT"] = "periph_pll_c2"
paramMap["PERNANDSDMMCCLK_CNT"] = "periph_pll_c3"
paramMap["PERBASECLK_CNT"] = "periph_pll_c4"
paramMap["S2FUSER1CLK_CNT"] = "periph_pll_c5"
paramMap["DIV_USBCLK"] = "usb_mp_clk_div"
paramMap["DIV_SPIMCLK"] = "spi_m_clk_div"
paramMap["DIV_CAN0CLK"] = "can0_clk_div"
paramMap["DIV_CAN1CLK"] = "can1_clk_div"
paramMap["GPIODIV_GPIODBCLK"] = "gpio_db_clk_div"
paramMap["SRC_SDMMC"] = "sdmmc_clk_source"
paramMap["SRC_NAND"] = "nand_clk_source"
paramMap["SRC_QSPI"] = "qspi_clk_source"
for key in paramMap.keys():
id = "CFG_HPS_PERPLLGRP_" + key
value = self.hpsModel.getSystemConfig(paramMap[key])
doc.c_source.define(self.doc, id, value )
def addSdramPllSettings(self):
""" add sdram pll settings to the file """
value = self.emifModel.getPllDefine("PLL_MEM_CLK_DIV")
doc.c_source.define(self.doc, "CFG_HPS_SDRPLLGRP_VCO_DENOM", value )
value = self.emifModel.getPllDefine("PLL_MEM_CLK_MULT")
doc.c_source.define(self.doc, "CFG_HPS_SDRPLLGRP_VCO_NUMER", value )
doc.c_source.define(self.doc, "CFG_HPS_SDRPLLGRP_VCO_SSRC", "0")
doc.c_source.define(self.doc, "CFG_HPS_SDRPLLGRP_DDRDQSCLK_CNT", "1")
value = self.emifModel.getPllDefine("PLL_MEM_CLK_PHASE_DEG")
doc.c_source.define(self.doc, "CFG_HPS_SDRPLLGRP_DDRDQSCLK_PHASE", value )
doc.c_source.define(self.doc, "CFG_HPS_SDRPLLGRP_DDR2XDQSCLK_CNT", "0")
doc.c_source.define(self.doc, "CFG_HPS_SDRPLLGRP_DDR2XDQSCLK_PHASE", "0")
doc.c_source.define(self.doc, "CFG_HPS_SDRPLLGRP_DDRDQCLK_CNT", "1")
value = self.emifModel.getPllDefine("PLL_WRITE_CLK_PHASE_DEG")
doc.c_source.define(self.doc, "CFG_HPS_SDRPLLGRP_DDRDQCLK_PHASE", value )
try:
value = self.hpsModel.getSystemConfig("sdram_pll_c5")
except ValueError:
value = "5"
doc.c_source.define(self.doc, "CFG_HPS_SDRPLLGRP_S2FUSER2CLK_CNT", value )
doc.c_source.define(self.doc, "CFG_HPS_SDRPLLGRP_S2FUSER2CLK_PHASE", "0")
def addClockFreq(self):
""" add clock frequency settings to the file """
paramMap = collections.OrderedDict()
paramMap["OSC1"] = "eosc1_clk_hz"
paramMap["OSC2"] = "eosc2_clk_hz"
paramMap["F2S_SDR_REF"] = "F2SCLK_SDRAMCLK_FREQ"
paramMap["F2S_PER_REF"] = "F2SCLK_PERIPHCLK_FREQ"
paramMap["MAINVCO"] = "main_pll_vco_hz"
paramMap["PERVCO"] = "periph_pll_vco_hz"
for key in paramMap.keys():
id = "CFG_HPS_CLK_" + key + "_HZ"
value = self.hpsModel.getSystemConfig(paramMap[key])
doc.c_source.define(self.doc, id, value )
eosc1 = int(self.hpsModel.getSystemConfig("eosc1_clk_hz"))
eosc2 = int(self.hpsModel.getSystemConfig("eosc2_clk_hz"))
m = int(self.emifModel.getPllDefine("PLL_MEM_CLK_MULT"))
n = int(self.emifModel.getPllDefine("PLL_MEM_CLK_DIV"))
vco = int(round(eosc1 * (m + 1) / (n + 1)))
doc.c_source.define(self.doc, "CFG_HPS_CLK_SDRVCO_HZ", str(vco) )
paramMap = collections.OrderedDict()
paramMap["EMAC0"] = "emac0_clk_hz"
paramMap["EMAC1"] = "emac1_clk_hz"
paramMap["USBCLK"] = "usb_mp_clk_hz"
paramMap["NAND"] = "nand_clk_hz"
paramMap["SDMMC"] = "sdmmc_clk_hz"
paramMap["QSPI"] = "qspi_clk_hz"
paramMap["SPIM"] = "spi_m_clk_hz"
paramMap["CAN0"] = "can0_clk_hz"
paramMap["CAN1"] = "can1_clk_hz"
paramMap["GPIODB"] = "gpio_db_clk_hz"
paramMap["L4_MP"] = "l4_mp_clk_hz"
paramMap["L4_SP"] = "l4_sp_clk_hz"
for key in paramMap.keys():
id = "CFG_HPS_CLK_" + key + "_HZ"
value = self.hpsModel.getSystemConfig(paramMap[key])
doc.c_source.define(self.doc, id, value )
def addAlteraSettings(self):
""" add Altera-related settings to the file """
paramMap = collections.OrderedDict()
paramMap["MPUCLK"] = "main_pll_c0_internal"
paramMap["MAINCLK"] = "main_pll_c1_internal"
paramMap["DBGATCLK"] = "main_pll_c2_internal"
for key in paramMap.keys():
id = "CFG_HPS_ALTERAGRP_" + key
value = self.hpsModel.getSystemConfig(paramMap[key])
doc.c_source.define(self.doc, id, value )
def __str__(self):
""" convert to string """
self.createContent()
return str(self.doc)