/fx3_firmware/bladeRF.c

https://github.com/tbranyen/bladeRF · C · 1104 lines · 810 code · 184 blank · 110 comment · 193 complexity · 178f0a40bd94c3ecd4974f6293895745 MD5 · raw file

  1. /*
  2. * bladeRF FX3 firmware (bladeRF.c)
  3. */
  4. #include "cyu3system.h"
  5. #include "cyu3os.h"
  6. #include "cyu3dma.h"
  7. #include "cyu3error.h"
  8. #include "cyu3usb.h"
  9. #include "cyu3uart.h"
  10. #include "bladeRF.h"
  11. #include "cyu3gpif.h"
  12. #include "cyu3pib.h"
  13. #include "cyu3gpio.h"
  14. #include "pib_regs.h"
  15. /* This file should be included only once as it contains
  16. * structure definitions. Including it in multiple places
  17. * can result in linker error. */
  18. #include "cyfxgpif_C4loader.h"
  19. #include "cyfxgpif_RFlink.h"
  20. uint32_t glAppMode = MODE_NO_CONFIG;
  21. CyU3PThread bladeRFAppThread;
  22. CyU3PDmaChannel glChHandlebladeRFUtoP; /* DMA Channel for RF U2P (USB to P-port) transfers */
  23. CyU3PDmaChannel glChHandlebladeRFPtoU; /* DMA Channel for RF P2U (P-Port to USB) transfers */
  24. CyU3PDmaChannel glChHandlebladeRFUtoUART; /* DMA Channel for U2P transfers */
  25. CyU3PDmaChannel glChHandlebladeRFUARTtoU; /* DMA Channel for U2P transfers */
  26. CyU3PDmaMultiChannel glChHandleMultiUtoP;
  27. CyU3PDmaMultiChannel glChHandleMultiPtoU;
  28. uint32_t glDMARxCount = 0; /* Counter to track the number of buffers received
  29. * from USB during FPGA programming */
  30. uint8_t glEp0Buffer[4096] __attribute__ ((aligned (32)));
  31. uint32_t glEp0Idx;
  32. /* Application Error Handler */
  33. void CyFxAppErrorHandler(CyU3PReturnStatus_t apiRetStatus)
  34. {
  35. /* firmware failed with the error code apiRetStatus */
  36. /* Loop Indefinitely */
  37. for (;;)
  38. /* Thread sleep : 100 ms */
  39. CyU3PThreadSleep(100);
  40. }
  41. void NuandGPIOReconfigure(CyBool_t fullGpif, CyBool_t warm)
  42. {
  43. CyU3PReturnStatus_t apiRetStatus = CY_U3P_SUCCESS;
  44. CyU3PIoMatrixConfig_t io_cfg;
  45. CyU3PGpioSimpleConfig_t gpioConfig;
  46. CyU3PReturnStatus_t status = CY_U3P_SUCCESS;
  47. int i;
  48. struct {
  49. int pin; // pin number
  50. int input; // is this an input pin
  51. int warm; // should this pin be enabled via IOMatrix() call?
  52. // GPIF pins should be marked False, because they have to overriden
  53. } pins[] = {
  54. {GPIO_nSTATUS, CyTrue, CyTrue},
  55. {GPIO_CONFDONE, CyTrue, CyTrue},
  56. {GPIO_SYS_RST, CyFalse, CyFalse},
  57. {GPIO_RX_EN, CyFalse, CyFalse},
  58. {GPIO_TX_EN, CyFalse, CyFalse},
  59. {GPIO_nCONFIG, CyFalse, CyTrue}
  60. };
  61. #define ARR_SIZE(x) (sizeof(x)/sizeof(x[0]))
  62. io_cfg.useUart = CyTrue;
  63. io_cfg.useI2C = CyFalse;
  64. io_cfg.useI2S = CyFalse;
  65. io_cfg.useSpi = !fullGpif;
  66. io_cfg.isDQ32Bit = fullGpif;
  67. io_cfg.lppMode = CY_U3P_IO_MATRIX_LPP_DEFAULT;
  68. io_cfg.gpioSimpleEn[0] = 0;
  69. io_cfg.gpioSimpleEn[1] = 0;
  70. if (warm) {
  71. for (i = 0; i < ARR_SIZE(pins); i++) {
  72. if (!pins[i].warm)
  73. continue;
  74. if (pins[i].pin < 32) {
  75. io_cfg.gpioSimpleEn[0] |= 1 << (pins[i].pin - 1);
  76. } else {
  77. io_cfg.gpioSimpleEn[1] |= 1 << (pins[i].pin - 32);
  78. }
  79. }
  80. }
  81. io_cfg.gpioComplexEn[0] = 0;
  82. io_cfg.gpioComplexEn[1] = 0;
  83. status = CyU3PDeviceConfigureIOMatrix (&io_cfg);
  84. if (status != CY_U3P_SUCCESS) {
  85. while(1);
  86. }
  87. for (i = 0; i < ARR_SIZE(pins); i++) {
  88. // the pin has already been activated by the call to IOMatrix()
  89. if (warm && pins[i].warm)
  90. continue;
  91. apiRetStatus = CyU3PDeviceGpioOverride(pins[i].pin, CyTrue);
  92. if (apiRetStatus != 0) {
  93. CyU3PDebugPrint(4, "CyU3PDeviceGpioOverride failed, error code = %d\n", apiRetStatus);
  94. CyFxAppErrorHandler(apiRetStatus);
  95. }
  96. gpioConfig.intrMode = CY_U3P_GPIO_NO_INTR;
  97. if (pins[i].input) {
  98. // input config
  99. gpioConfig.outValue = CyTrue;
  100. gpioConfig.inputEn = CyTrue;
  101. gpioConfig.driveLowEn = CyFalse;
  102. gpioConfig.driveHighEn = CyFalse;
  103. } else {
  104. // output config
  105. gpioConfig.outValue = CyFalse;
  106. gpioConfig.driveLowEn = CyTrue;
  107. gpioConfig.driveHighEn = CyTrue;
  108. gpioConfig.inputEn = CyFalse;
  109. }
  110. apiRetStatus = CyU3PGpioSetSimpleConfig(pins[i].pin, &gpioConfig);
  111. if (apiRetStatus != CY_U3P_SUCCESS) {
  112. CyU3PDebugPrint(4, "CyU3PGpioSetSimpleConfig failed, error code = %d\n", apiRetStatus);
  113. CyFxAppErrorHandler(apiRetStatus);
  114. }
  115. }
  116. }
  117. void UartBridgeStart(void)
  118. {
  119. uint16_t size = 0;
  120. CyU3PEpConfig_t epCfg;
  121. CyU3PUSBSpeed_t usbSpeed = CyU3PUsbGetSpeed();
  122. CyU3PDmaChannelConfig_t dmaCfg;
  123. CyU3PUartConfig_t uartConfig;
  124. CyU3PReturnStatus_t apiRetStatus = CY_U3P_SUCCESS;
  125. /* Initialize the UART for printing debug messages */
  126. apiRetStatus = CyU3PUartInit();
  127. if (apiRetStatus != CY_U3P_SUCCESS) {
  128. CyFxAppErrorHandler(apiRetStatus);
  129. }
  130. /* Set UART configuration */
  131. CyU3PMemSet ((uint8_t *)&uartConfig, 0, sizeof (uartConfig));
  132. uartConfig.baudRate = CY_U3P_UART_BAUDRATE_4M608K;
  133. uartConfig.stopBit = CY_U3P_UART_ONE_STOP_BIT;
  134. uartConfig.parity = CY_U3P_UART_NO_PARITY;
  135. uartConfig.txEnable = CyTrue;
  136. uartConfig.rxEnable = CyTrue;
  137. uartConfig.flowCtrl = CyFalse;
  138. uartConfig.isDma = CyTrue;
  139. apiRetStatus = CyU3PUartSetConfig (&uartConfig, NULL);
  140. if (apiRetStatus != CY_U3P_SUCCESS)
  141. {
  142. CyFxAppErrorHandler(apiRetStatus);
  143. }
  144. /* Set UART Tx and Rx transfer Size to infinite */
  145. apiRetStatus = CyU3PUartTxSetBlockXfer(0xFFFFFFFF);
  146. if (apiRetStatus != CY_U3P_SUCCESS) {
  147. CyFxAppErrorHandler(apiRetStatus);
  148. }
  149. apiRetStatus = CyU3PUartRxSetBlockXfer(0xFFFFFFFF);
  150. if (apiRetStatus != CY_U3P_SUCCESS) {
  151. CyFxAppErrorHandler(apiRetStatus);
  152. }
  153. /* Determine max packet size based on USB speed */
  154. switch (usbSpeed)
  155. {
  156. case CY_U3P_FULL_SPEED:
  157. size = 64;
  158. break;
  159. case CY_U3P_HIGH_SPEED:
  160. size = 512;
  161. break;
  162. case CY_U3P_SUPER_SPEED:
  163. size = 1024;
  164. break;
  165. default:
  166. CyU3PDebugPrint (4, "Error! Invalid USB speed.\n");
  167. CyFxAppErrorHandler (CY_U3P_ERROR_FAILURE);
  168. break;
  169. }
  170. CyU3PMemSet ((uint8_t *)&epCfg, 0, sizeof (epCfg));
  171. epCfg.enable = CyTrue;
  172. epCfg.epType = CY_U3P_USB_EP_BULK;
  173. epCfg.burstLen = 1;
  174. epCfg.streams = 0;
  175. epCfg.pcktSize = size;
  176. /* Producer endpoint configuration */
  177. apiRetStatus = CyU3PSetEpConfig(BLADE_UART_EP_PRODUCER, &epCfg);
  178. if (apiRetStatus != CY_U3P_SUCCESS) {
  179. CyU3PDebugPrint (4, "CyU3PSetEpConfig failed, Error code = %d\n", apiRetStatus);
  180. CyFxAppErrorHandler (apiRetStatus);
  181. }
  182. /* Consumer endpoint configuration */
  183. apiRetStatus = CyU3PSetEpConfig(BLADE_UART_EP_CONSUMER, &epCfg);
  184. if (apiRetStatus != CY_U3P_SUCCESS) {
  185. CyU3PDebugPrint (4, "CyU3PSetEpConfig failed, Error code = %d\n", apiRetStatus);
  186. CyFxAppErrorHandler (apiRetStatus);
  187. }
  188. CyU3PMemSet((uint8_t *)&dmaCfg, 0, sizeof(dmaCfg));
  189. dmaCfg.size = size;
  190. dmaCfg.count = 2;
  191. dmaCfg.prodSckId = CY_U3P_UIB_SOCKET_PROD_2;
  192. dmaCfg.consSckId = CY_U3P_LPP_SOCKET_UART_CONS;
  193. dmaCfg.dmaMode = CY_U3P_DMA_MODE_BYTE;
  194. dmaCfg.notification = 0;
  195. dmaCfg.cb = 0;
  196. dmaCfg.prodHeader = 0;
  197. dmaCfg.prodFooter = 0;
  198. dmaCfg.consHeader = 0;
  199. dmaCfg.prodAvailCount = 0;
  200. apiRetStatus = CyU3PDmaChannelCreate(&glChHandlebladeRFUtoUART,
  201. CY_U3P_DMA_TYPE_AUTO, &dmaCfg);
  202. if (apiRetStatus != CY_U3P_SUCCESS) {
  203. CyU3PDebugPrint (4, "CyU3PDmaChannelCreate failed, Error code = %d\n", apiRetStatus);
  204. CyFxAppErrorHandler(apiRetStatus);
  205. }
  206. dmaCfg.prodSckId = CY_U3P_LPP_SOCKET_UART_PROD;
  207. dmaCfg.consSckId = CY_U3P_UIB_SOCKET_CONS_2;
  208. apiRetStatus = CyU3PDmaChannelCreate(&glChHandlebladeRFUARTtoU,
  209. CY_U3P_DMA_TYPE_AUTO, &dmaCfg);
  210. if (apiRetStatus != CY_U3P_SUCCESS) {
  211. CyU3PDebugPrint (4, "CyU3PDmaChannelCreate failed, Error code = %d\n", apiRetStatus);
  212. CyFxAppErrorHandler(apiRetStatus);
  213. }
  214. /* Flush the endpoint memory */
  215. CyU3PUsbFlushEp(BLADE_UART_EP_PRODUCER);
  216. CyU3PUsbFlushEp(BLADE_UART_EP_CONSUMER);
  217. /* Set DMA channel transfer size */
  218. apiRetStatus = CyU3PDmaChannelSetXfer(&glChHandlebladeRFUtoUART, BLADE_DMA_TX_SIZE);
  219. if (apiRetStatus != CY_U3P_SUCCESS) {
  220. CyU3PDebugPrint (4, "CyU3PDmaChannelSetXfer Failed, Error code = %d\n", apiRetStatus);
  221. CyFxAppErrorHandler(apiRetStatus);
  222. }
  223. apiRetStatus = CyU3PDmaChannelSetXfer(&glChHandlebladeRFUARTtoU, BLADE_DMA_TX_SIZE);
  224. if (apiRetStatus != CY_U3P_SUCCESS) {
  225. CyU3PDebugPrint (4, "CyU3PDmaChannelSetXfer Failed, Error code = %d\n", apiRetStatus);
  226. CyFxAppErrorHandler(apiRetStatus);
  227. }
  228. /* Set UART Tx and Rx transfer Size to infinite */
  229. apiRetStatus = CyU3PUartTxSetBlockXfer(0xFFFFFFFF);
  230. if (apiRetStatus != CY_U3P_SUCCESS) {
  231. CyFxAppErrorHandler(apiRetStatus);
  232. }
  233. apiRetStatus = CyU3PUartRxSetBlockXfer(0xFFFFFFFF);
  234. if (apiRetStatus != CY_U3P_SUCCESS) {
  235. CyFxAppErrorHandler(apiRetStatus);
  236. }
  237. }
  238. void CyFxGpioInit(void)
  239. {
  240. CyU3PGpioClock_t gpioClock;
  241. CyU3PGpioSimpleConfig_t gpioConfig;
  242. CyU3PReturnStatus_t apiRetStatus = CY_U3P_SUCCESS;
  243. /* Init the GPIO module */
  244. gpioClock.fastClkDiv = 2;
  245. gpioClock.slowClkDiv = 0;
  246. gpioClock.simpleDiv = CY_U3P_GPIO_SIMPLE_DIV_BY_2;
  247. gpioClock.clkSrc = CY_U3P_SYS_CLK;
  248. gpioClock.halfDiv = 0;
  249. apiRetStatus = CyU3PGpioInit(&gpioClock, NULL);
  250. if (apiRetStatus != 0)
  251. {
  252. /* Error Handling */
  253. CyU3PDebugPrint (4, "CyU3PGpioInit failed, error code = %d\n", apiRetStatus);
  254. CyFxAppErrorHandler(apiRetStatus);
  255. }
  256. NuandGPIOReconfigure(CyFalse, CyFalse);
  257. }
  258. int FpgaBeginProgram(void)
  259. {
  260. CyBool_t value;
  261. int tEnd;
  262. CyU3PReturnStatus_t apiRetStatus = CY_U3P_SUCCESS;
  263. apiRetStatus = CyU3PGpioSetValue(GPIO_nCONFIG, CyFalse);
  264. tEnd = CyU3PGetTime() + 10;
  265. while (CyU3PGetTime() < tEnd);
  266. apiRetStatus = CyU3PGpioSetValue(GPIO_nCONFIG, CyTrue);
  267. tEnd = CyU3PGetTime() + 1000;
  268. do {
  269. apiRetStatus = CyU3PGpioGetValue(GPIO_nSTATUS, &value);
  270. if (CyU3PGetTime() > tEnd)
  271. return -1;
  272. } while (!value);
  273. return 0;
  274. }
  275. /* DMA callback function to handle the produce events for U to P transfers. */
  276. void bladeRFConfigUtoPDmaCallback(CyU3PDmaChannel *chHandle, CyU3PDmaCbType_t type, CyU3PDmaCBInput_t *input)
  277. {
  278. CyU3PReturnStatus_t status = CY_U3P_SUCCESS;
  279. if (type == CY_U3P_DMA_CB_PROD_EVENT) {
  280. int i;
  281. unsigned char *buf = input->buffer_p.buffer;
  282. unsigned short *us_buf = (unsigned short *)input->buffer_p.buffer;
  283. unsigned short tmpr, tmpw;
  284. /* Flip the bits in such a way that the FPGA can be programmed
  285. * This mapping can be determined by looking at the schematic */
  286. for (i = input->buffer_p.count - 1; i >= 0; i--) {
  287. buf[i * 2] = buf[i];
  288. buf[i * 2 + 1] = 0;
  289. tmpr = us_buf[i];
  290. tmpw = 0;
  291. #define US_GPIF_2_FPP(GPIFbit, FPPbit) tmpw |= (tmpr & (1 << FPPbit)) ? (1 << GPIFbit) : 0;
  292. US_GPIF_2_FPP(7, 0);
  293. US_GPIF_2_FPP(15, 1);
  294. US_GPIF_2_FPP(6, 2);
  295. US_GPIF_2_FPP(2, 3);
  296. US_GPIF_2_FPP(1, 4);
  297. US_GPIF_2_FPP(3, 5);
  298. US_GPIF_2_FPP(9, 6);
  299. US_GPIF_2_FPP(11, 7);
  300. us_buf[i] = tmpw;
  301. }
  302. status = CyU3PDmaChannelCommitBuffer (chHandle, input->buffer_p.count * 2, 0);
  303. if (status != CY_U3P_SUCCESS) {
  304. CyU3PDebugPrint (4, "CyU3PDmaChannelCommitBuffer failed, Error code = %d\n", status);
  305. }
  306. /* Increment the counter. */
  307. glDMARxCount++;
  308. }
  309. }
  310. /* This function starts the RF data transport mechanism. This is the second
  311. * interface of the first and only descriptor. */
  312. void NuandRFLinkStart(void)
  313. {
  314. uint16_t size = 0;
  315. CyU3PEpConfig_t epCfg;
  316. CyU3PDmaChannelConfig_t dmaCfg;
  317. CyU3PDmaMultiChannelConfig_t dmaMultiConfig;
  318. CyU3PReturnStatus_t apiRetStatus = CY_U3P_SUCCESS;
  319. CyU3PUSBSpeed_t usbSpeed = CyU3PUsbGetSpeed();
  320. NuandGPIOReconfigure(CyTrue, CyTrue);
  321. /* Load the GPIF configuration for loading the RF transceiver */
  322. apiRetStatus = CyU3PGpifLoad(&Rflink_CyFxGpifConfig);
  323. if (apiRetStatus != CY_U3P_SUCCESS)
  324. {
  325. CyU3PDebugPrint (4, "CyU3PGpifLoad failed, Error Code = %d\n",apiRetStatus);
  326. CyFxAppErrorHandler(apiRetStatus);
  327. }
  328. // strobe the RESET pin to the FPGA
  329. CyU3PGpioSetValue(GPIO_SYS_RST, CyTrue);
  330. CyU3PGpioSetValue(GPIO_SYS_RST, CyFalse);
  331. /* Start the state machine. */
  332. apiRetStatus = CyU3PGpifSMStart(RFLINK_START, RFLINK_ALPHA_START);
  333. if (apiRetStatus != CY_U3P_SUCCESS) {
  334. CyU3PDebugPrint(4, "CyU3PGpifSMStart failed, Error Code = %d\n",apiRetStatus);
  335. CyFxAppErrorHandler(apiRetStatus);
  336. }
  337. /* Determine max packet size based on USB speed */
  338. switch (usbSpeed)
  339. {
  340. case CY_U3P_FULL_SPEED:
  341. size = 64;
  342. break;
  343. case CY_U3P_HIGH_SPEED:
  344. size = 512;
  345. break;
  346. case CY_U3P_SUPER_SPEED:
  347. size = 1024;
  348. break;
  349. default:
  350. CyU3PDebugPrint (4, "Error! Invalid USB speed.\n");
  351. CyFxAppErrorHandler (CY_U3P_ERROR_FAILURE);
  352. break;
  353. }
  354. CyU3PMemSet ((uint8_t *)&epCfg, 0, sizeof (epCfg));
  355. epCfg.enable = CyTrue;
  356. epCfg.epType = CY_U3P_USB_EP_BULK;
  357. epCfg.burstLen = 1;
  358. epCfg.streams = 0;
  359. epCfg.pcktSize = size;
  360. /* Producer endpoint configuration */
  361. apiRetStatus = CyU3PSetEpConfig(BLADE_RF_SAMPLE_EP_PRODUCER, &epCfg);
  362. if (apiRetStatus != CY_U3P_SUCCESS) {
  363. CyU3PDebugPrint(4, "CyU3PSetEpConfig failed, Error code = %d\n", apiRetStatus);
  364. CyFxAppErrorHandler (apiRetStatus);
  365. }
  366. /* Consumer endpoint configuration */
  367. apiRetStatus = CyU3PSetEpConfig(BLADE_RF_SAMPLE_EP_CONSUMER, &epCfg);
  368. if (apiRetStatus != CY_U3P_SUCCESS) {
  369. CyU3PDebugPrint(4, "CyU3PSetEpConfig failed, Error code = %d\n", apiRetStatus);
  370. CyFxAppErrorHandler (apiRetStatus);
  371. }
  372. dmaMultiConfig.size = size;
  373. dmaMultiConfig.count = 50;
  374. dmaMultiConfig.validSckCount = 2;
  375. dmaMultiConfig.prodSckId[0] = BLADE_RF_SAMPLE_EP_PRODUCER_USB_SOCKET;
  376. dmaMultiConfig.consSckId[0] = CY_U3P_PIB_SOCKET_2;
  377. dmaMultiConfig.consSckId[1] = CY_U3P_PIB_SOCKET_3;
  378. dmaMultiConfig.dmaMode = CY_U3P_DMA_MODE_BYTE;
  379. dmaMultiConfig.notification = 0;
  380. dmaMultiConfig.cb = 0;
  381. dmaMultiConfig.prodHeader = 0;
  382. dmaMultiConfig.prodFooter = 0;
  383. dmaMultiConfig.consHeader = 0;
  384. dmaMultiConfig.prodAvailCount = 0;
  385. apiRetStatus = CyU3PDmaMultiChannelCreate(&glChHandleMultiUtoP, CY_U3P_DMA_TYPE_AUTO_ONE_TO_MANY, &dmaMultiConfig);
  386. if (apiRetStatus != CY_U3P_SUCCESS) {
  387. CyU3PDebugPrint(4, "CyU3PDmaMultiChannelCreate failed, Error code = %d\n", apiRetStatus);
  388. CyFxAppErrorHandler(apiRetStatus);
  389. }
  390. dmaMultiConfig.prodSckId[0] = CY_U3P_PIB_SOCKET_0;
  391. dmaMultiConfig.prodSckId[1] = CY_U3P_PIB_SOCKET_1;
  392. dmaMultiConfig.consSckId[0] = BLADE_RF_SAMPLE_EP_CONSUMER_USB_SOCKET;
  393. dmaMultiConfig.consSckId[1] = 0;
  394. apiRetStatus = CyU3PDmaMultiChannelCreate(&glChHandleMultiPtoU, CY_U3P_DMA_TYPE_AUTO_MANY_TO_ONE, &dmaMultiConfig);
  395. if (apiRetStatus != CY_U3P_SUCCESS) {
  396. CyU3PDebugPrint(4, "CyU3PDmaMultiChannelCreate failed, Error code = %d\n", apiRetStatus);
  397. CyFxAppErrorHandler(apiRetStatus);
  398. }
  399. /* Flush the Endpoint memory */
  400. CyU3PUsbFlushEp(BLADE_RF_SAMPLE_EP_PRODUCER);
  401. CyU3PUsbFlushEp(BLADE_RF_SAMPLE_EP_CONSUMER);
  402. /* Set DMA channel transfer size. */
  403. apiRetStatus = CyU3PDmaMultiChannelSetXfer (&glChHandleMultiUtoP, BLADE_DMA_TX_SIZE, 0);
  404. if (apiRetStatus != CY_U3P_SUCCESS) {
  405. CyU3PDebugPrint(4, "CyU3PDmaChannelSetXfer Failed, Error code = %d\n", apiRetStatus);
  406. CyFxAppErrorHandler(apiRetStatus);
  407. }
  408. apiRetStatus = CyU3PDmaMultiChannelSetXfer (&glChHandleMultiPtoU, BLADE_DMA_TX_SIZE, 0);
  409. if (apiRetStatus != CY_U3P_SUCCESS) {
  410. CyU3PDebugPrint(4, "CyU3PDmaChannelSetXfer Failed, Error code = %d\n", apiRetStatus);
  411. CyFxAppErrorHandler(apiRetStatus);
  412. }
  413. glAppMode = MODE_RF_CONFIG;
  414. }
  415. /* This function stops the slave FIFO loop application. This shall be called
  416. * whenever a RESET or DISCONNECT event is received from the USB host. The
  417. * endpoints are disabled and the DMA pipe is destroyed by this function. */
  418. void NuandRFLinkStop (void)
  419. {
  420. CyU3PEpConfig_t epCfg;
  421. CyU3PReturnStatus_t apiRetStatus = CY_U3P_SUCCESS;
  422. /* Flush endpoint memory buffers */
  423. CyU3PUsbFlushEp(BLADE_RF_SAMPLE_EP_PRODUCER);
  424. CyU3PUsbFlushEp(BLADE_RF_SAMPLE_EP_CONSUMER);
  425. /* Destroy the channels */
  426. CyU3PDmaMultiChannelDestroy(&glChHandleMultiUtoP);
  427. CyU3PDmaMultiChannelDestroy(&glChHandleMultiPtoU);
  428. /* Disable endpoints. */
  429. CyU3PMemSet ((uint8_t *)&epCfg, 0, sizeof (epCfg));
  430. epCfg.enable = CyFalse;
  431. /* Disable producer endpoint */
  432. apiRetStatus = CyU3PSetEpConfig(BLADE_RF_SAMPLE_EP_PRODUCER, &epCfg);
  433. if (apiRetStatus != CY_U3P_SUCCESS) {
  434. CyU3PDebugPrint(4, "CyU3PSetEpConfig failed, Error code = %d\n", apiRetStatus);
  435. CyFxAppErrorHandler(apiRetStatus);
  436. }
  437. /* Disable consumer endpoint */
  438. apiRetStatus = CyU3PSetEpConfig(BLADE_RF_SAMPLE_EP_CONSUMER, &epCfg);
  439. if (apiRetStatus != CY_U3P_SUCCESS) {
  440. CyU3PDebugPrint(4, "CyU3PSetEpConfig failed, Error code = %d\n", apiRetStatus);
  441. CyFxAppErrorHandler(apiRetStatus);
  442. }
  443. /* Reset the GPIF */
  444. CyU3PGpifDisable(CyTrue);
  445. glAppMode = MODE_NO_CONFIG;
  446. }
  447. void NuandFpgaConfigStart(void)
  448. {
  449. uint16_t size = 0;
  450. CyU3PEpConfig_t epCfg;
  451. CyU3PDmaChannelConfig_t dmaCfg;
  452. CyU3PReturnStatus_t apiRetStatus = CY_U3P_SUCCESS;
  453. CyU3PUSBSpeed_t usbSpeed = CyU3PUsbGetSpeed();
  454. NuandGPIOReconfigure(CyFalse, CyFalse);
  455. /* Load the GPIF configuration for loading the FPGA */
  456. apiRetStatus = CyU3PGpifLoad(&C4loader_CyFxGpifConfig);
  457. if (apiRetStatus != CY_U3P_SUCCESS) {
  458. CyU3PDebugPrint (4, "CyU3PGpifLoad failed, Error Code = %d\n",apiRetStatus);
  459. CyFxAppErrorHandler(apiRetStatus);
  460. }
  461. /* Start the state machine. */
  462. apiRetStatus = CyU3PGpifSMStart(C4LOADER_START, C4LOADER_ALPHA_START);
  463. if (apiRetStatus != CY_U3P_SUCCESS) {
  464. CyU3PDebugPrint(4, "CyU3PGpifSMStart failed, Error Code = %d\n",apiRetStatus);
  465. CyFxAppErrorHandler(apiRetStatus);
  466. }
  467. /* Determine max packet size based on USB speed */
  468. switch (usbSpeed)
  469. {
  470. case CY_U3P_FULL_SPEED:
  471. size = 64;
  472. break;
  473. case CY_U3P_HIGH_SPEED:
  474. size = 512;
  475. break;
  476. case CY_U3P_SUPER_SPEED:
  477. size = 1024;
  478. break;
  479. default:
  480. CyU3PDebugPrint(4, "Error! Invalid USB speed.\n");
  481. CyFxAppErrorHandler(CY_U3P_ERROR_FAILURE);
  482. break;
  483. }
  484. CyU3PMemSet((uint8_t *)&epCfg, 0, sizeof (epCfg));
  485. epCfg.enable = CyTrue;
  486. epCfg.epType = CY_U3P_USB_EP_BULK;
  487. epCfg.burstLen = 1;
  488. epCfg.streams = 0;
  489. epCfg.pcktSize = size;
  490. apiRetStatus = CyU3PSetEpConfig(BLADE_FPGA_EP_PRODUCER, &epCfg);
  491. if (apiRetStatus != CY_U3P_SUCCESS) {
  492. CyU3PDebugPrint(4, "CyU3PSetEpConfig failed, Error code = %d\n", apiRetStatus);
  493. CyFxAppErrorHandler (apiRetStatus);
  494. }
  495. dmaCfg.size = size * 2;
  496. dmaCfg.count = BLADE_DMA_BUF_COUNT;
  497. dmaCfg.prodSckId = BLADE_FPGA_CONFIG_SOCKET;
  498. dmaCfg.consSckId = CY_U3P_PIB_SOCKET_3;
  499. dmaCfg.dmaMode = CY_U3P_DMA_MODE_BYTE;
  500. /* Enable the callback for produce event, this is where the bits will get flipped */
  501. dmaCfg.notification = CY_U3P_DMA_CB_PROD_EVENT;
  502. dmaCfg.cb = bladeRFConfigUtoPDmaCallback;
  503. dmaCfg.prodHeader = 0;
  504. dmaCfg.prodFooter = size;
  505. dmaCfg.consHeader = 0;
  506. dmaCfg.prodAvailCount = 0;
  507. apiRetStatus = CyU3PDmaChannelCreate(&glChHandlebladeRFUtoP,
  508. CY_U3P_DMA_TYPE_MANUAL, &dmaCfg);
  509. if (apiRetStatus != CY_U3P_SUCCESS) {
  510. CyU3PDebugPrint(4, "CyU3PDmaChannelCreate failed, Error code = %d\n", apiRetStatus);
  511. CyFxAppErrorHandler(apiRetStatus);
  512. }
  513. /* Flush the endpoint memory */
  514. CyU3PUsbFlushEp(BLADE_FPGA_EP_PRODUCER);
  515. /* Set DMA channel transfer size. */
  516. apiRetStatus = CyU3PDmaChannelSetXfer(&glChHandlebladeRFUtoP, BLADE_DMA_TX_SIZE);
  517. if (apiRetStatus != CY_U3P_SUCCESS) {
  518. CyU3PDebugPrint(4, "CyU3PDmaChannelSetXfer Failed, Error code = %d\n", apiRetStatus);
  519. CyFxAppErrorHandler(apiRetStatus);
  520. }
  521. glAppMode = MODE_FPGA_CONFIG;
  522. }
  523. void NuandFpgaConfigStop(void)
  524. {
  525. CyU3PEpConfig_t epCfg;
  526. CyU3PReturnStatus_t apiRetStatus = CY_U3P_SUCCESS;
  527. /* Flush the endpoint memory */
  528. CyU3PUsbFlushEp(BLADE_FPGA_EP_PRODUCER);
  529. /* Destroy the channel */
  530. CyU3PDmaChannelDestroy(&glChHandlebladeRFUtoP);
  531. /* Disable endpoints. */
  532. CyU3PMemSet((uint8_t *)&epCfg, 0, sizeof (epCfg));
  533. epCfg.enable = CyFalse;
  534. /* Producer endpoint configuration. */
  535. apiRetStatus = CyU3PSetEpConfig(BLADE_FPGA_EP_PRODUCER, &epCfg);
  536. if (apiRetStatus != CY_U3P_SUCCESS) {
  537. CyU3PDebugPrint (4, "CyU3PSetEpConfig failed, Error code = %d\n", apiRetStatus);
  538. CyFxAppErrorHandler (apiRetStatus);
  539. }
  540. CyU3PGpifDisable(CyTrue);
  541. glAppMode = MODE_NO_CONFIG;
  542. }
  543. /* Callback to handle the USB setup requests. */
  544. CyBool_t CyFxbladeRFApplnUSBSetupCB(uint32_t setupdat0, uint32_t setupdat1)
  545. {
  546. uint8_t bRequest, bReqType;
  547. uint8_t bType, bTarget;
  548. uint16_t wValue, wIndex, wLength;
  549. CyBool_t isHandled = CyFalse;
  550. /* Decode the fields from the setup request. */
  551. bReqType = (setupdat0 & CY_U3P_USB_REQUEST_TYPE_MASK);
  552. bType = (bReqType & CY_U3P_USB_TYPE_MASK);
  553. bTarget = (bReqType & CY_U3P_USB_TARGET_MASK);
  554. bRequest = ((setupdat0 & CY_U3P_USB_REQUEST_MASK) >> CY_U3P_USB_REQUEST_POS);
  555. wValue = ((setupdat0 & CY_U3P_USB_VALUE_MASK) >> CY_U3P_USB_VALUE_POS);
  556. wIndex = ((setupdat1 & CY_U3P_USB_INDEX_MASK) >> CY_U3P_USB_INDEX_POS);
  557. wLength = ((setupdat1 & CY_U3P_USB_LENGTH_MASK) >> CY_U3P_USB_LENGTH_POS);
  558. if (bType == CY_U3P_USB_STANDARD_RQT)
  559. {
  560. /* Handle suspend requests */
  561. if ((bTarget == CY_U3P_USB_TARGET_INTF) && ((bRequest == CY_U3P_USB_SC_SET_FEATURE)
  562. || (bRequest == CY_U3P_USB_SC_CLEAR_FEATURE)) && (wValue == 0)) {
  563. if (glAppMode != MODE_NO_CONFIG)
  564. CyU3PUsbAckSetup();
  565. else
  566. CyU3PUsbStall(0, CyTrue, CyFalse);
  567. isHandled = CyTrue;
  568. }
  569. /* Flush enpoint memory and reset channel if CLEAR_FEATURE is received */
  570. if ((bTarget == CY_U3P_USB_TARGET_ENDPT) && (bRequest == CY_U3P_USB_SC_CLEAR_FEATURE)
  571. && (wValue == CY_U3P_USBX_FS_EP_HALT))
  572. {
  573. if (glAppMode != MODE_NO_CONFIG) {
  574. #if 0
  575. if (wIndex == CY_FX_EP_PRODUCER) {
  576. CyU3PDmaChannelReset (&glChHandlebladeRFUtoP);
  577. CyU3PUsbFlushEp(CY_FX_EP_PRODUCER);
  578. CyU3PUsbResetEp(CY_FX_EP_PRODUCER);
  579. CyU3PDmaChannelSetXfer (&glChHandlebladeRFUtoP, BLADE_DMA_TX_SIZE);
  580. }
  581. if (wIndex == CY_FX_EP_CONSUMER) {
  582. CyU3PDmaChannelReset (&glChHandlebladeRFPtoU);
  583. CyU3PUsbFlushEp(CY_FX_EP_CONSUMER);
  584. CyU3PUsbResetEp(CY_FX_EP_CONSUMER);
  585. CyU3PDmaChannelSetXfer (&glChHandlebladeRFPtoU, BLADE_DMA_RX_SIZE);
  586. }
  587. #endif
  588. CyU3PUsbStall(wIndex, CyFalse, CyTrue);
  589. isHandled = CyTrue;
  590. }
  591. }
  592. }
  593. /* Handle supported bladeRF vendor requests. */
  594. if (bType == CY_U3P_USB_VENDOR_RQT)
  595. {
  596. unsigned int ret;
  597. CyBool_t fpgaProg;
  598. struct bladeRF_version ver;
  599. CyU3PReturnStatus_t apiRetStatus = CY_U3P_SUCCESS;
  600. int retStatus;
  601. char buf[10];
  602. uint16_t readC;
  603. isHandled = CyTrue;
  604. switch (bRequest)
  605. {
  606. case BLADE_USB_CMD_QUERY_VERSION:
  607. ver.major = 0;
  608. ver.minor = 1;
  609. apiRetStatus = CyU3PUsbSendEP0Data(sizeof(ver), &ver);
  610. break;
  611. case BLADE_USB_CMD_RF_RX:
  612. CyU3PGpioSetValue(GPIO_SYS_RST, CyTrue);
  613. CyU3PGpioSetValue(GPIO_SYS_RST, CyFalse);
  614. apiRetStatus = CyU3PUsbGetEP0Data(4, buf, &readC);
  615. CyU3PGpioSetValue(GPIO_RX_EN, (buf[0] || buf[3]) ? CyTrue : CyFalse);
  616. break;
  617. case BLADE_USB_CMD_RF_TX:
  618. CyU3PGpioSetValue(GPIO_SYS_RST, CyTrue);
  619. CyU3PGpioSetValue(GPIO_SYS_RST, CyFalse);
  620. apiRetStatus = CyU3PUsbGetEP0Data(4, buf, &readC);
  621. CyU3PGpioSetValue(GPIO_TX_EN, (buf[0] || buf[3]) ? CyTrue : CyFalse);
  622. break;
  623. case BLADE_USB_CMD_BEGIN_PROG:
  624. retStatus = FpgaBeginProgram();
  625. apiRetStatus = CyU3PUsbSendEP0Data (sizeof(retStatus), &retStatus);
  626. break;
  627. break;
  628. case BLADE_USB_CMD_QUERY_FPGA_STATUS:
  629. apiRetStatus = CyU3PGpioGetValue (GPIO_CONFDONE, &fpgaProg);
  630. if (apiRetStatus == CY_U3P_SUCCESS) {
  631. ret = fpgaProg ? 1 : 0;
  632. } else {
  633. ret = -1;
  634. }
  635. apiRetStatus = CyU3PUsbSendEP0Data (sizeof(ret), &ret);
  636. break;
  637. case BLADE_USB_CMD_FLASH_READ:
  638. if (CyU3PUsbGetSpeed() == CY_U3P_HIGH_SPEED) {
  639. if (glEp0Idx == 0) {
  640. apiRetStatus = CyFxSpiTransfer (wIndex, 0x100,
  641. glEp0Buffer, CyTrue);
  642. } else {
  643. apiRetStatus = CY_U3P_SUCCESS;
  644. }
  645. apiRetStatus = CyU3PUsbSendEP0Data(wLength, &glEp0Buffer[glEp0Idx]);
  646. glEp0Idx += 64;
  647. if (glEp0Idx == 256)
  648. glEp0Idx = 0;
  649. } else if (CyU3PUsbGetSpeed() == CY_U3P_SUPER_SPEED) {
  650. apiRetStatus = CyFxSpiTransfer (wIndex, 0x100,
  651. glEp0Buffer, CyTrue);
  652. apiRetStatus = CyU3PUsbSendEP0Data(0x100, &glEp0Buffer);
  653. }
  654. break;
  655. case BLADE_USB_CMD_FLASH_WRITE:
  656. if (CyU3PUsbGetSpeed() == CY_U3P_HIGH_SPEED) {
  657. apiRetStatus = CyU3PUsbGetEP0Data(64, &glEp0Buffer[glEp0Idx], &readC);
  658. glEp0Idx += 64;
  659. if (glEp0Idx == 256){
  660. apiRetStatus = CyFxSpiTransfer (wIndex, 0x100,
  661. glEp0Buffer, CyFalse);
  662. glEp0Idx = 0;
  663. }
  664. } else if (CyU3PUsbGetSpeed() == CY_U3P_SUPER_SPEED) {
  665. apiRetStatus = CyU3PUsbGetEP0Data(0x100, &glEp0Buffer, &readC);
  666. apiRetStatus = CyFxSpiTransfer (wIndex, 0x100,
  667. glEp0Buffer, CyFalse);
  668. }
  669. break;
  670. case BLADE_USB_CMD_FLASH_ERASE:
  671. apiRetStatus = CyFxSpiEraseSector(CyTrue, wIndex);
  672. ret = (apiRetStatus == CY_U3P_SUCCESS);
  673. CyU3PUsbSendEP0Data(sizeof(ret), &ret);
  674. break;
  675. break;
  676. default:
  677. isHandled = CyFalse;
  678. }
  679. }
  680. return isHandled;
  681. }
  682. /* This is the callback function to handle the USB events. */
  683. void CyFxbladeRFApplnUSBEventCB (CyU3PUsbEventType_t evtype, uint16_t evdata)
  684. {
  685. int interface;
  686. switch (evtype)
  687. {
  688. case CY_U3P_USB_EVENT_SETINTF:
  689. interface = evdata >> 8;
  690. if (interface == 0) {
  691. NuandRFLinkStop();
  692. NuandFpgaConfigStart();
  693. } else if (interface == 1) {
  694. NuandFpgaConfigStop();
  695. NuandRFLinkStart();
  696. } else if (interface == 2) {
  697. if (glAppMode == MODE_RF_CONFIG) {
  698. NuandRFLinkStop();
  699. }
  700. if (glAppMode == MODE_FPGA_CONFIG) {
  701. NuandFpgaConfigStop();
  702. }
  703. glEp0Idx = 0;
  704. NuandFirmwareStart();
  705. }
  706. break;
  707. case CY_U3P_USB_EVENT_SETCONF:
  708. /* Stop the application before re-starting. */
  709. switch (glAppMode) {
  710. case MODE_RF_CONFIG:
  711. NuandRFLinkStop();
  712. case MODE_NO_CONFIG:
  713. NuandFpgaConfigStart();
  714. case MODE_FPGA_CONFIG:
  715. FpgaBeginProgram();
  716. }
  717. break;
  718. case CY_U3P_USB_EVENT_RESET:
  719. case CY_U3P_USB_EVENT_DISCONNECT:
  720. /* Stop the loop back function. */
  721. if (glAppMode == MODE_RF_CONFIG) {
  722. NuandRFLinkStop();
  723. } else if (glAppMode == MODE_FPGA_CONFIG){
  724. NuandFpgaConfigStop();
  725. }
  726. break;
  727. default:
  728. break;
  729. }
  730. }
  731. /* Callback function to handle LPM requests from the USB 3.0 host. This function is invoked by the API
  732. whenever a state change from U0 -> U1 or U0 -> U2 happens. If we return CyTrue from this function, the
  733. FX3 device is retained in the low power state. If we return CyFalse, the FX3 device immediately tries
  734. to trigger an exit back to U0.
  735. This application does not have any state in which we should not allow U1/U2 transitions; and therefore
  736. the function always return CyTrue.
  737. */
  738. CyBool_t
  739. CyFxApplnLPMRqtCB (
  740. CyU3PUsbLinkPowerMode link_mode)
  741. {
  742. return CyTrue;
  743. }
  744. void bladeRFInit(void)
  745. {
  746. CyU3PPibClock_t pibClock;
  747. CyU3PReturnStatus_t apiRetStatus = CY_U3P_SUCCESS;
  748. /* Initialize the p-port block. */
  749. pibClock.clkDiv = 4;
  750. pibClock.clkSrc = CY_U3P_SYS_CLK;
  751. pibClock.isHalfDiv = CyFalse;
  752. /* Enable DLL for async GPIF */
  753. pibClock.isDllEnable = CyFalse;
  754. apiRetStatus = CyU3PPibInit(CyTrue, &pibClock);
  755. if (apiRetStatus != CY_U3P_SUCCESS) {
  756. CyU3PDebugPrint (4, "P-port Initialization failed, Error Code = %d\n",apiRetStatus);
  757. CyFxAppErrorHandler(apiRetStatus);
  758. }
  759. /* Start the USB functionality. */
  760. apiRetStatus = CyU3PUsbStart();
  761. if (apiRetStatus != CY_U3P_SUCCESS) {
  762. CyU3PDebugPrint (4, "CyU3PUsbStart failed to Start, Error code = %d\n", apiRetStatus);
  763. CyFxAppErrorHandler(apiRetStatus);
  764. }
  765. /* The fast enumeration is the easiest way to setup a USB connection,
  766. * where all enumeration phase is handled by the library. Only the
  767. * class / vendor requests need to be handled by the application. */
  768. CyU3PUsbRegisterSetupCallback(CyFxbladeRFApplnUSBSetupCB, CyTrue);
  769. /* Setup the callback to handle the USB events. */
  770. CyU3PUsbRegisterEventCallback(CyFxbladeRFApplnUSBEventCB);
  771. /* Register a callback to handle LPM requests from the USB 3.0 host. */
  772. CyU3PUsbRegisterLPMRequestCallback(CyFxApplnLPMRqtCB);
  773. /* Set the USB Enumeration descriptors */
  774. /* Super speed device descriptor. */
  775. apiRetStatus = CyU3PUsbSetDesc(CY_U3P_USB_SET_SS_DEVICE_DESCR, NULL, (uint8_t *)CyFxUSB30DeviceDscr);
  776. if (apiRetStatus != CY_U3P_SUCCESS) {
  777. CyU3PDebugPrint (4, "USB set device descriptor failed, Error code = %d\n", apiRetStatus);
  778. CyFxAppErrorHandler(apiRetStatus);
  779. }
  780. /* High speed device descriptor. */
  781. apiRetStatus = CyU3PUsbSetDesc(CY_U3P_USB_SET_HS_DEVICE_DESCR, NULL, (uint8_t *)CyFxUSB20DeviceDscr);
  782. if (apiRetStatus != CY_U3P_SUCCESS) {
  783. CyU3PDebugPrint (4, "USB set device descriptor failed, Error code = %d\n", apiRetStatus);
  784. CyFxAppErrorHandler(apiRetStatus);
  785. }
  786. /* BOS descriptor */
  787. apiRetStatus = CyU3PUsbSetDesc(CY_U3P_USB_SET_SS_BOS_DESCR, NULL, (uint8_t *)CyFxUSBBOSDscr);
  788. if (apiRetStatus != CY_U3P_SUCCESS) {
  789. CyU3PDebugPrint (4, "USB set configuration descriptor failed, Error code = %d\n", apiRetStatus);
  790. CyFxAppErrorHandler(apiRetStatus);
  791. }
  792. /* Device qualifier descriptor */
  793. apiRetStatus = CyU3PUsbSetDesc(CY_U3P_USB_SET_DEVQUAL_DESCR, NULL, (uint8_t *)CyFxUSBDeviceQualDscr);
  794. if (apiRetStatus != CY_U3P_SUCCESS) {
  795. CyU3PDebugPrint (4, "USB set device qualifier descriptor failed, Error code = %d\n", apiRetStatus);
  796. CyFxAppErrorHandler(apiRetStatus);
  797. }
  798. /* Super speed configuration descriptor */
  799. apiRetStatus = CyU3PUsbSetDesc(CY_U3P_USB_SET_SS_CONFIG_DESCR, NULL, (uint8_t *)CyFxUSBSSConfigDscr);
  800. if (apiRetStatus != CY_U3P_SUCCESS) {
  801. CyU3PDebugPrint (4, "USB set configuration descriptor failed, Error code = %d\n", apiRetStatus);
  802. CyFxAppErrorHandler(apiRetStatus);
  803. }
  804. /* High speed configuration descriptor */
  805. apiRetStatus = CyU3PUsbSetDesc(CY_U3P_USB_SET_HS_CONFIG_DESCR, NULL, (uint8_t *)CyFxUSBHSConfigDscr);
  806. if (apiRetStatus != CY_U3P_SUCCESS) {
  807. CyU3PDebugPrint (4, "USB Set Other Speed Descriptor failed, Error Code = %d\n", apiRetStatus);
  808. CyFxAppErrorHandler(apiRetStatus);
  809. }
  810. /* Full speed configuration descriptor */
  811. apiRetStatus = CyU3PUsbSetDesc(CY_U3P_USB_SET_FS_CONFIG_DESCR, NULL, (uint8_t *)CyFxUSBFSConfigDscr);
  812. if (apiRetStatus != CY_U3P_SUCCESS) {
  813. CyU3PDebugPrint (4, "USB Set Configuration Descriptor failed, Error Code = %d\n", apiRetStatus);
  814. CyFxAppErrorHandler(apiRetStatus);
  815. }
  816. /* String descriptor 0 */
  817. apiRetStatus = CyU3PUsbSetDesc(CY_U3P_USB_SET_STRING_DESCR, 0, (uint8_t *)CyFxUSBStringLangIDDscr);
  818. if (apiRetStatus != CY_U3P_SUCCESS) {
  819. CyU3PDebugPrint (4, "USB set string descriptor failed, Error code = %d\n", apiRetStatus);
  820. CyFxAppErrorHandler(apiRetStatus);
  821. }
  822. /* String descriptor 1 */
  823. apiRetStatus = CyU3PUsbSetDesc(CY_U3P_USB_SET_STRING_DESCR, 1, (uint8_t *)CyFxUSBManufactureDscr);
  824. if (apiRetStatus != CY_U3P_SUCCESS) {
  825. CyU3PDebugPrint (4, "USB set string descriptor failed, Error code = %d\n", apiRetStatus);
  826. CyFxAppErrorHandler(apiRetStatus);
  827. }
  828. /* String descriptor 2 */
  829. apiRetStatus = CyU3PUsbSetDesc(CY_U3P_USB_SET_STRING_DESCR, 2, (uint8_t *)CyFxUSBProductDscr);
  830. if (apiRetStatus != CY_U3P_SUCCESS) {
  831. CyU3PDebugPrint (4, "USB set string descriptor failed, Error code = %d\n", apiRetStatus);
  832. CyFxAppErrorHandler(apiRetStatus);
  833. }
  834. /* Connect the USB Pins with super speed operation enabled. */
  835. apiRetStatus = CyU3PConnectState(CyTrue, CyTrue);
  836. if (apiRetStatus != CY_U3P_SUCCESS) {
  837. CyU3PDebugPrint (4, "USB Connect failed, Error code = %d\n", apiRetStatus);
  838. CyFxAppErrorHandler(apiRetStatus);
  839. }
  840. glAppMode = MODE_NO_CONFIG;
  841. }
  842. /* Entry function for the bladeRFAppThread. */
  843. void bladeRFAppThread_Entry( uint32_t input)
  844. {
  845. uint8_t state;
  846. CyFxGpioInit();
  847. bladeRFInit();
  848. FpgaBeginProgram();
  849. for (;;) {
  850. CyU3PThreadSleep (100);
  851. CyU3PGpifGetSMState(&state);
  852. }
  853. }
  854. /* Application define function which creates the threads. */
  855. void CyFxApplicationDefine(void)
  856. {
  857. void *ptr = NULL;
  858. uint32_t retThrdCreate = CY_U3P_SUCCESS;
  859. /* Allocate the memory for the threads */
  860. ptr = CyU3PMemAlloc(BLADE_THREAD_STACK);
  861. /* Create the thread for the application */
  862. retThrdCreate = CyU3PThreadCreate(&bladeRFAppThread, /* Slave FIFO app thread structure */
  863. "21:bladeRF_thread", /* Thread ID and thread name */
  864. bladeRFAppThread_Entry, /* Slave FIFO app thread entry function */
  865. 0, /* No input parameter to thread */
  866. ptr, /* Pointer to the allocated thread stack */
  867. BLADE_THREAD_STACK, /* App Thread stack size */
  868. BLADE_THREAD_PRIORITY, /* App Thread priority */
  869. BLADE_THREAD_PRIORITY, /* App Thread pre-emption threshold */
  870. CYU3P_NO_TIME_SLICE, /* No time slice for the application thread */
  871. CYU3P_AUTO_START /* Start the thread immediately */
  872. );
  873. if (retThrdCreate != 0) {
  874. /* Application cannot continue */
  875. /* Loop indefinitely */
  876. while(1);
  877. }
  878. }
  879. /*
  880. * Main function
  881. */
  882. int main(void)
  883. {
  884. CyU3PIoMatrixConfig_t io_cfg;
  885. CyU3PReturnStatus_t status = CY_U3P_SUCCESS;
  886. /* Initialize the device */
  887. status = CyU3PDeviceInit(NULL);
  888. if (status != CY_U3P_SUCCESS) {
  889. goto handle_fatal_error;
  890. }
  891. /* Initialize the caches. Enable both Instruction and Data Caches. */
  892. status = CyU3PDeviceCacheControl(CyTrue, CyTrue, CyTrue);
  893. if (status != CY_U3P_SUCCESS) {
  894. goto handle_fatal_error;
  895. }
  896. io_cfg.useUart = CyTrue;
  897. io_cfg.useI2C = CyFalse;
  898. io_cfg.useI2S = CyFalse;
  899. io_cfg.useSpi = CyFalse;
  900. io_cfg.isDQ32Bit = CyTrue;
  901. io_cfg.lppMode = CY_U3P_IO_MATRIX_LPP_DEFAULT;
  902. /* No GPIOs are enabled. */
  903. io_cfg.gpioSimpleEn[0] = 0;
  904. io_cfg.gpioSimpleEn[1] = 0;
  905. io_cfg.gpioComplexEn[0] = 0;
  906. io_cfg.gpioComplexEn[1] = 0;
  907. status = CyU3PDeviceConfigureIOMatrix (&io_cfg);
  908. if (status != CY_U3P_SUCCESS)
  909. {
  910. goto handle_fatal_error;
  911. }
  912. /* This is a non returnable call for initializing the RTOS kernel */
  913. CyU3PKernelEntry();
  914. /* Dummy return to make the compiler happy */
  915. return 0;
  916. handle_fatal_error:
  917. /* Cannot recover from this error. */
  918. while (1);
  919. }