mirror of
git://projects.qi-hardware.com/ben-blinkenlights.git
synced 2024-11-23 22:42:49 +02:00
191 lines
5.9 KiB
Plaintext
191 lines
5.9 KiB
Plaintext
|
JTAG with UBB
|
||
|
=============
|
||
|
|
||
|
JTAG [1] typically uses 4 to 6 signals between the host and the
|
||
|
target, making it perfectly suitable for UBB.
|
||
|
|
||
|
UBB can be either used with just a cable or with minimum circuitry
|
||
|
if level shifting is needed. If the level difference is small
|
||
|
enough, simple resistive dividers that can be soldered directly to
|
||
|
UBB will be sufficient.
|
||
|
|
||
|
If using the "gpio" cable driver of UrTAG, we don't even need new
|
||
|
code for this.
|
||
|
|
||
|
[1] http://en.wikipedia.org/wiki/Jtag
|
||
|
[2] http://urjtag.org/
|
||
|
|
||
|
|
||
|
Overview
|
||
|
--------
|
||
|
|
||
|
This is an example of using UBB to communicate via JTAG with the
|
||
|
Xilinx XC6SLX45 FPGA of a Milkymist One. We first describe the
|
||
|
hardware setup, then configuration and installation of UrJTAG,
|
||
|
and finally changes to the kernel configuration.
|
||
|
|
||
|
The whole setup looks like this:
|
||
|
http://downloads.qi-hardware.com/people/werner/ubb/jtag/ubb-jtag-m1-all.jpg
|
||
|
|
||
|
|
||
|
UBB-JTAG-M1 hardware: 2.5 V level adaptation
|
||
|
--------------------------------------------
|
||
|
|
||
|
Note that this is target-specifc. No level adaptation is necessary
|
||
|
if the target's JTAG interface runs at 3.3 V.
|
||
|
|
||
|
Milkymist One uses 2.5 V for its JTAG interface while the Ben's
|
||
|
IO runs at 3.3 V. The difference is small enough that we need no
|
||
|
special provisions for going from 2.5 V to 3.3 V, but we have to
|
||
|
adapt the level in the opposite direction.
|
||
|
|
||
|
Since we will run the interface at fairly low speeds, simple
|
||
|
resistive dividers will be sufficient. A 220/680 Ohm divider
|
||
|
reduces the Ben's nominal 3.3 V to a nominal 2.5 V. Small
|
||
|
through-hole resistors can be soldered directly to UBB.
|
||
|
|
||
|
ubb-jtag-m1.sch shows the configuration. Since CLK is used as
|
||
|
input and has no pull-up inside the Ben, no resistor is needed.
|
||
|
However, it may be advisable to add a 220 Ohm series resistor
|
||
|
as protection in case of misconfiguration.
|
||
|
|
||
|
This is what UBB with voltage dividers (without series resistor
|
||
|
on CLK) looks like:
|
||
|
http://downloads.qi-hardware.com/people/werner/ubb/jtag/ubb-jtag-m1-card.jpg
|
||
|
|
||
|
|
||
|
UBB-JTAG-M1 hardware: connector
|
||
|
-------------------------------
|
||
|
|
||
|
Milkymist One uses a shrouded 14 pin male connector with a 2 mm
|
||
|
pitch for JTAG. While suitable connectors for ribbon cables are
|
||
|
available, e.g., Molex 087568-1493, one can also improvise with
|
||
|
female contacts designed for the ubiquitous 2.54 mm headers.
|
||
|
|
||
|
If building a UBB-JTAG board with individual wires, the labels
|
||
|
in m1-labels.fig can be used to identify them. Each label has
|
||
|
the name of the JTAG signal and the position in the J6 connector
|
||
|
of the Milkymist One.
|
||
|
|
||
|
|
||
|
Building UrJTAG
|
||
|
---------------
|
||
|
|
||
|
Prequisite: the OpenWRT cross-compilation toolchain for the Ben
|
||
|
has to be installed. I.e., mipsel-openwrt-linux-gcc and friends
|
||
|
must be in PATH.
|
||
|
|
||
|
git clone git://urjtag.git.sourceforge.net/gitroot/urjtag/urjtag
|
||
|
cd urjtag/urjtag
|
||
|
./autogen.sh --host=mipsel-openwrt-linux --enable-cable=gpio \
|
||
|
--enable-lowlevel= --without-libusb --without-libftdi
|
||
|
make
|
||
|
|
||
|
|
||
|
Installing UrJTAG
|
||
|
-----------------
|
||
|
|
||
|
Prerequisites: the Ben must be reachable via TCP/IP. We assume we
|
||
|
can reach it under the name "ben". ldconfig must be installed (*).
|
||
|
|
||
|
(*) E.g., with
|
||
|
wget http://downloads.qi-hardware.com/software/packages/NanoNote/Ben/2012-10-24/ldconfig_0.9.33.2-1_xburst.ipk
|
||
|
opkg install ldconfig_0.9.33.2-1_xburst.ipk
|
||
|
|
||
|
scp src/apps/jtag/.libs/jtag ben:/usr/bin/
|
||
|
scp src/.libs/liburjtag.so.0.0.0 ben:/usr/lib/
|
||
|
ssh ben mkdir -p /usr/local/share/urjtag
|
||
|
scp -r data/* ben:/usr/local/share/urjtag/
|
||
|
ssh ben ldconfig
|
||
|
|
||
|
|
||
|
Enabling the /sys/class/gpio/... interface
|
||
|
------------------------------------------
|
||
|
|
||
|
For simplicity, we use the "gpio" cable driver of UrTAG. This
|
||
|
driver requires the Ben kernel to be compiled with
|
||
|
CONFIG_GPIO_SYSFS (this option is not available as a module).
|
||
|
If /sys/class/gpio does not exist, we need to rebuild the
|
||
|
kernel.
|
||
|
|
||
|
Prerequisite: you have checked out and set up the openwrt-xburst
|
||
|
repository from Qi-Hardware.
|
||
|
|
||
|
make kernel_menuconfig
|
||
|
|
||
|
Then go to "Device Drivers" > "GPIO Support" and enable
|
||
|
"/sys/class/gpio/... (sysfs interface)" (GPIO_SYSFS)
|
||
|
|
||
|
|
||
|
Enabling ZRAM
|
||
|
-------------
|
||
|
|
||
|
UrTAG spends memory fairly generously and loading a bitstream for
|
||
|
the XC6LX45 of Milkymist One is likely to exceed the memory
|
||
|
available on the Ben.
|
||
|
|
||
|
Since we can't swap on ubifs and we can't use an SD card for swap
|
||
|
since the 8:10 card slot is already occupied, the next best choice
|
||
|
is to use ZRAM.
|
||
|
|
||
|
Note that this is not necessary if the driver for the respective
|
||
|
target isn't quite as memory-hungry as the one for Xilinx FPGAs,
|
||
|
or if the bitstream is smaller.
|
||
|
|
||
|
make kernel_menuconfig
|
||
|
|
||
|
Then go to "Device Drivers" and enable "Staging drivers" (STAGING).
|
||
|
After that, enter "Staging drivers" and enable "Compressed RAM
|
||
|
block device support" (ZRAM).
|
||
|
|
||
|
|
||
|
Building and installing the OpenWRT kernel
|
||
|
------------------------------------------
|
||
|
|
||
|
make -j5
|
||
|
scp bin/xburst/openwrt-xburst-qi_lb60-uImage.bin ben:
|
||
|
ssh ben flash_eraseall /dev/mtd1
|
||
|
ssh ben nandwrite -p /dev/mtd1 openwrt-xburst-qi_lb60-uImage.bin
|
||
|
|
||
|
|
||
|
Using UBB-JTAG-M1
|
||
|
-----------------
|
||
|
|
||
|
First connect UBB-JTAG-M1 to the Milkymist One (powered off) but
|
||
|
without inserting UBB into the Ben. This should look like this:
|
||
|
|
||
|
http://downloads.qi-hardware.com/people/werner/ubb/jtag/ubb-jtag-m1-j6.jpg
|
||
|
|
||
|
Then boot the Ben and disable the MMC driver with
|
||
|
|
||
|
echo jz4740-mmc.0 >/sys/bus/platform/drivers/jz4740-mmc/unbind
|
||
|
|
||
|
Now UBB-JTAG-M1 can be safely connected to the Ben. After connecting
|
||
|
power to the Milkymist One, we can probe it with
|
||
|
|
||
|
ben# jtag
|
||
|
jtag> cable gpio tdi=107 tdo=105 tck=109 tms=108
|
||
|
jtag> detect
|
||
|
|
||
|
For the next step, we need fjmem.bit, e.g., available here:
|
||
|
http://milkymist.org/updates/fjmem.bit.bz2
|
||
|
|
||
|
We also need to enable swap space on ZRAM. 32 MB should be
|
||
|
sufficient:
|
||
|
|
||
|
ben# echo 33554432 >/sys/block/zram0/disksize
|
||
|
ben# mkswap /dev/zram0
|
||
|
ben# swapon /dev/zram0
|
||
|
|
||
|
Now fjmem.bit can be loaded and executed:
|
||
|
|
||
|
jtag> instruction CFG_OUT 000100 BYPASS
|
||
|
jtag> instruction CFG_IN 000101 BYPASS
|
||
|
jtag> pld load "fjmem.bit"
|
||
|
jtag> initbus fjmem opcode=000010
|
||
|
jtag> detectflash 0
|
||
|
|
||
|
Since the sysfs GPIO interface is rather slow and we make things
|
||
|
worse by swapping to compressed RAM, the loading of fjmem.bit
|
||
|
takes about four or five minutes.
|