Index: apps/iap.c =================================================================== --- apps/iap.c (revision 23610) +++ apps/iap.c (working copy) @@ -37,6 +37,8 @@ #include "settings.h" #include "metadata.h" #include "wps.h" +#include "powermgmt.h" +#include "sound.h" #include "action.h" @@ -50,7 +52,7 @@ static unsigned long iap_remotebtn = 0; static int iap_repeatbtn = 0; -static bool iap_btnrepeat = false, iap_btnshuffle = false; +static bool iap_btnrepeat = false, iap_btnshuffle = false, iap_mode2on = false; unsigned char serbuf[RX_BUFLEN]; static int serbuf_i = 0; @@ -148,7 +150,8 @@ static unsigned char chksum = 0; /* Restart if the sync word is seen */ - if(x == 0x55 && last_x == 0xff/* && newpkt*/) + if((x == 0x55 && last_x == 0xff/* && newpkt*/) || + (x == 0x55 && iap_mode2on == true)) { serbuf[0] = 0; serbuf_i = 0; @@ -230,57 +233,121 @@ { switch (serbuf[2]) { - /* get model info */ - case 0x0D: + case 0x24: { - unsigned char data[] = {0x00, 0x0E, 0x00, 0x0B, 0x00, 0x10, - 'R', 'O', 'C', 'K', 'B', 'O', 'X', 0x00}; + unsigned char data[] = {0x00, 0x25, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00,0x01}; iap_send_pkt(data, sizeof(data)); break; } - /* No idea ??? */ + + case 0x18: + { + /* seems to be some kind of ciphered authentication command*/ + /* Isn't used since we don't send the 0x00 0x17 command */ + break; + } + + case 0x15: + { + unsigned char data0[] = {0x00, 0x16, 0x00}; + iap_send_pkt(data0, sizeof(data0)); + unsigned char data1[] = {0x00, 0x27, 0x00}; + iap_send_pkt(data1, sizeof(data1)); + /* mandatory to enable some hardware */ + unsigned char data2[] = {0x00, 0x19, 0x00}; + iap_send_pkt(data2, sizeof(data2)); + break; + } + + case 0x13: + { + unsigned char data[] = {0x00, 0x02, 0x00, 0x13}; + iap_send_pkt(data, sizeof(data)); + + if (serbuf[6] == 0x35) + /* FM transmitter sends this: */ + /* FF 55 0E 00 13 00 00 00 35 00 00 00 04 00 00 00 00 A6 (??)*/ + { + unsigned char data2[] = {0x00, 0x27, 0x00}; + iap_send_pkt(data2, sizeof(data2)); + unsigned char data3[] = {0x05, 0x02}; + iap_send_pkt(data3, sizeof(data3)); + } + else + { + unsigned char data4[] = {0x00, 0x14}; + iap_send_pkt(data4, sizeof(data4)); + } + break; + } + + /* Init */ case 0x0F: { unsigned char data[] = {0x00, 0x10, 0x00, 0x01, 0x05}; + data[2] = serbuf[3]; iap_send_pkt(data, sizeof(data)); break; } - /* FM transmitter sends this: FF 55 06 00 01 05 00 02 01 F1 (mode switch) */ - case 0x01: + + /* get model info */ + case 0x0D: { - if(serbuf[3] == 0x05) - { - sleep(HZ/3); - unsigned char data[] = {0x05, 0x02}; - iap_send_pkt(data, sizeof(data)); - } + /* ipod is supposed to work only with 5G and nano 2G */ + /*{0x00, 0x0E, 0x00, 0x0B, 0x00, 0x05, 0x50, 0x41, 0x31, 0x34, + 0x37, 0x4C, 0x4C, 0x00}; PA147LL (IPOD 5G 60 GO) */ + unsigned char data[] = {0x00, 0x0E, 0x00, 0x0B, 0x00, 0x10, + 'R', 'O', 'C', 'K', 'B', 'O', 'X', 0x00}; + iap_send_pkt(data, sizeof(data)); break; } - /* FM transmitter sends this: FF 55 0E 00 13 00 00 00 35 00 00 00 04 00 00 00 00 A6 (???)*/ - case 0x13: + + /* Ipod FM remote sends this: FF 55 02 00 09 F5 */ + case 0x09: { - unsigned char data[] = {0x00, 0x02, 0x00, 0x13}; + /* ipod5G sends this, my apple firmware version maybe? */ + unsigned char data[] = {0x00, 0x0A, 0x01, 0x02, 0x01 }; iap_send_pkt(data, sizeof(data)); - unsigned char data2[] = {0x00, 0x27, 0x00}; - iap_send_pkt(data2, sizeof(data2)); - unsigned char data3[] = {0x05, 0x02}; - iap_send_pkt(data3, sizeof(data3)); break; - } - /* FM transmitter sends this: FF 55 02 00 05 F9 (mode switch: AiR mode) */ + } + + /* FM transmitter sends this: */ + /* FF 55 02 00 05 F9 (mode switch: AiR mode) */ case 0x05: { - unsigned char data[] = {0x00, 0x02, 0x06, 0x05, 0x00, 0x00, 0x0B, 0xB8, 0x28}; + unsigned char data[] = {0x00, 0x02, 0x06, + 0x05, 0x00, 0x00, 0x0B, 0xB8, 0x28}; iap_send_pkt(data, sizeof(data)); unsigned char data2[] = {0x00, 0x02, 0x00, 0x05}; iap_send_pkt(data2, sizeof(data2)); break; - } + } + + case 0x01: + { + /* FM transmitter sends this: */ + /* FF 55 06 00 01 05 00 02 01 F1 (mode switch) */ + if(serbuf[3] == 0x05) + { + sleep(HZ/3); + unsigned char data[] = {0x05, 0x02}; + iap_send_pkt(data, sizeof(data)); + } + /* FM remote sends this: */ + /* FF 55 03 00 01 02 FA (1st thing sent) */ + else if(serbuf[3] == 0x02) + { + /* ??? Might be useful only for apple firmware*/ + } + break; + } + /* default response is with cmd ok packet */ default: { unsigned char data[] = {0x00, 0x02, 0x00, 0x00}; - data[3] = serbuf[2]; //respond with cmd + data[3] = serbuf[2]; /* respond with cmd */ iap_send_pkt(data, sizeof(data)); break; } @@ -292,6 +359,7 @@ if(serbuf[2] != 0) return; iap_remotebtn = BUTTON_NONE; iap_remotetick = false; + iap_mode2on = true; if(serbuf[0] >= 3 && serbuf[3] != 0) { @@ -373,6 +441,14 @@ else iap_btnrepeat = false; + if(serbuf[5] & 4) /* power off */ + { + /* notify that it goes in sleep mode */ + unsigned char data[] = {0x00, 0x23, 0x03}; + iap_send_pkt(data, sizeof(data)); + /* power the ipod off, since there is no actual sleep mode */ + sys_poweroff(); + } if(serbuf[5] & 16) /* ffwd */ { iap_remotebtn |= BUTTON_RC_RIGHT; @@ -381,20 +457,70 @@ { iap_remotebtn |= BUTTON_RC_LEFT; } + if(serbuf[5] & 64) /* menu */ + { + iap_remotebtn |= BUTTON_RC_MENU; + } + if(serbuf[5] & 128) /* select */ + { + iap_remotebtn |= BUTTON_RC_SELECT; + } } + else if(serbuf[0] >= 6 && serbuf[6] != 0) + { + if(serbuf[6] & 1) /* up arrow */ + { + iap_remotebtn |= BUTTON_RC_UP; + } + if(serbuf[6] & 2) /* down arrow */ + { + iap_remotebtn |= BUTTON_RC_DOWN; + } + } + /* end of repetitive command */ + else + { + iap_mode2on = false; + } } /* Handle Mode 3 */ else if (serbuf[1] == 0x03) { switch(serbuf[2]) { - /* some kind of status packet? */ case 0x01: { unsigned char data[] = {0x03, 0x02, 0x00, 0x00, 0x00, 0x00}; iap_send_pkt(data, sizeof(data)); break; } + + case 0x08: + { + /* ACK */ + unsigned char data[] = {0x03, 0x00, 0x00, 0x08}; + iap_send_pkt(data, sizeof(data)); + break; + } + /* ??? */ + case 0x0C: + { + /* get ipod volume */ + if (serbuf[3] == 0x04) + { + unsigned char vol = 0x00; + unsigned char data[] = {0x03, 0x0D, 0x04, 0x00, vol}; + vol = (char)((global_settings.volume+58) * 4); + iap_send_pkt(data, sizeof(data)); + } + break; + } + /* volume from accessory */ + case 0x0E: + if (serbuf[3] == 0x04) + global_settings.volume = (-58)+((int)serbuf[5]+1)/4; + sound_set_volume(global_settings.volume); + break; } } /* Handle Mode 4 */ Index: apps/keymaps/keymap-ipod.c =================================================================== --- apps/keymaps/keymap-ipod.c (revision 23610) +++ apps/keymaps/keymap-ipod.c (working copy) @@ -47,6 +47,7 @@ { ACTION_STD_NEXTREPEAT, BUTTON_SCROLL_FWD|BUTTON_REPEAT, BUTTON_NONE }, { ACTION_STD_CANCEL, BUTTON_LEFT, BUTTON_NONE }, { ACTION_STD_OK, BUTTON_RIGHT, BUTTON_NONE }, + { ACTION_STD_OK, BUTTON_SELECT|BUTTON_REL, BUTTON_SELECT }, { ACTION_STD_MENU, BUTTON_MENU|BUTTON_REL, BUTTON_MENU }, { ACTION_STD_QUICKSCREEN, BUTTON_MENU|BUTTON_REPEAT, BUTTON_MENU }, @@ -55,7 +56,6 @@ LAST_ITEM_IN_LIST }; /* button_context_standard */ - static const struct button_mapping button_context_tree[] = { { ACTION_TREE_WPS, BUTTON_PLAY|BUTTON_REL, BUTTON_PLAY }, { ACTION_TREE_STOP, BUTTON_PLAY|BUTTON_REPEAT, BUTTON_PLAY }, @@ -74,7 +74,7 @@ { ACTION_TREE_PGRIGHT, BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_NONE }, { ACTION_TREE_PGRIGHT, BUTTON_RIGHT|BUTTON_REL, BUTTON_RIGHT|BUTTON_REPEAT }, LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_CUSTOM|CONTEXT_TREE), -}; /* button_context_tree_scroll_lr */ +}; static const struct button_mapping button_context_wps[] = { { ACTION_WPS_PLAY, BUTTON_PLAY|BUTTON_REL, BUTTON_PLAY }, @@ -116,12 +116,12 @@ static const struct button_mapping button_context_yesno[] = { { ACTION_YESNO_ACCEPT, BUTTON_SELECT, BUTTON_NONE }, LAST_ITEM_IN_LIST -}; /* button_context_yesno */ +}; /* button_context_settings_yesno */ static const struct button_mapping button_context_bmark[] = { { ACTION_BMS_DELETE, BUTTON_MENU|BUTTON_REPEAT, BUTTON_MENU }, LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_LIST), -}; /* button_context_bmark */ +}; /* button_context_settings_bmark */ static const struct button_mapping button_context_quickscreen[] = { { ACTION_QS_TOP, BUTTON_MENU, BUTTON_NONE }, @@ -285,32 +285,161 @@ *****************************************************************************/ static const struct button_mapping remote_button_context_standard[] = { - { ACTION_STD_PREV, BUTTON_RC_LEFT, BUTTON_NONE }, - { ACTION_STD_NEXT, BUTTON_RC_RIGHT, BUTTON_NONE }, - { ACTION_STD_CANCEL, BUTTON_RC_STOP, BUTTON_NONE }, - { ACTION_STD_OK, BUTTON_RC_PLAY, BUTTON_NONE }, + { ACTION_STD_PREV, BUTTON_RC_UP, BUTTON_NONE }, + { ACTION_STD_PREVREPEAT, BUTTON_RC_UP|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_STD_NEXT, BUTTON_RC_DOWN, BUTTON_NONE }, + { ACTION_STD_NEXTREPEAT, BUTTON_RC_DOWN|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_STD_CANCEL, BUTTON_RC_LEFT, BUTTON_NONE }, + { ACTION_STD_OK, BUTTON_RC_RIGHT, BUTTON_NONE }, + { ACTION_STD_OK, BUTTON_RC_PLAY|BUTTON_REL, BUTTON_RC_PLAY }, + { ACTION_STD_OK, BUTTON_RC_SELECT|BUTTON_REL, BUTTON_RC_SELECT }, + { ACTION_STD_MENU, BUTTON_RC_MENU|BUTTON_REL, BUTTON_MENU }, + { ACTION_STD_QUICKSCREEN, BUTTON_RC_MENU|BUTTON_REPEAT, BUTTON_MENU }, + { ACTION_STD_CONTEXT, BUTTON_RC_SELECT|BUTTON_REPEAT,BUTTON_RC_SELECT }, + { ACTION_STD_CANCEL, BUTTON_RC_STOP, BUTTON_NONE }, + { ACTION_STD_CANCEL, BUTTON_RC_PLAY|BUTTON_REPEAT, BUTTON_RC_PLAY }, LAST_ITEM_IN_LIST }; /* remote_button_context_standard */ static const struct button_mapping remote_button_context_wps[] = { + { ACTION_WPS_PLAY, BUTTON_RC_PLAY|BUTTON_REL, BUTTON_RC_PLAY }, + { ACTION_WPS_STOP, BUTTON_RC_PLAY|BUTTON_REPEAT, BUTTON_RC_PLAY }, + { ACTION_WPS_SKIPPREV, BUTTON_RC_LEFT|BUTTON_REL, BUTTON_RC_LEFT }, + { ACTION_WPS_SEEKBACK, BUTTON_RC_LEFT|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_WPS_STOPSEEK, BUTTON_RC_LEFT|BUTTON_REL, BUTTON_RC_LEFT|BUTTON_REPEAT }, + { ACTION_WPS_SKIPNEXT, BUTTON_RC_RIGHT|BUTTON_REL, BUTTON_RC_RIGHT }, + { ACTION_WPS_SEEKFWD, BUTTON_RC_RIGHT|BUTTON_REPEAT,BUTTON_NONE }, + { ACTION_WPS_STOPSEEK, BUTTON_RC_RIGHT|BUTTON_REL, BUTTON_RC_RIGHT|BUTTON_REPEAT }, { ACTION_WPS_VOLDOWN, BUTTON_RC_VOL_DOWN, BUTTON_NONE }, { ACTION_WPS_VOLDOWN, BUTTON_RC_VOL_DOWN|BUTTON_REPEAT, BUTTON_NONE }, { ACTION_WPS_VOLUP, BUTTON_RC_VOL_UP, BUTTON_NONE }, { ACTION_WPS_VOLUP, BUTTON_RC_VOL_UP|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_WPS_BROWSE, BUTTON_RC_SELECT|BUTTON_REL, BUTTON_RC_SELECT }, + { ACTION_WPS_CONTEXT, BUTTON_RC_SELECT|BUTTON_REPEAT, BUTTON_RC_SELECT }, + { ACTION_WPS_VIEW_PLAYLIST, BUTTON_RC_SELECT|BUTTON_PLAY, BUTTON_NONE }, + { ACTION_WPS_MENU, BUTTON_RC_MENU|BUTTON_REL, BUTTON_RC_MENU }, + { ACTION_WPS_QUICKSCREEN, BUTTON_RC_MENU|BUTTON_REPEAT, BUTTON_RC_MENU }, - { ACTION_WPS_PLAY, BUTTON_RC_PLAY|BUTTON_REL, BUTTON_RC_PLAY }, - { ACTION_WPS_STOP, BUTTON_RC_PLAY|BUTTON_REPEAT, BUTTON_NONE }, - { ACTION_WPS_SKIPNEXT, BUTTON_RC_RIGHT|BUTTON_REL, BUTTON_RC_RIGHT }, - { ACTION_WPS_SEEKFWD, BUTTON_RC_RIGHT|BUTTON_REPEAT,BUTTON_NONE }, - { ACTION_WPS_STOPSEEK, BUTTON_RC_RIGHT|BUTTON_REL, BUTTON_RC_RIGHT|BUTTON_REPEAT }, - { ACTION_WPS_SKIPPREV, BUTTON_RC_LEFT|BUTTON_REL, BUTTON_RC_LEFT }, - { ACTION_WPS_SEEKBACK, BUTTON_RC_LEFT|BUTTON_REPEAT, BUTTON_NONE }, - { ACTION_WPS_STOPSEEK, BUTTON_RC_LEFT|BUTTON_REL, BUTTON_RC_LEFT|BUTTON_REPEAT }, - LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_STD) }; /* remote_button_context_wps */ +static const struct button_mapping remote_button_context_tree[] = { + { ACTION_TREE_WPS, BUTTON_RC_PLAY|BUTTON_REL, BUTTON_RC_PLAY }, + { ACTION_TREE_STOP, BUTTON_RC_PLAY|BUTTON_REPEAT, BUTTON_RC_PLAY }, + + LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_STD) +}; /* remote_button_context_tree */ + +static const struct button_mapping remote_button_context_tree_scroll_lr[] = { + { ACTION_NONE, BUTTON_RC_LEFT, BUTTON_NONE }, + { ACTION_STD_CANCEL, BUTTON_RC_LEFT|BUTTON_REL, BUTTON_RC_LEFT }, + { ACTION_TREE_ROOT_INIT, BUTTON_RC_LEFT|BUTTON_REPEAT, BUTTON_RC_LEFT }, + { ACTION_TREE_PGLEFT, BUTTON_RC_LEFT|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_TREE_PGLEFT, BUTTON_RC_LEFT|BUTTON_REL, BUTTON_RC_LEFT|BUTTON_REPEAT }, + { ACTION_NONE, BUTTON_RC_RIGHT, BUTTON_NONE }, + { ACTION_STD_OK, BUTTON_RC_RIGHT|BUTTON_REL, BUTTON_RC_RIGHT }, + { ACTION_TREE_PGRIGHT, BUTTON_RC_RIGHT|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_TREE_PGRIGHT, BUTTON_RC_RIGHT|BUTTON_REL, BUTTON_RC_RIGHT|BUTTON_REPEAT }, + + LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_CUSTOM|CONTEXT_TREE), +}; /* remote_button_context_tree_scroll_lr */ + +static const struct button_mapping remote_button_context_settings[] = { + { ACTION_SETTINGS_INC, BUTTON_RC_UP, BUTTON_NONE }, + { ACTION_SETTINGS_INCREPEAT, BUTTON_RC_UP|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_SETTINGS_DEC, BUTTON_RC_DOWN, BUTTON_NONE }, + { ACTION_SETTINGS_DECREPEAT, BUTTON_RC_DOWN|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_STD_PREV, BUTTON_RC_LEFT, BUTTON_NONE }, + { ACTION_STD_PREVREPEAT, BUTTON_RC_LEFT|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_STD_NEXT, BUTTON_RC_RIGHT, BUTTON_NONE }, + { ACTION_STD_NEXTREPEAT, BUTTON_RC_RIGHT|BUTTON_REPEAT,BUTTON_NONE }, + { ACTION_STD_OK, BUTTON_RC_SELECT|BUTTON_REL, BUTTON_NONE }, + { ACTION_STD_CANCEL, BUTTON_RC_MENU|BUTTON_REL, BUTTON_RC_MENU }, + + LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_STD) +}; /* remote_button_context_settings */ + +static const struct button_mapping remote_button_context_yesno[] = { + { ACTION_YESNO_ACCEPT, BUTTON_RC_SELECT, BUTTON_NONE }, + LAST_ITEM_IN_LIST +}; /* remote_button_context_yesno */ + +static const struct button_mapping remote_button_context_bmark[] = { + { ACTION_BMS_DELETE, BUTTON_RC_MENU|BUTTON_REPEAT, BUTTON_RC_MENU }, + LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_LIST), +}; /* remote_button_context_bmark */ + +static const struct button_mapping remote_button_context_quickscreen[] = { + { ACTION_QS_TOP, BUTTON_RC_MENU, BUTTON_NONE }, + { ACTION_QS_TOP, BUTTON_RC_MENU|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_QS_DOWN, BUTTON_RC_PLAY, BUTTON_NONE }, + { ACTION_QS_DOWN, BUTTON_RC_PLAY|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_QS_LEFT, BUTTON_RC_LEFT, BUTTON_NONE }, + { ACTION_QS_LEFT, BUTTON_RC_LEFT|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_QS_RIGHT, BUTTON_RC_RIGHT, BUTTON_NONE }, + { ACTION_QS_RIGHT, BUTTON_RC_RIGHT|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_STD_CANCEL, BUTTON_RC_SELECT, BUTTON_NONE }, + + LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_STD) +}; /* remote_button_context_quickscreen */ + +static const struct button_mapping remote_button_context_pitchscreen[] = { + { ACTION_PS_INC_SMALL, BUTTON_RC_VOL_UP, BUTTON_NONE }, + { ACTION_PS_INC_BIG, BUTTON_RC_VOL_UP|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_PS_DEC_SMALL, BUTTON_RC_VOL_DOWN, BUTTON_NONE }, + { ACTION_PS_DEC_BIG, BUTTON_RC_VOL_DOWN|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_PS_NUDGE_LEFT, BUTTON_RC_LEFT, BUTTON_NONE }, + { ACTION_PS_NUDGE_LEFTOFF, BUTTON_RC_LEFT|BUTTON_REL, BUTTON_NONE }, + { ACTION_PS_NUDGE_RIGHT, BUTTON_RC_RIGHT, BUTTON_NONE }, + { ACTION_PS_NUDGE_RIGHTOFF, BUTTON_RC_RIGHT|BUTTON_REL, BUTTON_NONE }, + { ACTION_PS_TOGGLE_MODE, BUTTON_RC_PLAY, BUTTON_NONE }, + { ACTION_PS_RESET, BUTTON_RC_MENU, BUTTON_NONE }, + { ACTION_PS_EXIT, BUTTON_RC_SELECT, BUTTON_NONE }, + { ACTION_PS_SLOWER, BUTTON_RC_LEFT|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_PS_FASTER, BUTTON_RC_RIGHT|BUTTON_REPEAT, BUTTON_NONE }, + + LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_STD) +}; /* remote_button_context_pitchscreen */ + +static const struct button_mapping remote_button_context_keyboard[] = { + { ACTION_KBD_LEFT, BUTTON_RC_LEFT, BUTTON_NONE }, + { ACTION_KBD_LEFT, BUTTON_RC_LEFT|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_KBD_RIGHT, BUTTON_RC_RIGHT, BUTTON_NONE }, + { ACTION_KBD_RIGHT, BUTTON_RC_RIGHT|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_KBD_SELECT, BUTTON_RC_SELECT, BUTTON_NONE }, + { ACTION_KBD_DONE, BUTTON_RC_PLAY, BUTTON_NONE }, + { ACTION_KBD_ABORT, BUTTON_RC_MENU|BUTTON_REL, BUTTON_RC_MENU }, + { ACTION_KBD_UP, BUTTON_RC_VOL_UP, BUTTON_NONE }, + { ACTION_KBD_UP, BUTTON_RC_VOL_UP|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_KBD_DOWN, BUTTON_RC_VOL_DOWN, BUTTON_NONE }, + { ACTION_KBD_DOWN, BUTTON_RC_VOL_DOWN|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_KBD_MORSE_INPUT, BUTTON_RC_MENU|BUTTON_REPEAT, BUTTON_RC_MENU }, + { ACTION_KBD_MORSE_SELECT, BUTTON_RC_SELECT|BUTTON_REL, BUTTON_NONE }, + LAST_ITEM_IN_LIST +}; /* remote_button_context_keyboard */ + +#ifdef HAVE_RECORDING +const struct button_mapping remote_button_context_recscreen[] = { + + { ACTION_REC_NEWFILE, BUTTON_RC_SELECT|BUTTON_REL, BUTTON_RC_SELECT }, + { ACTION_STD_MENU, BUTTON_RC_SELECT|BUTTON_REPEAT, BUTTON_RC_SELECT }, + { ACTION_REC_PAUSE, BUTTON_RC_PLAY|BUTTON_REL, BUTTON_RC_PLAY }, + { ACTION_STD_CANCEL, BUTTON_RC_PLAY|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_STD_CANCEL, BUTTON_RC_MENU, BUTTON_NONE }, + { ACTION_STD_NEXT, BUTTON_RC_VOL_DOWN, BUTTON_NONE }, + { ACTION_STD_NEXT, BUTTON_RC_VOL_DOWN|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_STD_PREV, BUTTON_RC_VOL_UP, BUTTON_NONE }, + { ACTION_STD_PREV, BUTTON_RC_VOL_UP|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_SETTINGS_INC, BUTTON_RC_RIGHT, BUTTON_NONE }, + { ACTION_SETTINGS_INCREPEAT, BUTTON_RC_RIGHT|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_SETTINGS_DEC, BUTTON_RC_LEFT, BUTTON_NONE }, + { ACTION_SETTINGS_DECREPEAT, BUTTON_RC_LEFT|BUTTON_REPEAT, BUTTON_NONE }, + + LAST_ITEM_IN_LIST +}; /* remote_button_context_recscreen */ +#endif + static const struct button_mapping* get_context_mapping_remote( int context ) { context ^= CONTEXT_REMOTE; @@ -319,6 +448,36 @@ { case CONTEXT_WPS: return remote_button_context_wps; + case CONTEXT_TREE: + case CONTEXT_MAINMENU: + if (global_settings.hold_lr_for_scroll_in_list) + return remote_button_context_tree_scroll_lr; + /* else fall through to CUSTOM|CONTEXT_TREE */ + case CONTEXT_CUSTOM|CONTEXT_TREE: + return remote_button_context_tree; + case CONTEXT_LIST: + return remote_button_context_standard; + + case CONTEXT_SETTINGS_EQ: + case CONTEXT_SETTINGS_COLOURCHOOSER: + case CONTEXT_SETTINGS_TIME: + case CONTEXT_SETTINGS: + case CONTEXT_SETTINGS_RECTRIGGER: + return remote_button_context_settings; + case CONTEXT_YESNOSCREEN: + return remote_button_context_yesno; + case CONTEXT_BOOKMARKSCREEN: + return remote_button_context_bmark; + case CONTEXT_QUICKSCREEN: + return remote_button_context_quickscreen; + case CONTEXT_PITCHSCREEN: + return remote_button_context_pitchscreen; + case CONTEXT_KEYBOARD: + return remote_button_context_keyboard; +#ifdef HAVE_RECORDING + case CONTEXT_RECSCREEN: + return remote_button_context_recscreen; +#endif default: return remote_button_context_standard; } Index: firmware/target/arm/ipod/button-target.h =================================================================== --- firmware/target/arm/ipod/button-target.h (revision 23610) +++ firmware/target/arm/ipod/button-target.h (working copy) @@ -38,12 +38,10 @@ #define BUTTON_SELECT 0x00000001 #define BUTTON_MENU 0x00000002 - #define BUTTON_LEFT 0x00000004 #define BUTTON_RIGHT 0x00000008 #define BUTTON_SCROLL_FWD 0x00000010 #define BUTTON_SCROLL_BACK 0x00000020 - #define BUTTON_PLAY 0x00000040 #define BUTTON_MAIN (BUTTON_SELECT|BUTTON_MENU\ @@ -52,17 +50,22 @@ /* Remote control's buttons */ #ifdef IPOD_ACCESSORY_PROTOCOL -#define BUTTON_RC_PLAY 0x00100000 -#define BUTTON_RC_STOP 0x00080000 +#define BUTTON_RC_PLAY 0x00100000 +#define BUTTON_RC_STOP 0x00080000 +#define BUTTON_RC_LEFT 0x00040000 +#define BUTTON_RC_RIGHT 0x00020000 +#define BUTTON_RC_VOL_UP 0x00010000 +#define BUTTON_RC_VOL_DOWN 0x00008000 +#define BUTTON_RC_SELECT 0x00200000 +#define BUTTON_RC_MENU 0x00400000 +#define BUTTON_RC_UP 0x00800000 +#define BUTTON_RC_DOWN 0x01000000 -#define BUTTON_RC_LEFT 0x00040000 -#define BUTTON_RC_RIGHT 0x00020000 -#define BUTTON_RC_VOL_UP 0x00010000 -#define BUTTON_RC_VOL_DOWN 0x00008000 - #define BUTTON_REMOTE (BUTTON_RC_PLAY|BUTTON_RC_STOP\ |BUTTON_RC_LEFT|BUTTON_RC_RIGHT\ - |BUTTON_RC_VOL_UP|BUTTON_RC_VOL_DOWN) + |BUTTON_RC_VOL_UP|BUTTON_RC_VOL_DOWN\ + |BUTTON_RC_MENU|BUTTON_RC_SELECT\ + |BUTTON_RC_UP|BUTTON_RC_DOWN) #else #define BUTTON_REMOTE 0 #endif