增加网络配置界面
This commit is contained in:
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user