The JTAG boundary scan (JTAG for short here after) along with the DONE, INIT, and PROGRAM_B pins are accessible via BBB GPIO pins. There are two utilities used to provide key functionality with these pins.
|JTAG Boundary Scan Tools for Beagelbone Black LX9 Board|
xilinx_xvc host=192.168.0.2:2542 disableversioncheck=true
The tool then uses the network connection to conduct all JTAG operations. The code is factored into two components: the general server which handles network transactions and the board specific portion which turns JTAG operations into pin level settings. The tool was developed using a JTAG device simulator and was actually a really insightful exercise in understanding JTAG boundary scan.
The second tool is Fxsvf which is an embedded SVF player. SVF is a way to express JTAG operations in a text file, while XSVF is a Xilinx binary form of SVF which results in more compact files. Again, the application is broken into two components, a portion which handles the reading and parsing of an XSVF file and a portion which is board specific and sets the JTAG pins appropriately. The general part comes from the Xilinx XAPP058. Due to licensing, this portion is currently not open source and can only be obtained by registering with Xilinx. For this reason, the general XSVF player portion is treated as an installed library that you link the board specific pin manipulation code against to produce the final application.
One of the down sides to the current approach is the performance. Manipulating GPIO pins from user space with the sysfs interface is quite slow (but simple). I knew this going in but underestimated the convenience of being able to just attach to the fpga JTAG interface by running an application and having an Ethernet connected (which is always the case for my BBB work). Not having to drag out yet another cable is really nice.
One of the issues I encountered was getting the ISE 14.7 tools to properly program the flash. This process is what Xilinx calls indirect programming. It involves loading a fpga image via JTAG that can manipulate the flash SPI pins via the JTAG interface. This would not work for me. At first I suspected a problem with my layout of the flash SPI, then I suspected a fabrication error, then I investigated Fxvc errors. Eventually I ended developing my own utility Fflash to access the SPI flash and found no problems. I found a couple of data points indicating the ISE tools sometimes have issues with SPI flash access (e.g. my identical issue - ID check failing, however, the workaround failed to solve my problem). Given this along with the support state of ISE, I decided to abandon this approach and just work with my own flashing utility. This is less of an issue than I first thought since my general use model is to load an FPGA image with iMPACT while debugging and then once the image is finalized save a copy and flash it.
The process involves first loading via Fxsvf a fpga image which directly connects the host SPI pins to the flash SPI pins. The Fflash utility then programs the SPI flash using the host SPI lines. When using the PRU interface to the host SPI pins this is extremely fast - about 3 seconds to erase the device (device limited) and less than a second to program and verify the image into the flash.