diff options
Diffstat (limited to 'firmware')
-rw-r--r-- | firmware/SOURCES | 11 | ||||
-rw-r--r-- | firmware/asm/SOURCES | 7 | ||||
-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.c | 181 |
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 |
856 | drivers/lcd-memframe.c | 856 | drivers/lcd-memframe.c |
857 | target/arm/lcd-as-memframe.S | ||
858 | target/arm/sandisk/sansa-e200/lcd-e200.c | 857 | target/arm/sandisk/sansa-e200/lcd-e200.c |
859 | target/arm/sandisk/sansa-e200/button-e200.c | 858 | target/arm/sandisk/sansa-e200/button-e200.c |
860 | target/arm/sandisk/sansa-e200/powermgmt-e200.c | 859 | target/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 |
1036 | drivers/lcd-memframe.c | 1035 | drivers/lcd-memframe.c |
1037 | target/arm/lcd-as-memframe.S | ||
1038 | target/arm/s3c2440/gigabeat-fx/ata-meg-fx.c | 1036 | target/arm/s3c2440/gigabeat-fx/ata-meg-fx.c |
1039 | target/arm/s3c2440/gigabeat-fx/backlight-meg-fx.c | 1037 | target/arm/s3c2440/gigabeat-fx/backlight-meg-fx.c |
1040 | target/arm/s3c2440/gigabeat-fx/button-meg-fx.c | 1038 | target/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 |
1052 | drivers/lcd-memframe.c | 1050 | drivers/lcd-memframe.c |
1053 | target/arm/bits-armv6.S | 1051 | target/arm/bits-armv6.S |
1054 | target/arm/lcd-as-memframe.S | ||
1055 | target/arm/mmu-armv6.S | 1052 | target/arm/mmu-armv6.S |
1056 | target/arm/imx31/ata-imx31.c | 1053 | target/arm/imx31/ata-imx31.c |
1057 | target/arm/imx31/avic-imx31.c | 1054 | target/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) | ||
1107 | target/arm/lcd-as-memframe.S | ||
1108 | #endif | ||
1109 | target/arm/tms320dm320/mrobe-500/crt0-board.S | 1103 | target/arm/tms320dm320/mrobe-500/crt0-board.S |
1110 | target/arm/tms320dm320/mrobe-500/adc-mr500.c | 1104 | target/arm/tms320dm320/mrobe-500/adc-mr500.c |
1111 | target/arm/tms320dm320/mrobe-500/ata-mr500.c | 1105 | target/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 |
1126 | drivers/lcd-memframe.c | 1120 | drivers/lcd-memframe.c |
1127 | target/arm/lcd-as-memframe.S | ||
1128 | target/arm/tms320dm320/creative-zvm/adc-creativezvm.c | 1121 | target/arm/tms320dm320/creative-zvm/adc-creativezvm.c |
1129 | target/arm/tms320dm320/creative-zvm/ata-creativezvm.c | 1122 | target/arm/tms320dm320/creative-zvm/ata-creativezvm.c |
1130 | target/arm/tms320dm320/creative-zvm/dma-creativezvm.c | 1123 | target/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 |
1140 | drivers/lcd-memframe.c | 1133 | drivers/lcd-memframe.c |
1141 | target/arm/lcd-as-memframe.S | ||
1142 | target/arm/tms320dm320/sdmmc-dm320.c | 1134 | target/arm/tms320dm320/sdmmc-dm320.c |
1143 | target/arm/tms320dm320/sansa-connect/crt0-board.S | 1135 | target/arm/tms320dm320/sansa-connect/crt0-board.S |
1144 | target/arm/tms320dm320/sansa-connect/lcd-sansaconnect.c | 1136 | target/arm/tms320dm320/sansa-connect/lcd-sansaconnect.c |
@@ -1347,7 +1339,6 @@ target/arm/as3525/lcd-as-e200v2-fuze-fuzev2.S | |||
1347 | drivers/lcd-memframe.c | 1339 | drivers/lcd-memframe.c |
1348 | drivers/synaptics-rmi.c | 1340 | drivers/synaptics-rmi.c |
1349 | drivers/generic_i2c.c | 1341 | drivers/generic_i2c.c |
1350 | target/arm/lcd-as-memframe.S | ||
1351 | target/arm/imx233/sansa-fuzeplus/fmradio-i2c-fuzeplus.c | 1342 | target/arm/imx233/sansa-fuzeplus/fmradio-i2c-fuzeplus.c |
1352 | target/arm/imx233/sansa-fuzeplus/backlight-fuzeplus.c | 1343 | target/arm/imx233/sansa-fuzeplus/backlight-fuzeplus.c |
1353 | target/arm/imx233/sansa-fuzeplus/lcd-fuzeplus.c | 1344 | target/arm/imx233/sansa-fuzeplus/lcd-fuzeplus.c |
@@ -1389,7 +1380,6 @@ drivers/nand_id.c | |||
1389 | drivers/pcf50606.c | 1380 | drivers/pcf50606.c |
1390 | drivers/pcf50635.c | 1381 | drivers/pcf50635.c |
1391 | drivers/tsc200x.c | 1382 | drivers/tsc200x.c |
1392 | target/arm/lcd-as-memframe.S | ||
1393 | target/arm/tcc780x/adc-tcc780x.c | 1383 | target/arm/tcc780x/adc-tcc780x.c |
1394 | target/arm/tcc780x/system-tcc780x.c | 1384 | target/arm/tcc780x/system-tcc780x.c |
1395 | target/arm/tcc780x/kernel-tcc780x.c | 1385 | target/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) |
1560 | drivers/lcd-memframe.c | 1550 | drivers/lcd-memframe.c |
1561 | target/arm/lcd-as-memframe.S | ||
1562 | target/arm/s3c2440/dma-s3c2440.c | 1551 | target/arm/s3c2440/dma-s3c2440.c |
1563 | target/arm/s3c2440/sd-s3c2440.c | 1552 | target/arm/s3c2440/sd-s3c2440.c |
1564 | target/arm/s3c2440/uart-s3c2440.c | 1553 | target/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 | |||
5 | memset.c | 5 | memset.c |
6 | strlen.c | 6 | strlen.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) | ||
13 | lcd-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" | ||
4 | void 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 | |||
19 | static 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 | |||
28 | extern 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 | |||
177 | void 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"))); | ||