Issues on upgrade to 1.3.4

Tip / Sign in to post questions, reply, level up, and achieve exciting badges. Know more

cross mob
xixu_4093676
Level 3
Level 3
25 replies posted 10 replies posted 10 questions asked

Hi support team,

Currently, We try to upgrade to new sdk version 1.3.4 from 1.3.3, Our device is not working correctly.

We see it can not receive data from bulk endpoint.

Anything to change ? when use 1.3.4 sdk api.

Thanks,

Martin.xu

0 Likes
1 Solution

Hello,

Please try the following and let us know the results:

1. Please comment off the CyU3PDmaChannelSetXfer() in the function CyFxU3VApplnStart().

2. When the USB event CY_U3P_USB_EVENT_SETCONF is received, reset all the channels using the API CyU3PDmaChannelReset() and then call CyU3PDmaChannelSetXfer().

Please try this and let us know the results.

Best Regards,

Jayakrishna

Best Regards,
Jayakrishna

View solution in original post

0 Likes
4 Replies
JayakrishnaT_76
Moderator
Moderator
Moderator
First question asked 1000 replies posted 750 replies posted

Hello,

Please confirm that your project was working fine when it was built using SDK 1.3.3.

Also, please let me know the following details:

1. Is your project based on an SDK example? If yes, which SDK project is it based on?

2. Please let us know if you can share your project so that we can have a look at it.

3. Are you using a custom board or SuperSpeed explorer kit for testing?

4. What is the error seen on control center when you try to do a DATA IN from the bulk endpoint.

Best Regards,

Jayakrishna

Best Regards,
Jayakrishna
0 Likes

Hi Jayakrishna,

 

1. Is your project based on an SDK example? If yes, which SDK project is it based on?

    >>> Our project is based on an75779.zip

2. Please let us know if you can share your project so that we can have a look at it.

   >>> please see attached for key code.

3. Are you using a custom board or SuperSpeed explorer kit for testing?

   >>> using our product board.

4. What is the error seen on control center when you try to do a DATA IN from the bulk endpoint.

  >>> when call CyU3PDmaChannelGetBuffer(&glChHandleControlCPUEPin, &inBuf_p_control, CYU3P_WAIT_FOREVER) at Line 905

            the function never return any data. but the host app send the command data to this endpoint.

Thanks,

Martin

0 Likes

#include <cyu3system.h>

#include <cyu3os.h>

#include <cyu3dma.h>

#include <cyu3error.h>

#include <cyu3usb.h>

#include <cyu3uart.h>

#include <cyu3gpif.h>

#include <cyu3i2c.h>

#include <cyu3gpio.h>

#include <cyu3pib.h>

#include <cyu3utils.h>

CyBool_t glIsApplnActive = CyFalse; /* Whether the application is active or not. */

volatile CyBool_t glIsDevActivated = CyFalse;

Myu3v_Parater CYU3v_Parater={0,0,0};

unsigned char HID_Prod_Packet[8], HID_Cons_Packet[8];

uint8_t pollrate_02 = 0;

uint8_t pollrate_07 = 0;

volatile CyBool_t glIsDevInActivated;

static CyU3PEvent    glFxU3VEvent; 

static CyU3PSemaphore  I2CSema;    /* Semaphore used for I2C access. */

static CyU3PSemaphore  UpdateDataSema;

/* This function initializes the debug module. The debug prints

* are routed to the UART and can be seen using a UART console

* running at 115200 baud rate. */

void CyFxU3VApplnDebugInit(void)

{

CyU3PUartConfig_t uartConfig;

CyU3PReturnStatus_t apiRetStatus = CY_U3P_SUCCESS;

/* Initialize the UART for printing debug messages */

apiRetStatus = CyU3PUartInit();

if (apiRetStatus != CY_U3P_SUCCESS)

{

/* Error handling */

CyU3PDebugPrint(4, "Error Code = %d\r\n", apiRetStatus);

}

/* Set UART configuration */

CyU3PMemSet((uint8_t *) &uartConfig, 0, sizeof(uartConfig));

uartConfig.baudRate = CY_U3P_UART_BAUDRATE_115200;

uartConfig.stopBit = CY_U3P_UART_ONE_STOP_BIT;

uartConfig.parity = CY_U3P_UART_NO_PARITY;

uartConfig.txEnable = CyTrue;

uartConfig.rxEnable = CyFalse;

uartConfig.flowCtrl = CyFalse;

uartConfig.isDma = CyTrue;

apiRetStatus = CyU3PUartSetConfig(&uartConfig, NULL);

if (apiRetStatus != CY_U3P_SUCCESS)

{

CyU3PDebugPrint(4, "Error Code = %d\r\n", apiRetStatus);

}

/* Set the UART transfer to a really large value. */

apiRetStatus = CyU3PUartTxSetBlockXfer(0xFFFFFFFF);

if (apiRetStatus != CY_U3P_SUCCESS)

{

CyU3PDebugPrint(4, "Error Code = %d\r\n", apiRetStatus);

}

/* Initialize the debug module. */

apiRetStatus = CyU3PDebugInit(CY_U3P_LPP_SOCKET_UART_CONS, 8);

if (apiRetStatus != CY_U3P_SUCCESS)

{

CyU3PDebugPrint(4, "Error Code = %d\r\n", apiRetStatus);

}

CyU3PDebugPreamble(CyFalse);

}

static void CyFxUvcAppGpifInit(void)

{

CyU3PReturnStatus_t apiRetStatus;

CyU3PDebugPrint(4, "CyFxUvcAppGpifInit...\r\n");

/* Load the GPIF configuration for Slave FIFO sync mode. */

apiRetStatus = CyU3PGpifLoad(&CyFxGpifConfig);

if (apiRetStatus != CY_U3P_SUCCESS)

{

CyU3PDebugPrint(4, "CyU3PGpifLoad failed, Error Code = %d\n", apiRetStatus);

}

CyU3PGpifSocketConfigure(0, CY_U3P_PIB_SOCKET_0, 3, CyFalse, 1);

CyU3PGpifSocketConfigure(3, CY_U3P_PIB_SOCKET_3, 3, CyFalse, 1);

/* Start the state machine. */

apiRetStatus = CyU3PGpifSMStart(RESET, ALPHA_RESET);

if (apiRetStatus != CY_U3P_SUCCESS)

{

CyU3PDebugPrint(4, "CyU3PGpifSMStart failed, Error Code = %d\n", apiRetStatus);

}

}

void CyFxUvcApplnDmaCallback(CyU3PDmaChannel *ChHandle, CyU3PDmaCbType_t type, CyU3PDmaCBInput_t *input)

{

CyU3PReturnStatus_t status = CY_U3P_SUCCESS;

CyU3PDebugPrint (4, "CallBack type = %x\r\n",type);

switch (type)

{

case CY_U3P_DMA_CB_PROD_EVENT:

if (input->buffer_p.count == CY_FX_STR_BUF_FULL_SIZE)

{

status = CyU3PDmaChannelCommitBuffer(ChHandle, input->buffer_p.count, 0);

if (status != CY_U3P_SUCCESS)

{

CyU3PDebugPrint(1, "Commit Err: %x\r\n", status);

}

}

else

{

status = CyU3PDmaChannelCommitBuffer(ChHandle, input->buffer_p.count, 0);

if (status != CY_U3P_SUCCESS)

{

CyU3PDebugPrint(1, "Commit Err: %x\r\n", status);

}

}

break;

case CY_U3P_DMA_CB_CONS_EVENT:

break;

default:

break;

     }

}

/* Callback function to check for PIB ERROR*/

void PibErrorCallback(CyU3PPibIntrType cbType, uint16_t cbArg)

{

if (cbType == CYU3P_PIB_INTR_ERROR)

{

switch (CYU3P_GET_PIB_ERROR_TYPE(cbArg))

{

case CYU3P_PIB_ERR_THR0_WR_OVERRUN:

CyU3PDebugPrint(4, "CYU3P_PIB_ERR_THR0_WR_OVERRUN\n");

break;

case CYU3P_PIB_ERR_THR1_WR_OVERRUN:

CyU3PDebugPrint(4, "CYU3P_PIB_ERR_THR1_WR_OVERRUN\n");

break;

case CYU3P_PIB_ERR_THR2_WR_OVERRUN:

CyU3PDebugPrint(4, "CYU3P_PIB_ERR_THR2_WR_OVERRUN\n");

break;

case CYU3P_PIB_ERR_THR3_WR_OVERRUN:

CyU3PDebugPrint(4, "CYU3P_PIB_ERR_THR3_WR_OVERRUN\n");

break;

case CYU3P_PIB_ERR_THR0_RD_UNDERRUN:

CyU3PDebugPrint(4, "CYU3P_PIB_ERR_THR0_RD_UNDERRUN\n");

break;

case CYU3P_PIB_ERR_THR1_RD_UNDERRUN:

CyU3PDebugPrint(4, "CYU3P_PIB_ERR_THR1_RD_UNDERRUN\n");

break;

case CYU3P_PIB_ERR_THR2_RD_UNDERRUN:

CyU3PDebugPrint(4, "CYU3P_PIB_ERR_THR2_RD_UNDERRUN\n");

break;

case CYU3P_PIB_ERR_THR3_RD_UNDERRUN:

CyU3PDebugPrint(4, "CYU3P_PIB_ERR_THR3_RD_UNDERRUN\n");

break;

default:

CyU3PDebugPrint(4, "No Underrun/Overrun Error %d\r\n",CYU3P_GET_PIB_ERROR_TYPE(cbArg));

break;

}

}

}

/* This function starts the bulk loop application. This is called

* when a SET_CONF event is received from the USB host. The endpoints

* are configured and the DMA pipe is setup in this function. */

void CyFxU3VApplnStart(void)

