wol_run() 函数通过不断检查 Socket 状态执行对应操作:SOCK_CLOSED 时创建 UDP Socket 并开启 WOL 功能及中断;SOCK_UDP 时监听中断寄存器,当 IR 寄存器的 MP 位(0x10)生效时判定收到魔术包。
文件:USER/wol.c | 函数:wol_run()
void wol_run(uint8_t sn, uint8_t *buf, uint16_t local_port)
{
switch (getSn_SR(sn))
{
case SOCK_UDP:
if (getSn_IR(sn) & Sn_IR_RECV)
{
setSn_IR(sn, Sn_IR_RECV);
}
if (getIR() & IR_MP) // Received WOL Magic packet based on UDP.
{
printf("get wake on line\r\n");
setIR(0x10);
}
break;
case SOCK_CLOSED:
setIMR(IM_IR4); // Open WOL magic pack interrupt
setMR(MR_WOL); // Receive WOL packets
socket(sn, Sn_MR_UDP, local_port, 0);
printf("%d:Opened, UDP WOL, port [%d]\r\n", sn, local_port);
break;
}
}
关键点:SOCK_CLOSED 时通过 setIMR(IM_IR4) 开启 WOL 魔术包中断,通过 setMR(MR_WOL) 使能 WOL 接收模式,再以 UDP 模式打开 Socket 监听 9000 端口。SOCK_UDP 时清接收中断标志,检测 IR_MP(0x10)位——该位由硬件在收到魔术包时置位,检测到即打印 get wake on line,并通过 setIR(0x10) 清中断。
打开 WIZ UartTool V1.0,连接 DEBUG USB 对应 COM 口(115200 / 8N1)。烧录例程运行后,首先进行 PHY 链路检测和 DHCP 获取网络地址,然后打开 UDP WOL Socket 并监听 9000 端口。预期串口输出如下:
W55MH32 WOL example
PHY link
The current Mbtis speed : 100Mbps
The current Duplex Mode : Full-Duplex
DHCP running
DHCP success!
====================================================================================================
W55MH32 network configuration : DHCP
MAC : 00:08:DC:00:0E:9A
IP : 192.168.1.6
Subnet Mask : 255.255.255.0
Gateway : 192.168.1.1
DNS : 192.168.1.1
====================================================================================================
0:Opened, UDP WOL, port [9000]
然后在 PC 端打开 SocketTester,设置 UDP 模式,目标 IP 为 W55MH32 的 IP(192.168.1.6),目标端口为 9000,发送 HEX 格式的魔术包数据。