/* Virtual com port buffered read routine */ uint32_t vcom_bread(uint8_t *pBuf, uint32_t buf_len) { VCOM_DATA_T *pVcom = &g_vCOM; uint16_t cnt = 0; /* read from the default buffer if any data present */ if (pVcom->rx_count) { cnt = (pVcom->rx_count < buf_len) ? pVcom->rx_count : buf_len; memcpy(pBuf, pVcom->rx_buff, cnt); pVcom->rx_rd_count += cnt; /* enter critical section */ NVIC_DisableIRQ(USB0_IRQn); if (pVcom->rx_rd_count >= pVcom->rx_count) { pVcom->rx_flags &= ~VCOM_RX_BUF_FULL; pVcom->rx_rd_count = pVcom->rx_count = 0; } /* exit critical section */ NVIC_EnableIRQ(USB0_IRQn); } return cnt; } |
/* Virtual com port read routine */ ErrorCode_t vcom_read_req(uint8_t *pBuf, uint32_t len) { VCOM_DATA_T *pVcom = &g_vCOM; /* check if we queued Rx buffer */ if (pVcom->rx_flags & (VCOM_RX_BUF_QUEUED | VCOM_RX_DB_QUEUED)) { return ERR_BUSY; } /* enter critical section */ NVIC_DisableIRQ(USB0_IRQn); /* if not queue the request and return 0 bytes */ USBD_API->hw->ReadReqEP(pVcom->hUsb, USB_CDC_OUT_EP, pBuf, len); /* exit critical section */ NVIC_EnableIRQ(USB0_IRQn); pVcom->rx_flags |= VCOM_RX_DB_QUEUED; return LPC_OK; } |
/* Gets current read count. */ uint32_t vcom_read_cnt(void) { VCOM_DATA_T *pVcom = &g_vCOM; uint32_t ret = 0; if (pVcom->rx_flags & VCOM_RX_DONE) { ret = pVcom->rx_count; pVcom->rx_count = 0; } return ret; } /* Virtual com port write routine*/ uint32_t vcom_write(uint8_t *pBuf, uint32_t len) { VCOM_DATA_T *pVcom = &g_vCOM; uint32_t ret = 0; if ( (pVcom->tx_flags & VCOM_TX_CONNECTED) && ((pVcom->tx_flags & VCOM_TX_BUSY) == 0) ) { pVcom->tx_flags |= VCOM_TX_BUSY; /* enter critical section */ NVIC_DisableIRQ(USB0_IRQn); ret = USBD_API->hw->WriteEP(pVcom->hUsb, USB_CDC_IN_EP, pBuf, len); /* exit critical section */ NVIC_EnableIRQ(USB0_IRQn); } return ret; } |
while (1) { /* If VCOM port is opened echo whatever we receive back to host. */ if (vcom_connected() && g_vCOM.rx_count ) { rdCnt = vcom_bread(&g_rxBuff[0], 256); if (rdCnt) { vcom_write(&g_rxBuff[0], rdCnt); } } /* Sleep until next IRQ happens */ __WFI(); } |
/* Virtual com port buffered read routine FIXED */ uint32_t vcom_bread_mod(uint8_t *pBuf, uint32_t buf_len) { VCOM_DATA_T *pVcom = &g_vCOM; uint16_t cnt = 0; /* read from the default buffer if any data present */ if (pVcom->rx_count) { if ((pVcom->rx_count - pVcom->rx_rd_count) < buf_len) { cnt = (pVcom->rx_count - pVcom->rx_rd_count); } else { cnt = buf_len; } memcpy(pBuf, (pVcom->rx_buff + pVcom->rx_rd_count) , cnt); pVcom->rx_rd_count += cnt; /* enter critical section */ NVIC_DisableIRQ(LPC_USB_IRQ); if (pVcom->rx_rd_count >= pVcom->rx_count) { pVcom->rx_flags &= ~VCOM_RX_BUF_FULL; pVcom->rx_rd_count = pVcom->rx_count = 0; } /* exit critical section */ NVIC_EnableIRQ(LPC_USB_IRQ); } return cnt; } |
/* Virtual com port write routine FIXED * Without this, written characters can be lost */ uint32_t vcom_write_mod(uint8_t *pBuf, uint32_t len) { VCOM_DATA_T *pVcom = &g_vCOM; uint32_t ret = 0; // loop until ready to call function while ((pVcom->tx_flags & VCOM_TX_CONNECTED) && ((pVcom->tx_flags & VCOM_TX_BUSY))) { } if ((pVcom->tx_flags & VCOM_TX_CONNECTED) && ((pVcom->tx_flags & VCOM_TX_BUSY) == 0)) { pVcom->tx_flags |= VCOM_TX_BUSY; /* enter critical section */ NVIC_DisableIRQ(LPC_USB_IRQ); ret = USBD_API->hw->WriteEP(pVcom->hUsb, USB_CDC_IN_EP, pBuf, len); /* exit critical section */ NVIC_EnableIRQ(LPC_USB_IRQ); } return ret; } |