2014-06-24 16:45:01 +05:30
# ##############################################################################
#
# Copyright (C) 2012 - 2014 Xilinx, Inc. All rights reserved.
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in
# all copies or substantial portions of the Software.
#
# Use of the Software is limited solely to applications:
# (a) running on a Xilinx device, or
# (b) that interact with a Xilinx device through a bus or interconnect.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# XILINX CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
# OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# SOFTWARE.
#
# Except as contained in this notice, the name of the Xilinx shall not be used
# in advertising or otherwise to promote the sale, use or other dealings in
# this Software without prior written authorization from Xilinx.
#
#
# #############################################################################
#
# Modification History
#
# Ver Who Date Changes
# ----- ---- -------- -----------------------------------------------
2015-01-09 16:00:17 +05:30
# 3.01a sdm 05/06/10 Updated to support AXI common::version of the core
2014-06-24 16:45:01 +05:30
# 3.02a bss 08/18/12 Updated the script to fix CR 655224 and CR 672073.
# Added check for C_USE_EXTENDED_FSL_INSTR for AXI Stream.
# 3.02a bss 12/03/12 Updated the script to fix CR#687103 and CR#688715
# #############################################################################
# uses "xillib.tcl"
proc generate { drv_handle } {
xdefine_mbox_config_files $drv_handle " x p a r a m e t e r s . h " " x m b o x _ g . c " " X M b o x "
xdefine_canonical_xpars $drv_handle " x p a r a m e t e r s . h " " M b o x "
}
proc xdefine_mbox_config_if { periph hfile_handle cfile_handle bus_if if_num dev_id has_if0_dev_id} {
upvar $dev_id device_id
upvar $has_if0_dev_id has_if0_device_id
set mbox_baseaddr 0
set mbox_use_fsl 0
set mbox_send_fsl 0
set mbox_recv_fsl 0
set if_isaxi 0
set use_fsl 0
# Copy over the right set of files as src based on processor type
# sw_proc_handle contains driver handle for processor for which libgen is running. Name of the sw_proc_handle will be driver name for processor[Ex:cpu for microblaze]
2015-01-05 15:02:40 +05:30
set sw_proc_handle [ hsi : : get_sw_processor]
set hw_proc_handle [ hsi : : get_cells $sw_proc_handle ]
2014-06-24 16:45:01 +05:30
2015-01-09 16:00:17 +05:30
set periph_name [ string toupper [ common : : get_property NAME $periph ] ]
2014-06-24 16:45:01 +05:30
if { $bus_if == 2 } {
2015-01-09 16:00:17 +05:30
set mbox_baseaddr [ common : : get_property CONFIG.[ format " C _ S % d _ A X I _ B A S E A D D R " $if_num ] $periph ]
2014-06-24 16:45:01 +05:30
set if_isaxi [ check_if_connected $periph $if_num $bus_if ]
} else {
# # AXI Stream Interface
# check if stream interface of mailbox is connected to current processor for which libgen is running
set send_fsl 0
set recv_fsl 0
handle_stream $periph $bus_if $if_num use_fsl send_fsl recv_fsl
set if_isaxi 0
set mbox_use_fsl $use_fsl
set mbox_send_fsl $send_fsl
set mbox_recv_fsl $recv_fsl
}
if { $if_isaxi == 1 || $use_fsl == 1 } {
puts $hfile_handle " "
puts $hfile_handle " / * D e f i n i t i o n s f o r p e r i p h e r a l $ p e r i p h _ n a m e I F $ { i f _ n u m } * / "
# The XPAR_INSTANCE_NAME_DEVICE_ID does not apply to Mailbox
# because the mailbox has two sides
# Unfortunately, this is used by TestApp
puts $hfile_handle [ format " # d e f i n e X P A R _ % s _ I F _ % d _ D E V I C E _ I D % s " $periph_name $if_num $device_id ]
puts $hfile_handle [ format " # d e f i n e X P A R _ % s _ I F _ % d _ B A S E A D D R 0 x % X " $periph_name $if_num $mbox_baseaddr ]
puts $hfile_handle [ format " # d e f i n e X P A R _ % s _ I F _ % d _ U S E _ F S L % d " $periph_name $if_num $mbox_use_fsl ]
puts $hfile_handle [ format " # d e f i n e X P A R _ % s _ I F _ % d _ S E N D _ F S L % d " $periph_name $if_num $mbox_send_fsl ]
puts $hfile_handle [ format " # d e f i n e X P A R _ % s _ I F _ % d _ R E C V _ F S L % d " $periph_name $if_num $mbox_recv_fsl ]
if { ! $has_if0_device_id } {
puts $hfile_handle " "
puts $hfile_handle " / * D e f i n i t i o n f o r T e s t A p p I D * / "
puts $hfile_handle [ format " # d e f i n e X P A R _ % s _ T E S T A P P _ I D % s " $periph_name $device_id ]
}
puts $cfile_handle " \t \{ "
puts $cfile_handle [ format " \t \t X P A R _ % s _ I F _ % d _ D E V I C E _ I D , " $periph_name $if_num ]
puts $cfile_handle [ format " \t \t X P A R _ % s _ I F _ % d _ B A S E A D D R , " $periph_name $if_num ]
puts $cfile_handle [ format " \t \t X P A R _ % s _ I F _ % d _ U S E _ F S L , " $periph_name $if_num ]
puts $cfile_handle [ format " \t \t X P A R _ % s _ I F _ % d _ S E N D _ F S L , " $periph_name $if_num ]
puts $cfile_handle [ format " \t \t X P A R _ % s _ I F _ % d _ R E C V _ F S L " $periph_name $if_num ]
puts - nonewline $cfile_handle " \t \} "
puts $cfile_handle " , "
set has_if0_device_id 1
incr device_id
}
}
#
# Create configuration C/H files as required by Xilinx drivers
#
proc xdefine_mbox_config_files { drv_handle hfile_name cfile_name drv_string} {
# Open include file
2014-12-23 11:32:20 +05:30
set hfile_handle [ : : hsi : : utils::open_include_file $hfile_name ]
2014-06-24 16:45:01 +05:30
set cfile_name [ file join " s r c " $cfile_name ]
file delete $cfile_name
set cfile_handle [ open $cfile_name w]
2014-12-23 11:32:20 +05:30
: : hsi : : utils::write_c_header $cfile_handle " D r i v e r c o n f i g u r a t i o n "
2014-06-24 16:45:01 +05:30
puts $cfile_handle " # i n c l u d e \" x p a r a m e t e r s . h \" "
puts $cfile_handle " # i n c l u d e \" [ s t r i n g t o l o w e r $ d r v _ s t r i n g ] . h \" "
puts $cfile_handle " \n / * "
puts $cfile_handle " * T h e c o n f i g u r a t i o n t a b l e f o r d e v i c e s "
puts $cfile_handle " * / \n "
puts $cfile_handle [ format " % s _ C o n f i g % s _ C o n f i g T a b l e \[ \] = " $drv_string $drv_string ]
puts $cfile_handle " \{ "
# Get all peripherals connected to this driver
2014-12-23 11:32:20 +05:30
set periphs [ : : hsi : : utils::get_common_driver_ips $drv_handle ]
2014-06-24 16:45:01 +05:30
# Print all parameters for all peripherals
set device_id 0
foreach periph $periphs {
set has_if0_device_id 0
for { set if_num 0 } { $if_num < 2 } { incr if_num} {
2015-01-09 16:00:17 +05:30
set bus_if [ common : : get_property CONFIG.[ format " C _ I N T E R C O N N E C T _ P O R T _ % d " $if_num ] $periph ]
2014-06-24 16:45:01 +05:30
xdefine_mbox_config_if $periph $hfile_handle $cfile_handle $bus_if $if_num device_id has_if0_device_id
}
}
puts $cfile_handle " \} ; "
close $cfile_handle
puts $hfile_handle " "
puts $hfile_handle " / * D e f i n i t i o n s f o r d r i v e r M A I L B O X * / "
puts $hfile_handle [ format " # d e f i n e X P A R _ X M B O X _ N U M _ I N S T A N C E S % d " $device_id ]
puts $hfile_handle " \n / * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * / \n "
close $hfile_handle
}
# Check whether the interface is connected or not
proc check_if_connected { periph if_num bus_if} {
2015-01-05 15:02:40 +05:30
set sw_proc_handle [ hsi : : get_sw_processor]
set hw_proc_handle [ hsi : : get_cells $sw_proc_handle ]
2014-06-24 16:45:01 +05:30
set if_isaxi 0
set if_axis_connected 0
if { $bus_if == 2 } {
2015-01-09 16:00:17 +05:30
set baseaddr [ common : : get_property CONFIG.[ format " C _ S % d _ A X I _ B A S E A D D R " $if_num ] $periph ]
2015-01-05 15:02:40 +05:30
set mem [ hsi : : get_mem_ranges - of_objects $hw_proc_handle - filter " I N S T A N C E = = $ p e r i p h " ]
2014-06-24 16:45:01 +05:30
if { [ llength $mem ] != 0 } {
2015-01-09 16:00:17 +05:30
set addrs [ common : : get_property BASE_VALUE $mem ]
2014-06-24 16:45:01 +05:30
foreach addr $addrs {
if { $addr == $baseaddr } {
set if_isaxi 1
}
}
}
} else {
set use_fsl 0
set send_fsl 0
set recv_fsl 0
handle_stream $periph $bus_if $if_num use_fsl send_fsl recv_fsl
set if_axis_connected $use_fsl
}
if { $if_isaxi || $if_axis_connected } {
return 1
} else {
return 0
}
}
# Generate canonical definitions for device ID
proc gen_canonical_device_id { file_handle canonical_name periph_name if_num} {
2014-12-23 11:32:20 +05:30
set lvalue [ : : hsi : : utils::get_driver_param_name $canonical_name " D E V I C E _ I D " ]
2014-06-24 16:45:01 +05:30
set rvalue " X P A R _ $ { p e r i p h _ n a m e } _ I F _ $ { i f _ n u m } _ D E V I C E _ I D "
puts $file_handle " # d e f i n e $ l v a l u e $ r v a l u e "
}
# Generate canonical definitions for parameters
proc gen_canonical_param_def { file_handle canonical_name periph param_prefix params} {
foreach arg $params {
if { $param_prefix == " " } {
set actual_arg " $ { a r g } "
} else {
set actual_arg " $ { p a r a m _ p r e f i x } _ $ { a r g } "
}
2014-12-23 11:32:20 +05:30
set lvalue [ : : hsi : : utils::get_driver_param_name $canonical_name $arg ]
2014-06-24 16:45:01 +05:30
# The rvalue set below is the actual value of the parameter
2014-12-23 11:32:20 +05:30
set rvalue [ : : hsi : : utils::get_param_value $periph $actual_arg ]
2014-06-24 16:45:01 +05:30
if { [ llength $rvalue ] == 0 } {
set rvalue 0
}
2014-12-23 11:32:20 +05:30
set rvalue [ : : hsi : : utils::format_addr_string $rvalue $actual_arg ]
2014-06-24 16:45:01 +05:30
puts $file_handle " # d e f i n e $ l v a l u e $ r v a l u e "
}
}
proc gen_canonical_fsl_param_def { file_handle canonical_name periph if_num} {
2015-01-09 16:00:17 +05:30
set periph_name [ string toupper [ common : : get_property NAME $periph ] ]
2014-06-24 16:45:01 +05:30
2014-12-23 11:32:20 +05:30
puts $file_handle [ format " # d e f i n e [ : : h s i : : u t i l s : : g e t _ d r i v e r _ p a r a m _ n a m e $ c a n o n i c a l _ n a m e " U S E _ F S L " ] X P A R _ % s _ I F _ % d _ U S E _ F S L " $periph_name $if_num ]
puts $file_handle [ format " # d e f i n e [ : : h s i : : u t i l s : : g e t _ d r i v e r _ p a r a m _ n a m e $ c a n o n i c a l _ n a m e " S E N D _ F S L " ] X P A R _ % s _ I F _ % d _ S E N D _ F S L " $periph_name $if_num ]
puts $file_handle [ format " # d e f i n e [ : : h s i : : u t i l s : : g e t _ d r i v e r _ p a r a m _ n a m e $ c a n o n i c a l _ n a m e " R E C V _ F S L " ] X P A R _ % s _ I F _ % d _ R E C V _ F S L " $periph_name $if_num ]
2014-06-24 16:45:01 +05:30
}
# Generate canonical definitions for an interface
proc gen_canonical_if_def { file_handle periph if_num bus_if drv_string dev_id common_params} {
upvar $dev_id device_id
2015-01-09 16:00:17 +05:30
set periph_name [ string toupper [ common : : get_property NAME $periph ] ]
2014-06-24 16:45:01 +05:30
set canonical_name [ format " % s _ % s " $drv_string $device_id ]
# Make sure canonical name is not the same as hardware instance
if { [ string compare - nocase $canonical_name $periph_name ] == 0 } {
return
}
set if_connected [ check_if_connected $periph $if_num $bus_if ]
if { $if_connected } {
puts $file_handle " "
puts $file_handle " / * C a n o n i c a l d e f i n i t i o n s f o r p e r i p h e r a l $ p e r i p h _ n a m e I F $ { i f _ n u m } * / "
gen_canonical_device_id $file_handle $canonical_name $periph_name $if_num
set addr_args [ list " B A S E A D D R " " H I G H A D D R " ]
gen_canonical_param_def $file_handle $canonical_name $periph " C _ S $ { i f _ n u m } _ A X I " $addr_args
gen_canonical_param_def $file_handle $canonical_name $periph " " $common_params
gen_canonical_fsl_param_def $file_handle $canonical_name $periph $if_num
incr device_id
puts $file_handle " "
}
}
#
# Given a list of arguments, define each as a canonical constant name, using
# the driver name, in an include file.
#
proc xdefine_canonical_xpars { drv_handle file_name drv_string args} {
# Open include file
2014-12-23 11:32:20 +05:30
set file_handle [ : : hsi : : utils::open_include_file $file_name ]
2014-06-24 16:45:01 +05:30
# Get all peripherals connected to this driver
2014-12-23 11:32:20 +05:30
set periphs [ : : hsi : : utils::get_common_driver_ips $drv_handle ]
2014-06-24 16:45:01 +05:30
# Print canonical parameters for each peripheral
set device_id 0
foreach periph $periphs {
for { set if_num 0 } { $if_num < 2 } { incr if_num} {
2015-01-09 16:00:17 +05:30
set bus_if [ common : : get_property CONFIG.[ format " C _ I N T E R C O N N E C T _ P O R T _ % d " $if_num ] $periph ]
2014-06-24 16:45:01 +05:30
gen_canonical_if_def $file_handle $periph $if_num $bus_if $drv_string device_id $args
}
}
puts $file_handle " \n / * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * / \n "
close $file_handle
}
proc handle_stream { periph bus_if if_num usefsl sendfsl recfsl} {
upvar $usefsl use_fsl
upvar $sendfsl send_fsl
upvar $recfsl recv_fsl
set not_connected 0
2015-01-05 15:02:40 +05:30
set sw_proc_handle [ hsi : : get_sw_processor]
set hw_proc_handle [ hsi : : get_cells $sw_proc_handle ]
2014-06-24 16:45:01 +05:30
2015-01-09 16:00:17 +05:30
set periph_name [ string toupper [ common : : get_property NAME $periph ] ]
2014-06-24 16:45:01 +05:30
2014-12-23 11:32:20 +05:30
set initiator_handle [ : : hsi : : utils::get_connected_intf $periph S$ { if_num } _AXIS]
2014-06-24 16:45:01 +05:30
if { [ llength $initiator_handle ] != 1 } {
incr not_connected
} else {
2015-01-05 15:02:40 +05:30
set maxis_initiator_handle [ hsi : : get_cells - of_objects $initiator_handle ]
2014-06-24 16:45:01 +05:30
if { $maxis_initiator_handle == $hw_proc_handle } {
2015-01-09 16:00:17 +05:30
if { [ common : : get_property CONFIG.C_USE_EXTENDED_FSL_INSTR $hw_proc_handle ] != 1 } {
2014-06-24 16:45:01 +05:30
error " E R R O R : T h e m a i l b o x d r i v e r r e q u i r e s p a r a m e t e r C _ U S E _ E X T E N D E D _ F S L _ I N S T R o n M i c r o B l a z e t o b e e n a b l e d w h e n a n A X I S t r e a m i n t e r f a c e i s u s e d t o c o n n e c t t h e m a i l b o x c o r e . " " " " m d t _ e r r o r "
}
2015-01-09 16:00:17 +05:30
set initiator_name [ common : : get_property NAME $initiator_handle ]
2014-06-24 16:45:01 +05:30
scan $initiator_name " M % d _ A X I S " send_fsl
set use_fsl 1
} else {
set use_fsl 0
}
}
2014-12-23 11:32:20 +05:30
set target_handle [ : : hsi : : utils::get_connected_intf $periph M$ { if_num } _AXIS]
2014-06-24 16:45:01 +05:30
if { [ llength $target_handle ] != 1 } {
incr not_connected
} else {
2015-01-05 15:02:40 +05:30
set saxis_target_handle [ hsi : : get_cells - of_objects $target_handle ]
2014-06-24 16:45:01 +05:30
if { $saxis_target_handle == $hw_proc_handle } {
2015-01-09 16:00:17 +05:30
if { [ common : : get_property CONFIG.C_USE_EXTENDED_FSL_INSTR $hw_proc_handle ] != 1 } {
2014-06-24 16:45:01 +05:30
error " E R R O R : T h e m a i l b o x d r i v e r r e q u i r e s p a r a m e t e r C _ U S E _ E X T E N D E D _ F S L _ I N S T R o n M i c r o B l a z e t o b e e n a b l e d w h e n a n A X I S t r e a m i n t e r f a c e i s u s e d t o c o n n e c t t h e m a i l b o x c o r e . " " " " m d t _ e r r o r "
}
2015-01-09 16:00:17 +05:30
set target_name [ common : : get_property NAME $target_handle ]
2014-06-24 16:45:01 +05:30
scan $target_name " S % d _ A X I S " recv_fsl
set use_fsl 1
} else {
set use_fsl 0
}
}
if { $not_connected == 2 } {
error " E R R O R : U n a b l e t o f i g u r e o u t A X I s t r e a m c o n n e c t i v i t y f o r I n t e r f a c e $ { i f _ n u m } o n m a i l b o x $ p e r i p h _ n a m e . "
}
}