ErrorCode_t specialCase(USBD_HANDLE_T hUsb, USB_CORE_DESCS_T *pDesc,USBD_API_INIT_PARAM_T *pUsbParam, UCOM_DATA_T *com, int o) { ErrorCode_t ret = LPC_OK; com->hUsb = hUsb; com->port=o; UCOM_UartInit(o); USBD_CDC_INIT_PARAM_T cdc_param2; cdc_param2.mem_base = pUsbParam->mem_base; cdc_param2.mem_size = pUsbParam->mem_size; com->txBuf = (uint8_t *) cdc_param2.mem_base; cdc_param2.mem_base += UCOM_BUF_SZ; cdc_param2.mem_size -= UCOM_BUF_SZ; com->rxBuf = (uint8_t *) cdc_param2.mem_base; cdc_param2.mem_base += UCOM_BUF_SZ; cdc_param2.mem_size -= UCOM_BUF_SZ; ret = USBD_API->core->RegisterClassHandler(hUsb,customClassHandler, com); uint32_t ep_indx = ((( com->inEndpoint & 0x0F) << 1) +1); if (ret == LPC_OK) { ret = USBD_API->core->RegisterEpHandler(hUsb, ep_indx, UCOM_bulk_hdlrInGeneric, com); } ep_indx = (( com->outEndpoint & 0x0F) << 1); if (ret == LPC_OK) { ret = USBD_API->core->RegisterEpHandler(hUsb, ep_indx, UCOM_bulk_hdlrOutGeneric, com); } USBD_API->hw->EnableEvent(hUsb,com->inEndpoint,USB_EVT_IN,1 ); USBD_API->hw->EnableEvent(hUsb,com->inEndpoint,USB_EVT_IN_NAK,1 ); USBD_API->hw->EnableEvent(hUsb,com->outEndpoint,USB_EVT_OUT,1 ); USBD_API->hw->EnableEvent(hUsb,com->outEndpoint,USB_EVT_OUT_NAK,1 ); USBD_API->hw->ResetEP(hUsb,com->inEndpoint); USBD_API->hw->ResetEP(hUsb,com->outEndpoint); USB_ENDPOINT_DESCRIPTOR d; d.bLength=USB_ENDPOINT_DESC_SIZE; d.bDescriptorType=USB_ENDPOINT_DESCRIPTOR_TYPE; d.bEndpointAddress=com->inEndpoint; d.bmAttributes=USB_ENDPOINT_TYPE_BULK; d.bInterval=0; d.wMaxPacketSize=64; USBD_API->hw->ConfigEP(hUsb,&d); d.bLength=USB_ENDPOINT_DESC_SIZE; d.bDescriptorType=USB_ENDPOINT_DESCRIPTOR_TYPE; d.bEndpointAddress=com->outEndpoint; d.bmAttributes=USB_ENDPOINT_TYPE_BULK; d.bInterval=0; d.wMaxPacketSize=64; USBD_API->hw->ConfigEP(hUsb,&d); pUsbParam->mem_base = cdc_param2.mem_base; pUsbParam->mem_size = cdc_param2.mem_size; UCOM_UartInit(o); return ret; }
/* UART to USB com port init routine */ ErrorCode_t UCOM_init(USBD_HANDLE_T hUsb, USB_CORE_DESCS_T *pDesc, USBD_API_INIT_PARAM_T *pUsbParam) { USBD_CDC_INIT_PARAM_T cdc_param; ErrorCode_t ret = LPC_OK; uint32_t ep_indx; USB_CDC_CTRL_T *pCDC; /* Store USB stack handle for future use. */ g_uCOM.hUsb = hUsb; /* Initi CDC params */ memset((void *) &cdc_param, 0, sizeof(USBD_CDC_INIT_PARAM_T)); cdc_param.mem_base = pUsbParam->mem_base; cdc_param.mem_size = pUsbParam->mem_size; cdc_param.cif_intf_desc = (uint8_t *) find_IntfDesc(pDesc->high_speed_desc, CDC_COMMUNICATION_INTERFACE_CLASS); cdc_param.dif_intf_desc = (uint8_t *) find_IntfDesc(pDesc->high_speed_desc, CDC_DATA_INTERFACE_CLASS); cdc_param.SetLineCode = UCOM_SetLineCode; /* Init CDC interface */ ret = USBD_API->cdc->init(hUsb, &cdc_param, &g_uCOM.hCdc); if (ret == LPC_OK) { /* allocate transfer buffers */ g_uCOM.txBuf = (uint8_t *) cdc_param.mem_base; cdc_param.mem_base += UCOM_BUF_SZ; cdc_param.mem_size -= UCOM_BUF_SZ; g_uCOM.rxBuf = (uint8_t *) cdc_param.mem_base; cdc_param.mem_base += UCOM_BUF_SZ; cdc_param.mem_size -= UCOM_BUF_SZ; /* register endpoint interrupt handler */ ep_indx = (((USB_CDC_IN_EP & 0x0F) << 1) + 1); ret = USBD_API->core->RegisterEpHandler(hUsb, ep_indx, UCOM_bulk_hdlr, &g_uCOM); if (ret == LPC_OK) { /* register endpoint interrupt handler */ ep_indx = ((USB_CDC_OUT_EP & 0x0F) << 1); ret = USBD_API->core->RegisterEpHandler(hUsb, ep_indx, UCOM_bulk_hdlr, &g_uCOM); /* Init UART port for bridging */ UCOM_UartInit(); /* Set the line coding values as per UART Settings */ pCDC = (USB_CDC_CTRL_T *) g_uCOM.hCdc; pCDC->line_coding.dwDTERate = 115200; pCDC->line_coding.bDataBits = 8; } /* update mem_base and size variables for cascading calls. */ pUsbParam->mem_base = cdc_param.mem_base; pUsbParam->mem_size = cdc_param.mem_size; } return ret; }
ErrorCode_t initCom(USBD_HANDLE_T hUsb, USB_CORE_DESCS_T *pDesc,USBD_API_INIT_PARAM_T *pUsbParam, UCOM_DATA_T *com, int o) { if(o>=3) { return specialCase(hUsb,pDesc , pUsbParam, com, o); } ErrorCode_t ret = LPC_OK; USBD_CDC_INIT_PARAM_T cdc_param2; com->hUsb = hUsb; com->port=o; /* Initi CDC params */ memset((void *) &cdc_param2, 0, sizeof(USBD_CDC_INIT_PARAM_T)); cdc_param2.mem_base = pUsbParam->mem_base; cdc_param2.mem_size = pUsbParam->mem_size; cdc_param2.cif_intf_desc = (uint8_t *) find_IntfDesc(pDesc->high_speed_desc, CDC_COMMUNICATION_INTERFACE_CLASS,o); cdc_param2.dif_intf_desc = (uint8_t *) find_IntfDesc(pDesc->high_speed_desc, CDC_DATA_INTERFACE_CLASS,o); UCOM_UartInit(o); switch(o) { case 0: cdc_param2.SetLineCode = UCOM_SetLineCode0; case 1: cdc_param2.SetLineCode = UCOM_SetLineCode1; case 2: cdc_param2.SetLineCode = UCOM_SetLineCode2; break; default: break; } cdc_param2.CDC_BulkIN_Hdlr= com->pInHdlr; cdc_param2.CDC_BulkOUT_Hdlr= com->pOutHdlr; ret = USBD_API->cdc->init(hUsb, &cdc_param2, &com->hCdc); if (ret == LPC_OK) { /* allocate transfer buffers */ com->txBuf = (uint8_t *) cdc_param2.mem_base; cdc_param2.mem_base += UCOM_BUF_SZ; cdc_param2.mem_size -= UCOM_BUF_SZ; com->rxBuf = (uint8_t *) cdc_param2.mem_base; cdc_param2.mem_base += UCOM_BUF_SZ; cdc_param2.mem_size -= UCOM_BUF_SZ; /* Init UART port for bridging */ /* Set the line coding values as per UART Settings */ USB_CDC_CTRL_T * pCDC = (USB_CDC_CTRL_T *) com->hCdc; pCDC->line_coding.dwDTERate = 115200; pCDC->line_coding.bDataBits = 8; uint32_t ep_indx = ((( com->inEndpoint & 0x0F) << 1) +1); if (ret == LPC_OK) { ret = USBD_API->core->RegisterEpHandler(hUsb, ep_indx, com->pInHdlr, com); } ep_indx = (( com->outEndpoint & 0x0F) << 1); if (ret == LPC_OK) { ret = USBD_API->core->RegisterEpHandler(hUsb, ep_indx, com->pOutHdlr, com); } USBD_API->hw->EnableEvent(hUsb,com->inEndpoint,USB_EVT_IN,1 ); USBD_API->hw->EnableEvent(hUsb,com->inEndpoint,USB_EVT_IN_NAK,1 ); USBD_API->hw->EnableEvent(hUsb,com->outEndpoint,USB_EVT_OUT,1 ); USBD_API->hw->EnableEvent(hUsb,com->outEndpoint,USB_EVT_OUT_NAK,1 ); USBD_API->hw->ResetEP(hUsb,com->inEndpoint); USBD_API->hw->ResetEP(hUsb,com->outEndpoint); USB_ENDPOINT_DESCRIPTOR d; d.bLength=USB_ENDPOINT_DESC_SIZE; d.bDescriptorType=USB_ENDPOINT_DESCRIPTOR_TYPE; d.bEndpointAddress=com->inEndpoint; d.bmAttributes=USB_ENDPOINT_TYPE_BULK; d.bInterval=0; d.wMaxPacketSize=64; USBD_API->hw->ConfigEP(hUsb,&d); d.bLength=USB_ENDPOINT_DESC_SIZE; d.bDescriptorType=USB_ENDPOINT_DESCRIPTOR_TYPE; d.bEndpointAddress=com->outEndpoint; d.bmAttributes=USB_ENDPOINT_TYPE_BULK; d.bInterval=0; d.wMaxPacketSize=64; USBD_API->hw->ConfigEP(hUsb,&d); /* update mem_base and size variables for cascading calls. */ pUsbParam->mem_base = cdc_param2.mem_base; pUsbParam->mem_size = cdc_param2.mem_size; } return ret; }