DRESULT disk_write (
		BYTE drv,			/* Physical drive nmuber (0) */
		const BYTE *buff,		/* Pointer to the data to be written */
		DWORD sector,			/* Start sector number (LBA) */
		BYTE count			/* Sector count (1..128) */
		)
{
    CyU3PReturnStatus_t status;
    CyU3PDmaBuffer_t    BufOUT_t;
    uint32_t            evStat;

    /* No storage device found. */
    if ((Stat[drv] == STA_NOINIT) || (Stat[drv] == STA_NODISK))
        return RES_NOTRDY;

    /* FX3S cannot handle DMA buffers larger that 65535 bytes. */
    if (count < 1 || count > 127)
        return RES_PARERR;

    /* Check whether the volume is write protected. */
    if (Stat[drv] == STA_PROTECT)
        return RES_WRPRT;

    BufOUT_t.buffer = (uint8_t *)buff;
    BufOUT_t.count  = (uint16_t)count * 512;
    BufOUT_t.size   = (uint16_t)count * 512;
    BufOUT_t.status = 0;

    status = CyU3PSibReadWriteRequest (CyFalse, (uint8_t) drv, 0, (uint16_t)count, (uint32_t)sector, (uint8_t)CY_U3P_SIB_SOCKET_0);
    if (status != CY_U3P_SUCCESS)
    {
        /* Abort the DMA Channel */
        CyU3PDmaChannelReset (&glChHandleStorOut);
        return RES_ERROR;
    }

    status = CyU3PDmaChannelSetupSendBuffer (&glChHandleStorOut,  &BufOUT_t);
    if (status == CY_U3P_SUCCESS)
    {
        status = CyU3PEventGet (&glStorDriverEvent, CY_FX_FATFS_SIB_DONE_EVENT, CYU3P_EVENT_OR_CLEAR, &evStat,
                CYU3P_WAIT_FOREVER);
        if (status == CY_U3P_SUCCESS)
            status = CyU3PDmaChannelWaitForCompletion (&glChHandleStorOut, CYU3P_WAIT_FOREVER);
    }

    if (status != CY_U3P_SUCCESS)
    {
        CyU3PSibAbortRequest ((uint8_t)drv);
        CyU3PDmaChannelReset (&glChHandleStorOut);
    }

    return status ? RES_ERROR : RES_OK;
}
CyU3PReturnStatus_t
CyFxMscSendBuffer (
        uint8_t *buffer,
        uint16_t count)
{
    CyU3PDmaBuffer_t buf_p;
    CyU3PUsbHostEpStatus_t epStatus;
    CyU3PReturnStatus_t status = CY_U3P_SUCCESS;

    /* Setup the DMA for transfer. */
    buf_p.buffer = buffer;
    buf_p.count  = count;
    buf_p.size   = ((count + 0x0F) & ~0x0F);
    buf_p.status = 0;
    status = CyU3PDmaChannelSetupSendBuffer (&glMscOutCh, &buf_p);
    if (status == CY_U3P_SUCCESS)
    {
        status = CyU3PUsbHostEpSetXfer (glMscOutEp,
                CY_U3P_USB_HOST_EPXFER_NORMAL, count);
    }
    if (status == CY_U3P_SUCCESS)
    {
        status = CyU3PUsbHostEpWaitForCompletion (glMscOutEp, &epStatus,
                CY_FX_MSC_WAIT_TIMEOUT);
    }
    if (status == CY_U3P_SUCCESS)
    {
        status = CyU3PDmaChannelWaitForCompletion (&glMscOutCh, CYU3P_NO_WAIT);
    }

    if (status != CY_U3P_SUCCESS)
    {
        CyFxMscErrorRecovery ();
    }

    return status;
}
Beispiel #3
0
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;
}