Commit dfc66d6e authored by Matthieu Cattin's avatar Matthieu Cattin

Add a library that handles firmware loading for SPEC board.

Library features are:
- Gennum GPIO configuration
- SPEC boot mode selection (Gennum to FPAG, Genum to Flash or Flash to FPGA)
- Bit bang SPI programming/erase/readback of the Flash
- Force FPGA reload from flash
- FPGA firmware loading using Gennum FCL (= FPGA Configuration Loader)

Function to load FPGA firmware from Gennum added to Python wrapper rr.py
parent 8c817685
......@@ -11,12 +11,15 @@ STRIP = $(CROSS_COMPILE)strip
OBJCOPY = $(CROSS_COMPILE)objcopy
OBJDUMP = $(CROSS_COMPILE)objdump
ALL = rrlib.so
ALL = rrlib.so rr_loader_lib.so
all: $(ALL)
rrlib.so: rrlib.o
$(CC) $(CFLAGS) -o $@ -shared $^
rr_loader_lib.so: rrlib.o rr_loader_lib.o
$(CC) $(CFLAGS) -o $@ -shared $^
clean:
rm -f $(ALL) *.o *~ *.so *.pyc
......@@ -9,8 +9,8 @@ fmt = { 1: 'B', 2: 'H', 4: 'I', 8: 'L' }
# some defaults from rawrabbit.h
RR_DEVSEL_UNUSED = 0xffff
RR_DEFAULT_VENDOR = 0x1a39
RR_DEFAULT_DEVICE = 0x0004
RR_DEFAULT_VENDOR = 0x1a39
RR_DEFAULT_DEVICE = 0x0004
RR_BAR_0 = 0x00000000
RR_BAR_2 = 0x20000000
......@@ -19,9 +19,14 @@ RR_BAR_BUF = 0xc0000000
bar_map = {
0 : RR_BAR_0,
2: RR_BAR_2,
4: RR_BAR_4,
0xc: RR_BAR_BUF }
2: RR_BAR_2,
4: RR_BAR_4,
0xc: RR_BAR_BUF }
# constants from rr_loader_lib.h
GENNUM_FLASH = 1
GENNUM_FPGA = 2
FPGA_FLASH = 3
# classes to interface with the driver via ctypes
......@@ -56,10 +61,12 @@ class RR_Iocmd(Structure):
class Gennum(object):
device = '/dev/rawrabbit'
rrlib = './rrlib.so'
rr_loader_lib = './rr_loader_lib.so'
def __init__(self):
"""get a file descriptor for the Gennum device"""
self.lib = CDLL(Gennum.rrlib)
self.loaderlib = CDLL(Gennum.rr_loader_lib)
self.fd = os.open(Gennum.device, os.O_RDWR)
def iread(self, bar, offset, width):
......@@ -179,6 +186,12 @@ class Gennum(object):
self.errno = self.lib.rr_devsel(self.fd, byref(ds))
return self.errno
def load_firmware(self, bitstream):
self.loaderlib.rr_init(self.fd)
self.loaderlib.gpio_config()
self.loaderlib.gpio_bootselect(GENNUM_FPGA)
self.loaderlib.rr_load_bitstream_from_file(bitstream)
if __name__ == '__main__':
g = Gennum()
print g.parse_addr('1a39:0004/1a39:0004@0020:0000')
......
This diff is collapsed.
#define FCL_CTRL 0xB00
#define FCL_STATUS 0xB04
#define FCL_IODATA_IN 0xB08
#define FCL_IODATA_OUT 0xB0C
#define FCL_EN 0xB10
#define GPIO_DIRECTION_MODE 0xA04
#define GPIO_OUTPUT_ENABLE 0xA08
#define GPIO_OUTPUT_VALUE 0xA0C
#define GPIO_INPUT_VALUE 0xA10
#define SPRI_CLKOUT 0
#define SPRI_DATAOUT 1
#define SPRI_CONFIG 2
#define SPRI_DONE 3
#define SPRI_XI_SWAP 4
#define SPRI_STATUS 5
#define GPIO_SPRI_DIN 13
#define GPIO_FLASH_CS 12
#define GPIO_BOOTSEL0 15
#define GPIO_BOOTSEL1 14
#define SPI_DELAY 20
#define FLASH_WREN 0x06
#define FLASH_WRDI 0x04
#define FLASH_RDID 0x9F
#define FLASH_RDSR 0x05
#define FLASH_WRSR 0x01
#define FLASH_READ 0x03
#define FLASH_FAST_READ 0x0B
#define FLASH_PP 0x02
#define FLASH_SE 0xD8
#define FLASH_BE 0xC7
#define GENNUM_FLASH 1
#define GENNUM_FPGA 2
#define FPGA_FLASH 3
int rr_init(int a_fd);
void rr_writel(uint32_t data, uint32_t addr);
uint32_t rr_readl(uint32_t addr);
void gennum_writel(uint32_t data, uint32_t addr);
uint32_t gennum_readl(uint32_t addr);
int rr_load_bitstream(const void *data, int size8);
int rr_load_bitstream_from_file(const char *file_name);
void gpio_set1(uint32_t addr, uint8_t bit);
void gpio_set0(uint32_t addr, uint8_t bit);
uint8_t gpio_get(uint32_t addr, uint8_t bit);
void gpio_config(void);
void gpio_bootselect(uint8_t select);
uint8_t flash_read_status(void);
uint32_t flash_read_id(void);
int force_load_fpga_from_flash (void);
int readback_flash(char *filename, uint32_t size, uint32_t addr);
int load_mcs_to_flash(char * filename);
#include <rawrabbit.h>
int rr_devsel(int fd, struct rr_devsel *ds);
int rr_devget(int fd, struct rr_devsel *ds);
int rr_iread(int fd, struct rr_iocmd *iocmd);
int rr_iwrite(int fd, struct rr_iocmd *iocmd);
int rr_read(int fd, struct rr_iocmd *iocmd);
int rr_write(int fd, struct rr_iocmd *iocmd);
int rr_irqwait(int fd);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment