From 2dff512f69bd8c211c37487e594a34677b7ea169 Mon Sep 17 00:00:00 2001 From: Bernhard Urban Date: Wed, 23 Sep 2009 15:39:31 +0200 Subject: [PATCH] added hidkb driver and a simple example --- main.c | 44 +++++++- usb/Makefile | 3 +- usb/core/core.c | 209 +++++++++++++++++++++++++----------- usb/core/core.h | 2 +- usb/core/usb.c | 1 - usb/drivers/class/hid.c | 59 ++++++++++ usb/drivers/class/hid.h | 26 +++++ usb/drivers/class/storage.c | 20 ---- usb/usbspec/usb11spec.h | 1 + 9 files changed, 271 insertions(+), 94 deletions(-) create mode 100644 usb/drivers/class/hid.c create mode 100644 usb/drivers/class/hid.h diff --git a/main.c b/main.c index e2a51e9..dcc2f19 100644 --- a/main.c +++ b/main.c @@ -26,6 +26,7 @@ Copyright (C) 2009 John Kelley #include "console.h" #include "irq.h" #include "usb/core/core.h" +#include "usb/drivers/class/hid.h" #include "hollywood.h" #define MINIMUM_MINI_VERSION 0x00010001 @@ -119,14 +120,47 @@ int main(void) /* external ohci */ usb_init(OHCI0_REG_BASE); + /* internal ohci */ //usb_init(OHCI1_REG_BASE); - /* - print_str_noscroll(112, 112, "ohai, world!\n"); - testOTP(); - printf("bye, world!\n"); - */ + /* load HID keyboard driver */ + usb_hidkb_init(); + + /* you are welcome to make this nice :) */ + char str[7]; + u16 i, j, y=20, x=20; + struct kbrep *k; + + while(1) { + memset(str, '\0', 8); + j=0; + k = usb_hidkb_getChars(); + for(i=0; k->keys[i]>0; i++) { + if(x>650) { + x = 20; + y += 15; + } + if(y>440) { + y=20; + } + if((k->keys[i] >= 4) && k->keys[i] <= 4+'z'-'a') { + str[j] = k->keys[i] - 4 + 'a'; + } + else if (k->keys[i] == 0x28) { + y += 15; + x = 20; + } + j++; + } + if(j > 0) { + print_str_noscroll(x, y, str); + printf("y: %d\n", y); + } + while(j--) { + x += 13; + } + } return 0; } diff --git a/usb/Makefile b/usb/Makefile index ddd11fb..37803e1 100644 --- a/usb/Makefile +++ b/usb/Makefile @@ -12,5 +12,4 @@ CFLAGS += -D _DU_USB #@ u/c/usb.c OBJS += usb/host/ohci.o usb/core/core.o usb/core/usb.o \ usb/lib/list.o usb/usbspec/request.o \ - usb/drivers/class/hub.o \ - usb/drivers/class/storage.o + usb/drivers/class/hid.o diff --git a/usb/core/core.c b/usb/core/core.c index 5535bb3..e2643c9 100644 --- a/usb/core/core.c +++ b/usb/core/core.c @@ -114,13 +114,154 @@ struct usb_device *usb_add_device(u8 lowspeed, u32 reg) #define WTF #ifdef WTF - printf("lololol PADDING WTF :O lolololololo \n"); + printf("lololololool PADDING WTF :O lolololololo \n"); + printf("lolololool PADDING WTF :O lololoololo \n"); + printf("lololololool PADDING WTF :O lolololololo \n"); + printf("lololololool PADDING WTF :O lolololololo \n"); + printf("lololololool PADDING WTF :O lolololololo \n"); + printf("lololololool PADDING WTF :O lolololololo \n"); + printf("lololololool PADDING WTF :O lolololololo \n"); + printf("lololololool PADDING WTF :O lolololololo \n"); + printf("lololololool PADDING WTF :O lolololololo \n"); + printf("lolololool PADDING WTF :O lololoololo \n"); + printf("lololololool PADDING WTF :O lolololololo \n"); + printf("lololololool PADDING WTF :O lolololololo \n"); + printf("lolololool PADDING WTF :O lololoololo \n"); + printf("lololololool PADDING WTF :O lolololololo \n"); + printf("lololololool PADDING WTF :O lolololololo \n"); + printf("lolololool PADDING WTF :O lololoololo \n"); + printf("lololololool PADDING WTF :O lolololololo \n"); + printf("lololololool PADDING WTF :O lolololololo \n"); + printf("lolololool PADDING WTF :O lololoololo \n"); + printf("lololololool PADDING WTF :O lolololololo \n"); + printf("lolololool PADDING WTF :O lolololololo \n"); + printf("lololololool PADDING WTF :O lolololololo \n"); + printf("lollllool PADDING WTF :O lolololololo \n"); + printf("lololololool PADDING WTF :O lolololololo \n"); + printf("lolololool PADDING WTF :O lololoololo \n"); + printf("lololololool PADDING WTF :O lolololololo \n"); + printf("lolololool PADDING WTF :O lolololololo \n"); + printf("lololololool PADDING WTF :O lolololololo \n"); + printf("lolololool PADDING WTF :O lolololololo \n"); + printf("lololololool PADDING WTF :O lolololololo \n"); + printf("lollllool PADDING WTF :O lolololololo \n"); + printf("lololololool PADDING WTF :O lolololololo \n"); + printf("lolololool PADDING WTF :O lololoololo \n"); + printf("lololololool PADDING WTF :O lolololololo \n"); + printf("lolololool PADDING WTF :O lolololololo \n"); + printf("lololololool PADDING WTF :O lolololololo \n"); + printf("lolololool PADDING WTF :O lololoololo \n"); + printf("lololololool PADDING WTF :O lolololololo \n"); + printf("lolololool PADDING WTF :O lolololololo \n"); + printf("lololololool PADDING WTF :O lolololololo \n"); + printf("lollllool PADDING WTF :O lolololololo \n"); + printf("lololololool PADDING WTF :O lolololololo \n"); + printf("lolololool PADDING WTF :O lololoololo \n"); + printf("lololololool PADDING WTF :O lolololololo \n"); + printf("lolololool PADDING WTF :O lolololololo \n"); + printf("lololololool PADDING WTF :O lolololololo \n"); + printf("lololololool PADDING WTF :O lolololololo \n"); + printf("lolololool PADDING WTF :O lolololololo \n"); + printf("lololololool PADDING WTF :O lolololololo \n"); + printf("lollllool PADDING WTF :O lolololololo \n"); + printf("lololololool PADDING WTF :O lolololololo \n"); + printf("lolololool PADDING WTF :O lololoololo \n"); + printf("lololololool PADDING WTF :O lolololololo \n"); + printf("lolololool PADDING WTF :O lolololololo \n"); + printf("lololololool PADDING WTF :O lolololololo \n"); + printf("lolololool PADDING WTF :O lolololololo \n"); + printf("lololololool PADDING WTF :O lolololololo \n"); + printf("lollllool PADDING WTF :O lolololololo \n"); + printf("lololololool PADDING WTF :O lolololololo \n"); + printf("lolololool PADDING WTF :O lololoololo \n"); + printf("lololololool PADDING WTF :O lolololololo \n"); + printf("lolololool PADDING WTF :O lolololololo \n"); + printf("lololololool PADDING WTF :O lolololololo \n"); + printf("lolololool PADDING WTF :O lololoololo \n"); + printf("lololololool PADDING WTF :O lolololololo \n"); + printf("lolololool PADDING WTF :O lolololololo \n"); + printf("lololololool PADDING WTF :O lolololololo \n"); + printf("lollllool PADDING WTF :O lolololololo \n"); + printf("lololololool PADDING WTF :O lolololololo \n"); + printf("lolololool PADDING WTF :O lololoololo \n"); + printf("lololololool PADDING WTF :O lolololololo \n"); + printf("lolololool PADDING WTF :O lolololololo \n"); printf("lololololool PADDING WTF :O lolololololo \n"); printf("lolololool PADDING WTF :O lololoololo \n"); printf("lololololool PADDING WTF :O lolololololo \n"); printf("lolololool PADDING WTF :O lolololololo \n"); printf("lololololool PADDING WTF :O lolololololo \n"); printf("lollllool PADDING WTF :O lolololololo \n"); + printf("lololololool PADDING WTF :O lolololololo \n"); + printf("lolololool PADDING WTF :O lololoololo \n"); + printf("lololololool PADDING WTF :O lolololololo \n"); + printf("lolololool PADDING WTF :O lolololololo \n"); + printf("lololololool PADDING WTF :O lolololololo \n"); + printf("lolololool PADDING WTF :O lololoololo \n"); + printf("lololololool PADDING WTF :O lolololololo \n"); + printf("lolololool PADDING WTF :O lolololololo \n"); + printf("lololololool PADDING WTF :O lolololololo \n"); + printf("lollllool PADDING WTF :O lolololololo \n"); + printf("lololololool PADDING WTF :O lolololololo \n"); + printf("lolololool PADDING WTF :O lololoololo \n"); + printf("lololololool PADDING WTF :O lolololololo \n"); + printf("lolololool PADDING WTF :O lolololololo \n"); + printf("lololololool PADDING WTF :O lolololololo \n"); + printf("lolololool PADDING WTF :O lololoololo \n"); + printf("lololololool PADDING WTF :O lolololololo \n"); + printf("lolololool PADDING WTF :O lolololololo \n"); + printf("lololololool PADDING WTF :O lolololololo \n"); + printf("lollllool PADDING WTF :O lolololololo \n"); + printf("lololololool PADDING WTF :O lolololololo \n"); + printf("lolololool PADDING WTF :O lololoololo \n"); + printf("lololololool PADDING WTF :O lolololololo \n"); + printf("lolololool PADDING WTF :O lolololololo \n"); + printf("lololololool PADDING WTF :O lolololololo \n"); + printf("lolololool PADDING WTF :O lololoololo \n"); + printf("lololololool PADDING WTF :O lolololololo \n"); + printf("lolololool PADDING WTF :O lolololololo \n"); + printf("lololololool PADDING WTF :O lolololololo \n"); + printf("lollllool PADDING WTF :O lolololololo \n"); + printf("lololololool PADDING WTF :O lolololololo \n"); + printf("lolololool PADDING WTF :O lololoololo \n"); + printf("lololololool PADDING WTF :O lolololololo \n"); + printf("lolololool PADDING WTF :O lolololololo \n"); + printf("lololololool PADDING WTF :O lolololololo \n"); + printf("lolololool PADDING WTF :O lololoololo \n"); + printf("lololololool PADDING WTF :O lolololololo \n"); + printf("lolololool PADDING WTF :O lolololololo \n"); + printf("lololololool PADDING WTF :O lolololololo \n"); + printf("lollllool PADDING WTF :O lolololololo \n"); + printf("lololololool PADDING WTF :O lolololololo \n"); + printf("lolololool PADDING WTF :O lololoololo \n"); + printf("lololololool PADDING WTF :O lolololololo \n"); + printf("lolololool PADDING WTF :O lolololololo \n"); + printf("lololololool PADDING WTF :O lolololololo \n"); + printf("lololololool PADDING WTF :O lolololololo \n"); + printf("lolololool PADDING WTF :O lolololololo \n"); + printf("lololololool PADDING WTF :O lolololololo \n"); + printf("lollllool PADDING WTF :O lolololololo \n"); + printf("lololololool PADDING WTF :O lolololololo \n"); + printf("lolololool PADDING WTF :O lololoololo \n"); + printf("lololololool PADDING WTF :O lolololololo \n"); + printf("lolololool PADDING WTF :O lolololololo \n"); + printf("lololololool PADDING WTF :O lolololololo \n"); + printf("lollllool PADDING WTF :O lolololololo \n"); + printf("lololololool PADDING WTF :O lolololololo \n"); + printf("lolololool PADDING WTF :O lololoololo \n"); + printf("lololololool PADDING WTF :O lolololololo \n"); + printf("lolololool PADDING WTF :O lolololololo \n"); + printf("lololololool PADDING WTF :O lolololololo \n"); + printf("lollllool PADDING WTF :O lolololololo \n"); + printf("lololololool PADDING WTF :O lolololololo \n"); + printf("lolololool PADDING WTF :O lololoololo \n"); + printf("lololololool PADDING WTF :O lolololololo \n"); + printf("lolololool PADDING WTF :O lolololololo \n"); + printf("lololololool PADDING WTF :O lolololololo \n"); + printf("lollllool PADDING WTF :O lolololololo \n"); + printf("lolololool PADDING WTF :O lolololololo \n"); + printf("lololololool PADDING WTF :O lolololololo \n"); + printf("lollllool PADDING WTF :O lolololololo \n"); #endif u8 address = usb_next_address(); ret = usb_set_address(dev, address); @@ -135,71 +276,10 @@ struct usb_device *usb_add_device(u8 lowspeed, u32 reg) /* print device info */ //lsusb(dev); - //HID only! -#define GET_PROTOCOL 0x03 -#define SET_PROTOCOL 0x0b -#define GETit 0xa1 -#define SETit 0x21 - - - u8 buf[255]; -#if 1 - /* select configuration */ - wait_ms(500); - ret = usb_set_configuration(dev, 1); - printf("=============\nusb_set_configuration(ret: %d): %d\n", ret, dev->conf->bConfigurationValue); - wait_ms(500); -#if 0 - wait_ms(500); - printf("=============\nusb_get_configuration: %d (should be 1 here)\n", usb_get_configuration(dev)); -#endif -#endif #if 1 - memset(buf, 0, 0xff); - usb_control_msg(dev, (1<<5)|1, SET_CONFIGURATION, 0x200, 0x0, 0x0, buf, 0); - printf("wtf request\n"); - hexdump((void*)buf, 0x8); -#endif - - -#if 0 - /* set protocol */ - /* see p48 in HID spec */ - memset(buf, 0, 8); - usb_control_msg(dev, SETit, SET_PROTOCOL, 0 /*boot protocol*/, 0 /*interface number*/, 0 /*length*/, buf, 0); - printf("=============\nhid_set_protocol %d\n", 0); - hexdump((void*)buf, 8); -#endif -#if 0 - memset(buf, 0, 8); - usb_control_msg(dev, GETit, GET_PROTOCOL, 0, 0, 4, buf, 0); - printf("=============\nusb_get_protocol: %d\n", buf[0]); - hexdump((void*)buf, 8); -#endif - -#if 1 - /* I just don't know why on some devices - * {s,g}et_{configuration,interface} won't work. - * may the setter works and getter are poorly implemented? - * however, I try here some interrupt inputs, assuming - * the setters are fine*/ - - memset(buf, 0, 8); - s8 epnum = dev->conf->intf->endp->bEndpointAddress & 0xf; - printf("epnum: 0x%04X\n", epnum); - u8 muh = 10; - while(muh--) { - (void) usb_interrupt_read(dev, epnum, buf, 8, 0); - printf("============\nusb_interrupt_read:\n"); - hexdump((void*)buf, 8); - udelay(2000000); - } -#endif - -#if 0 /* add device to device list */ - element *tmp = (element *) malloc(sizeof(element)); + struct element *tmp = (struct element *) malloc(sizeof(struct element)); tmp->data = (void *) dev; list_add_tail(core.devices, tmp); @@ -289,7 +369,7 @@ u8 usb_remove_device(struct usb_device * dev) /** * Register new driver at usb stack. */ -u8 usb_register_driver(struct usb_driver * dev) +u8 usb_register_driver(struct usb_driver *dev) { /* add driver to driver list */ struct element *tmp = (struct element *) malloc(sizeof(struct element)); @@ -297,7 +377,6 @@ u8 usb_register_driver(struct usb_driver * dev) tmp->next = NULL; list_add_tail(core.drivers, tmp); - /** * first check to find a suitable device * (root hub drivers need this call here) diff --git a/usb/core/core.h b/usb/core/core.h index 64bddf4..a0be403 100644 --- a/usb/core/core.h +++ b/usb/core/core.h @@ -135,7 +135,7 @@ struct usb_driver { char* name; void (*probe)(void); void (*check)(void); - void * data; + void *data; struct usb_driver *next; }; diff --git a/usb/core/usb.c b/usb/core/usb.c index 0a0cd7e..5c191e7 100644 --- a/usb/core/usb.c +++ b/usb/core/usb.c @@ -397,7 +397,6 @@ s8 usb_interrupt_read(struct usb_device *dev, u8 ep, u8 *buf, u8 size, u8 timeou irp->len = size; irp->timeout = timeout; - printf("interupt_read\n"); usb_submit_irp(irp); free(irp); diff --git a/usb/drivers/class/hid.c b/usb/drivers/class/hid.c new file mode 100644 index 0000000..9101c08 --- /dev/null +++ b/usb/drivers/class/hid.c @@ -0,0 +1,59 @@ +#include "../../core/core.h" +#include "../../core/usb.h" +#include "../../usbspec/usb11spec.h" +#include "../../../malloc.h" +#include "../../../string.h" + +#include "hid.h" + +struct usb_driver hidkb = { + .name = "hidkb", + .probe = usb_hidkb_probe, + .check = usb_hidkb_check, + .data = NULL +}; + +void usb_hidkb_init() +{ + usb_register_driver(&hidkb); +} + + +void usb_hidkb_probe() +{ + struct usb_device *dev; + struct element *iterator = core.devices->head; + + while(iterator != NULL) { + dev = (struct usb_device*)iterator->data; + + if(dev->conf->intf->bInterfaceClass == HID_CLASSCODE && + dev->conf->intf->bInterfaceSubClass == 1 && /* keyboard support boot protocol? */ + dev->conf->intf->bInterfaceProtocol == 1) { /* keyboard? */ + + + hidkb.data = (void*) dev; + } + + iterator=iterator->next; + } +} + + +void usb_hidkb_check() +{ +} + +struct kbrep *usb_hidkb_getChars() { + struct usb_device *dev = (struct usb_device*) hidkb.data; + struct kbrep *ret = (struct kbrep*) malloc(sizeof(struct kbrep)); + + memset(ret, 0, 8); + s8 epnum = dev->conf->intf->endp->bEndpointAddress & 0xf; + (void) usb_interrupt_read(dev, epnum, (u8*) ret, 8, 0); + printf("============\nusb_interrupt_read:\n"); + hexdump((void*)ret, 8); + + return ret; +} + diff --git a/usb/drivers/class/hid.h b/usb/drivers/class/hid.h new file mode 100644 index 0000000..4ddf458 --- /dev/null +++ b/usb/drivers/class/hid.h @@ -0,0 +1,26 @@ +#ifndef __HID_H +#define __HID_H + +#define MOD_lctrl (1<<0) +#define MOD_lshift (1<<1) +#define MOD_lalt (1<<2) +#define MOD_lwin (1<<3) +#define MOD_rctrl (1<<4) +#define MOD_rshift (1<<5) +#define MOD_ralt (1<<6) +#define MOD_rwin (1<<7) + +struct kbrep { + u8 mod; + u8 reserved; + u8 keys[6]; +}; + +void usb_hidkb_probe(); +void usb_hidkb_check(); +void usb_hidkb_init(); + +struct kbrep *usb_hidkb_getChars(); + +#endif /* __HID_H */ + diff --git a/usb/drivers/class/storage.c b/usb/drivers/class/storage.c index 116288d..e0e84fd 100644 --- a/usb/drivers/class/storage.c +++ b/usb/drivers/class/storage.c @@ -119,26 +119,6 @@ void usb_storage_check() -/** - * open connection to an storage device - */ -u8 usb_storage_open(u8 device) -{ - /* set configuration */ - u8 tmp[8]; - usb_control_msg(massstorage[device], 0x00,SET_CONFIGURATION,0x0100, 0, 0, tmp, 0); - - - /* class request */ - usb_control_msg(massstorage[device], 0xA1,0xFE,0, 0, 1,tmp, 0); - - /* wait until the stick is complete ready */ - wait_ms(10); - - //FIXME and all other return values!!! - return 1; -} - u8 usb_storage_inquiry(u8 device) { /* send cwb "usbc" */ diff --git a/usb/usbspec/usb11spec.h b/usb/usbspec/usb11spec.h index 7958fb3..ba36df9 100644 --- a/usb/usbspec/usb11spec.h +++ b/usb/usbspec/usb11spec.h @@ -183,6 +183,7 @@ struct usb_device_request_t #define USB_PID_PRE 0x0C +#define HID_CLASSCODE 0x03 #define MASS_STORAGE_CLASSCODE 0x08 #define HUB_CLASSCODE 0x09 -- 2.25.1