diff --git a/APP_Framework/Applications/Makefile b/APP_Framework/Applications/Makefile index 0f0d2a744..334845b8a 100644 --- a/APP_Framework/Applications/Makefile +++ b/APP_Framework/Applications/Makefile @@ -36,5 +36,9 @@ ifeq ($(CONFIG_ADD_XIZI_FEATURES),y) SRC_DIR += control_app endif + ifeq ($(CONFIG_APP_USING_WEBNET),y) + SRC_DIR += webnet + endif + include $(KERNEL_ROOT)/compiler.mk endif \ No newline at end of file diff --git a/APP_Framework/Applications/benchmark/Makefile b/APP_Framework/Applications/benchmark/Makefile new file mode 100644 index 000000000..d9d5e47dc --- /dev/null +++ b/APP_Framework/Applications/benchmark/Makefile @@ -0,0 +1,16 @@ + +# include $(APPDIR)/Application.mk +# ifeq ($(CONFIG_ADD_NUTTX_FETURES),y) + # include $(APPDIR)/Make.defs + # CSRCS += $(wildcard src/*/*.c) $(wildcard support/*.c) + # include $(APPDIR)/Application.mk +# endif + +# ifeq ($(CONFIG_ADD_XIZI_FEATURES),y) + SRC_DIR := + ifeq ($(CONFIG_APP_BENCHMARK), y) + SRC_DIR += src + SRC_DIR += support + endif + include $(KERNEL_ROOT)/compiler.mk +# endif diff --git a/APP_Framework/Applications/webnet/Makefile b/APP_Framework/Applications/webnet/Makefile new file mode 100644 index 000000000..8eca9e823 --- /dev/null +++ b/APP_Framework/Applications/webnet/Makefile @@ -0,0 +1,3 @@ +SRC_DIR += WebNet_XiUOS + +include $(KERNEL_ROOT)/compiler.mk \ No newline at end of file diff --git a/APP_Framework/Framework/transform_layer/xizi/user_api/posix_support/include/mqueue.h b/APP_Framework/Framework/transform_layer/xizi/user_api/posix_support/include/mqueue.h index ae13f6667..6ac021b36 100644 --- a/APP_Framework/Framework/transform_layer/xizi/user_api/posix_support/include/mqueue.h +++ b/APP_Framework/Framework/transform_layer/xizi/user_api/posix_support/include/mqueue.h @@ -40,7 +40,8 @@ struct mq_attr { long mq_curmsgs; /* number of messages currently queued */ }; -mqd_t mq_open(const char *name, int oflag, ...); +// mqd_t mq_open(const char *name, int oflag, ...); +mqd_t mq_open(const char *name, int oflag, mode_t mode, struct mq_attr *attr); int mq_close(mqd_t mqdes); ssize_t mq_receive(mqd_t mqdes, char *msg_ptr, size_t msg_len, unsigned *msg_prio); int mq_send(mqd_t mqdes, const char *msg_ptr, size_t msg_len, unsigned msg_prio); diff --git a/APP_Framework/Framework/transform_layer/xizi/user_api/posix_support/mqueue.c b/APP_Framework/Framework/transform_layer/xizi/user_api/posix_support/mqueue.c index e0f5e9507..a92dc95f6 100644 --- a/APP_Framework/Framework/transform_layer/xizi/user_api/posix_support/mqueue.c +++ b/APP_Framework/Framework/transform_layer/xizi/user_api/posix_support/mqueue.c @@ -21,12 +21,13 @@ #include "include/mqueue.h" -mqd_t mq_open(const char *name, int oflag, ...) +mqd_t mq_open(const char* name, int oflag, mode_t mode, struct mq_attr* attr) { mqd_t mq; - mq = UserMsgQueueCreate( DEFAULT_MQUEUE_SIZE, DEFAULT_MAX_MSG_SIZE); + // Todo: config mq by mode + mq = UserMsgQueueCreate(attr->mq_msgsize, attr->mq_maxmsg); if (mq < 0) { return -1; } @@ -39,12 +40,12 @@ int mq_close(mqd_t mqdes) return UserMsgQueueDelete(mqdes); } -ssize_t mq_receive(mqd_t mqdes, char *msg_ptr, size_t msg_len, unsigned *msg_prio) +ssize_t mq_receive(mqd_t mqdes, char* msg_ptr, size_t msg_len, unsigned* msg_prio) { ssize_t ret; *msg_prio = 0; - ret = UserMsgQueueRecv(mqdes, msg_ptr, (unsigned long)&msg_len, 0); + ret = UserMsgQueueRecv(mqdes, (void*)msg_ptr, msg_len, 100000); return ret; } diff --git a/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/xidatong-riscv64/applications/benchmark/Makefile b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/xidatong-riscv64/applications/benchmark/Makefile new file mode 100644 index 000000000..0c8c2bfcf --- /dev/null +++ b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/xidatong-riscv64/applications/benchmark/Makefile @@ -0,0 +1,16 @@ + +# include $(APPDIR)/Application.mk +ifeq ($(CONFIG_ADD_NUTTX_FETURES),y) + include $(APPDIR)/Make.defs + CSRCS += $(wildcard src/*/*.c) $(wildcard support/*.c) + include $(APPDIR)/Application.mk +endif + +ifeq ($(CONFIG_ADD_XIZI_FEATURES),y) + SRC_DIR := + ifeq ($(CONFIG_APP_BENCHMARK), y) + SRC_DIR += src + SRC_DIR += support + endif + include $(KERNEL_ROOT)/compiler.mk +endif diff --git a/Ubiquitous/XiZi_IIoT/board/edu-arm32/third_party_driver/ethernet/Makefile b/Ubiquitous/XiZi_IIoT/board/edu-arm32/third_party_driver/ethernet/Makefile index b63aff8c2..385b69d4f 100755 --- a/Ubiquitous/XiZi_IIoT/board/edu-arm32/third_party_driver/ethernet/Makefile +++ b/Ubiquitous/XiZi_IIoT/board/edu-arm32/third_party_driver/ethernet/Makefile @@ -1,3 +1,3 @@ -SRC_FILES := ethernetif.c eth_driver.c +SRC_FILES := ethernetif.c eth_driver.c eth_netdev.c include $(KERNEL_ROOT)/compiler.mk diff --git a/Ubiquitous/XiZi_IIoT/board/edu-arm32/third_party_driver/ethernet/eth_driver.c b/Ubiquitous/XiZi_IIoT/board/edu-arm32/third_party_driver/ethernet/eth_driver.c index 69a76fa0a..800c08697 100644 --- a/Ubiquitous/XiZi_IIoT/board/edu-arm32/third_party_driver/ethernet/eth_driver.c +++ b/Ubiquitous/XiZi_IIoT/board/edu-arm32/third_party_driver/ethernet/eth_driver.c @@ -1,21 +1,22 @@ /** -* @file ethernetif.c -* @brief support edu-arm32-board ethernetif function and register to Lwip -* @version 3.0 -* @author AIIT XUOS Lab -* @date 2022-12-05 -*/ + * @file ethernetif.c + * @brief support hc32f4a0-board ethernetif function and register to Lwip + * @version 3.0 + * @author AIIT XUOS Lab + * @date 2022-12-05 + */ #include +#include #include #include -#include #include #include #include -void eth_irq_handler(void) { +void eth_irq_handler(void) +{ static x_base eth_irq_lock; eth_irq_lock = DISABLE_INTERRUPT(); @@ -24,7 +25,7 @@ void eth_irq_handler(void) { sys_sem_signal(get_eth_recv_sem()); ETH_DMA_ClearStatus(ETH_DMA_FLAG_RIS | ETH_DMA_FLAG_NIS); } - + ENABLE_INTERRUPT(eth_irq_lock); } @@ -35,7 +36,7 @@ void eth_irq_handler(void) { * - LL_OK: Initialize success * - LL_ERR: Initialize failed */ -int32_t low_level_init(struct netif *netif) +int32_t low_level_init(struct netif* netif) { int32_t i32Ret = LL_ERR; stc_eth_init_t stcEthInit; @@ -52,9 +53,9 @@ int32_t low_level_init(struct netif *netif) (void)ETH_StructInit(&stcEthInit); #ifdef ETH_INTERFACE_RMII - EthHandle.stcCommInit.u32Interface = ETH_MAC_IF_RMII; + EthHandle.stcCommInit.u32Interface = ETH_MAC_IF_RMII; #else - EthHandle.stcCommInit.u32Interface = ETH_MAC_IF_MII; + EthHandle.stcCommInit.u32Interface = ETH_MAC_IF_MII; #endif // stcEthInit.stcMacInit.u32ReceiveAll = ETH_MAC_RX_ALL_ENABLE; EthHandle.stcCommInit.u32ReceiveMode = ETH_RX_MD_INT; @@ -125,7 +126,7 @@ int32_t low_level_init(struct netif *netif) u16RegVal = PHY_PAGE_ADDR_0; (void)ETH_PHY_WriteReg(&EthHandle, PHY_PSR, u16RegVal); #endif - + return i32Ret; } @@ -137,19 +138,19 @@ int32_t low_level_init(struct netif *netif) * - LL_OK: The packet could be sent * - LL_ERR: The packet couldn't be sent */ -err_t low_level_output(struct netif *netif, struct pbuf *p) +err_t low_level_output(struct netif* netif, struct pbuf* p) { err_t i32Ret; - struct pbuf *q; - uint8_t *txBuffer; - __IO stc_eth_dma_desc_t *DmaTxDesc; + struct pbuf* q; + uint8_t* txBuffer; + __IO stc_eth_dma_desc_t* DmaTxDesc; uint32_t byteCnt; uint32_t frameLength = 0UL; uint32_t bufferOffset; uint32_t payloadOffset; DmaTxDesc = EthHandle.stcTxDesc; - txBuffer = (uint8_t *)((EthHandle.stcTxDesc)->u32Buf1Addr); + txBuffer = (uint8_t*)((EthHandle.stcTxDesc)->u32Buf1Addr); bufferOffset = 0UL; /* Copy frame from pbufs to driver buffers */ for (q = p; q != NULL; q = q->next) { @@ -165,28 +166,28 @@ err_t low_level_output(struct netif *netif, struct pbuf *p) /* Check if the length of data to copy is bigger than Tx buffer size */ while ((byteCnt + bufferOffset) > ETH_TX_BUF_SIZE) { /* Copy data to Tx buffer*/ - (void)memcpy((uint8_t *) & (txBuffer[bufferOffset]), (uint8_t *) & (((uint8_t *)q->payload)[payloadOffset]), (ETH_TX_BUF_SIZE - bufferOffset)); + (void)memcpy((uint8_t*)&(txBuffer[bufferOffset]), (uint8_t*)&(((uint8_t*)q->payload)[payloadOffset]), (ETH_TX_BUF_SIZE - bufferOffset)); /* Point to next descriptor */ - DmaTxDesc = (stc_eth_dma_desc_t *)(DmaTxDesc->u32Buf2NextDescAddr); + DmaTxDesc = (stc_eth_dma_desc_t*)(DmaTxDesc->u32Buf2NextDescAddr); /* Check if the buffer is available */ if (0UL != (DmaTxDesc->u32ControlStatus & ETH_DMA_TXDESC_OWN)) { i32Ret = (err_t)ERR_USE; goto error; } - txBuffer = (uint8_t *)(DmaTxDesc->u32Buf1Addr); + txBuffer = (uint8_t*)(DmaTxDesc->u32Buf1Addr); byteCnt = byteCnt - (ETH_TX_BUF_SIZE - bufferOffset); payloadOffset = payloadOffset + (ETH_TX_BUF_SIZE - bufferOffset); frameLength = frameLength + (ETH_TX_BUF_SIZE - bufferOffset); bufferOffset = 0UL; } /* Copy the remaining bytes */ - (void)memcpy((uint8_t *) & (txBuffer[bufferOffset]), (uint8_t *) & (((uint8_t *)q->payload)[payloadOffset]), byteCnt); + (void)memcpy((uint8_t*)&(txBuffer[bufferOffset]), (uint8_t*)&(((uint8_t*)q->payload)[payloadOffset]), byteCnt); bufferOffset = bufferOffset + byteCnt; frameLength = frameLength + byteCnt; } /* Prepare transmit descriptors to give to DMA */ - if(LL_OK != ETH_DMA_SetTransFrame(&EthHandle, frameLength)) { + if (LL_OK != ETH_DMA_SetTransFrame(&EthHandle, frameLength)) { KPrintf("[%s] Error sending eth DMA frame\n", __func__); } i32Ret = (err_t)ERR_OK; @@ -208,13 +209,13 @@ error: * @param netif The network interface structure for this ethernetif. * @retval A pbuf filled with the received packet (including MAC header) or NULL on memory error. */ -struct pbuf *low_level_input(struct netif *netif) +struct pbuf* low_level_input(struct netif* netif) { - struct pbuf *p = NULL; - struct pbuf *q; + struct pbuf* p = NULL; + struct pbuf* q; uint32_t len; - uint8_t *rxBuffer; - __IO stc_eth_dma_desc_t *DmaRxDesc; + uint8_t* rxBuffer; + __IO stc_eth_dma_desc_t* DmaRxDesc; uint32_t byteCnt; uint32_t bufferOffset; uint32_t payloadOffset; @@ -227,7 +228,7 @@ struct pbuf *low_level_input(struct netif *netif) /* Obtain the size of the packet */ len = (EthHandle.stcRxFrame).u32Len; - rxBuffer = (uint8_t *)(EthHandle.stcRxFrame).u32Buf; + rxBuffer = (uint8_t*)(EthHandle.stcRxFrame).u32Buf; if (len > 0UL) { /* Allocate a pbuf chain of pbufs from the buffer */ p = pbuf_alloc(PBUF_RAW, len, PBUF_POOL); @@ -243,17 +244,17 @@ struct pbuf *low_level_input(struct netif *netif) /* Check if the length of bytes to copy in current pbuf is bigger than Rx buffer size */ while ((byteCnt + bufferOffset) > ETH_RX_BUF_SIZE) { /* Copy data to pbuf */ - (void)memcpy((uint8_t *) & (((uint8_t *)q->payload)[payloadOffset]), (uint8_t *) & (rxBuffer[bufferOffset]), (ETH_RX_BUF_SIZE - bufferOffset)); + (void)memcpy((uint8_t*)&(((uint8_t*)q->payload)[payloadOffset]), (uint8_t*)&(rxBuffer[bufferOffset]), (ETH_RX_BUF_SIZE - bufferOffset)); /* Point to next descriptor */ - DmaRxDesc = (stc_eth_dma_desc_t *)(DmaRxDesc->u32Buf2NextDescAddr); - rxBuffer = (uint8_t *)(DmaRxDesc->u32Buf1Addr); + DmaRxDesc = (stc_eth_dma_desc_t*)(DmaRxDesc->u32Buf2NextDescAddr); + rxBuffer = (uint8_t*)(DmaRxDesc->u32Buf1Addr); byteCnt = byteCnt - (ETH_RX_BUF_SIZE - bufferOffset); payloadOffset = payloadOffset + (ETH_RX_BUF_SIZE - bufferOffset); bufferOffset = 0UL; } /* Copy remaining data in pbuf */ - (void)memcpy((uint8_t *) & (((uint8_t *)q->payload)[payloadOffset]), (uint8_t *) & (rxBuffer[bufferOffset]), byteCnt); + (void)memcpy((uint8_t*)&(((uint8_t*)q->payload)[payloadOffset]), (uint8_t*)&(rxBuffer[bufferOffset]), byteCnt); bufferOffset = bufferOffset + byteCnt; } } @@ -261,7 +262,7 @@ struct pbuf *low_level_input(struct netif *netif) DmaRxDesc = (EthHandle.stcRxFrame).pstcFSDesc; for (i = 0UL; i < (EthHandle.stcRxFrame).u32SegCount; i++) { DmaRxDesc->u32ControlStatus |= ETH_DMA_RXDESC_OWN; - DmaRxDesc = (stc_eth_dma_desc_t *)(DmaRxDesc->u32Buf2NextDescAddr); + DmaRxDesc = (stc_eth_dma_desc_t*)(DmaRxDesc->u32Buf2NextDescAddr); } /* Clear Segment_Count */ (EthHandle.stcRxFrame).u32SegCount = 0UL; @@ -277,11 +278,10 @@ struct pbuf *low_level_input(struct netif *netif) return p; } -extern void LwipSetIPTest(int argc, char *argv[]); -int HwEthInit(void) { -// lwip_config_tcp(0, lwip_ipaddr, lwip_netmask, lwip_gwaddr); - LwipSetIPTest(1, NULL); - return EOK; +extern void LwipSetIPTest(int argc, char* argv[]); +int HwEthInit(void) +{ + // lwip_config_tcp(0, lwip_ipaddr, lwip_netmask, lwip_gwaddr); + LwipSetIPTest(1, NULL); + return EOK; } - - diff --git a/Ubiquitous/XiZi_IIoT/board/edu-arm32/third_party_driver/ethernet/eth_netdev.c b/Ubiquitous/XiZi_IIoT/board/edu-arm32/third_party_driver/ethernet/eth_netdev.c new file mode 100644 index 000000000..145ebc620 --- /dev/null +++ b/Ubiquitous/XiZi_IIoT/board/edu-arm32/third_party_driver/ethernet/eth_netdev.c @@ -0,0 +1,162 @@ + +#include +#include +#include +#include +#include +#include + +static const uint32_t NETIF_NAME_LEN = 2; + +static int lwip_netdev_set_up(struct netdev* netdev) +{ + netif_set_up((struct netif*)netdev->user_data); + return ERR_OK; +} + +static int lwip_netdev_set_down(struct netdev* netif) +{ + netif_set_down((struct netif*)netif->user_data); + return ERR_OK; +} + +#ifndef ip_2_ip4 +#define ip_2_ip4(ipaddr) (ipaddr) +#endif +static int lwip_netdev_set_addr_info(struct netdev* netdev, ip_addr_t* ip_addr, ip_addr_t* netmask, ip_addr_t* gw) +{ + if (ip_addr && netmask && gw) { + netif_set_addr((struct netif*)netdev->user_data, ip_2_ip4(ip_addr), ip_2_ip4(netmask), ip_2_ip4(gw)); + } else { + if (ip_addr) { + netif_set_ipaddr((struct netif*)netdev->user_data, ip_2_ip4(ip_addr)); + } + if (netmask) { + netif_set_netmask((struct netif*)netdev->user_data, ip_2_ip4(netmask)); + } + if (gw) { + netif_set_gw((struct netif*)netdev->user_data, ip_2_ip4(gw)); + } + } +} + +#ifdef LWIP_DNS +static int lwip_netdev_set_dns_server(struct netdev* netdev, uint8_t dns_num, ip_addr_t* dns_server) +{ +#if LWIP_VERSION_MAJOR == 1U /* v1.x */ + extern void dns_setserver(u8_t numdns, ip_addr_t * dnsserver); +#else /* >=2.x */ + extern void dns_setserver(uint8_t dns_num, const ip_addr_t* dns_server); +#endif /* LWIP_VERSION_MAJOR == 1U */ + + dns_setserver(dns_num, dns_server); + return ERR_OK; +} +#endif + +#ifdef LWIP_DHCP +static int lwip_netdev_set_dhcp(struct netdev* netdev, bool is_enabled) +{ + netdev_low_level_set_dhcp_status(netdev, is_enabled); + + if (true == is_enabled) { + dhcp_start((struct netif*)netdev->user_data); + } else { + dhcp_stop((struct netif*)netdev->user_data); + } + + return ERR_OK; +} +#endif + +static int lwip_netdev_set_default(struct netdev* netdev) +{ + netif_set_default((struct netif*)netdev->user_data); + return ERR_OK; +} + +static const struct netdev_ops lwip_netdev_ops = { + .set_up = lwip_netdev_set_up, + .set_down = lwip_netdev_set_down, + .set_addr_info = lwip_netdev_set_addr_info, +#ifdef LWIP_DNS + .set_dns_server = lwip_netdev_set_dns_server, +#endif +#ifdef LWIP_DHCP + .set_dhcp = lwip_netdev_set_dhcp, +#endif + .set_default = lwip_netdev_set_default, +}; + +static inline int netdev_set_flags(struct netif* lwip_netif) +{ + CHECK(lwip_netif); + struct netdev* netdev = netdev_get_by_name(lwip_netif->name); + if (netdev == NULL) { + return -ERR_IF; + } + + netdev->mtu = lwip_netif->mtu; + // set flags + if (lwip_netif->flags | NETIF_FLAG_BROADCAST) { + netdev->flags |= NETDEV_FLAG_BROADCAST; + } + if (lwip_netif->flags | NETIF_FLAG_ETHARP) { + netdev->flags |= NETDEV_FLAG_ETHARP; + } + if (lwip_netif->flags | NETIF_FLAG_IGMP) { + netdev->flags |= NETDEV_FLAG_IGMP; + } +#if LWIP_VERSION_MAJOR >= 2U /* >= v2.x */ + if (lwip_netif->flags & NETIF_FLAG_MLD6) { + netdev->flags |= NETDEV_FLAG_MLD6; + } +#endif /* LWIP_VERSION_MAJOR >= 2U */ + +#if LWIP_DHCP + netdev_low_level_set_dhcp_status(netdev, true); +#else + netdev_low_level_set_dhcp_status(netdev, false); +#endif + + return ERR_OK; +} + +int lwip_netdev_add(struct netif* lwip_netif) +{ + CHECK(lwip_netif); + + struct netdev* netdev = calloc(1, sizeof(struct netdev)); + if (netdev == NULL) { + return -ERR_IF; + } + + // init netdev + char netif_name[NETIF_NAME_LEN + 1]; + strncpy(netif_name, lwip_netif->name, NETIF_NAME_LEN); + // register netdev + int result = netdev_register(netdev, netif_name, (void*)lwip_netif); + // set values of netdev + netdev_set_flags(lwip_netif); + netdev->ops = &lwip_netdev_ops; + netdev->hwaddr_len = lwip_netif->hwaddr_len; + memcpy(netdev->hwaddr, lwip_netif->hwaddr, lwip_netif->hwaddr_len); + netdev->ip_addr = lwip_netif->ip_addr; + netdev->gw = lwip_netif->gw; + netdev->netmask = lwip_netif->netmask; + + return result; +} + +void lwip_netdev_del(struct netif* lwip_netif) +{ + char name[NETIF_NAME_LEN + 1]; + struct netdev* netdev; + + CHECK(lwip_netif); + + strncpy(name, lwip_netif->name, NETIF_NAME_LEN); + netdev = netdev_get_by_name(name); + netdev_unregister(netdev); + free(netdev); +} \ No newline at end of file diff --git a/Ubiquitous/XiZi_IIoT/board/edu-arm32/third_party_driver/ethernet/ethernetif.c b/Ubiquitous/XiZi_IIoT/board/edu-arm32/third_party_driver/ethernet/ethernetif.c index 1e50cdfab..7a50d2315 100644 --- a/Ubiquitous/XiZi_IIoT/board/edu-arm32/third_party_driver/ethernet/ethernetif.c +++ b/Ubiquitous/XiZi_IIoT/board/edu-arm32/third_party_driver/ethernet/ethernetif.c @@ -19,21 +19,21 @@ */ /** -* @file ethernetif.c -* @brief support edu-arm32-board ethernetif function and register to Lwip -* @version 3.0 -* @author AIIT XUOS Lab -* @date 2022-12-05 -*/ + * @file ethernetif.c + * @brief support hc32f4a0-board ethernetif function and register to Lwip + * @version 3.0 + * @author AIIT XUOS Lab + * @date 2022-12-05 + */ /************************************************* File name: ethernetif.c Description: support edu-arm32-board ethernetif configure and register to Lwip Others: take projects\ev_hc32f4a0_lqfp176\examples\eth\eth_loopback\source\ethernetif.c for references -History: +History: 1. Date: 2022-12-05 Author: AIIT XUOS Lab -Modification: +Modification: 1、include harware_ethernetif.h、hc32_ll_eth.h、hc32_ll_gpio.h、hc32_ll_utility.h、hc32_ll_fcg.h and lwip H files; 2、modify ethernetif_init as err_t; 3、add ETH_RST_PORT and ETH_RST_PIN; @@ -47,13 +47,15 @@ Modification: * Include files ******************************************************************************/ #include +#include #include #include -#include #include #include +#include #include +#include /** * @addtogroup HC32F4A0_DDL_Examples @@ -73,7 +75,6 @@ Modification: * Local pre-processor symbols/macros ('#define') ******************************************************************************/ - /******************************************************************************* * Global variable definitions (declared in header file with 'extern') ******************************************************************************/ @@ -86,7 +87,6 @@ Modification: * Local variable definitions ('static') ******************************************************************************/ - /******************************************************************************* * Function implementation - global ('extern') and local ('static') ******************************************************************************/ @@ -180,12 +180,14 @@ void Ethernet_GpioInit(void) #endif } -void *ethernetif_config_enet_set(uint8_t enet_port) { +void* ethernetif_config_enet_set(uint8_t enet_port) +{ return NONE; } -void Time_Update_LwIP(void) { - //no need to do +void Time_Update_LwIP(void) +{ + // no need to do } /** @@ -195,7 +197,7 @@ void Time_Update_LwIP(void) { * - LL_OK: The IF is initialized * - LL_ERR: The IF is uninitialized */ -err_t ethernetif_init(struct netif *netif) +err_t ethernetif_init(struct netif* netif) { #if LWIP_NETIF_HOSTNAME /* Initialize interface hostname */ @@ -206,15 +208,24 @@ err_t ethernetif_init(struct netif *netif) #ifndef ETHERNET_LOOPBACK_TEST /* We directly use etharp_output() here to save a function call. - * You can instead declare your own function an call etharp_output() - * from it if you have to do some checks before sending (e.g. if link - * is available...) */ + * You can instead declare your own function an call etharp_output() + * from it if you have to do some checks before sending (e.g. if link + * is available...) */ netif->output = etharp_output; netif->linkoutput = low_level_output; #endif /* initialize the hardware */ - return low_level_init(netif); + if (LL_OK != low_level_init(netif)) { + return LL_ERR; + } + + if (EOK != lwip_netdev_add(netif)) { + SYS_KDEBUG_LOG(NETDEV_DEBUG, ("[%s] LWIP add netdev failed.\n", __func__)); + } else { + printf("[%s] Add Netdev successful\n", __func__); + } + return LL_OK; } /** @@ -222,16 +233,16 @@ err_t ethernetif_init(struct netif *netif) * @param netif The network interface structure for this ethernetif. * @retval None */ -void ethernetif_input(void *netif_arg) +void ethernetif_input(void* netif_arg) { - struct pbuf *p; - struct netif *netif = (struct netif *)netif_arg; + struct pbuf* p; + struct netif* netif = (struct netif*)netif_arg; x_base critical_lock; /* Move received packet into a new pbuf */ while (1) { sys_arch_sem_wait(get_eth_recv_sem(), WAITING_FOREVER); - while(1) { + while (1) { p = low_level_input(netif); #ifndef ETHERNET_LOOPBACK_TEST /* Entry point to the LwIP stack */ @@ -261,7 +272,7 @@ void ethernetif_input(void *netif_arg) * @param netif the network interface * @retval None */ -void EthernetIF_CheckLink(struct netif *netif) +void EthernetIF_CheckLink(struct netif* netif) { uint16_t u16RegVal = 0U; static uint8_t u8PreStatus = 0U; @@ -296,7 +307,7 @@ void EthernetIF_CheckLink(struct netif *netif) * @param netif The network interface. * @retval None */ -void EthernetIF_UpdateLink(struct netif *netif) +void EthernetIF_UpdateLink(struct netif* netif) { uint16_t u16RegVal; @@ -337,7 +348,7 @@ void EthernetIF_UpdateLink(struct netif *netif) * @param netif The network interface * @retval None */ -void EthernetIF_PeriodicHandle(struct netif *netif) +void EthernetIF_PeriodicHandle(struct netif* netif) { #ifndef ETH_INTERFACE_RMII uint32_t curTick; @@ -358,7 +369,7 @@ void EthernetIF_PeriodicHandle(struct netif *netif) * @param netif The network interface * @retval None */ -void EthernetIF_LinkCallback(struct netif *netif) +void EthernetIF_LinkCallback(struct netif* netif) { __IO uint32_t tickStart = 0UL; uint16_t u16RegVal = 0U; @@ -405,8 +416,7 @@ void EthernetIF_LinkCallback(struct netif *netif) CLR_REG16_BIT(u16RegVal, PHY_FULLDUPLEX_100M); /* Set MAC Speed and Duplex Mode to PHY */ (void)ETH_PHY_WriteReg(&EthHandle, PHY_BCR, - ((uint16_t)((EthHandle.stcCommInit).u32DuplexMode >> 3U) | - (uint16_t)((EthHandle.stcCommInit).u32Speed >> 1U) | u16RegVal)); + ((uint16_t)((EthHandle.stcCommInit).u32DuplexMode >> 3U) | (uint16_t)((EthHandle.stcCommInit).u32Speed >> 1U) | u16RegVal)); } /* ETH MAC Re-Configuration */ ETH_MAC_SetDuplexSpeed((EthHandle.stcCommInit).u32DuplexMode, (EthHandle.stcCommInit).u32Speed); @@ -427,7 +437,7 @@ void EthernetIF_LinkCallback(struct netif *netif) * - LL_OK: The IF is link up * - LL_ERR: The IF is link down */ -int32_t EthernetIF_IsLinkUp(struct netif *netif) +int32_t EthernetIF_IsLinkUp(struct netif* netif) { return (0U != u8PhyLinkStatus) ? LL_OK : LL_ERR; } @@ -437,14 +447,14 @@ int32_t EthernetIF_IsLinkUp(struct netif *netif) * @param netif The network interface * @retval None */ -__WEAKDEF void EthernetIF_NotifyLinkChange(struct netif *netif) +__WEAKDEF void EthernetIF_NotifyLinkChange(struct netif* netif) { /* This is function could be implemented in user file when the callback is needed */ if (LL_OK == EthernetIF_IsLinkUp(netif)) { GPIO_SetPins(ETH_LINK_LED_PORT, ETH_LINK_LED_PIN); } else { GPIO_ResetPins(ETH_LINK_LED_PORT, ETH_LINK_LED_PIN); - } + } } /** @@ -453,7 +463,8 @@ __WEAKDEF void EthernetIF_NotifyLinkChange(struct netif *netif) * @param p The MAC packet to receive * @retval None */ -__WEAKDEF void EthernetIF_InputCallback(struct netif *netif, struct pbuf *p) { +__WEAKDEF void EthernetIF_InputCallback(struct netif* netif, struct pbuf* p) +{ /* This is function could be implemented in user file when the callback is needed */ #ifdef ETHERNET_LOOPBACK_TEST if ((0 == (memcmp(p->payload, txPbuf.payload, p->len))) && (p->len == txPbuf.len)) { @@ -479,7 +490,7 @@ __WEAKDEF void EthernetIF_InputCallback(struct netif *netif, struct pbuf *p) { #ifdef ETHERNET_LOOPBACK_TEST -static void EthLoopBackTask(void *parameter) +static void EthLoopBackTask(void* parameter) { while (1) { if (RESET == GPIO_ReadInputPins(USER_KEY_PORT, USER_KEY_PIN)) { @@ -489,7 +500,7 @@ static void EthLoopBackTask(void *parameter) } } - //KPrintf("ready to receive eth loop back data\n"); + // KPrintf("ready to receive eth loop back data\n"); /* Read a received packet */ ethernetif_input(&testnetif); /* Handle periodic timers */ @@ -514,24 +525,24 @@ static void EthLoopBackTest(void) (void)ethernetif_init(&testnetif); /* fill data to txPbuf */ - txPbuf.next = NULL; + txPbuf.next = NULL; txPbuf.payload = txBuf; - txPbuf.len = strlen(txBuf); + txPbuf.len = strlen(txBuf); int eth_loopback_task = 0; eth_loopback_task = KTaskCreate("eth_loopback", EthLoopBackTask, NONE, - 2048, 8); - if(eth_loopback_task < 0) { - KPrintf("eth_loopback_task create failed ...%s %d.\n", __FUNCTION__,__LINE__); - return; - } + 2048, 8); + if (eth_loopback_task < 0) { + KPrintf("eth_loopback_task create failed ...%s %d.\n", __FUNCTION__, __LINE__); + return; + } StartupKTask(eth_loopback_task); return; } -SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0)|SHELL_CMD_TYPE(SHELL_TYPE_CMD_MAIN), -EthLoopBackTest, EthLoopBackTest, EthLoopBackTest); +SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0) | SHELL_CMD_TYPE(SHELL_TYPE_CMD_MAIN), + EthLoopBackTest, EthLoopBackTest, EthLoopBackTest); #endif diff --git a/Ubiquitous/XiZi_IIoT/board/edu-arm32/third_party_driver/include/connect_ethernet.h b/Ubiquitous/XiZi_IIoT/board/edu-arm32/third_party_driver/include/connect_ethernet.h index 7fae45a9f..4f0529a0b 100644 --- a/Ubiquitous/XiZi_IIoT/board/edu-arm32/third_party_driver/include/connect_ethernet.h +++ b/Ubiquitous/XiZi_IIoT/board/edu-arm32/third_party_driver/include/connect_ethernet.h @@ -1,40 +1,39 @@ /* -* Copyright (c) 2021 AIIT XUOS Lab -* XiUOS is licensed under Mulan PSL v2. -* You can use this software according to the terms and conditions of the Mulan PSL v2. -* You may obtain a copy of Mulan PSL v2 at: -* http://license.coscl.org.cn/MulanPSL2 -* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, -* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, -* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. -* See the Mulan PSL v2 for more details. -*/ + * Copyright (c) 2021 AIIT XUOS Lab + * XiUOS is licensed under Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * http://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PSL v2 for more details. + */ /** -* @file connect_ethernet.h -* @brief Adapted network software protocol stack and hardware operation functions -* @version 2.0 -* @author AIIT XUOS Lab -* @date 2022-12-05 -*/ + * @file connect_ethernet.h + * @brief Adapted network software protocol stack and hardware operation functions + * @version 2.0 + * @author AIIT XUOS Lab + * @date 2022-12-05 + */ #ifndef CONNECT_ETHERNET_H #define CONNECT_ETHERNET_H #include "hardware_ethernetif.h" -#include -#include #include +#include +#include #ifdef __cplusplus - extern "C" { +extern "C" { #endif -struct hc32_irq_config -{ - IRQn_Type irq_num; - uint32_t irq_prio; - en_int_src_t int_src; +struct hc32_irq_config { + IRQn_Type irq_num; + uint32_t irq_prio; + en_int_src_t int_src; }; /* Global Ethernet handle*/ @@ -52,22 +51,23 @@ __ALIGN_BEGIN static uint8_t EthRxBuff[ETH_RX_BUF_NUM][ETH_RX_BUF_SIZE]; static uint8_t u8PhyLinkStatus = 0U, u8EthInitStatus = 0U; static struct Hc32IrqConfig eth_irq_config = { - .irq_num = BSP_ETH_IRQ_NUM, - .irq_prio = BSP_ETH_IRQ_PRIO, - .int_src = INT_SRC_ETH_GLB_INT, + .irq_num = BSP_ETH_IRQ_NUM, + .irq_prio = BSP_ETH_IRQ_PRIO, + .int_src = INT_SRC_ETH_GLB_INT, }; void Ethernet_GpioInit(void); -int32_t low_level_init(struct netif *netif); -err_t low_level_output(struct netif *netif, struct pbuf *p); -struct pbuf *low_level_input(struct netif *netif); +int32_t low_level_init(struct netif* netif); +err_t low_level_output(struct netif* netif, struct pbuf* p); +struct pbuf* low_level_input(struct netif* netif); + +int lwip_netdev_add(struct netif* lwip_netif); +void lwip_netdev_del(struct netif* lwip_netif); int HwEthInit(void); - #ifdef __cplusplus } #endif #endif - diff --git a/Ubiquitous/XiZi_IIoT/board/xiwangtong-arm32/third_party_driver/include/connect_ethernet.h b/Ubiquitous/XiZi_IIoT/board/xiwangtong-arm32/third_party_driver/include/connect_ethernet.h index 49f92d4c8..ad4062e9a 100755 --- a/Ubiquitous/XiZi_IIoT/board/xiwangtong-arm32/third_party_driver/include/connect_ethernet.h +++ b/Ubiquitous/XiZi_IIoT/board/xiwangtong-arm32/third_party_driver/include/connect_ethernet.h @@ -1,22 +1,22 @@ /* -* Copyright (c) 2021 AIIT XUOS Lab -* XiUOS is licensed under Mulan PSL v2. -* You can use this software according to the terms and conditions of the Mulan PSL v2. -* You may obtain a copy of Mulan PSL v2 at: -* http://license.coscl.org.cn/MulanPSL2 -* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, -* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, -* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. -* See the Mulan PSL v2 for more details. -*/ + * Copyright (c) 2021 AIIT XUOS Lab + * XiUOS is licensed under Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * http://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PSL v2 for more details. + */ /** -* @file connect_ethernet.h -* @brief Adapted network software protocol stack and hardware operation functions -* @version 1.0 -* @author AIIT XUOS Lab -* @date 2021-12-7 -*/ + * @file connect_ethernet.h + * @brief Adapted network software protocol stack and hardware operation functions + * @version 1.0 + * @author AIIT XUOS Lab + * @date 2021-12-7 + */ #ifndef __CONNECT_ETHERNET_H_ #define __CONNECT_ETHERNET_H_ @@ -25,17 +25,15 @@ #include "enet_ethernetif_priv.h" #ifdef __cplusplus - extern "C" { +extern "C" { #endif #ifndef sourceClock #define sourceClock CLOCK_GetFreq(kCLOCK_CoreSysClk) #endif - #ifdef __cplusplus } #endif #endif - diff --git a/Ubiquitous/XiZi_IIoT/kernel/include/xs_kdbg.h b/Ubiquitous/XiZi_IIoT/kernel/include/xs_kdbg.h index dcb75cee8..7612a959e 100644 --- a/Ubiquitous/XiZi_IIoT/kernel/include/xs_kdbg.h +++ b/Ubiquitous/XiZi_IIoT/kernel/include/xs_kdbg.h @@ -1,23 +1,23 @@ /* -* Copyright (c) 2020 AIIT XUOS Lab -* XiUOS is licensed under Mulan PSL v2. -* You can use this software according to the terms and conditions of the Mulan PSL v2. -* You may obtain a copy of Mulan PSL v2 at: -* http://license.coscl.org.cn/MulanPSL2 -* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, -* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, -* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. -* See the Mulan PSL v2 for more details. -*/ + * Copyright (c) 2020 AIIT XUOS Lab + * XiUOS is licensed under Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * http://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PSL v2 for more details. + */ /** -* @file: xs_kdbg.h -* @brief: function declaration and structure defintion of kernel debug -* @version: 1.0 -* @author: AIIT XUOS Lab -* @date: 2020/4/20 -* -*/ + * @file: xs_kdbg.h + * @brief: function declaration and structure defintion of kernel debug + * @version: 1.0 + * @author: AIIT XUOS Lab + * @date: 2020/4/20 + * + */ #ifndef XS_KDBG_H #define XS_KDBG_H @@ -28,6 +28,8 @@ extern "C" { #endif +#define KERNEL_DEBUG + #ifdef KERNEL_DEBUG /*Kernel Section Debug Define*/ @@ -40,18 +42,19 @@ extern "C" { #define KDBG_IPC 0 #define KDBG_HOOK 0 -#define SYS_KDEBUG_LOG(section, information) \ - do \ - { \ - if(section) { \ - KPrintf information; \ - } \ - }while (0) +#define MSGQUEUE_DEBUG 0 -#define KDYN_NONE 0 -#define KDYN_DBG 1 -#define KDYN_ERROR 2 -#define KDYN_WARNING 3 +#define SYS_KDEBUG_LOG(section, information) \ + do { \ + if (section) { \ + KPrintf information; \ + } \ + } while (0) + +#define KDYN_NONE 0 +#define KDYN_DBG 1 +#define KDYN_ERROR 2 +#define KDYN_WARNING 3 #ifdef KDYN_LOG_DBG #define DBG(args, ...) KDYNAMIC_LOG(KDYN_DBG, args, ##__VA_ARGS__) @@ -63,83 +66,76 @@ extern "C" { #define SYS_WARN(args, ...) KDYNAMIC_LOG(KDYN_WARNING, args, ##__VA_ARGS__) #endif -#define KDYNAMIC_LOG(level, args, ...) \ - do \ - { \ - switch(level) \ - { \ - case KDYN_NONE: \ - break; \ - case KDYN_DBG: \ - KPrintf("[DBG]"); \ - KPrintf(args, ##__VA_ARGS__); \ - break; \ - case KDYN_ERROR: \ - KPrintf("[ERR]"); \ - KPrintf(args, ##__VA_ARGS__); \ - break; \ - case KDYN_WARNING: \ - KPrintf("[WARN]"); \ - KPrintf(args, ##__VA_ARGS__); \ - break; \ - default: \ - break; \ - } \ - }while (0) +#define KDYNAMIC_LOG(level, args, ...) \ + do { \ + switch (level) { \ + case KDYN_NONE: \ + break; \ + case KDYN_DBG: \ + KPrintf("[DBG]"); \ + KPrintf(args, ##__VA_ARGS__); \ + break; \ + case KDYN_ERROR: \ + KPrintf("[ERR]"); \ + KPrintf(args, ##__VA_ARGS__); \ + break; \ + case KDYN_WARNING: \ + KPrintf("[WARN]"); \ + KPrintf(args, ##__VA_ARGS__); \ + break; \ + default: \ + break; \ + } \ + } while (0) -#define NULL_PARAM_CHECK(param) \ - do \ - { \ - if(param == NONE) { \ - KPrintf("PARAM CHECK FAILED ...%s %d %s is NULL.\n",__FUNCTION__,__LINE__,#param); \ - while(RET_TRUE); \ - } \ - }while (0) +#define NULL_PARAM_CHECK(param) \ + do { \ + if (param == NONE) { \ + KPrintf("PARAM CHECK FAILED ...%s %d %s is NULL.\n", __FUNCTION__, __LINE__, #param); \ + while (RET_TRUE) \ + ; \ + } \ + } while (0) -#define CHECK(TRUE_CONDITION) \ - do \ - { \ - if(!(TRUE_CONDITION)) { \ - KPrintf("%s CHECK condition is false at line[%d] of [%s] func.\n",#TRUE_CONDITION,__LINE__,__FUNCTION__);\ - while(RET_TRUE); \ - } \ - } while(0) +#define CHECK(TRUE_CONDITION) \ + do { \ + if (!(TRUE_CONDITION)) { \ + KPrintf("%s CHECK condition is false at line[%d] of [%s] func.\n", #TRUE_CONDITION, __LINE__, __FUNCTION__); \ + while (RET_TRUE) \ + ; \ + } \ + } while (0) +#define KDEBUG_NOT_IN_INTERRUPT \ + do { \ + x_base level; \ + level = DISABLE_INTERRUPT(); \ + if (isrManager.done->getCounter() != 0) { \ + KPrintf("Function[%s] is not supported in ISR\n", __FUNCTION__); \ + CHECK(0); \ + } \ + ENABLE_INTERRUPT(level); \ + } while (0) -#define KDEBUG_NOT_IN_INTERRUPT \ - do \ - { \ - x_base level; \ - level = DISABLE_INTERRUPT(); \ - if (isrManager.done->getCounter() != 0) \ - { \ - KPrintf("Function[%s] is not supported in ISR\n", __FUNCTION__); \ - CHECK(0); \ - } \ - ENABLE_INTERRUPT(level); \ - } while (0) +#define KDEBUG_IN_KTASK_CONTEXT \ + do { \ + x_base level; \ + level = DISABLE_INTERRUPT(); \ + if (GetKTaskDescriptor() == NONE) { \ + KPrintf("Function[%s] is not supported before task assign\n", __FUNCTION__); \ + CHECK(0); \ + } \ + KDEBUG_NOT_IN_INTERRUPT; \ + ENABLE_INTERRUPT(level); \ + } while (0) -#define KDEBUG_IN_KTASK_CONTEXT \ - do \ - { \ - x_base level; \ - level = DISABLE_INTERRUPT(); \ - if (GetKTaskDescriptor() == NONE) \ - { \ - KPrintf("Function[%s] is not supported before task assign\n", __FUNCTION__); \ - CHECK(0); \ - } \ - KDEBUG_NOT_IN_INTERRUPT; \ - ENABLE_INTERRUPT(level); \ - } while (0) - -#define NOT_IN_CRITICAL_AREA \ - do { \ - if(GetOsAssignLockLevel() != 0){ \ +#define NOT_IN_CRITICAL_AREA \ + do { \ + if (GetOsAssignLockLevel() != 0) { \ KPrintf("Function[%s] is not supported switch in critical area.\n", __FUNCTION__); \ - CHECK(0); \ - } \ - } while (0) + CHECK(0); \ + } \ + } while (0) #else @@ -159,4 +155,4 @@ extern "C" { } #endif -#endif +#endif diff --git a/Ubiquitous/XiZi_IIoT/kernel/thread/delay.c b/Ubiquitous/XiZi_IIoT/kernel/thread/delay.c index 1cbdabaa4..6842ac209 100644 --- a/Ubiquitous/XiZi_IIoT/kernel/thread/delay.c +++ b/Ubiquitous/XiZi_IIoT/kernel/thread/delay.c @@ -30,7 +30,7 @@ DoubleLinklistType xiaoshan_delay_head = {&xiaoshan_delay_head, &xiaoshan_delay_head}; /** - * This function will delay a task with sone ticks. + * This function will delay a task with some ticks. * * @param task the task needed to be delayed * @param ticks delay timeout diff --git a/Ubiquitous/XiZi_IIoT/kernel/thread/msgqueue.c b/Ubiquitous/XiZi_IIoT/kernel/thread/msgqueue.c index ee58bc0d7..526331aeb 100644 --- a/Ubiquitous/XiZi_IIoT/kernel/thread/msgqueue.c +++ b/Ubiquitous/XiZi_IIoT/kernel/thread/msgqueue.c @@ -21,6 +21,7 @@ #include #include +#include DECLARE_ID_MANAGER(k_mq_id_manager, ID_NUM_MAX); DoubleLinklistType k_mq_list = {&k_mq_list, &k_mq_list}; @@ -41,17 +42,17 @@ static struct MsgQueue *GetMsgQueueById(int32 id) lock = CriticalAreaLock(); idnode = IdGetObj(&k_mq_id_manager, id); - if (idnode == NONE){ - CriticalAreaUnLock(lock); - return NONE; + if (idnode == NONE) { + CriticalAreaUnLock(lock); + return NONE; } mq = CONTAINER_OF(idnode, struct MsgQueue, id); CriticalAreaUnLock(lock); + return mq; } -static x_err_t _InitMsgQueue( struct MsgQueue *mq ,x_size_t msg_size, - x_size_t max_msgs ) +static x_err_t _InitMsgQueue(struct MsgQueue* mq, x_size_t msg_size, x_size_t max_msgs) { x_base lock = 0; @@ -62,10 +63,12 @@ static x_err_t _InitMsgQueue( struct MsgQueue *mq ,x_size_t msg_size, mq->each_len = ALIGN_MEN_UP(msg_size, MEM_ALIGN_SIZE); mq->index = 0; + SYS_KDEBUG_LOG(MSGQUEUE_DEBUG, ("[%s] Msg attr, max_msg_num: %d, block size: %d\n", __func__, mq->max_msgs, mq->each_len)); + InitDoubleLinkList(&mq->send_pend_list); InitDoubleLinkList(&(mq->recv_pend_list)); - mq->msg_buf = x_malloc( mq->each_len * mq->max_msgs); + mq->msg_buf = x_malloc(mq->each_len * mq->max_msgs); if (mq->msg_buf == NONE) { lock = CriticalAreaLock(); DoubleLinkListRmNode(&(mq->link)); @@ -77,26 +80,28 @@ static x_err_t _InitMsgQueue( struct MsgQueue *mq ,x_size_t msg_size, return EOK; } -static x_err_t _MsgQueueSend(struct MsgQueue *mq, - const void *buffer, - x_size_t size, - int32 msec) +static x_err_t _MsgQueueSend(struct MsgQueue* mq, + const void* buffer, + x_size_t size, + int32 msec) { x_ubase lock = 0; uint32 tick_delta = 0; int32 timeout = 0; - uint8 *msg = NONE; + uint8* msg = NONE; struct TaskDescriptor *task = NONE; NULL_PARAM_CHECK(mq); NULL_PARAM_CHECK(buffer); + SYS_KDEBUG_LOG(MSGQUEUE_DEBUG, ("[%s] mq_num_msgs: %d, block size: %d, needed size: %d\n", __func__, mq->num_msgs, mq->each_len, size)); + if (size > mq->each_len) return -ERROR; tick_delta = 0; task = GetKTaskDescriptor(); - if(WAITING_FOREVER == msec) + if (WAITING_FOREVER == msec) timeout = WAITING_FOREVER; else timeout = CalculateTickFromTimeMs(msec); @@ -107,8 +112,7 @@ static x_err_t _MsgQueueSend(struct MsgQueue *mq, return -EFULL; } - while(mq->num_msgs >= mq->max_msgs ) { - + while (mq->num_msgs >= mq->max_msgs) { task->exstatus = EOK; if (timeout == 0) { CriticalAreaUnLock(lock); @@ -121,7 +125,7 @@ static x_err_t _MsgQueueSend(struct MsgQueue *mq, tick_delta = CurrentTicksGain(); SYS_KDEBUG_LOG(KDBG_IPC, ("mq_send_wait: start timer of task:%s\n", task->task_base_info.name)); - KTaskSetDelay(task,timeout); + KTaskSetDelay(task, timeout); } CriticalAreaUnLock(lock); @@ -139,19 +143,19 @@ static x_err_t _MsgQueueSend(struct MsgQueue *mq, if (timeout < 0) timeout = 0; } - } + } // end with lock here - msg = mq->msg_buf + ( ( mq->index + mq->num_msgs ) % mq->max_msgs ) * mq->each_len ; + msg = mq->msg_buf + ((mq->index + mq->num_msgs) % mq->max_msgs) * mq->each_len; memcpy(msg, buffer, size); - mq->num_msgs ++; + mq->num_msgs++; if (!IsDoubleLinkListEmpty(&mq->recv_pend_list)) { LinklistResume(&(mq->recv_pend_list)); CriticalAreaUnLock(lock); DO_KTASK_ASSIGN; return EOK; } - CriticalAreaUnLock(lock); + return EOK; } @@ -191,15 +195,15 @@ static x_err_t _MsgQueueUrgentSend(struct MsgQueue *mq, const void *buffer, x_si return EOK; } -static x_err_t _MsgQueueRecv(struct MsgQueue *mq, - void *buffer, - x_size_t size, - int32 msec) +static x_err_t _MsgQueueRecv(struct MsgQueue* mq, + void* buffer, + x_size_t size, + int32 msec) { x_ubase lock = 0; uint32 tick_delta = 0; int32 timeout = 0; - struct MqMessage *msg = NONE; + uint8* msg = NONE; struct TaskDescriptor *task = NONE; NULL_PARAM_CHECK(mq); @@ -208,14 +212,14 @@ static x_err_t _MsgQueueRecv(struct MsgQueue *mq, tick_delta = 0; task = GetKTaskDescriptor(); timeout = CalculateTickFromTimeMs(msec); - lock = CriticalAreaLock(); + lock = CriticalAreaLock(); if (mq->index == 0 && timeout == 0) { CriticalAreaUnLock(lock); return -ETIMEOUT; } - for( ; mq->num_msgs <= 0 ; ) { + while (mq->num_msgs <= 0) { KDEBUG_IN_KTASK_CONTEXT; task->exstatus = EOK; @@ -225,19 +229,16 @@ static x_err_t _MsgQueueRecv(struct MsgQueue *mq, return -ETIMEOUT; } - LinklistSuspend(&(mq->recv_pend_list), - task, - LINKLIST_FLAG_FIFO); + LinklistSuspend(&(mq->recv_pend_list), task, LINKLIST_FLAG_FIFO); if (timeout > 0) { tick_delta = CurrentTicksGain(); SYS_KDEBUG_LOG(KDBG_IPC, ("set task:%s to timer list\n", task->task_base_info.name)); - KTaskSetDelay(task,timeout); + KTaskSetDelay(task, timeout); } CriticalAreaUnLock(lock); - DO_KTASK_ASSIGN; if (task->exstatus != EOK) { @@ -256,8 +257,8 @@ static x_err_t _MsgQueueRecv(struct MsgQueue *mq, msg = mq->msg_buf + mq->index * mq->each_len; mq->index = (mq->index + 1) % mq->max_msgs; - memcpy(buffer, msg , size > mq->each_len ? mq->each_len : size); - mq->num_msgs --; + memcpy(buffer, msg, size > mq->each_len ? mq->each_len : size); + mq->num_msgs--; if (!IsDoubleLinkListEmpty(&(mq->send_pend_list))) { LinklistResume(&(mq->send_pend_list)); @@ -326,8 +327,7 @@ static struct MsgQueueDone Done = { * * @return id on success;ENOMEMORY/ERROR on failure */ -int32 KCreateMsgQueue(x_size_t msg_size, - x_size_t max_msgs) +int32 KCreateMsgQueue(x_size_t msg_size, x_size_t max_msgs) { int32 id = 0; x_base temp = 0; @@ -337,11 +337,12 @@ int32 KCreateMsgQueue(x_size_t msg_size, mq = (struct MsgQueue *)x_malloc(sizeof(struct MsgQueue)); if (mq == NONE) return -ENOMEMORY; - memset(mq,0x0,sizeof(struct MsgQueue)); + memset(mq, 0x0, sizeof(struct MsgQueue)); lock = CriticalAreaLock(); id = IdInsertObj(&k_mq_id_manager, &mq->id); CriticalAreaUnLock(lock); + if (id < 0) { x_free(mq); return -ENOMEMORY; @@ -350,11 +351,12 @@ int32 KCreateMsgQueue(x_size_t msg_size, lock = CriticalAreaLock(); DoubleLinkListInsertNodeAfter(&k_mq_list, &mq->link); CriticalAreaUnLock(lock); + mq->Done = &Done; - if( mq->Done->init(mq, msg_size,max_msgs) == EOK ) - return mq->id.id; + if (mq->Done->init(mq, msg_size, max_msgs) == EOK) + return mq->id.id; else - return -ERROR; + return -ERROR; } /** @@ -401,7 +403,7 @@ x_err_t KMsgQueueRecv(int32 id, mq = GetMsgQueueById(id); if (mq != NONE) - return mq->Done->recv(mq,buffer,size,timeout); + return mq->Done->recv(mq, buffer, size, timeout); else return -EINVALED; @@ -471,10 +473,11 @@ x_err_t KMsgQueueSend(int32 id, const void *buffer, x_size_t size) mq = GetMsgQueueById(id); if (mq != NONE) - return mq->Done->send(mq,buffer,size,0); + return mq->Done->send(mq, buffer, size, WAITING_FOREVER); else return -EINVALED; } + /** * send message with waiting time,current suspend task will be resumed * diff --git a/Ubiquitous/XiZi_IIoT/path_app.mk b/Ubiquitous/XiZi_IIoT/path_app.mk index 78427f764..a027e759a 100644 --- a/Ubiquitous/XiZi_IIoT/path_app.mk +++ b/Ubiquitous/XiZi_IIoT/path_app.mk @@ -8,6 +8,9 @@ ifeq ($(CONFIG_APP_SELECT_NEWLIB), y) APPPATHS += -I$(KERNEL_ROOT)/../../APP_Framework/lib/app_newlib/include # endif +ifeq ($(CONFIG_APP_USING_WEBNET),y) + APPPATHS += -I$(KERNEL_ROOT)/../../APP_Framework/Applications/webnet/WebNet_XiUOS/inc # +endif ifeq ($(CONFIG_ADD_XIZI_FEATURES), y) APPPATHS += -I$(KERNEL_ROOT)/../../APP_Framework/Framework/transform_layer/xizi \ @@ -36,6 +39,7 @@ ifeq ($(CONFIG_CRYPTO), y) APPPATHS += -I$(KERNEL_ROOT)/../../APP_Framework/Framework/security/crypto/include # endif + # COMPILE_APP: # @$(eval CPPPATHS=$(APPPATHS)) # @echo $(SRC_APP_DIR) diff --git a/Ubiquitous/XiZi_IIoT/path_kernel.mk b/Ubiquitous/XiZi_IIoT/path_kernel.mk index df84837ca..5ee36f062 100755 --- a/Ubiquitous/XiZi_IIoT/path_kernel.mk +++ b/Ubiquitous/XiZi_IIoT/path_kernel.mk @@ -52,6 +52,7 @@ KERNELPATHS += \ -I$(KERNEL_ROOT)/resources/ethernet/LwIP/include/lwip/priv \ -I$(KERNEL_ROOT)/resources/ethernet/LwIP/include/lwip/prot \ -I$(KERNEL_ROOT)/resources/ethernet/LwIP/arch + endif endif @@ -419,6 +420,8 @@ KERNELPATHS += \ -I$(KERNEL_ROOT)/resources/ethernet/LwIP/include/lwip/priv \ -I$(KERNEL_ROOT)/resources/ethernet/LwIP/include/lwip/prot \ -I$(KERNEL_ROOT)/resources/ethernet/LwIP/arch + +KERNELPATHS += -I$(KERNEL_ROOT)/resources/include/netdev endif endif @@ -554,6 +557,12 @@ endif endif +ifeq ($(CONFIG_APP_USING_WEBNET),y) + KERNELPATHS += -I$(KERNEL_ROOT)/../../APP_Framework/Applications/webnet/WebNet_XiUOS/inc \ + -I$(KERNEL_ROOT)/../../APP_Framework/Applications/webnet/WebNet_XiUOS/samples # +endif + + ifeq ($(CONFIG_TOOL_SHELL), y) KERNELPATHS +=-I$(KERNEL_ROOT)/tool/shell/letter-shell \ -I$(KERNEL_ROOT)/tool/shell/letter-shell/file_ext # diff --git a/Ubiquitous/XiZi_IIoT/resources/ethernet/LwIP/arch/sys_arch.c b/Ubiquitous/XiZi_IIoT/resources/ethernet/LwIP/arch/sys_arch.c index e491c5cb1..29175d23f 100644 --- a/Ubiquitous/XiZi_IIoT/resources/ethernet/LwIP/arch/sys_arch.c +++ b/Ubiquitous/XiZi_IIoT/resources/ethernet/LwIP/arch/sys_arch.c @@ -31,55 +31,54 @@ */ /** -* @file sys_arch.c -* @brief In order to adapt to XiZi, some changes have been made to implement the LwIP interface. -* @version 1.0 -* @author AIIT XUOS Lab -* @date 2021-05-29 -*/ + * @file sys_arch.c + * @brief In order to adapt to XiZi, some changes have been made to implement the LwIP interface. + * @version 1.0 + * @author AIIT XUOS Lab + * @date 2021-05-29 + */ #include "debug.h" -#include #include +#include -#include "tcpip.h" +#include "lwip/dhcp.h" #include "lwip/init.h" #include "lwip/netif.h" #include "lwip/sio.h" -#include -#include -#include -#include "lwip/dhcp.h" +#include "tcpip.h" #include "tcpip_priv.h" +#include +#include +#include #if !NO_SYS #include "sys_arch.h" #endif #include +#include #include #include -#include -#include -#include -#include #include +#include +#include #include "board.h" -#include "ethernet.h" #include "connect_ethernet.h" +#include "ethernet.h" -char lwip_ipaddr[20] = {192, 168, 130, 77}; -char lwip_netmask[20] = {255, 255, 254, 0}; -char lwip_gwaddr[20] = {192, 168, 130, 1}; +char lwip_ipaddr[20] = { 192, 168, 130, 77 }; +char lwip_netmask[20] = { 255, 255, 254, 0 }; +char lwip_gwaddr[20] = { 192, 168, 130, 1 }; -char lwip_eth0_ipaddr[20] = {192, 168, 130, 77}; -char lwip_eth0_netmask[20] = {255, 255, 254, 0}; -char lwip_eth0_gwaddr[20] = {192, 168, 130, 1}; +char lwip_eth0_ipaddr[20] = { 192, 168, 130, 77 }; +char lwip_eth0_netmask[20] = { 255, 255, 254, 0 }; +char lwip_eth0_gwaddr[20] = { 192, 168, 130, 1 }; -char lwip_eth1_ipaddr[20] = {192, 168, 130, 99}; -char lwip_eth1_netmask[20] = {255, 255, 254, 0}; -char lwip_eth1_gwaddr[20] = {192, 168, 130, 23}; +char lwip_eth1_ipaddr[20] = { 192, 168, 130, 99 }; +char lwip_eth1_netmask[20] = { 255, 255, 254, 0 }; +char lwip_eth1_gwaddr[20] = { 192, 168, 130, 23 }; char lwip_flag = 0; @@ -88,220 +87,238 @@ x_ticks_t lwip_sys_now; #define SYS_THREAD_MAX 4 struct netif gnetif; -sys_sem_t* get_eth_recv_sem() { +sys_sem_t* get_eth_recv_sem() +{ static sys_sem_t g_recv_sem = 0; return &g_recv_sem; } -void sys_init(void) { - // do nothing +void sys_init(void) +{ + // do nothing } -u32_t -sys_jiffies(void) { - lwip_sys_now = CurrentTicksGain(); - return lwip_sys_now; +u32_t sys_jiffies(void) +{ + lwip_sys_now = CurrentTicksGain(); + return lwip_sys_now; } -u32_t -sys_now(void) { - lwip_sys_now = CurrentTicksGain(); - return CalculateTimeMsFromTick(lwip_sys_now); +u32_t sys_now(void) +{ + lwip_sys_now = CurrentTicksGain(); + return CalculateTimeMsFromTick(lwip_sys_now); } -sys_prot_t sys_arch_protect(void) { - return CriticalAreaLock(); +sys_prot_t sys_arch_protect(void) +{ + return CriticalAreaLock(); } -void sys_arch_unprotect(sys_prot_t pval) { - CriticalAreaUnLock(pval); +void sys_arch_unprotect(sys_prot_t pval) +{ + CriticalAreaUnLock(pval); } #if !NO_SYS -err_t -sys_sem_new(sys_sem_t *sem, u8_t count) { - *sem = KSemaphoreCreate((uint16)count); +err_t sys_sem_new(sys_sem_t* sem, u8_t count) +{ + *sem = KSemaphoreCreate((uint16)count); #if SYS_STATS - ++lwip_stats.sys.sem.used; - if (lwip_stats.sys.sem.max < lwip_stats.sys.sem.used) { - lwip_stats.sys.sem.max = lwip_stats.sys.sem.used; - } -#endif /* SYS_STATS */ - - if(*sem >= 0) - return ERR_OK; - else { -#if SYS_STATS - ++lwip_stats.sys.sem.err; -#endif /* SYS_STATS */ - KPrintf("[sys_arch]:new sem fail!\n"); - return ERR_MEM; - } -} - -void -sys_sem_free(sys_sem_t *sem) { -#if SYS_STATS - --lwip_stats.sys.sem.used; -#endif /* SYS_STATS */ - KSemaphoreDelete(*sem); - *sem = SYS_SEM_NULL; -} - -int sys_sem_valid(sys_sem_t *sem) { - return (*sem > SYS_SEM_NULL); -} - -void -sys_sem_set_invalid(sys_sem_t *sem) { - *sem = SYS_SEM_NULL; -} - -u32_t sys_arch_sem_wait(sys_sem_t *sem, u32_t timeout) { - x_ticks_t start_tick = 0 ; - int32 wait_time = 0; - - - if(*sem == SYS_SEM_NULL) - return SYS_ARCH_TIMEOUT; - - - start_tick = CurrentTicksGain(); - - if (0 == timeout) - wait_time = WAITING_FOREVER; - else - wait_time = timeout; - - - if(KSemaphoreObtain(*sem, wait_time) == EOK) - return CalculateTimeMsFromTick(CurrentTicksGain()-start_tick); - else - return SYS_ARCH_TIMEOUT; -} - -void sys_sem_signal(sys_sem_t *sem) { - if(KSemaphoreAbandon(*sem) != EOK) - KPrintf("[sys_arch]:sem signal fail!\n"); -} - -err_t sys_mutex_new(sys_mutex_t *mutex) { - *mutex = KMutexCreate(); - if (*mutex > SYS_MRTEX_NULL) - return ERR_OK; - else { - KPrintf("[sys_arch]:new mutex fail!\n"); - return ERR_MEM; - } -} - -void sys_mutex_free(sys_mutex_t *mutex) { - KMutexDelete(*mutex); -} - -void sys_mutex_set_invalid(sys_mutex_t *mutex) { - *mutex = SYS_MRTEX_NULL; -} - -void sys_mutex_lock(sys_mutex_t *mutex) { - KMutexObtain(*mutex, WAITING_FOREVER); -} - -void sys_mutex_unlock(sys_mutex_t *mutex) { - KMutexAbandon(*mutex); -} - - -sys_thread_t sys_thread_new(const char *name, lwip_thread_fn function, void *arg, int stacksize, int prio) { - sys_thread_t handle = -1; - handle = KTaskCreate(name, - function, - arg, - (uint32)stacksize, - (uint8)prio); - if (handle >= 0) { - StartupKTask(handle); - lw_print("lw: [%s] create %s handle %x\n", __func__, name, handle); - return handle; - } - lw_print("lw: [%s] create %s failed\n", __func__, name); - return -ERROR; -} - -err_t sys_mbox_new(sys_mbox_t *mbox, int size) { - *mbox = KCreateMsgQueue(sizeof(void *), size); - -#if SYS_STATS - ++lwip_stats.sys.mbox.used; - if (lwip_stats.sys.mbox.max < lwip_stats.sys.mbox.used) { - lwip_stats.sys.mbox.max = lwip_stats.sys.mbox.used; + ++lwip_stats.sys.sem.used; + if (lwip_stats.sys.sem.max < lwip_stats.sys.sem.used) { + lwip_stats.sys.sem.max = lwip_stats.sys.sem.used; } #endif /* SYS_STATS */ - if(*mbox < 0) { - lw_print("lw: [%s] alloc %d mbox %p failed\n", __func__, size, mbox); - return ERR_MEM; - } - lw_print("lw: [%s] alloc %d mbox %p ok!\n", __func__, size, mbox); - return ERR_OK; + if (*sem >= 0) + return ERR_OK; + else { +#if SYS_STATS + ++lwip_stats.sys.sem.err; +#endif /* SYS_STATS */ + KPrintf("[sys_arch]:new sem fail!\n"); + return ERR_MEM; + } } -void sys_mbox_free(sys_mbox_t *mbox) { - KDeleteMsgQueue(*mbox); +void sys_sem_free(sys_sem_t* sem) +{ +#if SYS_STATS + --lwip_stats.sys.sem.used; +#endif /* SYS_STATS */ + KSemaphoreDelete(*sem); + *sem = SYS_SEM_NULL; } -int sys_mbox_valid(sys_mbox_t *mbox) { - if (*mbox <= SYS_MBOX_NULL) - return 0; - else - return 1; +int sys_sem_valid(sys_sem_t* sem) +{ + return (*sem > SYS_SEM_NULL); } -void sys_mbox_set_invalid(sys_mbox_t *mbox) { - *mbox = SYS_MBOX_NULL; +void sys_sem_set_invalid(sys_sem_t* sem) +{ + *sem = SYS_SEM_NULL; } -void sys_mbox_post(sys_mbox_t *q, void *msg) { - KMsgQueueSendwait(*q, &msg, sizeof(void *), WAITING_FOREVER); +u32_t sys_arch_sem_wait(sys_sem_t* sem, u32_t timeout) +{ + x_ticks_t start_tick = 0; + int32 wait_time = 0; + + if (*sem == SYS_SEM_NULL) + return SYS_ARCH_TIMEOUT; + + start_tick = CurrentTicksGain(); + + if (0 == timeout) + wait_time = WAITING_FOREVER; + else + wait_time = timeout; + + if (KSemaphoreObtain(*sem, wait_time) == EOK) + return CalculateTimeMsFromTick(CurrentTicksGain() - start_tick); + else + return SYS_ARCH_TIMEOUT; } -err_t sys_mbox_trypost(sys_mbox_t *q, void *msg) { - // if(KMsgQueueSend(*q, &msg, sizeof(void *)) == EOK) - if(KMsgQueueSend(*q, &msg, sizeof(void *)) == EOK) +void sys_sem_signal(sys_sem_t* sem) +{ + if (KSemaphoreAbandon(*sem) != EOK) + KPrintf("[sys_arch]:sem signal fail!\n"); +} + +err_t sys_mutex_new(sys_mutex_t* mutex) +{ + *mutex = KMutexCreate(); + if (*mutex > SYS_MRTEX_NULL) + return ERR_OK; + else { + KPrintf("[sys_arch]:new mutex fail!\n"); + return ERR_MEM; + } +} + +void sys_mutex_free(sys_mutex_t* mutex) +{ + KMutexDelete(*mutex); +} + +void sys_mutex_set_invalid(sys_mutex_t* mutex) +{ + *mutex = SYS_MRTEX_NULL; +} + +void sys_mutex_lock(sys_mutex_t* mutex) +{ + KMutexObtain(*mutex, WAITING_FOREVER); +} + +void sys_mutex_unlock(sys_mutex_t* mutex) +{ + KMutexAbandon(*mutex); +} + +sys_thread_t sys_thread_new(const char* name, lwip_thread_fn function, void* arg, int stacksize, int prio) +{ + sys_thread_t handle = -1; + handle = KTaskCreate(name, + function, + arg, + (uint32)stacksize, + (uint8)prio); + if (handle >= 0) { + StartupKTask(handle); + lw_print("lw: [%s] create %s handle %x\n", __func__, name, handle); + return handle; + } + lw_print("lw: [%s] create %s failed\n", __func__, name); + return -ERROR; +} + +err_t sys_mbox_new(sys_mbox_t* mbox, int size) +{ + *mbox = KCreateMsgQueue(sizeof(void*), size); + +#if SYS_STATS + ++lwip_stats.sys.mbox.used; + if (lwip_stats.sys.mbox.max < lwip_stats.sys.mbox.used) { + lwip_stats.sys.mbox.max = lwip_stats.sys.mbox.used; + } +#endif /* SYS_STATS */ + if (*mbox < 0) { + lw_print("lw: [%s] alloc %d mbox %p failed\n", __func__, size, mbox); + return ERR_MEM; + } + + lw_print("lw: [%s] alloc %d mbox %p ok!\n", __func__, size, mbox); return ERR_OK; - else - return ERR_MEM; } -err_t sys_mbox_trypost_fromisr(sys_mbox_t *q, void *msg) { - return sys_mbox_trypost(q, msg); +void sys_mbox_free(sys_mbox_t* mbox) +{ + KDeleteMsgQueue(*mbox); } -u32_t sys_arch_mbox_fetch(sys_mbox_t *q, void **msg, u32_t timeout) { - x_ticks_t start_tick = 0 ; - int32 wait_time = 0; - - start_tick = CurrentTicksGain(); - - if (0 == timeout) - wait_time = WAITING_FOREVER; - else - wait_time = timeout; - - if(KMsgQueueRecv(*q, &(*msg), sizeof(void *), wait_time) == EOK) { - return CalculateTimeMsFromTick(CurrentTicksGain() - start_tick); - } else { - return SYS_ARCH_TIMEOUT; - } +int sys_mbox_valid(sys_mbox_t* mbox) +{ + if (*mbox <= SYS_MBOX_NULL) + return 0; + else + return 1; } -u32_t sys_arch_mbox_tryfetch(sys_mbox_t *q, void **msg) { - if (KMsgQueueRecv(*q, &(*msg), sizeof(void *), 0) == EOK) - return ERR_OK; - else - return SYS_MBOX_EMPTY; +void sys_mbox_set_invalid(sys_mbox_t* mbox) +{ + *mbox = SYS_MBOX_NULL; +} + +void sys_mbox_post(sys_mbox_t* q, void* msg) +{ + KMsgQueueSendwait(*q, &msg, sizeof(void*), WAITING_FOREVER); +} + +err_t sys_mbox_trypost(sys_mbox_t* q, void* msg) +{ + // if(KMsgQueueSend(*q, &msg, sizeof(void *)) == EOK) + if (KMsgQueueSend(*q, &msg, sizeof(void*)) == EOK) + return ERR_OK; + else + return ERR_MEM; +} + +err_t sys_mbox_trypost_fromisr(sys_mbox_t* q, void* msg) +{ + return sys_mbox_trypost(q, msg); +} + +u32_t sys_arch_mbox_fetch(sys_mbox_t* q, void** msg, u32_t timeout) +{ + x_ticks_t start_tick = 0; + int32 wait_time = 0; + + start_tick = CurrentTicksGain(); + + if (0 == timeout) + wait_time = WAITING_FOREVER; + else + wait_time = timeout; + + if (KMsgQueueRecv(*q, &(*msg), sizeof(void*), wait_time) == EOK) { + return CalculateTimeMsFromTick(CurrentTicksGain() - start_tick); + } else { + return SYS_ARCH_TIMEOUT; + } +} + +u32_t sys_arch_mbox_tryfetch(sys_mbox_t* q, void** msg) +{ + if (KMsgQueueRecv(*q, &(*msg), sizeof(void*), 0) == EOK) + return ERR_OK; + else + return SYS_MBOX_EMPTY; } #if LWIP_NETCONN_SEM_PER_THREAD @@ -315,128 +332,129 @@ ip4_addr_t ipaddr; ip4_addr_t netmask; ip4_addr_t gw; -void lwip_config_input(struct netif *net) { - sys_thread_t th_id = 0; +void lwip_config_input(struct netif* net) +{ + sys_thread_t th_id = 0; - th_id = sys_thread_new("eth_input", ethernetif_input, net, LWIP_TASK_STACK_SIZE, 20); + th_id = sys_thread_new("eth_input", ethernetif_input, net, LWIP_TASK_STACK_SIZE, 20); - if (th_id >= 0) { - lw_print("%s %d successfully!\n", __func__, th_id); - } else { - lw_print("%s failed!\n", __func__); - } + if (th_id >= 0) { + lw_print("%s %d successfully!\n", __func__, th_id); + } else { + lw_print("%s failed!\n", __func__); + } } -void lwip_config_tcp(uint8_t enet_port, char *ip, char *mask, char *gw) { - ip4_addr_t net_ipaddr, net_netmask, net_gw; - char* eth_cfg; +void lwip_config_tcp(uint8_t enet_port, char* ip, char* mask, char* gw) +{ + ip4_addr_t net_ipaddr, net_netmask, net_gw; + char* eth_cfg; - eth_cfg = ethernetif_config_enet_set(enet_port); + eth_cfg = ethernetif_config_enet_set(enet_port); - if(chk_lwip_bit(LWIP_INIT_FLAG)) { - lw_print("lw: [%s] already ...\n", __func__); - return; - } + if (chk_lwip_bit(LWIP_INIT_FLAG)) { + lw_print("lw: [%s] already ...\n", __func__); + return; + } - set_lwip_bit(LWIP_INIT_FLAG); + set_lwip_bit(LWIP_INIT_FLAG); - tcpip_init(NULL, NULL); + tcpip_init(NULL, NULL); - lw_print("lw: [%s] start ...\n", __func__); - - IP4_ADDR(&net_ipaddr, ip[0], ip[1], ip[2], ip[3]); - IP4_ADDR(&net_netmask, mask[0], mask[1], mask[2], mask[3]); - IP4_ADDR(&net_gw, gw[0], gw[1], gw[2], gw[3]); - - if (0 == enet_port) { -#ifdef NETIF_ENET0_INIT_FUNC - printf("[%s:%d] call netif_add\n", __func__, __LINE__); - netif_add(&gnetif, &net_ipaddr, &net_netmask, &net_gw, eth_cfg, NETIF_ENET0_INIT_FUNC, - tcpip_input); -#endif - } else if (1 == enet_port) { -#ifdef NETIF_ENET1_INIT_FUNC - netif_add(&gnetif, &net_ipaddr, &net_netmask, &net_gw, eth_cfg, NETIF_ENET1_INIT_FUNC, - tcpip_input); -#endif - } - - netif_set_default(&gnetif); - netif_set_up(&gnetif); - - lw_print("\r\n************************************************\r\n"); - lw_print(" Network Configuration\r\n"); - lw_print("************************************************\r\n"); - lw_print(" IPv4 Address : %u.%u.%u.%u\r\n", ((u8_t *)&net_ipaddr)[0], ((u8_t *)&net_ipaddr)[1], - ((u8_t *)&net_ipaddr)[2], ((u8_t *)&net_ipaddr)[3]); - lw_print(" IPv4 Subnet mask : %u.%u.%u.%u\r\n", ((u8_t *)&net_netmask)[0], ((u8_t *)&net_netmask)[1], - ((u8_t *)&net_netmask)[2], ((u8_t *)&net_netmask)[3]); - lw_print(" IPv4 Gateway : %u.%u.%u.%u\r\n", ((u8_t *)&net_gw)[0], ((u8_t *)&net_gw)[1], - ((u8_t *)&net_gw)[2], ((u8_t *)&net_gw)[3]); - lw_print("************************************************\r\n"); - - lwip_config_input(&gnetif); -} - - -void lwip_config_net(uint8_t enet_port, char *ip, char *mask, char *gw) { - ip4_addr_t net_ipaddr, net_netmask, net_gw; - char* eth_cfg; - - eth_cfg = ethernetif_config_enet_set(enet_port); - - if(chk_lwip_bit(LWIP_INIT_FLAG)) { - lw_print("lw: [%s] already ...\n", __func__); + lw_print("lw: [%s] start ...\n", __func__); IP4_ADDR(&net_ipaddr, ip[0], ip[1], ip[2], ip[3]); IP4_ADDR(&net_netmask, mask[0], mask[1], mask[2], mask[3]); IP4_ADDR(&net_gw, gw[0], gw[1], gw[2], gw[3]); - // update ip addr - netif_set_down(&gnetif); - netif_set_gw(&gnetif, &net_gw); - netif_set_netmask(&gnetif, &net_netmask); - netif_set_ipaddr(&gnetif, &net_ipaddr); - netif_set_up(&gnetif); - return; - } - set_lwip_bit(LWIP_INIT_FLAG); - - lw_print("lw: [%s] start ...\n", __func__); - - IP4_ADDR(&net_ipaddr, ip[0], ip[1], ip[2], ip[3]); - IP4_ADDR(&net_netmask, mask[0], mask[1], mask[2], mask[3]); - IP4_ADDR(&net_gw, gw[0], gw[1], gw[2], gw[3]); - - lwip_init(); - - if(0 == enet_port) { + if (0 == enet_port) { #ifdef NETIF_ENET0_INIT_FUNC - netif_add(&gnetif, &net_ipaddr, &net_netmask, &net_gw, eth_cfg, NETIF_ENET0_INIT_FUNC, - ethernet_input); + printf("[%s:%d] call netif_add\n", __func__, __LINE__); + netif_add(&gnetif, &net_ipaddr, &net_netmask, &net_gw, eth_cfg, NETIF_ENET0_INIT_FUNC, + tcpip_input); #endif - } else if (1 == enet_port) { + } else if (1 == enet_port) { #ifdef NETIF_ENET1_INIT_FUNC - netif_add(&gnetif, &net_ipaddr, &net_netmask, &net_gw, eth_cfg, NETIF_ENET1_INIT_FUNC, - ethernet_input); + netif_add(&gnetif, &net_ipaddr, &net_netmask, &net_gw, eth_cfg, NETIF_ENET1_INIT_FUNC, + tcpip_input); #endif - } - - netif_set_default(&gnetif); - netif_set_up(&gnetif); + } - if(chk_lwip_bit(LWIP_PRINT_FLAG)) { - lw_notice("\r\n************************************************\r\n"); - lw_notice(" Network Configuration\r\n"); - lw_notice("************************************************\r\n"); - lw_notice(" IPv4 Address : %u.%u.%u.%u\r\n", ((u8_t *)&net_ipaddr)[0], ((u8_t *)&net_ipaddr)[1], - ((u8_t *)&net_ipaddr)[2], ((u8_t *)&net_ipaddr)[3]); - lw_notice(" IPv4 Subnet mask : %u.%u.%u.%u\r\n", ((u8_t *)&net_netmask)[0], ((u8_t *)&net_netmask)[1], - ((u8_t *)&net_netmask)[2], ((u8_t *)&net_netmask)[3]); - lw_notice(" IPv4 Gateway : %u.%u.%u.%u\r\n", ((u8_t *)&net_gw)[0], ((u8_t *)&net_gw)[1], - ((u8_t *)&net_gw)[2], ((u8_t *)&net_gw)[3]); - lw_notice("************************************************\r\n"); - } - lwip_config_input(&gnetif); + netif_set_default(&gnetif); + netif_set_up(&gnetif); + + lw_print("\r\n************************************************\r\n"); + lw_print(" Network Configuration\r\n"); + lw_print("************************************************\r\n"); + lw_print(" IPv4 Address : %u.%u.%u.%u\r\n", ((u8_t*)&net_ipaddr)[0], ((u8_t*)&net_ipaddr)[1], + ((u8_t*)&net_ipaddr)[2], ((u8_t*)&net_ipaddr)[3]); + lw_print(" IPv4 Subnet mask : %u.%u.%u.%u\r\n", ((u8_t*)&net_netmask)[0], ((u8_t*)&net_netmask)[1], + ((u8_t*)&net_netmask)[2], ((u8_t*)&net_netmask)[3]); + lw_print(" IPv4 Gateway : %u.%u.%u.%u\r\n", ((u8_t*)&net_gw)[0], ((u8_t*)&net_gw)[1], + ((u8_t*)&net_gw)[2], ((u8_t*)&net_gw)[3]); + lw_print("************************************************\r\n"); + + lwip_config_input(&gnetif); } +void lwip_config_net(uint8_t enet_port, char* ip, char* mask, char* gw) +{ + ip4_addr_t net_ipaddr, net_netmask, net_gw; + char* eth_cfg; + + eth_cfg = ethernetif_config_enet_set(enet_port); + + if (chk_lwip_bit(LWIP_INIT_FLAG)) { + lw_print("lw: [%s] already ...\n", __func__); + + IP4_ADDR(&net_ipaddr, ip[0], ip[1], ip[2], ip[3]); + IP4_ADDR(&net_netmask, mask[0], mask[1], mask[2], mask[3]); + IP4_ADDR(&net_gw, gw[0], gw[1], gw[2], gw[3]); + + // update ip addr + netif_set_down(&gnetif); + netif_set_gw(&gnetif, &net_gw); + netif_set_netmask(&gnetif, &net_netmask); + netif_set_ipaddr(&gnetif, &net_ipaddr); + netif_set_up(&gnetif); + return; + } + set_lwip_bit(LWIP_INIT_FLAG); + + lw_print("lw: [%s] start ...\n", __func__); + + IP4_ADDR(&net_ipaddr, ip[0], ip[1], ip[2], ip[3]); + IP4_ADDR(&net_netmask, mask[0], mask[1], mask[2], mask[3]); + IP4_ADDR(&net_gw, gw[0], gw[1], gw[2], gw[3]); + + lwip_init(); + + if (0 == enet_port) { +#ifdef NETIF_ENET0_INIT_FUNC + netif_add(&gnetif, &net_ipaddr, &net_netmask, &net_gw, eth_cfg, NETIF_ENET0_INIT_FUNC, + ethernet_input); +#endif + } else if (1 == enet_port) { +#ifdef NETIF_ENET1_INIT_FUNC + netif_add(&gnetif, &net_ipaddr, &net_netmask, &net_gw, eth_cfg, NETIF_ENET1_INIT_FUNC, + ethernet_input); +#endif + } + + netif_set_default(&gnetif); + netif_set_up(&gnetif); + + if (chk_lwip_bit(LWIP_PRINT_FLAG)) { + lw_notice("\r\n************************************************\r\n"); + lw_notice(" Network Configuration\r\n"); + lw_notice("************************************************\r\n"); + lw_notice(" IPv4 Address : %u.%u.%u.%u\r\n", ((u8_t*)&net_ipaddr)[0], ((u8_t*)&net_ipaddr)[1], + ((u8_t*)&net_ipaddr)[2], ((u8_t*)&net_ipaddr)[3]); + lw_notice(" IPv4 Subnet mask : %u.%u.%u.%u\r\n", ((u8_t*)&net_netmask)[0], ((u8_t*)&net_netmask)[1], + ((u8_t*)&net_netmask)[2], ((u8_t*)&net_netmask)[3]); + lw_notice(" IPv4 Gateway : %u.%u.%u.%u\r\n", ((u8_t*)&net_gw)[0], ((u8_t*)&net_gw)[1], + ((u8_t*)&net_gw)[2], ((u8_t*)&net_gw)[3]); + lw_notice("************************************************\r\n"); + } + lwip_config_input(&gnetif); +} diff --git a/Ubiquitous/XiZi_IIoT/resources/ethernet/LwIP/core/ipv4/ip4_addr.c b/Ubiquitous/XiZi_IIoT/resources/ethernet/LwIP/core/ipv4/ip4_addr.c index 33204d114..432b06361 100644 --- a/Ubiquitous/XiZi_IIoT/resources/ethernet/LwIP/core/ipv4/ip4_addr.c +++ b/Ubiquitous/XiZi_IIoT/resources/ethernet/LwIP/core/ipv4/ip4_addr.c @@ -314,7 +314,7 @@ ip4addr_ntoa_r(const ip4_addr_t *addr, char *buf, int buflen) *rp++ = '.'; ap++; } - *--rp = 0; + *--rp = '\0'; return buf; } diff --git a/Ubiquitous/XiZi_IIoT/resources/ethernet/Makefile b/Ubiquitous/XiZi_IIoT/resources/ethernet/Makefile index 7de558d34..97452c54f 100644 --- a/Ubiquitous/XiZi_IIoT/resources/ethernet/Makefile +++ b/Ubiquitous/XiZi_IIoT/resources/ethernet/Makefile @@ -1,4 +1,4 @@ -SRC_DIR += cmd_lwip +SRC_DIR += cmd_lwip netdev LWIP_DIR := LwIP include $(KERNEL_ROOT)/compiler.mk diff --git a/Ubiquitous/XiZi_IIoT/resources/ethernet/cmd_lwip/lwip_config_demo.c b/Ubiquitous/XiZi_IIoT/resources/ethernet/cmd_lwip/lwip_config_demo.c index 8355989e2..8856be9ff 100755 --- a/Ubiquitous/XiZi_IIoT/resources/ethernet/cmd_lwip/lwip_config_demo.c +++ b/Ubiquitous/XiZi_IIoT/resources/ethernet/cmd_lwip/lwip_config_demo.c @@ -19,48 +19,45 @@ */ #include -#include #include -#include #include +#include +#include +#include + +#include /******************************************************************************/ uint8_t enet_id = 0; -static void LwipSetIPTask(void *param) +static void LwipSetIPTask(void* param) { - uint8_t enet_port = *(uint8_t *)param; ///< test enet port + uint8_t enet_port = *(uint8_t*)param; ///< test enet port printf("lw: [%s] config netport id[%d]\n", __func__, enet_port); // lwip_config_net(enet_port, lwip_ipaddr, lwip_netmask, lwip_gwaddr); lwip_config_tcp(enet_port, lwip_ipaddr, lwip_netmask, lwip_gwaddr); } -void LwipSetIPTest(int argc, char *argv[]) +void LwipSetIPTest(int argc, char* argv[]) { - if(argc >= 4) - { + if (argc >= 4) { printf("lw: [%s] ip %s mask %s gw %s netport %s\n", __func__, argv[1], argv[2], argv[3], argv[4]); sscanf(argv[1], "%d.%d.%d.%d", &lwip_ipaddr[0], &lwip_ipaddr[1], &lwip_ipaddr[2], &lwip_ipaddr[3]); sscanf(argv[2], "%d.%d.%d.%d", &lwip_netmask[0], &lwip_netmask[1], &lwip_netmask[2], &lwip_netmask[3]); sscanf(argv[3], "%d.%d.%d.%d", &lwip_gwaddr[0], &lwip_gwaddr[1], &lwip_gwaddr[2], &lwip_gwaddr[3]); sscanf(argv[4], "%d", &enet_id); - if(0 == enet_id) - { + if (0 == enet_id) { printf("save eth0 info\n"); memcpy(lwip_eth0_ipaddr, lwip_ipaddr, 20); memcpy(lwip_eth0_netmask, lwip_netmask, 20); memcpy(lwip_eth0_gwaddr, lwip_gwaddr, 20); - } - else if(1 == enet_id) - { + } else if (1 == enet_id) { printf("save eth1 info\n"); memcpy(lwip_eth1_ipaddr, lwip_ipaddr, 20); memcpy(lwip_eth1_netmask, lwip_netmask, 20); memcpy(lwip_eth1_gwaddr, lwip_gwaddr, 20); } - } - else if(argc == 2) - { + } else if (argc == 2) { printf("lw: [%s] set eth0 ipaddr %s \n", __func__, argv[1]); sscanf(argv[1], "%d.%d.%d.%d", &lwip_ipaddr[0], &lwip_ipaddr[1], &lwip_ipaddr[2], &lwip_ipaddr[3]); memcpy(lwip_eth0_ipaddr, lwip_ipaddr, strlen(lwip_ipaddr)); @@ -70,39 +67,56 @@ void LwipSetIPTest(int argc, char *argv[]) } SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0) | SHELL_CMD_TYPE(SHELL_TYPE_CMD_MAIN) | SHELL_CMD_PARAM_NUM(5), - setip, LwipSetIPTest, setip [IP] [Netmask] [Gateway] [port]); + setip, LwipSetIPTest, setip[IP][Netmask][Gateway][port]); - -void LwipShowIPTask(int argc, char *argv[]) +void LwipShowIPTask(int argc, char* argv[]) { #ifdef configMAC_ADDR char mac_addr0[] = configMAC_ADDR; #endif + // find default netdev + struct netdev* netdev = netdev_get_by_name("en\0"); + if (netdev == NULL) { + lw_notice("[%s] Netdev not found by name en\n"); + struct netdev* default_netdev = NETDEV_DEFAULT; + } + lw_notice("\r\n************************************************\r\n"); lw_notice(" Network Configuration\r\n"); lw_notice("************************************************\r\n"); - lw_notice(" ETH0 IPv4 Address : %u.%u.%u.%u\r\n", ((u8_t *)&lwip_eth0_ipaddr)[0], ((u8_t *)&lwip_eth0_ipaddr)[1], - ((u8_t *)&lwip_eth0_ipaddr)[2], ((u8_t *)&lwip_eth0_ipaddr)[3]); - lw_notice(" ETH0 IPv4 Subnet mask : %u.%u.%u.%u\r\n", ((u8_t *)&lwip_eth0_netmask)[0], ((u8_t *)&lwip_eth0_netmask)[1], - ((u8_t *)&lwip_eth0_netmask)[2], ((u8_t *)&lwip_eth0_netmask)[3]); - lw_notice(" ETH0 IPv4 Gateway : %u.%u.%u.%u\r\n", ((u8_t *)&lwip_gwaddr)[0], ((u8_t *)&lwip_eth0_gwaddr)[1], - ((u8_t *)&lwip_eth0_gwaddr)[2], ((u8_t *)&lwip_eth0_gwaddr)[3]); + // lw_notice(" ETH0 IPv4 Address : %u.%u.%u.%u\r\n", ((u8_t*)&lwip_eth0_ipaddr)[0], ((u8_t*)&lwip_eth0_ipaddr)[1], + // ((u8_t*)&lwip_eth0_ipaddr)[2], ((u8_t*)&lwip_eth0_ipaddr)[3]); + // lw_notice(" ETH0 IPv4 Subnet mask : %u.%u.%u.%u\r\n", ((u8_t*)&lwip_eth0_netmask)[0], ((u8_t*)&lwip_eth0_netmask)[1], + // ((u8_t*)&lwip_eth0_netmask)[2], ((u8_t*)&lwip_eth0_netmask)[3]); + // lw_notice(" ETH0 IPv4 Gateway : %u.%u.%u.%u\r\n", ((u8_t*)&lwip_gwaddr)[0], ((u8_t*)&lwip_eth0_gwaddr)[1], + // ((u8_t*)&lwip_eth0_gwaddr)[2], ((u8_t*)&lwip_eth0_gwaddr)[3]); + // #ifdef configMAC_ADDR + // lw_notice(" ETH0 MAC Address : %x:%x:%x:%x:%x:%x\r\n", mac_addr0[0], mac_addr0[1], mac_addr0[2], + // mac_addr0[3], mac_addr0[4], mac_addr0[5]); + // #endif + + lw_notice(" ETH0 IPv4 Address : %u.%u.%u.%u\r\n", ((u8_t*)&lwip_eth0_ipaddr)[0], ((u8_t*)&lwip_eth0_ipaddr)[1], + ((u8_t*)&lwip_eth0_ipaddr)[2], ((u8_t*)&lwip_eth0_ipaddr)[3]); + lw_notice(" ETH0 IPv4 Subnet mask : %u.%u.%u.%u\r\n", ((u8_t*)&lwip_eth0_netmask)[0], ((u8_t*)&lwip_eth0_netmask)[1], + ((u8_t*)&lwip_eth0_netmask)[2], ((u8_t*)&lwip_eth0_netmask)[3]); + lw_notice(" ETH0 IPv4 Gateway : %u.%u.%u.%u\r\n", ((u8_t*)&lwip_gwaddr)[0], ((u8_t*)&lwip_eth0_gwaddr)[1], + ((u8_t*)&lwip_eth0_gwaddr)[2], ((u8_t*)&lwip_eth0_gwaddr)[3]); #ifdef configMAC_ADDR lw_notice(" ETH0 MAC Address : %x:%x:%x:%x:%x:%x\r\n", mac_addr0[0], mac_addr0[1], mac_addr0[2], mac_addr0[3], mac_addr0[4], mac_addr0[5]); #endif + #ifdef BOARD_NET_COUNT - if(BOARD_NET_COUNT > 1) - { + if (BOARD_NET_COUNT > 1) { char mac_addr1[] = configMAC_ADDR_ETH1; lw_notice("\r\n"); - lw_notice(" ETH1 IPv4 Address : %u.%u.%u.%u\r\n", ((u8_t *)&lwip_eth1_ipaddr)[0], ((u8_t *)&lwip_eth1_ipaddr)[1], - ((u8_t *)&lwip_eth1_ipaddr)[2], ((u8_t *)&lwip_eth1_ipaddr)[3]); - lw_notice(" ETH1 IPv4 Subnet mask : %u.%u.%u.%u\r\n", ((u8_t *)&lwip_eth1_netmask)[0], ((u8_t *)&lwip_eth1_netmask)[1], - ((u8_t *)&lwip_eth1_netmask)[2], ((u8_t *)&lwip_eth1_netmask)[3]); - lw_notice(" ETH1 IPv4 Gateway : %u.%u.%u.%u\r\n", ((u8_t *)&lwip_eth1_gwaddr)[0], ((u8_t *)&lwip_eth1_gwaddr)[1], - ((u8_t *)&lwip_eth1_gwaddr)[2], ((u8_t *)&lwip_eth1_gwaddr)[3]); + lw_notice(" ETH1 IPv4 Address : %u.%u.%u.%u\r\n", ((u8_t*)&lwip_eth1_ipaddr)[0], ((u8_t*)&lwip_eth1_ipaddr)[1], + ((u8_t*)&lwip_eth1_ipaddr)[2], ((u8_t*)&lwip_eth1_ipaddr)[3]); + lw_notice(" ETH1 IPv4 Subnet mask : %u.%u.%u.%u\r\n", ((u8_t*)&lwip_eth1_netmask)[0], ((u8_t*)&lwip_eth1_netmask)[1], + ((u8_t*)&lwip_eth1_netmask)[2], ((u8_t*)&lwip_eth1_netmask)[3]); + lw_notice(" ETH1 IPv4 Gateway : %u.%u.%u.%u\r\n", ((u8_t*)&lwip_eth1_gwaddr)[0], ((u8_t*)&lwip_eth1_gwaddr)[1], + ((u8_t*)&lwip_eth1_gwaddr)[2], ((u8_t*)&lwip_eth1_gwaddr)[3]); lw_notice(" ETH1 MAC Address : %x:%x:%x:%x:%x:%x\r\n", mac_addr1[0], mac_addr1[1], mac_addr1[2], mac_addr1[3], mac_addr1[4], mac_addr1[5]); } @@ -111,5 +125,4 @@ void LwipShowIPTask(int argc, char *argv[]) } SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0) | SHELL_CMD_TYPE(SHELL_TYPE_CMD_MAIN) | SHELL_CMD_PARAM_NUM(0), - showip, LwipShowIPTask, GetIp [IP] [Netmask] [Gateway]); - + showip, LwipShowIPTask, GetIp[IP][Netmask][Gateway]); diff --git a/Ubiquitous/XiZi_IIoT/resources/ethernet/netdev/Makefile b/Ubiquitous/XiZi_IIoT/resources/ethernet/netdev/Makefile new file mode 100644 index 000000000..6974c011c --- /dev/null +++ b/Ubiquitous/XiZi_IIoT/resources/ethernet/netdev/Makefile @@ -0,0 +1,4 @@ +SRC_FILES += netdev_register.c netdev_manipulate.c netdev_lowlevel.c + + +include $(KERNEL_ROOT)/compiler.mk \ No newline at end of file diff --git a/Ubiquitous/XiZi_IIoT/resources/ethernet/netdev/netdev_ipaddr_util.c b/Ubiquitous/XiZi_IIoT/resources/ethernet/netdev/netdev_ipaddr_util.c new file mode 100644 index 000000000..e69de29bb diff --git a/Ubiquitous/XiZi_IIoT/resources/ethernet/netdev/netdev_lowlevel.c b/Ubiquitous/XiZi_IIoT/resources/ethernet/netdev/netdev_lowlevel.c new file mode 100644 index 000000000..694fdcdbc --- /dev/null +++ b/Ubiquitous/XiZi_IIoT/resources/ethernet/netdev/netdev_lowlevel.c @@ -0,0 +1,220 @@ +#include +#include +#include + +/** + * This function will set network interface device IP address. + * @NOTE it can only be called in the network interface device driver. + * + * @param netdev the network interface device to change + * @param ip_addr the new IP address + */ +void netdev_low_level_set_ipaddr(struct netdev* netdev, const ip_addr_t* ip_addr) +{ + CHECK(ip_addr); + + if (netdev && ip_addr_cmp(&(netdev->ip_addr), ip_addr) == 0) { + ip_addr_copy(netdev->ip_addr, *ip_addr); + + /* execute IP address change callback function */ + if (netdev->addr_callback) { + netdev->addr_callback(netdev, NETDEV_CB_ADDR_IP); + } + } +} + +/** + * This function will set network interface device netmask address. + * @NOTE it can only be called in the network interface device driver. + * + * @param netdev the network interface device to change + * @param netmask the new netmask address + */ +void netdev_low_level_set_netmask(struct netdev* netdev, const ip_addr_t* netmask) +{ + CHECK(netmask); + + if (netdev && ip_addr_cmp(&(netdev->netmask), netmask) == 0) { + ip_addr_copy(netdev->netmask, *netmask); + + /* execute netmask address change callback function */ + if (netdev->addr_callback) { + netdev->addr_callback(netdev, NETDEV_CB_ADDR_NETMASK); + } + } +} + +/** + * This function will set network interface device gateway address. + * @NOTE it can only be called in the network interface device driver. + * + * @param netdev the network interface device to change + * @param gw the new gateway address + */ +void netdev_low_level_set_gw(struct netdev* netdev, const ip_addr_t* gw) +{ + CHECK(gw); + + if (netdev && ip_addr_cmp(&(netdev->gw), gw) == 0) { + ip_addr_copy(netdev->gw, *gw); + + /* execute gateway address change callback function */ + if (netdev->addr_callback) { + netdev->addr_callback(netdev, NETDEV_CB_ADDR_GATEWAY); + } + } +} + +/** + * This function will set network interface device DNS server address. + * @NOTE it can only be called in the network interface device driver. + * + * @param netdev the network interface device to change + * @param dns_num the number of the DNS server + * @param dns_server the new DNS server address + * + */ +void netdev_low_level_set_dns_server(struct netdev* netdev, uint8_t dns_num, const ip_addr_t* dns_server) +{ + unsigned int index; + + CHECK(dns_server); + + if (netdev == NULL) { + return; + } + /* check DNS servers is exist */ + for (index = 0; index < NETDEV_DNS_SERVERS_NUM; index++) { + if (ip_addr_cmp(&(netdev->dns_servers[index]), dns_server)) { + return; + } + } + + if (dns_num < NETDEV_DNS_SERVERS_NUM) { + ip_addr_copy(netdev->dns_servers[dns_num], *dns_server); + + /* execute DNS servers address change callback function */ + if (netdev->addr_callback) { + netdev->addr_callback(netdev, NETDEV_CB_ADDR_DNS_SERVER); + } + } +} + +/* Change to the first link_up network interface device automatically */ +static void netdev_auto_change_default(struct netdev* netdev) +{ + struct netdev* new_netdev = NULL; + + if (netdev->flags & NETDEV_FLAG_LINK_UP) { + if (!(NETDEV_DEFAULT->flags & NETDEV_FLAG_LINK_UP)) { + netdev_set_default(netdev); + } + return; + } + if (memcmp(netdev, NETDEV_DEFAULT, sizeof(struct netdev)) == 0) { + new_netdev = netdev_get_first_by_flags(NETDEV_FLAG_LINK_UP); + if (new_netdev) { + netdev_set_default(new_netdev); + } + } +} + +/** + * This function will set network interface device status. + * @NOTE it can only be called in the network interface device driver. + * + * @param netdev the network interface device to change + * @param is_up the new status + */ +void netdev_low_level_set_status(struct netdev* netdev, bool is_up) +{ + if (netdev && netdev_is_up(netdev) != is_up) { + if (is_up) { + netdev->flags |= NETDEV_FLAG_UP; + } else { + netdev->flags &= ~NETDEV_FLAG_UP; + + /* change to the first link_up network interface device automatically */ + netdev_auto_change_default(netdev); + } + + /* execute network interface device status change callback function */ + if (netdev->status_callback) { + netdev->status_callback(netdev, is_up ? NETDEV_CB_STATUS_UP : NETDEV_CB_STATUS_DOWN); + } + } +} + +/** + * This function will set network interface device active link status. + * @NOTE it can only be called in the network interface device driver. + * + * @param netdev the network interface device to change + * @param is_up the new link status + */ +void netdev_low_level_set_link_status(struct netdev* netdev, bool is_up) +{ + if (netdev && netdev_is_link_up(netdev) != is_up) { + if (is_up) { + netdev->flags |= NETDEV_FLAG_LINK_UP; + } else { + netdev->flags &= ~NETDEV_FLAG_LINK_UP; + + /* set network interface device flags to internet down */ + netdev->flags &= ~NETDEV_FLAG_INTERNET_UP; + + netdev_auto_change_default(netdev); + } + + /* execute link status change callback function */ + if (netdev->status_callback) { + netdev->status_callback(netdev, is_up ? NETDEV_CB_STATUS_LINK_UP : NETDEV_CB_STATUS_LINK_DOWN); + } + } +} + +/** + * This function will set network interface device active internet status. + * @NOTE it can only be called in the network interface device driver. + * + * @param netdev the network interface device to change + * @param is_up the new internet status + */ +void netdev_low_level_set_internet_status(struct netdev* netdev, bool is_up) +{ + if (netdev && netdev_is_internet_up(netdev) != is_up) { + if (is_up) { + netdev->flags |= NETDEV_FLAG_INTERNET_UP; + } else { + netdev->flags &= ~NETDEV_FLAG_INTERNET_UP; + } + + /* execute network interface device status change callback function */ + if (netdev->status_callback) { + netdev->status_callback(netdev, is_up ? NETDEV_CB_STATUS_INTERNET_UP : NETDEV_CB_STATUS_INTERNET_DOWN); + } + } +} + +/** + * This function will set network interface device DHCP status. + * @NOTE it can only be called in the network interface device driver. + * + * @param netdev the network interface device to change + * @param is_up the new DHCP status + */ +void netdev_low_level_set_dhcp_status(struct netdev* netdev, bool is_enable) +{ + if (netdev && netdev_is_dhcp_enabled(netdev) != is_enable) { + if (is_enable) { + netdev->flags |= NETDEV_FLAG_DHCP; + } else { + netdev->flags &= ~NETDEV_FLAG_DHCP; + } + + /* execute DHCP status change callback function */ + if (netdev->status_callback) { + netdev->status_callback(netdev, is_enable ? NETDEV_CB_STATUS_DHCP_ENABLE : NETDEV_CB_STATUS_DHCP_DISABLE); + } + } +} \ No newline at end of file diff --git a/Ubiquitous/XiZi_IIoT/resources/ethernet/netdev/netdev_manipulate.c b/Ubiquitous/XiZi_IIoT/resources/ethernet/netdev/netdev_manipulate.c new file mode 100644 index 000000000..450155d54 --- /dev/null +++ b/Ubiquitous/XiZi_IIoT/resources/ethernet/netdev/netdev_manipulate.c @@ -0,0 +1,288 @@ +#include +#include +#include +#include + +inline int netdev_check_set_addr_condition(struct netdev* netdev) +{ + if (NULL == netdev->ops || NULL == netdev->ops->set_addr_info) { + SYS_KDEBUG_LOG(NETDEV_DEBUG, ("The network interface device(%s) not support to set IP address.\n", netdev->name)); + return -ERROR; + } + + // check whether dhcp enabled + if (netdev_is_dhcp_enabled(netdev)) { + SYS_KDEBUG_LOG(NETDEV_DEBUG, ("The network interface device(%s) DHCP capability is enable, not support set IP address.\n", netdev->name)); + return -ERROR; + } + + return EOK; +} + +/** + * This function will set network interface device IP address. + * + * @param netdev the network interface device to change + * @param ip_addr the new IP address + * + * @return 0: set IP address successfully + * -1: set IP address failed + */ +int netdev_set_ipaddr(struct netdev* netdev, const ip_addr_t* ipaddr) +{ + CHECK(netdev); + CHECK(ipaddr); + + if (EOK != netdev_check_set_addr_condition(netdev)) { + return -ERROR; + } + + return netdev->ops->set_addr_info(netdev, (ip_addr_t*)ipaddr, NULL, NULL); +} + +/** + * This function will set network interface device netmask address. + * + * @param netdev the network interface device to change + * @param netmask the new netmask address + * + * @return 0: set netmask address successfully + * -1: set netmask address failed + */ +int netdev_set_netmask(struct netdev* netdev, const ip_addr_t* netmask) +{ + CHECK(netdev); + CHECK(netmask); + + if (EOK != netdev_check_set_addr_condition(netdev)) { + return -ERROR; + } + + return netdev->ops->set_addr_info(netdev, NULL, (ip_addr_t*)netmask, NULL); +} + +/** + * This function will set network interface device gateway address. + * + * @param netdev the network interface device to change + * @param gw the new gateway address + * + * @return 0: set gateway address successfully + * -1: set gateway address failed + */ +int netdev_set_gw(struct netdev* netdev, const ip_addr_t* gw) +{ + CHECK(netdev); + CHECK(gw); + + if (EOK != netdev_check_set_addr_condition(netdev)) { + return -ERROR; + } + + /* execute network interface device set gateway address operations */ + return netdev->ops->set_addr_info(netdev, NULL, NULL, (ip_addr_t*)gw); +} + +/** + * This function will set network interface device DNS server address. + * + * @param netdev the network interface device to change + * @param dns_num the number of the DNS server + * @param dns_server the new DNS server address + * + * @return 0: set netmask address successfully + * -1: set netmask address failed + */ +int netdev_set_dns_server(struct netdev* netdev, uint8_t dns_num, const ip_addr_t* dns_server) +{ + CHECK(netdev); + CHECK(dns_server); + + // check dns server number + if (dns_num >= NETDEV_DNS_SERVERS_NUM) { + SYS_KDEBUG_LOG(NETDEV_DEBUG, ("The number of DNS servers(%d) set exceeds the maximum number(%d).\n", dns_num + 1, NETDEV_DNS_SERVERS_NUM)); + return -ERROR; + } + + // check dns set function existence + if (NULL == netdev->ops || NULL == netdev->ops->set_dns_server) { + SYS_KDEBUG_LOG(NETDEV_DEBUG, ("The network interface device(%s) not support to set DNS server address.\n", netdev->name)); + return -ERROR; + } + + return netdev->ops->set_dns_server(netdev, dns_num, (ip_addr_t*)dns_server); +} + +/** + * This function will set callback to be called when the network interface device status has been changed. + * + * @param netdev the network interface device to change + * @param status_callback the callback be called when the status has been changed. + */ +void netdev_set_status_callback(struct netdev* netdev, netdev_callback_fn status_callback) +{ + CHECK(netdev); + CHECK(status_callback); + + netdev->status_callback = status_callback; +} + +/** + * This function will set callback to be called when the network interface device address has been changed. + * + * @param netdev the network interface device to change + * @param addr_callback the callback be called when the address has been changed. + */ +void netdev_set_addr_callback(struct netdev* netdev, netdev_callback_fn addr_callback) +{ + CHECK(netdev); + CHECK(addr_callback); + + netdev->addr_callback = addr_callback; +} + +/** + * This function will enable network interface device . + * + * @param netdev the network interface device to change + * + * @return 0: set status successfully + * -1: set status failed + */ +int netdev_set_up(struct netdev* netdev) +{ + CHECK(netdev); + + if (!netdev->ops || !netdev->ops->set_up) { + SYS_KDEBUG_LOG(NETDEV_DEBUG, ("The network interface device(%s) not support to set status.\n", netdev->name)); + return -ERROR; + } + + /* network interface device status flags check */ + if (netdev_is_up(netdev)) { + return EOK; + } + + /* execute enable network interface device operations by network interface device driver */ + return netdev->ops->set_up(netdev); +} + +/** + * This function will disable network interface device. + * + * @param netdev the network interface device to change + * + * @return 0: set status successfully + * -1: set sttaus failed + */ +int netdev_set_down(struct netdev* netdev) +{ + CHECK(netdev); + + if (!netdev->ops || !netdev->ops->set_down) { + SYS_KDEBUG_LOG(NETDEV_DEBUG, ("The network interface device(%s) not support to set status.\n", netdev->name)); + return -ERROR; + } + + /* network interface device status flags check */ + if (!netdev_is_up(netdev)) { + return EOK; + } + + /* execute disable network interface device operations by network interface driver */ + return netdev->ops->set_down(netdev); +} + +/** + * This function will get the first network interface device + * with the flags in network interface device list. + * + * @param flags the network interface device flags + * + * @return != NULL: network interface device object + * NULL: get failed + */ +struct netdev* netdev_get_first_by_flags(uint16_t flags) +{ + if (NETDEV_LISTHEAD == NULL) { + return NULL; + } + + // get netdev from list + x_base lock = DISABLE_INTERRUPT(); + struct netdev* current_dev = NETDEV_LISTHEAD; + SINGLE_LINKLIST_FOR_EACH_ENTRY(current_dev, &(NETDEV_LISTHEAD->list), list) + { + if (NULL != current_dev && 0 != (current_dev->flags & flags)) { + ENABLE_INTERRUPT(lock); + return current_dev; + } + } + ENABLE_INTERRUPT(lock); + + return NULL; +} + +/** + * This function will get the first network interface device + * in network interface device list by IP address. + * + * @param ip_addr the network interface device IP address + * + * @return != NULL: network interface device object + * NULL: get failed + */ +struct netdev* netdev_get_by_ipaddr(ip_addr_t* ip_addr) +{ + if (NETDEV_LISTHEAD == NULL) { + return NULL; + } + + // get netdev from list + x_base lock = DISABLE_INTERRUPT(); + struct netdev* current_dev = NETDEV_LISTHEAD; + SINGLE_LINKLIST_FOR_EACH_ENTRY(current_dev, &(NETDEV_LISTHEAD->list), list) + { + if (NULL != current_dev && ip_addr_cmp(&(current_dev->ip_addr), ip_addr)) { + ENABLE_INTERRUPT(lock); + return current_dev; + } + } + ENABLE_INTERRUPT(lock); + + return NULL; +} + +/** + * This function will get network interface device + * in network interface device list by netdev name. + * + * @param name the network interface device name + * + * @return != NULL: network interface device object + * NULL: get failed + */ +struct netdev* netdev_get_by_name(const char* name) +{ + if (NETDEV_LISTHEAD == NULL) { + return NULL; + } + + // get netdev from list + x_base lock = DISABLE_INTERRUPT(); + struct netdev* current_dev = NETDEV_LISTHEAD; + SINGLE_LINKLIST_FOR_EACH_ENTRY(current_dev, &(NETDEV_LISTHEAD->list), list) + { + if (NULL == current_dev) { + continue; + } + uint32_t name_len = strlen(current_dev->name); + if (NULL != current_dev && (strncmp(current_dev->name, name, strlen(current_dev->name) < NAME_NUM_MAX ? strlen(current_dev->name) : NAME_NUM_MAX) == 0)) { + ENABLE_INTERRUPT(lock); + return current_dev; + } + } + ENABLE_INTERRUPT(lock); + + return NULL; +} diff --git a/Ubiquitous/XiZi_IIoT/resources/ethernet/netdev/netdev_register.c b/Ubiquitous/XiZi_IIoT/resources/ethernet/netdev/netdev_register.c new file mode 100644 index 000000000..d4e855e09 --- /dev/null +++ b/Ubiquitous/XiZi_IIoT/resources/ethernet/netdev/netdev_register.c @@ -0,0 +1,184 @@ + +#include +#include +#include +#include +#include +#include +#include + +struct netdev** get_netdev_listhead() +{ + static struct netdev* netdev_listhead = NULL; + return &netdev_listhead; +} +struct netdev** get_default_netdev() +{ + static struct netdev* netdev_default = NULL; + return &netdev_default; +} +static netdev_callback_fn g_netdev_register_callback = NULL; +static netdev_callback_fn g_netdev_default_change_callback = NULL; + +int netdev_register(struct netdev* netdev, const char* name, void* user_data) +{ + CHECK(netdev != NULL); + CHECK(name != NULL); + + // set flag mask, assert network is down + uint16_t flag_mask = 0; + flag_mask = NETDEV_FLAG_UP | NETDEV_FLAG_LINK_UP | NETDEV_FLAG_INTERNET_UP | NETDEV_FLAG_DHCP; + netdev->flags &= ~flag_mask; + + // clear dev setting + ip_addr_set_zero(&(netdev->ip_addr)); + ip_addr_set_zero(&(netdev->netmask)); + ip_addr_set_zero(&(netdev->gw)); + + IP_SET_TYPE_VAL(netdev->ip_addr, IPADDR_TYPE_V4); + IP_SET_TYPE_VAL(netdev->netmask, IPADDR_TYPE_V4); + IP_SET_TYPE_VAL(netdev->gw, IPADDR_TYPE_V4); + +#if NETDEV_IPV6 + for (index = 0; index < NETDEV_IPV6_NUM_ADDRESSES; index++) { + ip_addr_set_zero(&(netdev->ip6_addr[index])); + IP_SET_TYPE_VAL(netdev->ip_addr, IPADDR_TYPE_V6); + } +#endif /* NETDEV_IPV6 */ + + // clear DNS servers + for (uint16_t idx = 0; idx < NETDEV_DNS_SERVERS_NUM; idx++) { + ip_addr_set_zero(&(netdev->dns_servers[idx])); + IP_SET_TYPE_VAL(netdev->ip_addr, IPADDR_TYPE_V4); + } + // clear callback fn + netdev->addr_callback = NULL; + netdev->status_callback = NULL; + + // validate name + uint32_t name_len = strlen(name); + if (name_len < NAME_NUM_MAX) { + strncpy(netdev->name, name, name_len); + netdev->name[name_len] = '\0'; + } else { + SYS_KDEBUG_LOG(NETDEV_DEBUG, ("[%s] name too long.\n", __func__)); + strncpy(netdev->name, name, NAME_NUM_MAX - 1); + netdev->name[NAME_NUM_MAX - 1] = '\0'; + } + + netdev->user_data = user_data; + + InitSingleLinkList(&(netdev->list)); + + // insert netdev to global list + x_base lock = DISABLE_INTERRUPT(); + if (NETDEV_LISTHEAD == NULL) { + NETDEV_LISTHEAD = netdev; + } else { + SingleLinkListNodeInsert(&(NETDEV_LISTHEAD->list), &(netdev->list)); + } + ENABLE_INTERRUPT(lock); + + if (NETDEV_DEFAULT == NULL) { + // set first met netdev to default netdev + netdev_set_default(NETDEV_LISTHEAD); + } + + if (g_netdev_register_callback) { + g_netdev_register_callback(netdev, NETDEV_CB_REGISTER); + } + + return EOK; +} + +/** + * This function will unregister network interface device and + * delete it from network interface device list. + * + * @param netdev the network interface device object + * + * @return 0: unregistered successfully + * -1: unregistered failed + */ +int netdev_unregister(struct netdev* netdev) +{ + CHECK(netdev); + + if (NETDEV_LISTHEAD == NULL) { + return -ERROR; + } + + // remove netdev from netdev list + x_base lock = DISABLE_INTERRUPT(); + struct netdev* current_dev = NETDEV_LISTHEAD; + SINGLE_LINKLIST_FOR_EACH_ENTRY(current_dev, &(NETDEV_LISTHEAD->list), list) + { + // found netdev in list + if (current_dev == netdev) { + if (NETDEV_LISTHEAD == current_dev && NULL == SingleLinkListGetNextNode(&(current_dev->list))) { + // netdev is the only one in list + NETDEV_LISTHEAD = NULL; + } else { + SingleLinkListRmNode(&(NETDEV_LISTHEAD->list), &(current_dev->list)); + } + + // deal default netdev + if (current_dev == NETDEV_DEFAULT) { + NETDEV_DEFAULT = NULL; + } + break; + } + } + ENABLE_INTERRUPT(lock); + + if (NETDEV_DEFAULT == NULL) { + netdev_set_default(NETDEV_LISTHEAD); + } + + // clean netdev if found one + if (current_dev == netdev) { + memset(netdev, 0, sizeof(*netdev)); + } + + return EOK; +} + +/** + * This function will set default network interface device. + * + * @param netdev the network interface device to change + */ +void netdev_set_default(struct netdev* netdev) +{ + if (netdev && (netdev != NETDEV_DEFAULT)) { + NETDEV_DEFAULT = netdev; + + // set default function + if (netdev->ops && netdev->ops->set_default) { + netdev->ops->set_default(netdev); + } + + // default change callback + if (g_netdev_default_change_callback) { + g_netdev_default_change_callback(netdev, NETDEV_CB_DEFAULT_CHANGE); + } + + SYS_KDEBUG_LOG(NETDEV_DEBUG, ("Setting default network interface device name(%s) successfully.\n", netdev->name)); + } +} + +/** + * This function will set register callback + * + * @param register_callback the network register callback + * + */ +void netdev_set_register_callback(netdev_callback_fn register_callback) +{ + g_netdev_register_callback = register_callback; +} + +void netdev_set_default_change_callback(netdev_callback_fn default_change_cb) +{ + g_netdev_default_change_callback = default_change_cb; +} \ No newline at end of file diff --git a/Ubiquitous/XiZi_IIoT/resources/include/netdev/netdev.h b/Ubiquitous/XiZi_IIoT/resources/include/netdev/netdev.h new file mode 100644 index 000000000..56cb1c02f --- /dev/null +++ b/Ubiquitous/XiZi_IIoT/resources/include/netdev/netdev.h @@ -0,0 +1,182 @@ + +#ifndef __NETDEV_H__ +#define __NETDEV_H__ + +#include +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#define NETDEV_DEBUG true + +#define NETDEV_DEBUG_PRINT_IP_INFO(ip, netmask, gw) \ + ("[%s %d]ip: %u.%u.%u.%u, netmask: %u.%u.%u.%u, gw: %u.%u.%u.%u\n", \ + __func__, __LINE__, \ + ((u8_t*)&ip)[0], ((u8_t*)&ip)[1], ((u8_t*)&ip)[2], ((u8_t*)&ip)[3], \ + ((u8_t*)&netmask)[0], ((u8_t*)&netmask)[1], ((u8_t*)&netmask)[2], ((u8_t*)&netmask)[3], \ + ((u8_t*)&gw)[0], ((u8_t*)&gw)[1], ((u8_t*)&gw)[2], ((u8_t*)&gw)[3]) + +/* the maximum of all used hardware address lengths */ +#ifndef NETDEV_HWADDR_MAX_LEN +#define NETDEV_HWADDR_MAX_LEN 8U +#endif + +/* the maximum of dns server number supported */ +#ifndef NETDEV_DNS_SERVERS_NUM +#define NETDEV_DNS_SERVERS_NUM 2U +#endif + +/* whether the network interface device is 'up' (set by the network interface driver or application) */ +#define NETDEV_FLAG_UP 0x01U +/* if set, the network interface device has broadcast capability, only supported in the 'lwIP' stack */ +#define NETDEV_FLAG_BROADCAST 0x02U +/* if set, the network interface device has an active link (set by the network interface driver) */ +#define NETDEV_FLAG_LINK_UP 0x04U +/* if set, the network interface device is an ethernet device using ARP, only supported in the 'lwIP' stack */ +#define NETDEV_FLAG_ETHARP 0x08U +/* if set, the network interface device is an ethernet device, only supported in the 'lwIP' stack */ +#define NETDEV_FLAG_ETHERNET 0x10U +/* if set, the network interface device has IGMP capability, only supported in the 'lwIP' stack */ +#define NETDEV_FLAG_IGMP 0x20U +/* if set, the network interface device has MLD6 capability, only supported in the 'lwIP' stack */ +#define NETDEV_FLAG_MLD6 0x40U +/* if set, the network interface device connected to internet successfully (set by the network interface driver) */ +#define NETDEV_FLAG_INTERNET_UP 0x80U +/* if set, the network interface device has DHCP capability (set by the network interface device driver or application) */ +#define NETDEV_FLAG_DHCP 0x100U + +enum netdev_cb_type { + NETDEV_CB_ADDR_IP, /* IP address */ + NETDEV_CB_ADDR_NETMASK, /* subnet mask */ + NETDEV_CB_ADDR_GATEWAY, /* netmask */ + NETDEV_CB_ADDR_DNS_SERVER, /* dns server */ + NETDEV_CB_STATUS_UP, /* changed to 'up' */ + NETDEV_CB_STATUS_DOWN, /* changed to 'down' */ + NETDEV_CB_STATUS_LINK_UP, /* changed to 'link up' */ + NETDEV_CB_STATUS_LINK_DOWN, /* changed to 'link down' */ + NETDEV_CB_STATUS_INTERNET_UP, /* changed to 'internet up' */ + NETDEV_CB_STATUS_INTERNET_DOWN, /* changed to 'internet down' */ + NETDEV_CB_STATUS_DHCP_ENABLE, /* enable DHCP capability */ + NETDEV_CB_STATUS_DHCP_DISABLE, /* disable DHCP capability */ + NETDEV_CB_REGISTER, /* netdev register */ + NETDEV_CB_DEFAULT_CHANGE, /* netdev default change */ +}; + +struct netdev; +typedef void (*netdev_callback_fn)(struct netdev* netdev, enum netdev_cb_type type); + +struct netdev_ops { + /* set network interface device hardware status operations */ + int (*set_up)(struct netdev* netdev); + int (*set_down)(struct netdev* netdev); + + /* set network interface device address information operations */ + int (*set_addr_info)(struct netdev* netdev, ip_addr_t* ip_addr, ip_addr_t* netmask, ip_addr_t* gw); + int (*set_dns_server)(struct netdev* netdev, uint8_t dns_num, ip_addr_t* dns_server); + int (*set_dhcp)(struct netdev* netdev, bool is_enabled); + +#ifdef RT_USING_FINSH + /* set network interface device common network interface device operations */ + int (*ping)(struct netdev* netdev, const char* host, size_t data_len, uint32_t timeout, struct netdev_ping_resp* ping_resp); + void (*netstat)(struct netdev* netdev); +#endif + + /* set default network interface device in current network stack*/ + int (*set_default)(struct netdev* netdev); +}; + +/* network interface device object */ +struct netdev { + SysSingleLinklistType list; + + char name[NAME_NUM_MAX]; /* network interface device name */ + ip_addr_t ip_addr; /* IP address */ + ip_addr_t netmask; /* subnet mask */ + ip_addr_t gw; /* gateway */ +#if NETDEV_IPV6 + ip_addr_t ip6_addr[NETDEV_IPV6_NUM_ADDRESSES]; /* array of IPv6 addresses */ +#endif /* NETDEV_IPV6 */ + ip_addr_t dns_servers[NETDEV_DNS_SERVERS_NUM]; /* DNS server */ + uint8_t hwaddr_len; /* hardware address length */ + uint8_t hwaddr[NETDEV_HWADDR_MAX_LEN]; /* hardware address */ + + uint16_t flags; /* network interface device status flag */ + uint16_t mtu; /* maximum transfer unit (in bytes) */ + const struct netdev_ops* ops; /* network interface device operations */ + + netdev_callback_fn status_callback; /* network interface device flags change callback */ + netdev_callback_fn addr_callback; /* network interface device address information change callback */ + +#ifdef RT_USING_SAL + void* sal_user_data; /* user-specific data for SAL */ +#endif /* RT_USING_SAL */ + void* user_data; /* user-specific data */ +}; + +// netdev global list +#define NETDEV_LISTHEAD (*get_netdev_listhead()) +#define NETDEV_DEFAULT (*get_default_netdev()) +extern struct netdev** get_netdev_listhead(); +extern struct netdev** get_default_netdev(); + +// netdev register functions: netdev_register.c +int netdev_register(struct netdev* netdev, const char* name, void* user_data); +int netdev_unregister(struct netdev* netdev); +void netdev_set_default(struct netdev* netdev); +void netdev_set_register_callback(netdev_callback_fn status_callback); +void netdev_set_default_change_callback(netdev_callback_fn default_change_cb); + +// netdev manipulate functions: netdev_manipulate.c +struct netdev* netdev_get_first_by_flags(uint16_t flags); +struct netdev* netdev_get_by_ipaddr(ip_addr_t* ip_addr); +struct netdev* netdev_get_by_name(const char* name); + +int netdev_set_ipaddr(struct netdev* netdev, const ip_addr_t* ipaddr); +int netdev_set_netmask(struct netdev* netdev, const ip_addr_t* netmask); +int netdev_set_gw(struct netdev* netdev, const ip_addr_t* gw); +int netdev_set_dns_server(struct netdev* netdev, uint8_t dns_num, const ip_addr_t* dns_server); + +void netdev_set_status_callback(struct netdev* netdev, netdev_callback_fn status_callback); +void netdev_set_addr_callback(struct netdev* netdev, netdev_callback_fn addr_callback); + +/* Set network interface device status */ +int netdev_set_up(struct netdev* netdev); +int netdev_set_down(struct netdev* netdev); +int netdev_dhcp_enabled(struct netdev* netdev, bool is_enabled); + +// low level functions which should only be called by net drivers +void netdev_low_level_set_ipaddr(struct netdev* netdev, const ip_addr_t* ipaddr); +void netdev_low_level_set_netmask(struct netdev* netdev, const ip_addr_t* netmask); +void netdev_low_level_set_gw(struct netdev* netdev, const ip_addr_t* gw); +void netdev_low_level_set_dns_server(struct netdev* netdev, uint8_t dns_num, const ip_addr_t* dns_server); +void netdev_low_level_set_status(struct netdev* netdev, bool is_up); +void netdev_low_level_set_link_status(struct netdev* netdev, bool is_up); +void netdev_low_level_set_internet_status(struct netdev* netdev, bool is_up); +void netdev_low_level_set_dhcp_status(struct netdev* netdev, bool is_enable); + +static inline bool netdev_is_dhcp_enabled(struct netdev* netdev) +{ + return (netdev->flags & NETDEV_FLAG_DHCP) ? true : false; +} +static inline bool netdev_is_up(struct netdev* netdev) +{ + return (netdev->flags & NETDEV_FLAG_UP) ? true : false; +} +static inline bool netdev_is_internet_up(struct netdev* netdev) +{ + return (netdev->flags & NETDEV_FLAG_INTERNET_UP) ? true : false; +} +static inline bool netdev_is_link_up(struct netdev* netdev) +{ + return (netdev->flags & NETDEV_FLAG_LINK_UP) ? true : false; +} + +#ifdef __cplusplus +} +#endif + +#endif \ No newline at end of file diff --git a/Ubiquitous/XiZi_IIoT/resources/include/netdev/netdev_ipaddr.h b/Ubiquitous/XiZi_IIoT/resources/include/netdev/netdev_ipaddr.h new file mode 100644 index 000000000..cdc129300 --- /dev/null +++ b/Ubiquitous/XiZi_IIoT/resources/include/netdev/netdev_ipaddr.h @@ -0,0 +1,124 @@ + +#ifndef LWIP_HDR_IP4_ADDR_H +#ifndef __NETDEV_IPADDR_H__ +#define __NETDEV_IPADDR_H__ + +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +// Currently using netdev ipv4 +#define NETDEV_IPV4 1 + +/* IP address types for use in ip_addr_t.type member */ +enum netdev_ip_addr_type { + /** IPv4 */ + IPADDR_TYPE_V4 = 0U, + /** IPv6 */ + IPADDR_TYPE_V6 = 6U, + /** IPv4+IPv6 ("dual-stack") */ + IPADDR_TYPE_ANY = 46U +}; + +#if (NETDEV_IPV4 && NETDEV_IPV6) /* Both IPV4 and IPV6 */ +// Todo +#elif NETDEV_IPV4 /* NETDEV_IPV4 */ + +#define IP_SET_TYPE_VAL(ipaddr, iptype) +#define IP_SET_TYPE(ipaddr, iptype) +#define IP_GET_TYPE(ipaddr) IPADDR_TYPE_V4 + +#define ip_addr_copy(dest, src) ip4_addr_copy(dest, src) +#define ip_addr_cmp(addr1, addr2) ip4_addr_cmp(addr1, addr2) +#define ip_addr_set(dest, src) ip4_addr_set(dest, src) +#define ip_addr_set_zero(ipaddr) ip4_addr_set_zero(ipaddr) +#define ip_addr_set_any(is_ipv6, ipaddr) ip4_addr_set_any(ipaddr) +#define ip_addr_isany_val(ipaddr) ip4_addr_isany_val(ipaddr) +#define ip_addr_isany(ipaddr) ip4_addr_isany(ipaddr) + +/* directly map this to the lwip internal functions */ +#define inet_addr(cp) netdev_ipaddr_addr(cp) +#define inet_aton(cp, addr) netdev_ip4addr_aton(cp, (ip4_addr_t*)addr) +#define inet_ntoa(addr) netdev_ip4addr_ntoa((const ip4_addr_t*)&(addr)) +#define inet_ntoa_r(addr, buf, buflen) netdev_ip4addr_ntoa_r((const ip4_addr_t*)&(addr), buf, buflen) + +#else /* NETDEV_IPV6 */ +// Todo +#endif /* NTDEV_IPV4 && NTDEV_IPV6 */ + +#ifdef NETDEV_IPV4 +/** IPv4 only: set the IP address given as an u32_t */ +#define ip4_addr_set_u32(dest_ipaddr, src_u32) ((dest_ipaddr)->addr = (src_u32)) +/** IPv4 only: get the IP address as an u32_t */ +#define ip4_addr_get_u32(src_ipaddr) ((src_ipaddr)->addr) + +/** 255.255.255.255 */ +#define IPADDR_NONE ((uint32_t)0xffffffffUL) +/** 127.0.0.1 */ +#define IPADDR_LOOPBACK ((uint32_t)0x7f000001UL) +/** 0.0.0.0 */ +#define IPADDR_ANY ((uint32_t)0x00000000UL) +/** 255.255.255.255 */ +#define IPADDR_BROADCAST ((uint32_t)0xffffffffUL) + +#define IP4ADDR_STRLEN_MAX 16 + +#if !defined(in_addr_t) && !defined(IN_ADDR_T_DEFINED) +typedef uint32_t in_addr_t; +#endif + +struct in_addr { + in_addr_t s_addr; +}; + +typedef struct ip4_addr { + uint32_t addr; +} ip4_addr_t; + +typedef ip4_addr_t ip_addr_t; + +/** Copy IP address - faster than ip4_addr_set: no NULL check */ +static inline void ip4_addr_copy(ip4_addr_t dest_addr, const ip4_addr_t src_addr) +{ + dest_addr.addr = src_addr.addr; +} +static inline bool ip4_addr_cmp(const ip4_addr_t* left_addr, const ip4_addr_t* right_addr) +{ + return left_addr->addr == right_addr->addr; +} +/** Safely copy one IP address to another (src may be NULL) */ +static inline void ip4_addr_set(ip4_addr_t* dest_addr, const ip4_addr_t* src_addr) +{ + dest_addr->addr = (src_addr == NULL) ? 0 : src_addr->addr; +} +/** Set complete address to zero */ +static inline void ip4_addr_set_zero(ip4_addr_t* ip4_addr) +{ + ip4_addr->addr = 0; +} +/** Set address to IPADDR_ANY (no need for htonl()) */ +static inline void ip4_addr_set_any(ip4_addr_t* ipaddr) +{ + ipaddr->addr = IPADDR_ANY; +} +static inline bool ip4_addr_isany_val(const ip4_addr_t ipaddr) +{ + return ipaddr.addr == IPADDR_ANY; +} +static inline bool ip4_addr_isany(const ip4_addr_t* ipaddr) +{ + return ipaddr == NULL || ip4_addr_isany_val(*ipaddr); +} + +#endif + +#ifdef __cplusplus +} +#endif + +#endif +#endif \ No newline at end of file diff --git a/Ubiquitous/XiZi_IIoT/tool/shell/letter-shell/cmd.c b/Ubiquitous/XiZi_IIoT/tool/shell/letter-shell/cmd.c index 82fd4eb6f..ff5e8f98d 100644 --- a/Ubiquitous/XiZi_IIoT/tool/shell/letter-shell/cmd.c +++ b/Ubiquitous/XiZi_IIoT/tool/shell/letter-shell/cmd.c @@ -98,7 +98,7 @@ long ShowTask(void) KPrintf("*************************************************************************************************\n"); #ifndef SCHED_POLICY_FIFO #ifdef ARCH_SMP - KPrintf(" STAT ID %-*.s PRI CORE STACK_DEPTH USED LEFT_TICKS ERROR_STAT\n", NAME_NUM_MAX, item_title); + KPrintf(" STAT ID %-*.s PRI CORE STACK_DEPTH USED LEFT_TICKS ERROR_STAT\n", _NUM_MAX, item_title); #else KPrintf(" STAT ID %-*.s PRI STACK_DEPTH USED LEFT_TICKS ERROR_STAT\n", NAME_NUM_MAX, item_title); #endif