Skip to content

Commit

Permalink
Add RPi Pico support
Browse files Browse the repository at this point in the history
Fix a few code style issues
  • Loading branch information
bog-dan-ro committed Feb 12, 2024
1 parent 785469d commit be20588
Show file tree
Hide file tree
Showing 13 changed files with 183 additions and 15 deletions.
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
Expand Up @@ -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"
Expand Down
58 changes: 43 additions & 15 deletions src/Tiny4kOLED_common.h
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,9 @@
*
*/
#include <stdint.h>
#ifndef RP2040
#include <Arduino.h>
#endif

#ifndef TINY4KOLEDCOMMON_H
#define TINY4KOLEDCOMMON_H
Expand Down Expand Up @@ -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

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

Expand Down Expand Up @@ -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
};

// ----------------------------------------------------------------------------
Expand Down
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
Expand Up @@ -17,7 +17,11 @@

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Expand Down

0 comments on commit be20588

Please sign in to comment.