34#if defined(FT4222_PLATFORM)
36#if defined(EVE_MULTI_PLATFORM_TARGET)
37#define EVE_HalImpl_initialize EVE_HalImpl_FT4222_initialize
38#define EVE_HalImpl_release EVE_HalImpl_FT4222_release
39#define EVE_Hal_list EVE_Hal_FT4222_list
40#define EVE_Hal_info EVE_Hal_FT4222_info
41#define EVE_Hal_isDevice EVE_Hal_FT4222_isDevice
42#define EVE_HalImpl_defaults EVE_HalImpl_FT4222_defaults
43#define EVE_HalImpl_open EVE_HalImpl_FT4222_open
44#define EVE_HalImpl_close EVE_HalImpl_FT4222_close
45#define EVE_HalImpl_idle EVE_HalImpl_FT4222_idle
46#define EVE_Hal_flush EVE_Hal_FT4222_flush
47#define EVE_Hal_startTransfer EVE_Hal_FT4222_startTransfer
48#define EVE_Hal_endTransfer EVE_Hal_FT4222_endTransfer
49#define EVE_Hal_transfer8 EVE_Hal_FT4222_transfer8
50#define EVE_Hal_transfer16 EVE_Hal_FT4222_transfer16
51#define EVE_Hal_transfer32 EVE_Hal_FT4222_transfer32
52#define EVE_Hal_transferMem EVE_Hal_FT4222_transferMem
53#define EVE_Hal_transferProgMem EVE_Hal_FT4222_transferProgMem
54#define EVE_Hal_transferString EVE_Hal_FT4222_transferString
55#define EVE_Hal_hostCommand EVE_Hal_FT4222_hostCommand
56#define EVE_Hal_hostCommandExt3 EVE_Hal_FT4222_hostCommandExt3
57#define EVE_Hal_powerCycle EVE_Hal_FT4222_powerCycle
58#define EVE_UtilImpl_bootupDisplayGpio EVE_UtilImpl_FT4222_bootupDisplayGpio
59#define EVE_Hal_setSPI EVE_Hal_FT4222_setSPI
60#define EVE_Hal_restoreSPI EVE_Hal_FT4222_restoreSPI
63#define FT4222_TRANSFER_SIZE_MAX (0xFFFF)
64#define FT4222_WRITE_HEADER_SIZE (3)
65#define FT4222_WRITE_SIZE_MAX (FT4222_TRANSFER_SIZE_MAX - FT4222_WRITE_HEADER_SIZE)
67#define FT4222_READ_TIMEOUT (5000)
68#define FT4222_WRITE_TIMEOUT (5000)
70#define FT4222_LATENCY_TIME (2)
134 return s_NumDevsD2XX;
148 if (deviceIdx >= s_NumDevsD2XX)
180 if (deviceIdx >= s_NumDevsD2XX)
183 if (!phost->SpiHandle)
192 return phost->SpiHandle == devInfo.
ftHandle;
205 bool res = deviceIdx >= 0 && deviceIdx < s_NumDevsD2XX;
215 for (i = 0; i < s_NumDevsD2XX; ++i)
235 parameters->SpiClockrateKHz = 12000;
294 if (parameters->SpiClockrateKHz <= 5000)
299 phost->SpiClockrateKHz = 5000;
301 else if (parameters->SpiClockrateKHz <= 10000)
306 phost->SpiClockrateKHz = 10000;
308 else if (parameters->SpiClockrateKHz <= 15000)
314 phost->SpiClockrateKHz = 15000;
316 else if (parameters->SpiClockrateKHz <= 20000)
321 phost->SpiClockrateKHz = 20000;
329 phost->SpiClockrateKHz = 30000;
331 eve_printf_debug(
"User Selected SPI clk : %d KHz\n", (
int)parameters->SpiClockrateKHz);
332 eve_printf_debug(
"Configured clk : %d KHz, Ft4222 sys clk enum = %d , divisor enum = %d\n", (
int)phost->SpiClockrateKHz, *sysclk, *sysdivisor);
361 phost->SpiHandle = phost->GpioHandle = NULL;
363#ifdef EVE_MULTI_GRAPHICS_TARGET
364 phost->GpuDefs = &EVE_GpuDefs_FT80X;
367 memset(&devInfoA, 0,
sizeof(devInfoA));
385 for (deviceIdxB = deviceIdxA + 1; deviceIdxB < s_NumDevsD2XX; ++deviceIdxB)
387 memset(&devInfoB, 0,
sizeof(devInfoB));
396 if (deviceIdxB >= s_NumDevsD2XX)
410 status =
FT_Open(deviceIdxA, &phost->SpiHandle);
414 phost->SpiHandle = NULL;
421 status =
FT_Open(deviceIdxB, &phost->GpioHandle);
426 phost->GpioHandle = NULL;
427 phost->SpiHandle = NULL;
444 status =
FT_SetTimeouts(phost->SpiHandle, FT4222_READ_TIMEOUT, FT4222_WRITE_TIMEOUT);
465 if (!computeCLK(phost, &selclk, &seldiv, parameters))
467 eve_printf_debug(
"Requested clock %d KHz is not supported in FT4222\n", parameters->SpiClockrateKHz);
638 if (size <= FT4222_TRANSFER_SIZE_MAX)
641 bytesPerRead = FT4222_TRANSFER_SIZE_MAX;
657 eve_printf_debug(
"FT4222_SPIMaster_SingleWrite failed, sizeTransferred is %d with status %d\n", sizeWritten, status);
670 if ((status !=
FT4222_OK) || (sizeRead != bytesPerRead))
672 eve_printf_debug(
"FT4222_SPIMaster_SingleRead failed,sizeTransferred is %d with status %d\n", sizeRead, status);
673 if (sizeRead != bytesPerRead)
678 sizeTransferred = sizeRead;
691 if ((status !=
FT4222_OK) || (sizeTransferred != bytesPerRead))
693 eve_printf_debug(
"FT4222_SPIMaster_MultiReadWrite failed, sizeTransferred is %d with status %d\n", sizeTransferred, status);
694 if (sizeTransferred != bytesPerRead)
700 buffer += sizeTransferred;
703 eve_assert_ex(sizeTransferred <= size,
"Cannot have transferred more than size\n");
704 size -= sizeTransferred;
710 addr += sizeTransferred;
713 phost->SpiRamGAddr =
addr;
733 if (
buffer && (size < (
sizeof(phost->SpiWrBuf) - phost->SpiWrBufIndex - FT4222_WRITE_HEADER_SIZE)))
736 memcpy(&phost->SpiWrBuf[phost->SpiWrBufIndex + FT4222_WRITE_HEADER_SIZE],
buffer, size);
737 phost->SpiWrBufIndex += size;
742 if (
buffer && phost->SpiWrBufIndex)
749 if (size < (
sizeof(phost->SpiWrBuf) - FT4222_WRITE_HEADER_SIZE))
753 if (
buffer || phost->SpiWrBufIndex)
761 size = phost->SpiWrBufIndex;
762 phost->SpiWrBufIndex = 0;
770 if (size <= FT4222_WRITE_SIZE_MAX)
771 bytesPerWrite = size + FT4222_WRITE_HEADER_SIZE;
773 bytesPerWrite = FT4222_TRANSFER_SIZE_MAX;
778 memcpy(phost->SpiWrBuf + FT4222_WRITE_HEADER_SIZE,
buffer, (bytesPerWrite - FT4222_WRITE_HEADER_SIZE));
782 phost->SpiWrBuf[0] = (
addr >> 16) | 0x80;
783 phost->SpiWrBuf[1] = (
addr >> 8) & 0xFF;
784 phost->SpiWrBuf[2] =
addr & 0xFF;
797 if ((status !=
FT4222_OK) || (sizeWritten != bytesPerWrite))
799 eve_printf_debug(
"%d FT4222_SPIMaster_SingleWrite failed, sizeTransferred is %d with status %d\n", __LINE__, sizeWritten, status);
800 if (sizeWritten != bytesPerWrite)
805 sizeTransferred = sizeWritten;
822 eve_printf_debug(
"FT4222_SPIMaster_MultiReadWrite failed, status %d\n", status);
826 sizeTransferred = bytesPerWrite;
831 buffer += sizeTransferred - FT4222_WRITE_HEADER_SIZE;
835 eve_assert_ex((sizeTransferred - FT4222_WRITE_HEADER_SIZE) <= (
int32_t)size,
"Cannot have transferred more than size\n");
836 size -= sizeTransferred - FT4222_WRITE_HEADER_SIZE;
840 addr = incrementRamGAddr(phost,
addr, (sizeTransferred - FT4222_WRITE_HEADER_SIZE));
841 phost->SpiRamGAddr =
addr;
863#if !defined(EVE_SUPPORT_CMDB) || defined(EVE_MULTI_GRAPHICS_TARGET)
864 phost->SpiWpWriting =
true;
869 else if (
addr != incrementRamGAddr(phost, phost->SpiRamGAddr, phost->SpiWrBufIndex) || rw ==
EVE_TRANSFER_READ)
873 phost->SpiRamGAddr =
addr;
897 addr = phost->SpiRamGAddr;
905#if !defined(EVE_SUPPORT_CMDB) || defined(EVE_MULTI_GRAPHICS_TARGET)
908 phost->SpiWpWriting =
false;
926 if (phost->SpiWrBufIndex)
931#if !defined(EVE_SUPPORT_CMDB) || defined(EVE_MULTI_GRAPHICS_TARGET)
934 if (phost->SpiWpWritten)
936 phost->SpiWpWritten =
false;
938 phost->SpiWrBufIndex = 2;
939 phost->SpiWrBuf[FT4222_WRITE_HEADER_SIZE + 0] = phost->SpiWpWrite & 0xFF;
940 phost->SpiWrBuf[FT4222_WRITE_HEADER_SIZE + 1] = phost->SpiWpWrite >> 8;
969#if defined(EVE_BUFFER_WRITES)
970#if !defined(EVE_SUPPORT_CMDB) || defined(EVE_MULTI_GRAPHICS_TARGET)
999#if defined(EVE_BUFFER_WRITES)
1000#if !defined(EVE_SUPPORT_CMDB) || defined(EVE_MULTI_GRAPHICS_TARGET)
1003 if (phost->SpiWpWriting)
1005 phost->SpiWpWrite = value;
1006 phost->SpiWpWritten =
true;
1020 buffer[0] = value & 0xFF;
1037#if defined(EVE_BUFFER_WRITES)
1038#if !defined(EVE_SUPPORT_CMDB) || defined(EVE_MULTI_GRAPHICS_TARGET)
1055 buffer[0] = value & 0xFF;
1056 buffer[1] = (value >> 8) & 0xFF;
1057 buffer[2] = (value >> 16) & 0xFF;
1077#if defined(EVE_BUFFER_WRITES)
1078#if !defined(EVE_SUPPORT_CMDB) || defined(EVE_MULTI_GRAPHICS_TARGET)
1114#if defined(EVE_BUFFER_WRITES)
1115#if !defined(EVE_SUPPORT_CMDB) || defined(EVE_MULTI_GRAPHICS_TARGET)
1160#if defined(EVE_BUFFER_WRITES)
1161#if !defined(EVE_SUPPORT_CMDB) || defined(EVE_MULTI_GRAPHICS_TARGET)
1176 char c = str[index + (transferred)];
1183 if (transferred >= size)
1185 buffer[transferred++] = 0;
1190 while (transferred & padMask)
1192 buffer[transferred++] = 0;
1234 transferArray[0] =
cmd;
1235 transferArray[1] = 0;
1236 transferArray[2] = 0;
1245 sizeof(transferArray),
1262 sizeof(transferArray),
1293 transferArray[0] =
cmd;
1294 transferArray[1] = (
cmd >> 8) & 0xff;
1295 transferArray[2] = (
cmd >> 16) & 0xff;
1303 sizeof(transferArray),
1321 sizeof(transferArray),
1359 eve_printf_debug(
"FT4222_SPIMaster_SetLines failed with status %d\n", ftstatus);
1443 writebyte = numchnls;
1449 setSPI(phost, numchnls, numdummy);
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_SPI_TWO_DUMMY_BYTES
EVE_HalPlatform g_HalPlatform
EVE_HAL_EXPORT void EVE_Hal_wr8(EVE_HalContext *phost, uint32_t addr, uint8_t v)
Write 8 bits to Coprocessor's memory.
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 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.
void setSPI(EVE_HalContext *phost, EVE_SPI_CHANNELS_T numchnls, uint8_t numdummy)
Set number of SPI channel.
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
LIBFT4222_API FT4222_STATUS FT4222_SPIMaster_MultiReadWrite(FT_HANDLE ftHandle, uint8 *readBuffer, uint8 *writeBuffer, uint8 singleWriteBytes, uint16 multiWriteBytes, uint16 multiReadBytes, uint32 *sizeOfRead)
LIBFT4222_API FT4222_STATUS FT4222_SPIMaster_SetLines(FT_HANDLE ftHandle, FT4222_SPIMode spiMode)
LIBFT4222_API FT4222_STATUS FT4222_UnInitialize(FT_HANDLE ftHandle)
LIBFT4222_API FT4222_STATUS FT4222_SetWakeUpInterrupt(FT_HANDLE ftHandle, BOOL enable)
LIBFT4222_API FT4222_STATUS FT4222_SetSuspendOut(FT_HANDLE ftHandle, BOOL enable)
LIBFT4222_API FT4222_STATUS FT4222_SPIMaster_Init(FT_HANDLE ftHandle, FT4222_SPIMode ioLine, FT4222_SPIClock clock, FT4222_SPICPOL cpol, FT4222_SPICPHA cpha, uint8 ssoMap)
LIBFT4222_API FT4222_STATUS FT4222_GetVersion(FT_HANDLE ftHandle, FT4222_Version *pVersion)
LIBFT4222_API FT4222_STATUS FT4222_SPIMaster_SingleRead(FT_HANDLE ftHandle, uint8 *buffer, uint16 bufferSize, uint16 *sizeOfRead, BOOL isEndTransaction)
LIBFT4222_API FT4222_STATUS FT4222_SPIMaster_SingleWrite(FT_HANDLE ftHandle, uint8 *buffer, uint16 bufferSize, uint16 *sizeTransferred, BOOL isEndTransaction)
LIBFT4222_API FT4222_STATUS FT4222_SetClock(FT_HANDLE ftHandle, FT4222_ClockRate clk)
LIBFT4222_API FT4222_STATUS FT4222_SPI_SetDrivingStrength(FT_HANDLE ftHandle, SPI_DrivingStrength clkStrength, SPI_DrivingStrength ioStrength, SPI_DrivingStrength ssoStrength)
LIBFT4222_API FT4222_STATUS FT4222_GPIO_Write(FT_HANDLE ftHandle, GPIO_Port portNum, BOOL bValue)
LIBFT4222_API FT4222_STATUS FT4222_GetClock(FT_HANDLE ftHandle, FT4222_ClockRate *clk)
LIBFT4222_API FT4222_STATUS FT4222_GPIO_Init(FT_HANDLE ftHandle, GPIO_Dir gpioDir[4])
FTD2XX_API FT_STATUS WINAPI FT_SetLatencyTimer(FT_HANDLE ftHandle, UCHAR ucLatency)
FTD2XX_API FT_STATUS WINAPI FT_Open(int deviceNumber, FT_HANDLE *pHandle)
FTD2XX_API FT_STATUS WINAPI FT_Close(FT_HANDLE ftHandle)
FTD2XX_API FT_STATUS WINAPI FT_SetTimeouts(FT_HANDLE ftHandle, ULONG ReadTimeout, ULONG WriteTimeout)
FTD2XX_API FT_STATUS WINAPI FT_GetDeviceInfoDetail(DWORD dwIndex, LPDWORD lpdwFlags, LPDWORD lpdwType, LPDWORD lpdwID, LPDWORD lpdwLocId, LPVOID lpSerialNumber, LPVOID lpDescription, FT_HANDLE *pftHandle)
FTD2XX_API FT_STATUS WINAPI FT_CreateDeviceInfoList(LPDWORD lpdwNumDevs)
EVE_SPI_CHANNELS_T SpiChannels