summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJens Arnold <amiconn@rockbox.org>2008-03-25 19:43:08 +0000
committerJens Arnold <amiconn@rockbox.org>2008-03-25 19:43:08 +0000
commit9a7978aeabadc50c6049c5cd150b572ec9bd9e87 (patch)
tree2d22815d61277d495957ced0d1b25ceb19adac08
parent38ed90128439bd7cd20038a69032f1f3eddaca04 (diff)
downloadrockbox-9a7978aeabadc50c6049c5cd150b572ec9bd9e87.tar.gz
rockbox-9a7978aeabadc50c6049c5cd150b572ec9bd9e87.zip
Cabbiev2 gigabeat background: reduce WPS backdrop filesize by storing it as 24 bit BMP instead of unnecessary 32 bit.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@16802 a1c6a512-1295-4272-9138-f99709370657
-rw-r--r--apps/SOURCES2
-rw-r--r--apps/codecs/Makefile1
-rw-r--r--apps/codecs/SOURCES1
-rw-r--r--apps/filetypes.c1
-rw-r--r--apps/metadata.c8
-rw-r--r--apps/metadata/metadata_parsers.h1
-rw-r--r--apps/plugins/CATEGORIES1
-rw-r--r--apps/plugins/SOURCES11
-rw-r--r--apps/plugins/SUBDIRS4
-rw-r--r--apps/plugins/doom/i_video.c10
-rw-r--r--apps/plugins/greyscale.c11
-rw-r--r--apps/plugins/jpeg.c12
-rw-r--r--apps/plugins/lib/SOURCES3
-rw-r--r--apps/plugins/lib/grey.h6
-rw-r--r--apps/plugins/lib/grey_core.c87
-rw-r--r--apps/plugins/lib/grey_draw.c2
-rw-r--r--apps/plugins/lib/grey_parm.c4
-rw-r--r--apps/plugins/lib/grey_scroll.c6
-rw-r--r--apps/plugins/mandelbrot.c16
-rw-r--r--apps/plugins/mpegplayer/mpeg_settings.c8
-rw-r--r--apps/plugins/mpegplayer/mpegplayer.c9
-rw-r--r--apps/plugins/plasma.c13
-rw-r--r--apps/plugins/test_fps.c4
-rw-r--r--bootloader/ipod.c64
-rw-r--r--firmware/SOURCES1
-rw-r--r--firmware/backlight.c2
-rw-r--r--firmware/export/config-player.h2
-rw-r--r--firmware/export/id3.h1
-rw-r--r--firmware/id3.c3
-rw-r--r--firmware/target/arm/iriver/h10/lcd-h10_5gb.c114
-rw-r--r--firmware/target/coldfire/iaudio/lcd-remote-iaudio.c125
-rw-r--r--firmware/target/coldfire/iaudio/m3/button-m3.c2
-rw-r--r--firmware/target/coldfire/iaudio/m3/lcd-m3.c303
-rw-r--r--wps/cabbiev2/wpsbackdrop-240x320x16.bmpbin307256 -> 230456 bytes
34 files changed, 411 insertions, 427 deletions
diff --git a/apps/SOURCES b/apps/SOURCES
index 96b5c0f825..56ed12d947 100644
--- a/apps/SOURCES
+++ b/apps/SOURCES
@@ -75,6 +75,7 @@ gui/backdrop.c
75#endif 75#endif
76 76
77#ifdef HAVE_LCD_CHARCELLS 77#ifdef HAVE_LCD_CHARCELLS
78player/bmp.c
78player/icons.c 79player/icons.c
79player/keyboard.c 80player/keyboard.c
80#endif 81#endif
@@ -129,6 +130,7 @@ metadata/mp4.c
129metadata/mpc.c 130metadata/mpc.c
130metadata/ogg.c 131metadata/ogg.c
131metadata/sid.c 132metadata/sid.c
133metadata/mod.c
132metadata/spc.c 134metadata/spc.c
133metadata/vorbis.c 135metadata/vorbis.c
134metadata/wave.c 136metadata/wave.c
diff --git a/apps/codecs/Makefile b/apps/codecs/Makefile
index 5a65341d02..7c066d284d 100644
--- a/apps/codecs/Makefile
+++ b/apps/codecs/Makefile
@@ -47,6 +47,7 @@ all: $(LINKCODEC) $(ROCKS)
47ifndef SIMVER 47ifndef SIMVER
48$(BUILDDIR)/%.a : % $(CODECDEPS) 48$(BUILDDIR)/%.a : % $(CODECDEPS)
49 49
50$(OBJDIR)/mod.elf : $(OBJDIR)/mod.o $(OBJDIR)/codec_crt0.o
50$(OBJDIR)/wav.elf : $(OBJDIR)/wav.o $(OBJDIR)/codec_crt0.o 51$(OBJDIR)/wav.elf : $(OBJDIR)/wav.o $(OBJDIR)/codec_crt0.o
51$(OBJDIR)/sid.elf : $(OBJDIR)/sid.o $(OBJDIR)/codec_crt0.o 52$(OBJDIR)/sid.elf : $(OBJDIR)/sid.o $(OBJDIR)/codec_crt0.o
52$(OBJDIR)/adx.elf : $(OBJDIR)/adx.o $(OBJDIR)/codec_crt0.o 53$(OBJDIR)/adx.elf : $(OBJDIR)/adx.o $(OBJDIR)/codec_crt0.o
diff --git a/apps/codecs/SOURCES b/apps/codecs/SOURCES
index a93cb6c0cc..3c0118c1ce 100644
--- a/apps/codecs/SOURCES
+++ b/apps/codecs/SOURCES
@@ -13,6 +13,7 @@ wma.c
13aac.c 13aac.c
14#endif 14#endif
15ape.c 15ape.c
16mod.c
16shorten.c 17shorten.c
17aiff.c 18aiff.c
18speex.c 19speex.c
diff --git a/apps/filetypes.c b/apps/filetypes.c
index 1ef136d5ce..694bb0a7cf 100644
--- a/apps/filetypes.c
+++ b/apps/filetypes.c
@@ -69,6 +69,7 @@ const struct filetype inbuilt_filetypes[] = {
69 { "m4a", FILE_ATTR_AUDIO, Icon_Audio, VOICE_EXT_MPA }, 69 { "m4a", FILE_ATTR_AUDIO, Icon_Audio, VOICE_EXT_MPA },
70 { "m4b", FILE_ATTR_AUDIO, Icon_Audio, VOICE_EXT_MPA }, 70 { "m4b", FILE_ATTR_AUDIO, Icon_Audio, VOICE_EXT_MPA },
71 { "mp4", FILE_ATTR_AUDIO, Icon_Audio, VOICE_EXT_MPA }, 71 { "mp4", FILE_ATTR_AUDIO, Icon_Audio, VOICE_EXT_MPA },
72 { "mod", FILE_ATTR_AUDIO, Icon_Audio, VOICE_EXT_MPA },
72 { "shn", FILE_ATTR_AUDIO, Icon_Audio, VOICE_EXT_MPA }, 73 { "shn", FILE_ATTR_AUDIO, Icon_Audio, VOICE_EXT_MPA },
73 { "aif", FILE_ATTR_AUDIO, Icon_Audio, VOICE_EXT_MPA }, 74 { "aif", FILE_ATTR_AUDIO, Icon_Audio, VOICE_EXT_MPA },
74 { "aiff",FILE_ATTR_AUDIO, Icon_Audio, VOICE_EXT_MPA }, 75 { "aiff",FILE_ATTR_AUDIO, Icon_Audio, VOICE_EXT_MPA },
diff --git a/apps/metadata.c b/apps/metadata.c
index 3abbd74c35..303fafc070 100644
--- a/apps/metadata.c
+++ b/apps/metadata.c
@@ -183,6 +183,14 @@ bool get_metadata(struct mp3entry* id3, int fd, const char* trackname)
183 183
184 break; 184 break;
185 185
186 case AFMT_MOD:
187 if (!get_mod_metadata(fd, id3))
188 {
189 return false;
190 }
191
192 break;
193
186 case AFMT_SHN: 194 case AFMT_SHN:
187 id3->vbr = true; 195 id3->vbr = true;
188 id3->filesize = filesize(fd); 196 id3->filesize = filesize(fd);
diff --git a/apps/metadata/metadata_parsers.h b/apps/metadata/metadata_parsers.h
index c3265f8a43..b34d09fe4c 100644
--- a/apps/metadata/metadata_parsers.h
+++ b/apps/metadata/metadata_parsers.h
@@ -25,6 +25,7 @@ bool get_mp4_metadata(int fd, struct mp3entry* id3);
25bool get_monkeys_metadata(int fd, struct mp3entry* id3); 25bool get_monkeys_metadata(int fd, struct mp3entry* id3);
26bool get_musepack_metadata(int fd, struct mp3entry *id3); 26bool get_musepack_metadata(int fd, struct mp3entry *id3);
27bool get_sid_metadata(int fd, struct mp3entry* id3); 27bool get_sid_metadata(int fd, struct mp3entry* id3);
28bool get_mod_metadata(int fd, struct mp3entry* id3);
28bool get_spc_metadata(int fd, struct mp3entry* id3); 29bool get_spc_metadata(int fd, struct mp3entry* id3);
29bool get_ogg_metadata(int fd, struct mp3entry* id3); 30bool get_ogg_metadata(int fd, struct mp3entry* id3);
30bool get_wave_metadata(int fd, struct mp3entry* id3); 31bool get_wave_metadata(int fd, struct mp3entry* id3);
diff --git a/apps/plugins/CATEGORIES b/apps/plugins/CATEGORIES
index 4b267c162b..c2ad75e0c7 100644
--- a/apps/plugins/CATEGORIES
+++ b/apps/plugins/CATEGORIES
@@ -80,6 +80,7 @@ stopwatch,apps
80test_codec,viewers 80test_codec,viewers
81test_disk,apps 81test_disk,apps
82test_fps,apps 82test_fps,apps
83test_grey,apps
83test_sampr,apps 84test_sampr,apps
84test_scanrate,apps 85test_scanrate,apps
85test_viewports,apps 86test_viewports,apps
diff --git a/apps/plugins/SOURCES b/apps/plugins/SOURCES
index 23c22f9826..968592d15a 100644
--- a/apps/plugins/SOURCES
+++ b/apps/plugins/SOURCES
@@ -19,6 +19,7 @@ stats.c
19stopwatch.c 19stopwatch.c
20vbrfix.c 20vbrfix.c
21viewer.c 21viewer.c
22test_disk.c
22 23
23#ifdef OLYMPUS_MROBE_500 24#ifdef OLYMPUS_MROBE_500
24/* remove these once the plugins before it are compileable */ 25/* remove these once the plugins before it are compileable */
@@ -46,17 +47,22 @@ flipit.c
46#ifdef HAVE_LCD_BITMAP /* Not for the Player */ 47#ifdef HAVE_LCD_BITMAP /* Not for the Player */
47brickmania.c 48brickmania.c
48maze.c 49maze.c
49mazezam.c 50mazezam.c
51greyscale.c
52test_fps.c
53test_scanrate.c
50text_editor.c 54text_editor.c
51wavview.c 55wavview.c
52robotfindskitten.c 56robotfindskitten.c
53 57
54/* Plugins needing the grayscale lib on low-depth LCDs */ 58/* Plugins needing the grayscale lib on low-depth LCDs */
55#ifndef IAUDIO_M3 /* FIXME: no greyscale library yet */
56fire.c 59fire.c
57jpeg.c 60jpeg.c
58mandelbrot.c 61mandelbrot.c
59plasma.c 62plasma.c
63
64#if LCD_DEPTH < 4
65test_grey.c
60#endif 66#endif
61 67
62blackjack.c 68blackjack.c
@@ -118,6 +124,7 @@ nim.c
118 124
119#if CONFIG_CODEC == SWCODEC /* software codec platforms */ 125#if CONFIG_CODEC == SWCODEC /* software codec platforms */
120mp3_encoder.c 126mp3_encoder.c
127test_codec.c
121wav2wv.c 128wav2wv.c
122#else /* hardware codec platforms */ 129#else /* hardware codec platforms */
123#ifndef HAVE_MMC /* not for Ondio, has no remote control pin */ 130#ifndef HAVE_MMC /* not for Ondio, has no remote control pin */
diff --git a/apps/plugins/SUBDIRS b/apps/plugins/SUBDIRS
index 9bda7c2715..b0bffc73eb 100644
--- a/apps/plugins/SUBDIRS
+++ b/apps/plugins/SUBDIRS
@@ -34,7 +34,7 @@ pacbox
34 34
35/* For all the color targets */ 35/* For all the color targets */
36#if defined(HAVE_LCD_COLOR) || \ 36#if defined(HAVE_LCD_COLOR) || \
37 (LCD_DEPTH == 2) && !defined(ARCHOS_AV300) && !defined(IAUDIO_M3) 37 (LCD_DEPTH == 2) && !defined(ARCHOS_AV300)
38doom 38doom
39#endif 39#endif
40 40
@@ -42,9 +42,7 @@ doom
42#if CONFIG_CODEC == SWCODEC 42#if CONFIG_CODEC == SWCODEC
43midi 43midi
44/* beatbox */ 44/* beatbox */
45#ifndef IAUDIO_M3 /* TODO: no greyscale lib yet */
46mpegplayer 45mpegplayer
47#endif 46#endif
48#endif
49 47
50#endif /* IRIVER_IFP7XX_SERIES */ 48#endif /* IRIVER_IFP7XX_SERIES */
diff --git a/apps/plugins/doom/i_video.c b/apps/plugins/doom/i_video.c
index bc0f204d3b..ce4b670583 100644
--- a/apps/plugins/doom/i_video.c
+++ b/apps/plugins/doom/i_video.c
@@ -235,6 +235,16 @@ void I_ShutdownGraphics(void)
235#define DOOMBUTTON_ESC BUTTON_OFF 235#define DOOMBUTTON_ESC BUTTON_OFF
236#define DOOMBUTTON_ENTER BUTTON_SELECT 236#define DOOMBUTTON_ENTER BUTTON_SELECT
237#define DOOMBUTTON_WEAPON BUTTON_ON 237#define DOOMBUTTON_WEAPON BUTTON_ON
238#elif CONFIG_KEYPAD == IAUDIO_M3_PAD
239#define DOOMBUTTON_ESC BUTTON_RC_REC
240#define DOOMBUTTON_UP BUTTON_RC_VOL_UP
241#define DOOMBUTTON_DOWN BUTTON_RC_VOL_DOWN
242#define DOOMBUTTON_LEFT BUTTON_RC_REW
243#define DOOMBUTTON_RIGHT BUTTON_RC_FF
244#define DOOMBUTTON_OPEN BUTTON_RC_PLAY
245#define DOOMBUTTON_SHOOT BUTTON_RC_MODE
246#define DOOMBUTTON_ENTER BUTTON_RC_PLAY
247#define DOOMBUTTON_WEAPON BUTTON_RC_MENU
238#elif CONFIG_KEYPAD == COWOND2_PAD 248#elif CONFIG_KEYPAD == COWOND2_PAD
239#define DOOMBUTTON_ESC BUTTON_POWER 249#define DOOMBUTTON_ESC BUTTON_POWER
240#define DOOMBUTTON_UP BUTTON_UP 250#define DOOMBUTTON_UP BUTTON_UP
diff --git a/apps/plugins/greyscale.c b/apps/plugins/greyscale.c
index 522a81fc28..42ba08f22e 100644
--- a/apps/plugins/greyscale.c
+++ b/apps/plugins/greyscale.c
@@ -78,6 +78,17 @@ PLUGIN_HEADER
78#define GREYSCALE_LEFT BUTTON_LEFT 78#define GREYSCALE_LEFT BUTTON_LEFT
79#define GREYSCALE_RIGHT BUTTON_RIGHT 79#define GREYSCALE_RIGHT BUTTON_RIGHT
80#define GREYSCALE_OFF BUTTON_EQ 80#define GREYSCALE_OFF BUTTON_EQ
81
82#elif CONFIG_KEYPAD == IAUDIO_M3_PAD
83#define GREYSCALE_SHIFT BUTTON_RC_PLAY /* somewhat dangerous... */
84#define GREYSCALE_UP BUTTON_RC_VOL_UP
85#define GREYSCALE_DOWN BUTTON_RC_VOL_DOWN
86#define GREYSCALE_LEFT BUTTON_RC_REW
87#define GREYSCALE_RIGHT BUTTON_RC_FF
88#define GREYSCALE_OFF BUTTON_RC_REC
89
90#define GREYSCALE_RC_OFF BUTTON_REC
91
81#endif 92#endif
82 93
83#define GFX_HEIGHT (LCD_HEIGHT-8) 94#define GFX_HEIGHT (LCD_HEIGHT-8)
diff --git a/apps/plugins/jpeg.c b/apps/plugins/jpeg.c
index e2c1b4861b..fcef31f5fd 100644
--- a/apps/plugins/jpeg.c
+++ b/apps/plugins/jpeg.c
@@ -198,6 +198,18 @@ PLUGIN_HEADER
198#define JPEG_NEXT (BUTTON_DISPLAY | BUTTON_RIGHT) 198#define JPEG_NEXT (BUTTON_DISPLAY | BUTTON_RIGHT)
199#define JPEG_PREVIOUS (BUTTON_DISPLAY | BUTTON_LEFT) 199#define JPEG_PREVIOUS (BUTTON_DISPLAY | BUTTON_LEFT)
200 200
201#elif CONFIG_KEYPAD == IAUDIO_M3_PAD
202#define JPEG_ZOOM_IN_PRE BUTTON_RC_PLAY
203#define JPEG_ZOOM_IN (BUTTON_RC_PLAY|BUTTON_REL)
204#define JPEG_ZOOM_OUT (BUTTON_RC_PLAY|BUTTON_REPEAT)
205#define JPEG_UP BUTTON_RC_VOL_UP
206#define JPEG_DOWN BUTTON_RC_VOL_DOWN
207#define JPEG_LEFT BUTTON_RC_REW
208#define JPEG_RIGHT BUTTON_RC_FF
209#define JPEG_MENU BUTTON_RC_REC
210#define JPEG_NEXT BUTTON_RC_MODE
211#define JPEG_PREVIOUS BUTTON_RC_MENU
212
201#elif CONFIG_KEYPAD == COWOND2_PAD 213#elif CONFIG_KEYPAD == COWOND2_PAD
202#define JPEG_ZOOM_IN BUTTON_PLUS 214#define JPEG_ZOOM_IN BUTTON_PLUS
203#define JPEG_ZOOM_OUT BUTTON_MINUS 215#define JPEG_ZOOM_OUT BUTTON_MINUS
diff --git a/apps/plugins/lib/SOURCES b/apps/plugins/lib/SOURCES
index f1aded6122..6a44c80ffa 100644
--- a/apps/plugins/lib/SOURCES
+++ b/apps/plugins/lib/SOURCES
@@ -3,8 +3,7 @@ configfile.c
3fixedpoint.c 3fixedpoint.c
4playback_control.c 4playback_control.c
5rgb_hsv.c 5rgb_hsv.c
6#if defined(HAVE_LCD_BITMAP) && (LCD_DEPTH < 4) \ 6#if defined(HAVE_LCD_BITMAP) && (LCD_DEPTH < 4)
7 && !defined(IAUDIO_M3) /* TODO: Test whether it can be implemented */
8grey_core.c 7grey_core.c
9grey_draw.c 8grey_draw.c
10grey_parm.c 9grey_parm.c
diff --git a/apps/plugins/lib/grey.h b/apps/plugins/lib/grey.h
index ce37e17829..4298ae3ada 100644
--- a/apps/plugins/lib/grey.h
+++ b/apps/plugins/lib/grey.h
@@ -134,8 +134,8 @@ void grey_ub_scroll_down(int count);
134 134
135#if LCD_PIXELFORMAT == HORIZONTAL_PACKING 135#if LCD_PIXELFORMAT == HORIZONTAL_PACKING
136#define _GREY_BSHIFT 0 136#define _GREY_BSHIFT 0
137#else 137#else /* vertical packing or vertical interleaved */
138#if LCD_DEPTH == 1 138#if (LCD_DEPTH == 1) || (LCD_PIXELFORMAT == VERTICAL_INTERLEAVED)
139#define _GREY_BSHIFT 3 139#define _GREY_BSHIFT 3
140#elif LCD_DEPTH == 2 140#elif LCD_DEPTH == 2
141#define _GREY_BSHIFT 2 141#define _GREY_BSHIFT 2
@@ -155,7 +155,7 @@ struct _grey_info
155#if LCD_PIXELFORMAT == HORIZONTAL_PACKING 155#if LCD_PIXELFORMAT == HORIZONTAL_PACKING
156 int bx; /* 8-pixel units */ 156 int bx; /* 8-pixel units */
157 int bwidth; /* 8-pixel units */ 157 int bwidth; /* 8-pixel units */
158#else /* vertical packing */ 158#else /* vertical packing or vertical interleaved */
159 int by; /* 4-pixel or 8-pixel units */ 159 int by; /* 4-pixel or 8-pixel units */
160 int bheight; /* 4-pixel or 8-pixel units */ 160 int bheight; /* 4-pixel or 8-pixel units */
161#endif 161#endif
diff --git a/apps/plugins/lib/grey_core.c b/apps/plugins/lib/grey_core.c
index caa7af2f25..ad8f306dea 100644
--- a/apps/plugins/lib/grey_core.c
+++ b/apps/plugins/lib/grey_core.c
@@ -26,7 +26,8 @@
26#include "plugin.h" 26#include "plugin.h"
27#include "grey.h" 27#include "grey.h"
28 28
29#if defined(CPU_PP) && defined(HAVE_ADJUSTABLE_CPU_FREQ) 29#if defined(HAVE_ADJUSTABLE_CPU_FREQ) && \
30 (defined(CPU_PP) || (CONFIG_LCD == LCD_TL0350A))
30#define NEED_BOOST 31#define NEED_BOOST
31#endif 32#endif
32 33
@@ -143,6 +144,42 @@ static const unsigned char lcdlinear[256] = {
143 203, 206, 209, 212, 215, 219, 222, 226, 144 203, 206, 209, 212, 215, 219, 222, 226,
144 229, 233, 236, 240, 244, 248, 251, 255 145 229, 233, 236, 240, 244, 248, 251, 255
145}; 146};
147#elif CONFIG_LCD == LCD_TL0350A
148/* generic linear curve - not yet measured */
149static const unsigned char lcdlinear[256] = {
150 0, 1, 2, 3, 4, 5, 6, 7,
151 8, 9, 10, 11, 12, 13, 14, 15,
152 16, 17, 18, 19, 20, 21, 22, 23,
153 24, 25, 26, 27, 28, 29, 30, 31,
154 32, 33, 34, 35, 36, 37, 38, 39,
155 40, 41, 42, 43, 44, 45, 46, 47,
156 48, 49, 50, 51, 52, 53, 54, 55,
157 56, 57, 58, 59, 60, 61, 62, 63,
158 64, 65, 66, 67, 68, 69, 70, 71,
159 72, 73, 74, 75, 76, 77, 78, 79,
160 80, 81, 82, 83, 84, 85, 86, 87,
161 88, 89, 90, 91, 92, 93, 94, 95,
162 96, 97, 98, 99, 100, 101, 102, 103,
163 104, 105, 106, 107, 108, 109, 110, 111,
164 112, 113, 114, 115, 116, 117, 118, 119,
165 120, 121, 122, 123, 124, 125, 126, 127,
166 128, 129, 130, 131, 132, 133, 134, 135,
167 136, 137, 138, 139, 140, 141, 142, 143,
168 144, 145, 146, 147, 148, 149, 150, 151,
169 152, 153, 154, 155, 156, 157, 158, 159,
170 160, 161, 162, 163, 164, 165, 166, 167,
171 168, 169, 170, 171, 172, 173, 174, 175,
172 176, 177, 178, 179, 180, 181, 182, 183,
173 184, 185, 186, 187, 188, 189, 190, 191,
174 192, 193, 194, 195, 196, 197, 198, 199,
175 200, 201, 202, 203, 204, 205, 206, 207,
176 208, 209, 210, 211, 212, 213, 214, 215,
177 216, 217, 218, 219, 220, 221, 222, 223,
178 224, 225, 226, 227, 228, 229, 230, 231,
179 232, 233, 234, 235, 236, 237, 238, 239,
180 240, 241, 242, 243, 244, 245, 246, 247,
181 248, 249, 250, 251, 252, 253, 254, 255
182};
146#endif 183#endif
147#else /* SIMULATOR */ 184#else /* SIMULATOR */
148/* undo a (generic) PC display gamma of 2.0 to simulate target behaviour */ 185/* undo a (generic) PC display gamma of 2.0 to simulate target behaviour */
@@ -225,7 +262,7 @@ static unsigned long _grey_get_pixel(int x, int y)
225 int yg = y - _grey_info.y; 262 int yg = y - _grey_info.y;
226#if LCD_PIXELFORMAT == HORIZONTAL_PACKING 263#if LCD_PIXELFORMAT == HORIZONTAL_PACKING
227 int idx = _grey_info.width * yg + xg; 264 int idx = _grey_info.width * yg + xg;
228#else 265#else /* vertical packing or vertical interleaved */
229 int idx = _grey_info.width * (yg & ~_GREY_BMASK) 266 int idx = _grey_info.width * (yg & ~_GREY_BMASK)
230 + (xg << _GREY_BSHIFT) + (~yg & _GREY_BMASK); 267 + (xg << _GREY_BSHIFT) + (~yg & _GREY_BMASK);
231#endif 268#endif
@@ -243,7 +280,7 @@ static void _timer_isr(void)
243 _grey_info.bx, _grey_info.y, 280 _grey_info.bx, _grey_info.y,
244 _grey_info.bwidth, _grey_info.height, 281 _grey_info.bwidth, _grey_info.height,
245 _grey_info.width); 282 _grey_info.width);
246#else 283#else /* vertical packing or vertical interleaved */
247 _grey_info.rb->lcd_blit_grey_phase(_grey_info.values, _grey_info.phases, 284 _grey_info.rb->lcd_blit_grey_phase(_grey_info.values, _grey_info.phases,
248 _grey_info.x, _grey_info.by, 285 _grey_info.x, _grey_info.by,
249 _grey_info.width, _grey_info.bheight, 286 _grey_info.width, _grey_info.bheight,
@@ -355,8 +392,8 @@ bool grey_init(struct plugin_api* newrb, unsigned char *gbuf, long gbuf_size,
355#if LCD_PIXELFORMAT == HORIZONTAL_PACKING 392#if LCD_PIXELFORMAT == HORIZONTAL_PACKING
356 bdim = (width + 7) >> 3; 393 bdim = (width + 7) >> 3;
357 width = bdim << 3; 394 width = bdim << 3;
358#else /* vertical packing */ 395#else /* vertical packing or vertical interleaved */
359#if LCD_DEPTH == 1 396#if (LCD_DEPTH == 1) || (LCD_PIXELFORMAT == VERTICAL_INTERLEAVED)
360 bdim = (height + 7) >> 3; 397 bdim = (height + 7) >> 3;
361 height = bdim << 3; 398 height = bdim << 3;
362#elif LCD_DEPTH == 2 399#elif LCD_DEPTH == 2
@@ -408,7 +445,7 @@ bool grey_init(struct plugin_api* newrb, unsigned char *gbuf, long gbuf_size,
408#if LCD_PIXELFORMAT == HORIZONTAL_PACKING 445#if LCD_PIXELFORMAT == HORIZONTAL_PACKING
409 _grey_info.bx = 0; 446 _grey_info.bx = 0;
410 _grey_info.bwidth = bdim; 447 _grey_info.bwidth = bdim;
411#else 448#else /* vertical packing or vertical interleaved */
412 _grey_info.by = 0; 449 _grey_info.by = 0;
413 _grey_info.bheight = bdim; 450 _grey_info.bheight = bdim;
414#endif 451#endif
@@ -491,6 +528,9 @@ void grey_show(bool enable)
491 _grey_info.rb->timer_register(1, NULL, TIMER_FREQ / 83, 1, _timer_isr); 528 _grey_info.rb->timer_register(1, NULL, TIMER_FREQ / 83, 1, _timer_isr);
492#elif CONFIG_LCD == LCD_MROBE100 529#elif CONFIG_LCD == LCD_MROBE100
493 _grey_info.rb->timer_register(1, NULL, TIMER_FREQ / 83, 1, _timer_isr); /* not calibrated/tested */ 530 _grey_info.rb->timer_register(1, NULL, TIMER_FREQ / 83, 1, _timer_isr); /* not calibrated/tested */
531#elif CONFIG_LCD == LCD_TL0350A
532 _grey_info.rb->timer_register(1, NULL, TIMER_FREQ / 75, 1, _timer_isr); /* verified */
533 /* This is half of the actual frame frequency, but 150Hz is too much */
494#endif /* CONFIG_LCD */ 534#endif /* CONFIG_LCD */
495#endif /* !SIMULATOR */ 535#endif /* !SIMULATOR */
496 _grey_info.rb->screen_dump_set_hook(grey_screendump_hook); 536 _grey_info.rb->screen_dump_set_hook(grey_screendump_hook);
@@ -607,8 +647,11 @@ static void grey_screendump_hook(int fd)
607#elif LCD_DEPTH == 2 647#elif LCD_DEPTH == 2
608 int shift; 648 int shift;
609#endif 649#endif
610#endif /* LCD_PIXELFORMAT == VERTICAL_PACKING */ 650#elif LCD_PIXELFORMAT == VERTICAL_INTERLEAVED
611 unsigned char *lcdptr; 651 unsigned data;
652 int shift;
653#endif /* LCD_PIXELFORMAT */
654 fb_data *lcdptr;
612 unsigned char *clut_entry; 655 unsigned char *clut_entry;
613 unsigned char linebuf[MAX(4*BMP_VARCOLORS,BMP_LINESIZE)]; 656 unsigned char linebuf[MAX(4*BMP_VARCOLORS,BMP_LINESIZE)];
614 657
@@ -660,7 +703,7 @@ static void grey_screendump_hook(int fd)
660 lcdptr++; 703 lcdptr++;
661 } 704 }
662#endif /* LCD_DEPTH */ 705#endif /* LCD_DEPTH */
663#else /* LCD_PIXELFORMAT == VERTICAL_PACKING */ 706#elif LCD_PIXELFORMAT == VERTICAL_PACKING
664#if LCD_DEPTH == 1 707#if LCD_DEPTH == 1
665 mask = 1 << (y & 7); 708 mask = 1 << (y & 7);
666 lcdptr = _grey_info.rb->lcd_framebuffer + _GREY_MULUQ(LCD_WIDTH, y >> 3); 709 lcdptr = _grey_info.rb->lcd_framebuffer + _GREY_MULUQ(LCD_WIDTH, y >> 3);
@@ -708,6 +751,32 @@ static void grey_screendump_hook(int fd)
708 lcdptr++; 751 lcdptr++;
709 } 752 }
710#endif /* LCD_DEPTH */ 753#endif /* LCD_DEPTH */
754#elif LCD_PIXELFORMAT == VERTICAL_INTERLEAVED
755#if LCD_DEPTH == 2
756 shift = y & 7;
757 lcdptr = _grey_info.rb->lcd_framebuffer + _GREY_MULUQ(LCD_WIDTH, y >> 3);
758
759 for (x = 0; x < LCD_WIDTH; x++)
760 {
761 gx = x - _grey_info.x;
762
763 if (((unsigned)gy < (unsigned)_grey_info.height)
764 && ((unsigned)gx < (unsigned)_grey_info.width))
765 {
766 linebuf[x] = BMP_FIXEDCOLORS
767 + _grey_info.values[_GREY_MULUQ(_grey_info.width,
768 gy & ~_GREY_BMASK)
769 + (gx << _GREY_BSHIFT)
770 + (~gy & _GREY_BMASK)];
771 }
772 else
773 {
774 data = (*lcdptr >> shift) & 0x0101;
775 linebuf[x] = ((data >> 7) | data) & 3;
776 }
777 lcdptr++;
778 }
779#endif /* LCD_DEPTH */
711#endif /* LCD_PIXELFORMAT */ 780#endif /* LCD_PIXELFORMAT */
712 781
713 _grey_info.rb->write(fd, linebuf, BMP_LINESIZE); 782 _grey_info.rb->write(fd, linebuf, BMP_LINESIZE);
diff --git a/apps/plugins/lib/grey_draw.c b/apps/plugins/lib/grey_draw.c
index 7b24ba4c70..a1b99fc13b 100644
--- a/apps/plugins/lib/grey_draw.c
+++ b/apps/plugins/lib/grey_draw.c
@@ -630,7 +630,7 @@ void grey_ub_gray_bitmap_part(const unsigned char *src, int src_x, int src_y,
630 { 630 {
631#if LCD_PIXELFORMAT == HORIZONTAL_PACKING 631#if LCD_PIXELFORMAT == HORIZONTAL_PACKING
632 int idx = _GREY_MULUQ(_grey_info.width, yc); 632 int idx = _GREY_MULUQ(_grey_info.width, yc);
633#else 633#else /* vertical packing or vertical interleaved */
634 int idx = _GREY_MULUQ(_grey_info.width, yc & ~_GREY_BMASK) 634 int idx = _GREY_MULUQ(_grey_info.width, yc & ~_GREY_BMASK)
635 + (~yc & _GREY_BMASK); 635 + (~yc & _GREY_BMASK);
636#endif /* LCD_PIXELFORMAT */ 636#endif /* LCD_PIXELFORMAT */
diff --git a/apps/plugins/lib/grey_parm.c b/apps/plugins/lib/grey_parm.c
index 63d09dfd72..e4aaec3efd 100644
--- a/apps/plugins/lib/grey_parm.c
+++ b/apps/plugins/lib/grey_parm.c
@@ -34,8 +34,8 @@ void grey_set_position(int x, int y)
34#if LCD_PIXELFORMAT == HORIZONTAL_PACKING 34#if LCD_PIXELFORMAT == HORIZONTAL_PACKING
35 _grey_info.bx = (x + 4) >> 3; 35 _grey_info.bx = (x + 4) >> 3;
36 x = 8 * _grey_info.bx; 36 x = 8 * _grey_info.bx;
37#else 37#else /* vertical packing or vertical interleaved */
38#if LCD_DEPTH == 1 38#if (LCD_DEPTH == 1) || (LCD_PIXELFORMAT == VERTICAL_INTERLEAVED)
39 _grey_info.by = (y + 4) >> 3; 39 _grey_info.by = (y + 4) >> 3;
40 y = 8 * _grey_info.by; 40 y = 8 * _grey_info.by;
41#elif LCD_DEPTH == 2 41#elif LCD_DEPTH == 2
diff --git a/apps/plugins/lib/grey_scroll.c b/apps/plugins/lib/grey_scroll.c
index 12a27daf23..ba790b035f 100644
--- a/apps/plugins/lib/grey_scroll.c
+++ b/apps/plugins/lib/grey_scroll.c
@@ -191,7 +191,8 @@ void grey_ub_scroll_up(int count)
191 _grey_info.fg_brightness : 191 _grey_info.fg_brightness :
192 _grey_info.bg_brightness]; 192 _grey_info.bg_brightness];
193 193
194#if LCD_PIXELFORMAT == VERTICAL_PACKING 194#if (LCD_PIXELFORMAT == VERTICAL_PACKING) \
195 || (LCD_PIXELFORMAT == VERTICAL_INTERLEAVED)
195 if (count & _GREY_BMASK) 196 if (count & _GREY_BMASK)
196 { 197 {
197 /* Scrolling by fractional blocks - move pixel wise. */ 198 /* Scrolling by fractional blocks - move pixel wise. */
@@ -262,7 +263,8 @@ void grey_ub_scroll_down(int count)
262 _grey_info.fg_brightness : 263 _grey_info.fg_brightness :
263 _grey_info.bg_brightness]; 264 _grey_info.bg_brightness];
264 265
265#if LCD_PIXELFORMAT == VERTICAL_PACKING 266#if (LCD_PIXELFORMAT == VERTICAL_PACKING) \
267 || (LCD_PIXELFORMAT == VERTICAL_INTERLEAVED)
266 if (count & _GREY_BMASK) 268 if (count & _GREY_BMASK)
267 { 269 {
268 /* Scrolling by fractional blocks - move pixel wise. */ 270 /* Scrolling by fractional blocks - move pixel wise. */
diff --git a/apps/plugins/mandelbrot.c b/apps/plugins/mandelbrot.c
index 26ec3e4ab9..4a4872b827 100644
--- a/apps/plugins/mandelbrot.c
+++ b/apps/plugins/mandelbrot.c
@@ -202,6 +202,22 @@ PLUGIN_HEADER
202#define MANDELBROT_MAXITER_DEC BUTTON_PLAY 202#define MANDELBROT_MAXITER_DEC BUTTON_PLAY
203#define MANDELBROT_RESET BUTTON_DISPLAY 203#define MANDELBROT_RESET BUTTON_DISPLAY
204 204
205#elif CONFIG_KEYPAD == IAUDIO_M3_PAD
206#define MANDELBROT_QUIT BUTTON_RC_REC
207#define MANDELBROT_UP BUTTON_RC_VOL_UP
208#define MANDELBROT_DOWN BUTTON_RC_VOL_DOWN
209#define MANDELBROT_LEFT BUTTON_RC_REW
210#define MANDELBROT_RIGHT BUTTON_RC_FF
211#define MANDELBROT_ZOOM_IN_PRE BUTTON_RC_PLAY
212#define MANDELBROT_ZOOM_IN (BUTTON_RC_PLAY | BUTTON_REL)
213#define MANDELBROT_ZOOM_OUT_PRE BUTTON_RC_PLAY
214#define MANDELBROT_ZOOM_OUT (BUTTON_RC_PLAY | BUTTON_REPEAT)
215#define MANDELBROT_MAXITER_INC_PRE BUTTON_RC_MODE
216#define MANDELBROT_MAXITER_INC (BUTTON_RC_MODE|BUTTON_REL)
217#define MANDELBROT_MAXITER_DEC_PRE BUTTON_RC_MODE
218#define MANDELBROT_MAXITER_DEC (BUTTON_RC_MODE|BUTTON_REPEAT)
219#define MANDELBROT_RESET BUTTON_RC_MENU
220
205#elif CONFIG_KEYPAD == COWOND2_PAD 221#elif CONFIG_KEYPAD == COWOND2_PAD
206#define MANDELBROT_QUIT BUTTON_POWER 222#define MANDELBROT_QUIT BUTTON_POWER
207#define MANDELBROT_UP BUTTON_UP 223#define MANDELBROT_UP BUTTON_UP
diff --git a/apps/plugins/mpegplayer/mpeg_settings.c b/apps/plugins/mpegplayer/mpeg_settings.c
index 7dfdd36927..b7b7def729 100644
--- a/apps/plugins/mpegplayer/mpeg_settings.c
+++ b/apps/plugins/mpegplayer/mpeg_settings.c
@@ -102,6 +102,14 @@ struct mpeg_settings settings;
102#define MPEG_START_TIME_SCROLL_UP BUTTON_PLAY 102#define MPEG_START_TIME_SCROLL_UP BUTTON_PLAY
103#define MPEG_START_TIME_EXIT BUTTON_POWER 103#define MPEG_START_TIME_EXIT BUTTON_POWER
104 104
105#elif CONFIG_KEYPAD == IAUDIO_M3_PAD
106#define MPEG_START_TIME_SELECT BUTTON_RC_PLAY
107#define MPEG_START_TIME_LEFT BUTTON_RC_REW
108#define MPEG_START_TIME_RIGHT BUTTON_RC_FF
109#define MPEG_START_TIME_UP BUTTON_RC_VOL_UP
110#define MPEG_START_TIME_DOWN BUTTON_RC_VOL_DOWN
111#define MPEG_START_TIME_EXIT BUTTON_RC_REC
112
105#elif CONFIG_KEYPAD == COWOND2_PAD 113#elif CONFIG_KEYPAD == COWOND2_PAD
106#define MPEG_START_TIME_SELECT BUTTON_SELECT 114#define MPEG_START_TIME_SELECT BUTTON_SELECT
107#define MPEG_START_TIME_SCROLL_UP BUTTON_PLUS 115#define MPEG_START_TIME_SCROLL_UP BUTTON_PLUS
diff --git a/apps/plugins/mpegplayer/mpegplayer.c b/apps/plugins/mpegplayer/mpegplayer.c
index d068fd8254..8a947904a3 100644
--- a/apps/plugins/mpegplayer/mpegplayer.c
+++ b/apps/plugins/mpegplayer/mpegplayer.c
@@ -202,6 +202,15 @@ PLUGIN_IRAM_DECLARE
202#define MPEG_RW BUTTON_LEFT 202#define MPEG_RW BUTTON_LEFT
203#define MPEG_FF BUTTON_RIGHT 203#define MPEG_FF BUTTON_RIGHT
204 204
205#elif CONFIG_KEYPAD == IAUDIO_M3_PAD
206#define MPEG_MENU BUTTON_RC_MENU
207#define MPEG_STOP BUTTON_RC_REC
208#define MPEG_PAUSE BUTTON_RC_PLAY
209#define MPEG_VOLDOWN BUTTON_RC_VOL_DOWN
210#define MPEG_VOLUP BUTTON_RC_VOL_UP
211#define MPEG_RW BUTTON_RC_REW
212#define MPEG_FF BUTTON_RC_FF
213
205#elif CONFIG_KEYPAD == COWOND2_PAD 214#elif CONFIG_KEYPAD == COWOND2_PAD
206#define MPEG_MENU BUTTON_MENU 215#define MPEG_MENU BUTTON_MENU
207#define MPEG_STOP BUTTON_POWER 216#define MPEG_STOP BUTTON_POWER
diff --git a/apps/plugins/plasma.c b/apps/plugins/plasma.c
index d5c1ef427f..2e04bd59b5 100644
--- a/apps/plugins/plasma.c
+++ b/apps/plugins/plasma.c
@@ -59,6 +59,7 @@ static int plasma_frequency;
59#define PLASMA_QUIT BUTTON_MENU 59#define PLASMA_QUIT BUTTON_MENU
60#define PLASMA_INCREASE_FREQUENCY BUTTON_SCROLL_FWD 60#define PLASMA_INCREASE_FREQUENCY BUTTON_SCROLL_FWD
61#define PLASMA_DECREASE_FREQUENCY BUTTON_SCROLL_BACK 61#define PLASMA_DECREASE_FREQUENCY BUTTON_SCROLL_BACK
62
62#elif (CONFIG_KEYPAD == GIGABEAT_PAD) 63#elif (CONFIG_KEYPAD == GIGABEAT_PAD)
63#define PLASMA_QUIT BUTTON_A 64#define PLASMA_QUIT BUTTON_A
64#define PLASMA_INCREASE_FREQUENCY BUTTON_UP 65#define PLASMA_INCREASE_FREQUENCY BUTTON_UP
@@ -74,26 +75,38 @@ static int plasma_frequency;
74#define PLASMA_QUIT BUTTON_POWER 75#define PLASMA_QUIT BUTTON_POWER
75#define PLASMA_INCREASE_FREQUENCY BUTTON_UP 76#define PLASMA_INCREASE_FREQUENCY BUTTON_UP
76#define PLASMA_DECREASE_FREQUENCY BUTTON_DOWN 77#define PLASMA_DECREASE_FREQUENCY BUTTON_DOWN
78
77#elif (CONFIG_KEYPAD == IRIVER_H10_PAD) 79#elif (CONFIG_KEYPAD == IRIVER_H10_PAD)
78#define PLASMA_QUIT BUTTON_POWER 80#define PLASMA_QUIT BUTTON_POWER
79#define PLASMA_INCREASE_FREQUENCY BUTTON_SCROLL_UP 81#define PLASMA_INCREASE_FREQUENCY BUTTON_SCROLL_UP
80#define PLASMA_DECREASE_FREQUENCY BUTTON_SCROLL_DOWN 82#define PLASMA_DECREASE_FREQUENCY BUTTON_SCROLL_DOWN
83
81#elif (CONFIG_KEYPAD == GIGABEAT_S_PAD) 84#elif (CONFIG_KEYPAD == GIGABEAT_S_PAD)
82#define PLASMA_QUIT BUTTON_BACK 85#define PLASMA_QUIT BUTTON_BACK
83#define PLASMA_INCREASE_FREQUENCY BUTTON_UP 86#define PLASMA_INCREASE_FREQUENCY BUTTON_UP
84#define PLASMA_DECREASE_FREQUENCY BUTTON_DOWN 87#define PLASMA_DECREASE_FREQUENCY BUTTON_DOWN
88
85#elif (CONFIG_KEYPAD == MROBE100_PAD) 89#elif (CONFIG_KEYPAD == MROBE100_PAD)
86#define PLASMA_QUIT BUTTON_POWER 90#define PLASMA_QUIT BUTTON_POWER
87#define PLASMA_INCREASE_FREQUENCY BUTTON_UP 91#define PLASMA_INCREASE_FREQUENCY BUTTON_UP
88#define PLASMA_DECREASE_FREQUENCY BUTTON_DOWN 92#define PLASMA_DECREASE_FREQUENCY BUTTON_DOWN
93
94#elif (CONFIG_KEYPAD == IAUDIO_M3_PAD)
95#define PLASMA_QUIT BUTTON_RC_REC
96#define PLASMA_INCREASE_FREQUENCY BUTTON_RC_VOL_UP
97#define PLASMA_DECREASE_FREQUENCY BUTTON_RC_VOL_DOWN
98#define PLASMA_RC_QUIT BUTTON_REC
99
89#elif (CONFIG_KEYPAD == COWOND2_PAD) 100#elif (CONFIG_KEYPAD == COWOND2_PAD)
90#define PLASMA_QUIT BUTTON_POWER 101#define PLASMA_QUIT BUTTON_POWER
91#define PLASMA_INCREASE_FREQUENCY BUTTON_UP 102#define PLASMA_INCREASE_FREQUENCY BUTTON_UP
92#define PLASMA_DECREASE_FREQUENCY BUTTON_DOWN 103#define PLASMA_DECREASE_FREQUENCY BUTTON_DOWN
104
93#else 105#else
94#define PLASMA_QUIT BUTTON_OFF 106#define PLASMA_QUIT BUTTON_OFF
95#define PLASMA_INCREASE_FREQUENCY BUTTON_UP 107#define PLASMA_INCREASE_FREQUENCY BUTTON_UP
96#define PLASMA_DECREASE_FREQUENCY BUTTON_DOWN 108#define PLASMA_DECREASE_FREQUENCY BUTTON_DOWN
109
97#if (CONFIG_KEYPAD == IRIVER_H100_PAD) || (CONFIG_KEYPAD == IRIVER_H300_PAD) 110#if (CONFIG_KEYPAD == IRIVER_H100_PAD) || (CONFIG_KEYPAD == IRIVER_H300_PAD)
98#define PLASMA_RC_QUIT BUTTON_RC_STOP 111#define PLASMA_RC_QUIT BUTTON_RC_STOP
99#endif 112#endif
diff --git a/apps/plugins/test_fps.c b/apps/plugins/test_fps.c
index 7c86fabdc0..a312c13662 100644
--- a/apps/plugins/test_fps.c
+++ b/apps/plugins/test_fps.c
@@ -260,7 +260,7 @@ static void time_remote_update(void)
260} 260}
261#endif 261#endif
262 262
263#if (LCD_DEPTH < 4) && !defined(IAUDIO_M3) 263#if LCD_DEPTH < 4
264 264
265GREY_INFO_STRUCT_IRAM 265GREY_INFO_STRUCT_IRAM
266static unsigned char greydata[LCD_HEIGHT][LCD_WIDTH]; 266static unsigned char greydata[LCD_HEIGHT][LCD_WIDTH];
@@ -357,7 +357,7 @@ enum plugin_status plugin_start(struct plugin_api* api, void* parameter)
357 log_text("Main LCD YUV"); 357 log_text("Main LCD YUV");
358 time_main_yuv(); 358 time_main_yuv();
359#endif 359#endif
360#if (LCD_DEPTH < 4) && !defined(IAUDIO_M3) 360#if LCD_DEPTH < 4
361 log_text("Greyscale library"); 361 log_text("Greyscale library");
362 time_greyscale(); 362 time_greyscale();
363#endif 363#endif
diff --git a/bootloader/ipod.c b/bootloader/ipod.c
index b3ff7bcedb..bafcb4909d 100644
--- a/bootloader/ipod.c
+++ b/bootloader/ipod.c
@@ -56,6 +56,49 @@ unsigned char *loadbuffer = (unsigned char *)DRAM_START;
56/* Bootloader version */ 56/* Bootloader version */
57char version[] = APPSVERSION; 57char version[] = APPSVERSION;
58 58
59struct sysinfo
60{
61 unsigned IsyS; /* == "IsyS" */
62 unsigned len;
63 char BoardHwName[16];
64 char pszSerialNumber[32];
65 char pu8FirewireGuid[16];
66 unsigned boardHwRev;
67 unsigned bootLoaderImageRev;
68 unsigned diskModeImageRev;
69 unsigned diagImageRev;
70 unsigned osImageRev;
71 unsigned iram_perhaps;
72 unsigned Flsh;
73 unsigned flash_zero;
74 unsigned flash_base;
75 unsigned flash_size;
76 unsigned flash_zero2;
77 unsigned Sdrm;
78 unsigned sdram_zero;
79 unsigned sdram_base;
80 unsigned sdram_size;
81 unsigned sdram_zero2;
82 unsigned Frwr;
83 unsigned frwr_zero;
84 unsigned frwr_base;
85 unsigned frwr_size;
86 unsigned frwr_zero2;
87 unsigned Iram;
88 unsigned iram_zero;
89 unsigned iram_base;
90 unsigned iram_size;
91 unsigned iram_zero2;
92 char pad7[120];
93 unsigned boardHwSwInterfaceRev;
94
95 /* added in V3 */
96 char HddFirmwareRev[10];
97 unsigned short RegionCode;
98 unsigned PolicyFlags;
99 char ModelNumStr[16];
100};
101
59#define BUTTON_LEFT 1 102#define BUTTON_LEFT 1
60#define BUTTON_MENU 2 103#define BUTTON_MENU 2
61#define BUTTON_RIGHT 3 104#define BUTTON_RIGHT 3
@@ -220,6 +263,24 @@ void fatal_error(void)
220 263
221} 264}
222 265
266static struct sysinfo ** const sysinfo_ptr =
267#if CONFIG_CPU == PP5002 || CONFIG_CPU == PP5020
268 0x40017f1c;
269#elif CONFIG_CPU == PP5022 || CONFIG_CPU == PP5024
270 0x4001ff1c;
271#endif
272
273static unsigned ipod_get_hwrev_sysinfo(void)
274{
275 if ( (*sysinfo_ptr)->IsyS == *(unsigned *)"IsyS" )
276 {
277 if ((*sysinfo_ptr)->len == 0xf8)
278 return (*sysinfo_ptr)->sdram_zero2;
279 else
280 return (*sysinfo_ptr)->boardHwSwInterfaceRev;
281 }
282 return 0xffffffff; /* unknown */
283}
223 284
224void* main(void) 285void* main(void)
225{ 286{
@@ -270,6 +331,9 @@ void* main(void)
270 printf("Rockbox boot loader"); 331 printf("Rockbox boot loader");
271 printf("Version: %s", version); 332 printf("Version: %s", version);
272 printf("IPOD version: 0x%08x", IPOD_HW_REVISION); 333 printf("IPOD version: 0x%08x", IPOD_HW_REVISION);
334
335 printf("SysI ptr: %08x", *sysinfo_ptr);
336 printf("SysI HWR: %08x", ipod_get_hwrev_sysinfo());
273 337
274 i=ata_init(); 338 i=ata_init();
275 if (i==0) { 339 if (i==0) {
diff --git a/firmware/SOURCES b/firmware/SOURCES
index 0a8ac2a8e3..1d60ea1016 100644
--- a/firmware/SOURCES
+++ b/firmware/SOURCES
@@ -513,6 +513,7 @@ target/coldfire/iaudio/m3/backlight-m3.c
513target/coldfire/iaudio/m3/button-m3.c 513target/coldfire/iaudio/m3/button-m3.c
514target/coldfire/iaudio/m3/fmradio_i2c-m3.c 514target/coldfire/iaudio/m3/fmradio_i2c-m3.c
515target/coldfire/iaudio/m3/lcd-m3.c 515target/coldfire/iaudio/m3/lcd-m3.c
516target/coldfire/iaudio/m3/lcd-as-m3.S
516target/coldfire/iaudio/m3/power-m3.c 517target/coldfire/iaudio/m3/power-m3.c
517target/coldfire/iaudio/m3/powermgmt-m3.c 518target/coldfire/iaudio/m3/powermgmt-m3.c
518target/coldfire/iaudio/m3/system-m3.c 519target/coldfire/iaudio/m3/system-m3.c
diff --git a/firmware/backlight.c b/firmware/backlight.c
index 0f66fbf574..4c4471ace6 100644
--- a/firmware/backlight.c
+++ b/firmware/backlight.c
@@ -468,7 +468,7 @@ void backlight_thread(void)
468 lcd_remote_off(); 468 lcd_remote_off();
469 break; 469 break;
470#elif defined HAVE_REMOTE_LCD_AS_MAIN 470#elif defined HAVE_REMOTE_LCD_AS_MAIN
471 case SYS_REMOTE_PLUGGED: 471 case SYS_REMOTE_PLUGGED:
472 lcd_on(); 472 lcd_on();
473 lcd_update(); 473 lcd_update();
474 break; 474 break;
diff --git a/firmware/export/config-player.h b/firmware/export/config-player.h
index b9e3035951..c69fe8cfcb 100644
--- a/firmware/export/config-player.h
+++ b/firmware/export/config-player.h
@@ -46,7 +46,7 @@
46 46
47/* Uncomment this if you want to enable ATA power-off control. 47/* Uncomment this if you want to enable ATA power-off control.
48 * Attention, some players crash when ATA power-off is enabled! */ 48 * Attention, some players crash when ATA power-off is enabled! */
49//#define HAVE_ATA_POWER_OFF 49#define HAVE_ATA_POWER_OFF
50 50
51/* Define this if you control ata power player style 51/* Define this if you control ata power player style
52 (with PB4, new player only) */ 52 (with PB4, new player only) */
diff --git a/firmware/export/id3.h b/firmware/export/id3.h
index bb3b6a6fe5..267f1b4afa 100644
--- a/firmware/export/id3.h
+++ b/firmware/export/id3.h
@@ -49,6 +49,7 @@ enum
49 AFMT_WAVPACK, /* WavPack */ 49 AFMT_WAVPACK, /* WavPack */
50 AFMT_ALAC, /* Apple Lossless Audio Codec */ 50 AFMT_ALAC, /* Apple Lossless Audio Codec */
51 AFMT_AAC, /* Advanced Audio Coding (AAC) in M4A container */ 51 AFMT_AAC, /* Advanced Audio Coding (AAC) in M4A container */
52 AFMT_MOD, /* MOD File Format */
52 AFMT_SHN, /* Shorten */ 53 AFMT_SHN, /* Shorten */
53 AFMT_SID, /* SID File Format */ 54 AFMT_SID, /* SID File Format */
54 AFMT_ADX, /* ADX File Format */ 55 AFMT_ADX, /* ADX File Format */
diff --git a/firmware/id3.c b/firmware/id3.c
index f594528910..87b4ce9d31 100644
--- a/firmware/id3.c
+++ b/firmware/id3.c
@@ -90,6 +90,9 @@ const struct afmt_entry audio_formats[AFMT_NUM_CODECS] =
90 [AFMT_AAC] = 90 [AFMT_AAC] =
91 AFMT_ENTRY("AAC", "aac", NULL, "mp4\0" ), 91 AFMT_ENTRY("AAC", "aac", NULL, "mp4\0" ),
92 /* Shorten */ 92 /* Shorten */
93 [AFMT_MOD] =
94 AFMT_ENTRY("MOD", "mod", NULL, "mod\0" ),
95 /* Shorten */
93 [AFMT_SHN] = 96 [AFMT_SHN] =
94 AFMT_ENTRY("SHN", "shorten", NULL, "shn\0" ), 97 AFMT_ENTRY("SHN", "shorten", NULL, "shn\0" ),
95 /* SID File Format */ 98 /* SID File Format */
diff --git a/firmware/target/arm/iriver/h10/lcd-h10_5gb.c b/firmware/target/arm/iriver/h10/lcd-h10_5gb.c
index 5b022e09c5..669654f5c3 100644
--- a/firmware/target/arm/iriver/h10/lcd-h10_5gb.c
+++ b/firmware/target/arm/iriver/h10/lcd-h10_5gb.c
@@ -108,6 +108,7 @@ void lcd_init_device(void)
108{ 108{
109 CLCD_CLOCK_SRC |= 0xc0000000; /* Set LCD interface clock to PLL */ 109 CLCD_CLOCK_SRC |= 0xc0000000; /* Set LCD interface clock to PLL */
110 /* H10 LCD is initialised by the bootloader */ 110 /* H10 LCD is initialised by the bootloader */
111 lcd_write_reg(R_ENTRY_MODE, 0x1030); /* BGR =1, ID1 = 1, ID0 = 1 */
111} 112}
112 113
113/*** update functions ***/ 114/*** update functions ***/
@@ -275,88 +276,51 @@ void lcd_blit_yuv(unsigned char * const src[3],
275 276
276 277
277/* Update a fraction of the display. */ 278/* Update a fraction of the display. */
278void lcd_update_rect(int x0, int y0, int width, int height) 279void lcd_update_rect(int x, int y, int width, int height)
279{ 280{
280 int x1, y1; 281 const fb_data *addr;
281 int newx,newwidth; 282 int bytes_to_write;
282 unsigned long *addr; 283
284 if (x + width >= LCD_WIDTH)
285 width = LCD_WIDTH - x;
286 if (y + height >= LCD_HEIGHT)
287 height = LCD_HEIGHT - y;
288
289 if ((width <= 0) || (height <= 0))
290 return; /* Nothing left to do. 0 would hang the transfer. */
291
292 /* Ensure x and width are both even, so we can read
293 * 32-bit aligned data from the framebuffer */
294 width = (width + (x & 1) + 1) & ~1;
295 x &= ~1;
296
297 lcd_write_reg(R_VERT_RAM_ADDR_POS, (LCD_HEIGHT-1) << 8);
298 lcd_write_reg(R_HORIZ_RAM_ADDR_POS, ((x + width - 1) << 8) | x);
299 lcd_write_reg(R_RAM_ADDR_SET, (y << 8) | x);
283 300
284 /* Ensure x and width are both even - so we can read 32-bit aligned
285 data from lcd_framebuffer */
286 newx=x0&~1;
287 newwidth=width&~1;
288 if (newx+newwidth < x0+width) { newwidth+=2; }
289 x0=newx; width=newwidth;
290
291 /* calculate the drawing region */
292 y1 = (y0 + height) - 1; /* max vert */
293 x1 = (x0 + width) - 1; /* max horiz */
294
295
296 /* swap max horiz < start horiz */
297 if (y1 < y0) {
298 int t;
299 t = y0;
300 y0 = y1;
301 y1 = t;
302 }
303
304 /* swap max vert < start vert */
305 if (x1 < x0) {
306 int t;
307 t = x0;
308 x0 = x1;
309 x1 = t;
310 }
311
312 /* max horiz << 8 | start horiz */
313 lcd_write_reg(R_HORIZ_RAM_ADDR_POS, (x1 << 8) | x0);
314
315 /* max vert << 8 | start vert */
316 lcd_write_reg(R_VERT_RAM_ADDR_POS, (y1 << 8) | y0);
317
318 /* start vert << 8 | start horiz */
319 lcd_write_reg(R_RAM_ADDR_SET, (y0 << 8) | x0);
320
321 /* start drawing */
322 lcd_send_cmd(R_WRITE_DATA_2_GRAM); 301 lcd_send_cmd(R_WRITE_DATA_2_GRAM);
323 302
324 addr = (unsigned long*)&lcd_framebuffer[y0][x0]; 303 addr = &lcd_framebuffer[y][x];
325 304 bytes_to_write = width * height * sizeof(fb_data);
326 while (height > 0) { 305 /* must be <= 0x10000, but that's guaranteed on H10. */
327 int c, r;
328 int h, pixels_to_write;
329
330 pixels_to_write = (width * height) * 2;
331 h = height;
332
333 /* calculate how much we can do in one go */
334 if (pixels_to_write > 0x10000) {
335 h = (0x10000/2) / width;
336 pixels_to_write = (width * h) * 2;
337 }
338
339 LCD2_BLOCK_CTRL = 0x10000080;
340 LCD2_BLOCK_CONFIG = 0xc0010000 | (pixels_to_write - 1);
341 LCD2_BLOCK_CTRL = 0x34000000;
342 306
343 /* for each row */ 307 LCD2_BLOCK_CTRL = 0x10000080;
344 for (r = 0; r < h; r++) { 308 LCD2_BLOCK_CONFIG = 0xc0010000 | (bytes_to_write - 1);
345 /* for each column */ 309 LCD2_BLOCK_CTRL = 0x34000000;
346 for (c = 0; c < width; c += 2) { 310
347 while (!(LCD2_BLOCK_CTRL & LCD2_BLOCK_TXOK)); 311 do
348 312 {
349 /* output 2 pixels */ 313 int w = width >> 1;
350 LCD2_BLOCK_DATA = *addr++; 314 do
351 } 315 {
352 addr += (LCD_WIDTH - width)/2; 316 while (!(LCD2_BLOCK_CTRL & LCD2_BLOCK_TXOK));
317 LCD2_BLOCK_DATA = *(unsigned long*)addr; /* output 2 pixels */
318 addr += 2;
353 } 319 }
354 320 while (--w > 0);
355 while (!(LCD2_BLOCK_CTRL & LCD2_BLOCK_READY)); 321 addr += LCD_WIDTH - width;
356 LCD2_BLOCK_CONFIG = 0;
357
358 height -= h;
359 } 322 }
323 while (--height > 0);
360} 324}
361 325
362/* Update the display. 326/* Update the display.
diff --git a/firmware/target/coldfire/iaudio/lcd-remote-iaudio.c b/firmware/target/coldfire/iaudio/lcd-remote-iaudio.c
index 5a03dc6180..6565d3088d 100644
--- a/firmware/target/coldfire/iaudio/lcd-remote-iaudio.c
+++ b/firmware/target/coldfire/iaudio/lcd-remote-iaudio.c
@@ -64,83 +64,106 @@ bool remote_initialized = false;
64static inline void _write_byte(unsigned data) 64static inline void _write_byte(unsigned data)
65{ 65{
66 asm volatile ( 66 asm volatile (
67 "move.l (%[gpo0]), %%d0 \n" /* Get current state of data line */ 67 "move.w %%sr,%%d2 \n" /* Get current interrupt level */
68 "and.l %[dbit], %%d0 \n" 68 "move.w #0x2700,%%sr \n" /* Disable interrupts */
69
70 "move.l (%[gpo0]), %%d0 \n" /* Get current state of data port */
71 "move.l %%d0, %%d1 \n"
72 "and.l %[dbit], %%d1 \n" /* Check current state of data line */
69 "beq.s 1f \n" /* and set it as previous-state bit */ 73 "beq.s 1f \n" /* and set it as previous-state bit */
70 "bset #8, %[data] \n" 74 "bset #8, %[data] \n"
71 "1: \n" 75 "1: \n"
72 "move.l %[data], %%d0 \n" /* Compute the 'bit derivative', i.e. a value */ 76 "move.l %[data], %%d1 \n" /* Compute the 'bit derivative', i.e. a value */
73 "lsr.l #1, %%d0 \n" /* with 1's where the data changes from the */ 77 "lsr.l #1, %%d1 \n" /* with 1's where the data changes from the */
74 "eor.l %%d0, %[data] \n" /* previous state, and 0's where it doesn't */ 78 "eor.l %%d1, %[data] \n" /* previous state, and 0's where it doesn't */
75 "swap %[data] \n" /* Shift data to upper byte */ 79 "swap %[data] \n" /* Shift data to upper byte */
76 "lsl.l #8, %[data] \n" 80 "lsl.l #8, %[data] \n"
77 81
78 "move.l %[cbit], %%d1 \n" /* Prepare mask for flipping CLK */ 82 "eor.l %[cbit], %%d0 \n" /* precalculate opposite state of clock line */
79 "or.l %[dbit], %%d1 \n" /* and DATA at once */ 83
80
81 "lsl.l #1,%[data] \n" /* Shift out MSB */ 84 "lsl.l #1,%[data] \n" /* Shift out MSB */
82 "bcc.s 1f \n" 85 "bcc.s 1f \n"
83 "eor.l %%d1, (%[gpo0]) \n" /* 1: Flip both CLK and DATA */ 86 "eor.l %[dbit], %%d0 \n" /* 1: Flip data bit */
84 ".word 0x51fa \n" /* (trapf.w - shadow next insn) */
85 "1: \n" 87 "1: \n"
86 "eor.l %[cbit], (%[gpo0]) \n" /* else flip CLK only */ 88 "move.l %%d0, %%d1 \n"
87 "eor.l %[cbit], (%[gpo0]) \n" /* Flip CLK again */ 89 "move.l %%d0, (%[gpo0]) \n" /* Output new state and set CLK = 0*/
90 "eor.l %[cbit], %%d1 \n"
91 "nop \n"
88 92
89 "lsl.l #1,%[data] \n" /* ..unrolled.. */ 93 "lsl.l #1,%[data] \n" /* ..unrolled.. */
90 "bcc.s 1f \n" 94 "bcc.s 1f \n"
91 "eor.l %%d1, (%[gpo0]) \n" 95 "eor.l %[dbit], %%d0 \n"
92 ".word 0x51fa \n"
93 "1: \n" 96 "1: \n"
94 "eor.l %[cbit], (%[gpo0]) \n" 97 "move.l %%d1, (%[gpo0]) \n" /* set CLK = 1 (delayed) */
95 "eor.l %[cbit], (%[gpo0]) \n" 98 "move.l %%d0, %%d1 \n"
99 "move.l %%d0, (%[gpo0]) \n"
100 "eor.l %[cbit], %%d1 \n"
101 "nop \n"
96 102
97 "lsl.l #1,%[data] \n" 103 "lsl.l #1,%[data] \n" /* ..unrolled.. */
98 "bcc.s 1f \n" 104 "bcc.s 1f \n"
99 "eor.l %%d1, (%[gpo0]) \n" 105 "eor.l %[dbit], %%d0 \n"
100 ".word 0x51fa \n"
101 "1: \n" 106 "1: \n"
102 "eor.l %[cbit], (%[gpo0]) \n" 107 "move.l %%d1, (%[gpo0]) \n"
103 "eor.l %[cbit], (%[gpo0]) \n" 108 "move.l %%d0, %%d1 \n"
109 "move.l %%d0, (%[gpo0]) \n"
110 "eor.l %[cbit], %%d1 \n"
111 "nop \n"
104 112
105 "lsl.l #1,%[data] \n" 113 "lsl.l #1,%[data] \n" /* ..unrolled.. */
106 "bcc.s 1f \n" 114 "bcc.s 1f \n"
107 "eor.l %%d1, (%[gpo0]) \n" 115 "eor.l %[dbit], %%d0 \n"
108 ".word 0x51fa \n"
109 "1: \n" 116 "1: \n"
110 "eor.l %[cbit], (%[gpo0]) \n" 117 "move.l %%d1, (%[gpo0]) \n"
111 "eor.l %[cbit], (%[gpo0]) \n" 118 "move.l %%d0, %%d1 \n"
119 "move.l %%d0, (%[gpo0]) \n"
120 "eor.l %[cbit], %%d1 \n"
121 "nop \n"
112 122
113 "lsl.l #1,%[data] \n" 123 "lsl.l #1,%[data] \n" /* ..unrolled.. */
114 "bcc.s 1f \n" 124 "bcc.s 1f \n"
115 "eor.l %%d1, (%[gpo0]) \n" 125 "eor.l %[dbit], %%d0 \n"
116 ".word 0x51fa \n"
117 "1: \n" 126 "1: \n"
118 "eor.l %[cbit], (%[gpo0]) \n" 127 "move.l %%d1, (%[gpo0]) \n"
119 "eor.l %[cbit], (%[gpo0]) \n" 128 "move.l %%d0, %%d1 \n"
129 "move.l %%d0, (%[gpo0]) \n"
130 "eor.l %[cbit], %%d1 \n"
131 "nop \n"
120 132
121 "lsl.l #1,%[data] \n" 133 "lsl.l #1,%[data] \n" /* ..unrolled.. */
122 "bcc.s 1f \n" 134 "bcc.s 1f \n"
123 "eor.l %%d1, (%[gpo0]) \n" 135 "eor.l %[dbit], %%d0 \n"
124 ".word 0x51fa \n"
125 "1: \n" 136 "1: \n"
126 "eor.l %[cbit], (%[gpo0]) \n" 137 "move.l %%d1, (%[gpo0]) \n"
127 "eor.l %[cbit], (%[gpo0]) \n" 138 "move.l %%d0, %%d1 \n"
139 "move.l %%d0, (%[gpo0]) \n"
140 "eor.l %[cbit], %%d1 \n"
141 "nop \n"
128 142
129 "lsl.l #1,%[data] \n" 143 "lsl.l #1,%[data] \n" /* ..unrolled.. */
130 "bcc.s 1f \n" 144 "bcc.s 1f \n"
131 "eor.l %%d1, (%[gpo0]) \n" 145 "eor.l %[dbit], %%d0 \n"
132 ".word 0x51fa \n"
133 "1: \n" 146 "1: \n"
134 "eor.l %[cbit], (%[gpo0]) \n" 147 "move.l %%d1, (%[gpo0]) \n"
135 "eor.l %[cbit], (%[gpo0]) \n" 148 "move.l %%d0, %%d1 \n"
149 "move.l %%d0, (%[gpo0]) \n"
150 "eor.l %[cbit], %%d1 \n"
151 "nop \n"
136 152
137 "lsl.l #1,%[data] \n" 153 "lsl.l #1,%[data] \n" /* ..unrolled.. */
138 "bcc.s 1f \n" 154 "bcc.s 1f \n"
139 "eor.l %%d1, (%[gpo0]) \n" 155 "eor.l %[dbit], %%d0 \n"
140 ".word 0x51fa \n"
141 "1: \n" 156 "1: \n"
142 "eor.l %[cbit], (%[gpo0]) \n" 157 "move.l %%d1, (%[gpo0]) \n"
143 "eor.l %[cbit], (%[gpo0]) \n" 158 "move.l %%d0, %%d1 \n"
159 "move.l %%d0, (%[gpo0]) \n"
160 "eor.l %[cbit], %%d1 \n"
161 "nop \n"
162
163 "nop \n"
164 "move.l %%d1, (%[gpo0]) \n" /* set CLK = 1 (delayed) */
165
166 "move.w %%d2, %%sr \n" /* Restore interrupt level */
144 : /* outputs */ 167 : /* outputs */
145 [data]"+d"(data) 168 [data]"+d"(data)
146 : /* inputs */ 169 : /* inputs */
@@ -148,7 +171,7 @@ static inline void _write_byte(unsigned data)
148 [cbit]"d"(0x00004000), 171 [cbit]"d"(0x00004000),
149 [dbit]"d"(0x00002000) 172 [dbit]"d"(0x00002000)
150 : /* clobbers */ 173 : /* clobbers */
151 "d0", "d1" 174 "d0", "d1", "d2"
152 ); 175 );
153} 176}
154 177
@@ -157,7 +180,7 @@ static inline void _write_byte(unsigned data)
157static inline void _write_fast(unsigned data) 180static inline void _write_fast(unsigned data)
158{ 181{
159 asm volatile ( 182 asm volatile (
160 "move.w %%sr,%%d3 \n" /* Get current interrupt level */ 183 "move.w %%sr,%%d2 \n" /* Get current interrupt level */
161 "move.w #0x2700,%%sr \n" /* Disable interrupts */ 184 "move.w #0x2700,%%sr \n" /* Disable interrupts */
162 185
163 "move.l (%[gpo0]), %%d0 \n" /* Get current state of data port */ 186 "move.l (%[gpo0]), %%d0 \n" /* Get current state of data port */
@@ -239,7 +262,7 @@ static inline void _write_fast(unsigned data)
239 "move.l %%d1, (%[gpo0]) \n" 262 "move.l %%d1, (%[gpo0]) \n"
240 "move.l %%d0, (%[gpo0]) \n" 263 "move.l %%d0, (%[gpo0]) \n"
241 264
242 "move.w %%d3, %%sr \n" /* Restore interrupt level */ 265 "move.w %%d2, %%sr \n" /* Restore interrupt level */
243 : /* outputs */ 266 : /* outputs */
244 [data]"+d"(data) 267 [data]"+d"(data)
245 : /* inputs */ 268 : /* inputs */
@@ -247,7 +270,7 @@ static inline void _write_fast(unsigned data)
247 [cbit]"d"(0x00004000), 270 [cbit]"d"(0x00004000),
248 [dbit]"d"(0x00002000) 271 [dbit]"d"(0x00002000)
249 : /* clobbers */ 272 : /* clobbers */
250 "d0", "d1", "d2", "d3" 273 "d0", "d1", "d2"
251 ); 274 );
252} 275}
253 276
diff --git a/firmware/target/coldfire/iaudio/m3/button-m3.c b/firmware/target/coldfire/iaudio/m3/button-m3.c
index ecea221a4c..f5d4b59363 100644
--- a/firmware/target/coldfire/iaudio/m3/button-m3.c
+++ b/firmware/target/coldfire/iaudio/m3/button-m3.c
@@ -116,7 +116,7 @@ int button_read_device(void)
116 else 116 else
117 btn |= BUTTON_RC_VOL_DOWN; 117 btn |= BUTTON_RC_VOL_DOWN;
118 } 118 }
119 if ((GPIO_READ & 0x80000000) == 0) 119 if ((GPIO_READ & 0x80000000) == 0)
120 btn |= BUTTON_RC_PLAY; 120 btn |= BUTTON_RC_PLAY;
121 } 121 }
122 122
diff --git a/firmware/target/coldfire/iaudio/m3/lcd-m3.c b/firmware/target/coldfire/iaudio/m3/lcd-m3.c
index ae72832a82..4bc22380f5 100644
--- a/firmware/target/coldfire/iaudio/m3/lcd-m3.c
+++ b/firmware/target/coldfire/iaudio/m3/lcd-m3.c
@@ -61,263 +61,6 @@ static int cached_contrast = DEFAULT_CONTRAST_SETTING;
61bool initialized = false; 61bool initialized = false;
62 62
63 63
64/* Standard low-level byte writer. Requires CLK high on entry */
65static inline void _write_byte(unsigned data)
66{
67 asm volatile (
68 "move.l (%[gpo0]), %%d0 \n" /* Get current state of data line */
69 "and.l %[dbit], %%d0 \n"
70 "beq.s 1f \n" /* and set it as previous-state bit */
71 "bset #8, %[data] \n"
72 "1: \n"
73 "move.l %[data], %%d0 \n" /* Compute the 'bit derivative', i.e. a value */
74 "lsr.l #1, %%d0 \n" /* with 1's where the data changes from the */
75 "eor.l %%d0, %[data] \n" /* previous state, and 0's where it doesn't */
76 "swap %[data] \n" /* Shift data to upper byte */
77 "lsl.l #8, %[data] \n"
78
79 "move.l %[cbit], %%d1 \n" /* Prepare mask for flipping CLK */
80 "or.l %[dbit], %%d1 \n" /* and DATA at once */
81
82 "lsl.l #1,%[data] \n" /* Shift out MSB */
83 "bcc.s 1f \n"
84 "eor.l %%d1, (%[gpo0]) \n" /* 1: Flip both CLK and DATA */
85 ".word 0x51fa \n" /* (trapf.w - shadow next insn) */
86 "1: \n"
87 "eor.l %[cbit], (%[gpo0]) \n" /* else flip CLK only */
88 "eor.l %[cbit], (%[gpo0]) \n" /* Flip CLK again */
89
90 "lsl.l #1,%[data] \n" /* ..unrolled.. */
91 "bcc.s 1f \n"
92 "eor.l %%d1, (%[gpo0]) \n"
93 ".word 0x51fa \n"
94 "1: \n"
95 "eor.l %[cbit], (%[gpo0]) \n"
96 "eor.l %[cbit], (%[gpo0]) \n"
97
98 "lsl.l #1,%[data] \n"
99 "bcc.s 1f \n"
100 "eor.l %%d1, (%[gpo0]) \n"
101 ".word 0x51fa \n"
102 "1: \n"
103 "eor.l %[cbit], (%[gpo0]) \n"
104 "eor.l %[cbit], (%[gpo0]) \n"
105
106 "lsl.l #1,%[data] \n"
107 "bcc.s 1f \n"
108 "eor.l %%d1, (%[gpo0]) \n"
109 ".word 0x51fa \n"
110 "1: \n"
111 "eor.l %[cbit], (%[gpo0]) \n"
112 "eor.l %[cbit], (%[gpo0]) \n"
113
114 "lsl.l #1,%[data] \n"
115 "bcc.s 1f \n"
116 "eor.l %%d1, (%[gpo0]) \n"
117 ".word 0x51fa \n"
118 "1: \n"
119 "eor.l %[cbit], (%[gpo0]) \n"
120 "eor.l %[cbit], (%[gpo0]) \n"
121
122 "lsl.l #1,%[data] \n"
123 "bcc.s 1f \n"
124 "eor.l %%d1, (%[gpo0]) \n"
125 ".word 0x51fa \n"
126 "1: \n"
127 "eor.l %[cbit], (%[gpo0]) \n"
128 "eor.l %[cbit], (%[gpo0]) \n"
129
130 "lsl.l #1,%[data] \n"
131 "bcc.s 1f \n"
132 "eor.l %%d1, (%[gpo0]) \n"
133 ".word 0x51fa \n"
134 "1: \n"
135 "eor.l %[cbit], (%[gpo0]) \n"
136 "eor.l %[cbit], (%[gpo0]) \n"
137
138 "lsl.l #1,%[data] \n"
139 "bcc.s 1f \n"
140 "eor.l %%d1, (%[gpo0]) \n"
141 ".word 0x51fa \n"
142 "1: \n"
143 "eor.l %[cbit], (%[gpo0]) \n"
144 "eor.l %[cbit], (%[gpo0]) \n"
145 : /* outputs */
146 [data]"+d"(data)
147 : /* inputs */
148 [gpo0]"a"(&GPIO_OUT),
149 [cbit]"d"(0x20000000),
150 [dbit]"d"(0x04000000)
151 : /* clobbers */
152 "d0", "d1"
153 );
154}
155
156/* Fast low-level byte writer. Don't use with high CPU clock.
157 * Requires CLK high on entry */
158static inline void _write_fast(unsigned data)
159{
160 asm volatile (
161 "move.w %%sr,%%d3 \n" /* Get current interrupt level */
162 "move.w #0x2700,%%sr \n" /* Disable interrupts */
163
164 "move.l (%[gpo0]), %%d0 \n" /* Get current state of data port */
165 "move.l %%d0, %%d1 \n"
166 "and.l %[dbit], %%d1 \n" /* Check current state of data line */
167 "beq.s 1f \n" /* and set it as previous-state bit */
168 "bset #8, %[data] \n"
169 "1: \n"
170 "move.l %[data], %%d1 \n" /* Compute the 'bit derivative', i.e. a value */
171 "lsr.l #1, %%d1 \n" /* with 1's where the data changes from the */
172 "eor.l %%d1, %[data] \n" /* previous state, and 0's where it doesn't */
173 "swap %[data] \n" /* Shift data to upper byte */
174 "lsl.l #8, %[data] \n"
175
176 "move.l %%d0, %%d1 \n" /* precalculate opposite state of clock line */
177 "eor.l %[cbit], %%d1 \n"
178
179 "lsl.l #1,%[data] \n" /* Shift out MSB */
180 "bcc.s 1f \n"
181 "eor.l %[dbit], %%d0 \n" /* 1: Flip data bit */
182 "eor.l %[dbit], %%d1 \n" /* for both clock states */
183 "1: \n"
184 "move.l %%d1, (%[gpo0]) \n" /* Output new state and set CLK */
185 "move.l %%d0, (%[gpo0]) \n" /* reset CLK */
186
187 "lsl.l #1,%[data] \n" /* ..unrolled.. */
188 "bcc.s 1f \n"
189 "eor.l %[dbit], %%d0 \n"
190 "eor.l %[dbit], %%d1 \n"
191 "1: \n"
192 "move.l %%d1, (%[gpo0]) \n"
193 "move.l %%d0, (%[gpo0]) \n"
194
195 "lsl.l #1,%[data] \n"
196 "bcc.s 1f \n"
197 "eor.l %[dbit], %%d0 \n"
198 "eor.l %[dbit], %%d1 \n"
199 "1: \n"
200 "move.l %%d1, (%[gpo0]) \n"
201 "move.l %%d0, (%[gpo0]) \n"
202
203 "lsl.l #1,%[data] \n"
204 "bcc.s 1f \n"
205 "eor.l %[dbit], %%d0 \n"
206 "eor.l %[dbit], %%d1 \n"
207 "1: \n"
208 "move.l %%d1, (%[gpo0]) \n"
209 "move.l %%d0, (%[gpo0]) \n"
210
211 "lsl.l #1,%[data] \n"
212 "bcc.s 1f \n"
213 "eor.l %[dbit], %%d0 \n"
214 "eor.l %[dbit], %%d1 \n"
215 "1: \n"
216 "move.l %%d1, (%[gpo0]) \n"
217 "move.l %%d0, (%[gpo0]) \n"
218
219 "lsl.l #1,%[data] \n"
220 "bcc.s 1f \n"
221 "eor.l %[dbit], %%d0 \n"
222 "eor.l %[dbit], %%d1 \n"
223 "1: \n"
224 "move.l %%d1, (%[gpo0]) \n"
225 "move.l %%d0, (%[gpo0]) \n"
226
227 "lsl.l #1,%[data] \n"
228 "bcc.s 1f \n"
229 "eor.l %[dbit], %%d0 \n"
230 "eor.l %[dbit], %%d1 \n"
231 "1: \n"
232 "move.l %%d1, (%[gpo0]) \n"
233 "move.l %%d0, (%[gpo0]) \n"
234
235 "lsl.l #1,%[data] \n"
236 "bcc.s 1f \n"
237 "eor.l %[dbit], %%d0 \n"
238 "eor.l %[dbit], %%d1 \n"
239 "1: \n"
240 "move.l %%d1, (%[gpo0]) \n"
241 "move.l %%d0, (%[gpo0]) \n"
242
243 "move.w %%d3, %%sr \n" /* Restore interrupt level */
244 : /* outputs */
245 [data]"+d"(data)
246 : /* inputs */
247 [gpo0]"a"(&GPIO_OUT),
248 [cbit]"d"(0x20000000),
249 [dbit]"d"(0x04000000)
250 : /* clobbers */
251 "d0", "d1", "d2", "d3"
252 );
253}
254
255void lcd_write_command(int cmd)
256{
257 RS_LO;
258 CS_LO;
259 _write_byte(cmd);
260 CS_HI;
261}
262
263void lcd_write_command_e(int cmd, int data)
264{
265 RS_LO;
266 CS_LO;
267 _write_byte(cmd);
268 _write_byte(data);
269 CS_HI;
270}
271
272void lcd_write_data(const fb_data *p_words, int count)
273{
274 const unsigned char *p_bytes = (const unsigned char *)p_words;
275 const unsigned char *p_end = (const unsigned char *)(p_words + count);
276
277 RS_HI;
278 CS_LO;
279 if (cpu_frequency < 50000000)
280 {
281 while (p_bytes < p_end)
282 _write_fast(*p_bytes++);
283 }
284 else
285 {
286 while (p_bytes < p_end)
287 _write_byte(*p_bytes++);
288 }
289 CS_HI;
290}
291
292static void lcd_mono_data(const unsigned char *p_words, int count)
293{
294 unsigned data;
295 const unsigned char *p_bytes = p_words;
296 const unsigned char *p_end = p_words + count;
297
298 RS_HI;
299 CS_LO;
300 if (cpu_frequency < 50000000)
301 {
302 while (p_bytes < p_end)
303 {
304 data = *p_bytes++;
305 _write_fast(data);
306 _write_fast(data);
307 }
308 }
309 else
310 {
311 while (p_bytes < p_end)
312 {
313 data = *p_bytes++;
314 _write_byte(data);
315 _write_byte(data);
316 }
317 }
318 CS_HI;
319}
320
321int lcd_default_contrast(void) 64int lcd_default_contrast(void)
322{ 65{
323 return DEFAULT_CONTRAST_SETTING; 66 return DEFAULT_CONTRAST_SETTING;
@@ -457,6 +200,9 @@ void lcd_init_device(void)
457#endif 200#endif
458} 201}
459 202
203/* Helper function. */
204void lcd_mono_data(const unsigned char *data, int count);
205
460/* Performance function that works with an external buffer 206/* Performance function that works with an external buffer
461 note that by and bheight are in 8-pixel units! */ 207 note that by and bheight are in 8-pixel units! */
462void lcd_blit_mono(const unsigned char *data, int x, int by, int width, 208void lcd_blit_mono(const unsigned char *data, int x, int by, int width,
@@ -477,20 +223,28 @@ void lcd_blit_mono(const unsigned char *data, int x, int by, int width,
477 } 223 }
478} 224}
479 225
480/* TODO: implement grey blit function */ 226/* Helper function for lcd_grey_phase_blit(). */
227void lcd_grey_data(unsigned char *values, unsigned char *phases, int count);
481 228
482/* Performance function that works with an external buffer 229/* Performance function that works with an external buffer
483 note that by and bheight are in 8-pixel units! */ 230 note that by and bheight are in 8-pixel units! */
484void lcd_blit_grey_phase(unsigned char *values, unsigned char *phases, 231void lcd_blit_grey_phase(unsigned char *values, unsigned char *phases,
485 int x, int by, int width, int bheight, int stride) 232 int x, int by, int width, int bheight, int stride)
486{ 233{
487 (void)values; 234 if (initialized)
488 (void)phases; 235 {
489 (void)x; 236 stride <<= 3; /* 8 pixels per block */
490 (void)by; 237 while (bheight--)
491 (void)width; 238 {
492 (void)bheight; 239 lcd_write_command(LCD_SET_PAGE | ((by > 5 ? by + 2 : by) & 0xf));
493 (void)stride; 240 lcd_write_command_e(LCD_SET_COLUMN | ((x >> 4) & 0xf), x & 0xf);
241
242 lcd_grey_data(values, phases, width);
243 values += stride;
244 phases += stride;
245 by++;
246 }
247 }
494} 248}
495 249
496/* Update the display. 250/* Update the display.
@@ -501,12 +255,13 @@ void lcd_update(void)
501 int y; 255 int y;
502 if (initialized) 256 if (initialized)
503 { 257 {
504 for(y = 0;y < LCD_FBHEIGHT;y++) { 258 for(y = 0;y < LCD_FBHEIGHT;y++)
259 {
505 /* Copy display bitmap to hardware. 260 /* Copy display bitmap to hardware.
506 The COM48-COM63 lines are not connected so we have to skip 261 The COM48-COM63 lines are not connected so we have to skip
507 them. Further, the column address doesn't wrap, so we 262 them. Further, the column address doesn't wrap, so we
508 have to update one page at a time. */ 263 have to update one page at a time. */
509 lcd_write_command(LCD_SET_PAGE | (y>5?y+2:y)); 264 lcd_write_command(LCD_SET_PAGE | (y > 5 ? y + 2 : y));
510 lcd_write_command_e(LCD_SET_COLUMN | 0, 0); 265 lcd_write_command_e(LCD_SET_COLUMN | 0, 0);
511 lcd_write_data(lcd_framebuffer[y], LCD_WIDTH); 266 lcd_write_data(lcd_framebuffer[y], LCD_WIDTH);
512 } 267 }
@@ -536,7 +291,7 @@ void lcd_update_rect(int x, int y, int width, int height)
536 COM48-COM63 are not connected, so we need to skip those */ 291 COM48-COM63 are not connected, so we need to skip those */
537 for (; y <= ymax; y++) 292 for (; y <= ymax; y++)
538 { 293 {
539 lcd_write_command(LCD_SET_PAGE | ((y > 5?y + 2:y) & 0xf)); 294 lcd_write_command(LCD_SET_PAGE | ((y > 5 ? y + 2 : y) & 0xf));
540 lcd_write_command_e(LCD_SET_COLUMN | ((x >> 4) & 0xf), x & 0xf); 295 lcd_write_command_e(LCD_SET_COLUMN | ((x >> 4) & 0xf), x & 0xf);
541 296
542 lcd_write_data(&lcd_framebuffer[y][x], width); 297 lcd_write_data(&lcd_framebuffer[y][x], width);
@@ -547,19 +302,23 @@ void lcd_update_rect(int x, int y, int width, int height)
547void lcd_set_invert_display(bool yesno) 302void lcd_set_invert_display(bool yesno)
548{ 303{
549 cached_invert = yesno; 304 cached_invert = yesno;
550 if(initialized) 305 if (initialized)
551 lcd_write_command(LCD_REVERSE | yesno); 306 lcd_write_command(LCD_REVERSE | yesno);
552} 307}
553 308
554void lcd_set_flip(bool yesno) 309void lcd_set_flip(bool yesno)
555{ 310{
556 cached_flip = yesno; 311 cached_flip = yesno;
557 if(initialized) { 312 if (initialized)
558 if(yesno) { 313 {
314 if(yesno)
315 {
559 lcd_write_command(LCD_SELECT_ADC | 0); 316 lcd_write_command(LCD_SELECT_ADC | 0);
560 lcd_write_command(LCD_SELECT_SHL | 0); 317 lcd_write_command(LCD_SELECT_SHL | 0);
561 lcd_write_command_e(LCD_SET_COM0, 16); 318 lcd_write_command_e(LCD_SET_COM0, 16);
562 } else { 319 }
320 else
321 {
563 lcd_write_command(LCD_SELECT_ADC | 1); 322 lcd_write_command(LCD_SELECT_ADC | 1);
564 lcd_write_command(LCD_SELECT_SHL | 8); 323 lcd_write_command(LCD_SELECT_SHL | 8);
565 lcd_write_command_e(LCD_SET_COM0, 0); 324 lcd_write_command_e(LCD_SET_COM0, 0);
diff --git a/wps/cabbiev2/wpsbackdrop-240x320x16.bmp b/wps/cabbiev2/wpsbackdrop-240x320x16.bmp
index a9ece0259b..f57065124b 100644
--- a/wps/cabbiev2/wpsbackdrop-240x320x16.bmp
+++ b/wps/cabbiev2/wpsbackdrop-240x320x16.bmp
Binary files differ