mirror of
https://github.com/marqs85/ossc
synced 2025-04-19 19:39:54 +03:00
89 lines
3.1 KiB
Tcl
89 lines
3.1 KiB
Tcl
# flash details
|
|
set flash_base 0x02000000
|
|
set flash_imem_offset 0x00080000
|
|
set flash_imem_base [format 0x%.8x [expr $flash_base + $flash_imem_offset]]
|
|
set flash_secsize 65536
|
|
|
|
# flash controller register addresses
|
|
set control_register 0x00020100
|
|
set operating_protocols_setting 0x00020110
|
|
set read_instr 0x00020114
|
|
set write_instr 0x00020118
|
|
set flash_cmd_setting 0x0002011c
|
|
set flash_cmd_ctrl 0x00020120
|
|
set flash_cmd_addr_register 0x00020124
|
|
set flash_cmd_write_data_0 0x00020128
|
|
set flash_cmd_read_data_0 0x00020130
|
|
|
|
# target file details
|
|
set bin_file mem_init/flash.bin
|
|
set bin_size [file size $bin_file]
|
|
set num_sectors [expr ($bin_size / $flash_secsize) + (($bin_size % $flash_secsize) ne 0)]
|
|
|
|
#Select the master service type and check for available service paths.
|
|
while 1 {
|
|
set service_paths [get_service_paths master]
|
|
if {[llength $service_paths] > 0} {
|
|
break
|
|
}
|
|
puts "Refreshing connections..."
|
|
refresh_connections
|
|
after 100
|
|
}
|
|
|
|
#Set the master service path.
|
|
set master_service_path [lindex $service_paths 0]
|
|
|
|
#Open the master service.
|
|
set claim_path [claim_service master $master_service_path mylib]
|
|
|
|
puts "Halting CPU"
|
|
master_write_32 $claim_path 0x40 0x00000001
|
|
master_write_32 $claim_path 0x40 0x80000001
|
|
|
|
#write enable
|
|
master_write_32 $claim_path $flash_cmd_setting 0x00000006
|
|
master_write_32 $claim_path $flash_cmd_ctrl 0x1
|
|
|
|
#write status register (clear BP)
|
|
master_write_32 $claim_path $flash_cmd_setting 0x00001001
|
|
#master_write_32 $claim_path $flash_cmd_write_data_0 0x0000005c
|
|
master_write_32 $claim_path $flash_cmd_write_data_0 0x00000000
|
|
master_write_32 $claim_path $flash_cmd_ctrl 0x1
|
|
|
|
puts "Erasing $num_sectors flash sectors"
|
|
set addr $flash_imem_offset
|
|
for {set i 0} {$i<$num_sectors} {incr i} {
|
|
master_write_32 $claim_path $flash_cmd_setting 0x00000006
|
|
master_write_32 $claim_path $flash_cmd_ctrl 0x1
|
|
master_write_32 $claim_path $flash_cmd_setting 0x000003D8
|
|
master_write_32 $claim_path $flash_cmd_addr_register $addr
|
|
master_write_32 $claim_path $flash_cmd_ctrl 0x1
|
|
set addr [expr $addr + $flash_secsize]
|
|
after 500
|
|
}
|
|
|
|
puts "Writing flash"
|
|
# writes garbage and occasionally hangs (bug in generic serial flash IF?)
|
|
#master_write_from_file $claim_path mem_init/flash.bin $flash_imem_base
|
|
|
|
# work around the issue by writing into small chunks so that FIFO does not fill up
|
|
set chunks [llength [glob mem_init/chunks/*]]
|
|
puts "Programming $chunks chunks"
|
|
set addr $flash_imem_base
|
|
for {set i 0} {$i<$chunks} {incr i} {
|
|
set file [format "flash.%04d" $i]
|
|
master_write_from_file $claim_path mem_init/chunks/$file $addr
|
|
set addr [expr $addr + 64]
|
|
}
|
|
#master_read_to_file $claim_path mem_init/flash_readback.bin $flash_imem_base $bin_size
|
|
#master_read_to_file $claim_path mem_init/ram_readback.bin 0x010000 65536
|
|
|
|
puts "Resetting system"
|
|
master_write_32 $claim_path 0x40 0x00000003
|
|
after 1
|
|
master_write_32 $claim_path 0x40 0x00000001
|
|
master_write_32 $claim_path 0x40 0x00000000
|
|
|
|
close_service master $claim_path
|
|
puts "Done" |