|
@@ -471,59 +471,72 @@ static int usb_kbd_probe(struct usb_device *dev, unsigned int ifnum)
|
|
|
return 1;
|
|
|
}
|
|
|
|
|
|
+static int probe_usb_keyboard(struct usb_device *dev)
|
|
|
+{
|
|
|
+ char *stdinname;
|
|
|
+ struct stdio_dev usb_kbd_dev;
|
|
|
+ int error;
|
|
|
+
|
|
|
+ /* Try probing the keyboard */
|
|
|
+ if (usb_kbd_probe(dev, 0) != 1)
|
|
|
+ return -ENOENT;
|
|
|
+
|
|
|
+ /* Register the keyboard */
|
|
|
+ debug("USB KBD: register.\n");
|
|
|
+ memset(&usb_kbd_dev, 0, sizeof(struct stdio_dev));
|
|
|
+ strcpy(usb_kbd_dev.name, DEVNAME);
|
|
|
+ usb_kbd_dev.flags = DEV_FLAGS_INPUT | DEV_FLAGS_SYSTEM;
|
|
|
+ usb_kbd_dev.getc = usb_kbd_getc;
|
|
|
+ usb_kbd_dev.tstc = usb_kbd_testc;
|
|
|
+ usb_kbd_dev.priv = (void *)dev;
|
|
|
+ error = stdio_register(&usb_kbd_dev);
|
|
|
+ if (error)
|
|
|
+ return error;
|
|
|
+
|
|
|
+ stdinname = getenv("stdin");
|
|
|
+#ifdef CONFIG_CONSOLE_MUX
|
|
|
+ error = iomux_doenv(stdin, stdinname);
|
|
|
+ if (error)
|
|
|
+ return error;
|
|
|
+#else
|
|
|
+ /* Check if this is the standard input device. */
|
|
|
+ if (strcmp(stdinname, DEVNAME))
|
|
|
+ return 1;
|
|
|
+
|
|
|
+ /* Reassign the console */
|
|
|
+ if (overwrite_console())
|
|
|
+ return 1;
|
|
|
+
|
|
|
+ error = console_assign(stdin, DEVNAME);
|
|
|
+ if (error)
|
|
|
+ return error;
|
|
|
+#endif
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
/* Search for keyboard and register it if found. */
|
|
|
int drv_usb_kbd_init(void)
|
|
|
{
|
|
|
- struct stdio_dev usb_kbd_dev;
|
|
|
- struct usb_device *dev;
|
|
|
- char *stdinname = getenv("stdin");
|
|
|
int error, i;
|
|
|
|
|
|
- /* Scan all USB Devices */
|
|
|
+ debug("%s: Probing for keyboard\n", __func__);/* Scan all USB Devices */
|
|
|
for (i = 0; i < USB_MAX_DEVICE; i++) {
|
|
|
+ struct usb_device *dev;
|
|
|
+
|
|
|
/* Get USB device. */
|
|
|
dev = usb_get_dev_index(i);
|
|
|
if (!dev)
|
|
|
- return -1;
|
|
|
+ break;
|
|
|
|
|
|
if (dev->devnum == -1)
|
|
|
continue;
|
|
|
|
|
|
- /* Try probing the keyboard */
|
|
|
- if (usb_kbd_probe(dev, 0) != 1)
|
|
|
- continue;
|
|
|
-
|
|
|
- /* Register the keyboard */
|
|
|
- debug("USB KBD: register.\n");
|
|
|
- memset(&usb_kbd_dev, 0, sizeof(struct stdio_dev));
|
|
|
- strcpy(usb_kbd_dev.name, DEVNAME);
|
|
|
- usb_kbd_dev.flags = DEV_FLAGS_INPUT | DEV_FLAGS_SYSTEM;
|
|
|
- usb_kbd_dev.getc = usb_kbd_getc;
|
|
|
- usb_kbd_dev.tstc = usb_kbd_testc;
|
|
|
- usb_kbd_dev.priv = (void *)dev;
|
|
|
- error = stdio_register(&usb_kbd_dev);
|
|
|
- if (error)
|
|
|
- return error;
|
|
|
-
|
|
|
-#ifdef CONFIG_CONSOLE_MUX
|
|
|
- error = iomux_doenv(stdin, stdinname);
|
|
|
- if (error)
|
|
|
- return error;
|
|
|
-#else
|
|
|
- /* Check if this is the standard input device. */
|
|
|
- if (strcmp(stdinname, DEVNAME))
|
|
|
- return 1;
|
|
|
-
|
|
|
- /* Reassign the console */
|
|
|
- if (overwrite_console())
|
|
|
+ error = probe_usb_keyboard(dev);
|
|
|
+ if (!error)
|
|
|
return 1;
|
|
|
-
|
|
|
- error = console_assign(stdin, DEVNAME);
|
|
|
- if (error)
|
|
|
+ if (error && error != -ENOENT)
|
|
|
return error;
|
|
|
-#endif
|
|
|
-
|
|
|
- return 1;
|
|
|
}
|
|
|
|
|
|
/* No USB Keyboard found */
|