34#if defined(MPSSE_PLATFORM)
38#pragma comment(lib, "Winmm.lib")
41#if defined(EVE_MULTI_PLATFORM_TARGET)
42#define EVE_HalImpl_initialize EVE_HalImpl_MPSSE_initialize
43#define EVE_HalImpl_release EVE_HalImpl_MPSSE_release
44#define EVE_Hal_list EVE_Hal_MPSSE_list
45#define EVE_Hal_info EVE_Hal_MPSSE_info
46#define EVE_Hal_isDevice EVE_Hal_MPSSE_isDevice
47#define EVE_HalImpl_defaults EVE_HalImpl_MPSSE_defaults
48#define EVE_HalImpl_open EVE_HalImpl_MPSSE_open
49#define EVE_HalImpl_close EVE_HalImpl_MPSSE_close
50#define EVE_HalImpl_idle EVE_HalImpl_MPSSE_idle
51#define EVE_Hal_flush EVE_Hal_MPSSE_flush
52#define EVE_Hal_startTransfer EVE_Hal_MPSSE_startTransfer
53#define EVE_Hal_endTransfer EVE_Hal_MPSSE_endTransfer
54#define EVE_Hal_transfer8 EVE_Hal_MPSSE_transfer8
55#define EVE_Hal_transfer16 EVE_Hal_MPSSE_transfer16
56#define EVE_Hal_transfer32 EVE_Hal_MPSSE_transfer32
57#define EVE_Hal_transferMem EVE_Hal_MPSSE_transferMem
58#define EVE_Hal_transferProgMem EVE_Hal_MPSSE_transferProgMem
59#define EVE_Hal_transferString EVE_Hal_MPSSE_transferString
60#define EVE_Hal_hostCommand EVE_Hal_MPSSE_hostCommand
61#define EVE_Hal_hostCommandExt3 EVE_Hal_MPSSE_hostCommandExt3
62#define EVE_Hal_powerCycle EVE_Hal_MPSSE_powerCycle
63#define EVE_UtilImpl_bootupDisplayGpio EVE_UtilImpl_MPSSE_bootupDisplayGpio
64#define EVE_Hal_setSPI EVE_Hal_MPSSE_setSPI
65#define EVE_Hal_restoreSPI EVE_Hal_MPSSE_restoreSPI
68#define LIBMPSSE_MAX_RD_BYTES_PER_CALL_IN_SINGLE_CH 65535
69#define LIBMPSSE_MAX_WR_BYTES_PER_CALL_IN_SINGLE_CH 65535
71#define LIBMPSSE_MAX_RD_BYTES_PER_CALL_IN_MULTI_CH 65535
72#define LIBMPSSE_MAX_WR_BYTES_PER_CALL_IN_MULTI_CH 65532
80bool s_SleepMitigated =
false;
103 if (s_SleepMitigated)
106 s_SleepMitigated =
false;
120 return s_NumChannels;
134 if (deviceIdx >= s_NumChannels)
160 if (deviceIdx >= s_NumChannels)
163 if (!phost->SpiHandle)
169 return phost->SpiHandle == chanInfo.
ftHandle;
181 bool res = deviceIdx >= 0 && deviceIdx < s_NumChannels;
190 for (i = 0; i < s_NumChannels; ++i)
206 parameters->MpsseChannelNo = deviceIdx & 0xFF;
208 parameters->SpiClockrateKHz = 12000;
217 parameters->SpiClockrateKHz = 2000;
236#ifdef EVE_MULTI_GRAPHICS_TARGET
237 phost->GpuDefs = &EVE_GpuDefs_FT80X;
241 channelConf.
ClockRate = parameters->SpiClockrateKHz * 1000;
244 channelConf.
Pin = 0x00000000;
246 phost->SpiClockrateKHz = parameters->SpiClockrateKHz;
247 phost->MpsseChannelNo = parameters->MpsseChannelNo;
252 phost->GpioHandle = phost->SpiHandle;
255 eve_printf_debug(
"SPI open channel failed %d %p\n", parameters->MpsseChannelNo, phost->SpiHandle);
261 eve_printf_debug(
"SPI init channel failed %d %p\n", parameters->MpsseChannelNo, phost->SpiHandle);
265 eve_printf_debug(
"\nhandle=0x%p status=0x%x\n", phost->SpiHandle, (
unsigned int)status);
278 phost->GpioHandle = NULL;
310 if (!s_SleepMitigated)
326 s_SleepMitigated =
true;
328 eve_printf_debug(
"Mitigating libMPSSE sleep issue (%u ms)\n", (
unsigned int)delta);
338 eve_printf_debug(
"MPSSE sleep issue may still persist (%u ms)\n", (
unsigned int)delta);
360 if (phost->GpioHandle != phost->SpiHandle)
363 phost->GpioHandle = NULL;
364 phost->SpiHandle = NULL;
385#if defined(EVE_BUFFER_WRITES)
423 while (sizeRemaining)
426 sizeRemaining -= sizeTransferred;
427 buffer += sizeTransferred;
429 if (status !=
FT_OK || !sizeTransferred)
431 eve_printf_debug(
"%d SPI_Read failed, sizeTransferred is %d with status %d\n", __LINE__, sizeTransferred, (
int)status);
451#if defined(EVE_BUFFER_WRITES)
452 if (
buffer && (size < (
sizeof(phost->SpiWrBuf) - phost->SpiWrBufIndex)))
455 memcpy(&phost->SpiWrBuf[phost->SpiWrBufIndex],
buffer, size);
456 phost->SpiWrBufIndex += size;
461 if (
buffer && phost->SpiWrBufIndex)
468 if (size <
sizeof(phost->SpiWrBuf))
472 if (
buffer || phost->SpiWrBufIndex)
484 size = phost->SpiWrBufIndex;
485 phost->SpiWrBufIndex = 0;
489 hrdpkt[0] = (
addr >> 16) | 0x80;
490 hrdpkt[1] = (
addr >> 8) & 0xFF;
491 hrdpkt[2] =
addr & 0xFF;
496 if ((status !=
FT_OK) || (sizeTransferred != 3))
498 eve_printf_debug(
"%d SPI_Write failed, sizeTransferred is %d with status %d\n", __LINE__, sizeTransferred, (
int)status);
499 if (sizeTransferred != 3)
504 sizeRemaining = size;
505 while (sizeRemaining)
507 uint32_t transferSize = min(0xFFFF, sizeRemaining);
510 sizeRemaining -= sizeTransferred;
511 buffer += sizeTransferred;
513 if (status !=
FT_OK || !sizeTransferred)
515 eve_printf_debug(
"%d SPI_Write failed, sizeTransferred is %d with status %d\n", __LINE__, sizeTransferred, (
int)status);
521 addr = incrementRamGAddr(phost,
addr, size);
522 phost->SpiRamGAddr =
addr;
531 while (sizeRemaining)
534 sizeRemaining -= sizeTransferred;
535 buffer += sizeTransferred;
537 if (status !=
FT_OK || !sizeTransferred)
539 eve_printf_debug(
"%d SPI_Write failed, sizeTransferred is %d with status %d\n", __LINE__, sizeTransferred, status);
560 wrBuffer(phost, &value,
sizeof(value));
564 rdBuffer(phost, &value,
sizeof(value));
569#if defined(EVE_BUFFER_WRITES)
580 if (phost->SpiWrBufIndex)
585#if !defined(EVE_SUPPORT_CMDB) || defined(EVE_MULTI_GRAPHICS_TARGET)
588 if (phost->SpiWpWritten)
590 phost->SpiWpWritten =
false;
592 phost->SpiWrBufIndex = 2;
593 phost->SpiWrBuf[0] = phost->SpiWpWrite & 0xFF;
594 phost->SpiWrBuf[1] = phost->SpiWpWrite >> 8;
612#if defined(EVE_BUFFER_WRITES)
628#if defined(EVE_BUFFER_WRITES)
631#if !defined(EVE_SUPPORT_CMDB) || defined(EVE_MULTI_GRAPHICS_TARGET)
633 phost->SpiWpWriting =
true;
638 else if (
addr != incrementRamGAddr(phost, phost->SpiRamGAddr, phost->SpiWrBufIndex) || rw ==
EVE_TRANSFER_READ)
642 phost->SpiRamGAddr =
addr;
651#if defined(EVE_BUFFER_WRITES)
656 transferArray[0] =
addr >> 16;
657 transferArray[1] =
addr >> 8;
658 transferArray[2] =
addr;
659 transferArray[3] = 0;
660 transferArray[4] = 0;
669#if defined(EVE_BUFFER_WRITES)
677 transferArray[0] = (0x80 | (
addr >> 16));
678 transferArray[1] =
addr >> 8;
679 transferArray[2] =
addr;
697#if defined(EVE_BUFFER_WRITES)
703#if defined(EVE_BUFFER_WRITES)
705 addr = phost->SpiRamGAddr;
725#if !defined(EVE_SUPPORT_CMDB) || defined(EVE_MULTI_GRAPHICS_TARGET)
728 phost->SpiWpWriting =
false;
756#if defined(EVE_BUFFER_WRITES)
757#if !defined(EVE_SUPPORT_CMDB) || defined(EVE_MULTI_GRAPHICS_TARGET)
777#if defined(EVE_BUFFER_WRITES)
778#if !defined(EVE_SUPPORT_CMDB) || defined(EVE_MULTI_GRAPHICS_TARGET)
781 if (phost->SpiWpWriting)
783 phost->SpiWpWrite = value;
784 phost->SpiWpWritten =
true;
815#if defined(EVE_BUFFER_WRITES)
816#if !defined(EVE_SUPPORT_CMDB) || defined(EVE_MULTI_GRAPHICS_TARGET)
834 buffer[1] = (value >> 8) & 0xFF;
835 buffer[2] = (value >> 16) & 0xFF;
855#if defined(EVE_BUFFER_WRITES)
856#if !defined(EVE_SUPPORT_CMDB) || defined(EVE_MULTI_GRAPHICS_TARGET)
892#if defined(EVE_BUFFER_WRITES)
893#if !defined(EVE_SUPPORT_CMDB) || defined(EVE_MULTI_GRAPHICS_TARGET)
938#if defined(EVE_BUFFER_WRITES)
939#if !defined(EVE_SUPPORT_CMDB) || defined(EVE_MULTI_GRAPHICS_TARGET)
954 char c = str[index + (transferred)];
961 if (transferred >= size)
963 buffer[transferred++] = 0;
968 while (transferred & padMask)
970 buffer[transferred++] = 0;
1005 transferArray[0] =
cmd;
1006 transferArray[1] = 0;
1007 transferArray[2] = 0;
1009#if defined(EVE_BUFFER_WRITES)
1026 transferArray[0] =
cmd;
1027 transferArray[1] = (
cmd >> 8) & 0xff;
1028 transferArray[2] = (
cmd >> 16) & 0xff;
1030#if defined(EVE_BUFFER_WRITES)
1048 transferArray[0] = 0;
1049 transferArray[1] = 0;
1050 transferArray[2] = 0;
1051 transferArray[3] = 0;
1052 transferArray[4] = 0xA5;
1053 transferArray[5] = gpio;
1054 transferArray[6] = val;
1055 transferArray[7] = 0xA5 ^ gpio ^ val;
1059#if defined(EVE_BUFFER_WRITES)
1068 }
while (ftRes ==
FT_OK && recvArray[1] != 0x5A && tries < 128);
1070 if (tries >= 128 && ftRes ==
FT_OK)
1093#if defined(EVE_BUFFER_WRITES)
1099 ftRes = EVE_HalImpl_passthroughGpio(phost, phost->
PowerDownPin & 0x7F, 0);
1100 else if (phost->GpioHandle == phost->SpiHandle)
1101 ftRes =
FT_WriteGPIO(phost->GpioHandle, pin | 0x3B, pwd0 | 0x08);
1103 ftRes =
FT_Write(phost->GpioHandle, &pwd0, 1, &written);
1111 ftRes = EVE_HalImpl_passthroughGpio(phost, phost->
PowerDownPin & 0x7F, 1);
1112 else if (phost->GpioHandle == phost->SpiHandle)
1113 ftRes =
FT_WriteGPIO(phost->GpioHandle, pin | 0x3B, pwd1 | 0x08);
1115 ftRes =
FT_Write(phost->GpioHandle, &pwd1, 1, &written);
1125 ftRes = EVE_HalImpl_passthroughGpio(phost, phost->
PowerDownPin & 0x7F, 1);
1126 else if (phost->GpioHandle == phost->SpiHandle)
1127 ftRes =
FT_WriteGPIO(phost->GpioHandle, pin | 0x3B, pwd1 | 0x08);
1129 ftRes =
FT_Write(phost->GpioHandle, &pwd1, 1, &written);
1137 ftRes = EVE_HalImpl_passthroughGpio(phost, phost->
PowerDownPin & 0x7F, 0);
1138 else if (phost->GpioHandle == phost->SpiHandle)
1139 ftRes =
FT_WriteGPIO(phost->GpioHandle, pin | 0x3B, pwd0 | 0x08);
1141 ftRes =
FT_Write(phost->GpioHandle, &pwd0, 1, &written);
1160#if defined(EVE_BUFFER_WRITES)
1168#if defined(EVE_BUFFER_WRITES)
static uint32_t wrBuffer(EVE_HalContext *phost, const void *buffer, uint32_t size, bool progmem, bool string)
Write buffer to Coprocessor's comand fifo.
#define EVE_CMD_STRING_MAX
#define strcpy_s(dst, sz, src)
#define eve_progmem_const
#define EVE_CMD_FIFO_SIZE
#define EVE_CMD_FIFO_MASK
EVE_HalPlatform g_HalPlatform
EVE_HAL_EXPORT bool EVE_Hal_powerCycle(EVE_HalContext *phost, bool up)
Toggle PD_N pin of FT800 board for a power cycle.
EVE_HAL_EXPORT uint8_t EVE_Hal_transfer8(EVE_HalContext *phost, uint8_t value)
Write 8 bits to Coprocessor.
EVE_HAL_EXPORT uint16_t EVE_Hal_transfer16(EVE_HalContext *phost, uint16_t value)
Write 2 bytes to Coprocessor.
EVE_HAL_EXPORT bool EVE_Hal_isDevice(EVE_HalContext *phost, size_t deviceIdx)
Check whether the context is the specified device.
EVE_HAL_EXPORT void EVE_Hal_info(EVE_DeviceInfo *deviceInfo, size_t deviceIdx)
Get info of the specified device. Devices of type EVE_HOST_UNKNOWN should be ignored.
EVE_HAL_EXPORT uint32_t EVE_millis()
Get clock in miliseond.
EVE_HAL_EXPORT void EVE_Hal_startTransfer(EVE_HalContext *phost, EVE_TRANSFER_T rw, uint32_t addr)
Start data transfer to Coprocessor.
EVE_HAL_EXPORT void EVE_Hal_hostCommand(EVE_HalContext *phost, uint8_t cmd)
Send a host command to Coprocessor.
EVE_HAL_EXPORT void EVE_Hal_setSPI(EVE_HalContext *phost, EVE_SPI_CHANNELS_T numchnls, uint8_t numdummy)
Set number of SPI channel.
EVE_HAL_EXPORT uint32_t EVE_Hal_transferString(EVE_HalContext *phost, const char *str, uint32_t index, uint32_t size, uint32_t padMask)
Transfer a string to EVE platform.
static bool EVE_Hal_supportCmdB(EVE_HalContext *phost)
EVE_HAL_EXPORT size_t EVE_Hal_list()
List the available devices.
EVE_HAL_EXPORT void EVE_Hal_transferMem(EVE_HalContext *phost, uint8_t *result, const uint8_t *buffer, uint32_t size)
Transfer (read/write) a block data to Coprocessor.
EVE_HAL_EXPORT void EVE_sleep(uint32_t ms)
Sleep in milisecond.
EVE_HAL_EXPORT void EVE_Hal_transferProgMem(EVE_HalContext *phost, uint8_t *result, eve_progmem_const uint8_t *buffer, uint32_t size)
Transfer a block data from program memory.
EVE_HAL_EXPORT void EVE_Hal_restoreSPI(EVE_HalContext *phost)
EVE_HAL_EXPORT void EVE_Hal_endTransfer(EVE_HalContext *phost)
End data transfer.
EVE_HAL_EXPORT void EVE_Hal_flush(EVE_HalContext *phost)
Flush data to Coprocessor.
EVE_HAL_EXPORT void EVE_Hal_hostCommandExt3(EVE_HalContext *phost, uint32_t cmd)
This API sends a 3byte command to the phost.
EVE_HAL_EXPORT uint32_t EVE_Hal_transfer32(EVE_HalContext *phost, uint32_t value)
Write 4 bytes to Coprocessor.
bool EVE_HalImpl_open(EVE_HalContext *phost, const EVE_HalParameters *parameters)
Opens a new HAL context using the specified parameters.
bool EVE_HalImpl_defaults(EVE_HalParameters *parameters, size_t deviceIdx)
Get the default configuration parameters.
void EVE_HalImpl_close(EVE_HalContext *phost)
Close a HAL context.
void EVE_HalImpl_initialize()
Initialize HAL platform.
bool EVE_UtilImpl_bootupDisplayGpio(EVE_HalContext *phost)
Display GPIO pins.
void EVE_HalImpl_idle(EVE_HalContext *phost)
Idle. Call regularly to update frequently changing internal state.
void EVE_HalImpl_release()
Release HAL platform.
static uint8_t transfer8(EVE_HalContext *phost, uint8_t value)
Write 8 bit to Coprocessor.
static void rdBuffer(EVE_HalContext *phost, uint8_t *buffer, uint32_t size)
Read a block data from Coprocessor.
static ft_uint32_t ft_uint8_t * buffer
static ft_void_t ft_uint32_t * cmd
#define FT_OPEN_BY_SERIAL_NUMBER
FTD2XX_API FT_STATUS WINAPI FT_ResetDevice(FT_HANDLE ftHandle)
FTD2XX_API FT_STATUS WINAPI FT_SetBitMode(FT_HANDLE ftHandle, UCHAR ucMask, UCHAR ucEnable)
FTD2XX_API FT_STATUS WINAPI FT_Close(FT_HANDLE ftHandle)
FTD2XX_API FT_STATUS WINAPI FT_OpenEx(PVOID pArg1, DWORD Flags, FT_HANDLE *pHandle)
FTD2XX_API FT_STATUS WINAPI FT_Write(FT_HANDLE ftHandle, LPVOID lpBuffer, DWORD dwBytesToWrite, LPDWORD lpBytesWritten)
#define FT_BITMODE_SYNC_BITBANG
FTDI_API FT_STATUS SPI_Write(FT_HANDLE handle, uint8 *buffer, uint32 sizeToTransfer, uint32 *sizeTransfered, uint32 options)
FTDI_API FT_STATUS SPI_GetNumChannels(uint32 *numChannels)
#define SPI_CONFIG_OPTION_CS_ACTIVELOW
#define SPI_CONFIG_OPTION_CS_DBUS3
FTDI_API FT_STATUS SPI_CloseChannel(FT_HANDLE handle)
#define SPI_CONFIG_OPTION_MODE0
#define SPI_TRANSFER_OPTIONS_CHIPSELECT_ENABLE
FTDI_API void Init_libMPSSE(void)
FTDI_API FT_STATUS SPI_InitChannel(FT_HANDLE handle, ChannelConfig *config)
FTDI_API FT_STATUS FT_WriteGPIO(FT_HANDLE handle, uint8 dir, uint8 value)
FTDI_API FT_STATUS SPI_Read(FT_HANDLE handle, uint8 *buffer, uint32 sizeToTransfer, uint32 *sizeTransfered, uint32 options)
FTDI_API FT_STATUS SPI_OpenChannel(uint32 index, FT_HANDLE *handle)
#define SPI_TRANSFER_OPTIONS_SIZE_IN_BYTES
FTDI_API void Cleanup_libMPSSE(void)
FTDI_API FT_STATUS SPI_GetChannelInfo(uint32 index, FT_DEVICE_LIST_INFO_NODE *chanInfo)
#define SPI_TRANSFER_OPTIONS_CHIPSELECT_DISABLE
FTDI_API FT_STATUS SPI_ToggleCS(FT_HANDLE handle, unsigned char state)
EVE_SPI_CHANNELS_T SpiChannels