Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
ruanhaishen
Nodemcu Firmware
Commits
837cf206
Commit
837cf206
authored
Sep 20, 2016
by
devsaurus
Browse files
move comm drivers to u8g_glue.c
parent
492ee578
Changes
4
Hide whitespace changes
Inline
Side-by-side
app/modules/u8g.c
View file @
837cf206
...
...
@@ -3,7 +3,6 @@
#include "module.h"
#include "lauxlib.h"
#include "lmem.h"
#include "platform.h"
#include "u8g.h"
#include "u8g_glue.h"
...
...
@@ -770,212 +769,6 @@ static int lu8g_setFontLineSpacingFactor( lua_State *L )
}
// ------------------------------------------------------------
// comm functions
//
#define I2C_CMD_MODE 0x000
#define I2C_DATA_MODE 0x040
#define ESP_I2C_ID 0
static
uint8_t
do_i2c_start
(
uint8_t
id
,
uint8_t
sla
)
{
platform_i2c_send_start
(
id
);
// ignore return value -> tolerate missing ACK
platform_i2c_send_address
(
id
,
sla
,
PLATFORM_I2C_DIRECTION_TRANSMITTER
);
return
1
;
}
static
uint8_t
u8g_com_esp8266_ssd_start_sequence
(
u8g_t
*
u8g
)
{
/* are we requested to set the a0 state? */
if
(
u8g
->
pin_list
[
U8G_PI_SET_A0
]
==
0
)
return
1
;
/* setup bus, might be a repeated start */
if
(
do_i2c_start
(
ESP_I2C_ID
,
u8g
->
i2c_addr
)
==
0
)
return
0
;
if
(
u8g
->
pin_list
[
U8G_PI_A0_STATE
]
==
0
)
{
// ignore return value -> tolerate missing ACK
if
(
platform_i2c_send_byte
(
ESP_I2C_ID
,
I2C_CMD_MODE
)
==
0
)
;
//return 0;
}
else
{
platform_i2c_send_byte
(
ESP_I2C_ID
,
I2C_DATA_MODE
);
}
u8g
->
pin_list
[
U8G_PI_SET_A0
]
=
0
;
return
1
;
}
static
void
lu8g_digital_write
(
u8g_t
*
u8g
,
uint8_t
pin_index
,
uint8_t
value
)
{
uint8_t
pin
;
pin
=
u8g
->
pin_list
[
pin_index
];
if
(
pin
!=
U8G_PIN_NONE
)
platform_gpio_write
(
pin
,
value
);
}
void
u8g_Delay
(
u8g_t
*
u8g
,
uint16_t
msec
)
{
const
uint16_t
chunk
=
50
;
if
(
u8g
->
use_delay
==
0
)
return
;
while
(
msec
>
chunk
)
{
os_delay_us
(
chunk
*
1000
);
msec
-=
chunk
;
}
if
(
msec
>
0
)
os_delay_us
(
msec
*
1000
);
}
void
u8g_MicroDelay
(
void
)
{
os_delay_us
(
1
);
}
void
u8g_10MicroDelay
(
void
)
{
os_delay_us
(
10
);
}
uint8_t
u8g_com_esp8266_hw_spi_fn
(
u8g_t
*
u8g
,
uint8_t
msg
,
uint8_t
arg_val
,
void
*
arg_ptr
)
{
switch
(
msg
)
{
case
U8G_COM_MSG_STOP
:
break
;
case
U8G_COM_MSG_INIT
:
// we assume that the SPI interface was already initialized
// just care for the /CS and D/C pins
lu8g_digital_write
(
u8g
,
U8G_PI_CS
,
PLATFORM_GPIO_HIGH
);
platform_gpio_mode
(
u8g
->
pin_list
[
U8G_PI_CS
],
PLATFORM_GPIO_OUTPUT
,
PLATFORM_GPIO_FLOAT
);
platform_gpio_mode
(
u8g
->
pin_list
[
U8G_PI_A0
],
PLATFORM_GPIO_OUTPUT
,
PLATFORM_GPIO_FLOAT
);
break
;
case
U8G_COM_MSG_ADDRESS
:
/* define cmd (arg_val = 0) or data mode (arg_val = 1) */
lu8g_digital_write
(
u8g
,
U8G_PI_A0
,
arg_val
==
0
?
PLATFORM_GPIO_LOW
:
PLATFORM_GPIO_HIGH
);
break
;
case
U8G_COM_MSG_CHIP_SELECT
:
if
(
arg_val
==
0
)
{
/* disable */
lu8g_digital_write
(
u8g
,
U8G_PI_CS
,
PLATFORM_GPIO_HIGH
);
}
else
{
/* enable */
//u8g_com_arduino_digital_write(u8g, U8G_PI_SCK, LOW);
lu8g_digital_write
(
u8g
,
U8G_PI_CS
,
PLATFORM_GPIO_LOW
);
}
break
;
case
U8G_COM_MSG_RESET
:
if
(
u8g
->
pin_list
[
U8G_PI_RESET
]
!=
U8G_PIN_NONE
)
lu8g_digital_write
(
u8g
,
U8G_PI_RESET
,
arg_val
==
0
?
PLATFORM_GPIO_LOW
:
PLATFORM_GPIO_HIGH
);
break
;
case
U8G_COM_MSG_WRITE_BYTE
:
platform_spi_send
(
1
,
8
,
arg_val
);
break
;
case
U8G_COM_MSG_WRITE_SEQ
:
case
U8G_COM_MSG_WRITE_SEQ_P
:
{
register
uint8_t
*
ptr
=
arg_ptr
;
while
(
arg_val
>
0
)
{
platform_spi_send
(
1
,
8
,
*
ptr
++
);
arg_val
--
;
}
}
break
;
}
return
1
;
}
uint8_t
u8g_com_esp8266_ssd_i2c_fn
(
u8g_t
*
u8g
,
uint8_t
msg
,
uint8_t
arg_val
,
void
*
arg_ptr
)
{
switch
(
msg
)
{
case
U8G_COM_MSG_INIT
:
// we assume that the i2c bus was already initialized
//u8g_i2c_init(u8g->pin_list[U8G_PI_I2C_OPTION]);
break
;
case
U8G_COM_MSG_STOP
:
break
;
case
U8G_COM_MSG_RESET
:
/* Currently disabled, but it could be enable. Previous restrictions have been removed */
/* u8g_com_arduino_digital_write(u8g, U8G_PI_RESET, arg_val); */
break
;
case
U8G_COM_MSG_CHIP_SELECT
:
u8g
->
pin_list
[
U8G_PI_A0_STATE
]
=
0
;
u8g
->
pin_list
[
U8G_PI_SET_A0
]
=
1
;
/* force a0 to set again, also forces start condition */
if
(
arg_val
==
0
)
{
/* disable chip, send stop condition */
platform_i2c_send_stop
(
ESP_I2C_ID
);
}
else
{
/* enable, do nothing: any byte writing will trigger the i2c start */
}
break
;
case
U8G_COM_MSG_WRITE_BYTE
:
//u8g->pin_list[U8G_PI_SET_A0] = 1;
if
(
u8g_com_esp8266_ssd_start_sequence
(
u8g
)
==
0
)
return
platform_i2c_send_stop
(
ESP_I2C_ID
),
0
;
// ignore return value -> tolerate missing ACK
if
(
platform_i2c_send_byte
(
ESP_I2C_ID
,
arg_val
)
==
0
)
;
//return platform_i2c_send_stop( ESP_I2C_ID ), 0;
// platform_i2c_send_stop( ESP_I2C_ID );
break
;
case
U8G_COM_MSG_WRITE_SEQ
:
case
U8G_COM_MSG_WRITE_SEQ_P
:
//u8g->pin_list[U8G_PI_SET_A0] = 1;
if
(
u8g_com_esp8266_ssd_start_sequence
(
u8g
)
==
0
)
return
platform_i2c_send_stop
(
ESP_I2C_ID
),
0
;
{
register
uint8_t
*
ptr
=
arg_ptr
;
while
(
arg_val
>
0
)
{
// ignore return value -> tolerate missing ACK
if
(
platform_i2c_send_byte
(
ESP_I2C_ID
,
*
ptr
++
)
==
0
)
;
//return platform_i2c_send_stop( ESP_I2C_ID ), 0;
arg_val
--
;
}
}
// platform_i2c_send_stop( ESP_I2C_ID );
break
;
case
U8G_COM_MSG_ADDRESS
:
/* define cmd (arg_val = 0) or data mode (arg_val = 1) */
u8g
->
pin_list
[
U8G_PI_A0_STATE
]
=
arg_val
;
u8g
->
pin_list
[
U8G_PI_SET_A0
]
=
1
;
/* force a0 to set again */
break
;
}
return
1
;
}
// device destructor
static
int
lu8g_close_display
(
lua_State
*
L
)
{
...
...
@@ -1019,8 +812,8 @@ static int lu8g_close_display( lua_State *L )
lu8g_userdata_t *lud = (lu8g_userdata_t *) lua_newuserdata( L, sizeof( lu8g_userdata_t ) ); \
lud->cb_ref = LUA_NOREF; \
\
lud->
u8g.
i2c_addr = (uint8_t)addr; \
lud->
u8g.
use_delay = del > 0 ? 1 : 0; \
lud->i2c_addr = (uint8_t)addr;
\
lud->use_delay = del > 0 ? 1 : 0;
\
\
u8g_InitI2C( LU8G, &u8g_dev_ ## device, U8G_I2C_OPT_NONE); \
\
...
...
@@ -1053,7 +846,7 @@ U8G_DISPLAY_TABLE_I2C
lu8g_userdata_t *lud = (lu8g_userdata_t *) lua_newuserdata( L, sizeof( lu8g_userdata_t ) ); \
lud->cb_ref = LUA_NOREF; \
\
lud->
u8g.
use_delay = del > 0 ? 1 : 0; \
lud->use_delay = del > 0 ? 1 : 0;
\
\
u8g_InitHWSPI( LU8G, &u8g_dev_ ## device, cs, dc, res ); \
\
...
...
app/modules/u8g_glue.c
View file @
837cf206
...
...
@@ -3,6 +3,7 @@
*/
#include "lauxlib.h"
#include "platform.h"
#include "c_stdlib.h"
...
...
@@ -10,6 +11,216 @@
#include "u8g_glue.h"
// ------------------------------------------------------------
// comm functions
//
#define I2C_CMD_MODE 0x000
#define I2C_DATA_MODE 0x040
#define ESP_I2C_ID 0
static
uint8_t
do_i2c_start
(
uint8_t
id
,
uint8_t
sla
)
{
platform_i2c_send_start
(
id
);
// ignore return value -> tolerate missing ACK
platform_i2c_send_address
(
id
,
sla
,
PLATFORM_I2C_DIRECTION_TRANSMITTER
);
return
1
;
}
static
uint8_t
u8g_com_esp8266_ssd_start_sequence
(
struct
_lu8g_userdata_t
*
lu8g
)
{
/* are we requested to set the a0 state? */
if
(
lu8g
->
u8g
.
pin_list
[
U8G_PI_SET_A0
]
==
0
)
return
1
;
/* setup bus, might be a repeated start */
if
(
do_i2c_start
(
ESP_I2C_ID
,
lu8g
->
i2c_addr
)
==
0
)
return
0
;
if
(
lu8g
->
u8g
.
pin_list
[
U8G_PI_A0_STATE
]
==
0
)
{
// ignore return value -> tolerate missing ACK
if
(
platform_i2c_send_byte
(
ESP_I2C_ID
,
I2C_CMD_MODE
)
==
0
)
;
//return 0;
}
else
{
platform_i2c_send_byte
(
ESP_I2C_ID
,
I2C_DATA_MODE
);
}
lu8g
->
u8g
.
pin_list
[
U8G_PI_SET_A0
]
=
0
;
return
1
;
}
static
void
lu8g_digital_write
(
struct
_lu8g_userdata_t
*
lu8g
,
uint8_t
pin_index
,
uint8_t
value
)
{
uint8_t
pin
;
pin
=
lu8g
->
u8g
.
pin_list
[
pin_index
];
if
(
pin
!=
U8G_PIN_NONE
)
platform_gpio_write
(
pin
,
value
);
}
void
u8g_Delay
(
u8g_t
*
u8g
,
uint16_t
msec
)
{
struct
_lu8g_userdata_t
*
lu8g
=
(
struct
_lu8g_userdata_t
*
)
u8g
;
const
uint16_t
chunk
=
50
;
if
(
lu8g
->
use_delay
==
0
)
return
;
while
(
msec
>
chunk
)
{
os_delay_us
(
chunk
*
1000
);
msec
-=
chunk
;
}
if
(
msec
>
0
)
os_delay_us
(
msec
*
1000
);
}
void
u8g_MicroDelay
(
void
)
{
os_delay_us
(
1
);
}
void
u8g_10MicroDelay
(
void
)
{
os_delay_us
(
10
);
}
uint8_t
u8g_com_esp8266_hw_spi_fn
(
u8g_t
*
u8g
,
uint8_t
msg
,
uint8_t
arg_val
,
void
*
arg_ptr
)
{
struct
_lu8g_userdata_t
*
lu8g
=
(
struct
_lu8g_userdata_t
*
)
u8g
;
switch
(
msg
)
{
case
U8G_COM_MSG_STOP
:
break
;
case
U8G_COM_MSG_INIT
:
// we assume that the SPI interface was already initialized
// just care for the /CS and D/C pins
lu8g_digital_write
(
lu8g
,
U8G_PI_CS
,
PLATFORM_GPIO_HIGH
);
platform_gpio_mode
(
lu8g
->
u8g
.
pin_list
[
U8G_PI_CS
],
PLATFORM_GPIO_OUTPUT
,
PLATFORM_GPIO_FLOAT
);
platform_gpio_mode
(
lu8g
->
u8g
.
pin_list
[
U8G_PI_A0
],
PLATFORM_GPIO_OUTPUT
,
PLATFORM_GPIO_FLOAT
);
break
;
case
U8G_COM_MSG_ADDRESS
:
/* define cmd (arg_val = 0) or data mode (arg_val = 1) */
lu8g_digital_write
(
lu8g
,
U8G_PI_A0
,
arg_val
==
0
?
PLATFORM_GPIO_LOW
:
PLATFORM_GPIO_HIGH
);
break
;
case
U8G_COM_MSG_CHIP_SELECT
:
if
(
arg_val
==
0
)
{
/* disable */
lu8g_digital_write
(
lu8g
,
U8G_PI_CS
,
PLATFORM_GPIO_HIGH
);
}
else
{
/* enable */
lu8g_digital_write
(
lu8g
,
U8G_PI_CS
,
PLATFORM_GPIO_LOW
);
}
break
;
case
U8G_COM_MSG_RESET
:
if
(
lu8g
->
u8g
.
pin_list
[
U8G_PI_RESET
]
!=
U8G_PIN_NONE
)
lu8g_digital_write
(
lu8g
,
U8G_PI_RESET
,
arg_val
==
0
?
PLATFORM_GPIO_LOW
:
PLATFORM_GPIO_HIGH
);
break
;
case
U8G_COM_MSG_WRITE_BYTE
:
platform_spi_send
(
1
,
8
,
arg_val
);
break
;
case
U8G_COM_MSG_WRITE_SEQ
:
case
U8G_COM_MSG_WRITE_SEQ_P
:
{
register
uint8_t
*
ptr
=
arg_ptr
;
while
(
arg_val
>
0
)
{
platform_spi_send
(
1
,
8
,
*
ptr
++
);
arg_val
--
;
}
}
break
;
}
return
1
;
}
uint8_t
u8g_com_esp8266_ssd_i2c_fn
(
u8g_t
*
u8g
,
uint8_t
msg
,
uint8_t
arg_val
,
void
*
arg_ptr
)
{
struct
_lu8g_userdata_t
*
lu8g
=
(
struct
_lu8g_userdata_t
*
)
u8g
;
switch
(
msg
)
{
case
U8G_COM_MSG_INIT
:
// we assume that the i2c bus was already initialized
//u8g_i2c_init(u8g->pin_list[U8G_PI_I2C_OPTION]);
break
;
case
U8G_COM_MSG_STOP
:
break
;
case
U8G_COM_MSG_RESET
:
/* Currently disabled, but it could be enable. Previous restrictions have been removed */
/* u8g_com_arduino_digital_write(u8g, U8G_PI_RESET, arg_val); */
break
;
case
U8G_COM_MSG_CHIP_SELECT
:
lu8g
->
u8g
.
pin_list
[
U8G_PI_A0_STATE
]
=
0
;
lu8g
->
u8g
.
pin_list
[
U8G_PI_SET_A0
]
=
1
;
/* force a0 to set again, also forces start condition */
if
(
arg_val
==
0
)
{
/* disable chip, send stop condition */
platform_i2c_send_stop
(
ESP_I2C_ID
);
}
else
{
/* enable, do nothing: any byte writing will trigger the i2c start */
}
break
;
case
U8G_COM_MSG_WRITE_BYTE
:
//u8g->pin_list[U8G_PI_SET_A0] = 1;
if
(
u8g_com_esp8266_ssd_start_sequence
(
lu8g
)
==
0
)
return
platform_i2c_send_stop
(
ESP_I2C_ID
),
0
;
// ignore return value -> tolerate missing ACK
if
(
platform_i2c_send_byte
(
ESP_I2C_ID
,
arg_val
)
==
0
)
;
//return platform_i2c_send_stop( ESP_I2C_ID ), 0;
// platform_i2c_send_stop( ESP_I2C_ID );
break
;
case
U8G_COM_MSG_WRITE_SEQ
:
case
U8G_COM_MSG_WRITE_SEQ_P
:
//u8g->pin_list[U8G_PI_SET_A0] = 1;
if
(
u8g_com_esp8266_ssd_start_sequence
(
lu8g
)
==
0
)
return
platform_i2c_send_stop
(
ESP_I2C_ID
),
0
;
{
register
uint8_t
*
ptr
=
arg_ptr
;
while
(
arg_val
>
0
)
{
// ignore return value -> tolerate missing ACK
if
(
platform_i2c_send_byte
(
ESP_I2C_ID
,
*
ptr
++
)
==
0
)
;
//return platform_i2c_send_stop( ESP_I2C_ID ), 0;
arg_val
--
;
}
}
// platform_i2c_send_stop( ESP_I2C_ID );
break
;
case
U8G_COM_MSG_ADDRESS
:
/* define cmd (arg_val = 0) or data mode (arg_val = 1) */
lu8g
->
u8g
.
pin_list
[
U8G_PI_A0_STATE
]
=
arg_val
;
lu8g
->
u8g
.
pin_list
[
U8G_PI_SET_A0
]
=
1
;
/* force a0 to set again */
break
;
}
return
1
;
}
// ***************************************************************************
// Generic framebuffer device and RLE comm driver
//
...
...
app/modules/u8g_glue.h
View file @
837cf206
...
...
@@ -7,6 +7,8 @@
struct
_lu8g_userdata_t
{
u8g_t
u8g
;
uint8_t
i2c_addr
;
uint8_t
use_delay
;
int
cb_ref
;
};
typedef
struct
_lu8g_userdata_t
lu8g_userdata_t
;
...
...
app/u8glib/u8g.h
View file @
837cf206
...
...
@@ -1178,9 +1178,6 @@ struct _u8g_t
u8g_state_cb
state_cb
;
u8g_box_t
current_page
;
/* current box of the visible page */
uint8_t
i2c_addr
;
uint8_t
use_delay
;
};
#define u8g_GetFontAscent(u8g) ((u8g)->font_ref_ascent)
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment