feat: WiFi驱动(ath9k) + TTF字体 + shell命令行 + FirstInit WiFi跳过

新增: ath9k PCIe WiFi驱动(被动扫描/beacon解析), shell命令行(help/clear/echo/version/date/reboot/halt), Consolas 18px TTF字体, render_ascii.py

修改: dkm_net_api扩展scan接口, FirstInit无WiFi设备时跳过, DSK加载shell.elf, 非首次启动直接进shell
This commit is contained in:
xyou
2026-07-03 12:59:59 +08:00
parent 129175a5d8
commit 3662345434
31 changed files with 4437 additions and 240 deletions
+35
View File
@@ -4,15 +4,40 @@
#include <utsm/types.h>
#define DKM_NET_MAX_DEVICES 8u
#define DKM_NET_MAX_SCAN_RESULTS 32u
#define DKM_NET_SSID_MAX 32u
/* 网卡链路/能力标志。 */
#define DKM_NET_F_LINK_UP (1u << 0)
#define DKM_NET_F_TX_READY (1u << 1)
#define DKM_NET_F_RX_READY (1u << 2)
#define DKM_NET_F_WIRELESS (1u << 3)
/* WiFi 扫描结果加密类型。 */
#define DKM_NET_SEC_OPEN 0u
#define DKM_NET_SEC_WEP 1u
#define DKM_NET_SEC_WPA 2u
#define DKM_NET_SEC_WPA2 3u
#define DKM_NET_SEC_WPA3 4u
typedef int (*dkm_net_tx_fn)(void *ctx, const void *packet, u32 length);
typedef int (*dkm_net_rx_poll_fn)(void *ctx, void *buffer, u32 capacity, u32 *out_length);
/* WiFi 扫描结果(须先于回调 typedef 定义)。 */
typedef struct dkm_net_scan_result {
char ssid[DKM_NET_SSID_MAX + 1];
u8 bssid[6];
u8 channel;
i8 rssi; /* dBm,负值 */
u8 security; /* DKM_NET_SEC_* */
} dkm_net_scan_result;
/* 无线扫描回调(无线驱动填,有线驱动置 NULL)。 */
typedef int (*dkm_net_scan_start_fn)(void *ctx);
typedef int (*dkm_net_scan_count_fn)(void *ctx);
typedef int (*dkm_net_scan_result_fn)(void *ctx, u32 n, dkm_net_scan_result *out);
typedef int (*dkm_net_is_wireless_fn)(void *ctx);
typedef struct dkm_net_device_desc {
const char *name;
u8 mac[6];
@@ -20,6 +45,11 @@ typedef struct dkm_net_device_desc {
void *ctx;
dkm_net_tx_fn tx;
dkm_net_rx_poll_fn rx_poll;
/* 无线扩展回调(无线驱动填,有线驱动置 NULL,向后兼容)。 */
dkm_net_scan_start_fn scan_start;
dkm_net_scan_count_fn scan_count;
dkm_net_scan_result_fn scan_result;
dkm_net_is_wireless_fn is_wireless;
} dkm_net_device_desc;
typedef struct dkm_net_device_info {
@@ -34,6 +64,11 @@ typedef struct dkm_net_api {
int (*device_info)(u32 index, dkm_net_device_info *out);
int (*tx)(u32 index, const void *packet, u32 length);
int (*rx_poll)(u32 index, void *buffer, u32 capacity, u32 *out_length);
/* 无线扫描接口(dispatch 到驱动回调,有线设备返回 -3 表示不支持)。 */
int (*scan_start)(u32 index);
int (*scan_count)(u32 index);
int (*scan_result)(u32 index, u32 n, dkm_net_scan_result *out);
int (*is_wireless)(u32 index);
} dkm_net_api;
void net_init(void);
+37 -1
View File
@@ -5,6 +5,9 @@
* 最小 netdev 注册表:
* - 早期 DKM 驱动加载路径是单线程顺序执行,当前无需引入锁,避免在网络底座阶段扩大复杂度。
* - 后续进入多核/热插拔后,应在 register/device_info 外围加自旋锁或 RCU 风格只读快照。
*
* 无线扫描接口(scan_start/scan_count/scan_result/is_wireless)通过 dispatch 转发到驱动
* 注册的回调。有线驱动(e1000/virtio_net)不填这些回调,dispatch 时返回 -3 表示不支持。
*/
static dkm_net_device_desc g_net_devices[DKM_NET_MAX_DEVICES];
static u32 g_net_device_count;
@@ -60,12 +63,45 @@ static int net_rx_poll_impl(u32 index, void *buffer, u32 capacity, u32 *out_leng
return dev->rx_poll(dev->ctx, buffer, capacity, out_length);
}
static int net_scan_start_impl(u32 index) {
if (index >= g_net_device_count) return -2;
const dkm_net_device_desc *dev = &g_net_devices[index];
if (!dev->scan_start) return -3;
return dev->scan_start(dev->ctx);
}
static int net_scan_count_impl(u32 index) {
if (index >= g_net_device_count) return -2;
const dkm_net_device_desc *dev = &g_net_devices[index];
if (!dev->scan_count) return -3;
return dev->scan_count(dev->ctx);
}
static int net_scan_result_impl(u32 index, u32 n, dkm_net_scan_result *out) {
if (!out) return -1;
if (index >= g_net_device_count) return -2;
const dkm_net_device_desc *dev = &g_net_devices[index];
if (!dev->scan_result) return -3;
return dev->scan_result(dev->ctx, n, out);
}
static int net_is_wireless_impl(u32 index) {
if (index >= g_net_device_count) return -2;
const dkm_net_device_desc *dev = &g_net_devices[index];
if (dev->is_wireless) return dev->is_wireless(dev->ctx);
return (dev->flags & DKM_NET_F_WIRELESS) ? 1 : 0;
}
static const dkm_net_api g_net_api = {
.register_device = net_register_device_impl,
.device_count = net_device_count_impl,
.device_info = net_device_info_impl,
.tx = net_tx_impl,
.rx_poll = net_rx_poll_impl
.rx_poll = net_rx_poll_impl,
.scan_start = net_scan_start_impl,
.scan_count = net_scan_count_impl,
.scan_result = net_scan_result_impl,
.is_wireless = net_is_wireless_impl
};
const dkm_net_api *net_get_api(void) {
Binary file not shown.