summaryrefslogtreecommitdiff
path: root/firmware/target/arm
diff options
context:
space:
mode:
Diffstat (limited to 'firmware/target/arm')
-rw-r--r--firmware/target/arm/tms320dm320/app.lds14
-rw-r--r--firmware/target/arm/tms320dm320/mrobe-500/lcd-mr500.c213
2 files changed, 109 insertions, 118 deletions
diff --git a/firmware/target/arm/tms320dm320/app.lds b/firmware/target/arm/tms320dm320/app.lds
index 14b44153a6..2c74278142 100644
--- a/firmware/target/arm/tms320dm320/app.lds
+++ b/firmware/target/arm/tms320dm320/app.lds
@@ -118,44 +118,38 @@ SECTIONS
118 stackend = .; 118 stackend = .;
119 } > IRAM 119 } > IRAM
120 120
121 /* This could probably be shortened so that the audio buffer overwrites 121 /* This overwrites the iram (in ram), so make sure that the iram is copied
122 * at the IRAM stuff (assuming that it is copied first in crt0.S), but 122 * out in crt0.s before the bss section and the rest are used.
123 * leave it for now since the space is not critical at the moment.
124 */ 123 */
125 .bss (NOLOAD) : 124 .bss (NOLOAD) :
126 { 125 {
127 . = ADDR(.data) + SIZEOF(.data) + SIZEOF(.vectors) + SIZEOF(.iram); 126 . = ADDR(.data) + SIZEOF(.data);
128 _edata = .; 127 _edata = .;
129 *(.bss*) 128 *(.bss*)
130 *(COMMON) 129 *(COMMON)
131 . = ALIGN(0x4); 130 . = ALIGN(0x4);
132 _end = .; 131 _end = .;
133 } > DRAM 132 } > DRAM
134
135 133
136 .audiobuf (NOLOAD) : 134 .audiobuf (NOLOAD) :
137 { 135 {
138 . = ALIGN(4); 136 . = ALIGN(4);
139 _audiobuffer = .;
140 audiobuffer = .; 137 audiobuffer = .;
141 } > DRAM 138 } > DRAM
142 139
143 .audiobufend ENDAUDIOADDR (NOLOAD) : 140 .audiobufend ENDAUDIOADDR (NOLOAD) :
144 { 141 {
145 audiobufend = .; 142 audiobufend = .;
146 _audiobufend = .;
147 } > DRAM 143 } > DRAM
148 144
149 .codec ENDAUDIOADDR (NOLOAD) : 145 .codec ENDAUDIOADDR (NOLOAD) :
150 { 146 {
151 codecbuf = .; 147 codecbuf = .;
152 _codecbuf = .;
153 . += CODEC_SIZE; 148 . += CODEC_SIZE;
154 } > DRAM 149 } > DRAM
155 150
156 .plugin (NOLOAD) : 151 .plugin (NOLOAD) :
157 { 152 {
158 _pluginbuf = .;
159 pluginbuf = .; 153 pluginbuf = .;
160 . += PLUGIN_BUFFER_SIZE; 154 . += PLUGIN_BUFFER_SIZE;
161 } > DRAM 155 } > DRAM
diff --git a/firmware/target/arm/tms320dm320/mrobe-500/lcd-mr500.c b/firmware/target/arm/tms320dm320/mrobe-500/lcd-mr500.c
index 97945397b2..a44a482324 100644
--- a/firmware/target/arm/tms320dm320/mrobe-500/lcd-mr500.c
+++ b/firmware/target/arm/tms320dm320/mrobe-500/lcd-mr500.c
@@ -63,10 +63,8 @@ void lcd_sleep()
63 memset16(FRAME, 0xFFFF, LCD_WIDTH*LCD_HEIGHT); 63 memset16(FRAME, 0xFFFF, LCD_WIDTH*LCD_HEIGHT);
64 sleep(HZ/5); 64 sleep(HZ/5);
65 /* Disabling these saves another ~15mA */ 65 /* Disabling these saves another ~15mA */
66 IO_OSD_OSDWINMD0&= ~(0x01); 66 IO_OSD_OSDWINMD0 &= ~(0x01);
67 IO_VID_ENC_VMOD &= ~(0x01); 67 IO_VID_ENC_VMOD &= ~(0x01);
68
69// IO_CLK_MOD1 &= ~(0x0018);
70 68
71 /* Disabling the LCD saves ~50mA */ 69 /* Disabling the LCD saves ~50mA */
72 IO_GIO_BITCLR2=1<<4; 70 IO_GIO_BITCLR2=1<<4;
@@ -79,13 +77,11 @@ void lcd_awake(void)
79 if (!lcd_on) 77 if (!lcd_on)
80 { 78 {
81 lcd_on=true; 79 lcd_on=true;
82 80 IO_OSD_OSDWINMD0 |= 0x01;
83// IO_CLK_MOD1 |= 0x0018; 81 IO_VID_ENC_VMOD |= 0x01;
84 IO_OSD_OSDWINMD0|= 0x01;
85 IO_VID_ENC_VMOD |= 0x01;
86 82
87 sleep(2); 83 sleep(2);
88 IO_GIO_BITSET2=1<<4; 84 IO_GIO_BITSET2 = 1<<4;
89 85
90 lcd_update(); 86 lcd_update();
91 87
@@ -113,121 +109,121 @@ void lcd_init_device(void)
113 /* Clear the Frame */ 109 /* Clear the Frame */
114 memset16(FRAME, 0x0000, LCD_WIDTH*LCD_HEIGHT); 110 memset16(FRAME, 0x0000, LCD_WIDTH*LCD_HEIGHT);
115 111
116 IO_OSD_OSDWINMD0&=~(0x0001); 112 IO_OSD_OSDWINMD0 &= ~(0x0001);
117 IO_OSD_VIDWINMD&=~(0x0001); 113 IO_OSD_VIDWINMD &= ~(0x0001);
118 114
119 /* Setup the LCD controller */ 115 /* Setup the LCD controller */
120 IO_VID_ENC_VMOD=0x2014; 116 IO_VID_ENC_VMOD = 0x2014;
121 IO_VID_ENC_VDCTL=0x2000; 117 IO_VID_ENC_VDCTL = 0x2000;
122 IO_VID_ENC_VDPRO=0x0000; 118 IO_VID_ENC_VDPRO = 0x0000;
123 IO_VID_ENC_SYNCTL=0x100E; 119 IO_VID_ENC_SYNCTL = 0x100E;
124 IO_VID_ENC_HSPLS=1; /* HSYNC pulse width */ 120 IO_VID_ENC_HSPLS = 1; /* HSYNC pulse width */
125 IO_VID_ENC_VSPLS=1; /* VSYNC pulse width */ 121 IO_VID_ENC_VSPLS = 1; /* VSYNC pulse width */
126 122
127 /* These calculations support 640x480 and 320x240 (based on OF) */ 123 /* These calculations support 640x480 and 320x240 (based on OF) */
128 IO_VID_ENC_HINT=LCD_NATIVE_WIDTH+LCD_NATIVE_WIDTH/3; 124 IO_VID_ENC_HINT = LCD_NATIVE_WIDTH+LCD_NATIVE_WIDTH/3;
129 IO_VID_ENC_HSTART=LCD_NATIVE_WIDTH/6; /* Front porch */ 125 IO_VID_ENC_HSTART = LCD_NATIVE_WIDTH/6; /* Back porch */
130 IO_VID_ENC_HVALID=LCD_NATIVE_WIDTH; /* Data valid */ 126 IO_VID_ENC_HVALID = LCD_NATIVE_WIDTH; /* Data valid */
131 IO_VID_ENC_VINT=LCD_NATIVE_HEIGHT+7; 127 IO_VID_ENC_VINT = LCD_NATIVE_HEIGHT+8;
132 IO_VID_ENC_VSTART=3; 128 IO_VID_ENC_VSTART = 2;
133 IO_VID_ENC_VVALID=LCD_NATIVE_HEIGHT; 129 IO_VID_ENC_VVALID = LCD_NATIVE_HEIGHT;
134 130
135 IO_VID_ENC_HSDLY=0x0000; 131 IO_VID_ENC_HSDLY = 0x0000;
136 IO_VID_ENC_VSDLY=0x0000; 132 IO_VID_ENC_VSDLY = 0x0000;
137 IO_VID_ENC_YCCTL=0x0000; 133 IO_VID_ENC_YCCTL = 0x0000;
138 IO_VID_ENC_RGBCTL=0x0000; 134 IO_VID_ENC_RGBCTL = 0x0000;
139 IO_VID_ENC_RGBCLP=0xFF00; 135 IO_VID_ENC_RGBCLP = 0xFF00;
140 IO_VID_ENC_LNECTL=0x0000; 136 IO_VID_ENC_LNECTL = 0x0000;
141 IO_VID_ENC_CULLLNE=0x0000; 137 IO_VID_ENC_CULLLNE = 0x0000;
142 IO_VID_ENC_LCDOUT=0x0000; 138 IO_VID_ENC_LCDOUT = 0x0000;
143 IO_VID_ENC_BRTS=0x0000; 139 IO_VID_ENC_BRTS = 0x0000;
144 IO_VID_ENC_BRTW=0x0000; 140 IO_VID_ENC_BRTW = 0x0000;
145 IO_VID_ENC_ACCTL=0x0000; 141 IO_VID_ENC_ACCTL = 0x0000;
146 IO_VID_ENC_PWMP=0x0000; 142 IO_VID_ENC_PWMP = 0x0000;
147 IO_VID_ENC_PWMW=0x0000; 143 IO_VID_ENC_PWMW = 0x0000;
148 144
149 IO_VID_ENC_DCLKPTN0=0x0001; 145 IO_VID_ENC_DCLKPTN0 = 0x0001;
150 146
151 /* Setup the display */ 147 /* Setup the display */
152 IO_OSD_MODE=0x00ff; 148 IO_OSD_MODE = 0x00ff;
153 149
154 IO_OSD_ATRMD=0x0000; 150 IO_OSD_ATRMD = 0x0000;
155 IO_OSD_RECTCUR=0x0000; 151 IO_OSD_RECTCUR = 0x0000;
156 152
157 IO_OSD_BASEPX=IO_VID_ENC_HSTART; 153 IO_OSD_BASEPX = IO_VID_ENC_HSTART;
158 IO_OSD_BASEPY=IO_VID_ENC_VSTART; 154 IO_OSD_BASEPY = IO_VID_ENC_VSTART;
159 155
160 addr = ((int)FRAME-CONFIG_SDRAM_START) / 32; 156 addr = ((int)FRAME-CONFIG_SDRAM_START) / 32;
161 157
162 /* Setup the OSD windows */ 158 /* Setup the OSD windows */
163 159
164 /* Used for 565 RGB */ 160 /* Used for 565 RGB */
165 IO_OSD_OSDWINMD0=0x30C0; 161 IO_OSD_OSDWINMD0 = 0x30C0;
166 162
167 IO_OSD_OSDWIN0OFST=LCD_NATIVE_WIDTH / 16; 163 IO_OSD_OSDWIN0OFST = LCD_NATIVE_WIDTH / 16;
168 164
169 IO_OSD_OSDWINADH=addr >> 16; 165 IO_OSD_OSDWINADH = addr >> 16;
170 IO_OSD_OSDWIN0ADL=addr & 0xFFFF; 166 IO_OSD_OSDWIN0ADL = addr & 0xFFFF;
171 167
172 IO_OSD_OSDWIN0XP=0; 168 IO_OSD_OSDWIN0XP = 0;
173 IO_OSD_OSDWIN0YP=0; 169 IO_OSD_OSDWIN0YP = 0;
174 170
175 /* read from OF */ 171 /* read from OF */
176 IO_OSD_OSDWIN0XL=LCD_NATIVE_WIDTH; 172 IO_OSD_OSDWIN0XL = LCD_NATIVE_WIDTH;
177 IO_OSD_OSDWIN0YL=LCD_NATIVE_HEIGHT; 173 IO_OSD_OSDWIN0YL = LCD_NATIVE_HEIGHT;
178 174
179 /* Unused */ 175 /* Unused */
180 IO_OSD_OSDWINMD1=0x10C0; 176 IO_OSD_OSDWINMD1 = 0x10C0;
181 177
182#if LCD_NATIVE_WIDTH%32!=0 178#if LCD_NATIVE_WIDTH%32!=0
183 IO_OSD_OSDWIN1OFST=LCD_NATIVE_WIDTH / 32+1; 179 IO_OSD_OSDWIN1OFST = LCD_NATIVE_WIDTH / 32+1;
184#else 180#else
185 IO_OSD_OSDWIN1OFST=LCD_NATIVE_WIDTH / 32; 181 IO_OSD_OSDWIN1OFST = LCD_NATIVE_WIDTH / 32;
186#endif 182#endif
187 183
188 IO_OSD_OSDWIN1ADL=addr & 0xFFFF; 184 IO_OSD_OSDWIN1ADL = addr & 0xFFFF;
189 185
190 IO_OSD_OSDWIN1XP=0; 186 IO_OSD_OSDWIN1XP = 0;
191 IO_OSD_OSDWIN1YP=0; 187 IO_OSD_OSDWIN1YP = 0;
192 188
193 IO_OSD_OSDWIN1XL=LCD_NATIVE_WIDTH; 189 IO_OSD_OSDWIN1XL = LCD_NATIVE_WIDTH;
194 IO_OSD_OSDWIN1YL=LCD_NATIVE_HEIGHT; 190 IO_OSD_OSDWIN1YL = LCD_NATIVE_HEIGHT;
195 191
196 IO_OSD_VIDWINMD=0x0002; 192 IO_OSD_VIDWINMD = 0x0002;
197 193
198 addr = ((int)FRAME2-CONFIG_SDRAM_START) / 32; 194 addr = ((int)FRAME2-CONFIG_SDRAM_START) / 32;
199 195
200 /* This is a bit messy, the LCD transfers appear to happen in chunks of 32 196 /* This is a bit messy, the LCD transfers appear to happen in chunks of 32
201 * pixels. (based on OF) 197 * pixels. (based on OF)
202 */ 198 */
203#if LCD_NATIVE_WIDTH%32!=0 199#if LCD_NATIVE_WIDTH%32!=0
204 IO_OSD_VIDWIN0OFST=LCD_NATIVE_WIDTH / 32+1; 200 IO_OSD_VIDWIN0OFST = LCD_NATIVE_WIDTH / 32+1;
205#else 201#else
206 IO_OSD_VIDWIN0OFST=LCD_NATIVE_WIDTH / 32; 202 IO_OSD_VIDWIN0OFST = LCD_NATIVE_WIDTH / 32;
207#endif 203#endif
208 204
209 IO_OSD_VIDWINADH=addr >> 16; 205 IO_OSD_VIDWINADH = addr >> 16;
210 IO_OSD_VIDWIN0ADL=addr & 0xFFFF; 206 IO_OSD_VIDWIN0ADL = addr & 0xFFFF;
211 207
212 IO_OSD_VIDWIN0XP=0; 208 IO_OSD_VIDWIN0XP = 0;
213 IO_OSD_VIDWIN0YP=0; 209 IO_OSD_VIDWIN0YP = 0;
214 210
215 IO_OSD_VIDWIN0XL=LCD_NATIVE_WIDTH; 211 IO_OSD_VIDWIN0XL = LCD_NATIVE_WIDTH;
216 IO_OSD_VIDWIN0YL=LCD_NATIVE_HEIGHT; 212 IO_OSD_VIDWIN0YL = LCD_NATIVE_HEIGHT;
217 213
218 /* Set pin 36 and 35 (LCD POWER and LCD RESOLUTION) to an output */ 214 /* Set pin 36 and 35 (LCD POWER and LCD RESOLUTION) to an output */
219 IO_GIO_DIR2&=!(3<<3); 215 IO_GIO_DIR2 &= ~(3<<3);
220 216
221#if LCD_NATIVE_HEIGHT > 320 217#if LCD_NATIVE_HEIGHT > 320
222 /* Set LCD resolution to VGA */ 218 /* Set LCD resolution to VGA */
223 IO_GIO_BITSET2=1<<3; 219 IO_GIO_BITSET2 = 1<<3;
224#else 220#else
225 /* Set LCD resolution to QVGA */ 221 /* Set LCD resolution to QVGA */
226 IO_GIO_BITCLR2=1<<3; 222 IO_GIO_BITCLR2 = 1<<3;
227#endif 223#endif
228 224
229 IO_OSD_OSDWINMD0|=0x01; 225 IO_OSD_OSDWINMD0 |= 0x01;
230 IO_VID_ENC_VMOD|=0x01; 226 IO_VID_ENC_VMOD |= 0x01;
231} 227}
232 228
233#if defined(HAVE_LCD_MODES) 229#if defined(HAVE_LCD_MODES)
@@ -236,30 +232,30 @@ void lcd_set_mode(int mode)
236 if(mode==LCD_MODE_YUV) 232 if(mode==LCD_MODE_YUV)
237 { 233 {
238 /* Turn off the RGB buffer and enable the YUV buffer */ 234 /* Turn off the RGB buffer and enable the YUV buffer */
239 IO_OSD_OSDWINMD0 |=0x04; 235 IO_OSD_OSDWINMD0 |= 0x04;
240 IO_OSD_VIDWINMD |=0x01; 236 IO_OSD_VIDWINMD |= 0x01;
241 memset16(FRAME2, 0x0080, LCD_NATIVE_HEIGHT*(LCD_NATIVE_WIDTH+LCD_FUDGE)); 237 memset16(FRAME2, 0x0080, LCD_NATIVE_HEIGHT*(LCD_NATIVE_WIDTH+LCD_FUDGE));
242 } 238 }
243 else if(mode==LCD_MODE_RGB565) 239 else if(mode==LCD_MODE_RGB565)
244 { 240 {
245 /* Turn on the RGB window, set it to 16 bit and turn YUV window off */ 241 /* Turn on the RGB window, set it to 16 bit and turn YUV window off */
246 IO_OSD_VIDWINMD &=~(0x01); 242 IO_OSD_VIDWINMD &= ~(0x01);
247 IO_OSD_OSDWIN0OFST=LCD_NATIVE_WIDTH / 16; 243 IO_OSD_OSDWIN0OFST = LCD_NATIVE_WIDTH / 16;
248 IO_OSD_OSDWINMD0 |=(1<<13); 244 IO_OSD_OSDWINMD0 |= (1<<13);
249 IO_OSD_OSDWINMD0 &=~0x04; 245 IO_OSD_OSDWINMD0 &= ~0x04;
250 lcd_clear_display(); 246 lcd_clear_display();
251 } 247 }
252 else if(mode==LCD_MODE_PAL256) 248 else if(mode==LCD_MODE_PAL256)
253 { 249 {
254#if LCD_NATIVE_WIDTH%32!=0 250#if LCD_NATIVE_WIDTH%32!=0
255 IO_OSD_OSDWIN0OFST=LCD_NATIVE_WIDTH / 32+1; 251 IO_OSD_OSDWIN0OFST = LCD_NATIVE_WIDTH / 32+1;
256#else 252#else
257 IO_OSD_OSDWIN0OFST=LCD_NATIVE_WIDTH / 32; 253 IO_OSD_OSDWIN0OFST = LCD_NATIVE_WIDTH / 32;
258#endif 254#endif
259 255
260 IO_OSD_VIDWINMD &=~(0x01); 256 IO_OSD_VIDWINMD &= ~(0x01);
261 IO_OSD_OSDWINMD0 &=~(1<<13); 257 IO_OSD_OSDWINMD0 &= ~(1<<13);
262 IO_OSD_OSDWINMD0 |=0x01; 258 IO_OSD_OSDWINMD0 |= 0x01;
263 } 259 }
264} 260}
265#endif 261#endif
@@ -346,35 +342,36 @@ void lcd_blit_pal256(unsigned char *src, int src_x, int src_y, int x, int y,
346#if CONFIG_ORIENTATION == SCREEN_PORTRAIT 342#if CONFIG_ORIENTATION == SCREEN_PORTRAIT
347 char *dst=(char *)FRAME+x+y*(LCD_NATIVE_WIDTH+LCD_FUDGE); 343 char *dst=(char *)FRAME+x+y*(LCD_NATIVE_WIDTH+LCD_FUDGE);
348 344
349 src=src+src_x+src_y*LCD_NATIVE_WIDTH; 345 src = src+src_x+src_y*LCD_WIDTH;
350 while(height--); 346 while(height--)
351 { 347 {
352 memcpy ( dst, src, width); 348 memcpy(dst, src, width);
353 349
354 dst=dst+(LCD_NATIVE_WIDTH-x+LCD_FUDGE); 350 dst = dst + ((LCD_WIDTH -x +LCD_FUDGE));
355 src+=width; 351 src = src + (LCD_WIDTH - x);
356 } 352 }
357 353
358#else 354#else
359 char *dst=(char *)FRAME 355 char *dst=(char *)FRAME
360 + (LCD_NATIVE_WIDTH+LCD_FUDGE)*(LCD_NATIVE_HEIGHT-1) 356 + (LCD_NATIVE_WIDTH+LCD_FUDGE)*(LCD_NATIVE_HEIGHT-1)
361 - (LCD_NATIVE_WIDTH+LCD_FUDGE)*x + y; 357 - (LCD_NATIVE_WIDTH+LCD_FUDGE)*x + y;
362 358
363 src=src+src_x+src_y*LCD_WIDTH; 359 src=src+src_x+src_y*LCD_WIDTH;
364 while(height--) 360
365 { 361 while(height--)
366 register char *c_dst=dst; 362 {
367 register int c_width=width; 363 register char *c_dst=dst;
368 364 register int c_width=width;
369 while (c_width--) 365
370 { 366 while (c_width--)
371 *c_dst=*src++; 367 {
372 c_dst=c_dst-(LCD_NATIVE_WIDTH+LCD_FUDGE); 368 *c_dst = *src++;
373 } 369 c_dst -= (LCD_NATIVE_WIDTH+LCD_FUDGE);
374 370 }
375 dst++; 371
376 src+=LCD_WIDTH-width; 372 dst++;
377 } 373 src+=LCD_WIDTH-width;
374 }
378#endif 375#endif
379} 376}
380 377