Blame view

RIOT/pkg/u8g2/patches/0002-add-RIOT-interface.patch 7.38 KB
a752c7ab   elopes   add first test an...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
  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