Add test target, parallelize load and info across two devices

This commit is contained in:
Ian Gulliver
2026-04-05 21:48:47 +09:00
parent 30a697066c
commit 1bbe350370
10 changed files with 220 additions and 56 deletions

55
firmware/lib/dhcp.cpp Normal file
View File

@@ -0,0 +1,55 @@
#include "dhcp.h"
#include <span>
#include "pico/rand.h"
#include "w6300.h"
namespace dhcp_opt {
constexpr uint8_t message_type = 53;
constexpr uint8_t param_request = 55;
constexpr uint8_t end = 255;
constexpr uint8_t discover = 1;
constexpr uint8_t subnet_mask = 1;
}
struct __attribute__((packed)) dhcp_discover {
uint8_t op = 1;
uint8_t htype = 1;
uint8_t hlen = 6;
uint8_t hops = 0;
uint32_t xid = __builtin_bswap32(static_cast<uint32_t>(get_rand_64()));
uint16_t secs = 0;
uint16_t flags = __builtin_bswap16(0x8000);
std::array<uint8_t, 4> ciaddr = {};
std::array<uint8_t, 4> yiaddr = {};
std::array<uint8_t, 4> siaddr = {};
std::array<uint8_t, 4> giaddr = {};
std::array<uint8_t, 16> chaddr = {};
std::array<uint8_t, 64> sname = {};
std::array<uint8_t, 128> file = {};
std::array<uint8_t, 4> magic = {99, 130, 83, 99};
uint8_t opt_msg_type[3] = {dhcp_opt::message_type, 1, dhcp_opt::discover};
uint8_t opt_params[3] = {dhcp_opt::param_request, 1, dhcp_opt::subnet_mask};
uint8_t opt_end = dhcp_opt::end;
};
static_assert(sizeof(dhcp_discover) == 247);
static void send_discover(timer_queue& timers, const std::array<uint8_t, 6>& mac) {
auto sn = w6300::socket_id{0};
w6300::open_socket(sn, w6300::protocol::udp, w6300::port_num{68}, w6300::sock_flag::none);
dhcp_discover pkt;
std::copy(mac.begin(), mac.end(), pkt.chaddr.begin());
w6300::ip_address broadcast = {};
broadcast.ip = {255, 255, 255, 255};
broadcast.len = 4;
w6300::sendto(sn, std::span{reinterpret_cast<uint8_t*>(&pkt), sizeof(pkt)}, broadcast, w6300::port_num{67});
timers.schedule_ms(5000, [&timers, mac]() { send_discover(timers, mac); });
}
void dhcp_start(timer_queue& timers, const std::array<uint8_t, 6>& mac) {
send_discover(timers, mac);
}

24
firmware/lib/net.cpp Normal file
View File

@@ -0,0 +1,24 @@
#include "net.h"
#include "pico/unique_id.h"
#include "w6300.h"
bool net_init() {
w6300::init_spi();
w6300::init_critical_section();
w6300::reset();
w6300::init();
if (!w6300::check()) return false;
pico_unique_board_id_t uid;
pico_get_unique_board_id(&uid);
w6300::net_info info = {};
info.mac[0] = (uid.id[0] & 0xFC) | 0x02;
info.mac[1] = uid.id[1];
info.mac[2] = uid.id[2];
info.mac[3] = uid.id[3];
info.mac[4] = uid.id[4];
info.mac[5] = uid.id[5];
w6300::init_net(info);
return true;
}

View File

@@ -0,0 +1,82 @@
#include <cstring>
#include "pico/unique_id.h"
#include "tusb.h"
constexpr uint16_t USB_VID = 0x2E8A;
constexpr uint16_t USB_PID = 0x000A;
static constexpr tusb_desc_device_t desc_device = {
sizeof(tusb_desc_device_t),
TUSB_DESC_DEVICE,
0x0200,
TUSB_CLASS_MISC,
MISC_SUBCLASS_COMMON,
MISC_PROTOCOL_IAD,
CFG_TUD_ENDPOINT0_SIZE,
USB_VID,
USB_PID,
0x0100,
1, 2, 3,
1,
};
enum { ITF_NUM_CDC, ITF_NUM_CDC_DATA, ITF_NUM_TOTAL };
constexpr uint8_t EPNUM_CDC_NOTIF = 0x81;
constexpr uint8_t EPNUM_CDC_OUT = 0x02;
constexpr uint8_t EPNUM_CDC_IN = 0x82;
constexpr uint16_t CONFIG_TOTAL_LEN = TUD_CONFIG_DESC_LEN + TUD_CDC_DESC_LEN;
static uint8_t const desc_configuration[] = {
TUD_CONFIG_DESCRIPTOR(1, ITF_NUM_TOTAL, 0, CONFIG_TOTAL_LEN, 0x00, 100),
TUD_CDC_DESCRIPTOR(ITF_NUM_CDC, 0, EPNUM_CDC_NOTIF, 8, EPNUM_CDC_OUT, EPNUM_CDC_IN, 64),
};
static constexpr const char* string_desc[] = {
"\x09\x04",
"picomap",
"picomap",
nullptr,
};
static uint16_t desc_str_buf[33];
extern "C" {
uint8_t const* tud_descriptor_device_cb(void) {
return reinterpret_cast<uint8_t const*>(&desc_device);
}
uint8_t const* tud_descriptor_configuration_cb(uint8_t index) {
return desc_configuration;
}
uint16_t const* tud_descriptor_string_cb(uint8_t index, uint16_t langid) {
uint8_t chr_count;
if (index == 0) {
memcpy(&desc_str_buf[1], string_desc[0], 2);
chr_count = 1;
} else if (index == 3) {
pico_unique_board_id_t uid;
pico_get_unique_board_id(&uid);
chr_count = 0;
for (int i = 0; i < 8; i++) {
desc_str_buf[1 + chr_count++] = "0123456789ABCDEF"[uid.id[i] >> 4];
desc_str_buf[1 + chr_count++] = "0123456789ABCDEF"[uid.id[i] & 0xF];
}
} else {
if (index >= sizeof(string_desc) / sizeof(string_desc[0])) return nullptr;
const char* str = string_desc[index];
if (!str) return nullptr;
chr_count = strlen(str);
if (chr_count > 31) chr_count = 31;
for (uint8_t i = 0; i < chr_count; i++)
desc_str_buf[1 + i] = str[i];
}
desc_str_buf[0] = static_cast<uint16_t>((TUSB_DESC_STRING << 8) | (2 * chr_count + 2));
return desc_str_buf;
}
} // extern "C"