Skip to content

Commit

Permalink
h700: improved hdmi support for entire line
Browse files Browse the repository at this point in the history
  • Loading branch information
Shaun Inman committed Nov 20, 2024
1 parent d660b35 commit 16300f7
Show file tree
Hide file tree
Showing 14 changed files with 312 additions and 44 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ libretro-common
**/other/unzip60
**/other/DinguxCommander
**/other/351files
**/other/fbset

**/tmp

Expand Down
83 changes: 83 additions & 0 deletions skeleton/SYSTEM/rg35xxplus/bin/hdmimon.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
#!/bin/sh

cd $(dirname "$0")

HDMI_WIDTH=1280
HDMI_HEIGHT=720

DEVICE_WIDTH=640
DEVICE_HEIGHT=480
if [ "$RGXX_MODEL" = "RGcubexx" ]; then
DEVICE_WIDTH=720
DEVICE_HEIGHT=720
elif [ "$RGXX_MODEL" = "RG28xx" ]; then # rotated
TMP_WIDTH=$DEVICE_WIDTH
DEVICE_WIDTH=$DEVICE_HEIGHT
DEVICE_HEIGHT=$TMP_WIDTH
fi

DISP_PATH="/sys/kernel/debug/dispdbg"
BLANK_PATH="/sys/class/graphics/fb0/blank"
touch $HDMI_EXPORT_PATH

ALSA_CONF_DIR=/usr/share/alsa/alsa.conf.d
mkdir -p $ALSA_CONF_DIR

enable_hdmi() {
echo 'enabling HDMI'

echo 4 > $BLANK_PATH
cat /dev/zero > /dev/fb0

echo disp0 > $DISP_PATH/name
echo switch > $DISP_PATH/command
echo "4 10 0 0 0x4 0x101 0 0 0 8" > $DISP_PATH/param
echo 1 > $DISP_PATH/start

fbset -fb /dev/fb0 -g 0 0 0 0 32
sleep 0.25
fbset -fb /dev/fb0 -g $HDMI_WIDTH $HDMI_HEIGHT $HDMI_WIDTH $((HDMI_HEIGHT * 2)) 32
sleep 0.25
echo 0 > $BLANK_PATH

echo "export AUDIODEV='hw:2,0'" > $HDMI_EXPORT_PATH
}

disable_hdmi() {
echo 'disabling HDMI'

echo 4 > $BLANK_PATH
cat /dev/zero > /dev/fb0

echo disp0 > $DISP_PATH/name
echo switch > $DISP_PATH/command
echo "1 0" > $DISP_PATH/param
echo 1 > $DISP_PATH/start

fbset -fb /dev/fb0 -g 0 0 0 0 32
sleep 0.25
fbset -fb /dev/fb0 -g $DEVICE_WIDTH $DEVICE_HEIGHT $DEVICE_WIDTH $((DEVICE_HEIGHT * 2)) 32
sleep 0.25
echo 0 > $BLANK_PATH

echo "unset AUDIODEV" > $HDMI_EXPORT_PATH
}

HDMI_STATE_PATH="/sys/class/switch/hdmi/cable.0/state"
HAD_HDMI=$(cat "$HDMI_STATE_PATH")
if [ "$HAD_HDMI" = "1" ]; then
enable_hdmi
fi

while :; do
HAS_HDMI=$(cat "$HDMI_STATE_PATH")
if [ "$HAS_HDMI" != "$HAD_HDMI" ]; then
if [ "$HAS_HDMI" = "1" ]; then
enable_hdmi
else
disable_hdmi
fi
fi
HAD_HDMI=$HAS_HDMI
sleep 2
done
16 changes: 14 additions & 2 deletions skeleton/SYSTEM/rg35xxplus/paks/MinUI.pak/launch.sh
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ export USERDATA_PATH="$SDCARD_PATH/.userdata/$PLATFORM"
export SHARED_USERDATA_PATH="$SDCARD_PATH/.userdata/shared"
export LOGS_PATH="$USERDATA_PATH/logs"
export DATETIME_PATH="$SHARED_USERDATA_PATH/datetime.txt"
export HDMI_EXPORT_PATH="/tmp/hdmi_export.sh"

#######################################

Expand Down Expand Up @@ -47,17 +48,28 @@ init.elf # > $LOGS_PATH/init.txt 2>&1

#######################################

hdmimon.sh & # > $LOGS_PATH/hdmimon.txt 2>&1 &

HDMI_STATE_PATH="/sys/class/switch/hdmi/cable.0/state"
HAS_HDMI=$(cat "$HDMI_STATE_PATH")
if [ "$HAS_HDMI" = "1" ]; then
sleep 3
fi

#######################################

EXEC_PATH="/tmp/minui_exec"
NEXT_PATH="/tmp/next"
touch "$EXEC_PATH" && sync
while [ -f "$EXEC_PATH" ]; do
. $HDMI_EXPORT_PATH
minui.elf > $LOGS_PATH/minui.txt 2>&1
echo `date +'%F %T'` > "$DATETIME_PATH"
sync

