From 22526f587c8ffcdee2d93601b9ea843de89b5ef1 Mon Sep 17 00:00:00 2001 From: PlainOldPants <119274651+PlainOldPants@users.noreply.github.com> Date: Fri, 10 Feb 2023 16:59:45 -0600 Subject: [PATCH] added support for RetroUSB Genesis RetroPort --- gx/gui/menu.c | 23 ++- gx/gx_input.c | 273 +++++++++++++++++++++++------------- gx/images/ctrl_retrousb.png | Bin 0 -> 51969 bytes gx/retrousb.c | 188 +++++++++++++++++++++++++ gx/retrousb.h | 13 ++ 5 files changed, 399 insertions(+), 98 deletions(-) create mode 100644 gx/images/ctrl_retrousb.png create mode 100644 gx/retrousb.c create mode 100644 gx/retrousb.h diff --git a/gx/gui/menu.c b/gx/gui/menu.c index 0271a27..57500d7 100644 --- a/gx/gui/menu.c +++ b/gx/gui/menu.c @@ -48,6 +48,7 @@ #ifdef HW_RVL #include #include "wiidrc.h" +#include "retrousb.h" #endif #include @@ -124,6 +125,7 @@ #include "ctrl_nunchuk_png.h" #include "ctrl_wiimote_png.h" #include "ctrl_wiiu_png.h" +#include "ctrl_retrousb_png.h" #endif /* Generic images */ @@ -2471,7 +2473,7 @@ static void ctrlmenu(void) /* Player Configuration device items */ #ifdef HW_RVL - gui_item items_device[6] = + gui_item items_device[7] = { {NULL,ctrl_option_off_png ,"Input\nDevice","Select Input Controller",534,244,24,24}, {NULL,ctrl_gamecube_png ,"Input\nDevice","Select Input Controller",530,246,36,24}, @@ -2479,6 +2481,7 @@ static void ctrlmenu(void) {NULL,ctrl_nunchuk_png ,"Input\nDevice","Select Input Controller",532,242,32,32}, {NULL,ctrl_classic_png ,"Input\nDevice","Select Input Controller",526,242,40,32}, {NULL,ctrl_wiiu_png ,"Input\nDevice","Select Input Controller",526,246,40,24}, + {NULL,ctrl_retrousb_png ,"Input\nDevice","Select Input Controller",526,246,40,24}, }; #else gui_item items_device[2] = @@ -2518,6 +2521,7 @@ static void ctrlmenu(void) { items_device[5].texture = gxTextureOpenPNG(items_device[5].data,0); } + items_device[6].texture = gxTextureOpenPNG(items_device[6].data, 0); #endif /* restore current menu elements */ @@ -3060,11 +3064,21 @@ static void ctrlmenu(void) /* support for only one gamepad */ if (!WiiDRC_Inited() || !WiiDRC_Connected() || (config.input[player].port >= 1)) { - /* no input controller left */ - config.input[player].device = -1; - config.input[player].port = player%4; + /* test RetroUSB */ + config.input[player].device = 5; + config.input[player].port = 0; } } + + if (config.input[player].device == 5) + { + if (!RetroUSB_OK() || config.input[player].port >= 1) + { + /* no input controller left */ + config.input[player].device = -1; + config.input[player].port = player % 4; + } + } #endif /* update menu items */ @@ -3230,6 +3244,7 @@ static void ctrlmenu(void) { gxTextureClose(&items_device[5].texture); } + gxTextureClose(&items_device[6].texture); #endif } diff --git a/gx/gx_input.c b/gx/gx_input.c index ee62636..22f9bc5 100644 --- a/gx/gx_input.c +++ b/gx/gx_input.c @@ -46,6 +46,7 @@ #ifdef HW_RVL #include #include "wiidrc.h" +#include "retrousb.h" #endif /* Analog sticks sensitivity */ @@ -79,12 +80,13 @@ #define PAD_RIGHT 3 /* default directions mapping */ -static u32 wpad_dirmap[4][4] = +static u32 wpad_dirmap[5][4] = { {WPAD_BUTTON_RIGHT, WPAD_BUTTON_LEFT, WPAD_BUTTON_UP, WPAD_BUTTON_DOWN}, /* WIIMOTE */ {WPAD_BUTTON_UP, WPAD_BUTTON_DOWN, WPAD_BUTTON_LEFT, WPAD_BUTTON_RIGHT}, /* WIIMOTE + NUNCHUK */ {WPAD_CLASSIC_BUTTON_UP, WPAD_CLASSIC_BUTTON_DOWN, WPAD_CLASSIC_BUTTON_LEFT, WPAD_CLASSIC_BUTTON_RIGHT}, /* CLASSIC */ - {WIIDRC_BUTTON_UP, WIIDRC_BUTTON_DOWN, WIIDRC_BUTTON_LEFT, WIIDRC_BUTTON_RIGHT} /* WIIU GAMEPAD */ + {WIIDRC_BUTTON_UP, WIIDRC_BUTTON_DOWN, WIIDRC_BUTTON_LEFT, WIIDRC_BUTTON_RIGHT}, /* WIIU GAMEPAD */ + {PAD_BUTTON_UP, PAD_BUTTON_DOWN, PAD_BUTTON_LEFT, PAD_BUTTON_RIGHT} }; #define WPAD_BUTTONS_HELD (WPAD_BUTTON_UP | WPAD_BUTTON_DOWN | WPAD_BUTTON_LEFT | WPAD_BUTTON_RIGHT | \ @@ -615,6 +617,7 @@ static void wpad_config(u8 exp, int chan, int first_key, int last_key) { char msg[64]; u32 p = 255; + bool isRetroUSB = false; /* Disable background PAD scanning */ inputs_disabled = 1; @@ -624,12 +627,14 @@ static void wpad_config(u8 exp, int chan, int first_key, int last_key) { WPAD_Probe(chan, &p); } - else + else if (WiiDRC_Inited() && WiiDRC_Connected()) { - if (WiiDRC_Inited() && WiiDRC_Connected()) - { p = exp; - } + } + else if (RetroUSB_OK()) + { + p = exp; + isRetroUSB = true; } /* Device not detected */ @@ -638,7 +643,7 @@ static void wpad_config(u8 exp, int chan, int first_key, int last_key) if (exp == WPAD_EXP_NONE) sprintf(msg, "WIIMOTE #%d is not connected !", chan+1); else if (exp == WPAD_EXP_NUNCHUK) sprintf(msg, "NUNCHUK #%d is not connected !", chan+1); else if (exp == WPAD_EXP_CLASSIC) sprintf(msg, "CLASSIC #%d is not connected !", chan+1); - else sprintf(msg, "WIIU GAMEPAD is not connected !"); + else sprintf(msg, "WIIU GAMEPAD or RETROUSB is not connected !"); GUI_WaitPrompt("Error",msg); /* re-enable background PAD scanning and exit */ @@ -661,6 +666,14 @@ static void wpad_config(u8 exp, int chan, int first_key, int last_key) WPAD_ScanPads(); } } + else if (isRetroUSB) + { + while (RetroUSB_ButtonsHeld()) + { + VIDEO_WaitVSync(); + RetroUSB_ScanPads(); + } + } else { while (WiiDRC_ButtonsHeld()) @@ -672,7 +685,7 @@ static void wpad_config(u8 exp, int chan, int first_key, int last_key) /* configurable button */ sprintf(msg,"Press key for %s\n(HOME to return)",keyname[first_key]); - GUI_MsgBoxUpdate(0,msg); + GUI_MsgBoxUpdate(0, msg); /* wait for user input */ p = 0; @@ -684,6 +697,11 @@ static void wpad_config(u8 exp, int chan, int first_key, int last_key) WPAD_ScanPads(); p = WPAD_ButtonsDown(chan); } + else if (isRetroUSB) + { + RetroUSB_ScanPads(); + p = RetroUSB_ButtonsHeld(); + } else { WiiDRC_ScanPads(); @@ -742,17 +760,30 @@ static void wpad_config(u8 exp, int chan, int first_key, int last_key) /* WiiU GamePad Controller */ default: { - if (p & WIIDRC_BUTTON_A) p = WIIDRC_BUTTON_A; - else if (p & WIIDRC_BUTTON_B) p = WIIDRC_BUTTON_B; - else if (p & WIIDRC_BUTTON_X) p = WIIDRC_BUTTON_X; - else if (p & WIIDRC_BUTTON_Y) p = WIIDRC_BUTTON_Y; - else if (p & WIIDRC_BUTTON_ZL) p = WIIDRC_BUTTON_ZL; - else if (p & WIIDRC_BUTTON_ZR) p = WIIDRC_BUTTON_ZR; - else if (p & WIIDRC_BUTTON_PLUS) p = WIIDRC_BUTTON_PLUS; - else if (p & WIIDRC_BUTTON_MINUS) p = WIIDRC_BUTTON_MINUS; - else if (p & WIIDRC_BUTTON_L) p = WIIDRC_BUTTON_L; - else if (p & WIIDRC_BUTTON_R) p = WIIDRC_BUTTON_R; - else first_key = MAX_KEYS; + if (isRetroUSB) { + if (p & PAD_BUTTON_A) p = PAD_BUTTON_A; + else if (p & PAD_BUTTON_B) p = PAD_BUTTON_B; + else if (p & PAD_BUTTON_X) p = PAD_BUTTON_X; + else if (p & PAD_BUTTON_Y) p = PAD_BUTTON_Y; + else if (p & PAD_TRIGGER_Z) p = PAD_TRIGGER_Z; + else if (p & PAD_BUTTON_START) p = PAD_BUTTON_START; + else if (p & PAD_TRIGGER_L) p = PAD_TRIGGER_L; + else if (p & PAD_TRIGGER_R) p = PAD_TRIGGER_R; + else first_key = MAX_KEYS; + } + else { + if (p & WIIDRC_BUTTON_A) p = WIIDRC_BUTTON_A; + else if (p & WIIDRC_BUTTON_B) p = WIIDRC_BUTTON_B; + else if (p & WIIDRC_BUTTON_X) p = WIIDRC_BUTTON_X; + else if (p & WIIDRC_BUTTON_Y) p = WIIDRC_BUTTON_Y; + else if (p & WIIDRC_BUTTON_ZL) p = WIIDRC_BUTTON_ZL; + else if (p & WIIDRC_BUTTON_ZR) p = WIIDRC_BUTTON_ZR; + else if (p & WIIDRC_BUTTON_PLUS) p = WIIDRC_BUTTON_PLUS; + else if (p & WIIDRC_BUTTON_MINUS) p = WIIDRC_BUTTON_MINUS; + else if (p & WIIDRC_BUTTON_L) p = WIIDRC_BUTTON_L; + else if (p & WIIDRC_BUTTON_R) p = WIIDRC_BUTTON_R; + else first_key = MAX_KEYS; + } break; } } @@ -762,6 +793,14 @@ static void wpad_config(u8 exp, int chan, int first_key, int last_key) { config.wpad_keymap[4*exp + chan][first_key] = p; } + + if (isRetroUSB) + { + while (RetroUSB_ButtonsHeld()) + { + VIDEO_WaitVSync(); + } + } } } while (first_key++ < last_key); @@ -775,6 +814,14 @@ static void wpad_config(u8 exp, int chan, int first_key, int last_key) WPAD_ScanPads(); } } + else if (isRetroUSB) + { + while (RetroUSB_ButtonsHeld()) + { + VIDEO_WaitVSync(); + RetroUSB_ScanPads(); + } + } else { while (WiiDRC_ButtonsHeld()) @@ -784,49 +831,55 @@ static void wpad_config(u8 exp, int chan, int first_key, int last_key) } } - /* Configurable menu key */ - GUI_MsgBoxUpdate(0,"Press key(s) for MENU"); - - /* reset key combo */ - config.wpad_keymap[4*exp + chan][KEY_MENU] = 0; - - /* wait for user input */ - p = 0; - while (!p) + if (!isRetroUSB) { - VIDEO_WaitVSync(); - if (exp <= WPAD_EXP_CLASSIC) - { - WPAD_ScanPads(); - p = WPAD_ButtonsHeld(chan); - } - else - { - WiiDRC_ScanPads(); - p = WiiDRC_ButtonsHeld(); - } - } + /* Configurable menu key */ + GUI_MsgBoxUpdate(0, "Press key(s) for MENU"); - /* register keys until none are pressed anymore */ - while (p) + /* reset key combo */ + config.wpad_keymap[4 * exp + chan][KEY_MENU] = 0; + + /* wait for user input */ + p = 0; + while (!p) + { + VIDEO_WaitVSync(); + if (exp <= WPAD_EXP_CLASSIC) + { + WPAD_ScanPads(); + p = WPAD_ButtonsHeld(chan); + } + else + { + WiiDRC_ScanPads(); + p = WiiDRC_ButtonsHeld(); + } + } + + /* register keys until none are pressed anymore */ + while (p) + { + /* update key combo */ + config.wpad_keymap[4 * exp + chan][KEY_MENU] |= p; + + /* update WPAD status */ + VIDEO_WaitVSync(); + if (exp <= WPAD_EXP_CLASSIC) + { + WPAD_ScanPads(); + p = WPAD_ButtonsHeld(chan); + } + else + { + WiiDRC_ScanPads(); + p = WiiDRC_ButtonsHeld(); + } + } + } + else { - /* update key combo */ - config.wpad_keymap[4*exp + chan][KEY_MENU] |= p; - - /* update WPAD status */ - VIDEO_WaitVSync(); - if (exp <= WPAD_EXP_CLASSIC) - { - WPAD_ScanPads(); - p = WPAD_ButtonsHeld(chan); - } - else - { - WiiDRC_ScanPads(); - p = WiiDRC_ButtonsHeld(); - } + config.wpad_keymap[4 * exp + chan][KEY_MENU] = 0xFFFF; } - /* re-enable background WPAD scanning and exit */ inputs_disabled = 0; } @@ -846,34 +899,41 @@ static void wpad_update(s8 chan, u8 i, u32 exp) /* WiiU GamePad Controller support */ if (exp > WPAD_EXP_CLASSIC) { - WiiDRC_ScanPads(); - if (WiiDRC_ShutdownRequested()) - { - Shutdown = ConfigRequested = 1; - reload = 0; - return; - } - - p = WiiDRC_ButtonsHeld(); - - /* Default fast-forward key combo */ - if (WiiDRC_ButtonsDown() & WIIDRC_BUTTON_HOME) - { - if (p & WIIDRC_BUTTON_MINUS) + if (RetroUSB_OK()) { - audioSync ^= AUDIO_WAIT; - videoSync = (audioSync && config.vsync && (gc_pal != vdp_pal)) ? VIDEO_WAIT : 0; - return; + p = RetroUSB_ButtonsHeld(); } - } + else + { + WiiDRC_ScanPads(); + if (WiiDRC_ShutdownRequested()) + { + Shutdown = ConfigRequested = 1; + reload = 0; + return; + } - /* Left Analog Stick */ - x = (WiiDRC_lStickX() * 128) / 75; - y = (WiiDRC_lStickY() * 128) / 75; - if (x > 127) x = 127; - else if (x < -128) x = -128; - if (y > 127) y = 127; - else if (y < -128) y = -128; + p = WiiDRC_ButtonsHeld(); + + /* Default fast-forward key combo */ + if (WiiDRC_ButtonsDown() & WIIDRC_BUTTON_HOME) + { + if (p & WIIDRC_BUTTON_MINUS) + { + audioSync ^= AUDIO_WAIT; + videoSync = (audioSync && config.vsync && (gc_pal != vdp_pal)) ? VIDEO_WAIT : 0; + return; + } + } + + /* Left Analog Stick */ + x = (WiiDRC_lStickX() * 128) / 75; + y = (WiiDRC_lStickY() * 128) / 75; + if (x > 127) x = 127; + else if (x < -128) x = -128; + if (y > 127) y = 127; + else if (y < -128) y = -128; + } } else if (exp != WPAD_EXP_NONE) { @@ -933,7 +993,7 @@ static void wpad_update(s8 chan, u8 i, u32 exp) input.analog[i][1] = y ? (127 - y) : 128; /* Right Stick analog position [0-255] */ - if (exp >= WPAD_EXP_CLASSIC) + if (exp >= WPAD_EXP_CLASSIC && !RetroUSB_OK()) { if (exp > WPAD_EXP_CLASSIC) { @@ -1060,7 +1120,7 @@ static void wpad_update(s8 chan, u8 i, u32 exp) input.analog[i][1] = 512; } } - else + else if(!RetroUSB_OK()) { /* Left analog stick */ input.analog[i][0] += x / ANALOG_SENSITIVITY; @@ -1114,7 +1174,7 @@ static void wpad_update(s8 chan, u8 i, u32 exp) input.analog[i][1] = (int)((ir.sy - 384) * 2 / 3 / ANALOG_SENSITIVITY); } } - else + else if(!RetroUSB_OK()) { /* Left analog stick position (-127;+127) -> (-255;+255) */ input.analog[i][0] = (x / ANALOG_SENSITIVITY) * 2; @@ -1156,7 +1216,7 @@ static void wpad_update(s8 chan, u8 i, u32 exp) input.analog[0][1] = 0x1fc + ((ir.y + config.caly) * (0x2f7 - 0x1fc + 1)) / 480; } } - else + else if(!RetroUSB_OK()) { /* Left analog stick */ input.analog[0][0] += x / ANALOG_SENSITIVITY; @@ -1193,7 +1253,7 @@ static void wpad_update(s8 chan, u8 i, u32 exp) input.analog[0][1] = ((ir.y + config.caly) * 250) / 480; } } - else + else if(!RetroUSB_OK()) { /* Left analog stick */ input.analog[0][0] += x / ANALOG_SENSITIVITY; @@ -1226,7 +1286,7 @@ static void wpad_update(s8 chan, u8 i, u32 exp) input.analog[0][1] = ((ir.y + config.caly) * 255) / 480; } } - else + else if(!RetroUSB_OK()) { /* Left analog stick */ input.analog[0][0] += x / ANALOG_SENSITIVITY; @@ -1305,6 +1365,7 @@ void gx_input_Init(void) WPAD_SetDataFormat(WPAD_CHAN_ALL,WPAD_FMT_BTNS_ACC_IR); WPAD_SetVRes(WPAD_CHAN_ALL,640,480); WiiDRC_Init(); + RetroUSB_OK(); #endif } @@ -1379,6 +1440,14 @@ int gx_input_FindDevices(void) } break; } + + case 5: /* RetroUSB */ + { + if (RetroUSB_OK()) + { + found++; + } + } #endif default: @@ -1461,6 +1530,17 @@ void gx_input_SetDefault(void) config.wpad_keymap[4*3][KEY_BUTTONZ] = WIIDRC_BUTTON_X; config.wpad_keymap[4*3][KEY_MODE] = WIIDRC_BUTTON_MINUS; config.wpad_keymap[4*3][KEY_MENU] = WIIDRC_BUTTON_HOME; + + /* RetroUSB */ + config.wpad_keymap[4 * 3 + 1][KEY_BUTTONA] = PAD_BUTTON_Y; + config.wpad_keymap[4 * 3 + 1][KEY_BUTTONB] = PAD_BUTTON_B; + config.wpad_keymap[4 * 3 + 1][KEY_BUTTONC] = PAD_BUTTON_A; + config.wpad_keymap[4 * 3 + 1][KEY_START] = PAD_BUTTON_START; + config.wpad_keymap[4 * 3 + 1][KEY_BUTTONX] = PAD_TRIGGER_L; + config.wpad_keymap[4 * 3 + 1][KEY_BUTTONY] = PAD_TRIGGER_R; + config.wpad_keymap[4 * 3 + 1][KEY_BUTTONZ] = PAD_BUTTON_X; + config.wpad_keymap[4 * 3 + 1][KEY_MODE] = PAD_TRIGGER_Z; + config.wpad_keymap[4 * 3 + 1][KEY_MENU] = 0; } #endif @@ -1473,16 +1553,21 @@ void gx_input_SetDefault(void) } #ifdef HW_RVL + + i = 0; /* autodetect connected WiiU Gamepad Controller */ if (WiiDRC_Inited() && WiiDRC_Connected()) { - config.input[0].device = 4; - config.input[0].port = 0; - i = 1; + config.input[i].device = 4; + config.input[i].port = 0; + i++; } - else + /* autodetect RetroUSB */ + if (RetroUSB_OK()) { - i = 0; + config.input[i].device = 5; + config.input[i].port = 0; + i++; } /* autodetect connected Wii Controllers */ diff --git a/gx/images/ctrl_retrousb.png b/gx/images/ctrl_retrousb.png new file mode 100644 index 0000000000000000000000000000000000000000..517d6a99ba6d7200af668fbfd7056d52c36ba757 GIT binary patch literal 51969 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 uH#SW%rP(c! +#include + +#define RETROUSB_VID 61440 +#define RETROUSB_PID 8 + +#define POLL_THREAD_STACKSIZE (1024 * 4) +#define POLL_THREAD_PRIO 65 + +static bool setup = false; +static bool replugRequired = false; +static s32 deviceId = 0; +static u8 endpoint = 0; +static u8 bMaxPacketSize = 0; +static u32 jpRetroUSB; +static char testChars[65]; +static bool pollThreadRunning = false; +static lwp_t pollThread = LWP_THREAD_NULL; +static u8 pollStack[POLL_THREAD_STACKSIZE] ATTRIBUTE_ALIGN(8); +u8 RetroUSB_Counter = 0; + +static bool isRetroUSBGamepad(usb_device_entry dev) +{ + return dev.vid == RETROUSB_VID && dev.pid == RETROUSB_PID; +} + +static u8 getEndpoint(usb_devdesc devdesc) +{ + if (devdesc.configurations == NULL || devdesc.configurations->interfaces == NULL || + devdesc.configurations->interfaces->endpoints == NULL) + { + return -1; + } + return devdesc.configurations->interfaces->endpoints->bEndpointAddress; +} + +static int removal_cb(int result, void* usrdata) +{ + s32 fd = (s32)usrdata; + if (fd == deviceId) + { + deviceId = 0; + } + return 1; +} + +static void open() +{ + if (deviceId != 0) + { + return; + } + + usb_device_entry dev_entry[8]; + u8 dev_count; + if (USB_GetDeviceList(dev_entry, 8, USB_CLASS_HID, &dev_count) < 0) + { + return; + } + + for (int i = 0; i < dev_count; ++i) + { + if (!isRetroUSBGamepad(dev_entry[i])) + { + continue; + } + s32 fd; + if (USB_OpenDevice(dev_entry[i].device_id, dev_entry[i].vid, dev_entry[i].pid, &fd) < 0) + { + continue; + } + + usb_devdesc devdesc; + if (USB_GetDescriptors(fd, &devdesc) < 0) + { + // You have to replug the controller! + replugRequired = true; + USB_CloseDevice(&fd); + break; + } + + deviceId = fd; + replugRequired = false; + endpoint = getEndpoint(devdesc); + bMaxPacketSize = devdesc.bMaxPacketSize0; + USB_DeviceRemovalNotifyAsync(fd, &removal_cb, (void*)fd); + break; + } + + setup = true; +} + +u32 RetroUSB_ScanPads(void) +{ + return jpRetroUSB; +} + +static void *scanThreadFunc(void *arg) +{ + RetroUSB_Counter = 100; + while (1) + { + if (deviceId == 0 || replugRequired) + { + continue; + } + + uint8_t ATTRIBUTE_ALIGN(32) buf[4]; + s32 res = USB_ReadIntrMsg(deviceId, endpoint, sizeof(buf), buf); + if (res < 0) + { + continue; + } + + u32 jp = 0; + jp |= (buf[2] & 0x80) ? PAD_BUTTON_UP : 0; + jp |= (buf[2] & 0x40) ? PAD_BUTTON_DOWN : 0; + jp |= (buf[2] & 0x20) ? PAD_BUTTON_LEFT : 0; + jp |= (buf[2] & 0x10) ? PAD_BUTTON_RIGHT : 0; + + jp |= ((buf[2] & 0x08)) ? PAD_BUTTON_A : 0; + jp |= ((buf[2] & 0x04)) ? PAD_BUTTON_B : 0; + jp |= ((buf[3] & 0x04)) ? PAD_BUTTON_X : 0; + jp |= ((buf[2] & 0x02)) ? PAD_BUTTON_Y : 0; + + jp |= ((buf[3] & 0x02)) ? PAD_TRIGGER_L : 0; + jp |= ((buf[3] & 0x08)) ? PAD_TRIGGER_R : 0; + + jp |= ((buf[2] & 0x01)) ? PAD_BUTTON_START : 0; + jp |= ((buf[3] & 0x01)) ? PAD_TRIGGER_Z : 0; + + /*int i; + for (i = 0; i < res; i++) { + testChars[i * 3] = "0123456789ABCDEF"[(buf[i] & 0xF0) >> 4]; + testChars[i * 3 + 1] = "0123456789ABCDEF"[buf[i] & 0xF]; + testChars[i * 3 + 2] = ' '; + } + + counter++; + testChars[i * 3] = "0123456789ABCDEF"[(counter & 0xF0) >> 4]; + testChars[i * 3 + 1] = "0123456789ABCDEF"[counter & 0xF]; + testChars[i * 3 + 2] = '\0';*/ + + RetroUSB_Counter++; + + jpRetroUSB = jp; + } + + return 0; +} + +u32 RetroUSB_ButtonsHeld() +{ + if (!setup) + { + open(); + } + if (!pollThreadRunning) + { + memset(pollStack, 0, POLL_THREAD_STACKSIZE); + + s32 res = LWP_CreateThread(&pollThread, scanThreadFunc, NULL, + pollStack, POLL_THREAD_STACKSIZE, + POLL_THREAD_PRIO); + if (!res) + { + pollThreadRunning = true; + } + } + if (deviceId == 0) + { + return 0; + } + return jpRetroUSB; +} + +char* RetroUSB_TestChars() { + return testChars; +} + +bool RetroUSB_OK() +{ + open(); + return !replugRequired && deviceId; +} + +#endif \ No newline at end of file diff --git a/gx/retrousb.h b/gx/retrousb.h new file mode 100644 index 0000000..df0e93f --- /dev/null +++ b/gx/retrousb.h @@ -0,0 +1,13 @@ +#ifndef _RETROUSB_H_ +#define _RETROUSB_H_ + +#include + +bool RetroUSB_ScanPads(); +u32 RetroUSB_ButtonsHeld(); +bool RetroUSB_OK(); +char* RetroUSB_TestChars(); + +extern u8 RetroUSB_Counter; + +#endif \ No newline at end of file