summaryrefslogtreecommitdiff
path: root/firmware/target/arm/as3525/sansa-clipv2/lcd-clipv2.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-clipv2/lcd-clipv2.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-clipv2/lcd-clipv2.c')
-rw-r--r--firmware/target/arm/as3525/sansa-clipv2/lcd-clipv2.c29
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
66void 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
66void lcd_write_data(const fb_data* p_bytes, int count) 95void lcd_write_data(const fb_data* p_bytes, int count)
67{ 96{
68 volatile int i = 0; 97 volatile int i = 0;