summaryrefslogtreecommitdiff
path: root/firmware/target/arm/as3525/sansa-clipplus/lcd-clip-plus.c
diff options
context:
space:
mode:
authorWilliam Wilgus <me.theuser@yahoo.com>2017-12-14 06:22:04 +0100
committerWilliam Wilgus <me.theuser@yahoo.com>2018-07-26 04:23:28 +0200
commitdcd71e66bd5f0b521c9f98ebe83ff1f7abb62918 (patch)
tree418633d02677aa6f81e6fafa524a181554c823d4 /firmware/target/arm/as3525/sansa-clipplus/lcd-clip-plus.c
parent056d4b0ec044aedd14bd657f4b6a6f8e96c127e3 (diff)
downloadrockbox-dcd71e66bd5f0b521c9f98ebe83ff1f7abb62918.tar.gz
rockbox-dcd71e66bd5f0b521c9f98ebe83ff1f7abb62918.zip
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
Diffstat (limited to 'firmware/target/arm/as3525/sansa-clipplus/lcd-clip-plus.c')
-rw-r--r--firmware/target/arm/as3525/sansa-clipplus/lcd-clip-plus.c32
1 files changed, 32 insertions, 0 deletions
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)
64 ; 64 ;
65} 65}
66 66
67void lcd_write_cmd_triplet(int cmd1, int cmd2, int cmd3)
68{
69#ifndef LCD_USE_FIFO_FOR_COMMANDS
70 lcd_write_command(cmd1);
71 lcd_write_command(cmd2);
72 lcd_write_command(cmd3);
73#else
74 /* combine writes to data register */
75 while(SSP_SR & (1<<4)) /* BSY flag */
76 ;
77 /* FIFO is empty at this point */
78
79 /* LCD command mode */
80 GPIOB_PIN(2) = 0;
81
82 /* !!makes assumption FIFO is at least (3) levels deep!! */
83 SSP_DATA = cmd1;
84 SSP_DATA = cmd2;
85 SSP_DATA = cmd3;
86
87 while(SSP_SR & (1<<4)) /* BSY flag */
88 ;
89#endif
90}
91
67void lcd_write_data(const fb_data* p_bytes, int count) 92void lcd_write_data(const fb_data* p_bytes, int count)
68{ 93{
69 /* LCD data mode */ 94 /* LCD data mode */
@@ -80,6 +105,13 @@ void lcd_write_data(const fb_data* p_bytes, int count)
80 105
81void lcd_enable_power(bool onoff) 106void lcd_enable_power(bool onoff)
82{ 107{
108#ifndef BOOTLOADER
109 if (onoff)
110 bitset32(&CGU_PERI, CGU_SSP_CLOCK_ENABLE);
111 else
112 bitclr32(&CGU_PERI, CGU_SSP_CLOCK_ENABLE);
113#else
83 (void) onoff; 114 (void) onoff;
115#endif
84} 116}
85 117