|
|
@@ -52,3 +52,39 @@ proc xc6s_program_iprog {tap} { |
|
|
|
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] |
|
|
|
} |