增加网络配置界面

This commit is contained in:
2026-09-10 11:36:33 +08:00
parent 856b6f6426
commit 2b80d34e74
44 changed files with 2488 additions and 332 deletions
+30 -4
View File
@@ -11,6 +11,7 @@
#include <string.h>
#include <stdio.h>
#include <stdbool.h>
#include "FreeRTOS.h"
#include "task.h"
@@ -69,11 +70,27 @@ static int net_relisten_locked(net_sock_t *p_sock);
static int net_accept_locked(int sockfd, struct net_sockaddr *addr, int *addrlen);
static int net_connect_locked(int sockfd, const struct net_sockaddr *addr, int addrlen);
/*
* 函数功能:判断 6 字节 MAC 是否全零
* 入口参数:p_mac - MAC 指针(不可为 NULL) const uint8_t *
* 返回值:true - 全零(= 使用芯片内置 MAC);false - 非全零
* 限定条件:p_mac 非空
*/
static bool s_mac_is_zero(const uint8_t *p_mac) {
for (int i = 0; i < 6; i++) {
if (p_mac[i] != 0u) {
return false;
}
}
return true;
}
/*
* 函数功能:网络子系统初始化(配置 CH395F + 启用多连接模式)
* 入口参数:ip - IP 地址字符串 "192.168.1.100",NULL 使用 DHCP 自动获取 const char *
* mask - 子网掩码字符串 "255.255.255.0",NULL 使用默认值 const char *
* gateway - 网关地址字符串 "192.168.1.1",NULL 使用默认值 const char *
* mac - MAC 地址(6 字节,低字节在前),NULL/全零使用芯片内置 const uint8_t *
* 返回值:0 - 初始化成功 int
* -1 - 初始化失败(芯片检测/复位/协议栈初始化失败) int
* 限定条件:SPI2 已正确初始化;netTask 尚未启动
@@ -81,8 +98,10 @@ static int net_connect_locked(int sockfd, const struct net_sockaddr *addr, int a
* 2. 启用 TCP Server 多连接模式(bit1=1),设置 TCP MSS、重传参数、KeepAlive 参数
* 3. 配置 IP/网关/子网掩码,或启用 DHCP
* 4. 初始化 CH395F 协议栈并使能 PING 响应
* 5. mac 非空且非全零:初始化成功后设置 MAC(写芯片 EEPROM,
* 每上电重放同值幂等)
*/
int net_init(const char *ip, const char *mask, const char *gateway) {
int net_init(const char *ip, const char *mask, const char *gateway, const uint8_t *mac) {
ch395f_status_t ret;
DBG_INFO("net_init: start");
@@ -155,6 +174,13 @@ int net_init(const char *ip, const char *mask, const char *gateway) {
return -1;
}
/* 设置 MAC(须在协议栈初始化之后,限定条件"芯片已初始化";写芯片 EEPROM,
* 每上电重放同值幂等);NULL 或全零 = 保持芯片内置 MAC */
if (mac != NULL && s_mac_is_zero(mac) == false) {
ch395f_set_mac_addr((uint8_t *)mac);
DBG_INFO("net_init: set MAC");
}
/* 多 Socket 模式:为 Socket 0~7 各分配独立收发缓冲(必须在 OPEN_SOCKET 之前)
* 手册(§5.45):CH395F 内部缓冲共 48 块 × 512B = 24KB;芯片上电默认仅给 Socket 0~3
* 分配(每 Socket 接收 8 块/发送 4 块),Socket 4~7 为 NULL,故用到 8 个 Socket 必须重分配。
@@ -520,7 +546,7 @@ int net_listen_locked(int sockfd) {
break; /* 打开成功,退出重试 */
}
ch395f_close_socket(sockfd); /* 打开失败先关闭,再延时后重试 */
HAL_Delay(500);
osDelay(500);
}
/* 3 次仍失败,返回错误 */
if (status != CH395F_ERR_SUCCESS) {
@@ -795,7 +821,7 @@ static int net_connect_locked(int sockfd, const struct net_sockaddr *addr, int a
break; /* 打开成功,退出重试 */
}
ch395f_close_socket(sockfd); /* 打开失败先关闭,再延时后重试 */
HAL_Delay(500);
osDelay(500);
}
if (status != CH395F_ERR_SUCCESS) {
@@ -1020,7 +1046,7 @@ static int net_relisten_locked(net_sock_t *p_sock) {
break;
}
ch395f_close_socket((uint8_t)sockfd); /* 打开失败先关闭,再延时后重试 */
HAL_Delay(500);
osDelay(500);
}
if (status != CH395F_ERR_SUCCESS) {
s_net_errno = NET_ERR_BUSY;