fpga loader utility for pi5

master
pa3gsb 2024-04-18 11:11:40 +02:00
rodzic 64c4cf1a13
commit 517ae1811e
5 zmienionych plików z 302 dodań i 2 usunięć

Wyświetl plik

@ -3,5 +3,3 @@ RadioBerry V2.0 - Ham radio cape for Raspberry PI
RadioBerry is working together with different Single Board Computers (SBC).
New development is foccusing on the rpi-4.

Wyświetl plik

@ -0,0 +1,44 @@
ifneq ($V,1)
Q ?= @
endif
#DEBUG = -g -O0
DEBUG = -O3
CC = gcc
INCLUDE = -I/usr/local/include
CFLAGS = $(DEBUG) -Wall $(INCLUDE) -Winline -pipe
LDFLAGS = -L/usr/local/lib
LDLIBS = -lpthread -lm
SRC = loadFPGA.c
OBJ = $(SRC:.c=.o)
BINS = $(SRC:.c=)
all:
$Q cat README.TXT
$Q echo " $(BINS)" | fmt
$Q echo ""
really-all: $(BINS)
loadFPGA: loadFPGA.o
$Q echo [link]
$Q $(CC) -o $@ loadFPGA.o $(LDFLAGS) $(LDLIBS)
.c.o:
$Q echo [CC] $<
$Q $(CC) -c $(CFLAGS) $< -o $@
clean:
$Q echo "[Clean]"
$Q rm -f $(OBJ) *~ core tags $(BINS)
tags: $(SRC)
$Q echo [ctags]
$Q ctags $(SRC)
depend:
makedepend -Y $(SRC)

Wyświetl plik

@ -0,0 +1,8 @@
Gatewareloader.
- make loadFPGA
- copy your radioberry.rbf into the folder
- sudo ./loadFPGA

Wyświetl plik

