Skip to content

Commit 9ed4cb5

Browse files
committed
Added st75263 support.
1 parent ca0fafc commit 9ed4cb5

File tree

6 files changed

+503
-8
lines changed

6 files changed

+503
-8
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,5 +6,6 @@ U8g2 is a monochrome graphics library for embedded devices.
66
License: new-bsd license (two-clause bsd license).
77

88
Download: `https://github.com/olikraus/u8g2`
9+
Document: `https://github.com/olikraus/u8g2/wiki`
910

1011
Version: Commits on Mar 2 2020, undo max7219 16x16, issue #1116

src/ms_u8g2_example.c

Lines changed: 30 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,25 +10,53 @@
1010
*
1111
*/
1212

13+
#define EXAMPLE_WITH_HW_I2C (0)
14+
#define EXAMPLE_WITH_HW_4WIRE_SPI (1)
15+
#define EXAMPLE_ITEM_SELECT EXAMPLE_WITH_HW_I2C
16+
1317
#include <ms_rtos.h>
1418
#include "u8x8.h"
1519
#include "ms_u8g2_porting.h"
1620

17-
static u8x8_t u8x8; // u8x8 object
18-
static ms_uint8_t u8x8_x, u8x8_y; // current position on the screen
21+
static u8x8_t u8x8; // u8x8 object
22+
static ms_uint8_t u8x8_x, u8x8_y; // current position on the screen
1923

24+
#if EXAMPLE_ITEM_SELECT == EXAMPLE_WITH_HW_I2C
2025
static void initDisplay(void)
2126
{
2227
ms_u8x8_i2c_dev_set("/dev/i2c2");
28+
2329
u8x8_Setup(&u8x8, u8x8_d_ssd1306_128x64_noname, u8x8_cad_ssd13xx_i2c,
2430
ms_u8x8_byte_hw_i2c, ms_u8x8_gpio_and_delay_hw_i2c);
31+
2532
u8x8_InitDisplay(&u8x8);
2633
u8x8_ClearDisplay(&u8x8);
2734
u8x8_SetPowerSave(&u8x8, 0);
2835
u8x8_SetFont(&u8x8, u8x8_font_amstrad_cpc_extended_r);
36+
37+
u8x8_x = 0;
38+
u8x8_y = 0;
39+
}
40+
#endif
41+
42+
#if EXAMPLE_ITEM_SELECT == EXAMPLE_WITH_HW_4WIRE_SPI
43+
static void initDisplay(void)
44+
{
45+
ms_u8x8_spi_dev_set("/dev/gpio_spi2", "/dev/gpio_st75263_cs", "/dev/gpio_st75263_dc");
46+
ms_u8x8_spi_chip_select("/dev/st75263");
47+
48+
u8x8_Setup(&u8x8, u8x8_d_st75263_gw20880, u8x8_cad_011,
49+
ms_u8x8_byte_4wire_hw_spi, ms_u8x8_gpio_and_delay_hw_spi);
50+
51+
u8x8_InitDisplay(&u8x8);
52+
u8x8_ClearDisplay(&u8x8);
53+
u8x8_SetPowerSave(&u8x8, 0);
54+
u8x8_SetFont(&u8x8, u8x8_font_victoriabold8_r);
55+
2956
u8x8_x = 0;
3057
u8x8_y = 0;
3158
}
59+
#endif
3260

3361
static void outChar(ms_uint8_t c)
3462
{

src/ms_u8g2_porting.c

Lines changed: 189 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,10 @@
1313
#include <ms_rtos.h>
1414
#include "u8x8.h"
1515

16+
/*********************************************************************************************************
17+
Hardware I2C Communication
18+
*********************************************************************************************************/
19+
1620
static const char *ms_u8g2_i2c_dev = "/dev/i2c0";
1721
static ms_uint16_t ms_u8g2_i2c_addr = 0;
1822

@@ -26,7 +30,7 @@ void ms_u8x8_i2c_address_set(ms_uint16_t i2c_addr)
2630
ms_u8g2_i2c_addr = i2c_addr;
2731
}
2832

