0002-add-RIOT-interface.patch 7.38 KB
From 452712c6a749a2d513c366abd9e819a2f68eacbd Mon Sep 17 00:00:00 2001
From: Peter Kietzmann <peter.kietzmann@haw-hamburg.de>
Date: Wed, 6 Sep 2017 20:26:46 +0200
Subject: [PATCH 2/2] add RIOT interface

---
 csrc/u8g2.h        |   3 +
 csrc/u8g2_riotos.c | 164 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 csrc/u8x8.h        |  17 +++++-
 3 files changed, 181 insertions(+), 3 deletions(-)
 create mode 100644 csrc/u8g2_riotos.c

diff --git a/csrc/u8g2.h b/csrc/u8g2.h
index 46dcec3..bc76480 100644
--- a/csrc/u8g2.h
+++ b/csrc/u8g2.h
@@ -387,6 +387,9 @@ void u8g2_ClearDisplay(u8g2_t *u8g2);
 #define u8g2_SetMenuDownPin(u8g2, val) u8x8_SetMenuDownPin(u8g2_GetU8x8(u8g2), (val))
 #endif
 
+#define u8g2_SetPins(u8x8,pins,pins_enabled) u8x8_SetPins(u8g2_GetU8x8(&u8g2), pins, pins_enabled)
+#define u8g2_SetDevice(u8x8,device) u8x8_SetDevice(u8g2_GetU8x8(&u8g2), device)
+
 /*==========================================*/
 /* u8g2_setup.c */
 
diff --git a/csrc/u8g2_riotos.c b/csrc/u8g2_riotos.c
new file mode 100644
index 0000000..bd06ccb
--- /dev/null
+++ b/csrc/u8g2_riotos.c
@@ -0,0 +1,164 @@
+#include "u8g2.h"
+
+#include "xtimer.h"
+
+#include "periph/spi.h"
+#include "periph/i2c.h"
+#include "periph/gpio.h"
+
+#include <stdio.h>
+
+#ifdef SPI_NUMOF
+static spi_clk_t u8x8_pulse_width_to_spi_speed(uint32_t pulse_width)
+{
+    uint32_t cycle_time = 2 * pulse_width;
+
+    if (cycle_time < 100) {
+        return SPI_CLK_10MHZ;
+    } else if (cycle_time < 200) {
+        return SPI_CLK_5MHZ;
+    } else if (cycle_time < 1000) {
+        return SPI_CLK_1MHZ;
+    } else if (cycle_time < 2500) {
+        return SPI_CLK_400KHZ;
+    }
+
+    return SPI_CLK_100KHZ;
+}
+#endif /* SPI_NUMOF */
+
+#ifdef SPI_NUMOF
+static spi_mode_t u8x8_spi_mode_to_spi_conf(uint32_t spi_mode)
+{
+    return (spi_mode_t) spi_mode;
+}
+#endif /* SPI_NUMOF */
+
+static void u8x8_enable_pins(gpio_t* pins, uint32_t pins_enabled)
+{
+    uint8_t i;
+
+    for (i = 0; i < 32; i++) {
+        if (pins_enabled & (1 << i)) {
+            if (pins[i] != GPIO_UNDEF) {
+                if (i < U8X8_PIN_OUTPUT_CNT) {
+                    gpio_init(pins[i], GPIO_OUT);
+                } else {
+                    gpio_init(pins[i], GPIO_IN);
+                }
+            }
+        }
+    }
+}
+
+uint8_t u8x8_gpio_and_delay_riotos(u8x8_t *u8g2, uint8_t msg, uint8_t arg_int, void *arg_ptr)
+{
+    (void) arg_ptr;
+
+    switch (msg) {
+        case U8X8_MSG_GPIO_AND_DELAY_INIT:
+            u8x8_enable_pins(u8g2->pins, u8g2->pins_enabled);
+            break;
+        case U8X8_MSG_DELAY_MILLI:
+            xtimer_usleep(arg_int * 1000);
+            break;
+        case U8X8_MSG_DELAY_10MICRO:
+            xtimer_usleep(arg_int * 10);
+            break;
+        case U8X8_MSG_DELAY_100NANO:
+            xtimer_nanosleep(arg_int * 100);
+            break;
+        case U8X8_MSG_GPIO_CS:
+            if (u8g2->pins_enabled & (1 << U8X8_PIN_CS)) {
+                gpio_write(u8g2->pins[U8X8_PIN_CS], arg_int);
+            }
+            break;
+        case U8X8_MSG_GPIO_DC:
+            if (u8g2->pins_enabled & (1 << U8X8_PIN_DC)) {
+                gpio_write(u8g2->pins[U8X8_PIN_DC], arg_int);
+            }
+            break;
+        case U8X8_MSG_GPIO_RESET:
+            if (u8g2->pins_enabled & (1 << U8X8_PIN_RESET)) {
+                gpio_write(u8g2->pins[U8X8_PIN_RESET], arg_int);
+            }
+            break;
+        default:
+            return 0;
+    }
+
+    return 1;
+}
+
+#ifdef SPI_NUMOF
+uint8_t u8x8_byte_riotos_hw_spi(u8x8_t *u8g2, uint8_t msg, uint8_t arg_int, void *arg_ptr)
+{
+    spi_t dev = (spi_t) u8g2->dev;
+
+    switch (msg) {
+        case U8X8_MSG_BYTE_SEND:
+            spi_transfer_bytes(dev, GPIO_UNDEF, true,
+                               arg_ptr, NULL, (size_t)arg_int);
+            break;
+        case U8X8_MSG_BYTE_INIT:
+            spi_init_pins(dev);
+            break;
+        case U8X8_MSG_BYTE_SET_DC:
+            u8x8_gpio_SetDC(u8g2, arg_int);
+            break;
+        case U8X8_MSG_BYTE_START_TRANSFER:
+            spi_acquire(dev, GPIO_UNDEF,
+                        u8x8_spi_mode_to_spi_conf(u8g2->display_info->spi_mode),
+                        u8x8_pulse_width_to_spi_speed(u8g2->display_info->sck_pulse_width_ns));
+
+            u8x8_gpio_SetCS(u8g2, u8g2->display_info->chip_enable_level);
+            u8g2->gpio_and_delay_cb(u8g2, U8X8_MSG_DELAY_NANO, u8g2->display_info->post_chip_enable_wait_ns, NULL);
+            break;
+        case U8X8_MSG_BYTE_END_TRANSFER:
+            u8g2->gpio_and_delay_cb(u8g2, U8X8_MSG_DELAY_NANO, u8g2->display_info->pre_chip_disable_wait_ns, NULL);
+            u8x8_gpio_SetCS(u8g2, u8g2->display_info->chip_disable_level);
+
+            spi_release(dev);
+            break;
+        default:
+            return 0;
+    }
+
+    return 1;
+}
+#endif /* SPI_NUMOF */
+
+#ifdef I2C_NUMOF
+uint8_t u8x8_byte_riotos_hw_i2c(u8x8_t *u8g2, uint8_t msg, uint8_t arg_int, void *arg_ptr)
+{
+    static uint8_t buffer[255];
+    static uint8_t index;
+
+    i2c_t dev = (i2c_t) u8g2->dev;
+
+    switch (msg) {
+        case U8X8_MSG_BYTE_SEND:
+            while (arg_int--) {
+                buffer[index++] = *((uint8_t *)arg_ptr++);
+            }
+            break;
+        case U8X8_MSG_BYTE_INIT:
+            i2c_init_master(dev, I2C_SPEED_FAST);
+            break;
+        case U8X8_MSG_BYTE_SET_DC:
+            break;
+        case U8X8_MSG_BYTE_START_TRANSFER:
+            i2c_acquire(dev);
+            index = 0;
+            break;
+        case U8X8_MSG_BYTE_END_TRANSFER:
+            i2c_write_bytes(dev, u8x8_GetI2CAddress(u8g2), buffer, index);
+            i2c_release(dev);
+            break;
+        default:
+            return 0;
+    }
+
+    return 1;
+}
+#endif /* I2C_NUMOF */
diff --git a/csrc/u8x8.h b/csrc/u8x8.h
index 2c93c87..b434893 100644
--- a/csrc/u8x8.h
+++ b/csrc/u8x8.h
@@ -111,6 +111,8 @@
 #include <stdint.h>
 #include <stddef.h>
 
