Agenda
- Requirements
- Hardware Setup
- Software Setup
- Flash the FPGA
Requirements
- Hardware
- 1 x PCB to test (from ORS Radio Board PCB V4.4)
- 1 x lab power supply (that you can control in current)
- 1 x computer running on Ubuntu 20.04 with miniPCIe slot available + customised mini PCIe ribbon
- 1 x custom power injector
- 1 x RJ45 cable
- Software:
- openocd: to flash the FPGA
Hardware Setup
First of all, make sure there is no short circuit in the PCB. Follow the beginning of rapidspace-How.To.Test.Your.ORS.Radio.Board.PCB procedure to make sure the voltages are OK.

Software setup
The most practice way is to have the "flash-fpga" folder from Rapid.Space with everything inside.
Follow https://handbook.rapid.space/provider/rapidspace-HowTo.ORS.Assembly.Process.Generate.Image#patched_openocd to install openocd.
Get the FPGA bitstream from RapidSpace team.
Download bscan_spi_xc7a35t.bit file and make sure you name it bscan_spi_xc7a35t.bit.
Prepare a configuration file "pcie_radio.cfg" with the following content (make sure to replace BITSTREAM_NAME with the bitstream you received from RapidSpace):
interface ftdi
ftdi_vid_pid 0x0403 0x6014
ftdi_channel 0
ftdi_layout_init 0x00e8 0x60eb
reset_config none
source [find cpld/xilinx-xc7.cfg]
source [find cpld/jtagspi.cfg]
adapter_khz 10000
proc fpga_program {} {
global _CHIPNAME
xc7_program $_CHIPNAME.tap
}
init
jtagspi_init 0 bscan_spi_xc7a35t.bit
jtagspi_program BITSTREAM_NAME 0x0
fpga_program
shutdown
Write the eeprom of the PCB
In order to recognize the PCB, our software needs to be able to retrieve some information in the eeprom. It is mandatory to write the eeprom as soon as you prepare a PCB for the first time.
cd ~/
[ -d ors-ssd-utils ] || git clone https://lab.nexedi.com/nexedi/ors-ssd-utils
cd ~/ors-ssd-utils/eeprom
git pull
# change the config.txt with the correct product id (WARNING: the product id must be listed in README, if you don't find it in the README, contact RapidSpace)
# change the config.txt with the serial that RapidSpace gave you (it should be of the form "F122": one letter followed by several figures)
./write_eeprom.bash
Please don't move to the next step before writing the serial and the product id to eeprom!
Flash the FPGA
root@orsLAB:~# ./openocd/src/openocd -s ./openocd/tcl -f pcie_radio.cfg
# or if you have flash-fpga folder
# cd ~/flash-fpga
# ./openocd -s ./tcl -f pcie_radio.cfg
Open On-Chip Debugger 0.11.0-dirty (2022-08-08-14:11)
Licensed under GNU GPL v2
For bug reports, read
http://openocd.org/doc/doxygen/bugs.html
DEPRECATED! use 'adapter driver' not 'interface'
Info : auto-selecting first available session transport "jtag". To override use 'transport select <transport>'.
DEPRECATED! use 'adapter speed' not 'adapter_khz'
Info : ftdi: if you experience problems at higher adapter clocks, try the command "ftdi_tdo_sample_edge falling"
Info : clock speed 10000 kHz
Info : JTAG tap: xc7.tap tap/device found: 0x0362d093 (mfg: 0x049 (Xilinx), part: 0x362d, ver: 0x0)
Info : JTAG tap: xc7.tap tap/device found: 0x0362d093 (mfg: 0x049 (Xilinx), part: 0x362d, ver: 0x0)
Info : Found flash device 'cyp s25fl256l' (ID 0x00196001)
Warn : device needs paging or 4-byte addresses - not implemented
Info : Found flash device 'cyp s25fl256l' (ID 0x00196001)
Warn : device needs paging or 4-byte addresses - not implemented
Info : Found flash device 'cyp s25fl256l' (ID 0x00196001)
Warn : device needs paging or 4-byte addresses - not implemented
Info : Found flash device 'cyp s25fl256l' (ID 0x00196001)
Warn : device needs paging or 4-byte addresses - not implemented
Info : sector 0 took 245 ms
Info : sector 1 took 244 ms
Info : sector 2 took 247 ms
Info : sector 3 took 246 ms
Info : sector 4 took 243 ms
Info : sector 5 took 257 ms
Info : sector 6 took 245 ms
Info : sector 7 took 255 ms
Info : sector 8 took 243 ms
Info : sector 9 took 248 ms
Info : sector 10 took 261 ms
Info : sector 11 took 257 ms
Info : sector 12 took 254 ms
Info : sector 13 took 251 ms
Info : sector 14 took 257 ms
Info : sector 15 took 243 ms
Info : sector 16 took 255 ms
Info : sector 17 took 257 ms
Info : sector 18 took 248 ms
Info : sector 19 took 246 ms
Info : sector 20 took 253 ms
Info : sector 21 took 248 ms
Info : sector 22 took 249 ms
Info : sector 23 took 239 ms
Info : sector 24 took 266 ms
Info : sector 25 took 269 ms
Info : sector 26 took 266 ms
Info : sector 27 took 264 ms
Info : sector 28 took 271 ms
Info : sector 29 took 273 ms
Info : sector 30 took 277 ms
Info : sector 31 took 267 ms
Info : sector 32 took 250 ms
Info : sector 33 took 253 ms
Info : sector 34 took 249 ms
Info : sector 35 took 240 ms
Info : sector 36 took 254 ms
Info : sector 37 took 252 ms
Info : sector 38 took 259 ms
Info : sector 39 took 244 ms
Info : sector 40 took 251 ms
Info : sector 41 took 257 ms
Info : sector 42 took 251 ms
Info : sector 43 took 250 ms
Info : sector 44 took 246 ms
Info : sector 45 took 250 ms
Info : sector 46 took 252 ms
Info : sector 47 took 250 ms
Info : sector 48 took 251 ms
Info : sector 49 took 251 ms
Info : sector 50 took 255 ms
Info : sector 51 took 249 ms
Info : sector 52 took 254 ms
Info : sector 53 took 254 ms
Info : sector 54 took 246 ms
Info : sector 55 took 251 ms
Info : sector 56 took 272 ms
Info : sector 57 took 290 ms
Info : sector 58 took 265 ms
Info : sector 59 took 275 ms
Info : sector 60 took 271 ms
Info : sector 61 took 264 ms
Info : sector 62 took 268 ms
Info : sector 63 took 273 ms
Info : sector 64 took 253 ms
Info : sector 65 took 252 ms
Info : sector 66 took 241 ms
Info : sector 67 took 244 ms
Info : sector 68 took 262 ms
Info : sector 69 took 254 ms
Info : sector 70 took 258 ms
Info : sector 71 took 250 ms
Info : sector 72 took 256 ms
Info : sector 73 took 267 ms
Info : sector 74 took 263 ms
Info : sector 75 took 253 ms
Info : sector 76 took 260 ms
Info : sector 77 took 249 ms
Info : sector 78 took 246 ms
Info : sector 79 took 242 ms
Info : sector 80 took 244 ms
Info : sector 81 took 251 ms
Info : sector 82 took 245 ms
Info : sector 83 took 249 ms
Info : sector 84 took 258 ms
Info : sector 85 took 258 ms
Info : sector 86 took 257 ms
Info : sector 87 took 255 ms
Info : sector 88 took 264 ms
Info : sector 89 took 266 ms
Info : sector 90 took 268 ms
Info : sector 91 took 266 ms
Info : sector 92 took 266 ms
Info : sector 93 took 269 ms
Info : sector 94 took 259 ms
Info : sector 95 took 272 ms
Info : sector 96 took 252 ms
Info : sector 97 took 252 ms
Info : sector 98 took 250 ms
Info : sector 99 took 250 ms
Info : sector 100 took 251 ms
Info : sector 101 took 252 ms
Info : sector 102 took 254 ms
Info : sector 103 took 250 ms
Info : sector 104 took 249 ms
Info : sector 105 took 259 ms
Info : sector 106 took 248 ms
Info : sector 107 took 252 ms
Info : sector 108 took 248 ms
Info : sector 109 took 245 ms
Info : sector 110 took 244 ms
Info : sector 111 took 252 ms
Info : sector 112 took 249 ms
Info : sector 113 took 250 ms
Info : sector 114 took 242 ms
Info : sector 115 took 248 ms
Info : sector 116 took 254 ms
Info : sector 117 took 255 ms
Info : sector 118 took 244 ms
Info : sector 119 took 249 ms
Info : sector 120 took 270 ms
Info : sector 121 took 275 ms
Info : sector 122 took 270 ms
Info : sector 123 took 269 ms
Info : sector 124 took 297 ms
Info : sector 125 took 277 ms
Info : sector 126 took 279 ms
Info : sector 127 took 287 ms
Info : Found flash device 'cyp s25fl256l' (ID 0x00196001)
Warn : device needs paging or 4-byte addresses - not implemented
shutdown command invoked
Message
The flashing process takes around 1 minute.