29-
uint8_t ms_u8x8_byte_hw_i2c(u8x8_t *u8x8, uint8_t msg, uint8_t arg_int, void *arg_ptr)
33+
ms_uint8_t ms_u8x8_byte_hw_i2c(u8x8_t *u8x8, ms_uint8_t msg, ms_uint8_t arg_int, ms_ptr_t arg_ptr)
3034
{
3135
static int fd = -1;
3236
static ms_uint8_t fifo_buf[32];
@@ -70,7 +74,7 @@ uint8_t ms_u8x8_byte_hw_i2c(u8x8_t *u8x8, uint8_t msg, uint8_t arg_int, void *ar
7074
return 1;
7175
}
7276

73-
uint8_t ms_u8x8_gpio_and_delay_hw_i2c(u8x8_t *u8x8, uint8_t msg, uint8_t arg_int, void *arg_ptr)
77+
ms_uint8_t ms_u8x8_gpio_and_delay_hw_i2c(u8x8_t *u8x8, ms_uint8_t msg, ms_uint8_t arg_int, ms_ptr_t arg_ptr)
7478
{
7579
switch (msg) {
7680
case U8X8_MSG_GPIO_AND_DELAY_INIT:
@@ -107,3 +111,186 @@ uint8_t ms_u8x8_gpio_and_delay_hw_i2c(u8x8_t *u8x8, uint8_t msg, uint8_t arg_int
107111

108112
return 1;
109113
}
114+
115+
/*********************************************************************************************************
116+
Hardware SPI Communication
117+
*********************************************************************************************************/
118+
119+
typedef struct {
120+
int fd_spi;
121+
const char *dev_name;
122+
int dev_fd;
123+
int fd_cs;
124+
int fd_dc;
125+
int inited;
126+
} ms_u8x8_spi_ctx_t;
127+
128+
static ms_u8x8_spi_ctx_t __u8x8_spi_ctx;
129+
130+
void ms_u8x8_spi_dev_set(const char *spi_dev, const char *gpio_cs, const char *gpio_dc)
131+
{
132+
int fd_spi;
133+
int fd_cs;
134+
int fd_dc;
135+
ms_gpio_param_t param;
136+
137+
fd_spi = ms_io_open(spi_dev, O_RDWR, 0666);
138+
fd_cs = ms_io_open(gpio_cs, O_RDWR, 0666);
139+
fd_dc = ms_io_open(gpio_dc, O_RDWR, 0666);
140+
141+
param.mode = MS_GPIO_MODE_OUTPUT_PP;
142+
param.pull = MS_GPIO_PULL_UP;
143+
param.speed = MS_GPIO_SPEED_HIGH;
144+
ms_io_ioctl(fd_cs, MS_GPIO_CMD_SET_PARAM, &param);
145+
ms_io_ioctl(fd_dc, MS_GPIO_CMD_SET_PARAM, &param);
146+
147+
__u8x8_spi_ctx.inited = MS_FALSE;
148+
__u8x8_spi_ctx.fd_spi = fd_spi;
149+
__u8x8_spi_ctx.fd_cs = fd_cs;
150+
__u8x8_spi_ctx.fd_dc = fd_dc;
151+
}
152+
153+
void ms_u8x8_spi_chip_select(const char *device_name)
154+
{
155+
int ret;
156+
int dev_fd;
157+
int fd_spi = __u8x8_spi_ctx.fd_spi;
158+
const char *node_name = MS_NULL;
159+
160+
dev_fd = ms_io_open(device_name, O_RDWR, 0666);
161+
if (dev_fd > 0) {
162+
node_name = device_name + strlen("/dev/");
163+
ret = ms_io_ioctl(fd_spi, MS_SPI_CMD_SEL_DEV, (ms_ptr_t)node_name);
164+
} else {
165+
ret = -1;
166+
}
167+
168+
if (ret == 0) {
169+
__u8x8_spi_ctx.inited = MS_TRUE;
170+
} else {
171+
__u8x8_spi_ctx.inited = MS_FALSE;
172+
}
173+
174+
__u8x8_spi_ctx.dev_name = device_name;
175+
}
176+
177+
ms_uint8_t ms_u8x8_byte_4wire_hw_spi(u8x8_t *u8x8, ms_uint8_t msg, ms_uint8_t arg_int, ms_ptr_t arg_ptr)
178+
{
179+
static int fd_spi = -1;
180+
static int fd_cs = -1;
181+
static int fd_dc = -1;
182+
183+
if (__u8x8_spi_ctx.inited == MS_FALSE) {
184+
return 0;
185+
}
186+
187+
if (fd_spi < 0) {
188+
fd_spi = __u8x8_spi_ctx.fd_spi;
189+
fd_cs = __u8x8_spi_ctx.fd_cs ;
190+
fd_dc = __u8x8_spi_ctx.fd_dc ;
191+
}
192+
193+
switch (msg) {
194+
case U8X8_MSG_BYTE_SEND: {
195+
ms_spi_msg_t msg;
196+
ms_uint8_t dump;
197+
198+
msg.len = arg_int;
199+
msg.tx_buf = arg_ptr;
200+
msg.rx_buf = &dump;
201+
msg.flags = MS_SPI_M_ONCE | MS_SPI_M_RX_FIX | MS_SPI_M_WRITE;
202+
203+
(void)ms_io_write(fd_spi, &msg, sizeof(msg));
204+
}
205+
break;
206+
207+
case U8X8_MSG_BYTE_INIT: {
208+
ms_uint8_t status;
209+
status = u8x8->display_info->chip_disable_level;
210+
ms_io_write(fd_cs, &status, sizeof(status));
211+
}
212+
break;
213+
214+
case U8X8_MSG_BYTE_SET_DC: {
215+
ms_uint8_t status = arg_int;
216+
ms_io_write(fd_dc, &status, sizeof(status));
217+
}
218+
break;
219+
220+
case U8X8_MSG_BYTE_START_TRANSFER: {
221+
ms_uint8_t status;
222+
ms_spi_param_t param;
223+
224+
ms_io_ioctl(fd_spi, MS_SPI_CMD_GET_PARAM, &param);
225+
param.frame_mode &= ~MS_SPI_CLK_POLARITY_HIGH;
226+
param.frame_mode &= ~MS_SPI_CLK_PHASE_2EDGE;
227+
228+
switch (u8x8->display_info->spi_mode) {
229+
case 0: param.frame_mode |= MS_SPI_CLK_POLARITY_LOW | MS_SPI_CLK_PHASE_1EDGE; break;
230+
case 1: param.frame_mode |= MS_SPI_CLK_POLARITY_LOW | MS_SPI_CLK_PHASE_2EDGE; break;
231+
case 2: param.frame_mode |= MS_SPI_CLK_POLARITY_HIGH | MS_SPI_CLK_PHASE_1EDGE; break;
232+
case 3: param.frame_mode |= MS_SPI_CLK_POLARITY_HIGH | MS_SPI_CLK_PHASE_2EDGE; break;
233+
}
234+
ms_io_ioctl(fd_spi, MS_SPI_CMD_SET_PARAM, &param);
235+
236+
status = u8x8->display_info->chip_enable_level;
237+
ms_io_write(fd_cs, &status, sizeof(status));
238+
239+
u8x8->gpio_and_delay_cb(u8x8, U8X8_MSG_DELAY_NANO, u8x8->display_info->post_chip_enable_wait_ns, NULL);
240+
}
241+
break;
242+
243+
case U8X8_MSG_BYTE_END_TRANSFER: {
244+
ms_uint8_t status;
245+
246+
u8x8->gpio_and_delay_cb(u8x8, U8X8_MSG_DELAY_NANO, u8x8->display_info->pre_chip_disable_wait_ns, NULL);
247+
248+
status = u8x8->display_info->chip_disable_level;
249+
ms_io_write(fd_cs, &status, sizeof(status));
250+
}
251+
break;
252+
253+
default:
254+
return 0;
255+
}
256+
257+
return 1;
258+
}
259+
260+
ms_uint8_t ms_u8x8_gpio_and_delay_hw_spi(u8x8_t *u8x8, ms_uint8_t msg, ms_uint8_t arg_int, ms_ptr_t arg_ptr)
261+
{
262+
switch (msg) {
263+
case U8X8_MSG_GPIO_AND_DELAY_INIT:
264+
/* init gpio and delay timer */
265+
break;
266+
267+
case U8X8_MSG_DELAY_MILLI:
268+
/* delay_ms(arg_int); */
269+
break;
270+
271+
case U8X8_MSG_GPIO_CS:
272+
/* chip select */
273+
break;
274+
275+
case U8X8_MSG_GPIO_DC:
276+
/* indicate whether data or command */
277+
break;
278+
279+
case U8X8_MSG_GPIO_RESET:
280+
/* reset gpio */
281+
break;
282+
283+
case U8X8_MSG_GPIO_SPI_CLOCK:
284+
/* configure spi baud rate */
285+
break;
286+
287+
case U8X8_MSG_GPIO_SPI_DATA:
288+
/* send data by using gpio-spi */
289+
break;
290+
291+
default:
292+
break;
293+
}
294+
295+
return 1;
296+
}

src/ms_u8g2_porting.h

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,15 @@
1717
extern "C" {
1818
#endif
1919

20-
uint8_t ms_u8x8_byte_hw_i2c(u8x8_t *u8x8, uint8_t msg, uint8_t arg_int, void *arg_ptr);
21-
uint8_t ms_u8x8_gpio_and_delay_hw_i2c(u8x8_t *u8x8, uint8_t msg, uint8_t arg_int, void *arg_ptr);
22-
void ms_u8x8_i2c_dev_set(const char *i2c_dev);
23-
void ms_u8x8_i2c_address_set(ms_uint16_t i2c_addr);
20+
ms_uint8_t ms_u8x8_byte_hw_i2c(ms_uint8_t *u8x8, ms_uint8_t msg, ms_uint8_t arg_int, ms_ptr_t arg_ptr);
21+
ms_uint8_t ms_u8x8_gpio_and_delay_hw_i2c(u8x8_t *u8x8, ms_uint8_t msg, ms_uint8_t arg_int, ms_ptr_t arg_ptr);
22+
void ms_u8x8_i2c_dev_set(const char *i2c_dev);
23+
void ms_u8x8_i2c_address_set(ms_uint16_t i2c_addr);
24+
25+
ms_uint8_t ms_u8x8_byte_4wire_hw_spi(u8x8_t *u8x8, ms_uint8_t msg, ms_uint8_t arg_int, ms_ptr_t arg_ptr);
26+
ms_uint8_t ms_u8x8_gpio_and_delay_hw_spi(u8x8_t *u8x8, ms_uint8_t msg, ms_uint8_t arg_int, ms_ptr_t arg_ptr);
27+
void ms_u8x8_spi_dev_set(const char *spi_dev, const char *gpio_cs, const char *gpio_dc);
28+
void ms_u8x8_spi_chip_select(const char *device_name);
2429

2530
#ifdef __cplusplus
2631
}

src/u8g2/csrc/u8x8.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -860,6 +860,7 @@ uint8_t u8x8_d_st7586s_erc240160(u8x8_t *u8x8, uint8_t msg, uint8_t arg_int, voi
860860
uint8_t u8x8_d_st7588_jlx12864(u8x8_t *u8x8, uint8_t msg, uint8_t arg_int, void *arg_ptr);
861861
uint8_t u8x8_d_st75256_jlx256128(u8x8_t *u8x8, uint8_t msg, uint8_t arg_int, void *arg_ptr);
862862
uint8_t u8x8_d_st75256_wo256x128(u8x8_t *u8x8, uint8_t msg, uint8_t arg_int, void *arg_ptr);
863+
uint8_t u8x8_d_st75263_gw20880(u8x8_t *u8x8, uint8_t msg, uint8_t arg_int, void *arg_ptr);
863864
uint8_t u8x8_d_st75256_jlx256160(u8x8_t *u8x8, uint8_t msg, uint8_t arg_int, void *arg_ptr);
864865
uint8_t u8x8_d_st75256_jlx256160m(u8x8_t *u8x8, uint8_t msg, uint8_t arg_int, void *arg_ptr);
865866
uint8_t u8x8_d_st75256_jlx256160_alt(u8x8_t *u8x8, uint8_t msg, uint8_t arg_int, void *arg_ptr);

0 commit comments

Comments
 (0)