added set_rate for HID devices; keyboard driver works fine at proper
authorBernhard Urban <lewurm@gmx.net>
Sat, 26 Sep 2009 07:53:23 +0000 (09:53 +0200)
committerBernhard Urban <lewurm@gmx.net>
Sat, 26 Sep 2009 08:06:06 +0000 (10:06 +0200)
rate now, but console output still sucks a bit ;)

main.c
usb/core/core.c
usb/drivers/class/hid.c
usb/drivers/class/hid.h

diff --git a/main.c b/main.c
index 133d998531a4271cbb0e707f33c115b66385adfe..530d9e827ca2be63858d8526bf2e36dc7da1d148 100644 (file)
--- a/main.c
+++ b/main.c
@@ -145,17 +145,33 @@ int main(void)
 #define TABSIZE 4
        /* you are welcome to make this nice :) */
        char str[7];
-       u16 i, j, y=STDOUT_BORDER_TOP, x=STDOUT_BORDER_LEFT;
+       u16 i, j, ret=0, y=STDOUT_BORDER_TOP, x=STDOUT_BORDER_LEFT;
        u16 old_x, old_y;
-       struct kbrep *k;
+       struct kbrep *k, *old=NULL;
 
        while(1) {
                memset(str, '\0', 7);
-               j=0;
                k = usb_hidkb_getChars();
+               j=0;
                old_x = x; /* save actual x and y position for printing after the loop */
                old_y = y;
                for(i=0; k->keys[i]>0; i++) {
+
+                       /* dropping char's if necessary */
+                       if(old) {
+                               for(j=0; j < 6; j++) {
+                                       if(old->keys[j] == k->keys[i]) {
+                                               ret = 1;
+                                               break;
+                                       }
+                               }
+                       }
+                       if(ret) {
+                               ret = 0;
+                               continue;
+                       }
+                       j = 0;
+
                        unsigned char key = usb_hidkb_get_char_from_keycode(k->keys[i],
                                        (k->mod & MOD_lshift) || (k->mod & MOD_rshift));
                        /* no key or key not relevant? next, please. */
@@ -166,9 +182,11 @@ int main(void)
                        if (key == '\n') {
                                x = STDOUT_BORDER_LEFT;
                                y += FONT_HEIGHT;
+                               printf("\n");
                        /* TAB pressed? */
                        } else if (key == '\t') {
                                x += (TABSIZE*FONT_WIDTH);
+                               printf("\t");
 
                        /* BACKSPACE pressed? */
                        } else if (key == '\r') {
@@ -191,12 +209,14 @@ int main(void)
                                y = STDOUT_BORDER_TOP;
                        }
                }
-               free(k);
+               if(old) {
+                       free(old);
+               }
+               old = k;
                if(j > 0) { /* when there was any printable stuff, show it */
                        print_str_noscroll(old_x, old_y, str);
-                       printf("y: %d\n", y);
+                       printf("%s", str);
                }
-
        }
 
 #if 0
index 54cfb9792a34649dc166490337fad1cd16f86210..0b38e77d6c34ec6136a360041ba6d087ceee49f7 100644 (file)
@@ -121,7 +121,7 @@ struct usb_device *usb_add_device(u8 lowspeed, u32 reg)
                return (void*) -1;
        }
 
-//#define WTF
+#define WTF
 #ifdef WTF
        volatile u8 wzf = 11;
        if(0 == wzf) {
index c8c9dfe1e2d10eb3d93a7f54df2a420e7f2c13fe..b79bcd3f85c77db2e25aeef73f13cd4e04483672 100644 (file)
@@ -66,12 +66,21 @@ void usb_hidkb_probe()
                                dev->conf->intf->bInterfaceSubClass == 1 && /* keyboard support boot protocol? */
                                dev->conf->intf->bInterfaceProtocol == 1) { /* keyboard? */
                        hidkb.data = (void*) dev;
+                       usb_hidkb_set_idle(dev, 1);
                }
 
                iterator=iterator->next;
        }
 }
 
+void usb_hidkb_set_idle(struct usb_device *dev, u8 duration) {
+#define SET_IDLE 0x0A
+       u8 buf[8];
+       memset(buf, 0, 8);
+       usb_control_msg(dev, 0x21, SET_IDLE, (duration << 8), 0, 0, buf, 0);
+       hexdump((void*) buf, 8);
+}
+
 void usb_hidkb_check()
 {
 }
@@ -88,16 +97,18 @@ struct kbrep *usb_hidkb_getChars() {
        memset(ret, 0, 8);
        s8 epnum = dev->conf->intf->endp->bEndpointAddress & 0xf;
        (void) usb_interrupt_read(dev, epnum, (u8*) ret, 8, 0);
+#if 0
        printf("============\nusb_interrupt_read:\n");
        hexdump((void*)ret, 8);
-
+#endif
        return ret;
 }
 
 unsigned char usb_hidkb_get_char_from_keycode(u8 keycode, int shifted)
 {
        unsigned char result = 0;
-       if (keycode < 57)
+       if (keycode >= 0x3 && keycode < 57) {
                result = code_translation_table[!!shifted][keycode];
+       }
        return result;
 }
index 85ce3a836398b3c31702b85107c1ac8bb4ae334f..e8218ad9778298a6f248c7d8758e1bc8a6329707 100644 (file)
@@ -35,6 +35,7 @@ u8 usb_hidkb_inuse();
 
 struct kbrep *usb_hidkb_getChars();
 unsigned char usb_hidkb_get_char_from_keycode(u8 keycode, int shifted);
+void usb_hidkb_set_idle(struct usb_device *dev, u8 duration);
 
 #endif /* __HID_H */