From 535634d848495c2beb426ec87b8f80aa92ca790d Mon Sep 17 00:00:00 2001 From: Tony Kuker Date: Sat, 29 Oct 2022 22:14:11 -0500 Subject: [PATCH] Now compiles --- cpp/hal/gpiobus_allwinner.cpp | 348 ++++++++++++++++++++---------- cpp/hal/gpiobus_allwinner.h | 153 ++++++------- cpp/hal/pi_defs/bpi-gpio.h | 10 + cpp/hal/pi_defs/bpi-m1-m1p-r1.cpp | 30 ++- cpp/hal/pi_defs/bpi-m2.cpp | 28 +++ cpp/hal/pi_defs/bpi-m2m.cpp | 28 +++ cpp/hal/pi_defs/bpi-m2m_1p1.cpp | 28 +++ cpp/hal/pi_defs/bpi-m2p.cpp | 28 +++ cpp/hal/pi_defs/bpi-m2u.cpp | 28 +++ cpp/hal/pi_defs/bpi-m3.cpp | 28 +++ cpp/hal/pi_defs/bpi-m64.cpp | 28 +++ cpp/log.h | 3 +- 12 files changed, 538 insertions(+), 202 deletions(-) diff --git a/cpp/hal/gpiobus_allwinner.cpp b/cpp/hal/gpiobus_allwinner.cpp index cbbe7126..0263d9cc 100644 --- a/cpp/hal/gpiobus_allwinner.cpp +++ b/cpp/hal/gpiobus_allwinner.cpp @@ -30,8 +30,14 @@ // //--------------------------------------------------------------------------- +#include +#include +#include +#include + #include "hal/gpiobus_allwinner.h" #include "hal/gpiobus.h" +#include "hal/pi_defs/bpi-gpio.h" #include "log.h" extern int wiringPiMode; @@ -40,44 +46,113 @@ extern int wiringPiMode; #pragma GCC diagnostic ignored "-Wunused-variable" #pragma GCC diagnostic ignored "-Wunused-parameter" +// #pragma GCC diagnostic ignored "-Wformat-truncation" + +#define GPIO_BANK(pin) ((pin) >> 5) +#define GPIO_NUM(pin) ((pin) & 0x1F) + +#define GPIO_CFG_INDEX(pin) (((pin) & 0x1F) >> 3) +#define GPIO_CFG_OFFSET(pin) ((((pin) & 0x1F) & 0x7) << 2) + +#define GPIO_PUL_INDEX(pin) (((pin) & 0x1F )>> 4) +#define GPIO_PUL_OFFSET(pin) (((pin) & 0x0F) << 1) + +#define SUNXI_R_GPIO_BASE 0x01F02000 +#define SUNXI_R_GPIO_REG_OFFSET 0xC00 +#define SUNXI_GPIO_BASE 0x01C20000 +#define SUNXI_GPIO_REG_OFFSET 0x800 +#define SUNXI_CFG_OFFSET 0x00 +#define SUNXI_DATA_OFFSET 0x10 +#define SUNXI_PUD_OFFSET 0x1C +#define SUNXI_BANK_SIZE 0x24 + +#define MAP_SIZE (4096*2) +#define MAP_MASK (MAP_SIZE - 1) + + +// TODO: Delete these. They're just to make things compile for now +int pinToGpio_BPI_M1P [64] = {0}; +int pinToGpio_BPI_M2 [64] = {0}; +int pinToGpio_BPI_M2M [64] = {0}; +int pinToGpio_BPI_M2M_1P1 [64] = {0}; +int pinToGpio_BPI_M2P [64] = {0}; +int pinToGpio_BPI_M2U [64] = {0}; +int pinToGpio_BPI_M3 [64] = {0}; +int pinToGpio_BPI_M64 [64] = {0}; +int pinTobcm_BPI_M1P [64] = {0}; +int pinTobcm_BPI_M2 [64] = {0}; +int pinTobcm_BPI_M2M [64] = {0}; +int pinTobcm_BPI_M2M_1P1 [64] = {0}; +int pinTobcm_BPI_M2P [64] = {0}; +int pinTobcm_BPI_M2U [64] = {0}; +int pinTobcm_BPI_M3 [64] = {0}; +int pinTobcm_BPI_M64 [64] = {0}; + +// #define BCM2708_PERI_BASE_DEFAULT 0x20000000 +// #define BCM2709_PERI_BASE_DEFAULT 0x3f000000 +// #define GPIO_BASE_OFFSET 0x200000 +#define FSEL_OFFSET 0 // 0x0000 +#define SET_OFFSET 7 // 0x001c / 4 +#define CLR_OFFSET 10 // 0x0028 / 4 +#define PINLEVEL_OFFSET 13 // 0x0034 / 4 +#define EVENT_DETECT_OFFSET 16 // 0x0040 / 4 +#define RISING_ED_OFFSET 19 // 0x004c / 4 +#define FALLING_ED_OFFSET 22 // 0x0058 / 4 +#define HIGH_DETECT_OFFSET 25 // 0x0064 / 4 +#define LOW_DETECT_OFFSET 28 // 0x0070 / 4 +#define PULLUPDN_OFFSET 37 // 0x0094 / 4 +#define PULLUPDNCLK_OFFSET 38 // 0x0098 / 4 + +#define PAGE_SIZE (4*1024) +#define BLOCK_SIZE (4*1024) + +// BpiBoardsType bpiboard[]; +GPIOBUS_Allwinner::BpiBoardsType GPIOBUS_Allwinner::bpiboard [] = +{ + { "bpi-0", -1, 0, 1, 2, 5, 0, NULL, NULL, NULL }, + { "bpi-1", -1, 1, 1, 2, 5, 0, NULL, NULL, NULL }, + { "bpi-2", -1, 2, 1, 2, 5, 0, NULL, NULL, NULL }, + { "bpi-3", -1, 3, 1, 2, 5, 0, NULL, NULL, NULL }, + { "bpi-4", -1, 4, 1, 2, 5, 0, NULL, NULL, NULL }, + { "bpi-5", -1, 5, 1, 2, 5, 0, NULL, NULL, NULL }, + { "bpi-6", -1, 6, 1, 2, 5, 0, NULL, NULL, NULL }, + { "bpi-7", -1, 7, 1, 2, 5, 0, NULL, NULL, NULL }, + { "bpi-8", -1, 8, 1, 2, 5, 0, NULL, NULL, NULL }, + { "bpi-9", -1, 9, 1, 2, 5, 0, NULL, NULL, NULL }, + { "bpi-10", -1, 10, 1, 2, 5, 0, NULL, NULL, NULL }, + { "bpi-11", -1, 11, 1, 2, 5, 0, NULL, NULL, NULL }, + { "bpi-12", -1, 12, 1, 2, 5, 0, NULL, NULL, NULL }, + { "bpi-13", -1, 13, 1, 2, 5, 0, NULL, NULL, NULL }, + { "bpi-14", -1, 14, 1, 2, 5, 0, NULL, NULL, NULL }, + { "bpi-15", -1, 15, 1, 2, 5, 0, NULL, NULL, NULL }, + { "bpi-new", -1, 16, 1, 2, 5, 0, NULL, NULL, NULL }, + { "bpi-x86", -1, 17, 1, 2, 5, 0, NULL, NULL, NULL }, + { "bpi-rpi", -1, 18, 1, 2, 5, 0, NULL, NULL, NULL }, + { "bpi-rpi2", -1, 19, 1, 2, 5, 0, NULL, NULL, NULL }, + { "bpi-rpi3", -1, 20, 1, 2, 5, 0, NULL, NULL, NULL }, + { "bpi-m1", 10001, 21, 1, 2, 5, 0, pinToGpio_BPI_M1P, physToGpio_BPI_M1P, pinTobcm_BPI_M1P }, + { "bpi-m1p", 10001, 22, 1, 2, 5, 0, pinToGpio_BPI_M1P, physToGpio_BPI_M1P, pinTobcm_BPI_M1P }, + { "bpi-r1", 10001, 23, 1, 2, 5, 0, pinToGpio_BPI_M1P, physToGpio_BPI_M1P, pinTobcm_BPI_M1P }, + { "bpi-m2", 10101, 24, 1, 2, 5, 0, pinToGpio_BPI_M2, physToGpio_BPI_M2, pinTobcm_BPI_M2 }, + { "bpi-m3", 10201, 25, 1, 3, 5, 0, pinToGpio_BPI_M3, physToGpio_BPI_M3, pinTobcm_BPI_M3 }, + { "bpi-m2p", 10301, 26, 1, 2, 5, 0, pinToGpio_BPI_M2P, physToGpio_BPI_M2P, pinTobcm_BPI_M2P }, + { "bpi-m64", 10401, 27, 1, 3, 5, 0, pinToGpio_BPI_M64, physToGpio_BPI_M64, pinTobcm_BPI_M64 }, + { "bpi-m2u", 10501, 28, 1, 3, 5, 0, pinToGpio_BPI_M2U, physToGpio_BPI_M2U, pinTobcm_BPI_M2U }, + { "bpi-m2m", 10601, 29, 1, 1, 5, 0, pinToGpio_BPI_M2M, physToGpio_BPI_M2M, pinTobcm_BPI_M2M }, + { "bpi-m2p_H2+", 10701, 30, 1, 2, 5, 0, pinToGpio_BPI_M2P, physToGpio_BPI_M2P, pinTobcm_BPI_M2P }, + { "bpi-m2p_H5", 10801, 31, 1, 2, 5, 0, pinToGpio_BPI_M2P, physToGpio_BPI_M2P, pinTobcm_BPI_M2P }, + { "bpi-m2u_V40", 10901, 32, 1, 3, 5, 0, pinToGpio_BPI_M2U, physToGpio_BPI_M2U, pinTobcm_BPI_M2U }, + { "bpi-m2z", 11001, 33, 1, 1, 5, 0, pinToGpio_BPI_M2P, physToGpio_BPI_M2P, pinTobcm_BPI_M2P }, +// { "bpi-r2", 11101, 34, 1, 3, 5, 0, pinToGpio_BPI_R2, physToGpio_BPI_R2, pinTobcm_BPI_R2 }, + { NULL, 0, 0, 1, 2, 5, 0, NULL, NULL, NULL }, +} ; + + + bool GPIOBUS_Allwinner::Init(mode_e mode, board_type::rascsi_board_type_e rascsi_type) { GPIOBUS::Init(mode, rascsi_type); - - int mem_fd; - uint8_t *gpio_mem; - uint8_t *r_gpio_mem; - uint32_t peri_base; - uint32_t gpio_base; - unsigned char buf[4]; - FILE *fp; - char buffer[1024]; - char hardware[1024]; - int found = 0; - printf("enter to sunxi_setup\n"); - - // mmap the GPIO memory registers - if ((mem_fd = open("/dev/mem", O_RDWR|O_SYNC) ) < 0) - return SETUP_DEVMEM_FAIL; - - if ((gpio_mem = malloc(BLOCK_SIZE + (PAGE_SIZE-1))) == NULL) - return SETUP_MALLOC_FAIL; - - if ((uint32_t)gpio_mem % PAGE_SIZE) - gpio_mem += PAGE_SIZE - ((uint32_t)gpio_mem % PAGE_SIZE); - - gpio_map = (uint32_t *)mmap( (caddr_t)gpio_mem, BLOCK_SIZE, PROT_READ|PROT_WRITE, MAP_SHARED|MAP_FIXED, mem_fd, SUNXI_GPIO_BASE); - pio_map = gpio_map + (SUNXI_GPIO_REG_OFFSET>>2); -//printf("gpio_mem[%x] gpio_map[%x] pio_map[%x]\n", gpio_mem, gpio_map, pio_map); -//R_PIO GPIO LMN - r_gpio_map = (uint32_t *)mmap( (caddr_t)0, BLOCK_SIZE, PROT_READ|PROT_WRITE, MAP_SHARED, mem_fd, SUNXI_R_GPIO_BASE); - r_pio_map = r_gpio_map + (SUNXI_R_GPIO_REG_OFFSET>>2); -//printf("r_gpio_map[%x] r_pio_map[%x]\n", r_gpio_map, r_pio_map); - - if ((uint32_t)gpio_map < 0) - return SETUP_MMAP_FAIL; - - return SETUP_OK; + sunxi_setup(); @@ -487,67 +562,58 @@ uint32_t GPIOBUS_Allwinner::Acquire() -int mtk_setup(void) -{ - int gpio_mmap_fd = 0; - if ((gpio_mmap_fd = open("/dev/mem", O_RDWR|O_SYNC)) < 0) { - fprintf(stderr, "unable to open mmap file"); - return -1; - } - - gpio_mmap_reg = (uint8_t*)mmap(NULL, 8 * 1024, PROT_READ | PROT_WRITE, - MAP_FILE | MAP_SHARED, gpio_mmap_fd, 0x10005000); - if (gpio_mmap_reg == MAP_FAILED) { - perror("foo"); - fprintf(stderr, "failed to mmap"); - gpio_mmap_reg = NULL; - close(gpio_mmap_fd); - return -1; - } - printf("gpio_mmap_fd=%d, gpio_map=%x", gpio_mmap_fd, gpio_mmap_reg); - - return SETUP_OK; - -} - uint32_t GPIOBUS_Allwinner::sunxi_readl(volatile uint32_t *addr) { + #ifndef __arm__ + (void)addr; + return 0; + #else printf("sunxi_readl\n"); uint32_t val = 0; uint32_t mmap_base = (uint32_t)addr & (~MAP_MASK); uint32_t mmap_seek = ((uint32_t)addr - mmap_base) >> 2; val = *(gpio_map + mmap_seek); return val; + #endif } void GPIOBUS_Allwinner::sunxi_writel(volatile uint32_t *addr, uint32_t val) { + #ifndef __arm__ + (void)addr; + (void)val; + return; + #else printf("sunxi_writel\n"); uint32_t mmap_base = (uint32_t)addr & (~MAP_MASK); uint32_t mmap_seek =( (uint32_t)addr - mmap_base) >> 2; *(gpio_map + mmap_seek) = val; + #endif } int GPIOBUS_Allwinner::sunxi_setup(void) { + #ifndef __arm__ + return SETUP_MMAP_FAIL; + #else int mem_fd; uint8_t *gpio_mem; - uint8_t *r_gpio_mem; - uint32_t peri_base; - uint32_t gpio_base; - unsigned char buf[4]; - FILE *fp; - char buffer[1024]; - char hardware[1024]; - int found = 0; + // uint8_t *r_gpio_mem; + // uint32_t peri_base; + // uint32_t gpio_base; + // unsigned char buf[4]; + // FILE *fp; + // char buffer[1024]; + // char hardware[1024]; + // int found = 0; printf("enter to sunxi_setup\n"); // mmap the GPIO memory registers if ((mem_fd = open("/dev/mem", O_RDWR|O_SYNC) ) < 0) return SETUP_DEVMEM_FAIL; - if ((gpio_mem = malloc(BLOCK_SIZE + (PAGE_SIZE-1))) == NULL) + if ((gpio_mem = (uint8_t*)malloc(BLOCK_SIZE + (PAGE_SIZE-1))) == NULL) return SETUP_MALLOC_FAIL; if ((uint32_t)gpio_mem % PAGE_SIZE) @@ -561,14 +627,20 @@ int GPIOBUS_Allwinner::sunxi_setup(void) r_pio_map = r_gpio_map + (SUNXI_R_GPIO_REG_OFFSET>>2); //printf("r_gpio_map[%x] r_pio_map[%x]\n", r_gpio_map, r_pio_map); - if ((uint32_t)gpio_map < 0) + if ((int32_t)gpio_map < 0) return SETUP_MMAP_FAIL; return SETUP_OK; + #endif } void GPIOBUS_Allwinner::sunxi_set_pullupdn(int gpio, int pud) { + #ifndef __arm__ + (void)gpio; + (void)pud; + return; + #else uint32_t regval = 0; int bank = GPIO_BANK(gpio); //gpio >> 5 int index = GPIO_PUL_INDEX(gpio); // (gpio & 0x1f) >> 4 @@ -586,10 +658,17 @@ void GPIOBUS_Allwinner::sunxi_set_pullupdn(int gpio, int pud) regval &= ~(3 << offset); regval |= pud << offset; *(&pio->PULL[0] + index) = regval; + #endif } void GPIOBUS_Allwinner::sunxi_setup_gpio(int gpio, int direction, int pud) { + #ifndef __arm__ + (void)gpio; + (void)direction; + (void)pud; + return; + #else uint32_t regval = 0; int bank = GPIO_BANK(gpio); //gpio >> 5 int index = GPIO_CFG_INDEX(gpio); // (gpio & 0x1F) >> 3 @@ -614,6 +693,7 @@ void GPIOBUS_Allwinner::sunxi_setup_gpio(int gpio, int direction, int pud) } else { printf("line:%dgpio number error\n",__LINE__); } + #endif } // Contribution by Eric Ptak @@ -681,7 +761,7 @@ int GPIOBUS_Allwinner::bpi_piGpioLayout (void) FILE *bpiFd ; char buffer[1024]; char hardware[1024]; - struct BPIBoards *board; + struct BPIBoards *board = nullptr; static int gpioLayout = -1 ; if (gpioLayout != -1) // No point checking twice @@ -692,16 +772,19 @@ int GPIOBUS_Allwinner::bpi_piGpioLayout (void) return -1; } while(!feof(bpiFd)) { - fgets(buffer, sizeof(buffer), bpiFd); + // TODO: check the output of fgets() + char *ret = fgets(buffer, sizeof(buffer), bpiFd); + (void)ret; sscanf(buffer, "BOARD=%s", hardware); - //printf("BPI: buffer[%s] hardware[%s]\n",buffer, hardware); -// Search for board: + LOGDEBUG("BPI: buffer[%s] hardware[%s]\n",buffer, hardware); + + //Search for board: for (board = bpiboard ; board->name != NULL ; ++board) { - //printf("BPI: name[%s] hardware[%s]\n",board->name, hardware); + LOGDEBUG("BPI: name[%s] hardware[%s]\n",board->name, hardware); if (strcmp (board->name, hardware) == 0) { //gpioLayout = board->gpioLayout; gpioLayout = board->model; // BPI: use model to replace gpioLayout - //printf("BPI: name[%s] gpioLayout(%d)\n",board->name, gpioLayout); + LOGDEBUG("BPI: name[%s] gpioLayout(%d)\n",board->name, gpioLayout); if(gpioLayout >= 21) { bpi_found = 1; break; @@ -713,50 +796,85 @@ int GPIOBUS_Allwinner::bpi_piGpioLayout (void) } } fclose(bpiFd); - //printf("BPI: name[%s] gpioLayout(%d)\n",board->name, gpioLayout); + LOGDEBUG("BPI: name[%s] gpioLayout(%d)\n",board->name, gpioLayout); return gpioLayout ; } -int GPIOBUS_Allwinner::bpi_get_rpi_info(rpi_info *info) -{ - struct BPIBoards *board=bpiboard; - static int gpioLayout = -1 ; - char ram[64]; - char manufacturer[64]; - char processor[64]; - char type[64]; +// int GPIOBUS_Allwinner::bpi_get_rpi_info(rpi_info *info) +// { +// struct BPIBoards *board=bpiboard; +// static int gpioLayout = -1 ; +// char ram[64]; +// char manufacturer[64]; +// char processor[64]; +// char type[64]; - gpioLayout = bpi_piGpioLayout () ; - printf("BPI: gpioLayout(%d)\n", gpioLayout); - if(bpi_found == 1) { - board = &bpiboard[gpioLayout]; - printf("BPI: name[%s] gpioLayout(%d)\n",board->name, gpioLayout); - sprintf(ram, "%dMB", piMemorySize [board->mem]); - sprintf(type, "%s", piModelNames [board->model]); - //add by jackzeng - //jude mtk platform - if(strcmp(board->name, "bpi-r2") == 0){ - bpi_found_mtk = 1; - printf("found mtk board\n"); - } - sprintf(manufacturer, "%s", piMakerNames [board->maker]); - info->p1_revision = 3; - info->type = type; - info->ram = ram; - info->manufacturer = manufacturer; - if(bpi_found_mtk == 1){ - info->processor = "MTK"; - }else{ - info->processor = "Allwinner"; - } +// gpioLayout = bpi_piGpioLayout () ; +// printf("BPI: gpioLayout(%d)\n", gpioLayout); +// if(bpi_found == 1) { +// board = &bpiboard[gpioLayout]; +// printf("BPI: name[%s] gpioLayout(%d)\n",board->name, gpioLayout); +// sprintf(ram, "%dMB", piMemorySize [board->mem]); +// sprintf(type, "%s", piModelNames [board->model]); +// //add by jackzeng +// //jude mtk platform +// if(strcmp(board->name, "bpi-r2") == 0){ +// bpi_found_mtk = 1; +// printf("found mtk board\n"); +// } +// sprintf(manufacturer, "%s", piMakerNames [board->maker]); +// info->p1_revision = 3; +// info->type = type; +// info->ram = ram; +// info->manufacturer = manufacturer; +// if(bpi_found_mtk == 1){ +// info->processor = "MTK"; +// }else{ +// info->processor = "Allwinner"; +// } - strcpy(info->revision, "4001"); -// pin_to_gpio = board->physToGpio ; - pinToGpio_BP = board->pinToGpio ; - physToGpio_BP = board->physToGpio ; - pinTobcm_BP = board->pinTobcm ; - //printf("BPI: name[%s] bType(%d) model(%d)\n",board->name, bType, board->model); - return 0; - } - return -1; +// strcpy(info->revision, "4001"); +// // pin_to_gpio = board->physToGpio ; +// pinToGpio_BP = board->pinToGpio ; +// physToGpio_BP = board->physToGpio ; +// pinTobcm_BP = board->pinTobcm ; +// //printf("BPI: name[%s] bType(%d) model(%d)\n",board->name, bType, board->model); +// return 0; +// } +// return -1; +// } + + +void GPIOBUS_Allwinner::set_pullupdn(int gpio, int pud) +{ + int clk_offset = PULLUPDNCLK_OFFSET + (gpio/32); + int shift = (gpio%32); + +#ifdef BPI + if( bpi_found == 1 ) { + gpio = *(pinTobcm_BP + gpio); + return sunxi_set_pullupdn(gpio, pud); + } +#endif + if (pud == PUD_DOWN) + *(gpio_map+PULLUPDN_OFFSET) = (*(gpio_map+PULLUPDN_OFFSET) & ~3) | PUD_DOWN; + else if (pud == PUD_UP) + *(gpio_map+PULLUPDN_OFFSET) = (*(gpio_map+PULLUPDN_OFFSET) & ~3) | PUD_UP; + else // pud == PUD_OFF + *(gpio_map+PULLUPDN_OFFSET) &= ~3; + + short_wait(); + *(gpio_map+clk_offset) = 1 << shift; + short_wait(); + *(gpio_map+PULLUPDN_OFFSET) &= ~3; + *(gpio_map+clk_offset) = 0; } + +void GPIOBUS_Allwinner::short_wait(void) +{ + int i; + + for (i=0; i<150; i++) { // wait 150 cycles + asm volatile("nop"); + } +} \ No newline at end of file diff --git a/cpp/hal/gpiobus_allwinner.h b/cpp/hal/gpiobus_allwinner.h index e56853d3..3854cc89 100644 --- a/cpp/hal/gpiobus_allwinner.h +++ b/cpp/hal/gpiobus_allwinner.h @@ -91,94 +91,12 @@ class GPIOBUS_Allwinner : public GPIOBUS volatile uint32_t *pads = nullptr; // PADS register -static volatile uint32_t *gpio_map; + volatile uint32_t *gpio_map; -int bpi_piGpioLayout (void) -{ - FILE *bpiFd ; - char buffer[1024]; - char hardware[1024]; - struct BPIBoards *board; - static int gpioLayout = -1 ; - - if (gpioLayout != -1) // No point checking twice - return gpioLayout ; - - bpi_found = 0; // -1: not init, 0: init but not found, 1: found - if ((bpiFd = fopen("/var/lib/bananapi/board.sh", "r")) == NULL) { - return -1; - } - while(!feof(bpiFd)) { - fgets(buffer, sizeof(buffer), bpiFd); - sscanf(buffer, "BOARD=%s", hardware); - //printf("BPI: buffer[%s] hardware[%s]\n",buffer, hardware); -// Search for board: - for (board = bpiboard ; board->name != NULL ; ++board) { - //printf("BPI: name[%s] hardware[%s]\n",board->name, hardware); - if (strcmp (board->name, hardware) == 0) { - //gpioLayout = board->gpioLayout; - gpioLayout = board->model; // BPI: use model to replace gpioLayout - //printf("BPI: name[%s] gpioLayout(%d)\n",board->name, gpioLayout); - if(gpioLayout >= 21) { - bpi_found = 1; - break; - } - } - } - if(bpi_found == 1) { - break; - } - } - fclose(bpiFd); - //printf("BPI: name[%s] gpioLayout(%d)\n",board->name, gpioLayout); - return gpioLayout ; -} - -int bpi_get_rpi_info(rpi_info *info) -{ - struct BPIBoards *board=bpiboard; - static int gpioLayout = -1 ; - char ram[64]; - char manufacturer[64]; - char processor[64]; - char type[64]; - - gpioLayout = bpi_piGpioLayout () ; - printf("BPI: gpioLayout(%d)\n", gpioLayout); - if(bpi_found == 1) { - board = &bpiboard[gpioLayout]; - printf("BPI: name[%s] gpioLayout(%d)\n",board->name, gpioLayout); - sprintf(ram, "%dMB", piMemorySize [board->mem]); - sprintf(type, "%s", piModelNames [board->model]); - //add by jackzeng - //jude mtk platform - if(strcmp(board->name, "bpi-r2") == 0){ - bpi_found_mtk = 1; - printf("found mtk board\n"); - } - sprintf(manufacturer, "%s", piMakerNames [board->maker]); - info->p1_revision = 3; - info->type = type; - info->ram = ram; - info->manufacturer = manufacturer; - if(bpi_found_mtk == 1){ - info->processor = "MTK"; - }else{ - info->processor = "Allwinner"; - } - - strcpy(info->revision, "4001"); -// pin_to_gpio = board->physToGpio ; - pinToGpio_BP = board->pinToGpio ; - physToGpio_BP = board->physToGpio ; - pinTobcm_BP = board->pinTobcm ; - //printf("BPI: name[%s] bType(%d) model(%d)\n",board->name, bType, board->model); - return 0; - } - return -1; -} +int bpi_piGpioLayout (void); +// int bpi_get_rpi_info(rpi_info *info); @@ -238,9 +156,74 @@ void sunxi_writel(volatile uint32_t *addr, uint32_t val); void sunxi_output_gpio(int gpio, int value); int sunxi_input_gpio(int gpio); + int bpi_found = -1; + +struct BPIBoards +{ + const char *name; + int gpioLayout; + int model; + int rev; + int mem; + int maker; + int warranty; + int *pinToGpio; + int *physToGpio; + int *pinTobcm; +} ; + + +typedef BPIBoards BpiBoardsType; +static BpiBoardsType bpiboard[]; +typedef struct sunxi_gpio { + unsigned int CFG[4]; + unsigned int DAT; + unsigned int DRV[2]; + unsigned int PULL[2]; +} sunxi_gpio_t; + +/* gpio interrupt control */ +typedef struct sunxi_gpio_int { + unsigned int CFG[3]; + unsigned int CTL; + unsigned int STA; + unsigned int DEB; +} sunxi_gpio_int_t; + +typedef struct sunxi_gpio_reg { + struct sunxi_gpio gpio_bank[9]; + unsigned char res[0xbc]; + struct sunxi_gpio_int gpio_int; +} sunxi_gpio_reg_t; + + volatile uint32_t *pio_map; + volatile uint32_t *r_pio_map; + + volatile uint32_t *r_gpio_map; + + uint8_t* gpio_mmap_reg; + +void set_pullupdn(int gpio, int pud); + +// These definitions are from c_gpio.c and should be removed at some point!! +const int SETUP_OK = 0; +const int SETUP_DEVMEM_FAIL = 1; +const int SETUP_MALLOC_FAIL = 2; +const int SETUP_MMAP_FAIL = 3; +const int SETUP_CPUINFO_FAIL = 4; +const int SETUP_NOT_RPI_FAIL = 5; +const int INPUT = 1; // is really 0 for control register!; +const int OUTPUT = 0; // is really 1 for control register!; +const int ALT0 = 4; +const int HIGH = 1; +const int LOW = 0; +const int PUD_OFF = 0; +const int PUD_DOWN = 1; +const int PUD_UP = 2; +void short_wait(void); }; diff --git a/cpp/hal/pi_defs/bpi-gpio.h b/cpp/hal/pi_defs/bpi-gpio.h index 55d96408..f0f2ecff 100644 --- a/cpp/hal/pi_defs/bpi-gpio.h +++ b/cpp/hal/pi_defs/bpi-gpio.h @@ -377,3 +377,13 @@ extern const Banana_Pi_Gpio_Mapping banana_pi_m2p_map; extern const Banana_Pi_Gpio_Mapping banana_pi_m2u_map; extern const Banana_Pi_Gpio_Mapping banana_pi_m3_map; extern const Banana_Pi_Gpio_Mapping banana_pi_m64_map; + + +extern int physToGpio_BPI_M1P [64]; +extern int physToGpio_BPI_M2 [64]; +extern int physToGpio_BPI_M2M [64]; +extern int physToGpio_BPI_M2M_1P1 [64]; +extern int physToGpio_BPI_M2P [64]; +extern int physToGpio_BPI_M2U [64]; +extern int physToGpio_BPI_M3 [64]; +extern int physToGpio_BPI_M64 [64]; diff --git a/cpp/hal/pi_defs/bpi-m1-m1p-r1.cpp b/cpp/hal/pi_defs/bpi-m1-m1p-r1.cpp index dcfc3e42..fc140d46 100755 --- a/cpp/hal/pi_defs/bpi-m1-m1p-r1.cpp +++ b/cpp/hal/pi_defs/bpi-m1-m1p-r1.cpp @@ -106,4 +106,32 @@ const Banana_Pi_Gpio_Mapping banana_pi_m1_m1p_r1_map{ .I2C_OFFSET = 2, .SPI_OFFSET = 2, .PWM_OFFSET = 2, -}; \ No newline at end of file +}; + +//map phys_num(index) to bp gpio_num(element) +int physToGpio_BPI_M1P [64] = +{ + -1, //0 + -1, -1, //1, 2 + BPI_M1P_03, -1, //3, 4 + BPI_M1P_05, -1, //5, 6 + BPI_M1P_07, BPI_M1P_08, //7, 8 + -1, BPI_M1P_10, //9, 10 + BPI_M1P_11, BPI_M1P_12, //11, 12 + BPI_M1P_13, -1, //13, 14 + BPI_M1P_15, BPI_M1P_16, //15, 16 + -1, BPI_M1P_18, //17, 18 + BPI_M1P_19, -1, //19, 20 + BPI_M1P_21, BPI_M1P_22, //21, 22 + BPI_M1P_23, BPI_M1P_24, //23, 24 + -1, BPI_M1P_26, //25, 26 + BPI_M1P_27, BPI_M1P_28, //27, 28 + BPI_M1P_29, -1, //29, 30 + BPI_M1P_31, BPI_M1P_32, //31, 32 + BPI_M1P_33, -1, //33, 34 + BPI_M1P_35, BPI_M1P_36, //35, 36 + BPI_M1P_37, BPI_M1P_38, //37, 38 + -1, BPI_M1P_40, //39, 40 + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, //41-> 55 + -1, -1, -1, -1, -1, -1, -1, -1 // 56-> 63 +} ; \ No newline at end of file diff --git a/cpp/hal/pi_defs/bpi-m2.cpp b/cpp/hal/pi_defs/bpi-m2.cpp index 53f1132b..0780cd29 100755 --- a/cpp/hal/pi_defs/bpi-m2.cpp +++ b/cpp/hal/pi_defs/bpi-m2.cpp @@ -107,3 +107,31 @@ const Banana_Pi_Gpio_Mapping banana_pi_m2_map{ .SPI_OFFSET = 2, .PWM_OFFSET = 4, }; + +//map phys_num(index) to bp gpio_num(element) + int physToGpio_BPI_M2 [64] = +{ + -1, //0 + -1, -1, //1, 2 + BPI_M2_03, -1, //3, 4 + BPI_M2_05, -1, //5, 6 + BPI_M2_07, BPI_M2_08, //7, 8 + -1, BPI_M2_10, //9, 10 + BPI_M2_11, BPI_M2_12, //11, 12 + BPI_M2_13, -1, //13, 14 + BPI_M2_15, BPI_M2_16, //15, 16 + -1, BPI_M2_18, //17, 18 + BPI_M2_19, -1, //19, 20 + BPI_M2_21, BPI_M2_22, //21, 22 + BPI_M2_23, BPI_M2_24, //23, 24 + -1, BPI_M2_26, //25, 26 + BPI_M2_27, BPI_M2_28, //27, 28 + BPI_M2_29, -1, //29, 30 + BPI_M2_31, BPI_M2_32, //31, 32 + BPI_M2_33, -1, //33, 34 + BPI_M2_35, BPI_M2_36, //35, 36 + BPI_M2_37, BPI_M2_38, //37, 38 + -1, BPI_M2_40, //39, 40 + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, //41-> 55 + -1, -1, -1, -1, -1, -1, -1, -1 // 56-> 63 +} ; \ No newline at end of file diff --git a/cpp/hal/pi_defs/bpi-m2m.cpp b/cpp/hal/pi_defs/bpi-m2m.cpp index 5f23e70a..634098f1 100755 --- a/cpp/hal/pi_defs/bpi-m2m.cpp +++ b/cpp/hal/pi_defs/bpi-m2m.cpp @@ -111,3 +111,31 @@ const Banana_Pi_Gpio_Mapping banana_pi_m2m_map{ .SPI_OFFSET = 3, .PWM_OFFSET = 2, }; + +//map phys_num(index) to bp gpio_num(element) + int physToGpio_BPI_M2M [64] = +{ + -1, //0 + -1, -1, //1, 2 + BPI_M2M_03, -1, //3, 4 + BPI_M2M_05, -1, //5, 6 + BPI_M2M_07, BPI_M2M_08, //7, 8 + -1, BPI_M2M_10, //9, 10 + BPI_M2M_11, BPI_M2M_12, //11, 12 + BPI_M2M_13, -1, //13, 14 + BPI_M2M_15, BPI_M2M_16, //15, 16 + -1, BPI_M2M_18, //17, 18 + BPI_M2M_19, -1, //19, 20 + BPI_M2M_21, BPI_M2M_22, //21, 22 + BPI_M2M_23, BPI_M2M_24, //23, 24 + -1, BPI_M2M_26, //25, 26 + BPI_M2M_27, BPI_M2M_28, //27, 28 + BPI_M2M_29, -1, //29, 30 + BPI_M2M_31, BPI_M2M_32, //31, 32 + BPI_M2M_33, -1, //33, 34 + BPI_M2M_35, BPI_M2M_36, //35, 36 + BPI_M2M_37, BPI_M2M_38, //37, 38 + -1, BPI_M2M_40, //39, 40 + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, //41-> 55 + -1, -1, -1, -1, -1, -1, -1, -1 // 56-> 63 +} ; diff --git a/cpp/hal/pi_defs/bpi-m2m_1p1.cpp b/cpp/hal/pi_defs/bpi-m2m_1p1.cpp index 8229b15d..f805168e 100755 --- a/cpp/hal/pi_defs/bpi-m2m_1p1.cpp +++ b/cpp/hal/pi_defs/bpi-m2m_1p1.cpp @@ -110,3 +110,31 @@ const Banana_Pi_Gpio_Mapping banana_pi_m2m_1p1_map{ .SPI_OFFSET = 3, .PWM_OFFSET = 2, }; + +//map phys_num(index) to bp gpio_num(element) + int physToGpio_BPI_M2M_1P1 [64] = +{ + -1, //0 + -1, -1, //1, 2 + BPI_M2M_03, -1, //3, 4 + BPI_M2M_05, -1, //5, 6 + BPI_M2M_07, BPI_M2M_08, //7, 8 + -1, BPI_M2M_10, //9, 10 + BPI_M2M_11, BPI_M2M_12, //11, 12 + BPI_M2M_13, -1, //13, 14 + BPI_M2M_15, BPI_M2M_16, //15, 16 + -1, BPI_M2M_18, //17, 18 + BPI_M2M_19, -1, //19, 20 + BPI_M2M_21, BPI_M2M_22, //21, 22 + BPI_M2M_23, BPI_M2M_24, //23, 24 + -1, BPI_M2M_26, //25, 26 + BPI_M2M_27, BPI_M2M_28, //27, 28 + BPI_M2M_29, -1, //29, 30 + BPI_M2M_31, BPI_M2M_32, //31, 32 + BPI_M2M_33, -1, //33, 34 + BPI_M2M_35, BPI_M2M_36, //35, 36 + BPI_M2M_37, BPI_M2M_38, //37, 38 + -1, BPI_M2M_40, //39, 40 + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, //41-> 55 + -1, -1, -1, -1, -1, -1, -1, -1 // 56-> 63 +} ; \ No newline at end of file diff --git a/cpp/hal/pi_defs/bpi-m2p.cpp b/cpp/hal/pi_defs/bpi-m2p.cpp index cf06c960..096cab2e 100755 --- a/cpp/hal/pi_defs/bpi-m2p.cpp +++ b/cpp/hal/pi_defs/bpi-m2p.cpp @@ -107,3 +107,31 @@ const Banana_Pi_Gpio_Mapping banana_pi_m2p_map{ .SPI_OFFSET = 3, .PWM_OFFSET = 3, }; + +//map phys_num(index) to bp gpio_num(element) + int physToGpio_BPI_M2P [64] = +{ + -1, //0 + -1, -1, //1, 2 + BPI_M2P_03, -1, //3, 4 + BPI_M2P_05, -1, //5, 6 + BPI_M2P_07, BPI_M2P_08, //7, 8 + -1, BPI_M2P_10, //9, 10 + BPI_M2P_11, BPI_M2P_12, //11, 12 + BPI_M2P_13, -1, //13, 14 + BPI_M2P_15, BPI_M2P_16, //15, 16 + -1, BPI_M2P_18, //17, 18 + BPI_M2P_19, -1, //19, 20 + BPI_M2P_21, BPI_M2P_22, //21, 22 + BPI_M2P_23, BPI_M2P_24, //23, 24 + -1, BPI_M2P_26, //25, 26 + BPI_M2P_27, BPI_M2P_28, //27, 28 + BPI_M2P_29, -1, //29, 30 + BPI_M2P_31, BPI_M2P_32, //31, 32 + BPI_M2P_33, -1, //33, 34 + BPI_M2P_35, BPI_M2P_36, //35, 36 + BPI_M2P_37, BPI_M2P_38, //37, 38 + -1, BPI_M2P_40, //39, 40 + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, //41-> 55 + -1, -1, -1, -1, -1, -1, -1, -1 // 56-> 63 +} ; \ No newline at end of file diff --git a/cpp/hal/pi_defs/bpi-m2u.cpp b/cpp/hal/pi_defs/bpi-m2u.cpp index 54133916..08a6a635 100755 --- a/cpp/hal/pi_defs/bpi-m2u.cpp +++ b/cpp/hal/pi_defs/bpi-m2u.cpp @@ -107,3 +107,31 @@ const Banana_Pi_Gpio_Mapping banana_pi_m2u_map{ .SPI_OFFSET = 3, .PWM_OFFSET = 3, }; + +//map phys_num(index) to bp gpio_num(element) + int physToGpio_BPI_M2U [64] = +{ + -1, //0 + -1, -1, //1, 2 + BPI_M2U_03, -1, //3, 4 + BPI_M2U_05, -1, //5, 6 + BPI_M2U_07, BPI_M2U_08, //7, 8 + -1, BPI_M2U_10, //9, 10 + BPI_M2U_11, BPI_M2U_12, //11, 12 + BPI_M2U_13, -1, //13, 14 + BPI_M2U_15, BPI_M2U_16, //15, 16 + -1, BPI_M2U_18, //17, 18 + BPI_M2U_19, -1, //19, 20 + BPI_M2U_21, BPI_M2U_22, //21, 22 + BPI_M2U_23, BPI_M2U_24, //23, 24 + -1, BPI_M2U_26, //25, 26 + BPI_M2U_27, BPI_M2U_28, //27, 28 + BPI_M2U_29, -1, //29, 30 + BPI_M2U_31, BPI_M2U_32, //31, 32 + BPI_M2U_33, -1, //33, 34 + BPI_M2U_35, BPI_M2U_36, //35, 36 + BPI_M2U_37, BPI_M2U_38, //37, 38 + -1, BPI_M2U_40, //39, 40 + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, //41-> 55 + -1, -1, -1, -1, -1, -1, -1, -1 // 56-> 63 +} ; diff --git a/cpp/hal/pi_defs/bpi-m3.cpp b/cpp/hal/pi_defs/bpi-m3.cpp index 7e22c1e8..43a80f19 100755 --- a/cpp/hal/pi_defs/bpi-m3.cpp +++ b/cpp/hal/pi_defs/bpi-m3.cpp @@ -107,3 +107,31 @@ const Banana_Pi_Gpio_Mapping banana_pi_m3_map{ .SPI_OFFSET = 3, .PWM_OFFSET = 2, }; + +//map phys_num(index) to bp gpio_num(element) + int physToGpio_BPI_M3 [64] = +{ + -1, //0 + -1, -1, //1, 2 + BPI_M3_03, -1, //3, 4 + BPI_M3_05, -1, //5, 6 + BPI_M3_07, BPI_M3_08, //7, 8 + -1, BPI_M3_10, //9, 10 + BPI_M3_11, BPI_M3_12, //11, 12 + BPI_M3_13, -1, //13, 14 + BPI_M3_15, BPI_M3_16, //15, 16 + -1, BPI_M3_18, //17, 18 + BPI_M3_19, -1, //19, 20 + BPI_M3_21, BPI_M3_22, //21, 22 + BPI_M3_23, BPI_M3_24, //23, 24 + -1, BPI_M3_26, //25, 26 + BPI_M3_27, BPI_M3_28, //27, 28 + BPI_M3_29, -1, //29, 30 + BPI_M3_31, BPI_M3_32, //31, 32 + BPI_M3_33, -1, //33, 34 + BPI_M3_35, BPI_M3_36, //35, 36 + BPI_M3_37, BPI_M3_38, //37, 38 + -1, BPI_M3_40, //39, 40 + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, //41-> 55 + -1, -1, -1, -1, -1, -1, -1, -1 // 56-> 63 +} ; \ No newline at end of file diff --git a/cpp/hal/pi_defs/bpi-m64.cpp b/cpp/hal/pi_defs/bpi-m64.cpp index bde2d1ad..9ffc7a20 100755 --- a/cpp/hal/pi_defs/bpi-m64.cpp +++ b/cpp/hal/pi_defs/bpi-m64.cpp @@ -108,3 +108,31 @@ const Banana_Pi_Gpio_Mapping banana_pi_m64_map{ .SPI_OFFSET = 4, .PWM_OFFSET = -1, }; + +//map phys_num(index) to bp gpio_num(element) + int physToGpio_BPI_M64 [64] = +{ + -1, //0 + -1, -1, //1, 2 + BPI_M64_03, -1, //3, 4 + BPI_M64_05, -1, //5, 6 + BPI_M64_07, BPI_M64_08, //7, 8 + -1, BPI_M64_10, //9, 10 + BPI_M64_11, BPI_M64_12, //11, 12 + BPI_M64_13, -1, //13, 14 + BPI_M64_15, BPI_M64_16, //15, 16 + -1, BPI_M64_18, //17, 18 + BPI_M64_19, -1, //19, 20 + BPI_M64_21, BPI_M64_22, //21, 22 + BPI_M64_23, BPI_M64_24, //23, 24 + -1, BPI_M64_26, //25, 26 + BPI_M64_27, BPI_M64_28, //27, 28 + BPI_M64_29, -1, //29, 30 + BPI_M64_31, BPI_M64_32, //31, 32 + BPI_M64_33, -1, //33, 34 + BPI_M64_35, BPI_M64_36, //35, 36 + BPI_M64_37, BPI_M64_38, //37, 38 + -1, BPI_M64_40, //39, 40 + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, //41-> 55 + -1, -1, -1, -1, -1, -1, -1, -1 // 56-> 63 +} ; diff --git a/cpp/log.h b/cpp/log.h index 90ec26d2..9526f315 100644 --- a/cpp/log.h +++ b/cpp/log.h @@ -15,7 +15,8 @@ #include "spdlog/spdlog.h" #include "spdlog/sinks/sink.h" -static const int LOGBUF_SIZE = 512; +// TODO: Change this back to 512!! +static const int LOGBUF_SIZE = 1024*3; #define SPDLOGWRAPPER(loglevel, ...) \ { \