if [ -f $NEXT_PATH ]; then
CMD=`cat $NEXT_PATH`
eval $CMD
. $HDMI_EXPORT_PATH
. $NEXT_PATH
rm -f $NEXT_PATH
echo `date +'%F %T'` > "$DATETIME_PATH"
sync
Expand Down
83 changes: 83 additions & 0 deletions skeleton/SYSTEM/rg40xxcube/bin/hdmimon.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
#!/bin/sh

cd $(dirname "$0")

HDMI_WIDTH=1280
HDMI_HEIGHT=720

DEVICE_WIDTH=640
DEVICE_HEIGHT=480
if [ "$RGXX_MODEL" = "RGcubexx" ]; then
DEVICE_WIDTH=720
DEVICE_HEIGHT=720
elif [ "$RGXX_MODEL" = "RG28xx" ]; then # rotated
TMP_WIDTH=$DEVICE_WIDTH
DEVICE_WIDTH=$DEVICE_HEIGHT
DEVICE_HEIGHT=$TMP_WIDTH
fi

DISP_PATH="/sys/kernel/debug/dispdbg"
BLANK_PATH="/sys/class/graphics/fb0/blank"
touch $HDMI_EXPORT_PATH

ALSA_CONF_DIR=/usr/share/alsa/alsa.conf.d
mkdir -p $ALSA_CONF_DIR

enable_hdmi() {
echo 'enabling HDMI'

echo 4 > $BLANK_PATH
cat /dev/zero > /dev/fb0

echo disp0 > $DISP_PATH/name
echo switch > $DISP_PATH/command
echo "4 10 0 0 0x4 0x101 0 0 0 8" > $DISP_PATH/param
echo 1 > $DISP_PATH/start

fbset -fb /dev/fb0 -g 0 0 0 0 32
sleep 0.25
fbset -fb /dev/fb0 -g $HDMI_WIDTH $HDMI_HEIGHT $HDMI_WIDTH $((HDMI_HEIGHT * 2)) 32
sleep 0.25
echo 0 > $BLANK_PATH

echo "export AUDIODEV='hw:2,0'" > $HDMI_EXPORT_PATH
}

disable_hdmi() {
echo 'disabling HDMI'

echo 4 > $BLANK_PATH
cat /dev/zero > /dev/fb0

echo disp0 > $DISP_PATH/name
echo switch > $DISP_PATH/command
echo "1 0" > $DISP_PATH/param
echo 1 > $DISP_PATH/start

fbset -fb /dev/fb0 -g 0 0 0 0 32
sleep 0.25
fbset -fb /dev/fb0 -g $DEVICE_WIDTH $DEVICE_HEIGHT $DEVICE_WIDTH $((DEVICE_HEIGHT * 2)) 32
sleep 0.25
echo 0 > $BLANK_PATH

echo "unset AUDIODEV" > $HDMI_EXPORT_PATH
}

HDMI_STATE_PATH="/sys/class/switch/hdmi/cable.0/state"
HAD_HDMI=$(cat "$HDMI_STATE_PATH")
if [ "$HAD_HDMI" = "1" ]; then
enable_hdmi
fi

while :; do
HAS_HDMI=$(cat "$HDMI_STATE_PATH")
if [ "$HAS_HDMI" != "$HAD_HDMI" ]; then
if [ "$HAS_HDMI" = "1" ]; then
enable_hdmi
else
disable_hdmi
fi
fi
HAD_HDMI=$HAS_HDMI
sleep 2
done
16 changes: 14 additions & 2 deletions skeleton/SYSTEM/rg40xxcube/paks/MinUI.pak/launch.sh
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ export USERDATA_PATH="$SDCARD_PATH/.userdata/$PLATFORM"
export SHARED_USERDATA_PATH="$SDCARD_PATH/.userdata/shared"
export LOGS_PATH="$USERDATA_PATH/logs"
export DATETIME_PATH="$SHARED_USERDATA_PATH/datetime.txt"
export HDMI_EXPORT_PATH="/tmp/hdmi_export.sh"

#######################################

Expand Down Expand Up @@ -47,17 +48,28 @@ init.elf # > $LOGS_PATH/init.txt 2>&1

#######################################

hdmimon.sh & # > $LOGS_PATH/hdmimon.txt 2>&1 &

HDMI_STATE_PATH="/sys/class/switch/hdmi/cable.0/state"
HAS_HDMI=$(cat "$HDMI_STATE_PATH")
if [ "$HAS_HDMI" = "1" ]; then
sleep 3
fi

#######################################

EXEC_PATH="/tmp/minui_exec"
NEXT_PATH="/tmp/next"
touch "$EXEC_PATH" && sync
while [ -f "$EXEC_PATH" ]; do
. $HDMI_EXPORT_PATH
minui.elf > $LOGS_PATH/minui.txt 2>&1
echo `date +'%F %T'` > "$DATETIME_PATH"
sync

