Disable SPI, I²C, touch controller and display controller in sleep mode.
Re-enable them on wake up. Remove delays that were not needed in st7889 driver. Hopefully, it'll improve the battery life!
This commit is contained in:
parent
69a14a2247
commit
c1f3a31b51
|
@ -85,4 +85,12 @@ void Gfx::pixel_draw(uint8_t x, uint8_t y, uint16_t color) {
|
||||||
lcd.DrawPixel(x, y, color);
|
lcd.DrawPixel(x, y, color);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Gfx::Sleep() {
|
||||||
|
lcd.Sleep();
|
||||||
|
}
|
||||||
|
|
||||||
|
void Gfx::Wakeup() {
|
||||||
|
lcd.Wakeup();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -16,6 +16,9 @@ namespace Pinetime {
|
||||||
void DrawChar(const FONT_INFO *font, uint8_t c, uint8_t *x, uint8_t y, uint16_t color);
|
void DrawChar(const FONT_INFO *font, uint8_t c, uint8_t *x, uint8_t y, uint16_t color);
|
||||||
void FillRectangle(uint8_t x, uint8_t y, uint8_t width, uint8_t height, uint16_t color);
|
void FillRectangle(uint8_t x, uint8_t y, uint8_t width, uint8_t height, uint16_t color);
|
||||||
|
|
||||||
|
void Sleep();
|
||||||
|
void Wakeup();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Drivers::St7789& lcd;
|
Drivers::St7789& lcd;
|
||||||
const uint8_t width = 240;
|
const uint8_t width = 240;
|
||||||
|
|
|
@ -136,9 +136,14 @@ void DisplayApp::Refresh() {
|
||||||
vTaskDelay(100);
|
vTaskDelay(100);
|
||||||
nrf_gpio_pin_set(14);
|
nrf_gpio_pin_set(14);
|
||||||
lcd->DisplayOff();
|
lcd->DisplayOff();
|
||||||
|
lcd->Sleep();
|
||||||
|
touchPanel.Sleep();
|
||||||
state = States::Idle;
|
state = States::Idle;
|
||||||
break;
|
break;
|
||||||
case Messages::GoToRunning:
|
case Messages::GoToRunning:
|
||||||
|
lcd->Wakeup();
|
||||||
|
touchPanel.Wakeup();
|
||||||
|
|
||||||
lcd->DisplayOn();
|
lcd->DisplayOn();
|
||||||
nrf_gpio_pin_clear(23);
|
nrf_gpio_pin_clear(23);
|
||||||
nrf_gpio_pin_clear(22);
|
nrf_gpio_pin_clear(22);
|
||||||
|
|
|
@ -75,3 +75,13 @@ Cst816S::TouchInfos Cst816S::GetTouchInfo() {
|
||||||
info.action = action;
|
info.action = action;
|
||||||
return info;
|
return info;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Cst816S::Sleep() {
|
||||||
|
nrfx_twi_disable(&twi);
|
||||||
|
nrf_gpio_cfg_default(6);
|
||||||
|
nrf_gpio_cfg_default(7);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Cst816S::Wakeup() {
|
||||||
|
Init();
|
||||||
|
}
|
||||||
|
|
|
@ -19,6 +19,8 @@ namespace Pinetime {
|
||||||
void Init();
|
void Init();
|
||||||
void Probe();
|
void Probe();
|
||||||
TouchInfos GetTouchInfo();
|
TouchInfos GetTouchInfo();
|
||||||
|
void Sleep();
|
||||||
|
void Wakeup();
|
||||||
private:
|
private:
|
||||||
static constexpr uint8_t pinIrq = 28;
|
static constexpr uint8_t pinIrq = 28;
|
||||||
static constexpr uint8_t pinReset = 10;
|
static constexpr uint8_t pinReset = 10;
|
||||||
|
|
|
@ -4,6 +4,9 @@
|
||||||
using namespace Pinetime::Drivers;
|
using namespace Pinetime::Drivers;
|
||||||
|
|
||||||
bool SpiMaster::Init(const SpiMaster::SpiModule spi, const SpiMaster::Parameters ¶ms) {
|
bool SpiMaster::Init(const SpiMaster::SpiModule spi, const SpiMaster::Parameters ¶ms) {
|
||||||
|
configSpiModule = spi;
|
||||||
|
configParams = params;
|
||||||
|
|
||||||
/* Configure GPIO pins used for pselsck, pselmosi, pselmiso and pselss for SPI0 */
|
/* Configure GPIO pins used for pselsck, pselmosi, pselmiso and pselss for SPI0 */
|
||||||
nrf_gpio_cfg_output(params.pinSCK);
|
nrf_gpio_cfg_output(params.pinSCK);
|
||||||
nrf_gpio_cfg_output(params.pinMOSI);
|
nrf_gpio_cfg_output(params.pinMOSI);
|
||||||
|
@ -86,3 +89,17 @@ bool SpiMaster::Write(const uint8_t *data, size_t size) {
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SpiMaster::Sleep() {
|
||||||
|
while(NRF_SPI0->ENABLE != 0) {
|
||||||
|
NRF_SPI0->ENABLE = (SPIM_ENABLE_ENABLE_Disabled << SPIM_ENABLE_ENABLE_Pos);
|
||||||
|
}
|
||||||
|
nrf_gpio_cfg_default(configParams.pinSCK);
|
||||||
|
nrf_gpio_cfg_default(configParams.pinMOSI);
|
||||||
|
nrf_gpio_cfg_default(configParams.pinMISO);
|
||||||
|
nrf_gpio_cfg_default(configParams.pinCSN);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SpiMaster::Wakeup() {
|
||||||
|
Init(configSpiModule, configParams);
|
||||||
|
}
|
||||||
|
|
|
@ -23,9 +23,15 @@ namespace Pinetime {
|
||||||
bool Init(const SpiModule spi, const Parameters& params);
|
bool Init(const SpiModule spi, const Parameters& params);
|
||||||
bool Write(const uint8_t* data, size_t size);
|
bool Write(const uint8_t* data, size_t size);
|
||||||
|
|
||||||
|
void Sleep();
|
||||||
|
void Wakeup();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
NRF_SPI_Type * spiBaseAddress;
|
NRF_SPI_Type * spiBaseAddress;
|
||||||
uint8_t pinCsn;
|
uint8_t pinCsn;
|
||||||
|
|
||||||
|
SpiMaster::SpiModule configSpiModule;
|
||||||
|
SpiMaster::Parameters configParams;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -48,7 +48,10 @@ void St7789::SoftwareReset() {
|
||||||
|
|
||||||
void St7789::SleepOut() {
|
void St7789::SleepOut() {
|
||||||
WriteCommand(static_cast<uint8_t>(Commands::SleepOut));
|
WriteCommand(static_cast<uint8_t>(Commands::SleepOut));
|
||||||
nrf_delay_ms(500);
|
}
|
||||||
|
|
||||||
|
void St7789::SleepIn() {
|
||||||
|
WriteCommand(static_cast<uint8_t>(Commands::SleepIn));
|
||||||
}
|
}
|
||||||
|
|
||||||
void St7789::ColMod() {
|
void St7789::ColMod() {
|
||||||
|
@ -90,7 +93,6 @@ void St7789::NormalModeOn() {
|
||||||
|
|
||||||
void St7789::DisplayOn() {
|
void St7789::DisplayOn() {
|
||||||
WriteCommand(static_cast<uint8_t>(Commands::DisplayOn));
|
WriteCommand(static_cast<uint8_t>(Commands::DisplayOn));
|
||||||
nrf_delay_ms(500);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void St7789::FillRectangle(uint16_t x, uint16_t y, uint16_t width, uint16_t height, uint16_t color) {
|
void St7789::FillRectangle(uint16_t x, uint16_t y, uint16_t width, uint16_t height, uint16_t color) {
|
||||||
|
@ -163,9 +165,30 @@ void St7789::NextDrawBuffer(const uint8_t *data, size_t size) {
|
||||||
|
|
||||||
void St7789::HardwareReset() {
|
void St7789::HardwareReset() {
|
||||||
nrf_gpio_pin_clear(26);
|
nrf_gpio_pin_clear(26);
|
||||||
nrf_delay_ms(200);
|
nrf_delay_ms(10);
|
||||||
nrf_gpio_pin_set(26);
|
nrf_gpio_pin_set(26);
|
||||||
|
}
|
||||||
|
|
||||||
|
void St7789::Sleep() {
|
||||||
|
SleepIn();
|
||||||
|
nrf_gpio_cfg_default(pinDataCommand);
|
||||||
|
spi.Sleep();
|
||||||
|
}
|
||||||
|
|
||||||
|
void St7789::Wakeup() {
|
||||||
|
spi.Wakeup();
|
||||||
|
|
||||||
|
nrf_gpio_cfg_output(pinDataCommand);
|
||||||
|
// TODO why do we need to reset the controller?
|
||||||
|
SoftwareReset();
|
||||||
|
SleepOut();
|
||||||
|
ColMod();
|
||||||
|
MemoryDataAccessControl();
|
||||||
|
ColumnAddressSet();
|
||||||
|
RowAddressSet();
|
||||||
|
DisplayInversionOn();
|
||||||
|
NormalModeOn();
|
||||||
|
DisplayOn();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -19,6 +19,9 @@ namespace Pinetime {
|
||||||
void DisplayOn();
|
void DisplayOn();
|
||||||
void DisplayOff();
|
void DisplayOff();
|
||||||
|
|
||||||
|
void Sleep();
|
||||||
|
void Wakeup();
|
||||||
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
SpiMaster& spi;
|
SpiMaster& spi;
|
||||||
|
@ -27,6 +30,7 @@ namespace Pinetime {
|
||||||
void HardwareReset();
|
void HardwareReset();
|
||||||
void SoftwareReset();
|
void SoftwareReset();
|
||||||
void SleepOut();
|
void SleepOut();
|
||||||
|
void SleepIn();
|
||||||
void ColMod();
|
void ColMod();
|
||||||
void MemoryDataAccessControl();
|
void MemoryDataAccessControl();
|
||||||
void DisplayInversionOn();
|
void DisplayInversionOn();
|
||||||
|
@ -41,6 +45,7 @@ namespace Pinetime {
|
||||||
|
|
||||||
enum class Commands : uint8_t {
|
enum class Commands : uint8_t {
|
||||||
SoftwareReset = 0x01,
|
SoftwareReset = 0x01,
|
||||||
|
SleepIn = 0x10,
|
||||||
SleepOut = 0x11,
|
SleepOut = 0x11,
|
||||||
NormalModeOn = 0x13,
|
NormalModeOn = 0x13,
|
||||||
DisplayInversionOn = 0x21,
|
DisplayInversionOn = 0x21,
|
||||||
|
|
Loading…
Reference in a new issue