port-work; won't compile or even work
[ppcskel.git] / main.c
diff --git a/main.c b/main.c
index 18cc42220e94461b00249626e61743d4e607d6ea..67d6d88c26a3224b997f44b943af21462bb2cac0 100644 (file)
--- a/main.c
+++ b/main.c
@@ -26,6 +26,9 @@ Copyright (C) 2009              John Kelley <wiidev@kelley.ca>
 #include "console.h"
 #include "irq.h"
 #include "usb/core/core.h"
+#include "usb/drivers/class/hid.h"
+#include "sha1.h"
+#include "hollywood.h"
 
 #define MINIMUM_MINI_VERSION 0x00010001
 
@@ -87,7 +90,10 @@ int main(void)
        irq_initialize();
        irq_bw_enable(BW_PI_IRQ_RESET);
        irq_bw_enable(BW_PI_IRQ_HW); //hollywood pic
+       /* external ohci */
        irq_hw_enable(IRQ_OHCI0);
+       /* internal ohci */
+       //irq_hw_enable(IRQ_OHCI1);
 
        ipc_initialize();
        ipc_slowping();
@@ -113,13 +119,116 @@ int main(void)
                        ; // better ideas welcome!
        }
 
-       usb_init();
+       /* external ohci */
+       usb_init(OHCI0_REG_BASE);
+
+       /* internal ohci */
+       //usb_init(OHCI1_REG_BASE);
+
+       /* load HID keyboard driver */
+       usb_hidkb_init();
+
+wait_kb:
+       /* wait for usb keyboard plugged in */
+       if(!usb_hidkb_inuse()) {
+               print_str("plug in an usb keyboard", 23);
+       }
+       while(!usb_hidkb_inuse());
+
+       print_str("hello keyboard :)", 17);
+
+#define FONT_WIDTH  13
+#define FONT_HEIGHT 15
+#define STDOUT_BORDER_LEFT 20
+#define STDOUT_BORDER_RIGHT 650
+#define STDOUT_BORDER_TOP 20
+#define STDOUT_BORDER_BOTTOM 550
+#define TABSIZE 4
+       /* you are welcome to make this nice :) */
+       char str[7];
+       u16 i, j, ret=0, y=STDOUT_BORDER_TOP, x=STDOUT_BORDER_LEFT;
+       u16 old_x, old_y;
+       struct kbrep *k, *old=NULL;
+
+       while(usb_hidkb_inuse()) {
+               memset(str, '\0', 7);
+               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. */
+                       if (key == 0)
+                               continue;
+
+                       /* RETURN pressed? */
+                       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') {
+                               /* TODO */
+
+                       /* now we have only printable characters left */
+                       } else {
+                               x += FONT_WIDTH;
+                               str[j] = key;
+                               j++;
+                       }
+
+                       /* line full? break! */
+                       if(x > (STDOUT_BORDER_RIGHT-FONT_WIDTH)) {
+                               x = STDOUT_BORDER_LEFT;
+                               y += FONT_HEIGHT;
+                       }
+                       /* screen full? start again at top */
+                       if(y > (STDOUT_BORDER_BOTTOM-FONT_HEIGHT)) {
+                               y = STDOUT_BORDER_TOP;
+                       }
+               }
+               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("%s", str);
+               }
+       }
+
+       goto wait_kb;
+
+#if 0
+       printf("===============================\n");
+
+       SHA1TestCases();
 
-       /*
-    print_str_noscroll(112, 112, "ohai, world!\n");
-       testOTP();
        printf("bye, world!\n");
-       */
+#endif
 
        return 0;
 }