/** Writes data to an endpoint buffer @param [in] bEP Endpoint number @param [in] pbBuf Endpoint data @param [in] iLen Number of bytes to write @return TRUE if the data was successfully written or <0 in case of error. */ int USBHwEPWrite(U8 bEP, U8 *pbBuf, int iLen) { int idx; idx = EP2IDX(bEP); // DBG("<%d", iLen); // DBG("<"); // set write enable for specific endpoint USBCtrl = WR_EN | ((bEP & 0xF) << 2); // set packet length USBTxPLen = iLen; // write data while (USBCtrl & WR_EN) { USBTxData = (pbBuf[3] << 24) | (pbBuf[2] << 16) | (pbBuf[1] << 8) | pbBuf[0]; pbBuf += 4; } // select endpoint and validate buffer USBHwCmd(CMD_EP_SELECT | idx); USBHwCmd(CMD_EP_VALIDATE_BUFFER); return iLen; }
/** Writes data to an endpoint buffer @param [in] bEP Endpoint number @param [in] pbBuf Endpoint data @param [in] iLen Number of bytes to write @return TRUE if the data was successfully written or <0 in case of error. */ int USBHwEPWrite(U8 bEP, U8 *pbBuf, int iLen) { int idx; idx = EP2IDX(bEP); // set write enable for specific endpoint LPC_USB->USBCtrl = WR_EN | ((bEP & 0xF) << 2); // set packet length LPC_USB->USBTxPLen = iLen; if(iLen > 0) { // write data while (LPC_USB->USBCtrl & WR_EN) { LPC_USB->USBTxData = (pbBuf[3] << 24) | (pbBuf[2] << 16) | (pbBuf[1] << 8) | pbBuf[0]; pbBuf += 4; } } else { LPC_USB->USBTxData = 0; } // Clear WR_EN to cover zero length packet case LPC_USB->USBCtrl=0; // select endpoint and validate buffer USBHwCmd(CMD_EP_SELECT | idx); USBHwCmd(CMD_EP_VALIDATE_BUFFER); return iLen; }
/** Reads data from an endpoint buffer @param [in] bEP Endpoint number @param [in] pbBuf Endpoint data @param [in] iMaxLen Maximum number of bytes to read @return the number of bytes available in the EP (possibly more than iMaxLen), or <0 in case of error. */ int USBHwEPRead(U8 bEP, U8 *pbBuf, int iMaxLen) { int i, idx; U32 dwData, dwLen; idx = EP2IDX(bEP); // set read enable bit for specific endpoint USBCtrl = RD_EN | ((bEP & 0xF) << 2); // wait for PKT_RDY do { dwLen = USBRxPLen; } while ((dwLen & PKT_RDY) == 0); // packet valid? if ((dwLen & DV) == 0) { return -1; } // get length dwLen &= PKT_LNGTH_MASK; // get data while (USBCtrl & RD_EN) { dwData = USBRxData; if (pbBuf != NULL) { for (i = 0; i < 4; i++) { if (iMaxLen-- != 0) { *pbBuf++ = dwData & 0xFF; } dwData >>= 8; } } } // select endpoint and clear buffer USBHwCmd(CMD_EP_SELECT | idx); USBHwCmd(CMD_EP_CLEAR_BUFFER); // DBG(">%d", dwLen); // DBG(">"); return dwLen; }
/** Local function to send a command + data to the USB protocol engine @param [in] bCmd Command to send @param [in] bData Data to send */ static void USBHwCmdWrite(unsigned char bCmd, unsigned short bData) { // write command code USBHwCmd(bCmd); // write command data LPC_USB->USBCmdCode = 0x00000100 | (bData << 16); Wait4DevInt(CCEMTY); }
/** Local function to send a command + data to the USB protocol engine @param [in] bCmd Command to send @param [in] bData Data to send */ static void USBHwCmdWrite(U8 bCmd, U16 bData) { // write command code USBHwCmd(bCmd); // write command data USBCmdCode = 0x00000100 | (bData << 16); Wait4DevInt(CCEMTY); }
/** Reads data from an endpoint buffer @param [in] bEP Endpoint number @param [in] pbBuf Endpoint data @param [in] iMaxLen Maximum number of bytes to read @return the number of bytes available in the EP (possibly more than iMaxLen), or <0 in case of error. */ int USBHwEPRead(unsigned char bEP, unsigned char *pbBuf, int iMaxLen) { int i, idx; unsigned long dwData, dwLen; idx = EP2IDX(bEP); // set read enable bit for specific endpoint LPC_USB->USBCtrl = RD_EN | ((bEP & 0xF) << 2); // wait for PKT_RDY do { dwLen = LPC_USB->USBRxPLen; } while ((dwLen & PKT_RDY) == 0); // packet valid? if ((dwLen & DV) == 0) { return -1; } // get length dwLen &= PKT_LNGTH_MASK; // get data dwData = 0; for (i = 0; i < (int)dwLen; i++) { if ((i % 4) == 0) { dwData = LPC_USB->USBRxData; } if ((pbBuf != NULL) && (i < iMaxLen)) { pbBuf[i] = dwData & 0xFF; } dwData >>= 8; } // make sure RD_EN is clear LPC_USB->USBCtrl = 0; // select endpoint and clear buffer USBHwCmd(CMD_EP_SELECT | idx); USBHwCmd(CMD_EP_CLEAR_BUFFER); return dwLen; }
/** Local function to send a command to the USB protocol engine and read data @param [in] bCmd Command to send @return the data */ static unsigned char USBHwCmdRead(unsigned char bCmd) { // write command code USBHwCmd(bCmd); // get data LPC_USB->USBCmdCode = 0x00000200 | (bCmd << 16); Wait4DevInt(CDFULL); return LPC_USB->USBCmdData; }
/** Local function to send a command to the USB protocol engine and read data @param [in] bCmd Command to send @return the data */ static U8 USBHwCmdRead(U8 bCmd) { // write command code USBHwCmd(bCmd); // get data USBCmdCode = 0x00000200 | (bCmd << 16); Wait4DevInt(CDFULL); return USBCmdData; }