ap80max: New hosted port

HibyOS-based target: keymaps, LED, powermgmt, bootloader and sim support,
plus cabbiev2 for the new 360x640x16 screen. Opus 5 helped w/ debugging
and the initial scaffolding.

Updated name to FB_STRIDE_MISMATCH, added simulator bmp and specs.

Change-Id: If797ac6581cf75d9d1fcf36e615ee03cf6f905d6
This commit is contained in:
Jerry Shen 2026-08-11 22:45:40 -07:00
parent eded05f0cb
commit 51d7d56803
82 changed files with 1023 additions and 62 deletions

View file

@ -304,4 +304,6 @@ keymaps/keymap-rgnano.c
keymaps/keymap-ctru.c
#elif CONFIG_KEYPAD == HIBY_R3PROII_PAD
keymaps/keymap-hibyr3proii.c
#elif CONFIG_KEYPAD == HIDIZS_AP80MAX_PAD
keymaps/keymap-hidizsap80max.c
#endif

View file

@ -46,7 +46,7 @@ toolsicon.130x130x16.bmp
hibyicon.70x70x16.bmp
rockboxicon.70x70x16.bmp
toolsicon.70x70x16.bmp
#elif (defined(XDUOO_X3II) || defined(XDUOO_X20) || defined(EROS_Q) || defined(SURFANS_F28) || defined(HIBY_R3PROII) || defined(HIBY_R1))
#elif (defined(XDUOO_X3II) || defined(XDUOO_X20) || defined(EROS_Q) || defined(SURFANS_F28) || defined(HIBY_R3PROII) || defined(HIBY_R1) || defined(HIDIZS_AP80MAX))
hibyicon.130x130x16.bmp
rockboxicon.130x130x16.bmp
toolsicon.130x130x16.bmp

View file

@ -0,0 +1,246 @@
/***************************************************************************
* __________ __ ___
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
* \/ \/ \/ \/ \/
*
* Copyright (C) 2025 Solomon Peachy
* Copyright (C) 2026 by Jerry Shen
*
* 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 <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "config.h"
#include "action.h"
#include "button.h"
#include "settings.h"
static const struct button_mapping button_context_standard[] =
{
{ ACTION_STD_KEYLOCK, BUTTON_POWER|BUTTON_PLAY, BUTTON_POWER },
{ ACTION_STD_PREV, BUTTON_SCROLL_BACK, BUTTON_NONE },
{ ACTION_STD_NEXT, BUTTON_SCROLL_FWD, BUTTON_NONE },
{ ACTION_STD_OK, BUTTON_POWER|BUTTON_REL, BUTTON_POWER },
{ ACTION_STD_OK, BUTTON_NEXT|BUTTON_REL, BUTTON_NEXT },
{ ACTION_STD_CANCEL, BUTTON_PREV|BUTTON_REL, BUTTON_PREV },
{ ACTION_STD_OK, BUTTON_PLAY|BUTTON_REL, BUTTON_PLAY },
{ ACTION_STD_CONTEXT, BUTTON_PLAY|BUTTON_REPEAT, BUTTON_PLAY },
LAST_ITEM_IN_LIST
};
static const struct button_mapping button_context_wps[] =
{
{ ACTION_WPS_MENU, BUTTON_POWER|BUTTON_REL, BUTTON_POWER },
{ ACTION_WPS_PLAY, BUTTON_PLAY|BUTTON_REL, BUTTON_PLAY },
{ ACTION_WPS_STOP, BUTTON_PLAY|BUTTON_REPEAT, BUTTON_NONE },
{ ACTION_WPS_VOLDOWN, BUTTON_SCROLL_FWD, BUTTON_NONE },
{ ACTION_WPS_VOLUP, BUTTON_SCROLL_BACK, BUTTON_NONE },
{ ACTION_WPS_SKIPNEXT, BUTTON_NEXT|BUTTON_REL, BUTTON_NEXT },
{ ACTION_WPS_SKIPPREV, BUTTON_PREV|BUTTON_REL, BUTTON_PREV },
{ ACTION_WPS_SEEKFWD, BUTTON_NEXT|BUTTON_REPEAT, BUTTON_NONE },
{ ACTION_WPS_STOPSEEK, BUTTON_NEXT|BUTTON_REL, BUTTON_NEXT|BUTTON_REPEAT },
{ ACTION_WPS_SEEKBACK, BUTTON_PREV|BUTTON_REPEAT, BUTTON_NONE },
{ ACTION_WPS_STOPSEEK, BUTTON_PREV|BUTTON_REL, BUTTON_PREV|BUTTON_REPEAT },
{ ACTION_STD_KEYLOCK, BUTTON_POWER|BUTTON_PLAY, BUTTON_POWER },
LAST_ITEM_IN_LIST
};
static const struct button_mapping button_context_list[] =
{
LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_STD),
};
static const struct button_mapping button_context_tree[] =
{
LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_LIST),
};
static const struct button_mapping button_context_listtree_scroll_with_combo[] =
{
LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_CUSTOM | CONTEXT_TREE),
};
static const struct button_mapping button_context_listtree_scroll_without_combo[] =
{
LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_CUSTOM | CONTEXT_TREE),
};
static const struct button_mapping button_context_settings[] =
{
{ ACTION_SETTINGS_DEC, BUTTON_SCROLL_FWD, BUTTON_NONE },
{ ACTION_SETTINGS_INC, BUTTON_SCROLL_BACK, BUTTON_NONE },
{ ACTION_SETTINGS_INC, BUTTON_NEXT, BUTTON_NONE },
{ ACTION_SETTINGS_DEC, BUTTON_PREV, BUTTON_NONE },
LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_STD),
};
static const struct button_mapping button_context_settings_right_is_inc[] =
{
LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_STD),
};
static const struct button_mapping button_context_mainmenu[] =
{
LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_TREE),
};
static const struct button_mapping button_context_yesno[] =
{
{ ACTION_YESNO_ACCEPT, BUTTON_PLAY|BUTTON_REL, BUTTON_PLAY },
{ ACTION_YESNO_ACCEPT, BUTTON_POWER|BUTTON_REL, BUTTON_POWER },
{ ACTION_STD_CANCEL, BUTTON_PREV|BUTTON_REL, BUTTON_PREV },
LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_STD),
};
static const struct button_mapping button_context_colorchooser[] =
{
LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_SETTINGS),
};
static const struct button_mapping button_context_eq[] =
{
{ ACTION_SETTINGS_INCBIGSTEP, BUTTON_PLAY|BUTTON_SCROLL_BACK, BUTTON_NONE },
{ ACTION_SETTINGS_DECBIGSTEP, BUTTON_PLAY|BUTTON_SCROLL_FWD, BUTTON_NONE },
{ ACTION_SETTINGS_INC, BUTTON_SCROLL_BACK, BUTTON_NONE },
{ ACTION_SETTINGS_DEC, BUTTON_SCROLL_FWD, BUTTON_NONE },
{ ACTION_NONE, BUTTON_PREV, BUTTON_NONE },
{ ACTION_NONE, BUTTON_NEXT, BUTTON_NONE },
{ ACTION_STD_PREV, BUTTON_PREV|BUTTON_REL, BUTTON_PREV },
{ ACTION_STD_PREVREPEAT, BUTTON_PREV|BUTTON_REPEAT, BUTTON_NONE },
{ ACTION_STD_NEXT, BUTTON_NEXT|BUTTON_REL, BUTTON_NEXT },
{ ACTION_STD_NEXTREPEAT, BUTTON_NEXT|BUTTON_REPEAT, BUTTON_NONE },
{ ACTION_STD_OK, BUTTON_PLAY|BUTTON_REL, BUTTON_PLAY },
{ ACTION_STD_CANCEL, BUTTON_POWER|BUTTON_REL, BUTTON_POWER },
LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_SETTINGS),
};
static const struct button_mapping button_context_keyboard[] =
{
{ ACTION_KBD_LEFT, BUTTON_SCROLL_BACK, BUTTON_NONE },
{ ACTION_KBD_RIGHT, BUTTON_SCROLL_FWD, BUTTON_NONE },
{ ACTION_KBD_CURSOR_LEFT, BUTTON_PLAY | BUTTON_SCROLL_BACK, BUTTON_NONE },
{ ACTION_KBD_CURSOR_RIGHT, BUTTON_PLAY | BUTTON_SCROLL_FWD, BUTTON_NONE },
{ ACTION_KBD_DONE, BUTTON_PLAY | BUTTON_REPEAT, BUTTON_NONE },
{ ACTION_KBD_SELECT, BUTTON_PLAY | BUTTON_REL, BUTTON_NONE },
{ ACTION_KBD_ABORT, BUTTON_POWER, BUTTON_NONE },
{ ACTION_KBD_UP, BUTTON_NEXT, BUTTON_NONE },
{ ACTION_KBD_UP, BUTTON_NEXT | BUTTON_REPEAT, BUTTON_NONE },
{ ACTION_KBD_DOWN, BUTTON_PREV, BUTTON_NONE },
{ ACTION_KBD_DOWN, BUTTON_PREV | BUTTON_REPEAT, BUTTON_NONE },
LAST_ITEM_IN_LIST
};
static const struct button_mapping button_context_bmark[] =
{
LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_LIST),
};
static const struct button_mapping button_context_time[] =
{
LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_SETTINGS),
};
static const struct button_mapping button_context_quickscreen[] =
{
{ ACTION_QS_TOP, BUTTON_SCROLL_BACK, BUTTON_NONE },
{ ACTION_QS_DOWN, BUTTON_SCROLL_FWD, BUTTON_NONE },
{ ACTION_QS_LEFT, BUTTON_PREV|BUTTON_REL, BUTTON_NONE },
{ ACTION_QS_LEFT, BUTTON_PREV|BUTTON_REPEAT, BUTTON_NONE },
{ ACTION_QS_RIGHT, BUTTON_NEXT|BUTTON_REL, BUTTON_NONE },
{ ACTION_QS_RIGHT, BUTTON_NEXT|BUTTON_REPEAT, BUTTON_NONE },
LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_STD)
};
static const struct button_mapping button_context_pitchscreen[] =
{
{ ACTION_PS_DEC_SMALL, BUTTON_SCROLL_FWD, BUTTON_NONE },
{ ACTION_PS_INC_SMALL, BUTTON_SCROLL_BACK, BUTTON_NONE },
{ ACTION_PS_NUDGE_RIGHT, BUTTON_NEXT, BUTTON_NONE },
{ ACTION_PS_NUDGE_LEFT, BUTTON_PREV, BUTTON_NONE },
{ ACTION_PS_EXIT, BUTTON_POWER, BUTTON_NONE },
LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_STD)
};
static const struct button_mapping button_context_radio[] =
{
LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_SETTINGS)
};
const struct button_mapping* target_get_context_mapping(int context)
{
switch (context & ~CONTEXT_LOCKED)
{
case CONTEXT_STD: { return button_context_standard; }
case CONTEXT_WPS: { return button_context_wps; }
case CONTEXT_LIST: { return button_context_list; }
case CONTEXT_MAINMENU: { return button_context_mainmenu; }
case CONTEXT_CUSTOM | CONTEXT_TREE: { return button_context_tree; }
case CONTEXT_SETTINGS: { return button_context_settings; }
case CONTEXT_SETTINGS_COLOURCHOOSER: { return button_context_colorchooser; }
case CONTEXT_SETTINGS_EQ: { return button_context_eq; }
case CONTEXT_SETTINGS_TIME: { return button_context_time; }
case CONTEXT_YESNOSCREEN: { return button_context_yesno; }
case CONTEXT_KEYBOARD: { return button_context_keyboard; }
case CONTEXT_FM: { return button_context_radio; }
case CONTEXT_BOOKMARKSCREEN: { return button_context_bmark; }
case CONTEXT_QUICKSCREEN: { return button_context_quickscreen; }
case CONTEXT_PITCHSCREEN: { return button_context_pitchscreen; }
case CONTEXT_CUSTOM | CONTEXT_SETTINGS:
case CONTEXT_SETTINGS_RECTRIGGER: { return button_context_settings_right_is_inc; }
case CONTEXT_TREE:
{
if(global_settings.hold_lr_for_scroll_in_list)
{
return button_context_listtree_scroll_without_combo;
}
return button_context_listtree_scroll_with_combo;
}
}
return button_context_standard;
}

View file

@ -1,4 +1,4 @@
#if !defined(HAVE_TOUCHSCREEN) || defined(DX50) || defined(DX90) || defined(HIBY_R3PROII) || defined(HIBY_R1)
#if !defined(HAVE_TOUCHSCREEN) || defined(DX50) || defined(DX90) || defined(HIBY_R3PROII) || defined(HIBY_R1) || defined(HIDIZS_AP80MAX)
/* In devices running RockBox as an application, but having a keypad */
#include "SOURCES"
#else

