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-clip/lcd-clip.c | |
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-clip/lcd-clip.c')
-rw-r--r-- | firmware/target/arm/as3525/sansa-clip/lcd-clip.c | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/firmware/target/arm/as3525/sansa-clip/lcd-clip.c b/firmware/target/arm/as3525/sansa-clip/lcd-clip.c index 21d8902739..8331b9e895 100644 --- a/firmware/target/arm/as3525/sansa-clip/lcd-clip.c +++ b/firmware/target/arm/as3525/sansa-clip/lcd-clip.c | |||
@@ -69,6 +69,34 @@ void lcd_write_command(int byte) | |||
69 | ; | 69 | ; |
70 | } | 70 | } |
71 | 71 | ||
72 | void lcd_write_cmd_triplet(int cmd1, int cmd2, int cmd3) | ||
73 | { | ||
74 | #ifndef LCD_USE_FIFO_FOR_COMMANDS | ||
75 | lcd_write_command(cmd1); | ||
76 | lcd_write_command(cmd2); | ||
77 | lcd_write_command(cmd3); | ||
78 | #else | ||
79 | /* combine writes to data register */ | ||
80 | |||
81 | while ((DBOP_STAT & (1<<10)) == 0) /* While push fifo is not empty */ | ||
82 | ; | ||
83 | /* FIFO is empty at this point */ | ||
84 | |||
85 | /* unset D/C# (data or command) */ | ||
86 | GPIOA_PIN(5) = 0; | ||
87 | |||
88 | /* Write command */ | ||
89 | /* !!makes assumption FIFO is at least (3) levels deep! */ | ||
90 | /* Only bits 15:12 and 3:0 of DBOP_DOUT are meaningful */ | ||
91 | DBOP_DOUT = (cmd1 << 8) | cmd1; | ||
92 | DBOP_DOUT = (cmd2 << 8) | cmd2; | ||
93 | DBOP_DOUT = (cmd3 << 8) | cmd3; | ||
94 | /* While push fifo is not empty */ | ||
95 | while ((DBOP_STAT & (1<<10)) == 0) | ||
96 | ; | ||
97 | #endif | ||
98 | } | ||
99 | |||
72 | void lcd_write_data(const fb_data* p_bytes, int count) | 100 | void lcd_write_data(const fb_data* p_bytes, int count) |
73 | { | 101 | { |
74 | volatile int i = 0; | 102 | volatile int i = 0; |