|
@@ -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!";
|