View file

@ -1,4 +1,4 @@
#if !defined(HAVE_TOUCHSCREEN) || defined(DX50) || defined(DX90) || defined(HIBY_R3PROII) || defined(HIBY_R1)
#if !defined(HAVE_TOUCHSCREEN) || defined(DX50) || defined(DX90) || defined(HIBY_R3PROII) || defined(HIBY_R1) || defined(HIDIZS_AP80MAX)
/* This is for devices having a keypad, running RockBox as an application */
#include "SUBDIRS"

View file

@ -243,7 +243,7 @@ struct battery_tables_t {
#define BATTERY_ON_TXT "Play"
#define BATTERY_OFF_TXT "Power"
#elif CONFIG_KEYPAD == SHANLING_Q1_PAD || CONFIG_KEYPAD == HIBY_R3PROII_PAD
#elif CONFIG_KEYPAD == SHANLING_Q1_PAD || CONFIG_KEYPAD == HIBY_R3PROII_PAD || CONFIG_KEYPAD == HIDIZS_AP80MAX_PAD
/* use touchscreen */
#elif CONFIG_KEYPAD == MA_PAD

View file

@ -21,7 +21,8 @@ bubbles_bubble.220x176x1.bmp
#elif ((LCD_WIDTH == 240) && (LCD_HEIGHT == 240)) || \
((LCD_WIDTH == 320) && (LCD_HEIGHT == 240)) || \
((LCD_WIDTH == 240) && (LCD_HEIGHT >= 320)) || \
((LCD_WIDTH == 360) && (LCD_HEIGHT == 400))
((LCD_WIDTH == 360) && (LCD_HEIGHT == 400)) || \
((LCD_WIDTH == 360) && (LCD_HEIGHT == 640))
bubbles_bubble.320x240x1.bmp
#elif ((LCD_WIDTH == 640) && (LCD_HEIGHT == 480)) || \
((LCD_WIDTH == 480) && (LCD_HEIGHT >= 640))

View file

@ -438,7 +438,7 @@ invadrox_ufo_explode.21x8x16.bmp
invadrox_numbers.50x7x16.bmp
#if LCD_WIDTH == 480
invadrox_background.480x640x16.bmp
#elif LCD_WIDTH == 360 && LCD_HEIGHT == 400
#elif LCD_WIDTH == 360 && (LCD_HEIGHT == 400 || LCD_HEIGHT == 640)
invadrox_background.360x400x16.bmp
#elif LCD_WIDTH == 320
invadrox_background.320x240x16.bmp
@ -513,7 +513,7 @@ jewels.240x240x16.bmp
jewels.320x240x16.bmp
#elif (LCD_WIDTH == 320) && (LCD_HEIGHT == 240)
jewels.320x240x16.bmp
#elif (LCD_WIDTH == 360) && (LCD_HEIGHT == 400)
#elif (LCD_WIDTH == 360) && ((LCD_HEIGHT == 400) || (LCD_HEIGHT == 640))
jewels.360x400x16.bmp
#elif ((LCD_WIDTH >= 480) && (LCD_HEIGHT >= 640)) || \
((LCD_WIDTH >= 640) && (LCD_HEIGHT >= 480))
@ -947,7 +947,8 @@ superdom_boarditems.176x132x16.bmp
superdom_boarditems.320x240x16.bmp
#elif ((LCD_WIDTH == 240) && (LCD_HEIGHT == 320)) || \
((LCD_WIDTH == 240) && (LCD_HEIGHT == 400)) || \
((LCD_WIDTH == 360) && (LCD_HEIGHT == 400))
((LCD_WIDTH == 360) && (LCD_HEIGHT == 400)) || \
((LCD_WIDTH == 360) && (LCD_HEIGHT == 640))
superdom_boarditems.240x320x16.bmp
#elif (LCD_WIDTH >= 480 && LCD_HEIGHT >= 640)
superdom_boarditems.480x640x16.bmp

View file

@ -591,7 +591,7 @@ enum {
#define BJACK_LEFT BUTTON_LEFT
#elif CONFIG_KEYPAD == SHANLING_Q1_PAD || CONFIG_KEYPAD == HIBY_R3PROII_PAD
#elif CONFIG_KEYPAD == SHANLING_Q1_PAD || CONFIG_KEYPAD == HIBY_R3PROII_PAD || CONFIG_KEYPAD == HIDIZS_AP80MAX_PAD
#define BJACK_QUIT BUTTON_POWER
#define BJACK_QUIT_NAME "QUIT"

View file

@ -353,7 +353,7 @@ CONFIG_KEYPAD == SANSA_M200_PAD
#define UP BUTTON_UP
#define DOWN BUTTON_DOWN
#elif CONFIG_KEYPAD == SHANLING_Q1_PAD || CONFIG_KEYPAD == HIBY_R3PROII_PAD
#elif CONFIG_KEYPAD == SHANLING_Q1_PAD || CONFIG_KEYPAD == HIBY_R3PROII_PAD || CONFIG_KEYPAD == HIDIZS_AP80MAX_PAD
#define QUIT BUTTON_POWER
#elif CONFIG_KEYPAD == MA_PAD

View file

@ -138,6 +138,17 @@ enum {
#define XOFS 128
#define MAX_FPS 40
#elif (LCD_WIDTH == 360) && (LCD_HEIGHT == 640)
#define XOFS 86
#define YOFS 220
#define SCORE_TXT_X 28
#define SCORE_TXT_WIDTH 32
#define SCORE_TXT_Y 48
#define LEVEL_TXT_X 27
#define LEVEL_TXT_WIDTH 32
#define LEVEL_TXT_Y 5
#define MAX_FPS 40
#elif (LCD_WIDTH == 360) && (LCD_HEIGHT == 400)
#define XOFS 86
#define YOFS 100

View file

@ -522,7 +522,7 @@ F3: equal to "="
#define CALCULATOR_CALC BUTTON_MENU
#define CALCULATOR_CLEAR BUTTON_BACK
#elif CONFIG_KEYPAD == SHANLING_Q1_PAD || CONFIG_KEYPAD == HIBY_R3PROII_PAD
#elif CONFIG_KEYPAD == SHANLING_Q1_PAD || CONFIG_KEYPAD == HIBY_R3PROII_PAD || CONFIG_KEYPAD == HIDIZS_AP80MAX_PAD
#define CALCULATOR_QUIT BUTTON_POWER
#elif CONFIG_KEYPAD == MA_PAD

View file

@ -408,7 +408,7 @@
#define CALENDAR_NEXT_MONTH BUTTON_VOL_UP
#define CALENDAR_PREV_MONTH BUTTON_VOL_DOWN
#elif CONFIG_KEYPAD == SHANLING_Q1_PAD || CONFIG_KEYPAD == HIBY_R3PROII_PAD
#elif CONFIG_KEYPAD == SHANLING_Q1_PAD || CONFIG_KEYPAD == HIBY_R3PROII_PAD || CONFIG_KEYPAD == HIDIZS_AP80MAX_PAD
/* use touchscreen */
#elif CONFIG_KEYPAD == MA_PAD

View file

@ -566,7 +566,7 @@
#define CB_SCROLL_LEFT (BUTTON_LEFT|BUTTON_REPEAT)
#define CB_SCROLL_RIGHT (BUTTON_RIGHT|BUTTON_REPEAT)
#elif CONFIG_KEYPAD == SHANLING_Q1_PAD || CONFIG_KEYPAD == HIBY_R3PROII_PAD
#elif CONFIG_KEYPAD == SHANLING_Q1_PAD || CONFIG_KEYPAD == HIBY_R3PROII_PAD || CONFIG_KEYPAD == HIDIZS_AP80MAX_PAD
/* use touchscreen */
#elif CONFIG_KEYPAD == MA_PAD

View file

@ -384,7 +384,7 @@
#define CHC_SETTINGS_OK BUTTON_SELECT
#define CHC_SETTINGS_CANCEL BUTTON_POWER
#elif CONFIG_KEYPAD == SHANLING_Q1_PAD || CONFIG_KEYPAD == HIBY_R3PROII_PAD
#elif CONFIG_KEYPAD == SHANLING_Q1_PAD || CONFIG_KEYPAD == HIBY_R3PROII_PAD || CONFIG_KEYPAD == HIDIZS_AP80MAX_PAD
#define CHC_QUIT BUTTON_POWER
#elif (CONFIG_KEYPAD == MA_PAD)

View file

@ -1326,7 +1326,7 @@ CONFIG_KEYPAD == MROBE500_PAD
#define CHIP8_KEY9 BUTTON_START
#define CHIP8_KEYA BUTTON_X
#elif CONFIG_KEYPAD == SHANLING_Q1_PAD || CONFIG_KEYPAD == HIBY_R3PROII_PAD
#elif CONFIG_KEYPAD == SHANLING_Q1_PAD || CONFIG_KEYPAD == HIBY_R3PROII_PAD || CONFIG_KEYPAD == HIDIZS_AP80MAX_PAD
/* use touchscreen */
#else

View file

@ -305,7 +305,7 @@
#define CLIX_BUTTON_RIGHT BUTTON_RIGHT
#define CLIX_BUTTON_CLICK BUTTON_SELECT
#elif CONFIG_KEYPAD == SHANLING_Q1_PAD || CONFIG_KEYPAD == HIBY_R3PROII_PAD
#elif CONFIG_KEYPAD == SHANLING_Q1_PAD || CONFIG_KEYPAD == HIBY_R3PROII_PAD || CONFIG_KEYPAD == HIDIZS_AP80MAX_PAD
#define CLIX_BUTTON_QUIT BUTTON_POWER
#elif CONFIG_KEYPAD == MA_PAD

View file

@ -391,7 +391,7 @@
#define CUBE_PAUSE BUTTON_PLAY
#define CUBE_HIGHSPEED BUTTON_BACK
#elif CONFIG_KEYPAD == SHANLING_Q1_PAD || CONFIG_KEYPAD == HIBY_R3PROII_PAD
#elif CONFIG_KEYPAD == SHANLING_Q1_PAD || CONFIG_KEYPAD == HIBY_R3PROII_PAD || CONFIG_KEYPAD == HIDIZS_AP80MAX_PAD
/* use touchscreen */
#elif CONFIG_KEYPAD == MA_PAD

View file

@ -616,7 +616,7 @@ void I_ShutdownGraphics(void)
#define DOOMBUTTON_WEAPON BUTTON_BACK
#define DOOMBUTTON_MAP (BUTTON_BACK|BUTTON_REPEAT)
#elif CONFIG_KEYPAD == SHANLING_Q1_PAD || CONFIG_KEYPAD == HIBY_R3PROII_PAD
#elif CONFIG_KEYPAD == SHANLING_Q1_PAD || CONFIG_KEYPAD == HIBY_R3PROII_PAD || CONFIG_KEYPAD == HIDIZS_AP80MAX_PAD
#define DOOMBUTTON_ESC BUTTON_POWER
#define DOOMBUTTON_MAP BUTTON_PREV

View file

@ -481,7 +481,7 @@
#define FLIPIT_STEP_BY_STEP BUTTON_VOL_UP
#define FLIPIT_TOGGLE BUTTON_SELECT
#elif CONFIG_KEYPAD == SHANLING_Q1_PAD || CONFIG_KEYPAD == HIBY_R3PROII_PAD
#elif CONFIG_KEYPAD == SHANLING_Q1_PAD || CONFIG_KEYPAD == HIBY_R3PROII_PAD || CONFIG_KEYPAD == HIDIZS_AP80MAX_PAD
/* use touchscreen */
#elif CONFIG_KEYPAD == MA_PAD

View file

@ -491,7 +491,7 @@
#define FRACTAL_PRECISION_DEC BUTTON_BACK
#define FRACTAL_RESET BUTTON_PLAY
#elif CONFIG_KEYPAD == SHANLING_Q1_PAD || CONFIG_KEYPAD == HIBY_R3PROII_PAD
#elif CONFIG_KEYPAD == SHANLING_Q1_PAD || CONFIG_KEYPAD == HIBY_R3PROII_PAD || CONFIG_KEYPAD == HIDIZS_AP80MAX_PAD
#define FRACTAL_QUIT BUTTON_POWER
#elif CONFIG_KEYPAD == MA_PAD

View file

@ -544,7 +544,7 @@
#define IMGVIEW_MENU (BUTTON_PLAY|BUTTON_REPEAT)
#define IMGVIEW_SLIDE_SHOW BUTTON_PLAY
#elif CONFIG_KEYPAD == SHANLING_Q1_PAD || CONFIG_KEYPAD == HIBY_R3PROII_PAD
#elif CONFIG_KEYPAD == SHANLING_Q1_PAD || CONFIG_KEYPAD == HIBY_R3PROII_PAD || CONFIG_KEYPAD == HIDIZS_AP80MAX_PAD
/* use touchscreen */
#elif CONFIG_KEYPAD == RG_NANO_PAD

View file

@ -280,7 +280,7 @@ CONFIG_KEYPAD == MROBE500_PAD
#define RIGHT BUTTON_RIGHT
#define FIRE BUTTON_SELECT
#elif CONFIG_KEYPAD == SHANLING_Q1_PAD || CONFIG_KEYPAD == HIBY_R3PROII_PAD
#elif CONFIG_KEYPAD == SHANLING_Q1_PAD || CONFIG_KEYPAD == HIBY_R3PROII_PAD || CONFIG_KEYPAD == HIDIZS_AP80MAX_PAD
/* use touchscreen */
#elif CONFIG_KEYPAD == MA_PAD
@ -687,6 +687,24 @@ CONFIG_KEYPAD == MROBE500_PAD
#define LIVES_X 8
#define MAX_Y 15
#elif (LCD_WIDTH == 360) && (LCD_HEIGHT == 640)
/* Hidizs AP80 Pro Max
*/
#define ARCADISH_GRAPHICS
#define PLAYFIELD_X 32
#define SHIP_Y (PLAYFIELD_Y - 3 * SHIP_HEIGHT)
#define ALIEN_START_Y (UFO_Y + 3 * ALIEN_HEIGHT)
/* Redefine SCORE_Y */
#undef SCORE_Y
#define SCORE_Y 80
#define SCORENUM_X (PLAYFIELD_X + NUMBERS_WIDTH)
#define SCORENUM_Y SCORE_Y + (2 * (FONT_HEIGHT + 1) + 1)
#define HISCORENUM_X (LCD_WIDTH - PLAYFIELD_X - 1 - 6 * NUMBERS_WIDTH - 5 * NUM_SPACING)
#define SHIELD_Y (PLAYFIELD_Y - 6 * SHIP_HEIGHT)
#define LIVES_X 10
#define MAX_Y 30
#elif (LCD_WIDTH == 360) && (LCD_HEIGHT == 400)
/* Shanling Q1

View file

@ -366,7 +366,7 @@ CONFIG_KEYPAD == MROBE500_PAD
#define HK_SELECT "SELECT"
#define HK_CANCEL "BACK"
#elif CONFIG_KEYPAD == SHANLING_Q1_PAD || CONFIG_KEYPAD == HIBY_R3PROII_PAD
#elif CONFIG_KEYPAD == SHANLING_Q1_PAD || CONFIG_KEYPAD == HIBY_R3PROII_PAD || CONFIG_KEYPAD == HIDIZS_AP80MAX_PAD
/* use touchscreen */
#elif CONFIG_KEYPAD == MA_PAD

View file

@ -249,7 +249,7 @@
#define BTN_FIRE BUTTON_SELECT
#define BTN_PAUSE BUTTON_POWER
#elif CONFIG_KEYPAD == SHANLING_Q1_PAD || CONFIG_KEYPAD == HIBY_R3PROII_PAD
#elif CONFIG_KEYPAD == SHANLING_Q1_PAD || CONFIG_KEYPAD == HIBY_R3PROII_PAD || CONFIG_KEYPAD == HIDIZS_AP80MAX_PAD
#define BTN_FIRE BUTTON_CENTER
#define BTN_PAUSE BUTTON_POWER
#define BTN_HAVE_DIAGONAL
@ -318,6 +318,7 @@
(CONFIG_KEYPAD != CREATIVE_ZENXFI2_PAD) && \
(CONFIG_KEYPAD != SHANLING_Q1_PAD) && \
(CONFIG_KEYPAD != HIBY_R3PROII_PAD) && \
(CONFIG_KEYPAD != HIDIZS_AP80MAX_PAD) && \
(CONFIG_KEYPAD != CTRU_PAD)
#define BTN_FIRE BUTTON_BOTTOMLEFT
#define BTN_PAUSE BUTTON_TOPLEFT

View file

@ -529,7 +529,7 @@ const struct button_mapping pla_main_ctx[] =
{PLA_SELECT, BUTTON_SELECT, BUTTON_NONE},
{PLA_SELECT_REL, BUTTON_SELECT|BUTTON_REL, BUTTON_SELECT},
{PLA_SELECT_REPEAT, BUTTON_SELECT|BUTTON_REPEAT, BUTTON_NONE},
#elif (CONFIG_KEYPAD == SHANLING_Q1_PAD || CONFIG_KEYPAD == HIBY_R3PROII_PAD)
#elif (CONFIG_KEYPAD == SHANLING_Q1_PAD || CONFIG_KEYPAD == HIBY_R3PROII_PAD || CONFIG_KEYPAD == HIDIZS_AP80MAX_PAD)
{PLA_EXIT, BUTTON_POWER, BUTTON_NONE},
#elif (CONFIG_KEYPAD == MA_PAD)
{PLA_CANCEL, BUTTON_BACK|BUTTON_REL, BUTTON_BACK},

View file

@ -316,7 +316,7 @@
#define MIDI_VOL_DOWN BUTTON_VOL_DOWN
#define MIDI_PLAYPAUSE BUTTON_PLAY
#elif CONFIG_KEYPAD == SHANLING_Q1_PAD || CONFIG_KEYPAD == HIBY_R3PROII_PAD
#elif CONFIG_KEYPAD == SHANLING_Q1_PAD || CONFIG_KEYPAD == HIBY_R3PROII_PAD || CONFIG_KEYPAD == HIDIZS_AP80MAX_PAD
/* use touchscreen */
#elif CONFIG_KEYPAD == MA_PAD

View file

@ -441,7 +441,7 @@ CONFIG_KEYPAD == MROBE500_PAD
# define MINESWP_DISCOVER (BUTTON_MENU|BUTTON_REPEAT)
# define MINESWP_INFO BUTTON_MENU
#elif CONFIG_KEYPAD == SHANLING_Q1_PAD || CONFIG_KEYPAD == HIBY_R3PROII_PAD
#elif CONFIG_KEYPAD == SHANLING_Q1_PAD || CONFIG_KEYPAD == HIBY_R3PROII_PAD || CONFIG_KEYPAD == HIDIZS_AP80MAX_PAD
/* use touchscreen */
#elif CONFIG_KEYPAD == RG_NANO_PAD

View file

@ -2578,7 +2578,7 @@ CONFIG_KEYPAD == MROBE500_PAD
#define MP3ENC_DONE BUTTON_POWER
#define MP3ENC_SELECT BUTTON_SELECT
#elif CONFIG_KEYPAD == SHANLING_Q1_PAD || CONFIG_KEYPAD == HIBY_R3PROII_PAD
#elif CONFIG_KEYPAD == SHANLING_Q1_PAD || CONFIG_KEYPAD == HIBY_R3PROII_PAD || CONFIG_KEYPAD == HIDIZS_AP80MAX_PAD
/* use touchscreen */
#elif CONFIG_KEYPAD == MA_PAD

View file

@ -352,7 +352,7 @@ struct mpeg_settings settings;
#define MPEG_START_TIME_DOWN BUTTON_DOWN
#define MPEG_START_TIME_EXIT BUTTON_BACK
#elif CONFIG_KEYPAD == SHANLING_Q1_PAD || CONFIG_KEYPAD == HIBY_R3PROII_PAD
#elif CONFIG_KEYPAD == SHANLING_Q1_PAD || CONFIG_KEYPAD == HIBY_R3PROII_PAD || CONFIG_KEYPAD == HIDIZS_AP80MAX_PAD
#define MPEG_START_TIME_EXIT BUTTON_POWER
#elif CONFIG_KEYPAD == RG_NANO_PAD

View file

@ -485,7 +485,7 @@ CONFIG_KEYPAD == SANSA_M200_PAD
#define MPEG_RW BUTTON_LEFT
#define MPEG_FF BUTTON_RIGHT
#elif CONFIG_KEYPAD == SHANLING_Q1_PAD || CONFIG_KEYPAD == HIBY_R3PROII_PAD
#elif CONFIG_KEYPAD == SHANLING_Q1_PAD || CONFIG_KEYPAD == HIBY_R3PROII_PAD || CONFIG_KEYPAD == HIDIZS_AP80MAX_PAD
/* use touchscreen */
#elif CONFIG_KEYPAD == RG_NANO_PAD

View file

@ -549,7 +549,7 @@
#define OSCILLOSCOPE_VOL_UP BUTTON_UP
#define OSCILLOSCOPE_VOL_DOWN BUTTON_DOWN
#elif CONFIG_KEYPAD == SHANLING_Q1_PAD || CONFIG_KEYPAD == HIBY_R3PROII_PAD
#elif CONFIG_KEYPAD == SHANLING_Q1_PAD || CONFIG_KEYPAD == HIBY_R3PROII_PAD || CONFIG_KEYPAD == HIDIZS_AP80MAX_PAD
/* use touchscreen */
#elif CONFIG_KEYPAD == RG_NANO_PAD

View file

@ -386,7 +386,7 @@
#define PACMAN_1UP BUTTON_VOL_UP
#define PACMAN_COIN BUTTON_PLAY
#elif CONFIG_KEYPAD == SHANLING_Q1_PAD || CONFIG_KEYPAD == HIBY_R3PROII_PAD
#elif CONFIG_KEYPAD == SHANLING_Q1_PAD || CONFIG_KEYPAD == HIBY_R3PROII_PAD || CONFIG_KEYPAD == HIDIZS_AP80MAX_PAD
#define PACMAN_UP BUTTON_TOPMIDDLE
#define PACMAN_DOWN BUTTON_BOTTOMMIDDLE
#define PACMAN_LEFT BUTTON_MIDLEFT

View file

@ -710,7 +710,7 @@ CONFIG_KEYPAD == MROBE500_PAD
#define LVL_UP_TEXT "UP+MENU"
#define LVL_DOWN_TEXT "DOWN+MENU"
#elif CONFIG_KEYPAD == SHANLING_Q1_PAD || CONFIG_KEYPAD == HIBY_R3PROII_PAD
#elif CONFIG_KEYPAD == SHANLING_Q1_PAD || CONFIG_KEYPAD == HIBY_R3PROII_PAD || CONFIG_KEYPAD == HIDIZS_AP80MAX_PAD
/* use touchscreen */
#elif CONFIG_KEYPAD == RG_NANO_PAD

View file

@ -317,7 +317,7 @@ CONFIG_KEYPAD == MROBE500_PAD
#define PONG_RIGHT_UP BUTTON_BACK
#define PONG_RIGHT_DOWN BUTTON_RIGHT
#elif CONFIG_KEYPAD == SHANLING_Q1_PAD || CONFIG_KEYPAD == HIBY_R3PROII_PAD
#elif CONFIG_KEYPAD == SHANLING_Q1_PAD || CONFIG_KEYPAD == HIBY_R3PROII_PAD || CONFIG_KEYPAD == HIDIZS_AP80MAX_PAD
/* use touchscreen */
#elif CONFIG_KEYPAD == MA_PAD

View file

@ -351,7 +351,7 @@
#define REVERSI_BUTTON_MAKE_MOVE BUTTON_SELECT
#define REVERSI_BUTTON_MENU BUTTON_MENU
#elif CONFIG_KEYPAD == SHANLING_Q1_PAD || CONFIG_KEYPAD == HIBY_R3PROII_PAD
#elif CONFIG_KEYPAD == SHANLING_Q1_PAD || CONFIG_KEYPAD == HIBY_R3PROII_PAD || CONFIG_KEYPAD == HIDIZS_AP80MAX_PAD
/* use touchscreen */
#elif (CONFIG_KEYPAD == MA_PAD)

View file

@ -457,7 +457,7 @@
#define ROCKBLOX_RESTART BUTTON_BACK
#define ROCKBLOX_SCROLL_ENABLED 1
#elif CONFIG_KEYPAD == SHANLING_Q1_PAD || CONFIG_KEYPAD == HIBY_R3PROII_PAD
#elif CONFIG_KEYPAD == SHANLING_Q1_PAD || CONFIG_KEYPAD == HIBY_R3PROII_PAD || CONFIG_KEYPAD == HIDIZS_AP80MAX_PAD
/* use touchscreen */
#elif CONFIG_KEYPAD == MA_PAD
@ -576,6 +576,23 @@
#define LEVEL_Y 142
#define LINES_Y 218
#elif (LCD_WIDTH == 360) && (LCD_HEIGHT == 640)
/* 10x20 board of 24px blocks = 240x480, leaving a 100px label column */
#define BLOCK_WIDTH 24
#define BLOCK_HEIGHT 24
#define BOARD_X 8
#define BOARD_Y 40
#define LABEL_X 258
#define SCORE_Y 60
#define LEVEL_Y 140
#define LINES_Y 220
#define HIGH_LABEL_X 258
#define HIGH_SCORE_Y 320
#define HIGH_LEVEL_Y 400
#define PREVIEW_X 258
#define PREVIEW_Y 480
#elif (LCD_WIDTH == 360) && (LCD_HEIGHT == 400)
#define BLOCK_WIDTH 19

View file

@ -457,7 +457,7 @@ static void setoptions (void)
options.SELECT = BUTTON_VOL_UP;
options.MENU = BUTTON_POWER;
#elif CONFIG_KEYPAD == SHANLING_Q1_PAD || CONFIG_KEYPAD == HIBY_R3PROII_PAD
#elif CONFIG_KEYPAD == SHANLING_Q1_PAD || CONFIG_KEYPAD == HIBY_R3PROII_PAD || CONFIG_KEYPAD == HIDIZS_AP80MAX_PAD
/* use touchscreen */
#elif CONFIG_KEYPAD == MA_PAD

View file

@ -392,7 +392,7 @@
#define ROCKPAINT_LEFT BUTTON_LEFT
#define ROCKPAINT_RIGHT BUTTON_RIGHT
#elif CONFIG_KEYPAD == SHANLING_Q1_PAD || CONFIG_KEYPAD == HIBY_R3PROII_PAD
#elif CONFIG_KEYPAD == SHANLING_Q1_PAD || CONFIG_KEYPAD == HIBY_R3PROII_PAD || CONFIG_KEYPAD == HIDIZS_AP80MAX_PAD
/* use touchscreen */
#elif CONFIG_KEYPAD == EROSQ_PAD

View file

@ -347,7 +347,7 @@ CONFIG_KEYPAD == MROBE500_PAD
#define PUZZLE_SHUFFLE BUTTON_BACK
#define PUZZLE_PICTURE BUTTON_PLAY
#elif CONFIG_KEYPAD == SHANLING_Q1_PAD || CONFIG_KEYPAD == HIBY_R3PROII_PAD
#elif CONFIG_KEYPAD == SHANLING_Q1_PAD || CONFIG_KEYPAD == HIBY_R3PROII_PAD || CONFIG_KEYPAD == HIDIZS_AP80MAX_PAD
/* use touchscreen */
#elif CONFIG_KEYPAD == MA_PAD

View file

@ -304,7 +304,7 @@ dir is the current direction of the snake - 0=up, 1=right, 2=down, 3=left;
#define SNAKE_DOWN BUTTON_DOWN
#define SNAKE_PLAYPAUSE BUTTON_PLAY
#elif CONFIG_KEYPAD == SHANLING_Q1_PAD || CONFIG_KEYPAD == HIBY_R3PROII_PAD
#elif CONFIG_KEYPAD == SHANLING_Q1_PAD || CONFIG_KEYPAD == HIBY_R3PROII_PAD || CONFIG_KEYPAD == HIDIZS_AP80MAX_PAD
/* use touchscreen */
#elif CONFIG_KEYPAD == MA_PAD

View file

@ -448,7 +448,7 @@ CONFIG_KEYPAD == MROBE500_PAD
#define SNAKE2_PLAYPAUSE BUTTON_PLAY
#define SNAKE2_PLAYPAUSE_TEXT "PLAY"
#elif CONFIG_KEYPAD == SHANLING_Q1_PAD || CONFIG_KEYPAD == HIBY_R3PROII_PAD
#elif CONFIG_KEYPAD == SHANLING_Q1_PAD || CONFIG_KEYPAD == HIBY_R3PROII_PAD || CONFIG_KEYPAD == HIDIZS_AP80MAX_PAD
/* use touchscreen */
#elif CONFIG_KEYPAD == MA_PAD

View file

@ -680,7 +680,7 @@
#define BUTTON_SAVE BUTTON_BACK
#define BUTTON_SAVE_NAME "BACK"
#elif CONFIG_KEYPAD == SHANLING_Q1_PAD || CONFIG_KEYPAD == HIBY_R3PROII_PAD
#elif CONFIG_KEYPAD == SHANLING_Q1_PAD || CONFIG_KEYPAD == HIBY_R3PROII_PAD || CONFIG_KEYPAD == HIDIZS_AP80MAX_PAD
/* use touchscreen */
#elif CONFIG_KEYPAD == MA_PAD

View file

@ -722,7 +722,7 @@ CONFIG_KEYPAD == MROBE500_PAD
# define HK_CUR2STACK "HOLD SELECT"
# define HK_REM2STACK "VOL+"
#elif CONFIG_KEYPAD == SHANLING_Q1_PAD || CONFIG_KEYPAD == HIBY_R3PROII_PAD
#elif CONFIG_KEYPAD == SHANLING_Q1_PAD || CONFIG_KEYPAD == HIBY_R3PROII_PAD || CONFIG_KEYPAD == HIDIZS_AP80MAX_PAD
# define SOL_QUIT BUTTON_POWER
#elif CONFIG_KEYPAD == RG_NANO_PAD

View file

@ -362,7 +362,7 @@
#define AST_RIGHT BUTTON_RIGHT
#define AST_FIRE BUTTON_PLAY
#elif CONFIG_KEYPAD == SHANLING_Q1_PAD || CONFIG_KEYPAD == HIBY_R3PROII_PAD
#elif CONFIG_KEYPAD == SHANLING_Q1_PAD || CONFIG_KEYPAD == HIBY_R3PROII_PAD || CONFIG_KEYPAD == HIDIZS_AP80MAX_PAD
/* use touchscreen */
#elif CONFIG_KEYPAD == MA_PAD

View file

@ -650,7 +650,7 @@
#define STAR_LEVEL_DOWN_NAME "VOL-"
#define STAR_LEVEL_REPEAT_NAME "BACK"
#elif CONFIG_KEYPAD == SHANLING_Q1_PAD || CONFIG_KEYPAD == HIBY_R3PROII_PAD
#elif CONFIG_KEYPAD == SHANLING_Q1_PAD || CONFIG_KEYPAD == HIBY_R3PROII_PAD || CONFIG_KEYPAD == HIDIZS_AP80MAX_PAD
#define STAR_QUIT BUTTON_POWER
#define STAR_QUIT_NAME "POWER"

View file

@ -458,7 +458,7 @@
#define SUDOKU_BUTTON_TOGGLE BUTTON_PLAY
#define SUDOKU_BUTTON_POSSIBLE BUTTON_BACK
#elif CONFIG_KEYPAD == SHANLING_Q1_PAD || CONFIG_KEYPAD == HIBY_R3PROII_PAD
#elif CONFIG_KEYPAD == SHANLING_Q1_PAD || CONFIG_KEYPAD == HIBY_R3PROII_PAD || CONFIG_KEYPAD == HIDIZS_AP80MAX_PAD
/* use touchscreen */
#elif CONFIG_KEYPAD == RG_NANO_PAD

View file

@ -36,7 +36,7 @@
#elif CONFIG_KEYPAD == CREATIVE_ZENXFI2_PAD
#define TOUCHSCREEN_QUIT BUTTON_POWER
#define TOUCHSCREEN_TOGGLE BUTTON_MENU
#elif CONFIG_KEYPAD == SHANLING_Q1_PAD || CONFIG_KEYPAD == HIBY_R3PROII_PAD
#elif CONFIG_KEYPAD == SHANLING_Q1_PAD || CONFIG_KEYPAD == HIBY_R3PROII_PAD || CONFIG_KEYPAD == HIDIZS_AP80MAX_PAD
#define TOUCHSCREEN_QUIT BUTTON_POWER
#define TOUCHSCREEN_TOGGLE BUTTON_PLAY
#elif (CONFIG_KEYPAD == ANDROID_PAD)

View file

@ -560,7 +560,7 @@
#define TV_LINE_DOWN BUTTON_SCROLL_FWD
#define TV_BOOKMARK BUTTON_PLAY
#elif CONFIG_KEYPAD == SHANLING_Q1_PAD || CONFIG_KEYPAD == HIBY_R3PROII_PAD
#elif CONFIG_KEYPAD == SHANLING_Q1_PAD || CONFIG_KEYPAD == HIBY_R3PROII_PAD || CONFIG_KEYPAD == HIDIZS_AP80MAX_PAD
#define TV_BOOKMARK BUTTON_PLAY
#elif CONFIG_KEYPAD == MA_PAD

View file

@ -443,7 +443,7 @@
#define LABEL_MENU "MENU"
#define LABEL_VOLUME "VOL+/VOL-"
#elif CONFIG_KEYPAD == SHANLING_Q1_PAD || CONFIG_KEYPAD == HIBY_R3PROII_PAD
#elif CONFIG_KEYPAD == SHANLING_Q1_PAD || CONFIG_KEYPAD == HIBY_R3PROII_PAD || CONFIG_KEYPAD == HIDIZS_AP80MAX_PAD
/* use touchscreen */
#elif CONFIG_KEYPAD == MA_PAD

View file

@ -396,7 +396,7 @@ CONFIG_KEYPAD == MROBE500_PAD
#define BTN_QUIT BUTTON_POWER
#define BTN_STOPRESET BUTTON_BACK
#elif CONFIG_KEYPAD == SHANLING_Q1_PAD || CONFIG_KEYPAD == HIBY_R3PROII_PAD
#elif CONFIG_KEYPAD == SHANLING_Q1_PAD || CONFIG_KEYPAD == HIBY_R3PROII_PAD || CONFIG_KEYPAD == HIDIZS_AP80MAX_PAD
/* use touchscreen */
#elif CONFIG_KEYPAD == MA_PAD
@ -525,7 +525,7 @@ CONFIG_KEYPAD == MROBE500_PAD
#elif ((LCD_WIDTH == 240) && (LCD_HEIGHT == 240)) || \
((LCD_WIDTH == 320) && (LCD_HEIGHT == 240)) || \
((LCD_WIDTH == 240) && ((LCD_HEIGHT == 320) || (LCD_HEIGHT == 400))) || \
((LCD_WIDTH == 360) && (LCD_HEIGHT == 400))
((LCD_WIDTH == 360) && ((LCD_HEIGHT == 400) || (LCD_HEIGHT == 640)))
#define FOOD_SIZE 7
#define ARGH_SIZE 8
#define SPEED 4

View file

@ -350,7 +350,7 @@ CONFIG_KEYPAD == MROBE500_PAD
#define DOWN BUTTON_DOWN
#define PAUSE BUTTON_PLAY
#elif CONFIG_KEYPAD == SHANLING_Q1_PAD || CONFIG_KEYPAD == HIBY_R3PROII_PAD
#elif CONFIG_KEYPAD == SHANLING_Q1_PAD || CONFIG_KEYPAD == HIBY_R3PROII_PAD || CONFIG_KEYPAD == HIDIZS_AP80MAX_PAD
/* use touchscreen */
#elif CONFIG_KEYPAD == RG_NANO_PAD

View file

@ -282,7 +282,7 @@
#define ZX_UP BUTTON_UP
#define ZX_DOWN BUTTON_DOWN
#elif CONFIG_KEYPAD == SHANLING_Q1_PAD || CONFIG_KEYPAD == HIBY_R3PROII_PAD
#elif CONFIG_KEYPAD == SHANLING_Q1_PAD || CONFIG_KEYPAD == HIBY_R3PROII_PAD || CONFIG_KEYPAD == HIDIZS_AP80MAX_PAD
/* use touchscreen */
#elif CONFIG_KEYPAD == MA_PAD

Binary file not shown.

After

Width:  |  Height:  |  Size: 675 KiB

View file

@ -126,6 +126,18 @@
#define BUTTON_LEFT BUTTON_VOL_DOWN
#define BUTTON_RIGHT BUTTON_VOL_UP
#include "bitmaps/hibyicon.h"
#elif defined(HIDIZS_AP80MAX)
#define ICON_WIDTH 130
#define ICON_HEIGHT 130
#define ICON_NAME bm_hibyicon
#define OF_NAME "HIBY PLAYER"
#define BUTTON_UP BUTTON_PREV
#define BUTTON_DOWN BUTTON_NEXT
#define BUTTON_SELECT BUTTON_PLAY
/* No volume keys, so the scroll wheel takes left/right */
#define BUTTON_LEFT BUTTON_SCROLL_BACK
#define BUTTON_RIGHT BUTTON_SCROLL_FWD
#include "bitmaps/hibyicon.h"
#else
#error "must define ICON_WIDTH/HEIGHT"
#endif
@ -279,7 +291,7 @@ static enum boot_mode get_boot_mode(void)
while(true)
{
/* on usb detect, immediately boot with last choice */
#if !defined(HIBY_R3PROII) && !defined(HIBY_R1)
#if !defined(HIBY_R3PROII) && !defined(HIBY_R1) && !defined(HIDIZS_AP80MAX)
if(!adb_running && power_input_status() & POWER_INPUT_USB_CHARGER)
{
/* save last choice */
@ -526,7 +538,7 @@ static void adb(int start)
pid_t pid = fork();
if(pid == 0)
{
#if defined(HIBY_R3PROII) || defined(HIBY_R1)
#if defined(HIBY_R3PROII) || defined(HIBY_R1) || defined(HIDIZS_AP80MAX)
execlp("/etc/init.d/T90adb", "T90adb", start ? "start" : "stop", NULL);
#else
execlp("/etc/init.d/K90adb", "K90adb", start ? "start" : "stop", NULL);
@ -694,9 +706,13 @@ int main(int argc, char **argv)
}
else if(mode == BOOT_ROCKBOX)
{
#if defined(HIBY_R3PROII) || defined(HIBY_R1)
#if defined(HIBY_R3PROII) || defined(HIBY_R1) || defined(HIDIZS_AP80MAX)
/* Suspend bluetooth as it's not currently supported */
system("/usr/bin/bt_suspend");
#endif
#if defined(HIDIZS_AP80MAX)
/* Hidizs bt_suspend has these commented out */
system("killall bluealsa bt-agent bluetoothd dbus-daemon 2>/dev/null");
#endif
fflush(stdout);
mount_storage(true);

View file

@ -765,6 +765,7 @@ Adam N. Burke
Lê Khánh Bình
Michael McAllister
Hemant Kumar
Jerry Shen
The libmad team
The wavpack team

View file

@ -187,7 +187,18 @@ target/hosted/hiby/hibylinux_codec.c
#endif
#endif
#if (defined(HIBY_R1) || defined(HIBY_R3PROII)) && !defined(SIMULATOR)
#if defined(HIDIZS_AP80MAX) && !defined(SIMULATOR)
target/hosted/hiby/usb-hiby-gadget.c
target/hosted/hiby/ap80max/button-ap80max.c
target/hosted/hiby/ap80max/powermgmt-ap80max.c
target/hosted/hiby/debug-hiby.c
#ifndef BOOTLOADER
target/hosted/hiby/ap80max/led-ap80max.c
target/hosted/hiby/hibylinux_codec.c
#endif
#endif
#if (defined(HIBY_R1) || defined(HIBY_R3PROII) || defined(HIDIZS_AP80MAX)) && !defined(SIMULATOR)
target/hosted/hiby/usb-dac-hiby.c
#endif
@ -222,7 +233,7 @@ target/hosted/xduoo/xduoolinux_codec.c
target/hosted/button-devinput.c
#endif
#if defined(HIBY_LINUX) && !defined(HIBY_R3PROII) && !defined(HIBY_R1) && !defined(SIMULATOR)
#if defined(HIBY_LINUX) && !defined(HIBY_R3PROII) && !defined(HIBY_R1) && !defined(HIDIZS_AP80MAX) && !defined(SIMULATOR)
target/hosted/usb-hiby.c
#endif

View file

@ -157,6 +157,7 @@
#define RG_NANO_PAD 77
#define CTRU_PAD 78
#define HIBY_R3PROII_PAD 79
#define HIDIZS_AP80MAX_PAD 80
/* CONFIG_REMOTE_KEYPAD */
#define H100_REMOTE 1
@ -580,6 +581,8 @@ Lyre prototype 1 */
#include "config/hibyr3proii.h"
#elif defined(HIBY_R1)
#include "config/hibyr1.h"
#elif defined(HIDIZS_AP80MAX)
#include "config/hidizsap80max.h"
#else
#error "unknown hardware platform!"
#endif

View file

@ -0,0 +1,105 @@
/*
* This config file is for the Hidizs AP80 Pro Max based on the x1600E soc
*/
/* For Rolo and boot loader */
#define MODEL_NUMBER 125
#define MODEL_NAME "HIDIZS AP80 PRO MAX"
#define PIVOT_ROOT "/data/mnt/sd_0"
#define MULTIDRIVE_DIR "/data/mnt/usb"
/* LCD dimensions. The framebuffer is not the panel: /dev/fb0 is 480x640 but
only the center 360 columns are scanned out - see hiby/lcd-target.h.
sqrt(360^2 + 640^2) / 2.95" = 249 */
#define LCD_WIDTH 360
#define LCD_HEIGHT 640
#define LCD_DPI 249
#define HAVE_LCD_SLEEP
#define LCD_SLEEP_TIMEOUT (2*HZ)
#define LCD_DEPTH 16 /* 65536 colours */
#define LCD_PIXELFORMAT RGB565 /* rgb565 */
/* /dev/fb0 is 480 columns wide but only the center 360 display */
#define FB_STRIDE_MISMATCH 480
#define FB_STRIDE_XOFFSET ((FB_STRIDE_MISMATCH - LCD_WIDTH) / 2)
#define CPU_FREQ 1008000000
#ifndef SIMULATOR
#define HAVE_GENERAL_PURPOSE_LED
#endif
/* define this if you have access to the quickscreen */
#define HAVE_QUICKSCREEN
#define HAVE_HOTKEY
#define HAVE_HEADPHONE_DETECTION
#ifndef BOOTLOADER
#define HAVE_BUTTON_DATA
#define HAVE_TOUCHSCREEN
#endif
/* Identity, as the digitiser already reports in panel coordinates. EVIOCGABS
declares twice that range but the hardware does not use it */
#define DEFAULT_TOUCHSCREEN_CALIBRATION { .A=1, .B=0, .C=0, \
.D=0, .E=1, .F=0, \
.divider=1 }
#define HAVE_SCROLLWHEEL
#ifndef CONFIG_BACKLIGHT_FADING
#undef CONFIG_BACKLIGHT_FADING
#endif
/* KeyPad configuration for plugins */
#define CONFIG_KEYPAD HIDIZS_AP80MAX_PAD
/* There are no volume buttons, so HAVE_VOLUME_IN_LIST is not defined - the
scroll wheel handles volume instead */
/* Battery */
#define BATTERY_TYPES_COUNT 1
/* Audio codec */
#define HAVE_HIBY_LINUX_CODEC
/* We don't have hardware controls */
#define HAVE_SW_TONE_CONTROLS
/* HW codec is flexible */
#define HW_SAMPR_CAPS SAMPR_CAP_ALL_192
/* Battery */
#define CONFIG_BATTERY_MEASURE (VOLTAGE_MEASURE|PERCENTAGE_MEASURE|TIME_MEASURE)
#define BATTERY_CAPACITY_DEFAULT 100 /* default battery capacity */
#define BATTERY_CAPACITY_MIN 100 /* min. capacity selectable */
#define BATTERY_CAPACITY_MAX 100 /* max. capacity selectable */
#define BATTERY_CAPACITY_INC 0 /* capacity increment */
/* Special backlight paths */
#define BACKLIGHT_HIBY
#define MIN_BRIGHTNESS_SETTING 1
#define MAX_BRIGHTNESS_SETTING 100
#define BRIGHTNESS_STEP 5
#define DEFAULT_BRIGHTNESS_SETTING 100
/* ROLO */
#define BOOTFILE_EXT "ap80max"
#define BOOTFILE "rockbox." BOOTFILE_EXT
#define BOOTDIR "/.rockbox"
/* USB */
#define HAVE_USB_ADB
#define HAVE_HOST_USB_AUDIO
#define HAVE_USB_POWER
#define USB_VID_STR "C502"
#define USB_PID_STR "008C"
/* Generic HiBy stuff */
#include "hibylinux.h"

View file

@ -0,0 +1,83 @@
/***************************************************************************
* __________ __ ___
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
* \/ \/ \/ \/ \/
*
* Copyright (C) 2017 Marcin Bukat
* Copyright (C) 2025 by Melissa Autumn
* Copyright (C) 2026 by Jerry Shen
*
* 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 <linux/input.h>
#include "sysfs.h"
#include "button.h"
#include "button-target.h"
#include "hibylinux_codec.h"
#include "touchscreen.h"
#ifdef HAVE_BACKLIGHT
#include "backlight.h"
#endif /* HAVE_BACKLIGHT */
/*
* /dev/input: gpio keys, adc keys, ring encoder, touchscreen
*/
int button_map(int keycode)
{
switch(keycode)
{
case KEY_PLAYPAUSE:
return BUTTON_PLAY;
/* Keys are reversed as per glyphs */
case KEY_PREVIOUSSONG:
return BUTTON_NEXT;
case KEY_NEXTSONG:
return BUTTON_PREV;
case KEY_POWER:
return BUTTON_POWER;
/* Scroll wheel */
case KEY_LEFT:
return BUTTON_SCROLL_FWD;
case KEY_RIGHT:
return BUTTON_SCROLL_BACK;
case BTN_TOUCH:
{
#ifdef HAVE_BACKLIGHT
if (is_backlight_on(true)) {
return BUTTON_TOUCH;
}
// Ignore
return 0;
#else
return BUTTON_TOUCH;
#endif
}
default:
return 0;
}
}
bool headphones_inserted(void)
{
#ifdef BOOTLOADER
int ps = 0;
#else
int ps = hiby_get_outputs();
#endif
return (ps == 2 || ps == 3);
}

View file

@ -0,0 +1,67 @@
/***************************************************************************
* __________ __ ___.
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
* \/ \/ \/ \/ \/
*
* Copyright (C) 2026 by Jerry Shen
*
* 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.
*
****************************************************************************/
#ifndef _BUTTON_TARGET_H_
#define _BUTTON_TARGET_H_
#include <stdbool.h>
#include "config.h"
/* Main unit's buttons - four keys and a scroll wheel, no volume keys. */
#define BUTTON_POWER 0x00000001
#define BUTTON_PREV 0x00000002
#define BUTTON_NEXT 0x00000004
#define BUTTON_PLAY 0x00000008
/* Scroll wheel */
#define BUTTON_SCROLL_BACK 0x00000010
#define BUTTON_SCROLL_FWD 0x00000020
#define BUTTON_MAIN 0x0000003f
#define BUTTON_TOUCH 0x00000040
/* Touchscreen virtual buttons */
#define BUTTON_TOPLEFT 0x00001000
#define BUTTON_TOPMIDDLE 0x00002000
#define BUTTON_TOPRIGHT 0x00004000
#define BUTTON_MIDLEFT 0x00008000
#define BUTTON_CENTER 0x00010000
#define BUTTON_MIDRIGHT 0x00020000
#define BUTTON_BOTTOMLEFT 0x00040000
#define BUTTON_BOTTOMMIDDLE 0x00080000
#define BUTTON_BOTTOMRIGHT 0x00100000
/* Software power-off */
#define POWEROFF_BUTTON BUTTON_POWER
#define POWEROFF_COUNT 25
/* For the simulator/sdl plugins/xworld */
#ifndef BOOTLOADER
#define BUTTON_LEFT BUTTON_PREV
#define BUTTON_RIGHT BUTTON_NEXT
#endif
/* The left/right aliases above don't exist in BOOTLOADER builds */
#define NO_BUTTON_LR
int button_map(int keycode);
#endif /* _BUTTON_TARGET_H_ */

View file

@ -0,0 +1,117 @@
/***************************************************************************
* __________ __ ___
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
* \/ \/ \/ \/ \/
*
* Copyright (C) 2025 Melissa Autumn
* Copyright (C) 2026 by Jerry Shen
*
* 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 <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdbool.h>
#include <unistd.h>
#include <string.h>
#include <stdio.h>
#include "config.h"
#include "backlight-target.h"
#include "sysfs.h"
#include "panic.h"
#include "lcd.h"
#include "settings.h"
#include "power.h"
/* Same sgm31324 controller as the R3 Pro II, so the same sysfs node */
static const char * const sysfs_led_type =
"/sys/class/leds/sgm31324-leds/led_pattern";
/* FIXME: taken from the R3 Pro II's leds_sgm31324_add.sh; this player ships
its own copy and the ordering has not been checked against it */
enum AP80MAX_LED_PATTERNS {
LED_PATTERN_INVALID = -1,
LED_PATTERN_OFF = 0,
LED_PATTERN_LIGHT_BLUE,
LED_PATTERN_YELLOW,
LED_PATTERN_CYAN,
LED_PATTERN_ORANGE,
LED_PATTERN_UNK_1, /* This might do something, but it seems to just be off */
LED_PATTERN_NORMAL_RED_BLINK,
LED_PATTERN_FAST_RED_BLINK,
LED_PATTERN_GREEN,
LED_PATTERN_BLUE, /* A slightly more blue blue */
LED_PATTERN_PINK,
LED_PATTERN_WHITE,
};
int _last_buttonlight = LED_PATTERN_INVALID;
void _set_pattern(enum AP80MAX_LED_PATTERNS pattern) {
if (_last_buttonlight != pattern) {
_last_buttonlight = pattern;
sysfs_set_int(sysfs_led_type, _last_buttonlight);
}
}
#ifdef HAVE_GENERAL_PURPOSE_LED
void led_hw_brightness(int brightness)
{
(void)brightness;
}
void led_hw_charged(void)
{
if (global_settings.use_led_indicators) {
_set_pattern(LED_PATTERN_GREEN);
}
}
void led_hw_charging(void)
{
_set_pattern(LED_PATTERN_NORMAL_RED_BLINK);
}
void led_hw_off(void)
{
// Don't turn the led off if charging.
if (charging_state())
return;
_set_pattern(LED_PATTERN_OFF);
}
void led_hw_on(void)
{
if (charging_state()) {
led_hw_charging();
} else {
if (global_settings.use_led_indicators) {
_set_pattern(LED_PATTERN_LIGHT_BLUE);
}
else {
led_hw_off();
}
}
}
void led_hw_set_mode(bool mode)
{
if (mode) {
led_hw_on();
}
else {
led_hw_off();
}
}
#endif

View file

@ -0,0 +1,39 @@
/***************************************************************************
* __________ __ ___.
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
* \/ \/ \/ \/ \/
*
* Copyright (C) 2017 Marcin Bukat
* Copyright (C) 2025 by Melissa Autumn
*
* 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 "powermgmt.h"
#include "power.h"
unsigned short battery_level_disksafe = 3470;
/* the OF shuts down at this voltage */
unsigned short battery_level_shutoff = 3400;
/* voltages (millivolt) of 0%, 10%, ... 100% when charging disabled */
unsigned short percent_to_volt_discharge[11] =
{
3400, 3675, 3715, 3750, 3775, 3810, 3850, 4025, 4120, 4230, 4350
};
/* voltages (millivolt) of 0%, 10%, ... 100% when charging enabled */
unsigned short percent_to_volt_charge[11] =
{
3485, 3780, 3836, 3857, 3890, 3930, 3986, 4025, 4120, 4230, 4350
};

View file

@ -26,7 +26,13 @@
#define LCD_OPTIMIZED_UPDATE_RECT
extern fb_data *framebuffer;
#ifdef FB_STRIDE_MISMATCH
#define LCD_FRAMEBUF_ADDR(col, row) \
(framebuffer + (row)*FB_STRIDE_MISMATCH + (col) + FB_STRIDE_XOFFSET)
#else
#define LCD_FRAMEBUF_ADDR(col, row) (framebuffer + (row)*LCD_WIDTH + (col))
#endif
extern void lcd_set_active(bool active);
#endif /* __LCD_TARGET_H__ */

View file

@ -106,6 +106,10 @@ void lcd_init_device(void)
vinfo.yres, vinfo.bits_per_pixel);
}
#endif
#elif defined(FB_STRIDE_MISMATCH)
/* For framebuffers wider than the panel and cannot be resized */
if (vinfo.bits_per_pixel != LCD_DEPTH)
panicf("Unexpected framebuffer depth: %d", vinfo.bits_per_pixel);
#else
/* Make sure we match our desired bitdepth */
if (vinfo.bits_per_pixel != LCD_DEPTH || vinfo.xres != LCD_WIDTH || vinfo.yres != LCD_HEIGHT) {
@ -167,6 +171,20 @@ void lcd_enable(bool on)
extern void lcd_copy_buffer_rect(fb_data *dst, const fb_data *src,
int width, int height);
#ifdef FB_STRIDE_MISMATCH
/* lcd_copy_buffer_rect() for framebuffers wider than the panel */
static void fb_copy_rect(fb_data *dst, const fb_data *src,
int width, int height)
{
while (height--)
{
memcpy(dst, src, width * sizeof(fb_data));
dst += FB_STRIDE_MISMATCH;
src += LCD_WIDTH;
}
}
#endif
void lcd_update(void)
{
if (fd < 0) return;
@ -176,9 +194,15 @@ void lcd_update(void)
#endif
{
/* Copy the Rockbox framebuffer to the second framebuffer */
#ifdef FB_STRIDE_MISMATCH
/* Strides differ - not one contiguous run */
fb_copy_rect(LCD_FRAMEBUF_ADDR(0, 0), FBADDR(0, 0),
LCD_WIDTH, LCD_HEIGHT);
#else
fb_data *dst = LCD_FRAMEBUF_ADDR(0, 0) + (fb_plane * FRAMEBUFFER_SIZE);
lcd_copy_buffer_rect(dst, FBADDR(0,0),
LCD_WIDTH*LCD_HEIGHT, 1);
#endif
redraw();
}
}
@ -191,6 +215,10 @@ void lcd_update_rect(int x, int y, int width, int height)
if (lcd_active())
#endif
{
#ifdef FB_STRIDE_MISMATCH
/* Strides differ - do line-by-line */
fb_copy_rect(LCD_FRAMEBUF_ADDR(x, y), FBADDR(x, y), width, height);
#else
fb_data *dst = LCD_FRAMEBUF_ADDR(x, y) + (fb_plane * FRAMEBUFFER_SIZE);
fb_data *src = FBADDR(x,y);
@ -205,6 +233,7 @@ void lcd_update_rect(int x, int y, int width, int height)
/* Full width - copy as one line */
lcd_copy_buffer_rect(dst, src, LCD_WIDTH*height, 1);
}
#endif
redraw();
}
}

View file

@ -525,6 +525,13 @@
#define UI_LCD_POSX 77
#define UI_LCD_POSY 74
#elif defined(HIDIZS_AP80MAX)
#define UI_TITLE "Hidizs AP80 Pro Max"
#define UI_WIDTH 580
#define UI_HEIGHT 880
#define UI_LCD_POSX 100
#define UI_LCD_POSY 100
#elif defined(SIMULATOR)
#error no UI defines
#endif

View file

@ -50,7 +50,7 @@
#include "gui/skin_engine/skin_engine.h"
#endif
#if defined(HIBY_R3PROII) || defined(HIBY_R1)
#if defined(HIBY_R3PROII) || defined(HIBY_R1) || defined(HIDIZS_AP80MAX)
#include "usb-hiby-gadget.h"
#endif
#if defined(DX50) || defined(DX90)
@ -91,7 +91,7 @@ void usb_set_mode(int mode)
usb_mode = mode;
#if defined(DX50) || defined(DX90)
ibasso_set_usb_mode(mode);
#elif defined(HIBY_R3PROII) || defined(HIBY_R1)
#elif defined(HIBY_R3PROII) || defined(HIBY_R1) || defined(HIDIZS_AP80MAX)
hiby_set_usb_mode(mode);
#endif
}

View file

@ -471,6 +471,10 @@ $releasenotes="/wiki/ReleaseNotes400";
name => 'Hiby R3Pro II',
status => 2,
},
'hidizsap80max' => {
name => 'Hidizs AP80 Pro Max',
status => 1,
},
);
sub manualname {

29
tools/configure vendored
View file

@ -1737,8 +1737,8 @@ cat <<EOF
300) R3 Pro II
==Echo project== ==Surfans== 301) R1
270) Echo R1 (WIP) 280) F28 (WIP)
==Nintendo==
==Hidizs==
==Nintendo== 302) AP80 Pro Max (WIP)
290) Nintendo 3DS (WIP)
EOF
@ -4226,6 +4226,31 @@ fi
sysfont="20-Terminus"
;;
302|hidizsap80max)
target_id=125
application=yes
app_type="hibyos"
modelname="hidizsap80max"
target="HIDIZS_AP80MAX"
memory=16 # The device has 64mb but let's make sure it still boots with things in the background
mipsellinuxcc
tool="cp "
boottool="cp "
bmp2rb_mono="$rootdir/tools/bmp2rb -f 0"
bmp2rb_native="$rootdir/tools/bmp2rb -f 4"
output="rockbox.ap80max"
bootoutput="bootloader.ap80max"
appextra="recorder:gui:hosted"
plugins="yes"
# architecture, manufacturer and model for the target-tree build
# These align with
t_cpu="hosted"
t_manufacturer="hiby"
t_model="ap80max"
sysfontbl="24-Terminus"
sysfont="20-Terminus"
;;
*)
echo "Please select a supported target platform!"

