Skip to content

Commit

Permalink
Merge branch 'master' into feature/iotdk_fix
Browse files Browse the repository at this point in the history
Signed-off-by: Wayne Ren <wei.ren@synopsys.com>
Wayne Ren committed Oct 8, 2018
2 parents 90925cc + 2976404 commit c7aba6d
Showing 8 changed files with 379 additions and 31 deletions.
1 change: 1 addition & 0 deletions .ci/before_install.sh
Original file line number Diff line number Diff line change
@@ -29,4 +29,5 @@ fi
pip install PrettyTable || die
pip install colorama || die
pip install configparser || die
pip install requests || die
}
52 changes: 50 additions & 2 deletions .ci/build.py
Original file line number Diff line number Diff line change
@@ -2,6 +2,7 @@
import json
import os
import sys
import requests
from prettytable import PrettyTable
from colorama import Fore, Back, Style
from configparser import ConfigParser
@@ -374,14 +375,38 @@ def get_expected_result(expected_file, app_path, board, bd_ver):
return result


def send_pull_request_comment(columns, results):
job = os.environ.get("NAME")
pr_number = os.environ.get("TRAVIS_PULL_REQUEST")
if all([job, pr_number]):
comment_job = "## " + job + "\n"
if len(results)>0:
head = "|".join(columns) + "\n"
table_format = "|".join(["---"]*len(columns)) + "\n"
table_head =head +table_format
comments = ""
comment = ""
for result in results:
for k in result:
comment += (k.replace(Fore.RED, "")).replace("\n", "<br>") +" |"
comment = comment.rstrip("|") + "\n"
comments += comment
comment_on_pull_request(comment_job + table_head + comments)
else:
print("WARNING:Only send pull request comment in travis ci!")

pass


def show_results(results, expected=None):
columns = ['TOOLCHAIN', 'APP', "TOOLCHAIN_VER", 'CONF', 'PASS']
columns = ["TOOLCHAIN_VER", 'TOOLCHAIN', 'APP', 'CONF', 'PASS']
failed_pt = PrettyTable(columns)
failed_results = []
success_results = []
expected_results = None
success_pt = PrettyTable(columns)
expected_pt = PrettyTable(columns)

for result in results:
status = result.pop("status")
if status != 0:
@@ -398,6 +423,7 @@ def show_results(results, expected=None):

if expected is not None:
expected_results = failed_results
send_pull_request_comment(columns, expected_results)
for result in expected_results:
if len(result) > 0:
expected_pt.add_row(result)
@@ -413,6 +439,8 @@ def show_results(results, expected=None):
success_pt.add_row(result)
print Fore.GREEN + "Successfull results"
print success_pt


print Style.RESET_ALL
sys.stdout.flush()

@@ -427,6 +455,7 @@ def show_results(results, expected=None):

print Fore.RED + "Failed result:"
print failed_pt

print Style.RESET_ALL
sys.stdout.flush()

@@ -529,14 +558,31 @@ def build_makefiles_project(config):
diff_expected_differents[app_path] = copy.deepcopy(expected_different[app_path])

print "There are {} projects, and they are compiled for {} times".format(app_count, count)
results_list = build_result_combine_tail(apps_results)
results_list = copy.deepcopy(build_result_combine_tail(apps_results))
show_results(results_list)
expected_differents_list = build_result_combine_tail(diff_expected_differents)
show_results(expected_differents_list, expected=True)

return applications_failed, diff_expected_differents


def comment_on_pull_request(comment):
pr_number = os.environ.get("TRAVIS_PULL_REQUEST")
slug = os.environ.get("TRAVIS_REPO_SLUG")
token = os.environ.get("GH_TOKEN")
request_config = [pr_number, slug, token, comment]
for i in range(len(request_config)):
if request_config[i] == "false":
request_config[i] = False
if all(request_config):
url = 'https://api.github.com/repos/{slug}/issues/{number}/comments'.format(
slug=slug, number=pr_number)
response = requests.post(url, data=json.dumps({'body': comment}),
headers={'Authorization': 'token ' + token})
print(">>>>Travis send pull request comment to {}, repsonse status code {}.".format(url, response.status_code))
return response.json()


