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