Files
gps/targets/fpga/genesys2/flow/vivado/scripts/program_flash.tcl
T
2026-07-12 11:01:51 +03:00

70 lines
2.4 KiB
Tcl

set script_dir [file dirname [file normalize [info script]]]
set fpga_dir [file normalize [file join $script_dir ../..]]
proc getenv_default {name default} {
if {[info exists ::env($name)] && $::env($name) ne ""} {
return $::env($name)
}
return $default
}
set mcs_file [file normalize [getenv_default FLASH_MCS [file join $fpga_dir out flash genesys2_rocket.mcs]]]
set cfgmem_part [getenv_default CFGMEM_PART s25fl256sxxxxxx0-spi-x1_x2_x4]
set device_pattern [getenv_default HW_DEVICE_PATTERN xc7k325t*]
set flash_verify [getenv_default FLASH_VERIFY 0]
set flash_erase [getenv_default FLASH_ERASE 1]
set flash_region_names [split [getenv_default FLASH_REGION_NAMES "combined"] ";"]
set flash_region_files_env [getenv_default FLASH_REGION_FILES ""]
if {$flash_region_files_env eq ""} {
set flash_region_files [list $mcs_file]
} else {
set flash_region_files [split $flash_region_files_env ";"]
}
if {[llength $flash_region_names] != [llength $flash_region_files]} {
error "FLASH_REGION_NAMES and FLASH_REGION_FILES length mismatch"
}
foreach region_file $flash_region_files {
if {![file exists $region_file]} {
error "MCS file not found: $region_file"
}
}
open_hw_manager
connect_hw_server
open_hw_target
set dev [lindex [get_hw_devices $device_pattern] 0]
if {$dev eq ""} {
error "No hardware device found matching $device_pattern"
}
current_hw_device $dev
refresh_hw_device $dev
set cfg_parts [get_cfgmem_parts $cfgmem_part]
if {[llength $cfg_parts] == 0} {
error "Configuration memory part not found: $cfgmem_part"
}
create_hw_cfgmem -hw_device $dev [lindex $cfg_parts 0]
set cfgmem [current_hw_cfgmem]
set_property PROGRAM.ADDRESS_RANGE {use_file} $cfgmem
set_property PROGRAM.BLANK_CHECK 0 $cfgmem
set_property PROGRAM.ERASE $flash_erase $cfgmem
set_property PROGRAM.CFG_PROGRAM 1 $cfgmem
set_property PROGRAM.VERIFY $flash_verify $cfgmem
set_property PROGRAM.UNUSED_PIN_TERMINATION {pull-none} $cfgmem
create_hw_bitstream -hw_device $dev [get_property PROGRAM.HW_CFGMEM_BITFILE $dev]
program_hw_devices $dev
refresh_hw_device $dev
for {set i 0} {$i < [llength $flash_region_files]} {incr i} {
set region_name [lindex $flash_region_names $i]
set region_file [lindex $flash_region_files $i]
puts "Programming flash region '$region_name' from $region_file"
set_property PROGRAM.FILES [list $region_file] $cfgmem
program_hw_cfgmem $cfgmem
}
puts "Programmed flash $cfgmem_part"
close_hw_manager