diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt new file mode 100644 index 0000000..067e9a7 --- /dev/null +++ b/src/CMakeLists.txt @@ -0,0 +1,34 @@ +add_library(Tiny4kOLED INTERFACE) + +target_compile_definitions(Tiny4kOLED INTERFACE + RP2040 +) + +target_sources(Tiny4kOLED INTERFACE + ${CMAKE_CURRENT_LIST_DIR}/font6x8caps.h + ${CMAKE_CURRENT_LIST_DIR}/font6x8digits.h + ${CMAKE_CURRENT_LIST_DIR}/font6x8.h + ${CMAKE_CURRENT_LIST_DIR}/font6x8p.h + ${CMAKE_CURRENT_LIST_DIR}/font8x16caps.h + ${CMAKE_CURRENT_LIST_DIR}/font8x16capsp.h + ${CMAKE_CURRENT_LIST_DIR}/font8x16digits.h + ${CMAKE_CURRENT_LIST_DIR}/font8x16.h + ${CMAKE_CURRENT_LIST_DIR}/font8x16p.h + ${CMAKE_CURRENT_LIST_DIR}/Tiny4kOLED_bitbang.h + ${CMAKE_CURRENT_LIST_DIR}/Tiny4kOLED_common.h + ${CMAKE_CURRENT_LIST_DIR}/Tiny4kOLED.cpp + ${CMAKE_CURRENT_LIST_DIR}/Tiny4kOLED.h + ${CMAKE_CURRENT_LIST_DIR}/Tiny4kOLEDprintless.h + ${CMAKE_CURRENT_LIST_DIR}/Tiny4kOLED_rp2040.h + ${CMAKE_CURRENT_LIST_DIR}/Tiny4kOLED_tiny-i2c.h + ${CMAKE_CURRENT_LIST_DIR}/Tiny4kOLED_TinyWireM.h + ${CMAKE_CURRENT_LIST_DIR}/Tiny4kOLED_Wire.h +) + +target_include_directories(Tiny4kOLED INTERFACE + ${CMAKE_CURRENT_LIST_DIR} +) + +target_link_libraries(Tiny4kOLED INTERFACE + hardware_i2c +) diff --git a/src/Tiny4kOLED.h b/src/Tiny4kOLED.h index 7fb4ef3..bbf4b9c 100644 --- a/src/Tiny4kOLED.h +++ b/src/Tiny4kOLED.h @@ -14,6 +14,8 @@ #include "Tiny4kOLED_TinyWireM.h" #elif defined(TinyI2CMaster_h) #include "Tiny4kOLED_tiny-i2c.h" +#elif defined(RP2040) +#include "Tiny4kOLED_rp2040.h" #else #include #include "Tiny4kOLED_Wire.h" diff --git a/src/Tiny4kOLED_common.h b/src/Tiny4kOLED_common.h index 0dc7819..9f1e4d3 100644 --- a/src/Tiny4kOLED_common.h +++ b/src/Tiny4kOLED_common.h @@ -6,7 +6,9 @@ * */ #include +#ifndef RP2040 #include +#endif #ifndef TINY4KOLEDCOMMON_H #define TINY4KOLEDCOMMON_H @@ -74,18 +76,30 @@ union DCUnicodeCodepoint { // Digistump uses // # define F(s) ((fstr_t*)PSTR(s)) +#ifdef RP2040 +#include +#include + +#define DATACUTE_F_MACRO_T const char +using byte = uint8_t; +#define pgm_read_byte(addr) *reinterpret_cast(addr) +#define pgm_read_word(addr) *reinterpret_cast(addr) +#define PGM_P const char * -#ifndef DATACUTE_F_MACRO_T -#ifdef ARDUINO_AVR_DIGISPARK -#define DATACUTE_F_MACRO_T fstr_t #else -#define DATACUTE_F_MACRO_T const __FlashStringHelper -#endif -#endif -#ifndef FPSTR -#define FPSTR(pstr_pointer) (reinterpret_cast(pstr_pointer)) -#endif +# ifndef DATACUTE_F_MACRO_T +# ifdef ARDUINO_AVR_DIGISPARK +# define DATACUTE_F_MACRO_T fstr_t +# else +# define DATACUTE_F_MACRO_T const __FlashStringHelper +# endif +# endif + +# ifndef FPSTR +# define FPSTR(pstr_pointer) (reinterpret_cast(pstr_pointer)) +# endif +#endif // RP2040 // ---------------------------------------------------------------------------- @@ -216,14 +230,28 @@ class SSD1306Device { }; -class SSD1306PrintDevice: public Print, public SSD1306Device { +#ifdef RP2040 +class SSD1306PrintDevice : public SSD1306Device +#else +class SSD1306PrintDevice : public Print, public SSD1306Device +#endif +{ public: - SSD1306PrintDevice(void (*wireBeginFunc)(void), bool (*wireBeginTransmissionFunc)(void), bool (*wireWriteFunc)(uint8_t byte), uint8_t (*wireEndTransmissionFunc)(void)) : - SSD1306Device(wireBeginFunc, wireBeginTransmissionFunc, wireWriteFunc, wireEndTransmissionFunc) {}; - size_t write(byte c) { - return SSD1306Device::write(c); - }; + SSD1306PrintDevice(void (*wireBeginFunc)(void), bool (*wireBeginTransmissionFunc)(void), bool (*wireWriteFunc)(uint8_t byte), uint8_t (*wireEndTransmissionFunc)(void)) : + SSD1306Device(wireBeginFunc, wireBeginTransmissionFunc, wireWriteFunc, wireEndTransmissionFunc) {} +#ifdef RP2040 + void print(const char *text) + { + while (*text) { + write(*text++); + } + } + void print(int val) { print(std::to_string(val).c_str()); } + void print(double val) { print(std::to_string(val).c_str()); } +#else + size_t write(byte c) override { return SSD1306Device::write(c); } using Print::write; +#endif }; // ---------------------------------------------------------------------------- diff --git a/src/Tiny4kOLED_rp2040.h b/src/Tiny4kOLED_rp2040.h new file mode 100644 index 0000000..c2217ab --- /dev/null +++ b/src/Tiny4kOLED_rp2040.h @@ -0,0 +1,68 @@ +/* + * Tiny4kOLED - Drivers for SSD1306 controlled dot matrix OLED/PLED 128x32 displays + * + * Copyright (c) 2024 BogDan Vatra + * + * This file adds support for the I2C implementation for RP2040 + * + */ +#ifndef TINY4KOLED_RP2040 +#define TINY4KOLED_RP2040 + +#include "Tiny4kOLED_common.h" +#include +#include +#include + +#ifndef SSD1306_I2C_CLK +#define SSD1306_I2C_CLK 400 +#endif + +#ifndef SSD1306_I2C_SDA +#warning "SSD1306_I2C_SDA not defined, defaulting to PICO_DEFAULT_I2C_SCL_PIN" +#define SSD1306_I2C_SDA PICO_DEFAULT_I2C_SDA_PIN +#endif + +#ifndef SSD1306_I2C_SCL +#warning "SSD1306_I2C_SCL not defined, defaulting to PICO_DEFAULT_I2C_SCL_PIN" +#define SSD1306_I2C_SCL PICO_DEFAULT_I2C_SCL_PIN +#endif + +#define SSD1306_I2C_ADDR _u(0x3C) + +static std::vector i2c_buffer; +static bool datacute_write_rp2040(uint8_t byte) { + i2c_buffer.push_back(byte); + return true; +} + +static uint8_t datacute_endTransmission_rp2040(void) +{ + if (i2c_buffer.empty()) + return 0; + auto res = i2c_write_blocking(i2c_default, SSD1306_I2C_ADDR, i2c_buffer.data(), i2c_buffer.size(), false); + return res == int(i2c_buffer.size()) ? 0 : 1; +} + +static bool tiny4koled_beginTransmission_rp2040(void) +{ + i2c_buffer.clear(); + return true; +} + +static void tiny4koled_begin_rp2040(void) { + i2c_init(i2c_default, SSD1306_I2C_CLK * 1000); + gpio_set_function(SSD1306_I2C_SDA, GPIO_FUNC_I2C); + gpio_set_function(SSD1306_I2C_SCL, GPIO_FUNC_I2C); + gpio_pull_up(SSD1306_I2C_SDA); + gpio_pull_up(SSD1306_I2C_SCL); + i2c_buffer.reserve(32); +} + +#ifndef TINY4KOLED_NO_PRINT +SSD1306PrintDevice oled(&tiny4koled_begin_rp2040, &tiny4koled_beginTransmission_rp2040, &datacute_write_rp2040, &datacute_endTransmission_rp2040); +#else +SSD1306Device oled(&tiny4koled_begin_rp2040, &tiny4koled_beginTransmission_rp2040, &datacute_write_rp2040, &datacute_endTransmission_rp2040); +#endif + +#endif // TINY4KOLED_RP2040_RP2040 diff --git a/src/font6x8.h b/src/font6x8.h index a1ae5ec..5a9c823 100644 --- a/src/font6x8.h +++ b/src/font6x8.h @@ -17,7 +17,11 @@ // ---------------------------------------------------------------------------- +#ifndef RP2040 #include +#else +#define PROGMEM +#endif // ---------------------------------------------------------------------------- diff --git a/src/font6x8caps.h b/src/font6x8caps.h index bd721be..d9a454f 100644 --- a/src/font6x8caps.h +++ b/src/font6x8caps.h @@ -17,7 +17,11 @@ // ---------------------------------------------------------------------------- +#ifndef RP2040 #include +#else +#define PROGMEM +#endif // ---------------------------------------------------------------------------- diff --git a/src/font6x8digits.h b/src/font6x8digits.h index 6b0727b..c05b5e9 100644 --- a/src/font6x8digits.h +++ b/src/font6x8digits.h @@ -17,7 +17,11 @@ // ---------------------------------------------------------------------------- +#ifndef RP2040 #include +#else +#define PROGMEM +#endif // ---------------------------------------------------------------------------- diff --git a/src/font6x8p.h b/src/font6x8p.h index d8608db..1917b7b 100644 --- a/src/font6x8p.h +++ b/src/font6x8p.h @@ -17,7 +17,11 @@ // ---------------------------------------------------------------------------- +#ifndef RP2040 #include +#else +#define PROGMEM +#endif // ---------------------------------------------------------------------------- diff --git a/src/font8x16.h b/src/font8x16.h index b8710ce..e87bc34 100644 --- a/src/font8x16.h +++ b/src/font8x16.h @@ -17,7 +17,11 @@ // ---------------------------------------------------------------------------- +#ifndef RP2040 #include +#else +#define PROGMEM +#endif // ---------------------------------------------------------------------------- diff --git a/src/font8x16caps.h b/src/font8x16caps.h index a8e584c..16aa711 100644 --- a/src/font8x16caps.h +++ b/src/font8x16caps.h @@ -17,7 +17,11 @@ // ---------------------------------------------------------------------------- +#ifndef RP2040 #include +#else +#define PROGMEM +#endif // ---------------------------------------------------------------------------- diff --git a/src/font8x16capsp.h b/src/font8x16capsp.h index 83fb3ef..3e06ec4 100644 --- a/src/font8x16capsp.h +++ b/src/font8x16capsp.h @@ -17,7 +17,11 @@ // ---------------------------------------------------------------------------- +#ifndef RP2040 #include +#else +#define PROGMEM +#endif // ---------------------------------------------------------------------------- diff --git a/src/font8x16digits.h b/src/font8x16digits.h index db7e096..34fa5f3 100644 --- a/src/font8x16digits.h +++ b/src/font8x16digits.h @@ -17,7 +17,11 @@ // ---------------------------------------------------------------------------- +#ifndef RP2040 #include +#else +#define PROGMEM +#endif // ---------------------------------------------------------------------------- diff --git a/src/font8x16p.h b/src/font8x16p.h index 3c4cabe..1d8dd64 100644 --- a/src/font8x16p.h +++ b/src/font8x16p.h @@ -17,7 +17,11 @@ // ---------------------------------------------------------------------------- +#ifndef RP2040 #include +#else +#define PROGMEM +#endif // ----------------------------------------------------------------------------