{

uint16_t size = 0;

CyU3PEpConfig_t epCfg;

CyU3PDmaChannelConfig_t dmaCfg;

CyU3PReturnStatus_t apiRetStatus = CY_U3P_SUCCESS;

CyU3PUSBSpeed_t usbSpeed = CY_U3P_SUPER_SPEED;

    CyU3PDebugPrint(4, "CyFxU3VApplnStart !!!!\n");

/* First identify the usb speed. Once that is identified,

* create a DMA channel and start the transfer on this. */

/* Based on the Bus Speed configure the endpoint packet size */

switch (usbSpeed)

{

case CY_U3P_FULL_SPEED:

size = 64;

break;

case CY_U3P_HIGH_SPEED:

size = 512;

break;

case CY_U3P_SUPER_SPEED:

size = 1024;

break;

default:

CyU3PDebugPrint(4, "Error! Invalid USB speed.\n");

break;

}

CyU3PMemSet((uint8_t *) &epCfg, 0, sizeof(epCfg));

/*****************

* Endpoint 1 control out

******************/

/* Producer endpoint  1 configuration 控制通道 */

epCfg.enable = CyTrue;

epCfg.epType = CY_U3P_USB_EP_INTR;

epCfg.burstLen = (usbSpeed == CY_U3P_SUPER_SPEED) ? (CY_FX_EP_BURST_LENGTH) : 1;

epCfg.isoPkts = 1;

epCfg.streams = 0;

epCfg.pcktSize = size;

//epCfg.pcktSize = CY_FX_EP_BULK_VIDEO_PKT_SIZE;

apiRetStatus = CyU3PSetEpConfig(CY_FX_EP_PRODUCER(1), &epCfg);

if (apiRetStatus != CY_U3P_SUCCESS)

{

CyU3PDebugPrint(4, "CyU3PSetEpConfig failed, Error code = %d\n", apiRetStatus);

}

/*****************

* Endpoint 2 control in

******************/

/* Consumer endpoint 1 configuration 控制通道 */

apiRetStatus = CyU3PSetEpConfig(CY_FX_EP_CONSUMER(1), &epCfg);

if (apiRetStatus != CY_U3P_SUCCESS)

{

CyU3PDebugPrint(4, "CyU3PSetEpConfig failed, Error code = %d\n", apiRetStatus);

}

/* Flush the endpoint memory */

CyU3PUsbFlushEp(CY_FX_EP_PRODUCER(1));

CyU3PUsbFlushEp(CY_FX_EP_CONSUMER(1));

/*****************

* dma 1  control out

******************/

/* Create a DMA MANUAL_OUT channel for the producer socket. 控制out通道*/

dmaCfg.size = 1024; //size;

dmaCfg.count = 4; //CY_FX_BULKLP_DMA_BUF_COUNT;

dmaCfg.prodSckId = CY_U3P_CPU_SOCKET_PROD;

dmaCfg.consSckId = CY_U3P_UIB_SOCKET_CONS_1;  //??????????

dmaCfg.dmaMode = CY_U3P_DMA_MODE_BYTE;

/* No callback is required. */

dmaCfg.notification = 0;

dmaCfg.cb = 0;

dmaCfg.prodHeader = 0;

dmaCfg.prodFooter = 0;

dmaCfg.consHeader = 0;

dmaCfg.prodAvailCount = 0;

apiRetStatus = CyU3PDmaChannelCreate(&glChHandleControlCPUEPout, CY_U3P_DMA_TYPE_MANUAL_OUT, &dmaCfg);

if (apiRetStatus != CY_U3P_SUCCESS)

{

CyU3PDebugPrint(4, "CyU3PDmaChanneloutCreate failed, Error code = %d\n", apiRetStatus);

}

apiRetStatus = CyU3PDmaChannelSetXfer(&glChHandleControlCPUEPout,CY_FX_BULKLP_DMA_TX_SIZE);

if (apiRetStatus != CY_U3P_SUCCESS)

{

CyU3PDebugPrint(4, "CyU3PDmaChannelSetXfer Failed, Error code = %d\n", apiRetStatus);

}

/*****************

* dma 2  control in

******************/

/* Create a DMA MANUAL_IN channel for the consumer socket. 控制in通道*/

dmaCfg.size = 1024;

dmaCfg.count = 4;//CY_HID_DMA_BUF_COUNT;

dmaCfg.prodSckId =  CY_U3P_UIB_SOCKET_PROD_1;    //?????

dmaCfg.consSckId = CY_U3P_CPU_SOCKET_CONS;       //??????

dmaCfg.dmaMode = CY_U3P_DMA_MODE_BYTE;

/* No callback is required. */

dmaCfg.notification = 0;

dmaCfg.cb = NULL;

dmaCfg.prodHeader = 0;

dmaCfg.prodFooter = 0;

dmaCfg.consHeader = 0;

dmaCfg.prodAvailCount = 0;

apiRetStatus = CyU3PDmaChannelCreate(&glChHandleControlCPUEPin, CY_U3P_DMA_TYPE_MANUAL_IN, &dmaCfg);

if (apiRetStatus != CY_U3P_SUCCESS)

{

CyU3PDebugPrint(4, "CyU3PDmaChannelinCreate failed, Error code = %d\n", apiRetStatus);

// CyFxAppErrorHandler(apiRetStatus);

}

/* Set DMA Channel transfer size */

apiRetStatus = CyU3PDmaChannelSetXfer(&glChHandleControlCPUEPin,CY_FX_BULKLP_DMA_TX_SIZE);

if (apiRetStatus != CY_U3P_SUCCESS)

{

CyU3PDebugPrint(4, "CyU3PDmaChannelSetXfer Failed, Error code = %d\n", apiRetStatus);

}

/*****************

* Endpoint 3    BULK

******************/

/* Consumer endpoint configuration */

epCfg.enable = CyTrue;

epCfg.epType = CY_U3P_USB_EP_BULK;

epCfg.burstLen = (usbSpeed == CY_U3P_SUPER_SPEED) ? (CY_FX_EP_BURST_LENGTH) : 1;

epCfg.streams = 0;

epCfg.pcktSize = size;

//epCfg.pcktSize = CY_FX_EP_BULK_VIDEO_PKT_SIZE;

epCfg.isoPkts = 1;

apiRetStatus = CyU3PSetEpConfig(CY_FX_EP_PRODUCER(2), &epCfg);

if (apiRetStatus != CY_U3P_SUCCESS)

{

CyU3PDebugPrint(4, "CyU3PSetEpConfig failed, Error code = %d\n", apiRetStatus);

}

/*****************

  * Endpoint 4    BULK

******************/

/* Consumer endpoint configuration */

apiRetStatus = CyU3PSetEpConfig(CY_FX_EP_CONSUMER(2), &epCfg);

if (apiRetStatus != CY_U3P_SUCCESS)

{

CyU3PDebugPrint(4, "CyU3PSetEpConfig failed, Error code = %d\n", apiRetStatus);

}

/* Flush the endpoint memory */

CyU3PUsbFlushEp(CY_FX_EP_PRODUCER(2));

CyU3PUsbFlushEp(CY_FX_EP_CONSUMER(2));

/*****************

* dma 3  BULK out

******************/

/* Create a DMA MANUAL_OUT channel for the producer socket. BULK out通道*/

dmaCfg.size = 5*1024; //size;

dmaCfg.count = 4; //CY_FX_BULKLP_DMA_BUF_COUNT;

dmaCfg.prodSckId = CY_U3P_CPU_SOCKET_PROD;

dmaCfg.consSckId = CY_U3P_UIB_SOCKET_CONS_2;  //??????????

dmaCfg.dmaMode = CY_U3P_DMA_MODE_BYTE;

/* No callback is required. */

dmaCfg.notification = 0;

dmaCfg.cb = NULL;

dmaCfg.prodHeader = 0;

dmaCfg.prodFooter = 0;

dmaCfg.consHeader = 0;

dmaCfg.prodAvailCount = 0;

apiRetStatus = CyU3PDmaChannelCreate(&glChHandleBulkCPUEPout, CY_U3P_DMA_TYPE_MANUAL_OUT, &dmaCfg);

if (apiRetStatus != CY_U3P_SUCCESS)

{

CyU3PDebugPrint(4, "CyU3PDmaChannelBulkoutCreate failed, Error code = %d\n", apiRetStatus);

}

apiRetStatus = CyU3PDmaChannelSetXfer(&glChHandleBulkCPUEPout,CY_FX_BULKLP_DMA_TX_SIZE);

if (apiRetStatus != CY_U3P_SUCCESS)

{

CyU3PDebugPrint(4, "CyU3PDmaChannelSetXfer Failed, Error code = %d\n", apiRetStatus);

}

/*****************

* dma 4  bulk in

******************/

/* Create a DMA MANUAL_IN channel for the consumer socket. bulk in通道*/

dmaCfg.size = 5*1024;

dmaCfg.count = 4;//CY_HID_DMA_BUF_COUNT;

dmaCfg.prodSckId = CY_U3P_UIB_SOCKET_PROD_2;

dmaCfg.consSckId = CY_U3P_CPU_SOCKET_CONS;

dmaCfg.dmaMode = CY_U3P_DMA_MODE_BYTE;

/* No callback is required. */

dmaCfg.notification = 0;

dmaCfg.cb = NULL;

dmaCfg.prodHeader = 0;

dmaCfg.prodFooter = 0;

dmaCfg.consHeader = 0;

dmaCfg.prodAvailCount = 0;

apiRetStatus = CyU3PDmaChannelCreate(&glChHandleBulkCPUEPin, CY_U3P_DMA_TYPE_MANUAL_IN, &dmaCfg);

if (apiRetStatus != CY_U3P_SUCCESS)

{

CyU3PDebugPrint(4, "CyU3PDmaChannelBulkinCreate failed, Error code = %d\n", apiRetStatus);

}

/* Set DMA Channel transfer size */

apiRetStatus = CyU3PDmaChannelSetXfer(&glChHandleBulkCPUEPin,CY_FX_BULKLP_DMA_TX_SIZE);

if (apiRetStatus != CY_U3P_SUCCESS)

{

CyU3PDebugPrint(4, "CyU3PDmaChannelSetXfer Failed, Error code = %d\n", apiRetStatus);

}

/*****************

* Endpoint 5

******************/

/* Consumer endpoint configuration */

epCfg.enable = CyTrue;

epCfg.epType = CY_U3P_USB_EP_BULK;

epCfg.burstLen = (usbSpeed == CY_U3P_SUPER_SPEED) ? (CY_FX_EP_BURST_LENGTH) : 1;

epCfg.streams = 0;

epCfg.pcktSize = size;

//epCfg.pcktSize = CY_FX_EP_BULK_VIDEO_PKT_SIZE;

epCfg.isoPkts = 1;

apiRetStatus = CyU3PSetEpConfig(CY_FX_EP_CONSUMER(3), &epCfg);

if (apiRetStatus != CY_U3P_SUCCESS)

{

CyU3PDebugPrint(4, "CyU3PSetEpConfig failed, Error code = %d\n", apiRetStatus);

}

/* Flush the endpoint memory */

CyU3PUsbFlushEp(CY_FX_EP_CONSUMER(3));

/*****************

* dma 5  bulk in stream

******************/

/* Create a DMA MANUAL_OUT channel for the consumer socket. */

dmaCfg.size = CY_FX_STR_BUF_FULL_SIZE ;

dmaCfg.count = CY_FX_BULKLP_DMA_BUF_COUNT;

dmaCfg.prodSckId = CY_U3P_PIB_SOCKET_0; //

dmaCfg.consSckId = CY_U3P_UIB_SOCKET_CONS_3;

dmaCfg.dmaMode = CY_U3P_DMA_MODE_BYTE;

/* Enabling the callback for produce event. */

dmaCfg.notification =0;

dmaCfg.cb = 0;

dmaCfg.prodHeader = 0;

dmaCfg.prodFooter = 0;

dmaCfg.prodAvailCount = 0;

apiRetStatus = CyU3PDmaChannelCreate(&glChHandleStreamEpin, CY_U3P_DMA_TYPE_AUTO , &dmaCfg);

if (apiRetStatus != CY_U3P_SUCCESS)

{

CyU3PDebugPrint(4, "CyU3PDmaChannelStreaminCreate failed, Error code = %d\n", apiRetStatus);

}

/* Set DMA Channel transfer size */

apiRetStatus = CyU3PDmaChannelSetXfer(&glChHandleStreamEpin,CY_FX_BULKLP_DMA_TX_SIZE);

if (apiRetStatus != CY_U3P_SUCCESS)

{

CyU3PDebugPrint(4, "CyU3PDmaChannelSetXfer Failed, Error code = %d\n", apiRetStatus);

}

/* spi dma for user data read from/write to flash */

CyU3PDebugPrint(4, "USB Init Successful \r\n");

// CyU3PPibRegisterCallback(PibErrorCallback, 0xFFFF); //打开全部通知

//CyU3PThreadSleep(1000);

/* Update the flag so that the application thread is notified of this. */

glIsApplnActive = CyTrue;

}

/* This function stops the bulk loop application. This shall be called whenever

* a RESET or DISCONNECT event is received from the USB host. The endpoints are

* disabled and the DMA pipe is destroyed by this function. */

void CyFxU3VApplnStop(void)

{

CyU3PEpConfig_t epCfg;

CyU3PReturnStatus_t apiRetStatus = CY_U3P_SUCCESS;

CyU3PDebugPrint(4, "CyFxU3VApplnStop !!!!\n");

/* Update the flag so that the application thread is notified of this. */

if(glIsApplnActive == CyFalse) {return;}

glIsApplnActive = CyFalse;

/* Destroy the channels */

CyU3PDmaChannelDestroy(&glChHandleControlCPUEPin);

CyU3PDmaChannelDestroy(&glChHandleControlCPUEPout);

CyU3PDmaChannelDestroy(&glChHandleBulkCPUEPin);

CyU3PDmaChannelDestroy(&glChHandleBulkCPUEPout);

CyU3PDmaChannelDestroy(&glChHandleStreamEpin);

CyU3PDmaChannelDestroy(&glChHandleBulkSpi2Cpu);

CyU3PDmaChannelDestroy(&glChHandleBulkCpu2Spi);

/* Flush the endpoint memory */

CyU3PUsbFlushEp(CY_FX_EP_PRODUCER(1));

CyU3PUsbFlushEp(CY_FX_EP_CONSUMER(1));

CyU3PUsbFlushEp(CY_FX_EP_PRODUCER(2));

CyU3PUsbFlushEp(CY_FX_EP_CONSUMER(2));

CyU3PUsbFlushEp(CY_FX_EP_CONSUMER(3));

/* Disable endpoints. */

CyU3PMemSet((uint8_t *) &epCfg, 0, sizeof(epCfg));

epCfg.enable = CyFalse;

/* Producer endpoint configuration. */

apiRetStatus = CyU3PSetEpConfig(CY_FX_EP_PRODUCER(1), &epCfg);

if (apiRetStatus != CY_U3P_SUCCESS)

{

CyU3PDebugPrint(4, "CyU3PSetEpConfig failed, Error code = %d\n", apiRetStatus);

}

/* Consumer endpoint configuration. */

apiRetStatus = CyU3PSetEpConfig(CY_FX_EP_CONSUMER(1), &epCfg);

if (apiRetStatus != CY_U3P_SUCCESS)

{

CyU3PDebugPrint(4, "CyU3PSetEpConfig failed, Error code = %d\n", apiRetStatus);

}

apiRetStatus = CyU3PSetEpConfig(CY_FX_EP_PRODUCER(2), &epCfg);

if (apiRetStatus != CY_U3P_SUCCESS)

{

CyU3PDebugPrint(4, "CyU3PSetEpConfig failed, Error code = %d\n", apiRetStatus);

}

apiRetStatus = CyU3PSetEpConfig(CY_FX_EP_CONSUMER(2), &epCfg);

if (apiRetStatus != CY_U3P_SUCCESS)

{

CyU3PDebugPrint(4, "CyU3PSetEpConfig failed, Error code = %d\n", apiRetStatus);

}

apiRetStatus = CyU3PSetEpConfig(CY_FX_EP_CONSUMER(3), &epCfg);

if (apiRetStatus != CY_U3P_SUCCESS)

{

CyU3PDebugPrint(4, "CyU3PSetEpConfig failed, Error code = %d\n", apiRetStatus);

}

CyU3PGpifDisable(CyTrue); //关闭GPIF

}

CyBool_t CyFxU3VApplnLPMRqtCB(CyU3PUsbLinkPowerMode link_mode)

{

return CyTrue;

}

void CyFxU3VApplnUSBEventCB(CyU3PUsbEventType_t evtype, /* Event type */

uint16_t evdata /* Event data */

)

