Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add RPi Pico support #61

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
34 changes: 34 additions & 0 deletions src/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -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
)
2 changes: 2 additions & 0 deletions src/Tiny4kOLED.h
Original file line number Diff line number Diff line change
@@ -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 <Wire.h>
#include "Tiny4kOLED_Wire.h"
58 changes: 43 additions & 15 deletions src/Tiny4kOLED_common.h
Original file line number Diff line number Diff line change
@@ -6,7 +6,9 @@
*
*/
#include <stdint.h>
#ifndef RP2040
#include <Arduino.h>
#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 <cstddef>
#include <string>

#define DATACUTE_F_MACRO_T const char
using byte = uint8_t;
#define pgm_read_byte(addr) *reinterpret_cast<const uint8_t *>(addr)
#define pgm_read_word(addr) *reinterpret_cast<const uint16_t *>(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<DATACUTE_F_MACRO_T *>(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<DATACUTE_F_MACRO_T *>(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
};

// ----------------------------------------------------------------------------
68 changes: 68 additions & 0 deletions src/Tiny4kOLED_rp2040.h
Original file line number Diff line number Diff line change
@@ -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 <hardware/i2c.h>
#include <hardware/gpio.h>
#include <vector>

#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<uint8_t> 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
4 changes: 4 additions & 0 deletions src/font6x8.h
Original file line number Diff line number Diff line change
@@ -17,7 +17,11 @@

// ----------------------------------------------------------------------------

#ifndef RP2040
#include <avr/pgmspace.h>
#else
#define PROGMEM
#endif

// ----------------------------------------------------------------------------

4 changes: 4 additions & 0 deletions src/font6x8caps.h
Original file line number Diff line number Diff line change
@@ -17,7 +17,11 @@

// ----------------------------------------------------------------------------

#ifndef RP2040
#include <avr/pgmspace.h>
#else
#define PROGMEM
#endif

// ----------------------------------------------------------------------------

4 changes: 4 additions & 0 deletions src/font6x8digits.h
Original file line number Diff line number Diff line change
@@ -17,7 +17,11 @@

// ----------------------------------------------------------------------------

#ifndef RP2040
#include <avr/pgmspace.h>
#else
#define PROGMEM
#endif

// ----------------------------------------------------------------------------

4 changes: 4 additions & 0 deletions src/font6x8p.h
Original file line number Diff line number Diff line change
@@ -17,7 +17,11 @@

// ----------------------------------------------------------------------------

#ifndef RP2040
#include <avr/pgmspace.h>
#else
#define PROGMEM
#endif

// ----------------------------------------------------------------------------

4 changes: 4 additions & 0 deletions src/font8x16.h
Original file line number Diff line number Diff line change
@@ -17,7 +17,11 @@

// ----------------------------------------------------------------------------

#ifndef RP2040
#include <avr/pgmspace.h>
#else
#define PROGMEM
#endif

// ----------------------------------------------------------------------------

4 changes: 4 additions & 0 deletions src/font8x16caps.h
Original file line number Diff line number Diff line change
@@ -17,7 +17,11 @@

// ----------------------------------------------------------------------------

#ifndef RP2040
#include <avr/pgmspace.h>
#else
#define PROGMEM
#endif

// ----------------------------------------------------------------------------

4 changes: 4 additions & 0 deletions src/font8x16capsp.h
Original file line number Diff line number Diff line change
@@ -17,7 +17,11 @@

// ----------------------------------------------------------------------------

#ifndef RP2040
#include <avr/pgmspace.h>
#else
#define PROGMEM
#endif

// ----------------------------------------------------------------------------

4 changes: 4 additions & 0 deletions src/font8x16digits.h
Original file line number Diff line number Diff line change
@@ -17,7 +17,11 @@

// ----------------------------------------------------------------------------

#ifndef RP2040
#include <avr/pgmspace.h>
#else
#define PROGMEM
#endif

// ----------------------------------------------------------------------------

4 changes: 4 additions & 0 deletions src/font8x16p.h
Original file line number Diff line number Diff line change
@@ -17,7 +17,11 @@

// ----------------------------------------------------------------------------

#ifndef RP2040
#include <avr/pgmspace.h>
#else
#define PROGMEM
#endif

// ----------------------------------------------------------------------------