+# SPDX-License-Identifier: GPL-2.0-or-later
+
# xilinx spartan6
# http://www.xilinx.com/support/documentation/user_guides/ug380.pdf
-expected-id 0x0401D093 \
-expected-id 0x0403D093
-pld device virtex2 $_CHIPNAME.tap
+pld create $_CHIPNAME.pld virtex2 -chain-position $_CHIPNAME.tap
+virtex2 set_user_codes $_CHIPNAME.pld 0x02 0x03 0x1A 0x1B
set XC6S_CFG_IN 0x05
set XC6S_JSHUTDOWN 0x0d
set XC6S_BYPASS 0x3f
proc xc6s_program {tap} {
+ echo "DEPRECATED! use 'virtex2 program ...' not 'xc6s_program'"
global XC6S_JSHUTDOWN XC6S_JPROGRAM XC6S_JSTART XC6S_BYPASS
irscan $tap $XC6S_JSHUTDOWN
irscan $tap $XC6S_JPROGRAM
#xtp038 and xc3sprog approach
proc xc6s_program_iprog {tap} {
+ echo "DEPRECATED! use 'virtex2 program ...' not 'xc6s_program_iprog'"
global XC6S_JSHUTDOWN XC6S_JSTART XC6S_BYPASS XC6S_CFG_IN
irscan $tap $XC6S_JSHUTDOWN
runtest 16
irscan $tap $XC6S_BYPASS
runtest 1
}
+
+set XC6S_ISC_ENABLE 0x10
+set XC6S_ISC_DISABLE 0x16
+set XC6S_ISC_DNA 0x30
+
+# Get the "Device DNA" from the Spartan 6.
+# Most Xilinx FPGA devices contain an embedded, unique device identifier called
+# the "Device DNA". The identifier is nonvolatile, permanently programmed into
+# the FPGA, and is unchangeable providing a great serial / tracking number.
+proc xc6s_get_dna {tap} {
+ global XC6S_ISC_ENABLE XC6S_ISC_DISABLE XC6S_ISC_DNA
+ irscan $tap $XC6S_ISC_ENABLE
+ runtest 64
+ irscan $tap $XC6S_ISC_DNA
+ # Device DNA is 57 bits long, but we can only read 32bits at a time
+ # with OpenOCD.
+ set dna [drscan $tap 16 0 16 0 16 0 9 0]
+ runtest 64
+ irscan $tap $XC6S_ISC_DISABLE
+ runtest 64
+
+ # Convert the binary data into the order impact uses
+ scan $dna "%x %x %x %x" v1 v2 v3 v4
+ set bin_dna [string reverse [concat [format "%09b" $v4][format "%016b" $v3][format "%016b" $v2][format "%016b" $v1]]]
+
+ # Return a hex version of binary
+ scan [format "0b%s" $bin_dna] "%i" hex_dna
+ return $hex_dna
+}
+
+# Print out the "Device DNA" in the same format that impact uses.
+proc xc6s_print_dna {tap} {
+ set hex_dna [xc6s_get_dna $tap]
+
+ puts [format "DNA = %57b (0x%x)\n" $hex_dna $hex_dna]
+}