{

CyU3PDebugPrint(4, "Get Event! evtype=0x%x evdata=0x%x\r\n", evtype, evdata);

switch (evtype)

{

case CY_U3P_USB_EVENT_RESET:

CyU3PDebugPrint (4, "USB reset...\r\n");

CyU3PConnectState(CyFalse, CyFalse);

break;

case CY_U3P_USB_EVENT_DISCONNECT:

CyU3PDebugPrint (4, "USB disconnected...\r\n");

CyU3PConnectState(CyFalse, CyFalse);

CyU3PEventSet (&glFxU3VEvent,CY_FX_U3VC_USB_DISCONNECT_EVENT, CYU3P_EVENT_OR);

break;

case CY_U3P_USB_EVENT_CONNECT: //USB连接

CyU3PDebugPrint (4, "USB connected...\r\n");

CyU3PEventSet (&glFxU3VEvent,CY_FX_U3VC_USB_CONNECT_EVENT, CYU3P_EVENT_OR);

CyU3PUsbLPMDisable ();

break;

case CY_U3P_USB_EVENT_VBUS_VALID:

break;

case CY_U3P_USB_EVENT_VBUS_REMOVED:

break;

default:

break;

}

}

/* Callback to handle the USB setup requests. */

CyBool_t CyFxU3VlnUSBSetupCB(uint32_t setupdat0, /* SETUP Data 0 */

uint32_t setupdat1 /* SETUP Data 1 */

)

{

/* Fast enumeration is used. Only requests addressed to the interface, class,

* vendor and unknown control requests are received by this function.

* This application does not support any class or vendor requests. */

uint8_t bRequest, bmReqType;

uint8_t bType, bTarget, bDirect;

uint16_t wValue, wIndex, wLength;

uint32_t status;

CyBool_t isHandled = CyFalse;

uint8_t ep0Buf[64];

uint16_t readCount;

/* Decode the fields from the setup request. */

bmReqType = (setupdat0 & CY_U3P_USB_REQUEST_TYPE_MASK);

bDirect = (bmReqType & CY_U3P_USB_DIRECTION_MASK) >> CY_U3P_USB_DIRECTION_POS;

bType = (bmReqType & CY_U3P_USB_TYPE_MASK);

bTarget = (bmReqType & CY_U3P_USB_TARGET_MASK);

bRequest = ((setupdat0 & CY_U3P_USB_REQUEST_MASK) >> CY_U3P_USB_REQUEST_POS);

wValue = ((setupdat0 & CY_U3P_USB_VALUE_MASK) >> CY_U3P_USB_VALUE_POS);

wIndex = ((setupdat1 & CY_U3P_USB_INDEX_MASK) >> CY_U3P_USB_INDEX_POS);

wLength = (uint16_t) ((setupdat1 & CY_FX_USB_SETUP_LENGTH_MASK ) >> 16);

CyU3PDebugPrint(4, "bmReqType 0x%x bRequest 0x%x wValue 0x%x wIndex 0x%x wLength 0x%x\n", bmReqType, bRequest, wValue, wIndex, wLength);

switch (bmReqType)

{

case CY_U3P_USB_CLASS_RQT:

if (wIndex == 0x02)

{

switch (bRequest)

{

case 0x01:

CyU3PMemSet(ep0Buf, 0, 64);

CyU3PMemCopy(ep0Buf, HID_Cons_Packet, HID_Cons_Packet[0]);

status = CyU3PUsbSendEP0Data(64, ep0Buf);

break;

case 0x02:

if (CY_U3P_DWORD_GET_BYTE0(wValue) == 0x2)

{

ep0Buf[0] = pollrate_02;

}

else if (CY_U3P_DWORD_GET_BYTE0(wValue) == 0x7)

{

ep0Buf[0] = pollrate_07;

}

else

{

;

}

status = CyU3PUsbSendEP0Data(1, ep0Buf);

break;

case 0x03:

CyU3PUsbAckSetup();

CyU3PDebugPrint(4, " set feature 03\n");

break;

case 0x09:

status = CyU3PUsbGetEP0Data(64, ep0Buf, &readCount);

if (status != 0)

{

;

}

else

{

if (wIndex == 0x02 && bRequest == 0x09) //EEPROM擦除和设备冷启动

{

CyU3PUsbGetEP0Data(64, ep0Buf, &readCount);

CyU3PMemCopy(HID_Prod_Packet, ep0Buf, 64);

if (HID_Prod_Packet[1] == 0xaa)

{

CyU3PDebugPrint(4, "EEPROM Erase!\n");

CyFxEEPROMErase();

}

else if (HID_Prod_Packet[1] == 0xbb)

{

CyU3PDebugPrint(4, "Reset!\n");

CyU3PDeviceReset(CyFalse);

}

}

break;

case 0x0A:

CyU3PUsbAckSetup();

if (CY_U3P_DWORD_GET_BYTE0(wValue) == 0x2)

{

pollrate_02 = CY_U3P_DWORD_GET_BYTE1(wValue);

}

else if (CY_U3P_DWORD_GET_BYTE0(wValue) == 0x7)

{

pollrate_07 = CY_U3P_DWORD_GET_BYTE1(wValue);

}

else

{

;

}

break;

case 0x0B:

CyU3PUsbAckSetup();

break;

default:

break;

}

}

}

break;

case CY_U3P_USB_STANDARD_RQT:

if ((bTarget == CY_U3P_USB_TARGET_INTF) && ((bRequest == CY_U3P_USB_SC_SET_FEATURE) || (bRequest == CY_U3P_USB_SC_CLEAR_FEATURE)) && (wValue == 0))

{

if (glIsApplnActive)

CyU3PUsbAckSetup();

else

CyU3PUsbStall(0, CyTrue, CyFalse);

isHandled = CyTrue;

}

}

return isHandled;

}

/* GpifCB callback function is invoked when FV triggers GPIF interrupt */

void CyFxGpifCB(CyU3PGpifEventType event, uint8_t currentState)

{

}

void CyFxU3VApplnInit(void)

{

CyU3PReturnStatus_t apiRetStatus = CY_U3P_SUCCESS;

CyU3PPibClock_t pibclock;

apiRetStatus = CyU3PEventCreate (&glFxU3VEvent);

    if (apiRetStatus != 0)

    {

        CyU3PDebugPrint (4, "U3V Create Event failed, Error Code = %d\n", apiRetStatus);

    }

    CyU3PThreadResume(&UsbHotplugThread);

CyU3PThreadResume(&DeviceStatusPollThread);

/* Initialize the P-port. */

pibclock.clkDiv = 2;

pibclock.clkSrc = CY_U3P_SYS_CLK;

pibclock.isDllEnable = CyFalse;

pibclock.isHalfDiv = CyFalse;

apiRetStatus = CyU3PPibInit(CyTrue, &pibclock);

if (apiRetStatus != CY_U3P_SUCCESS)

{

CyU3PDebugPrint(4, "PIB Function Failed to Start, Error Code = %d\n", apiRetStatus);

}

// /* Setup the Callback to Handle the GPIF INTR event */

// CyU3PGpifRegisterCallback(CyFxGpifCB);

/* Start the USB functionality. */

apiRetStatus = CyU3PUsbStart();

if (apiRetStatus != CY_U3P_SUCCESS)

{

CyU3PDebugPrint(4, "CyU3PUsbStart failed to Start, Error code = %d\n", apiRetStatus);

}

/* The fast enumeration is the easiest way to setup a USB connection,

* where all enumeration phase is handled by the library. Only the

* class / vendor requests need to be handled by the application. */

CyU3PUsbRegisterSetupCallback(CyFxU3VlnUSBSetupCB, CyTrue);

/* Setup the callback to handle the USB events. */

CyU3PUsbRegisterEventCallback(CyFxU3VApplnUSBEventCB);

/* Register a callback to handle LPM requests from the USB 3.0 host. */

CyU3PUsbRegisterLPMRequestCallback(CyFxU3VApplnLPMRqtCB);

/* Set the USB Enumeration descriptors */

/* Super speed device descriptor. */

apiRetStatus = CyU3PUsbSetDesc(CY_U3P_USB_SET_SS_DEVICE_DESCR, 0, (uint8_t *) CyFxUSBDeviceDscrSS);

if (apiRetStatus != CY_U3P_SUCCESS)

{

CyU3PDebugPrint(4, "USB set device descriptor failed, Error code = %d\n", apiRetStatus);

}

/* High speed device descriptor. */

apiRetStatus = CyU3PUsbSetDesc(CY_U3P_USB_SET_HS_DEVICE_DESCR, 0, (uint8_t *) CyFxUSBDeviceDscr);

if (apiRetStatus != CY_U3P_SUCCESS)

{

CyU3PDebugPrint(4, "USB set device descriptor failed, Error code = %d\n", apiRetStatus);

}

/* BOS descriptor */

apiRetStatus = CyU3PUsbSetDesc(CY_U3P_USB_SET_SS_BOS_DESCR, 0, (uint8_t *) CyFxUSBBOSDscr);

if (apiRetStatus != CY_U3P_SUCCESS)

{

CyU3PDebugPrint(4, "USB set configuration descriptor failed, Error code = %d\n", apiRetStatus);

}

/* Device qualifier descriptor */

apiRetStatus = CyU3PUsbSetDesc(CY_U3P_USB_SET_DEVQUAL_DESCR, 0, (uint8_t *) CyFxUSBDeviceQualDscr);

if (apiRetStatus != CY_U3P_SUCCESS)

{

CyU3PDebugPrint(4, "USB set device qualifier descriptor failed, Error code = %d\n", apiRetStatus);

}

/* Super speed configuration descriptor */

apiRetStatus = CyU3PUsbSetDesc(CY_U3P_USB_SET_SS_CONFIG_DESCR, 0, (uint8_t *) CyFxUSBSSConfigDscr);

if (apiRetStatus != CY_U3P_SUCCESS)

{

CyU3PDebugPrint(4, "USB set configuration descriptor failed, Error code = %d\n", apiRetStatus);

}

/* High speed configuration descriptor */

apiRetStatus = CyU3PUsbSetDesc(CY_U3P_USB_SET_HS_CONFIG_DESCR, 0, (uint8_t *) CyFxUSBHSConfigDscr);

if (apiRetStatus != CY_U3P_SUCCESS)

{

CyU3PDebugPrint(4, "USB Set Other Speed Descriptor failed, Error Code = %d\n", apiRetStatus);

}

/* Full speed configuration descriptor */

apiRetStatus = CyU3PUsbSetDesc(CY_U3P_USB_SET_FS_CONFIG_DESCR, 0, (uint8_t *) CyFxUSBFSConfigDscr);

if (apiRetStatus != CY_U3P_SUCCESS)

{

CyU3PDebugPrint(4, "USB Set Configuration Descriptor failed, Error Code = %d\n", apiRetStatus);

}

/* String descriptor 0 */

apiRetStatus = CyU3PUsbSetDesc(CY_U3P_USB_SET_STRING_DESCR, 0, (uint8_t *) CyFxUSBStringLangIDDscr);

if (apiRetStatus != CY_U3P_SUCCESS)

{

CyU3PDebugPrint(4, "USB set string descriptor failed, Error code = %d\n", apiRetStatus);

}

/* String descriptor 1 */

apiRetStatus = CyU3PUsbSetDesc(CY_U3P_USB_SET_STRING_DESCR, 1, (uint8_t *) CyFxUSBManufactureDscr);

if (apiRetStatus != CY_U3P_SUCCESS)

{

CyU3PDebugPrint(4, "USB set string descriptor failed, Error code = %d\n", apiRetStatus);

}

/* String descriptor 2 */

apiRetStatus = CyU3PUsbSetDesc(CY_U3P_USB_SET_STRING_DESCR, 2, (uint8_t *) CyFxUSBProductDscr);

if (apiRetStatus != CY_U3P_SUCCESS)

{

CyU3PDebugPrint(4, "USB set string descriptor failed, Error code = %d\n", apiRetStatus);

}

CyFxU3VApplnStart();

/* Connect the USB Pins with super speed operation enabled. */

// apiRetStatus = CyU3PConnectState(CyTrue, CyFalse);

apiRetStatus = CyU3PConnectState(CyTrue, CyTrue);

if (apiRetStatus != CY_U3P_SUCCESS)

{

CyU3PDebugPrint(4, "USB Connect failed, Error code = %d\n", apiRetStatus);

}

}

/* I2C initialization. */

static void CyFxU3VApplnI2CInit(void)

{

CyU3PI2cConfig_t i2cConfig;

CyU3PReturnStatus_t status;

status = CyU3PI2cInit();

if (status != CY_U3P_SUCCESS)

{

CyU3PDebugPrint(4, "I2C initialization failed!\n");

}

/*  Set I2C Configuration */

i2cConfig.bitRate = 100000; /*  100 KHz */

i2cConfig.isDma = CyFalse;

i2cConfig.busTimeout = 0xffffffffU;

i2cConfig.dmaTimeout = 0xffff;

status = CyU3PI2cSetConfig(&i2cConfig, 0);

if (CY_U3P_SUCCESS != status)

{

CyU3PDebugPrint(4, "I2C configuration failed!\n");

}

}

void BulkThread_Entry(uint32_t input)

