From 3ae120406e1244d728276b2bcc74d03d1ccb230d Mon Sep 17 00:00:00 2001 From: inmarket Date: Sat, 21 Nov 2015 19:28:12 +1000 Subject: [PATCH] Add an Arduino Sketch project. It shows how to add ugfx as a sketch library. --- .../ArduinoTinyScreen/gfx/board_SSD1331.cpp | 88 +++++++++++++++++++ .../ArduinoTinyScreen/gfx/board_SSD1331.h | 34 +++++++ .../ArduinoTinyScreen/gfx/driver_SSD1331.c | 1 + .../ArduinoTinyScreen/gfx/gdisp_lld_config.h | 1 + boards/base/ArduinoTinyScreen/gfx/gfx.c | 1 + boards/base/ArduinoTinyScreen/gfx/gfx.h | 1 + boards/base/ArduinoTinyScreen/gfx/gfxconf.h | 48 ++++++++++ boards/base/ArduinoTinyScreen/readme.txt | 17 ++++ boards/base/ArduinoTinyScreen/ugfx_test.ino | 38 ++++++++ 9 files changed, 229 insertions(+) create mode 100644 boards/base/ArduinoTinyScreen/gfx/board_SSD1331.cpp create mode 100644 boards/base/ArduinoTinyScreen/gfx/board_SSD1331.h create mode 100644 boards/base/ArduinoTinyScreen/gfx/driver_SSD1331.c create mode 100644 boards/base/ArduinoTinyScreen/gfx/gdisp_lld_config.h create mode 100644 boards/base/ArduinoTinyScreen/gfx/gfx.c create mode 100644 boards/base/ArduinoTinyScreen/gfx/gfx.h create mode 100644 boards/base/ArduinoTinyScreen/gfx/gfxconf.h create mode 100644 boards/base/ArduinoTinyScreen/readme.txt create mode 100644 boards/base/ArduinoTinyScreen/ugfx_test.ino diff --git a/boards/base/ArduinoTinyScreen/gfx/board_SSD1331.cpp b/boards/base/ArduinoTinyScreen/gfx/board_SSD1331.cpp new file mode 100644 index 00000000..5065c34d --- /dev/null +++ b/boards/base/ArduinoTinyScreen/gfx/board_SSD1331.cpp @@ -0,0 +1,88 @@ +#include +#include +#include + +#include "board_SSD1331.h" + +#define LCD_BOARD_ID 0 // 0 or 1 - set by the position of a resistor near SX1505 (see schematic and board design) + +// GPIO Pins +#define GPIO_DC 0x01 +#define GPIO_CS 0x02 +#define GPIO_RES 0x08 +#define GPIO_BTN1 0x10 +#define GPIO_BTN2 0x20 +#define GPIO_BTN3 0x40 +#define GPIO_BTN4 0x80 +#define GPIO_CMD_START ~(GPIO_CS|GPIO_DC) +#define GPIO_DATA_START ~GPIO_CS +#define GPIO_TRANSFER_END GPIO_CS + +//GPIO Registers +#define GPIO_RegData 0x00 +#define GPIO_RegDir 0x01 +#define GPIO_RegPullUp 0x02 + +// Wire address of the SX1505 chip +#define GPIO_ADDR 0x20 + +static void writeGPIO(uint8_t regAddr, uint8_t regData) +{ + uint8_t oldTWBR=TWBR; + TWBR=0; + Wire.beginTransmission(GPIO_ADDR + LCD_BOARD_ID); + Wire.write(regAddr); + Wire.write(regData); + Wire.endTransmission(); + TWBR=oldTWBR; +} + +static bool isDataMode = false; +static bool isCmdMode = false; + +void SSD1331_init_board(void) { + //setup GPIO, reset SSD1331 + writeGPIO(GPIO_RegData,~GPIO_RES);//reset low, CS/other pins high + writeGPIO(GPIO_RegDir,~GPIO_RES);//set reset to output + delay(5); + writeGPIO(GPIO_RegDir,~(GPIO_CS|GPIO_DC));//reset to input, CS/DC output + writeGPIO(GPIO_RegPullUp,GPIO_BTN1|GPIO_BTN2|GPIO_BTN3|GPIO_BTN4);//button pullup enable + //init SPI + SPI.begin(); + SPI.setDataMode(SPI_MODE0);//wrong mode, works because we're only writing. this mode is compatible with SD cards. + SPI.setClockDivider(SPI_CLOCK_DIV2); + + isDataMode = isCmdMode = false; +} + +void SSD1331_setpin_reset(int state) { + // Ignore this as we did it in the init_board +} + +void SSD1331_aquirebus(void) { + // Do nothing as we do it in the data transfer +} + +void SSD1331_releasebus(void) { + if (!isDataMode && !isCmdMode) return; + writeGPIO(GPIO_RegData,GPIO_TRANSFER_END); + isDataMode = isCmdMode = false; +} + +void SSD1331_write_cmd(uint8_t cmd) { + if (!isCmdMode) { + writeGPIO(GPIO_RegData,GPIO_CMD_START); + isDataMode = false; + isCmdMode = true; + } + SPI.transfer(cmd); +} + +void SSD1331_write_data(uint8_t data) { + if (!isDataMode) { + writeGPIO(GPIO_RegData,GPIO_DATA_START); + isDataMode = true; + isCmdMode = false; + } + SPI.transfer(data); +} diff --git a/boards/base/ArduinoTinyScreen/gfx/board_SSD1331.h b/boards/base/ArduinoTinyScreen/gfx/board_SSD1331.h new file mode 100644 index 00000000..17b125c8 --- /dev/null +++ b/boards/base/ArduinoTinyScreen/gfx/board_SSD1331.h @@ -0,0 +1,34 @@ +/* + * This file is subject to the terms of the GFX License. If a copy of + * the license was not distributed with this file, you can obtain one at: + * + * http://ugfx.org/license.html + */ + +#ifndef _GDISP_LLD_BOARD_H +#define _GDISP_LLD_BOARD_H + +#define init_board(g) SSD1331_init_board() +#define post_init_board(g) +#define setpin_reset(g, state) SSD1331_setpin_reset(state) +#define acquire_bus(g) SSD1331_aquirebus() +#define release_bus(g) SSD1331_releasebus() +#define write_cmd(g, cmd) SSD1331_write_cmd(cmd) +#define write_data(g, data) SSD1331_write_data(data) + +#ifdef __cplusplus +extern "C" { +#endif + +void SSD1331_init_board(void); +void SSD1331_setpin_reset(int state); +void SSD1331_aquirebus(void); +void SSD1331_releasebus(void); +void SSD1331_write_cmd(uint8_t cmd); +void SSD1331_write_data(uint8_t data); + +#ifdef __cplusplus +} +#endif + +#endif /* _GDISP_LLD_BOARD_H */ diff --git a/boards/base/ArduinoTinyScreen/gfx/driver_SSD1331.c b/boards/base/ArduinoTinyScreen/gfx/driver_SSD1331.c new file mode 100644 index 00000000..910ea06a --- /dev/null +++ b/boards/base/ArduinoTinyScreen/gfx/driver_SSD1331.c @@ -0,0 +1 @@ +#include "ugfx/drivers/gdisp/SSD1331/gdisp_lld_SSD1331.c" \ No newline at end of file diff --git a/boards/base/ArduinoTinyScreen/gfx/gdisp_lld_config.h b/boards/base/ArduinoTinyScreen/gfx/gdisp_lld_config.h new file mode 100644 index 00000000..29757d09 --- /dev/null +++ b/boards/base/ArduinoTinyScreen/gfx/gdisp_lld_config.h @@ -0,0 +1 @@ +#include "ugfx/drivers/gdisp/SSD1331/gdisp_lld_config.h" \ No newline at end of file diff --git a/boards/base/ArduinoTinyScreen/gfx/gfx.c b/boards/base/ArduinoTinyScreen/gfx/gfx.c new file mode 100644 index 00000000..b5836987 --- /dev/null +++ b/boards/base/ArduinoTinyScreen/gfx/gfx.c @@ -0,0 +1 @@ +#include "ugfx/src/gfx_mk.c" diff --git a/boards/base/ArduinoTinyScreen/gfx/gfx.h b/boards/base/ArduinoTinyScreen/gfx/gfx.h new file mode 100644 index 00000000..19116626 --- /dev/null +++ b/boards/base/ArduinoTinyScreen/gfx/gfx.h @@ -0,0 +1 @@ +#include "ugfx/gfx.h" \ No newline at end of file diff --git a/boards/base/ArduinoTinyScreen/gfx/gfxconf.h b/boards/base/ArduinoTinyScreen/gfx/gfxconf.h new file mode 100644 index 00000000..1a1f8623 --- /dev/null +++ b/boards/base/ArduinoTinyScreen/gfx/gfxconf.h @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2012, 2013, Joel Bodenmann aka Tectu + * Copyright (c) 2012, 2013, Andrew Hannam aka inmarket + * + * 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. + * * Neither the name of the nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * 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 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. + */ + +#ifndef _GFXCONF_H +#define _GFXCONF_H + +/* The operating system to use. One of these must be defined - preferably in your Makefile */ +//#define GFX_USE_OS_CHIBIOS FALSE +//#define GFX_USE_OS_WIN32 FALSE +//#define GFX_USE_OS_LINUX FALSE +//#define GFX_USE_OS_OSX FALSE +#define GFX_USE_OS_ARDUINO TRUE + +/* GFX sub-systems to turn on */ +#define GFX_USE_GDISP TRUE + +/* Features for the GDISP sub-system. */ +#define GDISP_NEED_VALIDATION TRUE +#define GDISP_NEED_CLIP TRUE + +#endif /* _GFXCONF_H */ + diff --git a/boards/base/ArduinoTinyScreen/readme.txt b/boards/base/ArduinoTinyScreen/readme.txt new file mode 100644 index 00000000..5c047e8b --- /dev/null +++ b/boards/base/ArduinoTinyScreen/readme.txt @@ -0,0 +1,17 @@ +This is a working Arduino project for the TinyScreen ATmega board. + +To use this with the Arduino IDE Development Environment follow these steps... + +1/ Copy the gfx directory from this directory to your Arduino library. eg /Arduino/libraries/gfx +3/ Create a subdirectory under "gfx" called "ugfx" and copy the entire ugfx system to that directory. +4/ In the "gfx" directory adjust the gfxconf.h for your project. +5/ In the gfx directory create a .c file for each driver that you want to use that contains a single line + to #include the driver source in the repository file. For a GDISP driver you will also need to create + a gdisp_lld_config.h file that contains a single line that #include's the gdisp_lld_config.h file for + the GDISP driver. Don't forget to add the board files for your drivers. + This example has the files for the SSD1331 TinyScreen display. +6/ Copy the example ugfx_test.ino file to your Arduino projects directory eg /Arduino/ugfx_test +7/ Modify the ugfx_test.ino project to suit. +8/ Remember that for ATmega platforms RAM and FLASH are very limited. Be careful which ugfx options you turn on. + Arduino ARM based boards are much less limited. + diff --git a/boards/base/ArduinoTinyScreen/ugfx_test.ino b/boards/base/ArduinoTinyScreen/ugfx_test.ino new file mode 100644 index 00000000..25bbcdef --- /dev/null +++ b/boards/base/ArduinoTinyScreen/ugfx_test.ino @@ -0,0 +1,38 @@ +#include +#include +#include + +void setup() { + coord_t width, height; + coord_t i, j; + + pinMode(13, OUTPUT); + + // Initialize and clear the display + gfxInit(); + +#if 1 + // Get the screen size + width = gdispGetWidth(); + height = gdispGetHeight(); + + // Code Here + gdispDrawBox(10, 10, width / 2, height / 2, Yellow); + gdispFillArea(width / 2, height / 2, width / 2 - 10, height / 2 - 10, Blue); + gdispDrawLine(5, 30, width - 50, height - 40, Red); + + for (i = 5, j = 0; i < width && j < height; i += 7, j += i / 20) + gdispDrawPixel(i, j, White); +#endif +} + +void loop() { + // put your main code here, to run repeatedly: + digitalWrite(13, HIGH); // turn the LED on (HIGH is the voltage level) + delay(500); + //gfxSleepMilliseconds(500); + digitalWrite(13, LOW); // turn the LED on (HIGH is the voltage level) + delay(500); + //gfxSleepMilliseconds(500); +} +