def get_options_parser():
configs = dict()
toolchainlist = ["gnu", "mw"]
@@ -590,4 +636,6 @@ def get_options_parser():
else:
print "these applications failed with some configuration: "
print expected_differents.keys()
comment = "applications failed with some configuration: \n" + "\n".join(expected_differents.keys())
comment_on_pull_request(comment)
sys.exit(1)
7 changes: 7 additions & 0 deletions .ci/deploy_doc.sh
Original file line number Diff line number Diff line change
@@ -25,6 +25,13 @@ make html &> build_html.log || { tail -n 100 build_html.log ; die "Build sphinx
# Check if this is a pull request
if [ "$TRAVIS_PULL_REQUEST" != "false" ] ; then
echo "Don't push built docs to gh-pages for pull request "

make linkcheck -k 2>&1
COMMENT_CONTENT=$(sed 's/$/&<br>/g' build/linkcheck/output.txt)
COMMENT_HEAD="# Sphinx link check result \n***********************\n<pre>"
COMMENT_TAIL="</pre>"
COMMENT="${COMMENT_HEAD}${COMMENT_CONTENT}${COMMENT_TAIL}"
bash -c "$COMMENTS"
exit 0
fi

1 change: 0 additions & 1 deletion .gitlab-ci.yml
Original file line number Diff line number Diff line change
@@ -4,7 +4,6 @@ variables:
PIP_CACHE_DIR: "$CI_PROJECT_DIR/.cache"
OSP_ROOT: "."
TOOLCHAIN: "gnu"
CUR_CORE: "none"
TOOLCHAIN_VER: "2017.09"
EXPECTED: ".ci/expected.ini"
PARALLEL: ""
9 changes: 8 additions & 1 deletion .travis.yml
Original file line number Diff line number Diff line change
@@ -15,6 +15,13 @@ env:
"context": "travis-ci/$NAME",
"target_url": "https://travis-ci.org/$TRAVIS_REPO_SLUG/jobs/$TRAVIS_JOB_ID"
}\nDATA'
COMMENT=none
COMMENTS=$'curl -so/dev/null --user "$EMBARC_BOT" --request POST
https://api.github.com/repos/$TRAVIS_REPO_SLUG/issues/$TRAVIS_PULL_REQUEST/comments
--data @- << DATA\n{
"body": "$COMMENT"
}\nDATA'
cache:
pip: true
@@ -28,7 +35,7 @@ branches:

before_install:
- bash .ci/before_install.sh
# setup git config
# setup git config
- git config --global user.name "embARC Automated Bot"
- git config --global user.email "Huaqi.Fang@synopsys.com"

13 changes: 13 additions & 0 deletions middleware/u8glib/csrc/u8g.h
Original file line number Diff line number Diff line change
@@ -691,6 +691,7 @@ uint8_t u8g_com_msp430_hw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void
uint8_t u8g_com_raspberrypi_hw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr); /* u8g_com_rasperrypi_hw_spi.c */
uint8_t u8g_com_raspberrypi_ssd_i2c_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr); /* u8g_com_raspberrypi_ssd_i2c.c */

uint8_t u8g_com_embarc_ssd_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr);
uint8_t u8g_com_embarc_ssd_i2c_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr);


@@ -703,6 +704,7 @@ uint8_t u8g_com_embarc_ssd_i2c_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void
U8G_COM_T6963
U8G_COM_FAST_PARALLEL
U8G_COM_SSD_I2C
U8G_COM_SSD_SPI
U8G_COM_UC_I2C
defined(__18CXX) || defined(__PIC32MX)
@@ -856,6 +858,17 @@ defined(__18CXX) || defined(__PIC32MX)
#endif
#endif

/* ==== HW SPI, embARC ====*/
#if defined(PLATFORM_EMBARC)
#define U8G_COM_SSD_SPI u8g_com_embarc_ssd_spi_fn

