Skip to content

Instantly share code, notes, and snippets.

@Stanley00
Last active May 7, 2022 03:26
Show Gist options
  • Save Stanley00/6d9b121ccfca7b8f70a75991d0264b31 to your computer and use it in GitHub Desktop.
Save Stanley00/6d9b121ccfca7b8f70a75991d0264b31 to your computer and use it in GitHub Desktop.
diff --git a/apps/SOURCES b/apps/SOURCES
index 4ae04a4..af32441 100644
--- a/apps/SOURCES
+++ b/apps/SOURCES
@@ -302,6 +302,8 @@ keymaps/keymap-xduoox3ii.c
keymaps/keymap-xduoox20.c
#elif CONFIG_KEYPAD == FIIO_M3K_PAD
keymaps/keymap-fiiom3k.c
+#elif CONFIG_KEYPAD == FIIO_M5_PAD
+keymaps/keymap-fiiom5.c
#elif CONFIG_KEYPAD == EROSQ_PAD
keymaps/keymap-erosq.c
#endif
diff --git a/apps/bitmaps/native/SOURCES b/apps/bitmaps/native/SOURCES
index 1d1fcd4..14a56ef 100644
--- a/apps/bitmaps/native/SOURCES
+++ b/apps/bitmaps/native/SOURCES
@@ -50,7 +50,7 @@ toolsicon.70x70x16.bmp
hibyicon.130x130x16.bmp
rockboxicon.130x130x16.bmp
toolsicon.130x130x16.bmp
-#elif defined(FIIO_M3K)
+#elif defined(FIIO_M3K) || defined(FIIO_M5)
fiioicon.130x130x16.bmp
rockboxicon.130x130x16.bmp
toolsicon.130x130x16.bmp
diff --git a/apps/keymaps/keymap-fiiom5.c b/apps/keymaps/keymap-fiiom5.c
new file mode 100644
index 0000000..4fa97e9
--- /dev/null
+++ b/apps/keymaps/keymap-fiiom5.c
@@ -0,0 +1,224 @@
+/***************************************************************************
+ * __________ __ ___.
+ * Open \______ \ ____ ____ | | _\_ |__ _______ ___
+ * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
+ * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
+ * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
+ * \/ \/ \/ \/ \/
+ * $Id$
+ *
+ * Copyright (C) 2019 by Roman Stolyarov
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ****************************************************************************/
+
+/* Button Code Definitions for FiiO M3K target */
+
+#include "config.h"
+#include "action.h"
+#include "button.h"
+#include "settings.h"
+
+/* {Action Code, Button code, Prereq button code } */
+
+/*
+ * The format of the list is as follows
+ * { Action Code, Button code, Prereq button code }
+ * if there's no need to check the previous button's value, use BUTTON_NONE
+ * Insert LAST_ITEM_IN_LIST at the end of each mapping
+ */
+static const struct button_mapping button_context_standard[] = {
+ { ACTION_STD_PREV, BUTTON_UP, BUTTON_NONE },
+ { ACTION_STD_PREV, BUTTON_PREV, BUTTON_NONE },
+ { ACTION_STD_PREVREPEAT, BUTTON_PREV|BUTTON_REPEAT, BUTTON_NONE },
+ { ACTION_STD_NEXT, BUTTON_DOWN, BUTTON_NONE },
+ { ACTION_STD_NEXT, BUTTON_NEXT, BUTTON_NONE },
+ { ACTION_STD_NEXTREPEAT, BUTTON_NEXT|BUTTON_REPEAT, BUTTON_NONE },
+ { ACTION_STD_CONTEXT, BUTTON_PLAY|BUTTON_REPEAT, BUTTON_PLAY },
+ { ACTION_STD_CANCEL, BUTTON_HOME|BUTTON_REL, BUTTON_HOME },
+ { ACTION_STD_OK, BUTTON_PLAY|BUTTON_REL, BUTTON_PLAY },
+ { ACTION_STD_MENU, BUTTON_OPTION|BUTTON_REL, BUTTON_OPTION },
+
+ LAST_ITEM_IN_LIST
+}; /* button_context_standard */
+
+static const struct button_mapping button_context_wps[] = {
+ { ACTION_WPS_PLAY, BUTTON_PLAY|BUTTON_REL, BUTTON_PLAY },
+// { ACTION_WPS_STOP, BUTTON_PLAY|BUTTON_REPEAT, BUTTON_PLAY },
+ { ACTION_WPS_SKIPPREV, BUTTON_PREV|BUTTON_REL, BUTTON_PREV },
+ { ACTION_WPS_SEEKBACK, BUTTON_PREV|BUTTON_REPEAT, BUTTON_NONE },
+ { ACTION_WPS_STOPSEEK, BUTTON_PREV|BUTTON_REL, BUTTON_PREV|BUTTON_REPEAT },
+ { ACTION_WPS_SKIPNEXT, BUTTON_NEXT|BUTTON_REL, BUTTON_NEXT },
+ { ACTION_WPS_SEEKFWD, BUTTON_NEXT|BUTTON_REPEAT, BUTTON_NONE },
+ { ACTION_WPS_STOPSEEK, BUTTON_NEXT|BUTTON_REL, BUTTON_NEXT|BUTTON_REPEAT },
+ { ACTION_WPS_VOLUP, BUTTON_VOL_UP, BUTTON_NONE },
+ { ACTION_WPS_VOLUP, BUTTON_VOL_UP|BUTTON_REPEAT, BUTTON_NONE },
+ { ACTION_WPS_VOLDOWN, BUTTON_VOL_DOWN, BUTTON_NONE },
+ { ACTION_WPS_VOLDOWN, BUTTON_VOL_DOWN|BUTTON_REPEAT, BUTTON_NONE },
+ { ACTION_WPS_BROWSE, BUTTON_HOME|BUTTON_REL, BUTTON_HOME },
+ { ACTION_WPS_CONTEXT, BUTTON_PLAY|BUTTON_REPEAT, BUTTON_PLAY },
+ { ACTION_WPS_MENU, BUTTON_OPTION|BUTTON_REL, BUTTON_OPTION },
+ { ACTION_WPS_QUICKSCREEN, BUTTON_OPTION|BUTTON_REPEAT, BUTTON_OPTION },
+ { ACTION_WPS_HOTKEY, BUTTON_HOME|BUTTON_REPEAT, BUTTON_HOME },
+
+// XXX BUTTON_UP and BUTTON_DOWN aren't on here.
+
+ { ACTION_STD_KEYLOCK, BUTTON_POWER, BUTTON_NONE },
+
+ LAST_ITEM_IN_LIST
+}; /* button_context_wps */
+
+static const struct button_mapping button_context_list[] = {
+ { ACTION_LIST_VOLUP, BUTTON_VOL_UP, BUTTON_NONE },
+ { ACTION_LIST_VOLUP, BUTTON_VOL_UP|BUTTON_REPEAT, BUTTON_NONE },
+ { ACTION_LIST_VOLDOWN, BUTTON_VOL_DOWN, BUTTON_NONE },
+ { ACTION_LIST_VOLDOWN, BUTTON_VOL_DOWN|BUTTON_REPEAT, BUTTON_NONE },
+
+ LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_STD)
+}; /* button_context_list */
+
+/** Bookmark Screen **/
+static const struct button_mapping button_context_bmark[] = {
+ { ACTION_BMS_DELETE, BUTTON_PLAY|BUTTON_REPEAT, BUTTON_PLAY },
+
+ LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_LIST)
+}; /* button_context_bmark */
+
+/** Keyboard **/
+static const struct button_mapping button_context_keyboard[] = {
+ { ACTION_KBD_LEFT, BUTTON_PREV, BUTTON_NONE },
+ { ACTION_KBD_LEFT, BUTTON_PREV|BUTTON_REPEAT, BUTTON_NONE },
+ { ACTION_KBD_RIGHT, BUTTON_NEXT, BUTTON_NONE },
+ { ACTION_KBD_RIGHT, BUTTON_NEXT|BUTTON_REPEAT, BUTTON_NONE },
+ { ACTION_KBD_DOWN, BUTTON_DOWN, BUTTON_NONE },
+ { ACTION_KBD_DOWN, BUTTON_DOWN|BUTTON_REPEAT, BUTTON_NONE },
+ { ACTION_KBD_CURSOR_LEFT, BUTTON_VOL_UP, BUTTON_NONE },
+ { ACTION_KBD_CURSOR_LEFT, BUTTON_VOL_UP|BUTTON_REPEAT, BUTTON_NONE },
+ { ACTION_KBD_CURSOR_RIGHT, BUTTON_VOL_DOWN, BUTTON_NONE },
+ { ACTION_KBD_CURSOR_RIGHT, BUTTON_VOL_DOWN|BUTTON_REPEAT, BUTTON_NONE },
+ { ACTION_KBD_BACKSPACE, BUTTON_HOME, BUTTON_NONE },
+ { ACTION_KBD_BACKSPACE, BUTTON_HOME|BUTTON_REPEAT, BUTTON_NONE },
+ { ACTION_KBD_SELECT, BUTTON_PLAY|BUTTON_REL, BUTTON_PLAY },
+ { ACTION_KBD_DONE, BUTTON_PLAY|BUTTON_REPEAT, BUTTON_PLAY },
+ { ACTION_KBD_ABORT, BUTTON_POWER|BUTTON_REL, BUTTON_POWER },
+
+ LAST_ITEM_IN_LIST
+}; /* button_context_keyboard */
+
+/** Pitchscreen **/
+static const struct button_mapping button_context_pitchscreen[] = {
+ { ACTION_PS_INC_SMALL, BUTTON_UP, BUTTON_NONE },
+ { ACTION_PS_INC_BIG, BUTTON_UP|BUTTON_REPEAT, BUTTON_NONE },
+ { ACTION_PS_DEC_SMALL, BUTTON_DOWN, BUTTON_NONE },
+ { ACTION_PS_DEC_BIG, BUTTON_DOWN|BUTTON_REPEAT, BUTTON_NONE },
+ { ACTION_PS_NUDGE_LEFT, BUTTON_PREV, BUTTON_NONE },
+ { ACTION_PS_NUDGE_LEFTOFF, BUTTON_PREV|BUTTON_REL, BUTTON_NONE },
+ { ACTION_PS_NUDGE_RIGHT, BUTTON_NEXT, BUTTON_NONE },
+ { ACTION_PS_NUDGE_RIGHTOFF, BUTTON_NEXT|BUTTON_REL, BUTTON_NONE },
+ { ACTION_PS_TOGGLE_MODE, BUTTON_PLAY|BUTTON_REL, BUTTON_NONE },
+ { ACTION_PS_RESET, BUTTON_POWER|BUTTON_REL, BUTTON_POWER },
+ { ACTION_PS_EXIT, BUTTON_HOME|BUTTON_REL, BUTTON_HOME },
+ { ACTION_PS_SLOWER, BUTTON_PREV|BUTTON_REPEAT, BUTTON_NONE },
+ { ACTION_PS_FASTER, BUTTON_NEXT|BUTTON_REPEAT, BUTTON_NONE },
+
+ LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_STD)
+}; /* button_context_pitchscreen */
+
+/** Quickscreen **/
+static const struct button_mapping button_context_quickscreen[] = {
+ { ACTION_QS_TOP, BUTTON_UP, BUTTON_NONE },
+ { ACTION_QS_TOP, BUTTON_UP|BUTTON_REPEAT, BUTTON_NONE },
+ { ACTION_QS_DOWN, BUTTON_DOWN, BUTTON_NONE },
+ { ACTION_QS_DOWN, BUTTON_DOWN|BUTTON_REPEAT, BUTTON_NONE },
+ { ACTION_QS_LEFT, BUTTON_PREV, BUTTON_NONE },
+ { ACTION_QS_LEFT, BUTTON_PREV|BUTTON_REPEAT, BUTTON_NONE },
+ { ACTION_QS_RIGHT, BUTTON_NEXT, BUTTON_NONE },
+ { ACTION_QS_RIGHT, BUTTON_NEXT|BUTTON_REPEAT, BUTTON_NONE },
+ { ACTION_STD_CANCEL, BUTTON_HOME|BUTTON_REL, BUTTON_HOME },
+
+ LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_STD)
+}; /* button_context_quickscreen */
+
+/** Settings - General Mappings **/
+static const struct button_mapping button_context_settings[] = {
+ { ACTION_SETTINGS_RESET, BUTTON_POWER|BUTTON_REL, BUTTON_POWER },
+ { ACTION_STD_PREV, BUTTON_PREV, BUTTON_NONE },
+ { ACTION_STD_PREVREPEAT, BUTTON_PREV|BUTTON_REPEAT, BUTTON_NONE },
+ { ACTION_STD_NEXT, BUTTON_NEXT, BUTTON_NONE },
+ { ACTION_STD_NEXTREPEAT, BUTTON_NEXT|BUTTON_REPEAT, BUTTON_NONE },
+ { ACTION_STD_OK, BUTTON_PLAY|BUTTON_REL, BUTTON_PLAY },
+ { ACTION_STD_CANCEL, BUTTON_HOME|BUTTON_REL, BUTTON_HOME },
+
+ LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_STD)
+}; /* button_context_settings */
+
+static const struct button_mapping button_context_settings_vol_is_inc[] = {
+ { ACTION_SETTINGS_INC, BUTTON_UP, BUTTON_NONE },
+ { ACTION_SETTINGS_INCREPEAT,BUTTON_UP|BUTTON_REPEAT, BUTTON_NONE },
+ { ACTION_SETTINGS_INC, BUTTON_VOL_UP, BUTTON_NONE },
+ { ACTION_SETTINGS_INCREPEAT,BUTTON_VOL_UP|BUTTON_REPEAT, BUTTON_NONE },
+ { ACTION_SETTINGS_DEC, BUTTON_DOWN, BUTTON_NONE },
+ { ACTION_SETTINGS_DECREPEAT,BUTTON_DOWN|BUTTON_REPEAT, BUTTON_NONE },
+ { ACTION_SETTINGS_DEC, BUTTON_VOL_DOWN, BUTTON_NONE },
+ { ACTION_SETTINGS_DECREPEAT,BUTTON_VOL_DOWN|BUTTON_REPEAT, BUTTON_NONE },
+
+ LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_STD)
+}; /* button_context_settings_right_is_inc */
+
+/** Tree **/
+static const struct button_mapping button_context_tree[] = {
+ { ACTION_TREE_WPS, BUTTON_OPTION|BUTTON_REL, BUTTON_OPTION },
+ { ACTION_TREE_HOTKEY, BUTTON_HOME|BUTTON_REPEAT, BUTTON_HOME },
+ { ACTION_STD_MENU, BUTTON_OPTION|BUTTON_REPEAT, BUTTON_OPTION },
+
+ LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_LIST)
+}; /* button_context_tree */
+
+/** Yes/No Screen **/
+static const struct button_mapping button_context_yesnoscreen[] = {
+ { ACTION_YESNO_ACCEPT, BUTTON_PLAY, BUTTON_NONE },
+
+ LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_STD)
+}; /* button_context_settings_yesnoscreen */
+
+/* get_context_mapping returns a pointer to one of the above defined arrays depending on the context */
+const struct button_mapping* get_context_mapping(int context)
+{
+ switch (context)
+ {
+ case CONTEXT_LIST:
+ return button_context_list;
+ case CONTEXT_STD:
+ return button_context_standard;
+ case CONTEXT_BOOKMARKSCREEN:
+ return button_context_bmark;
+ case CONTEXT_KEYBOARD:
+ return button_context_keyboard;
+ case CONTEXT_PITCHSCREEN:
+ return button_context_pitchscreen;
+ case CONTEXT_QUICKSCREEN:
+ return button_context_quickscreen;
+ case CONTEXT_SETTINGS:
+ return button_context_settings;
+ case CONTEXT_SETTINGS_TIME:
+ case CONTEXT_SETTINGS_COLOURCHOOSER:
+ case CONTEXT_SETTINGS_EQ:
+ case CONTEXT_SETTINGS_RECTRIGGER:
+ return button_context_settings_vol_is_inc;
+ case CONTEXT_TREE:
+ case CONTEXT_MAINMENU:
+ return button_context_tree;
+ case CONTEXT_WPS:
+ return button_context_wps;
+ case CONTEXT_YESNOSCREEN:
+ return button_context_yesnoscreen;
+ }
+ return button_context_standard;
+}
diff --git a/apps/plugins/battery_bench.c b/apps/plugins/battery_bench.c
index deee281..7d43cba 100644
--- a/apps/plugins/battery_bench.c
+++ b/apps/plugins/battery_bench.c
@@ -92,6 +92,7 @@
CONFIG_KEYPAD == XDUOO_X3II_PAD || \
CONFIG_KEYPAD == XDUOO_X20_PAD || \
CONFIG_KEYPAD == FIIO_M3K_PAD || \
+ CONFIG_KEYPAD == FIIO_M5_PAD || \
CONFIG_KEYPAD == EROSQ_PAD)
#define BATTERY_ON BUTTON_PLAY
diff --git a/apps/plugins/bitmaps/mono/SOURCES b/apps/plugins/bitmaps/mono/SOURCES
index e6a24b2..c99781c 100644
--- a/apps/plugins/bitmaps/mono/SOURCES
+++ b/apps/plugins/bitmaps/mono/SOURCES
@@ -19,7 +19,7 @@ bubbles_bubble.138x110x1.bmp
((LCD_WIDTH == 176) && (LCD_HEIGHT == 220))
bubbles_bubble.220x176x1.bmp
#elif ((LCD_WIDTH == 320) && (LCD_HEIGHT == 240)) || \
- ((LCD_WIDTH == 240) && (LCD_HEIGHT >= 320))
+ ((LCD_WIDTH == 240) && (LCD_HEIGHT >= 240))
bubbles_bubble.320x240x1.bmp
#elif ((LCD_WIDTH == 640) && (LCD_HEIGHT == 480)) || \
((LCD_WIDTH == 480) && (LCD_HEIGHT == 640))
diff --git a/apps/plugins/bitmaps/native/SOURCES b/apps/plugins/bitmaps/native/SOURCES
index 48eb18d..e72c630 100644
--- a/apps/plugins/bitmaps/native/SOURCES
+++ b/apps/plugins/bitmaps/native/SOURCES
@@ -453,7 +453,7 @@ jewels.160x128x16.bmp
jewels.220x176x16.bmp
#elif (LCD_WIDTH == 176) && (LCD_HEIGHT == 220)
jewels.220x176x16.bmp
-#elif (LCD_WIDTH == 240) && (LCD_HEIGHT >= 320)
+#elif (LCD_WIDTH == 240) && (LCD_HEIGHT >= 240)
jewels.320x240x16.bmp
#elif (LCD_WIDTH == 320) && (LCD_HEIGHT == 240)
jewels.320x240x16.bmp
@@ -550,6 +550,8 @@ rockblox_background.640x480x16.bmp
rockblox_background.320x240x16.bmp
#elif (LCD_WIDTH == 240) && (LCD_HEIGHT >= 320)
rockblox_background.240x320x16.bmp
+#elif (LCD_WIDTH == 240) && (LCD_HEIGHT == 240)
+rockblox_background.240x240x16.bmp
#elif (LCD_WIDTH == 220) && (LCD_HEIGHT == 176)
rockblox_background.220x176x16.bmp
#elif (LCD_WIDTH == 176) && (LCD_HEIGHT == 220)
@@ -838,7 +840,7 @@ sudoku_inverse.220x176x16.bmp
sudoku_start.320x240x16.bmp
sudoku_normal.320x240x16.bmp
sudoku_inverse.320x240x16.bmp
-#elif (LCD_WIDTH == 320) && (LCD_HEIGHT == 240) && (LCD_DEPTH >= 16)
+#elif (LCD_WIDTH >= 240) && (LCD_HEIGHT == 240) && (LCD_DEPTH >= 16)
sudoku_start.320x240x16.bmp
sudoku_normal.320x240x16.bmp
sudoku_inverse.320x240x16.bmp
@@ -873,7 +875,7 @@ superdom_boarditems.220x176x16.bmp
superdom_boarditems.176x132x16.bmp
#elif (LCD_WIDTH == 320 && LCD_HEIGHT == 240)
superdom_boarditems.320x240x16.bmp
-#elif ((LCD_WIDTH == 240) && (LCD_HEIGHT == 320)) || \
+#elif ((LCD_WIDTH == 240) && (LCD_HEIGHT >= 240)) || \
((LCD_WIDTH == 240) && (LCD_HEIGHT == 400))
superdom_boarditems.240x320x16.bmp
#elif (LCD_WIDTH == 480 && LCD_HEIGHT == 640)
diff --git a/apps/plugins/bitmaps/native/rockblox_background.240x240x16.bmp b/apps/plugins/bitmaps/native/rockblox_background.240x240x16.bmp
new file mode 100644
index 0000000..7e1706d
Binary files /dev/null and b/apps/plugins/bitmaps/native/rockblox_background.240x240x16.bmp differ
diff --git a/apps/plugins/blackjack.c b/apps/plugins/blackjack.c
index b5e58c5..bd9bd2e 100644
--- a/apps/plugins/blackjack.c
+++ b/apps/plugins/blackjack.c
@@ -559,7 +559,7 @@ enum {
#define BJACK_RIGHT BUTTON_NEXT
#define BJACK_LEFT BUTTON_PREV
-#elif CONFIG_KEYPAD == FIIO_M3K_PAD
+#elif CONFIG_KEYPAD == FIIO_M3K_PAD || (CONFIG_KEYPAD == FIIO_M5_PAD)
#define BJACK_SELECT_NAME "PLAY"
#define BJACK_STAY_NAME "NEXT"
#define BJACK_QUIT_NAME "POWER"
diff --git a/apps/plugins/brickmania.c b/apps/plugins/brickmania.c
index 4f4ffc8..af874d5 100644
--- a/apps/plugins/brickmania.c
+++ b/apps/plugins/brickmania.c
@@ -314,7 +314,7 @@ CONFIG_KEYPAD == SANSA_CONNECT_PAD
#define UP BUTTON_HOME
#define DOWN BUTTON_OPTION
-#elif CONFIG_KEYPAD == FIIO_M3K_PAD
+#elif CONFIG_KEYPAD == FIIO_M3K_PAD|| CONFIG_KEYPAD==FIIO_M5_PAD
#define QUIT BUTTON_POWER
#define LEFT BUTTON_PREV
#define RIGHT BUTTON_NEXT
diff --git a/apps/plugins/bubbles.c b/apps/plugins/bubbles.c
index 50de10f..80a9ddd 100644
--- a/apps/plugins/bubbles.c
+++ b/apps/plugins/bubbles.c
@@ -125,6 +125,10 @@ enum {
#define XOFS 72
#define MAX_FPS 40
+#elif (LCD_HEIGHT == 240) && (LCD_WIDTH == 240)
+#define XOFS 64
+#define MAX_FPS 30
+
/* 22x22 bubbles (Gigabeat, Onda VX747) */
#elif ((LCD_HEIGHT == 320) || (LCD_HEIGHT == 400)) && (LCD_WIDTH == 240)
#define XOFS 64
diff --git a/apps/plugins/calculator.c b/apps/plugins/calculator.c
index 77f79f9..0bb45d6 100644
--- a/apps/plugins/calculator.c
+++ b/apps/plugins/calculator.c
@@ -515,6 +515,16 @@ F3: equal to "="
#define CALCULATOR_CALC (BUTTON_PLAY|BUTTON_REPEAT)
#define CALCULATOR_CLEAR (BUTTON_POWER|BUTTON_REPEAT)
+#elif CONFIG_KEYPAD == FIIO_M5_PAD
+#define CALCULATOR_LEFT BUTTON_LEFT
+#define CALCULATOR_RIGHT BUTTON_RIGHT
+#define CALCULATOR_UP BUTTON_UP
+#define CALCULATOR_DOWN BUTTON_DOWN
+#define CALCULATOR_QUIT BUTTON_POWER
+#define CALCULATOR_INPUT BUTTON_PLAY
+#define CALCULATOR_CALC BUTTON_HOME
+#define CALCULATOR_CLEAR (BUTTON_OPTION|BUTTON_REPEAT)
+
#elif CONFIG_KEYPAD == IHIFI_770_PAD || CONFIG_KEYPAD == IHIFI_800_PAD
#define CALCULATOR_LEFT BUTTON_HOME
#define CALCULATOR_RIGHT BUTTON_VOL_DOWN
diff --git a/apps/plugins/calendar.c b/apps/plugins/calendar.c
index 59aba94..f0b5345 100644
--- a/apps/plugins/calendar.c
+++ b/apps/plugins/calendar.c
@@ -401,6 +401,16 @@
#define CALENDAR_NEXT_MONTH BUTTON_VOL_UP
#define CALENDAR_PREV_MONTH BUTTON_VOL_DOWN
+#elif CONFIG_KEYPAD==FIIO_M5_PAD
+#define CALENDAR_QUIT BUTTON_POWER
+#define CALENDAR_SELECT BUTTON_PLAY
+#define CALENDAR_NEXT_WEEK BUTTON_DOWN
+#define CALENDAR_PREV_WEEK BUTTON_UP
+#define CALENDAR_NEXT_DAY BUTTON_RIGHT
+#define CALENDAR_PREV_DAY BUTTON_LEFT
+#define CALENDAR_NEXT_MONTH BUTTON_NEXT
+#define CALENDAR_PREV_MONTH BUTTON_PREV
+
#elif CONFIG_KEYPAD == IHIFI_770_PAD || CONFIG_KEYPAD == IHIFI_800_PAD
#define CALENDAR_QUIT BUTTON_POWER
#define CALENDAR_SELECT BUTTON_PLAY
diff --git a/apps/plugins/chessbox/chessbox_pgn.h b/apps/plugins/chessbox/chessbox_pgn.h
index e9b6678..3c292c7 100644
--- a/apps/plugins/chessbox/chessbox_pgn.h
+++ b/apps/plugins/chessbox/chessbox_pgn.h
@@ -553,6 +553,20 @@
#define CB_SCROLL_LEFT (BUTTON_PREV|BUTTON_REPEAT)
#define CB_SCROLL_RIGHT (BUTTON_NEXT|BUTTON_REPEAT)
+#elif CONFIG_KEYPAD == FIIO_M5_PAD
+#define CB_SELECT BUTTON_PLAY
+#define CB_UP BUTTON_UP
+#define CB_DOWN BUTTON_DOWN
+#define CB_LEFT BUTTON_LEFT
+#define CB_RIGHT BUTTON_RIGHT
+#define CB_PLAY BUTTON_NEXT
+#define CB_MENU BUTTON_OPTION
+#define CB_LEVEL BUTTON_HOME
+#define CB_SCROLL_UP (BUTTON_UP|BUTTON_REPEAT)
+#define CB_SCROLL_DOWN (BUTTON_DOWN|BUTTON_REPEAT)
+#define CB_SCROLL_LEFT (BUTTON_LEFT|BUTTON_REPEAT)
+#define CB_SCROLL_RIGHT (BUTTON_RIGHT|BUTTON_REPEAT)
+
#elif CONFIG_KEYPAD == IHIFI_770_PAD || CONFIG_KEYPAD == IHIFI_800_PAD
#define CB_SELECT BUTTON_PLAY
#define CB_UP BUTTON_PREV
diff --git a/apps/plugins/chessclock.c b/apps/plugins/chessclock.c
index 27b3990..6e405f4 100644
--- a/apps/plugins/chessclock.c
+++ b/apps/plugins/chessclock.c
@@ -376,7 +376,7 @@
#define CHC_SETTINGS_OK BUTTON_PLAY
#define CHC_SETTINGS_CANCEL BUTTON_POWER
-#elif CONFIG_KEYPAD == FIIO_M3K_PAD
+#elif CONFIG_KEYPAD == FIIO_M3K_PAD || CONFIG_KEYPAD == FIIO_M5_PAD
#define CHC_QUIT BUTTON_POWER
#define CHC_STARTSTOP BUTTON_PLAY
#define CHC_RESET BUTTON_OPTION
diff --git a/apps/plugins/chip8.c b/apps/plugins/chip8.c
index 84e8e70..5fc9a6b 100644
--- a/apps/plugins/chip8.c
+++ b/apps/plugins/chip8.c
@@ -1259,7 +1259,7 @@ CONFIG_KEYPAD == MROBE500_PAD
#define CHIP8_KEY6 BUTTON_NEXT
#define CHIP8_KEY8 BUTTON_OPTION
-#elif CONFIG_KEYPAD == FIIO_M3K_PAD
+#elif CONFIG_KEYPAD == FIIO_M3K_PAD || (CONFIG_KEYPAD == FIIO_M5_PAD)
#define CHIP8_OFF BUTTON_POWER
#define CHIP8_KEY2 BUTTON_HOME
#define CHIP8_KEY4 BUTTON_PREV
diff --git a/apps/plugins/chopper.c b/apps/plugins/chopper.c
index 35c80a9..ca56f87 100644
--- a/apps/plugins/chopper.c
+++ b/apps/plugins/chopper.c
@@ -198,7 +198,7 @@ CONFIG_KEYPAD == MROBE500_PAD
#define ACTION BUTTON_SELECT
#define ACTIONTEXT "Select"
-#elif CONFIG_KEYPAD == XDUOO_X3_PAD || CONFIG_KEYPAD == XDUOO_X3II_PAD || CONFIG_KEYPAD == XDUOO_X20_PAD || CONFIG_KEYPAD == FIIO_M3K_PAD || CONFIG_KEYPAD == IHIFI_770_PAD || CONFIG_KEYPAD == IHIFI_800_PAD || CONFIG_KEYPAD == EROSQ_PAD
+#elif CONFIG_KEYPAD == XDUOO_X3_PAD || CONFIG_KEYPAD == XDUOO_X3II_PAD || CONFIG_KEYPAD == XDUOO_X20_PAD || CONFIG_KEYPAD == FIIO_M3K_PAD || CONFIG_KEYPAD == IHIFI_770_PAD || CONFIG_KEYPAD == IHIFI_800_PAD || CONFIG_KEYPAD == EROSQ_PAD || (CONFIG_KEYPAD == FIIO_M5_PAD)
#define QUIT BUTTON_POWER
#define ACTION BUTTON_PLAY
#define ACTIONTEXT "PLAY"
diff --git a/apps/plugins/clix.c b/apps/plugins/clix.c
index 08264e8..3a5241e 100644
--- a/apps/plugins/clix.c
+++ b/apps/plugins/clix.c
@@ -300,6 +300,14 @@
#define CLIX_BUTTON_RIGHT BUTTON_NEXT
#define CLIX_BUTTON_CLICK BUTTON_PLAY
+#elif CONFIG_KEYPAD == FIIO_M5_PAD
+#define CLIX_BUTTON_QUIT BUTTON_POWER
+#define CLIX_BUTTON_UP BUTTON_UP
+#define CLIX_BUTTON_DOWN BUTTON_DOWN
+#define CLIX_BUTTON_LEFT BUTTON_LEFT
+#define CLIX_BUTTON_RIGHT BUTTON_RIGHT
+#define CLIX_BUTTON_CLICK BUTTON_PLAY
+
#elif CONFIG_KEYPAD == IHIFI_770_PAD || CONFIG_KEYPAD == IHIFI_800_PAD
#define CLIX_BUTTON_QUIT BUTTON_POWER
#define CLIX_BUTTON_UP BUTTON_PREV
diff --git a/apps/plugins/cube.c b/apps/plugins/cube.c
index 416bf11..65eab59 100644
--- a/apps/plugins/cube.c
+++ b/apps/plugins/cube.c
@@ -380,7 +380,7 @@
#define CUBE_PAUSE BUTTON_HOME
#define CUBE_HIGHSPEED BUTTON_PLAY
-#elif (CONFIG_KEYPAD == FIIO_M3K_PAD)
+#elif (CONFIG_KEYPAD == FIIO_M3K_PAD) || CONFIG_KEYPAD == FIIO_M5_PAD
#define CUBE_QUIT BUTTON_POWER
#define CUBE_NEXT BUTTON_NEXT
#define CUBE_PREV BUTTON_PREV
diff --git a/apps/plugins/doom/i_video.c b/apps/plugins/doom/i_video.c
index 1fb913f..6e4f89d 100644
--- a/apps/plugins/doom/i_video.c
+++ b/apps/plugins/doom/i_video.c
@@ -588,6 +588,17 @@ void I_ShutdownGraphics(void)
#define DOOMBUTTON_ENTER BUTTON_PLAY
#define DOOMBUTTON_WEAPON BUTTON_VOL_UP
+#elif CONFIG_KEYPAD == FIIO_M5_PAD
+#define DOOMBUTTON_UP BUTTON_UP
+#define DOOMBUTTON_DOWN BUTTON_DOWN
+#define DOOMBUTTON_LEFT BUTTON_LEFT
+#define DOOMBUTTON_RIGHT BUTTON_RIGHT
+#define DOOMBUTTON_SHOOT BUTTON_PLAY
+#define DOOMBUTTON_OPEN BUTTON_OPTION
+#define DOOMBUTTON_ESC BUTTON_HOME
+#define DOOMBUTTON_ENTER BUTTON_PLAY
+#define DOOMBUTTON_WEAPON BUTTON_VOL_UP
+
#elif CONFIG_KEYPAD == IHIFI_770_PAD || CONFIG_KEYPAD == IHIFI_800_PAD
#define DOOMBUTTON_UP BUTTON_PREV
#define DOOMBUTTON_DOWN BUTTON_NEXT
diff --git a/apps/plugins/fft/fft.c b/apps/plugins/fft/fft.c
index 4719446..f8f8027 100644
--- a/apps/plugins/fft/fft.c
+++ b/apps/plugins/fft/fft.c
@@ -343,9 +343,9 @@ GREY_INFO_STRUCT
# define FFT_AMP_SCALE BUTTON_PLAY
# define FFT_QUIT BUTTON_POWER
-#elif (CONFIG_KEYPAD == FIIO_M3K_PAD)
-# define FFT_PREV_GRAPH BUTTON_PREV
-# define FFT_NEXT_GRAPH BUTTON_NEXT
+#elif (CONFIG_KEYPAD == FIIO_M3K_PAD) || (CONFIG_KEYPAD == FIIO_M5_PAD)
+# define FFT_PREV_GRAPH BUTTON_NEXT
+# define FFT_NEXT_GRAPH BUTTON_PREV
# define FFT_ORIENTATION BUTTON_HOME
# define FFT_FREQ_SCALE BUTTON_OPTION
# define FFT_WINDOW (BUTTON_HOME|BUTTON_POWER)
diff --git a/apps/plugins/flipit.c b/apps/plugins/flipit.c
index a4d59ff..f185df4 100644
--- a/apps/plugins/flipit.c
+++ b/apps/plugins/flipit.c
@@ -448,7 +448,7 @@
#define FLIPIT_STEP_BY_STEP (BUTTON_HOME | BUTTON_PLAY)
#define FLIPIT_TOGGLE BUTTON_PLAY
-#elif CONFIG_KEYPAD == FIIO_M3K_PAD
+#elif CONFIG_KEYPAD == FIIO_M3K_PAD || CONFIG_KEYPAD==FIIO_M5_PAD
#define FLIPIT_LEFT BUTTON_PREV
#define FLIPIT_RIGHT BUTTON_NEXT
diff --git a/apps/plugins/fractals/fractal.h b/apps/plugins/fractals/fractal.h
index d4d0135..87c65ba 100644
--- a/apps/plugins/fractals/fractal.h
+++ b/apps/plugins/fractals/fractal.h
@@ -482,6 +482,18 @@
#define FRACTAL_PRECISION_DEC (BUTTON_PLAY | BUTTON_PREV)
#define FRACTAL_RESET (BUTTON_HOME | BUTTON_POWER)
+#elif CONFIG_KEYPAD == FIIO_M5_PAD
+#define FRACTAL_QUIT BUTTON_POWER
+#define FRACTAL_UP BUTTON_UP
+#define FRACTAL_DOWN BUTTON_DOWN
+#define FRACTAL_LEFT BUTTON_LEFT
+#define FRACTAL_RIGHT BUTTON_RIGHT
+#define FRACTAL_ZOOM_IN BUTTON_VOL_UP
+#define FRACTAL_ZOOM_OUT BUTTON_VOL_DOWN
+#define FRACTAL_PRECISION_INC BUTTON_NEXT
+#define FRACTAL_PRECISION_DEC BUTTON_PREV
+#define FRACTAL_RESET BUTTON_PLAY
+
#elif CONFIG_KEYPAD == IHIFI_770_PAD || CONFIG_KEYPAD == IHIFI_800_PAD
#define FRACTAL_QUIT BUTTON_POWER
#define FRACTAL_UP BUTTON_PREV
diff --git a/apps/plugins/goban/goban.h b/apps/plugins/goban/goban.h
index db70216..ee68390 100644
--- a/apps/plugins/goban/goban.h
+++ b/apps/plugins/goban/goban.h
@@ -467,6 +467,18 @@
#define GBN_BUTTON_CONTEXT BUTTON_PLAY | BUTTON_REPEAT
#define GBN_BUTTON_NEXT_VAR BUTTON_HOME | BUTTON_POWER
+#elif (CONFIG_KEYPAD == FIIO_M5_PAD)
+#define GBN_BUTTON_UP BUTTON_UP
+#define GBN_BUTTON_DOWN BUTTON_DOWN
+#define GBN_BUTTON_LEFT BUTTON_LEFT
+#define GBN_BUTTON_RIGHT BUTTON_RIGHT
+#define GBN_BUTTON_RETREAT BUTTON_VOL_DOWN
+#define GBN_BUTTON_ADVANCE BUTTON_VOL_UP
+#define GBN_BUTTON_MENU BUTTON_OPTION
+#define GBN_BUTTON_PLAY BUTTON_PLAY
+#define GBN_BUTTON_CONTEXT BUTTON_OPTION | BUTTON_REPEAT
+#define GBN_BUTTON_NEXT_VAR BUTTON_HOME
+
#elif (CONFIG_KEYPAD == IHIFI_770_PAD) || (CONFIG_KEYPAD == IHIFI_800_PAD)
#define GBN_BUTTON_UP BUTTON_PREV
diff --git a/apps/plugins/imageviewer/imageviewer_button.h b/apps/plugins/imageviewer/imageviewer_button.h
index 4559a7b..223db15 100644
--- a/apps/plugins/imageviewer/imageviewer_button.h
+++ b/apps/plugins/imageviewer/imageviewer_button.h
@@ -506,6 +506,21 @@
#define IMGVIEW_MENU BUTTON_POWER
#define IMGVIEW_SLIDE_SHOW (BUTTON_HOME|BUTTON_POWER)
+#elif CONFIG_KEYPAD == FIIO_M5_PAD
+#define IMGVIEW_ZOOM_PRE BUTTON_HOME
+#define IMGVIEW_ZOOM_IN BUTTON_VOL_UP | BUTTON_REPEAT
+#define IMGVIEW_ZOOM_OUT BUTTON_VOL_DOWN | BUTTON_REPEAT
+#define IMGVIEW_UP BUTTON_UP
+#define IMGVIEW_DOWN BUTTON_DOWN
+#define IMGVIEW_LEFT BUTTON_LEFT
+#define IMGVIEW_RIGHT BUTTON_RIGHT
+#define IMGVIEW_NEXT BUTTON_NEXT
+#define IMGVIEW_NEXT_REPEAT (BUTTON_NEXT|BUTTON_REPEAT)
+#define IMGVIEW_PREVIOUS BUTTON_PREV
+#define IMGVIEW_PREVIOUS_REPEAT (BUTTON_PREV|BUTTON_REPEAT)
+#define IMGVIEW_MENU BUTTON_OPTION
+#define IMGVIEW_SLIDE_SHOW BUTTON_PLAY
+
#elif CONFIG_KEYPAD == IHIFI_770_PAD || CONFIG_KEYPAD == IHIFI_800_PAD
#define IMGVIEW_ZOOM_PRE BUTTON_PLAY
#define IMGVIEW_ZOOM_IN (BUTTON_PLAY | BUTTON_REL)
diff --git a/apps/plugins/invadrox.c b/apps/plugins/invadrox.c
index 57d6fab..bb828a5 100644
--- a/apps/plugins/invadrox.c
+++ b/apps/plugins/invadrox.c
@@ -282,6 +282,13 @@ CONFIG_KEYPAD == MROBE500_PAD
#define RIGHT BUTTON_VOL_DOWN
#define FIRE BUTTON_VOL_UP
+#elif CONFIG_KEYPAD == FIIO_M5_PAD
+
+#define QUIT BUTTON_POWER
+#define LEFT BUTTON_LEFT
+#define RIGHT BUTTON_RIGHT
+#define FIRE BUTTON_PLAY
+
#elif CONFIG_KEYPAD == IHIFI_770_PAD || CONFIG_KEYPAD == IHIFI_800_PAD
#define QUIT BUTTON_POWER
@@ -571,7 +578,7 @@ CONFIG_KEYPAD == MROBE500_PAD
#define MAX_Y 18
-#elif (LCD_WIDTH == 240) && ((LCD_HEIGHT == 320) || (LCD_HEIGHT == 400))
+#elif (LCD_WIDTH == 240) && ((LCD_HEIGHT == 240) || (LCD_HEIGHT == 320) || (LCD_HEIGHT == 400))
/* Gigabeat: 240x320x16
* ======================
diff --git a/apps/plugins/jewels.c b/apps/plugins/jewels.c
index b58c47d..611402f 100644
--- a/apps/plugins/jewels.c
+++ b/apps/plugins/jewels.c
@@ -367,6 +367,18 @@ CONFIG_KEYPAD == MROBE500_PAD
#define HK_SELECT "PLAY"
#define HK_CANCEL "POWER"
+#elif CONFIG_KEYPAD == FIIO_M5_PAD
+#define JEWELS_UP BUTTON_UP
+#define JEWELS_DOWN BUTTON_DOWN
+#define JEWELS_LEFT BUTTON_LEFT
+#define JEWELS_RIGHT BUTTON_RIGHT
+#define JEWELS_SELECT BUTTON_PLAY
+#define JEWELS_CANCEL BUTTON_POWER
+#define HK_SELECT "PLAY"
+#define HK_CANCEL "POWER"
+
+
+
#elif CONFIG_KEYPAD == IHIFI_770_PAD || CONFIG_KEYPAD == IHIFI_800_PAD
#define JEWELS_UP BUTTON_PREV
#define JEWELS_DOWN BUTTON_NEXT
diff --git a/apps/plugins/lib/keymaps.h b/apps/plugins/lib/keymaps.h
index 7c1b998..b19f174 100644
--- a/apps/plugins/lib/keymaps.h
+++ b/apps/plugins/lib/keymaps.h
@@ -61,6 +61,7 @@
(CONFIG_KEYPAD == IRIVER_H300_PAD) || \
(CONFIG_KEYPAD == HM801_PAD) || \
(CONFIG_KEYPAD == HM60X_PAD) || \
+ (CONFIG_KEYPAD == FIIO_M5_PAD) || \
(CONFIG_KEYPAD == AGPTEK_ROCKER_PAD)
#define BTN_UP BUTTON_UP
#define BTN_DOWN BUTTON_DOWN
@@ -89,6 +90,11 @@
#define BTN_PAUSE BUTTON_POWER
#endif
+#if (CONFIG_KEYPAD == FIIO_M5_PAD)
+#define BTN_FIRE BUTTON_PLAY
+#define BTN_PAUSE BUTTON_POWER
+#endif
+
#if (CONFIG_KEYPAD == HM60X_PAD)
#define BTN_FIRE BUTTON_POWER
#define BTN_PAUSE BUTTON_SELECT
@@ -231,6 +237,10 @@
#define BTN_FIRE BUTTON_PLAY
#define BTN_PAUSE BUTTON_POWER
+#elif (CONFIG_KEYPAD == FIIO_M5_PAD)
+#define BTN_FIRE BUTTON_PLAY
+#define BTN_PAUSE BUTTON_POWER
+
#elif (CONFIG_KEYPAD == EROSQ_PAD)
#define BTN_UP BUTTON_PREV
#define BTN_DOWN BUTTON_NEXT
diff --git a/apps/plugins/lib/pluginlib_actions.c b/apps/plugins/lib/pluginlib_actions.c
index 4d2a08c..d20f808 100644
--- a/apps/plugins/lib/pluginlib_actions.c
+++ b/apps/plugins/lib/pluginlib_actions.c
@@ -242,6 +242,15 @@ const struct button_mapping pla_main_ctx[] =
{ PLA_DOWN_REPEAT, BUTTON_OPTION|BUTTON_REPEAT, BUTTON_NONE },
{ PLA_LEFT_REPEAT, BUTTON_PREV|BUTTON_REPEAT, BUTTON_NONE },
{ PLA_RIGHT_REPEAT, BUTTON_NEXT|BUTTON_REPEAT, BUTTON_NONE },
+#elif (CONFIG_KEYPAD == FIIO_M5_PAD)
+ { PLA_UP, BUTTON_UP, BUTTON_NONE },
+ { PLA_DOWN, BUTTON_DOWN, BUTTON_NONE },
+ { PLA_LEFT, BUTTON_LEFT, BUTTON_NONE },
+ { PLA_RIGHT, BUTTON_RIGHT, BUTTON_NONE },
+ { PLA_UP_REPEAT, BUTTON_UP|BUTTON_REPEAT, BUTTON_NONE },
+ { PLA_DOWN_REPEAT, BUTTON_DOWN|BUTTON_REPEAT, BUTTON_NONE },
+ { PLA_LEFT_REPEAT, BUTTON_LEFT|BUTTON_REPEAT, BUTTON_NONE },
+ { PLA_RIGHT_REPEAT, BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_NONE },
#elif (CONFIG_KEYPAD == EROSQ_PAD)
{ PLA_UP, BUTTON_NEXT, BUTTON_NONE },
{ PLA_DOWN, BUTTON_PREV, BUTTON_NONE },
@@ -488,6 +497,12 @@ const struct button_mapping pla_main_ctx[] =
{PLA_SELECT, BUTTON_PLAY, BUTTON_NONE},
{PLA_SELECT_REL, BUTTON_PLAY|BUTTON_REL, BUTTON_PLAY},
{PLA_SELECT_REPEAT, BUTTON_PLAY|BUTTON_REPEAT, BUTTON_NONE},
+#elif (CONFIG_KEYPAD == FIIO_M5_PAD)
+ {PLA_CANCEL, BUTTON_POWER|BUTTON_REL, BUTTON_POWER},
+ {PLA_EXIT, BUTTON_POWER|BUTTON_REPEAT, BUTTON_NONE},
+ {PLA_SELECT, BUTTON_PLAY, BUTTON_NONE},
+ {PLA_SELECT_REL, BUTTON_PLAY|BUTTON_REL, BUTTON_PLAY},
+ {PLA_SELECT_REPEAT, BUTTON_PLAY|BUTTON_REPEAT, BUTTON_NONE},
#elif (CONFIG_KEYPAD == EROSQ_PAD)
{PLA_CANCEL, BUTTON_BACK|BUTTON_REL, BUTTON_BACK},
{PLA_EXIT, BUTTON_POWER, BUTTON_NONE},
diff --git a/apps/plugins/midi/midiplay.c b/apps/plugins/midi/midiplay.c
index 641991c..3a5e29e 100644
--- a/apps/plugins/midi/midiplay.c
+++ b/apps/plugins/midi/midiplay.c
@@ -301,7 +301,7 @@
#define MIDI_VOL_DOWN BUTTON_VOL_DOWN
#define MIDI_PLAYPAUSE BUTTON_PLAY
-#elif CONFIG_KEYPAD == FIIO_M3K_PAD
+#elif CONFIG_KEYPAD == FIIO_M3K_PAD || CONFIG_KEYPAD == FIIO_M5_PAD
#define MIDI_QUIT BUTTON_POWER
#define MIDI_FFWD BUTTON_NEXT
#define MIDI_REWIND BUTTON_PREV
diff --git a/apps/plugins/minesweeper.c b/apps/plugins/minesweeper.c
index 11c0e86..6f00fcc 100644
--- a/apps/plugins/minesweeper.c
+++ b/apps/plugins/minesweeper.c
@@ -408,6 +408,19 @@ CONFIG_KEYPAD == MROBE500_PAD
# define MINESWP_DISCOVER2 BUTTON_VOL_UP
# define MINESWP_INFO (BUTTON_PLAY | BUTTON_OPTION)
+#elif (CONFIG_KEYPAD == FIIO_M5_PAD)
+# define MINESWP_LEFT BUTTON_LEFT
+# define MINESWP_RIGHT BUTTON_RIGHT
+# define MINESWP_UP BUTTON_UP
+# define MINESWP_DOWN BUTTON_DOWN
+# define MINESWP_QUIT BUTTON_POWER
+# define MINESWP_TOGGLE_PRE BUTTON_PLAY
+# define MINESWP_TOGGLE (BUTTON_PLAY | BUTTON_REL)
+# define MINESWP_TOGGLE2 BUTTON_VOL_DOWN
+# define MINESWP_DISCOVER (BUTTON_PLAY | BUTTON_REPEAT)
+# define MINESWP_DISCOVER2 BUTTON_VOL_UP
+# define MINESWP_INFO (BUTTON_PLAY | BUTTON_OPTION)
+
#elif (CONFIG_KEYPAD == IHIFI_770_PAD) || (CONFIG_KEYPAD == IHIFI_800_PAD)
# define MINESWP_LEFT BUTTON_HOME
# define MINESWP_RIGHT BUTTON_VOL_DOWN
diff --git a/apps/plugins/mp3_encoder.c b/apps/plugins/mp3_encoder.c
index 1778355..6a6d8a8 100644
--- a/apps/plugins/mp3_encoder.c
+++ b/apps/plugins/mp3_encoder.c
@@ -2562,7 +2562,7 @@ CONFIG_KEYPAD == MROBE500_PAD
#define MP3ENC_DONE BUTTON_POWER
#define MP3ENC_SELECT BUTTON_PLAY
-#elif CONFIG_KEYPAD == FIIO_M3K_PAD
+#elif CONFIG_KEYPAD == FIIO_M3K_PAD || CONFIG_KEYPAD==FIIO_M5_PAD
#define MP3ENC_PREV BUTTON_HOME
#define MP3ENC_NEXT BUTTON_OPTION
#define MP3ENC_DONE BUTTON_POWER
diff --git a/apps/plugins/mpegplayer/mpeg_settings.c b/apps/plugins/mpegplayer/mpeg_settings.c
index 1bc7d4d..834d6b5 100644
--- a/apps/plugins/mpegplayer/mpeg_settings.c
+++ b/apps/plugins/mpegplayer/mpeg_settings.c
@@ -336,6 +336,16 @@ struct mpeg_settings settings;
#define MPEG_START_TIME_RIGHT2 BUTTON_VOL_DOWN
#define MPEG_START_TIME_EXIT BUTTON_POWER
+#elif CONFIG_KEYPAD == FIIO_M5_PAD
+#define MPEG_START_TIME_SELECT BUTTON_PLAY
+#define MPEG_START_TIME_LEFT BUTTON_LEFT
+#define MPEG_START_TIME_RIGHT BUTTON_RIGHT
+#define MPEG_START_TIME_UP BUTTON_UP
+#define MPEG_START_TIME_DOWN BUTTON_DOWN
+#define MPEG_START_TIME_LEFT2 BUTTON_PREV
+#define MPEG_START_TIME_RIGHT2 BUTTON_NEXT
+#define MPEG_START_TIME_EXIT BUTTON_POWER
+
#elif CONFIG_KEYPAD == IHIFI_770_PAD || CONFIG_KEYPAD == IHIFI_800_PAD
#define MPEG_START_TIME_SELECT BUTTON_PLAY
#define MPEG_START_TIME_LEFT BUTTON_HOME
diff --git a/apps/plugins/mpegplayer/mpegplayer.c b/apps/plugins/mpegplayer/mpegplayer.c
index f86a6e5..3996237 100644
--- a/apps/plugins/mpegplayer/mpegplayer.c
+++ b/apps/plugins/mpegplayer/mpegplayer.c
@@ -459,7 +459,7 @@ CONFIG_KEYPAD == SANSA_M200_PAD
#define MPEG_RW BUTTON_PREV
#define MPEG_FF BUTTON_NEXT
-#elif CONFIG_KEYPAD == FIIO_M3K_PAD
+#elif CONFIG_KEYPAD == FIIO_M3K_PAD || CONFIG_KEYPAD == FIIO_M5_PAD
#define MPEG_MENU BUTTON_PLAY
#define MPEG_STOP BUTTON_POWER
#define MPEG_PAUSE BUTTON_HOME
diff --git a/apps/plugins/oscilloscope.c b/apps/plugins/oscilloscope.c
index d8bef0a..b14c27a 100644
--- a/apps/plugins/oscilloscope.c
+++ b/apps/plugins/oscilloscope.c
@@ -498,7 +498,7 @@
#define OSCILLOSCOPE_VOL_DOWN BUTTON_VOL_DOWN
#define NEED_LASTBUTTON
-#elif (CONFIG_KEYPAD == FIIO_M3K_PAD)
+#elif (CONFIG_KEYPAD == FIIO_M3K_PAD) || (CONFIG_KEYPAD == FIIO_M5_PAD)
#define OSCILLOSCOPE_QUIT BUTTON_POWER
#define OSCILLOSCOPE_DRAWMODE_PRE BUTTON_PLAY
#define OSCILLOSCOPE_DRAWMODE (BUTTON_PLAY | BUTTON_REL)
diff --git a/apps/plugins/pacbox/pacbox.h b/apps/plugins/pacbox/pacbox.h
index 39583ed..51a49ed 100644
--- a/apps/plugins/pacbox/pacbox.h
+++ b/apps/plugins/pacbox/pacbox.h
@@ -382,6 +382,15 @@
#define PACMAN_1UP BUTTON_VOL_UP
#define PACMAN_COIN BUTTON_PLAY
+#elif CONFIG_KEYPAD == FIIO_M5_PAD
+#define PACMAN_UP BUTTON_UP
+#define PACMAN_DOWN BUTTON_DOWN
+#define PACMAN_LEFT BUTTON_LEFT
+#define PACMAN_RIGHT BUTTON_RIGHT
+#define PACMAN_MENU BUTTON_OPTION
+#define PACMAN_1UP BUTTON_NEXT
+#define PACMAN_COIN BUTTON_PLAY
+
#elif CONFIG_KEYPAD == IHIFI_770_PAD || CONFIG_KEYPAD == IHIFI_800_PAD
#define PACMAN_UP BUTTON_PREV
diff --git a/apps/plugins/pegbox.c b/apps/plugins/pegbox.c
index a84b687..3fbe8d5 100644
--- a/apps/plugins/pegbox.c
+++ b/apps/plugins/pegbox.c
@@ -660,6 +660,23 @@ CONFIG_KEYPAD == MROBE500_PAD
#define LVL_UP_TEXT "VOL+"
#define LVL_DOWN_TEXT "VOL-"
+#elif CONFIG_KEYPAD == FIIO_M5_PAD
+#define PEGBOX_SELECT BUTTON_PLAY
+#define PEGBOX_QUIT BUTTON_POWER
+#define PEGBOX_RESTART (BUTTON_POWER | BUTTON_HOME)
+#define PEGBOX_LVL_UP BUTTON_VOL_UP
+#define PEGBOX_LVL_DOWN BUTTON_VOL_DOWN
+#define PEGBOX_UP BUTTON_UP
+#define PEGBOX_DOWN BUTTON_DOWN
+#define PEGBOX_RIGHT BUTTON_LEFT
+#define PEGBOX_LEFT BUTTON_RIGHT
+
+#define SELECT_TEXT "PLAY"
+#define QUIT_TEXT "POWER"
+#define RESTART_TEXT "HOME"
+#define LVL_UP_TEXT "VOL+"
+#define LVL_DOWN_TEXT "VOL-"
+
#elif CONFIG_KEYPAD == IHIFI_770_PAD || CONFIG_KEYPAD == IHIFI_800_PAD
#define PEGBOX_SELECT BUTTON_PLAY
#define PEGBOX_QUIT BUTTON_POWER
diff --git a/apps/plugins/pong.c b/apps/plugins/pong.c
index d5952aa..be94601 100644
--- a/apps/plugins/pong.c
+++ b/apps/plugins/pong.c
@@ -309,6 +309,14 @@ CONFIG_KEYPAD == MROBE500_PAD
#define PONG_RIGHT_UP BUTTON_HOME
#define PONG_RIGHT_DOWN BUTTON_NEXT
+#elif CONFIG_KEYPAD == FIIO_M5_PAD
+#define PONG_QUIT BUTTON_POWER
+#define PONG_PAUSE BUTTON_PLAY
+#define PONG_LEFT_UP BUTTON_OPTION
+#define PONG_LEFT_DOWN BUTTON_PREV
+#define PONG_RIGHT_UP BUTTON_HOME
+#define PONG_RIGHT_DOWN BUTTON_NEXT
+
#elif CONFIG_KEYPAD == IHIFI_770_PAD || CONFIG_KEYPAD == IHIFI_800_PAD
#define PONG_QUIT BUTTON_POWER
#define PONG_PAUSE BUTTON_PREV
diff --git a/apps/plugins/reversi/reversi-gui.h b/apps/plugins/reversi/reversi-gui.h
index 0a2348a..f527f8a 100644
--- a/apps/plugins/reversi/reversi-gui.h
+++ b/apps/plugins/reversi/reversi-gui.h
@@ -341,6 +341,15 @@
#define REVERSI_BUTTON_MENU BUTTON_PLAY
#define REVERSI_BUTTON_MENU_LONGPRESS
+#elif CONFIG_KEYPAD == FIIO_M5_PAD
+#define REVERSI_BUTTON_QUIT BUTTON_POWER
+#define REVERSI_BUTTON_UP BUTTON_UP
+#define REVERSI_BUTTON_DOWN BUTTON_DOWN
+#define REVERSI_BUTTON_LEFT BUTTON_LEFT
+#define REVERSI_BUTTON_RIGHT BUTTON_RIGHT
+#define REVERSI_BUTTON_MAKE_MOVE BUTTON_PLAY
+#define REVERSI_BUTTON_MENU BUTTON_OPTION
+
#elif CONFIG_KEYPAD == IHIFI_770_PAD || CONFIG_KEYPAD == IHIFI_800_PAD
#define REVERSI_BUTTON_QUIT BUTTON_POWER
#define REVERSI_BUTTON_UP BUTTON_PREV
diff --git a/apps/plugins/rockblox.c b/apps/plugins/rockblox.c
index 6a8b50a..1a2ece3 100644
--- a/apps/plugins/rockblox.c
+++ b/apps/plugins/rockblox.c
@@ -443,7 +443,7 @@
#define ROCKBLOX_DROP (BUTTON_PLAY|BUTTON_REL)
#define ROCKBLOX_RESTART (BUTTON_PLAY|BUTTON_REPEAT)
-#elif CONFIG_KEYPAD == FIIO_M3K_PAD
+#elif CONFIG_KEYPAD == FIIO_M3K_PAD || CONFIG_KEYPAD == FIIO_M5_PAD
#define ROCKBLOX_OFF BUTTON_POWER
#define ROCKBLOX_ROTATE_CCW BUTTON_HOME
@@ -546,7 +546,7 @@
#define LEVEL_Y 142
#define LINES_Y 218
-#elif (LCD_WIDTH == 320) && (LCD_HEIGHT == 240)
+#elif ((LCD_WIDTH == 320) || (LCD_WIDTH==240))&& (LCD_HEIGHT == 240)
#define BLOCK_WIDTH 12
#define BLOCK_HEIGHT 12
diff --git a/apps/plugins/rockboy/rockboy.c b/apps/plugins/rockboy/rockboy.c
index 75de523..7e6c987 100644
--- a/apps/plugins/rockboy/rockboy.c
+++ b/apps/plugins/rockboy/rockboy.c
@@ -445,6 +445,18 @@ static void setoptions (void)
options.SELECT = BUTTON_VOL_UP;
options.MENU = BUTTON_POWER;
+#elif CONFIG_KEYPAD == FIIO_M5_PAD
+ options.UP = BUTTON_UP;
+ options.DOWN = BUTTON_DOWN;
+ options.LEFT = BUTTON_LEFT;
+ options.RIGHT = BUTTON_RIGHT;
+
+ options.START = BUTTON_HOME;
+ options.MENU = BUTTON_OPTION;
+ options.SELECT = BUTTON_PLAY;
+ options.A = BUTTON_NEXT;
+ options.B = BUTTON_PREV;
+
#elif CONFIG_KEYPAD == IHIFI_770_PAD || CONFIG_KEYPAD == IHIFI_800_PAD
options.UP = BUTTON_PREV;
options.DOWN = BUTTON_NEXT;
diff --git a/apps/plugins/rockpaint.c b/apps/plugins/rockpaint.c
index f28fbdf..800df96 100644
--- a/apps/plugins/rockpaint.c
+++ b/apps/plugins/rockpaint.c
@@ -34,6 +34,7 @@
#include "pluginbitmaps/rockpaint.h"
#include "pluginbitmaps/rockpaint_hsvrgb.h"
+#include "lib/pluginlib_actions.h"
/***********************************************************************
@@ -360,16 +361,16 @@
#define ROCKPAINT_LEFT BUTTON_PREV
#define ROCKPAINT_RIGHT BUTTON_NEXT
-#elif CONFIG_KEYPAD == FIIO_M3K_PAD
+#elif CONFIG_KEYPAD == FIIO_M3K_PAD || CONFIG_KEYPAD==FIIO_M5_PAD
#define ROCKPAINT_QUIT BUTTON_POWER
#define ROCKPAINT_DRAW BUTTON_PLAY
#define ROCKPAINT_MENU (BUTTON_HOME | BUTTON_POWER)
#define ROCKPAINT_TOOLBAR BUTTON_VOL_UP
#define ROCKPAINT_TOOLBAR2 BUTTON_VOL_DOWN
-#define ROCKPAINT_UP BUTTON_HOME
-#define ROCKPAINT_DOWN BUTTON_OPTION
-#define ROCKPAINT_LEFT BUTTON_PREV
-#define ROCKPAINT_RIGHT BUTTON_NEXT
+#define ROCKPAINT_UP PLA_UP
+#define ROCKPAINT_DOWN PLA_DOWN
+#define ROCKPAINT_LEFT PLA_LEFT
+#define ROCKPAINT_RIGHT PLA_RIGHT
#elif CONFIG_KEYPAD == IHIFI_770_PAD
#define ROCKPAINT_QUIT BUTTON_POWER
diff --git a/apps/plugins/sliding_puzzle.c b/apps/plugins/sliding_puzzle.c
index 8c70f6b..dcf1b34 100644
--- a/apps/plugins/sliding_puzzle.c
+++ b/apps/plugins/sliding_puzzle.c
@@ -330,6 +330,15 @@ CONFIG_KEYPAD == MROBE500_PAD
#define PUZZLE_SHUFFLE (BUTTON_HOME | BUTTON_POWER)
#define PUZZLE_PICTURE BUTTON_PLAY
+#elif (CONFIG_KEYPAD == FIIO_M5_PAD)
+#define PUZZLE_QUIT BUTTON_POWER
+#define PUZZLE_LEFT BUTTON_LEFT
+#define PUZZLE_RIGHT BUTTON_RIGHT
+#define PUZZLE_UP BUTTON_UP
+#define PUZZLE_DOWN BUTTON_DOWN
+#define PUZZLE_SHUFFLE BUTTON_OPTION
+#define PUZZLE_PICTURE BUTTON_PLAY
+
#elif (CONFIG_KEYPAD == IHIFI_770_PAD) || (CONFIG_KEYPAD == IHIFI_800_PAD)
#define PUZZLE_QUIT BUTTON_POWER
#define PUZZLE_LEFT BUTTON_HOME
diff --git a/apps/plugins/snake.c b/apps/plugins/snake.c
index 0f2bcdc..3479243 100644
--- a/apps/plugins/snake.c
+++ b/apps/plugins/snake.c
@@ -289,6 +289,14 @@ dir is the current direction of the snake - 0=up, 1=right, 2=down, 3=left;
#define SNAKE_DOWN BUTTON_OPTION
#define SNAKE_PLAYPAUSE BUTTON_PLAY
+#elif CONFIG_KEYPAD == FIIO_M5_PAD
+#define SNAKE_QUIT BUTTON_POWER
+#define SNAKE_LEFT BUTTON_LEFT
+#define SNAKE_RIGHT BUTTON_RIGHT
+#define SNAKE_UP BUTTON_UP
+#define SNAKE_DOWN BUTTON_DOWN
+#define SNAKE_PLAYPAUSE BUTTON_PLAY
+
#elif CONFIG_KEYPAD == IHIFI_770_PAD || CONFIG_KEYPAD == IHIFI_800_PAD
#define SNAKE_QUIT BUTTON_POWER
#define SNAKE_LEFT BUTTON_HOME
diff --git a/apps/plugins/snake2.c b/apps/plugins/snake2.c
index 464af41..625d6e5 100644
--- a/apps/plugins/snake2.c
+++ b/apps/plugins/snake2.c
@@ -419,6 +419,15 @@ CONFIG_KEYPAD == MROBE500_PAD
#define SNAKE2_PLAYPAUSE BUTTON_PLAY
#define SNAKE2_PLAYPAUSE_TEXT "PLAY"
+#elif (CONFIG_KEYPAD == FIIO_M5_PAD)
+#define SNAKE2_LEFT BUTTON_LEFT
+#define SNAKE2_RIGHT BUTTON_RIGHT
+#define SNAKE2_UP BUTTON_UP
+#define SNAKE2_DOWN BUTTON_DOWN
+#define SNAKE2_QUIT BUTTON_POWER
+#define SNAKE2_PLAYPAUSE BUTTON_PLAY
+#define SNAKE2_PLAYPAUSE_TEXT "PLAY"
+
#elif (CONFIG_KEYPAD == IHIFI_770_PAD) || (CONFIG_KEYPAD == IHIFI_800_PAD)
#define SNAKE2_LEFT BUTTON_HOME
#define SNAKE2_RIGHT BUTTON_VOL_DOWN
diff --git a/apps/plugins/sokoban.c b/apps/plugins/sokoban.c
index e779722..368e7c2 100644
--- a/apps/plugins/sokoban.c
+++ b/apps/plugins/sokoban.c
@@ -663,6 +663,22 @@
#define BUTTON_SAVE BUTTON_PLAY
#define BUTTON_SAVE_NAME "PLAY"
+#elif CONFIG_KEYPAD == FIIO_M5_PAD
+#define SOKOBAN_LEFT BUTTON_LEFT
+#define SOKOBAN_RIGHT BUTTON_RIGHT
+#define SOKOBAN_UP BUTTON_UP
+#define SOKOBAN_DOWN BUTTON_DOWN
+#define SOKOBAN_MENU BUTTON_POWER
+#define SOKOBAN_UNDO_PRE BUTTON_PLAY
+#define SOKOBAN_UNDO (BUTTON_PLAY | BUTTON_REL)
+#define SOKOBAN_REDO (BUTTON_POWER | BUTTON_PLAY)
+#define SOKOBAN_LEVEL_DOWN BUTTON_VOL_DOWN
+#define SOKOBAN_LEVEL_REPEAT (BUTTON_PLAY | BUTTON_NEXT)
+#define SOKOBAN_LEVEL_UP BUTTON_VOL_UP
+#define SOKOBAN_PAUSE BUTTON_PLAY
+#define BUTTON_SAVE BUTTON_PLAY
+#define BUTTON_SAVE_NAME "PLAY"
+
#elif CONFIG_KEYPAD == IHIFI_770_PAD || CONFIG_KEYPAD == IHIFI_800_PAD
#define SOKOBAN_LEFT BUTTON_HOME
#define SOKOBAN_RIGHT BUTTON_VOL_DOWN
diff --git a/apps/plugins/solitaire.c b/apps/plugins/solitaire.c
index 6c49666..e0c507d 100644
--- a/apps/plugins/solitaire.c
+++ b/apps/plugins/solitaire.c
@@ -684,6 +684,25 @@ CONFIG_KEYPAD == MROBE500_PAD
# define HK_CUR2STACK "DBL PLAY"
# define HK_REM2STACK "NEXT"
+#elif CONFIG_KEYPAD == FIIO_M5_PAD
+# define SOL_QUIT BUTTON_POWER
+# define SOL_UP BUTTON_UP
+# define SOL_DOWN BUTTON_DOWN
+# define SOL_LEFT BUTTON_LEFT
+# define SOL_RIGHT BUTTON_RIGHT
+# define SOL_MOVE_PRE BUTTON_PLAY
+# define SOL_MOVE (BUTTON_PLAY | BUTTON_REL)
+# define SOL_DRAW (BUTTON_POWER | BUTTON_REPEAT)
+# define SOL_REM2CUR BUTTON_VOL_DOWN
+# define SOL_CUR2STACK_PRE BUTTON_PLAY
+# define SOL_CUR2STACK (BUTTON_PLAY | BUTTON_REPEAT)
+# define SOL_REM2STACK BUTTON_VOL_UP
+# define HK_MOVE "PLAY"
+# define HK_DRAW "DBL HOME"
+# define HK_REM2CUR "PREV"
+# define HK_CUR2STACK "DBL PLAY"
+# define HK_REM2STACK "NEXT"
+
#elif CONFIG_KEYPAD == IHIFI_770_PAD || CONFIG_KEYPAD == IHIFI_800_PAD
# define SOL_QUIT BUTTON_POWER
# define SOL_UP BUTTON_PREV
diff --git a/apps/plugins/spacerocks.c b/apps/plugins/spacerocks.c
index 6781612..6facda0 100644
--- a/apps/plugins/spacerocks.c
+++ b/apps/plugins/spacerocks.c
@@ -336,7 +336,7 @@
#define AST_RIGHT BUTTON_NEXT
#define AST_FIRE BUTTON_PLAY
-#elif (CONFIG_KEYPAD == FIIO_M3K_PAD)
+#elif (CONFIG_KEYPAD == FIIO_M3K_PAD) || (CONFIG_KEYPAD == FIIO_M5_PAD)
#define AST_PAUSE BUTTON_VOL_UP
#define AST_QUIT BUTTON_POWER
#define AST_THRUST BUTTON_HOME
diff --git a/apps/plugins/star.c b/apps/plugins/star.c
index e44c867..7404741 100644
--- a/apps/plugins/star.c
+++ b/apps/plugins/star.c
@@ -620,6 +620,22 @@
#define STAR_LEVEL_DOWN_NAME "PLAY + PREV"
#define STAR_LEVEL_REPEAT_NAME "PLAY + OPTION"
+#elif CONFIG_KEYPAD == FIIO_M5_PAD
+#define STAR_QUIT BUTTON_POWER
+#define STAR_LEFT BUTTON_LEFT
+#define STAR_RIGHT BUTTON_RIGHT
+#define STAR_UP BUTTON_UP
+#define STAR_DOWN BUTTON_DOWN
+#define STAR_TOGGLE_CONTROL BUTTON_PLAY
+#define STAR_LEVEL_UP (BUTTON_NEXT)
+#define STAR_LEVEL_DOWN (BUTTON_PREV)
+#define STAR_LEVEL_REPEAT (BUTTON_OPTION)
+#define STAR_TOGGLE_CONTROL_NAME "PLAY"
+#define STAR_QUIT_NAME "POWER"
+#define STAR_LEVEL_UP_NAME "PLAY + NEXT"
+#define STAR_LEVEL_DOWN_NAME "PLAY + PREV"
+#define STAR_LEVEL_REPEAT_NAME "PLAY + OPTION"
+
#elif CONFIG_KEYPAD == IHIFI_770_PAD || CONFIG_KEYPAD == IHIFI_800_PAD
#define STAR_QUIT BUTTON_POWER
#define STAR_LEFT BUTTON_HOME
diff --git a/apps/plugins/stopwatch.c b/apps/plugins/stopwatch.c
index db9cfd5..bd5eb9d 100644
--- a/apps/plugins/stopwatch.c
+++ b/apps/plugins/stopwatch.c
@@ -285,7 +285,7 @@
#define STOPWATCH_SCROLL_UP BUTTON_HOME
#define STOPWATCH_SCROLL_DOWN BUTTON_OPTION
-#elif CONFIG_KEYPAD == FIIO_M3K_PAD
+#elif CONFIG_KEYPAD == FIIO_M3K_PAD || CONFIG_KEYPAD == FIIO_M5_PAD
#define STOPWATCH_QUIT BUTTON_POWER
#define STOPWATCH_START_STOP BUTTON_NEXT
#define STOPWATCH_RESET_TIMER BUTTON_PREV
diff --git a/apps/plugins/sudoku/sudoku.c b/apps/plugins/sudoku/sudoku.c
index 34a1f6d..7438d69 100644
--- a/apps/plugins/sudoku/sudoku.c
+++ b/apps/plugins/sudoku/sudoku.c
@@ -141,7 +141,7 @@ static const char default_game[9][9] =
#define MARK_SPACE 1 /* Pixels between two marks */
#define MARK_SIZE 4 /* Mark width and height */
-#elif (LCD_HEIGHT==240) && (LCD_WIDTH==320)
+#elif (LCD_HEIGHT==240) && (LCD_WIDTH>=240)
/* iPod Video - 320x240, 9 cells @ 24x24 with 14 border lines */
#define MARK_OFFS 1 /* Pixels between border and mark */
#define MARK_SPACE 2 /* Pixels between two marks */
diff --git a/apps/plugins/sudoku/sudoku.h b/apps/plugins/sudoku/sudoku.h
index 36f47a3..36f2224 100644
--- a/apps/plugins/sudoku/sudoku.h
+++ b/apps/plugins/sudoku/sudoku.h
@@ -432,6 +432,19 @@
#define SUDOKU_BUTTON_MENU (BUTTON_POWER | BUTTON_REL)
#define SUDOKU_BUTTON_POSSIBLE (BUTTON_HOME | BUTTON_POWER)
+#elif CONFIG_KEYPAD == FIIO_M5_PAD
+#define SUDOKU_BUTTON_QUIT_PRE BUTTON_POWER
+#define SUDOKU_BUTTON_QUIT (BUTTON_POWER | BUTTON_REPEAT)
+#define SUDOKU_BUTTON_UP BUTTON_UP
+#define SUDOKU_BUTTON_DOWN BUTTON_DOWN
+#define SUDOKU_BUTTON_LEFT BUTTON_LEFT
+#define SUDOKU_BUTTON_RIGHT BUTTON_RIGHT
+#define SUDOKU_BUTTON_TOGGLEBACK BUTTON_NEXT
+#define SUDOKU_BUTTON_TOGGLE BUTTON_PREV
+#define SUDOKU_BUTTON_MENU_PRE BUTTON_OPTION
+#define SUDOKU_BUTTON_MENU (BUTTON_OPTION | BUTTON_REPEAT)
+#define SUDOKU_BUTTON_POSSIBLE BUTTON_HOME
+
#elif CONFIG_KEYPAD == IHIFI_770_PAD || CONFIG_KEYPAD == IHIFI_800_PAD
#define SUDOKU_BUTTON_QUIT_PRE BUTTON_POWER
#define SUDOKU_BUTTON_QUIT (BUTTON_POWER | BUTTON_REPEAT)
diff --git a/apps/plugins/text_viewer/tv_button.h b/apps/plugins/text_viewer/tv_button.h
index cf3a2b7..4493d2f 100644
--- a/apps/plugins/text_viewer/tv_button.h
+++ b/apps/plugins/text_viewer/tv_button.h
@@ -545,6 +545,18 @@
#define TV_LINE_DOWN BUTTON_OPTION
#define TV_BOOKMARK (BUTTON_OPTION | BUTTON_PLAY)
+#elif CONFIG_KEYPAD == FIIO_M5_PAD
+#define TV_QUIT BUTTON_POWER
+#define TV_SCROLL_UP BUTTON_HOME
+#define TV_SCROLL_DOWN BUTTON_NEXT
+#define TV_SCREEN_LEFT BUTTON_LEFT
+#define TV_SCREEN_RIGHT BUTTON_RIGHT
+#define TV_MENU BUTTON_OPTION
+#define TV_AUTOSCROLL BUTTON_PLAY
+#define TV_LINE_UP BUTTON_UP
+#define TV_LINE_DOWN BUTTON_DOWN
+#define TV_BOOKMARK BUTTON_PREV
+
#elif CONFIG_KEYPAD == EROSQ_PAD
#define TV_MENU BUTTON_MENU
#define TV_SCROLL_UP BUTTON_SCROLL_BACK
diff --git a/apps/plugins/vu_meter.c b/apps/plugins/vu_meter.c
index 80e1960..d6953a1 100644
--- a/apps/plugins/vu_meter.c
+++ b/apps/plugins/vu_meter.c
@@ -408,7 +408,7 @@
#define LABEL_MENU "PLAY"
#define LABEL_VOLUME "VOL UP/DN"
-#elif (CONFIG_KEYPAD == FIIO_M3K_PAD)
+#elif (CONFIG_KEYPAD == FIIO_M3K_PAD) || (CONFIG_KEYPAD == FIIO_M5_PAD)
#define VUMETER_QUIT BUTTON_POWER
#define VUMETER_HELP BUTTON_HOME
#define VUMETER_MENU BUTTON_PLAY
diff --git a/apps/plugins/wormlet.c b/apps/plugins/wormlet.c
index e4286f3..190cfbe 100644
--- a/apps/plugins/wormlet.c
+++ b/apps/plugins/wormlet.c
@@ -380,6 +380,15 @@ CONFIG_KEYPAD == MROBE500_PAD
#define BTN_QUIT BUTTON_POWER
#define BTN_STOPRESET (BUTTON_HOME | BUTTON_POWER)
+#elif CONFIG_KEYPAD == FIIO_M5_PAD
+#define BTN_DIR_UP BUTTON_UP
+#define BTN_DIR_DOWN BUTTON_DOWN
+#define BTN_DIR_LEFT BUTTON_LEFT
+#define BTN_DIR_RIGHT BUTTON_RIGHT
+#define BTN_STARTPAUSE BUTTON_PLAY
+#define BTN_QUIT BUTTON_POWER
+#define BTN_STOPRESET BUTTON_HOME
+
#elif CONFIG_KEYPAD == IHIFI_770_PAD || CONFIG_KEYPAD == IHIFI_800_PAD
#define BTN_DIR_UP BUTTON_PREV
#define BTN_DIR_DOWN BUTTON_NEXT
@@ -482,8 +491,8 @@ CONFIG_KEYPAD == MROBE500_PAD
#define ARGH_SIZE 6
#define SPEED 4
#define MAX_WORM_SEGMENTS 512
-#elif ((LCD_WIDTH == 320) && (LCD_HEIGHT == 240)) || \
- ((LCD_WIDTH == 240) && ((LCD_HEIGHT == 320) || (LCD_HEIGHT == 400)))
+#elif ((LCD_WIDTH >= 240) && (LCD_HEIGHT == 240)) || \
+ ((LCD_WIDTH == 240) && ((LCD_HEIGHT >= 240) || (LCD_HEIGHT == 400)))
#define FOOD_SIZE 7
#define ARGH_SIZE 8
#define SPEED 4
diff --git a/apps/plugins/xobox.c b/apps/plugins/xobox.c
index 55a1dc4..d46a112 100644
--- a/apps/plugins/xobox.c
+++ b/apps/plugins/xobox.c
@@ -324,7 +324,7 @@ CONFIG_KEYPAD == MROBE500_PAD
#define DOWN BUTTON_OPTION
#define PAUSE BUTTON_PLAY
-#elif CONFIG_KEYPAD == FIIO_M3K_PAD
+#elif CONFIG_KEYPAD == FIIO_M3K_PAD
#define QUIT BUTTON_POWER
#define LEFT BUTTON_PREV
@@ -333,6 +333,15 @@ CONFIG_KEYPAD == MROBE500_PAD
#define DOWN BUTTON_OPTION
#define PAUSE BUTTON_PLAY
+#elif CONFIG_KEYPAD==FIIO_M5_PAD
+
+#define QUIT BUTTON_POWER
+#define LEFT BUTTON_LEFT
+#define RIGHT BUTTON_RIGHT
+#define UP BUTTON_UP
+#define DOWN BUTTON_DOWN
+#define PAUSE BUTTON_PLAY
+
#elif CONFIG_KEYPAD == IHIFI_770_PAD || CONFIG_KEYPAD == IHIFI_800_PAD
#define QUIT BUTTON_POWER
diff --git a/apps/plugins/zxbox/keymaps.h b/apps/plugins/zxbox/keymaps.h
index 6c0fac6..0267360 100644
--- a/apps/plugins/zxbox/keymaps.h
+++ b/apps/plugins/zxbox/keymaps.h
@@ -282,6 +282,14 @@
#define ZX_UP BUTTON_HOME
#define ZX_DOWN BUTTON_OPTION
+#elif CONFIG_KEYPAD == FIIO_M5_PAD
+#define ZX_SELECT BUTTON_PLAY
+#define ZX_MENU BUTTON_OPTION
+#define ZX_LEFT BUTTON_LEFT
+#define ZX_RIGHT BUTTON_RIGHT
+#define ZX_UP BUTTON_UP
+#define ZX_DOWN BUTTON_DOWN
+
#elif CONFIG_KEYPAD == IHIFI_770_PAD || CONFIG_KEYPAD == IHIFI_800_PAD
#define ZX_SELECT BUTTON_PLAY
#define ZX_MENU BUTTON_POWER
diff --git a/apps/plugins/zxbox/zxbox_keyb.c b/apps/plugins/zxbox/zxbox_keyb.c
index f77ce53..6137c7b 100644
--- a/apps/plugins/zxbox/zxbox_keyb.c
+++ b/apps/plugins/zxbox/zxbox_keyb.c
@@ -275,6 +275,14 @@
#define KBD_UP BUTTON_HOME
#define KBD_DOWN BUTTON_OPTION
+#elif (CONFIG_KEYPAD==FIIO_M5_PAD)
+#define KBD_SELECT BUTTON_PLAY
+#define KBD_ABORT BUTTON_POWER
+#define KBD_LEFT BUTTON_LEFT
+#define KBD_RIGHT BUTTON_RIGHT
+#define KBD_UP BUTTON_UP
+#define KBD_DOWN BUTTON_DOWN
+
#elif CONFIG_KEYPAD == IHIFI_770_PAD || CONFIG_KEYPAD == IHIFI_800_PAD
#define KBD_SELECT BUTTON_PLAY
diff --git a/bootloader/SOURCES b/bootloader/SOURCES
index 849ed17..ee62ff3 100644
--- a/bootloader/SOURCES
+++ b/bootloader/SOURCES
@@ -76,7 +76,7 @@ show_logo.c
mpio_hd200_hd300.c
#elif defined(SONY_NWZ_LINUX)
nwz_linux.c
-#elif defined(HIBY_LINUX) || defined(FIIO_M3K)
+#elif defined(HIBY_LINUX) || defined(FIIO_M3K) || defined(FIIO_M5)
rocker_linux.c
#elif defined(RK27_GENERIC) || defined(HM60X) || defined(HM801) \
|| defined(MA9) || defined(MA9C) || defined(MA8) || defined(MA8C) \
diff --git a/bootloader/rocker_linux.c b/bootloader/rocker_linux.c
index fc633d5..f2ece73 100644
--- a/bootloader/rocker_linux.c
+++ b/bootloader/rocker_linux.c
@@ -78,7 +78,16 @@
#define ICON_NAME bm_fiioicon
#define BUTTON_LEFT BUTTON_PREV
#define BUTTON_RIGHT BUTTON_NEXT
-#define BUTTON_SELECT BUTTON_PLAY
+#define BUTTON_SELECT BUTTON_PLAY
+#define OF_NAME "FIIO PLAYER"
+#include "bitmaps/fiioicon.h"
+#elif defined(FIIO_M5)
+#define ICON_WIDTH 130
+#define ICON_HEIGHT 130
+#define ICON_NAME bm_fiioicon
+#define BUTTON_LEFT BUTTON_VOL_DOWN
+#define BUTTON_RIGHT BUTTON_VOL_UP
+#define BUTTON_SELECT BUTTON_POWER
#define OF_NAME "FIIO PLAYER"
#include "bitmaps/fiioicon.h"
#elif defined(EROS_Q)
@@ -474,6 +483,18 @@ static void adb(int start)
lcd_putsf(0, 1, "ADB not supported!");
sleep(2*HZ);
(void)start;
+#elif defined(FIIO_M5)
+ if (start){
+ system("start-stop-daemon -b -S -m -q -p /var/run/klogd.pid --exec /sbin/adbd");
+ system("echo 0 > /sys/devices/virtual/android_usb/android0/enable");
+ system("echo mtp,mass_storage,adb > /sys/devices/virtual/android_usb/android0/functions");
+ system("echo 1 > /sys/devices/virtual/android_usb/android0/enable");
+ }
+ else{
+ if (system("start-stop-daemon -K -q -p /var/run/klogd.pid"))
+ system("killall adbd");
+ }
+ adb_running = start;
#else
pid_t pid = fork();
if(pid == 0)
@@ -624,6 +645,10 @@ int main(int argc, char **argv)
/* boot OF */
#if defined(FIIO_M3K)
execvp("/usr/project/bin/player_daemon", argv);
+#elif defined(FIIO_M5)
+ /* touch screen wont work with execvp */
+ /* Return error code here and let startup script handle */
+ return 1;
#else
execvp("/usr/bin/hiby_player", argv);
#endif
@@ -638,6 +663,16 @@ int main(int argc, char **argv)
{
fflush(stdout);
mount_storage(true);
+
+#ifdef FIIO_M5
+/* Need to load sound driver manually */
+ system("insmod /lib/modules/3.10.14/kernel/sound/soc/ingenic/snd-soc-phoenix-icdc.ko");
+ system("insmod /lib/modules/3.10.14/kernel/sound/soc/ingenic/snd-asoc-icdc-d3.ko");
+ system("insmod /lib/modules/3.10.14/kernel/sound/soc/ingenic/snd-asoc-aic-v12.ko");
+ system("insmod /lib/modules/3.10.14/kernel/sound/soc/ingenic/snd-asoc-dma-v13.ko");
+ system("insmod /lib/modules/3.10.14/kernel/sound/soc/ingenic/snd-asoc-i2s-v13.ko");
+#endif
+
system("/bin/cp " BASE_DIR "/.rockbox/" BOOTFILE " /tmp");
system("/bin/chmod +x /tmp/" BOOTFILE);
execl("/tmp/" BOOTFILE, BOOTFILE, NULL);
diff --git a/firmware/SOURCES b/firmware/SOURCES
index 7f08e48..dfd3d5c 100644
--- a/firmware/SOURCES
+++ b/firmware/SOURCES
@@ -115,7 +115,7 @@ target/hosted/sonynwz/nvp-nwz.c
target/hosted/sonynwz/nwz-db.c
#endif
-#if ((defined(HIBY_LINUX) || defined(FIIO_M3K)) && !defined(SIMULATOR))
+#if ((defined(HIBY_LINUX) || defined(FIIO_M3K) || defined(FIIO_M5)) && !defined(SIMULATOR))
drivers/lcd-memframe.c
target/hosted/alsa-controls.c
target/hosted/pcm-alsa.c
@@ -147,7 +147,7 @@ target/hosted/xduoo/powermgmt-xduoo.c
target/hosted/usb-hiby.c
#endif
-#if (defined(FIIO_M3K)) && !defined(SIMULATOR)
+#if defined(FIIO_M3K) && !defined(SIMULATOR)
target/hosted/fiio/buttonlight-fiio.c
target/hosted/fiio/button-fiio.c
target/hosted/fiio/debug-fiio.c
@@ -157,6 +157,15 @@ target/hosted/fiio/system-fiio.c
target/hosted/fiio/usb-fiio.c
#endif
+#if defined(FIIO_M5) && !defined(SIMULATOR)
+target/hosted/fiio/button-fiiom5.c
+target/hosted/fiio/debug-fiio.c
+target/hosted/fiio/power-fiio.c
+target/hosted/fiio/powermgmt-fiio.c
+target/hosted/fiio/system-fiio.c
+target/hosted/usb-hiby.c
+#endif
+
#if (defined(EROS_Q)) && !defined(SIMULATOR)
target/hosted/aigo/button-erosq.c
target/hosted/aigo/debug-erosq.c
diff --git a/firmware/asm/SOURCES b/firmware/asm/SOURCES
index 2b18ea2..f946577 100644
--- a/firmware/asm/SOURCES
+++ b/firmware/asm/SOURCES
@@ -16,7 +16,7 @@ mempcpy.c
defined(COWON_D2) || defined(MINI2440) || defined(SAMSUNG_YPR0) || \
defined(SAMSUNG_YPR1) || defined(DX50) || defined(DX90) || (defined(MROBE_500) && !defined(LCD_USE_DMA)) || \
defined(CREATIVE_ZEN) || defined(CREATIVE_ZENXFI) || defined(SONY_NWZ_LINUX) || defined(HIBY_LINUX) || \
- defined(FIIO_M3K)) && \
+ defined(FIIO_M3K) || defined(FIIO_M5)) && \
!defined(SIMULATOR)
#if LCD_DEPTH >= 24
lcd-as-memframe-24bit.c
diff --git a/firmware/drivers/audio/fiiolinux_codec.c b/firmware/drivers/audio/fiiolinux_codec.c
index d23e023..4db277c 100644
--- a/firmware/drivers/audio/fiiolinux_codec.c
+++ b/firmware/drivers/audio/fiiolinux_codec.c
@@ -38,19 +38,25 @@ static int ak_hw = -1;
static int vol_sw[2] = {0};
static long int vol_hw[2] = {0};
+#ifdef FIIO_M3K
+#define AK_HW "/dev/ak4376"
+#elif defined(FIIO_M5)
+#define AK_HW "/dev/ak4377"
+#endif
+
static void hw_open(void)
{
fd_hw = open("/dev/snd/controlC0", O_RDWR);
if(fd_hw < 0)
panicf("Cannot open '/dev/snd/controlC0'");
- ak_hw = open("/dev/ak4376", O_RDWR);
+ ak_hw = open(AK_HW, O_RDWR);
if(ak_hw < 0)
- panicf("Cannot open '/dev/ak4376'");
+ panicf("Cannot open '"AK_HW"'");
if(ioctl(ak_hw, 0x20003424, 0) < 0)
{
- panicf("Call cmd AK4376_POWER_ON fail");
+ panicf("Call cmd AK437x_POWER_ON fail");
}
}
@@ -58,7 +64,7 @@ static void hw_close(void)
{
if(ioctl(ak_hw, 0x20003425, 0) < 0)
{
- panicf("Call cmd AK4376_POWER_OFF fail");
+ panicf("Call cmd AK437x_POWER_OFF fail");
}
close(ak_hw);
close(fd_hw);
diff --git a/firmware/export/config.h b/firmware/export/config.h
index 7e8d751..b9e533f 100644
--- a/firmware/export/config.h
+++ b/firmware/export/config.h
@@ -163,6 +163,8 @@
#define XDUOO_X20_PAD 70
#define FIIO_M3K_PAD 71
#define EROSQ_PAD 72
+#define FIIO_M5_PAD 73
+
/* CONFIG_REMOTE_KEYPAD */
#define H100_REMOTE 1
@@ -603,6 +605,8 @@ Lyre prototype 1 */
#include "config/xduoox20.h"
#elif defined(FIIO_M3K)
#include "config/fiiom3k.h"
+#elif defined(FIIO_M5)
+#include "config/fiiom5.h"
#elif defined(EROS_Q)
#include "config/aigoerosq.h"
#else
diff --git a/firmware/export/config/fiiom5.h b/firmware/export/config/fiiom5.h
new file mode 100644
index 0000000..d362f68
--- /dev/null
+++ b/firmware/export/config/fiiom5.h
@@ -0,0 +1,130 @@
+/*
+ * This config file is for the FiiO M3K
+ */
+
+/* For Rolo and boot loader */
+#define MODEL_NUMBER 127
+
+#define MODEL_NAME "FiiO M5"
+
+/* LCD dimensions */
+#define LCD_WIDTH 240
+#define LCD_HEIGHT 240
+/* sqrt(240^2 + 240^2) / 1.5 = 226 */
+#define LCD_DPI 226
+
+#ifndef SIMULATOR
+#define CONFIG_PLATFORM (PLATFORM_HOSTED)
+#define PIVOT_ROOT "/mnt/sd_0"
+#endif
+
+#define HAVE_FPU
+
+#define HW_SAMPR_CAPS (SAMPR_CAP_44 | SAMPR_CAP_48 | SAMPR_CAP_88 | SAMPR_CAP_96 | SAMPR_CAP_176 | SAMPR_CAP_192)
+
+/* define this if you have a bitmap LCD display */
+#define HAVE_LCD_BITMAP
+
+/* define this if you have a colour LCD */
+#define HAVE_LCD_COLOR
+
+/* define this if you want album art for this target */
+#define HAVE_ALBUMART
+
+/* define this to enable bitmap scaling */
+#define HAVE_BMP_SCALING
+
+/* define this to enable JPEG decoding */
+#define HAVE_JPEG
+
+/* define this if you have access to the quickscreen */
+#define HAVE_QUICKSCREEN
+
+/* define this if you would like tagcache to build on this target */
+#define HAVE_TAGCACHE
+
+#define LCD_DEPTH 16
+/* Check that but should not matter */
+#define LCD_PIXELFORMAT RGB565
+
+#define HAVE_BACKLIGHT
+#define HAVE_BACKLIGHT_BRIGHTNESS
+
+/* Main LCD backlight brightness range and defaults: the backlight driver
+ * has levels from 0 to 32. But 0 is off so start at 1.
+ */
+#define MIN_BRIGHTNESS_SETTING 1
+#define MAX_BRIGHTNESS_SETTING 255
+#define BRIGHTNESS_STEP 5
+#define DEFAULT_BRIGHTNESS_SETTING 70
+
+/* Which backlight fading type? */
+#define CONFIG_BACKLIGHT_FADING BACKLIGHT_FADING_SW_SETTING
+
+/* define this if you have a real-time clock */
+#define CONFIG_RTC APPLICATION
+
+/* The number of bytes reserved for loadable codecs */
+#define CODEC_SIZE 0x80000
+
+/* The number of bytes reserved for loadable plugins */
+#define PLUGIN_BUFFER_SIZE 0x100000
+
+#define HAVE_HEADPHONE_DETECTION
+
+/* KeyPad configuration for plugins */
+//STAN: FIX later
+#define CONFIG_KEYPAD FIIO_M5_PAD
+
+/* Define this if a programmable hotkey is mapped */
+#define HAVE_HOTKEY
+
+/* define this if the target has volume keys which can be used in the lists */
+#define HAVE_VOLUME_IN_LIST
+
+#ifndef SIMULATOR
+/* We have usb power and can detect usb but it is handled by Linux */
+#define HAVE_USB_POWER
+
+#endif
+
+#define CONFIG_BATTERY_MEASURE VOLTAGE_MEASURE
+
+/* Linux controlls charging, we can monitor */
+#define CONFIG_CHARGING CHARGING_MONITOR
+
+/* define this if the hardware can be powered off while charging */
+#define HAVE_POWEROFF_WHILE_CHARGING
+
+/* same dimensions as gigabeats */
+#define CONFIG_LCD LCD_INGENIC_LINUX
+
+/* Define this if you have a software controlled poweroff */
+#define HAVE_SW_POWEROFF
+
+/* Define this to the CPU frequency */
+#define CPU_FREQ 1008000000
+
+/* No special storage */
+#define CONFIG_STORAGE STORAGE_HOSTFS
+#define HAVE_STORAGE_FLUSH
+
+/* Battery */
+#define BATTERY_TYPES_COUNT 1
+
+/* Audio codec */
+#define HAVE_FIIO_LINUX_CODEC
+
+/* We don't have hardware controls */
+#define HAVE_SW_TONE_CONTROLS
+
+/* Battery */
+#define BATTERY_CAPACITY_DEFAULT 5 /* default battery capacity */
+#define BATTERY_CAPACITY_MIN 5 /* min. capacity selectable */
+#define BATTERY_CAPACITY_MAX 5 /* max. capacity selectable */
+#define BATTERY_CAPACITY_INC 0 /* capacity increment */
+
+/* ROLO */
+#define BOOTFILE_EXT "m5"
+#define BOOTFILE "rockbox." BOOTFILE_EXT
+#define BOOTDIR "/.rockbox"
diff --git a/firmware/export/rbpaths.h b/firmware/export/rbpaths.h
index da5a2fb..870f178 100644
--- a/firmware/export/rbpaths.h
+++ b/firmware/export/rbpaths.h
@@ -43,7 +43,7 @@
/* NOTE: target-specific hosted HOME_DIR resides in filesystem-app.c */
#if !defined(APPLICATION) || defined(SAMSUNG_YPR0) || defined(SAMSUNG_YPR1) || \
defined(DX50) || defined(DX90) || defined(SONY_NWZ_LINUX) || \
- defined(HIBY_LINUX) || defined(FIIO_M3K)
+ defined(HIBY_LINUX) || defined(FIIO_M3K) || defined(FIIO_M5)
#define HOME_DIR "/"
@@ -80,7 +80,7 @@
#if defined(APPLICATION) && \
!(defined(SAMSUNG_YPR0) || defined(SAMSUNG_YPR1) || \
- defined(DX50) || defined(DX90) || defined(SONY_NWZ_LINUX) || defined(HIBY_LINUX) || defined(FIIO_M3K))
+ defined(DX50) || defined(DX90) || defined(SONY_NWZ_LINUX) || defined(HIBY_LINUX) || defined(FIIO_M3K) || defined(FIIO_M5))
#define PLUGIN_DATA_DIR ROCKBOX_DIR "/rocks.data"
#define PLUGIN_GAMES_DATA_DIR PLUGIN_DATA_DIR
diff --git a/firmware/target/hosted/fiio/button-fiiom5.c b/firmware/target/hosted/fiio/button-fiiom5.c
new file mode 100644
index 0000000..9aa0fea
--- /dev/null
+++ b/firmware/target/hosted/fiio/button-fiiom5.c
@@ -0,0 +1,307 @@
+/***************************************************************************
+ * __________ __ ___
+ * Open \______ \ ____ ____ | | _\_ |__ _______ ___
+ * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
+ * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
+ * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
+ * \/ \/ \/ \/ \/
+ *
+ * Copyright (C) 2017 Marcin Bukat
+ * Copyright (C) 2019 Roman Stolyarov
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ****************************************************************************/
+#include <poll.h>
+//#include <dir.h>
+#include <errno.h>
+#include <unistd.h>
+#include <sys/types.h>
+#include <linux/input.h>
+#include <fcntl.h>
+#include <string.h>
+#include <stdlib.h>
+
+#include "sysfs.h"
+#include "button.h"
+#include "button-target.h"
+#include "panic.h"
+
+#include "kernel.h"
+#include "backlight.h"
+#include "backlight-target.h"
+
+static int key_enter_delay = 0;
+static int key_right_delay = 0;
+static int key_left_delay = 0;
+static int key_power_delay = 0;
+static int key_home_delay = 0;
+static int key_backspace_delay = 0;
+static int key_leftbrace_delay = 0;
+static int key_rightbrace_delay = 0;
+static int key_up_delay = 0;
+static int key_down_delay = 0;
+static int key_f12_delay = 0;
+
+static void reset_all_delay(){
+ key_enter_delay = 0;
+ key_right_delay = 0;
+ key_left_delay = 0;
+ key_power_delay = 0;
+ key_home_delay = 0;
+ key_backspace_delay = 0;
+ key_leftbrace_delay = 0;
+ key_rightbrace_delay = 0;
+ key_up_delay = 0;
+ key_down_delay = 0;
+ key_f12_delay = 0;
+}
+
+static struct touch_state{
+ int x;
+ int y;
+ int touch;
+ int last_x;
+ int last_y;
+} touch_ts = {0};
+
+static const int TOUCH_MAP[3][3]={
+ {BUTTON_OPTION, BUTTON_UP, BUTTON_HOME},
+ {BUTTON_LEFT, BUTTON_PLAY, BUTTON_RIGHT},
+ {BUTTON_PREV, BUTTON_DOWN, BUTTON_NEXT}
+};
+
+static int clamp(int v, int a, int b){
+ if (v<a) return a;
+ if (v>b) return b;
+ return v;
+}
+
+static int touch_to_key(int x, int y){
+ x = clamp(x, 0, 239);
+ y = clamp(y, 0, 239);
+ return TOUCH_MAP[y/80][x/80];
+}
+
+#define NR_POLL_DESC 2
+static struct pollfd poll_fds[NR_POLL_DESC];
+
+#define DEF_DELAY 5
+
+static int button_map_on(int keycode)
+{
+ switch(keycode)
+ {
+ case KEY_RIGHT:
+ key_right_delay = DEF_DELAY;
+ return BUTTON_VOL_DOWN;
+
+ case KEY_F7:
+ key_right_delay = 0;
+ return BUTTON_VOL_DOWN;
+
+ case KEY_LEFT:
+ key_left_delay = DEF_DELAY;
+ return BUTTON_VOL_UP;
+
+ case KEY_F6:
+ key_left_delay = 0;
+ return BUTTON_VOL_UP;
+
+ case KEY_POWER:
+ key_power_delay = DEF_DELAY;
+ return BUTTON_POWER;
+ case KEY_F8:
+ key_power_delay = 0;
+ return BUTTON_POWER;
+ default:
+ return 0;
+ }
+}
+
+static int button_map_off(int keycode)
+{
+ switch(keycode)
+ {
+ case KEY_F7:
+ return BUTTON_VOL_DOWN;
+
+ case KEY_F6:
+ return BUTTON_VOL_UP;
+
+ case KEY_F8:
+ return BUTTON_POWER;
+ default:
+ return 0;
+ }
+}
+
+static int button_map_timer(void)
+{
+ int map = 0;
+
+ if (key_enter_delay)
+ {
+ if (--key_enter_delay == 0) map |= BUTTON_PLAY;
+ }
+ if (key_right_delay)
+ {
+ if (--key_right_delay == 0) map |= BUTTON_VOL_DOWN;
+ }
+ if (key_left_delay)
+ {
+ if (--key_left_delay == 0) map |= BUTTON_VOL_UP;
+ }
+ if (key_power_delay)
+ {
+ if (--key_power_delay == 0) map |= BUTTON_POWER;
+ }
+ if (key_home_delay)
+ {
+ if (--key_home_delay == 0) map |= BUTTON_OPTION;
+ }
+ if (key_backspace_delay)
+ {
+ if (--key_backspace_delay == 0) map |= BUTTON_HOME;
+ }
+ if (key_leftbrace_delay)
+ {
+ if (--key_leftbrace_delay == 0) map |= BUTTON_PREV;
+ }
+ if (key_rightbrace_delay)
+ {
+ if (--key_rightbrace_delay == 0) map |= BUTTON_NEXT;
+ }
+ if (key_up_delay)
+ {
+ if (--key_up_delay == 0) map |= BUTTON_UP;
+ }
+ if (key_down_delay)
+ {
+ if (--key_down_delay == 0) map |= BUTTON_DOWN;
+ }
+ if (key_f12_delay)
+ {
+ if (--key_f12_delay == 0) map |= 0; //BUTTON_UNLOCK
+ }
+
+ return map;
+}
+
+
+void button_init_device(void)
+{
+ const char * const input_devs[] = {
+ "/dev/input/event0",
+ "/dev/input/event3",
+ };
+
+ for(int i = 0; i < NR_POLL_DESC; i++)
+ {
+ int fd = open(input_devs[i], O_RDWR | O_CLOEXEC);
+
+ if(fd < 0)
+ {
+ panicf("Cannot open input device: %s\n", input_devs[i]);
+ }
+
+ poll_fds[i].fd = fd;
+ poll_fds[i].events = POLLIN;
+ poll_fds[i].revents = 0;
+ }
+}
+
+int button_read_device(void)
+{
+ static int button_bitmap = 0;
+ static int map;
+ struct input_event event;
+
+ /* check if there are any events pending and process them */
+ while(poll(poll_fds, NR_POLL_DESC, 0))
+ {
+ for(int i = 0; i < NR_POLL_DESC; i++)
+ {
+ /* read only if non-blocking */
+ if(poll_fds[i].revents & POLLIN)
+ {
+ int size = read(poll_fds[i].fd, &event, sizeof(event));
+ if(size == (int)sizeof(event))
+ {
+ if(event.type == EV_KEY)
+ {
+ int keycode = event.code;
+
+ /* event.value == 1 means press
+ * event.value == 0 means release
+ */
+ bool press = event.value ? true : false;
+
+ if (keycode == BTN_TOUCH){
+ touch_ts.touch = press;
+ continue;
+ }
+
+ if(press)
+ {
+ map = button_map_on(keycode);
+ button_bitmap |= map;
+ }
+ else
+ {
+ map = button_map_off(keycode);
+ button_bitmap &= ~map;
+ }
+ }
+ else if(event.type == EV_ABS){
+ if (event.code==ABS_X) touch_ts.x = event.value;
+ else if (event.code==ABS_Y) touch_ts.y = event.value;
+ }
+ else if(event.type == EV_SYN){
+ if (touch_ts.touch){
+ reset_all_delay();
+ touch_ts.last_x = touch_ts.x;
+ touch_ts.last_y = touch_ts.y;
+ button_bitmap = touch_to_key(touch_ts.x, touch_ts.y);
+ } else
+ button_bitmap &= ~touch_to_key(touch_ts.last_x, touch_ts.last_y);
+ }
+
+ }
+ }
+ }
+ }
+
+ map = button_map_timer();
+ if (map) button_bitmap &= ~map;
+
+ static int last_btn_bm = 0;
+
+ return last_btn_bm = button_bitmap;
+}
+
+bool headphones_inserted(void)
+{
+ int status = 0;
+ const char * const sysfs_hs_switch = "/sys/class/misc/axp173/headset_state";
+
+ sysfs_get_int(sysfs_hs_switch, &status);
+ if (status) return true;
+
+ return false;
+}
+
+void button_close_device(void)
+{
+ /* close descriptors */
+ for(int i = 0; i < NR_POLL_DESC; i++)
+ {
+ close(poll_fds[i].fd);
+ }
+}
diff --git a/firmware/target/hosted/fiio/button-target.h b/firmware/target/hosted/fiio/button-target.h
index 7098eaf..e8c3725 100644
--- a/firmware/target/hosted/fiio/button-target.h
+++ b/firmware/target/hosted/fiio/button-target.h
@@ -31,13 +31,17 @@
#define BUTTON_VOL_DOWN 0x00000080
#define BUTTON_UP 0x00000100
#define BUTTON_DOWN 0x00000200
-
+#if defined(FIIO_M5)
+#define BUTTON_LEFT 0x00000400
+#define BUTTON_RIGHT 0x00000800
+#elif defined(FIIO_M3K)
+#define BUTTON_LEFT BUTTON_PREV
+#define BUTTON_RIGHT BUTTON_NEXT
+#endif
#define BUTTON_MAIN (BUTTON_POWER | BUTTON_HOME | BUTTON_OPTION | BUTTON_PREV | \
BUTTON_NEXT | BUTTON_PLAY | BUTTON_VOL_UP | BUTTON_VOL_DOWN | \
- BUTTON_UP | BUTTON_DOWN)
+ BUTTON_UP | BUTTON_DOWN | BUTTON_LEFT | BUTTON_RIGHT)
-#define BUTTON_LEFT BUTTON_PREV
-#define BUTTON_RIGHT BUTTON_NEXT
/* Software power-off */
#define POWEROFF_BUTTON BUTTON_POWER
diff --git a/firmware/target/hosted/filesystem-app.c b/firmware/target/hosted/filesystem-app.c
index 16ad5e3..3508738 100644
--- a/firmware/target/hosted/filesystem-app.c
+++ b/firmware/target/hosted/filesystem-app.c
@@ -52,10 +52,10 @@
static const char rbhome[] = "/sdcard";
#elif (CONFIG_PLATFORM & (PLATFORM_SDL|PLATFORM_MAEMO|PLATFORM_PANDORA)) \
&& !defined(__PCTOOL__)
-static const char *rbhome;
+static const char *rbhome = PIVOT_ROOT;
#else
/* YPR0, YPR1, NWZ, etc */
-static const char rbhome[] = HOME_DIR;
+static const char* rbhome = HOME_DIR;
#endif
#endif
diff --git a/tools/configure b/tools/configure
index aef02b2..aa28ad8 100755
--- a/tools/configure
+++ b/tools/configure
@@ -1591,7 +1591,7 @@ cat <<EOF
240) Rocker 228) NWZ-A860 series
==FiiO== 229) NWZ-S750 series
==AIGO== 244) M3K
- 245) Eros Q / K
+ 245) Eros Q / K 255) M5
EOF
@@ -4193,6 +4193,29 @@ fi
t_model="ihifi2"
;;
+ 255|fiiom5)
+ application="yes"
+ app_type="fiio"
+ target_id=127
+ modelname="fiiom5"
+ target="FIIO_M5"
+ memory=32
+ tool="cp "
+ boottool="cp "
+ bmp2rb_mono="$rootdir/tools/bmp2rb -f 0"
+ bmp2rb_native="$rootdir/tools/bmp2rb -f 4"
+ output="rockbox.m5"
+ bootoutput="bootloader.m5"
+ appextra="recorder:gui:hosted"
+ plugins="yes"
+ # architecture, manufacturer and model for the target-tree build
+ t_cpu="hosted"
+ t_manufacturer="fiio"
+ t_model="m5"
+ mipsellinuxcc
+ sysfont="16-Terminus"
+ ;;
+
*)
echo "Please select a supported target platform!"
exit 7
diff --git a/tools/root.make b/tools/root.make
index 3f5b4bc..acc676a 100644
--- a/tools/root.make
+++ b/tools/root.make
@@ -126,8 +126,8 @@ else # core
include $(ROOTDIR)/lib/rbcodec/rbcodec.make
ifdef ENABLEDPLUGINS
- include $(APPSDIR)/plugins/bitmaps/pluginbitmaps.make
- include $(APPSDIR)/plugins/plugins.make
+ include $(APPSDIR)/plugins/bitmaps/pluginbitmaps.make
+ include $(APPSDIR)/plugins/plugins.make
endif
ifneq (,$(findstring sdl,$(APP_TYPE)))
#!/bin/sh
# Replace original poweroff command on FiiO M5
/bin/busybox poweroff &
sync
umount /mnt/sd_0
sleep 10
# hope it's enough for poweroff to kill applications, now cut the power
ioctl /dev/axp173 0x20003323
# To build ioctl:
# git clone https://github.com/jerome-pouiller/ioctl
# cd ioctl
# mipsel-rockbox-linux-gnu-gcc ioctl.c ioctls_list_empty.c -Os -o ioctl
#!/bin/sh
# /etc/init.d/S90adb
#
# Start mass_storage....
#
case "$1" in
start)
echo "Starting mass_storage..."
if [ -d /sys/class/android_usb/android0 ]
then
cd /sys/class/android_usb/android0
if ! grep adb functions
then
echo 0 > enable
echo 18d1 > idVendor
echo d002 > idProduct
echo mass_storage,adb > functions
echo 1 > enable
fi
/sbin/adbserver.sh &
/usr/bin/udc_mass_storage.sh &
sdptool add OPUSH &
cd -
else
echo "notice : mass storage and adb don't use, kernel config error"
fi
;;
stop)
;;
restart|reload)
;;
*)
echo "Usage: $0 {start|stop|restart}"
exit 1
esac
amixer cset numid=19,iface=MIXER,name='ADC Mux' 0
amixer cset numid=4,iface=MIXER,name='Digital Capture Volume' 0
amixer cset numid=6,iface=MIXER,name='Mic Volume' 4
echo 0 > /proc/sys/kernel/printk
#check /data/
if [ ! -d "/data" ]; then
ubidetach -m 4
ubiformat /dev/mtd4 -y
ubiattach -m 4 -d 1 /dev/ubi_ctrl
ubimkvol /dev/ubi1 -N app_pri -m
mount -t ubifs ubi1_0 /data
fi
if [ ! -d "/data/userfs" ]; then
mkdir -p /data/userfs
fi
# rockbox bootloader install to /sbin/
[ -f /sbin/bootloader.m5 ] && /sbin/bootloader.m5 && exit
# when select FIIO PLAYER from bootloader, it will return 1, so fallback here
# the normal way to execp(/path/to/player) has problem wit M5 touch screen for now
/usr/project/bin/play.sh &
exit $?
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment