/** | |
* @file sm_demo_utils.c | |
* @author NXP Semiconductors | |
* @version 1.0 | |
* @par License | |
* | |
* Copyright 2017,2018,2020 NXP | |
* SPDX-License-Identifier: Apache-2.0 | |
* | |
* @par Description | |
* Initialize LWIP / Ethernet / DHCP Connection on board | |
* Set and Get Flag in GP Storage | |
* json utility function | |
*/ | |
/******************************************************************************* | |
* includes | |
******************************************************************************/ | |
#include <stdio.h> | |
#include <stdlib.h> | |
#include <ctype.h> | |
#include <limits.h> | |
#include <string.h> | |
#include <board.h> | |
#ifdef USE_RTOS | |
#include "FreeRTOS.h" | |
#include "task.h" | |
#include "board.h" | |
#include "ksdk_mbedtls.h" | |
#include "nxLog_App.h" | |
#include "fsl_device_registers.h" | |
#include "pin_mux.h" | |
#include "clock_config.h" | |
//#include "aws_clientcredential.h" | |
#if defined(LPC_WIFI) | |
# include "iot_wifi.h" | |
# include "wifi_config.h" | |
#elif defined(LPC_ENET) | |
# include "lwip/opt.h" | |
# include "lwip/tcpip.h" | |
# include "lwip/dhcp.h" | |
# include "lwip/prot/dhcp.h" | |
# include "netif/ethernet.h" | |
# include "enet_ethernetif.h" | |
# include "lwip/netifapi.h" | |
# include "fsl_phyksz8081.h" | |
# include "fsl_enet_mdio.h" | |
#endif | |
#if defined (LPC_ENET) | |
/* ENET clock frequency. */ | |
#define EXAMPLE_CLOCK_FREQ CLOCK_GetFreq(kCLOCK_CoreSysClk) | |
#ifndef EXAMPLE_NETIF_INIT_FN | |
/*! @brief Network interface initialization function. */ | |
#define EXAMPLE_NETIF_INIT_FN ethernetif0_init | |
#endif /* EXAMPLE_NETIF_INIT_FN */ | |
/* MDIO operations. */ | |
#define EXAMPLE_MDIO_OPS enet_ops | |
/* PHY operations. */ | |
#define EXAMPLE_PHY_OPS phyksz8081_ops | |
#endif // (LPC_ENET) | |
#include "HLSEAPI.h" | |
#include "sm_demo_utils.h" | |
#include "fsl_debug_console.h" | |
/******************************************************************************* | |
* Definitions | |
******************************************************************************/ | |
#if defined(LPC_ENET) | |
/* MAC address configuration. */ | |
#define configMAC_ADDR \ | |
{ \ | |
0x04, 0x12, 0x13, 0xB1, 0x11, 0x90 \ | |
} | |
/* Address of PHY interface. */ | |
#define EXAMPLE_PHY_ADDRESS ((uint32_t)BOARD_ENET0_PHY_ADDRESS) | |
/* System clock name. */ | |
#define EXAMPLE_CLOCK_NAME kCLOCK_CoreSysClk | |
/* Facilitate a simple hash for unique MAC Address based on an input 18 byte UID */ | |
#define MAC_HASH(N) \ | |
fsl_enet_config0.macAddress[N] = buffer[(N+2)+(5*0)] ^ buffer[(N+2)+(5*1)] ^ buffer[(N+2)+(5*2)] | |
/******************************************************************************* | |
* Static variables | |
******************************************************************************/ | |
static struct netif fsl_netif0; | |
static mdio_handle_t mdioHandle = {.ops = &EXAMPLE_MDIO_OPS}; | |
static phy_handle_t phyHandle = {.phyAddr = EXAMPLE_PHY_ADDRESS, .mdioHandle = &mdioHandle, .ops = &EXAMPLE_PHY_OPS}; | |
#else // LPC_ENET | |
uint8_t Wifi_IP[4] = {0}; | |
#endif // LPC_ENET | |
/******************************************************************************* | |
* Global variables | |
******************************************************************************/ | |
#if (SSS_HAVE_A71CH || SSS_HAVE_A71CH_SIM) | |
HLSE_OBJECT_HANDLE Gpstorage_handle; | |
#endif | |
/******************************************************************************* | |
* Global Function Definitions | |
******************************************************************************/ | |
/*Init the board network */ | |
void BOARD_InitNetwork_MAC(const unsigned char buffer[18]) | |
{ | |
#if defined(LPC_WIFI) | |
const WIFINetworkParams_t pxNetworkParams = { | |
.pcSSID = clientcredentialWIFI_SSID, | |
.pcPassword = clientcredentialWIFI_PASSWORD, | |
.xSecurity = clientcredentialWIFI_SECURITY, | |
}; | |
WIFIReturnCode_t result; | |
LOG_I("Turning WIFI ON\r\n"); | |
result = WIFI_On(); | |
assert(eWiFiSuccess == result); | |
LOG_I("Connecting to network:%s status:0x%x\r\n",clientcredentialWIFI_SSID,result); | |
result = WIFI_ConnectAP(&pxNetworkParams); | |
assert(eWiFiSuccess == result); | |
LOG_I("Getting the IP address of Connected Network\r\n"); | |
result = WIFI_GetIP(Wifi_IP); | |
assert(eWiFiSuccess == result); | |
LOG_I("\r\n IPv4 Address : %u.%u.%u.%u\r\n", Wifi_IP[0],Wifi_IP[1],Wifi_IP[2],Wifi_IP[3]); | |
#elif defined(LPC_ENET) | |
#if FSL_FEATURE_SOC_ENET_COUNT > 0 || FSL_FEATURE_SOC_LPC_ENET_COUNT > 0 | |
ip4_addr_t fsl_netif0_ipaddr, fsl_netif0_netmask, fsl_netif0_gw; | |
ethernetif_config_t fsl_enet_config0 = { | |
.phyHandle = &phyHandle, | |
.macAddress = configMAC_ADDR, | |
#if defined(FSL_FEATURE_SOC_LPC_ENET_COUNT) && (FSL_FEATURE_SOC_LPC_ENET_COUNT > 0) | |
.non_dma_memory = non_dma_memory, | |
#endif /* FSL_FEATURE_SOC_LPC_ENET_COUNT */ | |
}; | |
if (buffer != NULL) | |
{ | |
MAC_HASH(1); | |
MAC_HASH(2); | |
MAC_HASH(3); | |
MAC_HASH(4); | |
MAC_HASH(5); | |
} | |
mdioHandle.resource.csrClock_Hz = EXAMPLE_CLOCK_FREQ; | |
IP4_ADDR(&fsl_netif0_ipaddr, 0U, 0U, 0U, 0U); | |
IP4_ADDR(&fsl_netif0_netmask, 0U, 0U, 0U, 0U); | |
IP4_ADDR(&fsl_netif0_gw, 0U, 0U, 0U, 0U); | |
LOG_I("Connecting to network\r\n"); | |
tcpip_init(NULL, NULL); | |
netif_add(&fsl_netif0, &fsl_netif0_ipaddr, &fsl_netif0_netmask, &fsl_netif0_gw, &fsl_enet_config0, ethernetif0_init, | |
tcpip_input); | |
netif_set_default(&fsl_netif0); | |
netif_set_up(&fsl_netif0); | |
// netifapi_netif_add(&fsl_netif0, &fsl_netif0_ipaddr, &fsl_netif0_netmask, &fsl_netif0_gw, &fsl_enet_config0, | |
// ethernetif0_init, tcpip_input); | |
// netifapi_netif_set_default(&fsl_netif0); | |
// netifapi_netif_set_up(&fsl_netif0); | |
LOG_I("Getting IP address from DHCP ...\n"); | |
dhcp_start(&fsl_netif0); | |
struct dhcp *dhcp; | |
dhcp = (struct dhcp *)netif_get_client_data(&fsl_netif0, LWIP_NETIF_CLIENT_DATA_INDEX_DHCP); | |
while (dhcp->state != DHCP_STATE_BOUND) | |
{ | |
vTaskDelay(pdMS_TO_TICKS(1000)); | |
} | |
if (dhcp->state == DHCP_STATE_BOUND) | |
{ | |
LOG_I("\r\n IPv4 Address : %u.%u.%u.%u\r\n", ((u8_t *) &fsl_netif0.ip_addr.addr)[0], | |
((u8_t *) &fsl_netif0.ip_addr.addr)[1], ((u8_t *) &fsl_netif0.ip_addr.addr)[2], | |
((u8_t *) &fsl_netif0.ip_addr.addr)[3]); | |
} | |
LOG_I("DHCP OK\r\n"); | |
#endif /* FSL_FEATURE_SOC_ENET_COUNT > 0 */ | |
#endif | |
} | |
#if (SSS_HAVE_A71CH || SSS_HAVE_A71CH_SIM) | |
/*Set and Get the flag value from GP Storage */ | |
int SetGetFlag_GPstorage(U32 *p_val, GpStorageMode_t mode, HLSE_OBJECT_HANDLE handle) | |
{ | |
int ret = 1; | |
HLSE_RET_CODE hlseRc; | |
HLSE_ATTRIBUTE attr; | |
uint8_t tempBuffer[32] = {0}; | |
memcpy((void *)tempBuffer,(void *)p_val,sizeof(*p_val)); | |
attr.type = HLSE_ATTR_OBJECT_VALUE; | |
attr.value = tempBuffer; | |
attr.valueLen = 32; | |
if (mode == SET) | |
{ | |
hlseRc = HLSE_SetObjectAttribute(handle, &attr); | |
} | |
else if (mode == GET) | |
{ | |
attr.value = tempBuffer; | |
hlseRc = HLSE_GetObjectAttribute(handle, &attr); | |
if (hlseRc == HLSE_SW_OK) | |
{ | |
memcpy((void *)p_val,(void *)tempBuffer,sizeof(*p_val)); | |
} | |
} | |
else | |
{ | |
hlseRc = 0; | |
} | |
if (hlseRc == HLSE_SW_OK) | |
{ | |
ret = 0; | |
} | |
return ret; | |
} | |
static int GetHandle_GPstorageType(HLSE_OBJECT_INDEX index, HLSE_OBJECT_TYPE objType) { | |
HLSE_RET_CODE hlseret; | |
HLSE_OBJECT_HANDLE Handles[5]; | |
U16 HandlesNum = sizeof(Handles) / sizeof(HLSE_OBJECT_HANDLE); | |
U16 HandlesNum_copy; | |
U8 i = 0; | |
int ret = 1; | |
hlseret = HLSE_EnumerateObjects(objType, Handles, &HandlesNum); | |
if (hlseret == HLSE_SW_OK) | |
{ | |
HandlesNum_copy = HandlesNum; | |
while(HandlesNum_copy) | |
{ | |
if (HLSE_GET_OBJECT_INDEX(Handles[i]) == index) | |
{ | |
Gpstorage_handle = Handles[i]; | |
ret = 0; | |
break; | |
} | |
i++; | |
HandlesNum_copy--; | |
} | |
} | |
return ret; | |
} | |
/*Get the Handle of the GP storage */ | |
int GetHandle_GPstorage(HLSE_OBJECT_INDEX index) | |
{ | |
/* New way. 3rd entry in table would be HLSE_DATA */ | |
int ret = GetHandle_GPstorageType(index, HLSE_DATA); | |
if ( ret == 1 ) | |
{ | |
/* iMX UL Way. No entry. So insert 3rd entry in table. */ | |
HLSE_OBJECT_TYPE objType = HLSE_DATA; | |
U16 templateSize = 3; | |
HLSE_ATTRIBUTE attr[3]; | |
U8 objData[] = {0xFF,0xFF,0xFF,0xFF}; | |
attr[0].type = HLSE_ATTR_OBJECT_TYPE; | |
attr[0].value = &objType; | |
attr[0].valueLen = sizeof(objType); | |
attr[1].type = HLSE_ATTR_OBJECT_INDEX; | |
attr[1].value = &index; | |
attr[1].valueLen = sizeof(index); | |
attr[2].type = HLSE_ATTR_OBJECT_VALUE; | |
attr[2].value = &objData; | |
attr[2].valueLen = 4; | |
ret = HLSE_CreateObject(attr, templateSize, &Gpstorage_handle); | |
} | |
return ret; | |
} | |
#endif | |
/*JSON utility function to check equality */ | |
int8_t jsoneq(const char *json, jsmntok_t *tok, const char *s) { | |
if(tok->type == JSMN_STRING) { | |
if((int) strlen(s) == tok->end - tok->start) { | |
if(strncmp(json + tok->start, s, (size_t) (tok->end - tok->start)) == 0) { | |
return 0; | |
} | |
} | |
} | |
return -1; | |
} | |
#endif /* USE_RTOS */ |