Patchwork [U-Boot,V2] USB: Add functionality to poll the USB keyboard via control EP

login
register
mail settings
Submitter Marek Vasut
Date Sept. 25, 2011, 7 p.m.
Message ID <1316977237-8709-1-git-send-email-marek.vasut@gmail.com>
Download mbox | patch
Permalink /patch/116317/
State Changes Requested
Headers show

Comments

Marek Vasut - Sept. 25, 2011, 7 p.m.
This allows the keyboard to avoid requests via Interrupt Endpoint altogether and
run all requests via Control Endpoint. This uses the Get_Report request.

Signed-off-by: Marek Vasut <marek.vasut@gmail.com>
Cc: Remy Bohmer <linux@bohmer.net>
---
 common/usb_kbd.c |   64 ++++++++++++++++++++++++++++++++++++++++++-----------
 1 files changed, 50 insertions(+), 14 deletions(-)

V2: Add missing condition to ignore repetitive events when polling via EP0
Wolfgang Denk - Oct. 6, 2011, 9:21 p.m.
Dear Marek Vasut,

In message <1316977237-8709-1-git-send-email-marek.vasut@gmail.com> you wrote:
> This allows the keyboard to avoid requests via Interrupt Endpoint altogether and
> run all requests via Control Endpoint. This uses the Get_Report request.
> 
> Signed-off-by: Marek Vasut <marek.vasut@gmail.com>
> Cc: Remy Bohmer <linux@bohmer.net>
> ---
>  common/usb_kbd.c |   64 ++++++++++++++++++++++++++++++++++++++++++-----------
>  1 files changed, 50 insertions(+), 14 deletions(-)
> 
> V2: Add missing condition to ignore repetitive events when polling via EP0

Checkpatch says:

total: 5 errors, 1 warnings, 97 lines checked

Please clean up and resubmit.  Thanks.

Best regards,

Wolfgang Denk
Marek Vasut - Oct. 6, 2011, 11:31 p.m.
Dear Wolfgang Denk,

> Dear Marek Vasut,
> 
> In message <1316977237-8709-1-git-send-email-marek.vasut@gmail.com> you wrote:
> > This allows the keyboard to avoid requests via Interrupt Endpoint
> > altogether and run all requests via Control Endpoint. This uses the
> > Get_Report request.
> > 
> > Signed-off-by: Marek Vasut <marek.vasut@gmail.com>
> > Cc: Remy Bohmer <linux@bohmer.net>
> > ---
> > 
> >  common/usb_kbd.c |   64
> >  ++++++++++++++++++++++++++++++++++++++++++----------- 1 files changed,
> >  50 insertions(+), 14 deletions(-)
> > 
> > V2: Add missing condition to ignore repetitive events when polling via
> > EP0
> 
> Checkpatch says:
> 
> total: 5 errors, 1 warnings, 97 lines checked
> 
> Please clean up and resubmit.  Thanks.
> 
> Best regards,
> 
> Wolfgang Denk

Please see my previous comment about the state of usbkbd.c. The warnings are 
from original code that was moved around.

I'd prefer to submit further usbkbd cleanup patch.

Cheers
Wolfgang Denk - Oct. 7, 2011, 6:15 a.m.
Dear Marek Vasut,

In message <201110070131.53775.marek.vasut@gmail.com> you wrote:
> 
> > Checkpatch says:
> > 
> > total: 5 errors, 1 warnings, 97 lines checked
...
> Please see my previous comment about the state of usbkbd.c. The warnings are 
> from original code that was moved around.
> 
> I'd prefer to submit further usbkbd cleanup patch.

If Remy accepts it...

Best regards,

Wolfgang Denk
Remy Bohmer - Oct. 8, 2011, 6:32 p.m.
Hi,

2011/10/7 Wolfgang Denk <wd@denx.de>:
> Dear Marek Vasut,
>
> In message <201110070131.53775.marek.vasut@gmail.com> you wrote:
>>
>> > Checkpatch says:
>> >
>> > total: 5 errors, 1 warnings, 97 lines checked
> ...
>> Please see my previous comment about the state of usbkbd.c. The warnings are
>> from original code that was moved around.
>>
>> I'd prefer to submit further usbkbd cleanup patch.
>
> If Remy accepts it...

Find with me.

Remy
Remy Bohmer - Oct. 8, 2011, 6:33 p.m.
Hi,

