annotate megawifi.c @ 1959:6d99bdbf1e3e

megawifi: refactor and update commands
author doragasu <doragasu@hotmail.com>
date Sun, 03 May 2020 12:38:28 -0700
parents 1a09422b87a5
children f79e16d8baa4
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1513
8f3b6a64b658 Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1 #include <stdlib.h>
8f3b6a64b658 Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
2 #include <stdint.h>
8f3b6a64b658 Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
3 #include <string.h>
1516
aaab852803ac Get enough of MegaWifi implemented so that basic commands from wflash CLI command work
Michael Pavone <pavone@retrodev.com>
parents: 1515
diff changeset
4 #include <sys/types.h>
1546
1a09422b87a5 Get Windows build working again. MegaWiFi code probably needs more work before it will actually work on Windows, but at least it doesn't break the build now
Michael Pavone <pavone@retrodev.com>
parents: 1535
diff changeset
5 #ifdef _WIN32
1a09422b87a5 Get Windows build working again. MegaWiFi code probably needs more work before it will actually work on Windows, but at least it doesn't break the build now
Michael Pavone <pavone@retrodev.com>
parents: 1535
diff changeset
6 #define WINVER 0x501
1a09422b87a5 Get Windows build working again. MegaWiFi code probably needs more work before it will actually work on Windows, but at least it doesn't break the build now
Michael Pavone <pavone@retrodev.com>
parents: 1535
diff changeset
7 #include <winsock2.h>
1a09422b87a5 Get Windows build working again. MegaWiFi code probably needs more work before it will actually work on Windows, but at least it doesn't break the build now
Michael Pavone <pavone@retrodev.com>
parents: 1535
diff changeset
8 #include <ws2tcpip.h>
1a09422b87a5 Get Windows build working again. MegaWiFi code probably needs more work before it will actually work on Windows, but at least it doesn't break the build now
Michael Pavone <pavone@retrodev.com>
parents: 1535
diff changeset
9 #else
1516
aaab852803ac Get enough of MegaWifi implemented so that basic commands from wflash CLI command work
Michael Pavone <pavone@retrodev.com>
parents: 1515
diff changeset
10 #include <sys/socket.h>
aaab852803ac Get enough of MegaWifi implemented so that basic commands from wflash CLI command work
Michael Pavone <pavone@retrodev.com>
parents: 1515
diff changeset
11 #include <unistd.h>
aaab852803ac Get enough of MegaWifi implemented so that basic commands from wflash CLI command work
Michael Pavone <pavone@retrodev.com>
parents: 1515
diff changeset
12 #include <netinet/in.h>
1546
1a09422b87a5 Get Windows build working again. MegaWiFi code probably needs more work before it will actually work on Windows, but at least it doesn't break the build now
Michael Pavone <pavone@retrodev.com>
parents: 1535
diff changeset
13 #endif
1516
aaab852803ac Get enough of MegaWifi implemented so that basic commands from wflash CLI command work
Michael Pavone <pavone@retrodev.com>
parents: 1515
diff changeset
14 #include <errno.h>
aaab852803ac Get enough of MegaWifi implemented so that basic commands from wflash CLI command work
Michael Pavone <pavone@retrodev.com>
parents: 1515
diff changeset
15 #include <fcntl.h>
1513
8f3b6a64b658 Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
16 #include "genesis.h"
1514
4f94e0f90c83 Added support for MegaWiFi command IP_CURRENT
Michael Pavone <pavone@retrodev.com>
parents: 1513
diff changeset
17 #include "net.h"
1513
8f3b6a64b658 Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
18
8f3b6a64b658 Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
19 enum {
8f3b6a64b658 Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
20 TX_IDLE,
8f3b6a64b658 Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
21 TX_LEN1,
8f3b6a64b658 Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
22 TX_LEN2,
8f3b6a64b658 Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
23 TX_PAYLOAD,
8f3b6a64b658 Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
24 TX_WAIT_ETX
8f3b6a64b658 Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
25 };
8f3b6a64b658 Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
26 #define STX 0x7E
8f3b6a64b658 Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
27 #define ETX 0x7E
1959
6d99bdbf1e3e megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents: 1546
diff changeset
28 #define MAX_RECV_SIZE 1460
1513
8f3b6a64b658 Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
29
8f3b6a64b658 Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
30 #define E(N) N
8f3b6a64b658 Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
31 enum {
8f3b6a64b658 Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
32 #include "mw_commands.c"
8f3b6a64b658 Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
33 CMD_ERROR = 255
8f3b6a64b658 Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
34 };
8f3b6a64b658 Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
35 #undef E
8f3b6a64b658 Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
36 #define E(N) #N
8f3b6a64b658 Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
37 static const char *cmd_names[] = {
8f3b6a64b658 Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
38 #include "mw_commands.c"
8f3b6a64b658 Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
39 [255] = "CMD_ERROR"
8f3b6a64b658 Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
40 };
8f3b6a64b658 Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
41
1535
2781b9551004 MSG_NOSIGNAL doesn't exist on all platforms
Michael Pavone <pavone@retrodev.com>
parents: 1518
diff changeset
42 #ifndef MSG_NOSIGNAL
2781b9551004 MSG_NOSIGNAL doesn't exist on all platforms
Michael Pavone <pavone@retrodev.com>
parents: 1518
diff changeset
43 #define MSG_NOSIGNAL 0
2781b9551004 MSG_NOSIGNAL doesn't exist on all platforms
Michael Pavone <pavone@retrodev.com>
parents: 1518
diff changeset
44 #endif
2781b9551004 MSG_NOSIGNAL doesn't exist on all platforms
Michael Pavone <pavone@retrodev.com>
parents: 1518
diff changeset
45
1513
8f3b6a64b658 Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
46 enum {
8f3b6a64b658 Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
47 STATE_IDLE=1,
8f3b6a64b658 Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
48 STATE_AP_JOIN,
8f3b6a64b658 Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
49 STATE_SCAN,
8f3b6a64b658 Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
50 STATE_READY,
8f3b6a64b658 Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
51 STATE_TRANSPARENT
8f3b6a64b658 Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
52 };
8f3b6a64b658 Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
53
1959
6d99bdbf1e3e megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents: 1546
diff changeset
54 enum {
6d99bdbf1e3e megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents: 1546
diff changeset
55 SOCKST_NONE = 0,
6d99bdbf1e3e megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents: 1546
diff changeset
56 SOCKST_TCP_LISTEN,
6d99bdbf1e3e megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents: 1546
diff changeset
57 SOCKST_TCP_EST,
6d99bdbf1e3e megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents: 1546
diff changeset
58 SOCKST_UDP_READY
6d99bdbf1e3e megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents: 1546
diff changeset
59 };
6d99bdbf1e3e megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents: 1546
diff changeset
60
6d99bdbf1e3e megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents: 1546
diff changeset
61
1513
8f3b6a64b658 Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
62 #define FLAG_ONLINE
8f3b6a64b658 Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
63
8f3b6a64b658 Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
64 typedef struct {
8f3b6a64b658 Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
65 uint32_t transmit_bytes;
8f3b6a64b658 Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
66 uint32_t expected_bytes;
8f3b6a64b658 Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
67 uint32_t receive_bytes;
8f3b6a64b658 Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
68 uint32_t receive_read;
1516
aaab852803ac Get enough of MegaWifi implemented so that basic commands from wflash CLI command work
Michael Pavone <pavone@retrodev.com>
parents: 1515
diff changeset
69 int sock_fds[15];
1513
8f3b6a64b658 Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
70 uint16_t channel_flags;
1516
aaab852803ac Get enough of MegaWifi implemented so that basic commands from wflash CLI command work
Michael Pavone <pavone@retrodev.com>
parents: 1515
diff changeset
71 uint8_t channel_state[15];
1513
8f3b6a64b658 Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
72 uint8_t scratchpad;
8f3b6a64b658 Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
73 uint8_t transmit_channel;
8f3b6a64b658 Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
74 uint8_t transmit_state;
8f3b6a64b658 Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
75 uint8_t module_state;
8f3b6a64b658 Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
76 uint8_t flags;
8f3b6a64b658 Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
77 uint8_t transmit_buffer[4096];
8f3b6a64b658 Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
78 uint8_t receive_buffer[4096];
8f3b6a64b658 Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
79 } megawifi;
8f3b6a64b658 Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
80
8f3b6a64b658 Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
81 static megawifi *get_megawifi(void *context)
8f3b6a64b658 Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
82 {
8f3b6a64b658 Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
83 m68k_context *m68k = context;
8f3b6a64b658 Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
84 genesis_context *gen = m68k->system;
8f3b6a64b658 Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
85 if (!gen->extra) {
8f3b6a64b658 Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
86 gen->extra = calloc(1, sizeof(megawifi));
1516
aaab852803ac Get enough of MegaWifi implemented so that basic commands from wflash CLI command work
Michael Pavone <pavone@retrodev.com>
parents: 1515
diff changeset
87 megawifi *mw = gen->extra;
aaab852803ac Get enough of MegaWifi implemented so that basic commands from wflash CLI command work
Michael Pavone <pavone@retrodev.com>
parents: 1515
diff changeset
88 mw->module_state = STATE_IDLE;
aaab852803ac Get enough of MegaWifi implemented so that basic commands from wflash CLI command work
Michael Pavone <pavone@retrodev.com>
parents: 1515
diff changeset
89 for (int i = 0; i < 15; i++)
aaab852803ac Get enough of MegaWifi implemented so that basic commands from wflash CLI command work
Michael Pavone <pavone@retrodev.com>
parents: 1515
diff changeset
90 {
aaab852803ac Get enough of MegaWifi implemented so that basic commands from wflash CLI command work
Michael Pavone <pavone@retrodev.com>
parents: 1515
diff changeset
91 mw->sock_fds[i] = -1;
aaab852803ac Get enough of MegaWifi implemented so that basic commands from wflash CLI command work
Michael Pavone <pavone@retrodev.com>
parents: 1515
diff changeset
92 }
1513
8f3b6a64b658 Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
93 }
8f3b6a64b658 Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
94 return gen->extra;
8f3b6a64b658 Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
95 }
8f3b6a64b658 Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
96
8f3b6a64b658 Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
97 static void mw_putc(megawifi *mw, uint8_t v)
8f3b6a64b658 Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
98 {
8f3b6a64b658 Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
99 if (mw->receive_bytes == sizeof(mw->receive_buffer)) {
8f3b6a64b658 Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
100 return;
8f3b6a64b658 Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
101 }
8f3b6a64b658 Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
102 mw->receive_buffer[mw->receive_bytes++] = v;
8f3b6a64b658 Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
103 }
8f3b6a64b658 Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
104
1515
3fc129eb0653 Cleanup MegaWiFi command implementation
Michael Pavone <pavone@retrodev.com>
parents: 1514
diff changeset
105 static void mw_set(megawifi *mw, uint8_t val, uint32_t count)
3fc129eb0653 Cleanup MegaWiFi command implementation
Michael Pavone <pavone@retrodev.com>
parents: 1514
diff changeset
106 {
3fc129eb0653 Cleanup MegaWiFi command implementation
Michael Pavone <pavone@retrodev.com>
parents: 1514
diff changeset
107 if (count + mw->receive_bytes > sizeof(mw->receive_buffer)) {
3fc129eb0653 Cleanup MegaWiFi command implementation
Michael Pavone <pavone@retrodev.com>
parents: 1514
diff changeset
108 count = sizeof(mw->receive_buffer) - mw->receive_bytes;
3fc129eb0653 Cleanup MegaWiFi command implementation
Michael Pavone <pavone@retrodev.com>
parents: 1514
diff changeset
109 }
3fc129eb0653 Cleanup MegaWiFi command implementation
Michael Pavone <pavone@retrodev.com>
parents: 1514
diff changeset
110 memset(mw->receive_buffer + mw->receive_bytes, val, count);
3fc129eb0653 Cleanup MegaWiFi command implementation
Michael Pavone <pavone@retrodev.com>
parents: 1514
diff changeset
111 mw->receive_bytes += count;
3fc129eb0653 Cleanup MegaWiFi command implementation
Michael Pavone <pavone@retrodev.com>
parents: 1514
diff changeset
112 }
3fc129eb0653 Cleanup MegaWiFi command implementation
Michael Pavone <pavone@retrodev.com>
parents: 1514
diff changeset
113
3fc129eb0653 Cleanup MegaWiFi command implementation
Michael Pavone <pavone@retrodev.com>
parents: 1514
diff changeset
114 static void mw_copy(megawifi *mw, const uint8_t *src, uint32_t count)
3fc129eb0653 Cleanup MegaWiFi command implementation
Michael Pavone <pavone@retrodev.com>
parents: 1514
diff changeset
115 {
3fc129eb0653 Cleanup MegaWiFi command implementation
Michael Pavone <pavone@retrodev.com>
parents: 1514
diff changeset
116 if (count + mw->receive_bytes > sizeof(mw->receive_buffer)) {
3fc129eb0653 Cleanup MegaWiFi command implementation
Michael Pavone <pavone@retrodev.com>
parents: 1514
diff changeset
117 count = sizeof(mw->receive_buffer) - mw->receive_bytes;
3fc129eb0653 Cleanup MegaWiFi command implementation
Michael Pavone <pavone@retrodev.com>
parents: 1514
diff changeset
118 }
3fc129eb0653 Cleanup MegaWiFi command implementation
Michael Pavone <pavone@retrodev.com>
parents: 1514
diff changeset
119 memcpy(mw->receive_buffer + mw->receive_bytes, src, count);
3fc129eb0653 Cleanup MegaWiFi command implementation
Michael Pavone <pavone@retrodev.com>
parents: 1514
diff changeset
120 mw->receive_bytes += count;
3fc129eb0653 Cleanup MegaWiFi command implementation
Michael Pavone <pavone@retrodev.com>
parents: 1514
diff changeset
121 }
3fc129eb0653 Cleanup MegaWiFi command implementation
Michael Pavone <pavone@retrodev.com>
parents: 1514
diff changeset
122
1959
6d99bdbf1e3e megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents: 1546
diff changeset
123 static void mw_putraw(megawifi *mw, const char *data, size_t len)
1513
8f3b6a64b658 Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
124 {
8f3b6a64b658 Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
125 if ((mw->receive_bytes + len) > sizeof(mw->receive_buffer)) {
8f3b6a64b658 Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
126 return;
8f3b6a64b658 Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
127 }
1959
6d99bdbf1e3e megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents: 1546
diff changeset
128 memcpy(mw->receive_buffer + mw->receive_bytes, data, len);
1513
8f3b6a64b658 Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
129 mw->receive_bytes += len;
8f3b6a64b658 Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
130 }
8f3b6a64b658 Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
131
1959
6d99bdbf1e3e megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents: 1546
diff changeset
132 static void mw_puts(megawifi *mw, const char *s)
6d99bdbf1e3e megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents: 1546
diff changeset
133 {
6d99bdbf1e3e megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents: 1546
diff changeset
134 size_t len = strlen(s);
6d99bdbf1e3e megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents: 1546
diff changeset
135 mw_putraw(mw, s, len);
6d99bdbf1e3e megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents: 1546
diff changeset
136 }
6d99bdbf1e3e megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents: 1546
diff changeset
137
1516
aaab852803ac Get enough of MegaWifi implemented so that basic commands from wflash CLI command work
Michael Pavone <pavone@retrodev.com>
parents: 1515
diff changeset
138 static void poll_socket(megawifi *mw, uint8_t channel)
aaab852803ac Get enough of MegaWifi implemented so that basic commands from wflash CLI command work
Michael Pavone <pavone@retrodev.com>
parents: 1515
diff changeset
139 {
aaab852803ac Get enough of MegaWifi implemented so that basic commands from wflash CLI command work
Michael Pavone <pavone@retrodev.com>
parents: 1515
diff changeset
140 if (mw->sock_fds[channel] < 0) {
aaab852803ac Get enough of MegaWifi implemented so that basic commands from wflash CLI command work
Michael Pavone <pavone@retrodev.com>
parents: 1515
diff changeset
141 return;
aaab852803ac Get enough of MegaWifi implemented so that basic commands from wflash CLI command work
Michael Pavone <pavone@retrodev.com>
parents: 1515
diff changeset
142 }
1959
6d99bdbf1e3e megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents: 1546
diff changeset
143 if (mw->channel_state[channel] == SOCKST_TCP_LISTEN) {
1516
aaab852803ac Get enough of MegaWifi implemented so that basic commands from wflash CLI command work
Michael Pavone <pavone@retrodev.com>
parents: 1515
diff changeset
144 int res = accept(mw->sock_fds[channel], NULL, NULL);
aaab852803ac Get enough of MegaWifi implemented so that basic commands from wflash CLI command work
Michael Pavone <pavone@retrodev.com>
parents: 1515
diff changeset
145 if (res >= 0) {
aaab852803ac Get enough of MegaWifi implemented so that basic commands from wflash CLI command work
Michael Pavone <pavone@retrodev.com>
parents: 1515
diff changeset
146 close(mw->sock_fds[channel]);
1546
1a09422b87a5 Get Windows build working again. MegaWiFi code probably needs more work before it will actually work on Windows, but at least it doesn't break the build now
Michael Pavone <pavone@retrodev.com>
parents: 1535
diff changeset
147 #ifndef _WIN32
1a09422b87a5 Get Windows build working again. MegaWiFi code probably needs more work before it will actually work on Windows, but at least it doesn't break the build now
Michael Pavone <pavone@retrodev.com>
parents: 1535
diff changeset
148 //FIXME: Set nonblocking on Windows too
1516
aaab852803ac Get enough of MegaWifi implemented so that basic commands from wflash CLI command work
Michael Pavone <pavone@retrodev.com>
parents: 1515
diff changeset
149 fcntl(res, F_SETFL, O_NONBLOCK);
1546
1a09422b87a5 Get Windows build working again. MegaWiFi code probably needs more work before it will actually work on Windows, but at least it doesn't break the build now
Michael Pavone <pavone@retrodev.com>
parents: 1535
diff changeset
150 #endif
1516
aaab852803ac Get enough of MegaWifi implemented so that basic commands from wflash CLI command work
Michael Pavone <pavone@retrodev.com>
parents: 1515
diff changeset
151 mw->sock_fds[channel] = res;
1959
6d99bdbf1e3e megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents: 1546
diff changeset
152 mw->channel_state[channel] = SOCKST_TCP_EST;
1516
aaab852803ac Get enough of MegaWifi implemented so that basic commands from wflash CLI command work
Michael Pavone <pavone@retrodev.com>
parents: 1515
diff changeset
153 mw->channel_flags |= 1 << (channel + 1);
aaab852803ac Get enough of MegaWifi implemented so that basic commands from wflash CLI command work
Michael Pavone <pavone@retrodev.com>
parents: 1515
diff changeset
154 } else if (errno != EAGAIN && errno != EWOULDBLOCK) {
aaab852803ac Get enough of MegaWifi implemented so that basic commands from wflash CLI command work
Michael Pavone <pavone@retrodev.com>
parents: 1515
diff changeset
155 close(mw->sock_fds[channel]);
1959
6d99bdbf1e3e megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents: 1546
diff changeset
156 mw->channel_state[channel] = SOCKST_NONE;
1516
aaab852803ac Get enough of MegaWifi implemented so that basic commands from wflash CLI command work
Michael Pavone <pavone@retrodev.com>
parents: 1515
diff changeset
157 mw->channel_flags |= 1 << (channel + 1);
aaab852803ac Get enough of MegaWifi implemented so that basic commands from wflash CLI command work
Michael Pavone <pavone@retrodev.com>
parents: 1515
diff changeset
158 }
1959
6d99bdbf1e3e megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents: 1546
diff changeset
159 } else if (mw->channel_state[channel] == SOCKST_TCP_EST && mw->receive_bytes < sizeof(mw->receive_buffer) - 4) {
1518
713b504dc577 Limit received LSD packets to 1440 bytes to match expectations of wflash code. Use MSG_NOSIGNAL to avoid getting killed with SIGPIPE
Michael Pavone <pavone@retrodev.com>
parents: 1516
diff changeset
160 size_t max = sizeof(mw->receive_buffer) - 4 - mw->receive_bytes;
713b504dc577 Limit received LSD packets to 1440 bytes to match expectations of wflash code. Use MSG_NOSIGNAL to avoid getting killed with SIGPIPE
Michael Pavone <pavone@retrodev.com>
parents: 1516
diff changeset
161 if (max > MAX_RECV_SIZE) {
713b504dc577 Limit received LSD packets to 1440 bytes to match expectations of wflash code. Use MSG_NOSIGNAL to avoid getting killed with SIGPIPE
Michael Pavone <pavone@retrodev.com>
parents: 1516
diff changeset
162 max = MAX_RECV_SIZE;
713b504dc577 Limit received LSD packets to 1440 bytes to match expectations of wflash code. Use MSG_NOSIGNAL to avoid getting killed with SIGPIPE
Michael Pavone <pavone@retrodev.com>
parents: 1516
diff changeset
163 }
713b504dc577 Limit received LSD packets to 1440 bytes to match expectations of wflash code. Use MSG_NOSIGNAL to avoid getting killed with SIGPIPE
Michael Pavone <pavone@retrodev.com>
parents: 1516
diff changeset
164 int bytes = recv(mw->sock_fds[channel], mw->receive_buffer + mw->receive_bytes + 3, max, 0);
1516
aaab852803ac Get enough of MegaWifi implemented so that basic commands from wflash CLI command work
Michael Pavone <pavone@retrodev.com>
parents: 1515
diff changeset
165 if (bytes > 0) {
aaab852803ac Get enough of MegaWifi implemented so that basic commands from wflash CLI command work
Michael Pavone <pavone@retrodev.com>
parents: 1515
diff changeset
166 mw_putc(mw, STX);
aaab852803ac Get enough of MegaWifi implemented so that basic commands from wflash CLI command work
Michael Pavone <pavone@retrodev.com>
parents: 1515
diff changeset
167 mw_putc(mw, bytes >> 8 | (channel+1) << 4);
aaab852803ac Get enough of MegaWifi implemented so that basic commands from wflash CLI command work
Michael Pavone <pavone@retrodev.com>
parents: 1515
diff changeset
168 mw_putc(mw, bytes);
aaab852803ac Get enough of MegaWifi implemented so that basic commands from wflash CLI command work
Michael Pavone <pavone@retrodev.com>
parents: 1515
diff changeset
169 mw->receive_bytes += bytes;
aaab852803ac Get enough of MegaWifi implemented so that basic commands from wflash CLI command work
Michael Pavone <pavone@retrodev.com>
parents: 1515
diff changeset
170 mw_putc(mw, ETX);
aaab852803ac Get enough of MegaWifi implemented so that basic commands from wflash CLI command work
Michael Pavone <pavone@retrodev.com>
parents: 1515
diff changeset
171 //should this set the channel flag?
aaab852803ac Get enough of MegaWifi implemented so that basic commands from wflash CLI command work
Michael Pavone <pavone@retrodev.com>
parents: 1515
diff changeset
172 } else if (bytes < 0 && errno != EAGAIN && errno != EWOULDBLOCK) {
aaab852803ac Get enough of MegaWifi implemented so that basic commands from wflash CLI command work
Michael Pavone <pavone@retrodev.com>
parents: 1515
diff changeset
173 close(mw->sock_fds[channel]);
1959
6d99bdbf1e3e megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents: 1546
diff changeset
174 mw->channel_state[channel] = SOCKST_NONE;
1516
aaab852803ac Get enough of MegaWifi implemented so that basic commands from wflash CLI command work
Michael Pavone <pavone@retrodev.com>
parents: 1515
diff changeset
175 mw->channel_flags |= 1 << (channel + 1);
aaab852803ac Get enough of MegaWifi implemented so that basic commands from wflash CLI command work
Michael Pavone <pavone@retrodev.com>
parents: 1515
diff changeset
176 }
aaab852803ac Get enough of MegaWifi implemented so that basic commands from wflash CLI command work
Michael Pavone <pavone@retrodev.com>
parents: 1515
diff changeset
177 }
aaab852803ac Get enough of MegaWifi implemented so that basic commands from wflash CLI command work
Michael Pavone <pavone@retrodev.com>
parents: 1515
diff changeset
178 }
aaab852803ac Get enough of MegaWifi implemented so that basic commands from wflash CLI command work
Michael Pavone <pavone@retrodev.com>
parents: 1515
diff changeset
179
aaab852803ac Get enough of MegaWifi implemented so that basic commands from wflash CLI command work
Michael Pavone <pavone@retrodev.com>
parents: 1515
diff changeset
180 static void poll_all_sockets(megawifi *mw)
aaab852803ac Get enough of MegaWifi implemented so that basic commands from wflash CLI command work
Michael Pavone <pavone@retrodev.com>
parents: 1515
diff changeset
181 {
aaab852803ac Get enough of MegaWifi implemented so that basic commands from wflash CLI command work
Michael Pavone <pavone@retrodev.com>
parents: 1515
diff changeset
182 for (int i = 0; i < 15; i++)
aaab852803ac Get enough of MegaWifi implemented so that basic commands from wflash CLI command work
Michael Pavone <pavone@retrodev.com>
parents: 1515
diff changeset
183 {
aaab852803ac Get enough of MegaWifi implemented so that basic commands from wflash CLI command work
Michael Pavone <pavone@retrodev.com>
parents: 1515
diff changeset
184 poll_socket(mw, i);
aaab852803ac Get enough of MegaWifi implemented so that basic commands from wflash CLI command work
Michael Pavone <pavone@retrodev.com>
parents: 1515
diff changeset
185 }
aaab852803ac Get enough of MegaWifi implemented so that basic commands from wflash CLI command work
Michael Pavone <pavone@retrodev.com>
parents: 1515
diff changeset
186 }
aaab852803ac Get enough of MegaWifi implemented so that basic commands from wflash CLI command work
Michael Pavone <pavone@retrodev.com>
parents: 1515
diff changeset
187
1515
3fc129eb0653 Cleanup MegaWiFi command implementation
Michael Pavone <pavone@retrodev.com>
parents: 1514
diff changeset
188 static void start_reply(megawifi *mw, uint8_t cmd)
3fc129eb0653 Cleanup MegaWiFi command implementation
Michael Pavone <pavone@retrodev.com>
parents: 1514
diff changeset
189 {
3fc129eb0653 Cleanup MegaWiFi command implementation
Michael Pavone <pavone@retrodev.com>
parents: 1514
diff changeset
190 mw_putc(mw, STX);
3fc129eb0653 Cleanup MegaWiFi command implementation
Michael Pavone <pavone@retrodev.com>
parents: 1514
diff changeset
191 //reserve space for length
3fc129eb0653 Cleanup MegaWiFi command implementation
Michael Pavone <pavone@retrodev.com>
parents: 1514
diff changeset
192 mw->receive_bytes += 2;
3fc129eb0653 Cleanup MegaWiFi command implementation
Michael Pavone <pavone@retrodev.com>
parents: 1514
diff changeset
193 //cmd
3fc129eb0653 Cleanup MegaWiFi command implementation
Michael Pavone <pavone@retrodev.com>
parents: 1514
diff changeset
194 mw_putc(mw, 0);
3fc129eb0653 Cleanup MegaWiFi command implementation
Michael Pavone <pavone@retrodev.com>
parents: 1514
diff changeset
195 mw_putc(mw, cmd);
3fc129eb0653 Cleanup MegaWiFi command implementation
Michael Pavone <pavone@retrodev.com>
parents: 1514
diff changeset
196 //reserve space for length
3fc129eb0653 Cleanup MegaWiFi command implementation
Michael Pavone <pavone@retrodev.com>
parents: 1514
diff changeset
197 mw->receive_bytes += 2;
3fc129eb0653 Cleanup MegaWiFi command implementation
Michael Pavone <pavone@retrodev.com>
parents: 1514
diff changeset
198 }
3fc129eb0653 Cleanup MegaWiFi command implementation
Michael Pavone <pavone@retrodev.com>
parents: 1514
diff changeset
199
3fc129eb0653 Cleanup MegaWiFi command implementation
Michael Pavone <pavone@retrodev.com>
parents: 1514
diff changeset
200 static void end_reply(megawifi *mw)
3fc129eb0653 Cleanup MegaWiFi command implementation
Michael Pavone <pavone@retrodev.com>
parents: 1514
diff changeset
201 {
3fc129eb0653 Cleanup MegaWiFi command implementation
Michael Pavone <pavone@retrodev.com>
parents: 1514
diff changeset
202 uint32_t len = mw->receive_bytes - 3;
3fc129eb0653 Cleanup MegaWiFi command implementation
Michael Pavone <pavone@retrodev.com>
parents: 1514
diff changeset
203 //LSD packet length
3fc129eb0653 Cleanup MegaWiFi command implementation
Michael Pavone <pavone@retrodev.com>
parents: 1514
diff changeset
204 mw->receive_buffer[1] = len >> 8;
3fc129eb0653 Cleanup MegaWiFi command implementation
Michael Pavone <pavone@retrodev.com>
parents: 1514
diff changeset
205 mw->receive_buffer[2] = len;
3fc129eb0653 Cleanup MegaWiFi command implementation
Michael Pavone <pavone@retrodev.com>
parents: 1514
diff changeset
206 //command length
3fc129eb0653 Cleanup MegaWiFi command implementation
Michael Pavone <pavone@retrodev.com>
parents: 1514
diff changeset
207 len -= 4;
3fc129eb0653 Cleanup MegaWiFi command implementation
Michael Pavone <pavone@retrodev.com>
parents: 1514
diff changeset
208 mw->receive_buffer[5] = len >> 8;
3fc129eb0653 Cleanup MegaWiFi command implementation
Michael Pavone <pavone@retrodev.com>
parents: 1514
diff changeset
209 mw->receive_buffer[6] = len;
3fc129eb0653 Cleanup MegaWiFi command implementation
Michael Pavone <pavone@retrodev.com>
parents: 1514
diff changeset
210 mw_putc(mw, ETX);
3fc129eb0653 Cleanup MegaWiFi command implementation
Michael Pavone <pavone@retrodev.com>
parents: 1514
diff changeset
211 }
3fc129eb0653 Cleanup MegaWiFi command implementation
Michael Pavone <pavone@retrodev.com>
parents: 1514
diff changeset
212
1959
6d99bdbf1e3e megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents: 1546
diff changeset
213 static void process_command(megawifi *mw)
1513
8f3b6a64b658 Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
214 {
1959
6d99bdbf1e3e megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents: 1546
diff changeset
215 uint32_t command = mw->transmit_buffer[0] << 8 | mw->transmit_buffer[1];
6d99bdbf1e3e megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents: 1546
diff changeset
216 uint32_t size = mw->transmit_buffer[2] << 8 | mw->transmit_buffer[3];
6d99bdbf1e3e megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents: 1546
diff changeset
217 if (size > mw->transmit_bytes - 4) {
6d99bdbf1e3e megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents: 1546
diff changeset
218 size = mw->transmit_bytes - 4;
6d99bdbf1e3e megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents: 1546
diff changeset
219 }
6d99bdbf1e3e megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents: 1546
diff changeset
220 int orig_receive_bytes = mw->receive_bytes;
6d99bdbf1e3e megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents: 1546
diff changeset
221 switch (command)
6d99bdbf1e3e megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents: 1546
diff changeset
222 {
6d99bdbf1e3e megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents: 1546
diff changeset
223 case CMD_VERSION:
6d99bdbf1e3e megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents: 1546
diff changeset
224 start_reply(mw, CMD_OK);
6d99bdbf1e3e megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents: 1546
diff changeset
225 mw_putc(mw, 1);
6d99bdbf1e3e megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents: 1546
diff changeset
226 mw_putc(mw, 3);
6d99bdbf1e3e megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents: 1546
diff changeset
227 mw_putc(mw, 0);
6d99bdbf1e3e megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents: 1546
diff changeset
228 mw_puts(mw, "blastem");
6d99bdbf1e3e megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents: 1546
diff changeset
229 end_reply(mw);
6d99bdbf1e3e megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents: 1546
diff changeset
230 break;
6d99bdbf1e3e megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents: 1546
diff changeset
231 case CMD_ECHO:
6d99bdbf1e3e megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents: 1546
diff changeset
232 mw->receive_bytes = mw->transmit_bytes;
6d99bdbf1e3e megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents: 1546
diff changeset
233 memcpy(mw->receive_buffer, mw->transmit_buffer, mw->transmit_bytes);
6d99bdbf1e3e megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents: 1546
diff changeset
234 break;
6d99bdbf1e3e megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents: 1546
diff changeset
235 case CMD_IP_CURRENT: {
6d99bdbf1e3e megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents: 1546
diff changeset
236 iface_info i;
6d99bdbf1e3e megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents: 1546
diff changeset
237 if (get_host_address(&i)) {
6d99bdbf1e3e megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents: 1546
diff changeset
238 start_reply(mw, CMD_OK);
6d99bdbf1e3e megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents: 1546
diff changeset
239 //config number and reserved bytes
6d99bdbf1e3e megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents: 1546
diff changeset
240 mw_set(mw, 0, 4);
6d99bdbf1e3e megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents: 1546
diff changeset
241 //ip
6d99bdbf1e3e megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents: 1546
diff changeset
242 mw_copy(mw, i.ip, sizeof(i.ip));
6d99bdbf1e3e megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents: 1546
diff changeset
243 //net mask
6d99bdbf1e3e megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents: 1546
diff changeset
244 mw_copy(mw, i.net_mask, sizeof(i.net_mask));
6d99bdbf1e3e megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents: 1546
diff changeset
245 //gateway guess
6d99bdbf1e3e megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents: 1546
diff changeset
246 mw_putc(mw, i.ip[0] & i.net_mask[0]);
6d99bdbf1e3e megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents: 1546
diff changeset
247 mw_putc(mw, i.ip[1] & i.net_mask[1]);
6d99bdbf1e3e megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents: 1546
diff changeset
248 mw_putc(mw, i.ip[2] & i.net_mask[2]);
6d99bdbf1e3e megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents: 1546
diff changeset
249 mw_putc(mw, (i.ip[3] & i.net_mask[3]) + 1);
6d99bdbf1e3e megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents: 1546
diff changeset
250 //dns
6d99bdbf1e3e megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents: 1546
diff changeset
251 static const uint8_t localhost[] = {127,0,0,1};
6d99bdbf1e3e megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents: 1546
diff changeset
252 mw_copy(mw, localhost, sizeof(localhost));
6d99bdbf1e3e megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents: 1546
diff changeset
253 mw_copy(mw, localhost, sizeof(localhost));
6d99bdbf1e3e megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents: 1546
diff changeset
254
6d99bdbf1e3e megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents: 1546
diff changeset
255 } else {
6d99bdbf1e3e megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents: 1546
diff changeset
256 start_reply(mw, CMD_ERROR);
1513
8f3b6a64b658 Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
257 }
1959
6d99bdbf1e3e megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents: 1546
diff changeset
258 end_reply(mw);
6d99bdbf1e3e megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents: 1546
diff changeset
259 break;
6d99bdbf1e3e megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents: 1546
diff changeset
260 }
6d99bdbf1e3e megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents: 1546
diff changeset
261 case CMD_AP_JOIN:
6d99bdbf1e3e megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents: 1546
diff changeset
262 mw->module_state = STATE_READY;
6d99bdbf1e3e megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents: 1546
diff changeset
263 start_reply(mw, CMD_OK);
6d99bdbf1e3e megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents: 1546
diff changeset
264 end_reply(mw);
6d99bdbf1e3e megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents: 1546
diff changeset
265 break;
6d99bdbf1e3e megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents: 1546
diff changeset
266 case CMD_TCP_BIND:{
6d99bdbf1e3e megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents: 1546
diff changeset
267 if (size < 7){
6d99bdbf1e3e megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents: 1546
diff changeset
268 start_reply(mw, CMD_ERROR);
1515
3fc129eb0653 Cleanup MegaWiFi command implementation
Michael Pavone <pavone@retrodev.com>
parents: 1514
diff changeset
269 end_reply(mw);
1513
8f3b6a64b658 Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
270 break;
1959
6d99bdbf1e3e megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents: 1546
diff changeset
271 }
6d99bdbf1e3e megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents: 1546
diff changeset
272 uint8_t channel = mw->transmit_buffer[10];
6d99bdbf1e3e megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents: 1546
diff changeset
273 if (!channel || channel > 15) {
6d99bdbf1e3e megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents: 1546
diff changeset
274 start_reply(mw, CMD_ERROR);
6d99bdbf1e3e megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents: 1546
diff changeset
275 end_reply(mw);
1513
8f3b6a64b658 Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
276 break;
1959
6d99bdbf1e3e megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents: 1546
diff changeset
277 }
6d99bdbf1e3e megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents: 1546
diff changeset
278 channel--;
6d99bdbf1e3e megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents: 1546
diff changeset
279 if (mw->sock_fds[channel] >= 0) {
6d99bdbf1e3e megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents: 1546
diff changeset
280 close(mw->sock_fds[channel]);
6d99bdbf1e3e megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents: 1546
diff changeset
281 }
6d99bdbf1e3e megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents: 1546
diff changeset
282 mw->sock_fds[channel] = socket(AF_INET, SOCK_STREAM, 0);
6d99bdbf1e3e megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents: 1546
diff changeset
283 if (mw->sock_fds[channel] < 0) {
6d99bdbf1e3e megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents: 1546
diff changeset
284 start_reply(mw, CMD_ERROR);
1515
3fc129eb0653 Cleanup MegaWiFi command implementation
Michael Pavone <pavone@retrodev.com>
parents: 1514
diff changeset
285 end_reply(mw);
1514
4f94e0f90c83 Added support for MegaWiFi command IP_CURRENT
Michael Pavone <pavone@retrodev.com>
parents: 1513
diff changeset
286 break;
4f94e0f90c83 Added support for MegaWiFi command IP_CURRENT
Michael Pavone <pavone@retrodev.com>
parents: 1513
diff changeset
287 }
1959
6d99bdbf1e3e megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents: 1546
diff changeset
288 int value = 1;
6d99bdbf1e3e megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents: 1546
diff changeset
289 setsockopt(mw->sock_fds[channel], SOL_SOCKET, SO_REUSEADDR, &value, sizeof(value));
6d99bdbf1e3e megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents: 1546
diff changeset
290 struct sockaddr_in bind_addr;
6d99bdbf1e3e megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents: 1546
diff changeset
291 memset(&bind_addr, 0, sizeof(bind_addr));
6d99bdbf1e3e megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents: 1546
diff changeset
292 bind_addr.sin_family = AF_INET;
6d99bdbf1e3e megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents: 1546
diff changeset
293 bind_addr.sin_port = htons(mw->transmit_buffer[8] << 8 | mw->transmit_buffer[9]);
6d99bdbf1e3e megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents: 1546
diff changeset
294 if (bind(mw->sock_fds[channel], (struct sockaddr *)&bind_addr, sizeof(bind_addr)) != 0) {
6d99bdbf1e3e megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents: 1546
diff changeset
295 close(mw->sock_fds[channel]);
6d99bdbf1e3e megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents: 1546
diff changeset
296 mw->sock_fds[channel] = -1;
6d99bdbf1e3e megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents: 1546
diff changeset
297 start_reply(mw, CMD_ERROR);
1516
aaab852803ac Get enough of MegaWifi implemented so that basic commands from wflash CLI command work
Michael Pavone <pavone@retrodev.com>
parents: 1515
diff changeset
298 end_reply(mw);
aaab852803ac Get enough of MegaWifi implemented so that basic commands from wflash CLI command work
Michael Pavone <pavone@retrodev.com>
parents: 1515
diff changeset
299 break;
1959
6d99bdbf1e3e megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents: 1546
diff changeset
300 }
6d99bdbf1e3e megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents: 1546
diff changeset
301 int res = listen(mw->sock_fds[channel], 2);
6d99bdbf1e3e megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents: 1546
diff changeset
302 start_reply(mw, res ? CMD_ERROR : CMD_OK);
6d99bdbf1e3e megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents: 1546
diff changeset
303 if (res) {
6d99bdbf1e3e megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents: 1546
diff changeset
304 close(mw->sock_fds[channel]);
6d99bdbf1e3e megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents: 1546
diff changeset
305 mw->sock_fds[channel] = -1;
6d99bdbf1e3e megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents: 1546
diff changeset
306 } else {
6d99bdbf1e3e megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents: 1546
diff changeset
307 mw->channel_flags |= 1 << (channel + 1);
6d99bdbf1e3e megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents: 1546
diff changeset
308 mw->channel_state[channel] = SOCKST_TCP_LISTEN;
1546
1a09422b87a5 Get Windows build working again. MegaWiFi code probably needs more work before it will actually work on Windows, but at least it doesn't break the build now
Michael Pavone <pavone@retrodev.com>
parents: 1535
diff changeset
309 #ifndef _WIN32
1a09422b87a5 Get Windows build working again. MegaWiFi code probably needs more work before it will actually work on Windows, but at least it doesn't break the build now
Michael Pavone <pavone@retrodev.com>
parents: 1535
diff changeset
310 //FIXME: Set nonblocking on Windows too
1959
6d99bdbf1e3e megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents: 1546
diff changeset
311 fcntl(mw->sock_fds[channel], F_SETFL, O_NONBLOCK);
1546
1a09422b87a5 Get Windows build working again. MegaWiFi code probably needs more work before it will actually work on Windows, but at least it doesn't break the build now
Michael Pavone <pavone@retrodev.com>
parents: 1535
diff changeset
312 #endif
1959
6d99bdbf1e3e megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents: 1546
diff changeset
313 }
6d99bdbf1e3e megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents: 1546
diff changeset
314 end_reply(mw);
6d99bdbf1e3e megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents: 1546
diff changeset
315 break;
6d99bdbf1e3e megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents: 1546
diff changeset
316 }
6d99bdbf1e3e megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents: 1546
diff changeset
317 case CMD_SOCK_STAT: {
6d99bdbf1e3e megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents: 1546
diff changeset
318 uint8_t channel = mw->transmit_buffer[4];
6d99bdbf1e3e megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents: 1546
diff changeset
319 if (!channel || channel > 15) {
6d99bdbf1e3e megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents: 1546
diff changeset
320 start_reply(mw, CMD_ERROR);
1516
aaab852803ac Get enough of MegaWifi implemented so that basic commands from wflash CLI command work
Michael Pavone <pavone@retrodev.com>
parents: 1515
diff changeset
321 end_reply(mw);
aaab852803ac Get enough of MegaWifi implemented so that basic commands from wflash CLI command work
Michael Pavone <pavone@retrodev.com>
parents: 1515
diff changeset
322 break;
aaab852803ac Get enough of MegaWifi implemented so that basic commands from wflash CLI command work
Michael Pavone <pavone@retrodev.com>
parents: 1515
diff changeset
323 }
1959
6d99bdbf1e3e megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents: 1546
diff changeset
324 mw->channel_flags &= ~(1 << channel);
6d99bdbf1e3e megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents: 1546
diff changeset
325 channel--;
6d99bdbf1e3e megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents: 1546
diff changeset
326 poll_socket(mw, channel);
6d99bdbf1e3e megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents: 1546
diff changeset
327 start_reply(mw, CMD_OK);
6d99bdbf1e3e megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents: 1546
diff changeset
328 mw_putc(mw, mw->channel_state[channel]);
6d99bdbf1e3e megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents: 1546
diff changeset
329 end_reply(mw);
6d99bdbf1e3e megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents: 1546
diff changeset
330 break;
6d99bdbf1e3e megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents: 1546
diff changeset
331 }
6d99bdbf1e3e megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents: 1546
diff changeset
332 case CMD_SYS_STAT:
6d99bdbf1e3e megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents: 1546
diff changeset
333 poll_all_sockets(mw);
6d99bdbf1e3e megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents: 1546
diff changeset
334 start_reply(mw, CMD_OK);
6d99bdbf1e3e megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents: 1546
diff changeset
335 mw_putc(mw, mw->module_state);
6d99bdbf1e3e megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents: 1546
diff changeset
336 mw_putc(mw, mw->flags);
6d99bdbf1e3e megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents: 1546
diff changeset
337 mw_putc(mw, mw->channel_flags >> 8);
6d99bdbf1e3e megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents: 1546
diff changeset
338 mw_putc(mw, mw->channel_flags);
6d99bdbf1e3e megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents: 1546
diff changeset
339 end_reply(mw);
6d99bdbf1e3e megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents: 1546
diff changeset
340 break;
6d99bdbf1e3e megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents: 1546
diff changeset
341 default:
6d99bdbf1e3e megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents: 1546
diff changeset
342 printf("Unhandled MegaWiFi command %s(%d) with length %X\n", cmd_names[command], command, size);
6d99bdbf1e3e megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents: 1546
diff changeset
343 break;
6d99bdbf1e3e megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents: 1546
diff changeset
344 }
6d99bdbf1e3e megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents: 1546
diff changeset
345 }
6d99bdbf1e3e megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents: 1546
diff changeset
346
6d99bdbf1e3e megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents: 1546
diff changeset
347 static void process_packet(megawifi *mw)
6d99bdbf1e3e megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents: 1546
diff changeset
348 {
6d99bdbf1e3e megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents: 1546
diff changeset
349 if (mw->transmit_channel == 0) {
6d99bdbf1e3e megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents: 1546
diff changeset
350 process_command(mw);
6d99bdbf1e3e megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents: 1546
diff changeset
351 } else {
6d99bdbf1e3e megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents: 1546
diff changeset
352 uint8_t channel = mw->transmit_channel - 1;
6d99bdbf1e3e megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents: 1546
diff changeset
353 int channel_state = mw->channel_state[channel];
6d99bdbf1e3e megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents: 1546
diff changeset
354 int sock_fd = mw->sock_fds[channel];
6d99bdbf1e3e megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents: 1546
diff changeset
355 // TODO Handle UDP type sockets
6d99bdbf1e3e megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents: 1546
diff changeset
356 if (sock_fd >= 0 && channel_state == SOCKST_TCP_EST) {
6d99bdbf1e3e megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents: 1546
diff changeset
357 int sent = send(sock_fd, mw->transmit_buffer, mw->transmit_bytes, MSG_NOSIGNAL);
6d99bdbf1e3e megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents: 1546
diff changeset
358 if (sent < 0 && errno != EAGAIN && errno != EWOULDBLOCK) {
6d99bdbf1e3e megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents: 1546
diff changeset
359 close(sock_fd);
6d99bdbf1e3e megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents: 1546
diff changeset
360 mw->sock_fds[channel] = -1;
6d99bdbf1e3e megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents: 1546
diff changeset
361 mw->channel_state[channel] = SOCKST_NONE;
6d99bdbf1e3e megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents: 1546
diff changeset
362 mw->channel_flags |= 1 << mw->transmit_channel;
6d99bdbf1e3e megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents: 1546
diff changeset
363 } else if (sent < mw->transmit_bytes) {
6d99bdbf1e3e megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents: 1546
diff changeset
364 //TODO: save this data somewhere so it can be sent in poll_socket
6d99bdbf1e3e megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents: 1546
diff changeset
365 printf("Sent %d bytes on channel %d, but %d were requested\n", sent, mw->transmit_channel, mw->transmit_bytes);
1516
aaab852803ac Get enough of MegaWifi implemented so that basic commands from wflash CLI command work
Michael Pavone <pavone@retrodev.com>
parents: 1515
diff changeset
366 }
1959
6d99bdbf1e3e megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents: 1546
diff changeset
367 } else {
6d99bdbf1e3e megawifi: refactor and update commands
doragasu <doragasu@hotmail.com>
parents: 1546
diff changeset
368 printf("Unhandled receive of MegaWiFi data on channel %d\n", mw->transmit_channel);
1516
aaab852803ac Get enough of MegaWifi implemented so that basic commands from wflash CLI command work
Michael Pavone <pavone@retrodev.com>
parents: 1515
diff changeset
369 }
1513
8f3b6a64b658 Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
370 }
8f3b6a64b658 Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
371 mw->transmit_bytes = mw->expected_bytes = 0;
8f3b6a64b658 Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
372 }
8f3b6a64b658 Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
373
8f3b6a64b658 Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
374 void *megawifi_write_b(uint32_t address, void *context, uint8_t value)
8f3b6a64b658 Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
375 {
8f3b6a64b658 Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
376 if (!(address & 1)) {
8f3b6a64b658 Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
377 return context;
8f3b6a64b658 Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
378 }
8f3b6a64b658 Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
379 megawifi *mw = get_megawifi(context);
8f3b6a64b658 Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
380 address = address >> 1 & 7;
8f3b6a64b658 Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
381 switch (address)
8f3b6a64b658 Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
382 {
8f3b6a64b658 Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
383 case 0:
8f3b6a64b658 Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
384 switch (mw->transmit_state)
8f3b6a64b658 Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
385 {
8f3b6a64b658 Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
386 case TX_IDLE:
8f3b6a64b658 Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
387 if (value == STX) {
8f3b6a64b658 Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
388 mw->transmit_state = TX_LEN1;
8f3b6a64b658 Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
389 }
8f3b6a64b658 Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
390 break;
8f3b6a64b658 Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
391 case TX_LEN1:
8f3b6a64b658 Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
392 mw->transmit_channel = value >> 4;
8f3b6a64b658 Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
393 mw->expected_bytes = value << 8 & 0xF00;
8f3b6a64b658 Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
394 mw->transmit_state = TX_LEN2;
8f3b6a64b658 Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
395 break;
8f3b6a64b658 Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
396 case TX_LEN2:
8f3b6a64b658 Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
397 mw->expected_bytes |= value;
8f3b6a64b658 Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
398 mw->transmit_state = TX_PAYLOAD;
8f3b6a64b658 Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
399 break;
8f3b6a64b658 Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
400 case TX_PAYLOAD:
8f3b6a64b658 Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
401 mw->transmit_buffer[mw->transmit_bytes++] = value;
8f3b6a64b658 Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
402 if (mw->transmit_bytes == mw->expected_bytes) {
8f3b6a64b658 Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
403 mw->transmit_state = TX_WAIT_ETX;
8f3b6a64b658 Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
404 }
8f3b6a64b658 Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
405 break;
8f3b6a64b658 Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
406 case TX_WAIT_ETX:
8f3b6a64b658 Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
407 if (value == ETX) {
8f3b6a64b658 Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
408 mw->transmit_state = TX_IDLE;
8f3b6a64b658 Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
409 process_packet(mw);
8f3b6a64b658 Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
410 }
8f3b6a64b658 Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
411 break;
8f3b6a64b658 Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
412 }
8f3b6a64b658 Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
413 break;
8f3b6a64b658 Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
414 case 7:
8f3b6a64b658 Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
415 mw->scratchpad = value;
8f3b6a64b658 Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
416 break;
8f3b6a64b658 Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
417 default:
8f3b6a64b658 Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
418 printf("Unhandled write to MegaWiFi UART register %X: %X\n", address, value);
8f3b6a64b658 Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
419 }
8f3b6a64b658 Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
420 return context;
8f3b6a64b658 Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
421 }
8f3b6a64b658 Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
422
8f3b6a64b658 Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
423 void *megawifi_write_w(uint32_t address, void *context, uint16_t value)
8f3b6a64b658 Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
424 {
8f3b6a64b658 Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
425 return megawifi_write_b(address | 1, context, value);
8f3b6a64b658 Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
426 }
8f3b6a64b658 Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
427
8f3b6a64b658 Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
428 uint8_t megawifi_read_b(uint32_t address, void *context)
8f3b6a64b658 Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
429 {
8f3b6a64b658 Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
430
8f3b6a64b658 Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
431 if (!(address & 1)) {
8f3b6a64b658 Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
432 return 0xFF;
8f3b6a64b658 Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
433 }
8f3b6a64b658 Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
434 megawifi *mw = get_megawifi(context);
8f3b6a64b658 Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
435 address = address >> 1 & 7;
8f3b6a64b658 Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
436 switch (address)
8f3b6a64b658 Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
437 {
8f3b6a64b658 Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
438 case 0:
1516
aaab852803ac Get enough of MegaWifi implemented so that basic commands from wflash CLI command work
Michael Pavone <pavone@retrodev.com>
parents: 1515
diff changeset
439 poll_all_sockets(mw);
1513
8f3b6a64b658 Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
440 if (mw->receive_read < mw->receive_bytes) {
1516
aaab852803ac Get enough of MegaWifi implemented so that basic commands from wflash CLI command work
Michael Pavone <pavone@retrodev.com>
parents: 1515
diff changeset
441 uint8_t ret = mw->receive_buffer[mw->receive_read++];
aaab852803ac Get enough of MegaWifi implemented so that basic commands from wflash CLI command work
Michael Pavone <pavone@retrodev.com>
parents: 1515
diff changeset
442 if (mw->receive_read == mw->receive_bytes) {
aaab852803ac Get enough of MegaWifi implemented so that basic commands from wflash CLI command work
Michael Pavone <pavone@retrodev.com>
parents: 1515
diff changeset
443 mw->receive_read = mw->receive_bytes = 0;
aaab852803ac Get enough of MegaWifi implemented so that basic commands from wflash CLI command work
Michael Pavone <pavone@retrodev.com>
parents: 1515
diff changeset
444 }
aaab852803ac Get enough of MegaWifi implemented so that basic commands from wflash CLI command work
Michael Pavone <pavone@retrodev.com>
parents: 1515
diff changeset
445 return ret;
1513
8f3b6a64b658 Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
446 }
8f3b6a64b658 Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
447 return 0xFF;
8f3b6a64b658 Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
448 case 5:
1516
aaab852803ac Get enough of MegaWifi implemented so that basic commands from wflash CLI command work
Michael Pavone <pavone@retrodev.com>
parents: 1515
diff changeset
449 poll_all_sockets(mw);
1513
8f3b6a64b658 Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
450 //line status
8f3b6a64b658 Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
451 return 0x60 | (mw->receive_read < mw->receive_bytes);
8f3b6a64b658 Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
452 case 7:
8f3b6a64b658 Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
453 return mw->scratchpad;
8f3b6a64b658 Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
454 default:
8f3b6a64b658 Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
455 printf("Unhandled read from MegaWiFi UART register %X\n", address);
8f3b6a64b658 Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
456 return 0xFF;
8f3b6a64b658 Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
457 }
8f3b6a64b658 Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
458 }
8f3b6a64b658 Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
459
8f3b6a64b658 Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
460 uint16_t megawifi_read_w(uint32_t address, void *context)
8f3b6a64b658 Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
461 {
8f3b6a64b658 Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
462 return 0xFF00 | megawifi_read_b(address | 1, context);
8f3b6a64b658 Initial work on MegaWiFi support
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
463 }