1 /***************************************************************************
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
10 * Copyright (C) 2005 Michiel van der Kolk, Jens Arnold
12 * All files in this archive are subject to the GNU General Public License.
13 * See the file COPYING in the source tree root for full license agreement.
15 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
16 * KIND, either express or implied.
18 ****************************************************************************/
20 #include "rockmacros.h"
27 #if CONFIG_KEYPAD == SANSA_E200_PAD
28 #define ROCKBOY_SCROLLWHEEL
29 #define ROCKBOY_SCROLLWHEEL_CC BUTTON_SCROLL_BACK
30 #define ROCKBOY_SCROLLWHEEL_CW BUTTON_SCROLL_FWD
33 struct fb fb IBSS_ATTR
;
35 extern int debug_trace
;
37 unsigned int oldbuttonstate
= 0, newbuttonstate
,holdbutton
;
38 #ifdef HAVE_WHEEL_POSITION
39 int oldwheel
= -1, wheel
;
41 static int wheelmap
[8] = {
43 PAD_A
, /* Top-right */
44 PAD_RIGHT
, /* Right */
45 PAD_START
, /* Bottom-right */
46 PAD_DOWN
, /* Bottom */
47 PAD_SELECT
, /* Bottom-left */
53 int released
, pressed
;
56 #ifdef ROCKBOY_SCROLLWHEEL
57 /* Scrollwheel events are posted directly and not polled by the button
58 driver - synthesize polling */
59 static inline unsigned int read_scroll_wheel(void)
61 unsigned int buttons
= BUTTON_NONE
;
64 /* Empty out the button queue and see if any scrollwheel events were
68 btn
= rb
->button_get_w_tmo(0);
71 while (btn
!= BUTTON_NONE
);
73 return buttons
& (ROCKBOY_SCROLLWHEEL_CC
| ROCKBOY_SCROLLWHEEL_CW
);
80 newbuttonstate
= rb
->button_status();
81 #ifdef ROCKBOY_SCROLLWHEEL
82 newbuttonstate
|= read_scroll_wheel();
84 released
= ~newbuttonstate
& oldbuttonstate
;
85 pressed
= newbuttonstate
& ~oldbuttonstate
;
86 oldbuttonstate
= newbuttonstate
;
87 #if (LCD_WIDTH == 160) && (LCD_HEIGHT == 128) && (LCD_DEPTH == 2)
88 if (rb
->button_hold()&~holdbutton
)
89 fb
.mode
=(fb
.mode
+1)%4;
90 holdbutton
=rb
->button_hold();
91 #elif CONFIG_KEYPAD == RECORDER_PAD
92 if (pressed
& BUTTON_ON
)
93 fb
.mode
=(fb
.mode
+1)%4;
96 #ifdef HAVE_WHEEL_POSITION
97 /* Get the current wheel position - 0..95 or -1 for untouched */
98 wheel
= rb
->wheel_status();
100 /* Convert to number from 0 to 7 - clockwise from top */
104 if ( wheel
> 7 ) wheel
= 0;
107 if ( wheel
!= oldwheel
) {
109 ev
.type
= EV_RELEASE
;
110 ev
.code
= wheelmap
[oldwheel
];
116 ev
.code
= wheelmap
[wheel
];
123 ev
.type
= EV_RELEASE
;
124 if ( released
& (~BUTTON_SELECT
) ) { ev
.code
=PAD_B
; ev_postevent(&ev
); }
125 if ( released
& BUTTON_SELECT
) { ev
.code
=PAD_A
; ev_postevent(&ev
); }
127 if(pressed
) { /* button press */
129 if ( pressed
& (~BUTTON_SELECT
) ) { ev
.code
=PAD_B
; ev_postevent(&ev
); }
130 if ( pressed
& BUTTON_SELECT
) { ev
.code
=PAD_A
; ev_postevent(&ev
); }
134 ev
.type
= EV_RELEASE
;
135 if(released
& options
.LEFT
) { ev
.code
=PAD_LEFT
; ev_postevent(&ev
); }
136 if(released
& options
.RIGHT
) {ev
.code
=PAD_RIGHT
; ev_postevent(&ev
);}
137 if(released
& options
.DOWN
) { ev
.code
=PAD_DOWN
; ev_postevent(&ev
); }
138 if(released
& options
.UP
) { ev
.code
=PAD_UP
; ev_postevent(&ev
); }
139 if(released
& options
.A
) { ev
.code
=PAD_A
; ev_postevent(&ev
); }
140 if(released
& options
.B
) { ev
.code
=PAD_B
; ev_postevent(&ev
); }
141 if(released
& options
.START
) {
145 if(released
& options
.SELECT
) {
150 if(pressed
) { /* button press */
152 if(pressed
& options
.LEFT
) { ev
.code
=PAD_LEFT
; ev_postevent(&ev
); }
153 if(pressed
& options
.RIGHT
) { ev
.code
=PAD_RIGHT
; ev_postevent(&ev
);}
154 if(pressed
& options
.DOWN
) { ev
.code
=PAD_DOWN
; ev_postevent(&ev
); }
155 if(pressed
& options
.UP
) { ev
.code
=PAD_UP
; ev_postevent(&ev
); }
156 if(pressed
& options
.A
) { ev
.code
=PAD_A
; ev_postevent(&ev
); }
157 if(pressed
& options
.B
) { ev
.code
=PAD_B
; ev_postevent(&ev
); }
158 if(pressed
& options
.START
) {
162 if(pressed
& options
.SELECT
) {
167 #if CONFIG_KEYPAD == IPOD_4G_PAD
168 if(rb
->button_hold()) {
170 if(pressed
& options
.MENU
) {
172 #if (CONFIG_KEYPAD != RECORDER_PAD)
173 #ifdef HAVE_WHEEL_POSITION
174 rb
->wheel_send_events(true);
176 if (do_user_menu() == USER_MENU_QUIT
)
182 #ifdef HAVE_WHEEL_POSITION
183 rb
->wheel_send_events(false);
187 #ifndef HAVE_WHEEL_POSITION
192 /* New frameskip, makes more sense to me and performs as well */
193 inline void vid_begin(void)
196 if (skip
<options
.frameskip
)
212 #if defined(HAVE_LCD_COLOR)
213 fb
.cc
[0].r
= 3; /* 8-5 (wasted bits on red) */
214 fb
.cc
[0].l
= 11; /* this is the offset to the R bits (16-5) */
215 fb
.cc
[1].r
= 2; /* 8-6 (wasted bits on green) */
216 fb
.cc
[1].l
= 5; /* This is the offset to the G bits (16-5-6) */
217 fb
.cc
[2].r
= 3; /* 8-5 (wasted bits on red) */
218 fb
.cc
[2].l
= 0; /* This is the offset to the B bits (16-5-6-5) */
224 #if !defined(HAVE_LCD_COLOR)
225 /* Color targets are handled in lcd.c */
227 void vid_update(int scanline
)
230 int scanline_remapped
;
231 #if (LCD_HEIGHT == 64) && (LCD_DEPTH == 1) /* Archos */
237 scanline_remapped
= scanline
/ 16;
238 frameb
= rb
->lcd_framebuffer
+ scanline_remapped
* LCD_WIDTH
;
240 balance
+= LCD_WIDTH
;
243 #if (CONFIG_CPU == SH7034) && !defined(SIMULATOR)
247 "tst #0x02, r0 \n" /* ~bit 1 */
251 "tst #0x02, r0 \n" /* ~bit 1 */
255 "tst #0x02, r0 \n" /* ~bit 1 */
259 "tst #0x02, r0 \n" /* ~bit 1 */
263 "tst #0x02, r0 \n" /* ~bit 1 */
267 "tst #0x02, r0 \n" /* ~bit 1 */
271 "tst #0x02, r0 \n" /* ~bit 1 */
275 "tst #0x02, r0 \n" /* ~bit 1 */
280 "not r1,r1 \n" /* account for negated bits */
284 /* %0 */ "r"(scan
.buf
[0] + cnt
),
285 /* %1 */ "r"(256), /* scan.buf line length */
286 /* %2 */ "r"(frameb
++)
291 register unsigned scrbyte
= 0;
292 if (scan
.buf
[0][cnt
] & 0x02) scrbyte
|= 0x01;
293 if (scan
.buf
[1][cnt
] & 0x02) scrbyte
|= 0x02;
294 if (scan
.buf
[2][cnt
] & 0x02) scrbyte
|= 0x04;
295 if (scan
.buf
[3][cnt
] & 0x02) scrbyte
|= 0x08;
296 if (scan
.buf
[4][cnt
] & 0x02) scrbyte
|= 0x10;
297 if (scan
.buf
[5][cnt
] & 0x02) scrbyte
|= 0x20;
298 if (scan
.buf
[6][cnt
] & 0x02) scrbyte
|= 0x40;
299 if (scan
.buf
[7][cnt
] & 0x02) scrbyte
|= 0x80;
300 *(frameb
++) = scrbyte
;
306 rb
->lcd_update_rect(0, (scanline
/2) & ~7, LCD_WIDTH
, 8);
307 #elif (LCD_HEIGHT == 128) && (LCD_DEPTH == 2) /* iriver H1x0 */
312 scanline_remapped
= scanline
/ 4;
313 frameb
= rb
->lcd_framebuffer
+ scanline_remapped
* LCD_WIDTH
;
315 *(frameb
++) = (scan
.buf
[0][cnt
]&0x3) |
316 ((scan
.buf
[1][cnt
]&0x3)<<2) |
317 ((scan
.buf
[2][cnt
]&0x3)<<4) |
318 ((scan
.buf
[3][cnt
]&0x3)<<6);
321 rb
->lcd_update_rect(0, scanline
& ~3, LCD_WIDTH
, 4);
322 #elif defined(HAVE_LCD_COLOR)
323 /* handled in lcd.c now */
324 #endif /* LCD_HEIGHT */