Apply display driver datasheet delays

This commit is contained in:
mark9064 2024-01-30 23:29:16 +00:00 committed by JF
parent 7e460d3c80
commit 7b1110187e
2 changed files with 45 additions and 9 deletions

View file

@ -1,7 +1,4 @@
#include "drivers/St7789.h" #include "drivers/St7789.h"
#include <hal/nrf_gpio.h>
#include <nrfx_log.h>
#include "drivers/Spi.h"
using namespace Pinetime::Drivers; using namespace Pinetime::Drivers;
@ -53,22 +50,52 @@ void St7789::WriteSpi(const uint8_t* data, size_t size, const std::function<void
} }
void St7789::SoftwareReset() { void St7789::SoftwareReset() {
EnsureSleepOutPostDelay();
WriteCommand(static_cast<uint8_t>(Commands::SoftwareReset)); WriteCommand(static_cast<uint8_t>(Commands::SoftwareReset));
vTaskDelay(pdMS_TO_TICKS(150)); // If sleep in: must wait 120ms before sleep out can sent (see driver datasheet)
// Unconditionally wait as software reset doesn't need to be performant
sleepIn = true;
lastSleepExit = xTaskGetTickCount();
vTaskDelay(pdMS_TO_TICKS(125));
} }
void St7789::SleepOut() { void St7789::SleepOut() {
if (!sleepIn) {
return;
}
WriteCommand(static_cast<uint8_t>(Commands::SleepOut)); WriteCommand(static_cast<uint8_t>(Commands::SleepOut));
// Wait 5ms for clocks to stabilise
// pdMS rounds down => 6 used here
vTaskDelay(pdMS_TO_TICKS(6));
// Cannot send sleep in or software reset for 120ms
lastSleepExit = xTaskGetTickCount();
sleepIn = false;
}
void St7789::EnsureSleepOutPostDelay() {
TickType_t delta = xTaskGetTickCount() - lastSleepExit;
// Due to timer wraparound, there is a chance of delaying when not necessary
// It is very low (pdMS_TO_TICKS(125)/2^32) and waiting an extra 125ms isn't too bad
if (delta < pdMS_TO_TICKS(125)) {
vTaskDelay(pdMS_TO_TICKS(125) - delta);
}
} }
void St7789::SleepIn() { void St7789::SleepIn() {
if (sleepIn) {
return;
}
EnsureSleepOutPostDelay();
WriteCommand(static_cast<uint8_t>(Commands::SleepIn)); WriteCommand(static_cast<uint8_t>(Commands::SleepIn));
// Wait 5ms for clocks to stabilise
// pdMS rounds down => 6 used here
vTaskDelay(pdMS_TO_TICKS(6));
sleepIn = true;
} }
void St7789::ColMod() { void St7789::ColMod() {
WriteCommand(static_cast<uint8_t>(Commands::ColMod)); WriteCommand(static_cast<uint8_t>(Commands::ColMod));
WriteData(0x55); WriteData(0x55);
vTaskDelay(pdMS_TO_TICKS(10));
} }
void St7789::MemoryDataAccessControl() { void St7789::MemoryDataAccessControl() {
@ -105,12 +132,10 @@ void St7789::RowAddressSet() {
void St7789::DisplayInversionOn() { void St7789::DisplayInversionOn() {
WriteCommand(static_cast<uint8_t>(Commands::DisplayInversionOn)); WriteCommand(static_cast<uint8_t>(Commands::DisplayInversionOn));
vTaskDelay(pdMS_TO_TICKS(10));
} }
void St7789::NormalModeOn() { void St7789::NormalModeOn() {
WriteCommand(static_cast<uint8_t>(Commands::NormalModeOn)); WriteCommand(static_cast<uint8_t>(Commands::NormalModeOn));
vTaskDelay(pdMS_TO_TICKS(10));
} }
void St7789::DisplayOn() { void St7789::DisplayOn() {
@ -145,7 +170,6 @@ void St7789::SetVdv() {
void St7789::DisplayOff() { void St7789::DisplayOff() {
WriteCommand(static_cast<uint8_t>(Commands::DisplayOff)); WriteCommand(static_cast<uint8_t>(Commands::DisplayOff));
vTaskDelay(pdMS_TO_TICKS(500));
} }
void St7789::VerticalScrollStartAddress(uint16_t line) { void St7789::VerticalScrollStartAddress(uint16_t line) {
@ -165,8 +189,13 @@ void St7789::DrawBuffer(uint16_t x, uint16_t y, uint16_t width, uint16_t height,
void St7789::HardwareReset() { void St7789::HardwareReset() {
nrf_gpio_pin_clear(pinReset); nrf_gpio_pin_clear(pinReset);
vTaskDelay(pdMS_TO_TICKS(10)); vTaskDelay(pdMS_TO_TICKS(1));
nrf_gpio_pin_set(pinReset); nrf_gpio_pin_set(pinReset);
// If hardware reset started while sleep out, reset time may be up to 120ms
// Unconditionally wait as hardware reset doesn't need to be performant
sleepIn = true;
lastSleepExit = xTaskGetTickCount();
vTaskDelay(pdMS_TO_TICKS(125));
} }
void St7789::Sleep() { void St7789::Sleep() {

View file

@ -3,6 +3,10 @@
#include <cstdint> #include <cstdint>
#include <functional> #include <functional>
#include <hal/nrf_gpio.h>
#include <nrfx_log.h>
#include "drivers/Spi.h"
namespace Pinetime { namespace Pinetime {
namespace Drivers { namespace Drivers {
class Spi; class Spi;
@ -30,10 +34,13 @@ namespace Pinetime {
uint8_t pinDataCommand; uint8_t pinDataCommand;
uint8_t pinReset; uint8_t pinReset;
uint8_t verticalScrollingStartAddress = 0; uint8_t verticalScrollingStartAddress = 0;
bool sleepIn;
TickType_t lastSleepExit;
void HardwareReset(); void HardwareReset();
void SoftwareReset(); void SoftwareReset();
void SleepOut(); void SleepOut();
void EnsureSleepOutPostDelay();
void SleepIn(); void SleepIn();
void ColMod(); void ColMod();
void MemoryDataAccessControl(); void MemoryDataAccessControl();