From 095543fa76775443c4f32a00dda16dcce748078d Mon Sep 17 00:00:00 2001 From: Steven Jmaev Date: Wed, 11 Oct 2023 11:33:22 -0700 Subject: [PATCH] added support for rockpi4 board (rk3399 cpu) --- Makefile | 8 ++++++-- README.md | 25 ++++++++++++++++++++++++- src/common.h | 2 ++ src/hosts/rk3399.h | 44 ++++++++++++++++++++++++++++++++++++++++++++ src/picberry.cpp | 27 ++++++++++++++++++++++++--- 5 files changed, 100 insertions(+), 6 deletions(-) create mode 100644 src/hosts/rk3399.h diff --git a/Makefile b/Makefile index 9c47525..fa97dc8 100644 --- a/Makefile +++ b/Makefile @@ -10,6 +10,7 @@ BINDIR = $(PREFIX)/bin SRCDIR = src BUILDDIR = build MKDIR = mkdir -p +LDFLAGS = DEVICES = $(BUILDDIR)/devices/dspic33e.o \ $(BUILDDIR)/devices/dspic33f.o \ @@ -28,21 +29,24 @@ raspberrypi: CFLAGS += -DBOARD_RPI raspberrypi2: CFLAGS += -DBOARD_RPI2 raspberrypi4: CFLAGS += -DBOARD_RPI4 am335x: CFLAGS += -DBOARD_AM335X +rk3399: CFLAGS += -DBOARD_RK3399 +rk3399: LDFLAGS += -L/usr/lib -l:libwiringx.a default: - @echo "Please specify a target with 'make raspberrypi', 'make a10' or 'make am335x'." + @echo "Please specify a target with 'make raspberrypi', 'make a10', 'make am335x', or 'make rk3399'." raspberrypi: prepare picberry raspberrypi2: prepare picberry raspberrypi4: prepare picberry a10: prepare picberry +rk3399: prepare picberry am335x: prepare picberry gpio_test prepare: $(MKDIR) $(BUILDDIR)/devices picberry: $(BUILDDIR)/inhx.o $(DEVICES) $(BUILDDIR)/picberry.o - $(CC) $(CFLAGS) -o $(TARGET) $(BUILDDIR)/inhx.o $(DEVICES) $(BUILDDIR)/picberry.o + $(CC) $(CFLAGS) -o $(TARGET) $(BUILDDIR)/inhx.o $(DEVICES) $(BUILDDIR)/picberry.o $(LDFLAGS) gpio_test: $(BUILDDIR)/gpio_test.o $(CC) $(CFLAGS) -o gpio_test $(BUILDDIR)/gpio_test.o diff --git a/README.md b/README.md index c099e5f..e30ddea 100644 --- a/README.md +++ b/README.md @@ -22,6 +22,7 @@ It theorically supports dsPIC33E/PIC24E, dsPIC33F/PIC24H, PIC24FJ, PIC18FxxJxx, - the [Raspberry Pi](https://www.raspberrypi.org/) - Allwinner A10-based boards (like the [Cubieboard](http://cubieboard.org/)) - TI AM335x-based boards (like the [Beaglebone Black](https://beagleboard.org/black) or the [AM3359 ICEv2](http://www.ti.com/tool/tmdsice3359)). +- RK3399 based boards (like Radxa's [RockPi4(A/B/B+/C)](https://rockpi.org/rockpi4)) Support for additional boards and processors can be easily added, providing the following macro in a header file inside the _hosts_ folder: @@ -54,9 +55,10 @@ To build picberry launch `make TARGET`, where _TARGET_ can be one of the followi | ------------- | ------------------------------------------ | | raspberrypi | Raspberry Pi v1 or Zero | | raspberrypi2 | Raspberry Pi v2 or v3 | -| raspberrypi4 | Raspberry Pi 4A or 4B or CM4 +| raspberrypi4 | Raspberry Pi 4A or 4B or CM4 | | am335x | Boards based on TI AM335x (BeagleBone) | | a10 | Boards based on Allwinner A10 (Cubieboard) | +| rk3399 | Boards based on Rockchip RK3399 (RockPi) | Then launch `sudo make install` to install it to /usr/bin. @@ -64,6 +66,27 @@ To change destination prefix use PREFIX=, e.g. `sudo make install PREFIX=/usr/lo For cross-compilation, given that you have the required cross toolchain in you PATH, simply export the `CROSS_COMPILE` variable before launching `make`, e.g. `CROSS_COMPILE=arm-linux-gnueabihf- make raspberrypi2`. +### Note about rk3399 target + +To build for rk3399-based boards, you must install the static library for [wiringX](https://github.com/wiringX/wiringX). + +```bash +sudo apt-get update && sudo apt-get install -y build-essential cmake +BRANCH=rk3399 # use this branch until it has been merged into master, at which point use 'master' +cd ~/tmp +wget https://github.com/wiringX/wiringX/archive/refs/heads/${BRANCH}.zip +unzip ${BRANCH}.zip +cd wiringX-${BRANCH} +mkdir build +cd build +cmake .. +make +cpack -G DEB +sudo dpkg -i libwiringx*.deb +``` + +After running these commands, you should have the static library `libwiringx.a` available at `/usr/lib/`. + ## Using picberry picberry [options] diff --git a/src/common.h b/src/common.h index 5cbfc05..063f8c3 100644 --- a/src/common.h +++ b/src/common.h @@ -31,6 +31,8 @@ #include "hosts/rpi4.h" #elif defined(BOARD_AM335X) #include "hosts/am335x.h" +#elif defined(BOARD_RK3399) +#include "hosts/rk3399.h" #endif #include "devices/device.h" diff --git a/src/hosts/rk3399.h b/src/hosts/rk3399.h new file mode 100644 index 0000000..bc9ae25 --- /dev/null +++ b/src/hosts/rk3399.h @@ -0,0 +1,44 @@ +/* + * Raspberry Pi PIC Programmer using GPIO connector + * https://github.com/WallaceIT/picberry + * Copyright 2016 Francesco Valla + * + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include "wiringx.h" +#include +/* GPIO registers address */ +#define GPIO_BASE 0x00000000 +#define PORTOFFSET 0 + +/* GPIO setup macros. Always use GPIO_IN(x) before using GPIO_OUT(x) */ +#define GPIO_IN(g) (pinMode(g, PINMODE_INPUT)) +#define GPIO_OUT(g) (pinMode(g, PINMODE_OUTPUT)) + +#define GPIO_SET(g) (digitalWrite(g, HIGH)) +#define GPIO_CLR(g) (digitalWrite(g, LOW)) +#define GPIO_LEV(g) (digitalRead(g)) & 0x1 + +/* default GPIO <-> PIC connections */ +// To override, give the CLI option: -g PGC,PGD,MCLR + +// For RockPi4, these gpio #'s correspond to pin #'s 33, 35, 37. +// see: https://wiki.radxa.com/Rockpi4/hardware/gpio +#define DEFAULT_PIC_CLK 76 /* PGC - Output */ +#define DEFAULT_PIC_DATA 133 /* PGD - I/O */ +#define DEFAULT_PIC_MCLR 158 /* MCLR - Output */ + +#define WIRINGX_PLATFORM "rock4" diff --git a/src/picberry.cpp b/src/picberry.cpp index ba5001c..27e0a9c 100644 --- a/src/picberry.cpp +++ b/src/picberry.cpp @@ -52,6 +52,11 @@ #include "devices/pic24fjxxxga2_gb2.h" #include "devices/pic24fxxka1xx.h" + +#if defined(BOARD_RK3399) +#include "wiringx.h" +#endif + int mem_fd; void *gpio_map; volatile uint32_t *gpio; @@ -209,9 +214,15 @@ int main(int argc, char *argv[]) << endl; exit(0); } +#if defined(BOARD_RK3399) + pic_clk = (pic_clk_port-'A'); + pic_data = (pic_data_port-'A'); + pic_mclr = (pic_mclr_port-'A'); +#else pic_clk |= ((pic_clk_port-'A')*PORTOFFSET)<<8; pic_data |= ((pic_data_port-'A')*PORTOFFSET)<<8; pic_mclr |= ((pic_mclr_port-'A')*PORTOFFSET)<<8; +#endif } } @@ -374,6 +385,10 @@ int main(int argc, char *argv[]) /* Set up a memory regions to access GPIO */ void setup_io(void) { + +#if defined(BOARD_RK3399) + wiringXSetup(WIRINGX_PLATFORM, NULL); +#else /* open /dev/mem */ mem_fd = open("/dev/mem", O_RDWR|O_SYNC); if (mem_fd == -1) { @@ -391,6 +406,8 @@ void setup_io(void) /* Always use volatile pointer! */ gpio = (volatile uint32_t *) gpio_map; + +#endif GPIO_IN(pic_clk); // NOTE: MUST use GPIO_IN before GPIO_OUT GPIO_OUT(pic_clk); @@ -408,12 +425,15 @@ void setup_io(void) /* Release GPIO memory region */ void close_io(void) -{ +{ + #if defined(BOARD_RK3399) + GPIO_IN(pic_mclr); + return; + #else int ret; - + /* MCLR as input, puts the output driver in Hi-Z */ GPIO_IN(pic_mclr); - /* munmap GPIO */ ret = munmap(gpio_map, BLOCK_SIZE); if (ret == -1) { @@ -427,6 +447,7 @@ void close_io(void) perror("Cannot close /dev/mem"); exit(1); } + #endif } /* reset the device */