tcl: Support for reading "Device DNA" from Spartan 6 devices.
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. Debugging was done in https://github.com/timvideos/HDMI2USB/issues/36 Change-Id: Iad03eafb40887f0321a4dc22858a7c3bf37a12b3 Signed-off-by: Tim 'mithro' Ansell <mithro@mithis.com> Reviewed-on: http://openocd.zylin.com/2960 Tested-by: jenkins Reviewed-by: Paul Fertser <fercerpav@gmail.com>__archive__
parent
41daa32351
commit
3edb15784e
|
@ -52,3 +52,39 @@ proc xc6s_program_iprog {tap} {
|
||||||
irscan $tap $XC6S_BYPASS
|
irscan $tap $XC6S_BYPASS
|
||||||
runtest 1
|
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]
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue