static void SNP_sendAsyncCmd(_npiFrame_t *pPkt) { // Enter Critical Section. SNP_enterCS(); // Send command. NPITask_sendToHost(pPkt); // Exit Critical section SNP_exitCS(); }
/******************************************************************************* * This generic function sends a Command Complete or a Vendor Specific Command * Complete Event to the Host. * */ static void sendCommandStatusEvent(uint8_t eventCode, uint16_t status, uint16_t opcode) { npiPkt_t *msg; uint8_t totalLength; // The initial length will be: // OSAL message header(4) - not part of packet sent to HCI Host! // Minimum Event Data: Packet Type(1) + Event Code(1) + Length(1) // Command Status Event Data: Status (1) + Num HCI Cmd Pkt (1) + Cmd Opcode (2) totalLength = sizeof(npiPkt_t) + HCI_EVENT_MIN_LENGTH + HCI_CMD_STATUS_EVENT_LEN; // allocate memory for OSAL hdr + packet msg = (npiPkt_t *)ICall_allocMsg(totalLength); if (msg) { // OSAL message event, status, and pointer to packet msg->hdr.event = HCI_EVENT_PACKET; msg->hdr.status = 0xFF; // fill in length and data pointer msg->pktLen = HCI_EVENT_MIN_LENGTH + HCI_CMD_STATUS_EVENT_LEN; msg->pData = (uint8*)(msg+1); // fill in Command Complete Event data msg->pData[0] = HCI_EVENT_PACKET; msg->pData[1] = eventCode; msg->pData[2] = HCI_CMD_STATUS_EVENT_LEN; msg->pData[3] = status; msg->pData[4] = 1; // number of HCI command packets msg->pData[5] = LO_UINT16(opcode); // opcode (LSB) msg->pData[6] = HI_UINT16(opcode); // opcode (MSB) NPITask_sendToHost((uint8_t *)msg); } }
static void SNP_sendSynchronousCmd(_npiFrame_t *pReq, uint8_t opcode, snp_msg_t *pRsp, uint16_t *rspLen) { // Enter Critical Section. SNP_enterCS(); npiRetMsg.pMsg = pRsp; // Send command. NPITask_sendToHost(pReq); // Wait for a response from the NP. SNP_waitForResponse(); // Update Length after response is received if (rspLen) { *rspLen = npiRetMsg.len; } // Exit Critical Section SNP_exitCS(); }
/******************************************************************************* * This is a generic function used to send BLE Complete Event to the * Host processor. * */ static void sendBLECompleteEvent(uint8 eventLen, uint8 *pEvent) { npiPkt_t *msg; uint8_t totalLength; // The initial length will be: // OSAL message header(4) - not part of packet sent to HCI Host! // Minimum Event Data: Packet Type(1) + Event Code(1) + Length(1) // Event Data: eventLen totalLength = sizeof(npiPkt_t) + HCI_EVENT_MIN_LENGTH + eventLen; // allocate memory for OSAL hdr + packet msg = (npiPkt_t *)ICall_allocMsg(totalLength); if (msg) { // OSAL message event, status, and pointer to packet msg->hdr.event = HCI_EVENT_PACKET; msg->hdr.status = 0xFF; // fill in length and data pointer msg->pktLen = HCI_EVENT_MIN_LENGTH + eventLen; msg->pData = (uint8*)(msg+1); // fill in BLE Complete Event data msg->pData[0] = HCI_EVENT_PACKET; msg->pData[1] = HCI_LE_EVENT_CODE; msg->pData[2] = eventLen; // populate event data if (eventLen > 0) { memcpy(&msg->pData[3], pEvent, eventLen); } NPITask_sendToHost((uint8_t *)msg); } }
/******************************************************************************* * This generic function sends a Command Complete or a Vendor Specific Command * Complete Event to the Host. * */ static void sendCommandCompleteEvent(uint8_t eventCode, uint16_t opcode, uint8_t numParam, uint8_t *param) { npiPkt_t *msg; uint8_t totalLength; uint8_t txLen = 0; // Length to transmit // The initial length will be: // OSAL message header(4) - not part of packet sent to HCI Host! // Minimum Event Data: Packet Type(1) + Event Code(1) + Length(1) // Return Parameters (0..N) totalLength = sizeof(npiPkt_t) + HCI_EVENT_MIN_LENGTH + numParam; // adjust the size of the event packet based on event code // Note: If not a vendor specific event, then the event includes: // Command Complete Data: Number of HCI Commands Allowed(1) + Command Opcode(2) // Note: If a vendor specific event, then the event includes: // Vendor Specific Command Complete Data: Vendor Specific Event Opcode(2) totalLength += ( (eventCode != HCI_VE_EVENT_CODE) ? HCI_CMD_COMPLETE_EVENT_LEN : HCI_CMD_VS_COMPLETE_EVENT_LEN ); // allocate memory for OSAL hdr + packet msg = (npiPkt_t *)ICall_allocMsg(totalLength); if (msg) { // OSAL message event, status, and pointer to packet msg->hdr.event = HCI_EVENT_PACKET; msg->hdr.status = 0xFF; msg->pData = (uint8*)(msg+1); // fill in Command Complete Event data msg->pData[0] = HCI_EVENT_PACKET; msg->pData[1] = eventCode; txLen += 2; // check if this isn't a vendor specific event if ( eventCode != HCI_VE_EVENT_CODE ) { msg->pData[2] = numParam + HCI_CMD_COMPLETE_EVENT_LEN; msg->pData[3] = 1;// hciCtrlCmdToken; // event parameter 1 msg->pData[4] = LO_UINT16( opcode ); // event parameter 2 msg->pData[5] = HI_UINT16( opcode ); // event parameter 2 txLen += 4; // remaining event parameters (void)memcpy(&msg->pData[6], param, numParam); txLen += numParam; } else // it is a vendor specific event { // less one byte as number of complete packets not used in vendor specific event msg->pData[2] = numParam + HCI_CMD_VS_COMPLETE_EVENT_LEN; msg->pData[3] = param[0]; // event parameter 0: event opcode LSB msg->pData[4] = param[1]; // event parameter 1: event opcode MSB msg->pData[5] = param[2]; // event parameter 2: status msg->pData[6] = LO_UINT16( opcode ); // event parameter 3: command opcode LSB msg->pData[7] = HI_UINT16( opcode ); // event parameter 3: command opcode MSB txLen += 6; // remaining event parameters // Note: The event opcode and status were already placed in the msg packet. (void)memcpy(&msg->pData[8], ¶m[3], numParam-HCI_EVENT_MIN_LENGTH); txLen += (numParam-HCI_EVENT_MIN_LENGTH); } msg->pktLen = txLen; NPITask_sendToHost((uint8_t *)msg); } }