kopia lustrzana https://github.com/pa3gsb/Radioberry-2.x
fpga loader utility for pi5
rodzic
64c4cf1a13
commit
517ae1811e
|
@ -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.
|
||||
|
|
|
@ -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)
|
|
@ -0,0 +1,8 @@
|
|||
|
||||
Gatewareloader.
|
||||
|
||||
- make loadFPGA
|
||||
|
||||
- copy your radioberry.rbf into the folder
|
||||
|
||||
- sudo ./loadFPGA
|
|
@ -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;
|
||||
}
|
|
@ -0,0 +1,3 @@
|
|||
void processFileInput ( );
|
||||
int prepareLoading ();
|
||||
void programByte ( char one_byte );
|
Ładowanie…
Reference in New Issue