1 /***************************************************************************
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
10 * Copyright (C) 2005 Michiel van der Kolk, Jens Arnold
12 * This program is free software; you can redistribute it and/or
13 * modify it under the terms of the GNU General Public License
14 * as published by the Free Software Foundation; either version 2
15 * of the License, or (at your option) any later version.
17 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
18 * KIND, either express or implied.
20 ****************************************************************************/
22 #include "rockmacros.h"
29 #if CONFIG_KEYPAD == SANSA_E200_PAD
30 #define ROCKBOY_SCROLLWHEEL
31 #define ROCKBOY_SCROLLWHEEL_CC BUTTON_SCROLL_BACK
32 #define ROCKBOY_SCROLLWHEEL_CW BUTTON_SCROLL_FWD
35 struct fb fb IBSS_ATTR
;
37 extern int debug_trace
;
39 unsigned int oldbuttonstate
= 0, newbuttonstate
,holdbutton
;
40 #ifdef HAVE_WHEEL_POSITION
41 int oldwheel
= -1, wheel
;
43 static int wheelmap
[8] = {
45 PAD_A
, /* Top-right */
46 PAD_RIGHT
, /* Right */
47 PAD_START
, /* Bottom-right */
48 PAD_DOWN
, /* Bottom */
49 PAD_SELECT
, /* Bottom-left */
55 int released
, pressed
;
58 #ifdef ROCKBOY_SCROLLWHEEL
59 /* Scrollwheel events are posted directly and not polled by the button
60 driver - synthesize polling */
61 static inline unsigned int read_scroll_wheel(void)
63 unsigned int buttons
= BUTTON_NONE
;
66 /* Empty out the button queue and see if any scrollwheel events were
70 btn
= rb
->button_get_w_tmo(0);
73 while (btn
!= BUTTON_NONE
);
75 return buttons
& (ROCKBOY_SCROLLWHEEL_CC
| ROCKBOY_SCROLLWHEEL_CW
);
82 newbuttonstate
= rb
->button_status();
83 #ifdef ROCKBOY_SCROLLWHEEL
84 newbuttonstate
|= read_scroll_wheel();
86 released
= ~newbuttonstate
& oldbuttonstate
;
87 pressed
= newbuttonstate
& ~oldbuttonstate
;
88 oldbuttonstate
= newbuttonstate
;
89 #if (LCD_WIDTH == 160) && (LCD_HEIGHT == 128) && (LCD_DEPTH == 2)
90 if (rb
->button_hold()&~holdbutton
)
91 fb
.mode
=(fb
.mode
+1)%4;
92 holdbutton
=rb
->button_hold();
93 #elif CONFIG_KEYPAD == RECORDER_PAD
94 if (pressed
& BUTTON_ON
)
95 fb
.mode
=(fb
.mode
+1)%4;
98 #ifdef HAVE_WHEEL_POSITION
99 /* Get the current wheel position - 0..95 or -1 for untouched */
100 wheel
= rb
->wheel_status();
102 /* Convert to number from 0 to 7 - clockwise from top */
106 if ( wheel
> 7 ) wheel
= 0;
109 if ( wheel
!= oldwheel
) {
111 ev
.type
= EV_RELEASE
;
112 ev
.code
= wheelmap
[oldwheel
];
118 ev
.code
= wheelmap
[wheel
];
125 ev
.type
= EV_RELEASE
;
126 if ( released
& (~BUTTON_SELECT
) ) { ev
.code
=PAD_B
; ev_postevent(&ev
); }
127 if ( released
& BUTTON_SELECT
) { ev
.code
=PAD_A
; ev_postevent(&ev
); }
129 if(pressed
) { /* button press */
131 if ( pressed
& (~BUTTON_SELECT
) ) { ev
.code
=PAD_B
; ev_postevent(&ev
); }
132 if ( pressed
& BUTTON_SELECT
) { ev
.code
=PAD_A
; ev_postevent(&ev
); }
136 ev
.type
= EV_RELEASE
;
137 if(released
& options
.LEFT
) { ev
.code
=PAD_LEFT
; ev_postevent(&ev
); }
138 if(released
& options
.RIGHT
) {ev
.code
=PAD_RIGHT
; ev_postevent(&ev
);}
139 if(released
& options
.DOWN
) { ev
.code
=PAD_DOWN
; ev_postevent(&ev
); }
140 if(released
& options
.UP
) { ev
.code
=PAD_UP
; ev_postevent(&ev
); }
141 if(released
& options
.A
) { ev
.code
=PAD_A
; ev_postevent(&ev
); }
142 if(released
& options
.B
) { ev
.code
=PAD_B
; ev_postevent(&ev
); }
143 if(released
& options
.START
) {
147 if(released
& options
.SELECT
) {
152 if(pressed
) { /* button press */
154 if(pressed
& options
.LEFT
) { ev
.code
=PAD_LEFT
; ev_postevent(&ev
); }
155 if(pressed
& options
.RIGHT
) { ev
.code
=PAD_RIGHT
; ev_postevent(&ev
);}
156 if(pressed
& options
.DOWN
) { ev
.code
=PAD_DOWN
; ev_postevent(&ev
); }
157 if(pressed
& options
.UP
) { ev
.code
=PAD_UP
; ev_postevent(&ev
); }
158 if(pressed
& options
.A
) { ev
.code
=PAD_A
; ev_postevent(&ev
); }
159 if(pressed
& options
.B
) { ev
.code
=PAD_B
; ev_postevent(&ev
); }
160 if(pressed
& options
.START
) {
164 if(pressed
& options
.SELECT
) {
169 #if CONFIG_KEYPAD == IPOD_4G_PAD
170 if(rb
->button_hold()) {
172 if(pressed
& options
.MENU
) {
174 #if (CONFIG_KEYPAD != RECORDER_PAD)
175 #ifdef HAVE_WHEEL_POSITION
176 rb
->wheel_send_events(true);
178 if (do_user_menu() == USER_MENU_QUIT
)
184 #ifdef HAVE_WHEEL_POSITION
185 rb
->wheel_send_events(false);
189 #ifndef HAVE_WHEEL_POSITION
194 /* New frameskip, makes more sense to me and performs as well */
195 inline void vid_begin(void)
198 if (skip
<options
.frameskip
)
214 #if defined(HAVE_LCD_COLOR)
215 fb
.cc
[0].r
= 3; /* 8-5 (wasted bits on red) */
216 fb
.cc
[0].l
= 11; /* this is the offset to the R bits (16-5) */
217 fb
.cc
[1].r
= 2; /* 8-6 (wasted bits on green) */
218 fb
.cc
[1].l
= 5; /* This is the offset to the G bits (16-5-6) */
219 fb
.cc
[2].r
= 3; /* 8-5 (wasted bits on red) */
220 fb
.cc
[2].l
= 0; /* This is the offset to the B bits (16-5-6-5) */
226 #if !defined(HAVE_LCD_COLOR)
227 /* Color targets are handled in lcd.c */
229 void vid_update(int scanline
)
232 int scanline_remapped
;
233 #if (LCD_HEIGHT == 64) && (LCD_DEPTH == 1) /* Archos */
239 scanline_remapped
= scanline
/ 16;
240 frameb
= rb
->lcd_framebuffer
+ scanline_remapped
* LCD_WIDTH
;
242 balance
+= LCD_WIDTH
;
245 #if (CONFIG_CPU == SH7034) && !defined(SIMULATOR)
249 "tst #0x02, r0 \n" /* ~bit 1 */
253 "tst #0x02, r0 \n" /* ~bit 1 */
257 "tst #0x02, r0 \n" /* ~bit 1 */
261 "tst #0x02, r0 \n" /* ~bit 1 */
265 "tst #0x02, r0 \n" /* ~bit 1 */
269 "tst #0x02, r0 \n" /* ~bit 1 */
273 "tst #0x02, r0 \n" /* ~bit 1 */
277 "tst #0x02, r0 \n" /* ~bit 1 */
282 "not r1,r1 \n" /* account for negated bits */
286 /* %0 */ "r"(scan
.buf
[0] + cnt
),
287 /* %1 */ "r"(256), /* scan.buf line length */
288 /* %2 */ "r"(frameb
++)
293 register unsigned scrbyte
= 0;
294 if (scan
.buf
[0][cnt
] & 0x02) scrbyte
|= 0x01;
295 if (scan
.buf
[1][cnt
] & 0x02) scrbyte
|= 0x02;
296 if (scan
.buf
[2][cnt
] & 0x02) scrbyte
|= 0x04;
297 if (scan
.buf
[3][cnt
] & 0x02) scrbyte
|= 0x08;
298 if (scan
.buf
[4][cnt
] & 0x02) scrbyte
|= 0x10;
299 if (scan
.buf
[5][cnt
] & 0x02) scrbyte
|= 0x20;
300 if (scan
.buf
[6][cnt
] & 0x02) scrbyte
|= 0x40;
301 if (scan
.buf
[7][cnt
] & 0x02) scrbyte
|= 0x80;
302 *(frameb
++) = scrbyte
;
308 rb
->lcd_update_rect(0, (scanline
/2) & ~7, LCD_WIDTH
, 8);
309 #elif (LCD_HEIGHT == 128) && (LCD_DEPTH == 2) /* iriver H1x0 */
314 scanline_remapped
= scanline
/ 4;
315 frameb
= rb
->lcd_framebuffer
+ scanline_remapped
* LCD_WIDTH
;
317 *(frameb
++) = (scan
.buf
[0][cnt
]&0x3) |
318 ((scan
.buf
[1][cnt
]&0x3)<<2) |
319 ((scan
.buf
[2][cnt
]&0x3)<<4) |
320 ((scan
.buf
[3][cnt
]&0x3)<<6);
323 rb
->lcd_update_rect(0, scanline
& ~3, LCD_WIDTH
, 4);
324 #elif defined(HAVE_LCD_COLOR)
325 /* handled in lcd.c now */
326 #endif /* LCD_HEIGHT */