FreeCalypso > hg > fc-selenite
comparison src/cs/drivers/drv_app/r2d/lcds/Simple/r2d_task_i.c @ 0:b6a5e36de839
src/cs: initial import from Magnetite
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Sun, 15 Jul 2018 04:39:26 +0000 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:b6a5e36de839 |
---|---|
1 | |
2 #ifndef _WINDOWS | |
3 #include "r2d/uwire.h" | |
4 #endif | |
5 | |
6 | |
7 | |
8 //value to transmit in order to set the x position on the lcd | |
9 static const char x_position[DISP_PIXELWIDTH] ={0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f, | |
10 0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9a,0x9b,0x9c,0x9d,0x9e,0x9f, | |
11 0xa0,0xa1,0xa2,0xa3,0xa4,0xa5,0xa6,0xa7,0xa8,0xa9,0xaa,0xab,0xac,0xad,0xae,0xaf, | |
12 0xb0,0xb1,0xb2,0xb3,0xb4,0xb5,0xb6,0xb7,0xb8,0xb9,0xba,0xbb,0xbc,0xbd,0xbe,0xbf, | |
13 0xc0,0xc1,0xc2,0xc3,0xc4,0xc5,0xc6,0xc7,0xc8,0xc9,0xca,0xcb,0xcc,0xcd,0xce,0xcf, | |
14 0xd0,0xd1,0xd2,0xd3}; | |
15 | |
16 //value to transmit in order to set the y position on the lcd | |
17 static const char y_position[DISP_PAGEHEIGHT] ={0x40,0x41,0x42,0x43,0x44,0x45}; | |
18 | |
19 | |
20 UINT32 r2d_p_refresh_buffer[4*R2D_WIDTH*R2D_MWHEIGHT]; | |
21 | |
22 | |
23 #if (R2D_BENCHMARKING == R2D_ON) | |
24 UINT32 r2d_g_tick=0; | |
25 #endif | |
26 | |
27 | |
28 #ifndef _WINDOWS | |
29 void r2d_int_set_DC_low(void) | |
30 { | |
31 * (volatile UINT16 *) GPIO_OUT &= ~(0x02); //gpio(1) ->0 | |
32 } | |
33 | |
34 /********************************************************************/ | |
35 /* set the DC input to high for data transmission */ | |
36 /* */ | |
37 /********************************************************************/ | |
38 void r2d_int_set_DC_high(void) | |
39 { | |
40 * (volatile UINT16 *) GPIO_OUT |= 0x02; //gpio(1) ->1 | |
41 } | |
42 | |
43 | |
44 static void r2d_int_lcd_transmit_cmd(UINT8 cmd) | |
45 { | |
46 r2d_int_set_DC_low(); | |
47 * (volatile UINT16 *) TDR = cmd <<8; | |
48 * (volatile UINT16 *) CSR |= NB_BITS_WR_8 + CS_CMD + START ; // transmit command data | |
49 while (((* (volatile UINT16 *) CSR) & CSRB) != 0 ); // wait for end of WRITE | |
50 * (volatile UINT16 *) CSR &= ~CS_CMD; // clears Chip Select | |
51 } | |
52 | |
53 static BOOLEAN r2d_int_lcd_polling(void) | |
54 { | |
55 if (((* (volatile UINT16 *) CSR) & CSRB) == 0 ) | |
56 { | |
57 * (volatile UINT16 *) CSR &= ~CS_CMD; // clears Chip Select | |
58 return(TRUE); | |
59 } | |
60 else | |
61 return(FALSE); | |
62 } | |
63 | |
64 | |
65 | |
66 #endif | |
67 | |
68 void r2d_lcd_power_on(void) | |
69 { | |
70 } | |
71 | |
72 void r2d_lcd_power_off(void) | |
73 { | |
74 } | |
75 | |
76 void r2d_refresh(void) | |
77 { | |
78 UINT16 i,j; | |
79 | |
80 UINT32 v; | |
81 | |
82 UINT32 *buffer_end,*buffer_write; | |
83 UINT32 *p,*writing; | |
84 INT32 *buffer_read; | |
85 UINT16 byte; | |
86 | |
87 #if (R2D_BENCHMARKING == R2D_ON) | |
88 | |
89 UINT32 time,k; | |
90 | |
91 if (!r2d_g_tick) | |
92 { | |
93 time=rvf_get_tick_count(); | |
94 | |
95 } | |
96 | |
97 | |
98 for(k=0;k<R2D_REFRESH_LOOP;k++) | |
99 { | |
100 #endif | |
101 #ifndef _WINDOWS | |
102 r2d_int_lcd_transmit_cmd(x_position[0]);// set X to 0 | |
103 r2d_int_lcd_transmit_cmd(y_position[0]);// set Y to 0 | |
104 #else | |
105 lcd_transmit_cmd(x_position[0]);// set X to 0 | |
106 lcd_transmit_cmd(y_position[0]);// set Y to 0 | |
107 #endif | |
108 //rvf_send_trace("R2D REFRESH",strlen("R2D REFRESH"), NULL_PARAM, | |
109 // RV_TRACE_LEVEL_DEBUG_HIGH, TRACE_XXX ); | |
110 | |
111 p=r2d_g_framebuffer->p_memory_words; | |
112 | |
113 // First word out of refresh buffer | |
114 buffer_end=r2d_p_refresh_buffer+(R2D_HEIGHT>>3)*R2D_WIDTH; | |
115 buffer_read=(INT32*)r2d_p_refresh_buffer; | |
116 buffer_write=r2d_p_refresh_buffer; | |
117 writing=buffer_write-R2D_WIDTH; | |
118 | |
119 | |
120 i=0; | |
121 while(i<R2D_WIDTH) | |
122 { | |
123 j=0; | |
124 while(j<R2D_MWHEIGHT) | |
125 { | |
126 // If can read a new word from framebuffer | |
127 // and write it to refresh buffer | |
128 //if (r2d_p_refresh_state[i]+4<=R2D_MWHEIGHT*4) | |
129 { | |
130 //r2d_p_refresh_state[i]+=4; | |
131 v=*p++; | |
132 j++; | |
133 | |
134 writing+=R2D_WIDTH; | |
135 *writing = (v & 0xFF) | 0x80000000; | |
136 | |
137 v=v>>8; | |
138 writing+=R2D_WIDTH; | |
139 *writing = (v & 0xFF) | 0x80000000; | |
140 | |
141 v=v>>8; | |
142 writing+=R2D_WIDTH; | |
143 *writing = (v & 0xFF) | 0x80000000; | |
144 | |
145 v=v>>8; | |
146 writing+=R2D_WIDTH; | |
147 *writing = (v & 0xFF) | 0x80000000; | |
148 | |
149 | |
150 | |
151 | |
152 } | |
153 | |
154 #ifndef _WINDOWS | |
155 if ((r2d_int_lcd_polling()) && (buffer_read != (INT32*)buffer_end)) | |
156 #else | |
157 // If polling finished | |
158 if ((lcd_polling()) && (buffer_read != (INT32*)buffer_end)) | |
159 #endif | |
160 { | |
161 // If new data is available | |
162 // to be sent to LCD | |
163 if (*buffer_read<0) | |
164 { | |
165 #ifndef _WINDOWS | |
166 * (volatile UINT16 *) GPIO_OUT |= 0x02; //gpio(1) ->1 | |
167 * (volatile UINT16 *) TDR = *buffer_read <<8; | |
168 * (volatile UINT16 *) CSR |= NB_BITS_WR_8 + CS_CMD + START ; // transmit data | |
169 #else | |
170 lcd_transmit_data(*buffer_read); | |
171 #endif | |
172 | |
173 *buffer_read++=0; | |
174 | |
175 } | |
176 } | |
177 | |
178 | |
179 | |
180 } | |
181 i++; | |
182 writing=(++buffer_write) - R2D_WIDTH;; | |
183 } | |
184 // Finish sending datas to LCD | |
185 while(buffer_read!=(INT32*)buffer_end) | |
186 { | |
187 #ifndef _WINDOWS | |
188 if (r2d_int_lcd_polling()) | |
189 #else | |
190 if (lcd_polling()) | |
191 #endif | |
192 { | |
193 // If new data is available | |
194 // to be sent to LCD | |
195 if (*buffer_read<0) | |
196 { | |
197 | |
198 #ifndef _WINDOWS | |
199 * (volatile UINT16 *) GPIO_OUT |= 0x02; //gpio(1) ->1 | |
200 * (volatile UINT16 *) TDR = *buffer_read <<8; | |
201 * (volatile UINT16 *) CSR |= NB_BITS_WR_8 + CS_CMD + START ; // transmit data | |
202 #else | |
203 lcd_transmit_data(*buffer_read); | |
204 #endif | |
205 *buffer_read++=0; | |
206 | |
207 | |
208 } | |
209 } | |
210 } | |
211 | |
212 #if (R2D_BENCHMARKING == R2D_ON) | |
213 } // End benchmarking | |
214 #endif | |
215 | |
216 r2d_reinit_update_region(); | |
217 | |
218 #ifdef _WINDOWS | |
219 lcd_refresh(); | |
220 #endif | |
221 | |
222 #if (R2D_BENCHMARKING == R2D_ON) | |
223 if (r2d_g_tick==0) | |
224 { | |
225 time=rvf_get_tick_count()-time; | |
226 r2d_g_tick=1; | |
227 rvf_send_trace("R2D : Nb refreshs",17,R2D_REFRESH_LOOP, | |
228 RV_TRACE_LEVEL_ERROR, TRACE_R2D ); | |
229 rvf_send_trace("R2D : Ms=",9,time*10, | |
230 RV_TRACE_LEVEL_ERROR, TRACE_R2D ); | |
231 } | |
232 #endif | |
233 } | |
234 | |
235 | |
236 |