#include #include "pico/stdlib.h" #include "pico/bootrom.h" #include "pico/unique_id.h" #include "device.h" #include "w6300.h" static void send_bytes(const std::vector &data) { for (auto b : data) { putchar(b); } stdio_flush(); } static bool w6300_init() { wizchip_spi_initialize(); wizchip_cris_initialize(); wizchip_reset(); wizchip_initialize(); if (!wizchip_check()) return false; pico_unique_board_id_t uid; pico_get_unique_board_id(&uid); wiz_NetInfo net_info = {}; net_info.mac[0] = (uid.id[0] & 0xFC) | 0x02; net_info.mac[1] = uid.id[1]; net_info.mac[2] = uid.id[2]; net_info.mac[3] = uid.id[3]; net_info.mac[4] = uid.id[4]; net_info.mac[5] = uid.id[5]; network_initialize(net_info); return true; } int main() { stdio_init_all(); stdio_set_translate_crlf(&stdio_usb, false); if (!w6300_init()) { printf("W6300 init failed\n"); } static static_vector rx_buf; while (true) { int c = getchar_timeout_us(100000); if (c == PICO_ERROR_TIMEOUT) continue; rx_buf.push_back(static_cast(c)); 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 info; pico_unique_board_id_t uid; pico_get_unique_board_id(&uid); std::copy(uid.id, uid.id + 8, info.board_id.begin()); wiz_NetInfo net_info; wizchip_getnetinfo(&net_info); std::copy(net_info.mac, net_info.mac + 6, info.mac.begin()); send_bytes(encode_response(msg->message_id, info)); break; } } } }