mirror of
https://github.com/Rockbox/rockbox.git
synced 2025-12-08 20:55:17 -05:00
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:
parent
056d4b0ec0
commit
dcd71e66bd
5 changed files with 224 additions and 78 deletions
|
|
@ -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
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue