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
This commit is contained in:
William Wilgus 2017-12-14 06:22:04 +01:00
parent 056d4b0ec0
commit dcd71e66bd
5 changed files with 224 additions and 78 deletions

View file

@ -69,6 +69,34 @@ 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 ((DBOP_STAT & (1<<10)) == 0) /* While push fifo is not empty */
;
/* FIFO is empty at this point */
/* unset D/C# (data or command) */
GPIOA_PIN(5) = 0;
/* Write command */
/* !!makes assumption FIFO is at least (3) levels deep! */
/* Only bits 15:12 and 3:0 of DBOP_DOUT are meaningful */
DBOP_DOUT = (cmd1 << 8) | cmd1;
DBOP_DOUT = (cmd2 << 8) | cmd2;
DBOP_DOUT = (cmd3 << 8) | cmd3;
/* While push fifo is not empty */
while ((DBOP_STAT & (1<<10)) == 0)
;
#endif
}
void lcd_write_data(const fb_data* p_bytes, int count)
{
volatile int i = 0;