Example #1
0
mraa_result_t
mraa_beaglebone_uart_init_pre(int index)
{
    mraa_result_t ret = MRAA_ERROR_NO_RESOURCES;
    char devpath[MAX_SIZE];
    char overlay[MAX_SIZE];
    char* capepath = NULL;
    sprintf(devpath, "/dev/ttyO%u", index + 1);
    if (!mraa_file_exist(devpath)) {
        capepath = mraa_file_unglob(SYSFS_DEVICES_CAPEMGR_SLOTS);
        if (capepath == NULL) {
            syslog(LOG_ERR, "uart: Could not find CapeManager");
            return ret;
        }
        FILE* fh;
        fh = fopen(capepath, "w");
        if (fh == NULL) {
            free(capepath);
            syslog(LOG_ERR, "uart: Failed to open %s for writing, check access rights for user", capepath);
            return ret;
        }
        if (fprintf(fh, UART_OVERLAY, index + 1) < 0) {
            syslog(LOG_ERR, "uart: Failed to write to CapeManager");
        }
        fclose(fh);
        free(capepath);
    }
    if (mraa_file_exist(devpath))
        ret = MRAA_SUCCESS;
    else
        syslog(LOG_ERR, "uart: Device not initialized");
    return ret;
}
Example #2
0
mraa_result_t
mraa_raspberry_pi_i2c_init_pre(unsigned int bus)
{
    char devpath[MAX_SIZE];
    sprintf(devpath, "/dev/i2c-%u", bus);
    if (!mraa_file_exist(devpath)) {
        syslog(LOG_INFO, "spi: trying modprobe for i2c-bcm2708 & i2c-dev");
        system("modprobe i2c-bcm2708 >/dev/null 2>&1");
        system("modprobe i2c-dev >/dev/null 2>&1");
        system("modprobe i2c_bcm2708 >/dev/null 2>&1");
        system("modprobe i2c_dev >/dev/null 2>&1");
    }
    if (!mraa_file_exist(devpath)) {
        syslog(LOG_ERR, "i2c: Device not initialized");
        if (platform_detected == PLATFORM_RASPBERRY_PI_B_REV_1) {
            syslog(LOG_ERR, "i2c: If you run a kernel >=3.18 then you will have to add "
                            "dtparam=i2c0=on to /boot/config.txt and reboot");
        } else {
            syslog(LOG_ERR, "i2c: If you run a kernel >=3.18 then you will have to add "
                            "dtparam=i2c1=on to /boot/config.txt and reboot");
        }
        return MRAA_ERROR_NO_RESOURCES;
    }
    return MRAA_SUCCESS;
}
Example #3
0
mraa_result_t
mraa_beaglebone_spi_init_pre(int index)
{
    mraa_result_t ret = MRAA_ERROR_NO_RESOURCES;
    char devpath[MAX_SIZE];
    char overlay[MAX_SIZE];
    char* capepath = NULL;
    int deviceindex = 0;

    // The first initialized SPI devices always gets the bus id 1
    // So we need to track down correct mapping and adjust the bus_id field
    if ((index == 0) && mraa_link_targets("/sys/class/spidev/spidev1.0", "48030000"))
        deviceindex = 1;
    if ((index == 0) && mraa_link_targets("/sys/class/spidev/spidev2.0", "48030000"))
        deviceindex = 2;
    if ((index == 1) && mraa_link_targets("/sys/class/spidev/spidev1.0", "481a0000"))
        deviceindex = 1;
    if ((index == 1) && mraa_link_targets("/sys/class/spidev/spidev2.0", "481a0000"))
        deviceindex = 2;
    if ((deviceindex == 0) && mraa_file_exist("/sys/class/spidev/spidev1.0"))
        deviceindex = 2;
    if (deviceindex == 0)
        deviceindex = 1;

    sprintf(devpath, "/dev/spidev%u.0", deviceindex);
    if (!mraa_file_exist(devpath)) {
        capepath = mraa_file_unglob(SYSFS_DEVICES_CAPEMGR_SLOTS);
        if (capepath == NULL) {
            syslog(LOG_ERR, "spi: Could not find CapeManager");
            return ret;
        }
        FILE* fh;
        fh = fopen(capepath, "w");
        if (fh == NULL) {
            free(capepath);
            syslog(LOG_ERR, "spi: Failed to open %s for writing, check access rights for user", capepath);
            return ret;
        }
        if (fprintf(fh, SPI_OVERLAY, index) < 0) {
            syslog(LOG_ERR,
                   "spi: Failed to write to CapeManager, check that /lib/firmware/%s exists",
                   SPI_OVERLAY, index);
        }
        fclose(fh);
        free(capepath);
    }
    if (mraa_file_exist(devpath)) {
        plat->spi_bus[index].bus_id = deviceindex;
        ret = MRAA_SUCCESS;
    } else {
        syslog(LOG_ERR, "spi: Device not initialized, check that /lib/firmware/%s exists", SPI_OVERLAY, index);
        syslog(LOG_ERR, "spi: Check http://elinux.org/BeagleBone_Black_Enable_SPIDEV for details");
    }
    return ret;
}
Example #4
0
File: banana.c Project: Hbrinj/mraa
mraa_result_t
mraa_banana_i2c_init_pre(unsigned int bus)
{
    char devpath[MAX_SIZE];
    sprintf(devpath, "/dev/i2c-%u", bus);
    if (!mraa_file_exist(devpath)) {
        syslog(LOG_INFO, "i2c: trying modprobe for i2c-dev");
        system("modprobe i2c-dev >/dev/null 2>&1");
    }
    if (!mraa_file_exist(devpath)) {
        syslog(LOG_ERR, "i2c: Device not initialized");
        return MRAA_ERROR_NO_RESOURCES;
    }
    return MRAA_SUCCESS;
}
Example #5
0
mraa_result_t
mraa_raspberry_pi_spi_init_pre(int index)
{
    char devpath[MAX_SIZE];
    sprintf(devpath, "/dev/spidev%u.0", plat->spi_bus[index].bus_id);
    if (!mraa_file_exist(devpath)) {
        syslog(LOG_ERR, "spi: Device not initialized");
        syslog(LOG_ERR, "spi: If you run a kernel >=3.18 then you will have to add dtparam=spi=on "
                        "to /boot/config.txt and reboot");
        syslog(LOG_INFO, "spi: trying modprobe for spi-bcm2708");
        system("modprobe spi-bcm2708 >/dev/null 2>&1");
        system("modprobe spi_bcm2708 >/dev/null 2>&1");
        if (!mraa_file_exist(devpath)) {
            return MRAA_ERROR_NO_RESOURCES;
        }
    }
    return MRAA_SUCCESS;
}
Example #6
0
File: banana.c Project: Hbrinj/mraa
mraa_result_t
mraa_banana_spi_init_pre(int index)
{
    char devpath[MAX_SIZE];
    sprintf(devpath, "/dev/spidev%u.0", plat->spi_bus[index].bus_id);
    if (!mraa_file_exist(devpath)) {
        syslog(LOG_INFO, "spi: trying modprobe for spi-sun4i");
        system("modprobe spi-sun4i >/dev/null 2>&1");
        syslog(LOG_INFO, "spi: trying modprobe for spidev");
        system("modprobe spidev >/dev/null 2>&1");
    }
    if (!mraa_file_exist(devpath)) {
        syslog(LOG_ERR, "spi: Device not initialized");
        syslog(LOG_ERR, "spi: If you run a kernel >=3.18 then most likely spi support does not yet "
                        "fully work.");
        return MRAA_ERROR_NO_RESOURCES;
    }
    return MRAA_SUCCESS;
}
Example #7
0
mraa_result_t
mraa_beaglebone_i2c_init_pre(unsigned int bus)
{
    mraa_result_t ret = MRAA_ERROR_NO_RESOURCES;
    char devpath[MAX_SIZE];
    char overlay[MAX_SIZE];
    char* capepath = NULL;
    sprintf(devpath, "/dev/i2c-%u", plat->i2c_bus[bus].bus_id);
    if (!mraa_file_exist(devpath)) {
        capepath = mraa_file_unglob(SYSFS_DEVICES_CAPEMGR_SLOTS);
        if (capepath == NULL) {
            syslog(LOG_ERR, "i2c: Could not find CapeManager");
            return ret;
        }
        FILE* fh;
        fh = fopen(capepath, "w");
        if (fh == NULL) {
            free(capepath);
            syslog(LOG_ERR, "i2c: Failed to open %s for writing, check access rights for user", capepath);
            return ret;
        }
        if (fprintf(fh, "ADAFRUIT-I2C%d", bus) < 0) {
            syslog(LOG_ERR, "i2c: Failed to write to CapeManager, check that "
                            "/lib/firmware/ADAFRUIT-I2C%d exists",
                   index);
        }
        fclose(fh);
    }
    if (mraa_file_exist(devpath))
        ret = MRAA_SUCCESS;
    else {
        syslog(LOG_ERR,
               "i2c: Device not initialized, check that /lib/firmware/ADAFRUIT-I2C%d exists", index);
    }
    return ret;
}
Example #8
0
File: mraa.c Project: MFALHI/mraa
int
mraa_find_i2c_bus(const char* devname, int startfrom)
{
    char path[64];
    int fd;
    int i = startfrom;
    int ret = -1;

    // because feeding mraa_find_i2c_bus result back into the function is
    // useful treat -1 as 0
    if (startfrom < 0) {
        startfrom = 0;
    }

    // find how many i2c buses we have if we haven't already
    if (num_i2c_devices == 0) {
        if (nftw("/sys/class/i2c-dev/", &mraa_count_i2c_files, 20, FTW_PHYS) == -1) {
            return -1;
        }
    }

    // i2c devices are numbered numerically so 0 must exist otherwise there is
    // no i2c-dev loaded
    if (mraa_file_exist("/sys/class/i2c-dev/i2c-0")) {
        for (i; i < num_i2c_devices; i++) {
            off_t size, err;
            snprintf(path, 64, "/sys/class/i2c-dev/i2c-%u/name", i);
            fd = open(path, O_RDONLY);
            if (fd < 0) {
                break;
            }
            size = lseek(fd, 0, SEEK_END);
            if (size < 0) {
                syslog(LOG_WARNING, "mraa: failed to seek i2c filename file");
                close(fd);
                break;
            }
            err = lseek(fd, 0, SEEK_SET);
            if (err < 0) {
                syslog(LOG_WARNING, "mraa: failed to seek i2c filename file");
                close(fd);
                break;
            }
            char* value = malloc(size);
            if (value == NULL) {
                syslog(LOG_ERR, "mraa: failed to allocate memory for i2c file");
                close(fd);
                break;
            }
            ssize_t r = read(fd, value, size);
            if (r > 0) {
                if (strcasestr(value, devname) != NULL) {
                    free(value);
                    close(fd);
                    return i;
                }
            } else {
                syslog(LOG_ERR, "mraa: sysfs i2cdev failed");
            }
            free(value);
            close(fd);
        }
    } else {
        syslog(LOG_WARNING, "mraa: no i2c-dev detected, load i2c-dev");
    }

    return ret;
}
Example #9
0
File: banana.c Project: Hbrinj/mraa
mraa_board_t*
mraa_banana()
{
    mraa_board_t* b = (mraa_board_t*) calloc(1, sizeof(mraa_board_t));
    if (b == NULL) {
        return NULL;
    }

    platform_detected = 0;
    int i2c2 = -1;
    int spi0 = -1;
    int uart2 = -1;
    int uart3 = -1;
    int uart4 = -1;
    int uart7 = -1;

    if (mraa_file_exist(DT_BASE "/model")) {
        // We are on a modern kernel, great!!!!
        if (mraa_file_contains(DT_BASE "/model", "Banana Pro")) {
            b->platform_name = PLATFORM_NAME_BANANA_PRO;
            platform_detected = PLATFORM_BANANA_PRO;
            b->phy_pin_count = MRAA_BANANA_PRO_PINCOUNT;
        }

        if (mraa_file_contains(DT_BASE "/model", "Banana Pi")) {
            b->platform_name = PLATFORM_NAME_BANANA_PI;
            platform_detected = PLATFORM_BANANA_PI;
            b->phy_pin_count = MRAA_BANANA_PI_PINCOUNT;
        }
        if (mraa_file_contains(DT_BASE "/soc@01c00000/i2c@01c2b400/status", "okay")) {
            i2c2 = 1;
        }
        if (mraa_file_contains(DT_BASE "/soc@01c00000/spi@01c05000/status", "okay")) {
            spi0 = 1;
        }
    } else {
        if (mraa_file_exist("/sys/class/leds/green:ph24:led1")) {
            if (mraa_file_exist("/sys/class/leds/blue:pg02:led2")) {
                b->platform_name = PLATFORM_NAME_BANANA_PRO;
                platform_detected = PLATFORM_BANANA_PRO;
                b->phy_pin_count = MRAA_BANANA_PRO_PINCOUNT;
            } else {
                b->platform_name = PLATFORM_NAME_BANANA_PI;
                platform_detected = PLATFORM_BANANA_PI;
                b->phy_pin_count = MRAA_BANANA_PI_PINCOUNT;
            }
            if (mraa_file_exist("/sys/class/i2c-dev/i2c-2")) {
                i2c2 = 1;
            }


            if (mraa_file_exist("/sys/class/spi_master/spi0")) {
                spi0 = 1;
            }
        }
    }

    if (platform_detected == 0) {
        free(b);
        syslog(LOG_ERR, "mraa: Could not detect Banana Pi or Banana Pro");
        return NULL;
    }

    int devnum;
    for (devnum = 0; devnum < 8; devnum++) {
        if (mraa_link_targets(seriallink[devnum], "1c28800")) {
            uart2 = devnum;
        }
        if (mraa_link_targets(seriallink[devnum], "1c28c00")) {
            uart3 = devnum;
        }
        if (mraa_link_targets(seriallink[devnum], "1c29000")) {
            uart4 = devnum;
        }
        if (mraa_link_targets(seriallink[devnum], "1c29c00")) {
            uart7 = devnum;
        }
    }

    for (devnum = 0; devnum < 5; devnum++) {
        if (mraa_link_targets(i2clink[devnum], "1c2b400")) {
            i2c2 = devnum;
        }
    }

    for (devnum = 0; devnum < 4; devnum++) {
        if (mraa_link_targets(spilink[devnum], "1c05000")) {
            spi0 = devnum;
        }
    }

    b->adv_func = (mraa_adv_func_t*) calloc(1, sizeof(mraa_adv_func_t));
    if (b->adv_func == NULL) {
        free(b);
        return NULL;
    }

    b->pins = (mraa_pininfo_t*) calloc(b->phy_pin_count, sizeof(mraa_pininfo_t));
    if (b->pins == NULL) {
        free(b->adv_func);
        free(b);
        return NULL;
    }

    b->adv_func->spi_init_pre = &mraa_banana_spi_init_pre;
    b->adv_func->i2c_init_pre = &mraa_banana_i2c_init_pre;
    b->adv_func->gpio_mmap_setup = &mraa_banana_mmap_setup;

    strncpy(b->pins[0].name, "INVALID", MRAA_PIN_NAME_SIZE);
    b->pins[0].capabilities = (mraa_pincapabilities_t){ 0, 0, 0, 0, 0, 0, 0, 0 };

    strncpy(b->pins[1].name, "3V3", MRAA_PIN_NAME_SIZE);
    b->pins[1].capabilities = (mraa_pincapabilities_t){ 1, 0, 0, 0, 0, 0, 0, 0 };

    strncpy(b->pins[2].name, "5V", MRAA_PIN_NAME_SIZE);
    b->pins[2].capabilities = (mraa_pincapabilities_t){ 1, 0, 0, 0, 0, 0, 0, 0 };

    if (i2c2 == 1) {
        strncpy(b->pins[3].name, "TWI2-SDA", MRAA_PIN_NAME_SIZE); // PB21 Pin53 TWI2-SDA
        b->pins[3].capabilities = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 1, 0, 0 };
    } else {
        strncpy(b->pins[3].name, "PB21", MRAA_PIN_NAME_SIZE); // PB21 Pin53 TWI2-SDA
        b->pins[3].capabilities = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 0 };
    }
    b->pins[3].gpio.pinmap = 53;

    strncpy(b->pins[4].name, "5V", MRAA_PIN_NAME_SIZE);
    b->pins[4].capabilities = (mraa_pincapabilities_t){ 1, 0, 0, 0, 0, 0, 0, 0 };

    if (i2c2 == 1) {
        strncpy(b->pins[5].name, "TWI2-SCK", MRAA_PIN_NAME_SIZE); // PB20 Pin52 TWI2-SCK
        b->pins[5].capabilities = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 1, 0, 0 };
    } else {
        strncpy(b->pins[5].name, "PB20", MRAA_PIN_NAME_SIZE); // PB20 Pin52 TWI2-SCK
        b->pins[5].capabilities = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 0 };
    }
    b->pins[5].gpio.pinmap = 52;

    strncpy(b->pins[6].name, "GND", MRAA_PIN_NAME_SIZE);
    b->pins[6].capabilities = (mraa_pincapabilities_t){ 1, 0, 0, 0, 0, 0, 0, 0 };

    if (platform_detected == PLATFORM_BANANA_PRO) {
        strncpy(b->pins[7].name, "PH02", MRAA_PIN_NAME_SIZE); // PH2 Pin226
        b->pins[7].gpio.pinmap = 226;
    } else {
        strncpy(b->pins[7].name, "PI03", MRAA_PIN_NAME_SIZE); // PI3 Pin259 PWM
        b->pins[7].gpio.pinmap = 259;
    }
    b->pins[7].capabilities = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 0 };

    if (platform_detected == PLATFORM_BANANA_PRO) {
        strncpy(b->pins[8].name, "UART4_TX", MRAA_PIN_NAME_SIZE); // PH4 Pin228 UART4_TX
        b->pins[8].gpio.pinmap = 228;
    } else {
        strncpy(b->pins[8].name, "UART3_TX", MRAA_PIN_NAME_SIZE); // PH0 Pin224 UART3_TX
        b->pins[8].gpio.pinmap = 224;
    }
    b->pins[8].capabilities = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 1 };

    strncpy(b->pins[9].name, "GND", MRAA_PIN_NAME_SIZE);
    b->pins[9].capabilities = (mraa_pincapabilities_t){ 1, 0, 0, 0, 0, 0, 0, 0 };

    if (platform_detected == PLATFORM_BANANA_PRO) {
        strncpy(b->pins[10].name, "UART4_RX", MRAA_PIN_NAME_SIZE); // PH5 Pin229 UART4_RX
        b->pins[10].gpio.pinmap = 229;
    } else {
        strncpy(b->pins[10].name, "UART3_RX", MRAA_PIN_NAME_SIZE); // PH1 Pin225 UART3_RX
        b->pins[10].gpio.pinmap = 225;
    }
    b->pins[10].capabilities = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 1 };

    strncpy(b->pins[11].name, "PI19", MRAA_PIN_NAME_SIZE); // PI19 Pin275 IO+UART2_RX
    b->pins[11].capabilities = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 1 };
    b->pins[11].gpio.pinmap = 275;

    if (platform_detected == PLATFORM_BANANA_PRO) {
        strncpy(b->pins[12].name, "PI03", MRAA_PIN_NAME_SIZE); // PI3 Pin259 PWM
        b->pins[12].gpio.pinmap = 259;
    } else {
        strncpy(b->pins[12].name, "PH02", MRAA_PIN_NAME_SIZE); // PH2 Pin226
        b->pins[12].gpio.pinmap = 226;
    }
    b->pins[12].capabilities = (mraa_pincapabilities_t){ 1, 1, 1, 0, 0, 0, 0, 0 };

    strncpy(b->pins[13].name, "PI18", MRAA_PIN_NAME_SIZE); // PI18 Pin274 UART2_TX
    b->pins[13].capabilities = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 1 };
    b->pins[13].gpio.pinmap = 274;

    strncpy(b->pins[14].name, "GND", MRAA_PIN_NAME_SIZE);
    b->pins[14].capabilities = (mraa_pincapabilities_t){ 1, 0, 0, 0, 0, 0, 0, 0 };

    strncpy(b->pins[15].name, "PI17", MRAA_PIN_NAME_SIZE); // PI17 Pin273 UART2_CTS
    b->pins[15].capabilities = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 0 };
    b->pins[15].gpio.pinmap = 273;

    strncpy(b->pins[16].name, "PH20", MRAA_PIN_NAME_SIZE); // PH20 Pin 244 CAN_TX
    b->pins[16].capabilities = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 0 };
    b->pins[16].gpio.pinmap = 244;

    strncpy(b->pins[17].name, "3V3", MRAA_PIN_NAME_SIZE);
    b->pins[17].capabilities = (mraa_pincapabilities_t){ 1, 0, 0, 0, 0, 0, 0, 0 };

    strncpy(b->pins[18].name, "PH21", MRAA_PIN_NAME_SIZE); // PH21 Pin245 CAN_RX
    b->pins[18].capabilities = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 0 };
    b->pins[18].gpio.pinmap = 245;

    strncpy(b->pins[19].name, "SPI0MOSI", MRAA_PIN_NAME_SIZE); // PI12 SPI0
    b->pins[19].capabilities = (mraa_pincapabilities_t){ 1, 1, 0, 0, 1, 0, 0, 0 };
    b->pins[19].gpio.pinmap = 268;

    strncpy(b->pins[20].name, "GND", MRAA_PIN_NAME_SIZE);
    b->pins[20].capabilities = (mraa_pincapabilities_t){ 1, 0, 0, 0, 0, 0, 0, 0 };

    strncpy(b->pins[21].name, "SPI0MISO", MRAA_PIN_NAME_SIZE); // PI13 SPI0
    b->pins[21].capabilities = (mraa_pincapabilities_t){ 1, 1, 0, 0, 1, 0, 0, 0 };
    b->pins[21].gpio.pinmap = 269;

    strncpy(b->pins[22].name, "PI16", MRAA_PIN_NAME_SIZE); // PI16 UART2_RTS
    b->pins[22].capabilities = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 1 };
    b->pins[22].gpio.pinmap = 272;

    strncpy(b->pins[23].name, "SPI0CLK", MRAA_PIN_NAME_SIZE); // PI11 SPI0
    b->pins[23].capabilities = (mraa_pincapabilities_t){ 1, 1, 0, 0, 1, 0, 0, 0 };
    b->pins[23].gpio.pinmap = 267;

    strncpy(b->pins[24].name, "SPI0CS0", MRAA_PIN_NAME_SIZE); // PI10 SPI0
    b->pins[24].capabilities = (mraa_pincapabilities_t){ 1, 1, 0, 0, 1, 0, 0, 0 };
    b->pins[24].gpio.pinmap = 266;

    strncpy(b->pins[25].name, "GND", MRAA_PIN_NAME_SIZE);
    b->pins[25].capabilities = (mraa_pincapabilities_t){ 1, 0, 0, 0, 0, 0, 0, 0 };

    strncpy(b->pins[26].name, "SPI0CS1", MRAA_PIN_NAME_SIZE); // PI14 SPI0
    b->pins[26].capabilities = (mraa_pincapabilities_t){ 1, 1, 0, 0, 1, 0, 0, 0 };
    b->pins[26].gpio.pinmap = 270;

    if (platform_detected == PLATFORM_BANANA_PI) {
        strncpy(b->pins[27].name, "5V", MRAA_PIN_NAME_SIZE);
        b->pins[27].capabilities = (mraa_pincapabilities_t){ 1, 0, 0, 0, 0, 0, 0, 0 };

        strncpy(b->pins[28].name, "3V3", MRAA_PIN_NAME_SIZE);
        b->pins[28].capabilities = (mraa_pincapabilities_t){ 1, 0, 0, 0, 0, 0, 0, 0 };

        strncpy(b->pins[29].name, "PH05", MRAA_PIN_NAME_SIZE); // PH5
        b->pins[29].capabilities = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 0 };
        b->pins[29].gpio.pinmap = 229;

        strncpy(b->pins[30].name, "PI21", MRAA_PIN_NAME_SIZE); // PI21 UART7_RX
        b->pins[30].capabilities = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 1 };
        b->pins[30].gpio.pinmap = 277;

        strncpy(b->pins[31].name, "PH03", MRAA_PIN_NAME_SIZE); // PH3
        b->pins[31].capabilities = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 0 };
        b->pins[31].gpio.pinmap = 227;

        strncpy(b->pins[32].name, "PI20", MRAA_PIN_NAME_SIZE); // PI20 UART7_TX
        b->pins[32].capabilities = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 1 };
        b->pins[32].gpio.pinmap = 276;

        strncpy(b->pins[33].name, "GND", MRAA_PIN_NAME_SIZE);
        b->pins[33].capabilities = (mraa_pincapabilities_t){ 1, 0, 0, 0, 0, 0, 0, 0 };

        strncpy(b->pins[34].name, "GND", MRAA_PIN_NAME_SIZE);
        b->pins[34].capabilities = (mraa_pincapabilities_t){ 1, 0, 0, 0, 0, 0, 0, 0 };
    }

    if (platform_detected == PLATFORM_BANANA_PRO) {

        strncpy(b->pins[27].name, "HAT_SDA", MRAA_PIN_NAME_SIZE); // PI1 TWI3-SDA i2c3
        b->pins[27].capabilities = (mraa_pincapabilities_t){ 1, 0, 0, 0, 0, 0, 0, 0 };
        b->pins[27].gpio.pinmap = 257;

        strncpy(b->pins[28].name, "HAT_SCK", MRAA_PIN_NAME_SIZE); // PI0 TWI3-SCK i2c3
        b->pins[28].capabilities = (mraa_pincapabilities_t){ 1, 0, 0, 0, 0, 0, 0, 0 };
        b->pins[28].gpio.pinmap = 256;

        strncpy(b->pins[29].name, "PB03", MRAA_PIN_NAME_SIZE); // PB3 IR0_TX/SPDIF_MCLK
        b->pins[29].capabilities = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 0 };
        b->pins[29].gpio.pinmap = 35;

        strncpy(b->pins[30].name, "GND", MRAA_PIN_NAME_SIZE);
        b->pins[30].capabilities = (mraa_pincapabilities_t){ 1, 0, 0, 0, 0, 0, 0, 0 };

        strncpy(b->pins[31].name, "PI21", MRAA_PIN_NAME_SIZE); // PI21 UART7_RX
        b->pins[31].capabilities = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 1 };
        b->pins[31].gpio.pinmap = 277;

        strncpy(b->pins[32].name, "PI20", MRAA_PIN_NAME_SIZE); // PI20 UART7_TX
        b->pins[32].capabilities = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 1 };
        b->pins[32].gpio.pinmap = 276;

        strncpy(b->pins[33].name, "PB13", MRAA_PIN_NAME_SIZE); // PB13 SPDIF_D0
        b->pins[33].capabilities = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 0 };
        b->pins[33].gpio.pinmap = 45;

        strncpy(b->pins[34].name, "GND", MRAA_PIN_NAME_SIZE);
        b->pins[34].capabilities = (mraa_pincapabilities_t){ 1, 0, 0, 0, 0, 0, 0, 0 };

        strncpy(b->pins[35].name, "PB07", MRAA_PIN_NAME_SIZE); // PB07 I2S0_LRCK
        b->pins[35].capabilities = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 0 };
        b->pins[35].gpio.pinmap = 39;

        strncpy(b->pins[36].name, "PB06", MRAA_PIN_NAME_SIZE); // PB06 I2S0BCLK
        b->pins[36].capabilities = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 0 };
        b->pins[36].gpio.pinmap = 38;

        strncpy(b->pins[37].name, "PB05", MRAA_PIN_NAME_SIZE); // PB05 I2S0MCK
        b->pins[37].capabilities = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 0 };
        b->pins[37].gpio.pinmap = 37;

        strncpy(b->pins[38].name, "PB12", MRAA_PIN_NAME_SIZE); // PB12 I2S0_DI
        b->pins[38].capabilities = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 0 };
        b->pins[38].gpio.pinmap = 44;

        strncpy(b->pins[39].name, "GND", MRAA_PIN_NAME_SIZE);
        b->pins[39].capabilities = (mraa_pincapabilities_t){ 1, 0, 0, 0, 0, 0, 0, 0 };

        strncpy(b->pins[40].name, "PB08", MRAA_PIN_NAME_SIZE); // PB08 I2S0_DO0
        b->pins[40].capabilities = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 0 };
        b->pins[40].gpio.pinmap = 40;
    }

    b->aio_count = 0;
    b->adc_raw = 0;
    b->adc_supported = 0;
    b->pwm_default_period = 500;
    b->pwm_max_period = 2147483;
    b->pwm_min_period = 1;

    b->gpio_count = 0;
    int i;
    for (i = 0; i < b->phy_pin_count; i++) {
        if (b->pins[i].capabilities.gpio) {
            b->gpio_count++;
        }
    }

    // BUS DEFINITIONS
    b->i2c_bus_count = 0;
    b->def_i2c_bus = 0;
    if (i2c2 >= 0) {
        b->i2c_bus[b->i2c_bus_count].bus_id = i2c2;
        b->i2c_bus[b->i2c_bus_count].sda = 3;
        b->i2c_bus[b->i2c_bus_count].scl = 5;
        b->i2c_bus_count++;
    }

    b->spi_bus_count = 0;
    b->def_spi_bus = 0;
    if (spi0 >= 0) {
        b->spi_bus[b->spi_bus_count].bus_id = spi0;
        b->spi_bus[b->spi_bus_count].slave_s = 0;
        b->spi_bus[b->spi_bus_count].cs = 24;
        b->spi_bus[b->spi_bus_count].mosi = 19;
        b->spi_bus[b->spi_bus_count].miso = 21;
        b->spi_bus[b->spi_bus_count].sclk = 23;
        b->spi_bus_count++;
    }

    b->uart_dev_count = 0;
    b->def_uart_dev = 0;
    if ((uart3 >= 0) && (platform_detected == PLATFORM_BANANA_PI)) {
        b->def_uart_dev = b->uart_dev_count;
        b->uart_dev[b->uart_dev_count].device_path = serialdev[uart3];
        b->uart_dev[b->uart_dev_count].rx = 11;
        b->uart_dev[b->uart_dev_count].tx = 13;
        b->uart_dev_count++;
    }
    if ((uart4 >= 0) && (platform_detected == PLATFORM_BANANA_PRO)) {
        b->def_uart_dev = b->uart_dev_count;
        b->uart_dev[b->uart_dev_count].device_path = serialdev[uart4];
        b->uart_dev[b->uart_dev_count].rx = 10;
        b->uart_dev[b->uart_dev_count].tx = 8;
        b->uart_dev_count++;
    }
    if (uart7 >= 0) {
        b->uart_dev[b->uart_dev_count].device_path = serialdev[uart7];
        if (platform_detected == PLATFORM_BANANA_PRO) {
            b->uart_dev[b->uart_dev_count].rx = 31;
            b->uart_dev[b->uart_dev_count].tx = 32;
        } else {
            b->uart_dev[b->uart_dev_count].rx = 30;
            b->uart_dev[b->uart_dev_count].tx = 32;
        }
        b->uart_dev_count++;
    }
    if (uart2 >= 0) {
        b->uart_dev[b->uart_dev_count].device_path = serialdev[uart2];
        b->uart_dev[b->uart_dev_count].rx = 11;
        b->uart_dev[b->uart_dev_count].tx = 13;
        b->uart_dev_count++;
    }
    return b;
}
Example #10
0
mraa_board_t* mraa_96boards()
{
   int i, pin;
   int *ls_gpio_pins = NULL;
   char ch;

   mraa_board_t* b = (mraa_board_t*) calloc(1, sizeof(mraa_board_t));
   if (b == NULL) {
      return NULL;
   }

   // 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;
            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;
            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];
	}
   }

   //UART
   b->uart_dev_count = MRAA_96BOARDS_LS_UART_COUNT;
   b->def_uart_dev = 0;

   //I2C
   b->i2c_bus_count = MRAA_96BOARDS_LS_I2C_COUNT;
   b->def_i2c_bus = 0;
   b->i2c_bus[0].bus_id = 0;
   b->i2c_bus[1].bus_id= 1;

   //SPI
   b->spi_bus_count = MRAA_96BOARDS_LS_SPI_COUNT;
   b->spi_bus[0].bus_id = 0;
   b->def_spi_bus = 0;

   b->adv_func = (mraa_adv_func_t*) calloc(1, sizeof(mraa_adv_func_t));
   if (b->adv_func == NULL) {
      free(b);
      return NULL;
   }

   b->pins = (mraa_pininfo_t*) malloc(sizeof(mraa_pininfo_t) * b->phy_pin_count);
   if (b->pins == NULL) {
      free(b->adv_func);
      free(b);
      return NULL;
   }

   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++)
   {
      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;

   b->aio_count = 0;
   b->adc_raw = 0;
   b->adc_supported = 0;

   return b;
}
Example #11
0
File: arm.c Project: Propanu/mraa
mraa_platform_t
mraa_arm_platform()
{
    mraa_platform_t platform_type = MRAA_UNKNOWN_PLATFORM;
    size_t len = 100;
    char* line = malloc(len);
    FILE* fh = fopen("/proc/cpuinfo", "r");

    if (fh != NULL) {
        while (getline(&line, &len, fh) != -1) {
            if (strncmp(line, "Hardware", 8) == 0) {
                if (strstr(line, "BCM2708")) {
                    platform_type = MRAA_RASPBERRY_PI;
                } else if (strstr(line, "BCM2709")) {
                    platform_type = MRAA_RASPBERRY_PI;
                } else if (strstr(line, "BCM2835")) {
                    platform_type = MRAA_RASPBERRY_PI;
                } else if (strstr(line, "Generic AM33XX")) {
                    if(mraa_file_contains("/proc/device-tree/model", "phyBOARD-WEGA")) {
                        platform_type = MRAA_PHYBOARD_WEGA;
                    } else {
                        platform_type = MRAA_BEAGLEBONE;
                    }
                } else if (strstr(line, "HiKey Development Board")) {
                    platform_type = MRAA_96BOARDS;
                } else if (strstr(line, "s900")) {
                    platform_type = MRAA_96BOARDS;
                } else if (strstr(line, "sun7i")) {
                    if (mraa_file_contains("/proc/device-tree/model", "Banana Pro")) {
                        platform_type = MRAA_BANANA;
                    } else if (mraa_file_contains("/proc/device-tree/model",
                                                  "Banana Pi")) {
                        platform_type = MRAA_BANANA;
                    }
                    // For old kernels
                    else if (mraa_file_exist("/sys/class/leds/green:ph24:led1")) {
                        platform_type = MRAA_BANANA;
                    }
                } else if (strstr(line, "DE0/DE10-Nano-SoC")) {
                        platform_type = MRAA_DE_NANO_SOC;
                // For different kernel version(s) of DE10-Nano
                } else if (strstr(line, "Altera SOCFPGA")) {
                        platform_type = MRAA_DE_NANO_SOC;
                }
            }
        }
        fclose(fh);
    }
    free(line);

    /* Get compatible string from Device tree for boards that dont have enough info in /proc/cpuinfo
     */
    if (platform_type == MRAA_UNKNOWN_PLATFORM) {
        if (mraa_file_contains("/proc/device-tree/model", "s900"))
            platform_type = MRAA_96BOARDS;
        else if (mraa_file_contains("/proc/device-tree/compatible", "qcom,apq8016-sbc"))
            platform_type = MRAA_96BOARDS;
        else if (mraa_file_contains("/proc/device-tree/compatible", "arrow,apq8096-db820c"))
            platform_type = MRAA_96BOARDS;
        else if (mraa_file_contains("/proc/device-tree/model",
                                    "HiKey Development Board"))
            platform_type = MRAA_96BOARDS;
        else if (mraa_file_contains("/proc/device-tree/model", "HiKey960"))
            platform_type = MRAA_96BOARDS;
        else if (mraa_file_contains("/proc/device-tree/model", "ROCK960"))
            platform_type = MRAA_96BOARDS;
        else if (mraa_file_contains("/proc/device-tree/model", "ZynqMP ZCU100 RevC"))
            platform_type = MRAA_96BOARDS;
        else if (mraa_file_contains("/proc/device-tree/model", "Avnet Ultra96 Rev1"))
            platform_type = MRAA_96BOARDS;
        else if (mraa_file_contains("/proc/device-tree/model", "ROCK PI 4"))
            platform_type = MRAA_ROCKPI4;
        else if (mraa_file_contains("/proc/device-tree/compatible", "raspberrypi,"))
            platform_type = MRAA_RASPBERRY_PI;
    }

    switch (platform_type) {
        case MRAA_RASPBERRY_PI:
            plat = mraa_raspberry_pi();
            break;
        case MRAA_BEAGLEBONE:
            plat = mraa_beaglebone();
            break;
        case MRAA_PHYBOARD_WEGA:
            plat = mraa_phyboard();
            break;
        case MRAA_BANANA:
            plat = mraa_banana();
            break;
        case MRAA_96BOARDS:
            plat = mraa_96boards();
	    break;
        case MRAA_ROCKPI4:
	    plat = mraa_rockpi4();
            break;
        case MRAA_DE_NANO_SOC:
            plat = mraa_de_nano_soc();
            break;
        default:
            plat = NULL;
            syslog(LOG_ERR, "Unknown Platform, currently not supported by MRAA");
    }
    return platform_type;
}
Example #12
0
mraa_board_t*
mraa_beaglebone()
{
    unsigned int emmc_enabled = 1;
    unsigned int hdmi_enabled = 1;
    unsigned int i2c0_enabled = 1;
    unsigned int i2c1_enabled = 1;
    unsigned int spi0_enabled = 0;
    unsigned int spi1_enabled = 0;
    unsigned int uart1_enabled = 0;
    unsigned int uart2_enabled = 0;
    unsigned int uart3_enabled = 0;
    unsigned int uart4_enabled = 0;
    unsigned int uart5_enabled = 0;
    unsigned int is_rev_c = 0;
    size_t len = 0;
    char* line = NULL;

    FILE* fh;
    fh = fopen(SYSFS_CLASS_MMC "mmc1/mmc1:0001/name", "r");
    if (fh != NULL) {
        emmc_enabled = 1;
        if (getline(&line, &len, fh) != -1) {
            if (strstr(line, "MMC04G")) {
                is_rev_c = 1;
            }
        }
        fclose(fh);
        free(line);
    } else
        emmc_enabled = 0;


    if (mraa_file_exist("/sys/devices/ocp.*/hdmi.*"))
        hdmi_enabled = 1;
    else
        hdmi_enabled = 0;

    if (mraa_file_exist("/sys/class/i2c-dev/i2c-0"))
        i2c0_enabled = 1;
    else
        i2c0_enabled = 0;

    if (mraa_file_exist("/sys/class/i2c-dev/i2c-1"))
        i2c1_enabled = 1;
    else
        i2c1_enabled = 0;

    if (mraa_file_exist("/sys/class/spidev/spidev1.0"))
        spi0_enabled = 1;
    else
        spi0_enabled = 0;

    if (mraa_file_exist("/sys/class/spidev/spidev2.0"))
        spi1_enabled = 1;
    else
        spi1_enabled = 0;

    if (mraa_file_exist("/sys/class/tty/ttyO1"))
        uart1_enabled = 1;
    else
        uart1_enabled = 0;

    if (mraa_file_exist("/sys/class/tty/ttyO2"))
        uart2_enabled = 1;
    else
        uart2_enabled = 0;

    if (mraa_file_exist("/sys/class/tty/ttyO3"))
        uart3_enabled = 1;
    else
        uart3_enabled = 0;

    if (mraa_file_exist("/sys/class/tty/ttyO4"))
        uart4_enabled = 1;
    else
        uart4_enabled = 0;

    if (mraa_file_exist("/sys/class/tty/ttyO5"))
        uart5_enabled = 1;
    else
        uart5_enabled = 0;

    mraa_board_t* b = (mraa_board_t*) malloc(sizeof(mraa_board_t));
    if (b == NULL)
        return NULL;
    // TODO: Detect Beaglebone Black Revisions, for now always TYPE B
    if (is_rev_c == 0) {
        b->platform_name = PLATFORM_NAME_BEAGLEBONE_BLACK_REV_B;
        b->phy_pin_count = MRAA_BEAGLEBONE_BLACK_PINCOUNT;
    }
    if (is_rev_c == 1) {
        b->platform_name = PLATFORM_NAME_BEAGLEBONE_BLACK_REV_C;
        b->phy_pin_count = MRAA_BEAGLEBONE_BLACK_PINCOUNT;
    }

    if (b->platform_name == NULL) {
        goto error;
    }

    b->aio_count = 7;
    b->adc_raw = 12;
    b->adc_supported = 12;
    b->pwm_default_period = 500;
    b->pwm_max_period = 2147483;
    b->pwm_min_period = 1;

    b->pins = (mraa_pininfo_t*) malloc(sizeof(mraa_pininfo_t) * b->phy_pin_count);

    advance_func->uart_init_pre = &mraa_beaglebone_uart_init_pre;
    advance_func->spi_init_pre = &mraa_beaglebone_spi_init_pre;
    advance_func->i2c_init_pre = &mraa_beaglebone_i2c_init_pre;
    advance_func->pwm_init_replace = &mraa_beaglebone_pwm_init_replace;

    strncpy(b->pins[0].name, "INVALID", 8);
    b->pins[0].capabilites = (mraa_pincapabilities_t){ 0, 0, 0, 0, 0, 0, 0, 0 };

    strncpy(b->pins[1].name, "GND", 8);
    b->pins[1].capabilites = (mraa_pincapabilities_t){ 1, 0, 0, 0, 0, 0, 0, 0 };

    strncpy(b->pins[2].name, "GND", 8);
    b->pins[2].capabilites = (mraa_pincapabilities_t){ 1, 0, 0, 0, 0, 0, 0, 0 };

    if (emmc_enabled == 1) {
        strncpy(b->pins[3].name, "MMC1_D6", 8);
        b->pins[3].capabilites = (mraa_pincapabilities_t){ 1, 0, 0, 0, 0, 0, 0, 0 };
    } else {
        strncpy(b->pins[3].name, "GPIO38", 8);
        b->pins[3].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 0 };
    }
    b->pins[3].gpio.pinmap = 38;
    b->pins[3].gpio.parent_id = 0;
    b->pins[3].gpio.mux_total = 0;

    if (emmc_enabled == 1) {
        strncpy(b->pins[4].name, "MMC1_D7", 8);
        b->pins[4].capabilites = (mraa_pincapabilities_t){ 1, 0, 0, 0, 0, 0, 0, 0 };
    } else {
        strncpy(b->pins[4].name, "GPIO39", 8);
        b->pins[4].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 0 };
    }
    b->pins[4].gpio.pinmap = 39;
    b->pins[4].gpio.parent_id = 0;
    b->pins[4].gpio.mux_total = 0;

    if (emmc_enabled == 1) {
        strncpy(b->pins[5].name, "MMC1_D2", 8);
        b->pins[5].capabilites = (mraa_pincapabilities_t){ 1, 0, 0, 0, 0, 0, 0, 0 };
    } else {
        strncpy(b->pins[5].name, "GPIO34", 8);
        b->pins[5].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 0 };
    }
    b->pins[5].gpio.pinmap = 34;
    b->pins[5].gpio.parent_id = 0;
    b->pins[5].gpio.mux_total = 0;

    if (emmc_enabled == 1) {
        strncpy(b->pins[6].name, "MMC1_D3", 8);
        b->pins[6].capabilites = (mraa_pincapabilities_t){ 1, 0, 0, 0, 0, 0, 0, 0 };
    } else {
        strncpy(b->pins[6].name, "GPIO35", 8);
        b->pins[6].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 0 };
    }
    b->pins[6].gpio.pinmap = 35;
    b->pins[6].gpio.parent_id = 0;
    b->pins[6].gpio.mux_total = 0;

    // TODO TIMER4
    strncpy(b->pins[7].name, "GPIO66", 8);
    b->pins[7].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 0 };
    b->pins[7].gpio.pinmap = 66;
    b->pins[7].gpio.parent_id = 0;
    b->pins[7].gpio.mux_total = 0;

    // TODO TIMER7
    strncpy(b->pins[8].name, "GPIO67", 8);
    b->pins[8].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 0 };
    b->pins[8].gpio.pinmap = 67;
    b->pins[8].gpio.parent_id = 0;
    b->pins[8].gpio.mux_total = 0;

    // TODO TIMER5
    strncpy(b->pins[9].name, "GPIO69", 8);
    b->pins[9].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 0 };
    b->pins[9].gpio.pinmap = 69;
    b->pins[9].gpio.parent_id = 0;
    b->pins[9].gpio.mux_total = 0;

    // TODO TIMER6
    strncpy(b->pins[10].name, "GPIO68", 8);
    b->pins[10].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 0 };
    b->pins[10].gpio.pinmap = 68;
    b->pins[10].gpio.parent_id = 0;
    b->pins[10].gpio.mux_total = 0;

    strncpy(b->pins[11].name, "GPIO45", 8);
    b->pins[11].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 0 };
    b->pins[11].gpio.pinmap = 45;
    b->pins[11].gpio.parent_id = 0;
    b->pins[11].gpio.mux_total = 0;

    strncpy(b->pins[12].name, "GPIO44", 8);
    b->pins[12].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 0 };
    b->pins[12].gpio.pinmap = 44;
    b->pins[12].gpio.parent_id = 0;
    b->pins[12].gpio.mux_total = 0;

    strncpy(b->pins[13].name, "GPIO23", 8);
    b->pins[13].capabilites = (mraa_pincapabilities_t){ 1, 1, 1, 0, 0, 0, 0, 0 };
    b->pins[13].gpio.pinmap = 23;
    b->pins[13].gpio.parent_id = 0;
    b->pins[13].gpio.mux_total = 0;

    strncpy(b->pins[14].name, "GPIO26", 8);
    b->pins[14].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 0 };
    b->pins[14].gpio.pinmap = 26;
    b->pins[14].gpio.parent_id = 0;
    b->pins[14].gpio.mux_total = 0;

    strncpy(b->pins[15].name, "GPIO47", 8);
    b->pins[15].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 0 };
    b->pins[15].gpio.pinmap = 47;
    b->pins[15].gpio.parent_id = 0;
    b->pins[15].gpio.mux_total = 0;

    strncpy(b->pins[16].name, "GPIO46", 8);
    b->pins[16].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 0 };
    b->pins[16].gpio.pinmap = 46;
    b->pins[16].gpio.parent_id = 0;
    b->pins[16].gpio.mux_total = 0;

    // TODO PWM0_SYNCO
    strncpy(b->pins[17].name, "GPIO27", 8);
    b->pins[17].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 0 };
    b->pins[17].gpio.pinmap = 27;
    b->pins[17].gpio.parent_id = 0;
    b->pins[17].gpio.mux_total = 0;

    strncpy(b->pins[18].name, "GPIO65", 8);
    b->pins[18].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 0 };
    b->pins[18].gpio.pinmap = 65;
    b->pins[18].gpio.parent_id = 0;
    b->pins[18].gpio.mux_total = 0;

    // TODO PWM_2A
    strncpy(b->pins[19].name, "GPIO22", 8);
    b->pins[19].capabilites = (mraa_pincapabilities_t){ 1, 1, 1, 0, 0, 0, 0, 0 };
    b->pins[19].gpio.pinmap = 22;
    b->pins[19].gpio.parent_id = 0;
    b->pins[19].gpio.mux_total = 0;

    if (emmc_enabled == 1) {
        strncpy(b->pins[20].name, "MMC1_CMD", 8);
        b->pins[20].capabilites = (mraa_pincapabilities_t){ 1, 0, 0, 0, 0, 0, 0, 0 };
    } else {
        strncpy(b->pins[20].name, "GPIO63", 8);
        b->pins[20].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 0 };
    }
    b->pins[20].gpio.pinmap = 63;
    b->pins[20].gpio.parent_id = 0;
    b->pins[20].gpio.mux_total = 0;

    if (emmc_enabled == 1) {
        strncpy(b->pins[21].name, "MMC1_CLK", 8);
        b->pins[21].capabilites = (mraa_pincapabilities_t){ 1, 0, 0, 0, 0, 0, 0, 0 };
    } else {
        strncpy(b->pins[21].name, "GPIO62", 8);
        b->pins[21].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 0 };
    }
    b->pins[21].gpio.pinmap = 62;
    b->pins[21].gpio.parent_id = 0;
    b->pins[21].gpio.mux_total = 0;

    if (emmc_enabled == 1) {
        strncpy(b->pins[22].name, "MMC1_D5", 8);
        b->pins[22].capabilites = (mraa_pincapabilities_t){ 1, 0, 0, 0, 0, 0, 0, 0 };
    } else {
        strncpy(b->pins[22].name, "GPIO37", 8);
        b->pins[22].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 0 };
    }
    b->pins[22].gpio.pinmap = 37;
    b->pins[22].gpio.parent_id = 0;
    b->pins[22].gpio.mux_total = 0;

    if (emmc_enabled == 1) {
        strncpy(b->pins[23].name, "MMC_D4", 8);
        b->pins[23].capabilites = (mraa_pincapabilities_t){ 1, 0, 0, 0, 0, 0, 0, 0 };
    } else {
        strncpy(b->pins[23].name, "GPIO36", 8);
        b->pins[23].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 0 };
    }
    b->pins[23].gpio.pinmap = 36;
    b->pins[23].gpio.parent_id = 0;
    b->pins[23].gpio.mux_total = 0;

    if (emmc_enabled == 1) {
        strncpy(b->pins[24].name, "MMC_D1", 8);
        b->pins[24].capabilites = (mraa_pincapabilities_t){ 1, 0, 0, 0, 0, 0, 0, 0 };
    } else {
        strncpy(b->pins[24].name, "GPIO33", 8);
        b->pins[24].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 0 };
    }
    b->pins[24].gpio.pinmap = 33;
    b->pins[24].gpio.parent_id = 0;
    b->pins[24].gpio.mux_total = 0;

    if (emmc_enabled == 1) {
        strncpy(b->pins[25].name, "MMC1_D0", 8);
        b->pins[25].capabilites = (mraa_pincapabilities_t){ 1, 0, 0, 0, 0, 0, 0, 0 };
    } else {
        strncpy(b->pins[25].name, "GPIO32", 8);
        b->pins[25].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 0 };
    }
    b->pins[25].gpio.pinmap = 32;
    b->pins[25].gpio.parent_id = 0;
    b->pins[25].gpio.mux_total = 0;

    strncpy(b->pins[26].name, "GPIO61", 8);
    b->pins[26].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 0 };
    b->pins[26].gpio.pinmap = 61;
    b->pins[26].gpio.parent_id = 0;
    b->pins[26].gpio.mux_total = 0;

    if (hdmi_enabled == 1) {
        strncpy(b->pins[27].name, "LCD_VSYNC", 8);
        b->pins[27].capabilites = (mraa_pincapabilities_t){ 1, 0, 0, 0, 0, 0, 0, 0 };
    } else {
        strncpy(b->pins[27].name, "GPIO86", 8);
        b->pins[27].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 0 };
    }
    b->pins[27].gpio.pinmap = 86;
    b->pins[27].gpio.parent_id = 0;
    b->pins[27].gpio.mux_total = 0;

    if (hdmi_enabled == 1) {
        strncpy(b->pins[28].name, "LCD_PCLK", 8);
        b->pins[28].capabilites = (mraa_pincapabilities_t){ 1, 0, 0, 0, 0, 0, 0, 0 };
    } else {
        strncpy(b->pins[28].name, "GPIO88", 8);
        b->pins[28].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 0 };
    }
    b->pins[28].gpio.pinmap = 88;
    b->pins[28].gpio.parent_id = 0;
    b->pins[28].gpio.mux_total = 0;

    if (hdmi_enabled == 1) {
        strncpy(b->pins[29].name, "LCD_HSYNC", 8);
        b->pins[29].capabilites = (mraa_pincapabilities_t){ 1, 0, 0, 0, 0, 0, 0, 0 };
    } else {
        strncpy(b->pins[29].name, "GPIO87", 8);
        b->pins[29].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 0 };
    }
    b->pins[29].gpio.pinmap = 87;
    b->pins[29].gpio.parent_id = 0;
    b->pins[29].gpio.mux_total = 0;

    if (hdmi_enabled == 1) {
        strncpy(b->pins[30].name, "LCD_AC_BIAS", 8);
        b->pins[30].capabilites = (mraa_pincapabilities_t){ 1, 0, 0, 0, 0, 0, 0, 0 };
    } else {
        strncpy(b->pins[30].name, "GPIO89", 8);
        b->pins[30].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 0 };
    }
    b->pins[30].gpio.pinmap = 89;
    b->pins[30].gpio.parent_id = 0;
    b->pins[30].gpio.mux_total = 0;

    if (hdmi_enabled == 1) {
        strncpy(b->pins[31].name, "LCD_D14", 8);
        b->pins[31].capabilites = (mraa_pincapabilities_t){ 1, 0, 0, 0, 0, 0, 0, 0 };
    } else {
        // TODO UART5_CTS this is ignored when using ADAFRUIT
        strncpy(b->pins[31].name, "GPIO10", 8);
        b->pins[31].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 0 };
    }
    b->pins[31].gpio.pinmap = 10;
    b->pins[31].gpio.parent_id = 0;
    b->pins[31].gpio.mux_total = 0;
    b->pins[31].uart.mux_total = 0;

    if (hdmi_enabled == 1) {
        strncpy(b->pins[32].name, "LCD_D15", 8);
        b->pins[32].capabilites = (mraa_pincapabilities_t){ 1, 0, 0, 0, 0, 0, 0, 0 };
    } else {
        // TODO UART5_RTS this is ignored when using ADAFRUIT
        strncpy(b->pins[32].name, "GPIO11", 8);
        b->pins[32].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 0 };
    }
    b->pins[32].gpio.pinmap = 11;
    b->pins[32].gpio.parent_id = 0;
    b->pins[32].gpio.mux_total = 0;
    b->pins[32].uart.mux_total = 0;

    if (hdmi_enabled == 1) {
        strncpy(b->pins[33].name, "LCD_D13", 8);
        b->pins[33].capabilites = (mraa_pincapabilities_t){ 1, 0, 0, 0, 0, 0, 0, 0 };
    } else {
        // TODO UART4_RTS this is ignored when using ADAFRUIT
        strncpy(b->pins[33].name, "GPIO9", 8);
        b->pins[33].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 0 };
    }
    b->pins[33].gpio.pinmap = 9;
    b->pins[33].gpio.parent_id = 0;
    b->pins[33].gpio.mux_total = 0;
    b->pins[33].uart.mux_total = 0;

    // TODO PWM_1B
    if (hdmi_enabled == 1) {
        strncpy(b->pins[34].name, "LCD_D11", 8);
        b->pins[34].capabilites = (mraa_pincapabilities_t){ 1, 0, 0, 0, 0, 0, 0, 0 };
    } else {
        strncpy(b->pins[34].name, "GPIO81", 8);
        b->pins[34].capabilites = (mraa_pincapabilities_t){ 1, 1, 1, 0, 0, 0, 0, 0 };
    }
    b->pins[34].gpio.pinmap = 81;
    b->pins[34].gpio.parent_id = 0;
    b->pins[34].gpio.mux_total = 0;

    if (hdmi_enabled == 1) {
        strncpy(b->pins[35].name, "LCD_D12", 8);
        b->pins[35].capabilites = (mraa_pincapabilities_t){ 1, 0, 0, 0, 0, 0, 0, 0 };
    } else {
        // TODO UART4_CTS this is ignored when using ADAFRUIT
        strncpy(b->pins[35].name, "GPIO8", 8);
        b->pins[35].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 0 };
    }
    b->pins[35].gpio.pinmap = 8;
    b->pins[35].gpio.parent_id = 0;
    b->pins[35].gpio.mux_total = 0;
    b->pins[35].uart.mux_total = 0;

    // TODO PWM_1A
    if (hdmi_enabled == 1) {
        strncpy(b->pins[36].name, "LCD_D10", 8);
        b->pins[36].capabilites = (mraa_pincapabilities_t){ 1, 0, 0, 0, 0, 0, 0, 0 };
    } else {
        strncpy(b->pins[36].name, "GPIO80", 8);
        b->pins[36].capabilites = (mraa_pincapabilities_t){ 1, 1, 1, 0, 0, 0, 0, 0 };
    }
    b->pins[36].gpio.pinmap = 80;
    b->pins[36].gpio.parent_id = 0;
    b->pins[36].gpio.mux_total = 0;

    if (hdmi_enabled == 1) {
        strncpy(b->pins[37].name, "LCD_D8", 8);
        b->pins[37].capabilites = (mraa_pincapabilities_t){ 1, 0, 0, 0, 0, 0, 0, 0 };
    } else {
        if (uart5_enabled == 1) {
            strncpy(b->pins[37].name, "UART5TX", 8);
            b->pins[37].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 1 };
        } else {
            strncpy(b->pins[37].name, "GPIO78", 8);
            b->pins[37].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 1 };
        }
    }
    b->pins[37].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 1 };
    b->pins[37].gpio.pinmap = 78;
    b->pins[37].gpio.parent_id = 0;
    b->pins[37].gpio.mux_total = 0;
    b->pins[37].uart.mux_total = 0;

    if (hdmi_enabled == 1) {
        strncpy(b->pins[38].name, "LCD_D9", 8);
        b->pins[38].capabilites = (mraa_pincapabilities_t){ 1, 0, 0, 0, 0, 0, 0, 0 };
    } else {
        // TODO UART5_RX
        if (uart5_enabled == 1) {
            strncpy(b->pins[38].name, "UART5RX", 8);
            b->pins[38].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 1 };
        } else {
            strncpy(b->pins[38].name, "GPIO79", 8);
            b->pins[38].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 1 };
        }
    }
    b->pins[38].gpio.pinmap = 79;
    b->pins[38].gpio.parent_id = 0;
    b->pins[38].gpio.mux_total = 0;
    b->pins[38].uart.mux_total = 0;

    if (hdmi_enabled == 1) {
        strncpy(b->pins[39].name, "LCD_D6", 8);
        b->pins[39].capabilites = (mraa_pincapabilities_t){ 1, 0, 0, 0, 0, 0, 0, 0 };
    } else {
        strncpy(b->pins[39].name, "GPIO76", 8);
        b->pins[39].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 0 };
    }
    b->pins[39].gpio.pinmap = 76;
    b->pins[39].gpio.parent_id = 0;
    b->pins[39].gpio.mux_total = 0;

    if (hdmi_enabled == 1) {
        strncpy(b->pins[40].name, "LCD_D7", 8);
        b->pins[40].capabilites = (mraa_pincapabilities_t){ 1, 0, 0, 0, 0, 0, 0, 0 };
    } else {
        strncpy(b->pins[40].name, "GPIO77", 8);
        b->pins[40].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 0 };
    }
    b->pins[40].gpio.pinmap = 77;
    b->pins[40].gpio.parent_id = 0;
    b->pins[40].gpio.mux_total = 0;

    if (hdmi_enabled == 1) {
        strncpy(b->pins[41].name, "LCD_D4", 8);
        b->pins[41].capabilites = (mraa_pincapabilities_t){ 1, 0, 0, 0, 0, 0, 0, 0 };
    } else {
        strncpy(b->pins[41].name, "GPIO74", 8);
        b->pins[41].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 0 };
    }
    b->pins[41].gpio.pinmap = 74;
    b->pins[41].gpio.parent_id = 0;
    b->pins[41].gpio.mux_total = 0;

    if (hdmi_enabled == 1) {
        strncpy(b->pins[42].name, "LCD_D5", 8);
        b->pins[42].capabilites = (mraa_pincapabilities_t){ 1, 0, 0, 0, 0, 0, 0, 0 };
    } else {
        strncpy(b->pins[42].name, "GPIO75", 8);
        b->pins[42].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 0 };
    }
    b->pins[42].gpio.pinmap = 75;
    b->pins[42].gpio.parent_id = 0;
    b->pins[42].gpio.mux_total = 0;

    if (hdmi_enabled == 1) {
        strncpy(b->pins[43].name, "LCD_D2", 8);
        b->pins[43].capabilites = (mraa_pincapabilities_t){ 1, 0, 0, 0, 0, 0, 0, 0 };
    } else {
        strncpy(b->pins[43].name, "GPIO72", 8);
        b->pins[43].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 0 };
    }
    b->pins[43].gpio.pinmap = 72;
    b->pins[43].gpio.parent_id = 0;
    b->pins[43].gpio.mux_total = 0;

    if (hdmi_enabled == 1) {
        strncpy(b->pins[44].name, "LCD_D3", 8);
        b->pins[44].capabilites = (mraa_pincapabilities_t){ 1, 0, 0, 0, 0, 0, 0, 0 };
    } else {
        strncpy(b->pins[44].name, "GPIO73", 8);
        b->pins[44].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 0 };
    }
    b->pins[44].gpio.pinmap = 73;
    b->pins[44].gpio.parent_id = 0;
    b->pins[44].gpio.mux_total = 0;

    // TODO PWM_2A
    if (hdmi_enabled == 1) {
        strncpy(b->pins[45].name, "LCD_D0", 8);
        b->pins[45].capabilites = (mraa_pincapabilities_t){ 1, 0, 0, 0, 0, 0, 0, 0 };
    } else {
        strncpy(b->pins[45].name, "GPIO70", 8);
        b->pins[45].capabilites = (mraa_pincapabilities_t){ 1, 1, 1, 0, 0, 0, 0, 0 };
    }
    b->pins[45].gpio.pinmap = 70;
    b->pins[45].gpio.parent_id = 0;
    b->pins[45].gpio.mux_total = 0;

    // TODO PWM_2B
    if (hdmi_enabled == 1) {
        strncpy(b->pins[46].name, "LCD_D1", 8);
        b->pins[46].capabilites = (mraa_pincapabilities_t){ 1, 0, 0, 0, 0, 0, 0, 0 };
    } else {
        strncpy(b->pins[46].name, "GPIO71", 8);
        b->pins[46].capabilites = (mraa_pincapabilities_t){ 1, 1, 1, 0, 0, 0, 0, 0 };
    }
    b->pins[46].gpio.pinmap = 71;
    b->pins[46].gpio.parent_id = 0;
    b->pins[46].gpio.mux_total = 0;

    strncpy(b->pins[47].name, "GND", 8);
    b->pins[47].capabilites = (mraa_pincapabilities_t){ 1, 0, 0, 0, 0, 0, 0, 0 };

    strncpy(b->pins[48].name, "GND", 8);
    b->pins[48].capabilites = (mraa_pincapabilities_t){ 1, 0, 0, 0, 0, 0, 0, 0 };

    strncpy(b->pins[49].name, "3.3V", 8);
    b->pins[49].capabilites = (mraa_pincapabilities_t){ 1, 0, 0, 0, 0, 0, 0, 0 };

    strncpy(b->pins[50].name, "3.3V", 8);
    b->pins[50].capabilites = (mraa_pincapabilities_t){ 1, 0, 0, 0, 0, 0, 0, 0 };

    strncpy(b->pins[51].name, "5V", 8);
    b->pins[51].capabilites = (mraa_pincapabilities_t){ 1, 0, 0, 0, 0, 0, 0, 0 };

    strncpy(b->pins[52].name, "5V", 8);
    b->pins[52].capabilites = (mraa_pincapabilities_t){ 1, 0, 0, 0, 0, 0, 0, 0 };

    strncpy(b->pins[53].name, "5V", 8);
    b->pins[53].capabilites = (mraa_pincapabilities_t){ 1, 0, 0, 0, 0, 0, 0, 0 };

    strncpy(b->pins[54].name, "5V", 8);
    b->pins[54].capabilites = (mraa_pincapabilities_t){ 1, 0, 0, 0, 0, 0, 0, 0 };

    strncpy(b->pins[55].name, "PWR", 8);
    b->pins[55].capabilites = (mraa_pincapabilities_t){ 1, 0, 0, 0, 0, 0, 0, 0 };

    strncpy(b->pins[56].name, "RESET", 8);
    b->pins[56].capabilites = (mraa_pincapabilities_t){ 1, 0, 0, 0, 0, 0, 0, 0 };

    if (uart4_enabled == 1) {
        strncpy(b->pins[57].name, "UART4_RX", 8);
        b->pins[57].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 1 };
    } else {
        strncpy(b->pins[57].name, "GPIO30", 8);
        b->pins[57].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 1 };
    }
    b->pins[57].gpio.pinmap = 30;
    b->pins[57].gpio.parent_id = 0;
    b->pins[57].gpio.mux_total = 0;
    b->pins[57].uart.mux_total = 0;

    strncpy(b->pins[58].name, "GPIO60", 8);
    b->pins[58].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 0 };
    b->pins[58].gpio.pinmap = 60;
    b->pins[58].gpio.parent_id = 0;
    b->pins[58].gpio.mux_total = 0;

    if (uart4_enabled == 1) {
        strncpy(b->pins[59].name, "UART4_TX", 8);
        b->pins[59].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 1 };
    } else {
        strncpy(b->pins[59].name, "GPIO31", 8);
        b->pins[59].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 1 };
    }
    b->pins[59].gpio.pinmap = 31;
    b->pins[59].gpio.parent_id = 0;
    b->pins[59].gpio.mux_total = 0;
    b->pins[59].uart.mux_total = 0;

    // TODO PWM_1A
    strncpy(b->pins[60].name, "GPIO40", 8);
    b->pins[60].capabilites = (mraa_pincapabilities_t){ 1, 1, 1, 0, 0, 0, 0, 0 };
    b->pins[60].gpio.pinmap = 50;
    b->pins[60].gpio.parent_id = 0;
    b->pins[60].gpio.mux_total = 0;

    // TODO PWM_TRIP2_IN is this PWM?????
    strncpy(b->pins[61].name, "GPIO48", 8);
    b->pins[61].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 0 };
    b->pins[61].gpio.pinmap = 48;
    b->pins[61].gpio.parent_id = 0;
    b->pins[61].gpio.mux_total = 0;

    // TODO PWM_1B
    strncpy(b->pins[62].name, "GPIO51", 8);
    b->pins[62].capabilites = (mraa_pincapabilities_t){ 1, 1, 1, 0, 0, 0, 0, 0 };
    b->pins[62].gpio.pinmap = 51;
    b->pins[62].gpio.parent_id = 0;
    b->pins[62].gpio.mux_total = 0;

    if ((i2c0_enabled == 1) || (spi0_enabled == 1)) {
        if (i2c0_enabled == 1) {
            strncpy(b->pins[63].name, "I2C1SCL", 8);
            b->pins[63].capabilites = (mraa_pincapabilities_t){ 1, 0, 0, 0, 1, 1, 0, 0 };
        }
        if (spi0_enabled == 1) {
            strncpy(b->pins[63].name, "SPI0CS0", 8);
            b->pins[63].capabilites = (mraa_pincapabilities_t){ 1, 0, 0, 0, 1, 0, 0, 0 };
        }
    } else {
        strncpy(b->pins[63].name, "GPIO4", 8);
        b->pins[63].capabilites = (mraa_pincapabilities_t){ 1, 0, 0, 0, 1, 1, 0, 0 };
    }
    b->pins[63].gpio.pinmap = 4;
    b->pins[63].gpio.parent_id = 0;
    b->pins[63].gpio.mux_total = 0;
    b->pins[63].i2c.mux_total = 0;
    b->pins[63].spi.mux_total = 0;

    if ((i2c0_enabled == 1) || (spi0_enabled == 1)) {
        if (i2c0_enabled == 1) {
            strncpy(b->pins[64].name, "I2C1SDA", 8);
            b->pins[64].capabilites = (mraa_pincapabilities_t){ 1, 0, 0, 0, 1, 1, 0, 0 };
        }
        if (spi0_enabled == 1) {
            strncpy(b->pins[64].name, "SPI0D1", 8);
            b->pins[64].capabilites = (mraa_pincapabilities_t){ 1, 0, 0, 0, 1, 0, 0, 0 };
        }
    } else {
        strncpy(b->pins[64].name, "GPIO5", 8);
        b->pins[64].capabilites = (mraa_pincapabilities_t){ 1, 0, 0, 0, 1, 1, 0, 0 };
    }
    b->pins[64].gpio.pinmap = 5;
    b->pins[64].gpio.parent_id = 0;
    b->pins[64].gpio.mux_total = 0;
    b->pins[64].i2c.mux_total = 0;
    b->pins[64].spi.mux_total = 0;

    if (i2c0_enabled == 1) {
        strncpy(b->pins[65].name, "I2C2SCL", 8);
        b->pins[65].capabilites = (mraa_pincapabilities_t){ 1, 0, 0, 0, 0, 1, 0, 0 };
        b->pins[65].i2c.mux_total = 0;
    } else {
        strncpy(b->pins[65].name, "GPIO13", 8);
        b->pins[65].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 1, 0, 0 };
    }
    b->pins[65].gpio.pinmap = 13;
    b->pins[65].gpio.parent_id = 0;
    b->pins[65].gpio.mux_total = 0;
    b->pins[65].i2c.mux_total = 0;

    if (i2c0_enabled == 1) {
        strncpy(b->pins[66].name, "I2C2SDA", 8);
        b->pins[66].capabilites = (mraa_pincapabilities_t){ 1, 0, 0, 0, 0, 1, 0, 0 };
        b->pins[66].i2c.mux_total = 0;
    } else {
        strncpy(b->pins[66].name, "GPIO12", 8);
        b->pins[66].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 1, 0, 0 };
    }
    b->pins[66].gpio.pinmap = 12;
    b->pins[66].gpio.parent_id = 0;
    b->pins[66].gpio.mux_total = 0;
    b->pins[66].i2c.mux_total = 0;

    if ((spi0_enabled == 1) || uart2_enabled == 1) {
        if (uart2_enabled == 1) {
            strncpy(b->pins[67].name, "UART2_TX", 8);
            b->pins[67].capabilites = (mraa_pincapabilities_t){ 1, 0, 0, 0, 1, 0, 0, 1 };
        }
        if (spi0_enabled == 1) {
            strncpy(b->pins[67].name, "SPI0D0", 8);
            b->pins[67].capabilites = (mraa_pincapabilities_t){ 1, 0, 0, 0, 1, 0, 0, 0 };
        }
    } else {
        strncpy(b->pins[67].name, "GPIO3", 8);
        b->pins[67].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 1, 0, 0, 1 };
    }
    b->pins[67].gpio.pinmap = 3;
    b->pins[67].gpio.parent_id = 0;
    b->pins[67].gpio.mux_total = 0;
    b->pins[67].spi.mux_total = 0;
    b->pins[67].uart.mux_total = 0;


    if ((spi0_enabled == 1) || uart2_enabled == 1) {
        if (uart2_enabled == 1) {
            strncpy(b->pins[68].name, "UART2_RX", 8);
            b->pins[68].capabilites = (mraa_pincapabilities_t){ 1, 0, 0, 0, 1, 0, 0, 1 };
        }
        if (spi0_enabled == 1) {
            strncpy(b->pins[68].name, "SPI0CLK", 8);
            b->pins[68].capabilites = (mraa_pincapabilities_t){ 1, 0, 0, 0, 1, 0, 0, 0 };
        }
    } else {
        strncpy(b->pins[68].name, "GPIO2", 8);
        b->pins[68].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 1, 0, 0, 1 };
    }
    b->pins[68].gpio.pinmap = 2;
    b->pins[68].gpio.parent_id = 0;
    b->pins[68].gpio.mux_total = 0;
    b->pins[68].spi.mux_total = 0;
    b->pins[68].uart.mux_total = 0;

    // TODO PWM0_SYNCO ?? PWM
    strncpy(b->pins[69].name, "GPIO49", 8);
    b->pins[69].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 0 };
    b->pins[69].gpio.pinmap = 49;
    b->pins[69].gpio.parent_id = 0;
    b->pins[69].gpio.mux_total = 0;

    if (uart1_enabled == 1) {
        strncpy(b->pins[70].name, "UART1_RX", 8);
        b->pins[70].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 1 };
    } else {
        strncpy(b->pins[70].name, "GPIO15", 8);
        b->pins[70].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 1 };
    }
    b->pins[70].gpio.pinmap = 15;
    b->pins[70].gpio.parent_id = 0;
    b->pins[70].gpio.mux_total = 0;
    b->pins[70].uart.mux_total = 0;

    strncpy(b->pins[71].name, "GPIO117", 8);
    b->pins[71].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 0 };
    b->pins[71].gpio.pinmap = 117;
    b->pins[71].gpio.parent_id = 0;
    b->pins[71].gpio.mux_total = 0;

    if (uart1_enabled == 1) {
        strncpy(b->pins[72].name, "UART1_RX", 8);
        b->pins[72].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 1 };
    } else {
        strncpy(b->pins[72].name, "GPIO14", 8);
        b->pins[72].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 1 };
    }
    b->pins[72].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 1 };
    b->pins[72].gpio.pinmap = 14;
    b->pins[72].gpio.parent_id = 0;
    b->pins[72].gpio.mux_total = 0;
    b->pins[72].uart.mux_total = 0;

    strncpy(b->pins[73].name, "GPIO115", 8);
    b->pins[73].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 0 };
    b->pins[73].gpio.pinmap = 115;
    b->pins[73].gpio.parent_id = 0;
    b->pins[73].gpio.mux_total = 0;

    if (emmc_enabled != 1) {
        if (spi1_enabled == 1) {
            strncpy(b->pins[74].name, "SPI1CS0", 8);
            b->pins[74].capabilites = (mraa_pincapabilities_t){ 1, 0, 0, 0, 1, 0, 0, 0 };
        } else {
            strncpy(b->pins[74].name, "GPIO113", 8);
            b->pins[74].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 1, 0, 0, 0 };
        }
    } else {
        strncpy(b->pins[74].name, "MCASP0XX", 8);
        b->pins[74].capabilites = (mraa_pincapabilities_t){ 1, 0, 0, 0, 1, 0, 0, 0 };
    }
    b->pins[74].gpio.pinmap = 113;
    b->pins[74].gpio.parent_id = 0;
    b->pins[74].gpio.mux_total = 0;
    b->pins[74].spi.mux_total = 0;

    if (emmc_enabled != 1) {
        if (spi1_enabled == 1) {
            strncpy(b->pins[75].name, "SPI1D0", 8);
            b->pins[75].capabilites = (mraa_pincapabilities_t){ 1, 0, 0, 0, 1, 0, 0, 0 };
        } else {
            strncpy(b->pins[75].name, "GPIO111", 8);
            b->pins[75].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 1, 0, 0, 0 };
        }
    } else {
        strncpy(b->pins[75].name, "MMC1_SD", 8);
        b->pins[75].capabilites = (mraa_pincapabilities_t){ 1, 0, 0, 0, 0, 0, 0, 0 };
    }
    b->pins[75].gpio.pinmap = 111;
    b->pins[75].gpio.parent_id = 0;
    b->pins[75].gpio.mux_total = 0;
    b->pins[75].spi.mux_total = 0;

    if (emmc_enabled != 1) {
        if (spi1_enabled == 1) {
            strncpy(b->pins[76].name, "SPI1D1", 8);
            b->pins[76].capabilites = (mraa_pincapabilities_t){ 1, 0, 0, 0, 1, 0, 0, 0 };
        } else {
            strncpy(b->pins[76].name, "GPIO112", 8);
            b->pins[76].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 1, 0, 0, 0 };
        }
    } else {
        strncpy(b->pins[76].name, "MMC2_SD", 8);
        b->pins[76].capabilites = (mraa_pincapabilities_t){ 1, 0, 0, 0, 0, 0, 0, 0 };
    }
    b->pins[76].gpio.pinmap = 112;
    b->pins[76].gpio.parent_id = 0;
    b->pins[76].gpio.mux_total = 0;
    b->pins[76].spi.mux_total = 0;

    if (emmc_enabled != 1) {
        if (spi1_enabled == 1) {
            strncpy(b->pins[77].name, "SPI1CLK", 8);
            b->pins[77].capabilites = (mraa_pincapabilities_t){ 1, 0, 0, 0, 1, 0, 0, 0 };
        } else {
            strncpy(b->pins[77].name, "GPIO110", 8);
            b->pins[77].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 1, 0, 0, 0 };
        }
    } else {
        strncpy(b->pins[77].name, "MMC0_SD", 8);
        b->pins[77].capabilites = (mraa_pincapabilities_t){ 1, 0, 0, 0, 0, 0, 0, 0 };
    }
    b->pins[77].gpio.pinmap = 110;
    b->pins[77].gpio.parent_id = 0;
    b->pins[77].gpio.mux_total = 0;
    b->pins[77].spi.mux_total = 0;


    strncpy(b->pins[78].name, "VDD_ADC", 8);
    b->pins[78].capabilites = (mraa_pincapabilities_t){ 1, 0, 0, 0, 0, 0, 0, 0 };

    // TODO AIN4
    strncpy(b->pins[79].name, "AIN4", 8);
    b->pins[79].capabilites = (mraa_pincapabilities_t){ 1, 0, 0, 0, 0, 0, 1, 0 };

    strncpy(b->pins[80].name, "GND_ADC", 8);
    b->pins[80].capabilites = (mraa_pincapabilities_t){ 1, 0, 0, 0, 0, 0, 0, 0 };
    // TODO AIN6
    strncpy(b->pins[81].name, "AIN6", 8);
    b->pins[81].capabilites = (mraa_pincapabilities_t){ 1, 0, 0, 0, 0, 0, 1, 0 };
    // TODO AIN5
    strncpy(b->pins[82].name, "AIN5", 8);
    b->pins[82].capabilites = (mraa_pincapabilities_t){ 1, 0, 0, 0, 0, 0, 1, 0 };
    // TODO AIN2
    strncpy(b->pins[83].name, "AIN2", 8);
    b->pins[83].capabilites = (mraa_pincapabilities_t){ 1, 0, 0, 0, 0, 0, 1, 0 };
    // TODO AIN3
    strncpy(b->pins[84].name, "AIN3", 8);
    b->pins[84].capabilites = (mraa_pincapabilities_t){ 1, 0, 0, 0, 0, 0, 1, 0 };
    // TODO AIN0
    strncpy(b->pins[85].name, "AIN0", 8);
    b->pins[85].capabilites = (mraa_pincapabilities_t){ 1, 0, 0, 0, 0, 0, 1, 0 };
    // TODO AIN1
    strncpy(b->pins[86].name, "AIN1", 8);
    b->pins[86].capabilites = (mraa_pincapabilities_t){ 1, 0, 0, 0, 0, 0, 1, 0 };

    strncpy(b->pins[87].name, "GPIO20", 8);
    b->pins[87].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 0 };
    b->pins[87].gpio.pinmap = 20;
    b->pins[87].gpio.parent_id = 0;
    b->pins[87].gpio.mux_total = 0;

    strncpy(b->pins[88].name, "GPIO7", 8);
    b->pins[88].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 0 };
    b->pins[88].gpio.pinmap = 7;
    b->pins[88].gpio.parent_id = 0;
    b->pins[88].gpio.mux_total = 0;

    // GND
    strncpy(b->pins[89].name, "GND", 8);
    b->pins[89].capabilites = (mraa_pincapabilities_t){ 1, 0, 0, 0, 0, 0, 0, 0 };

    // GND
    strncpy(b->pins[90].name, "GND", 8);
    b->pins[90].capabilites = (mraa_pincapabilities_t){ 1, 0, 0, 0, 0, 0, 0, 0 };

    // GND
    strncpy(b->pins[91].name, "GND", 8);
    b->pins[91].capabilites = (mraa_pincapabilities_t){ 1, 0, 0, 0, 0, 0, 0, 0 };

    // GND
    strncpy(b->pins[92].name, "GND", 8);
    b->pins[92].capabilites = (mraa_pincapabilities_t){ 1, 0, 0, 0, 0, 0, 0, 0 };

    // BUS DEFINITIONS
    b->i2c_bus_count = 2;
    b->def_i2c_bus = 0;

    b->i2c_bus[0].bus_id = 0;
    b->i2c_bus[0].sda = 46 + 18;
    b->i2c_bus[0].scl = 46 + 17;

    b->i2c_bus[1].bus_id = 1;
    b->i2c_bus[1].sda = 46 + 20;
    b->i2c_bus[1].scl = 46 + 19;

    if (emmc_enabled == 1)
        b->spi_bus_count = 1;
    else
        b->spi_bus_count = 2;
    b->def_spi_bus = 0;
    b->spi_bus[0].bus_id = 1;
    b->spi_bus[0].slave_s = 0;
    b->spi_bus[0].cs = 46 + 17;
    b->spi_bus[0].mosi = 46 + 18;
    b->spi_bus[0].miso = 46 + 21;
    b->spi_bus[0].sclk = 46 + 22;

    b->spi_bus[1].bus_id = 2;
    b->spi_bus[1].slave_s = 0;
    b->spi_bus[1].cs = 46 + 28;
    b->spi_bus[1].mosi = 46 + 29;
    b->spi_bus[1].miso = 46 + 30;
    b->spi_bus[1].sclk = 46 + 31;

    b->uart_dev_count = 5;
    b->def_uart_dev = 0;
    b->uart_dev[0].rx = 46 + 26;
    b->uart_dev[0].tx = 46 + 24;
    b->uart_dev[1].rx = 46 + 22;
    b->uart_dev[1].tx = 46 + 21;
    // TODO
    b->uart_dev[2].rx = 0;
    b->uart_dev[2].tx = 42;

    b->uart_dev[3].rx = 46 + 11;
    b->uart_dev[3].tx = 46 + 13;
    b->uart_dev[4].rx = 38;
    b->uart_dev[4].tx = 37;

    b->gpio_count = 0;
    int i;
    for (i = 0; i < b->phy_pin_count; i++)
        if (b->pins[i].capabilites.gpio)
            b->gpio_count++;

    return b;
