UC8151: Refactor to uc8151_legacy.

pull/400/head
Phil Howard 2022-06-23 11:58:36 +01:00
rodzic a6458d2321
commit 646bd1a9b0
10 zmienionych plików z 56 dodań i 56 usunięć

Wyświetl plik

@ -27,7 +27,7 @@ add_subdirectory(rgbled)
add_subdirectory(icp10125) add_subdirectory(icp10125)
add_subdirectory(scd4x) add_subdirectory(scd4x)
add_subdirectory(hub75) add_subdirectory(hub75)
add_subdirectory(uc8151) add_subdirectory(uc8151_legacy)
add_subdirectory(pwm) add_subdirectory(pwm)
add_subdirectory(servo) add_subdirectory(servo)
add_subdirectory(encoder) add_subdirectory(encoder)

Wyświetl plik

@ -1 +0,0 @@
include(uc8151.cmake)

Wyświetl plik

@ -0,0 +1 @@
include(uc8151_legacy.cmake)

Wyświetl plik

@ -1,4 +1,4 @@
set(DRIVER_NAME uc8151) set(DRIVER_NAME uc8151_legacy)
add_library(${DRIVER_NAME} INTERFACE) add_library(${DRIVER_NAME} INTERFACE)
target_sources(${DRIVER_NAME} INTERFACE target_sources(${DRIVER_NAME} INTERFACE

Wyświetl plik

@ -1,4 +1,4 @@
#include "uc8151.hpp" #include "uc8151_legacy.hpp"
#include <cstdlib> #include <cstdlib>
#include <math.h> #include <math.h>
@ -48,23 +48,23 @@ namespace pimoroni {
TSSET = 0xe5 TSSET = 0xe5
}; };
bool UC8151::is_busy() { bool UC8151_Legacy::is_busy() {
return !gpio_get(BUSY); return !gpio_get(BUSY);
} }
void UC8151::busy_wait() { void UC8151_Legacy::busy_wait() {
while(is_busy()) { while(is_busy()) {
tight_loop_contents(); tight_loop_contents();
} }
} }
void UC8151::reset() { void UC8151_Legacy::reset() {
gpio_put(RESET, 0); sleep_ms(10); gpio_put(RESET, 0); sleep_ms(10);
gpio_put(RESET, 1); sleep_ms(10); gpio_put(RESET, 1); sleep_ms(10);
busy_wait(); busy_wait();
} }
void UC8151::default_luts() { void UC8151_Legacy::default_luts() {
command(LUT_VCOM, { command(LUT_VCOM, {
0x00, 0x64, 0x64, 0x37, 0x00, 0x01, 0x00, 0x64, 0x64, 0x37, 0x00, 0x01,
0x00, 0x8c, 0x8c, 0x00, 0x00, 0x04, 0x00, 0x8c, 0x8c, 0x00, 0x00, 0x04,
@ -119,7 +119,7 @@ namespace pimoroni {
busy_wait(); busy_wait();
} }
void UC8151::medium_luts() { void UC8151_Legacy::medium_luts() {
command(LUT_VCOM, { command(LUT_VCOM, {
0x00, 0x16, 0x16, 0x0d, 0x00, 0x01, 0x00, 0x16, 0x16, 0x0d, 0x00, 0x01,
@ -175,7 +175,7 @@ namespace pimoroni {
busy_wait(); busy_wait();
} }
void UC8151::fast_luts() { void UC8151_Legacy::fast_luts() {
// 0x3c, 0x00, 0x2b, 0x2b, 0x24, 0x1a, ???? // 0x3c, 0x00, 0x2b, 0x2b, 0x24, 0x1a, ????
command(LUT_VCOM, { command(LUT_VCOM, {
0x00, 0x04, 0x04, 0x07, 0x00, 0x01, 0x00, 0x04, 0x04, 0x07, 0x00, 0x01,
@ -235,7 +235,7 @@ namespace pimoroni {
busy_wait(); busy_wait();
} }
void UC8151::turbo_luts() { void UC8151_Legacy::turbo_luts() {
// 0x3c, 0x00, 0x2b, 0x2b, 0x24, 0x1a, ???? // 0x3c, 0x00, 0x2b, 0x2b, 0x24, 0x1a, ????
command(LUT_VCOM, { command(LUT_VCOM, {
0x00, 0x01, 0x01, 0x02, 0x00, 0x01, 0x00, 0x01, 0x01, 0x02, 0x00, 0x01,
@ -295,7 +295,7 @@ namespace pimoroni {
busy_wait(); busy_wait();
} }
void UC8151::init() { void UC8151_Legacy::init() {
// configure spi interface and pins // configure spi interface and pins
spi_init(spi, 12'000'000); spi_init(spi, 12'000'000);
@ -320,7 +320,7 @@ namespace pimoroni {
setup(); setup();
}; };
void UC8151::setup(uint8_t speed) { void UC8151_Legacy::setup(uint8_t speed) {
reset(); reset();
_update_speed = speed; _update_speed = speed;
@ -389,11 +389,11 @@ namespace pimoroni {
busy_wait(); busy_wait();
} }
void UC8151::power_off() { void UC8151_Legacy::power_off() {
command(POF); command(POF);
} }
void UC8151::read(uint8_t reg, size_t len, uint8_t *data) { void UC8151_Legacy::read(uint8_t reg, size_t len, uint8_t *data) {
gpio_put(CS, 0); gpio_put(CS, 0);
gpio_put(DC, 0); // command mode gpio_put(DC, 0); // command mode
@ -421,7 +421,7 @@ namespace pimoroni {
gpio_put(CS, 1); gpio_put(CS, 1);
} }
void UC8151::command(uint8_t reg, size_t len, const uint8_t *data) { void UC8151_Legacy::command(uint8_t reg, size_t len, const uint8_t *data) {
gpio_put(CS, 0); gpio_put(CS, 0);
gpio_put(DC, 0); // command mode gpio_put(DC, 0); // command mode
@ -435,18 +435,18 @@ namespace pimoroni {
gpio_put(CS, 1); gpio_put(CS, 1);
} }
void UC8151::data(size_t len, const uint8_t *data) { void UC8151_Legacy::data(size_t len, const uint8_t *data) {
gpio_put(CS, 0); gpio_put(CS, 0);
gpio_put(DC, 1); // data mode gpio_put(DC, 1); // data mode
spi_write_blocking(spi, (const uint8_t*)data, len); spi_write_blocking(spi, (const uint8_t*)data, len);
gpio_put(CS, 1); gpio_put(CS, 1);
} }
void UC8151::command(uint8_t reg, std::initializer_list<uint8_t> values) { void UC8151_Legacy::command(uint8_t reg, std::initializer_list<uint8_t> values) {
command(reg, values.size(), (uint8_t *)values.begin()); command(reg, values.size(), (uint8_t *)values.begin());
} }
void UC8151::pixel(int x, int y, int v) { void UC8151_Legacy::pixel(int x, int y, int v) {
// bounds check // bounds check
if(x < 0 || y < 0 || x >= width || y >= height) return; if(x < 0 || y < 0 || x >= width || y >= height) return;
@ -461,24 +461,24 @@ namespace pimoroni {
*p |= b; // set bit value *p |= b; // set bit value
} }
uint8_t* UC8151::get_frame_buffer() { uint8_t* UC8151_Legacy::get_frame_buffer() {
return frame_buffer; return frame_buffer;
} }
void UC8151::invert(bool inv) { void UC8151_Legacy::invert(bool inv) {
inverted = inv; inverted = inv;
command(CDI, {(uint8_t)(inverted ? 0b01'01'1100 : 0b01'00'1100)}); // vcom and data interval command(CDI, {(uint8_t)(inverted ? 0b01'01'1100 : 0b01'00'1100)}); // vcom and data interval
} }
void UC8151::update_speed(uint8_t speed) { void UC8151_Legacy::update_speed(uint8_t speed) {
setup(speed); setup(speed);
} }
uint8_t UC8151::update_speed() { uint8_t UC8151_Legacy::update_speed() {
return _update_speed; return _update_speed;
} }
uint32_t UC8151::update_time() { uint32_t UC8151_Legacy::update_time() {
switch(_update_speed) { switch(_update_speed) {
case 0: case 0:
return 4500; return 4500;
@ -493,7 +493,7 @@ namespace pimoroni {
} }
} }
void UC8151::partial_update(int x, int y, int w, int h, bool blocking) { void UC8151_Legacy::partial_update(int x, int y, int w, int h, bool blocking) {
// y is given in columns ("banks"), which are groups of 8 horiontal pixels // y is given in columns ("banks"), which are groups of 8 horiontal pixels
// x is given in pixels // x is given in pixels
if(blocking) { if(blocking) {
@ -539,7 +539,7 @@ namespace pimoroni {
} }
} }
void UC8151::update(bool blocking) { void UC8151_Legacy::update(bool blocking) {
if(blocking) { if(blocking) {
busy_wait(); busy_wait();
} }
@ -560,7 +560,7 @@ namespace pimoroni {
} }
} }
void UC8151::off() { void UC8151_Legacy::off() {
busy_wait(); busy_wait();
command(POF); // turn off command(POF); // turn off
} }

Wyświetl plik

@ -10,7 +10,7 @@
namespace pimoroni { namespace pimoroni {
class UC8151 { class UC8151_Legacy {
enum PSR_FLAGS { enum PSR_FLAGS {
RES_96x230 = 0b00000000, RES_96x230 = 0b00000000,
RES_96x252 = 0b01000000, RES_96x252 = 0b01000000,
@ -149,15 +149,15 @@ namespace pimoroni {
uint8_t _update_speed = 0; uint8_t _update_speed = 0;
public: public:
UC8151(uint16_t width, uint16_t height) : UC8151_Legacy(uint16_t width, uint16_t height) :
width(width), height(height), frame_buffer(new uint8_t[width * height / 8]) { width(width), height(height), frame_buffer(new uint8_t[width * height / 8]) {
} }
UC8151(uint16_t width, uint16_t height, uint8_t *frame_buffer) : UC8151_Legacy(uint16_t width, uint16_t height, uint8_t *frame_buffer) :
width(width), height(height), frame_buffer(frame_buffer) { width(width), height(height), frame_buffer(frame_buffer) {
} }
UC8151(uint16_t width, uint16_t height, UC8151_Legacy(uint16_t width, uint16_t height,
spi_inst_t *spi, spi_inst_t *spi,
uint CS, uint DC, uint SCK, uint MOSI, uint CS, uint DC, uint SCK, uint MOSI,
uint BUSY = PIN_UNUSED, uint RESET = PIN_UNUSED) : uint BUSY = PIN_UNUSED, uint RESET = PIN_UNUSED) :
@ -166,7 +166,7 @@ namespace pimoroni {
spi(spi), spi(spi),
CS(CS), DC(DC), SCK(SCK), MOSI(MOSI), BUSY(BUSY), RESET(RESET) {} CS(CS), DC(DC), SCK(SCK), MOSI(MOSI), BUSY(BUSY), RESET(RESET) {}
UC8151(uint16_t width, uint16_t height, UC8151_Legacy(uint16_t width, uint16_t height,
uint8_t *frame_buffer, uint8_t *frame_buffer,
spi_inst_t *spi, spi_inst_t *spi,
uint CS, uint DC, uint SCK, uint MOSI, uint CS, uint DC, uint SCK, uint MOSI,

Wyświetl plik

@ -8,4 +8,4 @@ target_sources(${LIB_NAME} INTERFACE
target_include_directories(${LIB_NAME} INTERFACE ${CMAKE_CURRENT_LIST_DIR}) target_include_directories(${LIB_NAME} INTERFACE ${CMAKE_CURRENT_LIST_DIR})
# Pull in pico libraries that we need # Pull in pico libraries that we need
target_link_libraries(${LIB_NAME} INTERFACE bitmap_fonts hershey_fonts pico_stdlib hardware_pwm uc8151) target_link_libraries(${LIB_NAME} INTERFACE bitmap_fonts hershey_fonts pico_stdlib hardware_pwm uc8151_legacy)

Wyświetl plik

@ -64,7 +64,7 @@ namespace pimoroni {
gpio_set_function(LED, GPIO_FUNC_PWM); gpio_set_function(LED, GPIO_FUNC_PWM);
led(0); led(0);
uc8151.init(); uc8151_legacy.init();
// TODO: set default image? // TODO: set default image?
} }
@ -126,7 +126,7 @@ namespace pimoroni {
void Badger2040::clear() { void Badger2040::clear() {
const uint32_t column_len = 128 / 8; const uint32_t column_len = 128 / 8;
const uint32_t buf_len = column_len * 296; const uint32_t buf_len = column_len * 296;
uint8_t* buf = uc8151.get_frame_buffer(); uint8_t* buf = uc8151_legacy.get_frame_buffer();
if (_pen == 0) { if (_pen == 0) {
memset(buf, 0xff, buf_len); memset(buf, 0xff, buf_len);
@ -145,12 +145,12 @@ namespace pimoroni {
void Badger2040::pixel(int32_t x, int32_t y) { void Badger2040::pixel(int32_t x, int32_t y) {
if(_thickness == 1) { if(_thickness == 1) {
uc8151.pixel(x, y, _dither_value(x, y, _pen)); uc8151_legacy.pixel(x, y, _dither_value(x, y, _pen));
}else{ }else{
uint8_t ht = _thickness / 2; uint8_t ht = _thickness / 2;
for(int sy = 0; sy < _thickness; sy++) { for(int sy = 0; sy < _thickness; sy++) {
for(int sx = 0; sx < _thickness; sx++) { for(int sx = 0; sx < _thickness; sx++) {
uc8151.pixel(x + sx - ht, y + sy - ht, _dither_value(x + sx - ht, y + sy - ht, _pen)); uc8151_legacy.pixel(x + sx - ht, y + sy - ht, _dither_value(x + sx - ht, y + sy - ht, _pen));
} }
} }
} }
@ -163,7 +163,7 @@ namespace pimoroni {
// Display an image that fills the screen (296*128) // Display an image that fills the screen (296*128)
void Badger2040::image(const uint8_t* data) { void Badger2040::image(const uint8_t* data) {
uint8_t* ptr = uc8151.get_frame_buffer(); uint8_t* ptr = uc8151_legacy.get_frame_buffer();
for (uint32_t x = 0; x < 296; ++x) { for (uint32_t x = 0; x < 296; ++x) {
// extract bitmask for this pixel // extract bitmask for this pixel
@ -205,7 +205,7 @@ namespace pimoroni {
uint32_t bm = 0b10000000 >> ((x + sx) & 0b111); uint32_t bm = 0b10000000 >> ((x + sx) & 0b111);
// draw the pixel // draw the pixel
uc8151.pixel(dx + x, dy + y, data[o] & bm); uc8151_legacy.pixel(dx + x, dy + y, data[o] & bm);
} }
} }
} }
@ -234,7 +234,7 @@ namespace pimoroni {
if (h >= 8) { if (h >= 8) {
// Directly write to the frame buffer when clearing a large area // Directly write to the frame buffer when clearing a large area
uint8_t* buf = uc8151.get_frame_buffer(); uint8_t* buf = uc8151_legacy.get_frame_buffer();
for(int cx = x; cx < x + w; cx++) { for(int cx = x; cx < x + w; cx++) {
uint8_t* buf_ptr = &buf[cx * 16 + y / 8]; uint8_t* buf_ptr = &buf[cx * 16 + y / 8];
@ -253,7 +253,7 @@ namespace pimoroni {
else { else {
for(int cx = x; cx < x + w; cx++) { for(int cx = x; cx < x + w; cx++) {
for(int cy = y; cy < y + h; cy++) { for(int cy = y; cy < y + h; cy++) {
uc8151.pixel(cx, cy, _dither_value(cx, cy, _pen)); uc8151_legacy.pixel(cx, cy, _dither_value(cx, cy, _pen));
} }
} }
} }
@ -283,11 +283,11 @@ namespace pimoroni {
} }
void Badger2040::debug_command(uint8_t reg, size_t len, const uint8_t *data) { void Badger2040::debug_command(uint8_t reg, size_t len, const uint8_t *data) {
uc8151.command(reg, len, data); uc8151_legacy.command(reg, len, data);
} }
void Badger2040::dump_otp(uint8_t *data) { void Badger2040::dump_otp(uint8_t *data) {
uc8151.read(0xa2, 0xFFF, data); uc8151_legacy.read(0xa2, 0xFFF, data);
} }
void Badger2040::update_button_states() { void Badger2040::update_button_states() {
@ -301,31 +301,31 @@ namespace pimoroni {
} }
bool Badger2040::is_busy() { bool Badger2040::is_busy() {
return uc8151.is_busy(); return uc8151_legacy.is_busy();
} }
void Badger2040::power_off() { void Badger2040::power_off() {
uc8151.power_off(); uc8151_legacy.power_off();
} }
void Badger2040::invert(bool invert) { void Badger2040::invert(bool invert) {
uc8151.invert(invert); uc8151_legacy.invert(invert);
} }
void Badger2040::update_speed(uint8_t speed) { void Badger2040::update_speed(uint8_t speed) {
uc8151.update_speed(speed); uc8151_legacy.update_speed(speed);
} }
uint32_t Badger2040::update_time() { uint32_t Badger2040::update_time() {
return uc8151.update_time(); return uc8151_legacy.update_time();
} }
void Badger2040::partial_update(int x, int y, int w, int h, bool blocking) { void Badger2040::partial_update(int x, int y, int w, int h, bool blocking) {
uc8151.partial_update(x, y, w, h, blocking); uc8151_legacy.partial_update(x, y, w, h, blocking);
} }
void Badger2040::update(bool blocking) { void Badger2040::update(bool blocking) {
uc8151.update(blocking); uc8151_legacy.update(blocking);
} }
const hershey::font_glyph_t* Badger2040::glyph_data(unsigned char c) { const hershey::font_glyph_t* Badger2040::glyph_data(unsigned char c) {

Wyświetl plik

@ -2,7 +2,7 @@
#include <string> #include <string>
#include "drivers/uc8151/uc8151.hpp" #include "drivers/uc8151_legacy/uc8151_legacy.hpp"
#include "libraries/hershey_fonts/hershey_fonts.hpp" #include "libraries/hershey_fonts/hershey_fonts.hpp"
#include "libraries/bitmap_fonts/bitmap_fonts.hpp" #include "libraries/bitmap_fonts/bitmap_fonts.hpp"
@ -14,7 +14,7 @@ namespace pimoroni {
class Badger2040 { class Badger2040 {
protected: protected:
UC8151 uc8151; UC8151_Legacy uc8151_legacy;
const hershey::font_t *_font = &hershey::futural; const hershey::font_t *_font = &hershey::futural;
const bitmap::font_t *_bitmap_font = nullptr; const bitmap::font_t *_bitmap_font = nullptr;
uint8_t _pen = 0; uint8_t _pen = 0;
@ -25,11 +25,11 @@ namespace pimoroni {
public: public:
Badger2040() Badger2040()
: uc8151(296, 128, spi0, CS, DC, CLK, MOSI, BUSY, RESET) { : uc8151_legacy(296, 128, spi0, CS, DC, CLK, MOSI, BUSY, RESET) {
}; };
// Constructor for Python-managed buffer // Constructor for Python-managed buffer
Badger2040(uint8_t *framebuffer) Badger2040(uint8_t *framebuffer)
: uc8151(296, 128, framebuffer, spi0, CS, DC, CLK, MOSI, BUSY, RESET) { : uc8151_legacy(296, 128, framebuffer, spi0, CS, DC, CLK, MOSI, BUSY, RESET) {
}; };
void init(); void init();
void update(bool blocking=false); void update(bool blocking=false);

Wyświetl plik

@ -7,13 +7,13 @@ target_sources(usermod_${MOD_NAME} INTERFACE
${CMAKE_CURRENT_LIST_DIR}/${MOD_NAME}.cpp ${CMAKE_CURRENT_LIST_DIR}/${MOD_NAME}.cpp
${CMAKE_CURRENT_LIST_DIR}/badgerinit.S ${CMAKE_CURRENT_LIST_DIR}/badgerinit.S
${CMAKE_CURRENT_LIST_DIR}/../../../libraries/badger2040/badger2040.cpp ${CMAKE_CURRENT_LIST_DIR}/../../../libraries/badger2040/badger2040.cpp
${CMAKE_CURRENT_LIST_DIR}/../../../drivers/uc8151/uc8151.cpp ${CMAKE_CURRENT_LIST_DIR}/../../../drivers/uc8151_legacy/uc8151_legacy.cpp
) )
target_include_directories(usermod_${MOD_NAME} INTERFACE target_include_directories(usermod_${MOD_NAME} INTERFACE
${CMAKE_CURRENT_LIST_DIR} ${CMAKE_CURRENT_LIST_DIR}
${CMAKE_CURRENT_LIST_DIR}/../../../libraries/badger2040/ ${CMAKE_CURRENT_LIST_DIR}/../../../libraries/badger2040/
${CMAKE_CURRENT_LIST_DIR}/../../../drivers/uc8151/ ${CMAKE_CURRENT_LIST_DIR}/../../../drivers/uc8151_legacy/
) )
target_compile_definitions(usermod_${MOD_NAME} INTERFACE target_compile_definitions(usermod_${MOD_NAME} INTERFACE