summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--firmware/SOURCES11
-rw-r--r--firmware/asm/SOURCES7
-rw-r--r--firmware/asm/arm/lcd-as-memframe.S (renamed from firmware/target/arm/lcd-as-memframe.S)0
-rw-r--r--firmware/asm/lcd-as-memframe.c181
4 files changed, 188 insertions, 11 deletions
diff --git a/firmware/SOURCES b/firmware/SOURCES
index 23b5baea3e..d765bb8720 100644
--- a/firmware/SOURCES
+++ b/firmware/SOURCES
@@ -854,7 +854,6 @@ target/arm/sandisk/audio-c200_e200.c
854 854
855#ifdef SANSA_E200 855#ifdef SANSA_E200
856drivers/lcd-memframe.c 856drivers/lcd-memframe.c
857target/arm/lcd-as-memframe.S
858target/arm/sandisk/sansa-e200/lcd-e200.c 857target/arm/sandisk/sansa-e200/lcd-e200.c
859target/arm/sandisk/sansa-e200/button-e200.c 858target/arm/sandisk/sansa-e200/button-e200.c
860target/arm/sandisk/sansa-e200/powermgmt-e200.c 859target/arm/sandisk/sansa-e200/powermgmt-e200.c
@@ -1034,7 +1033,6 @@ target/arm/iriver/h10/lcd-h10_5gb.c
1034 1033
1035#ifdef GIGABEAT_F 1034#ifdef GIGABEAT_F
1036drivers/lcd-memframe.c 1035drivers/lcd-memframe.c
1037target/arm/lcd-as-memframe.S
1038target/arm/s3c2440/gigabeat-fx/ata-meg-fx.c 1036target/arm/s3c2440/gigabeat-fx/ata-meg-fx.c
1039target/arm/s3c2440/gigabeat-fx/backlight-meg-fx.c 1037target/arm/s3c2440/gigabeat-fx/backlight-meg-fx.c
1040target/arm/s3c2440/gigabeat-fx/button-meg-fx.c 1038target/arm/s3c2440/gigabeat-fx/button-meg-fx.c
@@ -1051,7 +1049,6 @@ target/arm/s3c2440/gigabeat-fx/wmcodec-meg-fx.c
1051#ifdef GIGABEAT_S 1049#ifdef GIGABEAT_S
1052drivers/lcd-memframe.c 1050drivers/lcd-memframe.c
1053target/arm/bits-armv6.S 1051target/arm/bits-armv6.S
1054target/arm/lcd-as-memframe.S
1055target/arm/mmu-armv6.S 1052target/arm/mmu-armv6.S
1056target/arm/imx31/ata-imx31.c 1053target/arm/imx31/ata-imx31.c
1057target/arm/imx31/avic-imx31.c 1054target/arm/imx31/avic-imx31.c
@@ -1103,9 +1100,6 @@ target/arm/tms320dm320/uart-dm320.c
1103#endif /* CONFIG_CPU == DM320 */ 1100#endif /* CONFIG_CPU == DM320 */
1104 1101
1105#ifdef MROBE_500 1102#ifdef MROBE_500
1106#if !defined(LCD_USE_DMA)
1107target/arm/lcd-as-memframe.S
1108#endif
1109target/arm/tms320dm320/mrobe-500/crt0-board.S 1103target/arm/tms320dm320/mrobe-500/crt0-board.S
1110target/arm/tms320dm320/mrobe-500/adc-mr500.c 1104target/arm/tms320dm320/mrobe-500/adc-mr500.c
1111target/arm/tms320dm320/mrobe-500/ata-mr500.c 1105target/arm/tms320dm320/mrobe-500/ata-mr500.c
@@ -1124,7 +1118,6 @@ target/arm/tms320dm320/mrobe-500/usb-mr500.c
1124 1118
1125#ifdef CREATIVE_ZVx 1119#ifdef CREATIVE_ZVx
1126drivers/lcd-memframe.c 1120drivers/lcd-memframe.c
1127target/arm/lcd-as-memframe.S
1128target/arm/tms320dm320/creative-zvm/adc-creativezvm.c 1121target/arm/tms320dm320/creative-zvm/adc-creativezvm.c
1129target/arm/tms320dm320/creative-zvm/ata-creativezvm.c 1122target/arm/tms320dm320/creative-zvm/ata-creativezvm.c
1130target/arm/tms320dm320/creative-zvm/dma-creativezvm.c 1123target/arm/tms320dm320/creative-zvm/dma-creativezvm.c
@@ -1138,7 +1131,6 @@ target/arm/tms320dm320/creative-zvm/usb-creativezvm.c
1138 1131
1139#ifdef SANSA_CONNECT 1132#ifdef SANSA_CONNECT
1140drivers/lcd-memframe.c 1133drivers/lcd-memframe.c
1141target/arm/lcd-as-memframe.S
1142target/arm/tms320dm320/sdmmc-dm320.c 1134target/arm/tms320dm320/sdmmc-dm320.c
1143target/arm/tms320dm320/sansa-connect/crt0-board.S 1135target/arm/tms320dm320/sansa-connect/crt0-board.S
1144target/arm/tms320dm320/sansa-connect/lcd-sansaconnect.c 1136target/arm/tms320dm320/sansa-connect/lcd-sansaconnect.c
@@ -1347,7 +1339,6 @@ target/arm/as3525/lcd-as-e200v2-fuze-fuzev2.S
1347drivers/lcd-memframe.c 1339drivers/lcd-memframe.c
1348drivers/synaptics-rmi.c 1340drivers/synaptics-rmi.c
1349drivers/generic_i2c.c 1341drivers/generic_i2c.c
1350target/arm/lcd-as-memframe.S
1351target/arm/imx233/sansa-fuzeplus/fmradio-i2c-fuzeplus.c 1342target/arm/imx233/sansa-fuzeplus/fmradio-i2c-fuzeplus.c
1352target/arm/imx233/sansa-fuzeplus/backlight-fuzeplus.c 1343target/arm/imx233/sansa-fuzeplus/backlight-fuzeplus.c
1353target/arm/imx233/sansa-fuzeplus/lcd-fuzeplus.c 1344target/arm/imx233/sansa-fuzeplus/lcd-fuzeplus.c
@@ -1389,7 +1380,6 @@ drivers/nand_id.c
1389drivers/pcf50606.c 1380drivers/pcf50606.c
1390drivers/pcf50635.c 1381drivers/pcf50635.c
1391drivers/tsc200x.c 1382drivers/tsc200x.c
1392target/arm/lcd-as-memframe.S
1393target/arm/tcc780x/adc-tcc780x.c 1383target/arm/tcc780x/adc-tcc780x.c
1394target/arm/tcc780x/system-tcc780x.c 1384target/arm/tcc780x/system-tcc780x.c
1395target/arm/tcc780x/kernel-tcc780x.c 1385target/arm/tcc780x/kernel-tcc780x.c
@@ -1558,7 +1548,6 @@ target/arm/at91sam/lyre_proto1/timer-lyre_proto1.c
1558 1548
1559#if defined(MINI2440) 1549#if defined(MINI2440)
1560drivers/lcd-memframe.c 1550drivers/lcd-memframe.c
1561target/arm/lcd-as-memframe.S
1562target/arm/s3c2440/dma-s3c2440.c 1551target/arm/s3c2440/dma-s3c2440.c
1563target/arm/s3c2440/sd-s3c2440.c 1552target/arm/s3c2440/sd-s3c2440.c
1564target/arm/s3c2440/uart-s3c2440.c 1553target/arm/s3c2440/uart-s3c2440.c
diff --git a/firmware/asm/SOURCES b/firmware/asm/SOURCES
index 805727ea93..216089f003 100644
--- a/firmware/asm/SOURCES
+++ b/firmware/asm/SOURCES
@@ -5,3 +5,10 @@ memmove.c
5memset.c 5memset.c
6strlen.c 6strlen.c
7#endif 7#endif
8
9#if (defined(SANSA_E200) || defined(GIGABEAT_F) || defined(GIGABEAT_S) || \
10 defined(CREATIVE_ZVx) || defined(SANSA_CONNECT) || defined(SANSA_FUZEPLUS) || \
11 defined(COWON_D2) || defined(MINI2440) || (defined(MROBE_500) && !defined(LCD_USE_DMA))) && \
12 !defined(SIMULATOR)
13lcd-as-memframe.c
14#endif
diff --git a/firmware/target/arm/lcd-as-memframe.S b/firmware/asm/arm/lcd-as-memframe.S
index 52ab0447c2..52ab0447c2 100644
--- a/firmware/target/arm/lcd-as-memframe.S
+++ b/firmware/asm/arm/lcd-as-memframe.S
diff --git a/firmware/asm/lcd-as-memframe.c b/firmware/asm/lcd-as-memframe.c
new file mode 100644
index 0000000000..5f4917b721
--- /dev/null
+++ b/firmware/asm/lcd-as-memframe.c
@@ -0,0 +1,181 @@
1
2#include <string.h>
3#include "lcd.h"
4void lcd_copy_buffer_rect(fb_data *dst, fb_data *src, int width, int height)
5{
6 do {
7 memcpy(dst, src, width * sizeof(fb_data));
8 src += LCD_WIDTH;
9 dst += LCD_WIDTH;
10 } while (--height);
11}
12
13#define YFAC (74)
14#define RVFAC (101)
15#define GUFAC (-24)
16#define GVFAC (-51)
17#define BUFAC (128)
18
19static inline int clamp(int val, int min, int max)
20{
21 if (val < min)
22 val = min;
23 else if (val > max)
24 val = max;
25 return val;
26}
27
28extern void lcd_write_yuv420_lines(fb_data *dst,
29 unsigned char const * const src[3],
30 int width,
31 int stride)
32{
33 /* Draw a partial YUV colour bitmap - similiar behavior to lcd_blit_yuv
34 in the core */
35 const unsigned char *ysrc, *usrc, *vsrc;
36 int height = 2, linecounter;
37 fb_data *row_end;
38
39 /* width and height must be >= 2 and an even number */
40 width &= ~1;
41 linecounter = height >> 1;
42
43#if LCD_WIDTH >= LCD_HEIGHT
44 row_end = dst + width;
45#else
46 row_end = dst + LCD_WIDTH * width;
47#endif
48
49 ysrc = src[0];
50 usrc = src[1];
51 vsrc = src[2];
52
53 /* stride => amount to jump from end of last row to start of next */
54 stride -= width;
55
56 /* upsampling, YUV->RGB conversion and reduction to RGB565 in one go */
57
58 do
59 {
60 int y, cb, cr, rv, guv, bu, r, g, b;
61
62 y = YFAC*(*ysrc++ - 16);
63 cb = *usrc++ - 128;
64 cr = *vsrc++ - 128;
65
66 rv = RVFAC*cr;
67 guv = GUFAC*cb + GVFAC*cr;
68 bu = BUFAC*cb;
69
70 r = y + rv;
71 g = y + guv;
72 b = y + bu;
73
74 if ((unsigned)(r | g | b) > 64*256-1)
75 {
76 r = clamp(r, 0, 64*256-1);
77 g = clamp(g, 0, 64*256-1);
78 b = clamp(b, 0, 64*256-1);
79 }
80
81 *dst = LCD_RGBPACK_LCD(r >> 9, g >> 8, b >> 9);
82
83#if LCD_WIDTH >= LCD_HEIGHT
84 dst++;
85#else
86 dst += LCD_WIDTH;
87#endif
88
89 y = YFAC*(*ysrc++ - 16);
90 r = y + rv;
91 g = y + guv;
92 b = y + bu;
93
94 if ((unsigned)(r | g | b) > 64*256-1)
95 {
96 r = clamp(r, 0, 64*256-1);
97 g = clamp(g, 0, 64*256-1);
98 b = clamp(b, 0, 64*256-1);
99 }
100
101 *dst = LCD_RGBPACK_LCD(r >> 9, g >> 8, b >> 9);
102
103#if LCD_WIDTH >= LCD_HEIGHT
104 dst++;
105#else
106 dst += LCD_WIDTH;
107#endif
108 }
109 while (dst < row_end);
110
111 ysrc += stride;
112 usrc -= width >> 1;
113 vsrc -= width >> 1;
114
115#if LCD_WIDTH >= LCD_HEIGHT
116 row_end += LCD_WIDTH;
117 dst += LCD_WIDTH - width;
118#else
119 row_end -= 1;
120 dst -= LCD_WIDTH*width + 1;
121#endif
122
123 do
124 {
125 int y, cb, cr, rv, guv, bu, r, g, b;
126
127 y = YFAC*(*ysrc++ - 16);
128 cb = *usrc++ - 128;
129 cr = *vsrc++ - 128;
130
131 rv = RVFAC*cr;
132 guv = GUFAC*cb + GVFAC*cr;
133 bu = BUFAC*cb;
134
135 r = y + rv;
136 g = y + guv;
137 b = y + bu;
138
139 if ((unsigned)(r | g | b) > 64*256-1)
140 {
141 r = clamp(r, 0, 64*256-1);
142 g = clamp(g, 0, 64*256-1);
143 b = clamp(b, 0, 64*256-1);
144 }
145
146 *dst = LCD_RGBPACK_LCD(r >> 9, g >> 8, b >> 9);
147
148#if LCD_WIDTH >= LCD_HEIGHT
149 dst++;
150#else
151 dst += LCD_WIDTH;
152#endif
153
154 y = YFAC*(*ysrc++ - 16);
155 r = y + rv;
156 g = y + guv;
157 b = y + bu;
158
159 if ((unsigned)(r | g | b) > 64*256-1)
160 {
161 r = clamp(r, 0, 64*256-1);
162 g = clamp(g, 0, 64*256-1);
163 b = clamp(b, 0, 64*256-1);
164 }
165
166 *dst = LCD_RGBPACK_LCD(r >> 9, g >> 8, b >> 9);
167
168#if LCD_WIDTH >= LCD_HEIGHT
169 dst++;
170#else
171 dst += LCD_WIDTH;
172#endif
173 }
174 while (dst < row_end);
175}
176
177void lcd_write_yuv420_lines_odither(fb_data *dst,
178 unsigned char const * const src[3],
179 int width, int stride,
180 int x_screen, int y_screen)
181__attribute__((alias("lcd_write_yuv420_lines")));