diff options
Diffstat (limited to 'firmware/target/arm/tms320dm320/mrobe-500/lcd-remote-mr500.c')
-rw-r--r-- | firmware/target/arm/tms320dm320/mrobe-500/lcd-remote-mr500.c | 204 |
1 files changed, 102 insertions, 102 deletions
diff --git a/firmware/target/arm/tms320dm320/mrobe-500/lcd-remote-mr500.c b/firmware/target/arm/tms320dm320/mrobe-500/lcd-remote-mr500.c index 5cdc00ce6a..0a41b2241f 100644 --- a/firmware/target/arm/tms320dm320/mrobe-500/lcd-remote-mr500.c +++ b/firmware/target/arm/tms320dm320/mrobe-500/lcd-remote-mr500.c | |||
@@ -33,17 +33,22 @@ static enum remote_control_states | |||
33 | REMOTE_CONTROL_NOP, | 33 | REMOTE_CONTROL_NOP, |
34 | REMOTE_CONTROL_POWER, | 34 | REMOTE_CONTROL_POWER, |
35 | REMOTE_CONTROL_MASK, | 35 | REMOTE_CONTROL_MASK, |
36 | REMOTE_CONTROL_DRAW1, | 36 | REMOTE_CONTROL_DRAW, |
37 | REMOTE_CONTROL_DRAW_PAUSE1, | ||
38 | REMOTE_CONTROL_DRAW2, | ||
39 | REMOTE_CONTROL_DRAW_PAUSE2, | ||
40 | REMOTE_CONTROL_SLEEP | 37 | REMOTE_CONTROL_SLEEP |
41 | } remote_state_control = REMOTE_CONTROL_NOP; | 38 | } remote_state_control = REMOTE_CONTROL_NOP, remote_state_control_next; |
39 | |||
40 | static enum remote_draw_states | ||
41 | { | ||
42 | DRAW_TOP, | ||
43 | DRAW_BOTTOM, | ||
44 | DRAW_PAUSE, | ||
45 | } remote_state_draw = DRAW_TOP, remote_state_draw_next; | ||
42 | 46 | ||
43 | bool remote_initialized=true; | 47 | bool remote_initialized=true; |
44 | 48 | ||
45 | unsigned char remote_contrast=DEFAULT_REMOTE_CONTRAST_SETTING; | 49 | unsigned char remote_contrast=DEFAULT_REMOTE_CONTRAST_SETTING; |
46 | unsigned char remote_power=0x00; | 50 | unsigned char remote_power=0x00; |
51 | unsigned char remote_mask=0x00; | ||
47 | 52 | ||
48 | /*** hardware configuration ***/ | 53 | /*** hardware configuration ***/ |
49 | 54 | ||
@@ -54,7 +59,7 @@ int lcd_remote_default_contrast(void) | |||
54 | 59 | ||
55 | void lcd_remote_sleep(void) | 60 | void lcd_remote_sleep(void) |
56 | { | 61 | { |
57 | remote_state_control=REMOTE_CONTROL_SLEEP; | 62 | remote_state_control_next=REMOTE_CONTROL_SLEEP; |
58 | } | 63 | } |
59 | 64 | ||
60 | void lcd_remote_powersave(bool on) | 65 | void lcd_remote_powersave(bool on) |
@@ -62,19 +67,19 @@ void lcd_remote_powersave(bool on) | |||
62 | if(on) | 67 | if(on) |
63 | { | 68 | { |
64 | remote_power|=0xC0; | 69 | remote_power|=0xC0; |
65 | remote_state_control=REMOTE_CONTROL_POWER; | 70 | remote_state_control_next=REMOTE_CONTROL_POWER; |
66 | } | 71 | } |
67 | else | 72 | else |
68 | { | 73 | { |
69 | remote_power&=~(0xC0); | 74 | remote_power&=~(0xC0); |
70 | remote_state_control=REMOTE_CONTROL_POWER; | 75 | remote_state_control_next=REMOTE_CONTROL_POWER; |
71 | } | 76 | } |
72 | } | 77 | } |
73 | 78 | ||
74 | void lcd_remote_set_contrast(int val) | 79 | void lcd_remote_set_contrast(int val) |
75 | { | 80 | { |
76 | remote_contrast=(char)val; | 81 | remote_contrast=(char)val; |
77 | remote_state_control=REMOTE_CONTROL_POWER; | 82 | remote_state_control_next=REMOTE_CONTROL_POWER; |
78 | } | 83 | } |
79 | 84 | ||
80 | void lcd_remote_set_invert_display(bool yesno) | 85 | void lcd_remote_set_invert_display(bool yesno) |
@@ -82,12 +87,6 @@ void lcd_remote_set_invert_display(bool yesno) | |||
82 | (void)yesno; | 87 | (void)yesno; |
83 | } | 88 | } |
84 | 89 | ||
85 | /* turn the display upside down (call lcd_remote_update() afterwards) */ | ||
86 | void lcd_remote_set_flip(bool yesno) | ||
87 | { | ||
88 | (void)yesno; | ||
89 | } | ||
90 | |||
91 | bool remote_detect(void) | 90 | bool remote_detect(void) |
92 | { | 91 | { |
93 | return true; | 92 | return true; |
@@ -96,32 +95,41 @@ bool remote_detect(void) | |||
96 | void lcd_remote_on(void) | 95 | void lcd_remote_on(void) |
97 | { | 96 | { |
98 | remote_power|=0x80; | 97 | remote_power|=0x80; |
99 | remote_state_control=REMOTE_CONTROL_POWER; | 98 | remote_state_control_next=REMOTE_CONTROL_POWER; |
100 | } | 99 | } |
101 | 100 | ||
102 | void lcd_remote_off(void) | 101 | void lcd_remote_off(void) |
103 | { | 102 | { |
104 | remote_power&=~(0x80); | 103 | remote_power&=~(0x80); |
105 | remote_state_control=REMOTE_CONTROL_POWER; | 104 | remote_state_control_next=REMOTE_CONTROL_POWER; |
106 | } | 105 | } |
107 | 106 | ||
108 | unsigned char lcd_remote_test[16]= | 107 | /* This is the maximum transfer size to the remote (op 0x51= 7 bytes setup+79 |
109 | {0x80,0xFF,0x80,0x00,0xFF,0x89,0x89,0x00,0xC1,0x89,0x8F,0x80,0xFF,0x80,0,0}; | 108 | * bytes screen data+xor+sum |
109 | */ | ||
110 | unsigned char remote_payload[88]; | ||
111 | unsigned char remote_payload_size; | ||
112 | bool remote_repeat_draw=false; | ||
113 | |||
114 | unsigned char remote_draw_x, remote_draw_y, | ||
115 | remote_draw_width, remote_draw_height; | ||
110 | 116 | ||
111 | /* Monitor remote hotswap */ | 117 | /* Monitor remote hotswap */ |
112 | static void remote_tick(void) | 118 | static void remote_tick(void) |
113 | { | 119 | { |
114 | unsigned char i; | 120 | unsigned char i; |
115 | unsigned char remote_payload[10], remote_payload_size; | 121 | static unsigned char pause_length=0; |
116 | unsigned char remote_check_xor, remote_check_sum; | 122 | |
123 | if(remote_state_control!=REMOTE_CONTROL_DRAW) | ||
124 | remote_state_control=remote_state_control_next; | ||
117 | 125 | ||
118 | switch (remote_state_control) | 126 | switch (remote_state_control) |
119 | { | 127 | { |
120 | case REMOTE_CONTROL_IDLE: | 128 | case REMOTE_CONTROL_IDLE: |
121 | |||
122 | remote_payload_size=0; | 129 | remote_payload_size=0; |
123 | remote_state_control=REMOTE_CONTROL_IDLE; | 130 | remote_state_control=REMOTE_CONTROL_IDLE; |
124 | break; | 131 | break; |
132 | |||
125 | case REMOTE_CONTROL_NOP: | 133 | case REMOTE_CONTROL_NOP: |
126 | remote_payload[0]=0x11; | 134 | remote_payload[0]=0x11; |
127 | remote_payload[1]=0x30; | 135 | remote_payload[1]=0x30; |
@@ -129,6 +137,7 @@ static void remote_tick(void) | |||
129 | remote_payload_size=2; | 137 | remote_payload_size=2; |
130 | remote_state_control=REMOTE_CONTROL_NOP; | 138 | remote_state_control=REMOTE_CONTROL_NOP; |
131 | break; | 139 | break; |
140 | |||
132 | case REMOTE_CONTROL_POWER: | 141 | case REMOTE_CONTROL_POWER: |
133 | remote_payload[0]=0x31; | 142 | remote_payload[0]=0x31; |
134 | remote_payload[1]=remote_power; | 143 | remote_payload[1]=remote_power; |
@@ -137,51 +146,65 @@ static void remote_tick(void) | |||
137 | remote_payload_size=3; | 146 | remote_payload_size=3; |
138 | remote_state_control=REMOTE_CONTROL_NOP; | 147 | remote_state_control=REMOTE_CONTROL_NOP; |
139 | break; | 148 | break; |
149 | |||
140 | case REMOTE_CONTROL_MASK: | 150 | case REMOTE_CONTROL_MASK: |
141 | remote_payload[0]=0x41; | 151 | remote_payload[0]=0x41; |
142 | remote_payload[1]=0x94; | 152 | remote_payload[1]=remote_mask; |
143 | 153 | ||
144 | remote_payload_size=2; | 154 | remote_payload_size=2; |
145 | remote_state_control=REMOTE_CONTROL_NOP; | 155 | remote_state_control=REMOTE_CONTROL_NOP; |
146 | break; | 156 | break; |
147 | case REMOTE_CONTROL_DRAW1: | ||
148 | remote_payload[0]=0x51; | ||
149 | remote_payload[1]=0x80; | ||
150 | remote_payload[2]=14; | ||
151 | remote_payload[3]=0; | ||
152 | remote_payload[4]=0; | ||
153 | remote_payload[5]=14; | ||
154 | remote_payload[6]=8; | ||
155 | |||
156 | remote_payload_size=7; | ||
157 | remote_state_control=REMOTE_CONTROL_DRAW_PAUSE1; | ||
158 | break; | ||
159 | case REMOTE_CONTROL_DRAW_PAUSE1: | ||
160 | remote_payload[0]=0x11; | ||
161 | remote_payload[1]=0x30; | ||
162 | 157 | ||
163 | remote_payload_size=2; | 158 | case REMOTE_CONTROL_DRAW: |
164 | remote_state_control=REMOTE_CONTROL_DRAW2; | ||
165 | break; | ||
166 | case REMOTE_CONTROL_DRAW2: | ||
167 | remote_payload[0]=0x51; | 159 | remote_payload[0]=0x51; |
168 | remote_payload[1]=0x80; | 160 | remote_payload[1]=0x80; |
169 | remote_payload[2]=14; | 161 | remote_payload[2]=remote_draw_width; |
170 | remote_payload[3]=0; | 162 | remote_payload[3]=remote_draw_x; |
171 | remote_payload[4]=8; | ||
172 | remote_payload[5]=14; | ||
173 | remote_payload[6]=16; | ||
174 | 163 | ||
175 | remote_payload_size=7; | 164 | remote_payload[5]=remote_draw_x+remote_draw_width; |
176 | remote_state_control=REMOTE_CONTROL_DRAW_PAUSE2; | 165 | remote_payload_size=7+remote_payload[2]; |
177 | break; | ||
178 | case REMOTE_CONTROL_DRAW_PAUSE2: | ||
179 | remote_payload[0]=0x11; | ||
180 | remote_payload[1]=0x30; | ||
181 | 166 | ||
182 | remote_payload_size=2; | 167 | switch (remote_state_draw) |
183 | remote_state_control=REMOTE_CONTROL_NOP; | 168 | { |
169 | case DRAW_TOP: | ||
170 | remote_payload[4]=0; | ||
171 | remote_payload[6]=8; | ||
172 | |||
173 | pause_length=6; | ||
174 | remote_state_draw_next=DRAW_BOTTOM; | ||
175 | remote_state_draw=DRAW_PAUSE; | ||
176 | break; | ||
177 | |||
178 | case DRAW_BOTTOM: | ||
179 | remote_payload[4]=8; | ||
180 | remote_payload[6]=16; | ||
181 | |||
182 | pause_length=6; | ||
183 | remote_state_draw_next=DRAW_TOP; | ||
184 | remote_state_draw=DRAW_PAUSE; | ||
185 | break; | ||
186 | |||
187 | case DRAW_PAUSE: | ||
188 | remote_payload_size=0; | ||
189 | |||
190 | if(--pause_length==0) | ||
191 | { | ||
192 | if(remote_state_draw_next==DRAW_TOP) | ||
193 | remote_state_control=REMOTE_CONTROL_NOP; | ||
194 | |||
195 | remote_state_draw=remote_state_draw_next; | ||
196 | } | ||
197 | else | ||
198 | remote_state_draw=DRAW_PAUSE; | ||
199 | |||
200 | break; | ||
201 | |||
202 | default: | ||
203 | remote_payload_size=0; | ||
204 | break; | ||
205 | } | ||
184 | break; | 206 | break; |
207 | |||
185 | case REMOTE_CONTROL_SLEEP: | 208 | case REMOTE_CONTROL_SLEEP: |
186 | remote_payload[0]=0x71; | 209 | remote_payload[0]=0x71; |
187 | remote_payload[1]=0x30; | 210 | remote_payload[1]=0x30; |
@@ -189,6 +212,7 @@ static void remote_tick(void) | |||
189 | remote_payload_size=2; | 212 | remote_payload_size=2; |
190 | remote_state_control=REMOTE_CONTROL_IDLE; | 213 | remote_state_control=REMOTE_CONTROL_IDLE; |
191 | break; | 214 | break; |
215 | |||
192 | default: | 216 | default: |
193 | remote_payload_size=0; | 217 | remote_payload_size=0; |
194 | break; | 218 | break; |
@@ -199,46 +223,25 @@ static void remote_tick(void) | |||
199 | return; | 223 | return; |
200 | } | 224 | } |
201 | 225 | ||
202 | remote_check_xor=remote_payload[0]; | ||
203 | remote_check_sum=remote_payload[0]; | ||
204 | for(i=1; i<remote_payload_size; i++) | ||
205 | { | ||
206 | remote_check_xor^=remote_payload[i]; | ||
207 | remote_check_sum+=remote_payload[i]; | ||
208 | } | ||
209 | |||
210 | if(remote_payload[0]==0x51) | 226 | if(remote_payload[0]==0x51) |
211 | { | 227 | { |
212 | unsigned char offset; | 228 | for(i=7; i<remote_payload_size; i++) |
213 | unsigned char x; | ||
214 | |||
215 | if(remote_payload[4]==8) | ||
216 | { | ||
217 | offset=79; | ||
218 | } | ||
219 | else | ||
220 | { | ||
221 | offset=0; | ||
222 | } | ||
223 | |||
224 | for (x = 0; x < 14; x++) | ||
225 | { | 229 | { |
226 | remote_check_xor^=lcd_remote_test[x]; | 230 | remote_payload[i]= |
227 | remote_check_sum+=lcd_remote_test[x]; | 231 | lcd_remote_framebuffer[remote_payload[4]>>3][i+remote_draw_x-7]; |
228 | } | 232 | } |
229 | |||
230 | uart1_puts(remote_payload, remote_payload_size); | ||
231 | lcd_remote_test[14]=remote_check_xor; | ||
232 | lcd_remote_test[15]=remote_check_sum; | ||
233 | uart1_puts(lcd_remote_test, 16); | ||
234 | } | 233 | } |
235 | else | ||
236 | { | ||
237 | remote_payload[remote_payload_size]=remote_check_xor; | ||
238 | remote_payload[remote_payload_size+1]=remote_check_sum; | ||
239 | 234 | ||
240 | uart1_puts(remote_payload, remote_payload_size+2); | 235 | /* Calculate the xor and sum to place in the payload */ |
236 | remote_payload[remote_payload_size]=remote_payload[0]; | ||
237 | remote_payload[remote_payload_size+1]=remote_payload[0]; | ||
238 | for(i=1; i<remote_payload_size; i++) | ||
239 | { | ||
240 | remote_payload[remote_payload_size]^=remote_payload[i]; | ||
241 | remote_payload[remote_payload_size+1]+=remote_payload[i]; | ||
241 | } | 242 | } |
243 | |||
244 | uart1_puts(remote_payload, remote_payload_size+2); | ||
242 | } | 245 | } |
243 | 246 | ||
244 | void lcd_remote_init_device(void) | 247 | void lcd_remote_init_device(void) |
@@ -247,6 +250,8 @@ void lcd_remote_init_device(void) | |||
247 | if (remote_detect()) | 250 | if (remote_detect()) |
248 | lcd_remote_on(); | 251 | lcd_remote_on(); |
249 | 252 | ||
253 | lcd_remote_update(); | ||
254 | |||
250 | /* put the remote control in the tick task */ | 255 | /* put the remote control in the tick task */ |
251 | tick_add_task(remote_tick); | 256 | tick_add_task(remote_tick); |
252 | } | 257 | } |
@@ -255,33 +260,28 @@ void lcd_remote_init_device(void) | |||
255 | This must be called after all other LCD functions that change the display. */ | 260 | This must be called after all other LCD functions that change the display. */ |
256 | void lcd_remote_update(void) | 261 | void lcd_remote_update(void) |
257 | { | 262 | { |
258 | if(remote_state_control!=REMOTE_CONTROL_DRAW1 | 263 | lcd_remote_update_rect(0, 0, LCD_REMOTE_WIDTH, LCD_REMOTE_HEIGHT); |
259 | && remote_state_control!=REMOTE_CONTROL_DRAW_PAUSE1 | ||
260 | && remote_state_control!=REMOTE_CONTROL_DRAW2 | ||
261 | && remote_state_control!=REMOTE_CONTROL_DRAW_PAUSE2) | ||
262 | { | ||
263 | remote_state_control=REMOTE_CONTROL_DRAW1; | ||
264 | } | ||
265 | } | 264 | } |
266 | 265 | ||
267 | /* Update a fraction of the display. */ | 266 | /* Update a fraction of the display. */ |
268 | void lcd_remote_update_rect(int x, int y, int width, int height) | 267 | void lcd_remote_update_rect(int x, int y, int width, int height) |
269 | { | 268 | { |
270 | (void)x; | 269 | remote_draw_x=x; |
271 | (void)y; | 270 | remote_draw_y=y; |
272 | (void)width; | 271 | remote_draw_width=width; |
273 | (void)height; | 272 | remote_draw_height=height; |
274 | lcd_remote_update(); | 273 | |
274 | remote_state_control=REMOTE_CONTROL_DRAW; | ||
275 | } | 275 | } |
276 | 276 | ||
277 | void _remote_backlight_on(void) | 277 | void _remote_backlight_on(void) |
278 | { | 278 | { |
279 | remote_power|=0x40; | 279 | remote_power|=0x40; |
280 | remote_state_control=REMOTE_CONTROL_POWER; | 280 | remote_state_control_next=REMOTE_CONTROL_POWER; |
281 | } | 281 | } |
282 | 282 | ||
283 | void _remote_backlight_off(void) | 283 | void _remote_backlight_off(void) |
284 | { | 284 | { |
285 | remote_power&=~(0x40); | 285 | remote_power&=~(0x40); |
286 | remote_state_control=REMOTE_CONTROL_POWER; | 286 | remote_state_control_next=REMOTE_CONTROL_POWER; |
287 | } | 287 | } |