+#include "periph/gpio.h"
+
 #if defined(__GNUC__) && defined(__AVR__)
 #include <avr/pgmspace.h>
 #endif 
@@ -174,9 +176,9 @@ uint8_t u8x8_pgm_read_esp(const uint8_t * addr);   /* u8x8_8x8.c */
 #  define U8X8_PROGMEM
 #endif
 
-#ifdef ARDUINO
-#define U8X8_USE_PINS
-#endif
+//#ifdef ARDUINO
+//#define U8X8_USE_PINS
+//#endif
 
 /*==========================================*/
 /* U8X8 typedefs and data structures */
@@ -342,6 +344,10 @@ struct u8x8_struct
 #ifdef U8X8_USE_PINS 
   uint8_t pins[U8X8_PIN_CNT];	/* defines a pinlist: Mainly a list of pins for the Arduino Envionment, use U8X8_PIN_xxx to access */
 #endif
+
+gpio_t* pins;
+uint32_t pins_enabled;
+uint32_t dev;
 };
 
 #ifdef U8X8_WITH_USER_PTR
@@ -371,6 +377,8 @@ struct u8x8_struct
 #define u8x8_SetMenuDownPin(u8x8, val) u8x8_SetPin((u8x8),U8X8_PIN_MENU_DOWN,(val))
 #endif
 
+#define u8x8_SetPins(u8x8,pins,pins_enabled) {(u8x8)->pins = (pins); (u8x8)->pins_enabled = (pins_enabled);}
+#define u8x8_SetDevice(u8x8,device) ((u8x8)->dev = device)
 
 /*==========================================*/
 
@@ -939,6 +947,9 @@ extern const uint8_t u8x8_font_pxplustandynewtv_u[] U8X8_FONT_SECTION("u8x8_font
 
 /* end font list */
 
+extern uint8_t u8x8_byte_riotos_hw_spi(u8x8_t *u8g2, uint8_t msg, uint8_t arg_int, void *arg_ptr);
+extern uint8_t u8x8_gpio_and_delay_riotos(u8x8_t *u8g2, uint8_t msg, uint8_t arg_int, void *arg_ptr);
+extern uint8_t u8x8_byte_riotos_hw_i2c(u8x8_t *u8g2, uint8_t msg, uint8_t arg_int, void *arg_ptr);
 
 #ifdef __cplusplus
 }
-- 
2.7.4