gnurabbit/user: update code to the latest version.

Added the generation of the libfpga_loader shared library. And
comment the output messages of the fpga_loader.

This fpga_loader is only valid for SPEC V2.0 or higher.
parent d2aa8523
......@@ -11,9 +11,15 @@ STRIP = $(CROSS_COMPILE)strip
OBJCOPY = $(CROSS_COMPILE)objcopy
OBJDUMP = $(CROSS_COMPILE)objdump
ALL = rrcmd flip
ALL = rrcmd flip fpga_loader libfpga_loader.so
fpga_loader: fpga_loader.o rr_io.o gpio.o
$(CC) $(CFLAGS) $^ -o $@
libfpga_loader.so: rr_io.o gpio.o
$(CC) -shared -o $@ $^
all: $(ALL)
clean:
rm -f $(ALL) *.o *~
\ No newline at end of file
rm -f $(ALL) *.o *~
#include <stdio.h>
#include <unistd.h>
#include <sys/time.h>
#include "rr_io.h"
#include "gpio.h"
int main(int argc, char *argv[])
{
uint32_t i=0;
if(argc != 2){
printf( "usage: %s filename \n", argv[0]);
}
else{
rr_init();
gennum_writel(0xE001F07C, 0x808); // set local bus freq
//gennum_writel(0x00002000, 0xA04); // GPIO direction
//gennum_writel(0x0000D000, 0xA08); // GPIO output enable
//gennum_writel(0x00008000, 0xA0C); // GPIO output value
printf("Firmware to be loaded : %s \n", argv[1]);
gpio_init();
gpio_bootselect(GENNUM_FPGA);
//gpio_bootselect(FPGA_FLASH);
//printf("CLK_CSR : %.8X\n", gennum_readl(0x808));
/*
while(1){
i++;
//printf("%5d Flash status : %.2X\n", i, flash_read_status());
printf("%5d Flash status : %.8X\n", i, flash_read_id());
sleep(1);
}
*/
//printf("Firmware to be loaded : %s \n", argv[1]);
rr_load_bitstream_from_file(argv[1]);
printf("Firmware loaded successfully ! \n");
//printf("Firmware loaded successfully ! \n");
}
}
#include <stdio.h>
#include <unistd.h>
#include <sys/time.h>
#include "rr_io.h"
#include "gpio.h"
int main(int argc, char *argv[])
{
uint32_t i=0;
if(argc != 2){
printf( "usage: %s filename \n", argv[0]);
}
else{
rr_init();
gpio_init();
gpio_bootselect(GENNUM_FPGA);
//gpio_bootselect(FPGA_FLASH);
printf("CLK_CSR : %.8X\n", gennum_readl(0x808));
/*
while(1){
i++;
//printf("%5d Flash status : %.2X\n", i, flash_read_status());
printf("%5d Flash status : %.8X\n", i, flash_read_id());
sleep(1);
}
*/
printf("Firmware to be loaded : %s \n", argv[1]);
rr_load_bitstream_from_file(argv[1]);
printf("Firmware loaded successfully ! \n");
}
}
#include <stdio.h>
#include <stdlib.h>
#include <sys/time.h>
#include "rr_io.h"
#include "gpio.h"
#if 0
void sleep_us(uint32_t us)
{
struct timeval t1,t2;
int seconds, useconds;
int cond_1, cond_2;
seconds = us / 1000000;
useconds = us % 1000000;
gettimeofday(&t1, NULL);
do {
gettimeofday(&t2, NULL);
cond_1 = ((t2.tv_sec - t1.tv_sec) >= seconds);
cond_2 = (((t2.tv_usec + useconds) % 1000000) - t1.tv_usec) >= 0;
} while(!(cond_1 && cond_2));
}
#endif
void gpio_set1(uint32_t addr, uint8_t bit)
{
......@@ -76,7 +101,7 @@ static uint8_t spi_read8(void)
gpio_set0(FCL_IODATA_OUT, SPRI_CLKOUT);
for(i = 0; i < 8;i++){
usleep(SPI_DELAY);
// usleep(SPI_DELAY);
rx <<= 1;
if (gpio_get(GPIO_INPUT_VALUE, GPIO_SPRI_DIN))
......@@ -84,10 +109,10 @@ static uint8_t spi_read8(void)
//usleep(SPI_DELAY);
gpio_set1(FCL_IODATA_OUT, SPRI_CLKOUT);
usleep(SPI_DELAY);
// usleep(SPI_DELAY);
gpio_set0(FCL_IODATA_OUT, SPRI_CLKOUT);
}
usleep(SPI_DELAY);
// usleep(SPI_DELAY);
return rx;
}
......@@ -106,12 +131,12 @@ static void spi_write8(uint8_t tx)
tx<<=1;
usleep(SPI_DELAY);
// usleep(SPI_DELAY);
gpio_set1(FCL_IODATA_OUT, SPRI_CLKOUT);
usleep(SPI_DELAY);
// usleep(SPI_DELAY);
gpio_set0(FCL_IODATA_OUT, SPRI_CLKOUT);
}
usleep(SPI_DELAY);
// usleep(SPI_DELAY);
}
uint8_t flash_read_status(void)
......@@ -147,3 +172,163 @@ uint32_t flash_read_id(void)
return val;
}
static void wait_completion()
{
int not_done;
/* Wait completion of the Bulk erase Operation */
while(not_done) {
gpio_set0(GPIO_OUTPUT_VALUE, GPIO_FLASH_CS);
spi_write8(FLASH_RDSR); /* Read Status register */
not_done = (spi_read8() & 0x01);
gpio_set1(GPIO_OUTPUT_VALUE, GPIO_FLASH_CS);
//usleep(SPI_DELAY);
}
}
static void bulk_erase()
{
int not_done;
//printf("Erasing flash memory.....");
gpio_bootselect(GENNUM_FLASH);
gpio_set0(GPIO_OUTPUT_VALUE, GPIO_FLASH_CS);
spi_write8(FLASH_WREN); /* Write Enable */
gpio_set1(GPIO_OUTPUT_VALUE, GPIO_FLASH_CS);
usleep(SPI_DELAY);
gpio_set0(GPIO_OUTPUT_VALUE, GPIO_FLASH_CS);
spi_write8(FLASH_BE); /* Bulk erase */
gpio_set1(GPIO_OUTPUT_VALUE, GPIO_FLASH_CS);
wait_completion();
//printf("OK\n");
}
static int __do_load_mcs_to_flash(const uint8_t *data, uint32_t size)
{
int i, j;
int limit = 0;
int num_pages = 0;
unsigned int addr = 0;
int not_done, tmp;
bulk_erase();
/* Round up if the size is not a multiply of a page (256 bytes) */
num_pages = size / 256 + !!(size % 256);
gpio_bootselect(GENNUM_FLASH);
/* Select the FLASH using Chip Select signal */
// printf("Programming....\n");
for (j = 0; j < num_pages; j ++) {
if (j == (num_pages-1))
limit = size%256;
else
limit = 256;
gpio_set0(GPIO_OUTPUT_VALUE, GPIO_FLASH_CS);
spi_write8(FLASH_WREN); /* Write Enable */
gpio_set1(GPIO_OUTPUT_VALUE, GPIO_FLASH_CS);
usleep(SPI_DELAY);
gpio_set0(GPIO_OUTPUT_VALUE, GPIO_FLASH_CS);
spi_write8(FLASH_PP); /* Page Program */
spi_write8((addr >> 16) & 0x00ff); /* Address to start writing (MSB)*/
spi_write8((addr >> 8) & 0x00ff); /* Address to start writing */
spi_write8(addr & 0x00ff); /* Address to start writing (LSB) */
for (i=0; i < limit; i++) {
spi_write8(data[j*256 + i]);
//printf("Data[%d] = 0x%x\n", i+j*256, data[i]);
}
gpio_set1(GPIO_OUTPUT_VALUE, GPIO_FLASH_CS);
addr += 256;
not_done = 1;
// usleep(SPI_DELAY);
wait_completion();
// printf("[%d] ", j);
}
// printf("\nFinished\n");
return 0;
}
int load_mcs_to_flash(char * filename)
{
uint8_t *buf;
FILE *f;
uint32_t size;
f=fopen(filename,"rb");
if(!f) return -1;
fseek(f, 0, SEEK_END);
size = ftell(f);
//printf("Filename: %s. Size: %d bytes\n", filename, size);
buf = malloc(size);
if(!buf)
{
fclose(f);
return -1;
}
fseek(f, 0, SEEK_SET);
fread(buf, 1, size, f);
fclose(f);
int rval = __do_load_mcs_to_flash(buf, size);
free(buf);
return rval;
}
int readback_flash(char *filename, uint32_t size, uint32_t addr)
{
uint8_t *data;
FILE *f;
uint32_t i;
data = malloc(size);
if(!f)
return -1;
gpio_bootselect(GENNUM_FLASH);
gpio_set0(GPIO_OUTPUT_VALUE, GPIO_FLASH_CS);
spi_write8(FLASH_READ); /* Read Data bytes */
spi_write8((addr >> 16) & 0x00ff); /* Address to start writing (MSB)*/
spi_write8((addr >> 8) & 0x00ff); /* Address to start writing */
spi_write8(addr & 0x00ff); /* Address to start writing (LSB) */
for (i=0; i < size; i++) {
spi_write8(data[i]);
//printf("Data[%d] = %d\n", i, data[i]);
}
gpio_set1(GPIO_OUTPUT_VALUE, GPIO_FLASH_CS);
f=fopen(filename,"wb");
fwrite(data, 1, size, f);
fclose(f);
free(data);
return 0;
}
int force_load_fpga_from_flash ()
{
gpio_bootselect(FPGA_FLASH);
gennum_writel(0, SPRI_CONFIG);
usleep(100);
gennum_writel(1, SPRI_CONFIG);
}
......@@ -23,7 +23,7 @@
#define GPIO_BOOTSEL0 15
#define GPIO_BOOTSEL1 14
#define SPI_DELAY 50
#define SPI_DELAY 20
#define FLASH_WREN 0x06
#define FLASH_WRDI 0x04
......@@ -45,3 +45,6 @@ void gpio_init(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 ();
int readback_flash(char *filename, uint32_t size, uint32_t addr);
int load_mcs_to_flash(char * filename);
#!/bin/bash
cat pfc_top.bin | ./gnurabbit/user/flip > /lib/firmware/pfc_top_flipped.bin
#rmmod rawrabbit
insmod gnurabbit/kernel/rawrabbit.ko
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