Split dispatch init/run, join IPv6 multicast discovery group in firmware
This commit is contained in:
@@ -1,5 +1,17 @@
|
|||||||
#include "dispatch.h"
|
#include "dispatch.h"
|
||||||
#include "handlers.h"
|
#include "handlers.h"
|
||||||
|
#include "w6300.h"
|
||||||
|
|
||||||
|
static constexpr uint16_t PICOMAP_DISCOVERY_PORT = 28777;
|
||||||
|
|
||||||
|
static constexpr std::array<uint8_t, 16> picomap_discovery_ip = {
|
||||||
|
0xff, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x70, 0x69, 0x63, 0x6f, 0x6d, 0x61, 0x70, 0x00,
|
||||||
|
};
|
||||||
|
|
||||||
|
static constexpr std::array<uint8_t, 6> picomap_discovery_mac = {
|
||||||
|
0x33, 0x33, 0x6d, 0x61, 0x70, 0x00,
|
||||||
|
};
|
||||||
|
|
||||||
static constexpr handler_entry handlers[] = {
|
static constexpr handler_entry handlers[] = {
|
||||||
{RequestPICOBOOT::ext_id, handle_picoboot},
|
{RequestPICOBOOT::ext_id, handle_picoboot},
|
||||||
@@ -7,5 +19,17 @@ static constexpr handler_entry handlers[] = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
int main() {
|
int main() {
|
||||||
dispatch(handlers);
|
dispatch_init();
|
||||||
|
|
||||||
|
auto sn = w6300::socket_id{1};
|
||||||
|
w6300::set_socket_dest_mac(sn, picomap_discovery_mac);
|
||||||
|
w6300::ip_address addr = {};
|
||||||
|
std::copy(picomap_discovery_ip.begin(), picomap_discovery_ip.end(), addr.ip.begin());
|
||||||
|
addr.len = 16;
|
||||||
|
w6300::set_socket_dest_ip(sn, addr);
|
||||||
|
w6300::set_socket_dest_port(sn, w6300::port_num{PICOMAP_DISCOVERY_PORT});
|
||||||
|
w6300::open_socket(sn, w6300::protocol::udp6, w6300::port_num{PICOMAP_DISCOVERY_PORT},
|
||||||
|
w6300::sock_flag::multi_enable);
|
||||||
|
|
||||||
|
dispatch_run(handlers);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,4 +8,5 @@ struct handler_entry {
|
|||||||
void (*handle)(usb_cdc&, uint32_t);
|
void (*handle)(usb_cdc&, uint32_t);
|
||||||
};
|
};
|
||||||
|
|
||||||
[[noreturn]] void dispatch(std::span<const handler_entry> handlers);
|
void dispatch_init();
|
||||||
|
[[noreturn]] void dispatch_run(std::span<const handler_entry> handlers);
|
||||||
|
|||||||
@@ -6,15 +6,17 @@
|
|||||||
#include "timer_queue.h"
|
#include "timer_queue.h"
|
||||||
#include "net.h"
|
#include "net.h"
|
||||||
|
|
||||||
[[noreturn]] void dispatch(std::span<const handler_entry> handlers) {
|
void dispatch_init() {
|
||||||
|
tusb_init();
|
||||||
|
net_init();
|
||||||
|
}
|
||||||
|
|
||||||
|
[[noreturn]] void dispatch_run(std::span<const handler_entry> handlers) {
|
||||||
std::unordered_map<int8_t, void (*)(usb_cdc&, uint32_t)> handler_map;
|
std::unordered_map<int8_t, void (*)(usb_cdc&, uint32_t)> handler_map;
|
||||||
for (auto& entry : handlers) {
|
for (auto& entry : handlers) {
|
||||||
handler_map[entry.type_id] = entry.handle;
|
handler_map[entry.type_id] = entry.handle;
|
||||||
}
|
}
|
||||||
|
|
||||||
tusb_init();
|
|
||||||
net_init();
|
|
||||||
|
|
||||||
static usb_cdc usb;
|
static usb_cdc usb;
|
||||||
static timer_queue timers;
|
static timer_queue timers;
|
||||||
static static_vector<uint8_t, 256> rx_buf;
|
static static_vector<uint8_t, 256> rx_buf;
|
||||||
|
|||||||
@@ -7,5 +7,6 @@ static constexpr handler_entry handlers[] = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
int main() {
|
int main() {
|
||||||
dispatch(handlers);
|
dispatch_init();
|
||||||
|
dispatch_run(handlers);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1730,6 +1730,10 @@ uint16_t get_socket_mss(socket_id sid) {
|
|||||||
return get_sn_mssr(static_cast<uint8_t>(sid));
|
return get_sn_mssr(static_cast<uint8_t>(sid));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void set_socket_dest_mac(socket_id sid, const std::array<uint8_t, 6>& mac) {
|
||||||
|
set_sn_dhar(static_cast<uint8_t>(sid), const_cast<uint8_t*>(mac.data()));
|
||||||
|
}
|
||||||
|
|
||||||
void set_socket_dest_ip(socket_id sid, const ip_address& addr) {
|
void set_socket_dest_ip(socket_id sid, const ip_address& addr) {
|
||||||
uint8_t sn = static_cast<uint8_t>(sid);
|
uint8_t sn = static_cast<uint8_t>(sid);
|
||||||
if (addr.len == 16) set_sn_dip6r(sn, const_cast<uint8_t*>(addr.ip.data()));
|
if (addr.len == 16) set_sn_dip6r(sn, const_cast<uint8_t*>(addr.ip.data()));
|
||||||
|
|||||||
@@ -247,6 +247,7 @@ void set_socket_tos(socket_id sn, uint8_t tos);
|
|||||||
uint8_t get_socket_tos(socket_id sn);
|
uint8_t get_socket_tos(socket_id sn);
|
||||||
void set_socket_mss(socket_id sn, uint16_t mss);
|
void set_socket_mss(socket_id sn, uint16_t mss);
|
||||||
uint16_t get_socket_mss(socket_id sn);
|
uint16_t get_socket_mss(socket_id sn);
|
||||||
|
void set_socket_dest_mac(socket_id sn, const std::array<uint8_t, 6>& mac);
|
||||||
void set_socket_dest_ip(socket_id sn, const ip_address& addr);
|
void set_socket_dest_ip(socket_id sn, const ip_address& addr);
|
||||||
ip_address get_socket_dest_ip(socket_id sn);
|
ip_address get_socket_dest_ip(socket_id sn);
|
||||||
void set_socket_dest_port(socket_id sn, port_num port);
|
void set_socket_dest_port(socket_id sn, port_num port);
|
||||||
|
|||||||
Reference in New Issue
Block a user