{

CyU3PDmaBuffer_t inBuf_p_com, com_inBuf_p, com_outBuf_p;

CyU3PReturnStatus_t status = CY_U3P_SUCCESS;

uint16_t sendlength;

uint32_t ReadData;

int i=10;

CyFxU3VApplnInit();

CyFxUvcAppGpifInit(); //初始化GPIF

CyU3PTimerStart(&KeyCheckTimer);

connect_ver_info();

VerifyAds1000DevAddr();

status = CyFxSelfDefineDataTransfer(&self_data, CyTrue);

if(status)

{

CyU3PDebugPrint(4, "CyFxSelfDefineDataTransfer failed, Error code = %d\n", status);

}

for (;;)

{

if (glIsApplnActive)

{

          status = CyU3PDmaChannelGetBuffer(&glChHandleBulkCPUEPin, &inBuf_p_com, CYU3P_WAIT_FOREVER); //等待HOST数据

            //CyU3PDebugPrint(4, "run to = %d\n", __LINE__);

if (status != CY_U3P_SUCCESS)

{

if (!glIsApplnActive)

{

    continue;

}

else

{

CyU3PDebugPrint(4, "CyU3PDmaChannelGetBuffer failed, Error code = %d\n", status);

}

}

com_inBuf_p = inBuf_p_com;

status = CyU3PDmaChannelDiscardBuffer(&glChHandleBulkCPUEPin);

if (status != CY_U3P_SUCCESS)

{

CyU3PDebugPrint(4, "Control DMA Discard failed!\n");

}

status = CyU3PDmaChannelGetBuffer(&glChHandleBulkCPUEPout, &com_outBuf_p, CYU3P_WAIT_FOREVER);

sendlength = process(com_inBuf_p, com_outBuf_p);//返回长度

            status = CyU3PDmaChannelCommitBuffer(&glChHandleBulkCPUEPout, sendlength, 0);

if (status != CY_U3P_SUCCESS)

{

    CyU3PUsbSetEpNak(CY_FX_EP_CONSUMER(2), CyTrue);

CyU3PThreadSleep(1);

//abort and destroy the CPU2USB dma channel

CyU3PDmaChannelReset(&glChHandleBulkCPUEPout);

CyU3PDmaChannelSetXfer(&glChHandleBulkCPUEPout, 0);

CyU3PThreadSleep(25);

CyU3PUsbFlushEp(CY_FX_EP_CONSUMER(2));

CyU3PUsbSetEpNak(CY_FX_EP_CONSUMER(2), CyFalse);

CyU3PThreadSleep(1);

CyU3PDebugPrint(4, "Control DMA send failed!\n");

}

if(CYU3v_Parater.U3V_Bulk_Reboot_Flag == 1)

{

CYU3v_Parater.U3V_Bulk_Reboot_Flag = 0;

CyU3PThreadSleep(25);

CyU3PDeviceReset(CyFalse);

   }

}

CyU3PThreadRelinquish();

}

}

void ControlThread_Entry(uint32_t input)

{

CyU3PDmaBuffer_t inBuf_p_control, control_inBuf_p, control_outBuf_p;

CyU3PReturnStatus_t status = CY_U3P_SUCCESS;

uint16_t sendlength;

for (;;)

{

if (glIsApplnActive)

{

status = CyU3PDmaChannelGetBuffer(&glChHandleControlCPUEPin, &inBuf_p_control, CYU3P_WAIT_FOREVER); //等待HOST数据

if (status != CY_U3P_SUCCESS)

{

if (!glIsApplnActive)

{

    CyU3PDebugPrint(4, "run to = %d \n", __LINE__);

continue;

}

else

{

CyU3PDebugPrint(4, "CyU3PDmaChannelGetBuffer failed, Error code = %d\n", status);

}

}

control_inBuf_p = inBuf_p_control;

status = CyU3PDmaChannelDiscardBuffer(&glChHandleControlCPUEPin);

if (status != CY_U3P_SUCCESS)

{

CyU3PDebugPrint(4, "Control DMA Discard failed!\n");

}

//CyU3PDebugPrint(4, "run to = %d failure_counter = %d\n\r", __LINE__,failure_counter);

status = CyU3PDmaChannelGetBuffer(&glChHandleControlCPUEPout, &control_outBuf_p, /*CYU3P_WAIT_FOREVER*/3000);

//CyU3PDebugPrint(4, "run to = %d \n\r", __LINE__);

if (status != CY_U3P_SUCCESS)

{

    CyU3PDebugPrint(4, "Failed to CyU3PDmaChannelGetBuffer %d\n\r",status);

ReBuildCreatCommandChannel();

CyU3PUsbSetEpNak(CY_FX_EP_CONSUMER(1), CyTrue);

CyU3PThreadSleep(1);

//abort and destroy the CPU2USB dma channel

CyU3PDmaChannelReset(&glChHandleControlCPUEPout);

CyU3PDmaChannelSetXfer(&glChHandleControlCPUEPout, 0);

CyU3PThreadSleep(25);

CyU3PUsbFlushEp(CY_FX_EP_CONSUMER(1));

CyU3PUsbSetEpNak(CY_FX_EP_CONSUMER(1), CyFalse);

CyU3PThreadSleep(1);

CyU3PDebugPrint(4, "Control DMA send failed-1!\n\r");

continue;

}

sendlength = control(control_inBuf_p, control_outBuf_p);//返回长度

            //CyU3PDebugPrint(4, "run to = %d sendlength=%d\n\r", __LINE__,sendlength);

status = CyU3PDmaChannelCommitBuffer(&glChHandleControlCPUEPout, sendlength, 0);

if (status != CY_U3P_SUCCESS)

{

    CyU3PDebugPrint(4, "Failed to CommitBuffer = %d!\n\r",status);

ReBuildCreatCommandChannel();

    CyU3PUsbSetEpNak(CY_FX_EP_CONSUMER(1), CyTrue);

CyU3PThreadSleep(1);

//abort and destroy the CPU2USB dma channel

CyU3PDmaChannelReset(&glChHandleControlCPUEPout);

CyU3PDmaChannelSetXfer(&glChHandleControlCPUEPout, 0);

CyU3PThreadSleep(25);

CyU3PUsbFlushEp(CY_FX_EP_CONSUMER(1));

CyU3PUsbSetEpNak(CY_FX_EP_CONSUMER(1), CyFalse);

CyU3PThreadSleep(1);

}

if(failure_counter > 2)

{

   CYU3v_Parater.U3V_Control_Reboot_Flag = 1;

}

if(CYU3v_Parater.U3V_Control_Reboot_Flag == 1)

{

CYU3v_Parater.U3V_Control_Reboot_Flag=0;

CyU3PThreadSleep(25);

CyU3PDeviceReset(CyFalse);

}

}

CyU3PThreadRelinquish();

}

}

void CyFxApplicationDefine(void)

{

void *ptr1, *ptr2, *ptr3,*ptr4,*ptr5;

uint32_t retThrdCreate;

#ifdef U3V_ISCAN

CyU3PTimerCreate(&WtachdogTimer,CyCx3WatchdogAppTimer,0x00,TIMER_PERIOD,TIMER_PERIOD,CYU3P_AUTO_START);

CyU3PTimerCreate(&KeyCheckTimer,CyCx3KeyCheckTimer,0x00,TIMER_PERIOD_KEY,TIMER_PERIOD_KEY,CYU3P_DONT_START);

CyU3PTimerCreate(&sw_gpio_pwm_timer,SwGpioPwm_Timer,0x00,TIMER_PERIOD_KEY,TIMER_PERIOD_KEY,CYU3P_AUTO_START);

retThrdCreate = CyU3PSemaphoreCreate (&I2CSema,1);

if(retThrdCreate != 0)

{

goto fatalErrorHandler;

}

retThrdCreate = CyU3PSemaphoreCreate (&UpdateDataSema,1);

if(retThrdCreate != 0)

{

goto fatalErrorHandler;

}

#else

#endif

//初始化线程

/* Allocate the memory for the threads */

/* Allocate the memory for the thread stacks. */

ptr1 = CyU3PMemAlloc(U3V_APP_THREAD_STACK);

ptr2 = CyU3PMemAlloc(U3V_APP_THREAD_STACK);

ptr3 = CyU3PMemAlloc(U3V_APP_THREAD_STACK);

#ifdef U3V_ISCAN

ptr4 = CyU3PMemAlloc(UVC_APP_THREAD_STACK/2);

    ptr5 = CyU3PMemAlloc(UVC_APP_THREAD_STACK/2);

#endif

if ((ptr1 == 0) || (ptr2 == 0) || (ptr3 == 0)|| (ptr4 == 0) || (ptr5 == 0))

{

goto fatalErrorHandler;

}

/* Create the thread for the application */

/* FPGA start thread */

retThrdCreate = CyU3PThreadCreate(&FPGABootThread, /* FX3 Initialization App Thread structure */

                                  "20:FPGA Boot Thread", /* Thread ID and Thread name */

                                   FPGA_PSBoot_Thread_Entry, /* FX3 Initialization App Thread Entry function */

                                   0, /* No input parameter to thread */

                                   ptr1, /* Pointer to the allocated thread stack */

                                   U3V_APP_THREAD_STACK, /* UVC Application Thread stack size */

                                   U3V_APP_THREAD_PRIORITY+1, /* UVC Application Thread priority */

                                   U3V_APP_THREAD_PRIORITY, /* Threshold value for thread pre-emption. */

                                   CYU3P_NO_TIME_SLICE, /* No time slice for the application thread */

                                   CYU3P_AUTO_START /* Start the Thread immediately */

                                   );

/* Check the return code */

if (retThrdCreate != 0)

{

goto fatalErrorHandler;

}

/* Create the thread for the application */

/* communication thread */

retThrdCreate = CyU3PThreadCreate(&BulkThread, /* Control Information App Thread structure */

                                  "21:comThread", /* Thread ID and Thread name */

                                  BulkThread_Entry, /* Control Information App Thread Entry function */

                                  0, /* No input parameter to thread */

                                  ptr2, /* Pointer to the allocated thread stack */

                                  U3V_APP_THREAD_STACK, /* UVC Application Thread stack size */

                                  U3V_APP_THREAD_PRIORITY, /* UVC Application Thread priority */

                                  U3V_APP_THREAD_PRIORITY, /* Threshold value for thread pre-emption. */

                                  CYU3P_NO_TIME_SLICE, /* No time slice for the application thread */

                                  CYU3P_DONT_START /* Start the Thread immediately */

                                  );

/* Check the return code */

if (retThrdCreate != 0)

{

goto fatalErrorHandler;

}

retThrdCreate = CyU3PThreadCreate(&ControlThread, /* Control Information App Thread structure */

"21:ControlThread", /* Thread ID and Thread name */

ControlThread_Entry, /* Control Information App Thread Entry function */

0, /* No input parameter to thread */

ptr3, /* Pointer to the allocated thread stack */

U3V_APP_THREAD_STACK, /* UVC Application Thread stack size */

U3V_APP_THREAD_PRIORITY, /* UVC Application Thread priority */

U3V_APP_THREAD_PRIORITY, /* Threshold value for thread pre-emption. */

CYU3P_NO_TIME_SLICE, /* No time slice for the application thread */

CYU3P_DONT_START /* Start the Thread immediately */

);

/* Check the return code */

if (retThrdCreate != 0)

{

goto fatalErrorHandler;

}

    retThrdCreate = CyU3PThreadCreate(&UsbHotplugThread, /* Control Information App Thread structure */

"21:PollUsbWrongSpeed", /* Thread ID and Thread name */

Usb_hotplug_handle_Entry, /* Control Information App Thread Entry function */

0, /* No input parameter to thread */

ptr4, /* Pointer to the allocated thread stack */

UVC_APP_THREAD_STACK/2, /* UVC Application Thread stack size */

UVC_APP_THREAD_PRIORITY, /* UVC Application Thread priority */

UVC_APP_THREAD_PRIORITY, /* Threshold value for thread pre-emption. */

CYU3P_NO_TIME_SLICE, /* No time slice for the application thread */

CYU3P_DONT_START /* Start the Thread immediately */

);

/* Check the return code */

if (retThrdCreate != 0)

{

goto fatalErrorHandler;

}

retThrdCreate = CyU3PThreadCreate(&DeviceStatusPollThread, /* Control Information App Thread structure */

"21:DeviceStatusPollThread", /* Thread ID and Thread name */

DeviceStatusPollingEntry, /* Control Information App Thread Entry function */

0, /* No input parameter to thread */

ptr5, /* Pointer to the allocated thread stack */

UVC_APP_THREAD_STACK/2, /* UVC Application Thread stack size */

UVC_APP_THREAD_PRIORITY, /* UVC Application Thread priority */

UVC_APP_THREAD_PRIORITY, /* Threshold value for thread pre-emption. */

CYU3P_NO_TIME_SLICE, /* No time slice for the application thread */

CYU3P_DONT_START /* Start the Thread immediately */

);

/* Check the return code */

if (retThrdCreate != 0)

{

goto fatalErrorHandler;

}

   

return;

fatalErrorHandler:

/* Add custom recovery or debug actions here */

/* Loop indefinitely */

while (1)

;

}

/*

* Main function

*/

int main(void)

