From c5bd30c0909335b44074c75b4719a62a92c5fde3 Mon Sep 17 00:00:00 2001 From: Ed Gonzalez Date: Mon, 24 Oct 2016 13:59:21 -0500 Subject: [PATCH] Switch to FTD2XX library for serial communication to ThumbDV --- DSP_API/.cproject | 26 +- DSP_API/SmartSDR_Interface/discovery_client.c | 3 + DSP_API/SmartSDR_Interface/hal_listener.c | 2 + DSP_API/SmartSDR_Interface/sched_waveform.c | 16 +- DSP_API/SmartSDR_Interface/sched_waveform.h | 3 +- DSP_API/SmartSDR_Interface/smartsdr_dsp_api.c | 2 + DSP_API/SmartSDR_Interface/traffic_cop.c | 5 + DSP_API/ThumbDV/thumbDV.c | 380 +++-- DSP_API/ThumbDV/thumbDV.h | 12 +- DSP_API/include/WinTypes.h | 136 ++ DSP_API/include/ftd2xx.h | 1427 +++++++++++++++++ DSP_API/lib/libftd2xx.a | Bin 0 -> 334362 bytes 12 files changed, 1792 insertions(+), 220 deletions(-) create mode 100644 DSP_API/include/WinTypes.h create mode 100644 DSP_API/include/ftd2xx.h create mode 100644 DSP_API/lib/libftd2xx.a diff --git a/DSP_API/.cproject b/DSP_API/.cproject index 91dc741..0e2ef20 100644 --- a/DSP_API/.cproject +++ b/DSP_API/.cproject @@ -14,7 +14,7 @@ - + @@ -25,11 +25,12 @@ @@ -91,7 +96,7 @@ - + @@ -106,11 +111,12 @@ - + @@ -126,15 +132,18 @@ - + - + diff --git a/DSP_API/SmartSDR_Interface/discovery_client.c b/DSP_API/SmartSDR_Interface/discovery_client.c index cb59590..d6d4461 100644 --- a/DSP_API/SmartSDR_Interface/discovery_client.c +++ b/DSP_API/SmartSDR_Interface/discovery_client.c @@ -38,6 +38,8 @@ #include // for errno #include +#include + #include "common.h" #include "discovery_client.h" #include "cmd.h" // for tokenize @@ -253,6 +255,7 @@ static BOOL _dc_ListenerRecv(uint8* buffer, int32* len, struct sockaddr_in* send static void* _dc_ListenerLoop(void* param) { //printf("_dc_ListenerLoop\n"); + prctl(PR_SET_NAME, "DV-ListenerLoop"); struct sockaddr_in sender; uint8 buf[ETH_FRAME_LEN]; diff --git a/DSP_API/SmartSDR_Interface/hal_listener.c b/DSP_API/SmartSDR_Interface/hal_listener.c index 736a175..7704c63 100644 --- a/DSP_API/SmartSDR_Interface/hal_listener.c +++ b/DSP_API/SmartSDR_Interface/hal_listener.c @@ -41,6 +41,7 @@ #include // for errno #include // for usleep #include +#include // #define LOG_MODULE LOG_MODULE_HAL_LISTENER @@ -430,6 +431,7 @@ static void* _hal_ListenerLoop(void* param) struct sockaddr_in sender; uint8 buf[ETH_FRAME_LEN]; + prctl(PR_SET_NAME, "DV-halListener"); while(!hal_listen_abort) { diff --git a/DSP_API/SmartSDR_Interface/sched_waveform.c b/DSP_API/SmartSDR_Interface/sched_waveform.c index 273d644..d8e8ee0 100644 --- a/DSP_API/SmartSDR_Interface/sched_waveform.c +++ b/DSP_API/SmartSDR_Interface/sched_waveform.c @@ -40,6 +40,7 @@ #include #include #include +#include #include "common.h" #include "datatypes.h" @@ -51,6 +52,7 @@ #include "dstar.h" #include "DStarDefines.h" #include "slow_data.h" +#include "ftd2xx.h" //static Queue sched_fft_queue; static pthread_rwlock_t _list_lock; @@ -185,7 +187,7 @@ Circular_Short_Buffer TX3_cb = &tx3_cb; circular_float_buffer tx4_cb; Circular_Float_Buffer TX4_cb = &tx4_cb; -static int _dv_serial_fd = 0; +static FT_HANDLE _dv_serial_handle = 0; static GMSK_DEMOD _gmsk_demod = NULL; static GMSK_MOD _gmsk_mod = NULL; @@ -353,8 +355,8 @@ void sched_waveform_setMessage( uint32 slice, const char * message) output( "TX Message: '%s' : strlen() = %d \n", _dstar->slow_encoder->message , strlen(_dstar->slow_encoder->message)); } -void sched_waveform_setFD( int fd ) { - _dv_serial_fd = fd; +void sched_waveform_setHandle( FT_HANDLE * handle ) { + _dv_serial_handle = *handle; } void sched_waveform_setEndOfTX( BOOL end_of_transmission ) { @@ -369,6 +371,8 @@ void sched_waveform_setDSTARSlice( uint32 slice ) } static void * _sched_waveform_thread( void * param ) { + + prctl(PR_SET_NAME, "DV-SchedWav"); int nout; int i; // for loop counter @@ -405,7 +409,7 @@ static void * _sched_waveform_thread( void * param ) { // ======================= Initialization Section ========================= - thumbDV_init( &_dv_serial_fd ); + thumbDV_init( &_dv_serial_handle ); // Initialize the Circular Buffers @@ -516,7 +520,7 @@ static void * _sched_waveform_thread( void * param ) { if ( ambe_packet_out == TRUE ) { nout = 0; - nout = thumbDV_decode( _dv_serial_fd, ambe_out, speech_out, DV_PACKET_SAMPLES ); + nout = thumbDV_decode( _dv_serial_handle, ambe_out, speech_out, DV_PACKET_SAMPLES ); uint32 j = 0; for ( j = 0 ; j < nout ; j++ ) @@ -632,7 +636,7 @@ static void * _sched_waveform_thread( void * param ) { } /* DECODE */ - decode_out = thumbDV_encode( _dv_serial_fd, speech_in, mod_out, DV_PACKET_SAMPLES ); + decode_out = thumbDV_encode( _dv_serial_handle, speech_in, mod_out, DV_PACKET_SAMPLES ); } if ( initial_tx ) { diff --git a/DSP_API/SmartSDR_Interface/sched_waveform.h b/DSP_API/SmartSDR_Interface/sched_waveform.h index 250f8ed..7d57c1f 100644 --- a/DSP_API/SmartSDR_Interface/sched_waveform.h +++ b/DSP_API/SmartSDR_Interface/sched_waveform.h @@ -35,6 +35,7 @@ #define SCHED_WAVEFORM_H_ #include "hal_buffer.h" +#include "ftd2xx.h" void sched_waveform_Schedule(BufferDescriptor buf); void sched_waveform_Init(void); @@ -49,7 +50,7 @@ void sched_waveform_setOwnCall2(uint32 slice , const char * owncall2 ); void sched_waveform_setMessage( uint32 slice, const char * message); void sched_waveform_sendStatus(uint32 slice); -void sched_waveform_setFD(int fd); +void sched_waveform_setHandle( FT_HANDLE * handle ); void sched_waveform_setEndOfTX(BOOL end_of_transmission); void sched_waveform_setDSTARSlice( uint32 slice ); #endif /* SCHED_WAVEFORM_H_ */ diff --git a/DSP_API/SmartSDR_Interface/smartsdr_dsp_api.c b/DSP_API/SmartSDR_Interface/smartsdr_dsp_api.c index 1b2b356..7f0f11e 100644 --- a/DSP_API/SmartSDR_Interface/smartsdr_dsp_api.c +++ b/DSP_API/SmartSDR_Interface/smartsdr_dsp_api.c @@ -38,6 +38,7 @@ #include #include +#include #include // File Control functions #include "common.h" @@ -92,6 +93,7 @@ void SmartSDR_API_Shutdown(void) void* _console_thread(void* param) { + prctl(PR_SET_NAME, "DV-Console"); cmd_banner(); output(PROMPT); // let everybody know we're through printing diff --git a/DSP_API/SmartSDR_Interface/traffic_cop.c b/DSP_API/SmartSDR_Interface/traffic_cop.c index d654547..2581238 100644 --- a/DSP_API/SmartSDR_Interface/traffic_cop.c +++ b/DSP_API/SmartSDR_Interface/traffic_cop.c @@ -45,6 +45,7 @@ #include #include #include +#include #include "common.h" #include "traffic_cop.h" @@ -343,6 +344,8 @@ static void* _tc_thread(void* arg) { uint32 result; + prctl(PR_SET_NAME, "DV-TrafficCop"); + memset(&__local, 0, sizeof(receive_data)); __local.last_ping.tv_sec = 0; __local.recv_buf = safe_malloc(RECV_BUF_SIZE); @@ -575,6 +578,8 @@ static void* _keepalive_thread(void* param) { char* response; + prctl(PR_SET_NAME, "DV-KeepAlive"); + /* Sleep 2 seconds */ usleep(2000000); diff --git a/DSP_API/ThumbDV/thumbDV.c b/DSP_API/ThumbDV/thumbDV.c index 173ea18..db16e0c 100644 --- a/DSP_API/ThumbDV/thumbDV.c +++ b/DSP_API/ThumbDV/thumbDV.c @@ -41,11 +41,13 @@ #include #include #include +#include #include #include #include #include +#include #include @@ -56,10 +58,7 @@ #include "vita_output.h" #include "thumbDV.h" #include "sched_waveform.h" - - -#define DV3000_TTY "/dev/ttyAMA0" -#define DV3000_VERSION "2014-04-23" +#include "ftd2xx.h" #define AMBE3000_HEADER_LEN 4U #define AMBE3000_START_BYTE 0x61U @@ -278,104 +277,82 @@ void thumbDV_dump( char * text, unsigned char * data, unsigned int length ) { } } -static void thumbDV_writeSerial( int serial_fd, const unsigned char * buffer, uint32 bytes ) { - fd_set fds; +static void thumbDV_writeSerial( FT_HANDLE handle , unsigned char * buffer, uint32 bytes ) +{ + FT_STATUS status = FT_OK; + DWORD written = 0; - FD_ZERO( &fds ); - FD_SET( serial_fd, &fds ); + if ( handle != NULL ) + { + status = FT_Write(handle, buffer, bytes, &written); - int32 n = 0; - errno = 0; - struct timeval timeout; - timeout.tv_sec = 1; - timeout.tv_usec = 0; - select( serial_fd + 1, NULL, &fds, NULL, &timeout ); - - if ( FD_ISSET( serial_fd, &fds ) ) { - n = write( serial_fd , buffer, bytes ); - - if ( n != bytes ) { + if ( status != FT_OK || written != bytes ) { output( ANSI_RED "Could not write to serial port. errno = %d\n", errno ); return; } - } else { + } + else + { output( ANSI_RED "Could not write to serial port. Timeout\n" ANSI_WHITE ); } } -static int _check_serial( int fd ) { +static int _check_serial( FT_HANDLE handle ) +{ + unsigned char reset[5] = { 0x61, 0x00, 0x01, 0x00, 0x33 }; - thumbDV_writeSerial( fd, reset, 5 ); + thumbDV_writeSerial( handle, reset, 5 ); - fd_set fds; - struct timeval timeout; + int ret = thumbDV_processSerial(handle); - FD_ZERO( &fds ); - FD_SET( fd, &fds ); - errno = 0; - timeout.tv_sec = 2; - timeout.tv_usec = 0; - select( fd + 1, &fds, NULL, NULL, &timeout ); - - if ( FD_ISSET( fd, &fds ) ) { - int ret = thumbDV_processSerial( fd ); - - if ( ret != 0 ) { - output( "Could not reset serial port FD = %d \n", fd ); - return -1; - } - } else { - output( "Could not reset serial port FD = %d \n", fd ); + if ( ret != 0 ) + { + output( "Could not reset serial port FD = %d \n", handle ); return -1; } unsigned char get_prodID[5] = {0x61, 0x00, 0x01, 0x00, 0x30 }; - thumbDV_writeSerial( fd, get_prodID, 5 ); + thumbDV_writeSerial( handle, get_prodID, 5 ); - FD_ZERO( &fds ); - FD_SET( fd, &fds ); - errno = 0; - timeout.tv_sec = 2; - timeout.tv_usec = 0; - select( fd + 1, &fds, NULL, NULL, &timeout ); + ret = thumbDV_processSerial(handle); - if ( FD_ISSET( fd, &fds ) ) { - int ret = thumbDV_processSerial( fd ); - - if ( ret != 0 ) { - output( "Could not get prodID serial port FD = %d \n", fd ); - return -1; - } - } else { - output( "Could not prodID serial port FD = %d \n", fd ); + if ( ret != 0 ) + { + output( "Could not reset serial port FD = %d \n", handle ); return -1; } + return 0 ; } -int thumbDV_openSerial( const char * tty_name ) { - struct termios tty; - int fd; +FT_HANDLE thumbDV_openSerial( FT_DEVICE_LIST_INFO_NODE device ) +{ + //struct termios tty; + FT_HANDLE handle = NULL; + FT_STATUS status = FT_OK; - /* TODO: Sanitize tty_name */ + output("Trying to open serial port %s", device.SerialNumber); - fd = open( tty_name, O_RDWR | O_NOCTTY | O_SYNC ); + status = FT_OpenEx(device.SerialNumber, FT_OPEN_BY_SERIAL_NUMBER, &handle); - if ( fd < 0 ) { - output( "ThumbDV: error when opening %s, errno=%d\n", tty_name, errno ); - return fd; + if ( status != FT_OK || handle == NULL ) + { + if ( device.SerialNumber ) + output("Error opening device %s - error 0x%X\n", device.SerialNumber, status); + else + output("Error opening device - error 0x%X\n", status); + + return NULL; } - if ( tcgetattr( fd, &tty ) != 0 ) { - output( "ThumbDV: error %d from tcgetattr\n", errno ); - return -1; - } + FT_SetBaudRate(handle, FT_BAUD_460800); - cfsetospeed( &tty, B460800 ); - cfsetispeed( &tty, B460800 ); + // Set read and write timeout to 2seconds */ + FT_SetTimeouts(handle, 2000, 2000); +/* tty.c_cflag = ( tty.c_cflag & ~CSIZE ) | CS8; tty.c_iflag &= ~IGNBRK; tty.c_lflag = 0; @@ -397,72 +374,55 @@ int thumbDV_openSerial( const char * tty_name ) { close( fd ); return -1; } - - if ( _check_serial( fd ) != 0 ) { +*/ + if ( _check_serial(handle) != 0 ) { output( "Could not detect ThumbDV at 460800 Baud. Trying 230400\n" ); - close( fd ); + FT_Close(handle); + handle = (FT_HANDLE)NULL; } else { - return fd; + return handle; } - fd = open( tty_name, O_RDWR | O_NOCTTY | O_SYNC ); + status = FT_OpenEx(device.SerialNumber, FT_OPEN_BY_SERIAL_NUMBER, &handle); - if ( fd < 0 ) { - output( "ThumbDV: error when opening %s, errno=%d\n", tty_name, errno ); - return fd; + if ( status != FT_OK || handle == NULL ) + { + if ( device.SerialNumber ) + output("Error opening device %s - error 0x%X\n", device.SerialNumber, status); + else + output("Error opening device - error 0x%X\n", status); + + return NULL; } - if ( tcgetattr( fd, &tty ) != 0 ) { - output( "ThumbDV: error %d from tcgetattr\n", errno ); - return -1; - } + FT_SetBaudRate(handle, FT_BAUD_230400 ); - cfsetospeed( &tty, B230400 ); - cfsetispeed( &tty, B230400 ); + FT_SetTimeouts(handle, 2000, 2000); - tty.c_cflag = ( tty.c_cflag & ~CSIZE ) | CS8; - tty.c_iflag &= ~IGNBRK; - tty.c_lflag = 0; - - tty.c_oflag = 0; - tty.c_cc[VMIN] = 1; - tty.c_cc[VTIME] = 5; - - tty.c_iflag &= ~( IXON | IXOFF | IXANY ); - - tty.c_cflag |= ( CLOCAL | CREAD ); - - tty.c_cflag &= ~( PARENB | PARODD ); - tty.c_cflag &= ~CSTOPB; - tty.c_cflag &= ~CRTSCTS; - - if ( tcsetattr( fd, TCSANOW, &tty ) != 0 ) { - output( "ThumbDV: error %d from tcsetattr\n", errno ); - close( fd ); - return -1; - } - - if ( _check_serial( fd ) != 0 ) { + if ( _check_serial( handle ) != 0 ) { output( "Could not detect THumbDV at 230400 Baud\n" ); - close( fd ); - return -1; + FT_Close(handle); + handle = NULL; + return NULL; } - return fd; + return handle; } -int thumbDV_processSerial( int serial_fd ) { +int thumbDV_processSerial( FT_HANDLE handle ) +{ unsigned char buffer[BUFFER_LENGTH]; unsigned int respLen; - unsigned int offset; - ssize_t len; + unsigned char packet_type; + FT_STATUS status = FT_OK; + DWORD rx_bytes = 0; - errno = 0; - len = read( serial_fd, buffer, 1 ); + status = FT_Read(handle, buffer, AMBE3000_HEADER_LEN, &rx_bytes); - if ( len != 1 ) { - output( ANSI_RED "ThumbDV: Process serial. error when reading from the serial port, len = %d, errno=%d\n" ANSI_WHITE, len, errno ); + if ( status != FT_OK || rx_bytes != AMBE3000_HEADER_LEN) + { + output( ANSI_RED "ThumbDV: Process serial. error when reading from the serial port, len = %d, status=%d\n" ANSI_WHITE, rx_bytes, status ); return 1; } @@ -471,28 +431,36 @@ int thumbDV_processSerial( int serial_fd ) { return 1; } - offset = 0U; - - while ( offset < ( AMBE3000_HEADER_LEN - 1U ) ) { - len = read( serial_fd, buffer + 1U + offset, AMBE3000_HEADER_LEN - 1 - offset ); - - if ( len == 0 ) - delay( 5UL ); - - offset += len; - } +// offset = 0U; +// +// while ( offset < ( AMBE3000_HEADER_LEN - 1U ) ) +// { +// len = read( serial_fd, buffer + 1U + offset, AMBE3000_HEADER_LEN - 1 - offset ); +// +// if ( len == 0 ) +// delay( 5UL ); +// +// offset += len; +// } respLen = buffer[1U] * 256U + buffer[2U]; - offset = 0U; +// offset = 0U; +// +// while ( offset < respLen ) { +// len = read( serial_fd, buffer + AMBE3000_HEADER_LEN + offset, respLen - offset ); +// +// if ( len == 0 ) +// delay( 5UL ); +// +// offset += len; +// } - while ( offset < respLen ) { - len = read( serial_fd, buffer + AMBE3000_HEADER_LEN + offset, respLen - offset ); + status = FT_Read(handle, buffer + AMBE3000_HEADER_LEN, respLen, &rx_bytes); - if ( len == 0 ) - delay( 5UL ); - - offset += len; + if ( status != FT_OK || rx_bytes != respLen ) + { + output( ANSI_RED "ThumbDV: Process serial. error when reading from the serial port, len = %d, status=%d\n" ANSI_WHITE, rx_bytes, status ); } respLen += AMBE3000_HEADER_LEN; @@ -526,12 +494,12 @@ int thumbDV_processSerial( int serial_fd ) { return 0; } -int thumbDV_decode( int serial_fd, unsigned char * packet_in, short * speech_out, uint8 bytes_in_packet ) { +int thumbDV_decode( FT_HANDLE handle, unsigned char * packet_in, short * speech_out, uint8 bytes_in_packet ) { uint32 i = 0; unsigned char full_packet[15] = {0}; - if ( packet_in != NULL && serial_fd > 0 ) { + if ( packet_in != NULL && handle != NULL ) { full_packet[0] = 0x61; full_packet[1] = 0x00; full_packet[2] = 0x0B; @@ -546,7 +514,7 @@ int thumbDV_decode( int serial_fd, unsigned char * packet_in, short * speech_out // thumbDV_dump("Just AMBE", packet_in, 9); // thumbDV_dump("Encoded packet:", full_packet, 15); - thumbDV_writeSerial( serial_fd, full_packet, 15 ); + thumbDV_writeSerial( handle, full_packet, 15 ); } int32 samples_returned = 0; @@ -584,7 +552,8 @@ int thumbDV_decode( int serial_fd, unsigned char * packet_in, short * speech_out return samples_returned; } -int thumbDV_encode( int serial_fd, short * speech_in, unsigned char * packet_out, uint8 num_of_samples ) { +int thumbDV_encode( FT_HANDLE handle, short * speech_in, unsigned char * packet_out, uint8 num_of_samples ) +{ unsigned char packet[THUMBDV_MAX_PACKET_LEN]; uint16 speech_d_bytes = num_of_samples * sizeof( uint16 ); /* Should be 2 times the number of samples */ @@ -634,8 +603,8 @@ int thumbDV_encode( int serial_fd, short * speech_in, unsigned char * packet_out idx[1] = ( speech_in[i] & 0x00FF ) ; } - if ( serial_fd > 0 ) - thumbDV_writeSerial( serial_fd, packet, length + AMBE3000_HEADER_LEN ); + if ( handle != NULL ) + thumbDV_writeSerial( handle, packet, length + AMBE3000_HEADER_LEN ); int32 samples_returned = 0; BufferDescriptor desc = _thumbDVEncodedList_UnlinkHead(); @@ -655,112 +624,123 @@ int thumbDV_encode( int serial_fd, short * speech_in, unsigned char * packet_out } - -static void _connectSerial( int * serial_fd ) { +static void _connectSerial( FT_HANDLE * ftHandle ) +{ int i = 0 ; - char device[256] = {0} ; + + output("ConnectSerial\n"); + + DWORD numDevs = 0; + FT_DEVICE_LIST_INFO_NODE *devInfo = NULL; + FT_STATUS status = FT_OK; do { - for ( i = 0 ; i < 25 ; i++ ) { - sprintf( device, "/dev/ttyUSB%d", i ); - *serial_fd = thumbDV_openSerial( device ); - if ( *serial_fd > 0 ) { - /* We opened a valid port */ + status = FT_CreateDeviceInfoList(&numDevs); + + devInfo = (FT_DEVICE_LIST_INFO_NODE *) safe_malloc(sizeof(FT_DEVICE_LIST_INFO_NODE) * numDevs); + + status = FT_GetDeviceInfoList(devInfo, &numDevs); + + for ( i = 0 ; i < numDevs ; i++ ) + { + + *ftHandle = thumbDV_openSerial(devInfo[i]); + + if ( *ftHandle != NULL ) + { + /* We opened a valid port and detected the ThumbDV */ break; } } + safe_free(devInfo); - if ( * serial_fd < 0 ) { + if ( *ftHandle == NULL ) { output( "Could not open serial. Waiting 1 second before trying again.\n" ); usleep( 1000 * 1000 ); } - } while ( *serial_fd < 0 ) ; + } while ( *ftHandle == NULL ) ; unsigned char reset[5] = { 0x61, 0x00, 0x01, 0x00, 0x33 }; - thumbDV_writeSerial( *serial_fd, reset, 5 ); + thumbDV_writeSerial( *ftHandle, reset, 5 ); /* Block until we get data from serial port after reset */ - thumbDV_processSerial( *serial_fd ); + thumbDV_processSerial( *ftHandle ); // // unsigned char reset_softcfg[11] = {0x61, 0x00, 0x07, 0x00, 0x34, 0x05, 0x03, 0xEB, 0xFF, 0xFF, 0xFF}; -// thumbDV_writeSerial(*serial_fd, reset_softcfg, 11); -// thumbDV_processSerial(*serial_fd); +// thumbDV_writeSerial(*ftHandle, reset_softcfg, 11); +// thumbDV_processSerial(*ftHandle); unsigned char disable_parity[6] = {0x61, 0x00, 0x02, 0x00, 0x3F, 0x00}; - thumbDV_writeSerial( *serial_fd, disable_parity, 6 ); - thumbDV_processSerial( *serial_fd ); + thumbDV_writeSerial( *ftHandle, disable_parity, 6 ); + thumbDV_processSerial( *ftHandle ); unsigned char get_prodID[5] = {0x61, 0x00, 0x01, 0x00, 0x30 }; unsigned char get_version[5] = {0x61, 0x00, 0x01, 0x00, 0x31}; unsigned char read_cfg[5] = {0x61, 0x00, 0x01, 0x00, 0x37}; unsigned char dstar_mode[17] = {0x61, 0x00, 0x0D, 0x00, 0x0A, 0x01, 0x30, 0x07, 0x63, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48}; - thumbDV_writeSerial( *serial_fd, get_prodID, 5 ); - thumbDV_writeSerial( *serial_fd, get_version, 5 ); - thumbDV_writeSerial( *serial_fd, read_cfg, 5 ); - thumbDV_writeSerial( *serial_fd, dstar_mode, 17 ); + thumbDV_writeSerial( *ftHandle, get_prodID, 5 ); + thumbDV_writeSerial( *ftHandle, get_version, 5 ); + thumbDV_writeSerial( *ftHandle, read_cfg, 5 ); + thumbDV_writeSerial( *ftHandle, dstar_mode, 17 ); //// /* Init */ unsigned char pkt_init[6] = { 0x61, 0x00, 0x02, 0x00, 0x0B, 0x07 }; - thumbDV_writeSerial( *serial_fd, pkt_init, 6 ); + thumbDV_writeSerial( *ftHandle, pkt_init, 6 ); /* PKT GAIN - set to 0dB */ unsigned char pkt_gain[7] = { 0x61, 0x00, 0x03, 0x00, 0x4B, 0x00, 0x00 }; - thumbDV_writeSerial( *serial_fd, pkt_gain, 7 ); + thumbDV_writeSerial( *ftHandle, pkt_gain, 7 ); /* Companding off so it uses 16bit linear */ unsigned char pkt_compand[6] = { 0x61, 0x00, 0x02, 0x00, 0x32, 0x00 }; - thumbDV_writeSerial( *serial_fd, pkt_compand, 6 ); + thumbDV_writeSerial( *ftHandle, pkt_compand, 6 ); unsigned char test_coded[15] = {0x61, 0x00 , 0x0B , 0x01 , 0x01 , 0x48 , 0x5E , 0x83 , 0x12 , 0x3B , 0x98 , 0x79 , 0xDE , 0x13 , 0x90}; - thumbDV_writeSerial( *serial_fd, test_coded, 15 ); + thumbDV_writeSerial( *ftHandle, test_coded, 15 ); unsigned char pkt_fmt[7] = {0x61, 0x00, 0x3, 0x00, 0x15, 0x00, 0x00}; - thumbDV_writeSerial( *serial_fd, pkt_fmt, 7 ); + thumbDV_writeSerial( *ftHandle, pkt_fmt, 7 ); } -static void * _thumbDV_readThread( void * param ) { - int topFd; - fd_set fds; +static void * _thumbDV_readThread( void * param ) +{ int ret; + DWORD rx_bytes; + DWORD tx_bytes; + DWORD event_dword; - int serial_fd = *( int * )param; - topFd = serial_fd + 1; + FT_STATUS status = FT_OK; + FT_HANDLE handle = *( FT_HANDLE * )param; - output( "Serial FD = %d in thumbDV_readThread(). TopFD = %d\n", serial_fd, topFd ); + prctl(PR_SET_NAME, "DV-Read"); - struct timeval timeout; + while ( !_readThreadAbort ) + { + status = FT_GetStatus(handle, &rx_bytes, &tx_bytes, &event_dword); - while ( !_readThreadAbort ) { - timeout.tv_sec = 1; - timeout.tv_usec = 0; - - FD_ZERO( &fds ); - FD_SET( serial_fd, &fds ); - - errno = 0; - ret = select( topFd, &fds, NULL, NULL, &timeout ); - - if ( ret < 0 ) { - fprintf( stderr, "ThumbDV: error from select, errno=%d\n", errno ); + if ( status != FT_OK ) + { + fprintf( stderr, "ThumbDV: error from select, status=%d\n", status ); + /* Set invalid FD in sched_waveform so we don't call write functions */ + handle = NULL; + sched_waveform_setHandle(&handle); + /* This function hangs until a new connection is made */ + _connectSerial( &handle ); + /* Update the sched_waveform to new valid serial */ + sched_waveform_setHandle( &handle ); } - - if ( FD_ISSET( serial_fd, &fds ) ) { - ret = thumbDV_processSerial( serial_fd ); - - if ( ret != 0 ) { - /* Set invalid FD in sched_waveform so we don't call write functions */ - sched_waveform_setFD( -1 ); - /* This function hangs until a new connection is made */ - _connectSerial( &serial_fd ); - /* Update the sched_waveform to new valid serial */ - sched_waveform_setFD( serial_fd ); - topFd = serial_fd + 1; - } + else if ( rx_bytes > 0 ) + { + ret = thumbDV_processSerial( handle ); + } + else + { + usleep(50000); } } @@ -768,7 +748,7 @@ static void * _thumbDV_readThread( void * param ) { return 0; } -void thumbDV_init( int * serial_fd ) { +void thumbDV_init( FT_HANDLE * handle ) { pthread_rwlock_init( &_encoded_list_lock, NULL ); pthread_rwlock_init( &_decoded_list_lock, NULL ); @@ -786,9 +766,9 @@ void thumbDV_init( int * serial_fd ) { _decoded_root->prev = _decoded_root; pthread_rwlock_unlock( &_decoded_list_lock ); - _connectSerial( serial_fd ); + _connectSerial( handle ); - pthread_create( &_read_thread, NULL, &_thumbDV_readThread, serial_fd ); + pthread_create( &_read_thread, NULL, &_thumbDV_readThread, handle ); struct sched_param fifo_param; fifo_param.sched_priority = 30; diff --git a/DSP_API/ThumbDV/thumbDV.h b/DSP_API/ThumbDV/thumbDV.h index 6241e78..53b68cd 100644 --- a/DSP_API/ThumbDV/thumbDV.h +++ b/DSP_API/ThumbDV/thumbDV.h @@ -36,12 +36,14 @@ #ifndef THUMBDV_THUMBDV_H_ #define THUMBDV_THUMBDV_H_ -void thumbDV_init( int * serial_fd ); -int thumbDV_openSerial( const char * tty_name ); -int thumbDV_processSerial( int serial_fd ); +#include "ftd2xx.h" -int thumbDV_encode( int serial_fd, short * speech_in, unsigned char * packet_out, uint8 num_of_samples ); -int thumbDV_decode( int serial_fd, unsigned char * packet_in, short * speech_out, uint8 bytes_in_packet ); +void thumbDV_init( FT_HANDLE * serial_fd ); +FT_HANDLE thumbDV_openSerial( FT_DEVICE_LIST_INFO_NODE device ); +int thumbDV_processSerial( FT_HANDLE handle ); + +int thumbDV_encode( FT_HANDLE handle, short * speech_in, unsigned char * packet_out, uint8 num_of_samples ); +int thumbDV_decode( FT_HANDLE handle, unsigned char * packet_in, short * speech_out, uint8 bytes_in_packet ); void thumbDV_dump( char * text, unsigned char * data, unsigned int length ); void thumbDV_flushLists(void); diff --git a/DSP_API/include/WinTypes.h b/DSP_API/include/WinTypes.h new file mode 100644 index 0000000..b37c3e5 --- /dev/null +++ b/DSP_API/include/WinTypes.h @@ -0,0 +1,136 @@ +#ifndef __WINDOWS_TYPES__ +#define __WINDOWS_TYPES__ + +#define WINAPI + +typedef unsigned int DWORD; +typedef unsigned int ULONG; +typedef unsigned short USHORT; +typedef unsigned short SHORT; +typedef unsigned char UCHAR; +typedef unsigned short WORD; +typedef unsigned char BYTE; +typedef BYTE *LPBYTE; +typedef unsigned int BOOLU; +typedef unsigned char BOOLEAN; +typedef unsigned char CHAR; +typedef BOOLU *LPBOOL; +typedef UCHAR *PUCHAR; +typedef const char *LPCSTR; +typedef char *PCHAR; +typedef void *PVOID; +typedef void *HANDLE; +typedef unsigned int LONG; +typedef int INT; +typedef unsigned int UINT; +typedef char *LPSTR; +typedef char *LPTSTR; +typedef const char *LPCTSTR; +typedef DWORD *LPDWORD; +typedef WORD *LPWORD; +typedef ULONG *PULONG; +typedef LONG *LPLONG; +typedef PVOID LPVOID; +typedef void VOID; +typedef unsigned long long int ULONGLONG; + +typedef struct _OVERLAPPED { + DWORD Internal; + DWORD InternalHigh; + DWORD Offset; + DWORD OffsetHigh; + HANDLE hEvent; +} OVERLAPPED, *LPOVERLAPPED; + +typedef struct _SECURITY_ATTRIBUTES { + DWORD nLength; + LPVOID lpSecurityDescriptor; + BOOL bInheritHandle; +} SECURITY_ATTRIBUTES , *LPSECURITY_ATTRIBUTES; + +#include +// Substitute for HANDLE returned by Windows CreateEvent API. +// FT_SetEventNotification expects parameter 3 to be the address +// of one of these structures. +typedef struct _EVENT_HANDLE +{ + pthread_cond_t eCondVar; + pthread_mutex_t eMutex; + int iVar; +} EVENT_HANDLE; + +typedef struct timeval SYSTEMTIME; +typedef struct timeval FILETIME; +#ifndef TRUE +#define TRUE 1 +#endif +#ifndef FALSE +#define FALSE 0 +#endif + +// +// Modem Status Flags +// +#define MS_CTS_ON ((DWORD)0x0010) +#define MS_DSR_ON ((DWORD)0x0020) +#define MS_RING_ON ((DWORD)0x0040) +#define MS_RLSD_ON ((DWORD)0x0080) + +// +// Error Flags +// +#define CE_RXOVER 0x0001 // Receive Queue overflow +#define CE_OVERRUN 0x0002 // Receive Overrun Error +#define CE_RXPARITY 0x0004 // Receive Parity Error +#define CE_FRAME 0x0008 // Receive Framing error +#define CE_BREAK 0x0010 // Break Detected +#define CE_TXFULL 0x0100 // TX Queue is full +#define CE_PTO 0x0200 // LPTx Timeout +#define CE_IOE 0x0400 // LPTx I/O Error +#define CE_DNS 0x0800 // LPTx Device not selected +#define CE_OOP 0x1000 // LPTx Out-Of-Paper +#define CE_MODE 0x8000 // Requested mode unsupported + +// +// Events +// +#define EV_RXCHAR 0x0001 // Any Character received +#define EV_RXFLAG 0x0002 // Received certain character +#define EV_TXEMPTY 0x0004 // Transmit Queue Empty +#define EV_CTS 0x0008 // CTS changed state +#define EV_DSR 0x0010 // DSR changed state +#define EV_RLSD 0x0020 // RLSD changed state +#define EV_BREAK 0x0040 // BREAK received +#define EV_ERR 0x0080 // Line status error occurred +#define EV_RING 0x0100 // Ring signal detected +#define EV_PERR 0x0200 // Printer error occured +#define EV_RX80FULL 0x0400 // Receive buffer is 80 percent full +#define EV_EVENT1 0x0800 // Provider specific event 1 +#define EV_EVENT2 0x1000 // Provider specific event 2 + +// +// Escape Functions +// +#define SETXOFF 1 // Simulate XOFF received +#define SETXON 2 // Simulate XON received +#define SETRTS 3 // Set RTS high +#define CLRRTS 4 // Set RTS low +#define SETDTR 5 // Set DTR high +#define CLRDTR 6 // Set DTR low +#define RESETDEV 7 // Reset device if possible +#define SETBREAK 8 // Set the device break line. +#define CLRBREAK 9 // Clear the device break line. + +// +// PURGE function flags. +// +#define PURGE_TXABORT 0x0001 // Kill the pending/current writes to the comm port. +#define PURGE_RXABORT 0x0002 // Kill the pending/current reads to the comm port. +#define PURGE_TXCLEAR 0x0004 // Kill the transmit queue if there. +#define PURGE_RXCLEAR 0x0008 // Kill the typeahead buffer if there. + +#ifndef INVALID_HANDLE_VALUE +#define INVALID_HANDLE_VALUE 0xFFFFFFFF +#endif + +#endif /* __WINDOWS_TYPES__ */ diff --git a/DSP_API/include/ftd2xx.h b/DSP_API/include/ftd2xx.h new file mode 100644 index 0000000..9ce773c --- /dev/null +++ b/DSP_API/include/ftd2xx.h @@ -0,0 +1,1427 @@ +/*++ + +Copyright © 2001-2011 Future Technology Devices International Limited + +THIS SOFTWARE IS PROVIDED BY FUTURE TECHNOLOGY DEVICES INTERNATIONAL LIMITED "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL +FUTURE TECHNOLOGY DEVICES INTERNATIONAL LIMITED BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT +OF SUBSTITUTE GOODS OR SERVICES LOSS OF USE, DATA, OR PROFITS OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR +TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +FTDI DRIVERS MAY BE USED ONLY IN CONJUNCTION WITH PRODUCTS BASED ON FTDI PARTS. + +FTDI DRIVERS MAY BE DISTRIBUTED IN ANY FORM AS LONG AS LICENSE INFORMATION IS NOT MODIFIED. + +IF A CUSTOM VENDOR ID AND/OR PRODUCT ID OR DESCRIPTION STRING ARE USED, IT IS THE +RESPONSIBILITY OF THE PRODUCT MANUFACTURER TO MAINTAIN ANY CHANGES AND SUBSEQUENT WHQL +RE-CERTIFICATION AS A RESULT OF MAKING THESE CHANGES. + + +Module Name: + +ftd2xx.h + +Abstract: + +Native USB device driver for FTDI FT232x, FT245x, FT2232x and FT4232x devices +FTD2XX library definitions + +Environment: + +kernel & user mode + + +--*/ + + +#ifndef FTD2XX_H +#define FTD2XX_H + +#ifdef _WIN32 +// Compiling on Windows +#include + +// The following ifdef block is the standard way of creating macros +// which make exporting from a DLL simpler. All files within this DLL +// are compiled with the FTD2XX_EXPORTS symbol defined on the command line. +// This symbol should not be defined on any project that uses this DLL. +// This way any other project whose source files include this file see +// FTD2XX_API functions as being imported from a DLL, whereas this DLL +// sees symbols defined with this macro as being exported. + +#ifdef FTD2XX_EXPORTS +#define FTD2XX_API __declspec(dllexport) +#elif defined(FTD2XX_STATIC) +// Avoid decorations when linking statically to D2XX. +#define FTD2XX_API +#else +#define FTD2XX_API __declspec(dllimport) +#endif + +#else // _WIN32 +// Compiling on non-Windows platform. +#include "WinTypes.h" +// No decorations needed. +#define FTD2XX_API + +#endif // _WIN32 + +typedef PVOID FT_HANDLE; +typedef ULONG FT_STATUS; + +// +// Device status +// +enum { + FT_OK, + FT_INVALID_HANDLE, + FT_DEVICE_NOT_FOUND, + FT_DEVICE_NOT_OPENED, + FT_IO_ERROR, + FT_INSUFFICIENT_RESOURCES, + FT_INVALID_PARAMETER, + FT_INVALID_BAUD_RATE, + + FT_DEVICE_NOT_OPENED_FOR_ERASE, + FT_DEVICE_NOT_OPENED_FOR_WRITE, + FT_FAILED_TO_WRITE_DEVICE, + FT_EEPROM_READ_FAILED, + FT_EEPROM_WRITE_FAILED, + FT_EEPROM_ERASE_FAILED, + FT_EEPROM_NOT_PRESENT, + FT_EEPROM_NOT_PROGRAMMED, + FT_INVALID_ARGS, + FT_NOT_SUPPORTED, + FT_OTHER_ERROR, + FT_DEVICE_LIST_NOT_READY, +}; + + +#define FT_SUCCESS(status) ((status) == FT_OK) + +// +// FT_OpenEx Flags +// + +#define FT_OPEN_BY_SERIAL_NUMBER 1 +#define FT_OPEN_BY_DESCRIPTION 2 +#define FT_OPEN_BY_LOCATION 4 + +#define FT_OPEN_MASK (FT_OPEN_BY_SERIAL_NUMBER | \ + FT_OPEN_BY_DESCRIPTION | \ + FT_OPEN_BY_LOCATION) + +// +// FT_ListDevices Flags (used in conjunction with FT_OpenEx Flags +// + +#define FT_LIST_NUMBER_ONLY 0x80000000 +#define FT_LIST_BY_INDEX 0x40000000 +#define FT_LIST_ALL 0x20000000 + +#define FT_LIST_MASK (FT_LIST_NUMBER_ONLY|FT_LIST_BY_INDEX|FT_LIST_ALL) + +// +// Baud Rates +// + +#define FT_BAUD_300 300 +#define FT_BAUD_600 600 +#define FT_BAUD_1200 1200 +#define FT_BAUD_2400 2400 +#define FT_BAUD_4800 4800 +#define FT_BAUD_9600 9600 +#define FT_BAUD_14400 14400 +#define FT_BAUD_19200 19200 +#define FT_BAUD_38400 38400 +#define FT_BAUD_57600 57600 +#define FT_BAUD_115200 115200 +#define FT_BAUD_230400 230400 +#define FT_BAUD_460800 460800 +#define FT_BAUD_921600 921600 + +// +// Word Lengths +// + +#define FT_BITS_8 (UCHAR) 8 +#define FT_BITS_7 (UCHAR) 7 + +// +// Stop Bits +// + +#define FT_STOP_BITS_1 (UCHAR) 0 +#define FT_STOP_BITS_2 (UCHAR) 2 + +// +// Parity +// + +#define FT_PARITY_NONE (UCHAR) 0 +#define FT_PARITY_ODD (UCHAR) 1 +#define FT_PARITY_EVEN (UCHAR) 2 +#define FT_PARITY_MARK (UCHAR) 3 +#define FT_PARITY_SPACE (UCHAR) 4 + +// +// Flow Control +// + +#define FT_FLOW_NONE 0x0000 +#define FT_FLOW_RTS_CTS 0x0100 +#define FT_FLOW_DTR_DSR 0x0200 +#define FT_FLOW_XON_XOFF 0x0400 + +// +// Purge rx and tx buffers +// +#define FT_PURGE_RX 1 +#define FT_PURGE_TX 2 + +// +// Events +// + +typedef void (*PFT_EVENT_HANDLER)(DWORD,DWORD); + +#define FT_EVENT_RXCHAR 1 +#define FT_EVENT_MODEM_STATUS 2 +#define FT_EVENT_LINE_STATUS 4 + +// +// Timeouts +// + +#define FT_DEFAULT_RX_TIMEOUT 300 +#define FT_DEFAULT_TX_TIMEOUT 300 + +// +// Device types +// + +typedef ULONG FT_DEVICE; + +enum { + FT_DEVICE_BM, + FT_DEVICE_AM, + FT_DEVICE_100AX, + FT_DEVICE_UNKNOWN, + FT_DEVICE_2232C, + FT_DEVICE_232R, + FT_DEVICE_2232H, + FT_DEVICE_4232H, + FT_DEVICE_232H, + FT_DEVICE_X_SERIES, + FT_DEVICE_4222H_0, + FT_DEVICE_4222H_1_2, + FT_DEVICE_4222H_3, + FT_DEVICE_4222_PROG, +}; + +// +// Bit Modes +// + +#define FT_BITMODE_RESET 0x00 +#define FT_BITMODE_ASYNC_BITBANG 0x01 +#define FT_BITMODE_MPSSE 0x02 +#define FT_BITMODE_SYNC_BITBANG 0x04 +#define FT_BITMODE_MCU_HOST 0x08 +#define FT_BITMODE_FAST_SERIAL 0x10 +#define FT_BITMODE_CBUS_BITBANG 0x20 +#define FT_BITMODE_SYNC_FIFO 0x40 + +// +// FT232R CBUS Options EEPROM values +// + +#define FT_232R_CBUS_TXDEN 0x00 // Tx Data Enable +#define FT_232R_CBUS_PWRON 0x01 // Power On +#define FT_232R_CBUS_RXLED 0x02 // Rx LED +#define FT_232R_CBUS_TXLED 0x03 // Tx LED +#define FT_232R_CBUS_TXRXLED 0x04 // Tx and Rx LED +#define FT_232R_CBUS_SLEEP 0x05 // Sleep +#define FT_232R_CBUS_CLK48 0x06 // 48MHz clock +#define FT_232R_CBUS_CLK24 0x07 // 24MHz clock +#define FT_232R_CBUS_CLK12 0x08 // 12MHz clock +#define FT_232R_CBUS_CLK6 0x09 // 6MHz clock +#define FT_232R_CBUS_IOMODE 0x0A // IO Mode for CBUS bit-bang +#define FT_232R_CBUS_BITBANG_WR 0x0B // Bit-bang write strobe +#define FT_232R_CBUS_BITBANG_RD 0x0C // Bit-bang read strobe + +// +// FT232H CBUS Options EEPROM values +// + +#define FT_232H_CBUS_TRISTATE 0x00 // Tristate +#define FT_232H_CBUS_TXLED 0x01 // Tx LED +#define FT_232H_CBUS_RXLED 0x02 // Rx LED +#define FT_232H_CBUS_TXRXLED 0x03 // Tx and Rx LED +#define FT_232H_CBUS_PWREN 0x04 // Power Enable +#define FT_232H_CBUS_SLEEP 0x05 // Sleep +#define FT_232H_CBUS_DRIVE_0 0x06 // Drive pin to logic 0 +#define FT_232H_CBUS_DRIVE_1 0x07 // Drive pin to logic 1 +#define FT_232H_CBUS_IOMODE 0x08 // IO Mode for CBUS bit-bang +#define FT_232H_CBUS_TXDEN 0x09 // Tx Data Enable +#define FT_232H_CBUS_CLK30 0x0A // 30MHz clock +#define FT_232H_CBUS_CLK15 0x0B // 15MHz clock +#define FT_232H_CBUS_CLK7_5 0x0C // 7.5MHz clock + +// +// FT X Series CBUS Options EEPROM values +// + +#define FT_X_SERIES_CBUS_TRISTATE 0x00 // Tristate +#define FT_X_SERIES_CBUS_TXLED 0x01 // Tx LED +#define FT_X_SERIES_CBUS_RXLED 0x02 // Rx LED +#define FT_X_SERIES_CBUS_TXRXLED 0x03 // Tx and Rx LED +#define FT_X_SERIES_CBUS_PWREN 0x04 // Power Enable +#define FT_X_SERIES_CBUS_SLEEP 0x05 // Sleep +#define FT_X_SERIES_CBUS_DRIVE_0 0x06 // Drive pin to logic 0 +#define FT_X_SERIES_CBUS_DRIVE_1 0x07 // Drive pin to logic 1 +#define FT_X_SERIES_CBUS_IOMODE 0x08 // IO Mode for CBUS bit-bang +#define FT_X_SERIES_CBUS_TXDEN 0x09 // Tx Data Enable +#define FT_X_SERIES_CBUS_CLK24 0x0A // 24MHz clock +#define FT_X_SERIES_CBUS_CLK12 0x0B // 12MHz clock +#define FT_X_SERIES_CBUS_CLK6 0x0C // 6MHz clock +#define FT_X_SERIES_CBUS_BCD_CHARGER 0x0D // Battery charger detected +#define FT_X_SERIES_CBUS_BCD_CHARGER_N 0x0E // Battery charger detected inverted +#define FT_X_SERIES_CBUS_I2C_TXE 0x0F // I2C Tx empty +#define FT_X_SERIES_CBUS_I2C_RXF 0x10 // I2C Rx full +#define FT_X_SERIES_CBUS_VBUS_SENSE 0x11 // Detect VBUS +#define FT_X_SERIES_CBUS_BITBANG_WR 0x12 // Bit-bang write strobe +#define FT_X_SERIES_CBUS_BITBANG_RD 0x13 // Bit-bang read strobe +#define FT_X_SERIES_CBUS_TIMESTAMP 0x14 // Toggle output when a USB SOF token is received +#define FT_X_SERIES_CBUS_KEEP_AWAKE 0x15 // + + +// Driver types +#define FT_DRIVER_TYPE_D2XX 0 +#define FT_DRIVER_TYPE_VCP 1 + + + +#ifdef __cplusplus +extern "C" { +#endif + + + FTD2XX_API + FT_STATUS WINAPI FT_Open( + int deviceNumber, + FT_HANDLE *pHandle + ); + + FTD2XX_API + FT_STATUS WINAPI FT_OpenEx( + PVOID pArg1, + DWORD Flags, + FT_HANDLE *pHandle + ); + + FTD2XX_API + FT_STATUS WINAPI FT_ListDevices( + PVOID pArg1, + PVOID pArg2, + DWORD Flags + ); + + FTD2XX_API + FT_STATUS WINAPI FT_Close( + FT_HANDLE ftHandle + ); + + FTD2XX_API + FT_STATUS WINAPI FT_Read( + FT_HANDLE ftHandle, + LPVOID lpBuffer, + DWORD dwBytesToRead, + LPDWORD lpBytesReturned + ); + + FTD2XX_API + FT_STATUS WINAPI FT_Write( + FT_HANDLE ftHandle, + LPVOID lpBuffer, + DWORD dwBytesToWrite, + LPDWORD lpBytesWritten + ); + + FTD2XX_API + FT_STATUS WINAPI FT_IoCtl( + FT_HANDLE ftHandle, + DWORD dwIoControlCode, + LPVOID lpInBuf, + DWORD nInBufSize, + LPVOID lpOutBuf, + DWORD nOutBufSize, + LPDWORD lpBytesReturned, + LPOVERLAPPED lpOverlapped + ); + + FTD2XX_API + FT_STATUS WINAPI FT_SetBaudRate( + FT_HANDLE ftHandle, + ULONG BaudRate + ); + + FTD2XX_API + FT_STATUS WINAPI FT_SetDivisor( + FT_HANDLE ftHandle, + USHORT Divisor + ); + + FTD2XX_API + FT_STATUS WINAPI FT_SetDataCharacteristics( + FT_HANDLE ftHandle, + UCHAR WordLength, + UCHAR StopBits, + UCHAR Parity + ); + + FTD2XX_API + FT_STATUS WINAPI FT_SetFlowControl( + FT_HANDLE ftHandle, + USHORT FlowControl, + UCHAR XonChar, + UCHAR XoffChar + ); + + FTD2XX_API + FT_STATUS WINAPI FT_ResetDevice( + FT_HANDLE ftHandle + ); + + FTD2XX_API + FT_STATUS WINAPI FT_SetDtr( + FT_HANDLE ftHandle + ); + + FTD2XX_API + FT_STATUS WINAPI FT_ClrDtr( + FT_HANDLE ftHandle + ); + + FTD2XX_API + FT_STATUS WINAPI FT_SetRts( + FT_HANDLE ftHandle + ); + + FTD2XX_API + FT_STATUS WINAPI FT_ClrRts( + FT_HANDLE ftHandle + ); + + FTD2XX_API + FT_STATUS WINAPI FT_GetModemStatus( + FT_HANDLE ftHandle, + ULONG *pModemStatus + ); + + FTD2XX_API + FT_STATUS WINAPI FT_SetChars( + FT_HANDLE ftHandle, + UCHAR EventChar, + UCHAR EventCharEnabled, + UCHAR ErrorChar, + UCHAR ErrorCharEnabled + ); + + FTD2XX_API + FT_STATUS WINAPI FT_Purge( + FT_HANDLE ftHandle, + ULONG Mask + ); + + FTD2XX_API + FT_STATUS WINAPI FT_SetTimeouts( + FT_HANDLE ftHandle, + ULONG ReadTimeout, + ULONG WriteTimeout + ); + + FTD2XX_API + FT_STATUS WINAPI FT_GetQueueStatus( + FT_HANDLE ftHandle, + DWORD *dwRxBytes + ); + + FTD2XX_API + FT_STATUS WINAPI FT_SetEventNotification( + FT_HANDLE ftHandle, + DWORD Mask, + PVOID Param + ); + + FTD2XX_API + FT_STATUS WINAPI FT_GetStatus( + FT_HANDLE ftHandle, + DWORD *dwRxBytes, + DWORD *dwTxBytes, + DWORD *dwEventDWord + ); + + FTD2XX_API + FT_STATUS WINAPI FT_SetBreakOn( + FT_HANDLE ftHandle + ); + + FTD2XX_API + FT_STATUS WINAPI FT_SetBreakOff( + FT_HANDLE ftHandle + ); + + FTD2XX_API + FT_STATUS WINAPI FT_SetWaitMask( + FT_HANDLE ftHandle, + DWORD Mask + ); + + FTD2XX_API + FT_STATUS WINAPI FT_WaitOnMask( + FT_HANDLE ftHandle, + DWORD *Mask + ); + + FTD2XX_API + FT_STATUS WINAPI FT_GetEventStatus( + FT_HANDLE ftHandle, + DWORD *dwEventDWord + ); + + FTD2XX_API + FT_STATUS WINAPI FT_ReadEE( + FT_HANDLE ftHandle, + DWORD dwWordOffset, + LPWORD lpwValue + ); + + FTD2XX_API + FT_STATUS WINAPI FT_WriteEE( + FT_HANDLE ftHandle, + DWORD dwWordOffset, + WORD wValue + ); + + FTD2XX_API + FT_STATUS WINAPI FT_EraseEE( + FT_HANDLE ftHandle + ); + + // + // structure to hold program data for FT_EE_Program, FT_EE_ProgramEx, FT_EE_Read + // and FT_EE_ReadEx functions + // + typedef struct ft_program_data { + + DWORD Signature1; // Header - must be 0x00000000 + DWORD Signature2; // Header - must be 0xffffffff + DWORD Version; // Header - FT_PROGRAM_DATA version + // 0 = original + // 1 = FT2232 extensions + // 2 = FT232R extensions + // 3 = FT2232H extensions + // 4 = FT4232H extensions + // 5 = FT232H extensions + + WORD VendorId; // 0x0403 + WORD ProductId; // 0x6001 + char *Manufacturer; // "FTDI" + char *ManufacturerId; // "FT" + char *Description; // "USB HS Serial Converter" + char *SerialNumber; // "FT000001" if fixed, or NULL + WORD MaxPower; // 0 < MaxPower <= 500 + WORD PnP; // 0 = disabled, 1 = enabled + WORD SelfPowered; // 0 = bus powered, 1 = self powered + WORD RemoteWakeup; // 0 = not capable, 1 = capable + // + // Rev4 (FT232B) extensions + // + UCHAR Rev4; // non-zero if Rev4 chip, zero otherwise + UCHAR IsoIn; // non-zero if in endpoint is isochronous + UCHAR IsoOut; // non-zero if out endpoint is isochronous + UCHAR PullDownEnable; // non-zero if pull down enabled + UCHAR SerNumEnable; // non-zero if serial number to be used + UCHAR USBVersionEnable; // non-zero if chip uses USBVersion + WORD USBVersion; // BCD (0x0200 => USB2) + // + // Rev 5 (FT2232) extensions + // + UCHAR Rev5; // non-zero if Rev5 chip, zero otherwise + UCHAR IsoInA; // non-zero if in endpoint is isochronous + UCHAR IsoInB; // non-zero if in endpoint is isochronous + UCHAR IsoOutA; // non-zero if out endpoint is isochronous + UCHAR IsoOutB; // non-zero if out endpoint is isochronous + UCHAR PullDownEnable5; // non-zero if pull down enabled + UCHAR SerNumEnable5; // non-zero if serial number to be used + UCHAR USBVersionEnable5; // non-zero if chip uses USBVersion + WORD USBVersion5; // BCD (0x0200 => USB2) + UCHAR AIsHighCurrent; // non-zero if interface is high current + UCHAR BIsHighCurrent; // non-zero if interface is high current + UCHAR IFAIsFifo; // non-zero if interface is 245 FIFO + UCHAR IFAIsFifoTar; // non-zero if interface is 245 FIFO CPU target + UCHAR IFAIsFastSer; // non-zero if interface is Fast serial + UCHAR AIsVCP; // non-zero if interface is to use VCP drivers + UCHAR IFBIsFifo; // non-zero if interface is 245 FIFO + UCHAR IFBIsFifoTar; // non-zero if interface is 245 FIFO CPU target + UCHAR IFBIsFastSer; // non-zero if interface is Fast serial + UCHAR BIsVCP; // non-zero if interface is to use VCP drivers + // + // Rev 6 (FT232R) extensions + // + UCHAR UseExtOsc; // Use External Oscillator + UCHAR HighDriveIOs; // High Drive I/Os + UCHAR EndpointSize; // Endpoint size + UCHAR PullDownEnableR; // non-zero if pull down enabled + UCHAR SerNumEnableR; // non-zero if serial number to be used + UCHAR InvertTXD; // non-zero if invert TXD + UCHAR InvertRXD; // non-zero if invert RXD + UCHAR InvertRTS; // non-zero if invert RTS + UCHAR InvertCTS; // non-zero if invert CTS + UCHAR InvertDTR; // non-zero if invert DTR + UCHAR InvertDSR; // non-zero if invert DSR + UCHAR InvertDCD; // non-zero if invert DCD + UCHAR InvertRI; // non-zero if invert RI + UCHAR Cbus0; // Cbus Mux control + UCHAR Cbus1; // Cbus Mux control + UCHAR Cbus2; // Cbus Mux control + UCHAR Cbus3; // Cbus Mux control + UCHAR Cbus4; // Cbus Mux control + UCHAR RIsD2XX; // non-zero if using D2XX driver + // + // Rev 7 (FT2232H) Extensions + // + UCHAR PullDownEnable7; // non-zero if pull down enabled + UCHAR SerNumEnable7; // non-zero if serial number to be used + UCHAR ALSlowSlew; // non-zero if AL pins have slow slew + UCHAR ALSchmittInput; // non-zero if AL pins are Schmitt input + UCHAR ALDriveCurrent; // valid values are 4mA, 8mA, 12mA, 16mA + UCHAR AHSlowSlew; // non-zero if AH pins have slow slew + UCHAR AHSchmittInput; // non-zero if AH pins are Schmitt input + UCHAR AHDriveCurrent; // valid values are 4mA, 8mA, 12mA, 16mA + UCHAR BLSlowSlew; // non-zero if BL pins have slow slew + UCHAR BLSchmittInput; // non-zero if BL pins are Schmitt input + UCHAR BLDriveCurrent; // valid values are 4mA, 8mA, 12mA, 16mA + UCHAR BHSlowSlew; // non-zero if BH pins have slow slew + UCHAR BHSchmittInput; // non-zero if BH pins are Schmitt input + UCHAR BHDriveCurrent; // valid values are 4mA, 8mA, 12mA, 16mA + UCHAR IFAIsFifo7; // non-zero if interface is 245 FIFO + UCHAR IFAIsFifoTar7; // non-zero if interface is 245 FIFO CPU target + UCHAR IFAIsFastSer7; // non-zero if interface is Fast serial + UCHAR AIsVCP7; // non-zero if interface is to use VCP drivers + UCHAR IFBIsFifo7; // non-zero if interface is 245 FIFO + UCHAR IFBIsFifoTar7; // non-zero if interface is 245 FIFO CPU target + UCHAR IFBIsFastSer7; // non-zero if interface is Fast serial + UCHAR BIsVCP7; // non-zero if interface is to use VCP drivers + UCHAR PowerSaveEnable; // non-zero if using BCBUS7 to save power for self-powered designs + // + // Rev 8 (FT4232H) Extensions + // + UCHAR PullDownEnable8; // non-zero if pull down enabled + UCHAR SerNumEnable8; // non-zero if serial number to be used + UCHAR ASlowSlew; // non-zero if A pins have slow slew + UCHAR ASchmittInput; // non-zero if A pins are Schmitt input + UCHAR ADriveCurrent; // valid values are 4mA, 8mA, 12mA, 16mA + UCHAR BSlowSlew; // non-zero if B pins have slow slew + UCHAR BSchmittInput; // non-zero if B pins are Schmitt input + UCHAR BDriveCurrent; // valid values are 4mA, 8mA, 12mA, 16mA + UCHAR CSlowSlew; // non-zero if C pins have slow slew + UCHAR CSchmittInput; // non-zero if C pins are Schmitt input + UCHAR CDriveCurrent; // valid values are 4mA, 8mA, 12mA, 16mA + UCHAR DSlowSlew; // non-zero if D pins have slow slew + UCHAR DSchmittInput; // non-zero if D pins are Schmitt input + UCHAR DDriveCurrent; // valid values are 4mA, 8mA, 12mA, 16mA + UCHAR ARIIsTXDEN; // non-zero if port A uses RI as RS485 TXDEN + UCHAR BRIIsTXDEN; // non-zero if port B uses RI as RS485 TXDEN + UCHAR CRIIsTXDEN; // non-zero if port C uses RI as RS485 TXDEN + UCHAR DRIIsTXDEN; // non-zero if port D uses RI as RS485 TXDEN + UCHAR AIsVCP8; // non-zero if interface is to use VCP drivers + UCHAR BIsVCP8; // non-zero if interface is to use VCP drivers + UCHAR CIsVCP8; // non-zero if interface is to use VCP drivers + UCHAR DIsVCP8; // non-zero if interface is to use VCP drivers + // + // Rev 9 (FT232H) Extensions + // + UCHAR PullDownEnableH; // non-zero if pull down enabled + UCHAR SerNumEnableH; // non-zero if serial number to be used + UCHAR ACSlowSlewH; // non-zero if AC pins have slow slew + UCHAR ACSchmittInputH; // non-zero if AC pins are Schmitt input + UCHAR ACDriveCurrentH; // valid values are 4mA, 8mA, 12mA, 16mA + UCHAR ADSlowSlewH; // non-zero if AD pins have slow slew + UCHAR ADSchmittInputH; // non-zero if AD pins are Schmitt input + UCHAR ADDriveCurrentH; // valid values are 4mA, 8mA, 12mA, 16mA + UCHAR Cbus0H; // Cbus Mux control + UCHAR Cbus1H; // Cbus Mux control + UCHAR Cbus2H; // Cbus Mux control + UCHAR Cbus3H; // Cbus Mux control + UCHAR Cbus4H; // Cbus Mux control + UCHAR Cbus5H; // Cbus Mux control + UCHAR Cbus6H; // Cbus Mux control + UCHAR Cbus7H; // Cbus Mux control + UCHAR Cbus8H; // Cbus Mux control + UCHAR Cbus9H; // Cbus Mux control + UCHAR IsFifoH; // non-zero if interface is 245 FIFO + UCHAR IsFifoTarH; // non-zero if interface is 245 FIFO CPU target + UCHAR IsFastSerH; // non-zero if interface is Fast serial + UCHAR IsFT1248H; // non-zero if interface is FT1248 + UCHAR FT1248CpolH; // FT1248 clock polarity - clock idle high (1) or clock idle low (0) + UCHAR FT1248LsbH; // FT1248 data is LSB (1) or MSB (0) + UCHAR FT1248FlowControlH; // FT1248 flow control enable + UCHAR IsVCPH; // non-zero if interface is to use VCP drivers + UCHAR PowerSaveEnableH; // non-zero if using ACBUS7 to save power for self-powered designs + + } FT_PROGRAM_DATA, *PFT_PROGRAM_DATA; + + FTD2XX_API + FT_STATUS WINAPI FT_EE_Program( + FT_HANDLE ftHandle, + PFT_PROGRAM_DATA pData + ); + + FTD2XX_API + FT_STATUS WINAPI FT_EE_ProgramEx( + FT_HANDLE ftHandle, + PFT_PROGRAM_DATA pData, + char *Manufacturer, + char *ManufacturerId, + char *Description, + char *SerialNumber + ); + + FTD2XX_API + FT_STATUS WINAPI FT_EE_Read( + FT_HANDLE ftHandle, + PFT_PROGRAM_DATA pData + ); + + FTD2XX_API + FT_STATUS WINAPI FT_EE_ReadEx( + FT_HANDLE ftHandle, + PFT_PROGRAM_DATA pData, + char *Manufacturer, + char *ManufacturerId, + char *Description, + char *SerialNumber + ); + + FTD2XX_API + FT_STATUS WINAPI FT_EE_UASize( + FT_HANDLE ftHandle, + LPDWORD lpdwSize + ); + + FTD2XX_API + FT_STATUS WINAPI FT_EE_UAWrite( + FT_HANDLE ftHandle, + PUCHAR pucData, + DWORD dwDataLen + ); + + FTD2XX_API + FT_STATUS WINAPI FT_EE_UARead( + FT_HANDLE ftHandle, + PUCHAR pucData, + DWORD dwDataLen, + LPDWORD lpdwBytesRead + ); + + + typedef struct ft_eeprom_header { + FT_DEVICE deviceType; // FTxxxx device type to be programmed + // Device descriptor options + WORD VendorId; // 0x0403 + WORD ProductId; // 0x6001 + UCHAR SerNumEnable; // non-zero if serial number to be used + // Config descriptor options + WORD MaxPower; // 0 < MaxPower <= 500 + UCHAR SelfPowered; // 0 = bus powered, 1 = self powered + UCHAR RemoteWakeup; // 0 = not capable, 1 = capable + // Hardware options + UCHAR PullDownEnable; // non-zero if pull down in suspend enabled + } FT_EEPROM_HEADER, *PFT_EEPROM_HEADER; + + + // FT232B EEPROM structure for use with FT_EEPROM_Read and FT_EEPROM_Program + typedef struct ft_eeprom_232b { + // Common header + FT_EEPROM_HEADER common; // common elements for all device EEPROMs + } FT_EEPROM_232B, *PFT_EEPROM_232B; + + + // FT2232 EEPROM structure for use with FT_EEPROM_Read and FT_EEPROM_Program + typedef struct ft_eeprom_2232 { + // Common header + FT_EEPROM_HEADER common; // common elements for all device EEPROMs + // Drive options + UCHAR AIsHighCurrent; // non-zero if interface is high current + UCHAR BIsHighCurrent; // non-zero if interface is high current + // Hardware options + UCHAR AIsFifo; // non-zero if interface is 245 FIFO + UCHAR AIsFifoTar; // non-zero if interface is 245 FIFO CPU target + UCHAR AIsFastSer; // non-zero if interface is Fast serial + UCHAR BIsFifo; // non-zero if interface is 245 FIFO + UCHAR BIsFifoTar; // non-zero if interface is 245 FIFO CPU target + UCHAR BIsFastSer; // non-zero if interface is Fast serial + // Driver option + UCHAR ADriverType; // + UCHAR BDriverType; // + } FT_EEPROM_2232, *PFT_EEPROM_2232; + + + // FT232R EEPROM structure for use with FT_EEPROM_Read and FT_EEPROM_Program + typedef struct ft_eeprom_232r { + // Common header + FT_EEPROM_HEADER common; // common elements for all device EEPROMs + // Drive options + UCHAR IsHighCurrent; // non-zero if interface is high current + // Hardware options + UCHAR UseExtOsc; // Use External Oscillator + UCHAR InvertTXD; // non-zero if invert TXD + UCHAR InvertRXD; // non-zero if invert RXD + UCHAR InvertRTS; // non-zero if invert RTS + UCHAR InvertCTS; // non-zero if invert CTS + UCHAR InvertDTR; // non-zero if invert DTR + UCHAR InvertDSR; // non-zero if invert DSR + UCHAR InvertDCD; // non-zero if invert DCD + UCHAR InvertRI; // non-zero if invert RI + UCHAR Cbus0; // Cbus Mux control + UCHAR Cbus1; // Cbus Mux control + UCHAR Cbus2; // Cbus Mux control + UCHAR Cbus3; // Cbus Mux control + UCHAR Cbus4; // Cbus Mux control + // Driver option + UCHAR DriverType; // + } FT_EEPROM_232R, *PFT_EEPROM_232R; + + + // FT2232H EEPROM structure for use with FT_EEPROM_Read and FT_EEPROM_Program + typedef struct ft_eeprom_2232h { + // Common header + FT_EEPROM_HEADER common; // common elements for all device EEPROMs + // Drive options + UCHAR ALSlowSlew; // non-zero if AL pins have slow slew + UCHAR ALSchmittInput; // non-zero if AL pins are Schmitt input + UCHAR ALDriveCurrent; // valid values are 4mA, 8mA, 12mA, 16mA + UCHAR AHSlowSlew; // non-zero if AH pins have slow slew + UCHAR AHSchmittInput; // non-zero if AH pins are Schmitt input + UCHAR AHDriveCurrent; // valid values are 4mA, 8mA, 12mA, 16mA + UCHAR BLSlowSlew; // non-zero if BL pins have slow slew + UCHAR BLSchmittInput; // non-zero if BL pins are Schmitt input + UCHAR BLDriveCurrent; // valid values are 4mA, 8mA, 12mA, 16mA + UCHAR BHSlowSlew; // non-zero if BH pins have slow slew + UCHAR BHSchmittInput; // non-zero if BH pins are Schmitt input + UCHAR BHDriveCurrent; // valid values are 4mA, 8mA, 12mA, 16mA + // Hardware options + UCHAR AIsFifo; // non-zero if interface is 245 FIFO + UCHAR AIsFifoTar; // non-zero if interface is 245 FIFO CPU target + UCHAR AIsFastSer; // non-zero if interface is Fast serial + UCHAR BIsFifo; // non-zero if interface is 245 FIFO + UCHAR BIsFifoTar; // non-zero if interface is 245 FIFO CPU target + UCHAR BIsFastSer; // non-zero if interface is Fast serial + UCHAR PowerSaveEnable; // non-zero if using BCBUS7 to save power for self-powered designs + // Driver option + UCHAR ADriverType; // + UCHAR BDriverType; // + } FT_EEPROM_2232H, *PFT_EEPROM_2232H; + + + // FT4232H EEPROM structure for use with FT_EEPROM_Read and FT_EEPROM_Program + typedef struct ft_eeprom_4232h { + // Common header + FT_EEPROM_HEADER common; // common elements for all device EEPROMs + // Drive options + UCHAR ASlowSlew; // non-zero if A pins have slow slew + UCHAR ASchmittInput; // non-zero if A pins are Schmitt input + UCHAR ADriveCurrent; // valid values are 4mA, 8mA, 12mA, 16mA + UCHAR BSlowSlew; // non-zero if B pins have slow slew + UCHAR BSchmittInput; // non-zero if B pins are Schmitt input + UCHAR BDriveCurrent; // valid values are 4mA, 8mA, 12mA, 16mA + UCHAR CSlowSlew; // non-zero if C pins have slow slew + UCHAR CSchmittInput; // non-zero if C pins are Schmitt input + UCHAR CDriveCurrent; // valid values are 4mA, 8mA, 12mA, 16mA + UCHAR DSlowSlew; // non-zero if D pins have slow slew + UCHAR DSchmittInput; // non-zero if D pins are Schmitt input + UCHAR DDriveCurrent; // valid values are 4mA, 8mA, 12mA, 16mA + // Hardware options + UCHAR ARIIsTXDEN; // non-zero if port A uses RI as RS485 TXDEN + UCHAR BRIIsTXDEN; // non-zero if port B uses RI as RS485 TXDEN + UCHAR CRIIsTXDEN; // non-zero if port C uses RI as RS485 TXDEN + UCHAR DRIIsTXDEN; // non-zero if port D uses RI as RS485 TXDEN + // Driver option + UCHAR ADriverType; // + UCHAR BDriverType; // + UCHAR CDriverType; // + UCHAR DDriverType; // + } FT_EEPROM_4232H, *PFT_EEPROM_4232H; + + + // FT232H EEPROM structure for use with FT_EEPROM_Read and FT_EEPROM_Program + typedef struct ft_eeprom_232h { + // Common header + FT_EEPROM_HEADER common; // common elements for all device EEPROMs + // Drive options + UCHAR ACSlowSlew; // non-zero if AC bus pins have slow slew + UCHAR ACSchmittInput; // non-zero if AC bus pins are Schmitt input + UCHAR ACDriveCurrent; // valid values are 4mA, 8mA, 12mA, 16mA + UCHAR ADSlowSlew; // non-zero if AD bus pins have slow slew + UCHAR ADSchmittInput; // non-zero if AD bus pins are Schmitt input + UCHAR ADDriveCurrent; // valid values are 4mA, 8mA, 12mA, 16mA + // CBUS options + UCHAR Cbus0; // Cbus Mux control + UCHAR Cbus1; // Cbus Mux control + UCHAR Cbus2; // Cbus Mux control + UCHAR Cbus3; // Cbus Mux control + UCHAR Cbus4; // Cbus Mux control + UCHAR Cbus5; // Cbus Mux control + UCHAR Cbus6; // Cbus Mux control + UCHAR Cbus7; // Cbus Mux control + UCHAR Cbus8; // Cbus Mux control + UCHAR Cbus9; // Cbus Mux control + // FT1248 options + UCHAR FT1248Cpol; // FT1248 clock polarity - clock idle high (1) or clock idle low (0) + UCHAR FT1248Lsb; // FT1248 data is LSB (1) or MSB (0) + UCHAR FT1248FlowControl; // FT1248 flow control enable + // Hardware options + UCHAR IsFifo; // non-zero if interface is 245 FIFO + UCHAR IsFifoTar; // non-zero if interface is 245 FIFO CPU target + UCHAR IsFastSer; // non-zero if interface is Fast serial + UCHAR IsFT1248 ; // non-zero if interface is FT1248 + UCHAR PowerSaveEnable; // + // Driver option + UCHAR DriverType; // + } FT_EEPROM_232H, *PFT_EEPROM_232H; + + + // FT X Series EEPROM structure for use with FT_EEPROM_Read and FT_EEPROM_Program + typedef struct ft_eeprom_x_series { + // Common header + FT_EEPROM_HEADER common; // common elements for all device EEPROMs + // Drive options + UCHAR ACSlowSlew; // non-zero if AC bus pins have slow slew + UCHAR ACSchmittInput; // non-zero if AC bus pins are Schmitt input + UCHAR ACDriveCurrent; // valid values are 4mA, 8mA, 12mA, 16mA + UCHAR ADSlowSlew; // non-zero if AD bus pins have slow slew + UCHAR ADSchmittInput; // non-zero if AD bus pins are Schmitt input + UCHAR ADDriveCurrent; // valid values are 4mA, 8mA, 12mA, 16mA + // CBUS options + UCHAR Cbus0; // Cbus Mux control + UCHAR Cbus1; // Cbus Mux control + UCHAR Cbus2; // Cbus Mux control + UCHAR Cbus3; // Cbus Mux control + UCHAR Cbus4; // Cbus Mux control + UCHAR Cbus5; // Cbus Mux control + UCHAR Cbus6; // Cbus Mux control + // UART signal options + UCHAR InvertTXD; // non-zero if invert TXD + UCHAR InvertRXD; // non-zero if invert RXD + UCHAR InvertRTS; // non-zero if invert RTS + UCHAR InvertCTS; // non-zero if invert CTS + UCHAR InvertDTR; // non-zero if invert DTR + UCHAR InvertDSR; // non-zero if invert DSR + UCHAR InvertDCD; // non-zero if invert DCD + UCHAR InvertRI; // non-zero if invert RI + // Battery Charge Detect options + UCHAR BCDEnable; // Enable Battery Charger Detection + UCHAR BCDForceCbusPWREN; // asserts the power enable signal on CBUS when charging port detected + UCHAR BCDDisableSleep; // forces the device never to go into sleep mode + // I2C options + WORD I2CSlaveAddress; // I2C slave device address + DWORD I2CDeviceId; // I2C device ID + UCHAR I2CDisableSchmitt; // Disable I2C Schmitt trigger + // FT1248 options + UCHAR FT1248Cpol; // FT1248 clock polarity - clock idle high (1) or clock idle low (0) + UCHAR FT1248Lsb; // FT1248 data is LSB (1) or MSB (0) + UCHAR FT1248FlowControl; // FT1248 flow control enable + // Hardware options + UCHAR RS485EchoSuppress; // + UCHAR PowerSaveEnable; // + // Driver option + UCHAR DriverType; // + } FT_EEPROM_X_SERIES, *PFT_EEPROM_X_SERIES; + + + FTD2XX_API + FT_STATUS WINAPI FT_EEPROM_Read( + FT_HANDLE ftHandle, + void *eepromData, + DWORD eepromDataSize, + char *Manufacturer, + char *ManufacturerId, + char *Description, + char *SerialNumber + ); + + + FTD2XX_API + FT_STATUS WINAPI FT_EEPROM_Program( + FT_HANDLE ftHandle, + void *eepromData, + DWORD eepromDataSize, + char *Manufacturer, + char *ManufacturerId, + char *Description, + char *SerialNumber + ); + + + FTD2XX_API + FT_STATUS WINAPI FT_SetLatencyTimer( + FT_HANDLE ftHandle, + UCHAR ucLatency + ); + + FTD2XX_API + FT_STATUS WINAPI FT_GetLatencyTimer( + FT_HANDLE ftHandle, + PUCHAR pucLatency + ); + + FTD2XX_API + FT_STATUS WINAPI FT_SetBitMode( + FT_HANDLE ftHandle, + UCHAR ucMask, + UCHAR ucEnable + ); + + FTD2XX_API + FT_STATUS WINAPI FT_GetBitMode( + FT_HANDLE ftHandle, + PUCHAR pucMode + ); + + FTD2XX_API + FT_STATUS WINAPI FT_SetUSBParameters( + FT_HANDLE ftHandle, + ULONG ulInTransferSize, + ULONG ulOutTransferSize + ); + + FTD2XX_API + FT_STATUS WINAPI FT_SetDeadmanTimeout( + FT_HANDLE ftHandle, + ULONG ulDeadmanTimeout + ); + +#ifndef _WIN32 + // Extra functions for non-Windows platforms to compensate + // for lack of .INF file to specify Vendor and Product IDs. + + FTD2XX_API + FT_STATUS FT_SetVIDPID( + DWORD dwVID, + DWORD dwPID + ); + + FTD2XX_API + FT_STATUS FT_GetVIDPID( + DWORD * pdwVID, + DWORD * pdwPID + ); + + FTD2XX_API + FT_STATUS WINAPI FT_GetDeviceLocId( + FT_HANDLE ftHandle, + LPDWORD lpdwLocId + ); +#endif // _WIN32 + + FTD2XX_API + FT_STATUS WINAPI FT_GetDeviceInfo( + FT_HANDLE ftHandle, + FT_DEVICE *lpftDevice, + LPDWORD lpdwID, + PCHAR SerialNumber, + PCHAR Description, + LPVOID Dummy + ); + + FTD2XX_API + FT_STATUS WINAPI FT_StopInTask( + FT_HANDLE ftHandle + ); + + FTD2XX_API + FT_STATUS WINAPI FT_RestartInTask( + FT_HANDLE ftHandle + ); + + FTD2XX_API + FT_STATUS WINAPI FT_SetResetPipeRetryCount( + FT_HANDLE ftHandle, + DWORD dwCount + ); + + FTD2XX_API + FT_STATUS WINAPI FT_ResetPort( + FT_HANDLE ftHandle + ); + + FTD2XX_API + FT_STATUS WINAPI FT_CyclePort( + FT_HANDLE ftHandle + ); + + + // + // Win32-type functions + // + + FTD2XX_API + FT_HANDLE WINAPI FT_W32_CreateFile( + LPCTSTR lpszName, + DWORD dwAccess, + DWORD dwShareMode, + LPSECURITY_ATTRIBUTES lpSecurityAttributes, + DWORD dwCreate, + DWORD dwAttrsAndFlags, + HANDLE hTemplate + ); + + FTD2XX_API + BOOLU WINAPI FT_W32_CloseHandle( + FT_HANDLE ftHandle + ); + + FTD2XX_API + BOOLU WINAPI FT_W32_ReadFile( + FT_HANDLE ftHandle, + LPVOID lpBuffer, + DWORD nBufferSize, + LPDWORD lpBytesReturned, + LPOVERLAPPED lpOverlapped + ); + + FTD2XX_API + BOOLU WINAPI FT_W32_WriteFile( + FT_HANDLE ftHandle, + LPVOID lpBuffer, + DWORD nBufferSize, + LPDWORD lpBytesWritten, + LPOVERLAPPED lpOverlapped + ); + + FTD2XX_API + DWORD WINAPI FT_W32_GetLastError( + FT_HANDLE ftHandle + ); + + FTD2XX_API + BOOLU WINAPI FT_W32_GetOverlappedResult( + FT_HANDLE ftHandle, + LPOVERLAPPED lpOverlapped, + LPDWORD lpdwBytesTransferred, + BOOLU bWait + ); + + FTD2XX_API + BOOLU WINAPI FT_W32_CancelIo( + FT_HANDLE ftHandle + ); + + + // + // Win32 COMM API type functions + // + typedef struct _FTCOMSTAT { + DWORD fCtsHold : 1; + DWORD fDsrHold : 1; + DWORD fRlsdHold : 1; + DWORD fXoffHold : 1; + DWORD fXoffSent : 1; + DWORD fEof : 1; + DWORD fTxim : 1; + DWORD fReserved : 25; + DWORD cbInQue; + DWORD cbOutQue; + } FTCOMSTAT, *LPFTCOMSTAT; + + typedef struct _FTDCB { + DWORD DCBlength; /* sizeof(FTDCB) */ + DWORD BaudRate; /* Baudrate at which running */ + DWORD fBinary: 1; /* Binary Mode (skip EOF check) */ + DWORD fParity: 1; /* Enable parity checking */ + DWORD fOutxCtsFlow:1; /* CTS handshaking on output */ + DWORD fOutxDsrFlow:1; /* DSR handshaking on output */ + DWORD fDtrControl:2; /* DTR Flow control */ + DWORD fDsrSensitivity:1; /* DSR Sensitivity */ + DWORD fTXContinueOnXoff: 1; /* Continue TX when Xoff sent */ + DWORD fOutX: 1; /* Enable output X-ON/X-OFF */ + DWORD fInX: 1; /* Enable input X-ON/X-OFF */ + DWORD fErrorChar: 1; /* Enable Err Replacement */ + DWORD fNull: 1; /* Enable Null stripping */ + DWORD fRtsControl:2; /* Rts Flow control */ + DWORD fAbortOnError:1; /* Abort all reads and writes on Error */ + DWORD fDummy2:17; /* Reserved */ + WORD wReserved; /* Not currently used */ + WORD XonLim; /* Transmit X-ON threshold */ + WORD XoffLim; /* Transmit X-OFF threshold */ + BYTE ByteSize; /* Number of bits/byte, 4-8 */ + BYTE Parity; /* 0-4=None,Odd,Even,Mark,Space */ + BYTE StopBits; /* 0,1,2 = 1, 1.5, 2 */ + char XonChar; /* Tx and Rx X-ON character */ + char XoffChar; /* Tx and Rx X-OFF character */ + char ErrorChar; /* Error replacement char */ + char EofChar; /* End of Input character */ + char EvtChar; /* Received Event character */ + WORD wReserved1; /* Fill for now. */ + } FTDCB, *LPFTDCB; + + typedef struct _FTTIMEOUTS { + DWORD ReadIntervalTimeout; /* Maximum time between read chars. */ + DWORD ReadTotalTimeoutMultiplier; /* Multiplier of characters. */ + DWORD ReadTotalTimeoutConstant; /* Constant in milliseconds. */ + DWORD WriteTotalTimeoutMultiplier; /* Multiplier of characters. */ + DWORD WriteTotalTimeoutConstant; /* Constant in milliseconds. */ + } FTTIMEOUTS,*LPFTTIMEOUTS; + + + FTD2XX_API + BOOLU WINAPI FT_W32_ClearCommBreak( + FT_HANDLE ftHandle + ); + + FTD2XX_API + BOOLU WINAPI FT_W32_ClearCommError( + FT_HANDLE ftHandle, + LPDWORD lpdwErrors, + LPFTCOMSTAT lpftComstat + ); + + FTD2XX_API + BOOLU WINAPI FT_W32_EscapeCommFunction( + FT_HANDLE ftHandle, + DWORD dwFunc + ); + + FTD2XX_API + BOOLU WINAPI FT_W32_GetCommModemStatus( + FT_HANDLE ftHandle, + LPDWORD lpdwModemStatus + ); + + FTD2XX_API + BOOLU WINAPI FT_W32_GetCommState( + FT_HANDLE ftHandle, + LPFTDCB lpftDcb + ); + + FTD2XX_API + BOOLU WINAPI FT_W32_GetCommTimeouts( + FT_HANDLE ftHandle, + FTTIMEOUTS *pTimeouts + ); + + FTD2XX_API + BOOLU WINAPI FT_W32_PurgeComm( + FT_HANDLE ftHandle, + DWORD dwMask + ); + + FTD2XX_API + BOOLU WINAPI FT_W32_SetCommBreak( + FT_HANDLE ftHandle + ); + + FTD2XX_API + BOOLU WINAPI FT_W32_SetCommMask( + FT_HANDLE ftHandle, + ULONG ulEventMask + ); + + FTD2XX_API + BOOLU WINAPI FT_W32_GetCommMask( + FT_HANDLE ftHandle, + LPDWORD lpdwEventMask + ); + + FTD2XX_API + BOOLU WINAPI FT_W32_SetCommState( + FT_HANDLE ftHandle, + LPFTDCB lpftDcb + ); + + FTD2XX_API + BOOLU WINAPI FT_W32_SetCommTimeouts( + FT_HANDLE ftHandle, + FTTIMEOUTS *pTimeouts + ); + + FTD2XX_API + BOOLU WINAPI FT_W32_SetupComm( + FT_HANDLE ftHandle, + DWORD dwReadBufferSize, + DWORD dwWriteBufferSize + ); + + FTD2XX_API + BOOLU WINAPI FT_W32_WaitCommEvent( + FT_HANDLE ftHandle, + PULONG pulEvent, + LPOVERLAPPED lpOverlapped + ); + + + // + // Device information + // + + typedef struct _ft_device_list_info_node { + ULONG Flags; + ULONG Type; + ULONG ID; + DWORD LocId; + char SerialNumber[16]; + char Description[64]; + FT_HANDLE ftHandle; + } FT_DEVICE_LIST_INFO_NODE; + + // Device information flags + enum { + FT_FLAGS_OPENED = 1, + FT_FLAGS_HISPEED = 2 + }; + + + FTD2XX_API + FT_STATUS WINAPI FT_CreateDeviceInfoList( + LPDWORD lpdwNumDevs + ); + + FTD2XX_API + FT_STATUS WINAPI FT_GetDeviceInfoList( + FT_DEVICE_LIST_INFO_NODE *pDest, + LPDWORD lpdwNumDevs + ); + + FTD2XX_API + FT_STATUS WINAPI FT_GetDeviceInfoDetail( + DWORD dwIndex, + LPDWORD lpdwFlags, + LPDWORD lpdwType, + LPDWORD lpdwID, + LPDWORD lpdwLocId, + LPVOID lpSerialNumber, + LPVOID lpDescription, + FT_HANDLE *pftHandle + ); + + + // + // Version information + // + + FTD2XX_API + FT_STATUS WINAPI FT_GetDriverVersion( + FT_HANDLE ftHandle, + LPDWORD lpdwVersion + ); + + FTD2XX_API + FT_STATUS WINAPI FT_GetLibraryVersion( + LPDWORD lpdwVersion + ); + + + FTD2XX_API + FT_STATUS WINAPI FT_Rescan( + void + ); + + FTD2XX_API + FT_STATUS WINAPI FT_Reload( + WORD wVid, + WORD wPid + ); + + FTD2XX_API + FT_STATUS WINAPI FT_GetComPortNumber( + FT_HANDLE ftHandle, + LPLONG lpdwComPortNumber + ); + + + // + // FT232H additional EEPROM functions + // + + FTD2XX_API + FT_STATUS WINAPI FT_EE_ReadConfig( + FT_HANDLE ftHandle, + UCHAR ucAddress, + PUCHAR pucValue + ); + + FTD2XX_API + FT_STATUS WINAPI FT_EE_WriteConfig( + FT_HANDLE ftHandle, + UCHAR ucAddress, + UCHAR ucValue + ); + + FTD2XX_API + FT_STATUS WINAPI FT_EE_ReadECC( + FT_HANDLE ftHandle, + UCHAR ucOption, + LPWORD lpwValue + ); + + FTD2XX_API + FT_STATUS WINAPI FT_GetQueueStatusEx( + FT_HANDLE ftHandle, + DWORD *dwRxBytes + ); + + FTD2XX_API + FT_STATUS WINAPI FT_ComPortIdle( + FT_HANDLE ftHandle + ); + + FTD2XX_API + FT_STATUS WINAPI FT_ComPortCancelIdle( + FT_HANDLE ftHandle + ); + + FTD2XX_API + FT_STATUS WINAPI FT_VendorCmdGet( + FT_HANDLE ftHandle, + UCHAR Request, + UCHAR *Buf, + USHORT Len + ); + + FTD2XX_API + FT_STATUS WINAPI FT_VendorCmdSet( + FT_HANDLE ftHandle, + UCHAR Request, + UCHAR *Buf, + USHORT Len + ); + + FTD2XX_API + FT_STATUS WINAPI FT_VendorCmdGetEx( + FT_HANDLE ftHandle, + USHORT wValue, + UCHAR *Buf, + USHORT Len + ); + + FTD2XX_API + FT_STATUS WINAPI FT_VendorCmdSetEx( + FT_HANDLE ftHandle, + USHORT wValue, + UCHAR *Buf, + USHORT Len + ); + +#ifdef __cplusplus +} +#endif + + +#endif /* FTD2XX_H */ + diff --git a/DSP_API/lib/libftd2xx.a b/DSP_API/lib/libftd2xx.a new file mode 100644 index 0000000000000000000000000000000000000000..7e39999b4df18eff0411d7e9b94ace507258570c GIT binary patch literal 334362 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 Zol#iQO@9NG-bNwmX^o(Cbe2HR{|x}fZubBH literal 0 HcmV?d00001