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-clipv2/lcd-clipv2.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-clipv2/lcd-clipv2.c')
-rw-r--r-- | firmware/target/arm/as3525/sansa-clipv2/lcd-clipv2.c | 29 |
1 files changed, 29 insertions, 0 deletions
diff --git a/firmware/target/arm/as3525/sansa-clipv2/lcd-clipv2.c b/firmware/target/arm/as3525/sansa-clipv2/lcd-clipv2.c index d7266f72a0..0b3317255a 100644 --- a/firmware/target/arm/as3525/sansa-clipv2/lcd-clipv2.c +++ b/firmware/target/arm/as3525/sansa-clipv2/lcd-clipv2.c | |||
@@ -63,6 +63,35 @@ void lcd_write_command(int byte) | |||
63 | DBOP_TIMPOL_23 = 0xE037E037; | 63 | DBOP_TIMPOL_23 = 0xE037E037; |
64 | } | 64 | } |
65 | 65 | ||
66 | void lcd_write_cmd_triplet(int cmd1, int cmd2, int cmd3) | ||
67 | { | ||
68 | #ifndef LCD_USE_FIFO_FOR_COMMANDS | ||
69 | lcd_write_command(cmd1); | ||
70 | lcd_write_command(cmd2); | ||
71 | lcd_write_command(cmd3); | ||
72 | #else | ||
73 | /* combine writes to data register */ | ||
74 | |||
75 | while ((DBOP_STAT & (1<<10)) == 0) /* While push fifo is not empty */ | ||
76 | ; | ||
77 | /* FIFO is empty at this point */ | ||
78 | /* unset D/C# (data or command) */ | ||
79 | GPIOB_PIN(2) = 0; | ||
80 | DBOP_TIMPOL_23 = 0xE0370036; | ||
81 | |||
82 | /* Write command */ | ||
83 | /* !!makes assumption FIFO is at least (3) levels deep! */ | ||
84 | DBOP_DOUT8 = cmd1; | ||
85 | DBOP_DOUT8 = cmd2; | ||
86 | DBOP_DOUT8 = cmd3; | ||
87 | /* While push fifo is not empty */ | ||
88 | while ((DBOP_STAT & (1<<10)) == 0) | ||
89 | ; | ||
90 | |||
91 | DBOP_TIMPOL_23 = 0xE037E037; | ||
92 | #endif | ||
93 | } | ||
94 | |||
66 | void lcd_write_data(const fb_data* p_bytes, int count) | 95 | void lcd_write_data(const fb_data* p_bytes, int count) |
67 | { | 96 | { |
68 | volatile int i = 0; | 97 | volatile int i = 0; |