/********************************************************************************* *Function : void Delay_Microsecond(uint32_t uSec) *Description : delay us *Input : uSec:set delay time *Output : none *Return : none *author : lz *date : 6-December-2014 *Others : none **********************************************************************************/ void Delay_Microsecond(uint32_t uSec) { volatile uint32_t DWT_START = DWT->CYCCNT; // keep DWT_TOTAL from overflowing (max 59.652323s w/72MHz SystemCoreClock) if (uSec > (UINT_MAX / SYSTEM_US_TICKS)) // UINT_MAX = 0xFFFFFFFF { uSec = (UINT_MAX / SYSTEM_US_TICKS); } volatile uint32_t DWT_TOTAL = (SYSTEM_US_TICKS * uSec); while((DWT->CYCCNT - DWT_START) < DWT_TOTAL) { KICK_WDT(); } }
/* * @brief This should block for a certain number of milliseconds and also execute spark_wlan_loop */ void delay(unsigned long ms) { #ifdef SPARK_WLAN_ENABLE volatile system_tick_t spark_loop_elapsed_millis = SPARK_LOOP_DELAY_MILLIS; spark_loop_total_millis += ms; #endif volatile system_tick_t last_millis = GetSystem1MsTick(); while (1) { KICK_WDT(); volatile system_tick_t current_millis = GetSystem1MsTick(); volatile long elapsed_millis = current_millis - last_millis; //Check for wrapping if (elapsed_millis < 0) { elapsed_millis = last_millis + current_millis; } if (elapsed_millis >= ms) { break; } #ifdef SPARK_WLAN_ENABLE if (!SPARK_WLAN_SETUP || SPARK_WLAN_SLEEP) { //Do not yield for SPARK_WLAN_Loop() } else if ((elapsed_millis >= spark_loop_elapsed_millis) || (spark_loop_total_millis >= SPARK_LOOP_DELAY_MILLIS)) { spark_loop_elapsed_millis = elapsed_millis + SPARK_LOOP_DELAY_MILLIS; //spark_loop_total_millis is reset to 0 in SPARK_WLAN_Loop() do { //Run once if the above condition passes SPARK_WLAN_Loop(); } while (SPARK_FLASH_UPDATE);//loop during OTA update } #endif } }
/********************************************************************************* *Function : *Description : *Input : *Output : *Return : *author : *date : *Others : **********************************************************************************/ void panic_(ePanicCode code) { __disable_irq(); // Flush any serial message to help the poor bugger debug this; flash_codes_t pcd = flash_codes[code]; uint16_t c; int loops = 2; if (debug_output_)(debug_output_("!")); while(loops) { // preamble KICK_WDT(); // add led indicate #ifdef RELEASE_BUILD if (--loops == 0) NVIC_SystemReset(); #endif } }
UINT8 * hci_event_handler(void *pRetParams, UINT8 *from, INT32 *fromlen) { UINT8 *pucReceivedData, ucArgsize; UINT16 usLength; UINT8 *pucReceivedParams; UINT16 usReceivedEventOpcode = 0; UINT32 retValue32; UINT8 * RecvParams; UINT8 *RetParams; volatile system_tick_t start = GetSystem1MsTick(); while (1) { if (tSLInformation.usEventOrDataReceived == 0) { KICK_WDT(); volatile system_tick_t now = GetSystem1MsTick(); volatile long elapsed = now - start; if (elapsed < 0) { // Did we wrap elapsed = start + now; // yes now } if (cc3000__event_timeout_ms && (elapsed >= cc3000__event_timeout_ms)) { ERROR("Timeout now %ld start %ld elapsed %ld cc3000__event_timeout_ms %ld",now,start,elapsed,cc3000__event_timeout_ms); ERROR("Timeout waiting on tSLInformation.usRxEventOpcode 0x%04x",tSLInformation.usRxEventOpcode); // Timeout Return Error for requested Opcode // This sucks because callers should have initialized pucReceivedParams switch(tSLInformation.usRxEventOpcode) { default: INVALID_CASE(tSLInformation.usRxEventOpcode); break; case HCI_CMND_SIMPLE_LINK_START: case HCI_CMND_READ_BUFFER_SIZE: break; case HCI_CMND_WLAN_CONFIGURE_PATCH: case HCI_NETAPP_DHCP: case HCI_NETAPP_PING_SEND: case HCI_NETAPP_PING_STOP: case HCI_NETAPP_ARP_FLUSH: case HCI_NETAPP_SET_DEBUG_LEVEL: case HCI_NETAPP_SET_TIMERS: case HCI_EVNT_NVMEM_READ: case HCI_EVNT_NVMEM_CREATE_ENTRY: case HCI_CMND_NVMEM_WRITE_PATCH: case HCI_NETAPP_PING_REPORT: case HCI_EVNT_MDNS_ADVERTISE: case HCI_EVNT_READ_SP_VERSION: case HCI_EVNT_SELECT: *(UINT8 *)pRetParams = -1; break; case HCI_CMND_SETSOCKOPT: case HCI_CMND_WLAN_CONNECT: case HCI_CMND_WLAN_IOCTL_STATUSGET: case HCI_EVNT_WLAN_IOCTL_ADD_PROFILE: case HCI_CMND_WLAN_IOCTL_DEL_PROFILE: case HCI_CMND_WLAN_IOCTL_SET_CONNECTION_POLICY: case HCI_CMND_WLAN_IOCTL_SET_SCANPARAM: case HCI_CMND_WLAN_IOCTL_SIMPLE_CONFIG_START: case HCI_CMND_WLAN_IOCTL_SIMPLE_CONFIG_STOP: case HCI_CMND_WLAN_IOCTL_SIMPLE_CONFIG_SET_PREFIX: case HCI_CMND_EVENT_MASK: case HCI_EVNT_WLAN_DISCONNECT: case HCI_EVNT_SOCKET: case HCI_EVNT_BIND: case HCI_CMND_LISTEN: case HCI_EVNT_CLOSE_SOCKET: case HCI_EVNT_CONNECT: case HCI_EVNT_NVMEM_WRITE: case HCI_EVNT_BSD_GETHOSTBYNAME: *(INT32 *)pRetParams = -1; break; case HCI_EVNT_RECV: case HCI_EVNT_RECVFROM: case HCI_EVNT_ACCEPT: case HCI_EVNT_SEND: case HCI_EVNT_SENDTO: case HCI_CMND_GETSOCKOPT: *(INT32 *)pRetParams = -1; pRetParams += sizeof(INT32); *(INT32 *)pRetParams = -1; break; case HCI_CMND_WLAN_IOCTL_GET_SCAN_RESULTS: *(INT32 *)pRetParams = 0; break; case HCI_NETAPP_IPCONFIG: memset(pRetParams,0,sizeof(tNetappIpconfigRetArgs)); break; } break; // Exit Loop } } else { pucReceivedData = (tSLInformation.pucReceivedData); if (*pucReceivedData == HCI_TYPE_EVNT) { // Event Received STREAM_TO_UINT16((CHAR *)pucReceivedData, HCI_EVENT_OPCODE_OFFSET, usReceivedEventOpcode); pucReceivedParams = pucReceivedData + HCI_EVENT_HEADER_SIZE; RecvParams = pucReceivedParams; RetParams = pRetParams; // In case unsolicited event received - here the handling finished if (hci_unsol_event_handler((CHAR *)pucReceivedData) == 0) { STREAM_TO_UINT8(pucReceivedData, HCI_DATA_LENGTH_OFFSET, usLength); switch(usReceivedEventOpcode) { case HCI_CMND_READ_BUFFER_SIZE: { STREAM_TO_UINT8((CHAR *)pucReceivedParams, 0, tSLInformation.usNumberOfFreeBuffers); STREAM_TO_UINT16((CHAR *)pucReceivedParams, 1, tSLInformation.usSlBufferLength); } break; case HCI_CMND_WLAN_CONFIGURE_PATCH: case HCI_NETAPP_DHCP: case HCI_NETAPP_PING_SEND: case HCI_NETAPP_PING_STOP: case HCI_NETAPP_ARP_FLUSH: case HCI_NETAPP_SET_DEBUG_LEVEL: case HCI_NETAPP_SET_TIMERS: case HCI_EVNT_NVMEM_READ: case HCI_EVNT_NVMEM_CREATE_ENTRY: case HCI_CMND_NVMEM_WRITE_PATCH: case HCI_NETAPP_PING_REPORT: case HCI_EVNT_MDNS_ADVERTISE: STREAM_TO_UINT8(pucReceivedData, HCI_EVENT_STATUS_OFFSET ,*(UINT8 *)pRetParams); break; case HCI_CMND_SETSOCKOPT: case HCI_CMND_WLAN_CONNECT: case HCI_CMND_WLAN_IOCTL_STATUSGET: case HCI_EVNT_WLAN_IOCTL_ADD_PROFILE: case HCI_CMND_WLAN_IOCTL_DEL_PROFILE: case HCI_CMND_WLAN_IOCTL_SET_CONNECTION_POLICY: case HCI_CMND_WLAN_IOCTL_SET_SCANPARAM: case HCI_CMND_WLAN_IOCTL_SIMPLE_CONFIG_START: case HCI_CMND_WLAN_IOCTL_SIMPLE_CONFIG_STOP: case HCI_CMND_WLAN_IOCTL_SIMPLE_CONFIG_SET_PREFIX: case HCI_CMND_EVENT_MASK: case HCI_EVNT_WLAN_DISCONNECT: case HCI_EVNT_SOCKET: case HCI_EVNT_BIND: case HCI_CMND_LISTEN: case HCI_EVNT_CLOSE_SOCKET: case HCI_EVNT_CONNECT: case HCI_EVNT_NVMEM_WRITE: STREAM_TO_UINT32((CHAR *)pucReceivedParams,0 ,*(UINT32 *)pRetParams); break; case HCI_EVNT_READ_SP_VERSION: STREAM_TO_UINT8(pucReceivedData, HCI_EVENT_STATUS_OFFSET ,*(UINT8 *)pRetParams); pRetParams = ((CHAR *)pRetParams) + 1; STREAM_TO_UINT32((CHAR *)pucReceivedParams, 0, retValue32); UINT32_TO_STREAM((UINT8 *)pRetParams, retValue32); break; case HCI_EVNT_BSD_GETHOSTBYNAME: STREAM_TO_UINT32((CHAR *)pucReceivedParams ,GET_HOST_BY_NAME_RETVAL_OFFSET,*(UINT32 *)pRetParams); pRetParams = ((CHAR *)pRetParams) + 4; STREAM_TO_UINT32((CHAR *)pucReceivedParams ,GET_HOST_BY_NAME_ADDR_OFFSET,*(UINT32 *)pRetParams); break; case HCI_EVNT_GETMSSVALUE: STREAM_TO_UINT16((CHAR *)pucReceivedParams ,GET_MSS_VAL_RETVAL_OFFSET,*(UINT16 *)pRetParams); break; case HCI_EVNT_ACCEPT: { STREAM_TO_UINT32((CHAR *)pucReceivedParams,ACCEPT_SD_OFFSET ,*(UINT32 *)pRetParams); pRetParams = ((CHAR *)pRetParams) + 4; STREAM_TO_UINT32((CHAR *)pucReceivedParams ,ACCEPT_RETURN_STATUS_OFFSET,*(UINT32 *)pRetParams); pRetParams = ((CHAR *)pRetParams) + 4; //This argument returns in network order memcpy((UINT8 *)pRetParams, pucReceivedParams + ACCEPT_ADDRESS__OFFSET, sizeof(sockaddr)); break; } case HCI_EVNT_RECV: case HCI_EVNT_RECVFROM: { STREAM_TO_UINT32((CHAR *)pucReceivedParams,SL_RECEIVE_SD_OFFSET ,*(UINT32 *)pRetParams); pRetParams = ((CHAR *)pRetParams) + 4; STREAM_TO_UINT32((CHAR *)pucReceivedParams,SL_RECEIVE_NUM_BYTES_OFFSET,*(UINT32 *)pRetParams); pRetParams = ((CHAR *)pRetParams) + 4; STREAM_TO_UINT32((CHAR *)pucReceivedParams,SL_RECEIVE__FLAGS__OFFSET,*(UINT32 *)pRetParams); if(((tBsdReadReturnParams *)pRetParams)->iNumberOfBytes == ERROR_SOCKET_INACTIVE) { set_socket_active_status(((tBsdReadReturnParams *)pRetParams)->iSocketDescriptor,SOCKET_STATUS_INACTIVE); } break; } case HCI_EVNT_SEND: case HCI_EVNT_SENDTO: { STREAM_TO_UINT32((CHAR *)pucReceivedParams,SL_RECEIVE_SD_OFFSET ,*(UINT32 *)pRetParams); pRetParams = ((CHAR *)pRetParams) + 4; STREAM_TO_UINT32((CHAR *)pucReceivedParams,SL_RECEIVE_NUM_BYTES_OFFSET,*(UINT32 *)pRetParams); pRetParams = ((CHAR *)pRetParams) + 4; break; } case HCI_EVNT_SELECT: { STREAM_TO_UINT32((CHAR *)pucReceivedParams,SELECT_STATUS_OFFSET,*(UINT32 *)pRetParams); pRetParams = ((CHAR *)pRetParams) + 4; STREAM_TO_UINT32((CHAR *)pucReceivedParams,SELECT_READFD_OFFSET,*(UINT32 *)pRetParams); pRetParams = ((CHAR *)pRetParams) + 4; STREAM_TO_UINT32((CHAR *)pucReceivedParams,SELECT_WRITEFD_OFFSET,*(UINT32 *)pRetParams); pRetParams = ((CHAR *)pRetParams) + 4; STREAM_TO_UINT32((CHAR *)pucReceivedParams,SELECT_EXFD_OFFSET,*(UINT32 *)pRetParams); break; } case HCI_CMND_GETSOCKOPT: STREAM_TO_UINT8(pucReceivedData, HCI_EVENT_STATUS_OFFSET,((tBsdGetSockOptReturnParams *)pRetParams)->iStatus); //This argument returns in network order memcpy((UINT8 *)pRetParams, pucReceivedParams, 4); break; case HCI_CMND_WLAN_IOCTL_GET_SCAN_RESULTS: STREAM_TO_UINT32((CHAR *)pucReceivedParams,GET_SCAN_RESULTS_TABlE_COUNT_OFFSET,*(UINT32 *)pRetParams); pRetParams = ((CHAR *)pRetParams) + 4; STREAM_TO_UINT32((CHAR *)pucReceivedParams,GET_SCAN_RESULTS_SCANRESULT_STATUS_OFFSET,*(UINT32 *)pRetParams); pRetParams = ((CHAR *)pRetParams) + 4; STREAM_TO_UINT16((CHAR *)pucReceivedParams,GET_SCAN_RESULTS_ISVALID_TO_SSIDLEN_OFFSET,*(UINT32 *)pRetParams); pRetParams = ((CHAR *)pRetParams) + 2; STREAM_TO_UINT16((CHAR *)pucReceivedParams,GET_SCAN_RESULTS_FRAME_TIME_OFFSET,*(UINT32 *)pRetParams); pRetParams = ((CHAR *)pRetParams) + 2; memcpy((UINT8 *)pRetParams, (CHAR *)(pucReceivedParams + GET_SCAN_RESULTS_FRAME_TIME_OFFSET + 2), GET_SCAN_RESULTS_SSID_MAC_LENGTH); break; case HCI_CMND_SIMPLE_LINK_START: break; case HCI_NETAPP_IPCONFIG: //Read IP address STREAM_TO_STREAM(RecvParams,RetParams,NETAPP_IPCONFIG_IP_LENGTH); RecvParams += 4; //Read subnet STREAM_TO_STREAM(RecvParams,RetParams,NETAPP_IPCONFIG_IP_LENGTH); RecvParams += 4; //Read default GW STREAM_TO_STREAM(RecvParams,RetParams,NETAPP_IPCONFIG_IP_LENGTH); RecvParams += 4; //Read DHCP server STREAM_TO_STREAM(RecvParams,RetParams,NETAPP_IPCONFIG_IP_LENGTH); RecvParams += 4; //Read DNS server STREAM_TO_STREAM(RecvParams,RetParams,NETAPP_IPCONFIG_IP_LENGTH); RecvParams += 4; //Read Mac address STREAM_TO_STREAM(RecvParams,RetParams,NETAPP_IPCONFIG_MAC_LENGTH); RecvParams += 6; //Read SSID STREAM_TO_STREAM(RecvParams,RetParams,NETAPP_IPCONFIG_SSID_LENGTH); } } if (usReceivedEventOpcode == tSLInformation.usRxEventOpcode) { tSLInformation.usRxEventOpcode = 0; tSLInformation.solicitedResponse = 0; } } else { if (tSLInformation.usRxDataPending == 0) { ERROR("type != HCI_TYPE_EVNT is (%d) usRxDataPending=%d usRxEventOpcode=%u usReceivedEventOpcode=%u", *pucReceivedData, tSLInformation.usRxDataPending, tSLInformation.usRxEventOpcode, usReceivedEventOpcode); } else { pucReceivedParams = pucReceivedData; STREAM_TO_UINT8((CHAR *)pucReceivedData, HCI_PACKET_ARGSIZE_OFFSET, ucArgsize); STREAM_TO_UINT16((CHAR *)pucReceivedData, HCI_PACKET_LENGTH_OFFSET, usLength); // Data received: note that the only case where from and from length // are not null is in recv from, so fill the args accordingly if (from) { STREAM_TO_UINT32((CHAR *)(pucReceivedData + HCI_DATA_HEADER_SIZE), BSD_RECV_FROM_FROMLEN_OFFSET, *(UINT32 *)fromlen); memcpy(from, (pucReceivedData + HCI_DATA_HEADER_SIZE + BSD_RECV_FROM_FROM_OFFSET) ,*fromlen); } // Let's vet length long length = usLength - ucArgsize; if (length <= 0 || length > arraySize(wlan_rx_buffer)) { // Not sane length = -1; } else { memcpy(pRetParams, pucReceivedParams + HCI_DATA_HEADER_SIZE + ucArgsize, length); } // fixes the Nvram read not returning length if (fromlen) { *fromlen = length; } tSLInformation.usRxDataPending = 0; } } tSLInformation.usEventOrDataReceived = 0; SpiResumeSpi(); // Since we are going to TX - we need to handle this event after the // ResumeSPi since we need interrupts if ((*pucReceivedData == HCI_TYPE_EVNT) && (usReceivedEventOpcode == HCI_EVNT_PATCHES_REQ)) { hci_unsol_handle_patch_request((CHAR *)pucReceivedData); } if ((tSLInformation.usRxEventOpcode == 0) && (tSLInformation.usRxDataPending == 0)) { return NULL; } } } return NULL; }