error:
    syslog(LOG_CRIT, "Beaglebone: failed to initialize");
    free(b);
    return NULL;
};
Example #13
0
mraa_pwm_context
mraa_beaglebone_pwm_init_replace(int pin)
{
    char devpath[MAX_SIZE];
    char overlay[MAX_SIZE];
    char* capepath = NULL;
    if (plat == NULL) {
        syslog(LOG_ERR, "pwm: Platform Not Initialised");
        return NULL;
    }
    if (plat->pins[pin].capabilites.pwm != 1) {
        syslog(LOG_ERR, "pwm: pin not capable of pwm");
        return NULL;
    }
    if (!mraa_file_exist(SYSFS_CLASS_PWM "pwmchip0")) {
        FILE* fh;
        capepath = mraa_file_unglob(SYSFS_DEVICES_CAPEMGR_SLOTS);
        if (capepath == NULL) {
            syslog(LOG_ERR, "pwm: Could not find CapeManager");
            return NULL;
        }
        fh = fopen(capepath, "w");
        if (fh == NULL) {
            free(capepath);
            syslog(LOG_ERR, "pwm: Failed to open %s for writing, check access rights for user", capepath);
            return NULL;
        }
        if (fprintf(fh, SYSFS_PWM_OVERLAY) < 0) {
            syslog(LOG_ERR,
                   "pwm: Failed to write to CapeManager, check that /lib/firmware/%s exists", SYSFS_PWM_OVERLAY);
        }
        fclose(fh);
    }

    sprintf(devpath, SYSFS_CLASS_PWM "pwm%u", plat->pins[pin].pwm.pinmap);
    if (!mraa_file_exist(devpath)) {
        FILE* fh;
        fh = fopen(SYSFS_CLASS_PWM "export", "w");
        if (fh == NULL) {
            syslog(LOG_ERR, "pwm: Failed to open /sys/class/pwm/export for writing, check access "
                            "rights for user");
            return NULL;
        }
        if (fprintf(fh, "%d", plat->pins[pin].pwm.pinmap) < 0) {
            syslog(LOG_ERR, "pwm: Failed to write to CapeManager");
        }
        fclose(fh);
    }

    if (mraa_file_exist(devpath)) {
        mraa_pwm_context dev = (mraa_pwm_context) malloc(sizeof(struct _pwm));
        if (dev == NULL)
            return NULL;
        dev->duty_fp = -1;
        dev->chipid = -1;
        dev->pin = plat->pins[pin].pwm.pinmap;
        dev->period = -1;
        return dev;
    } else
        syslog(LOG_ERR, "pwm: pin not initialized, check that /lib/firmware/%s exists", SYSFS_PWM_OVERLAY);
    return NULL;
}
Example #14
0
mraa_board_t*
mraa_gt_tuchuck_board()
{
    mraa_board_t* b = (mraa_board_t*) calloc(1, sizeof(mraa_board_t));
    if (b == NULL) {
        return NULL;
    }

    b->platform_name = PLATFORM_NAME;
    b->phy_pin_count = MRAA_INTEL_GT_TUCHUCK_PINCOUNT;
    b->aio_count = 0;
    b->adc_raw = 0;
    b->adc_supported = 0;

    b->pins = (mraa_pininfo_t*) calloc(MRAA_INTEL_GT_TUCHUCK_PINCOUNT, sizeof(mraa_pininfo_t));
    if (b->pins == NULL) {
        goto error;
    }

    b->adv_func = (mraa_adv_func_t*) calloc(1, sizeof(mraa_adv_func_t));
    if (b->adv_func == NULL) {
        free(b->pins);
        goto error;
    }

    b->pwm_default_period = 5000;
    b->pwm_max_period = 218453;
    b->pwm_min_period = 1;

    b->i2c_bus_count = 0;

    int i2c_bus_num = -1;
    i2c_bus_num = mraa_find_i2c_bus_pci("0000:00", "0000:00:16.0", "i2c_designware.0");
    if (i2c_bus_num != -1) {
        b->i2c_bus[0].bus_id = i2c_bus_num;
        b->i2c_bus[0].sda = 11;
        b->i2c_bus[0].scl = 13;
        b->i2c_bus_count++;
    }

    i2c_bus_num = mraa_find_i2c_bus_pci("0000:00", "0000:00:17.1", "i2c_designware.5");
    if (i2c_bus_num != -1) {
        b->i2c_bus[b->i2c_bus_count].bus_id = i2c_bus_num;
        b->i2c_bus[b->i2c_bus_count].sda = 15;
        b->i2c_bus[b->i2c_bus_count].scl = 17;
        b->i2c_bus_count++;
    }

    i2c_bus_num = mraa_find_i2c_bus_pci("0000:00", "0000:00:17.2", "i2c_designware.6");
    if (i2c_bus_num != -1) {
        b->i2c_bus[b->i2c_bus_count].bus_id = i2c_bus_num;
        b->i2c_bus[b->i2c_bus_count].sda = 19;
        b->i2c_bus[b->i2c_bus_count].scl = 21;
        b->i2c_bus_count++;
    }

    i2c_bus_num = mraa_find_i2c_bus_pci("0000:00", "0000:00:16.1", "i2c_designware.1");
    if (i2c_bus_num != -1) {
        b->i2c_bus[b->i2c_bus_count].bus_id = i2c_bus_num;
        b->i2c_bus[b->i2c_bus_count].sda = 71;
        b->i2c_bus[b->i2c_bus_count].scl = 73;
        b->i2c_bus_count++;
    }

    i2c_bus_num = mraa_find_i2c_bus_pci("0000:00", "0000:00:16.2", "i2c_designware.2");
    if (i2c_bus_num != -1) {
        b->i2c_bus[b->i2c_bus_count].bus_id = i2c_bus_num;
        b->i2c_bus[b->i2c_bus_count].sda = 75;
        b->i2c_bus[b->i2c_bus_count].scl = 77;
        b->i2c_bus_count++;
    }

    /**
     * Old i2c detection method, very poor, avoid, but keep as fallback if
     * above failed We check for /dev/i2c-0 because we can assume i2c-dev is
     * not loaded if we haven't enumerated a single i2c-dev node
     */
    if (b->i2c_bus_count == 0) {
        if (mraa_file_exist("/dev/i2c-0")) {
            syslog(LOG_WARNING, "joule: Failed to detect i2c buses, making wild assumptions!");
            b->i2c_bus_count = 3;
            b->i2c_bus[0].bus_id = 0;
            b->i2c_bus[0].sda = 11;
            b->i2c_bus[0].scl = 13;

            if (mraa_find_i2c_bus("designware", 5) != 5) {
                b->i2c_bus[1].bus_id = 9;
                b->i2c_bus[2].bus_id = 10;
            } else {
                b->i2c_bus[1].bus_id = 5;
                b->i2c_bus[2].bus_id = 6;
            }
            b->i2c_bus[1].sda = 15;
            b->i2c_bus[1].scl = 17;
            b->i2c_bus[2].sda = 19;
            b->i2c_bus[2].scl = 21;
        } else {
            syslog(LOG_WARNING, "joule: Failed to detect any i2c buses, is i2c-dev loaded?");
        }
    }

    b->def_i2c_bus = b->i2c_bus[0].bus_id;

    b->spi_bus_count = 3;
    b->def_spi_bus = 0;
    b->spi_bus[0].bus_id = 32765;
    b->spi_bus[0].slave_s = 0;
    b->spi_bus[1].bus_id = 32766;
    b->spi_bus[1].slave_s = 0;
    b->spi_bus[2].bus_id = 32766;
    b->spi_bus[2].slave_s = 1;

    int pos = 0;

    strncpy(b->pins[pos].name, "INVALID", 8);
    b->pins[pos].capabilities = (mraa_pincapabilities_t){ 0, 0, 0, 0, 0, 0, 0, 0 };
    pos++;

    strncpy(b->pins[pos].name, "GPIO", 8);
    b->pins[pos].capabilities = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 0 };
    b->pins[pos].gpio.pinmap = 446;
    b->pins[pos].gpio.mux_total = 0;
    pos++;

    strncpy(b->pins[pos].name, "SPP1RX", 8);
    b->pins[pos].capabilities = (mraa_pincapabilities_t){ 1, 1, 0, 0, 1, 0, 0, 0 };
    b->pins[pos].gpio.pinmap = 421;
    b->pins[pos].gpio.mux_total = 0;
    pos++;

    strncpy(b->pins[pos].name, "PMICRST", 8);
    // disabled as this pin causes a reset
    b->pins[pos].capabilities = (mraa_pincapabilities_t){ 1, 0, 0, 0, 0, 0, 0, 0 };
    b->pins[pos].gpio.pinmap = 366;
    b->pins[pos].gpio.mux_total = 0;
    pos++;

    strncpy(b->pins[pos].name, "SPP1TX", 8);
    b->pins[pos].capabilities = (mraa_pincapabilities_t){ 1, 1, 0, 0, 1, 0, 0, 0 };
    b->pins[pos].gpio.pinmap = 422;
    b->pins[pos].gpio.mux_total = 0;
    pos++;

    strncpy(b->pins[pos].name, "19.2mhz", 8);
    b->pins[pos].capabilities = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 0 };
    b->pins[pos].gpio.pinmap = 356;
    b->pins[pos].gpio.mux_total = 0;
    pos++;

    strncpy(b->pins[pos].name, "SPP1FS0", 8);
    b->pins[pos].capabilities = (mraa_pincapabilities_t){ 1, 1, 0, 0, 1, 0, 0, 0 };
    b->pins[pos].gpio.pinmap = 417;
    b->pins[pos].gpio.mux_total = 0;
    pos++;

    strncpy(b->pins[pos].name, "UART0TX", 8);
    b->pins[pos].capabilities = (mraa_pincapabilities_t){ 1, 0, 0, 0, 0, 0, 0, 1 };
    // not configured as GPIO
    //b->pins[pos].gpio.pinmap = 462;
    //b->pins[pos].gpio.mux_total = 0;
    b->pins[pos].uart.pinmap = 0;
    b->pins[pos].uart.parent_id = 0;
    b->pins[pos].uart.mux_total = 0;
    pos++;

    strncpy(b->pins[pos].name, "SPP1FS2", 8);
    b->pins[pos].capabilities = (mraa_pincapabilities_t){ 1, 1, 0, 0, 1, 0, 0, 0 };
    b->pins[pos].gpio.pinmap = 419;
    b->pins[pos].gpio.mux_total = 0;
    pos++;

    strncpy(b->pins[pos].name, "PWRGD", 8);
    b->pins[pos].capabilities = (mraa_pincapabilities_t){ 1, 0, 0, 0, 0, 0, 0, 0 };
    // not configured as GPI0 - does read work?
    //b->pins[pos].gpio.pinmap = 365;
    //b->pins[pos].gpio.mux_total = 0;
    pos++;

    strncpy(b->pins[pos].name, "SPP1CLK", 8);
    b->pins[pos].capabilities = (mraa_pincapabilities_t){ 1, 1, 0, 0, 1, 0, 0, 0 };
    b->pins[pos].gpio.pinmap = 416;
    b->pins[pos].gpio.mux_total = 0;
    pos++;

    // pin 11
    strncpy(b->pins[pos].name, "I2C0SDA", 8);
    b->pins[pos].capabilities = (mraa_pincapabilities_t){ 1, 0, 0, 0, 0, 1, 0, 0 };
    b->pins[pos].gpio.pinmap = 315;
    b->pins[pos].gpio.mux_total = 0;
    b->pins[pos].i2c.mux_total = 0;
    b->pins[pos].i2c.pinmap = 0;
    pos++;

    strncpy(b->pins[pos].name, "I2S1SDI", 8);
    b->pins[pos].capabilities = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 0 };
    b->pins[pos].gpio.pinmap = 381;
    b->pins[pos].gpio.mux_total = 0;
    pos++;

    strncpy(b->pins[pos].name, "I2C0SCL", 8);
    b->pins[pos].capabilities = (mraa_pincapabilities_t){ 1, 0, 0, 0, 0, 1, 0, 0 };
    b->pins[pos].gpio.pinmap = 316;
    b->pins[pos].gpio.mux_total = 0;
    b->pins[pos].i2c.mux_total = 0;
    b->pins[pos].i2c.pinmap = 0;
    pos++;

    strncpy(b->pins[pos].name, "I2S1SDO", 8);
    b->pins[pos].capabilities = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 0 };
    b->pins[pos].gpio.pinmap = 382;
    b->pins[pos].gpio.mux_total = 0;
    pos++;

    strncpy(b->pins[pos].name, "I2C1SDA", 8);
    b->pins[pos].capabilities = (mraa_pincapabilities_t){ 1, 0, 0, 0, 0, 1, 0, 0 };
    b->pins[pos].gpio.pinmap = 331;
    b->pins[pos].gpio.mux_total = 0;
    b->pins[pos].i2c.mux_total = 0;
    b->pins[pos].i2c.pinmap = 0;
    pos++;

    strncpy(b->pins[pos].name, "I2S1WS", 8);
    b->pins[pos].capabilities = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 0 };
    b->pins[pos].gpio.pinmap = 380;
    b->pins[pos].gpio.mux_total = 0;
    pos++;

    strncpy(b->pins[pos].name, "I2C1SCL", 8);
    b->pins[pos].capabilities = (mraa_pincapabilities_t){ 1, 0, 0, 0, 0, 1, 0, 0 };
    b->pins[pos].gpio.pinmap = 332;
    b->pins[pos].gpio.mux_total = 0;
    b->pins[pos].i2c.pinmap = 0;
    b->pins[pos].i2c.mux_total = 0;
    pos++;

    strncpy(b->pins[pos].name, "I2S1CLK", 8);
    b->pins[pos].capabilities = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 0 };
    b->pins[pos].gpio.pinmap = 379;
    b->pins[pos].gpio.mux_total = 0;
    pos++;

    strncpy(b->pins[pos].name, "I2C2SDA", 8);
    b->pins[pos].capabilities = (mraa_pincapabilities_t){ 1, 0, 0, 0, 0, 1, 0, 0 };
    b->pins[pos].gpio.pinmap = 333;
    b->pins[pos].gpio.mux_total = 0;
    b->pins[pos].i2c.pinmap = 0;
    b->pins[pos].i2c.mux_total = 0;
    pos++;

    strncpy(b->pins[pos].name, "I2S1MCL", 8);
    b->pins[pos].capabilities = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 0 };
    b->pins[pos].gpio.pinmap = 378;
    b->pins[pos].gpio.mux_total = 0;
    pos++;

    strncpy(b->pins[pos].name, "I2C2SCL", 8);
    b->pins[pos].capabilities = (mraa_pincapabilities_t){ 1, 0, 0, 0, 0, 1, 0, 0 };
    b->pins[pos].gpio.pinmap = 334;
    b->pins[pos].gpio.mux_total = 0;
    b->pins[pos].i2c.mux_total = 0;
    b->pins[pos].i2c.pinmap = 0;
    pos++;

    strncpy(b->pins[pos].name, "UART1TX", 8);
    b->pins[pos].capabilities = (mraa_pincapabilities_t){ 1, 0, 0, 0, 0, 0, 0, 1 };
    //b->pins[pos].gpio.pinmap = 472;
    //b->pins[pos].gpio.mux_total = 0;
    b->pins[pos].uart.pinmap = 0;
    b->pins[pos].uart.parent_id = 0;
    b->pins[pos].uart.mux_total = 0;
    pos++;

    strncpy(b->pins[pos].name, "I2S4SDO", 8);
    b->pins[pos].capabilities = (mraa_pincapabilities_t){ 1, 0, 0, 0, 0, 0, 0, 0 };
    // doesn't work so disable
    //b->pins[pos].gpio.pinmap = 396;
    //b->pins[pos].gpio.mux_total = 0;
    pos++;

    strncpy(b->pins[pos].name, "UART1RX", 8);
    b->pins[pos].capabilities = (mraa_pincapabilities_t){ 1, 0, 0, 0, 0, 0, 0, 1 };
    //b->pins[pos].gpio.pinmap = 471;
    //b->pins[pos].gpio.mux_total = 0;
    b->pins[pos].uart.pinmap = 0;
    b->pins[pos].uart.parent_id = 0;
    b->pins[pos].uart.mux_total = 0;
    pos++;

    strncpy(b->pins[pos].name, "I2S4SDI", 8);
    b->pins[pos].capabilities = (mraa_pincapabilities_t){ 1, 0, 0, 0, 0, 0, 0, 0 };
    // doesnt work
    //b->pins[pos].gpio.pinmap = 395;
    //b->pins[pos].gpio.mux_total = 0;
    pos++;

    strncpy(b->pins[pos].name, "PWM0", 8);
    b->pins[pos].capabilities = (mraa_pincapabilities_t){ 1, 1, 1, 0, 0, 0, 0, 0 };
    b->pins[pos].gpio.pinmap = 463;
    b->pins[pos].gpio.mux_total = 0;
    b->pins[pos].pwm.pinmap = 0;
    b->pins[pos].pwm.parent_id = 0;
    b->pins[pos].pwm.mux_total = 0;
    pos++;

    strncpy(b->pins[pos].name, "I2S4BLK", 8);
    b->pins[pos].capabilities = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 0 };
    // this pin has a voltage of 0.34V in 'low' mode - beware!
    b->pins[pos].gpio.pinmap = 397;
    b->pins[pos].gpio.mux_total = 0;
    pos++;

    strncpy(b->pins[pos].name, "PWM1", 8);
    b->pins[pos].capabilities = (mraa_pincapabilities_t){ 1, 1, 1, 0, 0, 0, 0, 0 };
    b->pins[pos].gpio.pinmap = 464;
    b->pins[pos].gpio.mux_total = 0;
    b->pins[pos].pwm.pinmap = 1;
    b->pins[pos].pwm.parent_id = 0;
    b->pins[pos].pwm.mux_total = 0;
    pos++;

    strncpy(b->pins[pos].name, "I2S4WS", 8);
    b->pins[pos].capabilities = (mraa_pincapabilities_t){ 1, 0, 0, 0, 0, 0, 0, 0 };
    // not working
    //b->pins[pos].gpio.pinmap = 398;
    //b->pins[pos].gpio.mux_total = 0;
    pos++;

    strncpy(b->pins[pos].name, "PWM2", 8);
    b->pins[pos].capabilities = (mraa_pincapabilities_t){ 1, 1, 1, 0, 0, 0, 0, 0 };
    b->pins[pos].gpio.pinmap = 465;
    b->pins[pos].gpio.mux_total = 0;
    b->pins[pos].pwm.pinmap = 2;
    b->pins[pos].pwm.parent_id = 0;
    b->pins[pos].pwm.mux_total = 0;
    pos++;

    strncpy(b->pins[pos].name, "I2S3SDO", 8);
    b->pins[pos].capabilities = (mraa_pincapabilities_t){ 1, 0, 0, 0, 0, 0, 0, 0 };
    //b->pins[pos].gpio.pinmap = 400;
    //b->pins[pos].gpio.mux_total = 0;
    pos++;

    strncpy(b->pins[pos].name, "PWM3", 8);
    b->pins[pos].capabilities = (mraa_pincapabilities_t){ 1, 1, 1, 0, 0, 0, 0, 0 };
    b->pins[pos].gpio.pinmap = 466;
    b->pins[pos].gpio.mux_total = 0;
    b->pins[pos].pwm.pinmap = 3;
    b->pins[pos].pwm.parent_id = 0;
    b->pins[pos].pwm.mux_total = 0;
    pos++;

    strncpy(b->pins[pos].name, "I2S3SDI", 8);
    b->pins[pos].capabilities = (mraa_pincapabilities_t){ 1, 0, 0, 0, 0, 0, 0, 0 };
    //b->pins[pos].gpio.pinmap = 399;
    //b->pins[pos].gpio.mux_total = 0;
    pos++;

    strncpy(b->pins[pos].name, "1.8V", 8);
    b->pins[pos].capabilities = (mraa_pincapabilities_t){ 1, 0, 0, 0, 0, 0, 0, 0 };
    pos++;

    strncpy(b->pins[pos].name, "I2S4BLK", 8);
    b->pins[pos].capabilities = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 0 };
    b->pins[pos].gpio.pinmap = 393;
    b->pins[pos].gpio.mux_total = 0;
    pos++;

    strncpy(b->pins[pos].name, "GND", 8);
    b->pins[pos].capabilities = (mraa_pincapabilities_t){ 1, 0, 0, 0, 0, 0, 0, 0 };
    pos++;

    strncpy(b->pins[pos].name, "GND", 8);
    b->pins[pos].capabilities = (mraa_pincapabilities_t){ 1, 0, 0, 0, 0, 0, 0, 0 };
    pos++;

    strncpy(b->pins[pos].name, "GND", 8);
    b->pins[pos].capabilities = (mraa_pincapabilities_t){ 1, 0, 0, 0, 0, 0, 0, 0 };
    pos++;

    strncpy(b->pins[pos].name, "GND", 8);
    b->pins[pos].capabilities = (mraa_pincapabilities_t){ 1, 0, 0, 0, 0, 0, 0, 0 };
    pos++;

    strncpy(b->pins[pos].name, "3.3V", 8);
    b->pins[pos].capabilities = (mraa_pincapabilities_t){ 1, 0, 0, 0, 0, 0, 0, 0 };
    pos++;

    // second header
    strncpy(b->pins[pos].name, "GND", 8);
    b->pins[pos].capabilities = (mraa_pincapabilities_t){ 1, 0, 0, 0, 0, 0, 0, 0 };
    pos++;

    strncpy(b->pins[pos].name, "5V", 8);
    b->pins[pos].capabilities = (mraa_pincapabilities_t){ 1, 0, 0, 0, 0, 0, 0, 0 };
    pos++;

    strncpy(b->pins[pos].name, "GND", 8);
    b->pins[pos].capabilities = (mraa_pincapabilities_t){ 1, 0, 0, 0, 0, 0, 0, 0 };
    pos++;

    strncpy(b->pins[pos].name, "5V", 8);
    b->pins[pos].capabilities = (mraa_pincapabilities_t){ 1, 0, 0, 0, 0, 0, 0, 0 };
    pos++;

    strncpy(b->pins[pos].name, "GND", 8);
    b->pins[pos].capabilities = (mraa_pincapabilities_t){ 1, 0, 0, 0, 0, 0, 0, 0 };
    pos++;

    strncpy(b->pins[pos].name, "3.3V", 8);
    b->pins[pos].capabilities = (mraa_pincapabilities_t){ 1, 0, 0, 0, 0, 0, 0, 0 };
    pos++;

    strncpy(b->pins[pos].name, "GND", 8);
    b->pins[pos].capabilities = (mraa_pincapabilities_t){ 1, 0, 0, 0, 0, 0, 0, 0 };
    pos++;

    strncpy(b->pins[pos].name, "3.3V", 8);
    b->pins[pos].capabilities = (mraa_pincapabilities_t){ 1, 0, 0, 0, 0, 0, 0, 0 };
    pos++;

    strncpy(b->pins[pos].name, "GND", 8);
    b->pins[pos].capabilities = (mraa_pincapabilities_t){ 1, 0, 0, 0, 0, 0, 0, 0 };
    pos++;

    strncpy(b->pins[pos].name, "1.8V", 8);
    b->pins[pos].capabilities = (mraa_pincapabilities_t){ 1, 0, 0, 0, 0, 0, 0, 0 };
    pos++;

    strncpy(b->pins[pos].name, "GPIO", 8);
    b->pins[pos].capabilities = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 0 };
    b->pins[pos].gpio.pinmap = 456;
    b->pins[pos].gpio.mux_total = 0;
    pos++;

    strncpy(b->pins[pos].name, "1.8V", 8);
    b->pins[pos].capabilities = (mraa_pincapabilities_t){ 1, 0, 0, 0, 0, 0, 0, 0 };
    pos++;

    strncpy(b->pins[pos].name, "PANEL", 8);
    b->pins[pos].capabilities = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 0 };
    b->pins[pos].gpio.pinmap = 270;
    b->pins[pos].gpio.mux_total = 0;
    pos++;

    strncpy(b->pins[pos].name, "GND", 8);
    b->pins[pos].capabilities = (mraa_pincapabilities_t){ 1, 0, 0, 0, 0, 0, 0, 0 };
    pos++;

    strncpy(b->pins[pos].name, "PANEL", 8);
    b->pins[pos].capabilities = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 0 };
    b->pins[pos].gpio.pinmap = 271;
    b->pins[pos].gpio.mux_total = 0;
    pos++;

    strncpy(b->pins[pos].name, "CAMERA", 8);
    b->pins[pos].capabilities = (mraa_pincapabilities_t){ 1, 0, 0, 0, 0, 0, 0, 0 };
    pos++;

    strncpy(b->pins[pos].name, "PANEL", 8);
    b->pins[pos].capabilities = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 0 };
    b->pins[pos].gpio.pinmap = 272;
    b->pins[pos].gpio.mux_total = 0;
    pos++;

    strncpy(b->pins[pos].name, "CAMERA", 8);
    b->pins[pos].capabilities = (mraa_pincapabilities_t){ 1, 0, 0, 0, 0, 0, 0, 0 };
    pos++;

    strncpy(b->pins[pos].name, "SPP0FS0", 8);
    b->pins[pos].capabilities = (mraa_pincapabilities_t){ 1, 1, 0, 0, 1, 0, 0, 0 };
    b->pins[pos].gpio.pinmap = 411;
    b->pins[pos].gpio.mux_total = 0;
    pos++;

    strncpy(b->pins[pos].name, "CAMERA", 8);
    b->pins[pos].capabilities = (mraa_pincapabilities_t){ 1, 0, 0, 0, 0, 0, 0, 0 };
    pos++;

    strncpy(b->pins[pos].name, "SPP0FS1", 8);
    b->pins[pos].capabilities = (mraa_pincapabilities_t){ 1, 1, 0, 0, 1, 0, 0, 0 };
    b->pins[pos].gpio.pinmap = 412;
    b->pins[pos].gpio.mux_total = 0;
    pos++;

    strncpy(b->pins[pos].name, "SPI_DAT", 8);
    b->pins[pos].capabilities = (mraa_pincapabilities_t){ 1, 0, 0, 0, 0, 0, 0, 0 };
    b->pins[pos].gpio.pinmap = 385;
    b->pins[pos].gpio.mux_total = 0;
    pos++;

    strncpy(b->pins[pos].name, "SPP0FS2", 8);
    b->pins[pos].capabilities = (mraa_pincapabilities_t){ 1, 1, 0, 0, 1, 0, 0, 0 };
    b->pins[pos].gpio.pinmap = 411;
    b->pins[pos].gpio.mux_total = 0;
    pos++;

    strncpy(b->pins[pos].name, "SPICLKB", 8);
    b->pins[pos].capabilities = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 0 };
    b->pins[pos].gpio.pinmap = 384;
    b->pins[pos].gpio.mux_total = 0;
    pos++;

    strncpy(b->pins[pos].name, "SPP0FS3", 8);
    b->pins[pos].capabilities = (mraa_pincapabilities_t){ 1, 1, 0, 0, 1, 0, 0, 0 };
    b->pins[pos].gpio.pinmap = 410;
    b->pins[pos].gpio.mux_total = 0;
    pos++;

    strncpy(b->pins[pos].name, "SPICLKA", 8);
    b->pins[pos].capabilities = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 0 };
    b->pins[pos].gpio.pinmap = 383;
    b->pins[pos].gpio.mux_total = 0;
    pos++;

    strncpy(b->pins[pos].name, "SPP0TX", 8);
    b->pins[pos].capabilities = (mraa_pincapabilities_t){ 1, 1, 0, 0, 1, 0, 0, 0 };
    b->pins[pos].gpio.pinmap = 414;
    b->pins[pos].gpio.mux_total = 0;
    pos++;

    strncpy(b->pins[pos].name, "UART0RX", 8);
    b->pins[pos].capabilities = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 1 };
    b->pins[pos].gpio.pinmap = 467;
    b->pins[pos].gpio.mux_total = 0;
    b->pins[pos].uart.pinmap = 0;
    b->pins[pos].uart.parent_id = 0;
    b->pins[pos].uart.mux_total = 0;
    pos++;

    strncpy(b->pins[pos].name, "SPP0RX", 8);
    b->pins[pos].capabilities = (mraa_pincapabilities_t){ 1, 1, 0, 0, 1, 0, 0, 0 };
    b->pins[pos].gpio.pinmap = 415;
    b->pins[pos].gpio.mux_total = 0;
    pos++;

    strncpy(b->pins[pos].name, "UART0RT", 8);
    b->pins[pos].capabilities = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 1 };
    b->pins[pos].gpio.pinmap = 469;
    b->pins[pos].gpio.mux_total = 0;
    b->pins[pos].uart.pinmap = 0;
    b->pins[pos].uart.parent_id = 0;
    b->pins[pos].uart.mux_total = 0;
    pos++;

    strncpy(b->pins[pos].name, "I2C1SDA", 8);
    b->pins[pos].capabilities = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 1, 0, 0 };
    b->pins[pos].gpio.pinmap = 317;
    b->pins[pos].gpio.mux_total = 0;
    b->pins[pos].i2c.pinmap = 0;
    b->pins[pos].i2c.mux_total = 0;
    pos++;

    strncpy(b->pins[pos].name, "UART0CT", 8);
    b->pins[pos].capabilities = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 1 };
    b->pins[pos].gpio.pinmap = 412;
    b->pins[pos].gpio.mux_total = 0;
    b->pins[pos].uart.pinmap = 0;
    b->pins[pos].uart.parent_id = 0;
    b->pins[pos].uart.mux_total = 0;
    pos++;

    strncpy(b->pins[pos].name, "I2C1SCL", 8);
    b->pins[pos].capabilities = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 1, 0, 0 };
    b->pins[pos].gpio.pinmap = 318;
    b->pins[pos].gpio.mux_total = 0;
    b->pins[pos].i2c.pinmap = 0;
    b->pins[pos].i2c.mux_total = 0;
    pos++;

    strncpy(b->pins[pos].name, "UART1TX", 8);
    b->pins[pos].capabilities = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 1 };
    b->pins[pos].gpio.pinmap = 484;
    b->pins[pos].gpio.mux_total = 0;
    b->pins[pos].uart.pinmap = 0;
    b->pins[pos].uart.parent_id = 0;
    b->pins[pos].uart.mux_total = 0;
    pos++;

    strncpy(b->pins[pos].name, "I2C2SDA", 8);
    b->pins[pos].capabilities = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 1, 0, 0 };
    b->pins[pos].gpio.pinmap = 319;
    b->pins[pos].gpio.mux_total = 0;
    b->pins[pos].i2c.pinmap = 0;
    b->pins[pos].i2c.mux_total = 0;
    pos++;

    strncpy(b->pins[pos].name, "UART1RX", 8);
    b->pins[pos].capabilities = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 1 };
    b->pins[pos].gpio.pinmap = 483;
    b->pins[pos].gpio.mux_total = 0;
    b->pins[pos].uart.pinmap = 0;
    b->pins[pos].uart.parent_id = 0;
    b->pins[pos].uart.mux_total = 0;
    pos++;

    strncpy(b->pins[pos].name, "I2C1SCL", 8);
    b->pins[pos].capabilities = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 1, 0, 0 };
    b->pins[pos].gpio.pinmap = 320;
    b->pins[pos].gpio.mux_total = 0;
    b->pins[pos].i2c.pinmap = 0;
    b->pins[pos].i2c.mux_total = 0;
    pos++;

    strncpy(b->pins[pos].name, "UART1RT", 8);
    b->pins[pos].capabilities = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 1 };
    b->pins[pos].gpio.pinmap = 485;
    b->pins[pos].gpio.mux_total = 0;
    b->pins[pos].uart.pinmap = 0;
    b->pins[pos].uart.parent_id = 0;
    b->pins[pos].uart.mux_total = 0;
    pos++;

    strncpy(b->pins[pos].name, "RTC_CLK", 8);
    b->pins[pos].capabilities = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 0 };
    b->pins[pos].gpio.pinmap = 367;
    b->pins[pos].gpio.mux_total = 0;
    pos++;

    strncpy(b->pins[pos].name, "UART1CT", 8);
    b->pins[pos].capabilities = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 1 };
    b->pins[pos].gpio.pinmap = 486;
    b->pins[pos].uart.pinmap = 0;
    b->pins[pos].uart.parent_id = 0;
    b->pins[pos].uart.mux_total = 0;
    pos++;

    while (pos != 100) {
        b->pins[pos].capabilities = (mraa_pincapabilities_t){ 0, 0, 0, 0, 0, 0, 0, 0 };
        pos++;
    }

    strncpy(b->pins[pos].name, "LED100", 8);
    b->pins[pos].capabilities = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 0 };
    b->pins[pos].gpio.pinmap = 337;
    b->pins[pos].gpio.mux_total = 0;
    pos++;

    strncpy(b->pins[pos].name, "LED101", 8);
    b->pins[pos].capabilities = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 0 };
    b->pins[pos].gpio.pinmap = 338;
    b->pins[pos].gpio.mux_total = 0;
    pos++;

    strncpy(b->pins[pos].name, "LED102", 8);
    b->pins[pos].capabilities = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 0 };
    b->pins[pos].gpio.pinmap = 339;
    b->pins[pos].gpio.mux_total = 0;
    pos++;

    strncpy(b->pins[pos].name, "LED103", 8);
    b->pins[pos].capabilities = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 0 };
    b->pins[pos].gpio.pinmap = 340;
    b->pins[pos].gpio.mux_total = 0;
    pos++;

    strncpy(b->pins[pos].name, "LEDWIFI", 8);
    b->pins[pos].capabilities = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 0 };
    b->pins[pos].gpio.pinmap = 438;
    b->pins[pos].gpio.mux_total = 0;
    pos++;

    strncpy(b->pins[pos].name, "LEDBT", 8);
    b->pins[pos].capabilities = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 0 };
    b->pins[pos].gpio.pinmap = 439;
    b->pins[pos].gpio.mux_total = 0;
    pos++;

    return b;

error:
    syslog(LOG_CRIT, "GT Tuchuck: Platform failed to initialise");
    free(b);
    return NULL;
}