@ -0,0 +1,247 @@
#include <stdlib.h>
#include <stdio.h>
#include <pigpio.h>
#include <time.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <fcntl.h>
#include <stdint.h>
#include <sys/mman.h>
#include <sys/stat.h>
#include <sys/types.h>
#include "loadFPGA.h"
#define iPinCONF_DONE 22
#define iPinNSTATUS 26
#define oPinNCONFIG 27
#define oPinDATA 13
#define oPinDCLK 24
volatile uint32_t *GPIOBase = NULL ;
volatile uint32_t *RIOBase = NULL ;
volatile uint32_t *PADBase = NULL ;
volatile uint32_t *Pad = NULL ;
#define GPIO_FUNC_RIO 5
#define PAD_FUNC_IN 0xc8
#define PAD_FUNC_OUT 0x10
typedef struct{
uint32_t status;
uint32_t ctrl;
}GPIOregs;
#define GPIO ((GPIOregs*)GPIOBase)
typedef struct
{
uint32_t out;
uint32_t oe;
uint32_t in;
uint32_t InSync;
} rioregs;
#define rio ((rioregs *)RIOBase)
#define rioXOR ((rioregs *)(RIOBase + 0x1000 / 4))
#define rioSET ((rioregs *)(RIOBase + 0x2000 / 4))
#define rioCLR ((rioregs *)(RIOBase + 0x3000 / 4))
static void initialize_gpio_for_output(uint32_t pin) {
GPIO[pin].ctrl=GPIO_FUNC_RIO;
Pad[pin] = PAD_FUNC_OUT;
rioSET->oe = 0x01<<pin; // output driver
}
static void initialize_gpio_for_input(uint32_t pin) {
GPIO[pin].ctrl=GPIO_FUNC_RIO;
Pad[pin] = PAD_FUNC_IN;
//rioSET->in = 0x01<<pin;
rioCLR->oe = 0x01<<pin; //high impedance
}
static void set_pin(uint32_t pin) {
rioSET->oe = 0x01<<pin; // output driver
rioSET->out = 0x01<<pin;
}
static void clr_pin(uint32_t pin) {
rioSET->oe = 0x01<<pin; // output driver
rioCLR->out = 0x01<<pin;
}
static uint32_t read_pin(uint32_t pin) {
return (rio->in>>pin & 0x01);
}
static uint32_t get_pinhigh(uint32_t pin) {
return (GPIO[pin].status & 0x80000);
}
static uint32_t get_pinlow(uint32_t pin) {
return (GPIO[pin].status & 0x40000);
}
int main (int argc, char **argv)
{
printf ("\n\n");
printf ("=======================================================\n") ;
printf ("=== Raspberry Pi 5 - RadioBerry Gateware Loader ===\n") ;
printf ("=======================================================\n") ;
printf ("\n\n");
int memfd = open("/dev/mem", O_RDWR | O_SYNC);
uint32_t *map = (uint32_t *)mmap(
NULL,
64 * 1024 * 1024,
(PROT_READ | PROT_WRITE),
MAP_SHARED,
memfd,
0x1f00000000
);
if (map == MAP_FAILED)
{
printf("mmap failed: %s\n", strerror(errno));
return (-1);
};
close(memfd);
uint32_t *PERIBase = map;
GPIOBase = PERIBase + 0xD0000 / 4;
RIOBase = PERIBase + 0xe0000 / 4;
PADBase = PERIBase + 0xf0000 / 4;
Pad = PADBase + 1;
initialize_gpio_for_input(iPinCONF_DONE);
initialize_gpio_for_input(iPinNSTATUS);
initialize_gpio_for_output(oPinNCONFIG);
initialize_gpio_for_output(oPinDATA);
initialize_gpio_for_output(oPinDCLK);
fprintf(stderr, "Init done.\n");
/* Processing and Programming */
processFileInput( );
return 0;
}
void processFileInput( )
{
int seek_position = 0; /* file pointer position */
long int file_size = 0; /* programming file size */
int one_byte = 0; /* the byte to program */
long int i = 0; /* standard counter variable */
char filename[30];
strcpy(filename, "radioberry.rbf");
printf("%s will be loaded.\n", filename);
FILE *finputid;
/* Open programming file as READ and in BINARY */
finputid = fopen( "radioberry.rbf", "rb" );
if (finputid == NULL) {
perror("Error opening file");
return 1;
}
/* Start configuration */
if (prepareLoading() == -1) return;
fprintf(stderr, "now gateware loading....\n");
sleep(1);
char byte;
while (fread(&byte, sizeof(char), 1, finputid) == 1) {
programByte( byte );
}
//fprintf(stderr, "nstatus level = %d \n", read_pin(iPinNSTATUS));
//fprintf(stderr, "conf level = %d \n", read_pin(iPinCONF_DONE));
sleep(1);
/* Check if loading succeeded*/
if (read_pin(iPinNSTATUS) == 0) {
fprintf( stderr, "Error: programming failed; nstatus is low\n" );
return;
} else if (read_pin(iPinCONF_DONE) == 0) {
fprintf( stderr, "Error: programming failed; conf done is low\n" );
return;
}
set_pin(oPinDCLK);
usleep(1);
clr_pin(oPinDCLK);
usleep(1);
set_pin(oPinDCLK);
usleep(1);
clr_pin(oPinDCLK);
usleep(1);
set_pin(oPinDCLK);
usleep(1);
clr_pin(oPinDCLK);
fprintf( stdout, "gateware loaded succeeded\n" );
if ( finputid ) fclose(finputid);
}
void programByte( char one_byte )
{
char bit = 0;
int i = 0;
/* write from LSb to MSb */
for ( i = 0; i < 8; i++ )
{
bit = one_byte >> i;
bit = bit & 0x1;
if (bit) set_pin(oPinDATA); else clr_pin(oPinDATA);
fprintf(stderr, "");
set_pin(oPinDCLK);
clr_pin(oPinDCLK);
}
}
int prepareLoading()
{
fprintf( stdout, "Info: prepareLoading\n" );
//fprintf(stderr, "nstatus level = %d \n", read_pin(iPinNSTATUS));
//fprintf(stderr, "conf level = %d \n", read_pin(iPinCONF_DONE));
clr_pin(oPinNCONFIG);
clr_pin(oPinDATA);
clr_pin(oPinDCLK);
sleep(1);
set_pin(oPinNCONFIG);
int count = 0;
while (read_pin(iPinNSTATUS) == 0) {
count++;
sleep(10);
if (count >= 255) {
fprintf( stderr, "Error: prepareLoading failed\n" );
return -1;
}
}
//fprintf(stderr, "nstatus level = %d \n", read_pin(iPinNSTATUS));
//fprintf(stderr, "conf level = %d \n", read_pin(iPinCONF_DONE));
fprintf( stdout, "Info: prepareLoading done.\n" );
return 0;
}

Wyświetl plik

@ -0,0 +1,3 @@
void processFileInput ( );
int prepareLoading ();
void programByte ( char one_byte );