📄 uclinux_v2_1_0.tcl
字号:
# XILINX IS PROVIDING THIS DESIGN, CODE, OR INFORMATION "AS IS"# SOLELY FOR USE IN DEVELOPING PROGRAMS AND SOLUTIONS FOR# XILINX DEVICES. 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 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.# # (c) Copyright 2004 Xilinx, Inc.# All rights reserved.# Known limitations:# Globalsset drvlist [list]array set periph_count {}array set override_array {}proc uclinux_drc {os_handle} { puts "\#--------------------------------------" puts "\# uClinux BSP DRC...!" puts "\#--------------------------------------"}proc process_core_override_list {os_handle} { global override_array # Make sure override_array is empty on entry to this function array unset override_array array set override_array {} global override_array puts "Hello from process_core_override" # Was a core_overrides parameter specified in the OS section? set overrides [xget_sw_parameter_value $os_handle "periph_type_overrides"] if {[string match $overrides ""]} { return } puts "Parsing override string:$overrides" # Now parse this string, saving results into a global array foreach override $overrides { set instance [string toupper [lindex $override 0]] set new_type [string toupper [lindex $override 1]] puts "Overriding $instance to $new_type" set override_array($instance) $new_type }}proc generate {os_handle} { variable drvlist puts "\#--------------------------------------" puts "\# uClinux BSP generate..." puts "\#--------------------------------------" # open the config file set config_file_name "auto-config.in" set config_file [open $config_file_name w] # print the xilinx header #set desc "uClinux Configuration File" xprint_header $config_file puts $config_file "" # get software processor handle # This call returns the current processor handle for which libgen # algorithm is being run set proc_handle [xget_libgen_proc_handle] # output memory configuration data do_memory_setup $config_file $os_handle "MAIN_MEMORY" CONFIG_XILINX_ERAM do_memory_setup $config_file $os_handle "FLASH_MEMORY" CONFIG_XILINX_FLASH do_memory_setup $config_file $os_handle "LMB_MEMORY" CONFIG_XILINX_LMB process_core_override_list $os_handle # print processor related params xprint_processor_params $config_file $proc_handle # Get list of drivers of peripherals connected to the processor set drvlist [xget_handle $proc_handle "DRIVER" "*"] puts "drvlist : $drvlist" # print the device params xprint_device_params $config_file # now duplicate much of the stuff from the standalone BSP - so # we can build the bootloader in-place set need_config_file "false" # Copy over the right set of files as src based on processor type set sw_proc_handle [xget_libgen_proc_handle] set hw_proc_handle [xget_handle $sw_proc_handle "IPINST"] set proctype [xget_value $hw_proc_handle "OPTION" "IPNAME"] set mbsrcdir "./src/microblaze" set ppcsrcdir "./src/ppc405" # proctype should be "microblaze", "ppc405" or "ppc405_virtex4" switch $proctype { "microblaze" { set procver [xget_value $hw_proc_handle "PARAMETER" "HW_VER"] foreach entry [glob -nocomplain [file join $mbsrcdir *]] { if { [string first "Makefile_old" $entry] != -1 } { if { [string compare -nocase $procver "3.00.a"] } { ;# Copy over Makefile_old only for non- v3.00.a cores file copy -force $entry [file join "." "src" "Makefile"] } } elseif {[string first "Makefile_new" $entry] != -1} { if {![string compare -nocase $procver "3.00.a"] } { ;# Copy over Makefile_new only for v3.00.a file copy -force $entry [file join "." "src" "Makefile"] } } else { if { [string first "exception" $entry] == -1 || ![string compare -nocase $procver "3.00.a"] } { # Copy over only files that are not related to exception handling. All such files have exception in their names file copy -force $entry "./src/" } } } set need_config_file "true" } "ppc405" - "ppc405_virtex4" { set procver [xget_value $hw_proc_handle "PARAMETER" "HW_VER"] foreach entry [glob -nocomplain [file join $ppcsrcdir *]] { if { [string first "exception" $entry] == -1 } { # Copy over only files that are not related to exception handling. All such files have exception in their names file copy -force $entry "./src/" } } set need_config_file "true" } "default" {puts"unsupported processor type $proctype\n"} } # Remove microblaze and ppc405 directories file delete -force $mbsrcdir file delete -force $ppcsrcdir # handle the stdout and stdin params, for the bootloader xhandle_stdout $os_handle xhandle_stdin $os_handle # close the file... close $config_file}################################################### procedure post_generate# This copies the auto-config.in file into the kernel tree# if required##################################################proc post_generate {lib_handle} { set config_file_name "auto-config.in" 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 $config_file_name $value" }}proc do_manual_memory_setup {config_file os_handle param_prefix config_prefix} { set proc_handle [xget_libgen_proc_handle] # Get manually specified start address and size set mem_start [xget_sw_parameter_value $os_handle "${param_prefix}_START"] set mem_size [xget_sw_parameter_value $os_handle "${param_prefix}_SIZE"] # Did we get valid start and size? if {$mem_start==-1 || [string match $mem_start ""] || $mem_size==0 || [string match $mem_size ""]} { # Format warning/error msg set msg "No ${param_prefix} peripheral or START/SIZE parameters specified" # For main memory, this is fatal if { [string match $param_prefix "MAIN_MEMORY"] } { error "ERROR :: ${msg}" } else { puts "WARNING :: ${msg}" } return } # Format start_addr and size as hex strings set mem_start [format "0x%08x" $mem_start] set mem_size [format "0x%08x" $mem_size] # Generate config file entries puts $config_file "\# $param_prefix Settings" puts $config_file "define_hex ${config_prefix}_START $mem_start" puts $config_file "define_hex ${config_prefix}_SIZE $mem_size" puts $config_file ""}proc do_memory_setup {config_file os_handle param_prefix config_prefix} { # print system memory set proc_handle [xget_libgen_proc_handle] # Get memory peripheral instance set mem [xget_sw_parameter_value $os_handle $param_prefix] # Get any overridden start address and size set mem_start_override [xget_sw_parameter_value $os_handle "${param_prefix}_START"] set mem_size_override [xget_sw_parameter_value $os_handle "${param_prefix}_SIZE"] # Did MSS file specify a memory peripheral instance? if {[string match "" $mem] || [string match "none" $mem]} { # if not, see if START/SIZE params were given do_manual_memory_setup $config_file $os_handle $param_prefix $config_prefix return } set mem_bank [xget_sw_parameter_value $os_handle "${param_prefix}_BANK"] set mem_handle [xget_sw_ipinst_handle_from_processor $proc_handle $mem] # Was it a valid instance? if {[string match $mem_handle ""]} { error "ERROR :: $param_prefix peripheral $mem does not exist" } # Check for banked vs direct memory core if {$mem_bank == -1 || [string match $mem_bank ""]} { set base_param_name "C_BASEADDR" set high_param_name "C_HIGHADDR" } else { set base_param_name [format "C_MEM%i_BASEADDR" $mem_bank] set high_param_name [format "C_MEM%i_HIGHADDR" $mem_bank] } # Process memory core parameters set mem_start [xget_sw_parameter_value $mem_handle $base_param_name] set mem_end [xget_sw_parameter_value $mem_handle $high_param_name] # remove any embedded underscore characters set mem_start [string map {"_" ""} $mem_start] set mem_end [string map {"_" ""} $mem_end] # Manual override of memory region start if {$mem_start_override==-1 || [string match $mem_start_override ""]} { } else { set mem_start $mem_start_override } # Manual override of memory region size if {$mem_size_override==0 || [string match $mem_size_override ""]} { set mem_size [expr $mem_end - $mem_start + 1] } else { set mem_size $mem_size_override } # Manual override of memory region offset relative to start set mem_offset_override [xget_sw_parameter_value $os_handle "${param_prefix}_OFFSET"] if {$mem_offset_override==0 || [string match $mem_offset_override ""]} { } else { set mem_start [expr $mem_start + $mem_offset_override] } # Format start_addr and size as hex strings set mem_start [format "0x%08x" $mem_start] set mem_size [format "0x%08x" $mem_size] # Generate config file entries puts $config_file "\# $param_prefix Settings" puts $config_file "define_hex ${config_prefix}_START $mem_start" puts $config_file "define_hex ${config_prefix}_SIZE $mem_size" puts $config_file ""} proc xprint_processor_params {config_file proc_handle} { # print system clock set sys_clock [xget_sw_parameter_value $proc_handle "CORE_CLOCK_FREQ_HZ"] puts $config_file "\# System Clock Frequency" puts $config_file "define_int CONFIG_XILINX_CPU_CLOCK_FREQ $sys_clock" puts $config_file "" # print microblaze params set hwproc_handle [xget_handle $proc_handle "IPINST"] set args [xget_hw_parameter_handle $hwproc_handle "*"] set proctype [xget_value $hwproc_handle "OPTION" "IPNAME"]
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -