chore: httpd

This commit is contained in:
2025-11-08 00:39:15 +06:00
parent 90e8a20a8b
commit 686bccd0ce
7 changed files with 166 additions and 18 deletions

1
.gitignore vendored
View File

@@ -58,3 +58,4 @@ dkms.conf
main.lst
main_ext.bin
main.bin
bin/

View File

@@ -20,10 +20,8 @@ LWIP_C_FILES :=
LWIP_C_FILES += $(COREFILES)
LWIP_C_FILES += $(CORE4FILES)
LWIP_C_FILES += $(NETIFFILES)
# Add APIFILES if you are using the Netconn/Socket API
# ifeq ($(USE_API), 1)
# LWIP_C_FILES += $(APIFILES)
# endif
LWIP_C_FILES += $(HTTPFILES)
LWIP_C_FILES_WITH_PATH := $(LWIP_C_FILES)
LWIP_PORT_FILES := $(wildcard $(PORT_DIR)/*.c)
@@ -32,7 +30,7 @@ INCLUDE_DIRS ?= \
-I$(LWIP_DIR)/src/include \
-I$(PORT_DIR)
PROJECT_C_FILES := $(filter-out ./main.c, $(wildcard ./*.c))
PROJECT_C_FILES := $(filter-out ./main.c ./fsdata_custom.c, $(wildcard ./*.c))
LIB_C_FILES :=
# Add all lwIP sources to the main build variable

BIN
bin/makefsdata Executable file

Binary file not shown.

104
fsdata_custom.c Normal file
View File

@@ -0,0 +1,104 @@
#include "lwip/apps/fs.h"
#include "lwip/def.h"
#define file_NULL (struct fsdata_file *) NULL
#ifndef FS_FILE_FLAGS_HEADER_INCLUDED
#define FS_FILE_FLAGS_HEADER_INCLUDED 1
#endif
#ifndef FS_FILE_FLAGS_HEADER_PERSISTENT
#define FS_FILE_FLAGS_HEADER_PERSISTENT 0
#endif
/* FSDATA_FILE_ALIGNMENT: 0=off, 1=by variable, 2=by include */
#ifndef FSDATA_FILE_ALIGNMENT
#define FSDATA_FILE_ALIGNMENT 0
#endif
#ifndef FSDATA_ALIGN_PRE
#define FSDATA_ALIGN_PRE
#endif
#ifndef FSDATA_ALIGN_POST
#define FSDATA_ALIGN_POST
#endif
#if FSDATA_FILE_ALIGNMENT==2
#include "fsdata_alignment.h"
#endif
#if FSDATA_FILE_ALIGNMENT==1
static const unsigned int dummy_align__index_html = 0;
#endif
static const unsigned char FSDATA_ALIGN_PRE data__index_html[] FSDATA_ALIGN_POST = {
/* /index.html (12 chars) */
0x2f,0x69,0x6e,0x64,0x65,0x78,0x2e,0x68,0x74,0x6d,0x6c,0x00,
/* HTTP header */
/* "HTTP/1.0 200 OK
" (17 bytes) */
0x48,0x54,0x54,0x50,0x2f,0x31,0x2e,0x30,0x20,0x32,0x30,0x30,0x20,0x4f,0x4b,0x0d,
0x0a,
/* "Server: lwIP/2.2.2d (http://savannah.nongnu.org/projects/lwip)
" (64 bytes) */
0x53,0x65,0x72,0x76,0x65,0x72,0x3a,0x20,0x6c,0x77,0x49,0x50,0x2f,0x32,0x2e,0x32,
0x2e,0x32,0x64,0x20,0x28,0x68,0x74,0x74,0x70,0x3a,0x2f,0x2f,0x73,0x61,0x76,0x61,
0x6e,0x6e,0x61,0x68,0x2e,0x6e,0x6f,0x6e,0x67,0x6e,0x75,0x2e,0x6f,0x72,0x67,0x2f,
0x70,0x72,0x6f,0x6a,0x65,0x63,0x74,0x73,0x2f,0x6c,0x77,0x69,0x70,0x29,0x0d,0x0a,
/* "Content-Length: 549
" (18+ bytes) */
0x43,0x6f,0x6e,0x74,0x65,0x6e,0x74,0x2d,0x4c,0x65,0x6e,0x67,0x74,0x68,0x3a,0x20,
0x35,0x34,0x39,0x0d,0x0a,
/* "Content-Type: text/html
" (27 bytes) */
0x43,0x6f,0x6e,0x74,0x65,0x6e,0x74,0x2d,0x54,0x79,0x70,0x65,0x3a,0x20,0x74,0x65,
0x78,0x74,0x2f,0x68,0x74,0x6d,0x6c,0x0d,0x0a,0x0d,0x0a,
/* raw file data (549 bytes) */
0x3c,0x21,0x44,0x4f,0x43,0x54,0x59,0x50,0x45,0x20,0x68,0x74,0x6d,0x6c,0x3e,0x0a,
0x3c,0x68,0x74,0x6d,0x6c,0x3e,0x0a,0x20,0x20,0x20,0x20,0x3c,0x68,0x65,0x61,0x64,
0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x74,0x69,0x74,0x6c,0x65,
0x3e,0x48,0x65,0x6c,0x6c,0x6f,0x20,0x66,0x72,0x6f,0x6d,0x20,0x43,0x48,0x33,0x32,
0x56,0x32,0x30,0x38,0x3c,0x2f,0x74,0x69,0x74,0x6c,0x65,0x3e,0x0a,0x20,0x20,0x20,
0x20,0x20,0x20,0x20,0x20,0x3c,0x73,0x74,0x79,0x6c,0x65,0x3e,0x0a,0x20,0x20,0x20,
0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x62,0x6f,0x64,0x79,0x20,0x7b,0x0a,
0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
0x66,0x6f,0x6e,0x74,0x2d,0x66,0x61,0x6d,0x69,0x6c,0x79,0x3a,0x20,0x73,0x61,0x6e,
0x73,0x2d,0x73,0x65,0x72,0x69,0x66,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x74,0x65,0x78,0x74,0x2d,0x61,0x6c,
0x69,0x67,0x6e,0x3a,0x20,0x63,0x65,0x6e,0x74,0x65,0x72,0x3b,0x0a,0x20,0x20,0x20,
0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x62,0x61,0x63,
0x6b,0x67,0x72,0x6f,0x75,0x6e,0x64,0x2d,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x20,0x23,
0x66,0x30,0x66,0x30,0x66,0x30,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6d,0x61,0x72,0x67,0x69,0x6e,0x2d,0x74,
0x6f,0x70,0x3a,0x20,0x35,0x30,0x70,0x78,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,
0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
0x20,0x20,0x20,0x20,0x68,0x31,0x20,0x7b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x20,
0x23,0x33,0x33,0x33,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
0x20,0x20,0x7d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
0x70,0x20,0x7b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
0x20,0x20,0x20,0x20,0x63,0x6f,0x6c,0x6f,0x72,0x3a,0x20,0x23,0x35,0x35,0x35,0x3b,
0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x0a,0x20,
0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x73,0x74,0x79,0x6c,0x65,0x3e,0x0a,
0x20,0x20,0x20,0x20,0x3c,0x2f,0x68,0x65,0x61,0x64,0x3e,0x0a,0x20,0x20,0x20,0x20,
0x3c,0x62,0x6f,0x64,0x79,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
0x68,0x31,0x3e,0x48,0x65,0x6c,0x6c,0x6f,0x20,0x57,0x6f,0x72,0x6c,0x64,0x3c,0x2f,
0x68,0x31,0x3e,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x70,0x3e,0x54,
0x68,0x69,0x73,0x20,0x70,0x61,0x67,0x65,0x20,0x69,0x73,0x20,0x73,0x65,0x72,0x76,
0x65,0x64,0x20,0x66,0x72,0x6f,0x6d,0x20,0x43,0x48,0x33,0x32,0x56,0x32,0x30,0x38,
0x20,0x75,0x73,0x69,0x6e,0x67,0x20,0x6c,0x77,0x49,0x50,0x2e,0x3c,0x2f,0x70,0x3e,
0x0a,0x20,0x20,0x20,0x20,0x3c,0x2f,0x62,0x6f,0x64,0x79,0x3e,0x0a,0x3c,0x2f,0x68,
0x74,0x6d,0x6c,0x3e,0x0a,};
const struct fsdata_file file__index_html[] = { {
file_NULL,
data__index_html,
data__index_html + 12,
sizeof(data__index_html) - 12,
FS_FILE_FLAGS_HEADER_INCLUDED | FS_FILE_FLAGS_HEADER_PERSISTENT,
}};
#define FS_ROOT file__index_html
#define FS_NUMFILES 1

35
main.c
View File

@@ -3,6 +3,7 @@
#include "ch32fun.h"
#include "ch32v20xhw.h"
#include "ethernetif.h"
#include "lwip/apps/httpd.h"
#include "lwip/dhcp.h"
#include "lwip/init.h"
#include "lwip/netif.h"
@@ -73,6 +74,26 @@ void led_init(void) {
GPIOA->CFGLR |= (GPIO_Speed_10MHz | GPIO_CNF_OUT_PP) << (4 * LED2_PIN);
}
static void netif_status_callback(struct netif* netif) {
if (netif_is_up(netif) && !ip_addr_isany_val(*netif_ip4_addr(netif))) {
printf("netif UP\n");
printf(" MAC : %02X:%02X:%02X:%02X:%02X:%02X\n", netif->hwaddr[0],
netif->hwaddr[1], netif->hwaddr[2], netif->hwaddr[3],
netif->hwaddr[4], netif->hwaddr[5]);
printf(" IP : %s\n", ip4addr_ntoa(netif_ip4_addr(netif)));
printf(" Mask : %s\n", ip4addr_ntoa(netif_ip4_netmask(netif)));
printf(" GW : %s\n", ip4addr_ntoa(netif_ip4_gw(netif)));
httpd_init();
printf("HTTP server init\n");
GPIOA->BSHR = (1 << LED2_PIN);
} else {
printf("netif DOWN or has no IP address\n");
GPIOA->BSHR = (1 << (LED2_PIN + 16));
}
}
void lwip_stack_init(void) {
ip_addr_t ipaddr, netmask, gw;
@@ -85,6 +106,8 @@ void lwip_stack_init(void) {
netif_add(&g_netif, &ipaddr, &netmask, &gw, NULL, &ethernetif_init,
&ethernet_input);
netif_set_status_callback(&g_netif, netif_status_callback);
netif_set_default(&g_netif);
netif_set_up(&g_netif);
@@ -107,18 +130,16 @@ int main() {
uint32_t last_led_toggle_time = 0;
uint32_t last_link_poll_time = 0;
int led_state = 0;
int ip_address_printed = 0;
while (1) {
ethernetif_input(&g_netif);
sys_check_timeouts();
if (millis() - last_link_poll_time > LINK_POLL_INTERVAL_MS) {
ethernetif_link_poll(&g_netif);
last_link_poll_time = millis();
}
sys_check_timeouts();
uint32_t now = millis();
if (now - last_led_toggle_time > LED_TOGGLE_INTERVAL_MS) {
if (led_state) {
@@ -129,13 +150,5 @@ int main() {
led_state = !led_state;
last_led_toggle_time = now;
}
if (!ip_address_printed && g_netif.ip_addr.addr != 0) {
printf("IP address assigned: %s\n",
ip4addr_ntoa(netif_ip4_addr(&g_netif)));
ip_address_printed = 1;
GPIOA->BSHR = (1 << LED2_PIN);
}
}
}

View File

@@ -6,7 +6,7 @@
// #define UDP_DEBUG LWIP_DBG_ON
// #define IP_DEBUG LWIP_DBG_ON
#define DHCP_DEBUG LWIP_DBG_ON
// #define DHCP_DEBUG LWIP_DBG_ON
#define NETIF_DEBUG LWIP_DBG_ON
// #define ETHARP_DEBUG LWIP_DBG_ON
@@ -17,7 +17,7 @@
// Memory options
#define MEM_ALIGNMENT 4
#define MEM_SIZE (4 * 1024) // 4KB of RAM for lwIP heap
#define MEM_SIZE (10 * 1024) // 4KB of RAM for lwIP heap
// Pbuf options
#define PBUF_POOL_SIZE 8
@@ -52,6 +52,14 @@
// Statistics
#define LWIP_STATS 0
#define LWIP_HTTPD 1
// Use a read-only filesystem populated by makefsdata
// #define HTTPD_FSDATA_FILE "fsdata_custom.c"
#define LWIP_HTTPD_FS_SUPPORT 1
#define HTTPD_USE_CUSTOM_FSDATA 1
#define LWIP_NETIF_HOSTNAME 1
// #define LWIP_NETIF_LINK_CALLBACK 1
#define LWIP_NETIF_STATUS_CALLBACK 1
#endif /* __LWIPOPTS_H__ */

24
web_content/index.html Normal file
View File

@@ -0,0 +1,24 @@
<!DOCTYPE html>
<html>
<head>
<title>Hello from CH32V208</title>
<style>
body {
font-family: sans-serif;
text-align: center;
background-color: #f0f0f0;
margin-top: 50px;
}
h1 {
color: #333;
}
p {
color: #555;
}
</style>
</head>
<body>
<h1>Hello World</h1>
<p>This page is served from CH32V208 using lwIP.</p>
</body>
</html>