#ifndef U8G_COM_SSD_SPI
#define U8G_COM_SSD_SPI u8g_com_null_fn
#endif

#endif


#ifndef U8G_COM_UC_I2C
#if defined(__AVR__)
/* AVR variant can use the arduino version at the moment */
275 changes: 275 additions & 0 deletions middleware/u8glib/csrc/u8g_com_embarc_ssd1306_spi.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,275 @@
/*
u8g.h
Universal 8bit Graphics Library
Copyright (c) 2011, olikraus@gmail.com
All rights reserved.
Redistribution and use in source and binary forms, with or without modification,
are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright notice, this list
of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright notice, this
list of conditions and the following disclaimer in the documentation and/or other
materials provided with the distribution.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
/*
* Modified for port to ARC embARC platform
* by Wayne Ren wei.ren@synopsys.com, Synopsys, Inc.
*/

#include "u8g.h"
#include "embARC.h"
#include "dev_gpio.h"
#include "ssd1306_app_config.h"

#ifndef SSD1306_SPI_ID
#define SSD1306_SPI_ID 0
#endif

#ifndef SSD1306_SPI_CS
#define SSD1306_SPI_CS DEV_SPI_CS_LINE_1
#endif

#ifndef SSD1306_USE_CS_PIN
#define SSD1306_USE_CS_PIN 1
#endif

#if SSD1306_USE_CS_PIN
# ifndef SSD1306_CS_GPIO
#define SSD1306_CS_GPIO (DEV_GPIO_PORT_A)
# endif

# ifndef SSD1306_CS_PIN
#define SSD1306_CS_PIN 24
# endif
static void oled_ssd1306_chip_select(DEV_SPI* _oled_spi, bool select)
{
static DEV_GPIO *oled_gpio_cs = NULL;
if(!oled_gpio_cs) {
oled_gpio_cs = gpio_get_dev(SSD1306_CS_GPIO);
if(oled_gpio_cs) {
oled_gpio_cs->gpio_open(1<<SSD1306_CS_PIN);
oled_gpio_cs->gpio_control(GPIO_CMD_SET_BIT_DIR_OUTPUT, CONV2VOID(1<<SSD1306_CS_PIN));
oled_gpio_cs->gpio_write(1<<SSD1306_CS_PIN, 1<<SSD1306_CS_PIN);
}
}
if(oled_gpio_cs) {
if(select) {
do {
if(_oled_spi->spi_control(SPI_CMD_MST_SEL_DEV, CONV2VOID(SSD1306_SPI_CS)) == E_OK) {
oled_gpio_cs->gpio_write(0, 1<<SSD1306_CS_PIN);
#if defined(OS_FREERTOS)
taskENTER_CRITICAL();
#endif
break;
} else {
#if defined(OS_FREERTOS)
vTaskDelay(0);
#else
u8g_Delay(1);
#endif
}
} while(1);
} else {
_oled_spi->spi_control(SPI_CMD_MST_DSEL_DEV, CONV2VOID(SSD1306_SPI_CS));
oled_gpio_cs->gpio_write(1<<SSD1306_CS_PIN, 1<<SSD1306_CS_PIN);
#if defined(OS_FREERTOS)
taskEXIT_CRITICAL();
#endif
}
}
}
#else
static void oled_ssd1306_chip_select(DEV_SPI* _oled_spi, bool select)
{
if(select) {
do {
if(_oled_spi->spi_control(SPI_CMD_MST_SEL_DEV, CONV2VOID(SSD1306_SPI_CS)) == E_OK) {
#if defined(OS_FREERTOS)
taskENTER_CRITICAL();
#endif
break;
} else {
#if defined(OS_FREERTOS)
vTaskDelay(0);
#else
u8g_Delay(1);
#endif
}
} while(1);
} else {
_oled_spi->spi_control(SPI_CMD_MST_DSEL_DEV, CONV2VOID(SSD1306_SPI_CS));
#if defined(OS_FREERTOS)
taskEXIT_CRITICAL();
#endif
}
}
#endif

