|
@@ -1,6 +1,7 @@
|
|
#include "common.h"
|
|
#include "common.h"
|
|
#include "config.h"
|
|
#include "config.h"
|
|
#include "fpga.h"
|
|
#include "fpga.h"
|
|
|
|
+#include "esplink.h"
|
|
|
|
|
|
#include <driver/gpio.h>
|
|
#include <driver/gpio.h>
|
|
#include <driver/spi_common.h>
|
|
#include <driver/spi_common.h>
|
|
@@ -137,10 +138,8 @@ void fpga_service_stop(void)
|
|
printf("[FPGA] FPGA services stopped\n");
|
|
printf("[FPGA] FPGA services stopped\n");
|
|
}
|
|
}
|
|
|
|
|
|
-#define FPGA_CMD_IRQ1 (1 << 0)
|
|
|
|
-#define FPGA_CMD_IRQ2 (2 << 0)
|
|
|
|
-#define FPGA_CMD_IRQ3 (3 << 0)
|
|
|
|
-#define FPGA_CMD_ACK1 (1 << 2)
|
|
|
|
|
|
+#define FPGA_CMD_IRQ(x) ((x) << 0)
|
|
|
|
+#define FPGA_CMD_ACK(x) ((x) << 2)
|
|
#define FPGA_CMD_ACK2 (2 << 2)
|
|
#define FPGA_CMD_ACK2 (2 << 2)
|
|
#define FPGA_CMD_ACK3 (3 << 2)
|
|
#define FPGA_CMD_ACK3 (3 << 2)
|
|
#define FPGA_CMD_WR (0 << 4)
|
|
#define FPGA_CMD_WR (0 << 4)
|
|
@@ -153,6 +152,11 @@ static esp_err_t fpga_io(uint8_t cmd, uint32_t addr, void *data, size_t len)
|
|
spi_transaction_ext_t trans;
|
|
spi_transaction_ext_t trans;
|
|
esp_err_t err;
|
|
esp_err_t err;
|
|
|
|
|
|
|
|
+ if ((len|addr) & 3) {
|
|
|
|
+ printf("[FPGA] ERROR: I/O must be aligned dwords\n");
|
|
|
|
+ return ESP_FAIL;
|
|
|
|
+ }
|
|
|
|
+
|
|
memset(&trans, 0, sizeof trans);
|
|
memset(&trans, 0, sizeof trans);
|
|
trans.base.flags =
|
|
trans.base.flags =
|
|
SPI_TRANS_MODE_DIO |
|
|
SPI_TRANS_MODE_DIO |
|
|
@@ -180,27 +184,33 @@ static esp_err_t fpga_io(uint8_t cmd, uint32_t addr, void *data, size_t len)
|
|
return err;
|
|
return err;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+
|
|
static void fpga_service_task(void *dummy)
|
|
static void fpga_service_task(void *dummy)
|
|
{
|
|
{
|
|
(void)dummy;
|
|
(void)dummy;
|
|
- uint32_t head[8];
|
|
|
|
|
|
+ struct dram_io_head head;
|
|
|
|
|
|
- while (1) {
|
|
|
|
- vTaskDelay(10 * configTICK_RATE_HZ);
|
|
|
|
-
|
|
|
|
- fpga_io(FPGA_CMD_RD|FPGA_CMD_ACK1, FPGA_HDR_ADDR,
|
|
|
|
- head, sizeof head);
|
|
|
|
-
|
|
|
|
- for (unsigned int i = 0; i < ARRAY_SIZE(head); i++) {
|
|
|
|
- printf("[FPGA] head[%u] = 0x%08x (%u)\n",
|
|
|
|
- i, head[i], head[i]);
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
|
|
+ /* If the FPGA is already up, need to issue our own active handshake */
|
|
|
|
+ fpga_io(FPGA_CMD_WR|FPGA_CMD_IRQ(RV_IRQ_HELLO), 0, NULL, 0);
|
|
|
|
|
|
while (1) {
|
|
while (1) {
|
|
while (!digitalRead(PIN_FPGA_INT)) {
|
|
while (!digitalRead(PIN_FPGA_INT)) {
|
|
printf("[FPGA] FPGA signals ready\n");
|
|
printf("[FPGA] FPGA signals ready\n");
|
|
|
|
|
|
|
|
+ fpga_io(FPGA_CMD_RD|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\n",
|
|
|
|
+ (uint8_t)(head.board >> 24), (uint8_t)(head.board >> 16));
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ char signature_string[head.signature_len + 3];
|
|
|
|
+ fpga_io(FPGA_CMD_RD, (size_t)head.signature,
|
|
|
|
+ signature_string, (head.signature_len + 3) & ~3);
|
|
|
|
+ signature_string[head.signature_len] = '\0';
|
|
|
|
+
|
|
|
|
+ printf("[FPGA] \"%s\"\n", signature_string);
|
|
}
|
|
}
|
|
|
|
|
|
/* Wait until an interrupt is received */
|
|
/* Wait until an interrupt is received */
|