/* sbc_harness/main.c - Main entry point and event loop for sbc-harness * * Copyright (C) 2024 Luke T. Shumaker * SPDX-Licence-Identifier: AGPL-3.0-or-later */ #include /* for strlen() */ #include /* for printf() */ #include "pico/stdlib.h" #include "hardware/flash.h" #include #include #include #include "hw/rp2040_hwspi.h" #include "hw/w5500.h" #include "usb_keyboard.h" COROUTINE hello_world_cr(void *_chan) { const char *msg = "Hello world!\n"; usb_keyboard_rpc_t *chan = _chan; cr_begin(); for (size_t i = 0;; i = (i+1) % strlen(msg)) { int result = usb_keyboard_rpc_send_req(chan, (uint32_t)msg[i]); if (result < 1) { printf("error!\n"); break; } } cr_end(); } int main() { /* initialization *****************************************************/ stdio_uart_init(); /* NOR flash chips have a (bog-?)standard "RUID" "Read Unique * ID" instruction; use our flash chip's unique ID as the * basis for our serial numbers. */ uint64_t flash_id64; static_assert(sizeof(flash_id64) == FLASH_UNIQUE_ID_SIZE_BYTES); flash_get_unique_id((uint8_t *)&flash_id64); uint32_t flash_id32 = hash(&flash_id64, sizeof(flash_id64)); static_assert(sizeof(flash_id32) == sizeof(hash(NULL, 0))); uint8_t flash_id24[3] = { (uint8_t)((flash_id32 >> 16) & 0xFF), (uint8_t)((flash_id32 >> 8) & 0xFF), (uint8_t)((flash_id32 >> 0) & 0xFF), }; struct rp2040_hwspi dev_spi; struct w5500 dev_w5500; rp2040_hwspi_init(&dev_spi, "W5500", RP2040_HWSPI_0, SPI_MODE_0, /* the W5500 supports mode 0 or mode 3 */ 80*1000*1000, /* run at the W5500's max rate of 80MHz */ 16, /* PIN_MISO */ 19, /* PIN_MOSI */ 18, /* PIN_CLK */ 17); /* PIN_CS */ w5500_init(&dev_w5500, "W5500", &dev_spi, 21, /* PIN_INTR */ 20, /* PIN_RESET */ ((struct net_eth_addr){{ /* vendor ID: "Wiznet" */ 0x00, 0x08, 0xDC, /* serial number */ flash_id24[0], flash_id24[1], flash_id24[2], }})); usb_common_earlyinit(); usb_keyboard_init(); usb_common_lateinit(); /* set up coroutines **************************************************/ coroutine_add(usb_common_cr, NULL); usb_keyboard_rpc_t keyboard_chan = {0}; coroutine_add(usb_keyboard_cr, &keyboard_chan); //coroutine_add(hello_world_cr, &keyboard_chan); //coroutine_add(dhcp_client_cr, NULL); /* event loop *********************************************************/ coroutine_main(); }