// ----------------------------------------------------------------------------- //! \brief This routine writes data from the buffer to the transport layer. //! //! \param[in] buf - Pointer to buffer to write data from. //! \param[in] len - Number of bytes to write. //! //! \return uint16_t - NPI error code value // ----------------------------------------------------------------------------- uint8_t NPITL_writeTL(uint8_t *buf, uint16_t len) { _npiCSKey_t key; key = NPIUtil_EnterCS(); // Check to make sure NPI is not currently in a transaction if (TL_ready != NPITL_getTlStatus()) { NPIUtil_ExitCS(key); return NPI_BUSY; } // Check to make sure that write size is not greater than what is // allowed if (len > npiBufSize) { NPIUtil_ExitCS(key); return NPI_TX_MSG_OVERSIZE; } // Copy into the second byte of npiTxBuf. This will save Serial Port // Specific TL code from having to shift one byte later on for SOF. //memset(npiTxBuf, 0, npiTLParams.npiTLBufSize); memcpy(&npiTxBuf[1], buf, len); npiTxBufLen = len; npiTxActive = TRUE; txPktCount++; trasnportLayerState = TL_busy; transportWrite(npiTxBufLen); NPIUtil_ExitCS(key); return NPI_SUCCESS; }
// ----------------------------------------------------------------------------- //! \brief This routine writes data from the buffer to the transport layer. //! //! \param[in] buf - Pointer to buffer to write data from. //! \param[in] len - Number of bytes to write. //! //! \return uint16_t - NPI error code value // ----------------------------------------------------------------------------- uint8_t NPITL_writeTL(uint8_t *buf, uint16_t len) { #if (NPI_FLOW_CTRL == 1) _npiCSKey_t key; key = NPIUtil_EnterCS(); #endif // NPI_FLOW_CTRL = 1 // Check to make sure NPI is not currently in a transaction if (NPITL_checkNpiBusy()) { #if (NPI_FLOW_CTRL == 1) NPIUtil_ExitCS(key); #endif // NPI_FLOW_CTRL = 1 return NPI_BUSY; } // Check to make sure that write size is not greater than what is // allowed if (len > npiBufSize) { #if (NPI_FLOW_CTRL == 1) NPIUtil_ExitCS(key); #endif // NPI_FLOW_CTRL = 1 return NPI_TX_MSG_OVERSIZE; } // Copy into the second byte of npiTxBuf. This will save Serial Port // Specific TL code from having to shift one byte later on for SOF. memcpy(&npiTxBuf[1], buf, len); npiTxBufLen = len; npiTxActive = TRUE; txPktCount++; transportWrite(npiTxBufLen); #if (NPI_FLOW_CTRL == 1) LocRDY_ENABLE(); NPIUtil_ExitCS(key); #endif // NPI_FLOW_CTRL = 1 return NPI_SUCCESS; }
// ----------------------------------------------------------------------------- //! \brief This routine writes data from the buffer to the transport layer. //! //! \param[in] buf - Pointer to buffer to write data from. //! \param[in] len - Number of bytes to write. //! //! \return uint16 - the number of bytes written to transport // ----------------------------------------------------------------------------- uint16 NPITL_writeTL(uint8 *buf, uint16 len) { ICall_CSState key; key = ICall_enterCriticalSection(); // Writes are atomic at transport layer if ( NPITL_checkNpiBusy() ) { ICall_leaveCriticalSection(key); return 0; } // If len of message is greater than fragment size // then message must be sent over the span of multiple // fragments if ( len > NPI_MAX_FRAG_SIZE ) { msgFrag = buf + NPI_MAX_FRAG_SIZE; msgFragLen = len - NPI_MAX_FRAG_SIZE; len = NPI_MAX_FRAG_SIZE; } else { msgFrag = NULL; msgFragLen = 0; } memcpy(npiTxBuf, buf, len); npiTxBufLen = len; npiTxActive = TRUE; txPktCount++; len = transportWrite(npiTxBufLen); #if (NPI_FLOW_CTRL == 1) SRDY_ENABLE(); #endif // NPI_FLOW_CTRL = 1 ICall_leaveCriticalSection(key); return len; }