fb11e647
vrobic
reseau statique a...
|
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
255
256
257
258
|
From 68fcbaf8eb8b2e2c1abe319fb74f75f0a75c330e Mon Sep 17 00:00:00 2001
From: Bas Stottelaar <basstottelaar@gmail.com>
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 <stdio.h>
+
+#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 <stdint.h>
#include <stddef.h>
+#include "periph/gpio.h"
+
#if defined(__GNUC__) && defined(__AVR__)
#include <avr/pgmspace.h>
#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
|