From 0961379b8897da014730f54d254cda4887fb0541 Mon Sep 17 00:00:00 2001 From: huoyujia081 Date: Thu, 23 May 2024 17:08:49 +0800 Subject: [PATCH] Implement ch32v208rbt6 open shell normally Correct some errors and add incomplete network module: 1. modify interrupt_switch.S: update "SW_handler" to "SW_Handler". 2. modify link.ld: update memory to 144K+48K. 3. add TCP network module, but it still doesn't work. --- .../ch32v208rbt6/User/system_ch32v20x.c | 4 +- .../risc-v/ch32v208rbt6/interrupt_switch.S | 5 +- .../XiZi_IIoT/board/ch32v208rbt6/board.c | 22 +- .../XiZi_IIoT/board/ch32v208rbt6/board.h | 9 +- .../XiZi_IIoT/board/ch32v208rbt6/config.mk | 4 +- .../XiZi_IIoT/board/ch32v208rbt6/link.ld | 4 +- .../ch32v208rbt6/third_party_driver/Kconfig | 5 +- .../ch32v208rbt6/third_party_driver/Makefile | 4 +- .../Peripheral/inc/ch32v20x.h | 4 +- .../third_party_driver/ethernet/Makefile | 4 + .../ethernet/connect_ether.c | 269 +++++++ .../third_party_driver/ethernet/eth_driver.c | 745 ++++++++++++++++++ .../third_party_driver/ethernet/libwchnet.a | Bin 0 -> 222966 bytes .../third_party_driver/ethernet/test/Makefile | 4 + .../ethernet/test/wch_tcp_test.c | 47 ++ .../include/connect_ether.h | 42 + .../third_party_driver/include/eth_driver.h | 103 +++ .../third_party_driver/include/libwchnet.a | Bin 0 -> 223264 bytes .../third_party_driver/include/net_config.h | 167 ++++ .../third_party_driver/include/wchnet.h | 591 ++++++++++++++ .../XiZi_IIoT/kernel/memory/byte_manage.c | 4 + Ubiquitous/XiZi_IIoT/kernel/thread/init.c | 4 +- 22 files changed, 2019 insertions(+), 22 deletions(-) create mode 100755 Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/third_party_driver/ethernet/Makefile create mode 100644 Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/third_party_driver/ethernet/connect_ether.c create mode 100755 Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/third_party_driver/ethernet/eth_driver.c create mode 100644 Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/third_party_driver/ethernet/libwchnet.a create mode 100755 Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/third_party_driver/ethernet/test/Makefile create mode 100644 Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/third_party_driver/ethernet/test/wch_tcp_test.c create mode 100644 Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/third_party_driver/include/connect_ether.h create mode 100755 Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/third_party_driver/include/eth_driver.h create mode 100755 Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/third_party_driver/include/libwchnet.a create mode 100755 Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/third_party_driver/include/net_config.h create mode 100644 Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/third_party_driver/include/wchnet.h diff --git a/Ubiquitous/XiZi_IIoT/arch/risc-v/ch32v208rbt6/User/system_ch32v20x.c b/Ubiquitous/XiZi_IIoT/arch/risc-v/ch32v208rbt6/User/system_ch32v20x.c index 574b3a9ec..0b5283b76 100644 --- a/Ubiquitous/XiZi_IIoT/arch/risc-v/ch32v208rbt6/User/system_ch32v20x.c +++ b/Ubiquitous/XiZi_IIoT/arch/risc-v/ch32v208rbt6/User/system_ch32v20x.c @@ -29,8 +29,8 @@ //#define SYSCLK_FREQ_48MHz_HSI 48000000 //#define SYSCLK_FREQ_56MHz_HSI 56000000 //#define SYSCLK_FREQ_72MHz_HSI 72000000 -#define SYSCLK_FREQ_96MHz_HSI 96000000 -//#define SYSCLK_FREQ_120MHz_HSI 120000000 +// #define SYSCLK_FREQ_96MHz_HSI 96000000 +#define SYSCLK_FREQ_120MHz_HSI 120000000 //#define SYSCLK_FREQ_144MHz_HSI 144000000 /* Clock Definitions */ diff --git a/Ubiquitous/XiZi_IIoT/arch/risc-v/ch32v208rbt6/interrupt_switch.S b/Ubiquitous/XiZi_IIoT/arch/risc-v/ch32v208rbt6/interrupt_switch.S index e89fea31e..4d7b3cb3e 100644 --- a/Ubiquitous/XiZi_IIoT/arch/risc-v/ch32v208rbt6/interrupt_switch.S +++ b/Ubiquitous/XiZi_IIoT/arch/risc-v/ch32v208rbt6/interrupt_switch.S @@ -1,8 +1,8 @@ #include "cpuport.h" -.global SW_handler +.global SW_Handler .align 2 -SW_handler: +SW_Handler: /* save all from thread context */ #ifdef ARCH_RISCV_FPU addi sp, sp, -32 * FREGBYTES @@ -46,6 +46,7 @@ SW_handler: /* saved MPIE */ li t0, 0x80 STORE t0, 2 * REGBYTES(sp) + /* Temporarily disable HPE */ li t0, 0x20 diff --git a/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/board.c b/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/board.c index 28d97aa1a..c8f27cb02 100644 --- a/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/board.c +++ b/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/board.c @@ -31,17 +31,20 @@ #include "connect_uart.h" #include "core_riscv.h" #include "xsconfig.h" -#include +#include "board.h" #include #include #include +#include +#include "connect_ether.h" // core clock. extern uint32_t SystemCoreClock; static uint32_t _SysTick_Config(uint32_t ticks) { - NVIC_SetPriority(SysTicK_IRQn, 0xf0); + // SystemCoreClockUpdate(); + NVIC_SetPriority(SysTicK_IRQn, 1); NVIC_SetPriority(Software_IRQn, 0xf0); NVIC_EnableIRQ(SysTicK_IRQn); NVIC_EnableIRQ(Software_IRQn); @@ -52,7 +55,6 @@ static uint32_t _SysTick_Config(uint32_t ticks) SysTick->CTLR = 0xF; return 0; } - /** * This function will initial your board. */ @@ -64,13 +66,21 @@ void InitBoardHardware() /* initialize memory system */ InitBoardMemory(MEMORY_START_ADDRESS, (void*)MEMORY_END_ADDRESS); InitHwUart(); - InstallConsole("uart1", "uart1_drv", "uart1_dev1"); - + InstallConsole("uart1", SERIAL_DRV_NAME_1, SERIAL_1_DEVICE_NAME_0); +#ifdef BSP_USING_ETH + // InitHwEth(); +#endif KPrintf("consle init completed.\n"); KPrintf("board initialization......\n"); // KPrintf("memory address range: [0x%08x - 0x%08x], size: %d\n", (x_ubase) MEMORY_START_ADDRESS, (x_ubase) MEMORY_END_ADDRESS, gd32vf103_SRAM_SIZE); + KPrintf("memory address range: [0x%08x - 0x%08x] SRAM_SIZE: %d, ssize: %d\n", (x_ubase) MEMORY_START_ADDRESS, (x_ubase) MEMORY_END_ADDRESS, SRAM_SIZE, __stack_size); /* initialize memory system */ - + x_ubase dynamic_buddy_start = ALIGN_MEN_UP((x_ubase)MEMORY_START_ADDRESS, MM_PAGE_SIZE); + x_ubase dynamic_buddy_end = ALIGN_MEN_DOWN((x_ubase)MEMORY_END_ADDRESS, MM_PAGE_SIZE); + KPrintf("dynamic buddy address range: [0x%08x - 0x%08x]\n", dynamic_buddy_start, dynamic_buddy_end); + // memory address range: [0x20001440 - 0xcb0843e0] + // dynamic buddy address range: [0x20002000 - 0xcb084000] + ShowMemory(); KPrintf("board init done.\n"); KPrintf("start okernel...\n"); } diff --git a/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/board.h b/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/board.h index 0e6b6f9c0..874d047fb 100644 --- a/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/board.h +++ b/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/board.h @@ -36,13 +36,16 @@ Modification: #define ch32v20x_PIN_NUMBERS 48 /* board configuration */ -#define SRAM_SIZE 20 -#define SRAM_END (0x20000000 + SRAM_SIZE * 1024) +#define SRAM_SIZE 48 +#define EUSR_STACK_SIZE 2048 +// #define SRAM_END (0x20000000 + SRAM_SIZE * 0x400) +// #define SRAM_END (0x20008000) +#define SRAM_END (0x2000C000) extern int _ebss; extern int __stack_size; #define MEMORY_START_ADDRESS ((void *)&_ebss) -#define MEMORY_END_ADDRESS (SRAM_END-__stack_size) +#define MEMORY_END_ADDRESS (SRAM_END) void InitBoardHardware(void); diff --git a/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/config.mk b/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/config.mk index fd64cf9f0..0855c54f6 100755 --- a/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/config.mk +++ b/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/config.mk @@ -1,7 +1,7 @@ export CFLAGS := -march=rv32imac -mabi=ilp32 -msmall-data-limit=8 -msave-restore -Os -g export AFLAGS := -march=rv32imac -mabi=ilp32 -x assembler-with-cpp -ggdb -export LFLAGS := -march=rv32imac -mabi=ilp32 -nostartfiles -Wl,--gc-sections,-Map=XiZi-ch32v307vct6.map,-cref,-u,_start -T $(BSP_ROOT)/link.ld +export LFLAGS := -march=rv32imac -mabi=ilp32 -nostartfiles -Wl,--gc-sections,-Map=XiZi-ch32v208vct6.map,-cref,-u,_start -T $(BSP_ROOT)/link.ld # export CFLAGS := -march=rv32imacxw -mabi=ilp32 -msmall-data-limit=8 -msave-restore -Os -fmessage-length=0 -fsigned-char -ffunction-sections -fdata-sections -fno-common -g -std=gnu99 # export AFLAGS := -march=rv32imac -mabi=ilp32 -x assembler-with-cpp -ggdb @@ -15,6 +15,8 @@ export CROSS_COMPILE ?=/opt/riscv64-toolchain/bin/riscv64-unknown-elf- export DEFINES := -DHAVE_CCONFIG_H -DHAVE_SIGINFO +export LINK_WCH_NET := $(KERNEL_ROOT)/board/ch32v208rbt6/third_party_driver/ethernet/libwchnet.a + export ARCH = risc-v export MCU = CH32V208 diff --git a/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/link.ld b/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/link.ld index 4b3dfd6bd..112504256 100644 --- a/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/link.ld +++ b/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/link.ld @@ -26,8 +26,8 @@ MEMORY FLASH-144K + RAM-48K FLASH-160K + RAM-32K */ - FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 128K - RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 64K + FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 144K + RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 48K } diff --git a/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/third_party_driver/Kconfig b/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/third_party_driver/Kconfig index 21b27f1ea..aa3b10601 100755 --- a/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/third_party_driver/Kconfig +++ b/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/third_party_driver/Kconfig @@ -6,5 +6,8 @@ menuconfig BSP_USING_UART if BSP_USING_UART source "$BSP_DIR/third_party_driver/uart/Kconfig" endif - + +menuconfig BSP_USING_ETH + bool "Using Ethernet" + default y \ No newline at end of file diff --git a/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/third_party_driver/Makefile b/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/third_party_driver/Makefile index 94cb5f1a3..2fd2d3af4 100644 --- a/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/third_party_driver/Makefile +++ b/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/third_party_driver/Makefile @@ -4,5 +4,7 @@ SRC_DIR := Peripheral ifeq ($(CONFIG_BSP_USING_UART),y) SRC_DIR += uart endif - +ifeq ($(CONFIG_BSP_USING_ETH),y) + SRC_DIR += ethernet +endif include $(KERNEL_ROOT)/compiler.mk \ No newline at end of file diff --git a/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/third_party_driver/Peripheral/inc/ch32v20x.h b/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/third_party_driver/Peripheral/inc/ch32v20x.h index 621e488c7..30de07bd3 100644 --- a/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/third_party_driver/Peripheral/inc/ch32v20x.h +++ b/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/third_party_driver/Peripheral/inc/ch32v20x.h @@ -17,9 +17,9 @@ extern "C" { #endif #if !defined(CH32V20x_D8W) && !defined(CH32V20x_D8) && !defined(CH32V20x_D6) -#define CH32V20x_D6 /* CH32V203F6-CH32V203F8-CH32V203G6-CH32V203G8-CH32V203K6-CH32V203K8-CH32V203C6-CH32V203C8-CH32V203G8*/ +//#define CH32V20x_D6 /* CH32V203F6-CH32V203F8-CH32V203G6-CH32V203G8-CH32V203K6-CH32V203K8-CH32V203C6-CH32V203C8-CH32V203G8*/ //#define CH32V20x_D8 /* CH32V203RBT6 */ -//#define CH32V20x_D8W /* CH32V208 */ +#define CH32V20x_D8W /* CH32V208 */ #endif diff --git a/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/third_party_driver/ethernet/Makefile b/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/third_party_driver/ethernet/Makefile new file mode 100755 index 000000000..17b175216 --- /dev/null +++ b/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/third_party_driver/ethernet/Makefile @@ -0,0 +1,4 @@ +SRC_FILES := eth_driver.c connect_ether.c +SRC_DIR := test + +include $(KERNEL_ROOT)/compiler.mk diff --git a/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/third_party_driver/ethernet/connect_ether.c b/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/third_party_driver/ethernet/connect_ether.c new file mode 100644 index 000000000..0ee5fd80a --- /dev/null +++ b/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/third_party_driver/ethernet/connect_ether.c @@ -0,0 +1,269 @@ +/********************************** (C) COPYRIGHT ******************************* + * File Name : main.c + * Author : WCH + * Version : V1.0.0 + * Date : 2022/05/31 + * Description : Main program body. + ********************************************************************************* + * Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. + * Attention: This software (modified or not) and binary are used for + * microcontroller manufactured by Nanjing Qinheng Microelectronics. + *******************************************************************************/ +/* + *@Note +TCP Client example, demonstrating that TCP Client connects +to the server and receives data and then sends it back. +For details on the selection of engineering chips, +please refer to the "CH32V30x Evaluation Board Manual" under the CH32V307EVT\EVT\PUB folder. + */ + +#include "connect_ether.h" +#include "ch32v20x_rcc.h" +#include "ch32v20x_tim.h" +#include "core_riscv.h" +#include "eth_driver.h" +#include "string.h" +#include "xs_base.h" + +extern uint32_t SystemCoreClock; +#define KEEPALIVE_ENABLE 1 // Enable keep alive function + +uint8_t MACAddr[6]; // MAC address +uint8_t IPAddr[4] = { 192, 168, 1, 10 }; // IP address +uint8_t GWIPAddr[4] = { 192, 168, 1, 1 }; // Gateway IP address +uint8_t IPMask[4] = { 255, 255, 255, 0 }; // subnet mask + +uint8_t MyBuf[RECE_BUF_LEN]; +uint8_t socket[WCHNET_MAX_SOCKET_NUM]; // Save the currently connected socket +uint8_t SocketRecvBuf[WCHNET_MAX_SOCKET_NUM][RECE_BUF_LEN]; // socket receive buffer + +/********************************************************************* + * @fn mStopIfError + * + * @brief check if error. + * + * @param iError - error constants. + * + * @return none + */ +void mStopIfError(uint8_t iError) +{ + if (iError == WCHNET_ERR_SUCCESS) + return; + KPrintf("Error: %02X\r\n", (uint16_t)iError); +} + +/********************************************************************* + * @fn TIM2_Init + * + * @brief Initializes TIM2. + * + * @return none + */ +void TIM2_Init(void) +{ + TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure = { 0 }; + + RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); + + TIM_TimeBaseStructure.TIM_Period = SystemCoreClock / 1000000; + TIM_TimeBaseStructure.TIM_Prescaler = WCHNETTIMERPERIOD * 1000 - 1; + TIM_TimeBaseStructure.TIM_ClockDivision = 0; + TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; + TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); + TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE); + + TIM_Cmd(TIM2, ENABLE); + TIM_ClearITPendingBit(TIM2, TIM_IT_Update); + NVIC_EnableIRQ(TIM2_IRQn); +} + +/********************************************************************* + * @fn WCHNET_CreateTcpSocket + * + * @brief Create TCP Socket + * + * @return none + */ +void WCHNET_CreateTcpSocket(uint8_t* DESIP, uint16_t srcport, uint16_t desport, uint8_t* SocketId) +{ + uint8_t i; + SOCK_INF TmpSocketInf; + + memset((void*)&TmpSocketInf, 0, sizeof(SOCK_INF)); + memcpy((void*)TmpSocketInf.IPAddr, DESIP, 4); + TmpSocketInf.DesPort = desport; + TmpSocketInf.SourPort = srcport++; + TmpSocketInf.ProtoType = PROTO_TYPE_TCP; + TmpSocketInf.RecvBufLen = RECE_BUF_LEN; + i = WCHNET_SocketCreat(SocketId, &TmpSocketInf); + KPrintf("SocketId %d\r\n", *SocketId); + mStopIfError(i); + i = WCHNET_SocketConnect(*SocketId); // make a TCP connection + mStopIfError(i); +} + +/********************************************************************* + * @fn WCHNET_DataLoopback + * + * @brief Data loopback function. + * + * @param id - socket id. + * + * @return none + */ +void WCHNET_DataLoopback(uint8_t id) +{ + u32 len, totallen; + uint8_t *p = MyBuf, TransCnt = 255; + + len = WCHNET_SocketRecvLen(id, NULL); // query length + KPrintf("Receive Len = %d\r\n", len); + totallen = len; + WCHNET_SocketRecv(id, MyBuf, &len); // Read the data of the receive buffer into MyBuf + while (1) { + len = totallen; + WCHNET_SocketSend(id, p, &len); // Send the data + totallen -= len; // Subtract the sent length from the total length + p += len; // offset buffer pointer + if (!--TransCnt) + break; // Timeout exit + if (totallen) + continue; // If the data is not sent, continue to send + break; // After sending, exit + } +} + +/********************************************************************* + * @fn WCHNET_HandleSockInt + * + * @brief Socket Interrupt Handle + * + * @param socketid - socket id. + * intstat - interrupt status + * + * @return 0 or TIME_OUT + */ +int WCHNET_HandleSockInt(uint8_t socketid, uint8_t intstat) +{ + uint8_t i; + + if (intstat & SINT_STAT_RECV) // receive data + { + WCHNET_DataLoopback(socketid); // Data loopback + } + if (intstat & SINT_STAT_CONNECT) // connect successfully + { +#if KEEPALIVE_ENABLE + WCHNET_SocketSetKeepLive(socketid, ENABLE); +#endif + WCHNET_ModifyRecvBuf(socketid, (u32)SocketRecvBuf[socketid], RECE_BUF_LEN); + for (i = 0; i < WCHNET_MAX_SOCKET_NUM; i++) { + if (socket[i] == 0xff) { // save connected socket id + socket[i] = socketid; + break; + } + } + KPrintf("TCP Connect Success\r\n"); + KPrintf("socket id: %d\r\n", socket[i]); + } + if (intstat & SINT_STAT_DISCONNECT) // disconnect + { + for (i = 0; i < WCHNET_MAX_SOCKET_NUM; i++) { // delete disconnected socket id + if (socket[i] == socketid) { + socket[i] = 0xff; + break; + } + } + KPrintf("TCP Disconnect\r\n"); + } + if (intstat & SINT_STAT_TIM_OUT) // timeout disconnect + { + for (i = 0; i < WCHNET_MAX_SOCKET_NUM; i++) { // delete disconnected socket id + if (socket[i] == socketid) { + socket[i] = 0xff; + break; + } + } + KPrintf("TCP Timeout\r\n"); + return TIME_OUT; + } + return 0; +} + +/********************************************************************* + * @fn WCHNET_HandleGlobalInt + * + * @brief Global Interrupt Handle + * + * @return 0 or SockInt + */ +int WCHNET_HandleGlobalInt(void) +{ + uint8_t intstat; + uint16_t i; + uint8_t socketint; + + intstat = WCHNET_GetGlobalInt(); // get global interrupt flag + if (intstat & GINT_STAT_UNREACH) // Unreachable interrupt + { + KPrintf("GINT_STAT_UNREACH\r\n"); + } + if (intstat & GINT_STAT_IP_CONFLI) // IP conflict + { + KPrintf("GINT_STAT_IP_CONFLI\r\n"); + } + if (intstat & GINT_STAT_PHY_CHANGE) // PHY status change + { + i = WCHNET_GetPHYStatus(); + if (i & PHY_Linked_Status) + KPrintf("PHY Link Success\r\n"); + } + if (intstat & GINT_STAT_SOCKET) { // socket related interrupt + for (i = 0; i < WCHNET_MAX_SOCKET_NUM; i++) { + socketint = WCHNET_GetSocketInt(i); + if (socketint) { + return WCHNET_HandleSockInt(i, socketint); + } + } + } + return 0; +} + +uint8_t InitHwEth() +{ + uint8_t i = 0; + + KPrintf("net version:%x\n", WCHNET_GetVer()); + KPrintf("WCHNET_LIB_VER: %x\n", WCHNET_LIB_VER); + if (WCHNET_LIB_VER != WCHNET_GetVer()) { + KPrintf("version error.\n"); + } + + // WCHNET_GetMacAddr(MACAddr); // get the chip MAC address + KPrintf("mac addr:"); + for (i = 0; i < 6; i++) + KPrintf("%x ", MACAddr[i]); + KPrintf("\n"); + + // TIM2_Init(); + + i = ETH_LibInit(IPAddr, GWIPAddr, IPMask, MACAddr); // Ethernet library initialize + mStopIfError(i); + if (i == WCHNET_ERR_SUCCESS) + KPrintf("WCHNET_LibInit Success\r\n"); +#if KEEPALIVE_ENABLE // Configure keep alive parameters + { + struct _KEEP_CFG cfg; + + cfg.KLIdle = 20000; + cfg.KLIntvl = 15000; + cfg.KLCount = 9; + WCHNET_ConfigKeepLive(&cfg); + } +#endif + +// memset(socket, 0xff, WCHNET_MAX_SOCKET_NUM); + + return i; +} diff --git a/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/third_party_driver/ethernet/eth_driver.c b/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/third_party_driver/ethernet/eth_driver.c new file mode 100755 index 000000000..c6e95a9f7 --- /dev/null +++ b/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/third_party_driver/ethernet/eth_driver.c @@ -0,0 +1,745 @@ +/********************************** (C) COPYRIGHT ******************************* +* File Name : eth_driver.c +* Author : WCH +* Version : V1.3.0 +* Date : 2022/05/26 +* Description : eth program body. +********************************************************************************* +* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. +* Attention: This software (modified or not) and binary are used for +* microcontroller manufactured by Nanjing Qinheng Microelectronics. +*******************************************************************************/ +#include "string.h" +#include "eth_driver.h" + + __attribute__((__aligned__(4))) ETH_DMADESCTypeDef DMARxDscrTab[ETH_RXBUFNB]; /* MAC receive descriptor, 4-byte aligned*/ + __attribute__((__aligned__(4))) ETH_DMADESCTypeDef DMATxDscrTab[ETH_TXBUFNB]; /* MAC send descriptor, 4-byte aligned */ + + __attribute__((__aligned__(4))) uint8_t MACRxBuf[ETH_RXBUFNB*ETH_RX_BUF_SZE]; /* MAC receive buffer, 4-byte aligned */ + __attribute__((__aligned__(4))) uint8_t MACTxBuf[ETH_TXBUFNB*ETH_TX_BUF_SZE]; /* MAC send buffer, 4-byte aligned */ + +__attribute__((__aligned__(4))) SOCK_INF SocketInf[WCHNET_MAX_SOCKET_NUM]; /* Socket information table, 4-byte alignment */ +const uint16_t MemNum[8] = {WCHNET_NUM_IPRAW, + WCHNET_NUM_UDP, + WCHNET_NUM_TCP, + WCHNET_NUM_TCP_LISTEN, + WCHNET_NUM_TCP_SEG, + WCHNET_NUM_IP_REASSDATA, + WCHNET_NUM_PBUF, + WCHNET_NUM_POOL_BUF + }; +const uint16_t MemSize[8] = {WCHNET_MEM_ALIGN_SIZE(WCHNET_SIZE_IPRAW_PCB), + WCHNET_MEM_ALIGN_SIZE(WCHNET_SIZE_UDP_PCB), + WCHNET_MEM_ALIGN_SIZE(WCHNET_SIZE_TCP_PCB), + WCHNET_MEM_ALIGN_SIZE(WCHNET_SIZE_TCP_PCB_LISTEN), + WCHNET_MEM_ALIGN_SIZE(WCHNET_SIZE_TCP_SEG), + WCHNET_MEM_ALIGN_SIZE(WCHNET_SIZE_IP_REASSDATA), + WCHNET_MEM_ALIGN_SIZE(WCHNET_SIZE_PBUF), + WCHNET_MEM_ALIGN_SIZE(WCHNET_SIZE_PBUF) + WCHNET_MEM_ALIGN_SIZE(WCHNET_SIZE_POOL_BUF) + }; + __attribute__((__aligned__(4)))uint8_t Memp_Memory[WCHNET_MEMP_SIZE]; + __attribute__((__aligned__(4)))uint8_t Mem_Heap_Memory[WCHNET_RAM_HEAP_SIZE]; + __attribute__((__aligned__(4)))uint8_t Mem_ArpTable[WCHNET_RAM_ARP_TABLE_SIZE]; + +uint32_t volatile LocalTime; +ETH_DMADESCTypeDef *DMATxDescToSet; +ETH_DMADESCTypeDef *DMARxDescToGet; +ETH_DMADESCTypeDef *pDMARxSet; + +volatile uint8_t phyLinkReset; +volatile uint32_t phyLinkTime; +uint8_t phyPN = 0x01; +uint8_t phyStatus = 0; +uint8_t phySucCnt = 0; +uint8_t phyLinkCnt = 0; +uint8_t phyRetryCnt = 0; +uint8_t CRCErrPktCnt = 0; +uint8_t phyLinkStatus = 0; +uint8_t phyPNChangeCnt = 0; +uint8_t PhyPolarityDetect = 0; +/********************************************************************* + * @fn WCHNET_GetMacAddr + * + * @brief Get MAC address + * + * @return none. + */ +void WCHNET_GetMacAddr( uint8_t *p ) +{ + uint8_t i; + uint8_t *macaddr=(uint8_t *)(ROM_CFG_USERADR_ID+5); + + for(i=0;i<6;i++) + { + *p = *macaddr; + p++; + macaddr--; + } +} + +/********************************************************************* + * @fn WCHNET_TimeIsr + * + * @brief + * + * @return none. + */ +void WCHNET_TimeIsr( uint16_t timperiod ) +{ + LocalTime += timperiod; +} + +/********************************************************************* + * @fn WritePHYReg + * + * @brief MCU write PHY register. + * + * @param reg_add - PHY address, + * reg_val - value you want to write. + * + * @return none + */ +void WritePHYReg(uint8_t reg_add,uint16_t reg_val) +{ + R32_ETH_MIWR = (reg_add & RB_ETH_MIREGADR_MIRDL) | (1<<8) | (reg_val<<16); +} + +/********************************************************************* + * @fn ReadPHYReg + * + * @brief MCU read PHY register. + * + * @param reg_add - PHY address. + * + * @return value you want to get. + */ +uint16_t ReadPHYReg(uint8_t reg_add) +{ + R8_ETH_MIREGADR = reg_add; // write address + return R16_ETH_MIRD; // get data +} + +/********************************************************************* + * @fn WCHNET_LinkProcess + * + * @brief link process. + * + * @param none. + * + * @return none. + */ +void WCHNET_LinkProcess( void ) +{ + uint16_t phy_anlpar, phy_bmcr, phy_bmsr; + + phy_anlpar = ReadPHYReg(PHY_ANLPAR); + phy_bmsr = ReadPHYReg(PHY_BMSR); + + if(phy_anlpar&PHY_ANLPAR_SELECTOR_FIELD) + { + if( !(phyLinkStatus&PHY_LINK_WAIT_SUC) ) + { + if( (phyPN&0x0C) == PHY_PN_SWITCH_P ) + { + phySucCnt = 0; + phyLinkCnt = 0; + phyLinkStatus = PHY_LINK_WAIT_SUC; + } + else + { + if( !(phyLinkStatus&PHY_LINK_SUC_N) ) + { + phyRetryCnt = 0; + phyLinkStatus |= PHY_LINK_SUC_N; + phyPN &= ~PHY_PN_SWITCH_N; + phy_bmcr = ReadPHYReg(PHY_BMCR); + phy_bmcr |= 1<<9; + WritePHYReg(PHY_BMCR, phy_bmcr); + WritePHYReg(PHY_MDIX, phyPN); + } + else + { + phySucCnt = 0; + phyLinkCnt = 0; + phyLinkStatus = PHY_LINK_WAIT_SUC; + } + } + } + else{ + if((phySucCnt++ == 5) && ((phy_bmsr&PHY_AutoNego_Complete) == 0)) + { + phySucCnt = 0; + phyRetryCnt = 0; + phyPNChangeCnt = 0; + phyLinkStatus = PHY_LINK_INIT; + phy_bmcr = ReadPHYReg(PHY_BMCR); + phy_bmcr |= 1<<9; + WritePHYReg(PHY_BMCR, phy_bmcr); + if((phyPN&0x0C) == PHY_PN_SWITCH_P) + { + phyPN |= PHY_PN_SWITCH_N; + } + else { + phyPN &= ~PHY_PN_SWITCH_N; + } + WritePHYReg(PHY_MDIX, phyPN); + } + } + } + else + { + if(phy_bmsr & PHY_AutoNego_Complete) + { + phySucCnt = 0; + phyLinkCnt = 0; + phyLinkStatus = PHY_LINK_WAIT_SUC; + } + else { + if( phyLinkStatus == PHY_LINK_WAIT_SUC ) + { + if(phyLinkCnt++ == 10) + { + phyLinkCnt = 0; + phyRetryCnt = 0; + phyPNChangeCnt = 0; + phyLinkStatus = PHY_LINK_INIT; + } + } + else if(phyLinkStatus == PHY_LINK_INIT) + { + if(phyPNChangeCnt++ == 10) + { + phyPNChangeCnt = 0; + phyPN = ReadPHYReg(PHY_MDIX); + phyPN &= ~0x0c; + phyPN ^= 0x03; + WritePHYReg(PHY_MDIX, phyPN); + } + else{ + if((phyPN&0x0C) == PHY_PN_SWITCH_P) + { + phyPN |= PHY_PN_SWITCH_N; + } + else { + phyPN &= ~PHY_PN_SWITCH_N; + } + WritePHYReg(PHY_MDIX, phyPN); + } + } + else if(phyLinkStatus == PHY_LINK_SUC_N) + { + if((phyPN&0x0C) == PHY_PN_SWITCH_P) + { + phyPN |= PHY_PN_SWITCH_N; + phy_bmcr = ReadPHYReg(PHY_BMCR); + phy_bmcr |= 1<<9; + WritePHYReg(PHY_BMCR, phy_bmcr); + Delay_Us(10); + WritePHYReg(PHY_MDIX, phyPN); + } + else{ + if(phyRetryCnt++ == 15) + { + phyRetryCnt = 0; + phyPNChangeCnt = 0; + phyLinkStatus = PHY_LINK_INIT; + } + } + } + } + } +} + +/********************************************************************* + * @fn WCHNET_PhyPNProcess + * + * @brief Phy PN Polarity related processing + * + * @param none. + * + * @return none. + */ +void WCHNET_PhyPNProcess(void) +{ + uint32_t PhyVal; + + phyLinkTime = LocalTime; + if(CRCErrPktCnt >= 3) + { + PhyVal = ReadPHYReg(PHY_MDIX); + if((PhyVal >> 2) & 0x01) + PhyVal &= ~(3 << 2); //change PHY PN Polarity to normal + else + PhyVal |= 1 << 2; //change PHY PN Polarity to reverse + WritePHYReg(PHY_MDIX, PhyVal); + CRCErrPktCnt = 0; + } +} + +/********************************************************************* + * @fn WCHNET_HandlePhyNegotiation + * + * @brief Handle PHY Negotiation. + * + * @param none. + * + * @return none. + */ +void WCHNET_HandlePhyNegotiation(void) +{ + if(phyLinkReset) /* After the PHY link is disconnected, wait 500ms before turning on the PHY clock*/ + { + if( LocalTime - phyLinkTime >= 500 ) + { + phyLinkReset = 0; + EXTEN->EXTEN_CTR |= EXTEN_ETH_10M_EN; + WritePHYReg(PHY_BMCR, PHY_Reset); + PHY_NEGOTIATION_PARAM_INIT(); + } + } + else + { + if( !phyStatus ) /* Handling PHY Negotiation Exceptions */ + { + if( LocalTime - phyLinkTime >= PHY_LINK_TASK_PERIOD ) /* 50ms cycle timing call */ + { + phyLinkTime = LocalTime; + WCHNET_LinkProcess( ); + } + } + else{ + if(PhyPolarityDetect) + { + if( LocalTime - phyLinkTime >= 2 * PHY_LINK_TASK_PERIOD ) + { + WCHNET_PhyPNProcess(); + } + } + } + } +} + +/********************************************************************* + * @fn WCHNET_MainTask + * + * @brief library main task function + * + * @return none. + */ +void WCHNET_MainTask(void) +{ + WCHNET_NetInput( ); /* Ethernet data input */ + WCHNET_PeriodicHandle( ); /* Protocol stack time-related task processing */ + WCHNET_HandlePhyNegotiation( ); +} + +/********************************************************************* + * @fn ETH_LedLinkSet + * + * @brief set eth link led,setbit 0 or 1,the link led turn on or turn off + * + * @return none + */ +void ETH_LedLinkSet( uint8_t mode ) +{ + if( mode == LED_OFF ) + { + GPIO_SetBits(GPIOC, GPIO_Pin_0); + } + else + { + GPIO_ResetBits(GPIOC, GPIO_Pin_0); + } +} + +/********************************************************************* + * @fn ETH_LedDataSet + * + * @brief set eth data led,setbit 0 or 1,the data led turn on or turn off + * + * @return none + */ +void ETH_LedDataSet( uint8_t mode ) +{ + if( mode == LED_OFF ) + { + GPIO_SetBits(GPIOC, GPIO_Pin_1); + } + else + { + GPIO_ResetBits(GPIOC, GPIO_Pin_1); + } +} + +/********************************************************************* + * @fn ETH_LedConfiguration + * + * @brief set eth data and link led pin + * + * @return none + */ +void ETH_LedConfiguration(void) +{ + GPIO_InitTypeDef GPIO={0}; + + RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE); + GPIO.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1; + GPIO.GPIO_Mode = GPIO_Mode_Out_PP; + GPIO.GPIO_Speed = GPIO_Speed_50MHz; + GPIO_Init(GPIOC,&GPIO); + ETH_LedDataSet(LED_OFF); + ETH_LedLinkSet(LED_OFF); +} + +/********************************************************************* + * @fn ETH_DMATxDescChainInit + * + * @brief Initializes the DMA Tx descriptors in chain mode. + * + * @param DMATxDescTab - Pointer on the first Tx desc list + * TxBuff - Pointer on the first TxBuffer list + * TxBuffCount - Number of the used Tx desc in the list + * + * @return none + */ +void ETH_DMATxDescChainInit(ETH_DMADESCTypeDef *DMATxDescTab, uint8_t *TxBuff, uint32_t TxBuffCount) +{ + ETH_DMADESCTypeDef *DMATxDesc; + + DMATxDescToSet = DMATxDescTab; + DMATxDesc = DMATxDescTab; + DMATxDesc->Status = 0; + DMATxDesc->Buffer1Addr = (uint32_t)TxBuff; + DMATxDesc->Buffer2NextDescAddr = (uint32_t)DMATxDescTab; +} + +/********************************************************************* + * @fn ETH_DMARxDescChainInit + * + * @brief Initializes the DMA Rx descriptors in chain mode. + * + * @param DMARxDescTab - Pointer on the first Rx desc list. + * RxBuff - Pointer on the first RxBuffer list. + * RxBuffCount - Number of the used Rx desc in the list. + * + * @return none + */ +void ETH_DMARxDescChainInit(ETH_DMADESCTypeDef *DMARxDescTab, uint8_t *RxBuff, uint32_t RxBuffCount) +{ + uint8_t i = 0; + ETH_DMADESCTypeDef *DMARxDesc; + + DMARxDescToGet = DMARxDescTab; + for(i = 0; i < RxBuffCount; i++) + { + DMARxDesc = DMARxDescTab + i; + DMARxDesc->Status = ETH_DMARxDesc_OWN; + DMARxDesc->Buffer1Addr = (uint32_t)(&RxBuff[i * ETH_MAX_PACKET_SIZE]); + + if(i < (RxBuffCount - 1)) + { + DMARxDesc->Buffer2NextDescAddr = (uint32_t)(DMARxDescTab + i + 1); + } + else + { + DMARxDesc->Buffer2NextDescAddr = (uint32_t)(DMARxDescTab); + } + } +} + +/********************************************************************* + * @fn ETH_Start + * + * @brief Enables ENET MAC and DMA reception/transmission. + * + * @return none + */ +void ETH_Start(void) +{ + R16_ETH_ERXST = DMARxDescToGet->Buffer1Addr; + R8_ETH_ECON1 |= RB_ETH_ECON1_RXEN; //receive enable +} + +/********************************************************************* + * @fn ETH_SetClock + * + * @brief Set ETH Clock(60MHz). + * + * @return none + */ +void ETH_SetClock(void) +{ + /* ETH initialization */ + RCC_ETHDIVConfig(RCC_ETHCLK_Div2); // 120M/2 = 60MHz +} + +/********************************************************************* + * @fn ETH_Configuration + * + * @brief Ethernet configure. + * + * @return none + */ +void ETH_Configuration( uint8_t *macAddr ) +{ + ETH_SetClock( ); + R8_ETH_EIE = 0; + R8_ETH_EIE |= RB_ETH_EIE_INTIE | + RB_ETH_EIE_RXIE| + RB_ETH_EIE_LINKIE| + RB_ETH_EIE_TXIE | + RB_ETH_EIE_TXERIE| + RB_ETH_EIE_RXERIE; //Turn on all interrupts + + R8_ETH_EIE |= RB_ETH_EIE_R_EN50; //Turn on 50 ohm pull-up + + R8_ETH_EIR = 0xff; //clear interrupt flag + R8_ETH_ESTAT |= RB_ETH_ESTAT_INT | RB_ETH_ESTAT_BUFER; //clear state + + R8_ETH_ECON1 |= (RB_ETH_ECON1_TXRST|RB_ETH_ECON1_RXRST); //Transceiver module reset + R8_ETH_ECON1 &= ~(RB_ETH_ECON1_TXRST|RB_ETH_ECON1_RXRST); + + //Filter mode, received packet type + R8_ETH_ERXFCON = 0; + R8_ETH_MAADRL1 = macAddr[5]; // MAC assignment + R8_ETH_MAADRL2 = macAddr[4]; + R8_ETH_MAADRL3 = macAddr[3]; + R8_ETH_MAADRL4 = macAddr[2]; + R8_ETH_MAADRL5 = macAddr[1]; + R8_ETH_MAADRL6 = macAddr[0]; + + //Filter mode, limit packet type + R8_ETH_MACON1 |= RB_ETH_MACON1_MARXEN; //MAC receive enable + R8_ETH_MACON2 &= ~RB_ETH_MACON2_PADCFG; + R8_ETH_MACON2 |= PADCFG_AUTO_3; //All short packets are automatically padded to 60 bytes + R8_ETH_MACON2 |= RB_ETH_MACON2_TXCRCEN; //Hardware padded CRC + R8_ETH_MACON2 &= ~RB_ETH_MACON2_HFRMEN; //Jumbo frames are not received + R8_ETH_MACON2 |= RB_ETH_MACON2_FULDPX; + R16_ETH_MAMXFL = ETH_MAX_PACKET_SIZE; + R8_ETH_ECON2 &= ~(0x07 << 1); + R8_ETH_ECON2 |= 5 << 1; + + EXTEN->EXTEN_CTR |= EXTEN_ETH_10M_EN; +} + +/********************************************************************* + * @fn ETH_TxPktChainMode + * + * @brief Ethernet sends data frames in chain mode. + * + * @param len Send data length + * pBuff send buffer pointer + * + * @return Send status. + */ +uint32_t ETH_TxPktChainMode(uint16_t len, uint32_t *pBuff ) +{ + /* Check if the descriptor is owned by the ETHERNET DMA (when set) or CPU (when reset) */ + if( DMATxDescToSet->Status & ETH_DMATxDesc_OWN ) + { + /* Return ERROR: OWN bit set */ + return ETH_ERROR; + } + DMATxDescToSet->Status |= ETH_DMATxDesc_OWN; + R16_ETH_ETXLN = len; + R16_ETH_ETXST = (uint32_t)pBuff; + R8_ETH_ECON1 |= RB_ETH_ECON1_TXRTS; //start sending + /* Update the ETHERNET DMA global Tx descriptor with next Tx descriptor */ + /* Chained Mode */ + /* Selects the next DMA Tx descriptor list for next buffer to send */ + DMATxDescToSet = (ETH_DMADESCTypeDef*) (DMATxDescToSet->Buffer2NextDescAddr); + /* Return SUCCESS */ + return ETH_SUCCESS; +} + +/********************************************************************* + * @fn ETH_LinkUpCfg + * + * @brief When the PHY is connected, configure the relevant functions. + * + * @param regval BMSR register value + * + * @return none. + */ +void ETH_LinkUpCfg(uint16_t regval) +{ + WCHNET_PhyStatus( regval ); + /* Receive CRC error packets */ + R8_ETH_ERXFCON |= RB_ETH_ERXFCON_CRCEN; + CRCErrPktCnt = 0; + PhyPolarityDetect = 1; + phyLinkTime = LocalTime; + phyStatus = PHY_Linked_Status; + ETH_Start( ); +} + +/********************************************************************* + * @fn ETH_LinkDownCfg + * + * @brief When the PHY is disconnected, configure the relevant functions. + * + * @param regval BMSR register value + * + * @return none. + */ +void ETH_LinkDownCfg(uint16_t regval) +{ + WCHNET_PhyStatus( regval ); + EXTEN->EXTEN_CTR &= ~EXTEN_ETH_10M_EN; + phyLinkReset = 1; + phyLinkTime = LocalTime; +} + +/********************************************************************* + * @fn ETH_PHYLink + * + * @brief + * + * @return none + */ +void ETH_PHYLink( void ) +{ + u16 phy_bsr, phy_anlpar; + + phy_bsr = ReadPHYReg(PHY_BMSR); + phy_anlpar = ReadPHYReg(PHY_ANLPAR); + + if(phy_bsr & PHY_Linked_Status) //Valid link established + { + if(phy_bsr & PHY_AutoNego_Complete) //Auto-negotiation completed -- LinkUp + { + ETH_LinkUpCfg(phy_bsr); + } + else { + if(phy_anlpar == 0) //The auto-negotiation signal of the peer device is not obtained + { + WritePHYReg(PHY_BMCR, PHY_Reset); + PHY_NEGOTIATION_PARAM_INIT(); + } + else { + ETH_LinkDownCfg(phy_bsr); + } + } + } + else { //LinkDown + ETH_LinkDownCfg(phy_bsr); + } +} + +/********************************************************************* + * @fn WCHNET_ETHIsr + * + * @brief + * + * @return none + */ +void WCHNET_ETHIsr( void ) +{ + uint8_t eth_irq_flag, estat_regval; + + eth_irq_flag = R8_ETH_EIR; + if(eth_irq_flag&RB_ETH_EIR_RXIF) //Receive complete + { + R8_ETH_EIR = RB_ETH_EIR_RXIF; + /* Check if the descriptor is owned by the ETHERNET DMA */ + if( DMARxDescToGet->Status & ETH_DMARxDesc_OWN ) + { + estat_regval = R8_ETH_ESTAT; + if(estat_regval & \ + (RB_ETH_ESTAT_BUFER | RB_ETH_ESTAT_RXCRCER | RB_ETH_ESTAT_RXNIBBLE | RB_ETH_ESTAT_RXMORE)) + { + return; + } + if( ((ETH_DMADESCTypeDef*)(DMARxDescToGet->Buffer2NextDescAddr))->Status& ETH_DMARxDesc_OWN ) + { + DMARxDescToGet->Status &= ~ETH_DMARxDesc_OWN; + DMARxDescToGet->Status &= ~ETH_DMARxDesc_ES; + DMARxDescToGet->Status |= (ETH_DMARxDesc_FS|ETH_DMARxDesc_LS); + DMARxDescToGet->Status &= ~ETH_DMARxDesc_FL; + DMARxDescToGet->Status |= ((R16_ETH_ERXLN+4)<Buffer2NextDescAddr); + R16_ETH_ERXST = DMARxDescToGet->Buffer1Addr; + } + } + if(PhyPolarityDetect) + { + PhyPolarityDetect = 0; + /* Discard CRC error packet */ + R8_ETH_ERXFCON &= ~RB_ETH_ERXFCON_CRCEN; + } + } + if(eth_irq_flag&RB_ETH_EIR_TXIF) //send completed + { + DMATxDescToSet->Status &= ~ETH_DMATxDesc_OWN; + R8_ETH_EIR = RB_ETH_EIR_TXIF; + } + if(eth_irq_flag&RB_ETH_EIR_LINKIF) //Link change + { + ETH_PHYLink(); + R8_ETH_EIR = RB_ETH_EIR_LINKIF; + } + if(eth_irq_flag&RB_ETH_EIR_TXERIF) //send error + { + DMATxDescToSet->Status &= ~ETH_DMATxDesc_OWN; + R8_ETH_EIR = RB_ETH_EIR_TXERIF; + } + if(eth_irq_flag&RB_ETH_EIR_RXERIF) //receive error + { + if(PhyPolarityDetect) CRCErrPktCnt++; + R8_ETH_EIR = RB_ETH_EIR_RXERIF; + } +} + +/********************************************************************* + * @fn ETH_Init + * + * @brief Ethernet initialization. + * + * @return none + */ +void ETH_Init( uint8_t *macAddr ) +{ + ETH_LedConfiguration( ); + Delay_Ms(100); + ETH_Configuration( macAddr ); + ETH_DMATxDescChainInit(DMATxDscrTab, MACTxBuf, ETH_TXBUFNB); + ETH_DMARxDescChainInit(DMARxDscrTab, MACRxBuf, ETH_RXBUFNB); + pDMARxSet = DMARxDscrTab; + NVIC_EnableIRQ(ETH_IRQn); +} + +/********************************************************************* + * @fn ETH_LibInit + * + * @brief Ethernet library initialization program + * + * @return command status + */ +uint8_t ETH_LibInit( uint8_t *ip, uint8_t *gwip, uint8_t *mask, uint8_t *macaddr ) +{ + uint8_t s; + struct _WCH_CFG cfg; + + memset(&cfg,0,sizeof(cfg)); + cfg.TxBufSize = ETH_TX_BUF_SZE; + cfg.TCPMss = WCHNET_TCP_MSS; + cfg.HeapSize = WCHNET_MEM_HEAP_SIZE; + cfg.ARPTableNum = WCHNET_NUM_ARP_TABLE; + cfg.MiscConfig0 = WCHNET_MISC_CONFIG0; + cfg.MiscConfig1 = WCHNET_MISC_CONFIG1; + cfg.led_link = ETH_LedLinkSet; + cfg.led_data = ETH_LedDataSet; + cfg.net_send = ETH_TxPktChainMode; + cfg.CheckValid = WCHNET_CFG_VALID; + s = WCHNET_ConfigLIB(&cfg); + if(s){ + return (s); + } + s = WCHNET_Init(ip,gwip,mask,macaddr); + ETH_Init(macaddr); + return (s); +} + +/******************************** endfile @ eth_driver ******************************/ diff --git a/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/third_party_driver/ethernet/libwchnet.a b/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/third_party_driver/ethernet/libwchnet.a new file mode 100644 index 0000000000000000000000000000000000000000..ccab70a976a8c84755fd698ba1e6887114da34f2 GIT binary patch literal 222966 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 A?f?J) literal 0 HcmV?d00001 diff --git a/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/third_party_driver/ethernet/test/Makefile b/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/third_party_driver/ethernet/test/Makefile new file mode 100755 index 000000000..bf55d6f89 --- /dev/null +++ b/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/third_party_driver/ethernet/test/Makefile @@ -0,0 +1,4 @@ +SRC_FILES := wch_tcp_test.c + + +include $(KERNEL_ROOT)/compiler.mk diff --git a/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/third_party_driver/ethernet/test/wch_tcp_test.c b/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/third_party_driver/ethernet/test/wch_tcp_test.c new file mode 100644 index 000000000..298c1b37e --- /dev/null +++ b/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/third_party_driver/ethernet/test/wch_tcp_test.c @@ -0,0 +1,47 @@ +#include "connect_ether.h" +#include "eth_driver.h" +#include "shell.h" +#include "wchnet.h" +#include "xs_base.h" + +uint8_t DESIP[4] = { 192, 168, 1, 100 }; // destination IP address +uint16_t desport = 1000; // destination port +uint16_t srcport = 1000; // source port + +uint8_t SocketId; + +/********************************************************************* + * @fn TCP client + * + * + * @return none + */ +int Tcp_Client(void) +{ + uint8_t i; + for (i = 0; i < WCHNET_MAX_SOCKET_NUM; i++) + WCHNET_CreateTcpSocket(DESIP, srcport, desport, &SocketId); // Create TCP Socket + + while (1) { + /*Ethernet library main task function, + * which needs to be called cyclically*/ + WCHNET_MainTask(); + /*Query the Ethernet global interrupt, + * if there is an interrupt, call the global interrupt handler*/ + if (WCHNET_QueryGlobalInt()) { + if (WCHNET_HandleGlobalInt() == TIME_OUT) { + WCHNET_CreateTcpSocket(DESIP, srcport, desport, &SocketId); + } + } + } +} + +int test_tcp_client(int argc, char* argv[]) +{ + KPrintf("TCPClient Test\r\n"); + Tcp_Client(); + return 0; +} + +SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0) | SHELL_CMD_TYPE(SHELL_TYPE_CMD_MAIN), + test_tcp_client, test_tcp_client, test tcp client); \ No newline at end of file diff --git a/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/third_party_driver/include/connect_ether.h b/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/third_party_driver/include/connect_ether.h new file mode 100644 index 000000000..074822c5d --- /dev/null +++ b/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/third_party_driver/include/connect_ether.h @@ -0,0 +1,42 @@ +/* + * 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 connect_ethernet.h + * @brief define rvstar uart function + * @version 1.0 + * @author AIIT XUOS Lab + * @date 2022-08-01 + */ + +#ifndef CONNECT_ETH_H +#define CONNECT_ETH_H + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +uint8_t InitHwEth(); +void WCHNET_CreateTcpSocket(uint8_t* DESIP, uint16_t srcport, uint16_t desport, uint8_t* SocketId); +void WCHNET_CreateTcpSocketListen(uint16_t srcport, uint8_t* SocketId); + +int WCHNET_HandleGlobalInt(void); + +#define TIME_OUT -1 + +#ifdef __cplusplus +} +#endif + +#endif \ No newline at end of file diff --git a/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/third_party_driver/include/eth_driver.h b/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/third_party_driver/include/eth_driver.h new file mode 100755 index 000000000..1739ee2bf --- /dev/null +++ b/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/third_party_driver/include/eth_driver.h @@ -0,0 +1,103 @@ +/********************************** (C) COPYRIGHT ******************************* +* File Name : eth_driver.h +* Author : WCH +* Version : V1.3.0 +* Date : 2022/05/27 +* Description : This file contains the headers of the ETH Driver. +********************************************************************************* +* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. +* Attention: This software (modified or not) and binary are used for +* microcontroller manufactured by Nanjing Qinheng Microelectronics. +*******************************************************************************/ +#ifndef __ETH_DRIVER__ +#define __ETH_DRIVER__ + +#ifdef __cplusplus + extern "C" { +#endif + +#include "debug.h" + +#define ROM_CFG_USERADR_ID 0x1FFFF7E8 + +#define PHY_LINK_TASK_PERIOD 50 + +#define PHY_ANLPAR_SELECTOR_FIELD 0x1F +#define PHY_ANLPAR_SELECTOR_VALUE 0x01 /* 5B'00001 */ + +#define PHY_LINK_INIT 0x00 +#define PHY_LINK_SUC_P (1<<0) +#define PHY_LINK_SUC_N (1<<1) +#define PHY_LINK_WAIT_SUC (1<<7) + +#define PHY_PN_SWITCH_P (0<<2) +#define PHY_PN_SWITCH_N (1<<2) +#define PHY_PN_SWITCH_AUTO (2<<2) + +#ifndef WCHNETTIMERPERIOD +#define WCHNETTIMERPERIOD 10 /* Timer period, in Ms. */ +#endif + +#define PHY_NEGOTIATION_PARAM_INIT() do{\ + phySucCnt = 0;\ + phyStatus = 0;\ + phyLinkCnt = 0;\ + phyRetryCnt = 0;\ + phyPNChangeCnt = 0;\ + phyLinkStatus = PHY_LINK_INIT;\ +}while(0) + +/* definition for Ethernet frame */ +#define ETH_MAX_PACKET_SIZE 1536 /* ETH_HEADER + VLAN_TAG + MAX_ETH_PAYLOAD + ETH_CRC */ +#define ETH_HEADER 14 /* 6 byte Dest addr, 6 byte Src addr, 2 byte length/type */ +#define ETH_CRC 4 /* Ethernet CRC */ +#define ETH_EXTRA 2 /* Extra bytes in some cases */ +#define VLAN_TAG 4 /* optional 802.1q VLAN Tag */ +#define MIN_ETH_PAYLOAD 46 /* Minimum Ethernet payload size */ +#define MAX_ETH_PAYLOAD 1500 /* Maximum Ethernet payload size */ + +/* Bit or field definition of TDES0 register (DMA Tx descriptor status register)*/ +#define ETH_DMATxDesc_OWN ((uint32_t)0x80000000) /* OWN bit: descriptor is owned by DMA engine */ + +/* Bit or field definition of RDES0 register (DMA Rx descriptor status register) */ +#define ETH_DMARxDesc_OWN ((uint32_t)0x80000000) /* OWN bit: descriptor is owned by DMA engine */ +#define ETH_DMARxDesc_FL ((uint32_t)0x3FFF0000) /* Receive descriptor frame length */ +#define ETH_DMARxDesc_ES ((uint32_t)0x00008000) /* Error summary: */ +#define ETH_DMARxDesc_FS ((uint32_t)0x00000200) /* First descriptor of the frame */ +#define ETH_DMARxDesc_LS ((uint32_t)0x00000100) /* Last descriptor of the frame */ + +#define ETH_DMARxDesc_FrameLengthShift 16 + +/* ETHERNET errors */ +#define ETH_ERROR ((uint32_t)0) +#define ETH_SUCCESS ((uint32_t)1) + +/* ETH structure definition */ +typedef struct +{ + uint32_t volatile Status; /* Status */ + uint32_t ControlBufferSize; /* Control and Buffer1, Buffer2 lengths */ + uint32_t Buffer1Addr; /* Buffer1 address pointer */ + uint32_t Buffer2NextDescAddr; /* Buffer2 or next descriptor address pointer */ +} ETH_DMADESCTypeDef; + +#include "wchnet.h" + +extern SOCK_INF SocketInf[ ]; + +void ETH_PHYLink( void ); +void WCHNET_ETHIsr( void ); +void WCHNET_MainTask( void ); +void ETH_LedConfiguration(void); +void ETH_Init( uint8_t *macAddr ); +void ETH_LedLinkSet( uint8_t mode ); +void ETH_LedDataSet( uint8_t mode ); +void WCHNET_TimeIsr( uint16_t timperiod ); +void ETH_Configuration( uint8_t *macAddr ); +uint8_t ETH_LibInit( uint8_t *ip, uint8_t *gwip, uint8_t *mask, uint8_t *macaddr); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/third_party_driver/include/libwchnet.a b/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/third_party_driver/include/libwchnet.a new file mode 100755 index 0000000000000000000000000000000000000000..9eee4821c7e312c2a0afdd509c2a2b1a465c6596 GIT binary patch literal 223264 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 Vk#>?^T$YpcUPJlXbJmL9{{<=Y6R`jQ literal 0 HcmV?d00001 diff --git a/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/third_party_driver/include/net_config.h b/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/third_party_driver/include/net_config.h new file mode 100755 index 000000000..1c365d0d4 --- /dev/null +++ b/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/third_party_driver/include/net_config.h @@ -0,0 +1,167 @@ +/********************************** (C) COPYRIGHT ******************************* +* File Name : net_config.h +* Author : WCH +* Version : V1.30 +* Date : 2022/06/02 +* Description : This file contains the configurations of +* Ethernet protocol stack library +********************************************************************************* +* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. +* Attention: This software (modified or not) and binary are used for +* microcontroller manufactured by Nanjing Qinheng Microelectronics. +*******************************************************************************/ +#ifndef __NET_CONFIG_H__ +#define __NET_CONFIG_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +/********************************************************************* + * socket configuration, IPRAW + UDP + TCP + TCP_LISTEN = number of sockets + */ +#define WCHNET_NUM_IPRAW 0 /* Number of IPRAW connections */ + +#define WCHNET_NUM_UDP 0 /* The number of UDP connections */ + +#define WCHNET_NUM_TCP 1 /* Number of TCP connections */ + +#define WCHNET_NUM_TCP_LISTEN 0 /* Number of TCP listening */ + +/* The number of sockets, the maximum is 31 */ +#define WCHNET_MAX_SOCKET_NUM (WCHNET_NUM_IPRAW+WCHNET_NUM_UDP+WCHNET_NUM_TCP+WCHNET_NUM_TCP_LISTEN) + +#define WCHNET_TCP_MSS 1460 /* Size of TCP MSS*/ + +#define WCHNET_NUM_POOL_BUF (WCHNET_NUM_TCP*2+2) /* The number of POOL BUFs, the number of receive queues */ + +/********************************************************************* + * MAC queue configuration + */ +#define ETH_TXBUFNB 1 /* The number of descriptors sent by the MAC */ + +#define ETH_RXBUFNB 4 /* Number of MAC received descriptors */ + +#ifndef ETH_MAX_PACKET_SIZE +#define ETH_RX_BUF_SZE 1520 /* MAC receive buffer length, an integer multiple of 4 */ +#define ETH_TX_BUF_SZE 1520 /* MAC send buffer length, an integer multiple of 4 */ +#else +#define ETH_RX_BUF_SZE ETH_MAX_PACKET_SIZE +#define ETH_TX_BUF_SZE ETH_MAX_PACKET_SIZE +#endif + +/********************************************************************* + * Functional configuration + */ +#define WCHNET_PING_ENABLE 1 /* PING is enabled, PING is enabled by default */ + +#define TCP_RETRY_COUNT 20 /* The number of TCP retransmissions, the default value is 20 */ + +#define TCP_RETRY_PERIOD 10 /* TCP retransmission period, the default value is 10, the unit is 50ms */ + +#define SOCKET_SEND_RETRY 0 /* Send failed retry configuration, 1: enable, 0: disable */ + +#define FINE_DHCP_PERIOD 8 /* Fine DHCP period, the default value is 8, the unit is 250ms */ + +#define CFG0_TCP_SEND_COPY 1 /* TCP send buffer copy, 1: copy, 0: not copy */ + +#define CFG0_TCP_RECV_COPY 1 /* TCP receive replication optimization, internal debugging use */ + +#define CFG0_TCP_OLD_DELETE 0 /* Delete oldest TCP connection, 1: enable, 0: disable */ + +#define CFG0_IP_REASS_PBUFS 0 /* Number of reassembled IP PBUFs */ + +#define CFG0_TCP_DEALY_ACK_DISABLE 1 /* 1: disable TCP delay ACK 0: enable TCP delay ACK */ + +/********************************************************************* + * Memory related configuration + */ +/* If you want to achieve a higher transmission speed, + * try to increase RECE_BUF_LEN to (WCHNET_TCP_MSS*4) + * and increase WCHNET_NUM_TCP_SEG to (WCHNET_NUM_TCP*4)*/ +#define RECE_BUF_LEN (WCHNET_TCP_MSS*2) /* socket receive buffer size */ + +#define WCHNET_NUM_PBUF WCHNET_NUM_POOL_BUF /* Number of PBUF structures */ + +#define WCHNET_NUM_TCP_SEG (WCHNET_NUM_TCP*2) /* The number of TCP segments used to send */ + +#define WCHNET_MEM_HEAP_SIZE (((WCHNET_TCP_MSS+0x10+54+8)*WCHNET_NUM_TCP_SEG)+ETH_TX_BUF_SZE+64+2*0x18) /* memory heap size */ + +#define WCHNET_NUM_ARP_TABLE 50 /* Number of ARP lists */ + +#define WCHNET_MEM_ALIGNMENT 4 /* 4 byte alignment */ + +#if CFG0_IP_REASS_PBUFS +#define WCHNET_NUM_IP_REASSDATA 2 /* Number of reassembled IP structures */ +/*1: When using the fragmentation function, + * ensure that the size of WCHNET_SIZE_POOL_BUF is large enough to store a single fragmented packet*/ +#define WCHNET_SIZE_POOL_BUF (((1500 + 14 + 4) + 3) & ~3) /* Buffer size for receiving a single packet */ +/*2: When creating a socket that can receive fragmented packets, + * ensure that "RecvBufLen" member of the "struct _SOCK_INF" structure + * (the parameter initialized when calling WCHNET_SocketCreat) is sufficient + * to receive a complete fragmented packet */ +#else +#define WCHNET_NUM_IP_REASSDATA 0 /* Number of reassembled IP structures */ +#define WCHNET_SIZE_POOL_BUF (((WCHNET_TCP_MSS + 40 + 14 + 4) + 3) & ~3) /* Buffer size for receiving a single packet */ +#endif + +/* Check receive buffer */ +#if(WCHNET_NUM_POOL_BUF * WCHNET_SIZE_POOL_BUF < ETH_RX_BUF_SZE) + #error "WCHNET_NUM_POOL_BUF or WCHNET_TCP_MSS Error" + #error "Please Increase WCHNET_NUM_POOL_BUF or WCHNET_TCP_MSS to make sure the receive buffer is sufficient" +#endif +/* Check the configuration of the SOCKET quantity */ +#if( WCHNET_NUM_TCP_LISTEN && !WCHNET_NUM_TCP ) + #error "WCHNET_NUM_TCP Error,Please Configure WCHNET_NUM_TCP >= 1" +#endif +/* Check byte alignment must be a multiple of 4 */ +#if((WCHNET_MEM_ALIGNMENT % 4) || (WCHNET_MEM_ALIGNMENT == 0)) + #error "WCHNET_MEM_ALIGNMENT Error,Please Configure WCHNET_MEM_ALIGNMENT = 4 * N, N >=1" +#endif +/* TCP maximum segment length */ +#if((WCHNET_TCP_MSS > 1460) || (WCHNET_TCP_MSS < 60)) + #error "WCHNET_TCP_MSS Error,Please Configure WCHNET_TCP_MSS >= 60 && WCHNET_TCP_MSS <= 1460" +#endif +/* Number of ARP cache tables */ +#if((WCHNET_NUM_ARP_TABLE > 0X7F) || (WCHNET_NUM_ARP_TABLE < 1)) + #error "WCHNET_NUM_ARP_TABLE Error,Please Configure WCHNET_NUM_ARP_TABLE >= 1 && WCHNET_NUM_ARP_TABLE <= 0X7F" +#endif +/* Check POOL BUF configuration */ +#if(WCHNET_NUM_POOL_BUF < 1) + #error "WCHNET_NUM_POOL_BUF Error,Please Configure WCHNET_NUM_POOL_BUF >= 1" +#endif +/* Check PBUF structure configuration */ +#if(WCHNET_NUM_PBUF < 1) + #error "WCHNET_NUM_PBUF Error,Please Configure WCHNET_NUM_PBUF >= 1" +#endif +/* Check IP Assignment Configuration */ +#if(CFG0_IP_REASS_PBUFS && ((WCHNET_NUM_IP_REASSDATA > 10) || (WCHNET_NUM_IP_REASSDATA < 1))) + #error "WCHNET_NUM_IP_REASSDATA Error,Please Configure WCHNET_NUM_IP_REASSDATA < 10 && WCHNET_NUM_IP_REASSDATA >= 1 " +#endif +/* Check the number of reassembled IP PBUFs */ +#if(CFG0_IP_REASS_PBUFS > WCHNET_NUM_POOL_BUF) + #error "WCHNET_NUM_POOL_BUF Error,Please Configure CFG0_IP_REASS_PBUFS < WCHNET_NUM_POOL_BUF" +#endif +/* Check Timer period, in Ms. */ +#if(WCHNETTIMERPERIOD > 50) + #error "WCHNETTIMERPERIOD Error,Please Configure WCHNETTIMERPERIOD < 50" +#endif + +/* Configuration value 0 */ +#define WCHNET_MISC_CONFIG0 (((CFG0_TCP_SEND_COPY) << 0) |\ + ((CFG0_TCP_RECV_COPY) << 1) |\ + ((CFG0_TCP_OLD_DELETE) << 2) |\ + ((CFG0_IP_REASS_PBUFS) << 3) |\ + ((CFG0_TCP_DEALY_ACK_DISABLE) << 8)) +/* Configuration value 1 */ +#define WCHNET_MISC_CONFIG1 (((WCHNET_MAX_SOCKET_NUM)<<0)|\ + ((WCHNET_PING_ENABLE) << 13) |\ + ((TCP_RETRY_COUNT) << 14) |\ + ((TCP_RETRY_PERIOD) << 19) |\ + ((SOCKET_SEND_RETRY) << 25) |\ + ((FINE_DHCP_PERIOD) << 27)) + +#ifdef __cplusplus +} +#endif +#endif diff --git a/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/third_party_driver/include/wchnet.h b/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/third_party_driver/include/wchnet.h new file mode 100644 index 000000000..4d52a19da --- /dev/null +++ b/Ubiquitous/XiZi_IIoT/board/ch32v208rbt6/third_party_driver/include/wchnet.h @@ -0,0 +1,591 @@ +/********************************** (C) COPYRIGHT ******************************* + * File Name : wchnet.h + * Author : WCH + * Version : V1.80 + * Date : 2023/05/12 + * Description : This file contains the headers of + * the Ethernet protocol stack library. + ********************************************************************************* + * Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. + * Attention: This software (modified or not) and binary are used for + * microcontroller manufactured by Nanjing Qinheng Microelectronics. + *******************************************************************************/ +#ifndef __WCHNET_H__ +#define __WCHNET_H__ + +#include "stdint.h" +#ifndef NET_LIB +#include "net_config.h" +#endif +#ifdef __cplusplus +extern "C" { +#endif + +#define WCHNET_LIB_VER 0x18 // the library version number +#define WCHNET_CFG_VALID 0x12345678 // Configuration value valid flag + +/* LED state @LED_STAT */ +#define LED_ON 0 +#define LED_OFF 1 + +/* PHY state @PHY_STAT */ +#define PHY_LINK_SUCCESS (1 << 2) // PHY connection success +#define PHY_AUTO_SUCCESS (1 << 5) // PHY auto negotiation completed + +/* Library initialization state @CFG_INIT_STAT */ +#define INIT_OK 0x00 +#define INIT_ERR_RX_BUF_SIZE 0x01 +#define INIT_ERR_TCP_MSS 0x02 +#define INIT_ERR_HEAP_SIZE 0x03 +#define INIT_ERR_ARP_TABLE_NEM 0x04 +#define INIT_ERR_MISC_CONFIG0 0x05 +#define INIT_ERR_MISC_CONFIG1 0x06 +#define INIT_ERR_FUNC_SEND 0x09 +#define INIT_ERR_CHECK_VALID 0xFF + +/* Socket protocol type */ +#define PROTO_TYPE_IP_RAW 0 // IP layer raw data +#define PROTO_TYPE_UDP 2 // UDP protocol +#define PROTO_TYPE_TCP 3 // TCP protocol + +/* interrupt status */ +/* The following are the states + * that GLOB_INT will generate */ +#define GINT_STAT_UNREACH (1 << 0) // unreachable interrupt +#define GINT_STAT_IP_CONFLI (1 << 1) // IP conflict interrupt +#define GINT_STAT_PHY_CHANGE (1 << 2) // PHY state change interrupt +#define GINT_STAT_SOCKET (1 << 4) // socket related interrupt + +/* The following are the states + * that Sn_INT will generate*/ +#define SINT_STAT_RECV (1 << 2) // the socket receives data or the receive buffer is not empty +#define SINT_STAT_CONNECT (1 << 3) // connect successfully,generated in TCP mode +#define SINT_STAT_DISCONNECT (1 << 4) // disconnect,generated in TCP mode +#define SINT_STAT_TIM_OUT (1 << 6) // timeout disconnect,generated in TCP mode + +/* Definitions for error constants. @ERR_T */ +#define ERR_T +#define WCHNET_ERR_SUCCESS 0x00 // No error, everything OK +#define WCHNET_ERR_BUSY 0x10 // busy +#define WCHNET_ERR_MEM 0x11 // Out of memory error +#define WCHNET_ERR_BUF 0x12 // Buffer error +#define WCHNET_ERR_TIMEOUT 0x13 // Timeout +#define WCHNET_ERR_RTE 0x14 // Routing problem +#define WCHNET_ERR_ABRT 0x15 // Connection aborted +#define WCHNET_ERR_RST 0x16 // Connection reset +#define WCHNET_ERR_CLSD 0x17 // Connection closed +#define WCHNET_ERR_CONN 0x18 // Not connected +#define WCHNET_ERR_VAL 0x19 // Illegal value +#define WCHNET_ERR_ARG 0x1a // Illegal argument +#define WCHNET_ERR_USE 0x1b // Address in use +#define WCHNET_ERR_IF 0x1c // Low-level netif error +#define WCHNET_ERR_ISCONN 0x1d // Already connected +#define WCHNET_ERR_INPROGRESS 0x1e // Operation in progress +#define WCHNET_ERR_SOCKET_MEM 0X20 // Socket information error +#define WCHNET_ERR_UNSUPPORT_PROTO 0X21 // unsupported protocol type +#define WCHNET_RET_ABORT 0x5F // command process fail +#define WCHNET_ERR_UNKNOW 0xFA // unknow + +/* unreachable condition related codes */ +#define UNREACH_CODE_HOST 0 // host unreachable +#define UNREACH_CODE_NET 1 // network unreachable +#define UNREACH_CODE_PROTOCOL 2 // protocol unreachable +#define UNREACH_CODE_PROT 3 // port unreachable +/*For other values, please refer to the RFC792 document*/ + +/* TCP disconnect related codes */ +#define TCP_CLOSE_NORMAL 0 // normal disconnect,a four-way handshake +#define TCP_CLOSE_RST 1 // reset the connection and close +#define TCP_CLOSE_ABANDON 2 // drop connection, and no termination message is sent + +/* socket state code */ +#define SOCK_STAT_CLOSED 0X00 // socket close +#define SOCK_STAT_OPEN 0X05 // socket open + +/* TCP state code */ +#define TCP_CLOSED 0 // TCP close +#define TCP_LISTEN 1 // TCP listening +#define TCP_SYN_SENT 2 // SYN send, connect request +#define TCP_SYN_RCVD 3 // SYN received, connection request received +#define TCP_ESTABLISHED 4 // TCP connection establishment +#define TCP_FIN_WAIT_1 5 // WAIT_1 state +#define TCP_FIN_WAIT_2 6 // WAIT_2 state +#define TCP_CLOSE_WAIT 7 // wait to close +#define TCP_CLOSING 8 // closing +#define TCP_LAST_ACK 9 // LAST_ACK +#define TCP_TIME_WAIT 10 // 2MSL wait + +/* The following values are fixed and cannot be changed */ +#define WCHNET_MEM_ALIGN_SIZE(size) (((size) + WCHNET_MEM_ALIGNMENT - 1) & ~(WCHNET_MEM_ALIGNMENT - 1)) +#define WCHNET_SIZE_IPRAW_PCB 0x1C // IPRAW PCB size +#define WCHNET_SIZE_UDP_PCB 0x20 // UDP PCB size +#define WCHNET_SIZE_TCP_PCB 0xB4 // TCP PCB size +#define WCHNET_SIZE_TCP_PCB_LISTEN 0x24 // TCP LISTEN PCB size +#define WCHNET_SIZE_IP_REASSDATA 0x20 // IP reassembled Management +#define WCHNET_SIZE_PBUF 0x10 // Packet Buf +#define WCHNET_SIZE_TCP_SEG 0x14 // TCP SEG structure +#define WCHNET_SIZE_MEM 0x08 // sizeof(struct mem) +#define WCHNET_SIZE_ARP_TABLE 0x18 // sizeof ARP table + +#define WCHNET_MEMP_SIZE ((WCHNET_MEM_ALIGNMENT - 1) + (WCHNET_NUM_IPRAW * WCHNET_MEM_ALIGN_SIZE(WCHNET_SIZE_IPRAW_PCB)) + (WCHNET_NUM_UDP * WCHNET_MEM_ALIGN_SIZE(WCHNET_SIZE_UDP_PCB)) + (WCHNET_NUM_TCP * WCHNET_MEM_ALIGN_SIZE(WCHNET_SIZE_TCP_PCB)) + (WCHNET_NUM_TCP_LISTEN * WCHNET_MEM_ALIGN_SIZE(WCHNET_SIZE_TCP_PCB_LISTEN)) + (WCHNET_NUM_TCP_SEG * WCHNET_MEM_ALIGN_SIZE(WCHNET_SIZE_TCP_SEG)) + (WCHNET_NUM_IP_REASSDATA * WCHNET_MEM_ALIGN_SIZE(WCHNET_SIZE_IP_REASSDATA)) + (WCHNET_NUM_PBUF * WCHNET_MEM_ALIGN_SIZE(WCHNET_SIZE_PBUF)) + (WCHNET_NUM_POOL_BUF * (WCHNET_MEM_ALIGN_SIZE(WCHNET_SIZE_PBUF) + WCHNET_MEM_ALIGN_SIZE(WCHNET_SIZE_POOL_BUF)))) + +#define HEAP_MEM_ALIGN_SIZE (WCHNET_MEM_ALIGN_SIZE(WCHNET_SIZE_MEM)) +#define WCHNET_RAM_HEAP_SIZE (WCHNET_MEM_ALIGN_SIZE(WCHNET_MEM_HEAP_SIZE) + HEAP_MEM_ALIGN_SIZE) +#define WCHNET_RAM_ARP_TABLE_SIZE (WCHNET_MEM_ALIGN_SIZE(WCHNET_SIZE_ARP_TABLE) * WCHNET_NUM_ARP_TABLE) + +typedef struct +{ + uint32_t length; + uint32_t buffer; +} ETHFrameType; + +/* LED callback type */ +typedef void (*led_callback)(uint8_t setbit); + +/* net send callback type */ +typedef uint32_t (*eth_tx_set)(uint16_t len, uint32_t* pBuff); + +/* net receive callback type */ +typedef uint32_t (*eth_rx_set)(ETHFrameType* pkt); + +/* DNS callback type */ +typedef void (*dns_callback)(const char* name, uint8_t* ipaddr, void* callback_arg); + +/* DHCP callback type */ +typedef uint8_t (*dhcp_callback)(uint8_t status, void*); + +/* socket receive callback type */ +struct _SOCK_INF; +typedef void (*pSockRecv)(struct _SOCK_INF*, uint32_t, uint16_t, uint8_t*, uint32_t); + +/* Socket information struct */ +typedef struct _SOCK_INF { + uint32_t IntStatus; // interrupt state + uint32_t SockIndex; // Socket index value + uint32_t RecvStartPoint; // Start pointer of the receive buffer + uint32_t RecvBufLen; // Receive buffer length + uint32_t RecvCurPoint; // current pointer to receive buffer + uint32_t RecvReadPoint; // The read pointer of the receive buffer + uint32_t RecvRemLen; // The length of the remaining data in the receive buffer + uint32_t ProtoType; // protocol type + uint32_t SockStatus; // Low byte Socket state, the next low byte is TCP state, only meaningful in TCP mode + uint32_t DesPort; // destination port + uint32_t SourPort; // Source port, protocol type in IPRAW mode + uint8_t IPAddr[4]; // Socket destination IP address + void* Resv1; // Reserved, for internal use, for saving individual PCBs + void* Resv2; // Reserved, used internally, used by TCP Server + pSockRecv AppCallBack; // receive callback function +} SOCK_INF; + +struct _WCH_CFG { + uint32_t TxBufSize; // MAC send buffer size, reserved for use + uint32_t TCPMss; // TCP MSS size + uint32_t HeapSize; // heap memory size + uint32_t ARPTableNum; // Number of ARP lists + uint32_t MiscConfig0; // Miscellaneous Configuration 0 + /* Bit 0 TCP send buffer copy 1: copy, 0: not copy */ + /* Bit 1 TCP receive replication optimization, used for internal debugging */ + /* bit 2 delete oldest TCP connection 1: enable, 0: disable */ + /* Bits 3-7 Number of PBUFs of IP segments */ + /* Bit 8 TCP Delay ACK disable */ + uint32_t MiscConfig1; // Miscellaneous Configuration 1 + /* Bits 0-7 Number of Sockets*/ + /* Bits 8-12 Reserved */ + /* Bit 13 PING enable, 1: On 0: Off */ + /* Bits 14-18 TCP retransmission times */ + /* Bits 19-23 TCP retransmission period, in 50 milliseconds */ + /* bit 25 send failed retry, 1: enable, 0: disable */ + /* bit 26 Select whether to perform IPv4 checksum check on + * the TCP/UDP/ICMP header of the received frame payload by hardware, + * and calculate and insert the checksum of the IP header and payload of the sent frame by hardware.*/ + /* Bits 27-31 period (in 250 milliseconds) of Fine DHCP periodic process */ + led_callback led_link; // PHY Link Status Indicator + led_callback led_data; // Ethernet communication indicator + eth_tx_set net_send; // Ethernet send + eth_rx_set net_recv; // Ethernet receive + uint32_t CheckValid; // Configuration value valid flag, fixed value @WCHNET_CFG_VALID +}; + +struct _NET_SYS { + uint8_t IPAddr[4]; // IP address + uint8_t GWIPAddr[4]; // Gateway IP address + uint8_t MASKAddr[4]; // subnet mask + uint8_t MacAddr[8]; // MAC address + uint8_t UnreachIPAddr[4]; // Unreachable IP address + uint32_t RetranCount; // number of retries,default is 10 times + uint32_t RetranPeriod; // Retry period, unit MS, default 500MS + uint32_t PHYStat; // PHY state code + uint32_t NetStat; // The status of the Ethernet, including whether it is open, etc. + uint32_t MackFilt; // MAC filtering, the default is to receive broadcasts, receive local MAC + uint32_t GlobIntStatus; // global interrupt + uint32_t UnreachCode; // unreachable code + uint32_t UnreachProto; // unreachable protocol + uint32_t UnreachPort; // unreachable port + uint32_t SendFlag; + uint32_t Flags; +}; + +/* KEEP LIVE configuration structure */ +struct _KEEP_CFG { + uint32_t KLIdle; // KEEPLIVE idle time, in ms + uint32_t KLIntvl; // KEEPLIVE period, in ms + uint32_t KLCount; // KEEPLIVE times +}; + +/** + * @brief Library initialization . + * + * @param ip - IP address pointer + * @param gwip - Gateway address pointer + * @param mask - Subnet mask pointer + * @param macaddr - MAC address pointer + * + * @return @ERR_T + */ +uint8_t WCHNET_Init(const uint8_t* ip, const uint8_t* gwip, const uint8_t* mask, const uint8_t* macaddr); + +/** + * @brief get library version + * + * @param None + * + * @return library version + */ +uint8_t WCHNET_GetVer(void); + +/** + * @brief Get MAC address. + * + * @param(in) macaddr - MAC address + * + * @param(out) MAC address + * + * @return None + */ +void WCHNET_GetMacAddr(uint8_t* macaddr); + +/** + * @brief Library parameter configuration. + * + * @param cfg - Configuration parameter @_WCH_CFG + * + * @return Library configuration initialization state @CFG_INIT_STAT + */ +uint8_t WCHNET_ConfigLIB(struct _WCH_CFG* cfg); + +/** + * @brief Handle periodic tasks in the protocol stack + * + * @param None + * + * @return None + */ +void WCHNET_PeriodicHandle(void); + +/** + * @brief Ethernet data input. Always called in the main program, + * or called after the reception interrupt is detected. + * + * @param + * + * @return None + */ +void WCHNET_NetInput(void); + +/** + * @brief Ethernet interrupt service function. Called after + * Ethernet interrupt is generated. + * + * @param None + * + * @return None + */ +void WCHNET_ETHIsr(void); + +/** + * @brief Get PHY status + * + * @param None + * + * @return PHY status @PHY_STAT + */ +uint8_t WCHNET_GetPHYStatus(void); + +/** + * @brief Query global interrupt status. + * + * @param None + * + * @return GLOB_INT + */ +uint8_t WCHNET_QueryGlobalInt(void); + +/** + * @brief Read global interrupt and clear it. + * + * @param None + * + * @return GLOB_INT + */ +uint8_t WCHNET_GetGlobalInt(void); + +/** + * @brief create socket + * + * @param(in) *socketid - socket variable pointer + * @param socinf - Configuration parameters for creating sockets @SOCK_INF + * + * @param(out) *socketid - socket value + * + * @return @ERR_T + */ +uint8_t WCHNET_SocketCreat(uint8_t* socketid, SOCK_INF* socinf); + +/** + * @brief Socket sends data. + * + * @param socketid - socket id value + * @param *buf - the first address of send buffer + * @param(in) *len - pointer to the length of the data expected to be sent + * + * @param(out) *len - pointer to the length of the data sent actually + * + * @return @ERR_T + */ +uint8_t WCHNET_SocketSend(uint8_t socketid, uint8_t* buf, uint32_t* len); + +/** + * @brief Socket receives data. + * + * @param socketid - socket id value + * @param *buf - the first address of receive buffer + * @param(in) *len - pointer to the length of the data expected to be read + * + * @param(out) *buf - the first address of data buffer + * @param(out) *len - pointer to the length of the data read actually + * + * @return @ERR_T + */ +uint8_t WCHNET_SocketRecv(uint8_t socketid, uint8_t* buf, uint32_t* len); + +/** + * @brief Get socket interrupt, and clear socket interrupt. + * + * @param socketid - socket id value + * + * @return Sn_INT + */ +uint8_t WCHNET_GetSocketInt(uint8_t socketid); + +/** + * @brief Get the length of the data received by socket. + * + * @param socketid - socket id value + * @param(in) *bufaddr - the first address of receive buffer + * + * @param(out) *bufaddr - the first address of data buffer + * + * @return the length of the data + */ +uint32_t WCHNET_SocketRecvLen(uint8_t socketid, uint32_t* bufaddr); + +/** + * @brief TCP connect. Used in TCP Client mode. + * + * @param socketid - socket id value + * + * @return @ERR_T + */ +uint8_t WCHNET_SocketConnect(uint8_t socketid); + +/** + * @brief TCP listen. Used in TCP SERVER mode. + * + * @param socketid - socket id value + * + * @return @ERR_T + */ +uint8_t WCHNET_SocketListen(uint8_t socketid); + +/** + * @brief Close socket. + * + * @param socketid - socket id value + * @param mode - the way of disconnection.Used in TCP connection. + * @TCP disconnect related codes + * + * @return @ERR_T + */ +uint8_t WCHNET_SocketClose(uint8_t socketid, uint8_t mode); + +/** + * @brief Modify socket receive buffer. + * + * @param socketid - socket id value + * @param bufaddr - Address of the receive buffer + * @param bufsize - Size of the receive buffer + * + * @return None + */ +void WCHNET_ModifyRecvBuf(uint8_t socketid, uint32_t bufaddr, uint32_t bufsize); + +/** + * @brief UDP send, specify the target IP and target port + * + * @param socketid - socket id value + * @param *buf - Address of the sent data + * @param(in) *slen - Address of the sent length + * @param *sip - destination IP address + * @param port - destination port + * + * @param(out) *slen - actual length sent + * + * @return @ERR_T + */ +uint8_t WCHNET_SocketUdpSendTo(uint8_t socketid, uint8_t* buf, uint32_t* slen, uint8_t* sip, uint16_t port); + +/** + * @brief Convert ASCII address to network address. + * + * @param *cp - ASCII address to be converted, such as "192.168.1.2" + * @param(in) *addr - First address of the memory stored in the converted network address + * @param(out) *addr - Converted network address, such as 0xC0A80102 + * @return 0 - Success. Others - Failure. + */ +uint8_t WCHNET_Aton(const char* cp, uint8_t* addr); + +/** + * @brief Convert network address to ASCII address. + * + * @param *ipaddr - socket id value + * + * @return Converted ASCII address + */ +uint8_t* WCHNET_Ntoa(uint8_t* ipaddr); + +/** + * @brief Set socket TTL. + * + * @param socketid - socket id value + * @param ttl - TTL value + * + * @return @ERR_T + */ +uint8_t WCHNET_SetSocketTTL(uint8_t socketid, uint8_t ttl); + +/** + * @brief Start TCP retry sending immediately. + * + * @param socketid - TTL value + * + * @return None + */ +void WCHNET_RetrySendUnack(uint8_t socketid); + +/** + * @brief Query the packets that are not sent successfully. + * + * @param socketid - TTL value + * @param(in) *addrlist - pointer to the address of the address list + * @param lislen - Length of the list + * + * @param(out) *addrlist - Address list of the data packets that are not sent successfully + * + * @return Number of unsent and unacknowledged segments + */ +uint8_t WCHNET_QueryUnack(uint8_t socketid, uint32_t* addrlist, uint16_t lislen); + +/** + * @brief Start DHCP. + * + * @param dhcp - Application layer callback function + * + * @return @ERR_T + */ +uint8_t WCHNET_DHCPStart(dhcp_callback dhcp); + +/** + * @brief Stop DHCP. + * + * @param None + * + * @return @ERR_T + */ +uint8_t WCHNET_DHCPStop(void); + +/** + * @brief Configure DHCP host name. + * + * @param *name - First address of DHCP host name + * + * @return 0 - Success. Others - Failure. + */ +uint8_t WCHNET_DHCPSetHostname(char* name); + +/** + * @brief Initialize the resolver: set up the UDP pcb and configure the default server + * + * @param *dnsip - the IP address of dns server + * @param port - the port number of dns server + * + * @return None + */ +void WCHNET_InitDNS(uint8_t* dnsip, uint16_t port); + +/** + * @brief Stop DNS. + * + * @param None + * + * @return None + */ +void WCHNET_DNSStop(void); + +/** + * Resolve a hostname (string) into an IP address. + * + * @param hostname - the hostname that is to be queried + * @param addr - pointer to a struct ip_addr where to store the address if it is already + * cached in the dns_table (only valid if ERR_OK is returned!) + * @param found - a callback function to be called on success, failure or timeout (only if + * ERR_INPROGRESS is returned!) + * @param arg - argument to pass to the callback function + * + * @return @ERR_T + * WCHNET_ERR_SUCCESS if hostname is a valid IP address string or the host name is already in the local names table. + * ERR_INPROGRESS enqueue a request to be sent to the DNS server for resolution if no errors are present. + */ +uint8_t WCHNET_HostNameGetIp(const char* hostname, uint8_t* addr, dns_callback found, void* arg); + +/** + * @brief Configure KEEP LIVE parameter. + * + * @param *cfg - KEEPLIVE configuration parameter + * + * @return None + */ +void WCHNET_ConfigKeepLive(struct _KEEP_CFG* cfg); + +/** + * @brief Configure socket KEEP LIVE enable. + * + * @param socketid - socket id value + * @param enable - 1: Enabled. 0: Disabled. + * + * @return @ERR_T + */ +uint8_t WCHNET_SocketSetKeepLive(uint8_t socketid, uint8_t enable); + +/** + * @brief Configure PHY state + * + * @param phy_stat - PHY state + * + * @return None + */ +void WCHNET_PhyStatus(uint32_t phy_stat); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/Ubiquitous/XiZi_IIoT/kernel/memory/byte_manage.c b/Ubiquitous/XiZi_IIoT/kernel/memory/byte_manage.c index a802815c7..326e78d64 100644 --- a/Ubiquitous/XiZi_IIoT/kernel/memory/byte_manage.c +++ b/Ubiquitous/XiZi_IIoT/kernel/memory/byte_manage.c @@ -656,6 +656,10 @@ void *x_malloc(x_size_t size) /* parameter detection */ if ((size == 0) || (size > ByteManager.dynamic_buddy_manager.dynamic_buddy_end - ByteManager.dynamic_buddy_manager.dynamic_buddy_start - ByteManager.dynamic_buddy_manager.active_memory)) { FREE_LIST_UNLOCK(lock); + KPrintf("require size:%d\n", size); + KPrintf("dynamic_buddy_end:%d\n", ByteManager.dynamic_buddy_manager.dynamic_buddy_end); + KPrintf("dynamic_buddy_start:%d\n", ByteManager.dynamic_buddy_manager.dynamic_buddy_start); + KPrintf("active_memory:%d\n", ByteManager.dynamic_buddy_manager.active_memory); return NONE; } #endif diff --git a/Ubiquitous/XiZi_IIoT/kernel/thread/init.c b/Ubiquitous/XiZi_IIoT/kernel/thread/init.c index 7c5b8cf02..190d6b856 100644 --- a/Ubiquitous/XiZi_IIoT/kernel/thread/init.c +++ b/Ubiquitous/XiZi_IIoT/kernel/thread/init.c @@ -178,9 +178,9 @@ void EnvInitKTask(void *parameter) #else CreateMainTask(); extern long ShowTask(void); -ShowTask(); +// ShowTask(); extern void ShowMemory(void); -ShowMemory(); +// ShowMemory(); #endif #endif }