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;