# # Author: Xilinx, Inc. # # # This program is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by the # Free Software Foundation; either version 2 of the License, or (at your # option) any later version. # # # XILINX IS PROVIDING THIS DESIGN, CODE, OR INFORMATION "AS IS" AS A # COURTESY TO YOU. BY PROVIDING THIS DESIGN, CODE, OR INFORMATION AS # ONE POSSIBLE IMPLEMENTATION OF THIS FEATURE, APPLICATION OR STANDARD, # XILINX IS MAKING NO REPRESENTATION THAT THIS IMPLEMENTATION IS FREE # FROM ANY CLAIMS OF INFRINGEMENT, AND YOU ARE RESPONSIBLE FOR OBTAINING # ANY THIRD PARTY RIGHTS YOU MAY REQUIRE FOR YOUR IMPLEMENTATION. # XILINX EXPRESSLY DISCLAIMS ANY WARRANTY WHATSOEVER WITH RESPECT TO # THE ADEQUACY OF THE IMPLEMENTATION, INCLUDING BUT NOT LIMITED TO ANY # WARRANTIES OR REPRESENTATIONS THAT THIS IMPLEMENTATION IS FREE FROM # CLAIMS OF INFRINGEMENT, IMPLIED WARRANTIES OF MERCHANTABILITY AND # FITNESS FOR A PARTICULAR PURPOSE. # # # Xilinx hardware products are not intended for use in life support # appliances, devices, or systems. Use in such applications is # expressly prohibited. # # # (c) Copyright 2002-2004 Xilinx Inc. # All rights reserved. # # # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 675 Mass Ave, Cambridge, MA 02139, USA. # # Globals lappend drvlist set ltypes "../../../sw_services/uboot_v1_00_a/data/Ltypes" proc uboot_drc {lib_handle} { puts "U-Boot DRC..." } proc generate {libname} { global drvlist # Get list of peripherals connected to uboot set conn_periphs [xget_handle $libname "ARRAY" "connected_periphs"] #lappend drvlist if {[string compare -nocase $conn_periphs ""] != 0} { set conn_periphs_elems [xget_handle $conn_periphs "ELEMENTS" "*"] # For each periph foreach periph_elem $conn_periphs_elems { set periph [xget_value $periph_elem "PARAMETER" "periph_name"] # 1. Get driver set drv [xget_swhandle $periph] set posn [lsearch -exact $drvlist $drv] if {$posn == -1} { lappend drvlist $drv } } set file_handle [xopen_include_file "xparameters.h"] puts $file_handle "\n/******************************************************************/\n" puts $file_handle "/* U-Boot Redefines */" puts $file_handle "\n/******************************************************************/\n" close $file_handle foreach drv $drvlist { set drvname [xget_value $drv "NAME"] #Redefines xparameters.h if {[string compare -nocase $drvname "uartns550"] == 0} { xredefine_uartns550 $drv "xparameters.h" } elseif {[string compare -nocase $drvname "emac"] == 0} { xredefine_emac $drv "xparameters.h" } elseif {[string compare -nocase $drvname "iic"] == 0} { xredefine_iic $drv "xparameters.h" } } } # define core_clock xredefine_params $libname "xparameters.h" "CORE_CLOCK_FREQ_HZ" # define the values for the persistent storage in IIC xredefine_params $libname "xparameters.h" "IIC_PERSISTENT_BASEADDR" "IIC_PERSISTENT_HIGHADDR" "IIC_PERSISTENT_EEPROMADDR" } proc xget_corefreq {} { set processor [xget_processor] set name [xget_value $processor "NAME"] puts "procname : $name" set processor_driver [xget_swhandle [xget_value $processor "NAME"]] puts "procdrv : $processor_driver" if {[string compare -nocase $processor_driver ""] != 0} { set arg "CORE_CLOCK_FREQ_HZ" #set retval [xget_value $processor_driver "PARAMETER" $arg] set retval [xget_dname [xget_value $processor_driver "NAME"] $arg] return $retval } } # procedure that adds # defines to xparameters.h as XPAR_argument proc xredefine_params {handle file_name args} { puts "xredfine ..." # Open include file set file_handle [xopen_include_file $file_name] puts "args : $args" foreach arg $args { if {[string compare -nocase $arg "CORE_CLOCK_FREQ_HZ"] == 0} { set value [xget_corefreq] puts "corefreq : $value" } else { set value [xget_value $handle "PARAMETER" $arg] puts "value : $value" } if {$value != ""} { set value [xformat_addr_string $value $arg] if {[string compare -nocase $arg "IIC_PERSISTENT_BASEADDR"] == 0} { set name "PERSISTENT_0_IIC_0_BASEADDR" } elseif {[string compare -nocase $arg "IIC_PERSISTENT_HIGHADDR"] == 0} { set name "PERSISTENT_0_IIC_0_HIGHADDR" } elseif {[string compare -nocase $arg "IIC_PERSISTENT_EEPROMADDR"] == 0} { set name "PERSISTENT_0_IIC_0_EEPROMADDR" } else { set name [string toupper $arg] } set name [format "XPAR_%s" $name] puts $file_handle "#define $name $value" } } puts $file_handle "\n/******************************************************************/\n" close $file_handle } # uart redefines... proc xredefine_uartns550 {drvhandle file_name} { xredefine_include_file $drvhandle $file_name "uartns550" "C_BASEADDR" "C_HIGHADDR" "CLOCK_HZ" "DEVICE_ID" } proc xredefine_emac {drvhandle file_name} { xredefine_include_file $drvhandle $file_name "emac" "C_BASEADDR" "C_HIGHADDR" "C_DMA_PRESENT" "C_MII_EXIST" "C_ERR_COUNT_EXIST" "DEVICE_ID" } proc xredefine_iic {drvhandle file_name} { xredefine_include_file $drvhandle $file_name "iic" "C_BASEADDR" "C_HIGHADDR" "C_TEN_BIT_ADR" "DEVICE_ID" } ####################### proc xredefine_include_file {drv_handle file_name drv_string args} { # Open include file set file_handle [xopen_include_file $file_name] # Get all peripherals connected to this driver set periphs [xget_periphs $drv_handle] set pname [format "XPAR_%s_" [string toupper $drv_string]] # Print all parameters for all peripherals set device_id 0 set sub_periphs 1 foreach periph $periphs { puts "$periph : $drv_string : $sub_periphs" for {set i 0} {$i < $sub_periphs} {incr i} { foreach arg $args { set name "${pname}${device_id}_" if {[string compare -nocase "CLOCK_HZ" $arg] == 0} { set xdrv_string [format "%s%s" "X" $drv_string] set value [xget_dname $xdrv_string $arg] set name "${name}CLOCK_FREQ_HZ" } else { if {[string match C_* $arg]} { set name [format "%s%s" $name [string range $arg 2 end]] } else { set name "${name}${arg}" } set value [xget_name $periph $arg] } if {[string compare -nocase "uartns550" $drv_string] == 0} { if {[string compare -nocase "C_BASEADDR" $arg] == 0} { set value [format "(%s%s%s)" $value "+" "0x1000"] } } puts $file_handle "#define $name $value" if {[string compare -nocase "DEVICE_ID" $arg] == 0} { incr device_id } } } } puts $file_handle "\n/******************************************************************/\n" close $file_handle } ################################################## # procedure post_generate # This generates the drivers directory for uboot # and runs the ltypes script ################################################## proc post_generate {lib_handle} { global drvlist # Create U-Boot tree structure set pwd [pwd] set common_dir "uboot/board/xilinx/common" set xilinx_enet_dir "uboot/board/xilinx/xilinx_enet" set ml300_dir "uboot/board/xilinx/ml300" exec bash -c "mkdir -p $common_dir $xilinx_enet_dir $ml300_dir" # Copy files for xilinx_ocp xcopy_commonfiles foreach drv $drvlist { set drvname [xget_value $drv "NAME"] set ver [xget_value $drv "PARAMETER" "DRIVER_VER"] set ver [string map {. _} $ver] set dirname [format "%s_v%s" $drvname $ver] if {[string compare -nocase $drvname "emac"] == 0} { xcopy_emac $drv $dirname } elseif {[string compare -nocase $drvname "iic"] == 0} { xcopy_iic $drv $dirname } } # Call Ltypes Script here set uboot "uboot" xltype_file $uboot # Move xparameters.h around exec bash -c "cp ../../include/xparameters.h $ml300_dir" # copy the whole U-Boot BSP to its final destination set value [xget_value $lib_handle "PARAMETER" TARGET_DIR] puts "TARGET_DIR : $value" if {$value != ""} { if {[file isdirectory $value] == 0} { exec bash -c "mkdir -p $value" } exec bash -c "cp -Rp uboot/* $value" } } proc xcopy_commonfiles {} { global drvlist set common_dir "uboot/board/xilinx/common" foreach drv $drvlist { set depends [xget_value $drv "OPTION" "DEPENDS"] foreach dep $depends { puts "dep : $dep" if {[file isdirectory "../$dep"] == 1} { exec bash -c "cp -f ../$dep/src/*.c $common_dir" exec bash -c "cp -f ../$dep/src/*.h $common_dir" } } } } proc xcopy_emac {drv_handle dirname} { set emac "board/xilinx/xilinx_enet" xcopy_dir $dirname $emac } proc xcopy_iic {drv_handle dirname} { set iic "board/xilinx/xilinx_iic" xcopy_dir $dirname $iic } proc xcopy_dir {srcdir dstdir} { set dstdirname [format "%s%s" "uboot/" $dstdir] if {[file isdirectory "../$srcdir"] == 1} { # Copy files from src to dst exec bash -c "mkdir -p $dstdirname" exec bash -c "cp -f ../$srcdir/src/*.c $dstdirname" exec bash -c "cp -f ../$srcdir/src/*.h $dstdirname" } else { puts "$srcdir does not exist ..." } } proc xltype_file {filename} { global ltypes puts $filename if {[file isdirectory $filename]} { foreach entry [glob -nocomplain [file join $filename *]] { xltype_file $entry } } else { exec bash -c "$ltypes $filename" } }