#ifndef SSD1306_SPI_FREQ
#define SSD1306_SPI_FREQ 250000ul
#endif

/* Use RESET pin or not */
#ifndef SSD1306_USE_RST_PIN
#define SSD1306_USE_RST_PIN 1
#endif

#ifndef SSD1306_CD_GPIO
#define SSD1306_CD_GPIO (DEV_GPIO_PORT_A)
#endif

#ifndef SSD1306_CD_PIN
#define SSD1306_CD_PIN 26
#endif

#if SSD1306_USE_RST_PIN
# ifndef SSD1306_RST_GPIO
#define SSD1306_RST_GPIO (DEV_GPIO_PORT_A)
# endif

# ifndef SSD1306_RST_PIN
#define SSD1306_RST_PIN 25
# endif
static DEV_GPIO *oled_gpio;
static void oled_ssd1306_hw_reset(void)
{
oled_gpio = gpio_get_dev(SSD1306_RST_GPIO);
if (oled_gpio) {
oled_gpio->gpio_open(1<<SSD1306_RST_PIN);
oled_gpio->gpio_control(GPIO_CMD_SET_BIT_DIR_OUTPUT, CONV2VOID(1<<SSD1306_RST_PIN));
// Power off OLED
oled_gpio->gpio_write(0, 1<<SSD1306_RST_PIN);
u8g_Delay(100);
// Power on OLED
oled_gpio->gpio_write(1<<SSD1306_RST_PIN, 1<<SSD1306_RST_PIN);
u8g_Delay(5);
}
}

#define OLED_HW_RESET() oled_ssd1306_hw_reset()
#else /* No hardware reset */
#define OLED_HW_RESET()
#endif

static DEV_GPIO *oled_gpio_cd = NULL;
static void oled_ssd1306_write_mode(bool isdata)
{
if (oled_gpio_cd) {
if(isdata)
oled_gpio_cd->gpio_write(1<<SSD1306_CD_PIN, 1<<SSD1306_CD_PIN);
else
oled_gpio_cd->gpio_write(0<<SSD1306_CD_PIN, 1<<SSD1306_CD_PIN);
}
}


static DEV_SPI *oled_ssd1306;
static uint32_t oled_ssd1306_freq = SSD1306_SPI_FREQ;



Inline int32_t oled_ssd1306_write(uint8_t *buf, uint32_t cnt)
{
return oled_ssd1306->spi_write(buf, cnt);
}

Inline int32_t oled_ssd1306_write_cmd(uint8_t cmd)
{
return oled_ssd1306_write(&cmd, 1);
}

Inline int32_t oled_ssd1306_write_data(uint8_t data)
{
return oled_ssd1306_write(&data, 1);
}

Inline int32_t oled_ssd1306_write_buf(uint8_t *buf, uint8_t cnt)
{
return oled_ssd1306_write(buf, cnt);
}

