#include "pico/stdlib.h" #include "pico/bootrom.h" #include "pico/unique_id.h" #include "tusb.h" #include "wire.h" #include "w6300.h" static void usb_write(const uint8_t* data, uint32_t len) { while (len > 0) { uint32_t avail = tud_cdc_write_available(); if (avail == 0) { tud_task(); continue; } uint32_t chunk = len < avail ? len : avail; tud_cdc_write(data, chunk); tud_cdc_write_flush(); data += chunk; len -= chunk; } } static void send_bytes(const std::vector &data) { usb_write(data.data(), data.size()); } static bool w6300_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; } int main() { tusb_init(); if (!w6300_init()) { } static static_vector rx_buf; while (true) { tud_task(); if (!tud_cdc_available()) continue; uint8_t byte; if (tud_cdc_read(&byte, 1) != 1) continue; rx_buf.push_back(byte); auto msg = try_decode(rx_buf); if (!msg) { if (rx_buf.full()) rx_buf.clear(); continue; } rx_buf.clear(); switch (msg->type_id) { case RequestPICOBOOT::ext_id: send_bytes(encode_response(msg->message_id, ResponsePICOBOOT{})); sleep_ms(100); reset_usb_boot(0, 1); break; case RequestInfo::ext_id: { ResponseInfo resp; pico_unique_board_id_t uid; pico_get_unique_board_id(&uid); std::copy(uid.id, uid.id + 8, resp.board_id.begin()); auto ninfo = w6300::get_net_info(); resp.mac = ninfo.mac; send_bytes(encode_response(msg->message_id, resp)); break; } } } }