slavefifo - прошивка для Cypress FX3, реализующая синхронный Slave FIFO интерфейс поверх GPIF II и USB vendor-specific устройства с четырьмя bulk endpoint-ами.
Прошивка поднимает FX3 как USB-устройство с четырьмя bulk endpoint-ами:
0x01- USB OUT #10x02- USB OUT #20x81- USB IN #10x82- USB IN #2
На стороне FX3 это собрано в четыре независимых тракта обмена между USB и PIB/GPIF:
| Канал | Направление | USB endpoint | UIB socket | PIB socket |
|---|---|---|---|---|
U2P1 |
Host -> FX3 -> external logic | 0x01 |
CY_U3P_UIB_SOCKET_PROD_1 |
CY_U3P_PIB_SOCKET_2 |
U2P2 |
Host -> FX3 -> external logic | 0x02 |
CY_U3P_UIB_SOCKET_PROD_2 |
CY_U3P_PIB_SOCKET_3 |
P2U1 |
external logic -> FX3 -> Host | 0x81 |
CY_U3P_UIB_SOCKET_CONS_1 |
CY_U3P_PIB_SOCKET_0 |
P2U2 |
external logic -> FX3 -> Host | 0x82 |
CY_U3P_UIB_SOCKET_CONS_2 |
CY_U3P_PIB_SOCKET_1 |
Практическая реализация этих четырёх трактов находится в следующих местах:
- cyfxslfifosync.h - определения endpoint-ов и socket-ов.
- cyfxslfifosync.c - создание четырёх manual DMA channels и запуск обмена.
- cyfxslfifousbdscr.c - USB descriptors с четырьмя endpoint-ами.
- cyfxgpif_syncsf.h - сгенерированная GPIF II state machine конфигурация.
CyFxSlFifoApplnStart() в cyfxslfifosync.c:
- сначала включаются четыре USB endpoint-а;
- затем создаются четыре
CY_U3P_DMA_TYPE_MANUALканала; - потом каждый канал привязывается к своей паре
USB socket <-> PIB socket; - после этого для всех четырёх каналов запускается бесконечный transfer через
CyU3PDmaChannelSetXfer(..., 0).
В репозитории лежат не только исходники прошивки, но и исходники GPIF-проекта:
- sync_slave_fifo_2bit.cydsn - актуальный GPIF II Designer проект.
- GPIFII_Designer_sync_SlaveFIFObackup.cydsn - backup/экспериментальный набор вариантов.
Важный момент: файл cyfxgpif_syncsf.h не пишется руками. Это generated header, который получается из GPIF II Designer проекта sync_slave_fifo_2bit.cyfx.
Нормальный цикл изменения GPIF-логики такой:
- Открыть GPIF Designer проект
sync_slave_fifo_2bit.cydsn/sync_slave_fifo_2bit.cyfx. - Изменить state machine, threads, timing или pin mapping.
- Сгенерировать новый GPIF header.
- Обновить cyfxgpif_syncsf.h в корне firmware-проекта.
- Пересобрать прошивку.
Это основной и рекомендуемый сценарий для данного проекта.
- Прошивка редактируется в исходниках этого репозитория.
- Проект открывается в Cypress FX3 SDK Eclipse environment.
- Eclipse собирает
SlaveFifoSync.elf. - Post-build вызывает
elf2img.exe, тот конвертирует ELF вSlaveFifoSync.img. - На выходе получается bootable image
SlaveFifoSync.img.
post-build:
-@echo 'Generate boot-loadable binary image'
-elf2img.exe -i SlaveFifoSync.elf -o SlaveFifoSync.img -vВ корне лежит makefile, который может собирать firmware через стандартную структуру FX3 SDK при корректно заданном FX3FWROOT.
Обычно для этого используют стандартные инструменты FX3 SDK, например Cypress Control Center / Programmer utility, в зависимости от того, как у вас устроен стенд:
- загрузка в RAM для отладки;
- запись в SPI flash для постоянной загрузки.
- cyfxslfifosync.c - основная логика firmware, USB callbacks, DMA channels, GPIF/USB init.
- cyfxslfifosync.h - параметры endpoint-ов, socket-ов, DMA и thread.
- cyfxslfifousbdscr.c - USB descriptors.
- cyfxgpif_syncsf.h - generated GPIF II configuration.
- cyfxtx.c - SDK runtime helper layer ThreadX / memory / exception handlers.
- cyfx_gcc_startup.S - startup code.
- sync_slave_fifo_2bit.cydsn - исходный GPIF II Designer проект.
- GPIFII_Designer_sync_SlaveFIFObackup.cydsn - backup GPIF variants.
- Debug - Eclipse generated build output.
- readme.txt - исходное краткое описание от Cypress example.
cyfxslfifosync.ccyfxslfifosync.hcyfxslfifousbdscr.cREADME.md- GPIF Designer project в
sync_slave_fifo_2bit.cydsn
Generated / служебные файлы:
cyfxgpif_syncsf.h- generated из.cyfxDebug/*- build output Eclipsereadme.txt- исходный vendor readme
- FX3 firmware проект;
- с практической 4-канальной схемой USB <-> PIB;
- с отдельным GPIF II Designer источником;
- с Eclipse build pipeline;
- и с последующей прошивкой устройства через готовый
.img.
Подобный синхронный Slave FIFO / USB <-> GPIF используется во многих практических системах, где нужен стабильный потоковый обмен между внешней логикой и USB-host: FPGA-узлы, измерительные стенды, регистраторы, специализированные контроллеры и прикладные GUI-комплексы.
See more GuiRNG: https://github.com/vdremine/GuiRNG.