Browse Source

rv32: add single-byte esplink get/put functions

For the single byte case, the esplink ring buffer get/put functions
can be greatly simplified. This case matters e.g. when accessing a
ring buffer from an ABC interrupt handler.
H. Peter Anvin 2 years ago
parent
commit
c15e74f601

BIN
esp32/output/max80.ino.bin


+ 2 - 2
fpga/max80.qpf

@@ -19,12 +19,12 @@
 #
 # Quartus Prime
 # Version 21.1.0 Build 842 10/21/2021 SJ Lite Edition
-# Date created = 00:47:37  June 05, 2022
+# Date created = 01:03:43  June 05, 2022
 #
 # -------------------------------------------------------------------------- #
 
 QUARTUS_VERSION = "21.1"
-DATE = "00:47:37  June 05, 2022"
+DATE = "01:03:43  June 05, 2022"
 
 # Revisions
 

BIN
fpga/output/v1.fw


BIN
fpga/output/v1.jic


BIN
fpga/output/v1.rbf.gz


BIN
fpga/output/v1.rpd.gz


BIN
fpga/output/v1.sof


BIN
fpga/output/v1.svf.gz


BIN
fpga/output/v1.xsvf.gz


BIN
fpga/output/v2.fw


BIN
fpga/output/v2.jic


BIN
fpga/output/v2.rbf.gz


BIN
fpga/output/v2.rpd.gz


BIN
fpga/output/v2.sof


BIN
fpga/output/v2.svf.gz


BIN
fpga/output/v2.xsvf.gz


+ 46 - 0
rv32/esp.c

@@ -159,6 +159,52 @@ size_t esp_rb_write(enum esplink_ringbuf_user ring,
     return len;
 }
 
+/*
+ * Faster/simpler versions for reading/writing a single byte at a time;
+ * esp_rb_getc() returns -1 if the ring is empty.
+ *
+ * esp_rb_putc() returns -1 on failure, otherwise the number of
+ * bytes still free in the ring (a nonnegative number.)
+ */
+int esp_rb_getc(enum esplink_ringbuf_user ring)
+{
+    const size_t size          = rb_desc[ring].dstr.size;
+    const size_t sizemask      = size - 1;
+    const uint8_t * const base = rb_desc[ring].dstr.start;
+    size_t head                = rb_ustr[ring].head;
+    size_t tail                = rb_dstr[ring].tail;
+    int data;
+
+    if (tail == head)
+	return -1;		/* Buffer empty */
+
+    data = base[tail];
+    tail = (tail + 1) & sizemask;
+    rb_dstr[ring].tail = tail;
+    ESP_SPI_IRQ_SET = 1 << EL_UIRQ_RINGBUF;
+
+    return data;
+}
+
+int esp_rb_putc(enum esplink_ringbuf_user ring, uint8_t data)
+{
+    const size_t size          = rb_desc[ring].ustr.size;
+    const size_t sizemask      = size - 1;
+    uint8_t * const base       = rb_desc[ring].ustr.start;
+    size_t tail                = rb_ustr[ring].tail;
+    size_t head                = rb_dstr[ring].head;
+    int avail                  = (tail - head - 1) & sizemask;
+
+    if (avail--) {
+	base[head] = data;
+	head = (head + 1) & sizemask;
+	rb_dstr[ring].head = head;
+	ESP_SPI_IRQ_SET = 1 << EL_UIRQ_RINGBUF;
+    }
+
+    return avail;
+}
+
 void esp_init(void)
 {
     static char __dram_data esp_signature[] = "Hej tomtebuggar slå i glasen!";

+ 2 - 0
rv32/esplink.h

@@ -10,5 +10,7 @@ extern size_t esp_rb_read(enum esplink_ringbuf_user ring,
 			  void *data, size_t len);
 extern size_t esp_rb_write(enum esplink_ringbuf_user ring,
 			   const void *data, size_t len);
+extern int esp_rb_getc(enum esplink_ringbuf_user ring);
+extern int esp_rb_putc(enum esplink_ringbuf_user ring, uint8_t data);
 
 #endif /* RV32_ESPLINK_H */