if [ -f $NEXT_PATH ]; then
CMD=`cat $NEXT_PATH`
eval $CMD
. $HDMI_EXPORT_PATH
. $NEXT_PATH
rm -f $NEXT_PATH
echo `date +'%F %T'` > "$DATETIME_PATH"
sync
Expand Down
19 changes: 13 additions & 6 deletions todo.txt
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,18 @@ Changes
BASE

- rg_xx: fixed analog stick diagonals

- rg_xx: added initial HDMI out support
- rg_xx: added initial support for RG P01/SN30 Pro

EXTRAS

-

---

minput
seems to be designed top,left aligned for 640x480

it's time to retire some supported devices
devices running SDL1.2
gkdpixel
Expand All @@ -25,10 +29,13 @@ gambatte
can I write the lightest palette value to /tmp so I can use it for gridlines for GB?

rg_xx
hdmi out
+ video
+ audio
- hot swapping
hdmi
- adjust max rows and padding when hdmi
640x480 values don't jive with 1280x720
- don't sleep on lid close on hdmi
- disable sleep on hdmi entirely?
usb controller
look into SDL2 controller API

tg3040
update toolchain's SDL2 headers to 2.30.8?
Expand Down Expand Up @@ -165,7 +172,7 @@ next
PS: SDL_UnlockTexture blocked for 11ms (640,480) (CMR2)
try using SDL_UpdateTexture instead of Lock/Unlock
might be saving 1-2ms
could this slowness be related to ram speed? (DMC?)
could this slowness be related to vram speed? (DMC?)

update all cores
call out breaking changes (gpsp save states) in release notes
Expand Down
26 changes: 26 additions & 0 deletions workspace/all/minarch/minarch.c
Original file line number Diff line number Diff line change
Expand Up @@ -2070,6 +2070,24 @@ static bool environment_callback(unsigned cmd, void *data) { // copied from pico

///////////////////////////////

static void hdmimon(void) {
// handle HDMI change
static int had_hdmi = -1;
int has_hdmi = GetHDMI();
if (had_hdmi==-1) had_hdmi = has_hdmi;
if (has_hdmi!=had_hdmi) {
had_hdmi = has_hdmi;

LOG_info("restarting after HDMI change...\n");
Menu_beforeSleep();
sleep(4);
show_menu = 0;
quit = 1;
}
}

///////////////////////////////

// TODO: this is a dumb API
SDL_Surface* digits;
#define DIGIT_WIDTH 9
Expand Down Expand Up @@ -3064,6 +3082,8 @@ static int Menu_message(char* message, char** pairs) {
dirty = 0;
}
else GFX_sync();

hdmimon();
}
GFX_setMode(MODE_MENU);
return MENU_CALLBACK_NOP; // TODO: this should probably be an arg
Expand Down Expand Up @@ -3232,6 +3252,7 @@ int OptionControls_bind(MenuList* list, int i) {
}
}
GFX_sync();
hdmimon();
}
return MENU_CALLBACK_NEXT_ITEM;
}
Expand Down Expand Up @@ -3344,6 +3365,7 @@ static int OptionShortcuts_bind(MenuList* list, int i) {
}
}
GFX_sync();
hdmimon();
}
return MENU_CALLBACK_NEXT_ITEM;
}
Expand Down Expand Up @@ -3843,6 +3865,7 @@ static int Menu_options(MenuList* list) {
dirty = 0;
}
else GFX_sync();
hdmimon();
}

// GFX_clearAll();
Expand Down Expand Up @@ -4415,6 +4438,7 @@ static void Menu_loop(void) {
dirty = 0;
}
else GFX_sync();
hdmimon();
}

SDL_FreeSurface(preview);
Expand Down Expand Up @@ -4677,6 +4701,8 @@ int main(int argc , char* argv[]) {
}
}
// LOG_info("frame duration: %ims\n", SDL_GetTicks()-frame_start);

hdmimon();
}

Menu_quit();
Expand Down
14 changes: 14 additions & 0 deletions workspace/all/minui/minui.c
Original file line number Diff line number Diff line change
Expand Up @@ -1661,6 +1661,20 @@ int main (int argc, char *argv[]) {
dirty = 0;
}
else GFX_sync();

// handle HDMI change
static int had_hdmi = -1;
int has_hdmi = GetHDMI();
if (had_hdmi==-1) had_hdmi = has_hdmi;
if (has_hdmi!=had_hdmi) {
had_hdmi = has_hdmi;

Entry* entry = top->entries->items[top->selected];
LOG_info("restarting after HDMI change... (%s)\n", entry->path);
saveLast(entry->path); // NOTE: doesn't work in Recents (by design)
sleep(4);
quit = 1;
}
}

if (version) SDL_FreeSurface(version);
Expand Down
Loading

0 comments on commit 16300f7

Please sign in to comment.