diff options
author | William Wilgus <me.theuser@yahoo.com> | 2017-12-14 06:22:04 +0100 |
---|---|---|
committer | William Wilgus <me.theuser@yahoo.com> | 2018-07-26 04:23:28 +0200 |
commit | dcd71e66bd5f0b521c9f98ebe83ff1f7abb62918 (patch) | |
tree | 418633d02677aa6f81e6fafa524a181554c823d4 /firmware/target/arm/as3525/sansa-clipplus | |
parent | 056d4b0ec044aedd14bd657f4b6a6f8e96c127e3 (diff) | |
download | rockbox-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')
-rw-r--r-- | firmware/target/arm/as3525/sansa-clipplus/lcd-clip-plus.c | 32 |
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 | ||
67 | void 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 | |||
67 | void lcd_write_data(const fb_data* p_bytes, int count) | 92 | void 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 | ||
81 | void lcd_enable_power(bool onoff) | 106 | void 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 | ||