diff --git a/SDL/Makefile b/SDL/Makefile index 2ad361e..4699913 100644 --- a/SDL/Makefile +++ b/SDL/Makefile @@ -88,13 +88,13 @@ $(BIN_DIR)/%.dol: $(TEST_OBJ_DIR)/%.elf @echo ---- # Compilation flags. -COMMON_FLAGS := -g -O2 -mrvl -Wall -mcpu=750 -meabi -mhard-float $(MACHDEP) +COMMON_FLAGS := -g -O2 -Wall $(MACHDEP) INCLUDES := -Iinclude -I$(DEVKITPRO)/libogc/include DEFINES := -DGEKKO CFLAGS := $(COMMON_FLAGS) $(INCLUDES) $(DEFINES) # Test link flags. -LDFLAGS := $(COMMON_FLAGS) -L$(LIB_DIR) -L$(DEVKITPRO)/libogc/lib/wii -lSDL -lfat -lwiiuse -lbte -logc -lm +LDFLAGS := $(COMMON_FLAGS) -L$(LIB_DIR) -L$(DEVKITPRO)/libogc/lib/wii -lSDL -lwiikeyboard -lfat -lwiiuse -lbte -logc -lm # How to compile C file (SDL library). $(SDL_OBJ_DIR)/%.o: $(SDL_SRC_DIR)/%.c diff --git a/SDL/src/main/wii/SDL_wii_main.c b/SDL/src/main/wii/SDL_wii_main.c index 5433614..6d5dd21 100644 --- a/SDL/src/main/wii/SDL_wii_main.c +++ b/SDL/src/main/wii/SDL_wii_main.c @@ -11,9 +11,8 @@ /* OGC includes */ #include #include - -extern void wii_keyboard_init(); -extern void wii_mouse_init(); +#include +#include bool TerminateRequested=false, ShutdownRequested=false, ResetRequested=false; @@ -66,9 +65,8 @@ int main(int argc, char *argv[]) WPAD_SetDataFormat(0, WPAD_FMT_BTNS_ACC_IR); WPAD_SetVRes(0, 640, 480); - USB_Initialize(); - wii_mouse_init(); //must be called first - wii_keyboard_init(); + MOUSE_Init(); + KEYBOARD_Init(); #endif /* Call the user's main function */ return(SDL_main(argc, argv)); diff --git a/SDL/src/video/wii/SDL_wiievents.c b/SDL/src/video/wii/SDL_wiievents.c index 067c050..4ce1141 100644 --- a/SDL/src/video/wii/SDL_wiievents.c +++ b/SDL/src/video/wii/SDL_wiievents.c @@ -27,6 +27,8 @@ #include #include #include +#include +#include #include "SDL_wiivideo.h" #include "SDL_wiievents_c.h" @@ -39,496 +41,13 @@ Uint8 lastButtonStateB = SDL_RELEASED; Uint8 lastButtonStateLeftMouse = SDL_RELEASED; Uint8 lastButtonStateRightMouse = SDL_RELEASED; -#define USB_CLASS_HID 0x03 -#define USB_SUBCLASS_BOOT 0x01 -#define USB_PROTOCOL_KEYBOARD 0x01 -#define USB_PROTOCOL_MOUSE 0x02 - static SDLKey keymap[512]; static s32 stat; static s32 mstat; -typedef struct -{ - u32 message; - u32 id; // direction - u8 modifiers; - u8 unknown; - u8 keys[6]; - u8 pad[16]; -} key_data_t; - - -static key_data_t key_data ATTRIBUTE_ALIGN(32); - -static u8 prev_keys[6]; -static u8 prev_modifiers; - -static key_data_t key_data1,key_data2; - -static int keyboard_kb=-1; - -static int keyboard_stop = 1; - -typedef enum -{ - KEYBOARD_PRESSED = 0, - KEYBOARD_RELEASED, - KEYBOARD_DISCONNECTED, - KEYBOARD_CONNECTED -}keyboard_eventType; - - -typedef struct _KeyboardEvent{ - int type; - int modifiers; /* actually, could as well scrap this. */ - int scancode; -} keyboardEvent; - -typedef struct _MouseEvent{ - u8 button; - int rx; - int ry; -} mouseEvent; - - - -static keyboardEvent ke; -static mouseEvent me; - -typedef struct _node -{ - lwp_node node; - keyboardEvent event; -}node; - -typedef struct _mousenode -{ - lwp_node mousenode; - mouseEvent event; -}mousenode; - - -lwp_queue *queue; -lwp_queue *mousequeue; - - -static int mouse_initialized =0; - -static int mouse_vid = 0; -static int mouse_pid = 0; -static s32 mousefd=0; -static signed char *mousedata = 0; -#define DEVLIST_MAXSIZE 0x08 - -//Add an event to the event queue -s32 KEYBOARD_addEvent(int type, int scancode, int modifiers) -{ - node *n = (node *)malloc(sizeof(node)); - n->event.type = type; - n->event.scancode = scancode; - n->event.modifiers= modifiers; - __lwp_queue_append(queue,(lwp_node*)n); - return 1; -} - -//Add an event to the event queue -s32 MOUSE_addEvent(u8 button, int rx, int ry) -{ - mousenode *n = (mousenode *)malloc(sizeof(mousenode)); - n->event.button = button; - n->event.rx = rx; - n->event.ry= ry; - __lwp_queue_append(mousequeue,(lwp_node*)n); - return 1; -} - -//Get the first event of the event queue -s32 KEYBOARD_getEvent(keyboardEvent* event) -{ - node *n = (node*) __lwp_queue_get(queue); - if (!n) - return 0; - *event = n->event; - return 1; -} - - -//Get the first event of the event queue -s32 MOUSE_getEvent(mouseEvent* event) -{ - mousenode *n = (mousenode*) __lwp_queue_get(mousequeue); - if (!n) - return 0; - *event = n->event; - return 1; -} - -/* index = bit# from the Wii. value = SDL keycode. */ -static int modifier_keycodes[] = { SDLK_LCTRL, SDLK_LSHIFT, SDLK_LALT, SDLK_LMETA, SDLK_RCTRL, SDLK_RSHIFT, SDLK_RALT, SDLK_RMETA }; - -s32 keyboard_callback(int ret,void * none) -{ - int i, j; - SDLKey key; - - if (keyboard_kb >= 0) - { - if (key_data.message != 0x7fffffff) - { - if (key_data.message == 2) - { - for (i = 0; i < 6; i++) - { - if (key_data.keys[i]) - { - int found = false; - for (j = 0; j < 6; j++) - { - if (prev_keys[j] == key_data.keys[i]) - { - found = true; - break; - } - } - if (!found) - KEYBOARD_addEvent(KEYBOARD_PRESSED, - keymap[key_data.keys[i]], - key_data.modifiers); - } - } - - for (i = 0; i < 6; i++) - { - if (prev_keys[i]) - { - int found = false; - for (j = 0; j < 6; j++) - { - if (prev_keys[i] == key_data.keys[j]) - { - found = true; - break; - } - } - if (!found) - KEYBOARD_addEvent(KEYBOARD_RELEASED, - keymap[prev_keys[i]], key_data.modifiers); - } - } - - if (prev_modifiers != key_data.modifiers) - { - for (i = 0; i < sizeof(modifier_keycodes) - / sizeof(modifier_keycodes[0]); ++i) - { - key = modifier_keycodes[i]; - j = 1 << i; /* bit mask for bit# i */ - - if ((key_data.modifiers & j) != 0 && (prev_modifiers - & j) == 0) - { /* newly pressed. */ - KEYBOARD_addEvent(KEYBOARD_PRESSED, key, 0); - } - else if ((key_data.modifiers & j) == 0 - && (prev_modifiers & j) != 0) - { /* newly released. */ - KEYBOARD_addEvent(KEYBOARD_RELEASED, key, 0); - } - else - { - /* unchanged. */ - } - } - } - - memcpy(prev_keys, key_data.keys, 6); - prev_modifiers = key_data.modifiers; - } - - key_data.message = 0x7fffffff; - if (!keyboard_stop) - IOS_IoctlAsync(keyboard_kb, 1, (void *) &key_data, 16, - (void *) &key_data, 16, keyboard_callback, NULL); - } - } - - return 0; -} - -void initkeymap() -{ - int i; - - - for ( i=0; i=0) { - printf("keyboard kb ok\n"); - } else{ - printf("keyboard kb not ok\n"); - }*/ - sleep(2); - key_data.message = 0x0; - key_data1.id = 0; - key_data2.id = 0; - keyboard_stop = 0; - if (keyboard_kb >= 0) - IOS_IoctlAsync(keyboard_kb, 1, (void *) &key_data, 16, - (void *) &key_data, 16, keyboard_callback, NULL); - keyboard_initialized = 1; - } - else - { - if (keyboard_kb >= 0) - IOS_IoctlAsync(keyboard_kb, 1, (void *) &key_data, 16, - (void *) &key_data, 16, keyboard_callback, NULL); - } -} - -#define USB_REQ_GETPROTOCOL 0x03 -#define USB_REQ_SETPROTOCOL 0x0B -#define USB_REQ_GETREPORT 0x01 -#define USB_REQ_SETREPORT 0x09 -#define USB_REPTYPE_INPUT 0x01 -#define USB_REPTYPE_OUTPUT 0x02 -#define USB_REPTYPE_FEATURE 0x03 - -#define USB_REQTYPE_GET 0xA1 -#define USB_REQTYPE_SET 0x21 - - -s32 mousecallback(s32 result,void *usrdata) -{ - if (result>0) { - u8 button = mousedata[0]; - - int x = mousedata[1]; - int y = mousedata[2]; - //int w = (-1)<<(data[3]-1); - - MOUSE_addEvent(button, x, y); - - USB_ReadIntrMsgAsync(mousefd, 0x81 ,4, mousedata, mousecallback, 0); - } else { - mouse_initialized = 0; - mousefd =0; - } - return 0; -} - -u8 mouseconfiguration; -u32 mouseinterface; -u32 mousealtInterface; - -static int wii_find_mouse() -{ - s32 fd = 0; - static u8 *buffer = 0; - - if (!buffer) - { - buffer = (u8*) memalign(32, DEVLIST_MAXSIZE << 3); - } - if (buffer == NULL) - { - return -1; - } - memset(buffer, 0, DEVLIST_MAXSIZE << 3); - - u8 dummy; - u16 vid, pid; - - if (USB_GetDeviceList("/dev/usb/oh0", buffer, DEVLIST_MAXSIZE, 0, &dummy) - < 0) - { - - free(buffer); - buffer = 0; - return -2; - } - - u8 mouseep; - u32 mouseep_size; - - int i; - - for (i = 0; i < DEVLIST_MAXSIZE; i++) - { - memcpy(&vid, (buffer + (i << 3) + 4), 2); - memcpy(&pid, (buffer + (i << 3) + 6), 2); - - if ((vid == 0) && (pid == 0)) - continue; - fd = 0; - - int err = USB_OpenDevice("oh0", vid, pid, &fd); - if (err < 0) - { - continue; - } - else - { - //fprintf(stderr, "ok open %04x:%04x\n", vid, pid); - //SDL_Delay(1000); - - } - - u32 iConf, iInterface; - usb_devdesc udd; - usb_configurationdesc *ucd; - usb_interfacedesc *uid; - usb_endpointdesc *ued; - - USB_GetDescriptors(fd, &udd); - - for (iConf = 0; iConf < udd.bNumConfigurations; iConf++) - { - ucd = &udd.configurations[iConf]; - for (iInterface = 0; iInterface < ucd->bNumInterfaces; iInterface++) - { - uid = &ucd->interfaces[iInterface]; - - if ((uid->bInterfaceClass == USB_CLASS_HID) - && (uid->bInterfaceSubClass == USB_SUBCLASS_BOOT) - && (uid->bInterfaceProtocol == USB_PROTOCOL_MOUSE)) - { - int iEp; - for (iEp = 0; iEp < uid->bNumEndpoints; iEp++) - { - ued = &uid->endpoints[iEp]; - mouse_vid = vid; - mouse_pid = pid; - - mouseep = ued->bEndpointAddress; - mouseep_size = ued->wMaxPacketSize; - mouseconfiguration = ucd->bConfigurationValue; - mouseinterface = uid->bInterfaceNumber; - mousealtInterface = uid->bAlternateSetting; - - } - break; - } - - } - } - USB_FreeDescriptors(&udd); - USB_CloseDevice(&fd); - - } - if (mouse_pid != 0 || mouse_vid != 0) - return 0; - return -1; - -} - -void wii_mouse_init() -{ - if (!mouse_initialized) - { - - if (!mousequeue) - { - mousequeue = (lwp_queue*) malloc(sizeof(lwp_queue)); - __lwp_queue_initialize(mousequeue, 0, 0, 0); - } - - if (wii_find_mouse() != 0) - return; - - if (USB_OpenDevice("oh0", mouse_vid, mouse_pid, &mousefd) < 0) - { - return; - } - if (!mousedata) - { - mousedata = (signed char*) memalign(32, 20); - } - - //set boot protocol - USB_WriteCtrlMsg(mousefd, USB_REQTYPE_SET, USB_REQ_SETPROTOCOL, 0, 0, - 0, 0); - USB_ReadIntrMsgAsync(mousefd, 0x81, 4, mousedata, mousecallback, 0); - - mouse_initialized = 1; - } -} +static keyboard_event ke; +static mouse_event me; static int posted; @@ -542,8 +61,8 @@ void PumpEvents() #endif WPADData *wd = WPAD_Data(0); - stat = KEYBOARD_getEvent(&ke); - mstat = MOUSE_getEvent(&me); + stat = KEYBOARD_GetEvent(&ke); + mstat = MOUSE_GetEvent(&me); int x, y; SDL_GetMouseState(&x, &y); @@ -589,13 +108,8 @@ void PumpEvents() memset(&keysym, 0, sizeof(keysym)); Uint8 keystate = (ke.type == KEYBOARD_PRESSED) ? SDL_PRESSED : SDL_RELEASED; - keysym.sym = ke.scancode; + keysym.sym = keymap[ke.keycode]; keysym.mod = 0; - /* to_SDL_Modifiers(ke.modifiers); don't waste effort, - SDL_PrivateKeyboard makes its own mind up about - them from the press/release events of the modifier - keys. */ - /*don't do this either. SDL_SetModState(to_SDL_Modifiers(ke.modifiers));*/ posted += SDL_PrivateKeyboard(keystate, &keysym); } @@ -634,7 +148,6 @@ void PumpEvents() posted += SDL_PrivateMouseButton(SDL_RELEASED, 3, 0, 0); } } - } } @@ -650,5 +163,72 @@ void WII_PumpEvents(_THIS) void WII_InitOSKeymap(_THIS) { + int i; + for (i = 0; i < SDL_arraysize(keymap); ++i) + keymap[i] = SDLK_UNKNOWN; + + //a-z + for (i = 0; i < 27; i++) + keymap[4 + i] = SDLK_a + i; + + //numbers + for (i = 0; i < 10; i++) + keymap[30 + i] = SDLK_1 + i; + + keymap[40] = SDLK_RETURN; + keymap[41] = SDLK_ESCAPE; + keymap[42] = SDLK_BACKSPACE; + keymap[43] = SDLK_TAB; + keymap[44] = SDLK_SPACE; + keymap[45] = SDLK_MINUS; + keymap[46] = SDLK_EQUALS; + keymap[47] = SDLK_LEFTBRACKET; + keymap[47] = SDLK_RIGHTBRACKET; + keymap[49] = SDLK_BACKSLASH; + keymap[51] = SDLK_SEMICOLON; + keymap[52] = SDLK_QUOTE; + keymap[53] = SDLK_BACKQUOTE; + keymap[54] = SDLK_COMMA; + keymap[55] = SDLK_PERIOD; + keymap[56] = SDLK_SLASH; + keymap[57] = SDLK_CAPSLOCK; + + //F1 to F12 + for (i = 0; i < 12; i++) + keymap[58 + i] = SDLK_F1 + i; + + keymap[72] = SDLK_PAUSE; + keymap[73] = SDLK_INSERT; + keymap[74] = SDLK_HOME; + keymap[75] = SDLK_PAGEUP; + keymap[76] = SDLK_DELETE; + keymap[77] = SDLK_END; + keymap[78] = SDLK_PAGEDOWN; + + keymap[79] = SDLK_RIGHT; + keymap[80] = SDLK_LEFT; + keymap[81] = SDLK_DOWN; + keymap[82] = SDLK_UP; + keymap[83] = SDLK_NUMLOCK; + + keymap[84] = SDLK_KP_DIVIDE; + keymap[85] = SDLK_KP_MULTIPLY; + keymap[86] = SDLK_KP_MINUS; + keymap[87] = SDLK_KP_PLUS; + + keymap[88] = SDLK_KP_ENTER; + + //keypad numbers + for (i = 0; i < 10; i++) + keymap[89 + i] = SDLK_KP1 + i; + + keymap[224] = SDLK_LCTRL; + keymap[225] = SDLK_LSHIFT; + keymap[226] = SDLK_LALT; + keymap[227] = SDLK_LMETA; + keymap[228] = SDLK_RCTRL; + keymap[229] = SDLK_RSHIFT; + keymap[230] = SDLK_RALT; + keymap[231] = SDLK_RMETA; }