From 68fcbaf8eb8b2e2c1abe319fb74f75f0a75c330e Mon Sep 17 00:00:00 2001 From: Bas Stottelaar Date: Wed, 22 Jun 2016 18:04:31 +0200 Subject: [PATCH 2/2] u8g2: add riot-os interface. --- csrc/u8g2.h | 4 +- csrc/u8g2_riotos.c | 163 +++++++++++++++++++++++++++++++++++++++++++++++++++++ csrc/u8x8.h | 17 +++++- 3 files changed, 180 insertions(+), 4 deletions(-) create mode 100644 csrc/u8g2_riotos.c diff --git a/csrc/u8g2.h b/csrc/u8g2.h index b65c9f1..bd8c485 100644 --- a/csrc/u8g2.h +++ b/csrc/u8g2.h @@ -362,6 +362,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 */ @@ -1663,4 +1666,3 @@ extern const uint8_t u8g2_font_px437wyse700b_mn[] U8G2_FONT_SECTION("u8g2_font_p #endif - diff --git a/csrc/u8g2_riotos.c b/csrc/u8g2_riotos.c new file mode 100644 index 0000000..7106e07 --- /dev/null +++ b/csrc/u8g2_riotos.c @@ -0,0 +1,163 @@ +#include "u8g2.h" + +#include "xtimer.h" + +#include "periph/spi.h" +#include "periph/i2c.h" +#include "periph/gpio.h" + +#include + +#if SPI_NUMOF +static spi_speed_t u8x8_pulse_width_to_spi_speed(uint32_t pulse_width) +{ + uint32_t cycle_time = 2 * pulse_width; + + if (cycle_time < 100) { + return SPI_SPEED_10MHZ; + } else if (cycle_time < 200) { + return SPI_SPEED_5MHZ; + } else if (cycle_time < 1000) { + return SPI_SPEED_1MHZ; + } else if (cycle_time < 2500) { + return SPI_SPEED_400KHZ; + } + + return SPI_SPEED_100KHZ; +} +#endif /* SPI_NUMOF */ + +#if SPI_NUMOF +static spi_speed_t u8x8_spi_mode_to_spi_conf(uint32_t spi_mode) +{ + return (spi_speed_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; +} + +#if 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, (char *) arg_ptr, NULL, arg_int); + break; + case U8X8_MSG_BYTE_INIT: + spi_init_master(dev, + u8x8_spi_mode_to_spi_conf(u8g2->display_info->spi_mode), + u8x8_pulse_width_to_spi_speed(u8g2->display_info->sck_pulse_width_ns)); + break; + case U8X8_MSG_BYTE_SET_DC: + u8x8_gpio_SetDC(u8g2, arg_int); + break; + case U8X8_MSG_BYTE_START_TRANSFER: + spi_acquire(dev); + + 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 */ + +#if 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 dd74869..7c45b6a 100644 --- a/csrc/u8x8.h +++ b/csrc/u8x8.h @@ -107,6 +107,8 @@ #include #include +#include "periph/gpio.h" + #if defined(__GNUC__) && defined(__AVR__) #include #endif @@ -154,9 +156,9 @@ extern "C" { # define u8x8_pgm_read(adr) (*(const uint8_t *)(adr)) #endif -#ifdef ARDUINO -#define U8X8_USE_PINS -#endif +//#ifdef ARDUINO +//#define U8X8_USE_PINS +//#endif /*==========================================*/ /* U8X8 typedefs and data structures */ @@ -316,6 +318,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; }; #define u8x8_GetCols(u8x8) ((u8x8)->display_info->tile_width) @@ -337,6 +343,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) /*==========================================*/ @@ -818,6 +826,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.8.1