{

CyU3PReturnStatus_t apiRetStatus;

CyU3PIoMatrixConfig_t io_cfg;

CyU3PSysClockConfig_t clkCfg;

/* setSysClk400 clock configurations */

clkCfg.setSysClk400 = CyTrue; /* FX3 device's master clock is set to a frequency > 400 MHz */

clkCfg.cpuClkDiv = 2; /* CPU clock divider */

clkCfg.dmaClkDiv = 2; /* DMA clock divider */

clkCfg.mmioClkDiv = 2; /* MMIO clock divider */

clkCfg.useStandbyClk = CyFalse; /* device has no 32KHz clock supplied */

clkCfg.clkSrc = CY_U3P_SYS_CLK; /* Clock source for a peripheral block  */

/* Initialize the device */

apiRetStatus = CyU3PDeviceInit(&clkCfg);

if (apiRetStatus != CY_U3P_SUCCESS)

{

goto handle_fatal_error;

}

/* Turn on instruction cache to improve firmware performance. Use Release build to improve it further */

apiRetStatus = CyU3PDeviceCacheControl(CyTrue, CyFalse, CyFalse);

/* Configure the IO matrix for the device. */

io_cfg.isDQ32Bit = CyFalse;

io_cfg.lppMode = CY_U3P_IO_MATRIX_LPP_DEFAULT;

io_cfg.gpioSimpleEn[0] = 0;

io_cfg.gpioSimpleEn[1] = 0;

io_cfg.gpioComplexEn[0] = 0;

io_cfg.gpioComplexEn[1] = 0;

io_cfg.useUart = CyTrue; /* Uart is enabled for logging. */

io_cfg.useI2C = CyTrue;

io_cfg.useI2S = CyFalse;

io_cfg.useSpi = CyTrue;

apiRetStatus = CyU3PDeviceConfigureIOMatrix(&io_cfg);

if (apiRetStatus != CY_U3P_SUCCESS)

{

goto handle_fatal_error;

}

/* This is a non returnable call for initializing the RTOS kernel */

CyU3PKernelEntry();

/* Dummy return to make the compiler happy */

return 0;

handle_fatal_error:

/* Cannot recover from this error. */

while (1)

;

}


#include <cyu3system.h>#include <cyu3os.h>#include <cyu3dma.h>#include <cyu3error.h>#include <cyu3usb.h>#include <cyu3uart.h>#include <cyu3gpif.h>#include <cyu3i2c.h>#include <cyu3gpio.h>#include <cyu3pib.h>#include <cyu3utils.h>


CyBool_t glIsApplnActive = CyFalse; /* Whether the application is active or not. */volatile CyBool_t glIsDevActivated = CyFalse;Myu3v_Parater CYU3v_Parater={0,0,0};
unsigned char HID_Prod_Packet[8], HID_Cons_Packet[8];uint8_t pollrate_02 = 0;uint8_t pollrate_07 = 0;volatile CyBool_t glIsDevInActivated;static CyU3PEvent    glFxU3VEvent;  static CyU3PSemaphore  I2CSema;    /* Semaphore used for I2C access. */static CyU3PSemaphore  UpdateDataSema;



/* This function initializes the debug module. The debug prints * are routed to the UART and can be seen using a UART console * running at 115200 baud rate. */void CyFxU3VApplnDebugInit(void){ CyU3PUartConfig_t uartConfig; CyU3PReturnStatus_t apiRetStatus = CY_U3P_SUCCESS;
/* Initialize the UART for printing debug messages */ apiRetStatus = CyU3PUartInit(); if (apiRetStatus != CY_U3P_SUCCESS) { /* Error handling */ CyU3PDebugPrint(4, "Error Code = %d\r\n", apiRetStatus); }
/* Set UART configuration */ CyU3PMemSet((uint8_t *) &uartConfig, 0, sizeof(uartConfig)); uartConfig.baudRate = CY_U3P_UART_BAUDRATE_115200; uartConfig.stopBit = CY_U3P_UART_ONE_STOP_BIT; uartConfig.parity = CY_U3P_UART_NO_PARITY; uartConfig.txEnable = CyTrue; uartConfig.rxEnable = CyFalse; uartConfig.flowCtrl = CyFalse; uartConfig.isDma = CyTrue;
apiRetStatus = CyU3PUartSetConfig(&uartConfig, NULL); if (apiRetStatus != CY_U3P_SUCCESS) { CyU3PDebugPrint(4, "Error Code = %d\r\n", apiRetStatus); }
/* Set the UART transfer to a really large value. */ apiRetStatus = CyU3PUartTxSetBlockXfer(0xFFFFFFFF); if (apiRetStatus != CY_U3P_SUCCESS) { CyU3PDebugPrint(4, "Error Code = %d\r\n", apiRetStatus); }
/* Initialize the debug module. */ apiRetStatus = CyU3PDebugInit(CY_U3P_LPP_SOCKET_UART_CONS, 8); if (apiRetStatus != CY_U3P_SUCCESS) { CyU3PDebugPrint(4, "Error Code = %d\r\n", apiRetStatus); } CyU3PDebugPreamble(CyFalse);}static void CyFxUvcAppGpifInit(void){ CyU3PReturnStatus_t apiRetStatus;
CyU3PDebugPrint(4, "CyFxUvcAppGpifInit...\r\n");
/* Load the GPIF configuration for Slave FIFO sync mode. */ apiRetStatus = CyU3PGpifLoad(&CyFxGpifConfig); if (apiRetStatus != CY_U3P_SUCCESS) { CyU3PDebugPrint(4, "CyU3PGpifLoad failed, Error Code = %d\n", apiRetStatus); }
CyU3PGpifSocketConfigure(0, CY_U3P_PIB_SOCKET_0, 3, CyFalse, 1);
CyU3PGpifSocketConfigure(3, CY_U3P_PIB_SOCKET_3, 3, CyFalse, 1);
/* Start the state machine. */ apiRetStatus = CyU3PGpifSMStart(RESET, ALPHA_RESET); if (apiRetStatus != CY_U3P_SUCCESS) { CyU3PDebugPrint(4, "CyU3PGpifSMStart failed, Error Code = %d\n", apiRetStatus); }
}void CyFxUvcApplnDmaCallback(CyU3PDmaChannel *ChHandle, CyU3PDmaCbType_t type, CyU3PDmaCBInput_t *input){
CyU3PReturnStatus_t status = CY_U3P_SUCCESS; CyU3PDebugPrint (4, "CallBack type = %x\r\n",type); switch (type) { case CY_U3P_DMA_CB_PROD_EVENT: if (input->buffer_p.count == CY_FX_STR_BUF_FULL_SIZE) { status = CyU3PDmaChannelCommitBuffer(ChHandle, input->buffer_p.count, 0); if (status != CY_U3P_SUCCESS) { CyU3PDebugPrint(1, "Commit Err: %x\r\n", status); } } else { status = CyU3PDmaChannelCommitBuffer(ChHandle, input->buffer_p.count, 0); if (status != CY_U3P_SUCCESS) { CyU3PDebugPrint(1, "Commit Err: %x\r\n", status); } } break; case CY_U3P_DMA_CB_CONS_EVENT: break; default: break;     }}/* Callback function to check for PIB ERROR*/void PibErrorCallback(CyU3PPibIntrType cbType, uint16_t cbArg){ if (cbType == CYU3P_PIB_INTR_ERROR) { switch (CYU3P_GET_PIB_ERROR_TYPE(cbArg)) { case CYU3P_PIB_ERR_THR0_WR_OVERRUN: CyU3PDebugPrint(4, "CYU3P_PIB_ERR_THR0_WR_OVERRUN\n"); break; case CYU3P_PIB_ERR_THR1_WR_OVERRUN: CyU3PDebugPrint(4, "CYU3P_PIB_ERR_THR1_WR_OVERRUN\n"); break; case CYU3P_PIB_ERR_THR2_WR_OVERRUN: CyU3PDebugPrint(4, "CYU3P_PIB_ERR_THR2_WR_OVERRUN\n"); break; case CYU3P_PIB_ERR_THR3_WR_OVERRUN: CyU3PDebugPrint(4, "CYU3P_PIB_ERR_THR3_WR_OVERRUN\n"); break; case CYU3P_PIB_ERR_THR0_RD_UNDERRUN: CyU3PDebugPrint(4, "CYU3P_PIB_ERR_THR0_RD_UNDERRUN\n"); break; case CYU3P_PIB_ERR_THR1_RD_UNDERRUN: CyU3PDebugPrint(4, "CYU3P_PIB_ERR_THR1_RD_UNDERRUN\n"); break; case CYU3P_PIB_ERR_THR2_RD_UNDERRUN: CyU3PDebugPrint(4, "CYU3P_PIB_ERR_THR2_RD_UNDERRUN\n"); break; case CYU3P_PIB_ERR_THR3_RD_UNDERRUN: CyU3PDebugPrint(4, "CYU3P_PIB_ERR_THR3_RD_UNDERRUN\n"); break; default: CyU3PDebugPrint(4, "No Underrun/Overrun Error %d\r\n",CYU3P_GET_PIB_ERROR_TYPE(cbArg)); break; } }}
/* This function starts the bulk loop application. This is called * when a SET_CONF event is received from the USB host. The endpoints * are configured and the DMA pipe is setup in this function. */void CyFxU3VApplnStart(void){ uint16_t size = 0; CyU3PEpConfig_t epCfg; CyU3PDmaChannelConfig_t dmaCfg; CyU3PReturnStatus_t apiRetStatus = CY_U3P_SUCCESS; CyU3PUSBSpeed_t usbSpeed = CY_U3P_SUPER_SPEED;    CyU3PDebugPrint(4, "CyFxU3VApplnStart !!!!\n"); /* First identify the usb speed. Once that is identified, * create a DMA channel and start the transfer on this. */
/* Based on the Bus Speed configure the endpoint packet size */ switch (usbSpeed) { case CY_U3P_FULL_SPEED: size = 64; break;
case CY_U3P_HIGH_SPEED: size = 512; break;
case CY_U3P_SUPER_SPEED: size = 1024; break;
default: CyU3PDebugPrint(4, "Error! Invalid USB speed.\n"); break; }
CyU3PMemSet((uint8_t *) &epCfg, 0, sizeof(epCfg));
/***************** * Endpoint 1 control out ******************/ /* Producer endpoint  1 configuration 控制通道 */ epCfg.enable = CyTrue; epCfg.epType = CY_U3P_USB_EP_INTR; epCfg.burstLen = (usbSpeed == CY_U3P_SUPER_SPEED) ? (CY_FX_EP_BURST_LENGTH) : 1; epCfg.isoPkts = 1; epCfg.streams = 0; epCfg.pcktSize = size; //epCfg.pcktSize = CY_FX_EP_BULK_VIDEO_PKT_SIZE;
apiRetStatus = CyU3PSetEpConfig(CY_FX_EP_PRODUCER(1), &epCfg); if (apiRetStatus != CY_U3P_SUCCESS) { CyU3PDebugPrint(4, "CyU3PSetEpConfig failed, Error code = %d\n", apiRetStatus); } /***************** * Endpoint 2 control in ******************/ /* Consumer endpoint 1 configuration 控制通道 */ apiRetStatus = CyU3PSetEpConfig(CY_FX_EP_CONSUMER(1), &epCfg); if (apiRetStatus != CY_U3P_SUCCESS) { CyU3PDebugPrint(4, "CyU3PSetEpConfig failed, Error code = %d\n", apiRetStatus); }
/* Flush the endpoint memory */ CyU3PUsbFlushEp(CY_FX_EP_PRODUCER(1)); CyU3PUsbFlushEp(CY_FX_EP_CONSUMER(1));
/***************** * dma 1  control out ******************/ /* Create a DMA MANUAL_OUT channel for the producer socket. 控制out通道*/ dmaCfg.size = 1024; //size; dmaCfg.count = 4; //CY_FX_BULKLP_DMA_BUF_COUNT; dmaCfg.prodSckId = CY_U3P_CPU_SOCKET_PROD; dmaCfg.consSckId = CY_U3P_UIB_SOCKET_CONS_1;  //?????????? dmaCfg.dmaMode = CY_U3P_DMA_MODE_BYTE; /* No callback is required. */ dmaCfg.notification = 0; dmaCfg.cb = 0; dmaCfg.prodHeader = 0; dmaCfg.prodFooter = 0; dmaCfg.consHeader = 0; dmaCfg.prodAvailCount = 0;
apiRetStatus = CyU3PDmaChannelCreate(&glChHandleControlCPUEPout, CY_U3P_DMA_TYPE_MANUAL_OUT, &dmaCfg); if (apiRetStatus != CY_U3P_SUCCESS) { CyU3PDebugPrint(4, "CyU3PDmaChanneloutCreate failed, Error code = %d\n", apiRetStatus); }
apiRetStatus = CyU3PDmaChannelSetXfer(&glChHandleControlCPUEPout,CY_FX_BULKLP_DMA_TX_SIZE); if (apiRetStatus != CY_U3P_SUCCESS) { CyU3PDebugPrint(4, "CyU3PDmaChannelSetXfer Failed, Error code = %d\n", apiRetStatus); }
/***************** * dma 2  control in ******************/ /* Create a DMA MANUAL_IN channel for the consumer socket. 控制in通道*/ dmaCfg.size = 1024; dmaCfg.count = 4;//CY_HID_DMA_BUF_COUNT; dmaCfg.prodSckId =  CY_U3P_UIB_SOCKET_PROD_1;    //????? dmaCfg.consSckId = CY_U3P_CPU_SOCKET_CONS;       //?????? dmaCfg.dmaMode = CY_U3P_DMA_MODE_BYTE; /* No callback is required. */ dmaCfg.notification = 0; dmaCfg.cb = NULL; dmaCfg.prodHeader = 0; dmaCfg.prodFooter = 0; dmaCfg.consHeader = 0; dmaCfg.prodAvailCount = 0; apiRetStatus = CyU3PDmaChannelCreate(&glChHandleControlCPUEPin, CY_U3P_DMA_TYPE_MANUAL_IN, &dmaCfg); if (apiRetStatus != CY_U3P_SUCCESS) { CyU3PDebugPrint(4, "CyU3PDmaChannelinCreate failed, Error code = %d\n", apiRetStatus);// CyFxAppErrorHandler(apiRetStatus); }

/* Set DMA Channel transfer size */ apiRetStatus = CyU3PDmaChannelSetXfer(&glChHandleControlCPUEPin,CY_FX_BULKLP_DMA_TX_SIZE); if (apiRetStatus != CY_U3P_SUCCESS) { CyU3PDebugPrint(4, "CyU3PDmaChannelSetXfer Failed, Error code = %d\n", apiRetStatus); }


/***************** * Endpoint 3    BULK ******************/ /* Consumer endpoint configuration */ epCfg.enable = CyTrue; epCfg.epType = CY_U3P_USB_EP_BULK; epCfg.burstLen = (usbSpeed == CY_U3P_SUPER_SPEED) ? (CY_FX_EP_BURST_LENGTH) : 1; epCfg.streams = 0; epCfg.pcktSize = size; //epCfg.pcktSize = CY_FX_EP_BULK_VIDEO_PKT_SIZE; epCfg.isoPkts = 1;
apiRetStatus = CyU3PSetEpConfig(CY_FX_EP_PRODUCER(2), &epCfg); if (apiRetStatus != CY_U3P_SUCCESS) { CyU3PDebugPrint(4, "CyU3PSetEpConfig failed, Error code = %d\n", apiRetStatus); } /*****************   * Endpoint 4    BULK ******************/ /* Consumer endpoint configuration */ apiRetStatus = CyU3PSetEpConfig(CY_FX_EP_CONSUMER(2), &epCfg); if (apiRetStatus != CY_U3P_SUCCESS) { CyU3PDebugPrint(4, "CyU3PSetEpConfig failed, Error code = %d\n", apiRetStatus); }
/* Flush the endpoint memory */ CyU3PUsbFlushEp(CY_FX_EP_PRODUCER(2)); CyU3PUsbFlushEp(CY_FX_EP_CONSUMER(2));
/***************** * dma 3  BULK out ******************/ /* Create a DMA MANUAL_OUT channel for the producer socket. BULK out通道*/ dmaCfg.size = 5*1024; //size; dmaCfg.count = 4; //CY_FX_BULKLP_DMA_BUF_COUNT; dmaCfg.prodSckId = CY_U3P_CPU_SOCKET_PROD; dmaCfg.consSckId = CY_U3P_UIB_SOCKET_CONS_2;  //?????????? dmaCfg.dmaMode = CY_U3P_DMA_MODE_BYTE; /* No callback is required. */ dmaCfg.notification = 0; dmaCfg.cb = NULL; dmaCfg.prodHeader = 0; dmaCfg.prodFooter = 0; dmaCfg.consHeader = 0; dmaCfg.prodAvailCount = 0;
apiRetStatus = CyU3PDmaChannelCreate(&glChHandleBulkCPUEPout, CY_U3P_DMA_TYPE_MANUAL_OUT, &dmaCfg); if (apiRetStatus != CY_U3P_SUCCESS) { CyU3PDebugPrint(4, "CyU3PDmaChannelBulkoutCreate failed, Error code = %d\n", apiRetStatus); }
apiRetStatus = CyU3PDmaChannelSetXfer(&glChHandleBulkCPUEPout,CY_FX_BULKLP_DMA_TX_SIZE); if (apiRetStatus != CY_U3P_SUCCESS) { CyU3PDebugPrint(4, "CyU3PDmaChannelSetXfer Failed, Error code = %d\n", apiRetStatus); } /***************** * dma 4  bulk in ******************/ /* Create a DMA MANUAL_IN channel for the consumer socket. bulk in通道*/ dmaCfg.size = 5*1024; dmaCfg.count = 4;//CY_HID_DMA_BUF_COUNT; dmaCfg.prodSckId = CY_U3P_UIB_SOCKET_PROD_2; dmaCfg.consSckId = CY_U3P_CPU_SOCKET_CONS; dmaCfg.dmaMode = CY_U3P_DMA_MODE_BYTE; /* No callback is required. */ dmaCfg.notification = 0; dmaCfg.cb = NULL; dmaCfg.prodHeader = 0; dmaCfg.prodFooter = 0; dmaCfg.consHeader = 0; dmaCfg.prodAvailCount = 0; apiRetStatus = CyU3PDmaChannelCreate(&glChHandleBulkCPUEPin, CY_U3P_DMA_TYPE_MANUAL_IN, &dmaCfg); if (apiRetStatus != CY_U3P_SUCCESS) { CyU3PDebugPrint(4, "CyU3PDmaChannelBulkinCreate failed, Error code = %d\n", apiRetStatus); }
/* Set DMA Channel transfer size */ apiRetStatus = CyU3PDmaChannelSetXfer(&glChHandleBulkCPUEPin,CY_FX_BULKLP_DMA_TX_SIZE); if (apiRetStatus != CY_U3P_SUCCESS) { CyU3PDebugPrint(4, "CyU3PDmaChannelSetXfer Failed, Error code = %d\n", apiRetStatus); }
/***************** * Endpoint 5 ******************/ /* Consumer endpoint configuration */ epCfg.enable = CyTrue; epCfg.epType = CY_U3P_USB_EP_BULK; epCfg.burstLen = (usbSpeed == CY_U3P_SUPER_SPEED) ? (CY_FX_EP_BURST_LENGTH) : 1; epCfg.streams = 0; epCfg.pcktSize = size; //epCfg.pcktSize = CY_FX_EP_BULK_VIDEO_PKT_SIZE; epCfg.isoPkts = 1;
apiRetStatus = CyU3PSetEpConfig(CY_FX_EP_CONSUMER(3), &epCfg); if (apiRetStatus != CY_U3P_SUCCESS) { CyU3PDebugPrint(4, "CyU3PSetEpConfig failed, Error code = %d\n", apiRetStatus); } /* Flush the endpoint memory */ CyU3PUsbFlushEp(CY_FX_EP_CONSUMER(3));
/***************** * dma 5  bulk in stream ******************/
/* Create a DMA MANUAL_OUT channel for the consumer socket. */ dmaCfg.size = CY_FX_STR_BUF_FULL_SIZE ; dmaCfg.count = CY_FX_BULKLP_DMA_BUF_COUNT; dmaCfg.prodSckId = CY_U3P_PIB_SOCKET_0; // dmaCfg.consSckId = CY_U3P_UIB_SOCKET_CONS_3; dmaCfg.dmaMode = CY_U3P_DMA_MODE_BYTE; /* Enabling the callback for produce event. */ dmaCfg.notification =0; dmaCfg.cb = 0; dmaCfg.prodHeader = 0; dmaCfg.prodFooter = 0; dmaCfg.prodAvailCount = 0; apiRetStatus = CyU3PDmaChannelCreate(&glChHandleStreamEpin, CY_U3P_DMA_TYPE_AUTO , &dmaCfg); if (apiRetStatus != CY_U3P_SUCCESS) { CyU3PDebugPrint(4, "CyU3PDmaChannelStreaminCreate failed, Error code = %d\n", apiRetStatus); } /* Set DMA Channel transfer size */ apiRetStatus = CyU3PDmaChannelSetXfer(&glChHandleStreamEpin,CY_FX_BULKLP_DMA_TX_SIZE); if (apiRetStatus != CY_U3P_SUCCESS) { CyU3PDebugPrint(4, "CyU3PDmaChannelSetXfer Failed, Error code = %d\n", apiRetStatus); }
/* spi dma for user data read from/write to flash */ CyU3PDebugPrint(4, "USB Init Successful \r\n");
// CyU3PPibRegisterCallback(PibErrorCallback, 0xFFFF); //打开全部通知
//CyU3PThreadSleep(1000);
/* Update the flag so that the application thread is notified of this. */ glIsApplnActive = CyTrue;}
/* This function stops the bulk loop application. This shall be called whenever * a RESET or DISCONNECT event is received from the USB host. The endpoints are * disabled and the DMA pipe is destroyed by this function. */void CyFxU3VApplnStop(void){ CyU3PEpConfig_t epCfg; CyU3PReturnStatus_t apiRetStatus = CY_U3P_SUCCESS; CyU3PDebugPrint(4, "CyFxU3VApplnStop !!!!\n"); /* Update the flag so that the application thread is notified of this. */ if(glIsApplnActive == CyFalse) {return;} glIsApplnActive = CyFalse;
/* Destroy the channels */ CyU3PDmaChannelDestroy(&glChHandleControlCPUEPin); CyU3PDmaChannelDestroy(&glChHandleControlCPUEPout); CyU3PDmaChannelDestroy(&glChHandleBulkCPUEPin); CyU3PDmaChannelDestroy(&glChHandleBulkCPUEPout); CyU3PDmaChannelDestroy(&glChHandleStreamEpin); CyU3PDmaChannelDestroy(&glChHandleBulkSpi2Cpu); CyU3PDmaChannelDestroy(&glChHandleBulkCpu2Spi); /* Flush the endpoint memory */ CyU3PUsbFlushEp(CY_FX_EP_PRODUCER(1)); CyU3PUsbFlushEp(CY_FX_EP_CONSUMER(1)); CyU3PUsbFlushEp(CY_FX_EP_PRODUCER(2)); CyU3PUsbFlushEp(CY_FX_EP_CONSUMER(2)); CyU3PUsbFlushEp(CY_FX_EP_CONSUMER(3));
/* Disable endpoints. */ CyU3PMemSet((uint8_t *) &epCfg, 0, sizeof(epCfg)); epCfg.enable = CyFalse;
/* Producer endpoint configuration. */ apiRetStatus = CyU3PSetEpConfig(CY_FX_EP_PRODUCER(1), &epCfg); if (apiRetStatus != CY_U3P_SUCCESS) { CyU3PDebugPrint(4, "CyU3PSetEpConfig failed, Error code = %d\n", apiRetStatus); }
/* Consumer endpoint configuration. */ apiRetStatus = CyU3PSetEpConfig(CY_FX_EP_CONSUMER(1), &epCfg); if (apiRetStatus != CY_U3P_SUCCESS) { CyU3PDebugPrint(4, "CyU3PSetEpConfig failed, Error code = %d\n", apiRetStatus); } apiRetStatus = CyU3PSetEpConfig(CY_FX_EP_PRODUCER(2), &epCfg); if (apiRetStatus != CY_U3P_SUCCESS) { CyU3PDebugPrint(4, "CyU3PSetEpConfig failed, Error code = %d\n", apiRetStatus); } apiRetStatus = CyU3PSetEpConfig(CY_FX_EP_CONSUMER(2), &epCfg); if (apiRetStatus != CY_U3P_SUCCESS) { CyU3PDebugPrint(4, "CyU3PSetEpConfig failed, Error code = %d\n", apiRetStatus); } apiRetStatus = CyU3PSetEpConfig(CY_FX_EP_CONSUMER(3), &epCfg); if (apiRetStatus != CY_U3P_SUCCESS) { CyU3PDebugPrint(4, "CyU3PSetEpConfig failed, Error code = %d\n", apiRetStatus); }
CyU3PGpifDisable(CyTrue); //关闭GPIF
}
CyBool_t CyFxU3VApplnLPMRqtCB(CyU3PUsbLinkPowerMode link_mode){ return CyTrue;}
void CyFxU3VApplnUSBEventCB(CyU3PUsbEventType_t evtype, /* Event type */uint16_t evdata /* Event data */){ CyU3PDebugPrint(4, "Get Event! evtype=0x%x evdata=0x%x\r\n", evtype, evdata); switch (evtype) { case CY_U3P_USB_EVENT_RESET: CyU3PDebugPrint (4, "USB reset...\r\n"); CyU3PConnectState(CyFalse, CyFalse); break; case CY_U3P_USB_EVENT_DISCONNECT: CyU3PDebugPrint (4, "USB disconnected...\r\n"); CyU3PConnectState(CyFalse, CyFalse); CyU3PEventSet (&glFxU3VEvent,CY_FX_U3VC_USB_DISCONNECT_EVENT, CYU3P_EVENT_OR); break; case CY_U3P_USB_EVENT_CONNECT: //USB连接 CyU3PDebugPrint (4, "USB connected...\r\n"); CyU3PEventSet (&glFxU3VEvent,CY_FX_U3VC_USB_CONNECT_EVENT, CYU3P_EVENT_OR); CyU3PUsbLPMDisable (); break; case CY_U3P_USB_EVENT_VBUS_VALID:
break; case CY_U3P_USB_EVENT_VBUS_REMOVED:
break; default: break; }}

