bool FalconCommLibFTDI::setFirmwareMode() { unsigned int bytes_written, bytes_read; unsigned char check_msg_1_send[3] = {0x0a, 0x43, 0x0d}; unsigned char check_msg_1_recv[4] = {0x0a, 0x44, 0x2c, 0x0d}; unsigned char check_msg_2[1] = {0x41}; unsigned char send_buf[128], receive_buf[128]; int k; if(!m_isCommOpen) { m_errorCode = FALCON_COMM_DEVICE_NOT_VALID_ERROR; return false; } //Save ourselves having to reset this on every error m_errorCode = FALCON_COMM_DEVICE_ERROR; //Clear out current buffers to make sure we have a fresh start if((m_deviceErrorCode = ftdi_usb_purge_buffers((m_falconDevice))) < 0) return false; //Reset the device if((m_deviceErrorCode = ftdi_usb_reset((m_falconDevice))) < 0) return false; //Make sure our latency timer is at 16ms, otherwise firmware checks tend to always fail if((m_deviceErrorCode = ftdi_set_latency_timer((m_falconDevice), 16)) < 0) return false; //Set to: // 9600 baud // 8n1 // No Flow Control // RTS Low // DTR High if((m_deviceErrorCode = ftdi_set_baudrate((m_falconDevice), 9600)) < 0) return false; if((m_deviceErrorCode = ftdi_set_line_property((m_falconDevice), BITS_8, STOP_BIT_1, NONE)) < 0) return false; if((m_deviceErrorCode = ftdi_setflowctrl((m_falconDevice), SIO_DISABLE_FLOW_CTRL)) < 0) return false; if((m_deviceErrorCode = ftdi_setrts((m_falconDevice), 0)) < 0) return false; if((m_deviceErrorCode = ftdi_setdtr((m_falconDevice), 0)) < 0) return false; if((m_deviceErrorCode = ftdi_setdtr((m_falconDevice), 1)) < 0) return false; //Send 3 bytes: 0x0a 0x43 0x0d if(!write(check_msg_1_send, 3)) return false; if(!read(receive_buf, 4)) return false; //Set to: // DTR Low // 140000 baud (0x15 clock ticks per signal) if((m_deviceErrorCode = ftdi_setdtr((m_falconDevice),0)) < 0) return false; if((m_deviceErrorCode = ftdi_set_baudrate((m_falconDevice), 140000)) < 0) return false; //Send "A" character if(!write(check_msg_2, 1)) return false; //Expect back 2 bytes: // 0x13 0x41 if(!read(receive_buf, 2)) return false; m_errorCode = 0; return true; }
ReturnCode reader_reset(struct reader *reader) { if(ftdi_setdtr(reader->ftdic, 1) < 0) return RC_IO_ERROR; usleep(20000); if(ftdi_setdtr(reader->ftdic, 0) < 0) return RC_IO_ERROR; usleep(110000); return RC_SUCCESS; }
static dc_status_t serial_ftdi_set_dtr (void *io, unsigned int value) { ftdi_serial_t *device = io; if (device == NULL) return DC_STATUS_INVALIDARGS; INFO (device->context, "DTR: value=%u", value); if (ftdi_setdtr(device->ftdi_ctx, value)) { ERROR (device->context, "%s", ftdi_get_error_string(device->ftdi_ctx)); return DC_STATUS_IO; } return DC_STATUS_SUCCESS; }
static dc_status_t serial_ftdi_set_dtr (void **userdata, int level) { ftdi_serial_t *device = (ftdi_serial_t*) *userdata; if (device == NULL) return DC_STATUS_INVALIDARGS; INFO (device->context, "DTR: value=%i", level); if (ftdi_setdtr(device->ftdi_ctx, level)) { ERROR (device->context, "%s", ftdi_get_error_string(device->ftdi_ctx)); return DC_STATUS_IO; } return DC_STATUS_SUCCESS; }
int nifalcon_load_firmware(falcon_device* dev, const char* firmware_filename) { unsigned int bytes_written, bytes_read; unsigned char check_msg_1_send[3] = {0x0a, 0x43, 0x0d}; unsigned char check_msg_1_recv[4] = {0x0a, 0x44, 0x2c, 0x0d}; unsigned char check_msg_2[1] = {0x41}; unsigned char send_buf[128], receive_buf[128]; FILE* firmware_file; int k; if(!dev->is_initialized) nifalcon_error_return(NIFALCON_DEVICE_NOT_VALID_ERROR, "tried to load firmware on an uninitialized device"); if(!dev->is_open) nifalcon_error_return(NIFALCON_DEVICE_NOT_FOUND_ERROR, "tried to load firmware on an unopened device"); //Clear out current buffers to make sure we have a fresh start if((dev->falcon_status_code = ftdi_usb_purge_buffers(&(dev->falcon))) < 0) return dev->falcon_status_code; //Reset the device if((dev->falcon_status_code = ftdi_usb_reset(&(dev->falcon))) < 0) return dev->falcon_status_code; //Make sure our latency timer is at 16ms, otherwise firmware checks tend to always fail if((dev->falcon_status_code = ftdi_set_latency_timer(&(dev->falcon), 16)) < 0) return dev->falcon_status_code; //Set to: // 9600 baud // 8n1 // No Flow Control // RTS Low // DTR High if((dev->falcon_status_code = ftdi_set_baudrate(&(dev->falcon), 9600)) < 0) return dev->falcon_status_code; if((dev->falcon_status_code = ftdi_set_line_property(&(dev->falcon), BITS_8, STOP_BIT_1, NONE)) < 0) return dev->falcon_status_code; if((dev->falcon_status_code = ftdi_setflowctrl(&(dev->falcon), SIO_DISABLE_FLOW_CTRL)) < 0) return dev->falcon_status_code; if((dev->falcon_status_code = ftdi_setrts(&(dev->falcon), 0)) < 0) return dev->falcon_status_code; if((dev->falcon_status_code = ftdi_setdtr(&(dev->falcon), 0)) < 0) return dev->falcon_status_code; if((dev->falcon_status_code = ftdi_setdtr(&(dev->falcon), 1)) < 0) return dev->falcon_status_code; //Send 3 bytes: 0x0a 0x43 0x0d if((dev->falcon_status_code = nifalcon_write(dev, check_msg_1_send, 3)) < 0) return dev->falcon_status_code; if((dev->falcon_status_code = nifalcon_read(dev, receive_buf, 4, 1000)) < 0) return dev->falcon_status_code; //Set to: // DTR Low // 140000 baud (0x15 clock ticks per signal) if((dev->falcon_status_code = ftdi_setdtr(&(dev->falcon),0)) < 0) return dev->falcon_status_code; if((dev->falcon_status_code = ftdi_set_baudrate(&(dev->falcon), 140000)) < 0) return dev->falcon_status_code; //Send "A" character if((dev->falcon_status_code = nifalcon_write(dev, check_msg_2, 1)) < 0) return dev->falcon_status_code; //Expect back 2 bytes: // 0x13 0x41 if((dev->falcon_status_code = nifalcon_read(dev, receive_buf, 2, 1000)) < 0) return dev->falcon_status_code; firmware_file = fopen(firmware_filename, "rb"); if(!firmware_file) { nifalcon_error_return(NIFALCON_FIRMWARE_NOT_FOUND_ERROR, "cannot find falcon firmware file"); } while(!feof(firmware_file)) { int firmware_bytes_read; int i; firmware_bytes_read = fread(send_buf, 1, 128, firmware_file); if((dev->falcon_status_code = nifalcon_write(dev, send_buf, firmware_bytes_read)) < 0) return dev->falcon_status_code; if((dev->falcon_status_code = nifalcon_read(dev, receive_buf, firmware_bytes_read, 1000)) < firmware_bytes_read) { nifalcon_error_return(NIFALCON_FIRMWARE_CHECKSUM_ERROR, "error sending firmware (firmware send step, 128 byte reply not received)"); } for(i = 0; i < firmware_bytes_read; ++i) { if(send_buf[i] != receive_buf[i]) { nifalcon_error_return(NIFALCON_FIRMWARE_CHECKSUM_ERROR, "error sending firmware (firmware send step, checksum does not match)"); } } if(firmware_bytes_read < 128) break; } fclose(firmware_file); //VERY IMPORTANT //If we do not reset latency to 1ms, then we either have to fill the FTDI butter (64bytes) or wait 16ms //to get any data back. This is what was causing massive slowness in pre-1.0 releases if((dev->falcon_status_code = ftdi_set_latency_timer(&(dev->falcon), 1)) < 0) return dev->falcon_status_code; //Shift to full speed if((dev->falcon_status_code = ftdi_set_baudrate(&(dev->falcon), 1456312)) < 0) return dev->falcon_status_code; return 0; }
int Context::set_dtr(bool state) { return ftdi_setdtr(d->ftdi, state); }