From e8f8d9e7e93bd211a754b0722977f5ac72a4ba30 Mon Sep 17 00:00:00 2001 From: Dave Chapman Date: Fri, 20 Jan 2006 20:59:07 +0000 Subject: Initial support for iPod color and video. The Nano has a 176x132 LCD, which is the first colour LCD smaller than the gameboy's 160x144 display - so it needs work to skip scanlines. Button handling still needs more work - only up/down/left/right/start are currently mapped. Code is removed from IRAM due to 'relocation truncated to fit: R_ARM_PC24' errors. git-svn-id: svn://svn.rockbox.org/rockbox/trunk@8400 a1c6a512-1295-4272-9138-f99709370657 --- apps/plugins/rockboy/menu.c | 32 +++++++++++++++++++++++--------- apps/plugins/rockboy/rockboy.c | 7 +++++++ apps/plugins/rockboy/rockmacros.h | 5 +++++ apps/plugins/rockboy/sound.h | 5 +++++ apps/plugins/rockboy/sys_rockbox.c | 38 ++++++++++++++++++++++++++++---------- 5 files changed, 68 insertions(+), 19 deletions(-) (limited to 'apps/plugins/rockboy') diff --git a/apps/plugins/rockboy/menu.c b/apps/plugins/rockboy/menu.c index a22aef46f8..84bfeaa3cb 100644 --- a/apps/plugins/rockboy/menu.c +++ b/apps/plugins/rockboy/menu.c @@ -10,6 +10,20 @@ #include "rockmacros.h" #include "mem.h" +#if (CONFIG_KEYPAD == IPOD_4G_PAD) +#define MENU_BUTTON_UP BUTTON_SCROLL_BACK +#define MENU_BUTTON_DOWN BUTTON_SCROLL_FWD +#define MENU_BUTTON_LEFT BUTTON_LEFT +#define MENU_BUTTON_RIGHT BUTTON_RIGHT +#define MENU_BUTTON_CANCEL BUTTON_MENU +#else +#define MENU_BUTTON_UP BUTTON_UP +#define MENU_BUTTON_DOWN BUTTON_DOWN +#define MENU_BUTTON_LEFT BUTTON_LEFT +#define MENU_BUTTON_RIGHT BUTTON_RIGHT +#define MENU_BUTTON_CANCEL BUTTON_OFF +#endif + /* load/save state function declarations */ static void do_slot_menu(bool is_load); static void do_opt_menu(void); @@ -115,10 +129,10 @@ int getbutton(char *text) button = rb->button_get(true); button=button&0x00000FFF; switch(button) { - case BUTTON_LEFT: - case BUTTON_RIGHT: - case BUTTON_UP: - case BUTTON_DOWN: + case MENU_BUTTON_LEFT: + case MENU_BUTTON_RIGHT: + case MENU_BUTTON_UP: + case MENU_BUTTON_DOWN: break; default: return button; @@ -581,7 +595,7 @@ static int do_menu(char *title, char **items, size_t num_items, int sel) { /* handle the button */ switch (btn) { - case BUTTON_DOWN: + case MENU_BUTTON_DOWN: /* select next item in list */ sel_item = curr_item + 1; if (sel_item >= (int) num_items) @@ -589,7 +603,7 @@ static int do_menu(char *title, char **items, size_t num_items, int sel) { select_item(title, curr_item, sel_item); curr_item = sel_item; break; - case BUTTON_UP: + case MENU_BUTTON_UP: /* select prev item in list */ sel_item = curr_item - 1; if (sel_item < 0) @@ -597,13 +611,13 @@ static int do_menu(char *title, char **items, size_t num_items, int sel) { select_item(title, curr_item, sel_item); curr_item = sel_item; break; - case BUTTON_RIGHT: + case MENU_BUTTON_RIGHT: /* select current item */ ret = curr_item; done = true; break; - case BUTTON_LEFT: - case BUTTON_OFF: + case MENU_BUTTON_LEFT: + case MENU_BUTTON_CANCEL: /* cancel out of menu */ ret = MENU_CANCEL; done = true; diff --git a/apps/plugins/rockboy/rockboy.c b/apps/plugins/rockboy/rockboy.c index f6dea0eeea..da1017748f 100644 --- a/apps/plugins/rockboy/rockboy.c +++ b/apps/plugins/rockboy/rockboy.c @@ -113,6 +113,13 @@ void setoptions (void) { options.SELECT=BUTTON_PLAY; options.MENU=BUTTON_OFF; +#elif CONFIG_KEYPAD == IPOD_4G_PAD + options.A=BUTTON_NONE; + options.B=BUTTON_NONE; + options.START=BUTTON_SELECT; + options.SELECT=BUTTON_NONE; + options.MENU=(BUTTON_SELECT | BUTTON_REPEAT); + #elif CONFIG_KEYPAD == IRIVER_IFP7XX_PAD options.A=BUTTON_PLAY; options.B=BUTTON_EQ; diff --git a/apps/plugins/rockboy/rockmacros.h b/apps/plugins/rockboy/rockmacros.h index 2d33b968ea..cefa0ad787 100644 --- a/apps/plugins/rockboy/rockmacros.h +++ b/apps/plugins/rockboy/rockmacros.h @@ -47,6 +47,11 @@ void loadstate(int fd); void savestate(int fd); #define USER_MENU_QUIT -2 +/* Disable ICODE for the ARMs */ +#ifdef CPU_ARM +#undef ICODE_ATTR +#define ICODE_ATTR +#endif /* libc functions */ #define isdigit(c) ((c) >= '0' && (c) <= '9') diff --git a/apps/plugins/rockboy/sound.h b/apps/plugins/rockboy/sound.h index 18fb371580..682e6c1e94 100644 --- a/apps/plugins/rockboy/sound.h +++ b/apps/plugins/rockboy/sound.h @@ -27,6 +27,11 @@ struct snd extern struct snd snd; +#if defined(ICODE_ATTR) && defined(CPU_ARM) +#undef ICODE_ATTR +#define ICODE_ATTR +#endif + byte sound_read(byte r) ICODE_ATTR; void sound_write(byte r, byte b)ICODE_ATTR; void sound_dirty(void)ICODE_ATTR; diff --git a/apps/plugins/rockboy/sys_rockbox.c b/apps/plugins/rockboy/sys_rockbox.c index 578a864ca0..077727352d 100644 --- a/apps/plugins/rockboy/sys_rockbox.c +++ b/apps/plugins/rockboy/sys_rockbox.c @@ -25,6 +25,22 @@ #include "hw.h" #include "config.h" +#if (CONFIG_KEYPAD == IPOD_4G_PAD) + +#define ROCKBOY_PAD_LEFT BUTTON_LEFT +#define ROCKBOY_PAD_RIGHT BUTTON_RIGHT +#define ROCKBOY_PAD_UP BUTTON_MENU +#define ROCKBOY_PAD_DOWN BUTTON_PLAY + +#else + +#define ROCKBOY_PAD_LEFT BUTTON_LEFT +#define ROCKBOY_PAD_RIGHT BUTTON_RIGHT +#define ROCKBOY_PAD_UP BUTTON_UP +#define ROCKBOY_PAD_DOWN BUTTON_DOWN + +#endif + rcvar_t joy_exports[] = { RCV_END @@ -73,10 +89,10 @@ void ev_poll(void) #endif if(released) { ev.type = EV_RELEASE; - if(released & BUTTON_LEFT) { ev.code=PAD_LEFT; ev_postevent(&ev); } - if(released & BUTTON_RIGHT) {ev.code=PAD_RIGHT; ev_postevent(&ev);} - if(released & BUTTON_DOWN) { ev.code=PAD_DOWN; ev_postevent(&ev); } - if(released & BUTTON_UP) { ev.code=PAD_UP; ev_postevent(&ev); } + if(released & ROCKBOY_PAD_LEFT) { ev.code=PAD_LEFT; ev_postevent(&ev); } + if(released & ROCKBOY_PAD_RIGHT) {ev.code=PAD_RIGHT; ev_postevent(&ev);} + if(released & ROCKBOY_PAD_DOWN) { ev.code=PAD_DOWN; ev_postevent(&ev); } + if(released & ROCKBOY_PAD_UP) { ev.code=PAD_UP; ev_postevent(&ev); } if(released & options.A) { ev.code=PAD_A; ev_postevent(&ev); } if(released & options.B) { ev.code=PAD_B; ev_postevent(&ev); } if(released & options.START) { @@ -90,10 +106,10 @@ void ev_poll(void) } if(pressed) { /* button press */ ev.type = EV_PRESS; - if(pressed & BUTTON_LEFT) { ev.code=PAD_LEFT; ev_postevent(&ev); } - if(pressed & BUTTON_RIGHT) { ev.code=PAD_RIGHT; ev_postevent(&ev);} - if(pressed & BUTTON_DOWN) { ev.code=PAD_DOWN; ev_postevent(&ev); } - if(pressed & BUTTON_UP) { ev.code=PAD_UP; ev_postevent(&ev); } + if(pressed & ROCKBOY_PAD_LEFT) { ev.code=PAD_LEFT; ev_postevent(&ev); } + if(pressed & ROCKBOY_PAD_RIGHT) { ev.code=PAD_RIGHT; ev_postevent(&ev);} + if(pressed & ROCKBOY_PAD_DOWN) { ev.code=PAD_DOWN; ev_postevent(&ev); } + if(pressed & ROCKBOY_PAD_UP) { ev.code=PAD_UP; ev_postevent(&ev); } if(pressed & options.A) { ev.code=PAD_A; ev_postevent(&ev); } if(pressed & options.B) { ev.code=PAD_B; ev_postevent(&ev); } if(pressed & options.START) { @@ -105,7 +121,9 @@ void ev_poll(void) ev_postevent(&ev); } if(pressed & options.MENU) { -#if (CONFIG_KEYPAD == IRIVER_H100_PAD) || (CONFIG_KEYPAD == IRIVER_H300_PAD) +#if (CONFIG_KEYPAD == IRIVER_H100_PAD) || \ + (CONFIG_KEYPAD == IRIVER_H300_PAD) || \ + (CONFIG_KEYPAD == IPOD_4G_PAD) if (do_user_menu() == USER_MENU_QUIT) #endif { @@ -264,7 +282,7 @@ void vid_update(int scanline) cnt++; } rb->lcd_update_rect(0, scanline & ~3, LCD_WIDTH, 4); -#elif (LCD_HEIGHT >= 144) && defined(HAVE_LCD_COLOR) /* iriver H3x0, colour iPod */ +#elif defined(HAVE_LCD_COLOR) /* iriver H3x0, colour iPod */ // handled in lcd.c now #endif /* LCD_HEIGHT */ } -- cgit v1.2.3