diff --git a/Makefile.wiiu b/Makefile.wiiu index cd2bdad24e..4f8dfa3e9b 100644 --- a/Makefile.wiiu +++ b/Makefile.wiiu @@ -10,8 +10,8 @@ ifneq ($(V), 1) Q := @ endif -PC_DEVELOPMENT_IP_ADDRESS ?= -PC_DEVELOPMENT_TCP_PORT ?= +PC_DEVELOPMENT_IP_ADDRESS ?=192.168.29.137 +PC_DEVELOPMENT_TCP_PORT ?=4405 OBJ := OBJ += input/drivers_hid/wiiu_hid.o diff --git a/frontend/drivers/platform_wiiu.c b/frontend/drivers/platform_wiiu.c index ce1866a5fd..84b4c5bdc0 100644 --- a/frontend/drivers/platform_wiiu.c +++ b/frontend/drivers/platform_wiiu.c @@ -641,16 +641,7 @@ void _start(int argc, char **argv) memoryInitialize(); __init(); fsdev_init(); -#ifdef HAVE_HID - HIDSetup(); -#endif - main(argc, argv); - -#ifdef HAVE_HID - HIDTeardown(); -#endif - fsdev_exit(); /* TODO: fix elf2rpl so it doesn't error with "Could not find matching symbol diff --git a/input/drivers_hid/wiiu_hid.c b/input/drivers_hid/wiiu_hid.c index dd6af87ff4..d10c20880c 100644 --- a/input/drivers_hid/wiiu_hid.c +++ b/input/drivers_hid/wiiu_hid.c @@ -14,19 +14,17 @@ * If not, see . */ -#include #include #include #include - #include #include #include "../input_defines.h" #include "../input_driver.h" -#include "../connect/joypad_connection.h" #include "../../verbosity.h" +<<<<<<< HEAD #define POLL_THREAD_SLEEP 10000 <<<<<<< HEAD ======= @@ -78,17 +76,21 @@ struct wiiu_hid_user uint32_t transfersize; uint32_t handle; }; +======= +#define DEVICE_UNUSED 0 +#define DEVICE_USED 1 +#define ALIGN_POINTER sizeof(void *) +>>>>>>> Simplify, add logging, revert some of the changes typedef struct wiiu_hid { - HIDClient *client; - OSThread *polling_thread; - // memory accounting; keep a pointer to the stack buffer so we can clean up later. - void *polling_thread_stack; - // setting this to true tells the polling thread to quit - volatile bool polling_thread_quit; + HIDClient *client; + OSThread *polling_thread; + void *polling_thread_stack; + volatile bool polling_thread_quit; } wiiu_hid_t; +<<<<<<< HEAD ======= >>>>>>> More progress on the HID driver /* @@ -102,11 +104,15 @@ static wiiu_hid_t *new_wiiu_hid_t(void); static void delete_wiiu_hid_t(wiiu_hid_t *hid); static wiiu_hid_user_t *new_wiiu_hid_user_t(void); static void delete_wiiu_hid_user_t(wiiu_hid_user_t *user); +======= +void *alloc_zeroed(size_t alignment, size_t size); +static wiiu_hid_t *new_hid(void); +static void delete_hid(wiiu_hid_t *hid); +static void delete_hidclient(HIDClient *client); +>>>>>>> Simplify, add logging, revert some of the changes static HIDClient *new_hidclient(void); -static void delete_hidclient(HIDClient *hid); -static OSFastMutex *new_fastmutex(const char *name); -static void delete_fastmutex(OSFastMutex *mutex); +<<<<<<< HEAD static int32_t wiiu_attach_callback(HIDClient *client, HIDDevice *device, uint32_t attach); ======= //static int32_t wiiu_attach_callback(HIDClient *client, HIDDevice *device, uint32_t attach); @@ -129,6 +135,12 @@ void delete_hid(wiiu_hid_t *hid); /** * HID driver entrypoints registered with hid_driver_t */ +======= +static void start_polling_thread(wiiu_hid_t *hid); +static void stop_polling_thread(wiiu_hid_t *hid); +static int wiiu_hid_polling_thread(int argc, const char **argv); +static int32_t wiiu_attach_callback(HIDClient *client, HIDDevice *device, uint32_t attach); +>>>>>>> Simplify, add logging, revert some of the changes static bool wiiu_hid_joypad_query(void *data, unsigned pad) { @@ -137,15 +149,19 @@ static bool wiiu_hid_joypad_query(void *data, unsigned pad) static const char *wiiu_hid_joypad_name(void *data, unsigned pad) { - return NULL; + /* TODO/FIXME - implement properly */ + if (pad >= MAX_USERS) + return NULL; + + return NULL; } -static uint64_t wiiu_hid_joypad_get_buttons(void *data, unsigned port) +static void wiiu_hid_joypad_get_buttons(void *data, unsigned port, retro_bits_t *state) { (void)data; (void)port; - return 0; + BIT256_CLEAR_ALL_PTR(state); } static bool wiiu_hid_joypad_button(void *data, unsigned port, uint16_t joykey) @@ -179,6 +195,7 @@ static int16_t wiiu_hid_joypad_axis(void *data, unsigned port, uint32_t joyaxis) static void *wiiu_hid_init(void) { +<<<<<<< HEAD wiiu_hid_t *hid = new_hid(); // HIDClient *client = new_hidclient(); @@ -205,10 +222,35 @@ static void *wiiu_hid_init(void) // } return NULL; +======= + HIDSetup(); + wiiu_hid_t *hid = new_hid(); + HIDClient *client = new_hidclient(); + if(!hid || !client) { + goto error; + } + + start_polling_thread(hid); + if(!hid->polling_thread) + goto error; + + HIDAddClient(client, wiiu_attach_callback); + hid->client = client; + + return hid; + + error: + RARCH_LOG("[hid]: initialization failed. cleaning up.\n"); + stop_polling_thread(hid); + delete_hid(hid); + delete_hidclient(client); + return NULL; +>>>>>>> Simplify, add logging, revert some of the changes } static void wiiu_hid_free(void *data) { +<<<<<<< HEAD wiiu_hid_t *hid = (wiiu_hid_t*)data; if (hid) { @@ -243,24 +285,35 @@ static void free_pad_list(void) { /** * This is a no-op because polling is done with a worker thread. */ +======= + wiiu_hid_t *hid = (wiiu_hid_t*)data; + + if (hid) { + stop_polling_thread(hid); + delete_hidclient(hid->client); + delete_hid(hid); + } + HIDTeardown(); +} + +>>>>>>> Simplify, add logging, revert some of the changes static void wiiu_hid_poll(void *data) { (void)data; } -/** - * Implementation functions - */ - static void start_polling_thread(wiiu_hid_t *hid) { + RARCH_LOG("[hid]: starting polling thread.\n"); OSThreadAttributes attributes = OS_THREAD_ATTRIB_AFFINITY_CPU2 | OS_THREAD_ATTRIB_STACK_USAGE; - int32_t stack_size = 0x8000; - // wild-ass guess. the patcher thread used 28 for the network threads (10 for BOTW). - int32_t priority = 10; - OSThread *thread = memalign(8, sizeof(OSThread)); - void *stack = memalign(32, stack_size); + BOOL result; + int32_t stack_size = 0x8000; + int32_t priority = 10; + OSThread *thread = memalign(ALIGN_POINTER, sizeof(OSThread)); + void *stack = memalign(ALIGN_POINTER, stack_size); + +<<<<<<< HEAD <<<<<<< HEAD <<<<<<< HEAD <<<<<<< HEAD @@ -281,9 +334,19 @@ static void start_polling_thread(wiiu_hid_t *hid) { if(!thread || !stack) >>>>>>> Only call HIDSetup/HidTeardown once goto error; - - if(!OSCreateThread(thread, wiiu_hid_polling_thread, 1, (char *)hid, stack, stack_size, priority, attributes)) +======= + if(!thread || !stack) { + RARCH_LOG("[hid]: allocation failed, aborting thread start.\n"); goto error; + } + + RARCH_LOG("[hid]: thread = %x; stack = %x\n", thread, stack); +>>>>>>> Simplify, add logging, revert some of the changes + + if(!OSCreateThread(thread, wiiu_hid_polling_thread, 1, (char *)hid, stack, stack_size, priority, attributes)) { + RARCH_LOG("[hid]: OSCreateThread failed.\n"); + goto error; + } hid->polling_thread = thread; hid->polling_thread_stack = stack; @@ -292,6 +355,7 @@ static void start_polling_thread(wiiu_hid_t *hid) { error: <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD <<<<<<< HEAD if(pad_list_mutex) delete_fastmutex(pad_list_mutex); @@ -305,26 +369,32 @@ static void start_polling_thread(wiiu_hid_t *hid) { >>>>>>> Only call HIDSetup/HidTeardown once if(stack) free(stack); +======= +>>>>>>> Simplify, add logging, revert some of the changes if(thread) free(thread); + if(stack) + free(stack); return; } + static void stop_polling_thread(wiiu_hid_t *hid) { int thread_result = 0; + RARCH_LOG("[hid]: stopping polling thread.\n"); - if(hid == NULL || hid->polling_thread == NULL) + if(!hid || !hid->polling_thread) return; hid->polling_thread_quit = true; OSJoinThread(hid->polling_thread, &thread_result); - free(hid->polling_thread); free(hid->polling_thread_stack); <<<<<<< HEAD <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD ======= >>>>>>> More progress on the HID driver @@ -339,17 +409,18 @@ static void stop_polling_thread(wiiu_hid_t *hid) { >>>>>>> More progress on the HID driver ======= >>>>>>> Only call HIDSetup/HidTeardown once +======= + hid->polling_thread = NULL; + hid->polling_thread_stack = NULL; +>>>>>>> Simplify, add logging, revert some of the changes } -/** - * Entrypoint for the polling thread. - */ -static int wiiu_hid_polling_thread(int argc, const char **argv) { - wiiu_hid_t *hid = (wiiu_hid_t *)argv; - while(!hid->polling_thread_quit) { - wiiu_hid_do_poll(hid); +void log_device(HIDDevice *device) { + if(!device) { + RARCH_LOG("NULL device.\n"); } +<<<<<<< HEAD return 0; } @@ -402,14 +473,35 @@ int32_t wiiu_attach_callback(HIDClient *client, HIDDevice *device, uint32_t atta break; case HID_DEVICE_DETACH: RARCH_LOG("Device detached\n"); +======= + RARCH_LOG(" handle: %d\n", device->handle); + RARCH_LOG(" physical_device_inst: %d\n", device->physical_device_inst); + RARCH_LOG(" vid: 0x%x\n", device->vid); + RARCH_LOG(" pid: 0x%x\n", device->pid); + RARCH_LOG(" interface_index: %d\n", device->interface_index); + RARCH_LOG(" sub_class: %d\n", device->sub_class); + RARCH_LOG(" protocol: %d\n", device->protocol); + RARCH_LOG(" max_packet_size_rx: %d\n", device->max_packet_size_rx); + RARCH_LOG(" max_packet_size_tx: %d\n", device->max_packet_size_tx); +} + +static int32_t wiiu_attach_callback(HIDClient *client, HIDDevice *device, uint32_t attach) { + switch(attach) { + case HID_DEVICE_ATTACH: + RARCH_LOG("USB device attach event\n"); + break; + case HID_DEVICE_DETACH: + RARCH_LOG("USB device detach event\n"); +>>>>>>> Simplify, add logging, revert some of the changes break; default: - // Undefined behavior, bail out break; } + log_device(device); - return result; + return DEVICE_UNUSED; } +<<<<<<< HEAD */ /** * Allocation @@ -421,16 +513,27 @@ wiiu_hid_t *new_hid(void) { memset(hid, 0, sizeof(wiiu_hid_t)); return hid; -} +======= -void delete_hid(wiiu_hid_t *hid) { - if(hid) { - if(hid->polling_thread_stack) - free(hid->polling_thread_stack); - - free(hid); +static int wiiu_hid_polling_thread(int argc, const char **argv) { + wiiu_hid_t *hid = (wiiu_hid_t *)argv; + while(!hid->polling_thread_quit) { + usleep(10000); } + + return 0; } + +static wiiu_hid_t *new_hid(void) { + return alloc_zeroed(2, sizeof(wiiu_hid_t)); +>>>>>>> Simplify, add logging, revert some of the changes +} + +static void delete_hid(wiiu_hid_t *hid) { + if(hid) + free(hid); +} +<<<<<<< HEAD /* HIDClient *new_hidclient(void) { HIDClient *client = memalign(32, sizeof(HIDClient)); @@ -445,6 +548,28 @@ void delete_hidclient(HIDClient *client) { free(client); } */ +======= + +static HIDClient *new_hidclient(void) { + return alloc_zeroed(32, sizeof(HIDClient)); +} + +static void delete_hidclient(HIDClient *client) { + if(client) + free(client); +} + +void *alloc_zeroed(size_t alignment, size_t size) { + void *result = memalign(alignment, size); + if(result) { + memset(result, 0, size); + } + + return result; +} + + +>>>>>>> Simplify, add logging, revert some of the changes hid_driver_t wiiu_hid = { wiiu_hid_init, wiiu_hid_joypad_query, diff --git a/wiiu/net_listen.sh b/wiiu/net_listen.sh index 167be1fa63..ae39b5caa7 100755 --- a/wiiu/net_listen.sh +++ b/wiiu/net_listen.sh @@ -1,14 +1,14 @@ #!/bin/sh -if [ -z $1 ] ; then - echo - echo "usage: $0 " - echo - exit 0 -fi - interrupt_count=0 -trap 'if [ $interrupt_count -eq 20 ]; then exit 0; else interrupt_count=$(($interrupt_count + 1)); fi' INT +trap 'if [ $interrupt_count -eq 5 ]; then exit 0; else interrupt_count=$(($interrupt_count + 1)); fi' INT -while true; do echo; echo ========= `date` =========; echo; netcat -p 4405 -l $1; done +echo ===== START: `date` ===== +while true; do + netcat -p 4405 -l + if [ $? -ne 0 ]; then + break + fi +done +echo ===== END: `date` =====