2011/10/6 Wolfgang Denk <wd@denx.de>:
> Dear Marek Vasut,
>
> In message <1316977237-8709-1-git-send-email-marek.vasut@gmail.com> you wrote:
>> This allows the keyboard to avoid requests via Interrupt Endpoint altogether and
>> run all requests via Control Endpoint. This uses the Get_Report request.
>>
>> Signed-off-by: Marek Vasut <marek.vasut@gmail.com>
>> Cc: Remy Bohmer <linux@bohmer.net>
>> ---
>>  common/usb_kbd.c |   64 ++++++++++++++++++++++++++++++++++++++++++-----------
>>  1 files changed, 50 insertions(+), 14 deletions(-)
>>
>> V2: Add missing condition to ignore repetitive events when polling via EP0

Applied to u-boot-usb

Kind regards,

Remy

Patch

diff --git a/common/usb_kbd.c b/common/usb_kbd.c
index 9957dcc..503d175 100644
--- a/common/usb_kbd.c
+++ b/common/usb_kbd.c
@@ -96,6 +96,26 @@  static unsigned char usb_kbd_numkey_shifted[] = {
 	 '+', '{', '}', '|', '~', ':', '"', '~', '<', '>', '?'
 };
 
+static int usb_kbd_irq_worker(struct usb_device *dev);
+
+/******************************************************************
+ * Interrupt polling
+ ******************************************************************/
+static inline void usb_kbd_poll_for_event(struct usb_device *dev)
+{
+#if	defined(CONFIG_SYS_USB_EVENT_POLL)
+	usb_event_poll();
+	usb_kbd_irq_worker(dev);
+#elif	defined(CONFIG_SYS_USB_EVENT_POLL_VIA_CONTROL_EP)
+	struct usb_interface *iface;
+	iface = &dev->config.if_desc[0];
+	usb_get_report(dev, iface->desc.bInterfaceNumber,
+			1, 1, new, sizeof(new));
+	if (memcmp(old, new, sizeof(new)))
+		usb_kbd_irq_worker(dev);
+#endif
+}
+
 /******************************************************************
  * Queue handling
  ******************************************************************/
@@ -120,9 +140,14 @@  static void usb_kbd_put_queue(char data)
 /* test if a character is in the queue */
 static int usb_kbd_testc(void)
 {
-#ifdef CONFIG_SYS_USB_EVENT_POLL
-	usb_event_poll();
-#endif
+	struct stdio_dev *dev;
+	struct usb_device *usb_kbd_dev;
+
+	dev = stdio_get_by_name("usbkbd");
+	usb_kbd_dev = (struct usb_device *)dev->priv;
+
+	usb_kbd_poll_for_event(usb_kbd_dev);
+
 	if(usb_in_pointer==usb_out_pointer)
 		return(0); /* no data */
 	else
@@ -132,11 +157,16 @@  static int usb_kbd_testc(void)
 static int usb_kbd_getc(void)
 {
 	char c;
-	while(usb_in_pointer==usb_out_pointer) {
-#ifdef CONFIG_SYS_USB_EVENT_POLL
-		usb_event_poll();
-#endif
-	}
+
+	struct stdio_dev *dev;
+	struct usb_device *usb_kbd_dev;
+
+	dev = stdio_get_by_name("usbkbd");
+	usb_kbd_dev = (struct usb_device *)dev->priv;
+
+	while(usb_in_pointer==usb_out_pointer)
+		usb_kbd_poll_for_event(usb_kbd_dev);
+
 	if((usb_out_pointer+1)==USB_KBD_BUFFER_LEN)
 		usb_out_pointer=0;
 	else
@@ -308,15 +338,10 @@  static int usb_kbd_translate(unsigned char scancode,unsigned char modifier,int p
 }
 
 /* Interrupt service routine */
-static int usb_kbd_irq(struct usb_device *dev)
+static int usb_kbd_irq_worker(struct usb_device *dev)
 {
 	int i,res;
 
-	if((dev->irq_status!=0)||(dev->irq_act_len!=8))
-	{
-		USB_KBD_PRINTF("usb_keyboard Error %lX, len %d\n",dev->irq_status,dev->irq_act_len);
-		return 1;
-	}
 	res=0;
 
 	switch (new[0]) {
@@ -345,6 +370,17 @@  static int usb_kbd_irq(struct usb_device *dev)
 	return 1; /* install IRQ Handler again */
 }
 
+static int usb_kbd_irq(struct usb_device *dev)
+{
+	if ((dev->irq_status != 0) || (dev->irq_act_len != 8))
+	{
+		USB_KBD_PRINTF("usb_keyboard Error %lX, len %d\n",dev->irq_status,dev->irq_act_len);
+		return 1;
+	}
+
+	return usb_kbd_irq_worker(dev);
+}
+
 /* probes the USB device dev for keyboard type */
 static int usb_kbd_probe(struct usb_device *dev, unsigned int ifnum)
 {