Binary file not shown.

After

Width:  |  Height:  |  Size: 997 KiB

View file

@ -87,5 +87,7 @@ shanling-q1.c
rg-nano.c
#elif CONFIG_KEYPAD == HIBY_R3PROII_PAD
hiby-r3proii.c
#elif CONFIG_KEYPAD == HIDIZS_AP80MAX_PAD
hidizs-ap80max.c
#endif
#endif /* SIMULATOR */

View file

@ -0,0 +1,57 @@
/***************************************************************************
* __________ __ ___.
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
* \/ \/ \/ \/ \/
*
* Copyright (C) 2021 by Solomon Peachy
* Copyright (C) 2026 by Jerry Shen
*
* 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 <SDL.h>
#include "button.h"
#include "buttonmap.h"
int key_to_button(int keyboard_button)
{
switch (keyboard_button)
{
case SDLK_UP:
return BUTTON_SCROLL_BACK;
case SDLK_DOWN:
return BUTTON_SCROLL_FWD;
case SDLK_LEFT:
return BUTTON_PREV;
case SDLK_RIGHT:
return BUTTON_NEXT;
case SDLK_RETURN:
case SDLK_SPACE:
return BUTTON_PLAY;
case SDLK_ESCAPE:
return BUTTON_POWER;
default:
return BUTTON_NONE;
}
}
struct button_map bm[] = {
{ SDLK_ESCAPE, 525, 270, 35, "Power" },
{ SDLK_LEFT, 526, 432, 25, "Previous" },
{ SDLK_SPACE, 526, 515, 25, "Play" },
{ SDLK_RIGHT, 526, 598, 25, "Next" },
{ SDLK_UP, 525, 230, 35, "Scroll Fwd" },
{ SDLK_DOWN, 525, 310, 35, "Scroll Back" },
{ 0, 0, 0, 0, "None" }
};

View file

@ -85,6 +85,7 @@ wps.480x720x(16|24|32): cabbiev2.480x720x16.touch.wps
wps.800x480x(16|24|32): cabbiev2.800x480x16.wps
wps.480x800x(16|24|32): cabbiev2.480x800x16.wps
wps.400x240x(16|24|32): cabbiev2.400x240x16.wps
wps.360x640x(16|24|32): cabbiev2.360x640x16.wps
wps.360x400x(16|24|32): cabbiev2.360x400x16.wps
wps.320x480x(16|24|32): cabbiev2.320x480x16.wps
wps.320x240x(16|24|32): cabbiev2.320x240x16.wps
@ -118,6 +119,7 @@ Font.480x720x(16|24|32): 35-Adobe-Helvetica.fnt
Font.800x480x(16|24|32): 35-Adobe-Helvetica.fnt
Font.480x800x(16|24|32): 35-Adobe-Helvetica.fnt
Font.400x240x(16|24|32): 15-Adobe-Helvetica.fnt
Font.360x640x(16|24|32): 35-Adobe-Helvetica.fnt
Font.360x400x(16|24|32): 18-Adobe-Helvetica.fnt
Font.320x480x(16|24|32): 27-Adobe-Helvetica.fnt
Font.320x240x(16|24|32): 15-Adobe-Helvetica.fnt
@ -155,6 +157,7 @@ backdrop.480x720x(16|24|32): backdrops/cabbiev2.480x720x16.bmp
backdrop.800x480x(16|24|32): backdrops/cabbiev2.800x480x16.bmp
backdrop.480x800x(16|24|32): backdrops/cabbiev2.480x800x16.bmp
backdrop.400x240x(16|24|32): backdrops/cabbiev2.400x240x16.bmp
backdrop.360x640x(16|24|32): backdrops/cabbiev2.360x640x16.bmp
backdrop.360x400x(16|24|32): backdrops/cabbiev2.360x400x16.bmp
backdrop.320x480x(16|24|32): backdrops/cabbiev2.320x480x16.bmp
backdrop.320x240x(16|24|32): backdrops/cabbiev2.320x240x16.bmp
@ -185,6 +188,7 @@ iconset.480x720x(16|24|32): icons/tango_icons.32x32.bmp
iconset.800x480x(16|24|32): icons/tango_icons.32x32.bmp
iconset.480x800x(16|24|32): icons/tango_icons.32x32.bmp
iconset.400x240x(16|24|32): icons/tango_icons.16x16.bmp
iconset.360x640x(16|24|32): icons/tango_icons.32x32.bmp
iconset.360x400x(16|24|32): icons/tango_icons.32x32.bmp
iconset.320x480x(16|24|32): icons/tango_icons.24x24.bmp
iconset.320x240x(16|24|32): icons/tango_icons.16x16.bmp
@ -208,6 +212,7 @@ viewers iconset.480x720x(16|24|32): icons/tango_icons_viewers.32x32.bmp
viewers iconset.800x480x(16|24|32): icons/tango_icons_viewers.32x32.bmp
viewers iconset.480x800x(16|24|32): icons/tango_icons_viewers.32x32.bmp
viewers iconset.400x240x(16|24|32): icons/tango_icons_viewers.16x16.bmp
viewers iconset.360x640x(16|24|32): icons/tango_icons_viewers.32x32.bmp
viewers iconset.360x400x(16|24|32): icons/tango_icons_viewers.32x32.bmp
viewers iconset.320x480x(16|24|32): icons/tango_icons_viewers.24x24.bmp
viewers iconset.320x240x(16|24|32): icons/tango_icons_viewers.16x16.bmp

View file

@ -0,0 +1,87 @@
# Cabbie v2.0
# (C) 2007-2012 The Authors (see /rockbox/wps/AUTHORS)
# Derived from "cabbie" (C) Yohann Misquitta
#
# Laid out against wpsbackdrop-360x640x16.bmp, whose fixed landmarks are:
# title bar x=30..329 y=6..27
# progress trough x=30..329 y=516..537
# status row y=605..633, with shuffle baked at x=209 and repeat at x=273
# Everything below is anchored to those; the content area is y=28..515.
#
# Disable Status Bar
%wd
#
# Load Backdrop
%X(wpsbackdrop-360x640x16.bmp)
#
# Preload Images
%xl(A,lock-360x640x16.bmp,0,0,2)
%xl(B,battery-360x640x16.bmp,0,0,10)
%xl(C,volume-360x640x16.bmp,0,0,10)
%xl(D,shuffle-360x640x16.bmp,0,0)
%xl(E,repeat-360x640x16.bmp,0,0,4)
%xl(F,playmode-360x640x16.bmp,0,0,5)
#
# Album Art/Info Viewport Conditional
%?C<%Vd(a)|%Vd(b)>
#
# Progress Bar
# Backdrop trough occupies x=30..329, y=516..537.
%V(30,516,300,20,-)
%pb(0,0,-,20,pb-360x640x16.bmp)
#
# Hold
%V(16,605,38,29,-)
%?mh<%xd(Aa)|%xd(Ab)>
#
# Battery
%V(69,605,66,29,-)
%?bp<%?bc<%xd(Ba)|%xd(Bb)>|%?bl<|%xd(Bc)|%xd(Bd)|%xd(Be)|%xd(Bf)|%xd(Bg)|%xd(Bh)|%xd(Bi)|%xd(Bj)>>
#
# Volume
%V(147,605,50,29,-)
%?pv<%xd(Ca)|%xd(Cb)|%xd(Cc)|%xd(Cd)|%xd(Ce)|%xd(Cf)|%xd(Cg)|%xd(Ch)|%xd(Ci)|%xd(Cj)>
#
# Shuffle
%V(208,605,55,29,-)
%?ps<%xd(D)>
#
# Repeat
%V(273,605,27,29,-)
%?mm<|%xd(Ea)|%xd(Eb)|%xd(Ec)|%xd(Ed)>
#
# Playmode
%V(309,605,36,29,-)
%?mp<%xd(Fa)|%xd(Fb)|%xd(Fc)|%xd(Fd)|%xd(Fe)>
#
# Time Elapsed/Remaining
%V(30,542,300,36,-)
%al%pc%ac%?Sr<%pe %Sx(of) %pp|%pp %Sx(of) %pe>%ar%pr
#
# Album Art
%ax%Vl(a,40,45,280,280,-)
%Cl(0,0,280,280,c,c)
%Cd
#
# Track Info - Album Art
%ax%Vl(a,0,329,-,187,1)
%s%ac%?id<%id|%?d(1)<%d(1)|%(root%)>>
%s%ac%?it<%it|%fn>
%s%ac%?ia<%ia|%?iA<%iA|%?d(2)<%d(2)|%(root%)>>>
%s%ac%Sx(Next:) %?Ia<%Ia|%?IA<%IA|%?D(2)<%D(2)|%(root%)>>> - %?It<%It|%Fn>
#
# Track Info - No Album Art
%Vl(b,0,96,-,420,1)
%s%ac%?id<%id|%?d(1)<%d(1)|%(root%)>>
%s%ac%?it<%it|%fn>
%s%ac%?ia<%ia|%?iA<%iA|%?d(2)<%d(2)|%(root%)>>>
%ac%?iy<%iy|>
%ac%?ig<%ig|>
%ac%?fv<%(vbr%) |>%fb kbit/s %fc
%ac%Sx(Next:)
%s%ac%?Id<%Id|%?D(1)<%D(1)|%(root%)>>
%ac%s%?It<%It|%Fn>
%s%ac%?Ia<%Ia|%?IA<%IA|%?D(2)<%D(2)|%(root%)>>>

Binary file not shown.

After

Width:  |  Height:  |  Size: 57 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 900 KiB