Esempio n. 1
0
mraa_board_t*
mraa_ftdi_ft4222()
{
    mraa_board_t* sub_plat = (mraa_board_t*) calloc(1, sizeof(mraa_board_t));
    if (sub_plat == NULL)
        return NULL;
    mraa_boolean_t haveGpio = mraa_ftdi_ft4222_detect_io_expander();
    int pinIndex = 0;
    numUsbGpio = haveGpio ? numI2cGpioExapnderPins : 0;
    int numUsbPins = numUsbGpio + 2; // Add SDA and SCL
    sub_plat->platform_name = PLATFORM_NAME;
    sub_plat->phy_pin_count = numUsbPins;
    sub_plat->gpio_count = numUsbGpio;
    mraa_pininfo_t* pins = (mraa_pininfo_t*) malloc(sizeof(mraa_pininfo_t) * numUsbPins);
    if (pins == NULL) {
        return NULL;
    }
    sub_plat->pins = pins;

    // Virtual gpio pins on i2c I/O expander.
    mraa_pincapabilities_t pinCapsGpio = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 0 };
    for (pinIndex = 0; pinIndex < numUsbGpio; ++pinIndex) {
        char name[8];
        sprintf(name, "Pin%d", pinIndex);
        strncpy(sub_plat->pins[pinIndex].name, name, 8);
        sub_plat->pins[pinIndex].capabilites = pinCapsGpio;
        sub_plat->pins[pinIndex].gpio.mux_total = 0;
    }

    int bus = 0;
    sub_plat->i2c_bus_count = 1;
    sub_plat->def_i2c_bus = bus;
    sub_plat->i2c_bus[bus].bus_id = bus;

    // i2c pins (these are virtual, entries are required to configure i2c layer)
    mraa_pincapabilities_t pinCapsI2c = (mraa_pincapabilities_t){ 1, 0, 0, 0, 0, 1, 0, 0 };
    strncpy(sub_plat->pins[pinIndex].name, "SDA", 8);
    sub_plat->pins[pinIndex].capabilites = pinCapsI2c;
    sub_plat->pins[pinIndex].i2c.mux_total = 0;
    sub_plat->i2c_bus[bus].sda = pinIndex;
    pinIndex++;
    strncpy(sub_plat->pins[pinIndex].name, "SCL", 8);
    sub_plat->pins[pinIndex].capabilites = pinCapsI2c;
    sub_plat->pins[pinIndex].i2c.mux_total = 0;
    sub_plat->i2c_bus[bus].scl = pinIndex;

    // Set override functions
    mraa_adv_func_t* func_table = (mraa_adv_func_t*) calloc(1, sizeof(mraa_adv_func_t));
    if (func_table == NULL) {
        return NULL;
    }
    mraa_ftdi_ft4222_populate_i2c_func_table(func_table);
    if (haveGpio)
        mraa_ftdi_ft4222_populate_gpio_func_table(func_table);

    sub_plat->adv_func = func_table;
    return sub_plat;
}
Esempio n. 2
0
mraa_board_t*
mraa_ftdi_ft4222()
{
    mraa_board_t* sub_plat = (mraa_board_t*) calloc(1, sizeof(mraa_board_t));
    if (sub_plat == NULL)
        return NULL;
    numI2cGpioExpanderPins = mraa_ftdi_ft4222_detect_io_expander();
    int pinIndex = 0;
    int numUsbGpio = numFt4222GpioPins + numI2cGpioExpanderPins;
    int numI2cBusses = 1 + mraa_ftdi_ft4222_detect_i2c_switch();
    int numUsbPins = numUsbGpio + 2 * (numI2cBusses-1); // Add SDA and SCL for each i2c switch bus
    mraa_pincapabilities_t pinCapsI2c = (mraa_pincapabilities_t) {
        1, 0, 0, 0, 0, 1, 0, 0
    };
    mraa_pincapabilities_t pinCapsI2cGpio = (mraa_pincapabilities_t) {
        1, 1, 0, 0, 0, 1, 0, 0
    };
    mraa_pincapabilities_t pinCapsGpio = (mraa_pincapabilities_t) {
        1, 1, 0, 0, 0, 0, 0, 0
    };

    sub_plat->platform_name = PLATFORM_NAME;
    sub_plat->phy_pin_count = numUsbPins;
    sub_plat->gpio_count = numUsbGpio;
    mraa_pininfo_t* pins = (mraa_pininfo_t*) malloc(sizeof(mraa_pininfo_t) * numUsbPins);
    if (pins == NULL) {
        return NULL;
    }
    sub_plat->pins = pins;

    int bus = 0;
    sub_plat->i2c_bus_count = numI2cBusses;
    sub_plat->def_i2c_bus = bus;
    sub_plat->i2c_bus[bus].bus_id = bus;

    // I2c pins (these are virtual, entries are required to configure i2c layer)
    // We currently assume that GPIO 0/1 are reserved for i2c operation
    strncpy(sub_plat->pins[pinIndex].name, "IGPIO0/SCL0", MRAA_PIN_NAME_SIZE);
    sub_plat->pins[pinIndex].capabilites = pinCapsI2cGpio;
    sub_plat->pins[pinIndex].gpio.pinmap = pinIndex;
    sub_plat->pins[pinIndex].gpio.mux_total = 0;
    sub_plat->pins[pinIndex].i2c.mux_total = 0;
    sub_plat->i2c_bus[bus].scl = pinIndex;
    pinIndex++;
    strncpy(sub_plat->pins[pinIndex].name, "IGPIO1/SDA0", MRAA_PIN_NAME_SIZE);
    sub_plat->pins[pinIndex].capabilites = pinCapsI2cGpio;
    sub_plat->pins[pinIndex].gpio.pinmap = pinIndex;
    sub_plat->pins[pinIndex].gpio.mux_total = 0;
    sub_plat->pins[pinIndex].i2c.mux_total = 0;
    sub_plat->i2c_bus[bus].sda = pinIndex;
    pinIndex++;

    // FTDI4222 gpio
    strncpy(sub_plat->pins[pinIndex].name, "INT-GPIO2", MRAA_PIN_NAME_SIZE);
    sub_plat->pins[pinIndex].capabilites = pinCapsGpio;
    sub_plat->pins[pinIndex].gpio.pinmap = pinIndex;
    sub_plat->pins[pinIndex].gpio.mux_total = 0;
    pinIndex++;
    strncpy(sub_plat->pins[pinIndex].name, "INT-GPIO3", MRAA_PIN_NAME_SIZE);
    sub_plat->pins[pinIndex].capabilites = pinCapsGpio;
    sub_plat->pins[pinIndex].gpio.pinmap = pinIndex;
    sub_plat->pins[pinIndex].gpio.mux_total = 0;
    pinIndex++;

    // Virtual gpio pins on i2c I/O expander.
    int i;
    for (i = 0; i < numI2cGpioExpanderPins; ++i) {
        snprintf(sub_plat->pins[pinIndex].name, MRAA_PIN_NAME_SIZE, "EXP-GPIO%d", i);
        sub_plat->pins[pinIndex].capabilites = pinCapsGpio;
        sub_plat->pins[pinIndex].gpio.pinmap = pinIndex;
        sub_plat->pins[pinIndex].gpio.mux_total = 0;
        pinIndex++;
    }

    // Now add any extra i2c busses behind i2c switch
    for (bus = 1; bus < numI2cBusses; ++bus) {
        sub_plat->i2c_bus[bus].bus_id = bus;
        sub_plat->pins[pinIndex].i2c.mux_total = 0;
        snprintf(sub_plat->pins[pinIndex].name, MRAA_PIN_NAME_SIZE, "SDA%d", bus);
        sub_plat->pins[pinIndex].capabilites = pinCapsI2c;
        sub_plat->i2c_bus[bus].sda = pinIndex;
        pinIndex++;
        snprintf(sub_plat->pins[pinIndex].name, MRAA_PIN_NAME_SIZE, "SCL%d", bus);
        sub_plat->pins[pinIndex].capabilites = pinCapsI2c;
        sub_plat->pins[pinIndex].i2c.mux_total = 0;
        sub_plat->i2c_bus[bus].scl = pinIndex;
        pinIndex++;
    }


    // Set override functions
    mraa_adv_func_t* func_table = (mraa_adv_func_t*) calloc(1, sizeof(mraa_adv_func_t));
    if (func_table == NULL) {
        return NULL;
    }
    mraa_ftdi_ft4222_populate_i2c_func_table(func_table);
    mraa_ftdi_ft4222_populate_gpio_func_table(func_table);

    sub_plat->adv_func = func_table;
    return sub_plat;
}