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