From c6b04d5b3e497e32cd3c733c6b1a82682e5b1538 Mon Sep 17 00:00:00 2001 From: Frans Faase Date: Thu, 26 May 2022 19:27:30 +0200 Subject: [PATCH] Forward button presses to FPGA in FPGA download mode (2) #43 This no longer has the delay as with the previous commit. Bits are mapped to the following keys: 0 - joystick down 1 - joystick up 2 - joystick left 3 - joystick right 4 - joystick press 5 - home 6 - menu 7 - select 8 - start 9 - accept 10 - back --- main/fpga_download.c | 57 +++++++++++++++++++++++++++++++++++--------- 1 file changed, 46 insertions(+), 11 deletions(-) diff --git a/main/fpga_download.c b/main/fpga_download.c index d21e9d1..2d766bb 100644 --- a/main/fpga_download.c +++ b/main/fpga_download.c @@ -56,6 +56,10 @@ bool fpga_uart_load(uint8_t* buffer, uint32_t length) { return fpga_read_stdin(buffer, length, 3000); } +void fpga_uart_mess(const char *mess) { + uart_write_bytes(0, mess, strlen(mess)); +} + void fpga_download(xQueueHandle buttonQueue, ICE40* ice40, pax_buf_t* pax_buffer, ILI9341* ili9341) { char message[64]; @@ -128,9 +132,12 @@ void fpga_download(xQueueHandle buttonQueue, ICE40* ice40, pax_buf_t* pax_buffer pax_draw_text(pax_buffer, 0xFFFFFFFF, NULL, 18, 0, 20*3, message); ili9341_write(ili9341, pax_buffer->buf); vTaskDelay(1000 / portTICK_PERIOD_MS); + snprintf(message, sizeof(message), "CRC failed %08X %08x\n", crc, checkCrc); + fpga_uart_mess(message); fpga_uninstall_uart(); return; } + fpga_uart_mess("CRC correct\n"); ili9341_deinit(ili9341); ili9341_select(ili9341, false); @@ -149,17 +156,28 @@ void fpga_download(xQueueHandle buttonQueue, ICE40* ice40, pax_buf_t* pax_buffer pax_draw_text(pax_buffer, 0xFFFFFFFF, NULL, 18, 0, 20*1, "FPGA signals not done"); ili9341_write(ili9341, pax_buffer->buf); vTaskDelay(1000 / portTICK_PERIOD_MS); + snprintf(message, sizeof(message), "loading bitstream failed with %d\n", res); fpga_uninstall_uart(); return; } + snprintf(message, sizeof(message), "bitstream loaded\n"); // Waiting for next download and sending key strokes to FPGA uint16_t key_state = 0; - while (!fpga_uart_sync(&length, &crc)) { + uint16_t idle_count = 0; + while (true) { + if (idle_count >= 200) { + if (fpga_uart_sync(&length, &crc)) { + break; + } + idle_count = 0; + } rp2040_input_message_t buttonMessage = {0}; - if (xQueueReceive(buttonQueue, &buttonMessage, 0) == pdTRUE) { + while (xQueueReceive(buttonQueue, &buttonMessage, 0) == pdTRUE) { uint8_t pin = buttonMessage.input; bool value = buttonMessage.state; + //snprintf(message, sizeof(message), "button %d %d\n", pin, value); + //fpga_uart_mess(message); uint16_t key_mask = 0; switch(pin) { case RP2040_INPUT_JOYSTICK_DOWN: @@ -205,17 +223,34 @@ void fpga_download(xQueueHandle buttonQueue, ICE40* ice40, pax_buf_t* pax_buffer else { key_state &= ~key_mask; } - uint8_t message[5] = { 0xf5 }; - message[1] = key_state & 0xff; - message[2] = key_state >> 8; - message[3] = key_mask & 0xff; - message[4] = key_mask >> 8; - res = ice40_send(ice40, message, 5); + //snprintf(message, sizeof(message), "send %04X %04X\n", key_state, key_mask); + //fpga_uart_mess(message); + + uint8_t spi_message[5] = { 0xf4 }; + spi_message[1] = key_state & 0xff; + spi_message[2] = key_state >> 8; + spi_message[3] = key_mask & 0xff; + spi_message[4] = key_mask >> 8; + res = ice40_send(ice40, spi_message, 5); + if (res != ESP_OK) { + ice40_disable(ice40); + ili9341_init(ili9341); + pax_noclip(pax_buffer); + pax_background(pax_buffer, 0xa85a32); + pax_draw_text(pax_buffer, 0xFFFFFFFF, NULL, 18, 0, 20*0, "FPGA download mode"); + snprintf(message, sizeof(message), "ice40_send: %d", res); + pax_draw_text(pax_buffer, 0xFFFFFFFF, NULL, 18, 0, 20*1, message); + ili9341_write(ili9341, pax_buffer->buf); + vTaskDelay(1000 / portTICK_PERIOD_MS); + snprintf(message, sizeof(message), "ice40_send failed with %d\n", res); + fpga_uart_mess(message); + fpga_uninstall_uart(); + } } + idle_count = 0; } - else { - vTaskDelay(2 / portTICK_PERIOD_MS); - } + vTaskDelay(10 / portTICK_PERIOD_MS); + idle_count++; } ice40_disable(ice40); ili9341_init(ili9341);