From 3edb15784eca5bdd7981f7889909e273ad9775d1 Mon Sep 17 00:00:00 2001 From: Tim 'mithro' Ansell Date: Sun, 27 Sep 2015 20:09:38 +1000 Subject: [PATCH] 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 Reviewed-on: http://openocd.zylin.com/2960 Tested-by: jenkins Reviewed-by: Paul Fertser --- tcl/cpld/xilinx-xc6s.cfg | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/tcl/cpld/xilinx-xc6s.cfg b/tcl/cpld/xilinx-xc6s.cfg index b705ea1fd..9ce7ad491 100644 --- a/tcl/cpld/xilinx-xc6s.cfg +++ b/tcl/cpld/xilinx-xc6s.cfg @@ -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] +}