From 8e8ed7d52da763eb2d41e97cd708751cec204fd8 Mon Sep 17 00:00:00 2001 From: Grant Likely Date: Thu, 18 Feb 2016 14:48:19 +0000 Subject: [PATCH] 96boards: Use consistent pin numbering on 96boards platforms Every 96Boards baseboard uses the same expansion connector, but the current 96Boards initialization code assigns the SoC specific GPIO numbers instead of being consistent across all boards. Change the code to assign 96Boards GPIO-A through GPIO-L to MRAA GPIOs 23-34. v2: Create info for all the LS connector pins, not just the GPIO pins. This gives us room to describe other pins in the future. Signed-off-by: Grant Likely Jorge Ramirez-Ortiz Srinivas Kandagatla --- include/arm/96boards.h | 4 +-- src/arm/96boards.c | 66 ++++++++++++++++++++++++++++++++++-------- 2 files changed, 55 insertions(+), 15 deletions(-) diff --git a/include/arm/96boards.h b/include/arm/96boards.h index 863c6cd..04d052b 100644 --- a/include/arm/96boards.h +++ b/include/arm/96boards.h @@ -37,9 +37,7 @@ extern "C" { #define MRAA_96BOARDS_LS_I2C_COUNT 2 #define MRAA_96BOARDS_LS_SPI_COUNT 1 #define MRAA_96BOARDS_LS_UART_COUNT 2 - -#define DB410C_PINCOUNT 122 -#define HIKEY_PINCOUNT 512 +#define MRAA_96BOARDS_LS_PIN_COUNT 40 mraa_board_t* mraa_96boards(); diff --git a/src/arm/96boards.c b/src/arm/96boards.c index 152b970..a23721f 100644 --- a/src/arm/96boards.c +++ b/src/arm/96boards.c @@ -26,6 +26,7 @@ */ #include +#include #include #include #include @@ -50,12 +51,30 @@ int hikey_ls_gpio_pins[MRAA_96BOARDS_LS_GPIO_COUNT] = { const char* hikey_serialdev[MRAA_96BOARDS_LS_UART_COUNT] = { "/dev/ttyAMA2", "/dev/ttyAMA3"}; +void mraa_96boards_pininfo(mraa_board_t* board, int index, int sysfs_pin, + char *fmt, ...) +{ + va_list arg_ptr; + if (index > board->phy_pin_count) + return; + + mraa_pininfo_t* pininfo = &board->pins[index]; + va_start(arg_ptr, fmt); + vsnprintf(pininfo->name, MRAA_PIN_NAME_SIZE, fmt, arg_ptr); + va_end(arg_ptr); + if (sysfs_pin >= 0) + pininfo->capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 0 }; + else + pininfo->capabilites = (mraa_pincapabilities_t){ 0, 0, 0, 0, 0, 0, 0, 0 }; + pininfo->gpio.pinmap = sysfs_pin; + pininfo->gpio.mux_total = 0; +} + mraa_board_t* mraa_96boards() { int i, pin; - int *ls_gpio_pins; + int *ls_gpio_pins = NULL; char ch; - char name[MRAA_PIN_NAME_SIZE]; mraa_board_t* b = (mraa_board_t*) calloc(1, sizeof(mraa_board_t)); if (b == NULL) { @@ -64,18 +83,17 @@ mraa_board_t* mraa_96boards() // pin mux for buses are setup by default by kernel so tell mraa to ignore them b->no_bus_mux = 1; + b->phy_pin_count = MRAA_96BOARDS_LS_PIN_COUNT + 1; if (mraa_file_exist(DT_BASE "/model")) { // We are on a modern kernel, great!!!! if (mraa_file_contains(DT_BASE "/model", "Qualcomm Technologies, Inc. APQ 8016 SBC")) { b->platform_name = PLATFORM_NAME_DB410C; - b->phy_pin_count = DB410C_PINCOUNT; ls_gpio_pins = db410c_ls_gpio_pins; b->uart_dev[0].device_path = db410c_serialdev[0]; b->uart_dev[1].device_path = db410c_serialdev[1]; } else if (mraa_file_contains(DT_BASE "/model", "HiKey Development Board")) { b->platform_name = PLATFORM_NAME_HIKEY; - b->phy_pin_count = HIKEY_PINCOUNT; ls_gpio_pins = hikey_ls_gpio_pins; b->uart_dev[0].device_path = hikey_serialdev[0]; b->uart_dev[1].device_path = hikey_serialdev[1]; @@ -110,17 +128,41 @@ mraa_board_t* mraa_96boards() return NULL; } - // gpio lable starts from GPIO-A to GPIO-F - ch = 'A'; + mraa_96boards_pininfo(b, 0, -1, "INVALID"); + mraa_96boards_pininfo(b, 1, -1, "GND"); + mraa_96boards_pininfo(b, 2, -1, "GND"); + mraa_96boards_pininfo(b, 3, -1, "UART0_CTS"); + mraa_96boards_pininfo(b, 4, -1, "PWR_BTN_N"); + mraa_96boards_pininfo(b, 5, -1, "UART0_TXD"); + mraa_96boards_pininfo(b, 6, -1, "RST_BTN_N"); + mraa_96boards_pininfo(b, 7, -1, "UART0_RXD"); + mraa_96boards_pininfo(b, 8, -1, "SPI0_SCLK"); + mraa_96boards_pininfo(b, 9, -1, "UART0_RTS"); + mraa_96boards_pininfo(b, 10, -1, "SPI0_DIN"); + mraa_96boards_pininfo(b, 11, -1, "UART1_TXD"); + mraa_96boards_pininfo(b, 12, -1, "SPI0_CS"); + mraa_96boards_pininfo(b, 13, -1, "UART1_RXD"); + mraa_96boards_pininfo(b, 14, -1, "SPI0_DOUT"); + mraa_96boards_pininfo(b, 15, -1, "I2C0_SCL"); + mraa_96boards_pininfo(b, 16, -1, "PCM_FS"); + mraa_96boards_pininfo(b, 17, -1, "I2C0_SDA"); + mraa_96boards_pininfo(b, 18, -1, "PCM_CLK"); + mraa_96boards_pininfo(b, 19, -1, "I2C1_SCL"); + mraa_96boards_pininfo(b, 20, -1, "PCM_DO"); + mraa_96boards_pininfo(b, 21, -1, "I2C1_SDA"); + mraa_96boards_pininfo(b, 22, -1, "PCM_DI"); + // GPIOs are labelled "GPIO-A" through "GPIO-L" for (i = 0; i < MRAA_96BOARDS_LS_GPIO_COUNT; i++) { - pin = ls_gpio_pins[i]; - sprintf(name, "GPIO-%c", ch++); - strncpy(b->pins[pin].name, name, MRAA_PIN_NAME_SIZE); - b->pins[pin].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 0 }; - b->pins[pin].gpio.pinmap = pin; - b->pins[pin].gpio.mux_total = 0; + mraa_96boards_pininfo(b, 23 + i, ls_gpio_pins ? ls_gpio_pins[i] : -1, + "GPIO-%c", 'A'+i); } + mraa_96boards_pininfo(b, 35, -1, "1.8v"); + mraa_96boards_pininfo(b, 36, -1, "SYS_DCIN"); + mraa_96boards_pininfo(b, 37, -1, "5v"); + mraa_96boards_pininfo(b, 38, -1, "SYS_DCIN"); + mraa_96boards_pininfo(b, 39, -1, "GND"); + mraa_96boards_pininfo(b, 40, -1, "GND"); b->gpio_count = MRAA_96BOARDS_LS_GPIO_COUNT;