image/svg+xml
Brteve's API for EveApps
Version 0.0.1
The reference document for common folder of EveApps project.
 
Loading...
Searching...
No Matches
EVE_HalImpl_BT8XXEMU.c
Go to the documentation of this file.
1
32#include "EVE_HalImpl.h"
33#include "EVE_Platform.h"
34#if defined(BT8XXEMU_PLATFORM)
35
36#if defined(EVE_MULTI_PLATFORM_TARGET)
37#define EVE_HalImpl_initialize EVE_HalImpl_BT8XXEMU_initialize
38#define EVE_HalImpl_release EVE_HalImpl_BT8XXEMU_release
39#define EVE_Hal_list EVE_Hal_BT8XXEMU_list
40#define EVE_Hal_info EVE_Hal_BT8XXEMU_info
41#define EVE_Hal_isDevice EVE_Hal_BT8XXEMU_isDevice
42#define EVE_HalImpl_defaults EVE_HalImpl_BT8XXEMU_defaults
43#define EVE_HalImpl_open EVE_HalImpl_BT8XXEMU_open
44#define EVE_HalImpl_close EVE_HalImpl_BT8XXEMU_close
45#define EVE_HalImpl_idle EVE_HalImpl_BT8XXEMU_idle
46#define EVE_Hal_flush EVE_Hal_BT8XXEMU_flush
47#define EVE_Hal_startTransfer EVE_Hal_BT8XXEMU_startTransfer
48#define EVE_Hal_endTransfer EVE_Hal_BT8XXEMU_endTransfer
49#define EVE_Hal_transfer8 EVE_Hal_BT8XXEMU_transfer8
50#define EVE_Hal_transfer16 EVE_Hal_BT8XXEMU_transfer16
51#define EVE_Hal_transfer32 EVE_Hal_BT8XXEMU_transfer32
52#define EVE_Hal_transferMem EVE_Hal_BT8XXEMU_transferMem
53#define EVE_Hal_transferProgMem EVE_Hal_BT8XXEMU_transferProgMem
54#define EVE_Hal_transferString EVE_Hal_BT8XXEMU_transferString
55#define EVE_Hal_hostCommand EVE_Hal_BT8XXEMU_hostCommand
56#define EVE_Hal_hostCommandExt3 EVE_Hal_BT8XXEMU_hostCommandExt3
57#define EVE_Hal_powerCycle EVE_Hal_BT8XXEMU_powerCycle
58#define EVE_UtilImpl_bootupDisplayGpio EVE_UtilImpl_BT8XXEMU_bootupDisplayGpio
59#define EVE_Hal_setSPI EVE_Hal_BT8XXEMU_setSPI
60#define EVE_Hal_restoreSPI EVE_Hal_BT8XXEMU_restoreSPI
61#endif
62
63#include <bt8xxemu.h>
64
65/*********
66** INIT **
67*********/
68
69#if defined(ESD_SIMULATION)
70void Esd_MainReady__ESD(BT8XXEMU_Emulator *emulator);
71#endif
72
73static int s_EmulatorSerial = 0;
76
82{
83 // TODO: g_HalPlatform.TotalDevices = 1;
84}
85
91{
92 /* no-op */
93}
94
100size_t EVE_Hal_list()
101{
102 return 1;
103}
104
111void EVE_Hal_info(EVE_DeviceInfo *deviceInfo, size_t deviceIdx)
112{
113 memset(deviceInfo, 0, sizeof(EVE_DeviceInfo));
114 strcpy_s(deviceInfo->DisplayName, sizeof(deviceInfo->DisplayName), "BT8XX Emulator");
115 sprintf_s(deviceInfo->SerialNumber, sizeof(deviceInfo->SerialNumber), "BT8XXEMU_%i", ++s_EmulatorSerial);
116 s_EmulatorSerial &= 0xFFFF;
117 deviceInfo->Opened = false; // Emulator can be opened multiple times
118 deviceInfo->Host = EVE_HOST_BT8XXEMU;
119}
120
128bool EVE_Hal_isDevice(EVE_HalContext *phost, size_t deviceIdx)
129{
130 if (!phost)
131 return false;
132 if (EVE_HOST != EVE_HOST_BT8XXEMU)
133 return false;
134 return true;
135}
136
144bool EVE_HalImpl_defaults(EVE_HalParameters *parameters, size_t deviceIdx)
145{
146 parameters->EmulatorMode = EVE_BT817;
147 return true;
148}
149
158bool EVE_HalImpl_open(EVE_HalContext *phost, const EVE_HalParameters *parameters)
159{
160 bool ret;
161 const BT8XXEMU_EmulatorParameters *origParams;
163 const BT8XXEMU_FlashParameters *origFlashParams;
164
165 origParams = parameters->EmulatorParameters;
166 if (origParams)
167 {
168 // Copy
169 params = malloc(sizeof(BT8XXEMU_EmulatorParameters));
170 if (!params)
171 return false;
172 memcpy(params, origParams, sizeof(BT8XXEMU_EmulatorParameters));
173 }
174 else
175 {
176 // Make defaults
177 params = malloc(sizeof(BT8XXEMU_EmulatorParameters));
178 if (!params)
179 return false;
180 BT8XXEMU_defaults(BT8XXEMU_VERSION_API, params, EVE_shortChipId(parameters->EmulatorMode));
181 params->Flags &= (~BT8XXEMU_EmulatorEnableDynamicDegrade & ~BT8XXEMU_EmulatorEnableRegPwmDutyEmulation);
182 }
183#ifdef ESD_SIMULATION
184 params->Flags &= ~BT8XXEMU_EmulatorEnableHSFPreview;
185#endif
186 phost->EmulatorParameters = params;
187
188 if (!params->Mode)
189 {
190 free(params);
191 phost->EmulatorParameters = NULL;
192 return false;
193 }
194
195#ifdef EVE_MULTI_GRAPHICS_TARGET
196 if (params->Mode >= BT8XXEMU_EmulatorBT815)
197 phost->GpuDefs = &EVE_GpuDefs_BT81X;
198 else if (params->Mode >= BT8XXEMU_EmulatorBT880)
199 phost->GpuDefs = &EVE_GpuDefs_BT88X;
200 else if (params->Mode >= BT8XXEMU_EmulatorFT810)
201 phost->GpuDefs = &EVE_GpuDefs_FT81X;
202 else
203 phost->GpuDefs = &EVE_GpuDefs_FT80X;
204 phost->ChipId = EVE_extendedChipId(params->Mode);
205#endif
206
207#if defined(EVE_EMULATOR_MAIN)
208 phost->Emulator = EVE_GpuEmu;
209 phost->EmulatorFlash = EVE_EmuFlash;
210 origFlashParams = NULL;
211#else
212 origFlashParams = parameters->EmulatorFlashParameters;
213 if (origFlashParams)
214 {
215 // Create
216 phost->EmulatorFlash = BT8XXEMU_Flash_create(BT8XXEMU_VERSION_API, origFlashParams);
217 params->Flash = phost->EmulatorFlash;
218 }
219 BT8XXEMU_run(BT8XXEMU_VERSION_API, &phost->Emulator, params);
220#endif
221
222#if defined(ESD_SIMULATION)
223 Esd_MainReady__ESD(phost->Emulator);
224#endif
225
226 ret = !!phost->Emulator;
227 if (ret)
228 {
229 phost->Status = EVE_STATUS_OPENED;
231 }
232 else
233 {
234 free(params);
235 phost->EmulatorParameters = NULL;
236 }
237 return ret;
238}
239
246{
247#if !defined(EVE_EMULATOR_MAIN)
248 // Release emulator
249 if (phost->Emulator)
250 {
251 BT8XXEMU_stop(phost->Emulator);
252 BT8XXEMU_destroy(phost->Emulator);
253 }
254 phost->Emulator = NULL;
255
256 // Release flash
257 if (phost->EmulatorFlash)
258 {
259 BT8XXEMU_Flash_destroy(phost->EmulatorFlash);
260 }
261 phost->EmulatorFlash = NULL;
262
263 // Release emulator parameters
264 if (phost->EmulatorParameters)
265 {
266 free(phost->EmulatorParameters);
267 phost->EmulatorParameters = NULL;
268 }
269#else
270 phost->Emulator = NULL;
271 phost->EmulatorFlash = NULL;
272#endif
273
274 phost->Status = EVE_STATUS_CLOSED;
276}
277
284{
285 /* no-op */
286}
288
289/*************
290** TRANSFER **
291*************/
292
295
304{
306
307 if (rw == EVE_TRANSFER_READ)
308 {
309 BT8XXEMU_chipSelect(phost->Emulator, 1);
310 BT8XXEMU_transfer(phost->Emulator, (addr >> 16) & 0xFF);
311 BT8XXEMU_transfer(phost->Emulator, (addr >> 8) & 0xFF);
312 BT8XXEMU_transfer(phost->Emulator, addr & 0xFF);
313 BT8XXEMU_transfer(phost->Emulator, 0); // Dummy Read Byte
314 phost->Status = EVE_STATUS_READING;
315 }
316 else
317 {
318 BT8XXEMU_chipSelect(phost->Emulator, 1);
319 BT8XXEMU_transfer(phost->Emulator, ((addr >> 16) & 0xFF) | 0x80);
320 BT8XXEMU_transfer(phost->Emulator, (addr >> 8) & 0xFF);
321 BT8XXEMU_transfer(phost->Emulator, addr & 0xFF);
322 phost->Status = EVE_STATUS_WRITING;
323 }
324}
325
332{
334
335 BT8XXEMU_chipSelect(phost->Emulator, 0);
336 phost->Status = EVE_STATUS_OPENED;
337}
338
344void EVE_Hal_flush(EVE_HalContext *phost)
345{
347 /* no-op */
348}
349
357static inline uint8_t transfer8(EVE_HalContext *phost, uint8_t value)
358{
359 return BT8XXEMU_transfer(phost->Emulator, value);
360}
361
370{
371 return transfer8(phost, value);
372}
373
382{
383 uint16_t retVal = 0;
384 retVal = transfer8(phost, value & 0xFF);
385 retVal |= (uint16_t)transfer8(phost, (value >> 8) & 0xFF) << 8;
386 return retVal;
387}
388
397{
398 uint32_t retVal = 0;
399 retVal = transfer8(phost, value & 0xFF);
400 retVal |= (uint32_t)transfer8(phost, (value >> 8) & 0xFF) << 8;
401 retVal |= (uint32_t)transfer8(phost, (value >> 16) & 0xFF) << 16;
402 retVal |= (uint32_t)transfer8(phost, value >> 24) << 24;
403 return retVal;
404}
405
414void EVE_Hal_transferMem(EVE_HalContext *phost, uint8_t *result, const uint8_t *buffer, uint32_t size)
415{
416 uint32_t i;
417 if (result && buffer)
418 {
419 for (i = 0; i < size; ++i)
420 result[i] = transfer8(phost, buffer[i]);
421 }
422 else if (result)
423 {
424 for (i = 0; i < size; ++i)
425 result[i] = transfer8(phost, 0);
426 }
427 else if (buffer)
428 {
429 for (i = 0; i < size; ++i)
430 transfer8(phost, buffer[i]);
431 }
432}
433
443{
444 uint32_t i;
445 if (result && buffer)
446 {
447 for (i = 0; i < size; ++i)
448 result[i] = transfer8(phost, buffer[i]);
449 }
450 else if (result)
451 {
452 for (i = 0; i < size; ++i)
453 result[i] = transfer8(phost, 0);
454 }
455 else if (buffer)
456 {
457 for (i = 0; i < size; ++i)
458 transfer8(phost, buffer[i]);
459 }
460}
461
472uint32_t EVE_Hal_transferString(EVE_HalContext *phost, const char *str, uint32_t index, uint32_t size, uint32_t padMask)
473{
474 uint32_t transferred;
475
476 if (!size)
477 {
478 /* TODO: Support different padding options */
479 eve_assert(padMask == 0x3);
480 EVE_Hal_transfer32(phost, 0);
481 return 4;
482 }
483
485#if 1
486 // BT8XXEMU
487 transferred = 0;
488 if (phost->Status == EVE_STATUS_WRITING)
489 {
490 for (;;)
491 {
492 char c = str[index + (transferred++)];
493 transfer8(phost, c);
494 if (!c)
495 {
496 break;
497 }
498 if (transferred >= size)
499 {
500 ++transferred;
501 transfer8(phost, 0);
502 break;
503 }
504 }
505 while (transferred & padMask)
506 {
507 ++transferred;
508 transfer8(phost, 0);
509 }
510 }
511 else
512 {
513 /* not implemented */
515 }
516 return transferred;
517#elif 1
518 // FT4222
519 uint32_t transferred = 0;
520 if (phost->Status == EVE_STATUS_WRITING)
521 {
523
524 for (;;)
525 {
526 char c = str[index + (transferred)];
527 buffer[transferred++] = c;
528 // putchar(c ? c : '_');
529 if (!c)
530 {
531 break;
532 }
533 if (transferred >= size)
534 {
535 buffer[transferred++] = 0;
536 // putchar('_');
537 break;
538 }
539 }
540 while (transferred & padMask)
541 {
542 buffer[transferred++] = 0;
543 // putchar('_');
544 }
545
546 eve_assert(transferred);
547
548 EVE_Hal_transferMem(phost, NULL, buffer, transferred);
549 }
550 else
551 {
552 /* not implemented */
554 }
555 return transferred;
556#else
557 // FT900
558 uint32_t transferred = 0;
559 if (phost->Status == EVE_STATUS_WRITING)
560 {
561 transferred += (uint32_t)strnlen(str, size) + 1;
562 eve_assert(str[transferred - 1] == '\0');
563 EVE_Hal_transferMem(phost, NULL, str, transferred);
564 if (transferred & padMask)
565 {
566 uint32_t pad = 4 - (transferred & padMask);
567 uint8_t padding[4] = { 0 };
568 EVE_Hal_transferMem(phost, NULL, padding, pad);
569 transferred += pad;
570 eve_assert(!(transferred & 0x3));
571 }
572 }
573 else
574 {
575 /* not implemented */
577 }
578 return transferred;
579#endif
580}
582
583/************
584** UTILITY **
585************/
586
589
597{
598 /* no-op */
599}
600
608{
609 /* no-op */
610}
611
618bool EVE_Hal_powerCycle(EVE_HalContext *phost, bool up)
619{
620#if !defined(EVE_EMULATOR_MAIN)
622
623 // ESD would need to call MainReady__ESD again...
624 // TODO: Implement powercycle in BT8XXEMU
625 if (up)
626 {
627 if (phost->Emulator)
628 {
629 BT8XXEMU_stop(phost->Emulator);
630 BT8XXEMU_destroy(phost->Emulator);
631 phost->Emulator = NULL;
632 }
633
634 params = phost->EmulatorParameters;
635 BT8XXEMU_run(BT8XXEMU_VERSION_API, &phost->Emulator, params);
636
637 return phost->Emulator;
638 }
639 else
640 {
641 if (!phost->Emulator)
642 {
643 params = phost->EmulatorParameters;
644 BT8XXEMU_run(BT8XXEMU_VERSION_API, &phost->Emulator, params);
645 }
646
647 BT8XXEMU_stop(phost->Emulator);
648 BT8XXEMU_destroy(phost->Emulator);
649 phost->Emulator = NULL;
650
651 return true;
652 }
653#endif
654}
655
663void EVE_Hal_setSPI(EVE_HalContext *phost, EVE_SPI_CHANNELS_T numchnls, uint8_t numdummy)
664{
665 /* no-op */
666}
667
674{
675 /* no-op */
676}
678
679/*********
680** MISC **
681*********/
682
685
694{
695 /* no-op */
696 return true;
697}
699
700#endif /* #if defined(BT8XXEMU_PLATFORM) */
701
702/* end of file */
static uint32_t c
Definition Common.c:38
#define EVE_CMD_STRING_MAX
Definition EVE_Cmd.h:44
#define EVE_BT817
Definition EVE_Config.h:68
#define strcpy_s(dst, sz, src)
#define eve_progmem_const
EVE_SPI_CHANNELS_T
EVE_HalPlatform g_HalPlatform
Definition EVE_Hal.c:43
EVE_HAL_EXPORT bool EVE_Hal_powerCycle(EVE_HalContext *phost, bool up)
Toggle PD_N pin of FT800 board for a power cycle.
@ EVE_STATUS_READING
Definition EVE_HalDefs.h:59
@ EVE_STATUS_CLOSED
Definition EVE_HalDefs.h:57
@ EVE_STATUS_OPENED
Definition EVE_HalDefs.h:58
@ EVE_STATUS_WRITING
Definition EVE_HalDefs.h:60
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_TRANSFER_T
Definition EVE_HalDefs.h:65
@ EVE_TRANSFER_READ
Definition EVE_HalDefs.h:67
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.
@ EVE_HOST_BT8XXEMU
static int EVE_shortChipId(EVE_CHIPID_T chipId)
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.
static EVE_CHIPID_T EVE_extendedChipId(int chipId)
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.
Eve_Hal framework APIs.
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.
unsigned short uint16_t
unsigned int uint32_t
unsigned char uint8_t
Platform selector.
#define eve_assert(cond)
#define eve_debug_break()
static ft_uint32_t ft_uint8_t * buffer
Definition FT_Gpu_Hal.h:139
static ft_void_t ft_uint32_t * cmd
Definition FT_Gpu_Hal.h:184
static ft_uint32_t addr
Definition FT_Gpu_Hal.h:139
BT8XX Emulator Library.
BT8XXEMU_API void BT8XXEMU_defaults(uint32_t versionApi, BT8XXEMU_EmulatorParameters *params, BT8XXEMU_EmulatorMode mode)
#define BT8XXEMU_VERSION_API
Definition bt8xxemu.h:52
BT8XXEMU_API void BT8XXEMU_stop(BT8XXEMU_Emulator *emulator)
BT8XXEMU_API void BT8XXEMU_Flash_destroy(BT8XXEMU_Flash *flash)
BT8XXEMU_API BT8XXEMU_Flash * BT8XXEMU_Flash_create(uint32_t versionApi, const BT8XXEMU_FlashParameters *params)
@ BT8XXEMU_EmulatorBT880
Definition bt8xxemu.h:118
@ BT8XXEMU_EmulatorBT815
Definition bt8xxemu.h:122
@ BT8XXEMU_EmulatorFT810
Definition bt8xxemu.h:114
BT8XXEMU_API uint8_t BT8XXEMU_transfer(BT8XXEMU_Emulator *emulator, uint8_t data)
BT8XXEMU_API void BT8XXEMU_destroy(BT8XXEMU_Emulator *emulator)
BT8XXEMU_API void BT8XXEMU_chipSelect(BT8XXEMU_Emulator *, int cs)
void BT8XXEMU_Emulator
Definition bt8xxemu.h:98
BT8XXEMU_API void BT8XXEMU_run(uint32_t versionApi, BT8XXEMU_Emulator **emulator, const BT8XXEMU_EmulatorParameters *params)
BT8XXEMU_EmulatorMode Mode
Definition bt8xxemu.h:184
BT8XXEMU_Flash * Flash
Definition bt8xxemu.h:239
char DisplayName[256]
char SerialNumber[16]
EVE_HOST_T Host
EVE_STATUS_T Status
uint32_t OpenedDevices