uint8_t u8g_com_embarc_ssd_spi_fn_sel(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr, int32_t devid)
{
//uint8_t *ptr;
int32_t ercd;

switch(msg) {
case U8G_COM_MSG_INIT:
OLED_HW_RESET();
oled_ssd1306 = spi_get_dev(devid);

oled_gpio_cd = gpio_get_dev(SSD1306_CD_GPIO);
if (oled_gpio_cd) {
oled_gpio_cd->gpio_open(1<<SSD1306_CD_PIN);
oled_gpio_cd->gpio_control(GPIO_CMD_SET_BIT_DIR_OUTPUT, CONV2VOID(1<<SSD1306_CD_PIN));
oled_gpio_cd->gpio_write(0, 1<<SSD1306_CD_PIN);
}

ercd = oled_ssd1306->spi_open(DEV_MASTER_MODE, oled_ssd1306_freq);
if ((ercd != E_OK) && (ercd != E_OPNED)) {
return 0;
}
oled_ssd1306->spi_control(SPI_CMD_SET_CLK_MODE, CONV2VOID(SPI_CPOL_1_CPHA_1));
//oled_ssd1306->spi_control(SPI_CMD_SET_CLK_MODE, CONV2VOID(SPI_CPOL_0_CPHA_0));
break;

case U8G_COM_MSG_STOP:
break;

case U8G_COM_MSG_RESET:
#if SSD1306_USE_RST_PIN
if(oled_gpio) {
if(arg_val)
oled_gpio->gpio_write(1<<SSD1306_RST_PIN, 1<<SSD1306_RST_PIN);
else
oled_gpio->gpio_write(0, 1<<SSD1306_RST_PIN);
}
#endif
break;

case U8G_COM_MSG_CHIP_SELECT:
oled_ssd1306_chip_select(oled_ssd1306, arg_val);
break;
case U8G_COM_MSG_WRITE_BYTE:
oled_ssd1306_write_cmd(arg_val);
break;

case U8G_COM_MSG_WRITE_SEQ:
oled_ssd1306_write_buf(arg_ptr, arg_val);
break;
case U8G_COM_MSG_WRITE_SEQ_P:
break;
case U8G_COM_MSG_ADDRESS:
oled_ssd1306_write_mode(arg_val);/* define cmd (arg_val = 0) or data mode (arg_val = 1) */
break;
default:
break;
}
return 1;
}

uint8_t u8g_com_embarc_ssd_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr)
{
return u8g_com_embarc_ssd_spi_fn_sel(u8g, msg, arg_val, arg_ptr, SSD1306_SPI_ID);
}
52 changes: 25 additions & 27 deletions middleware/u8glib/csrc/u8g_dev_embarc_ssd1306_128x64.c
Original file line number Diff line number Diff line change
@@ -79,28 +79,28 @@ static const uint8_t u8g_dev_ssd1306_128x64_emsk_init_seq[] PROGMEM = {


static const uint8_t u8g_dev_ssd1306_128x64_data_start[] PROGMEM = {
U8G_ESC_ADR(0), /* instruction mode */
U8G_ESC_ADR(0), /* instruction mode */
U8G_ESC_CS(1), /* enable chip */
0x010, /* set upper 4 bit of the col adr to 0 */
0x000, /* set lower 4 bit of the col adr to 0 */
0x010, /* set upper 4 bit of the col adr to 0 */
0x000, /* set lower 4 bit of the col adr to 0 */
U8G_ESC_END /* end of sequence */
};

static const uint8_t u8g_dev_ssd13xx_sleep_on[] PROGMEM = {
U8G_ESC_ADR(0), /* instruction mode */
U8G_ESC_CS(1), /* enable chip */
0x0ae, /* display off */
U8G_ESC_CS(0), /* disable chip, bugfix 12 nov 2014 */
U8G_ESC_END /* end of sequence */
U8G_ESC_ADR(0), /* instruction mode */
U8G_ESC_CS(1), /* enable chip */
0x0ae, /* display off */
U8G_ESC_CS(0), /* disable chip, bugfix 12 nov 2014 */
U8G_ESC_END /* end of sequence */
};

static const uint8_t u8g_dev_ssd13xx_sleep_off[] PROGMEM = {
U8G_ESC_ADR(0), /* instruction mode */
U8G_ESC_CS(1), /* enable chip */
0x0af, /* display on */
U8G_ESC_DLY(50), /* delay 50 ms */
U8G_ESC_CS(0), /* disable chip, bugfix 12 nov 2014 */
U8G_ESC_END /* end of sequence */
U8G_ESC_ADR(0), /* instruction mode */
U8G_ESC_CS(1), /* enable chip */
0x0af, /* display on */
U8G_ESC_DLY(50), /* delay 50 ms */
U8G_ESC_CS(0), /* disable chip, bugfix 12 nov 2014 */
U8G_ESC_END /* end of sequence */
};


@@ -109,7 +109,7 @@ uint8_t u8g_dev_ssd1306_128x64_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, void
switch(msg)
{
case U8G_DEV_MSG_INIT:
u8g_InitCom(u8g, dev, U8G_SPI_CLK_CYCLE_300NS);
u8g_InitCom(u8g, dev, U8G_SPI_CLK_CYCLE_50NS);
u8g_WriteEscSeqP(u8g, dev, u8g_dev_ssd1306_128x64_emsk_init_seq);
break;
case U8G_DEV_MSG_STOP:
@@ -141,25 +141,19 @@ uint8_t u8g_dev_ssd1306_128x64_2x_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, vo
switch(msg)
{
case U8G_DEV_MSG_INIT:
u8g_InitCom(u8g, dev, U8G_SPI_CLK_CYCLE_300NS);
u8g_InitCom(u8g, dev, U8G_SPI_CLK_CYCLE_50NS);
u8g_WriteEscSeqP(u8g, dev, u8g_dev_ssd1306_128x64_emsk_init_seq);
break;
case U8G_DEV_MSG_STOP:
break;
case U8G_DEV_MSG_PAGE_NEXT:
{
u8g_pb_t *pb = (u8g_pb_t *)(dev->dev_mem);

u8g_WriteEscSeqP(u8g, dev, u8g_dev_ssd1306_128x64_data_start);
u8g_WriteByte(u8g, dev, 0x0b0 | (pb->p.page*2)); /* select current page (SSD1306) */
u8g_SetAddress(u8g, dev, 1); /* data mode */
u8g_WriteSequence(u8g, dev, pb->width, pb->buf);
u8g_SetChipSelect(u8g, dev, 0);

u8g_WriteEscSeqP(u8g, dev, u8g_dev_ssd1306_128x64_data_start);
u8g_WriteByte(u8g, dev, 0x0b0 | (pb->p.page*2+1)); /* select current page (SSD1306) */
u8g_SetAddress(u8g, dev, 1); /* data mode */
u8g_WriteSequence(u8g, dev, pb->width, (uint8_t *)(pb->buf)+pb->width);
u8g_WriteByte(u8g, dev, 0x0b0 | (pb->p.page*2)); //select current page (SSD1306)
u8g_SetAddress(u8g, dev, 1); //data mode
u8g_WriteSequence(u8g, dev, pb->width, pb->buf);
u8g_WriteSequence(u8g, dev, pb->width, (uint8_t *)(pb->buf)+pb->width);
u8g_SetChipSelect(u8g, dev, 0);
}
break;
@@ -177,4 +171,8 @@ uint8_t u8g_dev_ssd1306_128x64_2x_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, vo

uint8_t u8g_dev_ssd1306_128x64_2x_buf[WIDTH*2] U8G_NOCOMMON ;
u8g_pb_t u8g_dev_ssd1306_128x64_2x_pb = { {16, HEIGHT, 0, 0, 0}, WIDTH, u8g_dev_ssd1306_128x64_2x_buf};
u8g_dev_t u8g_dev_ssd1306_128x64_2x_i2c = { u8g_dev_ssd1306_128x64_2x_fn, &u8g_dev_ssd1306_128x64_2x_pb, U8G_COM_SSD_I2C };
u8g_dev_t u8g_dev_ssd1306_128x64_2x_i2c = { u8g_dev_ssd1306_128x64_2x_fn, &u8g_dev_ssd1306_128x64_2x_pb, U8G_COM_SSD_I2C };
u8g_dev_t u8g_dev_ssd1306_128x64_2x_hw_spi = { u8g_dev_ssd1306_128x64_2x_fn, &u8g_dev_ssd1306_128x64_2x_pb, U8G_COM_SSD_SPI };

u8g_pb_t u8g_dev_ssd1306_128x64_pb = { {8, HEIGHT, 0, 0, 0}, WIDTH, u8g_dev_ssd1306_128x64_2x_buf};
u8g_dev_t u8g_dev_ssd1306_128x64_hw_spi = { u8g_dev_ssd1306_128x64_fn, &u8g_dev_ssd1306_128x64_pb, U8G_COM_SSD_SPI };

0 comments on commit c7aba6d

Please sign in to comment.