/* 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;
} |