diff options
| -rwxr-xr-x | src/Samples/SpiLcd.cpp | 457 | ||||
| -rwxr-xr-x | src/Samples/SpiLcd.h | 94 | ||||
| -rwxr-xr-x | src/Samples/TFTLCD.h (renamed from src/TFTLCD/TFTLCD.h) | 0 | ||||
| -rwxr-xr-x | src/Samples/maryoled.cpp (renamed from src/core/maryoled.cpp) | 0 | ||||
| -rwxr-xr-x | src/Samples/maryoled.h (renamed from src/core/maryoled.h) | 0 | ||||
| -rwxr-xr-x | src/core/Print.cpp | 252 | ||||
| -rwxr-xr-x | src/core/gpio.cpp | 685 | ||||
| -rwxr-xr-x | src/core/gpio_int.cpp | 306 |
8 files changed, 1188 insertions, 606 deletions
diff --git a/src/Samples/SpiLcd.cpp b/src/Samples/SpiLcd.cpp new file mode 100755 index 0000000..10d870c --- /dev/null +++ b/src/Samples/SpiLcd.cpp @@ -0,0 +1,457 @@ +/* mbed Nokia LCD Library + * Atsu + */ + +#include "delay.h" +#include "SpiLcd.h" +#include <math.h> + + +#define LCD_ROWS 15 +#define LCD_COLS 16 +#define LCD_WIDTH 128 +#define LCD_HEIGHT 160 +#define LCD_FREQUENCY 20000000 + +//MARY Pin Assign +//#define LCD_VCC_ON C21 +//#define LCD_CS C33 +//#define LCD_RES C31 + +//LPCXpresso pin Assign (MARMEX-SLOT1) +//#define LCD_VCC_ON P0_7 +//#define LCD_CS P0_2 +//#define LCD_RES P0_1 + +SPILCD slcd; + +SPILCD::SPILCD() +{ + this->LCD_VCC_ON = C21; + this->LCD_CS = C33; + this->LCD_RES = C31; + this->device = ST7735; + port = marySSP0; + _row = 0; + _column = 0; + _foreground = 0x00FFFFFF; + _background = 0x00000000; + +} + +SPILCD::~SPILCD() +{ +} +void SPILCD::reset(SSP_PORT port) +{ + this->port = port; + if(port==LPCXSSP0) //LPCXpresso 1114 + MAPLE + { + this->LCD_VCC_ON = P0_7; + this->LCD_CS = P0_2; + this->LCD_RES = P0_1; + } + pinMode(LCD_VCC_ON,OUTPUT); + pinMode(LCD_RES,OUTPUT); + pinMode(LCD_CS,OUTPUT); + + digitalWrite(LCD_RES,HIGH); + digitalWrite(LCD_VCC_ON,LOW); + + reset(); + return; +} +void SPILCD::reset() { + + command(0x11);//Sleep out + delay(120); + //ST7735R Frame Rate + command(0xB1); + data(0x01); + data(0x2C); + data(0x2D); + command(0xB2); + data(0x01); + data(0x2C); + data(0x2D); + command(0xB3); + data(0x01); + data(0x2C); + data(0x2D); + data(0x01); + data(0x2C); + data(0x2D); + //------------------------------------End ST7735R Frame Rate-----------------------------------------// + command(0xB4);//Column inversion + data(0x07); + //------------------------------------ST7735R Power Sequence-----------------------------------------// + command(0xC0); + data(0xA2); + data(0x02); + data(0x84); + command(0xC1); + data(0xC5); + command(0xC2); + data(0x0A); + data(0x00); + command(0xC3); + data(0x8A); + data(0x2A); + command(0xC4); + data(0x8A); + data(0xEE); + //---------------------------------End ST7735R Power Sequence-------------------------------------// + command(0xC5);//VCOM + data(0x0E); + command(0x36);//MX, MY, RGB mode + data(0xC8); + //------------------------------------ST7735R Gamma Sequence-----------------------------------------// + command(0xe0); + data(0x02); + data(0x1c); + data(0x07); + data(0x12); + data(0x37); + data(0x32); + data(0x29); + data(0x2d); + data(0x29); + data(0x25); + data(0x2b); + data(0x39); + data(0x00); + data(0x01); + data(0x03); + data(0x10); + command(0xe1); + data(0x03); + data(0x1d); + data(0x07); + data(0x06); + data(0x2e); + data(0x2c); + data(0x29); + data(0x2d); + data(0x2e); + data(0x2e); + data(0x37); + data(0x3f); + data(0x00); + data(0x00); + data(0x02); + data(0x10); + command(0x2A); + data(0x00); + data(0x02); + data(0x00); + data(0x81); + + command(0x2B); + data(0x00); + data(0x01); + data(0x00); + data(0xA0); + //------------------------------------End ST7735R Gamma Sequence-----------------------------------------// + + command(0x3A); + data(0x05); + //command(0x3A);//65k mode + //data(0x05); + command(0x29);//Display on + +} + +void SPILCD::command(int value) +{ + digitalWrite(LCD_CS, LOW); + digitalWrite(LCD_RES, LOW); + + SPI.transfer(value & 0xff); + + digitalWrite(LCD_CS,HIGH); +} + +void SPILCD::data(int value) +{ + digitalWrite(LCD_CS,LOW); + digitalWrite(LCD_RES,HIGH); + + SPI.transfer(value & 0xff); + + digitalWrite(LCD_CS, HIGH); +} + +void SPILCD::_window( int x, int y, int width, int height ) +{ + int x1 = x + 0; + int y1 = y + 0; + int x2 = x1 + width - 1; + int y2 = y1 + height - 1; + +// TODO: fix this frame-Command new +// command( SET_COLUMN_ADDRESS ); +// data( x1 ); +// data( x2 ); +// command( SET_ROW_ADDRESS ); +// data( y1 ); +// data( y2 ); +// command( WRITE_RAM_COMMAND ); + +} + +void SPILCD::WindowReset(void) +{ + command( SET_COLUMN_ADDRESS ); + data( 0 ); + data( 127 ); + command( SET_ROW_ADDRESS ); + data( 0 ); + data( 127 ); + command( WRITE_RAM_COMMAND ); +} + + + + +const unsigned char FONT8x8[97][8] = { + {0x08,0x08,0x08,0x00,0x00,0x00,0x00,0x00}, // columns, rows, num_bytes_per_char + {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, // space 0x20 + {0x30,0x78,0x78,0x30,0x30,0x00,0x30,0x00}, // ! + {0x6C,0x6C,0x6C,0x00,0x00,0x00,0x00,0x00}, // " + {0x6C,0x6C,0xFE,0x6C,0xFE,0x6C,0x6C,0x00}, // # + {0x18,0x3E,0x60,0x3C,0x06,0x7C,0x18,0x00}, // $ + {0x00,0x63,0x66,0x0C,0x18,0x33,0x63,0x00}, // % + {0x1C,0x36,0x1C,0x3B,0x6E,0x66,0x3B,0x00}, // & + {0x30,0x30,0x60,0x00,0x00,0x00,0x00,0x00}, // ' + {0x0C,0x18,0x30,0x30,0x30,0x18,0x0C,0x00}, // ( + {0x30,0x18,0x0C,0x0C,0x0C,0x18,0x30,0x00}, // ) + {0x00,0x66,0x3C,0xFF,0x3C,0x66,0x00,0x00}, // * + {0x00,0x30,0x30,0xFC,0x30,0x30,0x00,0x00}, // + + {0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x30}, // , + {0x00,0x00,0x00,0x7E,0x00,0x00,0x00,0x00}, // - + {0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x00}, // . + {0x03,0x06,0x0C,0x18,0x30,0x60,0x40,0x00}, // / (forward slash) + {0x3E,0x63,0x63,0x6B,0x63,0x63,0x3E,0x00}, // 0 0x30 + {0x18,0x38,0x58,0x18,0x18,0x18,0x7E,0x00}, // 1 + {0x3C,0x66,0x06,0x1C,0x30,0x66,0x7E,0x00}, // 2 + {0x3C,0x66,0x06,0x1C,0x06,0x66,0x3C,0x00}, // 3 + {0x0E,0x1E,0x36,0x66,0x7F,0x06,0x0F,0x00}, // 4 + {0x7E,0x60,0x7C,0x06,0x06,0x66,0x3C,0x00}, // 5 + {0x1C,0x30,0x60,0x7C,0x66,0x66,0x3C,0x00}, // 6 + {0x7E,0x66,0x06,0x0C,0x18,0x18,0x18,0x00}, // 7 + {0x3C,0x66,0x66,0x3C,0x66,0x66,0x3C,0x00}, // 8 + {0x3C,0x66,0x66,0x3E,0x06,0x0C,0x38,0x00}, // 9 + {0x00,0x18,0x18,0x00,0x00,0x18,0x18,0x00}, // : + {0x00,0x18,0x18,0x00,0x00,0x18,0x18,0x30}, // ; + {0x0C,0x18,0x30,0x60,0x30,0x18,0x0C,0x00}, // < + {0x00,0x00,0x7E,0x00,0x00,0x7E,0x00,0x00}, // = + {0x30,0x18,0x0C,0x06,0x0C,0x18,0x30,0x00}, // > + {0x3C,0x66,0x06,0x0C,0x18,0x00,0x18,0x00}, // ? + {0x3E,0x63,0x6F,0x69,0x6F,0x60,0x3E,0x00}, // @ 0x40 + {0x18,0x3C,0x66,0x66,0x7E,0x66,0x66,0x00}, // A + {0x7E,0x33,0x33,0x3E,0x33,0x33,0x7E,0x00}, // B + {0x1E,0x33,0x60,0x60,0x60,0x33,0x1E,0x00}, // C + {0x7C,0x36,0x33,0x33,0x33,0x36,0x7C,0x00}, // D + {0x7F,0x31,0x34,0x3C,0x34,0x31,0x7F,0x00}, // E + {0x7F,0x31,0x34,0x3C,0x34,0x30,0x78,0x00}, // F + {0x1E,0x33,0x60,0x60,0x67,0x33,0x1F,0x00}, // G + {0x66,0x66,0x66,0x7E,0x66,0x66,0x66,0x00}, // H + {0x3C,0x18,0x18,0x18,0x18,0x18,0x3C,0x00}, // I + {0x0F,0x06,0x06,0x06,0x66,0x66,0x3C,0x00}, // J + {0x73,0x33,0x36,0x3C,0x36,0x33,0x73,0x00}, // K + {0x78,0x30,0x30,0x30,0x31,0x33,0x7F,0x00}, // L + {0x63,0x77,0x7F,0x7F,0x6B,0x63,0x63,0x00}, // M + {0x63,0x73,0x7B,0x6F,0x67,0x63,0x63,0x00}, // N + {0x3E,0x63,0x63,0x63,0x63,0x63,0x3E,0x00}, // O + {0x7E,0x33,0x33,0x3E,0x30,0x30,0x78,0x00}, // P 0x50 + {0x3C,0x66,0x66,0x66,0x6E,0x3C,0x0E,0x00}, // Q + {0x7E,0x33,0x33,0x3E,0x36,0x33,0x73,0x00}, // R + {0x3C,0x66,0x30,0x18,0x0C,0x66,0x3C,0x00}, // S + {0x7E,0x5A,0x18,0x18,0x18,0x18,0x3C,0x00}, // T + {0x66,0x66,0x66,0x66,0x66,0x66,0x7E,0x00}, // U + {0x66,0x66,0x66,0x66,0x66,0x3C,0x18,0x00}, // V + {0x63,0x63,0x63,0x6B,0x7F,0x77,0x63,0x00}, // W + {0x63,0x63,0x36,0x1C,0x1C,0x36,0x63,0x00}, // X + {0x66,0x66,0x66,0x3C,0x18,0x18,0x3C,0x00}, // Y + {0x7F,0x63,0x46,0x0C,0x19,0x33,0x7F,0x00}, // Z + {0x3C,0x30,0x30,0x30,0x30,0x30,0x3C,0x00}, // [ + {0x60,0x30,0x18,0x0C,0x06,0x03,0x01,0x00}, // \ (back slash) + {0x3C,0x0C,0x0C,0x0C,0x0C,0x0C,0x3C,0x00}, // ] + {0x08,0x1C,0x36,0x63,0x00,0x00,0x00,0x00}, // ^ + {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF}, // _ + {0x18,0x18,0x0C,0x00,0x00,0x00,0x00,0x00}, // ` 0x60 + {0x00,0x00,0x3C,0x06,0x3E,0x66,0x3B,0x00}, // a + {0x70,0x30,0x3E,0x33,0x33,0x33,0x6E,0x00}, // b + {0x00,0x00,0x3C,0x66,0x60,0x66,0x3C,0x00}, // c + {0x0E,0x06,0x3E,0x66,0x66,0x66,0x3B,0x00}, // d + {0x00,0x00,0x3C,0x66,0x7E,0x60,0x3C,0x00}, // e + {0x1C,0x36,0x30,0x78,0x30,0x30,0x78,0x00}, // f + {0x00,0x00,0x3B,0x66,0x66,0x3E,0x06,0x7C}, // g + {0x70,0x30,0x36,0x3B,0x33,0x33,0x73,0x00}, // h + {0x18,0x00,0x38,0x18,0x18,0x18,0x3C,0x00}, // i + {0x06,0x00,0x06,0x06,0x06,0x66,0x66,0x3C}, // j + {0x70,0x30,0x33,0x36,0x3C,0x36,0x73,0x00}, // k + {0x38,0x18,0x18,0x18,0x18,0x18,0x3C,0x00}, // l + {0x00,0x00,0x66,0x7F,0x7F,0x6B,0x63,0x00}, // m + {0x00,0x00,0x7C,0x66,0x66,0x66,0x66,0x00}, // n + {0x00,0x00,0x3C,0x66,0x66,0x66,0x3C,0x00}, // o + {0x00,0x00,0x6E,0x33,0x33,0x3E,0x30,0x78}, // p + {0x00,0x00,0x3B,0x66,0x66,0x3E,0x06,0x0F}, // q + {0x00,0x00,0x6E,0x3B,0x33,0x30,0x78,0x00}, // r + {0x00,0x00,0x3E,0x60,0x3C,0x06,0x7C,0x00}, // s + {0x08,0x18,0x3E,0x18,0x18,0x1A,0x0C,0x00}, // t + {0x00,0x00,0x66,0x66,0x66,0x66,0x3B,0x00}, // u + {0x00,0x00,0x66,0x66,0x66,0x3C,0x18,0x00}, // v + {0x00,0x00,0x63,0x6B,0x7F,0x7F,0x36,0x00}, // w + {0x00,0x00,0x63,0x36,0x1C,0x36,0x63,0x00}, // x + {0x00,0x00,0x66,0x66,0x66,0x3E,0x06,0x7C}, // y + {0x00,0x00,0x7E,0x4C,0x18,0x32,0x7E,0x00}, // z + {0x0E,0x18,0x18,0x70,0x18,0x18,0x0E,0x00}, // { + {0x0C,0x0C,0x0C,0x00,0x0C,0x0C,0x0C,0x00}, // | + {0x70,0x18,0x18,0x0E,0x18,0x18,0x70,0x00}, // } + {0x3B,0x6E,0x00,0x00,0x00,0x00,0x00,0x00}, // ~ + {0x1C,0x36,0x36,0x1C,0x00,0x00,0x00,0x00} +}; // DEL + +void SPILCD::locate(int column, int row) { + _column = column; + _row = row; +} + +void SPILCD::newline() { + _column = 0; + _row++; + if (_row >= rows() ) { + _row = 0; + } +} + +void SPILCD::_putp( int colour ) { + /*int cnv = 0; + + cnv = (colour >> 8) & 0xf800; + cnv |= (colour >> 5) & 0x07e0; + cnv |= (colour >> 3) & 0x001f; + + data( cnv >> 8); + data( cnv ); + */ + unsigned long data1, data2; + data1 = ((colour >> 8) & 0xff) | 0x100; + data2 = (colour & 0x0ff) | 0x100; + data(data1); + data(data2); + } +int SPILCD::_putc(int value) { + int x = _column * 8; // FIXME: Char sizes + int y = _row * 8; + bitblit(x + 1, y + 1, 8, 8, (char*)&(FONT8x8[value - 0x1F][0])); + + _column++; + + if (_column >= SPILCD_COLS) { + _row++; + _column = 0; + } + + if (_row >= SPILCD_ROWS) { + _row = 0; + } + + return value; +} + +void SPILCD::cls( void ) { + fill( 0, 0, SPILCD_WIDTH , SPILCD_HEIGHT, _background ); + _row = 0; + _column = 0; +} + + +void SPILCD::window(int x, int y, int width, int height) { + // digitalWrite( LCD_CS, LOW ); + _window(x, y, width, height); + //digitalWrite( LCD_CS, HIGH ); +} + +void SPILCD::putp(int colour) { + //digitalWrite( LCD_CS, LOW ); + _putp(colour); + //digitalWrite( LCD_CS, HIGH ); +} + + +void SPILCD::pixel(int x, int y, int colour) { + //digitalWrite( LCD_CS, LOW ); + _window(x, y, 1, 1); + _putp(colour); + //digitalWrite( LCD_CS, HIGH ); +} + +void SPILCD::fill( int x, int y, int width, int height, int colour ) +{ + digitalWrite( LCD_CS, LOW ); + _window( x, y, width, height ); + + for (int i = 0; i < width * height; i++ ) { + _putp( colour ); + } + + _window( 0, 0, SPILCD_WIDTH, SPILCD_HEIGHT ); + digitalWrite( LCD_CS, HIGH ); +} + + +void SPILCD::blit( int x, int y, int width, int height, const int* colour ) { + digitalWrite( LCD_CS, LOW ); + _window( x, y, width, height ); + + for (int i = 0; i < width * height; i++ ) { + _putp( colour[i] ); + } + _window( 0, 0, SPILCD_WIDTH, SPILCD_HEIGHT ); + digitalWrite( LCD_CS, HIGH ); +} + + +void SPILCD::bitblit( int x, int y, int width, int height, const char* bitstream ) { + digitalWrite( LCD_CS, LOW ); + _window( x, y, width, height ); + + for (int i = 0; i < height * width; i++ ) { + int byte = i / 8; + int bit = i % 8; + int colour = ((bitstream[ byte ] << bit) & 0x80) ? _foreground : _background; + _putp( colour ); + } + _window( 0, 0, _width, _height ); + digitalWrite( LCD_CS, HIGH ); +} + +void SPILCD::foreground(int c) { + _foreground = c; + return; +} + +void SPILCD::background(int c) { + _background = c; + return; +} + +int SPILCD::width() { + return SPILCD_WIDTH; +} + +int SPILCD::height() { + return SPILCD_HEIGHT; +} + +int SPILCD::columns() { + return SPILCD_COLS; +} + +int SPILCD::rows() { + return SPILCD_ROWS; +} + + diff --git a/src/Samples/SpiLcd.h b/src/Samples/SpiLcd.h new file mode 100755 index 0000000..be912cc --- /dev/null +++ b/src/Samples/SpiLcd.h @@ -0,0 +1,94 @@ +/* + * SpiLcd.h + * + * Created on: 2012/08/01 + * Author: lynxeyed + */ + +#ifndef SPILCD_H_ +#define SPILCD_H_ + +/**************************************************************************//** + * @file SpiLcd.h + * @brief Arduino-like library for Cortex-M0 Series + * @version v.0.50 + * @date 1. August 2011. + * @author lynxeyed + * @note Copyright (c) 2012 Lynx-EyED's Klavier and Craft-works. <BR> + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation 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 furnished to do so, subject to the following conditions: <BR> + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software.<BR> + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR 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 "SPI.h" +#include "gpio.h" + +#ifdef __cplusplus + extern "C" { +#endif + +typedef enum {ST7735,Nokia6610,Nokia6100,PCF8833} LCD_DEVICES; // Defaults:ST7735 + +class SPILCD { +private: + SSP_PORT port; + LCD_DEVICES device; + int LCD_VCC_ON; + int LCD_CS; + int LCD_RES; + int _row; + int _column; + int _foreground; + int _background; + int _width; + int _height; + + + +public: + SPILCD(); // announce the constructor to initialize + ~SPILCD(); + + void reset(); + void reset(SSP_PORT port); + void command( int value ); + void data( int value ); + void _window( int x, int y, int width, int height ); + void locate(int column, int row); + void newline(); + void _putp( int colour ); + int _putc( int value ); + void cls( void ); + void window( int x, int y, int width, int height ); + void WindowReset(void); + void putp( int colour ); + void pixel( int x, int y, int colour ); + void fill( int x, int y, int width, int height, int colour ); + void blit( int x, int y, int width, int height, const int* colour ); + void bitblit( int x, int y, int width, int height, const char* bitstream ); + void foreground(int c); + void background(int c); + int width(); + int height(); + int columns(); + int rows(); +}; + +extern SPILCD slcd; + +#ifdef __cplusplus + } +#endif +#endif /* SPILCD_H_ */ diff --git a/src/TFTLCD/TFTLCD.h b/src/Samples/TFTLCD.h index 797383c..797383c 100755 --- a/src/TFTLCD/TFTLCD.h +++ b/src/Samples/TFTLCD.h diff --git a/src/core/maryoled.cpp b/src/Samples/maryoled.cpp index 8df935c..8df935c 100755 --- a/src/core/maryoled.cpp +++ b/src/Samples/maryoled.cpp diff --git a/src/core/maryoled.h b/src/Samples/maryoled.h index 3998f8d..3998f8d 100755 --- a/src/core/maryoled.h +++ b/src/Samples/maryoled.h diff --git a/src/core/Print.cpp b/src/core/Print.cpp index b26848f..e259ac4 100755 --- a/src/core/Print.cpp +++ b/src/core/Print.cpp @@ -1,124 +1,128 @@ -#include "Print.h" - -void Print::print(const char *s) //uart_puts -{ - int n; - for (n = 0; *s; s++, n++) { - write(*s); - } - //return n; - return; -} - -void Print::print(int val, RADIX_FORMAT format) -{ - if(format == BYTE) - { - write((char)(val & 0xff)); - return; - } - char s[33]; - int i,j; - i=j=0; // header of strings - if (val<0) - { //minus value - s[i]='-'; - val=~val+1; - i++; - j++; - } - switch(format) - { - case BIN: - while (val>0) - { // do until zero - s[i++]=radix_bin[val%format]; - val/=format; - } - break; - - case OCT: - while (val>0) - { // do until zero - s[i++]=radix_oct[val%format]; - val/=format; - } - break; - - case DEC: //RADIX = Decimal - while (val>0) - { // do until zero - s[i++]=radix_dec[val%format]; - val/=format; - } - break; - - case HEX: //RADIX = Hexadecimal - while (val>0) - { // do until zero - s[i++]=radix_hex[val%format]; - val/=format; - } - break; - default: - break; - } - s[i--]='\0'; // EOF - while (j<i) - { // reverse strings array - char t; - t=s[j]; s[j]=s[i]; s[i]=t; - j++; i--; - } - print(s); - - return ; -} - -void Print::write(const char *s, int length) -{ - int n; - for(n=0;n<length;s++,n++) - { - write(*s); - } - return; -} - -void Print::println(const char *s) -{ - print(s); - println(); - return; -} - - -void Print::println(int val, RADIX_FORMAT format) -{ - print(val,format); - println(); - return; -} - -void Print::println(void) -{ - write ('\r'); - write ('\n'); - return; -} - -void Print::print(const char c) -{ - write(c); - return; -} - -void Print::println(const char c) -{ - write(c); - println(); - return; -} - - - +#include "Print.h"
+
+void Print::print(const char *s) //uart_puts
+{
+ int n;
+ for (n = 0; *s; s++, n++) {
+ write(*s);
+ }
+ //return n;
+ return;
+}
+
+void Print::print(int val, RADIX_FORMAT format)
+{
+ if( val == 0){
+ write('0');
+ return;
+ }
+ if(format == BYTE)
+ {
+ write((char)(val & 0xff));
+ return;
+ }
+ char s[33];
+ int i,j;
+ i=j=0; // header of strings
+ if (val<0)
+ { //minus value
+ s[i]='-';
+ val=~val+1;
+ i++;
+ j++;
+ }
+ switch(format)
+ {
+ case BIN:
+ while (val>0)
+ { // do until zero
+ s[i++]=radix_bin[val%format];
+ val/=format;
+ }
+ break;
+
+ case OCT:
+ while (val>0)
+ { // do until zero
+ s[i++]=radix_oct[val%format];
+ val/=format;
+ }
+ break;
+
+ case DEC: //RADIX = Decimal
+ while (val>0)
+ { // do until zero
+ s[i++]=radix_dec[val%format];
+ val/=format;
+ }
+ break;
+
+ case HEX: //RADIX = Hexadecimal
+ while (val>0)
+ { // do until zero
+ s[i++]=radix_hex[val%format];
+ val/=format;
+ }
+ break;
+ default:
+ break;
+ }
+ s[i--]='\0'; // EOF
+ while (j<i)
+ { // reverse strings array
+ char t;
+ t=s[j]; s[j]=s[i]; s[i]=t;
+ j++; i--;
+ }
+ print(s);
+
+ return ;
+}
+
+void Print::write(const char *s, int length)
+{
+ int n;
+ for(n=0;n<length;s++,n++)
+ {
+ write(*s);
+ }
+ return;
+}
+
+void Print::println(const char *s)
+{
+ print(s);
+ println();
+ return;
+}
+
+
+void Print::println(int val, RADIX_FORMAT format)
+{
+ print(val,format);
+ println();
+ return;
+}
+
+void Print::println(void)
+{
+ write ('\r');
+ write ('\n');
+ return;
+}
+
+void Print::print(const char c)
+{
+ write(c);
+ return;
+}
+
+void Print::println(const char c)
+{
+ write(c);
+ println();
+ return;
+}
+
+
+
diff --git a/src/core/gpio.cpp b/src/core/gpio.cpp index 6cfe41e..db69e14 100755 --- a/src/core/gpio.cpp +++ b/src/core/gpio.cpp @@ -1,329 +1,356 @@ -#include "gpio.h" - - -// IOCON:Cortex-M0 depend Settings -//#ifdef __NXP_LPC1114 -#define PORT_BIT_COUNT 12 // up to 12 I/O lines per port -#define PORT_COUNT 4 // up to 4 ports - -const uint8_t IOCON_LUT[PORT_COUNT][PORT_BIT_COUNT] = { - { 0x0C, 0x10, 0x1C, 0x2C, 0x30, 0x34, 0x4C, 0x50, 0x60, 0x64, 0x68, 0x74 }, - { 0x78, 0x7C, 0x80, 0x90, 0x94, 0xA0, 0xA4, 0xA8, 0x14, 0x38, 0x6C, 0x98 }, - { 0x08, 0x28, 0x5C, 0x8C, 0x40, 0x44, 0x00, 0x20, 0x24, 0x54, 0x58, 0x70 }, - { 0x84, 0x88, 0x9C, 0xAC, 0x3C, 0x48 } -}; - -#define IOCONAddress(port,bit) ((volatile uint16_t * const) (LPC_IOCON_BASE + IOCON_LUT[port][bit])) -#define SetIOCON(port, bit, ioconmask, ioconbits) \ - *IOCONAddress((port),(bit)) = (*IOCONAddress((port),(bit)) & ~(ioconmask)) | (ioconbits) - -typedef enum { - GPIO_DIR_INPUT = 0, - GPIO_DIR_OUTPUT = 1, - IOCON_MODE_MASK = (3<<3), - IOCON_MODE_PULLUP = (2<<3), - IOCON_MODE_PULLDOWN = (1<<3), - IOCON_MODE_REPEATER = (3<<3), - IOCON_MODE_INACTIVE = (0<<3), - IOCON_FUNC_MASK = 7, - IOCON_FUNC_0 = 0, - IOCON_FUNC_1 = 1, - IOCON_FUNC_2 = 2, - IOCON_FUNC_3 = 3, - IOCON_FUNC_4 = 4, - IOCON_FUNC_5 = 5, - IOCON_FUNC_6 = 6, - IOCON_FUNC_7 = 7, - IOCON_HYS_MASK = (1<<5), - IOCON_HYS_ENABLE = (1<<5), - IOCON_HYS_DISABLE = (0<<5), - IOCON_ADMODE_MASK = (1<<7), - IOCON_ADMODE_ANALOG = (0<<7), - IOCON_ADMODE_DIGITAL = (1<<7) -} IOCON_BITFIELD_ENUM; - -//#endif - -/* ======================================= -* Macros and functions for Defining MARY's GPIO Assign -* -* CN1_7,8 : (PIO1_2,PIO1_1) -* should be C17,C18 -* -* CN2_1...8 : (PIO1_4,PIO1_11,PIO1_7,PIO1_5,PIO3_2,PIO2_0,PIO1_6,PIO0_1) -* should be C21,C22,C23,C24,C25,C26,C27,C28 -* -* CN3_1...8 : (PIO1_8,PIO0_3,PIO0_2,PIO3_4,PIO0_4,PIO3_5,PIO0_5,PIO1_7) -* should be C31,C32,C33,C34,C35,C36,C37,C38 -* -* CN4_1...7 : (PIO1_9,PIO1_10,PIO0_6,PIO0_11,PIO0_8,PIO1_0,PIO0_9) -* should be C41,C42,C43,C44,C45,C46,C47 -* -* see also mary_pinAssign[...] in "gpio.h" -* ======================================= -*/ - - -void pinMode(int pin,pinModeState state) -{ - if(pin < 22) //arduinoPinAssign(0~21) - { - //IOCON settings use as GPIO - if((arduino_pinAssign[pin * 2]) == 0)//PIO0_X - { - switch(arduino_pinAssign[pin * 2 + 1]) - { - case 11: //P0_11 - SetIOCON(arduino_pinAssign[pin * 2], arduino_pinAssign[pin * 2 + 1], IOCON_FUNC_MASK, IOCON_FUNC_1); - break; - default: //P0_X - SetIOCON(arduino_pinAssign[pin * 2], arduino_pinAssign[pin * 2 + 1], IOCON_FUNC_MASK, IOCON_FUNC_0); - break; - } - }else if((arduino_pinAssign[pin * 2]) == 1)//PIO1_X - { - switch(arduino_pinAssign[pin * 2 + 1]) - { - case _BIT0: - case _BIT1: - case _BIT2: - case _BIT3: - SetIOCON(arduino_pinAssign[pin * 2], arduino_pinAssign[pin * 2 + 1], IOCON_FUNC_MASK, IOCON_FUNC_1); - break; - default: - SetIOCON(arduino_pinAssign[pin * 2], arduino_pinAssign[pin * 2 + 1], IOCON_FUNC_MASK, IOCON_FUNC_0); - break; - } - }else //PIO2_X - { - SetIOCON(arduino_pinAssign[pin * 2], arduino_pinAssign[pin * 2 + 1], IOCON_FUNC_MASK, IOCON_FUNC_0); - } - - if(state == OUTPUT) //OUTPUT - { - LPC_GPIO[ arduino_pinAssign[pin * 2] ]->DIR |= (1 << arduino_pinAssign[pin * 2 + 1]); - - }else //INPUT - { - LPC_GPIO[ arduino_pinAssign[pin * 2] ]->DIR &= ~((1 << arduino_pinAssign[pin * 2 + 1])); - } - return; - } - - if(pin < 100) return; //(20~99:reserved) - - if(pin < 200) //maryPinAssign(100~119?) - { - pin = pin - 100; - SetIOCON(mary_pinAssign[pin * 2], mary_pinAssign[pin * 2 + 1], IOCON_FUNC_MASK, IOCON_FUNC_0); - if(state == OUTPUT) //OUTPUT - { - LPC_GPIO[ mary_pinAssign[pin * 2] ]->DIR |= (1 << mary_pinAssign[pin * 2 + 1]); - }else //INPUT - { - LPC_GPIO[ mary_pinAssign[pin * 2] ]->DIR &= ~((1 << mary_pinAssign[pin * 2 + 1])); - } - } - return; - } - -void digitalWrite(int pin,digitalWriteState state) -{ - if(pin < 22) //arduinoPinAssign(0~21) - { - if(state == HIGH) //HIGH - { - if(LPC_GPIO[ arduino_pinAssign[pin * 2] ]->DIR & 1<<arduino_pinAssign[pin * 2 + 1])//pin is output - { - LPC_GPIO[ arduino_pinAssign[pin * 2] ]->MASKED_ACCESS[ (1 << arduino_pinAssign[pin * 2 + 1]) ] = (1 << arduino_pinAssign[pin * 2 + 1]); - }else//pin is input - { - SetIOCON(arduino_pinAssign[pin * 2], arduino_pinAssign[pin * 2 + 1], IOCON_MODE_MASK, IOCON_MODE_PULLUP); - } - }else //LOW - { - if(LPC_GPIO[ arduino_pinAssign[pin * 2] ]->DIR & 1<<arduino_pinAssign[pin * 2 + 1])//pin is output - { - LPC_GPIO[ arduino_pinAssign[pin * 2] ]->MASKED_ACCESS[ (1 << arduino_pinAssign[pin * 2 + 1]) ] &= ~((1 << arduino_pinAssign[pin * 2 + 1])); - }else // pin is input - { - SetIOCON(arduino_pinAssign[pin * 2], arduino_pinAssign[pin * 2 + 1], IOCON_MODE_MASK, IOCON_MODE_INACTIVE); - } - } - - return; - } - - - if(pin < 100) return; //arduinoPinAssign(20~99:reserved) - - if(pin < 200) //maryPinAssign(100~119?) - { - pin = pin - 100; - if(state == HIGH) //HIGH - { - if(LPC_GPIO[ mary_pinAssign[pin * 2] ]->DIR & 1<<mary_pinAssign[pin * 2 + 1])//pin is output - { - LPC_GPIO[ mary_pinAssign[pin * 2] ]->MASKED_ACCESS[ (1 << mary_pinAssign[pin * 2 + 1]) ] = (1 << mary_pinAssign[pin * 2 + 1]); - }else//pin is input - { - SetIOCON(mary_pinAssign[pin * 2], mary_pinAssign[pin * 2 + 1], IOCON_MODE_MASK, IOCON_MODE_PULLUP); - } - }else //LOW - { - if(LPC_GPIO[ mary_pinAssign[pin * 2] ]->DIR & 1<<mary_pinAssign[pin * 2 + 1])//pin is output - { - LPC_GPIO[ mary_pinAssign[pin * 2] ]->MASKED_ACCESS[ (1 << mary_pinAssign[pin * 2 + 1]) ] &= ~((1 << mary_pinAssign[pin * 2 + 1])); - }else // pin is input - { - SetIOCON(mary_pinAssign[pin * 2], mary_pinAssign[pin * 2 + 1], IOCON_MODE_MASK, IOCON_MODE_INACTIVE); - } - } - } - return; - } - -int digitalRead(int pin) -{ - volatile int readValue; - if(pin < 22) //arduinoPinAssign(0~21) - { - readValue = (LPC_GPIO[ arduino_pinAssign[pin * 2] ]->MASKED_ACCESS[ (1 << arduino_pinAssign[pin * 2 + 1]) ])? 1 : 0; - return readValue; - } - - if(pin < 100) return 0; //(20~99:reserved) - - if(pin < 200) //maryPinAssign(100~199?) - { - pin = pin - 100; - readValue = (LPC_GPIO[ mary_pinAssign[pin * 2] ]->MASKED_ACCESS[ (1 << mary_pinAssign[pin * 2 + 1]) ])? 1 : 0; - return readValue; - } - return 0; -} - -/***************************************************************************** - ** Function name: GPIOSetInterrupt - ** - ** Descriptions: Set interrupt sense, event, etc. - ** edge or level, 0 is edge, 1 is level - ** single or double edge, 0 is single, 1 is double - ** active high or low, etc. - ** - ** parameters: pin num, bit position, sense, single/doube, polarity - ** Returned value: None - ** - *****************************************************************************/ -void GPIOSetInterrupt(int pin, int sense, int single, int event) { - if (pin >= 0 && pin < 22) //arduinoPinAssign(0~21) - { - if (sense == 0) { - LPC_GPIO[arduino_pinAssign[pin * 2]]->IS &= ~((1 << arduino_pinAssign[pin * 2 + 1])); - /* single or double only applies when sense is 0(edge trigger). */ - if (single == 0) - LPC_GPIO[arduino_pinAssign[pin * 2]]->IBE - &= ~((1 << arduino_pinAssign[pin * 2 + 1])); - else - LPC_GPIO[arduino_pinAssign[pin * 2]]->IBE - |= ((1 << arduino_pinAssign[pin * 2 + 1])); - } else - LPC_GPIO[arduino_pinAssign[pin * 2]]->IS |= ((1 << arduino_pinAssign[pin * 2 + 1])); - - if (event == 0) - LPC_GPIO[arduino_pinAssign[pin * 2]]->IEV - &= ~((1 << arduino_pinAssign[pin * 2 + 1])); - else - LPC_GPIO[arduino_pinAssign[pin * 2]]->IEV |= ((1 << arduino_pinAssign[pin * 2 + 1])); - } else if (pin >= 22 && pin < 100) { - //(22~99:reserved) - } else if (pin >= 100 && pin < 200) //maryPinAssign(100~119?) - { - pin = pin - 100; - if (sense == 0) { - LPC_GPIO[mary_pinAssign[pin * 2]]->IS &= ~((1 << mary_pinAssign[pin * 2 + 1])); - /* single or double only applies when sense is 0(edge trigger). */ - if (single == 0) - LPC_GPIO[mary_pinAssign[pin * 2]]->IBE &= ~((1 << mary_pinAssign[pin * 2 + 1])); - else - LPC_GPIO[mary_pinAssign[pin * 2]]->IBE |= ((1 << mary_pinAssign[pin * 2 + 1])); - } else - LPC_GPIO[mary_pinAssign[pin * 2]]->IS |= ((1 << mary_pinAssign[pin * 2 + 1])); - - if (event == 0) - LPC_GPIO[mary_pinAssign[pin * 2]]->IEV &= ~((1 << mary_pinAssign[pin * 2 + 1])); - else - LPC_GPIO[mary_pinAssign[pin * 2]]->IEV |= ((1 << mary_pinAssign[pin * 2 + 1])); - } - - return; -} - -void GPIOIntEnable(int pin) { - if (pin >= 0 && pin < 22) //arduinoPinAssign(0~21) - { - - LPC_GPIO[arduino_pinAssign[pin * 2]]->IE |= (1 << arduino_pinAssign[pin * 2 + 1]); - } else if (pin >= 22 && pin < 100) { //(20~99:reserved) - } else if (pin >= 100 && pin < 200) //maryPinAssign(100~119?) - { - pin = pin - 100; - LPC_GPIO[mary_pinAssign[pin * 2]]->IE |= (1 << mary_pinAssign[pin * 2 + 1]); - } - - return; -} - -void GPIOIntDisable(int pin) { - if (pin >= 0 && pin < 22) //arduinoPinAssign(0~21) - { - - LPC_GPIO[arduino_pinAssign[pin * 2]]->IE &= ~((1 << arduino_pinAssign[pin * 2 + 1])); - } else if (pin >= 22 && pin < 100) {//(22~99:reserved) - } else if (pin >= 100 && pin < 200) //maryPinAssign(100~119?) - { - pin = pin - 100; - LPC_GPIO[mary_pinAssign[pin * 2]]->IE &= ~((1 << mary_pinAssign[pin * 2 + 1])); - } - - return; -} - -int GPIOIntStatus(int pin) { - int regVal = 0; - - if (pin >= 0 && pin < 22) //arduinoPinAssign(0~21) - { - if (LPC_GPIO[arduino_pinAssign[pin * 2]]->MIS - & (1 << arduino_pinAssign[pin * 2 + 1])) { - regVal = 1; - } - } else if (pin >= 22 && pin < 100) { //(22~99:reserved) - } else if (pin >= 100 && pin < 200) //maryPinAssign(100~119?) - { - pin = pin - 100; - - if (LPC_GPIO[mary_pinAssign[pin * 2]]->MIS - & (1 << mary_pinAssign[pin * 2 + 1])) { - regVal = 1; - } - } - - return regVal; -} - -void GPIOIntClear(int pin) { - if (pin >= 0 && pin < 22) //arduinoPinAssign(0~21) - { - - LPC_GPIO[arduino_pinAssign[pin * 2]]->IC |= (1 << arduino_pinAssign[pin * 2 + 1]); - } else if (pin >= 22 && pin < 100) { //(22~99:reserved) - - } else if (pin >= 100 && pin < 200) //maryPinAssign(100~119?) - { - pin = pin - 100; - LPC_GPIO[mary_pinAssign[pin * 2]]->IC |= (1 << mary_pinAssign[pin * 2 + 1]); - } - - return; -} +#include "gpio.h"
+
+
+// IOCON:Cortex-M0 depend Settings
+//#ifdef __NXP_LPC1114
+#define PORT_BIT_COUNT 12 // up to 12 I/O lines per port
+#define PORT_COUNT 4 // up to 4 ports
+
+const uint8_t IOCON_LUT[PORT_COUNT][PORT_BIT_COUNT] = {
+ { 0x0C, 0x10, 0x1C, 0x2C, 0x30, 0x34, 0x4C, 0x50, 0x60, 0x64, 0x68, 0x74 },
+ { 0x78, 0x7C, 0x80, 0x90, 0x94, 0xA0, 0xA4, 0xA8, 0x14, 0x38, 0x6C, 0x98 },
+ { 0x08, 0x28, 0x5C, 0x8C, 0x40, 0x44, 0x00, 0x20, 0x24, 0x54, 0x58, 0x70 },
+ { 0x84, 0x88, 0x9C, 0xAC, 0x3C, 0x48 }
+};
+
+#define IOCONAddress(port,bit) ((volatile uint16_t * const) (LPC_IOCON_BASE + IOCON_LUT[port][bit]))
+#define SetIOCON(port, bit, ioconmask, ioconbits) \
+ *IOCONAddress((port),(bit)) = (*IOCONAddress((port),(bit)) & ~(ioconmask)) | (ioconbits)
+
+typedef enum {
+ GPIO_DIR_INPUT = 0,
+ GPIO_DIR_OUTPUT = 1,
+ IOCON_MODE_MASK = (3<<3),
+ IOCON_MODE_PULLUP = (2<<3),
+ IOCON_MODE_PULLDOWN = (1<<3),
+ IOCON_MODE_REPEATER = (3<<3),
+ IOCON_MODE_INACTIVE = (0<<3),
+ IOCON_FUNC_MASK = 7,
+ IOCON_FUNC_0 = 0,
+ IOCON_FUNC_1 = 1,
+ IOCON_FUNC_2 = 2,
+ IOCON_FUNC_3 = 3,
+ IOCON_FUNC_4 = 4,
+ IOCON_FUNC_5 = 5,
+ IOCON_FUNC_6 = 6,
+ IOCON_FUNC_7 = 7,
+ IOCON_HYS_MASK = (1<<5),
+ IOCON_HYS_ENABLE = (1<<5),
+ IOCON_HYS_DISABLE = (0<<5),
+ IOCON_ADMODE_MASK = (1<<7),
+ IOCON_ADMODE_ANALOG = (0<<7),
+ IOCON_ADMODE_DIGITAL = (1<<7)
+} IOCON_BITFIELD_ENUM;
+
+//#endif
+
+/* =======================================
+* Macros and functions for Defining MARY's GPIO Assign
+*
+* CN1_7,8 : (PIO1_2,PIO1_1)
+* should be C17,C18
+*
+* CN2_1...8 : (PIO1_4,PIO1_11,PIO1_7,PIO1_5,PIO3_2,PIO2_0,PIO1_6,PIO0_1)
+* should be C21,C22,C23,C24,C25,C26,C27,C28
+*
+* CN3_1...8 : (PIO1_8,PIO0_3,PIO0_2,PIO3_4,PIO0_4,PIO3_5,PIO0_5,PIO1_7)
+* should be C31,C32,C33,C34,C35,C36,C37,C38
+*
+* CN4_1...7 : (PIO1_9,PIO1_10,PIO0_6,PIO0_11,PIO0_8,PIO1_0,PIO0_9)
+* should be C41,C42,C43,C44,C45,C46,C47
+*
+* see also mary_pinAssign[...] in "gpio.h"
+* =======================================
+*/
+
+
+void pinMode(int pin,pinModeState state)
+{
+ if(pin < 22) //arduinoPinAssign(0~21)
+ {
+ //IOCON settings use as GPIO
+ if((arduino_pinAssign[pin * 2]) == 0)//PIO0_X
+ {
+ switch(arduino_pinAssign[pin * 2 + 1])
+ {
+ case 11: //P0_11
+ SetIOCON(arduino_pinAssign[pin * 2], arduino_pinAssign[pin * 2 + 1], IOCON_FUNC_MASK, IOCON_FUNC_1);
+ break;
+ default: //P0_X
+ SetIOCON(arduino_pinAssign[pin * 2], arduino_pinAssign[pin * 2 + 1], IOCON_FUNC_MASK, IOCON_FUNC_0);
+ break;
+ }
+ }else if((arduino_pinAssign[pin * 2]) == 1)//PIO1_X
+ {
+ switch(arduino_pinAssign[pin * 2 + 1])
+ {
+ case _BIT0:
+ case _BIT1:
+ case _BIT2:
+ case _BIT3:
+ SetIOCON(arduino_pinAssign[pin * 2], arduino_pinAssign[pin * 2 + 1], IOCON_FUNC_MASK, IOCON_FUNC_1);
+ break;
+ default:
+ SetIOCON(arduino_pinAssign[pin * 2], arduino_pinAssign[pin * 2 + 1], IOCON_FUNC_MASK, IOCON_FUNC_0);
+ break;
+ }
+ }else //PIO2_X
+ {
+ SetIOCON(arduino_pinAssign[pin * 2], arduino_pinAssign[pin * 2 + 1], IOCON_FUNC_MASK, IOCON_FUNC_0);
+ }
+
+ if(state == OUTPUT) //OUTPUT
+ {
+ LPC_GPIO[ arduino_pinAssign[pin * 2] ]->DIR |= (1 << arduino_pinAssign[pin * 2 + 1]);
+
+ }else //INPUT
+ {
+ LPC_GPIO[ arduino_pinAssign[pin * 2] ]->DIR &= ~((1 << arduino_pinAssign[pin * 2 + 1]));
+ }
+ return;
+ }
+
+ if(pin < 100) return; //(20~99:reserved)
+
+ if(pin < 200) //maryPinAssign(100~119?)
+ {
+ pin = pin - 100;
+ //IOCON settings use as GPIO
+ if((mary_pinAssign[pin * 2]) == 0)//PIO0_X
+ {
+ switch(mary_pinAssign[pin * 2 + 1])
+ {
+ case 11: //P0_11
+ case 10: //P0_10
+ SetIOCON(mary_pinAssign[pin * 2], mary_pinAssign[pin * 2 + 1], IOCON_FUNC_MASK, IOCON_FUNC_1);
+ break;
+ default: //P0_X
+ SetIOCON(mary_pinAssign[pin * 2], mary_pinAssign[pin * 2 + 1], IOCON_FUNC_MASK, IOCON_FUNC_0);
+ break;
+ }
+ }else if((mary_pinAssign[pin * 2]) == 1)//PIO1_X
+ {
+ switch(mary_pinAssign[pin * 2 + 1])
+ {
+ case _BIT0:
+ case _BIT1:
+ case _BIT2:
+ case _BIT3:
+ SetIOCON(mary_pinAssign[pin * 2], mary_pinAssign[pin * 2 + 1], IOCON_FUNC_MASK, IOCON_FUNC_1);
+ break;
+ default:
+ SetIOCON(mary_pinAssign[pin * 2], mary_pinAssign[pin * 2 + 1], IOCON_FUNC_MASK, IOCON_FUNC_0);
+ break;
+ }
+ }
+ if(state == OUTPUT) //OUTPUT
+ {
+ LPC_GPIO[ mary_pinAssign[pin * 2] ]->DIR |= (1 << mary_pinAssign[pin * 2 + 1]);
+ }else //INPUT
+ {
+ LPC_GPIO[ mary_pinAssign[pin * 2] ]->DIR &= ~((1 << mary_pinAssign[pin * 2 + 1]));
+ }
+ }
+ return;
+ }
+
+void digitalWrite(int pin,digitalWriteState state)
+{
+ if(pin < 22) //arduinoPinAssign(0~21)
+ {
+ if(state == HIGH) //HIGH
+ {
+ if(LPC_GPIO[ arduino_pinAssign[pin * 2] ]->DIR & 1<<arduino_pinAssign[pin * 2 + 1])//pin is output
+ {
+ LPC_GPIO[ arduino_pinAssign[pin * 2] ]->MASKED_ACCESS[ (1 << arduino_pinAssign[pin * 2 + 1]) ] = (1 << arduino_pinAssign[pin * 2 + 1]);
+ }else//pin is input
+ {
+ SetIOCON(arduino_pinAssign[pin * 2], arduino_pinAssign[pin * 2 + 1], IOCON_MODE_MASK, IOCON_MODE_PULLUP);
+ }
+ }else //LOW
+ {
+ if(LPC_GPIO[ arduino_pinAssign[pin * 2] ]->DIR & 1<<arduino_pinAssign[pin * 2 + 1])//pin is output
+ {
+ LPC_GPIO[ arduino_pinAssign[pin * 2] ]->MASKED_ACCESS[ (1 << arduino_pinAssign[pin * 2 + 1]) ] &= ~((1 << arduino_pinAssign[pin * 2 + 1]));
+ }else // pin is input
+ {
+ SetIOCON(arduino_pinAssign[pin * 2], arduino_pinAssign[pin * 2 + 1], IOCON_MODE_MASK, IOCON_MODE_INACTIVE);
+ }
+ }
+
+ return;
+ }
+
+
+ if(pin < 100) return; //arduinoPinAssign(20~99:reserved)
+
+ if(pin < 200) //maryPinAssign(100~119?)
+ {
+ pin = pin - 100;
+ if(state == HIGH) //HIGH
+ {
+ if(LPC_GPIO[ mary_pinAssign[pin * 2] ]->DIR & 1<<mary_pinAssign[pin * 2 + 1])//pin is output
+ {
+ LPC_GPIO[ mary_pinAssign[pin * 2] ]->MASKED_ACCESS[ (1 << mary_pinAssign[pin * 2 + 1]) ] = (1 << mary_pinAssign[pin * 2 + 1]);
+ }else//pin is input
+ {
+ SetIOCON(mary_pinAssign[pin * 2], mary_pinAssign[pin * 2 + 1], IOCON_MODE_MASK, IOCON_MODE_PULLUP);
+ }
+ }else //LOW
+ {
+ if(LPC_GPIO[ mary_pinAssign[pin * 2] ]->DIR & 1<<mary_pinAssign[pin * 2 + 1])//pin is output
+ {
+ LPC_GPIO[ mary_pinAssign[pin * 2] ]->MASKED_ACCESS[ (1 << mary_pinAssign[pin * 2 + 1]) ] &= ~((1 << mary_pinAssign[pin * 2 + 1]));
+ }else // pin is input
+ {
+ SetIOCON(mary_pinAssign[pin * 2], mary_pinAssign[pin * 2 + 1], IOCON_MODE_MASK, IOCON_MODE_INACTIVE);
+ }
+ }
+ }
+ return;
+ }
+
+int digitalRead(int pin)
+{
+ volatile int readValue;
+ if(pin < 22) //arduinoPinAssign(0~21)
+ {
+ readValue = (LPC_GPIO[ arduino_pinAssign[pin * 2] ]->MASKED_ACCESS[ (1 << arduino_pinAssign[pin * 2 + 1]) ])? 1 : 0;
+ return readValue;
+ }
+
+ if(pin < 100) return 0; //(20~99:reserved)
+
+ if(pin < 200) //maryPinAssign(100~199?)
+ {
+ pin = pin - 100;
+ readValue = (LPC_GPIO[ mary_pinAssign[pin * 2] ]->MASKED_ACCESS[ (1 << mary_pinAssign[pin * 2 + 1]) ])? 1 : 0;
+ return readValue;
+ }
+ return 0;
+}
+
+/*****************************************************************************
+ ** Function name: GPIOSetInterrupt
+ **
+ ** Descriptions: Set interrupt sense, event, etc.
+ ** edge or level, 0 is edge, 1 is level
+ ** single or double edge, 0 is single, 1 is double
+ ** active high or low, etc.
+ **
+ ** parameters: pin num, bit position, sense, single/doube, polarity
+ ** Returned value: None
+ **
+ *****************************************************************************/
+void GPIOSetInterrupt(int pin, int sense, int single, int event) {
+ if (pin >= 0 && pin < 22) //arduinoPinAssign(0~21)
+ {
+ if (sense == 0) {
+ LPC_GPIO[arduino_pinAssign[pin * 2]]->IS &= ~((1 << arduino_pinAssign[pin * 2 + 1]));
+ /* single or double only applies when sense is 0(edge trigger). */
+ if (single == 0)
+ LPC_GPIO[arduino_pinAssign[pin * 2]]->IBE
+ &= ~((1 << arduino_pinAssign[pin * 2 + 1]));
+ else
+ LPC_GPIO[arduino_pinAssign[pin * 2]]->IBE
+ |= ((1 << arduino_pinAssign[pin * 2 + 1]));
+ } else
+ LPC_GPIO[arduino_pinAssign[pin * 2]]->IS |= ((1 << arduino_pinAssign[pin * 2 + 1]));
+
+ if (event == 0)
+ LPC_GPIO[arduino_pinAssign[pin * 2]]->IEV
+ &= ~((1 << arduino_pinAssign[pin * 2 + 1]));
+ else
+ LPC_GPIO[arduino_pinAssign[pin * 2]]->IEV |= ((1 << arduino_pinAssign[pin * 2 + 1]));
+ } else if (pin >= 22 && pin < 100) {
+ //(22~99:reserved)
+ } else if (pin >= 100 && pin < 200) //maryPinAssign(100~119?)
+ {
+ pin = pin - 100;
+ if (sense == 0) {
+ LPC_GPIO[mary_pinAssign[pin * 2]]->IS &= ~((1 << mary_pinAssign[pin * 2 + 1]));
+ /* single or double only applies when sense is 0(edge trigger). */
+ if (single == 0)
+ LPC_GPIO[mary_pinAssign[pin * 2]]->IBE &= ~((1 << mary_pinAssign[pin * 2 + 1]));
+ else
+ LPC_GPIO[mary_pinAssign[pin * 2]]->IBE |= ((1 << mary_pinAssign[pin * 2 + 1]));
+ } else
+ LPC_GPIO[mary_pinAssign[pin * 2]]->IS |= ((1 << mary_pinAssign[pin * 2 + 1]));
+
+ if (event == 0)
+ LPC_GPIO[mary_pinAssign[pin * 2]]->IEV &= ~((1 << mary_pinAssign[pin * 2 + 1]));
+ else
+ LPC_GPIO[mary_pinAssign[pin * 2]]->IEV |= ((1 << mary_pinAssign[pin * 2 + 1]));
+ }
+
+ return;
+}
+
+void GPIOIntEnable(int pin) {
+ if (pin >= 0 && pin < 22) //arduinoPinAssign(0~21)
+ {
+
+ LPC_GPIO[arduino_pinAssign[pin * 2]]->IE |= (1 << arduino_pinAssign[pin * 2 + 1]);
+ } else if (pin >= 22 && pin < 100) { //(20~99:reserved)
+ } else if (pin >= 100 && pin < 200) //maryPinAssign(100~119?)
+ {
+ pin = pin - 100;
+ LPC_GPIO[mary_pinAssign[pin * 2]]->IE |= (1 << mary_pinAssign[pin * 2 + 1]);
+ }
+
+ return;
+}
+
+void GPIOIntDisable(int pin) {
+ if (pin >= 0 && pin < 22) //arduinoPinAssign(0~21)
+ {
+
+ LPC_GPIO[arduino_pinAssign[pin * 2]]->IE &= ~((1 << arduino_pinAssign[pin * 2 + 1]));
+ } else if (pin >= 22 && pin < 100) {//(22~99:reserved)
+ } else if (pin >= 100 && pin < 200) //maryPinAssign(100~119?)
+ {
+ pin = pin - 100;
+ LPC_GPIO[mary_pinAssign[pin * 2]]->IE &= ~((1 << mary_pinAssign[pin * 2 + 1]));
+ }
+
+ return;
+}
+
+int GPIOIntStatus(int pin) {
+ int regVal = 0;
+
+ if (pin >= 0 && pin < 22) //arduinoPinAssign(0~21)
+ {
+ if (LPC_GPIO[arduino_pinAssign[pin * 2]]->MIS
+ & (1 << arduino_pinAssign[pin * 2 + 1])) {
+ regVal = 1;
+ }
+ } else if (pin >= 22 && pin < 100) { //(22~99:reserved)
+ } else if (pin >= 100 && pin < 200) //maryPinAssign(100~119?)
+ {
+ pin = pin - 100;
+
+ if (LPC_GPIO[mary_pinAssign[pin * 2]]->MIS
+ & (1 << mary_pinAssign[pin * 2 + 1])) {
+ regVal = 1;
+ }
+ }
+
+ return regVal;
+}
+
+void GPIOIntClear(int pin) {
+ if (pin >= 0 && pin < 22) //arduinoPinAssign(0~21)
+ {
+
+ LPC_GPIO[arduino_pinAssign[pin * 2]]->IC |= (1 << arduino_pinAssign[pin * 2 + 1]);
+ } else if (pin >= 22 && pin < 100) { //(22~99:reserved)
+
+ } else if (pin >= 100 && pin < 200) //maryPinAssign(100~119?)
+ {
+ pin = pin - 100;
+ LPC_GPIO[mary_pinAssign[pin * 2]]->IC |= (1 << mary_pinAssign[pin * 2 + 1]);
+ }
+
+ return;
+}
diff --git a/src/core/gpio_int.cpp b/src/core/gpio_int.cpp index 27e16c6..d2477e3 100755 --- a/src/core/gpio_int.cpp +++ b/src/core/gpio_int.cpp @@ -1,153 +1,153 @@ -#include "gpio.h" - -#define EXTERNAL_NUM_INTERRUPTS 22 -volatile static USER_GPIO_FUNC intFunc[EXTERNAL_NUM_INTERRUPTS]; - -void attachInterrupt(int pin, USER_GPIO_FUNC func, digitalWriteState mode) { - pinMode(pin, INPUT); - - switch (mode) { - case LOW: - GPIOSetInterrupt(pin, 1, 0, 0); - break; - case HIGH: - GPIOSetInterrupt(pin, 1, 0, 1); - break; - case CHANGE: - GPIOSetInterrupt(pin, 0, 1, 0); - break; - case RISING: - GPIOSetInterrupt(pin, 0, 0, 1); - break; - case FALLING: - GPIOSetInterrupt(pin, 0, 0, 0); - break; - default: - break; - } - - - if (pin >= 0 && pin < 22) //arduinoPinAssign(0~22) - { - intFunc[pin] = func; - - switch (arduino_pinAssign[pin * 2]) { - case 0: - NVIC_EnableIRQ(EINT0_IRQn); - break; - case 1: - NVIC_EnableIRQ(EINT1_IRQn); - break; - case 2: - NVIC_EnableIRQ(EINT2_IRQn); - break; - case 3: - NVIC_EnableIRQ(EINT3_IRQn); - break; - } - } else if (pin >= 22 && pin < 100) { - //(22~99:reserved) - } else if (pin >= 100 && pin < 200) //maryPinAssign(100~119?) - { - pin = pin - 100; - intFunc[pin] = func; - - switch (mary_pinAssign[pin * 2]) { - case 0: - NVIC_EnableIRQ(EINT0_IRQn); - break; - case 1: - NVIC_EnableIRQ(EINT1_IRQn); - break; - case 2: - NVIC_EnableIRQ(EINT2_IRQn); - break; - case 3: - NVIC_EnableIRQ(EINT3_IRQn); - break; - } - } - - GPIOIntEnable(pin); - - return; -} - -void detachInterrupt(int pin) { - GPIOIntDisable(pin); - - if (pin >= 0 && pin < 22) //arduinoPinAssign(0~22) - { - intFunc[pin] = 0; - if (LPC_GPIO[arduino_pinAssign[pin * 2]]->IE == 0) { - switch (arduino_pinAssign[pin * 2]) { - case 0: - NVIC_DisableIRQ(EINT0_IRQn); - break; - case 1: - NVIC_DisableIRQ(EINT1_IRQn); - break; - case 2: - NVIC_DisableIRQ(EINT2_IRQn); - break; - case 3: - NVIC_DisableIRQ(EINT3_IRQn); - break; - } - } - } - else if (pin >= 22 && pin < 100) {//(22~99:reserved) - } else if (pin >= 100 && pin < 200) //maryPinAssign(100~119?) - { - pin = pin - 100; - intFunc[pin] = 0; - if (LPC_GPIO[mary_pinAssign[pin * 2]]->IE == 0) { - switch (mary_pinAssign[pin * 2]) { - case 0: - NVIC_DisableIRQ(EINT0_IRQn); - break; - case 1: - NVIC_DisableIRQ(EINT1_IRQn); - break; - case 2: - NVIC_DisableIRQ(EINT2_IRQn); - break; - case 3: - NVIC_DisableIRQ(EINT3_IRQn); - break; - } - } - } - return; -} - -void GPIO_IRQHandler(void) { - for (int i = 0; i < EXTERNAL_NUM_INTERRUPTS; i++) { - if (GPIOIntStatus(i)) { - GPIOIntClear(i); - - if (intFunc[i]) - intFunc[i](); - } - } -} - -void PIOINT0_IRQHandler(void) { - GPIO_IRQHandler(); - return; -} - -void PIOINT1_IRQHandler(void) { - GPIO_IRQHandler(); - return; -} - -void PIOINT2_IRQHandler(void) { - GPIO_IRQHandler(); - return; -} - -void PIOINT3_IRQHandler(void) { - GPIO_IRQHandler(); - return; -} +#include "gpio.h"
+
+#define EXTERNAL_NUM_INTERRUPTS 22
+volatile static USER_GPIO_FUNC intFunc[EXTERNAL_NUM_INTERRUPTS];
+
+void attachInterrupt(int pin, USER_GPIO_FUNC func, digitalWriteState mode) {
+ pinMode(pin, INPUT);
+
+ switch (mode) {
+ case LOW:
+ GPIOSetInterrupt(pin, 1, 0, 0);
+ break;
+ case HIGH:
+ GPIOSetInterrupt(pin, 1, 0, 1);
+ break;
+ case CHANGE:
+ GPIOSetInterrupt(pin, 0, 1, 0);
+ break;
+ case RISING:
+ GPIOSetInterrupt(pin, 0, 0, 1);
+ break;
+ case FALLING:
+ GPIOSetInterrupt(pin, 0, 0, 0);
+ break;
+ default:
+ break;
+ }
+
+
+ if (pin >= 0 && pin < 22) //arduinoPinAssign(0~22)
+ {
+ intFunc[pin] = func;
+
+ switch (arduino_pinAssign[pin * 2]) {
+ case 0:
+ NVIC_EnableIRQ(EINT0_IRQn);
+ break;
+ case 1:
+ NVIC_EnableIRQ(EINT1_IRQn);
+ break;
+ case 2:
+ NVIC_EnableIRQ(EINT2_IRQn);
+ break;
+ case 3:
+ NVIC_EnableIRQ(EINT3_IRQn);
+ break;
+ }
+ } else if (pin >= 22 && pin < 100) {
+ //(22~99:reserved)
+ } else if (pin >= 100 && pin < 200) //maryPinAssign(100~119?)
+ {
+ int _pin = pin - 100;
+ intFunc[_pin] = func;
+
+ switch (mary_pinAssign[_pin * 2]) {
+ case 0:
+ NVIC_EnableIRQ(EINT0_IRQn);
+ break;
+ case 1:
+ NVIC_EnableIRQ(EINT1_IRQn);
+ break;
+ case 2:
+ NVIC_EnableIRQ(EINT2_IRQn);
+ break;
+ case 3:
+ NVIC_EnableIRQ(EINT3_IRQn);
+ break;
+ }
+ }
+
+ GPIOIntEnable(pin);
+
+ return;
+}
+
+void detachInterrupt(int pin) {
+ GPIOIntDisable(pin);
+
+ if (pin >= 0 && pin < 22) //arduinoPinAssign(0~22)
+ {
+ intFunc[pin] = 0;
+ if (LPC_GPIO[arduino_pinAssign[pin * 2]]->IE == 0) {
+ switch (arduino_pinAssign[pin * 2]) {
+ case 0:
+ NVIC_DisableIRQ(EINT0_IRQn);
+ break;
+ case 1:
+ NVIC_DisableIRQ(EINT1_IRQn);
+ break;
+ case 2:
+ NVIC_DisableIRQ(EINT2_IRQn);
+ break;
+ case 3:
+ NVIC_DisableIRQ(EINT3_IRQn);
+ break;
+ }
+ }
+ }
+ else if (pin >= 22 && pin < 100) {//(22~99:reserved)
+ } else if (pin >= 100 && pin < 200) //maryPinAssign(100~119?)
+ {
+ pin = pin - 100;
+ intFunc[pin] = 0;
+ if (LPC_GPIO[mary_pinAssign[pin * 2]]->IE == 0) {
+ switch (mary_pinAssign[pin * 2]) {
+ case 0:
+ NVIC_DisableIRQ(EINT0_IRQn);
+ break;
+ case 1:
+ NVIC_DisableIRQ(EINT1_IRQn);
+ break;
+ case 2:
+ NVIC_DisableIRQ(EINT2_IRQn);
+ break;
+ case 3:
+ NVIC_DisableIRQ(EINT3_IRQn);
+ break;
+ }
+ }
+ }
+ return;
+}
+
+void GPIO_IRQHandler(void) {
+ for (int i = 0; i < EXTERNAL_NUM_INTERRUPTS; i++) {
+ if (GPIOIntStatus(i)) {
+ GPIOIntClear(i);
+
+ if (intFunc[i])
+ intFunc[i]();
+ }
+ }
+}
+
+void PIOINT0_IRQHandler(void) {
+ GPIO_IRQHandler();
+ return;
+}
+
+void PIOINT1_IRQHandler(void) {
+ GPIO_IRQHandler();
+ return;
+}
+
+void PIOINT2_IRQHandler(void) {
+ GPIO_IRQHandler();
+ return;
+}
+
+void PIOINT3_IRQHandler(void) {
+ GPIO_IRQHandler();
+ return;
+}
|
