Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
What's new
10
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Open sidebar
Robert Geislinger
firmware
Commits
ca3aaa55
Commit
ca3aaa55
authored
Jul 26, 2019
by
schneider
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
chore(display,portexpander): style
parent
a76880e9
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
432 additions
and
428 deletions
+432
-428
lib/card10/display.c
lib/card10/display.c
+58
-59
lib/card10/portexpander.c
lib/card10/portexpander.c
+58
-54
lib/gfx/LCD/LCD_Driver.c
lib/gfx/LCD/LCD_Driver.c
+316
-315
No files found.
lib/card10/display.c
View file @
ca3aaa55
...
...
@@ -9,38 +9,37 @@
#include <stdint.h>
#include <stdio.h>
/***** Globals *****/
const
gpio_cfg_t
DEV_DC_PIN
=
{
PORT_1
,
PIN_6
,
GPIO_FUNC_OUT
,
GPIO_PAD_NONE
};
const
gpio_cfg_t
DEV_DC_PIN
=
{
PORT_1
,
PIN_6
,
GPIO_FUNC_OUT
,
GPIO_PAD_NONE
};
// Parameters for PWM output
#define PORT_PWM PORT_0 // port
#define PIN_PWM PIN_28 // pin
#define FREQ 200 // (Hz)
//#define DUTY_CYCLE 75 // (%)
#define DUTY_CYCLE 20 // (%)
#define PWM_TIMER MXC_TMR4 // must change PORT_PWM and PIN_PWM if changed
#define PORT_PWM PORT_0 // port
#define PIN_PWM PIN_28 // pin
#define FREQ 200 // (Hz)
//#define DUTY_CYCLE 75 // (%)
#define DUTY_CYCLE 20 // (%)
#define PWM_TIMER MXC_TMR4 // must change PORT_PWM and PIN_PWM if changed
/***** Functions *****/
void
PWM_Output
(
void
)
{
// Declare variables
gpio_cfg_t
gpio_pwm
;
// to configure GPIO
tmr_cfg_t
tmr
;
// to congigure timer
tmr_pwm_cfg_t
tmr_pwm
;
// for configure PWM
unsigned
int
period_ticks
=
PeripheralClock
/
FREQ
;
unsigned
int
duty_ticks
=
period_ticks
*
DUTY_CYCLE
/
100
;
// Congfigure GPIO port and pin for PWM
gpio_pwm
.
func
=
GPIO_FUNC_ALT4
;
gpio_pwm
.
port
=
PORT_PWM
;
gpio_pwm
.
mask
=
PIN_PWM
;
gpio_pwm
.
pad
=
GPIO_PAD_PULL_DOWN
;
if
(
GPIO_Config
(
&
gpio_pwm
)
!=
E_NO_ERROR
)
{
printf
(
"Failed GPIO_Config for pwm.
\n
"
);
}
/*
// Declare variables
gpio_cfg_t
gpio_pwm
;
// to configure GPIO
tmr_cfg_t
tmr
;
// to congigure timer
tmr_pwm_cfg_t
tmr_pwm
;
// for configure PWM
unsigned
int
period_ticks
=
PeripheralClock
/
FREQ
;
unsigned
int
duty_ticks
=
period_ticks
*
DUTY_CYCLE
/
100
;
// Congfigure GPIO port and pin for PWM
gpio_pwm
.
func
=
GPIO_FUNC_ALT4
;
gpio_pwm
.
port
=
PORT_PWM
;
gpio_pwm
.
mask
=
PIN_PWM
;
gpio_pwm
.
pad
=
GPIO_PAD_PULL_DOWN
;
if
(
GPIO_Config
(
&
gpio_pwm
)
!=
E_NO_ERROR
)
{
printf
(
"Failed GPIO_Config for pwm.
\n
"
);
}
/*
Steps for configuring a timer for PWM mode:
1. Disable the timer
2. Set the prescale value
...
...
@@ -49,55 +48,55 @@ void PWM_Output(void)
5. Enable Timer
*/
TMR_Disable
(
PWM_TIMER
);
TMR_Disable
(
PWM_TIMER
);
TMR_Init
(
PWM_TIMER
,
TMR_PRES_1
,
0
);
TMR_Init
(
PWM_TIMER
,
TMR_PRES_1
,
0
);
tmr
.
mode
=
TMR_MODE_PWM
;
tmr
.
cmp_cnt
=
period_ticks
;
tmr
.
pol
=
0
;
TMR_Config
(
PWM_TIMER
,
&
tmr
);
tmr
.
mode
=
TMR_MODE_PWM
;
tmr
.
cmp_cnt
=
period_ticks
;
tmr
.
pol
=
0
;
TMR_Config
(
PWM_TIMER
,
&
tmr
);
tmr_pwm
.
pol
=
1
;
tmr_pwm
.
per_cnt
=
period_ticks
;
tmr_pwm
.
duty_cnt
=
duty_ticks
;
tmr_pwm
.
pol
=
1
;
tmr_pwm
.
per_cnt
=
period_ticks
;
tmr_pwm
.
duty_cnt
=
duty_ticks
;
if
(
TMR_PWMConfig
(
PWM_TIMER
,
&
tmr_pwm
)
!=
E_NO_ERROR
)
{
printf
(
"Failed TMR_PWMConfig.
\n
"
);
}
if
(
TMR_PWMConfig
(
PWM_TIMER
,
&
tmr_pwm
)
!=
E_NO_ERROR
)
{
printf
(
"Failed TMR_PWMConfig.
\n
"
);
}
TMR_Enable
(
PWM_TIMER
);
TMR_Enable
(
PWM_TIMER
);
printf
(
"PWM started.
\n
"
);
printf
(
"PWM started.
\n
"
);
}
void
display_set_reset_pin
(
uint8_t
state
)
{
if
(
!
portexpander_detected
())
{
MAX77650_setDO
(
state
?
true
:
false
);
}
else
{
portexpander_set
(
4
,
state
);
}
if
(
!
portexpander_detected
())
{
MAX77650_setDO
(
state
?
true
:
false
);
}
else
{
portexpander_set
(
4
,
state
);
}
}
void
display_init
(
void
)
{
if
(
!
portexpander_detected
())
{
// Open-drain
MAX77650_setDRV
(
false
);
// Output
MAX77650_setDIR
(
false
);
}
if
(
!
portexpander_detected
())
{
// Open-drain
MAX77650_setDRV
(
false
);
// Output
MAX77650_setDIR
(
false
);
}
GPIO_Config
(
&
DEV_DC_PIN
);
GPIO_Config
(
&
DEV_DC_PIN
);
PWM_Output
();
LCD_SetBacklight
(
500
);
LCD_Init
();
LCD_Clear
(
BLACK
);
PWM_Output
();
LCD_SetBacklight
(
500
);
LCD_Init
();
LCD_Clear
(
BLACK
);
Paint_NewImage
(
LCD_WIDTH
,
LCD_HEIGHT
,
0
,
WHITE
);
Paint_NewImage
(
LCD_WIDTH
,
LCD_HEIGHT
,
0
,
WHITE
);
Paint_Clear
(
BLACK
);
Paint_SetRotate
(
180
);
Paint_Clear
(
BLACK
);
Paint_SetRotate
(
180
);
}
lib/card10/portexpander.c
View file @
ca3aaa55
...
...
@@ -12,72 +12,76 @@ static uint8_t output_state;
void
portexpander_init
(
void
)
{
uint8_t
addr
=
0x21
;
int
ret
;
// Enable pull-ups for buttons
uint8_t
command
[]
=
{
0x43
,
0x68
};
ret
=
I2C_MasterWrite
(
MXC_I2C1_BUS0
,
addr
<<
1
,
command
,
2
,
0
);
if
(
ret
!=
2
)
{
printf
(
"portexpander NOT detected
\n
"
);
detected
=
false
;
return
;
}
detected
=
true
;
// Set _all_ outputs to open-drain to support the high side p-channel transistors.
command
[
0
]
=
0x4F
;
command
[
1
]
=
0x01
;
I2C_MasterWrite
(
MXC_I2C1_BUS0
,
addr
<<
1
,
command
,
2
,
0
);
// Enable outputs for the transistors, the LED and the LCD reset
command
[
0
]
=
0x03
;
command
[
1
]
=
0x68
;
I2C_MasterWrite
(
MXC_I2C1_BUS0
,
addr
<<
1
,
command
,
2
,
0
);
// Set outputs to high (i.e. open-drain)
output_state
=
0x97
;
command
[
0
]
=
0x01
;
command
[
1
]
=
output_state
;
I2C_MasterWrite
(
MXC_I2C1_BUS0
,
addr
<<
1
,
command
,
2
,
0
);
// Turn on LEDs
// TODO: only turn on LEDs if value != 0,0,0 && dim > 0
command
[
0
]
=
0x01
;
command
[
1
]
=
0x90
;
I2C_MasterWrite
(
MXC_I2C1_BUS0
,
addr
<<
1
,
command
,
2
,
0
);
uint8_t
addr
=
0x21
;
int
ret
;
// Enable pull-ups for buttons
uint8_t
command
[]
=
{
0x43
,
0x68
};
ret
=
I2C_MasterWrite
(
MXC_I2C1_BUS0
,
addr
<<
1
,
command
,
2
,
0
);
if
(
ret
!=
2
)
{
printf
(
"portexpander NOT detected
\n
"
);
detected
=
false
;
return
;
}
detected
=
true
;
// Set _all_ outputs to open-drain to support the high side p-channel transistors.
command
[
0
]
=
0x4F
;
command
[
1
]
=
0x01
;
I2C_MasterWrite
(
MXC_I2C1_BUS0
,
addr
<<
1
,
command
,
2
,
0
);
// Enable outputs for the transistors, the LED and the LCD reset
command
[
0
]
=
0x03
;
command
[
1
]
=
0x68
;
I2C_MasterWrite
(
MXC_I2C1_BUS0
,
addr
<<
1
,
command
,
2
,
0
);
// Set outputs to high (i.e. open-drain)
output_state
=
0x97
;
command
[
0
]
=
0x01
;
command
[
1
]
=
output_state
;
I2C_MasterWrite
(
MXC_I2C1_BUS0
,
addr
<<
1
,
command
,
2
,
0
);
// Turn on LEDs
// TODO: only turn on LEDs if value != 0,0,0 && dim > 0
command
[
0
]
=
0x01
;
command
[
1
]
=
0x90
;
I2C_MasterWrite
(
MXC_I2C1_BUS0
,
addr
<<
1
,
command
,
2
,
0
);
}
uint8_t
portexpander_get
(
void
)
{
uint8_t
addr
=
0x21
;
uint8_t
command
[]
=
{
0x00
};
uint8_t
buf
=
0xFF
;
uint8_t
addr
=
0x21
;
uint8_t
command
[]
=
{
0x00
};
uint8_t
buf
=
0xFF
;
if
(
detected
)
{
I2C_MasterWrite
(
MXC_I2C1_BUS0
,
addr
<<
1
,
command
,
1
,
1
);
I2C_MasterRead
(
MXC_I2C1_BUS0
,
addr
<<
1
,
&
buf
,
1
,
0
);
}
if
(
detected
)
{
I2C_MasterWrite
(
MXC_I2C1_BUS0
,
addr
<<
1
,
command
,
1
,
1
);
I2C_MasterRead
(
MXC_I2C1_BUS0
,
addr
<<
1
,
&
buf
,
1
,
0
);
}
return
buf
;
return
buf
;
}
bool
portexpander_detected
(
void
)
{
return
detected
;
return
detected
;
}
void
portexpander_set
(
uint8_t
pin
,
uint8_t
value
)
{
uint8_t
addr
=
0x21
;
uint8_t
command
[
2
];
if
(
detected
&&
pin
<
8
)
{
if
(
value
)
{
output_state
|=
(
1
<<
pin
);
}
else
{
output_state
&=
~
(
1
<<
pin
);
}
command
[
0
]
=
0x01
;
command
[
1
]
=
output_state
;
I2C_MasterWrite
(
MXC_I2C1_BUS0
,
addr
<<
1
,
command
,
2
,
0
);
}
uint8_t
addr
=
0x21
;
uint8_t
command
[
2
];
if
(
detected
&&
pin
<
8
)
{
if
(
value
)
{
output_state
|=
(
1
<<
pin
);
}
else
{
output_state
&=
~
(
1
<<
pin
);
}
command
[
0
]
=
0x01
;
command
[
1
]
=
output_state
;
I2C_MasterWrite
(
MXC_I2C1_BUS0
,
addr
<<
1
,
command
,
2
,
0
);
}
}
lib/gfx/LCD/LCD_Driver.c
View file @
ca3aaa55
/*****************************************************************************
* | File : LCD_Driver.c
* | Author : Waveshare team
* | Function : Electronic paper driver
* | Info :
*----------------
* | This version: V1.0
* | Date : 2018-11-18
* | Info :
#
# Permission is hereby granted, free of UBYTEge, to any person obtaining a copy
# of this software and associated documnetation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in
# all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS OR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
# THE SOFTWARE.
#
******************************************************************************/
#include "LCD_Driver.h"
static
uint8_t
screen
[
LCD_HEIGHT
][
LCD_WIDTH
][
2
];
/*******************************************************************************
function:
Hardware reset
*******************************************************************************/
static
void
LCD_Reset
(
void
)
{
//DEV_Digital_Write(DEV_CS_PIN,0);
DEV_Delay_ms
(
20
);
DEV_RESET_LOW
();
DEV_Delay_ms
(
20
);
DEV_RESET_HIGH
();
DEV_Delay_ms
(
20
);
}
/*******************************************************************************
function:
Setting backlight
parameter :
value : Range 0~1000 Duty cycle is value/1000
*******************************************************************************/
void
LCD_SetBacklight
(
UWORD
Value
)
{
DEV_Set_BL
(
Value
);
}
/*******************************************************************************
function:
Write register address and data
*******************************************************************************/
void
LCD_WriteData_Byte
(
UBYTE
da
)
{
//DEV_Digital_Write(DEV_CS_PIN,0);
DEV_Digital_Write
(
DEV_DC_PIN
,
1
);
DEV_SPI_WRITE
(
da
);
//DEV_Digital_Write(DEV_CS_PIN,1);
}
void
LCD_WriteData_Word
(
UWORD
da
)
{
UBYTE
i
=
(
da
>>
8
)
&
0xff
;
//DEV_Digital_Write(DEV_CS_PIN,0);
DEV_Digital_Write
(
DEV_DC_PIN
,
1
);
DEV_SPI_WRITE
(
i
);
uint8_t
tmp
=
da
;
DEV_SPI_WRITE
(
tmp
);
//DEV_Digital_Write(DEV_CS_PIN,1);
}
void
LCD_WriteReg
(
UBYTE
da
)
{
//DEV_Digital_Write(DEV_CS_PIN,0);
DEV_Digital_Write
(
DEV_DC_PIN
,
0
);
DEV_SPI_WRITE
(
da
);
//DEV_Digital_Write(DEV_CS_PIN,1);
}
/******************************************************************************
function:
Common register initialization
******************************************************************************/
void
LCD_Init
(
void
)
{
LCD_Reset
();
//************* Start Initial Sequence **********//
LCD_WriteReg
(
0x11
);
//Sleep exit
DEV_Delay_ms
(
120
);
LCD_WriteReg
(
0x21
);
LCD_WriteReg
(
0x21
);
LCD_WriteReg
(
0xB1
);
LCD_WriteData_Byte
(
0x05
);
LCD_WriteData_Byte
(
0x3A
);
LCD_WriteData_Byte
(
0x3A
);
LCD_WriteReg
(
0xB2
);
LCD_WriteData_Byte
(
0x05
);
LCD_WriteData_Byte
(
0x3A
);
LCD_WriteData_Byte
(
0x3A
);
LCD_WriteReg
(
0xB3
);
LCD_WriteData_Byte
(
0x05
);
LCD_WriteData_Byte
(
0x3A
);
LCD_WriteData_Byte
(
0x3A
);
LCD_WriteData_Byte
(
0x05
);
LCD_WriteData_Byte
(
0x3A
);
LCD_WriteData_Byte
(
0x3A
);
LCD_WriteReg
(
0xB4
);
LCD_WriteData_Byte
(
0x03
);
LCD_WriteReg
(
0xC0
);
LCD_WriteData_Byte
(
0x62
);
LCD_WriteData_Byte
(
0x02
);
LCD_WriteData_Byte
(
0x04
);
LCD_WriteReg
(
0xC1
);
LCD_WriteData_Byte
(
0xC0
);
LCD_WriteReg
(
0xC2
);
LCD_WriteData_Byte
(
0x0D
);
LCD_WriteData_Byte
(
0x00
);
LCD_WriteReg
(
0xC3
);
LCD_WriteData_Byte
(
0x8D
);
LCD_WriteData_Byte
(
0x6A
);
LCD_WriteReg
(
0xC4
);
LCD_WriteData_Byte
(
0x8D
);
LCD_WriteData_Byte
(
0xEE
);
LCD_WriteReg
(
0xC5
);
/*VCOM*/
LCD_WriteData_Byte
(
0x0E
);
LCD_WriteReg
(
0xE0
);
LCD_WriteData_Byte
(
0x10
);
LCD_WriteData_Byte
(
0x0E
);
LCD_WriteData_Byte
(
0x02
);
LCD_WriteData_Byte
(
0x03
);
LCD_WriteData_Byte
(
0x0E
);
LCD_WriteData_Byte
(
0x07
);
LCD_WriteData_Byte
(
0x02
);
LCD_WriteData_Byte
(
0x07
);
LCD_WriteData_Byte
(
0x0A
);
LCD_WriteData_Byte
(
0x12
);
LCD_WriteData_Byte
(
0x27
);
LCD_WriteData_Byte
(
0x37
);
LCD_WriteData_Byte
(
0x00
);
LCD_WriteData_Byte
(
0x0D
);
LCD_WriteData_Byte
(
0x0E
);
LCD_WriteData_Byte
(
0x10
);
LCD_WriteReg
(
0xE1
);
LCD_WriteData_Byte
(
0x10
);
LCD_WriteData_Byte
(
0x0E
);
LCD_WriteData_Byte
(
0x03
);
LCD_WriteData_Byte
(
0x03
);
LCD_WriteData_Byte
(
0x0F
);
LCD_WriteData_Byte
(
0x06
);
LCD_WriteData_Byte
(
0x02
);
LCD_WriteData_Byte
(
0x08
);
LCD_WriteData_Byte
(
0x0A
);
LCD_WriteData_Byte
(
0x13
);
LCD_WriteData_Byte
(
0x26
);
LCD_WriteData_Byte
(
0x36
);
LCD_WriteData_Byte
(
0x00
);
LCD_WriteData_Byte
(
0x0D
);
LCD_WriteData_Byte
(
0x0E
);
LCD_WriteData_Byte
(
0x10
);
LCD_WriteReg
(
0x3A
);
LCD_WriteData_Byte
(
0x05
);
LCD_WriteReg
(
0x36
);
LCD_WriteData_Byte
(
0xA8
);
//
LCD_WriteReg
(
0x29
);
}
/******************************************************************************
function: Set the cursor position
parameter :
Xstart: Start UWORD x coordinate
Ystart: Start UWORD y coordinate
Xend : End UWORD coordinates
Yend : End UWORD coordinatesen
******************************************************************************/
void
LCD_SetCursor
(
UWORD
Xstart
,
UWORD
Ystart
,
UWORD
Xend
,
UWORD
Yend
)
{
Xstart
=
Xstart
+
1
;
Xend
=
Xend
+
1
;
Ystart
=
Ystart
+
26
;
Yend
=
Yend
+
26
;
LCD_WriteReg
(
0x2a
);
LCD_WriteData_Byte
(
Xstart
>>
8
);
LCD_WriteData_Byte
(
Xstart
);
LCD_WriteData_Byte
(
Xend
>>
8
);
LCD_WriteData_Byte
(
Xend
);
LCD_WriteReg
(
0x2b
);
LCD_WriteData_Byte
(
Ystart
>>
8
);
LCD_WriteData_Byte
(
Ystart
);
LCD_WriteData_Byte
(
Yend
>>
8
);
LCD_WriteData_Byte
(
Yend
);
LCD_WriteReg
(
0x2C
);
}
#if 0
/******************************************************************************
function: Clear screen function, refresh the screen to a certain color
parameter :
Color : The color you want to clear all the screen
******************************************************************************/
void LCD_Clear(UWORD Color)
{
UWORD i,j;
LCD_SetCursor(0,0,LCD_WIDTH-1,LCD_HEIGHT-1);
for(i = 0; i < LCD_WIDTH; i++){
for(j = 0; j < LCD_HEIGHT; j++){
LCD_WriteData_Word(Color);
}
}
}
#endif
/******************************************************************************
function: Refresh a certain area to the same color
parameter :
Xstart: Start UWORD x coordinate
Ystart: Start UWORD y coordinate
Xend : End UWORD coordinates
Yend : End UWORD coordinates
color : Set the color
******************************************************************************/
void
LCD_ClearWindow
(
UWORD
Xstart
,
UWORD
Ystart
,
UWORD
Xend
,
UWORD
Yend
,
UWORD
color
)
{
UWORD
i
,
j
;
LCD_SetCursor
(
Xstart
,
Ystart
,
Xend
-
1
,
Yend
-
1
);
for
(
i
=
Ystart
;
i
<=
Yend
-
1
;
i
++
){
for
(
j
=
Xstart
;
j
<=
Xend
-
1
;
j
++
){
LCD_WriteData_Word
(
color
);
}
}
}
/******************************************************************************
function: Set the color of an area
parameter :
Xstart: Start UWORD x coordinate
Ystart: Start UWORD y coordinate
Xend : End UWORD coordinates
Yend : End UWORD coordinates
Color : Set the color
******************************************************************************/
void
LCD_SetWindowColor
(
UWORD
Xstart
,
UWORD
Ystart
,
UWORD
Xend
,
UWORD
Yend
,
UWORD
Color
)
{
LCD_SetCursor
(
Xstart
,
Ystart
,
Xend
,
Yend
);
LCD_WriteData_Word
(
Color
);
}
/******************************************************************************
function: Draw a UWORD
parameter :
X : Set the X coordinate
Y : Set the Y coordinate
Color : Set the color
******************************************************************************/
#if 0
void LCD_SetUWORD(UWORD x, UWORD y, UWORD Color)
{
LCD_SetCursor(x,y,x,y);
LCD_WriteData_Word(Color);
}
#endif
void
LCD_SetUWORD
(
UWORD
x
,
UWORD
y
,
UWORD
Color
)
{
screen
[
y
][
x
][
0
]
=
(
Color
>>
8
);
screen
[
y
][
x
][
1
]
=
(
Color
&
0xFF
);
}
void
LCD_Clear
(
UWORD
Color
)
{
UWORD
i
,
j
;
for
(
i
=
0
;
i
<
LCD_WIDTH
;
i
++
){
for
(
j
=
0
;
j
<
LCD_HEIGHT
;
j
++
){
LCD_SetUWORD
(
i
,
j
,
Color
);
}
}
}
void
LCD_Set
(
uint8_t
*
data
,
int
len
)
{
LCD_SetCursor
(
0
,
0
,
160
-
1
,
80
-
1
);
DEV_Digital_Write
(
DEV_DC_PIN
,
1
);
lcd_write
(
data
,
len
);
}
void
LCD_Update
(
void
)
{
LCD_Set
((
uint8_t
*
)
screen
,
sizeof
(
screen
));
}
/*****************************************************************************
* | File : LCD_Driver.c
* | Author : Waveshare team
* | Function : Electronic paper driver
* | Info :
*----------------
* | This version: V1.0
* | Date : 2018-11-18
* | Info :
#
# Permission is hereby granted, free of UBYTEge, to any person obtaining a copy
# of this software and associated documnetation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in
# all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS OR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
# THE SOFTWARE.
#