Files
picomap/picomap.cpp

81 lines
2.0 KiB
C++

#include <stdio.h>
#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<uint8_t> &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<uint8_t, 256> rx_buf;
while (true) {
int c = getchar_timeout_us(100000);
if (c == PICO_ERROR_TIMEOUT) continue;
rx_buf.push_back(static_cast<uint8_t>(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;
}
}
}
}