增加文件系统

This commit is contained in:
2026-07-21 00:30:59 +08:00
parent e06d849007
commit fbe0726991
50 changed files with 12921 additions and 893 deletions

View File

@@ -2,8 +2,8 @@
* 模块名称CH395F Driver Test Suite
* 模块功能CH395F 驱动各功能模块的测试入口,分阶段组织测试用例
* 适用平台STM32F4 系列CH395F 以太网芯片)
* 作者:王建� * 创建日期�026-07-19
* 修改记录� * 2026-07-19 Phase 1/2/3 implemented
* 作者王建<EFBFBD>? * 创建日期<E697A5>?026-07-19
* 修改记录<EFBFBD>? * 2026-07-19 Phase 1/2/3 implemented
*/
/* 头文件包含区 */
@@ -18,7 +18,7 @@
test_stats_t g_test_stats;
/*
* Phase 2 é…<EFBFBD>置默认ï¿? */
* Phase 2 配置默认<EFBFBD>? */
#ifndef PHASE2_REMOTE_IP
#define PHASE2_REMOTE_IP "192.168.1.2"
#endif
@@ -36,7 +36,7 @@ test_stats_t g_test_stats;
#endif
/*
* Phase 3 é…<EFBFBD>置默认ï¿? */
* Phase 3 配置默认<EFBFBD>? */
#ifndef PHASE3_REMOTE_IP
#define PHASE3_REMOTE_IP "192.168.1.2"
#endif
@@ -54,9 +54,9 @@ test_stats_t g_test_stats;
#endif
/*
* 函数功能:æ<EFBFBD>¢ï¿?TCP Server 多连接模å¼<C3A5>的数æ<C2B0>® Socket é…<EFBFBD>ç½®
* 函数功能<EFBFBD>?TCP Server 多连接模式的数据 Socket 配置
* 入口参数port - TCP 源端口号
* ï¿?ï¿?值:ï¿? * é™<C3A9>定æ<C5A1>¡ä»¶ï¼šCH395F å<><C3A5>议栈已åˆ<C3A5>å§ï¿? * 函数说明:é‡<C3A9>æ°è®¾ç½®æ•°ï¿?Socket çš„å<E2809E><C3A5>议类åžåŒæº<C3A6>端ï¿? */
* <EFBFBD>?<3F>?值<E580BC>? * 限定条件CH395F 协议栈已初始<E5889D>? * 函数说明重新设置数<E7BDAE>?Socket 的协议类型和源端<E6BA90>? */
static void restore_data_sockets(uint16_t port) {
int i = 0;
for (i = NET_TCP_SERVER_DATA_SOCK_START; i < NET_MAX_SOCKETS; i++) {
@@ -70,8 +70,8 @@ static void restore_data_sockets(uint16_t port) {
* ============================ Phase 1 ============================
* 函数功能:寄存器读写 + 中断一致性基础测试
* 入口参数:无
* ï¿?ï¿?值:ï¿? * é™<C3A9>定æ<C5A1>¡ä»¶ï¼šCH395F 芯片正常应答
* 函数说明:包�GET_VERSION / GET_CMD_STATUS / GET_IP_INF �9 � */
* <EFBFBD>?<3F>?值<E580BC>? * 限定条件CH395F 芯片正常应答
* 函数说明<EFBFBD>?GET_VERSION / GET_CMD_STATUS / GET_IP_INF <EFBFBD>?9 <EFBFBD>? */
void ch395f_phase1_tests(void) {
uint8_t i = 0;
@@ -112,7 +112,7 @@ void ch395f_phase1_tests(void) {
"GINT_STATUS_ALL: 0x%04X (lo=0x%02X hi=0x%02X)",
gint_all, gint_all & 0xFF, (gint_all >> 8) & 0xFF);
/* Test 5: GINT_STATUS (1-byte version) ï¿?read-clear check */
/* Test 5: GINT_STATUS (1-byte version) <EFBFBD>?read-clear check */
uint8_t gint_1b = ch395f_get_glob_int_status();
TEST_CHECK(gint_1b == 0x00,
"GINT_STATUS_1byte: 0x%02X (expect 0x00 after read-clear)", gint_1b);
@@ -146,8 +146,8 @@ void ch395f_phase1_tests(void) {
/*
* ============================ Phase 2 ============================
* 函数功能:TCP Client æ”¶å<C2B6> + 关闭é‡<C3A9>连 ×3 ï¿? * å…¥å<C2A5>£å<C2A3>数:无
* ï¿?ï¿?值:ï¿? * é™<C3A9>定æ<C5A1>¡ä»¶ï¼šPC 端已å<C2B2>¯åЍ TCP Server(默ï¿?192.168.1.2:8081ï¿? * 函数说明:æ¯<EFBFBD>轮连接â†å<EFBFBD>é€<EFBFBD>â†æŽ¥æ”¶â†å…³é—­ï¼Œè¿žç»­ 3 ï¿? */
* 函数功能TCP Client 收发 + 关闭重连 ×3 <20>? * 入口参数:无
* <EFBFBD>?<3F>?值<E580BC>? * 限定条件PC 端已启动 TCP Server<EFBFBD>?192.168.1.2:8081<EFBFBD>? * 函数说明:每轮连接→发送→接收→关闭,连续 3 <EFBFBD>? */
void ch395f_phase2_tests(void) {
uint8_t sock = 0;
@@ -174,7 +174,7 @@ void ch395f_phase2_tests(void) {
sock = (uint8_t)(NET_MAX_SOCKETS - 1);
/* 一次性é…<EFBFBD>ï¿?*/
/* 一次性配<EFBFBD>?*/
ch395f_set_proto_type(sock, CH395F_PROTO_TYPE_TCP);
ch395f_set_send_buf(sock, 28, 2);
ch395f_set_recv_buf(sock, 30, 2);
@@ -204,7 +204,7 @@ void ch395f_phase2_tests(void) {
HAL_Delay(100);
/* å<EFBFBD>é€<EFBFBD>æµè¯•æ•°ï¿?*/
/* 发送测试数<EFBFBD>?*/
{
uint8_t test_buf[64] = {0};
const char *msg = "HelloFromCH395F_TCP_Client! This is a 64-byte test message.";
@@ -214,7 +214,7 @@ void ch395f_phase2_tests(void) {
ch395f_write_send_buf(sock, test_buf, 64);
}
/* Echo 循环:收数æ<EFBFBD>® ï¿?åžå<C5BE> */
/* Echo 循环:收数据 <20>?回发 */
{
int got_echo = 0;
tick = HAL_GetTick();
@@ -266,7 +266,7 @@ phase2_iter_done:
* ============================ Phase 3 ============================
* 函数功能UDP Server Echo + PING + 大包测试
* 入口参数:无
* ï¿?ï¿?值:ï¿? * é™<C3A9>定æ<C5A1>¡ä»¶ï¼šPC 端已å<C2B2>¯åЍ UDP Client(默ï¿?192.168.1.2:8082ï¿? * 函数说明:包ï¿?20 次回显�? ï¿?PINGï¿?0 次大包收ï¿? */
* <EFBFBD>?<3F>?值<E580BC>? * 限定条件PC 端已启动 UDP Client<EFBFBD>?192.168.1.2:8082<EFBFBD>? * 函数说明<EFBFBD>?20 次回显<E59B9E>? <20>?PING<EFBFBD>?0 次大包收<EFBFBD>? */
void ch395f_phase3_tests(void) {
uint8_t sock = 0;
@@ -279,7 +279,7 @@ void ch395f_phase3_tests(void) {
sock = (uint8_t)(NET_MAX_SOCKETS - 1);
/* UDP Server 模å¼<EFBFBD>:DesIP=0xFFFFFFFF ï¿?接å<C2A5>—ä»»æ„<C3A6>æ<EFBFBD>¥æº<C3A6> */
/* UDP Server 模式:DesIP=0xFFFFFFFF <EFBFBD>?接受任意来源 */
ch395f_set_proto_type(sock, CH395F_PROTO_TYPE_UDP);
ch395f_set_send_buf(sock, 28, 2);
ch395f_set_recv_buf(sock, 30, 2);
@@ -295,7 +295,7 @@ void ch395f_phase3_tests(void) {
HAL_Delay(200);
/* Echo 循环:收ï¿?ï¿?è§£æž<C3A6>æ<EFBFBD>¥æº<C3A6> ï¿?回显 */
/* Echo 循环<EFBFBD>?<3F>?解析来源 <20>?回显 */
for (i = 0; i < PHASE3_ECHO_COUNT; i++) {
tick = HAL_GetTick();
echo_ok = 0;
@@ -348,7 +348,7 @@ void ch395f_phase3_tests(void) {
/*
* ============================ Phase 4 ============================
* NET �TCP Echo:在主循环中调用,用 net_recv + net_send 回显
* NET <EFBFBD>?TCP Echo:在主循环中调用,用 net_recv + net_send 回显
*/
#ifdef ENABLE_PHASE4_TESTS
@@ -356,9 +356,9 @@ static char s_phase4_buf[2048];
#endif
/*
* 函数功能:NET �TCP Echo 测试
* 函数功能:NET <EFBFBD>?TCP Echo 测试
* 入口参数:无
* ï¿?ï¿?值:ï¿? * é™<C3A9>定æ<C5A1>¡ä»¶ï¼šnet_init 已完ï¿? * 函数说明:在 netTask 中è¿<C3A8>行,轮询 Socket 1~7 åžæ˜¾æŽ¥æ”¶æ•°æ<C2B0>®
* <EFBFBD>?<3F>?值<E580BC>? * 限定条件net_init 已完<E5B7B2>? * 函数说明:在 netTask 中运行,轮询 Socket 1~7 回显接收数据
*/
void ch395f_phase4_tests(void) {
#ifdef ENABLE_PHASE4_TESTS
@@ -368,9 +368,9 @@ void ch395f_phase4_tests(void) {
continue;
}
int n = net_recv(i, s_phase4_buf, sizeof(s_phase4_buf), NET_MSG_DONTWAIT);
int n = net_recv_sock(sk, s_phase4_buf, sizeof(s_phase4_buf), NET_MSG_DONTWAIT);
if (n > 0) {
net_send(i, s_phase4_buf, n, 0);
net_send_sock(sk, s_phase4_buf, n);
}
}
#endif
@@ -378,7 +378,7 @@ void ch395f_phase4_tests(void) {
/*
* ============================ Phase 5 ============================
* NET ï¿?UDP Echo:netTask 中è¿<EFBFBD>行,ï¿?net_recvfrom + net_sendto 回显
* NET <EFBFBD>?UDP EchonetTask 中运行<EFBFBD>?net_recvfrom + net_sendto 回显
*/
#ifndef PHASE5_LOCAL_PORT
@@ -392,8 +392,8 @@ static uint32_t s_phase5_count = 0;
#endif
/*
* 函数功能:NET ï¿?UDP Echo åˆ<EFBFBD>å§ï¿? * å…¥å<C2A5>£å<C2A3>数:无
* ï¿?ï¿?值:ï¿? * é™<C3A9>定æ<C5A1>¡ä»¶ï¼šnet_init 已完ï¿? * 函数说明:创ï¿?UDP Socket 并绑定本地端ï¿? */
* 函数功能:NET <EFBFBD>?UDP Echo 初始<EFBFBD>? * 入口参数:无
* <EFBFBD>?<3F>?值<E580BC>? * 限定条件net_init 已完<E5B7B2>? * 函数说明<EFBC9A>?UDP Socket 并绑定本地端<E59CB0>? */
void ch395f_phase5_init(void) {
#ifdef ENABLE_PHASE5_TESTS
struct net_sockaddr_in addr;
@@ -410,7 +410,7 @@ void ch395f_phase5_init(void) {
if (net_bind(s_phase5_sock, (struct net_sockaddr *)&addr, sizeof(addr)) < 0) {
DBG_ERROR("Phase5: net_bind failed");
net_close(s_phase5_sock);
net_close_sock(net_get_sock(s_phase5_sock));
s_phase5_sock = -1;
return;
}
@@ -421,9 +421,9 @@ void ch395f_phase5_init(void) {
}
/*
* 函数功能:NET �UDP Echo 测试
* 函数功能:NET <EFBFBD>?UDP Echo 测试
* 入口参数:无
* ï¿?ï¿?值:ï¿? * é™<C3A9>定æ<C5A1>¡ä»¶ï¼šch395f_phase5_init å·²æˆ<C3A6>功调ï¿? * 函数说明:在 netTask 中è¿<C3A8>è¡Œï¼Œåžæ˜¾ UDP 接收数æ<C2B0>®
* <EFBFBD>?<3F>?值<E580BC>? * 限定条件ch395f_phase5_init 已成功调<E58A9F>? * 函数说明:在 netTask 中运行,回显 UDP 接收数据
*/
void ch395f_phase5_tests(void) {
#ifdef ENABLE_PHASE5_TESTS
@@ -445,7 +445,7 @@ void ch395f_phase5_tests(void) {
}
/*
* Phase 6 é…<EFBFBD>置默认ï¿? */
* Phase 6 配置默认<EFBFBD>? */
#ifndef PHASE6_ANNOUNCE_PORT
#define PHASE6_ANNOUNCE_PORT 60001
#endif
@@ -457,8 +457,8 @@ void ch395f_phase5_tests(void) {
* ============================ Phase 6 ============================
* 函数功能DHCP 自动获取 IP 测试
* 入口参数:无
* ï¿?ï¿?值:ï¿? * é™<C3A9>定æ<C5A1>¡ä»¶ï¼šå±€åŸŸç½å†…å­˜ï¿?DHCP Server
* 函数说明:å<EFBFBD>¯ï¿?DHCP ï¿?轮询等待 IP ï¿?打å<E2809C>°ç»“æžœ ï¿?广播宣告 ï¿?HELLO 回显
* <EFBFBD>?<3F>?值<E580BC>? * 限定条件局域网内存<E58685>?DHCP Server
* 函数说明<EFBFBD>?DHCP <20>?轮询等待 IP <20>?打印结果 <20>?广播宣告 <20>?HELLO 回显
*/
void ch395f_phase6_tests(void) {
@@ -498,7 +498,7 @@ void ch395f_phase6_tests(void) {
goto phase6_end;
}
/* 3. 读å<EFBFBD>获å<EFBFBD>ï¿?IP */
/* 3. 读取获取<EFBFBD>?IP */
ch395f_get_ip_inf(ip_info);
DBG_INFO(" IP: %d.%d.%d.%d", ip_info[0], ip_info[1], ip_info[2], ip_info[3]);
DBG_INFO(" GW: %d.%d.%d.%d", ip_info[4], ip_info[5], ip_info[6], ip_info[7]);
@@ -515,7 +515,7 @@ void ch395f_phase6_tests(void) {
uint8_t bcast_ip[4] = {0xFF, 0xFF, 0xFF, 0xFF};
uint8_t rx_buf[64] = {0};
/* UDP Server 模å¼<EFBFBD>:本地端ï¿?60000(接ï¿?HELLO),DesIP=0xFFFFFFFF */
/* UDP Server 模式本地端<EFBFBD>?60000<EFBC88>?HELLODesIP=0xFFFFFFFF */
ch395f_set_proto_type(anno_sock, CH395F_PROTO_TYPE_UDP);
ch395f_set_send_buf(anno_sock, 24, 2);
ch395f_set_recv_buf(anno_sock, 26, 2);
@@ -524,7 +524,7 @@ void ch395f_phase6_tests(void) {
ch395f_set_des_port(anno_sock, 0);
if (ch395f_open_socket(anno_sock) == CH395F_ERR_SUCCESS) {
/* å<EFBFBD>é€<EFBFBD>广æ­å®£åŠï¼ˆå®£åŠç«¯å<EFBFBD>£ = 60001,æ<C592>¥æº<C3A6>端ï¿?= 60000ï¿?*/
/* 发送广播宣告(宣告端口 = 60001来源端<E6BA90>?= 60000<EFBFBD>?*/
ch395f_set_des_ip(anno_sock, bcast_ip);
ch395f_set_des_port(anno_sock, PHASE6_ANNOUNCE_PORT);
ch395f_write_send_buf(anno_sock, ip_info, 4);
@@ -546,14 +546,14 @@ void ch395f_phase6_tests(void) {
PHASE6_HELLO_PORT, PHASE6_ANNOUNCE_PORT);
TEST_CHECK(1, "DHCP announcement sent");
/* é‡<EFBFBD>ç½® Server 模å¼<EFBFBD>,等ï¿?PC å<>�?HELLO */
/* 重置 Server 模式<EFBFBD>?PC 发<>?HELLO */
ch395f_set_des_ip(anno_sock, bcast_ip);
ch395f_set_des_port(anno_sock, 0);
uint32_t wait = HAL_GetTick();
uint8_t hello_ok = 0;
while (HAL_GetTick() - wait < 5000) {
/* 读å<EFBFBD>全局中æ­ï¼ˆåˆ·ï¿?socket 中æ­çжæ€<C3A6>) */
/* 读取全局中断<EFBFBD>?socket 中断状态) */
ch395f_get_glob_int_status_all();
uint16_t rlen = ch395f_get_recv_len(anno_sock);
if (rlen > 8) {
@@ -593,7 +593,7 @@ phase6_end:
/*
* ============================ Phase 7 ============================
* Select/Poll I/O 多路å¤<EFBFBD>用æµè¯• ï¿?net_select() + net_recv/send echo
* Select/Poll I/O 多路复用测试 <20>?net_select() + net_recv/send echo
*/
#include "net_select.h"
@@ -605,7 +605,7 @@ static char s_phase7_buf[2048];
/*
* 函数功能Select/Poll I/O 多路复用测试
* 入口参数:无
* ï¿?ï¿?值:ï¿? * é™<C3A9>定æ<C5A1>¡ä»¶ï¼šnet_init 已完æˆ<C3A6>,多连ï¿?TCP Server å·²å<C2B2>¯ï¿? * 函数说明:在 netTask 中è¿<C3A8>行,验è¯<C3A8> select/poll 正确返回读写事件
* <EFBFBD>?<3F>?值<E580BC>? * 限定条件net_init 已完成多连<E5A49A>?TCP Server 已启<E5B7B2>? * 函数说明:在 netTask 中运行,验证 select/poll 正确返回读写事件
*/
void ch395f_phase7_tests(void) {
#ifdef ENABLE_PHASE7_TESTS
@@ -630,11 +630,12 @@ void ch395f_phase7_tests(void) {
if (n <= 0) return;
for (int i = 0; i < NET_MAX_SOCKETS; i++) {
if (!NET_FD_ISSET(i, &readfds)) continue;
net_sock_t *sk = net_get_sock(i);
if (!sk || !NET_FD_ISSET(i, &readfds)) continue;
int len = net_recv(i, s_phase7_buf, sizeof(s_phase7_buf), NET_MSG_DONTWAIT);
int len = net_recv_sock(sk, s_phase7_buf, sizeof(s_phase7_buf), NET_MSG_DONTWAIT);
if (len > 0) {
net_send(i, s_phase7_buf, len, 0);
net_send_sock(sk, s_phase7_buf, len);
s_phase7_count++;
TEST_CHECK(1, "Phase7: select echo #%lu (sock=%d, %d bytes)", s_phase7_count, i, len);
}