usbd-blaster 0.1.3

USB Blaster for Embedded Devices
Documentation
# USB Blaster for Embedded Devices

## What is this?

A crate for emulating a USB Blaster device, written in [Rust](https://www.rust-lang.org/).

For the [Arduino MKR Vidor 4000](https://www.arduino.cc/en/Guide/MKRVidor4000), you can use this to program the onboard [FPGA](https://en.wikipedia.org/wiki/Field-programmable_gate_array) with [Quartus](https://en.wikipedia.org/wiki/Intel_Quartus_Prime).

## Usage

### Requirements

* Rust language (rustup, cargo)
* Embedded compiler toolchain
    * for ARM: arm-none-eabi-gcc (ArchLinux users, get gcc-arm-none-eabi-bin) and rustup target add thumbv6m-none-eabi
* Board flashing tool
    * for Atmel SAM: [Atmel SAM flashing tool]https://github.com/shumatech/BOSSA (aka bossac, comes in Arduino tools)

### Flashing the USB Blaster

#### Arduino MKR Vidor 4000
```bash
RUSTFLAGS='-C link-arg=-Tlink.x' cargo build --release --target thumbv6m-none-eabi --example arduino_mkrvidor4000
arm-none-eabi-objcopy -O binary target/thumbv6m-none-eabi/release/usbblaster-rs target/usbblaster-rs.bin
# Manual step: push reset button twice in quick succession to enter flash mode
bossac -i -d -U true -i -e -w -v target/usbblaster-rs.bin -R
```

### Using the USB Blaster

#### Intel (Altera) Quartus

```bash
# Verify that the blaster exists
jtagconfig
# Flash your FPGA
quartus_pgm -m jtag -o 'p;project-name.sof'
```

#### OpenOCD

```bash
openocd -f altera-usb-blaster.cfg
```

Example configuration:

```
interface usb_blaster
init
scan_chain
svf project.svf
exit
```

Make sure you've enabled SVF file generation, and change project.svf to the name of your project.

You can safely ignore the following error:

`Error: IR capture error at bit 2, saw 0x3FFFFFFFFFFFFD55 not 0x...3`

This seems to happen on other USB blasters too. If you know why this is and can fix it, feel free to open a PR.

## How it works

### USB

The board is set up as a USB device with the same VendorId and ProductId as an Altera USB Blaster.

The blaster communicates via a vendor-specific interface (Class = 255, SubClass = 255, Protocol = 255). When vendor-typed control requests are received, it emulates the ROM and the responses of the [FTDI245 chip](https://www.ftdichip.com/Products/ICs/FT245R.htm).

Just like the FT245, endpoint 1 is input-only and endpoint 2 is output-only. These are used to control blaster operation.

### Blaster

The blaster has two operating modes: bit-bang (default) or shift. In bit-bang, there is direct control of the JTAG lines; every received byte translates to instructions on how to drive TDI/TMS/TCK. It also contains flags for whether this instruction is a read or write, and if the blaster should switch to shift mode and shift out the next n bytes. In shift mode, the blaster will shift out the next n (anywhere from 0 to 63) received bytes to the TDI line.

Bit-bang mode is useful for JTAG control, shift mode is useful for a bulk transfer like writing an FPGA bitstream.

## Quirks/ Things to be aware of

This crate does JTAG only. These other pins are ignored, because [they are not part of JTAG](https://www.intel.com/content/dam/www/programmable/us/en/pdfs/literature/ug/ug_usb_blstr.pdf#_OPENTOPIC_TOC_PROCESSING_d116e1073)

- Active Serial (AS) mode
    - active-low chip enable (nCE)
    - active-low chip select (nCS)
    - active serial data out (DATAOUT)
- Passive Serial (PS) mode
    - active-low configuration status (nSTATUS)

## Special Thanks

* [Martino Facchin]https://github.com/facchinm