CyU3PReturnStatus_t NuandWriteOtp(size_t offset, size_t size, void *buf) { CyU3PReturnStatus_t status; status = NuandEnso(); status = CyFxSpiTransfer(offset, size, buf, CyFalse); status = NuandExso(); return status; }
CyBool_t NuandLoadFromFlash(int fpga_len) { uint8_t *ptr; int nleft; CyBool_t retval = CyFalse; CyU3PDmaBuffer_t dbuf; uint32_t sector_idx = 1025; uint32_t prodCnt, consCnt; int32_t i; CyU3PDmaState_t state; CyU3PReturnStatus_t apiRetStatus = CY_U3P_SUCCESS; NuandFpgaConfigStart(); ptr = CyU3PDmaBufferAlloc(4096); apiRetStatus = CyFxSpiInit(0x100); CyFxSpiFastRead(CyTrue); apiRetStatus = CyU3PSpiSetClock(30000000); if (FpgaBeginProgram() != CY_U3P_SUCCESS) { goto out; } nleft = fpga_len; while(nleft) { apiRetStatus = CyU3PDmaChannelGetStatus(&glChHandlebladeRFUtoP, &state, &prodCnt, &consCnt); if (apiRetStatus) break; CyU3PDmaChannelAbort(&glChHandlebladeRFUtoP); apiRetStatus = CyU3PDmaChannelGetStatus(&glChHandlebladeRFUtoP, &state, &prodCnt, &consCnt); if (apiRetStatus) break; CyU3PDmaChannelReset(&glChHandlebladeRFUtoP); apiRetStatus = CyU3PDmaChannelGetStatus(&glChHandlebladeRFUtoP, &state, &prodCnt, &consCnt); if (apiRetStatus) break; if (CyFxSpiTransfer(sector_idx++, 0x100, ptr, CyTrue) != CY_U3P_SUCCESS) break; uint8_t *end_in_b = &( ((uint8_t *)ptr)[255]); uint16_t *end_in_w = &( ((uint16_t *)ptr)[255]); /* Flip the bits in such a way that the FPGA can be programmed * This mapping can be determined by looking at the schematic */ for (i = 255; i >= 0; i--) *end_in_w-- = glFlipLut[*end_in_b--]; dbuf.buffer = ptr; dbuf.count = ((nleft > 256) ? 256 : (nleft + 2)) * 2; dbuf.size = 4096; dbuf.status = 0; apiRetStatus = CyU3PDmaChannelSetupSendBuffer(&glChHandlebladeRFUtoP, &dbuf); if (apiRetStatus) break; apiRetStatus = CyU3PDmaChannelGetStatus(&glChHandlebladeRFUtoP, &state, &prodCnt, &consCnt); if (apiRetStatus) break; apiRetStatus = CyU3PDmaChannelWaitForCompletion(&glChHandlebladeRFUtoP, 100); if (apiRetStatus) break; apiRetStatus = CyU3PDmaChannelGetStatus(&glChHandlebladeRFUtoP, &state, &prodCnt, &consCnt); if (apiRetStatus) break; if (nleft > 256) { nleft -= 256; } else { retval = CyTrue; nleft = 0; break; } } out: CyU3PDmaBufferFree(ptr); CyU3PSpiDeInit(); CyFxSpiFastRead(CyFalse); NuandFpgaConfigStop(); return retval; }