From dcd71e66bd5f0b521c9f98ebe83ff1f7abb62918 Mon Sep 17 00:00:00 2001 From: William Wilgus Date: Thu, 14 Dec 2017 06:22:04 +0100 Subject: Optimize lcd-ssd1303 driver (clip series) Saves 100+ bytes (50 of it in iram), saves a bit of power Internal LCD clock decreased but with added efficiency of drawing routines loses only around 2 Hz on the scanrate (~75Hz) while fps is slightly increased Column offsets are now calculated outside the loops saving a few instructions Passing a LCD_NOP command after lcd_update turns off Data/Cmd# gpio saving a bit more power Added a function lcd_write_cmd_triple() that allows 3 commands to be sent at once when enabled with LCD_USE_FIFO_FOR_COMMANDS it sends them back to back without checking FIFO status in between or sending to thhe D/C# Gpio. Makes an assumption about the FIFO being large enough to accept 3 commands after being emptied which should be the case on the clipv1, clipv2, clipplus. I have only enabled it for the clip plus as thats the only device I have to test it on. On clip+ the SSP clock is now turned off when screen is off Change-Id: Ib5fd24697bfe4ac8b8ee017361e789e4a7910d21 --- .../arm/as3525/sansa-clipplus/lcd-clip-plus.c | 32 ++++++++++++++++++++++ 1 file changed, 32 insertions(+) (limited to 'firmware/target/arm/as3525/sansa-clipplus/lcd-clip-plus.c') diff --git a/firmware/target/arm/as3525/sansa-clipplus/lcd-clip-plus.c b/firmware/target/arm/as3525/sansa-clipplus/lcd-clip-plus.c index c0b128a486..a50a9e5c80 100644 --- a/firmware/target/arm/as3525/sansa-clipplus/lcd-clip-plus.c +++ b/firmware/target/arm/as3525/sansa-clipplus/lcd-clip-plus.c @@ -64,6 +64,31 @@ void lcd_write_command(int byte) ; } +void lcd_write_cmd_triplet(int cmd1, int cmd2, int cmd3) +{ +#ifndef LCD_USE_FIFO_FOR_COMMANDS + lcd_write_command(cmd1); + lcd_write_command(cmd2); + lcd_write_command(cmd3); +#else + /* combine writes to data register */ + while(SSP_SR & (1<<4)) /* BSY flag */ + ; + /* FIFO is empty at this point */ + + /* LCD command mode */ + GPIOB_PIN(2) = 0; + + /* !!makes assumption FIFO is at least (3) levels deep!! */ + SSP_DATA = cmd1; + SSP_DATA = cmd2; + SSP_DATA = cmd3; + + while(SSP_SR & (1<<4)) /* BSY flag */ + ; +#endif +} + void lcd_write_data(const fb_data* p_bytes, int count) { /* LCD data mode */ @@ -80,6 +105,13 @@ void lcd_write_data(const fb_data* p_bytes, int count) void lcd_enable_power(bool onoff) { +#ifndef BOOTLOADER + if (onoff) + bitset32(&CGU_PERI, CGU_SSP_CLOCK_ENABLE); + else + bitclr32(&CGU_PERI, CGU_SSP_CLOCK_ENABLE); +#else (void) onoff; +#endif } -- cgit v1.2.3