|
@@ -157,7 +157,7 @@ static esp_err_t fpga_io_write(unsigned int cmd, uint32_t addr,
|
|
|
|
|
|
if (!len && !(cmd & ~FPGA_CMD_RD))
|
|
|
return ESP_OK;
|
|
|
-
|
|
|
+
|
|
|
memset(&trans, 0, sizeof trans);
|
|
|
trans.base.flags =
|
|
|
SPI_TRANS_MODE_DIO |
|
|
@@ -184,7 +184,7 @@ static esp_err_t fpga_io_read(unsigned int cmd, uint32_t addr,
|
|
|
|
|
|
if (!len && !(cmd & ~FPGA_CMD_RD))
|
|
|
return ESP_OK;
|
|
|
-
|
|
|
+
|
|
|
memset(&trans, 0, sizeof trans);
|
|
|
trans.base.flags =
|
|
|
SPI_TRANS_MODE_DIO |
|
|
@@ -245,29 +245,34 @@ static void fpga_service_task(void *dummy)
|
|
|
while (1) {
|
|
|
/* Wait until an interrupt is received */
|
|
|
xTaskNotifyWaitIndexed(NOTIFY_INDEX, 0, -1U, NULL, portMAX_DELAY);
|
|
|
-
|
|
|
- while (!digitalRead(PIN_FPGA_INT)) {
|
|
|
- printf("[FPGA] FPGA signals ready\n");
|
|
|
|
|
|
+ while (!digitalRead(PIN_FPGA_INT)) {
|
|
|
+ bool ok = false;
|
|
|
uint32_t status = fpga_io_status(0);
|
|
|
printf("[FPGA] Link status bits = 0x%08x\n", status);
|
|
|
-
|
|
|
- fpga_io_read(FPGA_CMD_ACK(ESP_IRQ_READY), FPGA_HDR_ADDR,
|
|
|
- &head, sizeof head);
|
|
|
-
|
|
|
- if (head.magic == DRAM_IO_MAGIC && head.hlen >= sizeof head) {
|
|
|
- printf("[FPGA] Ready, board = %u.%u fixes %02x fpga %u\n",
|
|
|
- head.board.major, head.board.minor,
|
|
|
- head.board.fixes, head.board.fpga);
|
|
|
- }
|
|
|
|
|
|
- char signature_string[head.signature_len+1];
|
|
|
- fpga_io_read(0, (size_t)head.signature,
|
|
|
- signature_string, head.signature_len);
|
|
|
- signature_string[head.signature_len] = '\0';
|
|
|
+ if ((status & 0x000fc010) == 0x00008000) {
|
|
|
+ fpga_io_read(FPGA_CMD_ACK(ESP_IRQ_READY), FPGA_HDR_ADDR,
|
|
|
+ &head, sizeof head);
|
|
|
|
|
|
- printf("[FPGA] \"%s\"\n", signature_string);
|
|
|
- }
|
|
|
+ if (head.magic == DRAM_IO_MAGIC && head.hlen >= sizeof head) {
|
|
|
+ printf("[FPGA] Ready, board = %u.%u fixes %02x fpga %u\n",
|
|
|
+ head.board.major, head.board.minor,
|
|
|
+ head.board.fixes, head.board.fpga);
|
|
|
+
|
|
|
+ char signature_string[head.signature_len+1];
|
|
|
+ fpga_io_read(0, (size_t)head.signature,
|
|
|
+ signature_string, head.signature_len);
|
|
|
+ signature_string[head.signature_len] = '\0';
|
|
|
+
|
|
|
+ fpga_io_write(0, (size_t)head.signature + 9, "GUBBAR", 6);
|
|
|
|
|
|
+ printf("[FPGA] \"%s\"\n", signature_string);
|
|
|
+ ok = true;
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ printf("[FPGA] None or invalid FPGA response, offline\n");
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
}
|