/* Callback to handle the USB setup requests. */CyBool_t CyFxU3VlnUSBSetupCB(uint32_t setupdat0, /* SETUP Data 0 */uint32_t setupdat1 /* SETUP Data 1 */){ /* Fast enumeration is used. Only requests addressed to the interface, class, * vendor and unknown control requests are received by this function. * This application does not support any class or vendor requests. */
uint8_t bRequest, bmReqType; uint8_t bType, bTarget, bDirect; uint16_t wValue, wIndex, wLength; uint32_t status; CyBool_t isHandled = CyFalse;
uint8_t ep0Buf[64]; uint16_t readCount;
/* Decode the fields from the setup request. */ bmReqType = (setupdat0 & CY_U3P_USB_REQUEST_TYPE_MASK); bDirect = (bmReqType & CY_U3P_USB_DIRECTION_MASK) >> CY_U3P_USB_DIRECTION_POS; bType = (bmReqType & CY_U3P_USB_TYPE_MASK); bTarget = (bmReqType & CY_U3P_USB_TARGET_MASK); bRequest = ((setupdat0 & CY_U3P_USB_REQUEST_MASK) >> CY_U3P_USB_REQUEST_POS); wValue = ((setupdat0 & CY_U3P_USB_VALUE_MASK) >> CY_U3P_USB_VALUE_POS); wIndex = ((setupdat1 & CY_U3P_USB_INDEX_MASK) >> CY_U3P_USB_INDEX_POS); wLength = (uint16_t) ((setupdat1 & CY_FX_USB_SETUP_LENGTH_MASK ) >> 16); CyU3PDebugPrint(4, "bmReqType 0x%x bRequest 0x%x wValue 0x%x wIndex 0x%x wLength 0x%x\n", bmReqType, bRequest, wValue, wIndex, wLength);
switch (bmReqType) { case CY_U3P_USB_CLASS_RQT: if (wIndex == 0x02) { switch (bRequest) { case 0x01: CyU3PMemSet(ep0Buf, 0, 64); CyU3PMemCopy(ep0Buf, HID_Cons_Packet, HID_Cons_Packet[0]); status = CyU3PUsbSendEP0Data(64, ep0Buf); break; case 0x02: if (CY_U3P_DWORD_GET_BYTE0(wValue) == 0x2) { ep0Buf[0] = pollrate_02; } else if (CY_U3P_DWORD_GET_BYTE0(wValue) == 0x7) { ep0Buf[0] = pollrate_07; } else { ; } status = CyU3PUsbSendEP0Data(1, ep0Buf); break; case 0x03: CyU3PUsbAckSetup(); CyU3PDebugPrint(4, " set feature 03\n"); break; case 0x09: status = CyU3PUsbGetEP0Data(64, ep0Buf, &readCount); if (status != 0) { ; } else { if (wIndex == 0x02 && bRequest == 0x09) //EEPROM擦除和设备冷启动 { CyU3PUsbGetEP0Data(64, ep0Buf, &readCount); CyU3PMemCopy(HID_Prod_Packet, ep0Buf, 64); if (HID_Prod_Packet[1] == 0xaa) { CyU3PDebugPrint(4, "EEPROM Erase!\n"); CyFxEEPROMErase(); } else if (HID_Prod_Packet[1] == 0xbb) { CyU3PDebugPrint(4, "Reset!\n"); CyU3PDeviceReset(CyFalse); } } break; case 0x0A: CyU3PUsbAckSetup(); if (CY_U3P_DWORD_GET_BYTE0(wValue) == 0x2) { pollrate_02 = CY_U3P_DWORD_GET_BYTE1(wValue); } else if (CY_U3P_DWORD_GET_BYTE0(wValue) == 0x7) { pollrate_07 = CY_U3P_DWORD_GET_BYTE1(wValue); } else { ; } break; case 0x0B: CyU3PUsbAckSetup(); break; default: break; } } } break; case CY_U3P_USB_STANDARD_RQT: if ((bTarget == CY_U3P_USB_TARGET_INTF) && ((bRequest == CY_U3P_USB_SC_SET_FEATURE) || (bRequest == CY_U3P_USB_SC_CLEAR_FEATURE)) && (wValue == 0)) { if (glIsApplnActive) CyU3PUsbAckSetup(); else CyU3PUsbStall(0, CyTrue, CyFalse);
isHandled = CyTrue; } } return isHandled;}/* GpifCB callback function is invoked when FV triggers GPIF interrupt */void CyFxGpifCB(CyU3PGpifEventType event, uint8_t currentState){
}void CyFxU3VApplnInit(void){ CyU3PReturnStatus_t apiRetStatus = CY_U3P_SUCCESS; CyU3PPibClock_t pibclock;
apiRetStatus = CyU3PEventCreate (&glFxU3VEvent);    if (apiRetStatus != 0)    {        CyU3PDebugPrint (4, "U3V Create Event failed, Error Code = %d\n", apiRetStatus);    }    CyU3PThreadResume(&UsbHotplugThread); CyU3PThreadResume(&DeviceStatusPollThread); /* Initialize the P-port. */ pibclock.clkDiv = 2; pibclock.clkSrc = CY_U3P_SYS_CLK; pibclock.isDllEnable = CyFalse; pibclock.isHalfDiv = CyFalse;
apiRetStatus = CyU3PPibInit(CyTrue, &pibclock); if (apiRetStatus != CY_U3P_SUCCESS) { CyU3PDebugPrint(4, "PIB Function Failed to Start, Error Code = %d\n", apiRetStatus); }
// /* Setup the Callback to Handle the GPIF INTR event */// CyU3PGpifRegisterCallback(CyFxGpifCB);
/* Start the USB functionality. */ apiRetStatus = CyU3PUsbStart(); if (apiRetStatus != CY_U3P_SUCCESS) { CyU3PDebugPrint(4, "CyU3PUsbStart failed to Start, Error code = %d\n", apiRetStatus); }
/* The fast enumeration is the easiest way to setup a USB connection, * where all enumeration phase is handled by the library. Only the * class / vendor requests need to be handled by the application. */ CyU3PUsbRegisterSetupCallback(CyFxU3VlnUSBSetupCB, CyTrue);
/* Setup the callback to handle the USB events. */ CyU3PUsbRegisterEventCallback(CyFxU3VApplnUSBEventCB);
/* Register a callback to handle LPM requests from the USB 3.0 host. */ CyU3PUsbRegisterLPMRequestCallback(CyFxU3VApplnLPMRqtCB);
/* Set the USB Enumeration descriptors */
/* Super speed device descriptor. */ apiRetStatus = CyU3PUsbSetDesc(CY_U3P_USB_SET_SS_DEVICE_DESCR, 0, (uint8_t *) CyFxUSBDeviceDscrSS); if (apiRetStatus != CY_U3P_SUCCESS) { CyU3PDebugPrint(4, "USB set device descriptor failed, Error code = %d\n", apiRetStatus); }
/* High speed device descriptor. */ apiRetStatus = CyU3PUsbSetDesc(CY_U3P_USB_SET_HS_DEVICE_DESCR, 0, (uint8_t *) CyFxUSBDeviceDscr); if (apiRetStatus != CY_U3P_SUCCESS) { CyU3PDebugPrint(4, "USB set device descriptor failed, Error code = %d\n", apiRetStatus); }
/* BOS descriptor */ apiRetStatus = CyU3PUsbSetDesc(CY_U3P_USB_SET_SS_BOS_DESCR, 0, (uint8_t *) CyFxUSBBOSDscr); if (apiRetStatus != CY_U3P_SUCCESS) { CyU3PDebugPrint(4, "USB set configuration descriptor failed, Error code = %d\n", apiRetStatus); }
/* Device qualifier descriptor */ apiRetStatus = CyU3PUsbSetDesc(CY_U3P_USB_SET_DEVQUAL_DESCR, 0, (uint8_t *) CyFxUSBDeviceQualDscr); if (apiRetStatus != CY_U3P_SUCCESS) { CyU3PDebugPrint(4, "USB set device qualifier descriptor failed, Error code = %d\n", apiRetStatus); }
/* Super speed configuration descriptor */ apiRetStatus = CyU3PUsbSetDesc(CY_U3P_USB_SET_SS_CONFIG_DESCR, 0, (uint8_t *) CyFxUSBSSConfigDscr); if (apiRetStatus != CY_U3P_SUCCESS) { CyU3PDebugPrint(4, "USB set configuration descriptor failed, Error code = %d\n", apiRetStatus); }
/* High speed configuration descriptor */ apiRetStatus = CyU3PUsbSetDesc(CY_U3P_USB_SET_HS_CONFIG_DESCR, 0, (uint8_t *) CyFxUSBHSConfigDscr); if (apiRetStatus != CY_U3P_SUCCESS) { CyU3PDebugPrint(4, "USB Set Other Speed Descriptor failed, Error Code = %d\n", apiRetStatus); }
/* Full speed configuration descriptor */ apiRetStatus = CyU3PUsbSetDesc(CY_U3P_USB_SET_FS_CONFIG_DESCR, 0, (uint8_t *) CyFxUSBFSConfigDscr); if (apiRetStatus != CY_U3P_SUCCESS) { CyU3PDebugPrint(4, "USB Set Configuration Descriptor failed, Error Code = %d\n", apiRetStatus); }
/* String descriptor 0 */ apiRetStatus = CyU3PUsbSetDesc(CY_U3P_USB_SET_STRING_DESCR, 0, (uint8_t *) CyFxUSBStringLangIDDscr); if (apiRetStatus != CY_U3P_SUCCESS) { CyU3PDebugPrint(4, "USB set string descriptor failed, Error code = %d\n", apiRetStatus); }
/* String descriptor 1 */ apiRetStatus = CyU3PUsbSetDesc(CY_U3P_USB_SET_STRING_DESCR, 1, (uint8_t *) CyFxUSBManufactureDscr); if (apiRetStatus != CY_U3P_SUCCESS) { CyU3PDebugPrint(4, "USB set string descriptor failed, Error code = %d\n", apiRetStatus); }
/* String descriptor 2 */ apiRetStatus = CyU3PUsbSetDesc(CY_U3P_USB_SET_STRING_DESCR, 2, (uint8_t *) CyFxUSBProductDscr); if (apiRetStatus != CY_U3P_SUCCESS) { CyU3PDebugPrint(4, "USB set string descriptor failed, Error code = %d\n", apiRetStatus); } CyFxU3VApplnStart(); /* Connect the USB Pins with super speed operation enabled. */// apiRetStatus = CyU3PConnectState(CyTrue, CyFalse); apiRetStatus = CyU3PConnectState(CyTrue, CyTrue); if (apiRetStatus != CY_U3P_SUCCESS) { CyU3PDebugPrint(4, "USB Connect failed, Error code = %d\n", apiRetStatus); } }
/* I2C initialization. */static void CyFxU3VApplnI2CInit(void){ CyU3PI2cConfig_t i2cConfig; CyU3PReturnStatus_t status;
status = CyU3PI2cInit(); if (status != CY_U3P_SUCCESS) { CyU3PDebugPrint(4, "I2C initialization failed!\n"); }
/*  Set I2C Configuration */ i2cConfig.bitRate = 100000; /*  100 KHz */ i2cConfig.isDma = CyFalse; i2cConfig.busTimeout = 0xffffffffU; i2cConfig.dmaTimeout = 0xffff;
status = CyU3PI2cSetConfig(&i2cConfig, 0); if (CY_U3P_SUCCESS != status) { CyU3PDebugPrint(4, "I2C configuration failed!\n"); }}

void BulkThread_Entry(uint32_t input){ CyU3PDmaBuffer_t inBuf_p_com, com_inBuf_p, com_outBuf_p; CyU3PReturnStatus_t status = CY_U3P_SUCCESS; uint16_t sendlength; uint32_t ReadData; int i=10; CyFxU3VApplnInit(); CyFxUvcAppGpifInit(); //初始化GPIF CyU3PTimerStart(&KeyCheckTimer); connect_ver_info(); VerifyAds1000DevAddr(); status = CyFxSelfDefineDataTransfer(&self_data, CyTrue); if(status) { CyU3PDebugPrint(4, "CyFxSelfDefineDataTransfer failed, Error code = %d\n", status); } for (;;) { if (glIsApplnActive) {         status = CyU3PDmaChannelGetBuffer(&glChHandleBulkCPUEPin, &inBuf_p_com, CYU3P_WAIT_FOREVER); //等待HOST数据            //CyU3PDebugPrint(4, "run to = %d\n", __LINE__); if (status != CY_U3P_SUCCESS) { if (!glIsApplnActive) {    continue; } else { CyU3PDebugPrint(4, "CyU3PDmaChannelGetBuffer failed, Error code = %d\n", status); } } com_inBuf_p = inBuf_p_com; status = CyU3PDmaChannelDiscardBuffer(&glChHandleBulkCPUEPin); if (status != CY_U3P_SUCCESS) { CyU3PDebugPrint(4, "Control DMA Discard failed!\n"); } status = CyU3PDmaChannelGetBuffer(&glChHandleBulkCPUEPout, &com_outBuf_p, CYU3P_WAIT_FOREVER); sendlength = process(com_inBuf_p, com_outBuf_p);//返回长度           status = CyU3PDmaChannelCommitBuffer(&glChHandleBulkCPUEPout, sendlength, 0); if (status != CY_U3P_SUCCESS) {     CyU3PUsbSetEpNak(CY_FX_EP_CONSUMER(2), CyTrue); CyU3PThreadSleep(1); //abort and destroy the CPU2USB dma channel CyU3PDmaChannelReset(&glChHandleBulkCPUEPout); CyU3PDmaChannelSetXfer(&glChHandleBulkCPUEPout, 0); CyU3PThreadSleep(25); CyU3PUsbFlushEp(CY_FX_EP_CONSUMER(2)); CyU3PUsbSetEpNak(CY_FX_EP_CONSUMER(2), CyFalse); CyU3PThreadSleep(1); CyU3PDebugPrint(4, "Control DMA send failed!\n"); } if(CYU3v_Parater.U3V_Bulk_Reboot_Flag == 1) { CYU3v_Parater.U3V_Bulk_Reboot_Flag = 0; CyU3PThreadSleep(25); CyU3PDeviceReset(CyFalse);    } } CyU3PThreadRelinquish(); }}
void ControlThread_Entry(uint32_t input){ CyU3PDmaBuffer_t inBuf_p_control, control_inBuf_p, control_outBuf_p; CyU3PReturnStatus_t status = CY_U3P_SUCCESS; uint16_t sendlength; for (;;) { if (glIsApplnActive) { status = CyU3PDmaChannelGetBuffer(&glChHandleControlCPUEPin, &inBuf_p_control, CYU3P_WAIT_FOREVER); //等待HOST数据 if (status != CY_U3P_SUCCESS) { if (!glIsApplnActive) {     CyU3PDebugPrint(4, "run to = %d \n", __LINE__); continue; } else { CyU3PDebugPrint(4, "CyU3PDmaChannelGetBuffer failed, Error code = %d\n", status); } } control_inBuf_p = inBuf_p_control; status = CyU3PDmaChannelDiscardBuffer(&glChHandleControlCPUEPin); if (status != CY_U3P_SUCCESS) { CyU3PDebugPrint(4, "Control DMA Discard failed!\n"); } //CyU3PDebugPrint(4, "run to = %d failure_counter = %d\n\r", __LINE__,failure_counter); status = CyU3PDmaChannelGetBuffer(&glChHandleControlCPUEPout, &control_outBuf_p, /*CYU3P_WAIT_FOREVER*/3000); //CyU3PDebugPrint(4, "run to = %d \n\r", __LINE__); if (status != CY_U3P_SUCCESS) {     CyU3PDebugPrint(4, "Failed to CyU3PDmaChannelGetBuffer %d\n\r",status); ReBuildCreatCommandChannel(); CyU3PUsbSetEpNak(CY_FX_EP_CONSUMER(1), CyTrue); CyU3PThreadSleep(1); //abort and destroy the CPU2USB dma channel CyU3PDmaChannelReset(&glChHandleControlCPUEPout); CyU3PDmaChannelSetXfer(&glChHandleControlCPUEPout, 0); CyU3PThreadSleep(25); CyU3PUsbFlushEp(CY_FX_EP_CONSUMER(1)); CyU3PUsbSetEpNak(CY_FX_EP_CONSUMER(1), CyFalse); CyU3PThreadSleep(1); CyU3PDebugPrint(4, "Control DMA send failed-1!\n\r"); continue; } sendlength = control(control_inBuf_p, control_outBuf_p);//返回长度
            //CyU3PDebugPrint(4, "run to = %d sendlength=%d\n\r", __LINE__,sendlength); status = CyU3PDmaChannelCommitBuffer(&glChHandleControlCPUEPout, sendlength, 0); if (status != CY_U3P_SUCCESS) {     CyU3PDebugPrint(4, "Failed to CommitBuffer = %d!\n\r",status); ReBuildCreatCommandChannel();     CyU3PUsbSetEpNak(CY_FX_EP_CONSUMER(1), CyTrue); CyU3PThreadSleep(1); //abort and destroy the CPU2USB dma channel CyU3PDmaChannelReset(&glChHandleControlCPUEPout); CyU3PDmaChannelSetXfer(&glChHandleControlCPUEPout, 0); CyU3PThreadSleep(25); CyU3PUsbFlushEp(CY_FX_EP_CONSUMER(1)); CyU3PUsbSetEpNak(CY_FX_EP_CONSUMER(1), CyFalse); CyU3PThreadSleep(1); } if(failure_counter > 2) {    CYU3v_Parater.U3V_Control_Reboot_Flag = 1; } if(CYU3v_Parater.U3V_Control_Reboot_Flag == 1) { CYU3v_Parater.U3V_Control_Reboot_Flag=0; CyU3PThreadSleep(25); CyU3PDeviceReset(CyFalse); } } CyU3PThreadRelinquish(); }}
void CyFxApplicationDefine(void){ void *ptr1, *ptr2, *ptr3,*ptr4,*ptr5; uint32_t retThrdCreate;#ifdef U3V_ISCAN CyU3PTimerCreate(&WtachdogTimer,CyCx3WatchdogAppTimer,0x00,TIMER_PERIOD,TIMER_PERIOD,CYU3P_AUTO_START); CyU3PTimerCreate(&KeyCheckTimer,CyCx3KeyCheckTimer,0x00,TIMER_PERIOD_KEY,TIMER_PERIOD_KEY,CYU3P_DONT_START); CyU3PTimerCreate(&sw_gpio_pwm_timer,SwGpioPwm_Timer,0x00,TIMER_PERIOD_KEY,TIMER_PERIOD_KEY,CYU3P_AUTO_START); retThrdCreate = CyU3PSemaphoreCreate (&I2CSema,1); if(retThrdCreate != 0) { goto fatalErrorHandler; } retThrdCreate = CyU3PSemaphoreCreate (&UpdateDataSema,1); if(retThrdCreate != 0) { goto fatalErrorHandler; } #else#endif //初始化线程 /* Allocate the memory for the threads */ /* Allocate the memory for the thread stacks. */ ptr1 = CyU3PMemAlloc(U3V_APP_THREAD_STACK); ptr2 = CyU3PMemAlloc(U3V_APP_THREAD_STACK); ptr3 = CyU3PMemAlloc(U3V_APP_THREAD_STACK);#ifdef U3V_ISCAN ptr4 = CyU3PMemAlloc(UVC_APP_THREAD_STACK/2);    ptr5 = CyU3PMemAlloc(UVC_APP_THREAD_STACK/2);#endif if ((ptr1 == 0) || (ptr2 == 0) || (ptr3 == 0)|| (ptr4 == 0) || (ptr5 == 0)) { goto fatalErrorHandler; } /* Create the thread for the application */ /* FPGA start thread */ retThrdCreate = CyU3PThreadCreate(&FPGABootThread, /* FX3 Initialization App Thread structure */                                   "20:FPGA Boot Thread", /* Thread ID and Thread name */                                    FPGA_PSBoot_Thread_Entry, /* FX3 Initialization App Thread Entry function */                                    0, /* No input parameter to thread */                                    ptr1, /* Pointer to the allocated thread stack */                                    U3V_APP_THREAD_STACK, /* UVC Application Thread stack size */                                    U3V_APP_THREAD_PRIORITY+1, /* UVC Application Thread priority */                                    U3V_APP_THREAD_PRIORITY, /* Threshold value for thread pre-emption. */                                    CYU3P_NO_TIME_SLICE, /* No time slice for the application thread */                                    CYU3P_AUTO_START /* Start the Thread immediately */                                    ); /* Check the return code */ if (retThrdCreate != 0) { goto fatalErrorHandler; }
/* Create the thread for the application */ /* communication thread */ retThrdCreate = CyU3PThreadCreate(&BulkThread, /* Control Information App Thread structure */                                   "21:comThread", /* Thread ID and Thread name */                                   BulkThread_Entry, /* Control Information App Thread Entry function */                                   0, /* No input parameter to thread */                                   ptr2, /* Pointer to the allocated thread stack */                                   U3V_APP_THREAD_STACK, /* UVC Application Thread stack size */                                   U3V_APP_THREAD_PRIORITY, /* UVC Application Thread priority */                                   U3V_APP_THREAD_PRIORITY, /* Threshold value for thread pre-emption. */                                   CYU3P_NO_TIME_SLICE, /* No time slice for the application thread */                                   CYU3P_DONT_START /* Start the Thread immediately */                                   );
/* Check the return code */ if (retThrdCreate != 0) { goto fatalErrorHandler; }

retThrdCreate = CyU3PThreadCreate(&ControlThread, /* Control Information App Thread structure */ "21:ControlThread", /* Thread ID and Thread name */ ControlThread_Entry, /* Control Information App Thread Entry function */ 0, /* No input parameter to thread */ ptr3, /* Pointer to the allocated thread stack */ U3V_APP_THREAD_STACK, /* UVC Application Thread stack size */ U3V_APP_THREAD_PRIORITY, /* UVC Application Thread priority */ U3V_APP_THREAD_PRIORITY, /* Threshold value for thread pre-emption. */ CYU3P_NO_TIME_SLICE, /* No time slice for the application thread */ CYU3P_DONT_START /* Start the Thread immediately */ );
/* Check the return code */ if (retThrdCreate != 0) { goto fatalErrorHandler; }
    retThrdCreate = CyU3PThreadCreate(&UsbHotplugThread, /* Control Information App Thread structure */ "21:PollUsbWrongSpeed", /* Thread ID and Thread name */ Usb_hotplug_handle_Entry, /* Control Information App Thread Entry function */ 0, /* No input parameter to thread */ ptr4, /* Pointer to the allocated thread stack */ UVC_APP_THREAD_STACK/2, /* UVC Application Thread stack size */ UVC_APP_THREAD_PRIORITY, /* UVC Application Thread priority */ UVC_APP_THREAD_PRIORITY, /* Threshold value for thread pre-emption. */ CYU3P_NO_TIME_SLICE, /* No time slice for the application thread */ CYU3P_DONT_START /* Start the Thread immediately */ );
/* Check the return code */ if (retThrdCreate != 0) { goto fatalErrorHandler; } retThrdCreate = CyU3PThreadCreate(&DeviceStatusPollThread, /* Control Information App Thread structure */ "21:DeviceStatusPollThread", /* Thread ID and Thread name */ DeviceStatusPollingEntry, /* Control Information App Thread Entry function */ 0, /* No input parameter to thread */ ptr5, /* Pointer to the allocated thread stack */ UVC_APP_THREAD_STACK/2, /* UVC Application Thread stack size */ UVC_APP_THREAD_PRIORITY, /* UVC Application Thread priority */ UVC_APP_THREAD_PRIORITY, /* Threshold value for thread pre-emption. */ CYU3P_NO_TIME_SLICE, /* No time slice for the application thread */ CYU3P_DONT_START /* Start the Thread immediately */ );
/* Check the return code */ if (retThrdCreate != 0) { goto fatalErrorHandler; }   
return;
fatalErrorHandler: /* Add custom recovery or debug actions here */ /* Loop indefinitely */ while (1) ;}  /* * Main function */int main(void){ CyU3PReturnStatus_t apiRetStatus; CyU3PIoMatrixConfig_t io_cfg; CyU3PSysClockConfig_t clkCfg; /* setSysClk400 clock configurations */ clkCfg.setSysClk400 = CyTrue; /* FX3 device's master clock is set to a frequency > 400 MHz */ clkCfg.cpuClkDiv = 2; /* CPU clock divider */ clkCfg.dmaClkDiv = 2; /* DMA clock divider */ clkCfg.mmioClkDiv = 2; /* MMIO clock divider */ clkCfg.useStandbyClk = CyFalse; /* device has no 32KHz clock supplied */ clkCfg.clkSrc = CY_U3P_SYS_CLK; /* Clock source for a peripheral block  */
/* Initialize the device */ apiRetStatus = CyU3PDeviceInit(&clkCfg); if (apiRetStatus != CY_U3P_SUCCESS) { goto handle_fatal_error; }
/* Turn on instruction cache to improve firmware performance. Use Release build to improve it further */ apiRetStatus = CyU3PDeviceCacheControl(CyTrue, CyFalse, CyFalse);
/* Configure the IO matrix for the device. */ io_cfg.isDQ32Bit = CyFalse; io_cfg.lppMode = CY_U3P_IO_MATRIX_LPP_DEFAULT; io_cfg.gpioSimpleEn[0] = 0; io_cfg.gpioSimpleEn[1] = 0; io_cfg.gpioComplexEn[0] = 0; io_cfg.gpioComplexEn[1] = 0;
io_cfg.useUart = CyTrue; /* Uart is enabled for logging. */ io_cfg.useI2C = CyTrue; io_cfg.useI2S = CyFalse; io_cfg.useSpi = CyTrue;
apiRetStatus = CyU3PDeviceConfigureIOMatrix(&io_cfg); if (apiRetStatus != CY_U3P_SUCCESS) { goto handle_fatal_error; }
/* This is a non returnable call for initializing the RTOS kernel */ CyU3PKernelEntry();
/* Dummy return to make the compiler happy */ return 0;
handle_fatal_error: /* Cannot recover from this error. */ while (1) ;}

0 Likes

Hello,

Please try the following and let us know the results:

1. Please comment off the CyU3PDmaChannelSetXfer() in the function CyFxU3VApplnStart().

2. When the USB event CY_U3P_USB_EVENT_SETCONF is received, reset all the channels using the API CyU3PDmaChannelReset() and then call CyU3PDmaChannelSetXfer().

Please try this and let us know the results.

Best Regards,

Jayakrishna

Best Regards,
Jayakrishna
0 Likes