diff --git a/.gitignore b/.gitignore index 91276b11e0..0e6c415b31 100644 --- a/.gitignore +++ b/.gitignore @@ -8,6 +8,8 @@ *.o *.a *~ +.cache + __pycache__ .DS_STORE diff --git a/apps/SOURCES b/apps/SOURCES index c7e3a4d9ab..7297528042 100644 --- a/apps/SOURCES +++ b/apps/SOURCES @@ -310,4 +310,6 @@ keymaps/keymap-surfansf28.c keymaps/keymap-rgnano.c #elif CONFIG_KEYPAD == CTRU_PAD keymaps/keymap-ctru.c +#elif CONFIG_KEYPAD == HIBY_R3PROII_PAD +keymaps/keymap-hibyr3proii.c #endif diff --git a/apps/bitmaps/native/SOURCES b/apps/bitmaps/native/SOURCES index d8ed1dc4db..f0149175f3 100644 --- a/apps/bitmaps/native/SOURCES +++ b/apps/bitmaps/native/SOURCES @@ -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)) +#elif (defined(XDUOO_X3II) || defined(XDUOO_X20) || defined(EROS_Q) || defined(SURFANS_F28) || defined(HIBY_R3PROII) || defined(HIBY_R1)) hibyicon.130x130x16.bmp rockboxicon.130x130x16.bmp toolsicon.130x130x16.bmp diff --git a/apps/debug_menu.c b/apps/debug_menu.c index 222fc0315f..2e22397c67 100644 --- a/apps/debug_menu.c +++ b/apps/debug_menu.c @@ -2842,7 +2842,7 @@ static const struct { { "Screendump", dbg_screendump }, #endif { "Skin Engine RAM usage", dbg_skin_engine }, -#if ((CONFIG_PLATFORM & PLATFORM_NATIVE) || defined(SONY_NWZ_LINUX) || defined(HIBY_LINUX) || defined(FIIO_M3K_LINUX)) && !defined(SIMULATOR) +#if ((CONFIG_PLATFORM & PLATFORM_NATIVE) || defined(SONY_NWZ_LINUX) || (defined(HIBY_LINUX) && !defined(HIBY_R3PROII) && !defined(HIBY_R1)) || defined(FIIO_M3K_LINUX)) && !defined(SIMULATOR) { "View HW info", dbg_hw_info }, #endif #if (CONFIG_PLATFORM & PLATFORM_NATIVE) diff --git a/apps/features.txt b/apps/features.txt index 93a2ed0bf0..c9dea50abd 100644 --- a/apps/features.txt +++ b/apps/features.txt @@ -20,6 +20,10 @@ alarm backlight_brightness #endif +#if defined(HAVE_GENERAL_PURPOSE_LED) +general_purpose_led +#endif + #if defined(HAVE_BUTTON_LIGHT) button_light #endif @@ -182,7 +186,7 @@ depth_3d #endif /* This should be AUDIOHW_HAVE_FILTER_ROLL_OFF but that is only defined later */ -#if defined(DX50) || defined(HAVE_DF1704_CODEC) || defined(HAVE_PCM1792_CODEC) || defined(HAVE_CS4398) || defined(HAVE_WM8740) || defined(HAVE_ES9018)|| defined(HAVE_EROS_QN_CODEC) || defined(HAVE_XDUOO_LINUX_CODEC) || defined(HAVE_FIIO_LINUX_CODEC) || defined(HAVE_AK4376) || defined(HAVE_ES9218) || defined(HAVE_SURFANS_LINUX_CODEC) +#if defined(DX50) || defined(HAVE_DF1704_CODEC) || defined(HAVE_PCM1792_CODEC) || defined(HAVE_CS4398) || defined(HAVE_WM8740) || defined(HAVE_ES9018)|| defined(HAVE_EROS_QN_CODEC) || defined(HAVE_XDUOO_LINUX_CODEC) || defined(HAVE_FIIO_LINUX_CODEC) || defined(HAVE_AK4376) || defined(HAVE_ES9218) || defined(HAVE_SURFANS_LINUX_CODEC) || defined(HAVE_HIBY_LINUX_CODEC) filter_roll_off #endif diff --git a/apps/keymaps/keymap-hibyr3proii.c b/apps/keymaps/keymap-hibyr3proii.c new file mode 100644 index 0000000000..129e191341 --- /dev/null +++ b/apps/keymaps/keymap-hibyr3proii.c @@ -0,0 +1,233 @@ +/*************************************************************************** + * __________ __ ___ + * Open \______ \ ____ ____ | | _\_ |__ _______ ___ + * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / + * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < + * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ + * \/ \/ \/ \/ \/ + * + * Copyright (C) 2025 Solomon Peachy + * + * 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 +#include +#include + +#include "config.h" +#include "action.h" +#include "button.h" +#include "settings.h" + +static const struct button_mapping button_context_standard[] = +{ + { 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_CONTEXT, BUTTON_PLAY|BUTTON_REPEAT, BUTTON_PLAY }, + { ACTION_STD_CANCEL, BUTTON_POWER|BUTTON_REL, BUTTON_POWER }, + + { ACTION_STD_KEYLOCK, BUTTON_POWER|BUTTON_VOL_UP, BUTTON_POWER }, + + 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_VOLUP, BUTTON_VOL_UP|BUTTON_REL, BUTTON_NONE }, + { ACTION_WPS_VOLDOWN, BUTTON_VOL_DOWN|BUTTON_REL, BUTTON_NONE }, + { ACTION_WPS_VOLUP, BUTTON_VOL_UP|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_WPS_VOLDOWN, BUTTON_VOL_DOWN|BUTTON_REPEAT, 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_VOL_UP, BUTTON_POWER }, + + LAST_ITEM_IN_LIST +}; + + +static const struct button_mapping button_context_list[] = +{ + { ACTION_LIST_VOLUP, BUTTON_VOL_UP|BUTTON_REL, BUTTON_NONE }, + { ACTION_LIST_VOLDOWN, BUTTON_VOL_DOWN|BUTTON_REL, BUTTON_NONE }, + + 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_INC, BUTTON_VOL_UP, BUTTON_NONE }, + { ACTION_SETTINGS_DEC, BUTTON_VOL_DOWN, 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[] = +{ + { ACTION_TREE_WPS, BUTTON_POWER|BUTTON_REL, BUTTON_NONE }, + + LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_TREE), +}; + + +static const struct button_mapping button_context_yesno[] = +{ + { ACTION_YESNO_ACCEPT, BUTTON_PLAY, BUTTON_NONE }, + { ACTION_STD_CANCEL, BUTTON_POWER, BUTTON_NONE }, + + 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[] = +{ + LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_SETTINGS), +}; + + +static const struct button_mapping button_context_keyboard[] = +{ + { ACTION_KBD_LEFT, BUTTON_VOL_DOWN, BUTTON_NONE }, + { ACTION_KBD_RIGHT, BUTTON_VOL_UP, BUTTON_NONE }, + { ACTION_KBD_CURSOR_LEFT, BUTTON_PLAY | BUTTON_VOL_DOWN, BUTTON_NONE }, + { ACTION_KBD_CURSOR_RIGHT, BUTTON_PLAY | BUTTON_VOL_UP, 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_VOL_UP|BUTTON_REL, BUTTON_NONE }, + { ACTION_QS_TOP, BUTTON_VOL_UP|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_QS_DOWN, BUTTON_VOL_DOWN|BUTTON_REL, BUTTON_NONE }, + { ACTION_QS_DOWN, BUTTON_VOL_DOWN|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_QS_LEFT, BUTTON_PLAY|BUTTON_REL, BUTTON_NONE }, + { ACTION_QS_LEFT, BUTTON_PLAY|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_INC_SMALL, BUTTON_VOL_UP, BUTTON_NONE }, + { ACTION_PS_DEC_SMALL, BUTTON_VOL_DOWN, 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; +} diff --git a/apps/lang/english.lang b/apps/lang/english.lang index 530c4e9875..96a5cae355 100644 --- a/apps/lang/english.lang +++ b/apps/lang/english.lang @@ -16998,3 +16998,20 @@ *: "sort playlists" + + id: LANG_USE_LED_INDICATORS + desc: LED indicators setting + user: core + + *: none + general_purpose_led: "Use LED indicators" + + + *: none + general_purpose_led: "Use LED indicators" + + + *: none + general_purpose_led: "Use LED indicators" + + diff --git a/apps/menus/settings_menu.c b/apps/menus/settings_menu.c index 78c79b2ef8..1923309269 100644 --- a/apps/menus/settings_menu.c +++ b/apps/menus/settings_menu.c @@ -272,6 +272,9 @@ MAKE_MENU(battery_menu, ID2P(LANG_BATTERY_MENU), 0, Icon_NOICON, #if defined(DX50) || defined(DX90) || (defined(HAVE_USB_POWER) && !defined(USB_NONE) && !defined(SIMULATOR)) MENUITEM_SETTING(usb_mode, &global_settings.usb_mode, NULL); #endif +#if defined(HAVE_GENERAL_PURPOSE_LED) +MENUITEM_SETTING(use_led_indicators, &global_settings.use_led_indicators, NULL); +#endif /* Disk */ #ifdef HAVE_DISK_STORAGE MENUITEM_SETTING(disk_spindown, &global_settings.disk_spindown, NULL); @@ -395,8 +398,8 @@ MENUITEM_SETTING(bt_selective_actions, &global_settings.bt_selective_softlock_actions, selectivesoftlock_callback); MENUITEM_FUNCTION(sel_softlock_mask, 0, ID2P(LANG_SETTINGS), - selectivesoftlock_set_mask, selectivesoftlock_callback, - Icon_Menu_setting); + selectivesoftlock_set_mask, selectivesoftlock_callback, + Icon_Menu_setting); MAKE_MENU(sel_softlock, ID2P(LANG_SOFTLOCK_SELECTIVE), NULL, Icon_Menu_setting, &bt_selective_actions, &sel_softlock_mask); @@ -469,6 +472,9 @@ MAKE_MENU(system_menu, ID2P(LANG_SYSTEM), #endif #if defined(DX50) || defined(DX90) || (defined(HAVE_USB_POWER) && !defined(USB_NONE) && !defined(SIMULATOR)) &usb_mode, +#endif +#if defined(HAVE_GENERAL_PURPOSE_LED) + &use_led_indicators, #endif ); diff --git a/apps/plugins/SOURCES.app_build b/apps/plugins/SOURCES.app_build index 9822d3b70b..cdd764dc27 100644 --- a/apps/plugins/SOURCES.app_build +++ b/apps/plugins/SOURCES.app_build @@ -1,4 +1,4 @@ -#if !defined(HAVE_TOUCHSCREEN) || defined(DX50) || defined(DX90) +#if !defined(HAVE_TOUCHSCREEN) || defined(DX50) || defined(DX90) || defined(HIBY_R3PROII) || defined(HIBY_R1) /* In devices running RockBox as an application, but having a keypad */ #include "SOURCES" #else diff --git a/apps/plugins/SUBDIRS.app_build b/apps/plugins/SUBDIRS.app_build index fbf83f01da..5618f41afe 100644 --- a/apps/plugins/SUBDIRS.app_build +++ b/apps/plugins/SUBDIRS.app_build @@ -1,4 +1,4 @@ -#if !defined(HAVE_TOUCHSCREEN) || defined(DX50) || defined(DX90) +#if !defined(HAVE_TOUCHSCREEN) || defined(DX50) || defined(DX90) || defined(HIBY_R3PROII) || defined(HIBY_R1) /* This is for devices having a keypad, running RockBox as an application */ #include "SUBDIRS" diff --git a/apps/plugins/battery_bench.c b/apps/plugins/battery_bench.c index c9462f79ee..80b7f11ed3 100644 --- a/apps/plugins/battery_bench.c +++ b/apps/plugins/battery_bench.c @@ -250,7 +250,7 @@ struct battery_tables_t { #define BATTERY_ON_TXT "Play" #define BATTERY_OFF_TXT "Power" -#elif CONFIG_KEYPAD == SHANLING_Q1_PAD +#elif CONFIG_KEYPAD == SHANLING_Q1_PAD || CONFIG_KEYPAD == HIBY_R3PROII_PAD /* use touchscreen */ #elif CONFIG_KEYPAD == MA_PAD diff --git a/apps/plugins/bitmaps/mono/SOURCES b/apps/plugins/bitmaps/mono/SOURCES index be45691ab7..067942a70e 100644 --- a/apps/plugins/bitmaps/mono/SOURCES +++ b/apps/plugins/bitmaps/mono/SOURCES @@ -24,7 +24,7 @@ bubbles_bubble.220x176x1.bmp ((LCD_WIDTH == 360) && (LCD_HEIGHT == 400)) bubbles_bubble.320x240x1.bmp #elif ((LCD_WIDTH == 640) && (LCD_HEIGHT == 480)) || \ - ((LCD_WIDTH == 480) && (LCD_HEIGHT == 640)) + ((LCD_WIDTH == 480) && (LCD_HEIGHT >= 640)) bubbles_bubble.640x480x1.bmp #endif diff --git a/apps/plugins/bitmaps/native/SOURCES b/apps/plugins/bitmaps/native/SOURCES index f78357ac69..b2286bcc33 100644 --- a/apps/plugins/bitmaps/native/SOURCES +++ b/apps/plugins/bitmaps/native/SOURCES @@ -436,7 +436,9 @@ invadrox_shield.22x16x16.bmp invadrox_ufo.16x7x16.bmp invadrox_ufo_explode.21x8x16.bmp invadrox_numbers.50x7x16.bmp -#if LCD_WIDTH == 360 && LCD_HEIGHT == 400 +#if LCD_WIDTH == 480 +invadrox_background.480x640x16.bmp +#elif LCD_WIDTH == 360 && LCD_HEIGHT == 400 invadrox_background.360x400x16.bmp #elif LCD_WIDTH == 320 invadrox_background.320x240x16.bmp @@ -513,8 +515,8 @@ jewels.320x240x16.bmp jewels.320x240x16.bmp #elif (LCD_WIDTH == 360) && (LCD_HEIGHT == 400) jewels.360x400x16.bmp -#elif ((LCD_WIDTH == 640) && (LCD_HEIGHT == 480)) || \ - ((LCD_WIDTH == 480) && (LCD_HEIGHT == 640)) +#elif ((LCD_WIDTH >= 480) && (LCD_HEIGHT >= 640)) || \ + ((LCD_WIDTH >= 640) && (LCD_HEIGHT >= 480)) jewels.640x480x16.bmp #endif @@ -947,9 +949,9 @@ superdom_boarditems.320x240x16.bmp ((LCD_WIDTH == 240) && (LCD_HEIGHT == 400)) || \ ((LCD_WIDTH == 360) && (LCD_HEIGHT == 400)) superdom_boarditems.240x320x16.bmp -#elif (LCD_WIDTH == 480 && LCD_HEIGHT == 640) +#elif (LCD_WIDTH >= 480 && LCD_HEIGHT >= 640) superdom_boarditems.480x640x16.bmp -#elif (LCD_WIDTH == 640 && LCD_HEIGHT == 480) +#elif (LCD_WIDTH >= 640 && LCD_HEIGHT >= 480) superdom_boarditems.640x480x16.bmp #endif #endif @@ -984,7 +986,7 @@ sliding_puzzle.176x176x16.bmp sliding_puzzle.240x240x16.bmp #elif SMALLER_DIMENSION <= 360 sliding_puzzle.360x360x16.bmp -#elif SMALLER_DIMENSION <= 480 +#else sliding_puzzle.480x480x16.bmp #endif #elif (LCD_DEPTH > 1) diff --git a/apps/plugins/blackjack.c b/apps/plugins/blackjack.c index 124eea1ee6..c7e877d3a3 100644 --- a/apps/plugins/blackjack.c +++ b/apps/plugins/blackjack.c @@ -608,7 +608,7 @@ enum { #define BJACK_LEFT BUTTON_LEFT -#elif CONFIG_KEYPAD == SHANLING_Q1_PAD +#elif CONFIG_KEYPAD == SHANLING_Q1_PAD || CONFIG_KEYPAD == HIBY_R3PROII_PAD #define BJACK_QUIT BUTTON_POWER #define BJACK_QUIT_NAME "QUIT" diff --git a/apps/plugins/brickmania.c b/apps/plugins/brickmania.c index caa6da56d6..df23bbb21d 100644 --- a/apps/plugins/brickmania.c +++ b/apps/plugins/brickmania.c @@ -362,7 +362,7 @@ CONFIG_KEYPAD == SANSA_M200_PAD #define UP BUTTON_UP #define DOWN BUTTON_DOWN -#elif CONFIG_KEYPAD == SHANLING_Q1_PAD +#elif CONFIG_KEYPAD == SHANLING_Q1_PAD || CONFIG_KEYPAD == HIBY_R3PROII_PAD #define QUIT BUTTON_POWER #elif CONFIG_KEYPAD == MA_PAD diff --git a/apps/plugins/bubbles.c b/apps/plugins/bubbles.c index e8f994cd74..f870d19efa 100644 --- a/apps/plugins/bubbles.c +++ b/apps/plugins/bubbles.c @@ -135,7 +135,7 @@ enum { #define NEXT_BB_WIDTH 32 #define NEXT_BB_Y 402 -#elif (LCD_WIDTH == 480) && (LCD_HEIGHT == 640) +#elif (LCD_WIDTH == 480) && (LCD_HEIGHT >= 640) #define XOFS 128 #define MAX_FPS 40 diff --git a/apps/plugins/calculator.c b/apps/plugins/calculator.c index 167f018981..56cd017b34 100644 --- a/apps/plugins/calculator.c +++ b/apps/plugins/calculator.c @@ -533,7 +533,7 @@ F3: equal to "=" #define CALCULATOR_CALC BUTTON_MENU #define CALCULATOR_CLEAR BUTTON_BACK -#elif CONFIG_KEYPAD == SHANLING_Q1_PAD +#elif CONFIG_KEYPAD == SHANLING_Q1_PAD || CONFIG_KEYPAD == HIBY_R3PROII_PAD #define CALCULATOR_QUIT BUTTON_POWER #elif CONFIG_KEYPAD == MA_PAD diff --git a/apps/plugins/calendar.c b/apps/plugins/calendar.c index ef0869e377..04f313ddf3 100644 --- a/apps/plugins/calendar.c +++ b/apps/plugins/calendar.c @@ -419,7 +419,7 @@ #define CALENDAR_NEXT_MONTH BUTTON_VOL_UP #define CALENDAR_PREV_MONTH BUTTON_VOL_DOWN -#elif CONFIG_KEYPAD == SHANLING_Q1_PAD +#elif CONFIG_KEYPAD == SHANLING_Q1_PAD || CONFIG_KEYPAD == HIBY_R3PROII_PAD /* use touchscreen */ #elif CONFIG_KEYPAD == MA_PAD diff --git a/apps/plugins/chessbox/chessbox_pgn.h b/apps/plugins/chessbox/chessbox_pgn.h index f8baf47faf..d206a12f0f 100644 --- a/apps/plugins/chessbox/chessbox_pgn.h +++ b/apps/plugins/chessbox/chessbox_pgn.h @@ -581,7 +581,7 @@ #define CB_SCROLL_LEFT (BUTTON_LEFT|BUTTON_REPEAT) #define CB_SCROLL_RIGHT (BUTTON_RIGHT|BUTTON_REPEAT) -#elif CONFIG_KEYPAD == SHANLING_Q1_PAD +#elif CONFIG_KEYPAD == SHANLING_Q1_PAD || CONFIG_KEYPAD == HIBY_R3PROII_PAD /* use touchscreen */ #elif CONFIG_KEYPAD == MA_PAD diff --git a/apps/plugins/chessclock.c b/apps/plugins/chessclock.c index 6985976df8..2c0832db1e 100644 --- a/apps/plugins/chessclock.c +++ b/apps/plugins/chessclock.c @@ -395,7 +395,7 @@ #define CHC_SETTINGS_OK BUTTON_SELECT #define CHC_SETTINGS_CANCEL BUTTON_POWER -#elif CONFIG_KEYPAD == SHANLING_Q1_PAD +#elif CONFIG_KEYPAD == SHANLING_Q1_PAD || CONFIG_KEYPAD == HIBY_R3PROII_PAD #define CHC_QUIT BUTTON_POWER #elif (CONFIG_KEYPAD == MA_PAD) diff --git a/apps/plugins/chip8.c b/apps/plugins/chip8.c index d07781c2f0..a484f6d615 100644 --- a/apps/plugins/chip8.c +++ b/apps/plugins/chip8.c @@ -1312,7 +1312,7 @@ CONFIG_KEYPAD == MROBE500_PAD #define CHIP8_KEY9 BUTTON_R #define CHIP8_KEY0 BUTTON_L -#elif CONFIG_KEYPAD == SHANLING_Q1_PAD +#elif CONFIG_KEYPAD == SHANLING_Q1_PAD || CONFIG_KEYPAD == HIBY_R3PROII_PAD /* use touchscreen */ #else diff --git a/apps/plugins/clix.c b/apps/plugins/clix.c index b21a17404e..d30bc4e04d 100644 --- a/apps/plugins/clix.c +++ b/apps/plugins/clix.c @@ -314,7 +314,7 @@ #define CLIX_BUTTON_RIGHT BUTTON_RIGHT #define CLIX_BUTTON_CLICK BUTTON_SELECT -#elif CONFIG_KEYPAD == SHANLING_Q1_PAD +#elif CONFIG_KEYPAD == SHANLING_Q1_PAD || CONFIG_KEYPAD == HIBY_R3PROII_PAD #define CLIX_BUTTON_QUIT BUTTON_POWER #elif CONFIG_KEYPAD == MA_PAD diff --git a/apps/plugins/cube.c b/apps/plugins/cube.c index 6469ce8eee..8ce4766793 100644 --- a/apps/plugins/cube.c +++ b/apps/plugins/cube.c @@ -402,7 +402,7 @@ #define CUBE_PAUSE BUTTON_PLAY #define CUBE_HIGHSPEED BUTTON_BACK -#elif CONFIG_KEYPAD == SHANLING_Q1_PAD +#elif CONFIG_KEYPAD == SHANLING_Q1_PAD || CONFIG_KEYPAD == HIBY_R3PROII_PAD /* use touchscreen */ #elif CONFIG_KEYPAD == MA_PAD diff --git a/apps/plugins/doom/i_video.c b/apps/plugins/doom/i_video.c index acbe83066b..e1b090e792 100644 --- a/apps/plugins/doom/i_video.c +++ b/apps/plugins/doom/i_video.c @@ -629,7 +629,7 @@ void I_ShutdownGraphics(void) #define DOOMBUTTON_WEAPON BUTTON_BACK #define DOOMBUTTON_MAP (BUTTON_BACK|BUTTON_REPEAT) -#elif CONFIG_KEYPAD == SHANLING_Q1_PAD +#elif CONFIG_KEYPAD == SHANLING_Q1_PAD || CONFIG_KEYPAD == HIBY_R3PROII_PAD #define DOOMBUTTON_ESC BUTTON_POWER #define DOOMBUTTON_MAP BUTTON_PREV diff --git a/apps/plugins/flipit.c b/apps/plugins/flipit.c index e9a1791c62..2b1dea0e46 100644 --- a/apps/plugins/flipit.c +++ b/apps/plugins/flipit.c @@ -494,7 +494,7 @@ #define FLIPIT_STEP_BY_STEP BUTTON_VOL_UP #define FLIPIT_TOGGLE BUTTON_SELECT -#elif CONFIG_KEYPAD == SHANLING_Q1_PAD +#elif CONFIG_KEYPAD == SHANLING_Q1_PAD || CONFIG_KEYPAD == HIBY_R3PROII_PAD /* use touchscreen */ #elif CONFIG_KEYPAD == MA_PAD diff --git a/apps/plugins/fractals/fractal.h b/apps/plugins/fractals/fractal.h index 2ed4938b0a..50ec795d6a 100644 --- a/apps/plugins/fractals/fractal.h +++ b/apps/plugins/fractals/fractal.h @@ -504,7 +504,7 @@ #define FRACTAL_PRECISION_DEC BUTTON_BACK #define FRACTAL_RESET BUTTON_PLAY -#elif CONFIG_KEYPAD == SHANLING_Q1_PAD +#elif CONFIG_KEYPAD == SHANLING_Q1_PAD || CONFIG_KEYPAD == HIBY_R3PROII_PAD #define FRACTAL_QUIT BUTTON_POWER #elif CONFIG_KEYPAD == MA_PAD diff --git a/apps/plugins/imageviewer/imageviewer_button.h b/apps/plugins/imageviewer/imageviewer_button.h index 95c9e79a69..a99d976397 100644 --- a/apps/plugins/imageviewer/imageviewer_button.h +++ b/apps/plugins/imageviewer/imageviewer_button.h @@ -557,7 +557,7 @@ #define IMGVIEW_MENU (BUTTON_PLAY|BUTTON_REPEAT) #define IMGVIEW_SLIDE_SHOW BUTTON_PLAY -#elif CONFIG_KEYPAD == SHANLING_Q1_PAD +#elif CONFIG_KEYPAD == SHANLING_Q1_PAD || CONFIG_KEYPAD == HIBY_R3PROII_PAD /* use touchscreen */ #elif CONFIG_KEYPAD == RG_NANO_PAD diff --git a/apps/plugins/invadrox.c b/apps/plugins/invadrox.c index 4fb5cb4538..601c6acfaa 100644 --- a/apps/plugins/invadrox.c +++ b/apps/plugins/invadrox.c @@ -288,7 +288,7 @@ CONFIG_KEYPAD == MROBE500_PAD #define RIGHT BUTTON_RIGHT #define FIRE BUTTON_SELECT -#elif CONFIG_KEYPAD == SHANLING_Q1_PAD +#elif CONFIG_KEYPAD == SHANLING_Q1_PAD || CONFIG_KEYPAD == HIBY_R3PROII_PAD /* use touchscreen */ #elif CONFIG_KEYPAD == MA_PAD @@ -369,7 +369,7 @@ CONFIG_KEYPAD == MROBE500_PAD /* m:robe 500 defines */ #if ((LCD_WIDTH == 640) && (LCD_HEIGHT == 480)) || \ - ((LCD_WIDTH == 480) && (LCD_HEIGHT == 640)) + ((LCD_WIDTH == 480) && (LCD_HEIGHT >= 640)) /* Original arcade game size 224x240, 1bpp with * red overlay at top and green overlay at bottom. diff --git a/apps/plugins/jewels.c b/apps/plugins/jewels.c index 0f72490256..8a0deb7bf4 100644 --- a/apps/plugins/jewels.c +++ b/apps/plugins/jewels.c @@ -377,7 +377,7 @@ CONFIG_KEYPAD == MROBE500_PAD #define HK_SELECT "SELECT" #define HK_CANCEL "BACK" -#elif CONFIG_KEYPAD == SHANLING_Q1_PAD +#elif CONFIG_KEYPAD == SHANLING_Q1_PAD || CONFIG_KEYPAD == HIBY_R3PROII_PAD /* use touchscreen */ #elif CONFIG_KEYPAD == MA_PAD diff --git a/apps/plugins/lib/keymaps.h b/apps/plugins/lib/keymaps.h index c3f9399cc6..94e5afb090 100644 --- a/apps/plugins/lib/keymaps.h +++ b/apps/plugins/lib/keymaps.h @@ -255,7 +255,7 @@ #define BTN_FIRE BUTTON_SELECT #define BTN_PAUSE BUTTON_POWER -#elif CONFIG_KEYPAD == SHANLING_Q1_PAD +#elif CONFIG_KEYPAD == SHANLING_Q1_PAD || CONFIG_KEYPAD == HIBY_R3PROII_PAD #define BTN_FIRE BUTTON_CENTER #define BTN_PAUSE BUTTON_POWER #define BTN_HAVE_DIAGONAL @@ -298,7 +298,8 @@ (CONFIG_KEYPAD != DX50_PAD) && \ (CONFIG_KEYPAD != ONDAVX777_PAD) && \ (CONFIG_KEYPAD != CREATIVE_ZENXFI2_PAD) && \ - (CONFIG_KEYPAD != SHANLING_Q1_PAD) + (CONFIG_KEYPAD != SHANLING_Q1_PAD) && \ + (CONFIG_KEYPAD != HIBY_R3PROII_PAD) #define BTN_FIRE BUTTON_BOTTOMLEFT #define BTN_PAUSE BUTTON_TOPLEFT #endif diff --git a/apps/plugins/lib/pluginlib_actions.c b/apps/plugins/lib/pluginlib_actions.c index ccbeec3acd..5999578d96 100644 --- a/apps/plugins/lib/pluginlib_actions.c +++ b/apps/plugins/lib/pluginlib_actions.c @@ -517,7 +517,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) +#elif (CONFIG_KEYPAD == SHANLING_Q1_PAD || CONFIG_KEYPAD == HIBY_R3PROII_PAD) {PLA_EXIT, BUTTON_POWER, BUTTON_NONE}, #elif (CONFIG_KEYPAD == MA_PAD) {PLA_CANCEL, BUTTON_BACK|BUTTON_REL, BUTTON_BACK}, diff --git a/apps/plugins/midi/midiplay.c b/apps/plugins/midi/midiplay.c index 72fda4f572..01e0e063a6 100644 --- a/apps/plugins/midi/midiplay.c +++ b/apps/plugins/midi/midiplay.c @@ -325,7 +325,7 @@ #define MIDI_VOL_DOWN BUTTON_VOL_DOWN #define MIDI_PLAYPAUSE BUTTON_PLAY -#elif CONFIG_KEYPAD == SHANLING_Q1_PAD +#elif CONFIG_KEYPAD == SHANLING_Q1_PAD || CONFIG_KEYPAD == HIBY_R3PROII_PAD /* use touchscreen */ #elif CONFIG_KEYPAD == MA_PAD diff --git a/apps/plugins/minesweeper.c b/apps/plugins/minesweeper.c index 8bf5511b6b..3616b22b5b 100644 --- a/apps/plugins/minesweeper.c +++ b/apps/plugins/minesweeper.c @@ -452,7 +452,7 @@ CONFIG_KEYPAD == MROBE500_PAD # define MINESWP_DISCOVER (BUTTON_MENU|BUTTON_REPEAT) # define MINESWP_INFO BUTTON_MENU -#elif CONFIG_KEYPAD == SHANLING_Q1_PAD +#elif CONFIG_KEYPAD == SHANLING_Q1_PAD || CONFIG_KEYPAD == HIBY_R3PROII_PAD /* use touchscreen */ #elif CONFIG_KEYPAD == RG_NANO_PAD diff --git a/apps/plugins/mp3_encoder.c b/apps/plugins/mp3_encoder.c index 21a0f8c5ff..ca398ef99d 100644 --- a/apps/plugins/mp3_encoder.c +++ b/apps/plugins/mp3_encoder.c @@ -2583,7 +2583,7 @@ CONFIG_KEYPAD == MROBE500_PAD #define MP3ENC_DONE BUTTON_POWER #define MP3ENC_SELECT BUTTON_SELECT -#elif CONFIG_KEYPAD == SHANLING_Q1_PAD +#elif CONFIG_KEYPAD == SHANLING_Q1_PAD || CONFIG_KEYPAD == HIBY_R3PROII_PAD /* use touchscreen */ #elif CONFIG_KEYPAD == MA_PAD diff --git a/apps/plugins/mpegplayer/mpeg_settings.c b/apps/plugins/mpegplayer/mpeg_settings.c index 46f4ad6fed..e7562ca7d7 100644 --- a/apps/plugins/mpegplayer/mpeg_settings.c +++ b/apps/plugins/mpegplayer/mpeg_settings.c @@ -362,7 +362,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 +#elif CONFIG_KEYPAD == SHANLING_Q1_PAD || CONFIG_KEYPAD == HIBY_R3PROII_PAD #define MPEG_START_TIME_EXIT BUTTON_POWER #elif CONFIG_KEYPAD == RG_NANO_PAD diff --git a/apps/plugins/mpegplayer/mpegplayer.c b/apps/plugins/mpegplayer/mpegplayer.c index ebbf573083..3b816829a5 100644 --- a/apps/plugins/mpegplayer/mpegplayer.c +++ b/apps/plugins/mpegplayer/mpegplayer.c @@ -495,7 +495,7 @@ CONFIG_KEYPAD == SANSA_M200_PAD #define MPEG_RW BUTTON_LEFT #define MPEG_FF BUTTON_RIGHT -#elif CONFIG_KEYPAD == SHANLING_Q1_PAD +#elif CONFIG_KEYPAD == SHANLING_Q1_PAD || CONFIG_KEYPAD == HIBY_R3PROII_PAD /* use touchscreen */ #elif CONFIG_KEYPAD == RG_NANO_PAD diff --git a/apps/plugins/oscilloscope.c b/apps/plugins/oscilloscope.c index 493be2f79c..ae6bcc1aa3 100644 --- a/apps/plugins/oscilloscope.c +++ b/apps/plugins/oscilloscope.c @@ -564,7 +564,7 @@ #define OSCILLOSCOPE_VOL_UP BUTTON_UP #define OSCILLOSCOPE_VOL_DOWN BUTTON_DOWN -#elif CONFIG_KEYPAD == SHANLING_Q1_PAD +#elif CONFIG_KEYPAD == SHANLING_Q1_PAD || CONFIG_KEYPAD == HIBY_R3PROII_PAD /* use touchscreen */ #elif CONFIG_KEYPAD == RG_NANO_PAD diff --git a/apps/plugins/pacbox/pacbox.h b/apps/plugins/pacbox/pacbox.h index 4e6e2704dc..79d191a32b 100644 --- a/apps/plugins/pacbox/pacbox.h +++ b/apps/plugins/pacbox/pacbox.h @@ -398,7 +398,7 @@ #define PACMAN_1UP BUTTON_VOL_UP #define PACMAN_COIN BUTTON_PLAY -#elif CONFIG_KEYPAD == SHANLING_Q1_PAD +#elif CONFIG_KEYPAD == SHANLING_Q1_PAD || CONFIG_KEYPAD == HIBY_R3PROII_PAD #define PACMAN_UP BUTTON_TOPMIDDLE #define PACMAN_DOWN BUTTON_BOTTOMMIDDLE #define PACMAN_LEFT BUTTON_MIDLEFT diff --git a/apps/plugins/pegbox.c b/apps/plugins/pegbox.c index 63ec9de335..c4f2bfd9a0 100644 --- a/apps/plugins/pegbox.c +++ b/apps/plugins/pegbox.c @@ -728,7 +728,7 @@ CONFIG_KEYPAD == MROBE500_PAD #define LVL_UP_TEXT "UP+MENU" #define LVL_DOWN_TEXT "DOWN+MENU" -#elif CONFIG_KEYPAD == SHANLING_Q1_PAD +#elif CONFIG_KEYPAD == SHANLING_Q1_PAD || CONFIG_KEYPAD == HIBY_R3PROII_PAD /* use touchscreen */ #elif CONFIG_KEYPAD == RG_NANO_PAD diff --git a/apps/plugins/pong.c b/apps/plugins/pong.c index b00e837b62..03e50cd8c9 100644 --- a/apps/plugins/pong.c +++ b/apps/plugins/pong.c @@ -325,7 +325,7 @@ CONFIG_KEYPAD == MROBE500_PAD #define PONG_RIGHT_UP BUTTON_BACK #define PONG_RIGHT_DOWN BUTTON_RIGHT -#elif CONFIG_KEYPAD == SHANLING_Q1_PAD +#elif CONFIG_KEYPAD == SHANLING_Q1_PAD || CONFIG_KEYPAD == HIBY_R3PROII_PAD /* use touchscreen */ #elif CONFIG_KEYPAD == MA_PAD diff --git a/apps/plugins/reversi/reversi-gui.h b/apps/plugins/reversi/reversi-gui.h index 4269f7b004..2f108e633a 100644 --- a/apps/plugins/reversi/reversi-gui.h +++ b/apps/plugins/reversi/reversi-gui.h @@ -361,7 +361,7 @@ #define REVERSI_BUTTON_MAKE_MOVE BUTTON_SELECT #define REVERSI_BUTTON_MENU BUTTON_MENU -#elif CONFIG_KEYPAD == SHANLING_Q1_PAD +#elif CONFIG_KEYPAD == SHANLING_Q1_PAD || CONFIG_KEYPAD == HIBY_R3PROII_PAD /* use touchscreen */ #elif (CONFIG_KEYPAD == MA_PAD) diff --git a/apps/plugins/rockblox.c b/apps/plugins/rockblox.c index f362d3d582..9d18be0a6d 100644 --- a/apps/plugins/rockblox.c +++ b/apps/plugins/rockblox.c @@ -468,7 +468,7 @@ #define ROCKBLOX_RESTART BUTTON_BACK #define ROCKBLOX_SCROLL_ENABLED 1 -#elif CONFIG_KEYPAD == SHANLING_Q1_PAD +#elif CONFIG_KEYPAD == SHANLING_Q1_PAD || CONFIG_KEYPAD == HIBY_R3PROII_PAD /* use touchscreen */ #elif CONFIG_KEYPAD == MA_PAD @@ -549,7 +549,7 @@ #define LEVEL_Y 140 #define LINES_Y 210 -#elif (LCD_WIDTH == 480) && (LCD_HEIGHT == 640) +#elif (LCD_WIDTH == 480) && (LCD_HEIGHT >= 640) #define BLOCK_WIDTH 30 #define BLOCK_HEIGHT 30 diff --git a/apps/plugins/rockboy/rockboy.c b/apps/plugins/rockboy/rockboy.c index 3d30524a89..41c7998841 100644 --- a/apps/plugins/rockboy/rockboy.c +++ b/apps/plugins/rockboy/rockboy.c @@ -468,7 +468,7 @@ static void setoptions (void) options.SELECT = BUTTON_VOL_UP; options.MENU = BUTTON_POWER; -#elif CONFIG_KEYPAD == SHANLING_Q1_PAD +#elif CONFIG_KEYPAD == SHANLING_Q1_PAD || CONFIG_KEYPAD == HIBY_R3PROII_PAD /* use touchscreen */ #elif CONFIG_KEYPAD == MA_PAD diff --git a/apps/plugins/rockpaint.c b/apps/plugins/rockpaint.c index 1f21fcf093..cd8cbd3c23 100644 --- a/apps/plugins/rockpaint.c +++ b/apps/plugins/rockpaint.c @@ -404,7 +404,7 @@ #define ROCKPAINT_LEFT BUTTON_LEFT #define ROCKPAINT_RIGHT BUTTON_RIGHT -#elif CONFIG_KEYPAD == SHANLING_Q1_PAD +#elif CONFIG_KEYPAD == SHANLING_Q1_PAD || CONFIG_KEYPAD == HIBY_R3PROII_PAD /* use touchscreen */ #elif CONFIG_KEYPAD == EROSQ_PAD diff --git a/apps/plugins/sliding_puzzle.c b/apps/plugins/sliding_puzzle.c index 5d3340e727..4b3ef6aa20 100644 --- a/apps/plugins/sliding_puzzle.c +++ b/apps/plugins/sliding_puzzle.c @@ -357,7 +357,7 @@ CONFIG_KEYPAD == MROBE500_PAD #define PUZZLE_SHUFFLE BUTTON_BACK #define PUZZLE_PICTURE BUTTON_PLAY -#elif CONFIG_KEYPAD == SHANLING_Q1_PAD +#elif CONFIG_KEYPAD == SHANLING_Q1_PAD || CONFIG_KEYPAD == HIBY_R3PROII_PAD /* use touchscreen */ #elif CONFIG_KEYPAD == MA_PAD diff --git a/apps/plugins/snake.c b/apps/plugins/snake.c index 6c6ff9aa2a..e1d4ebad6b 100644 --- a/apps/plugins/snake.c +++ b/apps/plugins/snake.c @@ -313,7 +313,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 +#elif CONFIG_KEYPAD == SHANLING_Q1_PAD || CONFIG_KEYPAD == HIBY_R3PROII_PAD /* use touchscreen */ #elif CONFIG_KEYPAD == MA_PAD diff --git a/apps/plugins/snake2.c b/apps/plugins/snake2.c index ad26420e7d..7e899525b0 100644 --- a/apps/plugins/snake2.c +++ b/apps/plugins/snake2.c @@ -458,7 +458,7 @@ CONFIG_KEYPAD == MROBE500_PAD #define SNAKE2_PLAYPAUSE BUTTON_PLAY #define SNAKE2_PLAYPAUSE_TEXT "PLAY" -#elif CONFIG_KEYPAD == SHANLING_Q1_PAD +#elif CONFIG_KEYPAD == SHANLING_Q1_PAD || CONFIG_KEYPAD == HIBY_R3PROII_PAD /* use touchscreen */ #elif CONFIG_KEYPAD == MA_PAD diff --git a/apps/plugins/sokoban.c b/apps/plugins/sokoban.c index 3649aacdb6..75af9aac90 100644 --- a/apps/plugins/sokoban.c +++ b/apps/plugins/sokoban.c @@ -696,7 +696,7 @@ #define BUTTON_SAVE BUTTON_BACK #define BUTTON_SAVE_NAME "BACK" -#elif CONFIG_KEYPAD == SHANLING_Q1_PAD +#elif CONFIG_KEYPAD == SHANLING_Q1_PAD || CONFIG_KEYPAD == HIBY_R3PROII_PAD /* use touchscreen */ #elif CONFIG_KEYPAD == MA_PAD diff --git a/apps/plugins/solitaire.c b/apps/plugins/solitaire.c index f0c9982b3b..5feaa4255a 100644 --- a/apps/plugins/solitaire.c +++ b/apps/plugins/solitaire.c @@ -741,7 +741,7 @@ CONFIG_KEYPAD == MROBE500_PAD # define HK_CUR2STACK "HOLD SELECT" # define HK_REM2STACK "VOL+" -#elif CONFIG_KEYPAD == SHANLING_Q1_PAD +#elif CONFIG_KEYPAD == SHANLING_Q1_PAD || CONFIG_KEYPAD == HIBY_R3PROII_PAD # define SOL_QUIT BUTTON_POWER #elif CONFIG_KEYPAD == RG_NANO_PAD diff --git a/apps/plugins/spacerocks.c b/apps/plugins/spacerocks.c index e3e9b9c3b7..a01f608ac4 100644 --- a/apps/plugins/spacerocks.c +++ b/apps/plugins/spacerocks.c @@ -372,7 +372,7 @@ #define AST_RIGHT BUTTON_RIGHT #define AST_FIRE BUTTON_PLAY -#elif CONFIG_KEYPAD == SHANLING_Q1_PAD +#elif CONFIG_KEYPAD == SHANLING_Q1_PAD || CONFIG_KEYPAD == HIBY_R3PROII_PAD /* use touchscreen */ #elif CONFIG_KEYPAD == MA_PAD diff --git a/apps/plugins/star.c b/apps/plugins/star.c index 0f7589b5ed..0d355bbeb4 100644 --- a/apps/plugins/star.c +++ b/apps/plugins/star.c @@ -668,7 +668,7 @@ #define STAR_LEVEL_DOWN_NAME "VOL-" #define STAR_LEVEL_REPEAT_NAME "BACK" -#elif CONFIG_KEYPAD == SHANLING_Q1_PAD +#elif CONFIG_KEYPAD == SHANLING_Q1_PAD || CONFIG_KEYPAD == HIBY_R3PROII_PAD #define STAR_QUIT BUTTON_POWER #define STAR_QUIT_NAME "POWER" diff --git a/apps/plugins/sudoku/sudoku.h b/apps/plugins/sudoku/sudoku.h index 5b7eb431a3..75eab99273 100644 --- a/apps/plugins/sudoku/sudoku.h +++ b/apps/plugins/sudoku/sudoku.h @@ -469,7 +469,7 @@ #define SUDOKU_BUTTON_TOGGLE BUTTON_PLAY #define SUDOKU_BUTTON_POSSIBLE BUTTON_BACK -#elif CONFIG_KEYPAD == SHANLING_Q1_PAD +#elif CONFIG_KEYPAD == SHANLING_Q1_PAD || CONFIG_KEYPAD == HIBY_R3PROII_PAD /* use touchscreen */ #elif CONFIG_KEYPAD == RG_NANO_PAD diff --git a/apps/plugins/test_touchscreen.c b/apps/plugins/test_touchscreen.c index 79eb48f75e..97e1544c5e 100644 --- a/apps/plugins/test_touchscreen.c +++ b/apps/plugins/test_touchscreen.c @@ -37,7 +37,7 @@ #elif CONFIG_KEYPAD == CREATIVE_ZENXFI2_PAD #define TOUCHSCREEN_QUIT BUTTON_POWER #define TOUCHSCREEN_TOGGLE BUTTON_MENU -#elif CONFIG_KEYPAD == SHANLING_Q1_PAD +#elif CONFIG_KEYPAD == SHANLING_Q1_PAD || CONFIG_KEYPAD == HIBY_R3PROII_PAD #define TOUCHSCREEN_QUIT BUTTON_POWER #define TOUCHSCREEN_TOGGLE BUTTON_PLAY #elif (CONFIG_KEYPAD == ANDROID_PAD) diff --git a/apps/plugins/text_viewer/tv_button.h b/apps/plugins/text_viewer/tv_button.h index f77b8b2fcc..1d7cb7655e 100644 --- a/apps/plugins/text_viewer/tv_button.h +++ b/apps/plugins/text_viewer/tv_button.h @@ -572,7 +572,7 @@ #define TV_LINE_DOWN BUTTON_SCROLL_FWD #define TV_BOOKMARK BUTTON_PLAY -#elif CONFIG_KEYPAD == SHANLING_Q1_PAD +#elif CONFIG_KEYPAD == SHANLING_Q1_PAD || CONFIG_KEYPAD == HIBY_R3PROII_PAD #define TV_BOOKMARK BUTTON_PLAY #elif CONFIG_KEYPAD == MA_PAD diff --git a/apps/plugins/vu_meter.c b/apps/plugins/vu_meter.c index 213e7c4904..27caba2839 100644 --- a/apps/plugins/vu_meter.c +++ b/apps/plugins/vu_meter.c @@ -454,7 +454,7 @@ #define LABEL_MENU "MENU" #define LABEL_VOLUME "VOL+/VOL-" -#elif CONFIG_KEYPAD == SHANLING_Q1_PAD +#elif CONFIG_KEYPAD == SHANLING_Q1_PAD || CONFIG_KEYPAD == HIBY_R3PROII_PAD /* use touchscreen */ #elif CONFIG_KEYPAD == MA_PAD diff --git a/apps/plugins/wormlet.c b/apps/plugins/wormlet.c index 1b8b1507f7..f8c8d904ed 100644 --- a/apps/plugins/wormlet.c +++ b/apps/plugins/wormlet.c @@ -407,7 +407,7 @@ CONFIG_KEYPAD == MROBE500_PAD #define BTN_QUIT BUTTON_POWER #define BTN_STOPRESET BUTTON_BACK -#elif CONFIG_KEYPAD == SHANLING_Q1_PAD +#elif CONFIG_KEYPAD == SHANLING_Q1_PAD || CONFIG_KEYPAD == HIBY_R3PROII_PAD /* use touchscreen */ #elif CONFIG_KEYPAD == MA_PAD @@ -522,7 +522,7 @@ CONFIG_KEYPAD == MROBE500_PAD #define SPEED 4 #define MAX_WORM_SEGMENTS 512 #elif ((LCD_WIDTH == 640) && (LCD_HEIGHT == 480)) || \ - ((LCD_WIDTH == 480) && (LCD_HEIGHT == 640)) + ((LCD_WIDTH == 480) && (LCD_HEIGHT >= 640)) #define FOOD_SIZE 14 #define ARGH_SIZE 16 #define SPEED 4 diff --git a/apps/plugins/xobox.c b/apps/plugins/xobox.c index ce243b502b..2cf6912de7 100644 --- a/apps/plugins/xobox.c +++ b/apps/plugins/xobox.c @@ -360,7 +360,7 @@ CONFIG_KEYPAD == MROBE500_PAD #define DOWN BUTTON_DOWN #define PAUSE BUTTON_PLAY -#elif CONFIG_KEYPAD == SHANLING_Q1_PAD +#elif CONFIG_KEYPAD == SHANLING_Q1_PAD || CONFIG_KEYPAD == HIBY_R3PROII_PAD /* use touchscreen */ #elif CONFIG_KEYPAD == RG_NANO_PAD diff --git a/apps/plugins/zxbox/keymaps.h b/apps/plugins/zxbox/keymaps.h index 9f82e29beb..e3f712da60 100644 --- a/apps/plugins/zxbox/keymaps.h +++ b/apps/plugins/zxbox/keymaps.h @@ -290,7 +290,7 @@ #define ZX_UP BUTTON_UP #define ZX_DOWN BUTTON_DOWN -#elif CONFIG_KEYPAD == SHANLING_Q1_PAD +#elif CONFIG_KEYPAD == SHANLING_Q1_PAD || CONFIG_KEYPAD == HIBY_R3PROII_PAD /* use touchscreen */ #elif CONFIG_KEYPAD == MA_PAD diff --git a/apps/settings.c b/apps/settings.c index 9d46931145..767a320819 100644 --- a/apps/settings.c +++ b/apps/settings.c @@ -75,6 +75,9 @@ #include "statusbar-skinned.h" #include "bootchart.h" #include "scroll_engine.h" +#ifdef HAVE_GENERAL_PURPOSE_LED +#include "led-general-purpose.h" +#endif #ifndef __PCTOOL__ struct user_settings global_settings; @@ -1093,10 +1096,14 @@ void settings_apply(bool read_disk) #if defined(DX50) || defined(DX90) ibasso_set_usb_mode(global_settings.usb_mode); +#elif (defined(HIBY_R3PROII) || defined(HIBY_R1)) && !defined(SIMULATOR) + hiby_set_usb_mode(global_settings.usb_mode); #elif defined(HAVE_USB_POWER) && !defined(USB_NONE) && !defined(SIMULATOR) usb_set_mode(global_settings.usb_mode); #endif - +#if defined(HAVE_GENERAL_PURPOSE_LED) + led_hw_on(); +#endif #if defined(DX50) || defined(DX90) ibasso_set_governor(global_settings.governor); #endif diff --git a/apps/settings.h b/apps/settings.h index 9b8f82de5a..85b5cd102d 100644 --- a/apps/settings.h +++ b/apps/settings.h @@ -935,6 +935,9 @@ struct user_settings int hp_lo_select; /* indicates automatic, headphone-only, or lineout-only operation */ #endif bool playback_log; /* ROCKBOX_DIR/playback.log for tracks played */ +#if defined(HAVE_GENERAL_PURPOSE_LED) + bool use_led_indicators; +#endif }; /* global settings */ diff --git a/apps/settings_list.c b/apps/settings_list.c index a029cfa7fa..dfaede027a 100644 --- a/apps/settings_list.c +++ b/apps/settings_list.c @@ -2399,7 +2399,7 @@ const struct settings_list settings[] = { USBMODE_DEFAULT, "usb mode", "mass storage,charge" -#if defined(DX50) || defined(DX90) +#if defined(DX50) || defined(DX90) || defined(HIBY_R3PROII) || defined(HIBY_R1) ",adb" #endif , @@ -2408,14 +2408,18 @@ const struct settings_list settings[] = { 3, #else usb_set_mode, +#if defined(HIBY_R3PROII) || defined(HIBY_R1) + 3, +#else 2, +#endif #endif ID2P(LANG_USB_MODE_MASS_STORAGE), ID2P(LANG_USB_MODE_CHARGE) -#if defined(DX50) || defined(DX90) +#if defined(DX50) || defined(DX90) || defined(HIBY_R3PROII) || defined(HIBY_R1) ,ID2P(LANG_USB_MODE_ADB) #endif - ), + ), #endif #if defined(BUTTON_REC) || \ (CONFIG_KEYPAD == GIGABEAT_PAD) || \ @@ -2430,6 +2434,9 @@ const struct settings_list settings[] = { ID2P(LANG_AUTO), ID2P(LANG_HEADPHONE), ID2P(LANG_LINEOUT)), #endif OFFON_SETTING(0, playback_log, LANG_LOGGING, false, "play log", NULL), +#if defined(HAVE_GENERAL_PURPOSE_LED) + OFFON_SETTING(0, use_led_indicators, LANG_USE_LED_INDICATORS, false, "LED indicators", NULL), +#endif }; const int nb_settings = sizeof(settings)/sizeof(*settings); diff --git a/backdrops/cabbiev2.480x720x16.bmp b/backdrops/cabbiev2.480x720x16.bmp new file mode 100644 index 0000000000..c612c592af Binary files /dev/null and b/backdrops/cabbiev2.480x720x16.bmp differ diff --git a/bootloader/hibyos_linux.c b/bootloader/hibyos_linux.c index d0dfe2b8de..edda204796 100644 --- a/bootloader/hibyos_linux.c +++ b/bootloader/hibyos_linux.c @@ -47,6 +47,9 @@ #include #include "version.h" +//#define ENABLE_LOGGING +//#define AUTO_ENABLE_ADB + /* Basic configuration */ #if defined(AGPTEK_ROCKER) #define ICON_WIDTH 70 @@ -101,6 +104,28 @@ #define BUTTON_LEFT BUTTON_SCROLL_BACK #define BUTTON_RIGHT BUTTON_SCROLL_FWD #include "bitmaps/hibyicon.h" +#elif defined(HIBY_R3PROII) +#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 +#define BUTTON_LEFT BUTTON_VOL_DOWN +#define BUTTON_RIGHT BUTTON_VOL_UP +#include "bitmaps/hibyicon.h" +#elif defined(HIBY_R1) +#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 +#define BUTTON_LEFT BUTTON_VOL_DOWN +#define BUTTON_RIGHT BUTTON_VOL_UP +#include "bitmaps/hibyicon.h" #else #error "must define ICON_WIDTH/HEIGHT" #endif @@ -254,12 +279,14 @@ 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(!adb_running && power_input_status() & POWER_INPUT_USB_CHARGER) { /* save last choice */ save_boot_mode(mode); return mode; } +#endif /* inactivity detection */ int timeout = last_activity + get_inactivity_tmo(init_mode == mode); if(TIME_AFTER(current_tick, timeout)) @@ -499,7 +526,11 @@ static void adb(int start) pid_t pid = fork(); if(pid == 0) { +#if defined(HIBY_R3PROII) || defined(HIBY_R1) + execlp("/etc/init.d/T90adb", "T90adb", start ? "start" : "stop", NULL); +#else execlp("/etc/init.d/K90adb", "K90adb", start ? "start" : "stop", NULL); +#endif _exit(42); } int status; @@ -572,7 +603,7 @@ static void tools_screen(void) } } -#if 0 +#ifdef ENABLE_LOGGING /* open log file */ static int open_log(void) { @@ -597,7 +628,13 @@ int main(int argc, char **argv) { (void) argc; (void) argv; -#if 0 + +#ifdef AUTO_ENABLE_ADB + // Boot with adb for debugging + adb(1); +#endif + + #ifdef ENABLE_LOGGING /* redirect stdout and stderr to have error messages logged somewhere on the * user partition */ int fd = open_log(); @@ -611,7 +648,7 @@ int main(int argc, char **argv) printf("Rockbox boot loader\n"); printf("Version: %s\n", rbversion); printf("%s\n", MODEL_NAME); -#endif + #endif system_init(); core_allocator_init(); @@ -635,7 +672,7 @@ int main(int argc, char **argv) enum boot_mode mode = get_boot_mode(); if (mode == BOOT_OF) { -#if 0 +#ifdef ENABLE_LOGGING fflush(stdout); fflush(stderr); close(fileno(stdout)); @@ -657,11 +694,26 @@ int main(int argc, char **argv) } else if(mode == BOOT_ROCKBOX) { +#if defined(HIBY_R3PROII) || defined(HIBY_R1) + /* Suspend bluetooth as it's not currently supported */ + system("/usr/bin/bt_suspend"); +#endif fflush(stdout); mount_storage(true); system("/bin/cp " BASE_DIR "/.rockbox/" BOOTFILE " /tmp"); system("/bin/chmod +x /tmp/" BOOTFILE); +#ifdef HIBY_R1 + /* Load libasound from Rockbox directory */ + char *argvr1[] = { "/tmp/" BOOTFILE, 0 }; + char *envpr1[] = + { + "LD_LIBRARY_PATH=/data/mnt/sd_0/.rockbox", + 0 + }; + execve(argvr1[0], &argvr1[0], envpr1); +#else execl("/tmp/" BOOTFILE, BOOTFILE, NULL); +#endif printf("execvp failed: %s\n", strerror(errno)); error_screen("Cannot boot Rockbox!"); mode = BOOT_TOOLS; diff --git a/docs/CREDITS b/docs/CREDITS index 0b59d2682a..71d9e2fcd2 100644 --- a/docs/CREDITS +++ b/docs/CREDITS @@ -750,6 +750,7 @@ Gyúróczki Norbert Ivan Romaniuk-Mikhailovsky Matthieu BACHELIER Petr Mikhalitsyn +Melissa Autumn The libmad team The wavpack team diff --git a/firmware/SOURCES b/firmware/SOURCES index d878acc85d..bf9849a5f4 100644 --- a/firmware/SOURCES +++ b/firmware/SOURCES @@ -156,6 +156,26 @@ target/hosted/lcd-linuxfb.c target/hosted/power-linux.c #endif +#if defined(HIBY_R3PROII) && !defined(SIMULATOR) +target/hosted/hiby/usb-hiby-gadget.c +target/hosted/hiby/r3proii/button-r3proii.c +target/hosted/hiby/r3proii/powermgmt-r3proii.c +#ifndef BOOTLOADER +target/hosted/hiby/r3proii/led-r3proii.c +target/hosted/hiby/hibylinux_codec.c +#endif +#endif + +#if defined(HIBY_R1) && !defined(SIMULATOR) +target/hosted/hiby/usb-hiby-gadget.c +target/hosted/hiby/r1/button-r1.c +target/hosted/hiby/r1/powermgmt-r1.c +#ifndef BOOTLOADER +target/hosted/hiby/r1/led-r1.c +target/hosted/hiby/hibylinux_codec.c +#endif +#endif + #if defined(AGPTEK_ROCKER) && !defined(SIMULATOR) target/hosted/agptek/button-agptek.c target/hosted/agptek/debug-agptek.c @@ -184,10 +204,13 @@ target/hosted/xduoo/xduoolinux_codec.c #endif #if defined(HIBY_LINUX) && !defined(SIMULATOR) -target/hosted/usb-hiby.c target/hosted/button-devinput.c #endif +#if defined(HIBY_LINUX) && !defined(HIBY_R3PROII) && !defined(HIBY_R1) && !defined(SIMULATOR) +target/hosted/usb-hiby.c +#endif + #if defined(FIIO_M3K_LINUX) && !defined(SIMULATOR) target/hosted/fiio/buttonlight-fiio.c target/hosted/fiio/button-fiio.c diff --git a/firmware/export/audiohw.h b/firmware/export/audiohw.h index 7019119306..e0a8df2f54 100644 --- a/firmware/export/audiohw.h +++ b/firmware/export/audiohw.h @@ -243,6 +243,8 @@ struct sound_settings_info #include "erosqlinux_codec.h" #elif defined(HAVE_TLV320AIC3104) #include "tlv320aic3104_codec.h" +#elif defined(HAVE_HIBY_LINUX_CODEC) +#include "hibylinux_codec.h" #endif #if defined(HAVE_X1000_ICODEC_REC) && !defined(HAVE_X1000_ICODEC_PLAY) diff --git a/firmware/export/config.h b/firmware/export/config.h index 8fd1e8c0c6..915c03ff51 100644 --- a/firmware/export/config.h +++ b/firmware/export/config.h @@ -166,6 +166,7 @@ #define SURFANS_F28_PAD 76 #define RG_NANO_PAD 77 #define CTRU_PAD 78 +#define HIBY_R3PROII_PAD 79 /* CONFIG_REMOTE_KEYPAD */ #define H100_REMOTE 1 @@ -618,6 +619,10 @@ Lyre prototype 1 */ #include "config/rgnano.h" #elif defined(CTRU) #include "config/ctru.h" +#elif defined(HIBY_R3PROII) +#include "config/hibyr3proii.h" +#elif defined(HIBY_R1) +#include "config/hibyr1.h" #else #error "unknown hardware platform!" #endif diff --git a/firmware/export/config/hibylinux.h b/firmware/export/config/hibylinux.h index e3f881e324..98e8893a41 100644 --- a/firmware/export/config/hibylinux.h +++ b/firmware/export/config/hibylinux.h @@ -5,8 +5,10 @@ #ifndef SIMULATOR #define CONFIG_PLATFORM (PLATFORM_HOSTED) +#ifndef PIVOT_ROOT #define PIVOT_ROOT "/mnt/sd_0" #endif +#endif #define HAVE_FPU @@ -41,9 +43,13 @@ #define CONFIG_LCD LCD_INGENIC_LINUX +#ifndef LCD_DEPTH #define LCD_DEPTH 32 +#endif +#ifndef LCD_PIXELFORMAT /* Check that but should not matter */ #define LCD_PIXELFORMAT XRGB8888 +#endif #define HAVE_BACKLIGHT #define HAVE_BACKLIGHT_BRIGHTNESS @@ -51,13 +57,23 @@ /* Main LCD backlight brightness range and defaults: the backlight driver * has levels from 0 to 255. But 0 is off so start at 1. */ +#ifndef MIN_BRIGHTNESS_SETTING #define MIN_BRIGHTNESS_SETTING 1 +#endif +#ifndef MAX_BRIGHTNESS_SETTING #define MAX_BRIGHTNESS_SETTING 255 +#endif +#ifndef BRIGHTNESS_STEP #define BRIGHTNESS_STEP 5 +#endif +#ifndef DEFAULT_BRIGHTNESS_SETTING #define DEFAULT_BRIGHTNESS_SETTING 255 +#endif /* Which backlight fading type? */ +#if !defined(CONFIG_BACKLIGHT_FADING) #define CONFIG_BACKLIGHT_FADING BACKLIGHT_FADING_SW_SETTING +#endif /* define this if you have a real-time clock */ #define CONFIG_RTC RTC_HOSTED @@ -81,12 +97,18 @@ #define NUM_DRIVES 2 #define HAVE_HOTSWAP #define HAVE_HOTSWAP_STORAGE_AS_MAIN +#ifndef MULTIDRIVE_DIR #define MULTIDRIVE_DIR "/mnt/usb" +#endif #define MULTIDRIVE_DEV "/sys/block/sda" #define ROOTDRIVE_DEV "/sys/block/mmcblk0" /* More common stuff */ +#ifndef BATTERY_DEV_NAME #ifndef EROS_Q #define BATTERY_DEV_NAME "battery" #endif +#endif +#ifndef POWER_DEV_NAME #define POWER_DEV_NAME "usb" +#endif diff --git a/firmware/export/config/hibyr1.h b/firmware/export/config/hibyr1.h new file mode 100644 index 0000000000..f5b3707f6f --- /dev/null +++ b/firmware/export/config/hibyr1.h @@ -0,0 +1,90 @@ +/* + * This config file is for the HiBy R1 + */ + +/* For Rolo and boot loader */ +#define MODEL_NUMBER 124 +#define MODEL_NAME "HIBY R1" + +#define PIVOT_ROOT "/data/mnt/sd_0" +#define MULTIDRIVE_DIR "/data/mnt/usb" + +/* LCD dimensions */ +/* sqrt(width^2 + height^2) / 4 = 233 */ +#define LCD_WIDTH 480 +#define LCD_HEIGHT 800 +#define LCD_DPI 233 + +#define HAVE_LCD_SLEEP +#define LCD_SLEEP_TIMEOUT (2*HZ) + +#define LCD_DEPTH 16 /* 65536 colours */ +#define LCD_PIXELFORMAT RGB565 /* rgb565 */ + +#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 +#define NO_BUTTON_LR + +#ifndef BOOTLOADER +#define HAVE_BUTTON_DATA +#define HAVE_TOUCHSCREEN +#endif + +#ifndef CONFIG_BACKLIGHT_FADING +#undef CONFIG_BACKLIGHT_FADING +#endif + +/* KeyPad configuration for plugins */ +#define CONFIG_KEYPAD HIBY_R3PROII_PAD + +/* define this if the target has volume keys which can be used in the lists */ +#define HAVE_VOLUME_IN_LIST + +/* 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 "r1" +#define BOOTFILE "rockbox." BOOTFILE_EXT +#define BOOTDIR "/.rockbox" + +/* USB */ +#define USB_VID_STR "32BB" +#define USB_PID_STR "0101" + +/* Generic HiBy stuff */ +#include "hibylinux.h" diff --git a/firmware/export/config/hibyr3proii.h b/firmware/export/config/hibyr3proii.h new file mode 100644 index 0000000000..d10b510943 --- /dev/null +++ b/firmware/export/config/hibyr3proii.h @@ -0,0 +1,94 @@ +/* + * This config file is for the HiBy R3 Pro II based on the x1600E soc + */ + +/* For Rolo and boot loader */ +#define MODEL_NUMBER 123 +#define MODEL_NAME "HIBY R3 PRO II" + +#define PIVOT_ROOT "/data/mnt/sd_0" +#define MULTIDRIVE_DIR "/data/mnt/usb" + +/* LCD dimensions */ +/* sqrt(width^2 + height^2) / 4 = 216 */ +#define LCD_WIDTH 480 +#define LCD_HEIGHT 720 +#define LCD_DPI 216 + +#define HAVE_LCD_SLEEP +#define LCD_SLEEP_TIMEOUT (2*HZ) + +#define LCD_DEPTH 16 /* 65536 colours */ +#define LCD_PIXELFORMAT RGB565 /* rgb565 */ + +#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 +#define NO_BUTTON_LR + +#ifndef BOOTLOADER +#define HAVE_BUTTON_DATA +#define HAVE_TOUCHSCREEN +#endif + +#ifndef CONFIG_BACKLIGHT_FADING +#undef CONFIG_BACKLIGHT_FADING +#endif + +/* KeyPad configuration for plugins */ +#define CONFIG_KEYPAD HIBY_R3PROII_PAD + +/* define this if the target has volume keys which can be used in the lists */ +#define HAVE_VOLUME_IN_LIST + +/* Battery doesn't update its charging status, but the charger does. */ +#define POWER_DEV_NAME "mp2731-charger" +#define BATTERY_DEV_NAME "mp2731-charger" + +/* 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 "r3proii" +#define BOOTFILE "rockbox." BOOTFILE_EXT +#define BOOTDIR "/.rockbox" + +/* USB */ +#define USB_VID_STR "32BB" +#define USB_PID_STR "0101" + +/* Generic HiBy stuff */ +#include "hibylinux.h" diff --git a/firmware/export/hibylinux_codec.h b/firmware/export/hibylinux_codec.h new file mode 100644 index 0000000000..d0b7f8c706 --- /dev/null +++ b/firmware/export/hibylinux_codec.h @@ -0,0 +1,17 @@ +#ifndef __HIBYLINUX_CODEC__ +#define __HIBYLINUX_CODEC__ + +#define AUDIOHW_CAPS (FILTER_ROLL_OFF_CAP) +AUDIOHW_SETTING(VOLUME, "dB", 1, 5, -102*10, 0, -30*10) +#endif + +//#define AUDIOHW_MUTE_ON_STOP +#define AUDIOHW_MUTE_ON_SRATE_CHANGE +//#define AUDIOHW_NEEDS_INITIAL_UNMUTE + +AUDIOHW_SETTING(FILTER_ROLL_OFF, "", 0, 1, 0, 4, 0) +#define AUDIOHW_HAVE_SHORT2_ROLL_OFF + +void audiohw_mute(int mute); +void hiby_set_output(int ps); +int hiby_get_outputs(void); diff --git a/firmware/export/led-general-purpose.h b/firmware/export/led-general-purpose.h new file mode 100644 index 0000000000..2d3d9836ca --- /dev/null +++ b/firmware/export/led-general-purpose.h @@ -0,0 +1,35 @@ +/*************************************************************************** + * __________ __ ___ + * Open \______ \ ____ ____ | | _\_ |__ _______ ___ + * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / + * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < + * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ + * \/ \/ \/ \/ \/ + * + * Copyright (C) 2025 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. + * + ****************************************************************************/ +#ifndef __LED_GENERAL_PURPOSE_H__ +#define __LED_GENERAL_PURPOSE_H__ + +#ifdef HAVE_GENERAL_PURPOSE_LED + +extern void led_hw_set_mode(bool mode); +extern void led_hw_brightness(int brightness); +extern void led_hw_on(void); +extern void led_hw_off(void); +extern void led_hw_charging(void); +extern void led_hw_charged(void); + +#endif /* HAVE_GENERAL_PURPOSE_LED */ + +#endif + diff --git a/firmware/export/rbpaths.h b/firmware/export/rbpaths.h index 322f47bbe0..b00a0aba46 100644 --- a/firmware/export/rbpaths.h +++ b/firmware/export/rbpaths.h @@ -87,7 +87,8 @@ #if defined(APPLICATION) && \ !(defined(SAMSUNG_YPR0) || defined(SAMSUNG_YPR1) || \ - defined(DX50) || defined(DX90) || defined(SONY_NWZ_LINUX) || defined(HIBY_LINUX) || defined(FIIO_M3K_LINUX) || defined(CTRU)) + defined(DX50) || defined(DX90) || defined(SONY_NWZ_LINUX) || \ + defined(HIBY_LINUX) || defined(FIIO_M3K_LINUX) || defined(CTRU)) #define PLUGIN_DATA_DIR ROCKBOX_DIR "/rocks.data" #define PLUGIN_GAMES_DATA_DIR PLUGIN_DATA_DIR diff --git a/firmware/kernel/include/queue.h b/firmware/kernel/include/queue.h index b404252efb..71980a293f 100644 --- a/firmware/kernel/include/queue.h +++ b/firmware/kernel/include/queue.h @@ -76,9 +76,14 @@ #define IS_SYSEVENT(ev) ((ev & SYS_EVENT) == SYS_EVENT) #define MAX_NUM_QUEUES 32 +#if defined(HAVE_TOUCHSCREEN) /* Multitouch generates more events */ +#define QUEUE_LENGTH 32 /* MUST be a power of 2 */ +#else #define QUEUE_LENGTH 16 /* MUST be a power of 2 */ +#endif #define QUEUE_LENGTH_MASK (QUEUE_LENGTH - 1) + struct queue_event { long id; diff --git a/firmware/target/hosted/backlight-unix.c b/firmware/target/hosted/backlight-unix.c index fb9fc18c06..7c62f69c0c 100644 --- a/firmware/target/hosted/backlight-unix.c +++ b/firmware/target/hosted/backlight-unix.c @@ -8,6 +8,7 @@ * * Copyright (C) 2017 Marcin Bukat * Copyright (C) 2019 by Roman Stolyarov + * 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 @@ -31,12 +32,18 @@ #include "panic.h" #include "lcd.h" -#ifdef BACKLIGHT_RG_NANO +#if defined(BACKLIGHT_RG_NANO) static const char * const sysfs_bl_brightness = "/sys/class/backlight/backlight/brightness"; static const char * const sysfs_bl_power = "/sys/class/backlight/backlight/bl_power"; +#elif defined(BACKLIGHT_HIBY) +static const char * const sysfs_bl_brightness = + "/sys/class/backlight/backlight_pwm0/brightness"; + +static const char * const sysfs_bl_power = + "/sys/class/backlight/backlight_pwm0/bl_power"; #else static const char * const sysfs_bl_brightness = "/sys/class/backlight/pwm-backlight.0/brightness"; @@ -60,25 +67,30 @@ bool backlight_hw_init(void) static int last_bl = -1; +/* Ref: https://www.kernel.org/doc/html/latest/gpu/backlight.html#c.backlight_properties */ +#define BACKLIGHT_POWER_ON 0 +#define BACKLIGHT_POWER_REDUCED 1 +#define BACKLIGHT_POWER_OFF 4 + void backlight_hw_on(void) { - if (last_bl != 1) { + if (last_bl != BACKLIGHT_POWER_ON) { #ifdef HAVE_LCD_ENABLE lcd_enable(true); #endif - sysfs_set_int(sysfs_bl_power, 0); - last_bl = 1; + last_bl = BACKLIGHT_POWER_ON; + sysfs_set_int(sysfs_bl_power, last_bl); } } void backlight_hw_off(void) { - if (last_bl != 0) { - sysfs_set_int(sysfs_bl_power, 1); + if (last_bl != BACKLIGHT_POWER_REDUCED) { + last_bl = BACKLIGHT_POWER_REDUCED; + sysfs_set_int(sysfs_bl_power, last_bl); #ifdef HAVE_LCD_ENABLE lcd_enable(false); #endif - last_bl = 0; } } @@ -92,3 +104,21 @@ void backlight_hw_brightness(int brightness) sysfs_set_int(sysfs_bl_brightness, brightness); } + +#ifdef HAVE_LCD_SLEEP +void lcd_awake(void) +{ + /* Nothing to do */ +} + +void lcd_sleep(void) +{ + if (last_bl != BACKLIGHT_POWER_OFF) { + last_bl = BACKLIGHT_POWER_OFF; + sysfs_set_int(sysfs_bl_power, last_bl); +#ifdef HAVE_LCD_ENABLE + lcd_enable(false); +#endif + } +} +#endif diff --git a/firmware/target/hosted/button-devinput.c b/firmware/target/hosted/button-devinput.c index 57617b433c..19ed3fcba7 100644 --- a/firmware/target/hosted/button-devinput.c +++ b/firmware/target/hosted/button-devinput.c @@ -109,27 +109,21 @@ static enum #define EVENT_VALUE_TOUCHSCREEN_PRESS 1 #define EVENT_VALUE_TOUCHSCREEN_RELEASE -1 -static int ts_enabled = 0; +static int ts_enabled = 1; void touchscreen_enable_device(bool en) { ts_enabled = en; } -static bool handle_touchscreen_event(__u16 code, __s32 value) +static void handle_touchscreen_event(__u16 code, __s32 value) { - bool read_more = false; - switch(code) { case ABS_X: case ABS_MT_POSITION_X: { _last_x = value; - - /* x -> next will be y. */ - read_more = true; - break; } @@ -142,22 +136,17 @@ static bool handle_touchscreen_event(__u16 code, __s32 value) case ABS_MT_TRACKING_ID: { - if(value == EVENT_VALUE_TOUCHSCREEN_PRESS) + if(value == EVENT_VALUE_TOUCHSCREEN_RELEASE) { - _last_touch_state = TOUCHSCREEN_STATE_DOWN; - - /* Press -> next will be x. */ - read_more = true; + _last_touch_state = TOUCHSCREEN_STATE_UP; } else { - _last_touch_state = TOUCHSCREEN_STATE_UP; + _last_touch_state = TOUCHSCREEN_STATE_DOWN; } break; } } - - return read_more; } #endif @@ -227,7 +216,7 @@ int button_read_device(BDATA) #if defined(HAVE_TOUCHSCREEN) && defined(BUTTON_TOUCH) /* Some touchscreens give us actual touch/untouch as a "key" */ if (bmap & BUTTON_TOUCH) { - handle_touchscreen_event(ABS_MT_TRACKING_ID, 0); + handle_touchscreen_event(ABS_MT_TRACKING_ID, EVENT_VALUE_TOUCHSCREEN_RELEASE); bmap &= ~BUTTON_TOUCH; } #endif diff --git a/firmware/target/hosted/hiby/adc-target.h b/firmware/target/hosted/hiby/adc-target.h new file mode 100644 index 0000000000..e69de29bb2 diff --git a/firmware/target/hosted/hiby/hibylinux_codec.c b/firmware/target/hosted/hiby/hibylinux_codec.c new file mode 100644 index 0000000000..656e07a6a1 --- /dev/null +++ b/firmware/target/hosted/hiby/hibylinux_codec.c @@ -0,0 +1,158 @@ +/*************************************************************************** + * __________ __ ___. + * Open \______ \ ____ ____ | | _\_ |__ _______ ___ + * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / + * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < + * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ + * \/ \/ \/ \/ \/ + * $Id$ + * + * + * Copyright (c) 2018 Marcin Bukat + * Copyright (c) 2025 Solomon Peachy + * + * 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. + * + ****************************************************************************/ + +//#define LOGF_ENABLE + +#include "config.h" +#include "audio.h" +#include "audiohw.h" +#include "button.h" +#include "system.h" +#include "kernel.h" +#include "panic.h" +#include "sysfs.h" +#include "alsa-controls.h" +#include "pcm-alsa.h" + +#include "logf.h" + +int hiby_has_valid_output(void); + +static int hw_init = 0; + +static long int vol_l_hw = 255; +static long int vol_r_hw = 255; +static long int last_ps = -1; + +static int muted = -1; + +void audiohw_mute(int mute) +{ + if (hw_init < 0 || muted == mute) + return; + + muted = mute; + + alsa_controls_set_bool("Mute Output", !!mute); +} + +int hiby_has_valid_output(void) { + long int ps = 0; // Muted, if nothing is plugged in! + + int status = 0; + + if (!hw_init) return ps; + + const char * const sysfs_hs_switch = "/sys/class/switch/headset/state"; + const char * const sysfs_bal_switch = "/sys/class/switch/balance/state"; + + sysfs_get_int(sysfs_hs_switch, &status); + if (status) ps = 2; // headset + + sysfs_get_int(sysfs_bal_switch, &status); + if (status) ps = 3; // balanced output + + return ps; +} + +int hiby_get_outputs(void){ + long int ps = hiby_has_valid_output(); + + hiby_set_output(ps); + + return ps; +} + +void hiby_set_output(int ps) +{ + if (!hw_init || muted) return; + + if (last_ps != ps) + { + logf("set out %d/%d", ps, last_ps); + /* Output port switch */ + last_ps = ps; + alsa_controls_set_ints("Output Port Switch", 1, &last_ps); + audiohw_set_volume(vol_l_hw, vol_r_hw); + } +} + +void audiohw_preinit(void) +{ + logf("hw preinit"); + alsa_controls_init("default"); + hw_init = 1; + + audiohw_mute(false); /* No need ? */ + alsa_controls_set_bool("DOP_EN", 0); //isDSD +} + +void audiohw_postinit(void) +{ + logf("hw postinit"); +} + +void audiohw_close(void) +{ + logf("hw close"); + hw_init = 0; + alsa_controls_close(); +} + +void audiohw_set_frequency(int fsel) +{ + (void)fsel; +} + +void audiohw_set_volume(int vol_l, int vol_r) +{ + logf("hw vol %d %d", vol_l, vol_r); + + long l,r; + + vol_l_hw = vol_l; + vol_r_hw = vol_r; + + l = -vol_l/5; + r = -vol_r/5; + + if (!hw_init) + return; + + alsa_controls_set_ints("Left Playback Volume", 1, &l); + alsa_controls_set_ints("Right Playback Volume", 1, &r); +} + +void audiohw_set_filter_roll_off(int value) +{ + logf("rolloff %d", value); + /* 0 = Sharp; + * 1 = Slow; + * 2 = Short Sharp + * 3 = Short Slow + * 4 = Super Slow */ + long int value_hw = value; + alsa_controls_set_ints("Digital Filter", 1, &value_hw); + +} + diff --git a/firmware/target/hosted/hiby/lcd-target.h b/firmware/target/hosted/hiby/lcd-target.h new file mode 100644 index 0000000000..4882fab60a --- /dev/null +++ b/firmware/target/hosted/hiby/lcd-target.h @@ -0,0 +1,32 @@ +/*************************************************************************** + * __________ __ ___. + * Open \______ \ ____ ____ | | _\_ |__ _______ ___ + * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / + * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < + * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ + * \/ \/ \/ \/ \/ + * + * Copyright (C) 2016 Amaury Pouly + * + * 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 __LCD_TARGET_H__ +#define __LCD_TARGET_H__ + +/* hibyos needs special ioctl() to redraw updated framebuffer content */ +#define LCD_OPTIMIZED_UPDATE +#define LCD_OPTIMIZED_UPDATE_RECT + +extern fb_data *framebuffer; +#define LCD_FRAMEBUF_ADDR(col, row) (framebuffer + (row)*LCD_WIDTH + (col)) + +extern void lcd_set_active(bool active); +#endif /* __LCD_TARGET_H__ */ diff --git a/firmware/target/hosted/hiby/r1/button-r1.c b/firmware/target/hosted/hiby/r1/button-r1.c new file mode 100644 index 0000000000..c0e65fbed5 --- /dev/null +++ b/firmware/target/hosted/hiby/r1/button-r1.c @@ -0,0 +1,81 @@ +/*************************************************************************** + * __________ __ ___ + * Open \______ \ ____ ____ | | _\_ |__ _______ ___ + * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / + * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < + * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ + * \/ \/ \/ \/ \/ + * + * Copyright (C) 2017 Marcin Bukat + * Copyright (C) 2025 by Melissa Autumn/Marc Aarts + * + * 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 + +#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/event0: md-gpio-keys (power/next) + * /dev/input/event1: hyn_ts (touchscreen) + * /dev/input/event2: jz adc keyboard (play/volume+/volume-) + * /dev/input/event3: earpods_adc + */ + +int button_map(int keycode) +{ + switch(keycode) + { + case KEY_VOLUMEDOWN: + return BUTTON_VOL_DOWN; + case KEY_VOLUMEUP: + return BUTTON_VOL_UP; + case KEY_PLAYPAUSE: + return BUTTON_PLAY; + case KEY_NEXTSONG: + return BUTTON_NEXT; + case KEY_PREVIOUSSONG: + return BUTTON_PREV; + case KEY_POWER: + return BUTTON_POWER; + 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); +} diff --git a/firmware/target/hosted/hiby/r1/button-target.h b/firmware/target/hosted/hiby/r1/button-target.h new file mode 100644 index 0000000000..5a0c2c2504 --- /dev/null +++ b/firmware/target/hosted/hiby/r1/button-target.h @@ -0,0 +1,60 @@ +/*************************************************************************** + * __________ __ ___. + * Open \______ \ ____ ____ | | _\_ |__ _______ ___ + * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / + * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < + * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ + * \/ \/ \/ \/ \/ + * + * 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. + * + ****************************************************************************/ +#ifndef _BUTTON_TARGET_H_ +#define _BUTTON_TARGET_H_ + +#include +#include "config.h" + +/* Main unit's buttons */ +#define BUTTON_POWER 0x00000001 +#define BUTTON_PREV 0x00000002 /* there is no PREV */ +#define BUTTON_NEXT 0x00000004 +#define BUTTON_PLAY 0x00000008 +#define BUTTON_VOL_UP 0x00000010 +#define BUTTON_VOL_DOWN 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_NEXT +#define BUTTON_RIGHT BUTTON_PREV +#endif + +int button_map(int keycode); + +#endif /* _BUTTON_TARGET_H_ */ diff --git a/firmware/target/hosted/hiby/r1/led-r1.c b/firmware/target/hosted/hiby/r1/led-r1.c new file mode 100644 index 0000000000..84e29fbc66 --- /dev/null +++ b/firmware/target/hosted/hiby/r1/led-r1.c @@ -0,0 +1,140 @@ +/*************************************************************************** + * __________ __ ___ + * Open \______ \ ____ ____ | | _\_ |__ _______ ___ + * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / + * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < + * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ + * \/ \/ \/ \/ \/ + * + * Copyright (C) 2025 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 +#include +#include +#include +#include +#include +#include +#include "config.h" +#include "backlight-target.h" +#include "sysfs.h" +#include "panic.h" +#include "lcd.h" +#include "settings.h" +#include "power.h" + +static const char * const sysfs_blue_led = +"/sys/class/leds/blue/brightness"; +static const char * const sysfs_red_led = +"/sys/class/leds/red/brightness"; +static const char * const sysfs_red_trigger = +"/sys/class/leds/red/trigger"; + +/* Ref: https://guide.hiby.com/en/docs/products/audio_player/hiby_r1/guide#led-indicator + +Note: The red breathing effect seems to be just the "breathing" led trigger. +By default red is turned off and blue is set to 50 brightness. +*/ +enum R1_LEDS { + LED_INVALID = -1, + LED_OFF = 0, + LED_BLUE, + LED_RED, +}; + +#define DEFAULT_BRIGHTNESS 50 + +int _last_brightness = DEFAULT_BRIGHTNESS; +int _last_led = LED_INVALID; + +void _set_led(enum R1_LEDS led) { + if (_last_led != led) { + _last_led = led; + + if (_last_brightness == 0) { + _last_brightness = DEFAULT_BRIGHTNESS; + } + + switch(led) { + case LED_OFF: + sysfs_set_int(sysfs_blue_led, 0); + sysfs_set_int(sysfs_red_led, 0); + break; + case LED_BLUE: + sysfs_set_int(sysfs_blue_led, _last_brightness); + sysfs_set_int(sysfs_red_led, 0); + break; + case LED_RED: + sysfs_set_int(sysfs_blue_led, 0); + sysfs_set_int(sysfs_red_led, _last_brightness); + sysfs_set_string(sysfs_red_trigger, "breathing"); + break; + default: + break; + } + } +} + +#ifdef HAVE_GENERAL_PURPOSE_LED +void led_hw_brightness(int brightness) +{ + if (brightness != _last_brightness) { + _last_brightness = brightness; + _set_led(_last_led); + } +} + +void led_hw_charged(void) +{ + if (global_settings.use_led_indicators) { + _set_led(LED_BLUE); + } +} + +void led_hw_charging(void) +{ + _set_led(LED_RED); +} + +void led_hw_off(void) +{ + // Don't turn off led if charging + if (!charging_state()) { + _set_led(LED_OFF); + } +} + +void led_hw_on(void) +{ + if (charging_state()) { + led_hw_charging(); + } else { + if (global_settings.use_led_indicators) { + _set_led(LED_BLUE); + } + else { + led_hw_off(); + } + } +} + +void led_hw_set_mode(bool mode) +{ + if (mode) { + led_hw_on(); + } + else { + led_hw_off(); + } +} +#endif + diff --git a/firmware/target/hosted/hiby/r1/powermgmt-r1.c b/firmware/target/hosted/hiby/r1/powermgmt-r1.c new file mode 100644 index 0000000000..433f93194f --- /dev/null +++ b/firmware/target/hosted/hiby/r1/powermgmt-r1.c @@ -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, 4028, 4125, 4237, 4376 +}; + +/* voltages (millivolt) of 0%, 10%, ... 100% when charging enabled */ +unsigned short percent_to_volt_charge[11] = +{ + 3485, 3780, 3836, 3857, 3890, 3930, 3986, 4028, 4125, 4237, 4376 +}; \ No newline at end of file diff --git a/firmware/target/hosted/hiby/r3proii/button-r3proii.c b/firmware/target/hosted/hiby/r3proii/button-r3proii.c new file mode 100644 index 0000000000..5c761b116d --- /dev/null +++ b/firmware/target/hosted/hiby/r3proii/button-r3proii.c @@ -0,0 +1,81 @@ +/*************************************************************************** + * __________ __ ___ + * 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 + +#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/event0: gpios (power/next) + * /dev/input/event1: touchscreen + * /dev/input/event2: adc (prev/play/left/right) + * /dev/input/event3: ???? + */ + + +int button_map(int keycode) +{ + switch(keycode) + { + case KEY_VOLUMEDOWN: + return BUTTON_VOL_DOWN; + case KEY_VOLUMEUP: + return BUTTON_VOL_UP; + case KEY_PLAYPAUSE: + return BUTTON_PLAY; + case KEY_NEXTSONG: + return BUTTON_NEXT; + case KEY_PREVIOUSSONG: + return BUTTON_PREV; + case KEY_POWER: + return BUTTON_POWER; + 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); +} diff --git a/firmware/target/hosted/hiby/r3proii/button-target.h b/firmware/target/hosted/hiby/r3proii/button-target.h new file mode 100644 index 0000000000..a5edc5124d --- /dev/null +++ b/firmware/target/hosted/hiby/r3proii/button-target.h @@ -0,0 +1,60 @@ +/*************************************************************************** + * __________ __ ___. + * Open \______ \ ____ ____ | | _\_ |__ _______ ___ + * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / + * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < + * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ + * \/ \/ \/ \/ \/ + * + * 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. + * + ****************************************************************************/ +#ifndef _BUTTON_TARGET_H_ +#define _BUTTON_TARGET_H_ + +#include +#include "config.h" + +/* Main unit's buttons */ +#define BUTTON_POWER 0x00000001 +#define BUTTON_PREV 0x00000002 +#define BUTTON_NEXT 0x00000004 +#define BUTTON_PLAY 0x00000008 +#define BUTTON_VOL_UP 0x00000010 +#define BUTTON_VOL_DOWN 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_NEXT +#define BUTTON_RIGHT BUTTON_PREV +#endif + +int button_map(int keycode); + +#endif /* _BUTTON_TARGET_H_ */ diff --git a/firmware/target/hosted/hiby/r3proii/led-r3proii.c b/firmware/target/hosted/hiby/r3proii/led-r3proii.c new file mode 100644 index 0000000000..36d988e2a8 --- /dev/null +++ b/firmware/target/hosted/hiby/r3proii/led-r3proii.c @@ -0,0 +1,132 @@ +/*************************************************************************** + * __________ __ ___ + * Open \______ \ ____ ____ | | _\_ |__ _______ ___ + * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / + * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < + * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ + * \/ \/ \/ \/ \/ + * + * Copyright (C) 2025 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 +#include +#include +#include +#include +#include +#include +#include "config.h" +#include "backlight-target.h" +#include "sysfs.h" +#include "panic.h" +#include "lcd.h" +#include "settings.h" +#include "power.h" + +static const char * const sysfs_led_type = +"/sys/class/leds/sgm31324-leds/led_pattern"; + +/* Ref: https://guide.hiby.com/en/docs/products/audio_player/hiby_r3proii/guide#led-indicator-light + + Defined in leds_sgm31324_add.sh (off is defined in driver) + + ... + echo regs="00000000540001010706" > sgm31324 + echo regs="000000004500380B0000" > sgm31324 + echo regs="00000000540000060600" > sgm31324 + echo regs="00000000450040040000" > sgm31324 + echo regs="00000000000000000006" > sgm31324 + echo regs="001E7D0042BB2F000006" > sgm31324 + echo regs="000E7D0042663F000006" > sgm31324 + echo regs="00000000440000050006" > sgm31324 + echo regs="00000000540000000D06" > sgm31324 + echo regs="0000000051001C000506" > sgm31324 + echo regs="00000000000000000006" > sgm31324 + ... + +*/ +enum R3PROII_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 R3PROII_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 off led if charging + if (_last_buttonlight != LED_PATTERN_NORMAL_RED_BLINK) { + _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 + diff --git a/firmware/target/hosted/hiby/r3proii/powermgmt-r3proii.c b/firmware/target/hosted/hiby/r3proii/powermgmt-r3proii.c new file mode 100644 index 0000000000..cd5db9f0c2 --- /dev/null +++ b/firmware/target/hosted/hiby/r3proii/powermgmt-r3proii.c @@ -0,0 +1,42 @@ +/*************************************************************************** + * __________ __ ___. + * 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" + +/* FIXME: Haven't adjusted these values besides max voltage */ +// max voltage is 4370 + +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, 4028, 4125, 4237, 4376 +}; + +/* voltages (millivolt) of 0%, 10%, ... 100% when charging enabled */ +unsigned short percent_to_volt_charge[11] = +{ + 3485, 3780, 3836, 3857, 3890, 3930, 3986, 4028, 4125, 4237, 4376 +}; diff --git a/firmware/target/hosted/hiby/system-target.h b/firmware/target/hosted/hiby/system-target.h new file mode 100644 index 0000000000..37803b6e0c --- /dev/null +++ b/firmware/target/hosted/hiby/system-target.h @@ -0,0 +1,29 @@ +/*************************************************************************** + * __________ __ ___. + * Open \______ \ ____ ____ | | _\_ |__ _______ ___ + * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / + * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < + * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ + * \/ \/ \/ \/ \/ + * + * Copyright (C) 2017 Marcin Bukat + * Copyright (C) 2016 Amaury Pouly + * 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. + * + ****************************************************************************/ +#ifndef __SYSTEM_TARGET_H__ +#define __SYSTEM_TARGET_H__ + +#include "kernel-unix.h" +#include "system-hosted.h" + +#define NEED_GENERIC_BYTESWAPS +#endif /* __SYSTEM_TARGET_H__ */ diff --git a/firmware/target/hosted/hiby/usb-hiby-gadget.c b/firmware/target/hosted/hiby/usb-hiby-gadget.c new file mode 100644 index 0000000000..91e178dd03 --- /dev/null +++ b/firmware/target/hosted/hiby/usb-hiby-gadget.c @@ -0,0 +1,323 @@ +/*************************************************************************** + * __________ __ ___ + * Open \______ \ ____ ____ | | _\_ |__ _______ ___ + * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / + * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < + * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ + * \/ \/ \/ \/ \/ + * + * Copyright (C) 2018 by 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 +#include +#include +#include +#include +#include "config.h" +#include "dir.h" +#include "disk.h" +#include "usb.h" +#include "sysfs.h" +#include "power.h" +#include "usb-hiby-gadget.h" + +#ifdef HAVE_GENERAL_PURPOSE_LED +#include "led-general-purpose.h" +#endif + +#define LOGF_ENABLE +#include "logf.h" +#include + +static int _usb_mode = -1; +static bool _usb_init = false; +static bool is_adb_running = false; + +void enable_adb(void); +void enable_mass_storage(void); +void enable_charging(void); +void enable_usb_audio(void); + +void disable_adb(void); +void disable_mass_storage(void); +void disable_usb_audio(void); + +#ifdef HAVE_MULTIDRIVE +void cleanup_rbhome(void); +void startup_rbhome(void); +#endif + +void hiby_set_usb_mode(int mode) { + logf(">>>>>>>>>>>>>>>>> hiby_set_usb_mode(%d)\n", mode); + if (!_usb_init) { + logf("Need to init usb!\n"); + usb_init_device(); + } + + switch(mode) { + case USB_MODE_MASS_STORAGE: + logf("Enabling Mass Storage\n"); + enable_mass_storage(); + break; + case USB_MODE_CHARGE: + logf("Enabling Charge\n"); + enable_charging(); + break; + default: + break; + } + + _usb_mode = mode; +} + +/* TODO: implement usb detection properly */ +int usb_detect(void) +{ +#ifdef HAVE_GENERAL_PURPOSE_LED + led_hw_on(); +#endif + return power_input_status() == POWER_INPUT_USB_CHARGER ? USB_INSERTED : USB_EXTRACTED; +} + +void usb_enable(bool on) +{ + logf(">>>>>>>>>>>>>>>>> usb_enable(%d)\n", on); + logf("usb enable %d %d\n", on, _usb_mode); + + /* Ignore usb enable/disable when ADB is enabled so we can fireup adb shell + * without entering ums mode + */ + //if (_usb_mode != USB_MODE_ADB) { + sysfs_set_string("/sys/kernel/config/usb_gadget/adb_demo/UDC", on ? "13500000.otg_new" : ""); + //} +} + +/* This is called by usb thread after usb extract in order to return + * regular FS access + * + * returns the # of successful mounts +*/ +int disk_mount_all(void) +{ + logf(">>>>>>>>>>>>>>>>> disk_mount_all()\n"); + +#ifdef HAVE_MULTIDRIVE + startup_rbhome(); +#endif + return 1; +} + +/* This is called by usb thread after all threads ACKs usb inserted message + * + * returns the # of successful unmounts + */ +int disk_unmount_all(void) +{ + // We're always mounted as rockbox lives on the sdcard + logf(">>>>>>>>>>>>>>>>> disk_unmount_all()\n"); + +#ifdef HAVE_MULTIDRIVE + cleanup_rbhome(); +#endif + +#ifdef HAVE_MULTIDRIVE + startup_rbhome(); +#endif + + return 1; +} + +void enable_charging(void) { + logf(">>>>>>>>>>>>>>>>> enable_charging()\n"); + + disable_mass_storage(); + disable_adb(); +} + +#if 1 +void enable_adb(void) { + logf(">>>>>>>>>>>>>>>>> set_adb()\n"); + + // Disable mass storage if it was running + disable_mass_storage(); + + // Remove any lingering adb daemon + system("killall -9 adbd"); + + system("mkdir -p /sys/kernel/config/usb_gadget/adb_demo/configs/c.1/strings/0x409"); + system("mkdir -p /sys/kernel/config/usb_gadget/adb_demo/functions/ffs.adb"); + + // Now we'll override configuration and MaxPower + sysfs_set_string("/sys/kernel/config/usb_gadget/adb_demo/configs/c.1/strings/0x409/configuration", "adb"); + sysfs_set_int("/sys/kernel/config/usb_gadget/adb_demo/configs/c.1/MaxPower", 120); + + // And link up the adb function to the usb gadget config + system("ln -s /sys/kernel/config/usb_gadget/adb_demo/functions/ffs.adb /sys/kernel/config/usb_gadget/adb_demo/configs/c.1/"); + + int is_mounted = !system("mountpoint -q /dev/usb-ffs/adb"); + + if (!is_mounted) { + system("mkdir -p /dev/usb-ffs/adb"); + /* This seems to fail, but adb will still work and then it will be mounted. Not sure what's up here... */ + system("mount -t functionfs adb /dev/usb-ffs/adb"); + } + + // Boot adb daemon + system("/usr/bin/adbd &"); +} + + +void disable_adb(void) { + // Remove any lingering adb daemon + system("killall -9 adbd"); + + // Remove the adb link to config + if (access("/sys/kernel/config/usb_gadget/adb_demo/configs/c.1/ffs.adb", F_OK) == 0) { + system("rm /sys/kernel/config/usb_gadget/adb_demo/configs/c.1/ffs.adb"); + } + + // Remove the adb function + if (access("/sys/kernel/config/usb_gadget/adb_demo/functions/ffs.adb", F_OK) == 0) { + system("rm -rf /sys/kernel/config/usb_gadget/adb_demo/functions/ffs.adb"); + } + + // Reset the MaxPower to its default value + if (access("/sys/kernel/config/usb_gadget/adb_demo/configs/c.1/MaxPower", F_OK) == 0) { + sysfs_set_int("/sys/kernel/config/usb_gadget/adb_demo/configs/c.1/MaxPower", 120); + } + + // Disable storage or adb configs + if (access("/sys/kernel/config/usb_gadget/adb_demo/configs/c.1/strings/0x409/configuration", F_OK) == 0) { + sysfs_set_string("/sys/kernel/config/usb_gadget/adb_demo/configs/c.1/strings/0x409/configuration", ""); + } + + // Unmount adb + if (!system("mountpoint -q /dev/usb-ffs/adb")) { + system("unmount /dev/usb-ffs/adb"); + } +} +#else +void enable_adb(void) {} +void disable_adb(void) {} +#endif + +void enable_mass_storage(void) { + logf(">>>>>>>>>>>>>>>>> set_mass_storage()\n"); + + // Disable adb if it's running + disable_adb(); + + system("mkdir -p /sys/kernel/config/usb_gadget/adb_demo/functions/mass_storage.0/lun.0"); + system("mkdir -p /sys/kernel/config/usb_gadget/adb_demo/configs/c.1/strings/0x409"); + + if (is_adb_running) { + sysfs_set_string("/sys/kernel/config/usb_gadget/adb_demo/configs/c.1/strings/0x409/configuration", "adb,storage"); + } else { + sysfs_set_string("/sys/kernel/config/usb_gadget/adb_demo/configs/c.1/strings/0x409/configuration", "storage"); + } + sysfs_set_int("/sys/kernel/config/usb_gadget/adb_demo/configs/c.1/MaxPower", 120); + + system("ln -s /sys/kernel/config/usb_gadget/adb_demo/functions/mass_storage.0 /sys/kernel/config/usb_gadget/adb_demo/configs/c.1/"); + + char mount_device[32] = "/dev/mmcblk0p1"; + + // If partition 1 doesn't exist we'll try the main device + if (access(mount_device, F_OK) != 0) { + memset(mount_device, 0, sizeof(mount_device)); + strcpy(mount_device, "/dev/mmcblk0"); + } + + sysfs_set_string("/sys/kernel/config/usb_gadget/adb_demo/functions/mass_storage.0/lun.0/file", mount_device); +} + +void disable_mass_storage(void) { + // Remove the mass_storage.0 link to config + if (access("/sys/kernel/config/usb_gadget/adb_demo/configs/c.1/mass_storage.0", F_OK) == 0) { + system("rm /sys/kernel/config/usb_gadget/adb_demo/configs/c.1/mass_storage.0"); + } + + // Remove the mass_storage.0 function + if (access("/sys/kernel/config/usb_gadget/adb_demo/functions/mass_storage.0", F_OK) == 0) { + system("rm -rf /sys/kernel/config/usb_gadget/adb_demo/functions/mass_storage.0"); + } + + // Reset the MaxPower to its default value + if (access("/sys/kernel/config/usb_gadget/adb_demo/configs/c.1/MaxPower", F_OK) == 0) { + sysfs_set_int("/sys/kernel/config/usb_gadget/adb_demo/configs/c.1/MaxPower", 120); + } + + // Disable storage or adb configs + if (access("/sys/kernel/config/usb_gadget/adb_demo/configs/c.1/strings/0x409/configuration", F_OK) == 0) { + sysfs_set_string("/sys/kernel/config/usb_gadget/adb_demo/configs/c.1/strings/0x409/configuration", ""); + } +} + +#if defined(HAVE_USB_AUDIO) +void enable_usb_audio(void) { + +} + +void disable_usb_audio(void) { + +} +#else +void enable_usb_audio(void) {} +void disable_usb_audio(void) {} +#endif + +void usb_init_device(void) +{ + logf(">>>>>>>>>>>>>>>>> usb_init_device()\n"); + if (_usb_init) { + logf("usb is already init, skipping!\n"); + return; + } + + char functions[128] = {0}; + + /* Before we can do anything here we need to mount configfs */ + int is_mounted = !system("mountpoint -q /sys/kernel/config"); + + if (!is_mounted && system("mount -t configfs none /sys/kernel/config")) { + logf("mount configfs failed, can't do usb functionality! ErrNo: %d\n", errno); + return; + } + + _usb_init = true; + + system("ls -la /sys/kernel/config/usb_gadget"); + + /* os_mkdir doesn't seem to work here for whatever reason */ + system("mkdir -p /sys/kernel/config/usb_gadget/adb_demo"); + system("mkdir -p /sys/kernel/config/usb_gadget/adb_demo/strings/0x409"); + + system("ls -la /sys/kernel/config/usb_gadget/adb_demo"); + system("ls -la /sys/kernel/config/usb_gadget/adb_demo/configs/"); + + system("mkdir -p /sys/kernel/config/usb_gadget/adb_demo/configs/c.1/strings/0x409"); + + /* Check if ADB was activated in bootloader */ + logf("checking if adb is already on\n"); + + if (access("/sys/kernel/config/usb_gadget/adb_demo/configs/c.1/strings/0x409/configuration", F_OK) == 0) { + logf("found usb config string!\n"); + + sysfs_get_string("/sys/kernel/config/usb_gadget/adb_demo/configs/c.1/strings/0x409/configuration", functions, sizeof(functions)); + is_adb_running = (strstr(functions, "adb") == NULL) ? false : true; + } + + sysfs_set_string("/sys/kernel/config/usb_gadget/adb_demo/strings/0x409/manufacturer", "Rockbox.org"); + sysfs_set_string("/sys/kernel/config/usb_gadget/adb_demo/strings/0x409/product", "Rockbox media player"); + sysfs_set_string("/sys/kernel/config/usb_gadget/adb_demo/strings/0x409/serialnumber", "0123456789ABCDEF"); +} diff --git a/firmware/target/hosted/hiby/usb-hiby-gadget.h b/firmware/target/hosted/hiby/usb-hiby-gadget.h new file mode 100644 index 0000000000..53fb90fef8 --- /dev/null +++ b/firmware/target/hosted/hiby/usb-hiby-gadget.h @@ -0,0 +1,30 @@ +/*************************************************************************** + * __________ __ ___ + * Open \______ \ ____ ____ | | _\_ |__ _______ ___ + * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / + * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < + * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ + * \/ \/ \/ \/ \/ + * + * 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. + * + ****************************************************************************/ +#ifndef __USB_HIBY_H__ +#define __USB_HIBY_H__ + +#include + +/** + * Handle the setting and unsetting of adb usb mode + */ +void hiby_set_usb_mode(int mode); + +#endif /* __USB_HIBY_H__ */ diff --git a/firmware/target/hosted/power-linux.c b/firmware/target/hosted/power-linux.c index e70e521f97..5afb0c3a1c 100644 --- a/firmware/target/hosted/power-linux.c +++ b/firmware/target/hosted/power-linux.c @@ -39,6 +39,7 @@ # define BATTERY_VOLTAGE_PATH BATTERY_SYSFS_PATH "/voltage_now" # define BATTERY_CURRENT_PATH BATTERY_SYSFS_PATH "/current_now" # define BATTERY_LEVEL_PATH BATTERY_SYSFS_PATH "/capacity" +# define BATTERY_TTE_PATH BATTERY_SYSFS_PATH "/time_to_empty_now" #endif /* Voltage is normally in microvolts */ @@ -116,6 +117,16 @@ int _battery_level(void) return (level * BATTERY_LEVEL_SCALE_MUL) / BATTERY_LEVEL_SCALE_DIV; } #endif + +#if (CONFIG_BATTERY_MEASURE & TIME_MEASURE) +int _battery_time(void) +{ + int battery_tte = 0; + sysfs_get_int(BATTERY_TTE_PATH, &battery_tte); + + return battery_tte; +} +#endif #endif unsigned int power_input_status(void) diff --git a/firmware/target/hosted/sdl/sim-ui-defines.h b/firmware/target/hosted/sdl/sim-ui-defines.h index 3148abec67..5f336d6bc8 100644 --- a/firmware/target/hosted/sdl/sim-ui-defines.h +++ b/firmware/target/hosted/sdl/sim-ui-defines.h @@ -544,6 +544,20 @@ #define UI_LCD_POSY 78 +#elif defined(HIBY_R3PROII) +#define UI_TITLE "Hiby R3 Pro II" +#define UI_WIDTH 645 +#define UI_HEIGHT 924 +#define UI_LCD_POSX 79 +#define UI_LCD_POSY 63 + +#elif defined(HIBY_R1) +#define UI_TITLE "Hiby R1" +#define UI_WIDTH 634 +#define UI_HEIGHT 1016 +#define UI_LCD_POSX 77 +#define UI_LCD_POSY 74 + #elif defined(SIMULATOR) #error no UI defines #endif diff --git a/firmware/target/hosted/system-hosted.c b/firmware/target/hosted/system-hosted.c index ec7f508228..bb20842d79 100644 --- a/firmware/target/hosted/system-hosted.c +++ b/firmware/target/hosted/system-hosted.c @@ -62,10 +62,11 @@ static void sig_handler(int sig, siginfo_t *siginfo, void *context) unsigned long pc = uc->uc_mcontext.pc; unsigned long sp = uc->uc_mcontext.gregs[29]; - lcd_putsf(0, line++, "%s at %08x", strsignal(sig), pc); + lcd_putsf(0, line++, "%s at %08lx", strsignal(sig), pc); - if(sig == SIGILL || sig == SIGFPE || sig == SIGSEGV || sig == SIGBUS || sig == SIGTRAP) + if(sig == SIGILL || sig == SIGFPE || sig == SIGSEGV || sig == SIGBUS || sig == SIGTRAP) { lcd_putsf(0, line++, "address %p", siginfo->si_addr); + } if(!triggered) { @@ -82,7 +83,10 @@ static void sig_handler(int sig, siginfo_t *siginfo, void *context) system_exception_wait(); /* If this returns, try to reboot */ system_reboot(); - while (1); /* halt */ + while (1) { + // Make sure we're not throttling the cpu + usleep(1000); + } } void power_off(void) @@ -90,7 +94,10 @@ void power_off(void) backlight_hw_off(); sync(); system("/sbin/poweroff"); - while (1); /* halt */ + while (1) { + // Make sure we're not throttling the cpu + usleep(1000); + } } void system_init(void) @@ -117,7 +124,10 @@ void system_reboot(void) { backlight_hw_off(); system("/sbin/reboot"); - while (1); /* halt */ + while (1) { + // Make sure we're not throttling the cpu + usleep(1000); + } } void system_exception_wait(void) diff --git a/firmware/usb.c b/firmware/usb.c index d1a4054d2d..0cbbacc2a2 100644 --- a/firmware/usb.c +++ b/firmware/usb.c @@ -51,6 +51,10 @@ #include "gui/skin_engine/skin_engine.h" #endif +#if defined(HIBY_R3PROII) || defined(HIBY_R1) +#include "usb-hiby-gadget.h" +#endif + #if defined(IPOD_ACCESSORY_PROTOCOL) #include "iap.h" #endif @@ -161,6 +165,8 @@ 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) + hiby_set_usb_mode(mode); #endif } #endif diff --git a/tools/buildzip.pl b/tools/buildzip.pl index c72f70072a..cdb1f43c32 100755 --- a/tools/buildzip.pl +++ b/tools/buildzip.pl @@ -660,7 +660,9 @@ sub buildzip { # until buildwps.pl is fixed, manually copy the classic_statusbar theme across mkdir "$temp_dir/wps/classic_statusbar", 0777; glob_copy("$ROOT/wps/classic_statusbar/*.bmp", "$temp_dir/wps/classic_statusbar"); - if ($depth == 16) { + if ($depth >= 16 && $height > 480) { + copy("$ROOT/wps/classic_statusbar.24.sbs", "$temp_dir/wps/classic_statusbar.sbs"); + } elsif ($depth == 16) { copy("$ROOT/wps/classic_statusbar.sbs", "$temp_dir/wps"); } elsif ($depth > 1) { copy("$ROOT/wps/classic_statusbar.grey.sbs", "$temp_dir/wps/classic_statusbar.sbs"); diff --git a/tools/configure b/tools/configure index 5db7f218cf..728f709728 100755 --- a/tools/configure +++ b/tools/configure @@ -1736,11 +1736,15 @@ cat </dev/null +killall -9 hiby_player &>/dev/null + +killall bootloader.r1 &>/dev/null +killall -9 bootloader.r1 &>/dev/null + +/usr/bin/bootloader.r1 +sleep 1s \ No newline at end of file diff --git a/tools/r1_patcher/r1_patcher.sh b/tools/r1_patcher/r1_patcher.sh new file mode 100755 index 0000000000..69b8407a7b --- /dev/null +++ b/tools/r1_patcher/r1_patcher.sh @@ -0,0 +1,133 @@ +#!/bin/bash + +if [[ $# -ne 2 ]]; then + echo 'usage: ./r1_patcher.sh r1.upt bootloader.r1' >&2 + exit 1 +fi + +################################################################################ +### init +################################################################################ + +currentdir=$(pwd) +updatefile="$(basename $1)" +updatefile_rb="${updatefile%.*}_rb.upt" + +workingdir=$(realpath ./working_dir) +workingdir_in=$workingdir"/in" +workingdir_out=$workingdir"/out" + +rm -rf $workingdir + +mkdir $workingdir +mkdir $workingdir_in +mkdir $workingdir_out + +################################################################################ +### extract +################################################################################ + +# extract iso +mkdir -p $workingdir_in/image_contents +7z -o$workingdir_in/image_contents x $updatefile + +# create xImage (unchanged) +mkdir -p $workingdir_out/xImage +cat $workingdir_in/image_contents/ota_v0/xImage.* > $workingdir_out/xImage/xImage + +# create rootfs +mkdir -p $workingdir_in/rootfs +mkdir -p $workingdir_in/rootfs/extracted +cat $workingdir_in/image_contents/ota_v0/rootfs.squashfs.* > $workingdir_in/rootfs/rootfs.squashfs + +# extract rootfs +unsquashfs -f -d $workingdir_in/rootfs/extracted $workingdir_in/rootfs/rootfs.squashfs + +################################################################################ +### update +################################################################################ + +# copy 'bootloader' +cp $2 $workingdir_in/rootfs/extracted/usr/bin/ + +# copy modified 'hibyplayer.sh' script +cp hiby_player.sh $workingdir_in/rootfs/extracted/usr/bin/ +chmod 0755 $workingdir_in/rootfs/extracted/usr/bin/hiby_player.sh + +################################################################################ +### rebuild +################################################################################ + +mkdir "$workingdir_out/image_contents" +mkdir "$workingdir_out/image_contents/ota_v0" + +mksquashfs $workingdir_in/rootfs/extracted $workingdir_out/rootfs.squashfs -comp lzo + +cd "$workingdir_out/image_contents/ota_v0" + +# rootfs.squashfs +split -b 512k $workingdir_out/rootfs.squashfs --numeric-suffixes=0 -a 4 rootfs.squashfs. + +rootfs_md5=($(md5sum $workingdir_out/rootfs.squashfs)) +rootfs_size=$(stat -c%s "$workingdir_out/rootfs.squashfs") +md5=$rootfs_md5 + +ota_md5_rootfs="ota_md5_rootfs.squashfs.$md5" + +parts=`find . -name 'rootfs.squashfs.*'` +for part in $parts; do + md5next=($(md5sum $part)) + echo $md5next >> $ota_md5_rootfs + mv $part "$part.$md5" + md5=$md5next +done + +# xImage +split -b 512k $workingdir_out/xImage/xImage --numeric-suffixes=0 -a 4 xImage. + +ximage_md5=($(md5sum $workingdir_out/xImage/xImage)) +ximage_size=$(stat -c%s "$workingdir_out/xImage/xImage") +md5=$ximage_md5 + +ota_md5_xImage="ota_md5_xImage.$md5" + +parts=`find . -name 'xImage.*'` +for part in $parts; do + md5next=($(md5sum $part)) + echo $md5next >> $ota_md5_xImage + mv $part "$part.$md5" + md5=$md5next +done + +# ota_update.in + +echo "ota_version=0 + +img_type=kernel +img_name=xImage +img_size=$ximage_size +img_md5=$ximage_md5 + +img_type=rootfs +img_name=rootfs.squashfs +img_size=$rootfs_size +img_md5=$rootfs_md5 +" > ota_update.in + +echo > ota_v0.ok + +# ota_config.in +cd "$workingdir_out/image_contents" + +echo "current_version=0" > ota_config.in + +# iso +genisoimage -f -U -J -joliet-long -r -allow-lowercase -allow-multidot -o $currentdir/$updatefile_rb $workingdir_out/image_contents/ + +################################################################################ +### cleanup +################################################################################ + +rm -rf $workingdir + +exit 0 diff --git a/tools/root.make b/tools/root.make index 5488de5525..e00dc7b626 100644 --- a/tools/root.make +++ b/tools/root.make @@ -105,6 +105,8 @@ endif ifneq (,$(findstring bootloader,$(APPSDIR))) ifneq (,$(findstring sonynwz,$(APP_TYPE))) include $(ROOTDIR)/firmware/target/hosted/sonynwz/sonynwz.make + else ifneq (,$(findstring hiby_x1600,$(APP_TYPE))) + include $(ROOTDIR)/firmware/target/hosted/hiby/hiby.make else ifneq (,$(findstring hibyos,$(APP_TYPE))) include $(ROOTDIR)/firmware/target/hosted/hibyos.make else ifneq (,$(findstring fiio,$(APP_TYPE))) @@ -149,6 +151,10 @@ else # core include $(ROOTDIR)/firmware/target/hosted/sonynwz/sonynwz.make endif + ifneq (,$(findstring hiby_x1600,$(APP_TYPE))) + include $(ROOTDIR)/firmware/target/hosted/hiby/hiby.make + endif + ifneq (,$(findstring hibyos,$(APP_TYPE))) include $(ROOTDIR)/firmware/target/hosted/hibyos.make endif diff --git a/uisimulator/bitmaps/UI-hibyr1.bmp b/uisimulator/bitmaps/UI-hibyr1.bmp new file mode 100644 index 0000000000..700a4719fc Binary files /dev/null and b/uisimulator/bitmaps/UI-hibyr1.bmp differ diff --git a/uisimulator/bitmaps/UI-hibyr3proii.bmp b/uisimulator/bitmaps/UI-hibyr3proii.bmp new file mode 100644 index 0000000000..19e4b1733b Binary files /dev/null and b/uisimulator/bitmaps/UI-hibyr3proii.bmp differ diff --git a/uisimulator/buttonmap/SOURCES b/uisimulator/buttonmap/SOURCES index 39c5488289..3c7a602298 100644 --- a/uisimulator/buttonmap/SOURCES +++ b/uisimulator/buttonmap/SOURCES @@ -91,5 +91,7 @@ fiio-m3k.c shanling-q1.c #elif CONFIG_KEYPAD == RG_NANO_PAD rg-nano.c +#elif CONFIG_KEYPAD == HIBY_R3PROII_PAD +hiby-r3proii.c #endif #endif /* SIMULATOR */ diff --git a/uisimulator/buttonmap/hiby-r3proii.c b/uisimulator/buttonmap/hiby-r3proii.c new file mode 100644 index 0000000000..8ef94c9c7a --- /dev/null +++ b/uisimulator/buttonmap/hiby-r3proii.c @@ -0,0 +1,34 @@ +/*************************************************************************** + * __________ __ ___. + * Open \______ \ ____ ____ | | _\_ |__ _______ ___ + * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / + * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < + * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ + * \/ \/ \/ \/ \/ + * $Id$ + * + * Copyright (C) 2021 by Solomon Peachy + * + * 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 +#include "button.h" +#include "buttonmap.h" + +int key_to_button(int keyboard_button) +{ + return BUTTON_NONE; +} + +struct button_map bm[] = { + { 0, 0, 0, 0, "None" } +}; diff --git a/wps/WPSLIST b/wps/WPSLIST index d26060e70a..76ec8dc5b8 100644 --- a/wps/WPSLIST +++ b/wps/WPSLIST @@ -78,6 +78,10 @@ RSBS: no
+# touch override +wps.480x720x(16|24|32): cabbiev2.480x720x16.touch.wps + + # override implicit .wps filename wps.800x480x(16|24|32): cabbiev2.800x480x16.wps wps.480x800x(16|24|32): cabbiev2.480x800x16.wps @@ -110,6 +114,8 @@ fms.160x128x2: cabbiev2-160x128x2.fms fms.128x128x2: cabbiev2-128x128x2.fms # Preferred font (including .fnt extension - leave blank for player): +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 @@ -145,6 +151,8 @@ line selector text color: 000000 filetype colours: - #backdrop - remember this is the source file name in your SVN folder, not dest name! +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 @@ -173,6 +181,8 @@ selector type..+x2: bar (inverse) selector type..+x(16|24|32): bar (gradient) #icons +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 @@ -194,6 +204,8 @@ iconset.96x96x(16|24|32): icons/tango_icons.8x8.bmp iconset..+x2: icons/tango_small_mono.bmp #viewer icons +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 diff --git a/wps/cabbiev2.480x720x16.touch.wps b/wps/cabbiev2.480x720x16.touch.wps new file mode 100644 index 0000000000..7c0a6a7531 --- /dev/null +++ b/wps/cabbiev2.480x720x16.touch.wps @@ -0,0 +1,119 @@ +# Cabbie v2.0 +# (C) 2007-2012 The Authors (see /rockbox/wps/AUTHORS) +# Derived from "cabbie" (C) Yohann Misquitta +# +# TODO: +# * images for battery, hold button +%wd +%X(wpsbackdrop-480x720x16.bmp) + +#%xl(A,lock-240x320x16.bmp,11,0,2) +#%xl(B,battery-240x320x16.bmp,46,0,10) +%xl(C,volume-480x800x16.bmp,145,125,10) +%xl(D,shuffle-480x800x16.bmp,240,133) +%xl(E,repeat-480x800x16.bmp,343,121,4) +%xl(F,playmode-480x800x16.bmp,403,119,5) +%xl(G,popup-480x800x16.bmp,0,0) +%xl(H,rew-480x800x16.bmp,0,5) +%xl(I,ff-480x800x16.bmp,70,5) +%xl(vol,volumebar-480x800x16.bmp,0,0) +%xl(volbd,volumebar-backdrop-480x800x16.bmp,0,0) + +%Cl(0,0,275,275,c,c) +%?C<%Vd(c)|%Vd(a)> +%?vg(show_vol)<%?C<%Vd(d)|%Vd(b)>|%Vd(t)|%Vd(vol)> + +# now playing text bar +%V(0,28,-,42,-) +%ac%Sx(Now Playing) + +# track & next track info - no AA +%Vl(a,0,102,-,180,-) +# tap on current title info for playlist (ie. where albumart would normally be) +%T(0,0,275,275,playlist) + +%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|> +%Vl(b,0,320,-,180,-) +%ac%?ig<%ig|> +%ac%?fv<%(vbr%) |>%fb kbit/s %fc +%s%ac%?Ia<%Ia|%?IA<%IA|%?D(2)<%D(2)|%(root%)>>> +%ac%Sx(Next Track:) +%ac%s%?It<%It|%Fn> +# +# album art viewport +# +%Vl(c,102,75,275,275,-) +# tap on the cover art for playlist +%T(0,0,275,275,playlist) +%Cd + +# current track info - AA +%Vl(d,0,370,-,-200,-) +%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%)>>> + +# next track info - AA +%Vl(d,0,470,-,-200,-) +%?C<%s%ac%Sx(Next:) %?Ia<%Ia|%?IA<%IA|%?D(2)<%D(2)|%(root%)>>> - %?It<%It|%Fn>|%s%ac%?Id<%Id|%?D(1)<%D(1)|%(root%)>>> + +# playtime +%V(20,580,440,36,-) +%pc%ac%?Sr<%pe %Sx(of) %pp|%pp %Sx(of) %pe>%ar%pr + +# progressbar and bottom icons +%V(0,520,-,-,-) +%pb(25,11,430,-,pb-480x800x16.bmp) +%T(25,0,430,50,progressbar) + +#%?mh<%xd(Aa)|%xd(Ab)> +#%?bp<%?bc<%xd(Ba)|%xd(Bb)>|%?bl<|%xd(Bc)|%xd(Bd)|%xd(Be)|%xd(Bf)|%xd(Bg)|%xd(Bh)|%xd(Bi)|%xd(Bj)>> +# volume +%?pv<%xd(Ca)|%xd(Cb)|%xd(Cc)|%xd(Cd)|%xd(Ce)|%xd(Cf)|%xd(Cg)|%xd(Ch)|%xd(Ci)|%xd(Cj)> +%T(small_vol,145,125,88,60,none) +# +# shuffle +%?ps<%xd(D)> +%T(237,130,100,50,shuffle) +# +# repeat +%xd(E, %mm, -1) +%T(340,121,50,70,repmode) +# +# playmode +%?Tp<%?mp<%xd(F, 1)|%xd(F, 3)|%xd(F, 2)|%xd(F, 4)|%xd(F, 5)||||>|%xd(F, %mp)> +%T(400,119,70,75,play) +%T(400,119,70,75,stop, repeat_press) + +# +# volume slider +# +%Vl(vol,14,295,452,205,-) +%pv(0,0,452,205,image,vol,backdrop,volbd) +%T(0,0,452,205,volume) + +# +# popup osd menu +# +%Vl(t,14,295,452,205,-) +%xd(G) +%T(26,26,160,148,browse) +%T(186,26,144,148,quickscreen) +%T(304,26,123,148,contextmenu) + +# +# ff/rewind button +# +%V(0,640,150,75,-) +%xd(H)%xd(I) +%T(0,0,70,75,rwd, repeat_press) +%T(0,0,70,75,prev) +%T(70,0,70,75,ffwd, repeat_press) +%T(70,0,70,75,next) + +# needs to be at the end since touch regions need to be declared +# before %Tl can be used +%?Tl(small_vol,2.0)<%vs(show_vol,set,3)|%?mv(2.0)<%vs(show_vol,set,3)|%?Tl<%vs(show_vol,set,2)|%vs(show_vol,set,1)>>> diff --git a/wps/cabbiev2/wpsbackdrop-480x720x16.bmp b/wps/cabbiev2/wpsbackdrop-480x720x16.bmp new file mode 100644 index 0000000000..8e5a9a27ba Binary files /dev/null and b/wps/cabbiev2/wpsbackdrop-480x720x16.bmp differ diff --git a/wps/classic_statusbar.24.sbs b/wps/classic_statusbar.24.sbs new file mode 100644 index 0000000000..1879c0b304 --- /dev/null +++ b/wps/classic_statusbar.24.sbs @@ -0,0 +1,96 @@ +# Classic Statusbar +# (C) 2007-2012 The Authors (see /rockbox/wps/AUTHORS) +# +# Classic statusbar adapted to skin engine +# Standardized to a height of 24px for larger devices +# +# Status bar position can be changed from top to bottom by changing the y positions from 0 to -24 +# +# Specify the UI area viewport... everything but a bar 24 pixels high at the top +%Vi(-,0,24,-,-,1) + +# Conditional for showing volume as number or graphic +%?if(%St(volume display), =, numeric)<%Vd(d)|%Vd(c)> + +# Conditional for showing battery as number or graphic +%?if(%St(battery display), =, numeric)<%Vd(b)|%Vd(a)%Vd(e)> + +# Load some bitmaps +%xl(B,battery.16.bmp,0,0,16) +%xl(V,volume.16.bmp,2,0,17) +%xl(S,status.16.bmp,0,0,15) +%xl(D,access_disk.16.bmp,0,0) +%xl(y,batter-y.16.bmp,0,0) + +%xl(m,rec_mpegbitrates.16.bmp,2,0,18) +%xl(f,rec_frequencies.16.bmp,0,0,12) +%xl(e,rec_encoders.16.bmp,0,0,3) +%xl(c,rec_channels.16.bmp,26,0,2) + +# Enable the correct viewports +%?cs<%Vd(c)%Vd(p)%Vd(r)%Vd(s)|%Vd(c)%Vd(p)%Vd(r)%Vd(s)|%Vd(z)|%Vd(c)%Vd(p)%Vd(r)%Vd(s)> + +# Charging animation viewports +%t(2)%?bc<%Vd(x)|%Vd(a)>;%t(2)%Vd(a) + +# Battery area, Icons +%Vl(a,4,6,34,14,0) +%?bl<%xd(Ba)|%xd(Bb)|%xd(Bc)|%xd(Bd)|%xd(Be)|%xd(Bf)|%xd(Bg)|%xd(Bh)|%xd(Bi)|%xd(Bj)|%xd(Bk)|%xd(Bl)|%xd(Bm)|%xd(Bn)|%xd(Bo)> + +# Battery area, grey background viewport for charging animation +%Vl(x,4,6,34,14,0)%Vb(555555) +#%?bl<%xd(Ba)|%xd(Bb)|%xd(Bc)|%xd(Bd)|%xd(Be)|%xd(Bf)|%xd(Bg)|%xd(Bh)|%xd(Bi)|%xd(Bj)|%xd(Bk)|%xd(Bl)|%xd(Bm)|%xd(Bn)|%xd(Bo)> + +# end of battery symbol (to exclude it from animation) + +%Vl(e,38,6,6,14,0) +%xd(y) + +# usb power or charger icon +%V(44,6,16,16,0) +%?bu<%xd(Sa)|%?bc<%xd(Sa)|%?bp<%xd(So)>>> + +# battery area, no icons +%Vl(b,4,4,36,16,0) +%ar%bl + +# Volume area +%Vl(c,60,6,58,16,0) +%?mv<%ac%?pv<%pv|%pv| %pv| %pv>|%?pv<%xd(Va)|%xd(Vb)|%xd(Vc)|%xd(Vd)|%xd(Ve)|%xd(Vf)|%xd(Vg)|%xd(Vh)|%xd(Vi)|%xd(Vj)|%xd(Vk)|%xd(Vl)|%xd(Vm)|%xd(Vn)|%xd(Vo)|%xd(Vp)|%xd(Vq)>> +%Vl(d,60,4,58,16,0) +%ac%?pv<%pv|%pv| %pv| %pv> + +# Icons, all in the same bmp strip, so need to use multiple viewports +# Playback mode +%Vl(p,118,6,18,16,0) +%?mp<%xd(Sc)|%xd(Sb)|%xd(Sd)|%xd(Se)|%xd(Sf)|%xd(Sg)|%xd(Sh)|%xd(Si)|%xd(Sj)> + +# Repeat mode +%Vl(r,136,6,18,16,0) +%?mm<|%xd(Sk)|%xd(Sl)|%xd(Sm)|%xd(Sn)> + +# Shuffle mode +%Vl(s,154,6,-,16,0) +%?ps<%xd(Sm)|> + + +# Recording section +# encoder/mpeg bitrate +%Vl(z,60,4,38,16,0) +%?Rp<%?Re<%xd(ea)|%xd(eb)|%xd(ec)|%?Rb<%xd(ma)|%xd(mb)|%xd(mc)|%xd(md)|%xd(me)|%xd(mf)|%xd(mg)|%xd(mh)|%xd(mi)|%xd(mj)|%xd(mk)|%xd(ml)|%xd(mm)|%xd(mn)|%xd(mo)|%xd(mp)|%xd(mq)|%xd(mr)>>> +# status icon +%Vl(z,98,4,16,16,0) +%?mp<%xd(Sc)|%xd(Sb)|%xd(Sd)|%xd(Se)|%xd(Sf)|%xd(Sg)|%xd(Sh)|%xd(Si)|%xd(Sj)> +# frequency and channels +%Vl(z,114,4,-,16,0) +%?Rp<%?Rf<%xd(fa)|%xd(fb)|%xd(fc)|%xd(fd)|%xd(fe)|%xd(ff)|%xd(fg)|%xd(fh)|%xd(fi)|%xd(fj)|%xd(fk)|%xd(fl)>> +%?Rm<%xd(ca)|%xd(cb)> + +# Clock on RTC able targets, and disk access +# align on the right with room for 5 SYSFONT digits +%V(-82,4,62,16,0) +%?cc<%?ca<%?St(time format)<%cH|%cI>:%cM|--:-->|> + +# disk access icon +%V(-20,6,-,16,0) +%?lh<%xd(D)|> \ No newline at end of file diff --git a/wps/classic_statusbar/access_disk.16.bmp b/wps/classic_statusbar/access_disk.16.bmp new file mode 100644 index 0000000000..6c732af796 Binary files /dev/null and b/wps/classic_statusbar/access_disk.16.bmp differ diff --git a/wps/classic_statusbar/batter-y.16.bmp b/wps/classic_statusbar/batter-y.16.bmp new file mode 100644 index 0000000000..4734d091e9 Binary files /dev/null and b/wps/classic_statusbar/batter-y.16.bmp differ diff --git a/wps/classic_statusbar/battery.16.bmp b/wps/classic_statusbar/battery.16.bmp new file mode 100644 index 0000000000..ce110a3645 Binary files /dev/null and b/wps/classic_statusbar/battery.16.bmp differ diff --git a/wps/classic_statusbar/rec_channels.16.bmp b/wps/classic_statusbar/rec_channels.16.bmp new file mode 100644 index 0000000000..1bbb70f4fd Binary files /dev/null and b/wps/classic_statusbar/rec_channels.16.bmp differ diff --git a/wps/classic_statusbar/rec_encoders.16.bmp b/wps/classic_statusbar/rec_encoders.16.bmp new file mode 100644 index 0000000000..76bc948633 Binary files /dev/null and b/wps/classic_statusbar/rec_encoders.16.bmp differ diff --git a/wps/classic_statusbar/rec_frequencies.16.bmp b/wps/classic_statusbar/rec_frequencies.16.bmp new file mode 100644 index 0000000000..eb1d44102d Binary files /dev/null and b/wps/classic_statusbar/rec_frequencies.16.bmp differ diff --git a/wps/classic_statusbar/rec_mpegbitrates.16.bmp b/wps/classic_statusbar/rec_mpegbitrates.16.bmp new file mode 100644 index 0000000000..5f23528bf3 Binary files /dev/null and b/wps/classic_statusbar/rec_mpegbitrates.16.bmp differ diff --git a/wps/classic_statusbar/status.16.bmp b/wps/classic_statusbar/status.16.bmp new file mode 100644 index 0000000000..1efe981e78 Binary files /dev/null and b/wps/classic_statusbar/status.16.bmp differ diff --git a/wps/classic_statusbar/volume.16.bmp b/wps/classic_statusbar/volume.16.bmp new file mode 100644 index 0000000000..5284526a00 Binary files /dev/null and b/wps/classic_statusbar/volume.16.bmp differ diff --git a/wps/template_fill.py b/wps/template_fill.py new file mode 100644 index 0000000000..00110d253a --- /dev/null +++ b/wps/template_fill.py @@ -0,0 +1,288 @@ +""" +Rough script to scale up the existing classic_statusbar +It will scale up by scale_pixel_size_by, and add padding specificed by +padding_x/y. + +The status bar size will be determined by main_viewport_size_by. +So if you want zero padding just make sure those two numbers are the same. + +This is all based on the 8px tall classic_statusbar, but this script can +be adapted for different sbs or wps file. Just need to create a template +which is just jinja template syntax on top of a sbs or wps. + +The images were hacked together, you specify their real image path +from the wps folder, but it will hack off the asset folder because +rockbox automatically adds it. Oops. +""" +from jinja2 import Environment, PackageLoader, select_autoescape +from PIL import Image +import os + +env = Environment( + loader=PackageLoader("template_fill"), + autoescape=select_autoescape() +) + +template = env.get_template("classic_statusbar.sbs.j2") + +original_pixel_size = 8 +padding_x = 4 +padding_y = 4 +scale_pixel_size_by = 2 +main_viewport_size_by = 3 +scaled_pixel_size = original_pixel_size * scale_pixel_size_by +main_viewport_size = original_pixel_size * main_viewport_size_by +font_id = 0 + +asset_folder = 'classic_statusbar' + + +def upscale_element(element: dict) -> dict: + if element.get('image'): + element_img: str = element['image'] + # Split off the last .bmp (and recombine if the filename contains periods) + out_element_image = ( + f'{'.'.join(element_img.split('.')[0:-1])}.{scaled_pixel_size}.bmp' + ) + + try: + if os.path.isfile(out_element_image): + im = Image.open(out_element_image) + else: + im = Image.open(element_img) + size = im.width * scale_pixel_size_by, im.height * scale_pixel_size_by + im = im.resize(size, Image.Resampling.NEAREST) + im.save(out_element_image, "BMP") + + # Bit of a hack really + element['image'] = out_element_image.replace( + f'{asset_folder}/', '') + except IOError: + print(f"cannot resize for <{element_img}>") + + if element.get('source_x') and element['source_x'] != '-': + element['source_x'] *= scale_pixel_size_by + if element.get('source_y') and element['source_y'] != '-': + element['source_x'] *= scale_pixel_size_by + + if element.get('viewport'): + if element['viewport']['x'] != '-': + element['viewport']['x'] *= scale_pixel_size_by + element['viewport']['x'] += padding_x + + if element['viewport']['y'] != '-': + element['viewport']['y'] *= scale_pixel_size_by + element['viewport']['y'] += padding_x + + if element['viewport']['width'] != '-': + element['viewport']['width'] *= scale_pixel_size_by + + if element['viewport']['height'] != '-': + element['viewport']['height'] *= scale_pixel_size_by + + return element + + +# These are based on the original resolution, they're upscaled later +battery = upscale_element({ + 'image': 'classic_statusbar/battery.bmp', + 'source_x': 0, + 'source_y': 0, + 'sub_image_count': 16, + 'viewport': { + 'x': 0, + 'y': 0, + 'width': 17, + 'height': 7, + 'font_id': font_id + } +}) + +battery_cap = upscale_element({ + 'image': 'classic_statusbar/batter-y.bmp', + 'source_x': 0, + 'source_y': 0, + 'sub_image_count': 0, + 'viewport': { + 'x': 17, + 'y': 0, + 'width': 3, + 'height': 7, + 'font_id': font_id + } +}) + +battery_no_icon = upscale_element({ + 'viewport': { + 'x': 0, + 'y': 0, + 'width': 18, + 'height': 8, + 'font_id': font_id + } +}) + +volume = upscale_element({ + 'image': 'classic_statusbar/volume.bmp', + 'source_x': 1, + 'source_y': 0, + 'sub_image_count': 17, + 'viewport': { + 'x': 28, + 'y': 0, + 'width': 19, + 'height': 8, + 'font_id': font_id + } +}) + +status = upscale_element({ + 'image': 'classic_statusbar/status.bmp', + 'source_x': 0, + 'source_y': 0, + 'sub_image_count': 15, + 'viewport': { + 'x': 47, + 'y': 0, + 'width': 8, + 'height': 8, + 'font_id': font_id + } +}) + +power = upscale_element({ + 'viewport': { + 'x': 20, + 'y': 0, + 'width': 8, + 'height': 8, + 'font_id': font_id + } +}) + +playback = upscale_element({ + 'viewport': { + 'x': 47, + 'y': 0, + 'width': 9, + 'height': 8, + 'font_id': font_id + } +}) + +repeat = upscale_element({ + 'viewport': { + 'x': 56, + 'y': 0, + 'width': 9, + 'height': 8, + 'font_id': font_id + } +}) + +shuffle = upscale_element({ + 'viewport': { + 'x': 65, + 'y': 0, + 'width': '-', + 'height': 8, + 'font_id': font_id + } +}) + +access_disk = upscale_element({ + 'image': 'classic_statusbar/access_disk.bmp', + 'source_x': 0, + 'source_y': 0, + 'sub_image_count': 0, + 'viewport': { + 'x': -12, + 'y': 0, + 'width': '-', + 'height': 8, + 'font_id': font_id + } +}) + + +rec_bitrate = upscale_element({ + 'image': 'classic_statusbar/rec_mpegbitrates.bmp', + 'source_x': 1, + 'source_y': 0, + 'sub_image_count': 18, + 'viewport': { + 'x': 28, + 'y': 0, + 'width': 19, + 'height': 8, + 'font_id': font_id + } +}) + +rec_freq = upscale_element({ + 'image': 'classic_statusbar/rec_frequencies.bmp', + 'source_x': 0, + 'source_y': 0, + 'sub_image_count': 12, + 'viewport': { + 'x': 55, + 'y': 0, + 'width': '-', + 'height': 8, + 'font_id': font_id + } +}) + +rec_encoders = upscale_element({ + 'image': 'classic_statusbar/rec_encoders.bmp', + 'source_x': 0, + 'source_y': 0, + 'sub_image_count': 3, +}) + +rec_channels = upscale_element({ + 'image': 'classic_statusbar/rec_channels.bmp', + 'source_x': 13, + 'source_y': 0, + 'sub_image_count': 2, +}) + +rtc = upscale_element({ + 'viewport': { + 'x': -43, + 'y': 0, + 'width': 31, + 'height': 8, + 'font_id': font_id + } +}) + + +rendered = template.render( + viewport={ + 'width': 0, + 'height': main_viewport_size, + 'font_id': 1 + }, + options={}, + battery=battery, + battery_cap=battery_cap, + battery_no_icon=battery_no_icon, + volume=volume, + status=status, + access_disk=access_disk, + rec_bitrate=rec_bitrate, + rec_freq=rec_freq, + rec_encoders=rec_encoders, + rec_channels=rec_channels, + power=power, + playback=playback, + repeat=repeat, + shuffle=shuffle, + rtc=rtc, +) + +print(rendered) + +with open('./classic_statusbar.sbs', 'w') as fh: + fh.write(rendered) diff --git a/wps/templates/classic_statusbar.sbs.j2 b/wps/templates/classic_statusbar.sbs.j2 new file mode 100644 index 0000000000..c61827f95f --- /dev/null +++ b/wps/templates/classic_statusbar.sbs.j2 @@ -0,0 +1,96 @@ +# Classic Statusbar +# (C) 2007-2012 The Authors (see /rockbox/wps/AUTHORS) +# +# Classic statusbar adapted to skin engine +# Standardized to a height of {{ viewport.height }}px for larger devices +# +# Status bar position can be changed from top to bottom by changing the y positions from 0 to -{{ viewport.height }} +# +# Specify the UI area viewport... everything but a bar {{ viewport.height }} pixels high at the top +%Vi(-,{{ viewport.width }},{{ viewport.height }},-,-,{{ viewport.font_id }}) + +# Conditional for showing volume as number or graphic +%?if(%St(volume display), =, numeric)<%Vd(d)|%Vd(c)> + +# Conditional for showing battery as number or graphic +%?if(%St(battery display), =, numeric)<%Vd(b)|%Vd(a)%Vd(e)> + +# Load some bitmaps +%xl(B,{{ battery.image }},{{ battery.source_x }},{{ battery.source_y }},{{ battery.sub_image_count }}) +%xl(V,{{ volume.image }},{{ volume.source_x }},{{ volume.source_y }},{{ volume.sub_image_count }}) +%xl(S,{{ status.image }},{{ status.source_x }},{{ status.source_y }},{{ status.sub_image_count }}) +%xl(D,{{ access_disk.image }},{{ access_disk.source_x }},{{ access_disk.source_y }}) +%xl(y,{{ battery_cap.image }},{{ battery_cap.source_x }},{{ battery_cap.source_y }}) + +%xl(m,{{ rec_bitrate.image }},{{ rec_bitrate.source_x }},{{ rec_bitrate.source_y }},{{ rec_bitrate.sub_image_count }}) +%xl(f,{{ rec_freq.image }},{{ rec_freq.source_x }},{{ rec_freq.source_y }},{{ rec_freq.sub_image_count }}) +%xl(e,{{ rec_encoders.image }},{{ rec_encoders.source_x }},{{ rec_encoders.source_y }},{{ rec_encoders.sub_image_count }}) +%xl(c,{{ rec_channels.image }},{{ rec_channels.source_x }},{{ rec_channels.source_y }},{{ rec_channels.sub_image_count }}) + +# Enable the correct viewports +%?cs<%Vd(c)%Vd(p)%Vd(r)%Vd(s)|%Vd(c)%Vd(p)%Vd(r)%Vd(s)|%Vd(z)|%Vd(c)%Vd(p)%Vd(r)%Vd(s)> + +# Charging animation viewports +%t(2)%?bc<%Vd(x)|%Vd(a)>;%t(2)%Vd(a) + +# Battery area, Icons +%Vl(a, {{ battery.viewport.x }},{{ battery.viewport.y }},{{ battery.viewport.width }},{{ battery.viewport.height }},{{ battery.viewport.font_id }}) +%?bl<%xd(Ba)|%xd(Bb)|%xd(Bc)|%xd(Bd)|%xd(Be)|%xd(Bf)|%xd(Bg)|%xd(Bh)|%xd(Bi)|%xd(Bj)|%xd(Bk)|%xd(Bl)|%xd(Bm)|%xd(Bn)|%xd(Bo)> + +# Battery area, grey background viewport for charging animation +%Vl(x, {{ battery.viewport.x }},{{ battery.viewport.y }},{{ battery.viewport.width }},{{ battery.viewport.height }},{{ battery.viewport.font_id }})%Vb(555555) +#%?bl<%xd(Ba)|%xd(Bb)|%xd(Bc)|%xd(Bd)|%xd(Be)|%xd(Bf)|%xd(Bg)|%xd(Bh)|%xd(Bi)|%xd(Bj)|%xd(Bk)|%xd(Bl)|%xd(Bm)|%xd(Bn)|%xd(Bo)> + +# end of battery symbol (to exclude it from animation) + +%Vl(e,{{ battery_cap.viewport.x }},{{ battery_cap.viewport.y }},{{ battery_cap.viewport.width }},{{ battery_cap.viewport.height }},{{ battery_cap.viewport.font_id }}) +%xd(y) + +# usb power or charger icon +%V({{ power.viewport.x }},{{ power.viewport.y }},{{ power.viewport.width }},{{ power.viewport.height }},{{ power.viewport.font_id }}) +%?bu<%xd(Sa)|%?bc<%xd(Sa)|%?bp<%xd(So)>>> + +# battery area, no icons +%Vl(b,{{ battery_no_icon.viewport.x }},{{ battery_no_icon.viewport.y }},{{ battery_no_icon.viewport.width }},{{ battery_no_icon.viewport.height }},{{ battery_no_icon.viewport.font_id }}) +%ar%bl + +# Volume area +%Vl(c,{{ volume.viewport.x }},{{ volume.viewport.y }},{{ volume.viewport.width }},{{ volume.viewport.height }},{{ volume.viewport.font_id }}) +%?mv<%ac%?pv<%pv|%pv| %pv| %pv>|%?pv<%xd(Va)|%xd(Vb)|%xd(Vc)|%xd(Vd)|%xd(Ve)|%xd(Vf)|%xd(Vg)|%xd(Vh)|%xd(Vi)|%xd(Vj)|%xd(Vk)|%xd(Vl)|%xd(Vm)|%xd(Vn)|%xd(Vo)|%xd(Vp)|%xd(Vq)>> +%Vl(d,{{ volume.viewport.x }},{{ volume.viewport.y }},{{ volume.viewport.width }},{{ volume.viewport.height }},{{ volume.viewport.font_id }}) +%ac%?pv<%pv|%pv| %pv| %pv> + +# Icons, all in the same bmp strip, so need to use multiple viewports +# Playback mode +%Vl(p,{{ playback.viewport.x }},{{ playback.viewport.y }},{{ playback.viewport.width }},{{ playback.viewport.height }},{{ playback.viewport.font_id }}) +%?mp<%xd(Sc)|%xd(Sb)|%xd(Sd)|%xd(Se)|%xd(Sf)|%xd(Sg)|%xd(Sh)|%xd(Si)|%xd(Sj)> + +# Repeat mode +%Vl(r,{{ repeat.viewport.x }},{{ repeat.viewport.y }},{{ repeat.viewport.width }},{{ repeat.viewport.height }},{{ repeat.viewport.font_id }}) +%?mm<|%xd(Sk)|%xd(Sl)|%xd(Sm)|%xd(Sn)> + +# Shuffle mode +%Vl(s,{{ shuffle.viewport.x }},{{ shuffle.viewport.y }},{{ shuffle.viewport.width }},{{ shuffle.viewport.height }},{{ shuffle.viewport.font_id }}) +%?ps<%xd(Sm)|> + + +# Recording section +# encoder/mpeg bitrate +%Vl(z,{{ rec_bitrate.viewport.x }},{{ rec_bitrate.viewport.y }},{{ rec_bitrate.viewport.width }},{{ rec_bitrate.viewport.height }},{{ rec_bitrate.viewport.font_id }}) +%?Rp<%?Re<%xd(ea)|%xd(eb)|%xd(ec)|%?Rb<%xd(ma)|%xd(mb)|%xd(mc)|%xd(md)|%xd(me)|%xd(mf)|%xd(mg)|%xd(mh)|%xd(mi)|%xd(mj)|%xd(mk)|%xd(ml)|%xd(mm)|%xd(mn)|%xd(mo)|%xd(mp)|%xd(mq)|%xd(mr)>>> +# status icon +%Vl(z,{{ status.viewport.x }},{{ status.viewport.y }},{{ status.viewport.width }},{{ status.viewport.height }},{{ status.viewport.font_id }}) +%?mp<%xd(Sc)|%xd(Sb)|%xd(Sd)|%xd(Se)|%xd(Sf)|%xd(Sg)|%xd(Sh)|%xd(Si)|%xd(Sj)> +# frequency and channels +%Vl(z,{{ rec_freq.viewport.x }},{{ rec_freq.viewport.y }},{{ rec_freq.viewport.width }},{{ rec_freq.viewport.height }},{{ rec_freq.viewport.font_id }}) +%?Rp<%?Rf<%xd(fa)|%xd(fb)|%xd(fc)|%xd(fd)|%xd(fe)|%xd(ff)|%xd(fg)|%xd(fh)|%xd(fi)|%xd(fj)|%xd(fk)|%xd(fl)>> +%?Rm<%xd(ca)|%xd(cb)> + +# Clock on RTC able targets, and disk access +# align on the right with room for 5 SYSFONT digits +%V({{ rtc.viewport.x }},{{ rtc.viewport.y }},{{ rtc.viewport.width }},{{ rtc.viewport.height }},{{ rtc.viewport.font_id }}) +%?cc<%?ca<%?St(time format)<%cH|%cI>:%cM|--:-->|> + +# disk access icon +%V({{ access_disk.viewport.x }},{{ access_disk.viewport.y }},{{ access_disk.viewport.width }},{{ access_disk.viewport.height }},{{ access_disk.viewport.font_id }}) +%?lh<%xd(D)|>