diff --git a/pkg/u8g2/Makefile b/pkg/u8g2/Makefile index df94ec04ed..310b6b9cb1 100644 --- a/pkg/u8g2/Makefile +++ b/pkg/u8g2/Makefile @@ -1,11 +1,16 @@ PKG_NAME=u8g2 PKG_URL=https://github.com/olikraus/u8g2 -PKG_VERSION=4dc79943020d9512207aea4cf914740556173793 +PKG_VERSION=f08ff974c03e5c848bc5d2ae3fddb6a97897881a PKG_LICENSE=BSD-2-Clause .PHONY: all all: git-download + cp $(RIOTBASE)/pkg/u8g2/src/Makefile $(PKG_BUILDDIR)/Makefile + cp $(RIOTBASE)/pkg/u8g2/src/csrc/Makefile $(PKG_BUILDDIR)/csrc/Makefile + cp $(RIOTBASE)/pkg/u8g2/src/csrc/u8g2_riotos.c $(PKG_BUILDDIR)/csrc/u8g2_riotos.c + cp $(RIOTBASE)/pkg/u8g2/src/sys/sdl/common/Makefile $(PKG_BUILDDIR)/sys/sdl/common/Makefile + cp $(RIOTBASE)/pkg/u8g2/src/sys/utf8/common/Makefile $(PKG_BUILDDIR)/sys/utf8/common/Makefile "$(MAKE)" -C $(PKG_BUILDDIR) include $(RIOTBASE)/pkg/pkg.mk diff --git a/pkg/u8g2/Makefile.include b/pkg/u8g2/Makefile.include index 98bbc699d4..1dac566a42 100644 --- a/pkg/u8g2/Makefile.include +++ b/pkg/u8g2/Makefile.include @@ -2,5 +2,5 @@ INCLUDES += -I$(PKGDIRBASE)/u8g2/csrc # Link SDL if enabled. ifneq (,$(filter u8g2_sdl,$(USEMODULE))) - LINKFLAGS += `sdl-config --libs` + LINKFLAGS += `sdl2-config --libs` endif diff --git a/pkg/u8g2/README.md b/pkg/u8g2/README.md index 8eaae174ab..97dcb818bd 100644 --- a/pkg/u8g2/README.md +++ b/pkg/u8g2/README.md @@ -53,7 +53,7 @@ u8g2_SetDevice(&u8g2, SPI_DEV(0)); For targets without an I2C or SPI, virtual displays are available. These displays are part of U8g2, but are not compiled by default. * By adding `USEMODULE += u8g2_utf8`, a terminal display is used as virtual display, using UTF8 block characters that are printed to stdout. -* By adding `USEMODULE += u8g2_sdl`, a SDL virtual display will be used. This is only available on native targets that have SDL installed. It uses `sdl-config` to find the headers and libraries. Note that RIOT-OS builds 32-bit binaries and requires 32-bit SDL libraries. +* By adding `USEMODULE += u8g2_sdl`, a SDL virtual display will be used. This is only available on native targets that have SDL installed. It uses `sdl2-config` to find the headers and libraries. Note that RIOT-OS builds 32-bit binaries and requires 32-bit SDL libraries. ### Example ``` diff --git a/pkg/u8g2/patches/0001-add-RIOT-OS-interface.patch b/pkg/u8g2/patches/0001-add-RIOT-OS-interface.patch new file mode 100644 index 0000000000..bd9e327093 --- /dev/null +++ b/pkg/u8g2/patches/0001-add-RIOT-OS-interface.patch @@ -0,0 +1,83 @@ +From a17e644521b91d5f5fc35e567375ac5998f24b66 Mon Sep 17 00:00:00 2001 +From: Bas Stottelaar +Date: Sun, 11 Mar 2018 22:13:10 +0100 +Subject: [PATCH 1/1] add RIOT-OS interface. + +--- + csrc/u8g2.h | 3 +++ + csrc/u8x8.h | 17 ++++++++++++++--- + 2 files changed, 17 insertions(+), 3 deletions(-) + +diff --git a/csrc/u8g2.h b/csrc/u8g2.h +index 48239709..c8934cf7 100644 +--- a/csrc/u8g2.h ++++ b/csrc/u8g2.h +@@ -388,6 +388,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/u8x8.h b/csrc/u8x8.h +index bbeff59f..ae65bbb1 100644 +--- a/csrc/u8x8.h ++++ b/csrc/u8x8.h +@@ -111,6 +111,8 @@ + #include + #include + ++#include "periph/gpio.h" ++ + #if defined(__GNUC__) && defined(__AVR__) + #include + #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) + + /*==========================================*/ + +@@ -973,6 +981,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.14.2 + diff --git a/pkg/u8g2/patches/0001-u8g2-add-RIOT-makefiles.patch b/pkg/u8g2/patches/0001-u8g2-add-RIOT-makefiles.patch deleted file mode 100644 index 6f81d3c212..0000000000 --- a/pkg/u8g2/patches/0001-u8g2-add-RIOT-makefiles.patch +++ /dev/null @@ -1,76 +0,0 @@ -From 5c168fc6d96d8dc84907e667a70b3a85b8402270 Mon Sep 17 00:00:00 2001 -From: Peter Kietzmann -Date: Wed, 6 Sep 2017 20:23:56 +0200 -Subject: [PATCH 1/3] u8g2: add RIOT makefiles - ---- - Makefile | 22 ++++++++++++++++++++++ - csrc/Makefile | 3 +++ - sys/sdl/common/Makefile | 5 +++++ - sys/utf8/common/Makefile | 3 +++ - 4 files changed, 33 insertions(+) - create mode 100644 Makefile - create mode 100644 csrc/Makefile - create mode 100644 sys/sdl/common/Makefile - create mode 100644 sys/utf8/common/Makefile - -diff --git a/Makefile b/Makefile -new file mode 100644 -index 0000000..ec64fab ---- /dev/null -+++ b/Makefile -@@ -0,0 +1,22 @@ -+DIRS += csrc -+ -+# SDL can be used as a virtual display, but is for native target only. -+ifneq (,$(filter u8g2_sdl,$(USEMODULE))) -+ DIRS += sys/sdl/common -+endif -+ -+# UTF8 virtual display is not part of core. Therefore it is a separate module. -+ifneq (,$(filter u8g2_utf8,$(USEMODULE))) -+ DIRS += sys/utf8/common -+endif -+ -+# Compiling U8g2 will generate a lot of compiler warnings, which are treated -+# as errors. For the sake of simplicity, ignore them. -+CFLAGS += -Wno-empty-translation-unit \ -+ -Wno-newline-eof \ -+ -Wno-unused-parameter \ -+ -Wno-unused \ -+ -Wno-overlength-strings \ -+ -Wno-pointer-arith -+ -+include $(RIOTBASE)/Makefile.base -diff --git a/csrc/Makefile b/csrc/Makefile -new file mode 100644 -index 0000000..1023a87 ---- /dev/null -+++ b/csrc/Makefile -@@ -0,0 +1,3 @@ -+MODULE = u8g2 -+ -+include $(RIOTBASE)/Makefile.base -diff --git a/sys/sdl/common/Makefile b/sys/sdl/common/Makefile -new file mode 100644 -index 0000000..ce8b90b ---- /dev/null -+++ b/sys/sdl/common/Makefile -@@ -0,0 +1,5 @@ -+MODULE = u8g2_sdl -+ -+CFLAGS += `sdl-config --cflags` -+ -+include $(RIOTBASE)/Makefile.base -diff --git a/sys/utf8/common/Makefile b/sys/utf8/common/Makefile -new file mode 100644 -index 0000000..32e7913 ---- /dev/null -+++ b/sys/utf8/common/Makefile -@@ -0,0 +1,3 @@ -+MODULE = u8g2_utf8 -+ -+include $(RIOTBASE)/Makefile.base --- -2.7.4 - diff --git a/pkg/u8g2/patches/0002-add-RIOT-interface.patch b/pkg/u8g2/patches/0002-add-RIOT-interface.patch deleted file mode 100644 index dcca03af4c..0000000000 --- a/pkg/u8g2/patches/0002-add-RIOT-interface.patch +++ /dev/null @@ -1,255 +0,0 @@ -From 6a09e7bee194681f63781dd0af6c154f2f4e519c Mon Sep 17 00:00:00 2001 -From: Peter Kietzmann -Date: Wed, 6 Sep 2017 20:26:46 +0200 -Subject: [PATCH 2/3] 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 6ff3f91..d284619 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 -+ -+#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 a4a99b7..e508664 100644 ---- a/csrc/u8x8.h -+++ b/csrc/u8x8.h -@@ -111,6 +111,8 @@ - #include - #include - -+#include "periph/gpio.h" -+ - #if defined(__GNUC__) && defined(__AVR__) - #include - #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) - - /*==========================================*/ - -@@ -943,6 +951,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 - diff --git a/pkg/u8g2/patches/0003-Change-conflicting-module-name-for-pkg-root-director.patch b/pkg/u8g2/patches/0003-Change-conflicting-module-name-for-pkg-root-director.patch deleted file mode 100644 index 29af20dbab..0000000000 --- a/pkg/u8g2/patches/0003-Change-conflicting-module-name-for-pkg-root-director.patch +++ /dev/null @@ -1,23 +0,0 @@ -From 4783fcb666569eda64bbba7c4923fb0320ba7bcd Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Ga=C3=ABtan=20Harter?= -Date: Tue, 7 Nov 2017 16:51:11 +0100 -Subject: [PATCH 3/3] Change conflicting module name for pkg root directory - -Root directory and csrc both had 'u8g2' module name. ---- - Makefile | 2 ++ - 1 file changed, 2 insertions(+) - -diff --git a/Makefile b/Makefile -index ec64fab..419ebdb 100644 ---- a/Makefile -+++ b/Makefile -@@ -1,3 +1,5 @@ -+MODULE = pkg-u8g2 -+ - DIRS += csrc - - # SDL can be used as a virtual display, but is for native target only. --- -2.7.4 - diff --git a/pkg/u8g2/src/Makefile b/pkg/u8g2/src/Makefile new file mode 100644 index 0000000000..419ebdb198 --- /dev/null +++ b/pkg/u8g2/src/Makefile @@ -0,0 +1,24 @@ +MODULE = pkg-u8g2 + +DIRS += csrc + +# SDL can be used as a virtual display, but is for native target only. +ifneq (,$(filter u8g2_sdl,$(USEMODULE))) + DIRS += sys/sdl/common +endif + +# UTF8 virtual display is not part of core. Therefore it is a separate module. +ifneq (,$(filter u8g2_utf8,$(USEMODULE))) + DIRS += sys/utf8/common +endif + +# Compiling U8g2 will generate a lot of compiler warnings, which are treated +# as errors. For the sake of simplicity, ignore them. +CFLAGS += -Wno-empty-translation-unit \ + -Wno-newline-eof \ + -Wno-unused-parameter \ + -Wno-unused \ + -Wno-overlength-strings \ + -Wno-pointer-arith + +include $(RIOTBASE)/Makefile.base diff --git a/pkg/u8g2/src/csrc/Makefile b/pkg/u8g2/src/csrc/Makefile new file mode 100644 index 0000000000..1023a87a81 --- /dev/null +++ b/pkg/u8g2/src/csrc/Makefile @@ -0,0 +1,3 @@ +MODULE = u8g2 + +include $(RIOTBASE)/Makefile.base diff --git a/pkg/u8g2/src/csrc/u8g2_riotos.c b/pkg/u8g2/src/csrc/u8g2_riotos.c new file mode 100644 index 0000000000..7c4245536d --- /dev/null +++ b/pkg/u8g2/src/csrc/u8g2_riotos.c @@ -0,0 +1,183 @@ +/* + * Copyright (C) 2016-2018 Bas Stottelaar + * + * This file is subject to the terms and conditions of the GNU Lesser + * General Public License v2.1. See the file LICENSE in the top level + * directory for more details. + */ + +/** + * @ingroup pkg_u8g2 + * @{ + * + * @file + * @brief U8g2 driver for interacting with RIOT-OS drivers + * + * @author Bas Stottelaar + * + * @} + */ + +#include +#include + +#include "u8g2.h" + +#include "xtimer.h" +#include "periph/spi.h" +#include "periph/i2c.h" +#include "periph/gpio.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: + memcpy(&buffer[index], arg_ptr, arg_int); + index += arg_int; + 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/pkg/u8g2/src/sys/sdl/common/Makefile b/pkg/u8g2/src/sys/sdl/common/Makefile new file mode 100644 index 0000000000..5d0aed4015 --- /dev/null +++ b/pkg/u8g2/src/sys/sdl/common/Makefile @@ -0,0 +1,5 @@ +MODULE = u8g2_sdl + +CFLAGS += `sdl2-config --cflags` + +include $(RIOTBASE)/Makefile.base diff --git a/pkg/u8g2/src/sys/utf8/common/Makefile b/pkg/u8g2/src/sys/utf8/common/Makefile new file mode 100644 index 0000000000..32e79133df --- /dev/null +++ b/pkg/u8g2/src/sys/utf8/common/Makefile @@ -0,0 +1,3 @@ +MODULE = u8g2_utf8 + +include $(RIOTBASE)/Makefile.base