/*********************************************************************************
  *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();
    }
}
Beispiel #2
0
/*
 * @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
	}
}
Beispiel #3
0
/*********************************************************************************
  *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
	}

}
Beispiel #4
0
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;
}