diff --git a/Makefile.wiiu b/Makefile.wiiu
index 59b35b388b..62b9c2665a 100644
--- a/Makefile.wiiu
+++ b/Makefile.wiiu
@@ -29,9 +29,10 @@ ifneq ($(V), 1)
endif
OBJ :=
-OBJ += wiiu/input/wpad_driver.o
-OBJ += wiiu/input/kpad_driver.o
-OBJ += wiiu/input/pad_functions.o
+OBJ += wiiu/main.o
+OBJ += input/drivers_joypad/wiiu/wpad_driver.o
+OBJ += input/drivers_joypad/wiiu/kpad_driver.o
+OBJ += input/drivers_joypad/wiiu/pad_functions.o
OBJ += wiiu/system/memory.o
OBJ += wiiu/system/atomic.o
OBJ += wiiu/system/exception_handler.o
@@ -47,8 +48,8 @@ endif
ifeq ($(WIIU_HID),1)
DEFINES += -DWIIU_HID
- OBJ += wiiu/input/hidpad_driver.o
- OBJ += wiiu/input/wiiu_hid.o
+ OBJ += input/drivers_joypad/wiiu/hidpad_driver.o
+ OBJ += input/drivers_hid/wiiu_hid.o
OBJ += input/connect/joypad_connection.o \
input/common/hid/hid_device_driver.o \
input/common/hid/device_wiiu_gca.o \
@@ -197,7 +198,16 @@ else
ELF2RPL := $(ELF2RPL).exe
endif
-INCDIRS := -I. -Ideps -Ideps/stb -Ideps/libz -Ideps/7zip -Ilibretro-common/include -Iwiiu -Iwiiu/include -I$(DEVKITPRO)/portlibs/ppc/include
+INCDIRS := -I.
+INCDIRS += -Ideps
+INCDIRS += -Ideps/stb
+INCDIRS += -Ideps/libz
+INCDIRS += -Ideps/7zip
+INCDIRS += -Ilibretro-common/include
+INCDIRS += -Iinput/include
+INCDIRS += -Iwiiu
+INCDIRS += -Iwiiu/include
+INCDIRS += -I$(DEVKITPRO)/portlibs/ppc/include
LIBDIRS := -L. -L$(DEVKITPRO)/portlibs/ppc/lib
CFLAGS := -mwup -mcpu=750 -meabi -mhard-float
diff --git a/frontend/drivers/platform_wiiu.c b/frontend/drivers/platform_wiiu.c
index 2ad2a41ae2..1f997633fe 100644
--- a/frontend/drivers/platform_wiiu.c
+++ b/frontend/drivers/platform_wiiu.c
@@ -14,54 +14,45 @@
* If not, see .
*/
-#include
-#include
-#include
-#include
-#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
#include
-#include
-#include
#ifndef IS_SALAMANDER
#include
#endif
-#include "../frontend_driver.h"
-#include "../frontend.h"
-#include "../../verbosity.h"
-#include "../../defaults.h"
-#include "../../paths.h"
-#include "retroarch.h"
-#include "file_path_special.h"
-#include "audio/audio_driver.h"
+#include
-
-#include "tasks/tasks_internal.h"
-#include "../../retroarch.h"
-#include
-#include
-#include
-#include "fs/fs_utils.h"
-#include "fs/sd_fat_devoptab.h"
-#include "system/dynamic.h"
-#include "system/memory.h"
-#include "system/exception_handler.h"
-#include
-#include
-#include
-#include
+#include
+#include
+#include
+#include
#include
#include
-#include
-#include
-#include
-#include
-#include
-#include "wiiu_dbg.h"
+#include "file_path_special.h"
+
+#include "../frontend.h"
+#include "../frontend_driver.h"
+#include "../../defaults.h"
+#include "../../paths.h"
+#include "../../verbosity.h"
+#include "../../retroarch.h"
+#include "../../gfx/video_driver.h"
+
+
#include "hbl.h"
+#include "wiiu_dbg.h"
+#include "system/exception_handler.h"
+#include "tasks/tasks_internal.h"
#ifndef IS_SALAMANDER
#ifdef HAVE_MENU
@@ -69,10 +60,13 @@
#endif
#endif
-//#define WIIU_SD_PATH "/vol/external01/"
#define WIIU_SD_PATH "sd:/"
#define WIIU_USB_PATH "usb:/"
+/**
+ * The Wii U frontend driver, along with the main() method.
+ */
+
static enum frontend_fork wiiu_fork_mode = FRONTEND_FORK_NONE;
static const char *elf_path_cst = WIIU_SD_PATH "retroarch/retroarch.elf";
@@ -311,16 +305,191 @@ frontend_ctx_driver_t frontend_ctx_wiiu =
NULL, /* get_video_driver */
};
+/* main() and its supporting functions */
+
+static void main_setup(void);
+static void get_arguments(int *argc, char ***argv);
+static void do_rarch_main(int argc, char **argv);
+static void main_loop(void);
+static void main_teardown(void);
+
+static void init_network(void);
+static void init_logging(void);
+static void deinit_logging(void);
+static void wiiu_log_init(const char *ipString, int port);
+static void wiiu_log_deinit(void);
+static ssize_t wiiu_log_write(struct _reent *r, void *fd, const char *ptr, size_t len);
+static void init_pad_libraries(void);
+static void deinit_pad_libraries(void);
+static void SaveCallback(void);
+static bool swap_is_pending(void *start_time);
+
static int wiiu_log_socket = -1;
static volatile int wiiu_log_lock = 0;
-void wiiu_log_init(const char *ipString, int port)
+#if defined(PC_DEVELOPMENT_IP_ADDRESS) && defined(PC_DEVELOPMENT_TCP_PORT)
+static devoptab_t dotab_stdout =
+{
+ "stdout_net", /* device name */
+ 0, /* size of file structure */
+ NULL, /* device open */
+ NULL, /* device close */
+ wiiu_log_write, /* device write */
+ NULL, /* ... */
+};
+#endif /* defined(PC_DEVELOPMENT_IP_ADDRESS) && defined(PC_DEVELOPMENT_TCP_PORT) */
+
+int main(int argc, char **argv)
+{
+ main_setup();
+ get_arguments(&argc, &argv);
+
+#ifdef IS_SALAMANDER
+ int salamander_main(argc, argv);
+ salamander_main(argc, argv);
+#else
+ do_rarch_main(argc, argv);
+ main_loop();
+ main_exit(NULL);
+#endif /* IS_SALAMANDER */
+ main_teardown();
+
+ /* We always return 0 because if we don't, it can prevent loading a
+ * different RPX/ELF in HBL. */
+ return 0;
+}
+
+static void get_arguments(int *argc, char ***argv)
+{
+ DEBUG_VAR(ARGV_PTR);
+ if(ARGV_PTR && ((u32)ARGV_PTR < 0x01000000))
+ {
+ struct
+ {
+ u32 magic;
+ u32 argc;
+ char *argv[3];
+ } *param = ARGV_PTR;
+ if(param->magic == ARGV_MAGIC)
+ {
+ *argc = param->argc;
+ *argv = param->argv;
+ }
+ ARGV_PTR = NULL;
+ }
+
+ DEBUG_VAR(argc);
+ DEBUG_VAR(argv[0]);
+ DEBUG_VAR(argv[1]);
+ fflush(stdout);
+}
+
+static void main_setup(void)
+{
+ setup_os_exceptions();
+ ProcUIInit(&SaveCallback);
+ init_network();
+ init_logging();
+ init_pad_libraries();
+ verbosity_enable();
+ fflush(stdout);
+}
+
+static void main_teardown(void)
+{
+ deinit_pad_libraries();
+ ProcUIShutdown();
+ deinit_logging();
+}
+
+static void main_loop(void)
+{
+ unsigned sleep_ms = 0;
+ OSTime start_time;
+ int status;
+
+ do
+ {
+ if(video_driver_get_ptr(false))
+ {
+ start_time = OSGetSystemTime();
+ task_queue_wait(swap_is_pending, &start_time);
+ }
+ else
+ task_queue_wait(NULL, NULL);
+
+ status = runloop_iterate(&sleep_ms);
+
+ if(status == 1 && sleep_ms > 0)
+ usleep(sleep_ms);
+
+ if(status == -1)
+ break;
+ } while(true);
+}
+
+static void do_rarch_main(int argc, char **argv)
+{
+#if 0
+ int argc_ = 2;
+ char *argv_[] = { WIIU_SD_PATH "retroarch/retroarch.elf",
+ WIIU_SD_PATH "rom.sfc",
+ NULL };
+ rarch_main(argc_, argv_, NULL);
+#else
+ rarch_main(argc, argv, NULL);
+#endif /* if 0 */
+}
+
+static void SaveCallback(void)
+{
+ OSSavesDone_ReadyToRelease();
+}
+
+static bool swap_is_pending(void *start_time)
+{
+ uint32_t swap_count, flip_count;
+ OSTime last_flip, last_vsync;
+
+ GX2GetSwapStatus(&swap_count, &flip_count, &last_flip, &last_vsync);
+ return last_vsync < *(OSTime *)start_time;
+}
+
+static void init_network(void)
+{
+#ifdef IS_SALAMANDER
+ socket_lib_init();
+#else
+ network_init();
+#endif /* IS_SALAMANDER */
+}
+
+static void init_logging(void)
+{
+#if defined(PC_DEVELOPMENT_IP_ADDRESS) && defined(PC_DEVELOPMENT_TCP_PORT)
+ wiiu_log_init(PC_DEVELOPMENT_IP_ADDRESS, PC_DEVELOPMENT_TCP_PORT);
+ devoptab_list[STD_OUT] = &dotab_stdout;
+ devoptab_list[STD_ERR] = &dotab_stdout;
+#endif /* defined(PC_DEVELOPMENT_IP_ADDRESS) && defined(PC_DEVELOPMENT_TCP_PORT) */
+}
+
+static void deinit_logging(void)
+{
+ fflush(stdout);
+ fflush(stderr);
+
+#if defined(PC_DEVELOPMENT_IP_ADDRESS) && defined(PC_DEVELOPMENT_TCP_PORT)
+ wiiu_log_deinit();
+#endif /* defined(PC_DEVELOPMENT_IP_ADDRESS) && defined(PC_DEVELOPMENT_TCP_PORT) */
+}
+
+
+static void wiiu_log_init(const char *ipString, int port)
{
wiiu_log_lock = 0;
-
wiiu_log_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
- if (wiiu_log_socket < 0)
+ if(wiiu_log_socket < 0)
return;
struct sockaddr_in connect_addr;
@@ -329,50 +498,42 @@ void wiiu_log_init(const char *ipString, int port)
connect_addr.sin_port = port;
inet_aton(ipString, &connect_addr.sin_addr);
- if (connect(wiiu_log_socket, (struct sockaddr *)&connect_addr, sizeof(connect_addr)) < 0)
+ if(connect(wiiu_log_socket,
+ (struct sockaddr *)&connect_addr,
+ sizeof(connect_addr)) < 0)
{
socketclose(wiiu_log_socket);
wiiu_log_socket = -1;
}
}
-void wiiu_log_deinit(void)
+static void wiiu_log_deinit(void)
{
- if (wiiu_log_socket >= 0)
+ if(wiiu_log_socket >= 0)
{
socketclose(wiiu_log_socket);
wiiu_log_socket = -1;
}
}
-static ssize_t wiiu_log_write(struct _reent *r, void *fd, const char *ptr, size_t len)
+
+static void init_pad_libraries(void)
{
- if (wiiu_log_socket < 0)
- return len;
-
- while (wiiu_log_lock)
- OSSleepTicks(((248625000 / 4)) / 1000);
-
- wiiu_log_lock = 1;
-
- int ret;
- int remaining = len;
-
- while (remaining > 0)
- {
- int block = remaining < 1400 ? remaining : 1400; // take max 1400 bytes per UDP packet
- ret = send(wiiu_log_socket, ptr, block, 0);
-
- if (ret < 0)
- break;
-
- remaining -= ret;
- ptr += ret;
- }
-
- wiiu_log_lock = 0;
-
- return len;
+#ifndef IS_SALAMANDER
+ KPADInit();
+ WPADEnableURCC(true);
+ WPADEnableWiiRemote(true);
+#endif /* IS_SALAMANDER */
}
+
+static void deinit_pad_libraries(void)
+{
+#ifndef IS_SALAMANDER
+ KPADShutdown();
+#endif /* IS_SALAMANDER */
+}
+
+/* logging routines */
+
void net_print(const char *str)
{
wiiu_log_write(NULL, 0, str, strlen(str));
@@ -383,273 +544,32 @@ void net_print_exp(const char *str)
send(wiiu_log_socket, str, strlen(str), 0);
}
-#if defined(PC_DEVELOPMENT_IP_ADDRESS) && defined(PC_DEVELOPMENT_TCP_PORT)
-static devoptab_t dotab_stdout =
+static ssize_t wiiu_log_write(struct _reent *r, void *fd, const char *ptr, size_t len)
{
- "stdout_net", // device name
- 0, // size of file structure
- NULL, // device open
- NULL, // device close
- wiiu_log_write, // device write
- NULL,
- /* ... */
-};
-#endif
+ if( wiiu_log_socket < 0)
+ return len;
-void SaveCallback(void)
-{
- OSSavesDone_ReadyToRelease();
-}
+ while(wiiu_log_lock)
+ OSSleepTicks(((248625000 / 4)) / 1000);
-static bool swap_is_pending(void* start_time)
-{
- uint32_t swap_count, flip_count;
- OSTime last_flip , last_vsync;
+ wiiu_log_lock = 1;
- GX2GetSwapStatus(&swap_count, &flip_count, &last_flip, &last_vsync);
+ int ret;
+ int remaining = len;
- return last_vsync < *(OSTime*)start_time;
-}
-
-int main(int argc, char **argv)
-{
- setup_os_exceptions();
- ProcUIInit(&SaveCallback);
-
-#ifdef IS_SALAMANDER
- socket_lib_init();
-#else
- network_init();
-#endif
-#if defined(PC_DEVELOPMENT_IP_ADDRESS) && defined(PC_DEVELOPMENT_TCP_PORT)
- wiiu_log_init(PC_DEVELOPMENT_IP_ADDRESS, PC_DEVELOPMENT_TCP_PORT);
- devoptab_list[STD_OUT] = &dotab_stdout;
- devoptab_list[STD_ERR] = &dotab_stdout;
-#endif
-#ifndef IS_SALAMANDER
- VPADInit();
- WPADEnableURCC(true);
- WPADEnableWiiRemote(true);
- KPADInit();
-#endif
- verbosity_enable();
- fflush(stdout);
- DEBUG_VAR(ARGV_PTR);
- if(ARGV_PTR && ((u32)ARGV_PTR < 0x01000000))
+ while(remaining > 0)
{
- struct
- {
- u32 magic;
- u32 argc;
- char * argv[3];
- }*param = ARGV_PTR;
- if(param->magic == ARGV_MAGIC)
- {
- argc = param->argc;
- argv = param->argv;
- }
- ARGV_PTR = NULL;
- }
+ int block = remaining < 1400 ? remaining : 1400;
+ ret = send(wiiu_log_socket, ptr, block, 0);
- DEBUG_VAR(argc);
- DEBUG_STR(argv[0]);
- DEBUG_STR(argv[1]);
- fflush(stdout);
-#ifdef IS_SALAMANDER
- int salamander_main(int, char **);
- salamander_main(argc, argv);
-#else
-#if 1
-#if 0
- int argc_ = 2;
-// char* argv_[] = {WIIU_SD_PATH "retroarch/retroarch.elf", WIIU_SD_PATH "rom.nes", NULL};
- char *argv_[] = {WIIU_SD_PATH "retroarch/retroarch.elf", WIIU_SD_PATH "rom.sfc", NULL};
-
- rarch_main(argc_, argv_, NULL);
-#else
- rarch_main(argc, argv, NULL);
-#endif
- do
- {
- unsigned sleep_ms = 0;
-
- if(video_driver_get_ptr(false))
- {
- OSTime start_time = OSGetSystemTime();
- task_queue_wait(swap_is_pending, &start_time);
- }
- else
- task_queue_wait(NULL, NULL);
-
- int ret = runloop_iterate(&sleep_ms);
-
- if (ret == 1 && sleep_ms > 0)
- retro_sleep(sleep_ms);
-
-
- if (ret == -1)
+ if(ret < 0)
break;
- }
- while (1);
- main_exit(NULL);
-#endif
-#endif
- fflush(stdout);
- fflush(stderr);
- ProcUIShutdown();
-
-#if defined(PC_DEVELOPMENT_IP_ADDRESS) && defined(PC_DEVELOPMENT_TCP_PORT)
- wiiu_log_deinit();
-#endif
-
- /* returning non 0 here can prevent loading a different rpx/elf in the HBL environment */
- return 0;
-}
-
-void __eabi(void)
-{
-
-}
-
-__attribute__((weak))
-void __init(void)
-{
- extern void (*const __CTOR_LIST__)(void);
- extern void (*const __CTOR_END__)(void);
-
- void (*const *ctor)(void) = &__CTOR_LIST__;
- while (ctor < &__CTOR_END__) {
- (*ctor++)();
- }
-}
-
-__attribute__((weak))
-void __fini(void)
-{
- extern void (*const __DTOR_LIST__)(void);
- extern void (*const __DTOR_END__)(void);
-
- void (*const *dtor)(void) = &__DTOR_LIST__;
- while (dtor < &__DTOR_END__) {
- (*dtor++)();
- }
-}
-
-/* libiosuhax related */
-
-//just to be able to call async
-void someFunc(void *arg)
-{
- (void)arg;
-}
-
-static int mcp_hook_fd = -1;
-
-int MCPHookOpen(void)
-{
- //take over mcp thread
- mcp_hook_fd = IOS_Open("/dev/mcp", 0);
-
- if (mcp_hook_fd < 0)
- return -1;
-
- IOS_IoctlAsync(mcp_hook_fd, 0x62, (void *)0, 0, (void *)0, 0, someFunc, (void *)0);
- //let wupserver start up
- retro_sleep(1000);
-
- if (IOSUHAX_Open("/dev/mcp") < 0)
- {
- IOS_Close(mcp_hook_fd);
- mcp_hook_fd = -1;
- return -1;
+ remaining -= ret;
+ ptr += ret;
}
- return 0;
-}
-
-void MCPHookClose(void)
-{
- if (mcp_hook_fd < 0)
- return;
-
- //close down wupserver, return control to mcp
- IOSUHAX_Close();
- //wait for mcp to return
- retro_sleep(1000);
- IOS_Close(mcp_hook_fd);
- mcp_hook_fd = -1;
-}
-
-
-static int iosuhaxMount = 0;
-
-static void fsdev_init(void)
-{
- iosuhaxMount = 0;
- int res = IOSUHAX_Open(NULL);
-
- if (res < 0)
- res = MCPHookOpen();
-
- if (res < 0)
- mount_sd_fat("sd");
- else
- {
- iosuhaxMount = 1;
- fatInitDefault();
- }
-}
-static void fsdev_exit(void)
-{
- if (iosuhaxMount)
- {
- fatUnmount("sd:");
- fatUnmount("usb:");
-
- if (mcp_hook_fd >= 0)
- MCPHookClose();
- else
- IOSUHAX_Close();
- }
- else
- unmount_sd_fat("sd");
-
-}
-
-/* HBL elf entry point */
-int __entry_menu(int argc, char **argv)
-{
- int ret;
-
- InitFunctionPointers();
- memoryInitialize();
- __init();
- fsdev_init();
-
- ret = main(argc, argv);
-
- fsdev_exit();
- __fini();
- memoryRelease();
- return ret;
-}
-/* RPX entry point */
-__attribute__((noreturn))
-void _start(int argc, char **argv)
-{
- memoryInitialize();
- __init();
- fsdev_init();
- main(argc, argv);
- fsdev_exit();
-
- /* TODO: fix elf2rpl so it doesn't error with "Could not find matching symbol
- for relocation" then uncomment this */
-#if 0
- __fini();
-#endif
- memoryRelease();
- SYSRelaunchTitle(0, 0);
- exit(0);
+ wiiu_log_lock = 0;
+
+ return len;
}
diff --git a/wiiu/input/wiiu_hid.c b/input/drivers_hid/wiiu_hid.c
similarity index 99%
rename from wiiu/input/wiiu_hid.c
rename to input/drivers_hid/wiiu_hid.c
index 962e9323d8..ca15e41249 100644
--- a/wiiu/input/wiiu_hid.c
+++ b/input/drivers_hid/wiiu_hid.c
@@ -14,7 +14,7 @@
* If not, see .
*/
-#include "wiiu_hid.h"
+#include "../include/wiiu/hid.h"
#include
static wiiu_event_list events;
diff --git a/wiiu/input/hidpad_driver.c b/input/drivers_joypad/wiiu/hidpad_driver.c
similarity index 98%
rename from wiiu/input/hidpad_driver.c
rename to input/drivers_joypad/wiiu/hidpad_driver.c
index 03efe64d5c..cfaa795c92 100644
--- a/wiiu/input/hidpad_driver.c
+++ b/input/drivers_joypad/wiiu/hidpad_driver.c
@@ -14,8 +14,7 @@
* If not, see .
*/
-#include "wiiu_input.h"
-#include "wiiu_hid.h"
+#include "../../include/wiiu/input.h"
static bool hidpad_init(void *data);
static bool hidpad_query_pad(unsigned pad);
diff --git a/wiiu/input/kpad_driver.c b/input/drivers_joypad/wiiu/kpad_driver.c
similarity index 99%
rename from wiiu/input/kpad_driver.c
rename to input/drivers_joypad/wiiu/kpad_driver.c
index a3c7078357..611bd8e8ae 100644
--- a/wiiu/input/kpad_driver.c
+++ b/input/drivers_joypad/wiiu/kpad_driver.c
@@ -20,7 +20,7 @@
* controllers.
*/
-#include "wiiu_input.h"
+#include "../../include/wiiu/input.h"
static bool kpad_init(void *data);
static bool kpad_query_pad(unsigned pad);
diff --git a/wiiu/input/pad_functions.c b/input/drivers_joypad/wiiu/pad_functions.c
similarity index 99%
rename from wiiu/input/pad_functions.c
rename to input/drivers_joypad/wiiu/pad_functions.c
index 5aefbaf23c..d025325519 100644
--- a/wiiu/input/pad_functions.c
+++ b/input/drivers_joypad/wiiu/pad_functions.c
@@ -14,7 +14,7 @@
* If not, see .
*/
-#include "wiiu_input.h"
+#include "wiiu/input.h"
enum wiiu_pad_axes {
AXIS_LEFT_ANALOG_X,
diff --git a/wiiu/input/wpad_driver.c b/input/drivers_joypad/wiiu/wpad_driver.c
similarity index 99%
rename from wiiu/input/wpad_driver.c
rename to input/drivers_joypad/wiiu/wpad_driver.c
index 4933a2dc3e..3f008342c7 100644
--- a/wiiu/input/wpad_driver.c
+++ b/input/drivers_joypad/wiiu/wpad_driver.c
@@ -21,7 +21,7 @@
* - For HID controllers, see hid_driver.c
*/
-#include "wiiu_input.h"
+#include "../../include/wiiu/input.h"
#define PANIC_BUTTON_MASK (VPAD_BUTTON_R | VPAD_BUTTON_L | VPAD_BUTTON_STICK_R | VPAD_BUTTON_STICK_L)
diff --git a/input/drivers_joypad/wiiu_joypad.c b/input/drivers_joypad/wiiu_joypad.c
index 5728a90c6d..12151519ef 100644
--- a/input/drivers_joypad/wiiu_joypad.c
+++ b/input/drivers_joypad/wiiu_joypad.c
@@ -14,7 +14,7 @@
* If not, see .
*/
-#include "../../wiiu/input/wiiu_input.h"
+#include "../include/wiiu/input.h"
#include "wiiu_dbg.h"
diff --git a/wiiu/input/wiiu_hid.h b/input/include/wiiu/hid.h
similarity index 98%
rename from wiiu/input/wiiu_hid.h
rename to input/include/wiiu/hid.h
index 0c96c9599c..66999d41be 100644
--- a/wiiu/input/wiiu_hid.h
+++ b/input/include/wiiu/hid.h
@@ -17,9 +17,9 @@
#ifndef __WIIU_HID__H
#define __WIIU_HID__H
-#include "wiiu_hid_types.h"
-
-#include "wiiu_input.h"
+#include "hid_types.h"
+#include "input.h"
+#include "../../common/hid/hid_device_driver.h"
#define DEVICE_UNUSED 0
#define DEVICE_USED 1
diff --git a/wiiu/input/wiiu_hid_types.h b/input/include/wiiu/hid_types.h
similarity index 100%
rename from wiiu/input/wiiu_hid_types.h
rename to input/include/wiiu/hid_types.h
diff --git a/wiiu/input/wiiu_input.h b/input/include/wiiu/input.h
similarity index 81%
rename from wiiu/input/wiiu_input.h
rename to input/include/wiiu/input.h
index 37416bc7e6..5aee72ef30 100644
--- a/wiiu/input/wiiu_input.h
+++ b/input/include/wiiu/input.h
@@ -17,31 +17,33 @@
#ifndef __WIIU_INPUT__H
#define __WIIU_INPUT__H
-#include "wiiu_hid_types.h"
-#include "../../input/include/gamepad.h"
-
-#ifdef HAVE_CONFIG_H
-#include "../../config.h"
-#endif /* HAVE_CONFIG_H */
-
#include
#include
#include
+
+#include "hid_types.h"
+#include "../gamepad.h"
+
#include
#include
#include
#include
#include
+#include "hid.h"
-#include "../../input/input_driver.h"
-#include "../../input/common/hid/hid_device_driver.h"
-#include "../../tasks/tasks_internal.h"
-#include "../../input/connect/joypad_connection.h"
-#include "../../retroarch.h"
-#include "../../verbosity.h"
-#include "../../command.h"
-#include "../../gfx/video_driver.h"
-#include "wiiu_hid.h"
+#include "../../input_driver.h"
+#include "../../common/hid/hid_device_driver.h"
+#include "../../connect/joypad_connection.h"
+#include "../../../retroarch.h"
+#include "../../../verbosity.h"
+#include "../../../command.h"
+
+#ifdef HAVE_CONFIG_H
+#include "../../../config.h"
+#endif /* HAVE_CONFIG_H */
+
+#include "../../../gfx/video_driver.h"
+#include "../../../tasks/tasks_internal.h"
#define WIIMOTE_TYPE_WIIPLUS 0x00
#define WIIMOTE_TYPE_NUNCHUK 0x01
diff --git a/wiiu/hbl.h b/wiiu/hbl.h
index f34f5451e9..939bbba9e3 100644
--- a/wiiu/hbl.h
+++ b/wiiu/hbl.h
@@ -1,6 +1,8 @@
#ifndef __WIIU_HBL_LOADER_H__
#define __WIIU_HBL_LOADER_H__
+#include "wiiu/types.h"
+
#ifdef __cplusplus
extern "C" {
#endif
diff --git a/wiiu/include/wiiu/kpad.h b/wiiu/include/wiiu/kpad.h
index 17a97a527c..27988fba26 100644
--- a/wiiu/include/wiiu/kpad.h
+++ b/wiiu/include/wiiu/kpad.h
@@ -65,9 +65,35 @@ typedef struct _KPADData
void KPADInit (void);
+void KPADShutdown(void);
s32 KPADRead(s32 chan, void * data, u32 size);
s32 KPADReadEx(s32 chan, KPADData * data, u32 size, s32 *error);
+typedef s32 WPADChannel;
+/* legal values for WPADChannel */
+enum {
+ WPAD_CHAN0 = 0,
+ WPAD_CHAN1 = 1,
+ WPAD_CHAN2 = 2,
+ WPAD_CHAN3 = 3
+};
+
+typedef s8 WPADError;
+/* legal values for WPADError */
+enum {
+ WPAD_ERROR_NONE = 0,
+ WPAD_ERROR_NO_CONTROLLER = -1,
+ WPAD_ERROR_BUSY = -2,
+ WPAD_ERROR_TRANSFER = -3,
+ WPAD_ERROR_INVALID = -4,
+ WPAD_ERROR_NOPERM = -5,
+ WPAD_ERROR_BROKEN = -6,
+ WPAD_ERROR_CORRUPTED = -7
+};
+
+typedef void (*WPADConnectCallback) (WPADChannel channel, WPADError reason);
+
+
#ifdef __cplusplus
}
#endif
diff --git a/wiiu/main.c b/wiiu/main.c
new file mode 100644
index 0000000000..5a2a2e698e
--- /dev/null
+++ b/wiiu/main.c
@@ -0,0 +1,197 @@
+/* RetroArch - A frontend for libretro.
+ * Copyright (C) 2014-2016 - Ali Bouhlel
+ * Copyright (C) 2011-2017 - Daniel De Matteis
+ *
+ * RetroArch 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 Found-
+ * ation, either version 3 of the License, or (at your option) any later version.
+ *
+ * RetroArch is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
+ * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along with RetroArch.
+ * If not, see .
+ */
+
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+
+#include "hbl.h"
+
+#include "fs/fs_utils.h"
+#include "fs/sd_fat_devoptab.h"
+
+#include "system/dynamic.h"
+#include "system/memory.h"
+#include "system/exception_handler.h"
+
+#include
+#include
+#include
+#include
+#include
+#include
+
+/**
+ * This file contains the main entrypoints for the Wii U executable that
+ * set up the call to main().
+ */
+
+int main(int argc, char **argv);
+void __fini(void);
+void __init(void);
+
+static void fsdev_init(void);
+static void fsdev_exit(void);
+
+static int iosuhaxMount = 0;
+static int mcp_hook_fd = -1;
+
+/* HBL elf entry point */
+int __entry_menu(int argc, char **argv)
+{
+ int ret;
+
+ InitFunctionPointers();
+ memoryInitialize();
+ __init();
+ fsdev_init();
+
+ ret = main(argc, argv);
+
+ fsdev_exit();
+ __fini();
+ memoryRelease();
+ return ret;
+}
+
+/* RPX entry point */
+__attribute__((noreturn))
+void _start(int argc, char **argv)
+{
+ memoryInitialize();
+ __init();
+ fsdev_init();
+ main(argc, argv);
+ fsdev_exit();
+
+ /* TODO: fix elf2rpl so it doesn't error with "Could not find matching symbol
+ for relocation" then uncomment this */
+#if 0
+ __fini();
+#endif
+ memoryRelease();
+ SYSRelaunchTitle(0, 0);
+ exit(0);
+}
+
+void __eabi(void)
+{
+
+}
+
+__attribute__((weak))
+void __init(void)
+{
+ extern void (*const __CTOR_LIST__)(void);
+ extern void (*const __CTOR_END__)(void);
+
+ void (*const *ctor)(void) = &__CTOR_LIST__;
+ while (ctor < &__CTOR_END__) {
+ (*ctor++)();
+ }
+}
+
+__attribute__((weak))
+void __fini(void)
+{
+ extern void (*const __DTOR_LIST__)(void);
+ extern void (*const __DTOR_END__)(void);
+
+ void (*const *dtor)(void) = &__DTOR_LIST__;
+ while (dtor < &__DTOR_END__) {
+ (*dtor++)();
+ }
+}
+
+/* libiosuhax related */
+
+//just to be able to call async
+void someFunc(void *arg)
+{
+ (void)arg;
+}
+
+int MCPHookOpen(void)
+{
+ //take over mcp thread
+ mcp_hook_fd = IOS_Open("/dev/mcp", 0);
+
+ if (mcp_hook_fd < 0)
+ return -1;
+
+ IOS_IoctlAsync(mcp_hook_fd, 0x62, (void *)0, 0, (void *)0, 0, someFunc, (void *)0);
+ //let wupserver start up
+ usleep(1000);
+
+ if (IOSUHAX_Open("/dev/mcp") < 0)
+ {
+ IOS_Close(mcp_hook_fd);
+ mcp_hook_fd = -1;
+ return -1;
+ }
+
+ return 0;
+}
+
+void MCPHookClose(void)
+{
+ if (mcp_hook_fd < 0)
+ return;
+
+ //close down wupserver, return control to mcp
+ IOSUHAX_Close();
+ //wait for mcp to return
+ usleep(1000);
+ IOS_Close(mcp_hook_fd);
+ mcp_hook_fd = -1;
+}
+
+static void fsdev_init(void)
+{
+ iosuhaxMount = 0;
+ int res = IOSUHAX_Open(NULL);
+
+ if (res < 0)
+ res = MCPHookOpen();
+
+ if (res < 0)
+ mount_sd_fat("sd");
+ else
+ {
+ iosuhaxMount = 1;
+ fatInitDefault();
+ }
+}
+
+static void fsdev_exit(void)
+{
+ if (iosuhaxMount)
+ {
+ fatUnmount("sd:");
+ fatUnmount("usb:");
+
+ if (mcp_hook_fd >= 0)
+ MCPHookClose();
+ else
+ IOSUHAX_Close();
+ }
+ else
+ unmount_sd_fat("sd");
+}
diff --git a/wiiu/system/imports.h b/wiiu/system/imports.h
index 939ef361dd..5a2f3daf77 100644
--- a/wiiu/system/imports.h
+++ b/wiiu/system/imports.h
@@ -249,16 +249,17 @@ IMPORT_END();
/* padscore */
IMPORT_BEGIN(padscore);
-
IMPORT(KPADInit);
IMPORT(WPADProbe);
+IMPORT(KPADSetConnectCallback);
+
IMPORT(WPADSetDataFormat);
IMPORT(WPADEnableURCC);
IMPORT(WPADEnableWiiRemote);
IMPORT(WPADRead);
IMPORT(KPADRead);
IMPORT(KPADReadEx);
-
+IMPORT(KPADShutdown);
IMPORT_END();
/* nsyskbd */