diff options
-rw-r--r-- | apps/plugins/doom/i_video.c | 2 | ||||
-rw-r--r-- | apps/plugins/lib/grey.h | 6 | ||||
-rw-r--r-- | apps/plugins/lib/grey_core.c | 21 | ||||
-rw-r--r-- | apps/plugins/mpegplayer/stream_mgr.c | 2 | ||||
-rw-r--r-- | apps/plugins/test_fps.c | 2 | ||||
-rw-r--r-- | apps/plugins/zxbox/zxbox.c | 5 | ||||
-rw-r--r-- | firmware/target/arm/ipod/lcd-gray.c | 30 |
7 files changed, 52 insertions, 16 deletions
diff --git a/apps/plugins/doom/i_video.c b/apps/plugins/doom/i_video.c index ce4b670583..2e98ce9f85 100644 --- a/apps/plugins/doom/i_video.c +++ b/apps/plugins/doom/i_video.c | |||
@@ -696,7 +696,7 @@ void I_InitGraphics(void) | |||
696 | 696 | ||
697 | #ifndef HAVE_LCD_COLOR | 697 | #ifndef HAVE_LCD_COLOR |
698 | gbuf=malloc(GREYBUFSIZE); | 698 | gbuf=malloc(GREYBUFSIZE); |
699 | grey_init(rb, gbuf, GREYBUFSIZE, 0, LCD_WIDTH, LCD_HEIGHT, NULL); | 699 | grey_init(rb, gbuf, GREYBUFSIZE, GREY_ON_COP, LCD_WIDTH, LCD_HEIGHT, NULL); |
700 | /* switch on greyscale overlay */ | 700 | /* switch on greyscale overlay */ |
701 | grey_show(true); | 701 | grey_show(true); |
702 | #endif | 702 | #endif |
diff --git a/apps/plugins/lib/grey.h b/apps/plugins/lib/grey.h index 3f7be44522..95dca6beb6 100644 --- a/apps/plugins/lib/grey.h +++ b/apps/plugins/lib/grey.h | |||
@@ -45,8 +45,10 @@ | |||
45 | #define GREY_INFO_STRUCT_IRAM struct _grey_info _grey_info IBSS_ATTR; | 45 | #define GREY_INFO_STRUCT_IRAM struct _grey_info _grey_info IBSS_ATTR; |
46 | 46 | ||
47 | /* Features you can request on library init (ORed together): */ | 47 | /* Features you can request on library init (ORed together): */ |
48 | #define GREY_BUFFERED 0x0001 | 48 | #define GREY_BUFFERED 0x0001 /* Use a chunky buffer */ |
49 | #define GREY_RAWMAPPED 0x0002 | 49 | #define GREY_RAWMAPPED 0x0002 /* No gamma & LCD linearisation */ |
50 | #define GREY_ON_COP 0x0004 /* Run ISR on COP (PP targets) */ | ||
51 | /* TODO: only usable in conjunction with GREY_INFO_STRUCT_IRAM atm */ | ||
50 | 52 | ||
51 | /* Library initialisation and release */ | 53 | /* Library initialisation and release */ |
52 | bool grey_init(struct plugin_api* newrb, unsigned char *gbuf, long gbuf_size, | 54 | bool grey_init(struct plugin_api* newrb, unsigned char *gbuf, long gbuf_size, |
diff --git a/apps/plugins/lib/grey_core.c b/apps/plugins/lib/grey_core.c index 20c33a60f4..1326599574 100644 --- a/apps/plugins/lib/grey_core.c +++ b/apps/plugins/lib/grey_core.c | |||
@@ -495,11 +495,12 @@ bool grey_init(struct plugin_api* newrb, unsigned char *gbuf, long gbuf_size, | |||
495 | #endif | 495 | #endif |
496 | 496 | ||
497 | plane_size = _GREY_MULUQ(width, height); | 497 | plane_size = _GREY_MULUQ(width, height); |
498 | #ifdef CPU_COLDFIRE | 498 | #if defined(CPU_COLDFIRE) /* Buffers should be line aligned */ \ |
499 | plane_size += (-plane_size) & 0xf; /* All buffers should be line aligned */ | 499 | || defined(CPU_PP) && (NUM_CORES > 1) /* Buffers must be cache line aligned */ |
500 | plane_size += (-plane_size) & 0xf; | ||
500 | buftaken = (-(long)gbuf) & 0xf; | 501 | buftaken = (-(long)gbuf) & 0xf; |
501 | #else | 502 | #else /* Buffers must be 32 bit aligned. */ |
502 | buftaken = (-(long)gbuf) & 3; /* All buffers must be long aligned. */ | 503 | buftaken = (-(long)gbuf) & 3; |
503 | #endif | 504 | #endif |
504 | gbuf += buftaken; | 505 | gbuf += buftaken; |
505 | 506 | ||
@@ -509,6 +510,10 @@ bool grey_init(struct plugin_api* newrb, unsigned char *gbuf, long gbuf_size, | |||
509 | gbuf += plane_size; | 510 | gbuf += plane_size; |
510 | buftaken += plane_size; | 511 | buftaken += plane_size; |
511 | } | 512 | } |
513 | #if NUM_CORES > 1 /* Values and phases must be uncached when running on COP */ | ||
514 | if (features & GREY_ON_COP) | ||
515 | gbuf = UNCACHED_ADDR(gbuf); | ||
516 | #endif | ||
512 | _grey_info.values = gbuf; | 517 | _grey_info.values = gbuf; |
513 | gbuf += plane_size; | 518 | gbuf += plane_size; |
514 | _grey_info.phases = gbuf; | 519 | _grey_info.phases = gbuf; |
@@ -602,8 +607,14 @@ void grey_show(bool enable) | |||
602 | #ifdef NEED_BOOST | 607 | #ifdef NEED_BOOST |
603 | _grey_info.rb->cpu_boost(true); | 608 | _grey_info.rb->cpu_boost(true); |
604 | #endif | 609 | #endif |
610 | #if NUM_CORES > 1 | ||
611 | _grey_info.rb->timer_register(1, NULL, TIMER_FREQ / LCD_SCANRATE, | ||
612 | 1, _timer_isr, | ||
613 | (_grey_info.flags & GREY_ON_COP) ? COP : CPU); | ||
614 | #else | ||
605 | _grey_info.rb->timer_register(1, NULL, TIMER_FREQ / LCD_SCANRATE, 1, | 615 | _grey_info.rb->timer_register(1, NULL, TIMER_FREQ / LCD_SCANRATE, 1, |
606 | _timer_isr IF_COP(, CPU)); | 616 | _timer_isr); |
617 | #endif | ||
607 | #endif /* !SIMULATOR */ | 618 | #endif /* !SIMULATOR */ |
608 | _grey_info.rb->screen_dump_set_hook(grey_screendump_hook); | 619 | _grey_info.rb->screen_dump_set_hook(grey_screendump_hook); |
609 | } | 620 | } |
diff --git a/apps/plugins/mpegplayer/stream_mgr.c b/apps/plugins/mpegplayer/stream_mgr.c index b962c5b993..778ed0df83 100644 --- a/apps/plugins/mpegplayer/stream_mgr.c +++ b/apps/plugins/mpegplayer/stream_mgr.c | |||
@@ -1005,7 +1005,7 @@ int stream_init(void) | |||
1005 | graymem = mem; | 1005 | graymem = mem; |
1006 | #endif | 1006 | #endif |
1007 | 1007 | ||
1008 | success = grey_init(rb, graymem, memsize, GREY_BUFFERED, | 1008 | success = grey_init(rb, graymem, memsize, GREY_BUFFERED|GREY_ON_COP, |
1009 | LCD_WIDTH, LCD_HEIGHT, &graysize); | 1009 | LCD_WIDTH, LCD_HEIGHT, &graysize); |
1010 | 1010 | ||
1011 | /* This can run on another processor - align size */ | 1011 | /* This can run on another processor - align size */ |
diff --git a/apps/plugins/test_fps.c b/apps/plugins/test_fps.c index a312c13662..da61a4f348 100644 --- a/apps/plugins/test_fps.c +++ b/apps/plugins/test_fps.c | |||
@@ -286,7 +286,7 @@ static void time_greyscale(void) | |||
286 | int fps, load; | 286 | int fps, load; |
287 | 287 | ||
288 | gbuf = (unsigned char *) rb->plugin_get_buffer(&gbuf_size); | 288 | gbuf = (unsigned char *) rb->plugin_get_buffer(&gbuf_size); |
289 | if (!grey_init(rb, gbuf, gbuf_size, 0, LCD_WIDTH, LCD_HEIGHT, NULL)) | 289 | if (!grey_init(rb, gbuf, gbuf_size, GREY_ON_COP, LCD_WIDTH, LCD_HEIGHT, NULL)) |
290 | { | 290 | { |
291 | log_text("greylib: out of memory."); | 291 | log_text("greylib: out of memory."); |
292 | return; | 292 | return; |
diff --git a/apps/plugins/zxbox/zxbox.c b/apps/plugins/zxbox/zxbox.c index 198aeecb37..3d94981ce5 100644 --- a/apps/plugins/zxbox/zxbox.c +++ b/apps/plugins/zxbox/zxbox.c | |||
@@ -74,9 +74,10 @@ enum plugin_status plugin_start(struct plugin_api* api, void* parameter) | |||
74 | /* get the remainder of the plugin buffer */ | 74 | /* get the remainder of the plugin buffer */ |
75 | gbuf = (unsigned char *) rb->plugin_get_buffer(&gbuf_size); | 75 | gbuf = (unsigned char *) rb->plugin_get_buffer(&gbuf_size); |
76 | #ifdef USE_BUFFERED_GREY | 76 | #ifdef USE_BUFFERED_GREY |
77 | grey_init(rb, gbuf, gbuf_size, GREY_BUFFERED, LCD_WIDTH, LCD_HEIGHT, NULL); | 77 | grey_init(rb, gbuf, gbuf_size, GREY_BUFFERED|GREY_ON_COP, LCD_WIDTH, |
78 | LCD_HEIGHT, NULL); | ||
78 | #else | 79 | #else |
79 | grey_init(rb, gbuf, gbuf_size, 0, LCD_WIDTH, LCD_HEIGHT, NULL); | 80 | grey_init(rb, gbuf, gbuf_size, GREY_ON_COP, LCD_WIDTH, LCD_HEIGHT, NULL); |
80 | #endif /* USE_BUFFERED_GREY */ | 81 | #endif /* USE_BUFFERED_GREY */ |
81 | /* switch on greyscale overlay */ | 82 | /* switch on greyscale overlay */ |
82 | grey_show(true); | 83 | grey_show(true); |
diff --git a/firmware/target/arm/ipod/lcd-gray.c b/firmware/target/arm/ipod/lcd-gray.c index 131b52da96..5cc219162c 100644 --- a/firmware/target/arm/ipod/lcd-gray.c +++ b/firmware/target/arm/ipod/lcd-gray.c | |||
@@ -53,6 +53,10 @@ | |||
53 | /* The backlight makes the LCD appear negative on the 1st/2nd gen */ | 53 | /* The backlight makes the LCD appear negative on the 1st/2nd gen */ |
54 | static bool lcd_inverted = false; | 54 | static bool lcd_inverted = false; |
55 | static bool lcd_backlit = false; | 55 | static bool lcd_backlit = false; |
56 | #if NUM_CORES > 1 | ||
57 | /* invert_display() and the lcd_blit_* functions need to be corelocked */ | ||
58 | static struct corelock cl IBSS_ATTR; | ||
59 | #endif | ||
56 | static void invert_display(void); | 60 | static void invert_display(void); |
57 | #endif | 61 | #endif |
58 | 62 | ||
@@ -112,7 +116,9 @@ static void lcd_cmd_and_data(unsigned cmd, unsigned data) | |||
112 | /* LCD init */ | 116 | /* LCD init */ |
113 | void lcd_init_device(void) | 117 | void lcd_init_device(void) |
114 | { | 118 | { |
115 | 119 | #if (NUM_CORES > 1) && defined(HAVE_BACKLIGHT_INVERSION) | |
120 | corelock_init(&cl); | ||
121 | #endif | ||
116 | #ifdef IPOD_MINI2G /* serial LCD hookup */ | 122 | #ifdef IPOD_MINI2G /* serial LCD hookup */ |
117 | lcd_wait_write(); | 123 | lcd_wait_write(); |
118 | LCD1_CONTROL = 0x01730084; /* fastest setting */ | 124 | LCD1_CONTROL = 0x01730084; /* fastest setting */ |
@@ -167,7 +173,13 @@ static void invert_display(void) | |||
167 | if (new_invert != last_invert) | 173 | if (new_invert != last_invert) |
168 | { | 174 | { |
169 | int oldlevel = disable_irq_save(); | 175 | int oldlevel = disable_irq_save(); |
176 | #if NUM_CORES > 1 | ||
177 | corelock_lock(&cl); | ||
170 | lcd_cmd_and_data(R_DISPLAY_CONTROL, new_invert? 0x0017 : 0x0015); | 178 | lcd_cmd_and_data(R_DISPLAY_CONTROL, new_invert? 0x0017 : 0x0015); |
179 | corelock_unlock(&cl); | ||
180 | #else | ||
181 | lcd_cmd_and_data(R_DISPLAY_CONTROL, new_invert? 0x0017 : 0x0015); | ||
182 | #endif | ||
171 | restore_irq(oldlevel); | 183 | restore_irq(oldlevel); |
172 | last_invert = new_invert; | 184 | last_invert = new_invert; |
173 | } | 185 | } |
@@ -254,14 +266,19 @@ void lcd_mono_data(const unsigned char *data, int count); | |||
254 | void lcd_blit_mono(const unsigned char *data, int bx, int y, int bwidth, | 266 | void lcd_blit_mono(const unsigned char *data, int bx, int y, int bwidth, |
255 | int height, int stride) | 267 | int height, int stride) |
256 | { | 268 | { |
269 | #if (NUM_CORES > 1) && defined(HAVE_BACKLIGHT_INVERSION) | ||
270 | corelock_lock(&cl); | ||
271 | #endif | ||
257 | while (height--) | 272 | while (height--) |
258 | { | 273 | { |
259 | lcd_cmd_and_data(R_RAM_ADDR_SET, (y++ << 5) + addr_offset - bx); | 274 | lcd_cmd_and_data(R_RAM_ADDR_SET, (y++ << 5) + addr_offset - bx); |
260 | lcd_prepare_cmd(R_RAM_DATA); | 275 | lcd_prepare_cmd(R_RAM_DATA); |
261 | |||
262 | lcd_mono_data(data, bwidth); | 276 | lcd_mono_data(data, bwidth); |
263 | data += stride; | 277 | data += stride; |
264 | } | 278 | } |
279 | #if (NUM_CORES > 1) && defined(HAVE_BACKLIGHT_INVERSION) | ||
280 | corelock_unlock(&cl); | ||
281 | #endif | ||
265 | } | 282 | } |
266 | 283 | ||
267 | /* Helper function for lcd_grey_phase_blit(). */ | 284 | /* Helper function for lcd_grey_phase_blit(). */ |
@@ -272,15 +289,20 @@ void lcd_grey_data(unsigned char *values, unsigned char *phases, int count); | |||
272 | void lcd_blit_grey_phase(unsigned char *values, unsigned char *phases, | 289 | void lcd_blit_grey_phase(unsigned char *values, unsigned char *phases, |
273 | int bx, int y, int bwidth, int height, int stride) | 290 | int bx, int y, int bwidth, int height, int stride) |
274 | { | 291 | { |
275 | while (height--) | 292 | #if (NUM_CORES > 1) && defined(HAVE_BACKLIGHT_INVERSION) |
293 | corelock_lock(&cl); | ||
294 | #endif | ||
295 | while (height--) | ||
276 | { | 296 | { |
277 | lcd_cmd_and_data(R_RAM_ADDR_SET, (y++ << 5) + addr_offset - bx); | 297 | lcd_cmd_and_data(R_RAM_ADDR_SET, (y++ << 5) + addr_offset - bx); |
278 | lcd_prepare_cmd(R_RAM_DATA); | 298 | lcd_prepare_cmd(R_RAM_DATA); |
279 | |||
280 | lcd_grey_data(values, phases, bwidth); | 299 | lcd_grey_data(values, phases, bwidth); |
281 | values += stride; | 300 | values += stride; |
282 | phases += stride; | 301 | phases += stride; |
283 | } | 302 | } |
303 | #if (NUM_CORES > 1) && defined(HAVE_BACKLIGHT_INVERSION) | ||
304 | corelock_unlock(&cl); | ||
305 | #endif | ||
284 | } | 306 | } |
285 | 307 | ||
286 | void lcd_update_rect(int x, int y, int width, int height) | 308 | void lcd_update_rect(int x, int y, int width, int height) |