int main()

in common/recipes-utils/ftdicmd/files/cmd-control.c [225:352]


int main(int argc, char *argv[])
{

    /* random seed */
    srand(time(NULL));

    /* parse command line options */
    if (common_options(argc, argv, opts, longopts, 0, 0)) {
        fprintf(stderr, "invalid command line option(s)\n");
        p_exit(EXIT_FAILURE);
    }

    /* init ftdi things */
    ftdi = common_ftdi_init();
    if (!ftdi) {
        p_exit(EXIT_FAILURE);
    }

    if (ee_initialize) {
        /* initialize eeprom to defaults */
        if (ftdi_eeprom_initdefaults(ftdi, NULL, NULL, NULL)) {
            fprintf(stderr, "failed to init defaults to eeprom: %s\n", ftdi_get_error_string(ftdi));
            p_exit(EXIT_FAILURE);
        }
    } else if (ee_rd) {
        /* read eeprom */
        if (ftdi_read_eeprom(ftdi)) {
            fprintf(stderr, "failed to read eeprom: %s\n", ftdi_get_error_string(ftdi));
            p_exit(EXIT_FAILURE);
        }
        if (ftdi_eeprom_decode(ftdi, 0)) {
            fprintf(stderr, "failed to decode eeprom after read: %s\n", ftdi_get_error_string(ftdi));
            p_exit(EXIT_FAILURE);
        }
    }

    /* erase eeprom */
    if (ee_erase) {
        if (ftdi_erase_eeprom(ftdi)) {
            fprintf(stderr, "failed to erase eeprom: %s\n", ftdi_get_error_string(ftdi));
            p_exit(EXIT_FAILURE);
        }
    }

    /* set strings to eeprom */
    if (set_manufacturer || set_description || set_serial) {
        struct libusb_device_descriptor desc;
        libusb_get_device_descriptor(libusb_get_device(ftdi->usb_dev), &desc);
        if (!set_manufacturer) {
            set_manufacturer = calloc(1, 128);
            libusb_get_string_descriptor_ascii(ftdi->usb_dev, desc.iManufacturer, (unsigned char*)set_manufacturer, 127);
        }
        if (!set_description) {
            set_description = calloc(1, 128);
            libusb_get_string_descriptor_ascii(ftdi->usb_dev, desc.iProduct, (unsigned char*)set_description, 127);
        }
        if (!set_serial) {
            set_serial = calloc(1, 128);
            libusb_get_string_descriptor_ascii(ftdi->usb_dev, desc.iSerialNumber, (unsigned char*)set_serial, 127);
        }
        if (strlen(set_serial) < set_serial_len) {
            int i;
            set_serial = realloc(set_serial, set_serial_len + 1);
            for (i = strlen(set_serial); i < set_serial_len; i++) {
                char c;
                char max = set_serial_mode == 2 ? 0 : (set_serial_mode == 1 ? 'F' : 'Z');
                /* generate random padding */
                do {
                    c = rand() & 0x7f;
                } while ((c < '0' || c > '9') && (c < 'A' || c > max));
                set_serial[i] = c;
            }
            set_serial[set_serial_len] = '\0';
        }
        ftdi_eeprom_set_strings(ftdi, set_manufacturer, set_description, set_serial);
    }

    /* bus power */
    if (set_bus_power > 100) {
        ftdi_set_eeprom_value(ftdi, MAX_POWER, set_bus_power);
    }

    /* set RS485 Enable/Disable*/
    if (set_A_rs485 == 0 || set_A_rs485 == 1){
        ftdi_set_eeprom_value(ftdi, CHANNEL_A_RS485, set_A_rs485);
    }
    if (set_B_rs485 == 0 || set_B_rs485 == 1){
        ftdi_set_eeprom_value(ftdi, CHANNEL_B_RS485, set_B_rs485);
    }
    if (set_C_rs485 == 0 || set_C_rs485 == 1){
        ftdi_set_eeprom_value(ftdi, CHANNEL_C_RS485, set_C_rs485);
    }
    if (set_D_rs485 == 0 || set_D_rs485 == 1){
        ftdi_set_eeprom_value(ftdi, CHANNEL_D_RS485, set_D_rs485);
    }

    /* write eeprom data */
    if (ee_wr) {
        if (ftdi_eeprom_build(ftdi) < 0) {
            fprintf(stderr, "failed to build eeprom: %s\n", ftdi_get_error_string(ftdi));
            p_exit(EXIT_FAILURE);
        }
        if (ftdi_write_eeprom(ftdi)) {
            fprintf(stderr, "failed to write eeprom: %s\n", ftdi_get_error_string(ftdi));
            p_exit(EXIT_FAILURE);
        }
    }

    /* decode eeprom */
    if (ee_decode) {
        if (ftdi_eeprom_decode(ftdi, 1)) {
            fprintf(stderr, "failed to decode eeprom: %s\n", ftdi_get_error_string(ftdi));
            p_exit(EXIT_FAILURE);
        }
        /* display RS485 mode */
        ftdi_get_eeprom_value(ftdi, CHANNEL_A_RS485, &value);
        printf("CHANNEL_A_RS485   %d\n", value ? 1 : 0);
        ftdi_get_eeprom_value(ftdi, CHANNEL_B_RS485, &value);
        printf("CHANNEL_B_RS485   %d\n", value ? 1 : 0);
        ftdi_get_eeprom_value(ftdi, CHANNEL_C_RS485, &value);
        printf("CHANNEL_C_RS485   %d\n", value ? 1 : 0);
        ftdi_get_eeprom_value(ftdi, CHANNEL_D_RS485, &value);
        printf("CHANNEL_D_RS485   %d\n", value ? 1 : 0);
    }

    p_exit(EXIT_SUCCESS);
    return EXIT_SUCCESS;
}