All of lore.kernel.org
 help / color / mirror / Atom feed
* [U-Boot] [PATCH 0/3] USB keyboard driver rework (round 2)
@ 2011-10-10 15:34 Marek Vasut
  2011-10-10 15:34 ` [U-Boot] [PATCH 1/3] USB: Squash checkpatch warnings in usb_kbd.c Marek Vasut
                   ` (3 more replies)
  0 siblings, 4 replies; 14+ messages in thread
From: Marek Vasut @ 2011-10-10 15:34 UTC (permalink / raw)
  To: u-boot

This series reworks the common/usb_kbd.c driver. The code in the driver was
messy so this is mostly cleanup and reorganisation.

NOTE: I don't consider it a V2 of the previous series because the patch 1/2 from
the old series is no longer present and there were also some changes in the dead
code introduced by this series (coding style fixes).

This depends on previous patches:

[PATCH V2] USB: Add functionality to poll the USB keyboard via control EP
Message-Id: <1316977237-8709-1-git-send-email-marek.vasut@gmail.com>

[PATCH V2] USB: Add usb_event_poll() to get keyboards working with EHCI
Message-Id: <1316977676-10284-1-git-send-email-marek.vasut@gmail.com>

Cc: Mike Frysinger <vapier@gentoo.org>
Cc: Remy Bohmer <linux@bohmer.net>
Cc: Wolfgang Denk <wd@denx.de>

Marek Vasut (3):
  USB: Squash checkpatch warnings in usb_kbd.c
  USB: Rework usb_kbd.c
  USB: Drop dead code from usb_kbd.c

 common/usb_kbd.c |  976 +++++++++++++++++++-----------------------------------
 1 files changed, 346 insertions(+), 630 deletions(-)

-- 
1.7.6.3

^ permalink raw reply	[flat|nested] 14+ messages in thread

* [U-Boot] [PATCH 1/3] USB: Squash checkpatch warnings in usb_kbd.c
  2011-10-10 15:34 [U-Boot] [PATCH 0/3] USB keyboard driver rework (round 2) Marek Vasut
@ 2011-10-10 15:34 ` Marek Vasut
  2011-10-10 18:23   ` Mike Frysinger
  2011-12-09  9:29   ` Wolfgang Denk
  2011-10-10 15:34 ` [U-Boot] [PATCH 2/3] USB: Rework usb_kbd.c Marek Vasut
                   ` (2 subsequent siblings)
  3 siblings, 2 replies; 14+ messages in thread
From: Marek Vasut @ 2011-10-10 15:34 UTC (permalink / raw)
  To: u-boot

Signed-off-by: Marek Vasut <marek.vasut@gmail.com>
Cc: Mike Frysinger <vapier@gentoo.org>
Cc: Remy Bohmer <linux@bohmer.net>
Cc: Wolfgang Denk <wd@denx.de>
---
 common/usb_kbd.c |  608 ++++++++++++++++++++++++++++--------------------------
 1 files changed, 319 insertions(+), 289 deletions(-)

diff --git a/common/usb_kbd.c b/common/usb_kbd.c
index 503d175..0679420 100644
--- a/common/usb_kbd.c
+++ b/common/usb_kbd.c
@@ -32,70 +32,74 @@
 
 #undef USB_KBD_DEBUG
 /*
- * if overwrite_console returns 1, the stdin, stderr and stdout
+ * If overwrite_console returns 1, the stdin, stderr and stdout
  * are switched to the serial port, else the settings in the
  * environment are used
  */
 #ifdef CONFIG_SYS_CONSOLE_OVERWRITE_ROUTINE
-extern int overwrite_console (void);
+extern int overwrite_console(void);
 #else
-int overwrite_console (void)
+int overwrite_console(void)
 {
-	return (0);
+	return 0;
 }
 #endif
 
-#ifdef	USB_KBD_DEBUG
-#define	USB_KBD_PRINTF(fmt,args...)	printf (fmt ,##args)
+#ifdef USB_KBD_DEBUG
+#define USB_KBD_PRINTF(fmt, args...)	printf(fmt, ##args)
 #else
-#define USB_KBD_PRINTF(fmt,args...)
+#define USB_KBD_PRINTF(fmt, args...)
 #endif
 
 
-#define REPEAT_RATE  40/4 /* 40msec -> 25cps */
-#define REPEAT_DELAY 10 /* 10 x REAPEAT_RATE = 400msec */
+#define REPEAT_RATE	(40/4)	/* 40msec -> 25cps */
+#define REPEAT_DELAY	10	/* 10 x REPEAT_RATE = 400msec */
 
 #define NUM_LOCK	0x53
-#define CAPS_LOCK 0x39
-#define SCROLL_LOCK 0x47
+#define CAPS_LOCK	0x39
+#define SCROLL_LOCK	0x47
 
 
 /* Modifier bits */
 #define LEFT_CNTR		0
-#define LEFT_SHIFT	1
+#define LEFT_SHIFT		1
 #define LEFT_ALT		2
 #define LEFT_GUI		3
-#define RIGHT_CNTR	4
-#define RIGHT_SHIFT	5
+#define RIGHT_CNTR		4
+#define RIGHT_SHIFT		5
 #define RIGHT_ALT		6
 #define RIGHT_GUI		7
 
-#define USB_KBD_BUFFER_LEN 0x20  /* size of the keyboardbuffer */
+#define USB_KBD_BUFFER_LEN	0x20	/* size of the keyboardbuffer */
 
-static volatile char usb_kbd_buffer[USB_KBD_BUFFER_LEN];
-static volatile int usb_in_pointer = 0;
-static volatile int usb_out_pointer = 0;
+static char usb_kbd_buffer[USB_KBD_BUFFER_LEN];
+static int usb_in_pointer;
+static int usb_out_pointer;
 
 unsigned char new[8];
 unsigned char old[8];
 int repeat_delay;
-#define DEVNAME "usbkbd"
-static unsigned char num_lock = 0;
-static unsigned char caps_lock = 0;
-static unsigned char scroll_lock = 0;
-static unsigned char ctrl = 0;
+#define DEVNAME			"usbkbd"
+static unsigned char num_lock;
+static unsigned char caps_lock;
+static unsigned char scroll_lock;
+static unsigned char ctrl;
 
-static unsigned char leds __attribute__ ((aligned (0x4)));
+static unsigned char leds __attribute__((aligned(0x4)));
 
 static unsigned char usb_kbd_numkey[] = {
-	 '1', '2', '3', '4', '5', '6', '7', '8', '9', '0','\r',0x1b,'\b','\t',' ', '-',
-	 '=', '[', ']','\\', '#', ';', '\'', '`', ',', '.', '/'
+	'1', '2', '3', '4', '5', '6', '7', '8', '9', '0',
+	'\r', 0x1b, '\b', '\t', ' ', '-', '=', '[', ']',
+	'\\', '#', ';', '\'', '`', ',', '.', '/'
 };
+
 static unsigned char usb_kbd_numkey_shifted[] = {
-	 '!', '@', '#', '$', '%', '^', '&', '*', '(', ')','\r',0x1b,'\b','\t',' ', '_',
-	 '+', '{', '}', '|', '~', ':', '"', '~', '<', '>', '?'
+	'!', '@', '#', '$', '%', '^', '&', '*', '(', ')',
+	'\r', 0x1b, '\b', '\t', ' ', '_', '+', '{', '}',
+	'|', '~', ':', '"', '~', '<', '>', '?'
 };
 
+
 static int usb_kbd_irq_worker(struct usb_device *dev);
 
 /******************************************************************
@@ -122,18 +126,17 @@ static inline void usb_kbd_poll_for_event(struct usb_device *dev)
 /* puts character in the queue and sets up the in and out pointer */
 static void usb_kbd_put_queue(char data)
 {
-	if((usb_in_pointer+1)==USB_KBD_BUFFER_LEN) {
-		if(usb_out_pointer==0) {
+	if ((usb_in_pointer+1) == USB_KBD_BUFFER_LEN) {
+		if (usb_out_pointer == 0)
 			return; /* buffer full */
-		} else{
-			usb_in_pointer=0;
-		}
+		else
+			usb_in_pointer = 0;
 	} else {
-		if((usb_in_pointer+1)==usb_out_pointer)
+		if ((usb_in_pointer+1) == usb_out_pointer)
 			return; /* buffer full */
 		usb_in_pointer++;
 	}
-	usb_kbd_buffer[usb_in_pointer]=data;
+	usb_kbd_buffer[usb_in_pointer] = data;
 	return;
 }
 
@@ -148,10 +151,10 @@ static int usb_kbd_testc(void)
 
 	usb_kbd_poll_for_event(usb_kbd_dev);
 
-	if(usb_in_pointer==usb_out_pointer)
-		return(0); /* no data */
+	if (usb_in_pointer == usb_out_pointer)
+		return 0; /* no data */
 	else
-		return(1);
+		return 1;
 }
 /* gets the character from the queue */
 static int usb_kbd_getc(void)
@@ -164,14 +167,14 @@ static int usb_kbd_getc(void)
 	dev = stdio_get_by_name("usbkbd");
 	usb_kbd_dev = (struct usb_device *)dev->priv;
 
-	while(usb_in_pointer==usb_out_pointer)
+	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;
+	if ((usb_out_pointer+1) == USB_KBD_BUFFER_LEN)
+		usb_out_pointer = 0;
 	else
 		usb_out_pointer++;
-	c=usb_kbd_buffer[usb_out_pointer];
+	c = usb_kbd_buffer[usb_out_pointer];
 	return (int)c;
 
 }
@@ -182,48 +185,56 @@ static int usb_kbd_probe(struct usb_device *dev, unsigned int ifnum);
 /* search for keyboard and register it if found */
 int drv_usb_kbd_init(void)
 {
-	int error,i;
-	struct stdio_dev usb_kbd_dev,*old_dev;
+	int error, i;
+	struct stdio_dev usb_kbd_dev, *old_dev;
 	struct usb_device *dev;
-	char *stdinname  = getenv ("stdin");
+	char *stdinname = getenv("stdin");
 
-	usb_in_pointer=0;
-	usb_out_pointer=0;
+	usb_in_pointer = 0;
+	usb_out_pointer = 0;
 	/* scan all USB Devices */
-	for(i=0;i<USB_MAX_DEVICE;i++) {
-		dev=usb_get_dev_index(i); /* get device */
-		if(dev == NULL)
+	for (i = 0 ; i < USB_MAX_DEVICE ; i++) {
+		dev = usb_get_dev_index(i); /* get device */
+		if (dev == NULL)
 			return -1;
-		if(dev->devnum!=-1) {
-			if(usb_kbd_probe(dev,0)==1) { /* Ok, we found a keyboard */
+		if (dev->devnum != -1) {
+			/* Ok, we found a keyboard */
+			if (usb_kbd_probe(dev, 0) == 1) {
 				/* check, if it is already registered */
-				USB_KBD_PRINTF("USB KBD found set up device.\n");
+				USB_KBD_PRINTF("USB KBD found set up "
+						"device.\n");
 				old_dev = stdio_get_by_name(DEVNAME);
-				if(old_dev) {
-					/* ok, already registered, just return ok */
-					USB_KBD_PRINTF("USB KBD is already registered.\n");
+				if (old_dev) {
+					/* already registered, just return ok */
+					USB_KBD_PRINTF("USB KBD is already "
+							"registered.\n");
 					return 1;
 				}
 				/* register the keyboard */
 				USB_KBD_PRINTF("USB KBD register.\n");
-				memset (&usb_kbd_dev, 0, sizeof(struct stdio_dev));
+				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.flags =  DEV_FLAGS_INPUT |
+							DEV_FLAGS_SYSTEM;
 				usb_kbd_dev.putc = NULL;
 				usb_kbd_dev.puts = NULL;
 				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==0) {
-					/* check if this is the standard input device */
-					if(strcmp(stdinname,DEVNAME)==0) {
+				error = stdio_register(&usb_kbd_dev);
+				if (error == 0) {
+					/*
+					 * check if this is the standard
+					 * input device
+					 */
+					if (strcmp(stdinname, DEVNAME) == 0) {
 						/* reassign the console */
-						if(overwrite_console()) {
+						if (overwrite_console())
 							return 1;
-						}
-						error=console_assign(stdin,DEVNAME);
-						if(error==0)
+						error = console_assign(stdin,
+								DEVNAME);
+						if (error == 0)
 							return 1;
 						else
 							return error;
@@ -261,15 +272,15 @@ static void usb_kbd_setled(struct usb_device *dev)
 {
 	struct usb_interface *iface;
 	iface = &dev->config.if_desc[0];
-	leds=0;
-	if(scroll_lock!=0)
-		leds|=1;
-	leds<<=1;
-	if(caps_lock!=0)
-		leds|=1;
-	leds<<=1;
-	if(num_lock!=0)
-		leds|=1;
+	leds = 0;
+	if (scroll_lock != 0)
+		leds |= 1;
+	leds <<= 1;
+	if (caps_lock != 0)
+		leds |= 1;
+	leds <<= 1;
+	if (num_lock != 0)
+		leds |= 1;
 	usb_control_msg(dev, usb_sndctrlpipe(dev, 0),
 		USB_REQ_SET_REPORT, USB_TYPE_CLASS | USB_RECIP_INTERFACE,
 		0x200, iface->desc.bInterfaceNumber, (void *)&leds, 1, 0);
@@ -279,59 +290,65 @@ static void usb_kbd_setled(struct usb_device *dev)
 
 #define CAPITAL_MASK 0x20
 /* Translate the scancode in ASCII */
-static int usb_kbd_translate(unsigned char scancode,unsigned char modifier,int pressed)
+static int usb_kbd_translate(unsigned char scancode, unsigned char modifier,
+				int pressed)
 {
 	unsigned char keycode;
 
-	if(pressed==0) {
+	if (pressed == 0) {
 		/* key released */
-		repeat_delay=0;
+		repeat_delay = 0;
 		return 0;
 	}
-	if(pressed==2) {
+	if (pressed == 2) {
 		repeat_delay++;
-		if(repeat_delay<REPEAT_DELAY)
+		if (repeat_delay < REPEAT_DELAY)
 			return 0;
-		repeat_delay=REPEAT_DELAY;
+		repeat_delay = REPEAT_DELAY;
 	}
-	keycode=0;
-	if((scancode>3) && (scancode<=0x1d)) { /* alpha numeric values */
-		keycode=scancode-4 + 0x61;
-		if(caps_lock)
-			keycode&=~CAPITAL_MASK; /* switch to capital Letters */
-		if(((modifier&(1<<LEFT_SHIFT))!=0)||((modifier&(1<<RIGHT_SHIFT))!=0)) {
-			if(keycode & CAPITAL_MASK)
-				keycode&=~CAPITAL_MASK; /* switch to capital Letters */
+	keycode = 0;
+	if ((scancode > 3) && (scancode <= 0x1d)) { /* alpha numeric values */
+		keycode = scancode - 4 + 0x61;
+		if (caps_lock)
+			/* switch to capital Letters */
+			keycode &= ~CAPITAL_MASK;
+		if (((modifier&(1 << LEFT_SHIFT)) != 0) ||
+			((modifier&(1 << RIGHT_SHIFT)) != 0)) {
+			if (keycode & CAPITAL_MASK)
+				/* switch to capital Letters */
+				keycode &= ~CAPITAL_MASK;
 			else
-				keycode|=CAPITAL_MASK; /* switch to non capital Letters */
+				/* switch to non capital Letters */
+				keycode |= CAPITAL_MASK;
 		}
 	}
-	if((scancode>0x1d) && (scancode<0x3A)) {
-		if(((modifier&(1<<LEFT_SHIFT))!=0)||((modifier&(1<<RIGHT_SHIFT))!=0))  /* shifted */
-			keycode=usb_kbd_numkey_shifted[scancode-0x1e];
+	if ((scancode > 0x1d) && (scancode < 0x3A)) {
+		if (((modifier&(1 << LEFT_SHIFT)) != 0) ||
+			((modifier&(1 << RIGHT_SHIFT)) != 0))  /* shifted */
+			keycode = usb_kbd_numkey_shifted[scancode-0x1e];
 		else /* non shifted */
-			keycode=usb_kbd_numkey[scancode-0x1e];
+			keycode = usb_kbd_numkey[scancode-0x1e];
 	}
 
 	if (ctrl)
 		keycode = scancode - 0x3;
 
-	if(pressed==1) {
-		if(scancode==NUM_LOCK) {
-			num_lock=~num_lock;
+	if (pressed == 1) {
+		if (scancode == NUM_LOCK) {
+			num_lock = ~num_lock;
 			return 1;
 		}
-		if(scancode==CAPS_LOCK) {
-			caps_lock=~caps_lock;
+		if (scancode == CAPS_LOCK) {
+			caps_lock = ~caps_lock;
 			return 1;
 		}
-		if(scancode==SCROLL_LOCK) {
-			scroll_lock=~scroll_lock;
+		if (scancode == SCROLL_LOCK) {
+			scroll_lock = ~scroll_lock;
 			return 1;
 		}
 	}
-	if(keycode!=0) {
-		USB_KBD_PRINTF("%c",keycode);
+	if (keycode != 0) {
+		USB_KBD_PRINTF("%c", keycode);
 		usb_kbd_put_queue(keycode);
 	}
 	return 0;
@@ -340,9 +357,9 @@ static int usb_kbd_translate(unsigned char scancode,unsigned char modifier,int p
 /* Interrupt service routine */
 static int usb_kbd_irq_worker(struct usb_device *dev)
 {
-	int i,res;
+	int i, res;
 
-	res=0;
+	res = 0;
 
 	switch (new[0]) {
 	case 0x0:	/* No combo key pressed */
@@ -355,26 +372,25 @@ static int usb_kbd_irq_worker(struct usb_device *dev)
 	}
 
 	for (i = 2; i < 8; i++) {
-		if (old[i] > 3 && memscan(&new[2], old[i], 6) == &new[8]) {
-			res|=usb_kbd_translate(old[i],new[0],0);
-		}
-		if (new[i] > 3 && memscan(&old[2], new[i], 6) == &old[8]) {
-			res|=usb_kbd_translate(new[i],new[0],1);
-		}
+		if (old[i] > 3 && memscan(&new[2], old[i], 6) == &new[8])
+			res |= usb_kbd_translate(old[i], new[0], 0);
+
+		if (new[i] > 3 && memscan(&old[2], new[i], 6) == &old[8])
+			res |= usb_kbd_translate(new[i], new[0], 1);
 	}
-	if((new[2]>3) && (old[2]==new[2])) /* still pressed */
-		res|=usb_kbd_translate(new[2],new[0],2);
-	if(res==1)
+	if ((new[2] > 3) && (old[2] == new[2])) /* still pressed */
+		res |= usb_kbd_translate(new[2], new[0], 2);
+	if (res == 1)
 		usb_kbd_setled(dev);
-	memcpy(&old[0],&new[0], 8);
+	memcpy(&old[0], &new[0], 8);
 	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);
+	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;
 	}
 
@@ -386,9 +402,10 @@ static int usb_kbd_probe(struct usb_device *dev, unsigned int ifnum)
 {
 	struct usb_interface *iface;
 	struct usb_endpoint_descriptor *ep;
-	int pipe,maxp;
+	int pipe, maxp;
 
-	if (dev->descriptor.bNumConfigurations != 1) return 0;
+	if (dev->descriptor.bNumConfigurations != 1)
+		return 0;
 	iface = &dev->config.if_desc[ifnum];
 
 	if (iface->desc.bInterfaceClass != 3)
@@ -402,8 +419,10 @@ static int usb_kbd_probe(struct usb_device *dev, unsigned int ifnum)
 
 	ep = &iface->ep_desc[0];
 
-	if (!(ep->bEndpointAddress & 0x80)) return 0;
-	if ((ep->bmAttributes & 3) != 3) return 0;
+	if (!(ep->bEndpointAddress & 0x80))
+		return 0;
+	if ((ep->bmAttributes & 3) != 3)
+		return 0;
 	USB_KBD_PRINTF("USB KBD found set protocol...\n");
 	/* ok, we found a USB Keyboard, install it */
 	/* usb_kbd_get_hid_desc(dev); */
@@ -412,12 +431,13 @@ static int usb_kbd_probe(struct usb_device *dev, unsigned int ifnum)
 	usb_set_idle(dev, iface->desc.bInterfaceNumber, REPEAT_RATE, 0);
 	memset(&new[0], 0, 8);
 	memset(&old[0], 0, 8);
-	repeat_delay=0;
+	repeat_delay = 0;
 	pipe = usb_rcvintpipe(dev, ep->bEndpointAddress);
 	maxp = usb_maxpacket(dev, pipe);
-	dev->irq_handle=usb_kbd_irq;
+	dev->irq_handle = usb_kbd_irq;
 	USB_KBD_PRINTF("USB KBD enable interrupt pipe...\n");
-	usb_submit_int_msg(dev,pipe,&new[0], maxp > 8 ? 8 : maxp,ep->bInterval);
+	usb_submit_int_msg(dev, pipe, &new[0], maxp > 8 ? 8 : maxp,
+				ep->bInterval);
 	return 1;
 }
 
@@ -431,7 +451,7 @@ struct usb_hid_descriptor {
 	unsigned char  bNumDescriptors;
 	unsigned char  bReportDescriptorType;
 	unsigned short wDescriptorLength;
-} __attribute__ ((packed));
+} __packed;
 
 /*
  * We parse each description item into this structure. Short items data
@@ -474,12 +494,12 @@ static struct usb_hid_descriptor usb_kbd_hid_desc;
 void usb_kbd_display_hid(struct usb_hid_descriptor *hid)
 {
 	printf("USB_HID_DESC:\n");
-	printf("  bLenght               0x%x\n",hid->bLength);
-	printf("  bcdHID                0x%x\n",hid->bcdHID);
-	printf("  bCountryCode          %d\n",hid->bCountryCode);
-	printf("  bNumDescriptors       0x%x\n",hid->bNumDescriptors);
-	printf("  bReportDescriptorType 0x%x\n",hid->bReportDescriptorType);
-	printf("  wDescriptorLength     0x%x\n",hid->wDescriptorLength);
+	printf("  bLenght               0x%x\n", hid->bLength);
+	printf("  bcdHID                0x%x\n", hid->bcdHID);
+	printf("  bCountryCode          %d\n", hid->bCountryCode);
+	printf("  bNumDescriptors       0x%x\n", hid->bNumDescriptors);
+	printf("  bReportDescriptorType 0x%x\n", hid->bReportDescriptorType);
+	printf("  wDescriptorLength     0x%x\n", hid->wDescriptorLength);
 }
 
 
@@ -488,9 +508,10 @@ void usb_kbd_display_hid(struct usb_hid_descriptor *hid)
  * items, though they are not used yet.
  */
 
-static int fetch_item(unsigned char *start,unsigned char *end, struct hid_item *item)
+static int fetch_item(unsigned char *start, unsigned char *end,
+			struct hid_item *item)
 {
-	if((end - start) > 0) {
+	if ((end - start) > 0) {
 		unsigned char b = *start++;
 		item->type = (b >> 2) & 3;
 		item->tag  = (b >> 4) & 15;
@@ -509,27 +530,29 @@ static int fetch_item(unsigned char *start,unsigned char *end, struct hid_item *
 			item->format = HID_ITEM_FORMAT_SHORT;
 			item->size = b & 3;
 			switch (item->size) {
-				case 0:
+			case 0:
+				return item->size;
+			case 1:
+				if ((end - start) >= 1) {
+					item->data.u8 = *start++;
 					return item->size;
-				case 1:
-					if ((end - start) >= 1) {
-						item->data.u8 = *start++;
-						return item->size;
-					}
-					break;
-				case 2:
-					if ((end - start) >= 2) {
-						item->data.u16 = le16_to_cpu((unsigned short *)start);
-						start+=2;
-						return item->size;
-					}
-				case 3:
-					item->size++;
-					if ((end - start) >= 4) {
-						item->data.u32 = le32_to_cpu((unsigned long *)start);
-						start+=4;
-						return item->size;
-					}
+				}
+				break;
+			case 2:
+				if ((end - start) >= 2) {
+					item->data.u16 = le16_to_cpu(
+						(unsigned short *)start);
+					start += 2;
+					return item->size;
+				}
+			case 3:
+				item->size++;
+				if ((end - start) >= 4) {
+					item->data.u32 = le32_to_cpu(
+						(unsigned long *)start);
+					start += 4;
+					return item->size;
+				}
 			}
 		}
 	}
@@ -537,7 +560,7 @@ static int fetch_item(unsigned char *start,unsigned char *end, struct hid_item *
 }
 
 /*
- * HID report descriptor item type (prefix bit 2,3)
+ * HID report descriptor item type (prefix bit 2, 3)
  */
 
 #define HID_ITEM_TYPE_MAIN		0
@@ -609,123 +632,123 @@ static int fetch_item(unsigned char *start,unsigned char *end, struct hid_item *
 
 static void usb_kbd_show_item(struct hid_item *item)
 {
-	switch(item->type) {
-		case HID_ITEM_TYPE_MAIN:
-			switch(item->tag) {
-				case HID_MAIN_ITEM_TAG_INPUT:
-					printf("Main Input");
-					break;
-				case HID_MAIN_ITEM_TAG_OUTPUT:
-					printf("Main Output");
-					break;
-				case HID_MAIN_ITEM_TAG_FEATURE:
-					printf("Main Feature");
-					break;
-				case HID_MAIN_ITEM_TAG_BEGIN_COLLECTION:
-					printf("Main Begin Collection");
-					break;
-				case HID_MAIN_ITEM_TAG_END_COLLECTION:
-					printf("Main End Collection");
-					break;
-				default:
-					printf("Main reserved %d",item->tag);
-					break;
-			}
+	switch (item->type) {
+	case HID_ITEM_TYPE_MAIN:
+		switch (item->tag) {
+		case HID_MAIN_ITEM_TAG_INPUT:
+			printf("Main Input");
 			break;
-		case HID_ITEM_TYPE_GLOBAL:
-			switch(item->tag) {
-				case HID_GLOBAL_ITEM_TAG_USAGE_PAGE:
-					printf("- Global Usage Page");
-					break;
-				case HID_GLOBAL_ITEM_TAG_LOGICAL_MINIMUM:
-					printf("- Global Logical Minimum");
-					break;
-				case HID_GLOBAL_ITEM_TAG_LOGICAL_MAXIMUM:
-					printf("- Global Logical Maximum");
-					break;
-				case HID_GLOBAL_ITEM_TAG_PHYSICAL_MINIMUM:
-					printf("- Global physical Minimum");
-					break;
-				case HID_GLOBAL_ITEM_TAG_PHYSICAL_MAXIMUM:
-					printf("- Global physical Maximum");
-					break;
-				case HID_GLOBAL_ITEM_TAG_UNIT_EXPONENT:
-					printf("- Global Unit Exponent");
-					break;
-				case HID_GLOBAL_ITEM_TAG_UNIT:
-					printf("- Global Unit");
-					break;
-				case HID_GLOBAL_ITEM_TAG_REPORT_SIZE:
-					printf("- Global Report Size");
-					break;
-				case HID_GLOBAL_ITEM_TAG_REPORT_ID:
-					printf("- Global Report ID");
-					break;
-				case HID_GLOBAL_ITEM_TAG_REPORT_COUNT:
-					printf("- Global Report Count");
-					break;
-				case HID_GLOBAL_ITEM_TAG_PUSH:
-					printf("- Global Push");
-					break;
-				case HID_GLOBAL_ITEM_TAG_POP:
-					printf("- Global Pop");
-					break;
-				default:
-					printf("- Global reserved %d",item->tag);
-					break;
-			}
+		case HID_MAIN_ITEM_TAG_OUTPUT:
+			printf("Main Output");
 			break;
-		case HID_ITEM_TYPE_LOCAL:
-			switch(item->tag) {
-				case HID_LOCAL_ITEM_TAG_USAGE:
-					printf("-- Local Usage");
-					break;
-				case HID_LOCAL_ITEM_TAG_USAGE_MINIMUM:
-					printf("-- Local Usage Minimum");
-					break;
-				case HID_LOCAL_ITEM_TAG_USAGE_MAXIMUM:
-					printf("-- Local Usage Maximum");
-					break;
-				case HID_LOCAL_ITEM_TAG_DESIGNATOR_INDEX:
-					printf("-- Local Designator Index");
-					break;
-				case HID_LOCAL_ITEM_TAG_DESIGNATOR_MINIMUM:
-					printf("-- Local Designator Minimum");
-					break;
-				case HID_LOCAL_ITEM_TAG_DESIGNATOR_MAXIMUM:
-					printf("-- Local Designator Maximum");
-					break;
-				case HID_LOCAL_ITEM_TAG_STRING_INDEX:
-					printf("-- Local String Index");
-					break;
-				case HID_LOCAL_ITEM_TAG_STRING_MINIMUM:
-					printf("-- Local String Minimum");
-					break;
-				case HID_LOCAL_ITEM_TAG_STRING_MAXIMUM:
-					printf("-- Local String Maximum");
-					break;
-				case HID_LOCAL_ITEM_TAG_DELIMITER:
-					printf("-- Local Delimiter");
-					break;
-				default:
-					printf("-- Local reserved %d",item->tag);
-					break;
-			}
+		case HID_MAIN_ITEM_TAG_FEATURE:
+			printf("Main Feature");
+			break;
+		case HID_MAIN_ITEM_TAG_BEGIN_COLLECTION:
+			printf("Main Begin Collection");
+			break;
+		case HID_MAIN_ITEM_TAG_END_COLLECTION:
+			printf("Main End Collection");
 			break;
 		default:
-			printf("--- reserved %d",item->type);
+			printf("Main reserved %d", item->tag);
 			break;
-	}
-	switch(item->size) {
-		case 1:
-			printf("  %d",item->data.u8);
+		}
+		break;
+	case HID_ITEM_TYPE_GLOBAL:
+		switch (item->tag) {
+		case HID_GLOBAL_ITEM_TAG_USAGE_PAGE:
+			printf("- Global Usage Page");
+			break;
+		case HID_GLOBAL_ITEM_TAG_LOGICAL_MINIMUM:
+			printf("- Global Logical Minimum");
+			break;
+		case HID_GLOBAL_ITEM_TAG_LOGICAL_MAXIMUM:
+			printf("- Global Logical Maximum");
+			break;
+		case HID_GLOBAL_ITEM_TAG_PHYSICAL_MINIMUM:
+			printf("- Global physical Minimum");
 			break;
-		case 2:
-			printf("  %d",item->data.u16);
+		case HID_GLOBAL_ITEM_TAG_PHYSICAL_MAXIMUM:
+			printf("- Global physical Maximum");
 			break;
-		case 4:
-			printf("  %ld",item->data.u32);
+		case HID_GLOBAL_ITEM_TAG_UNIT_EXPONENT:
+			printf("- Global Unit Exponent");
 			break;
+		case HID_GLOBAL_ITEM_TAG_UNIT:
+			printf("- Global Unit");
+			break;
+		case HID_GLOBAL_ITEM_TAG_REPORT_SIZE:
+			printf("- Global Report Size");
+			break;
+		case HID_GLOBAL_ITEM_TAG_REPORT_ID:
+			printf("- Global Report ID");
+			break;
+		case HID_GLOBAL_ITEM_TAG_REPORT_COUNT:
+			printf("- Global Report Count");
+			break;
+		case HID_GLOBAL_ITEM_TAG_PUSH:
+			printf("- Global Push");
+			break;
+		case HID_GLOBAL_ITEM_TAG_POP:
+			printf("- Global Pop");
+			break;
+		default:
+			printf("- Global reserved %d", item->tag);
+			break;
+		}
+		break;
+	case HID_ITEM_TYPE_LOCAL:
+		switch (item->tag) {
+		case HID_LOCAL_ITEM_TAG_USAGE:
+			printf("-- Local Usage");
+			break;
+		case HID_LOCAL_ITEM_TAG_USAGE_MINIMUM:
+			printf("-- Local Usage Minimum");
+			break;
+		case HID_LOCAL_ITEM_TAG_USAGE_MAXIMUM:
+			printf("-- Local Usage Maximum");
+			break;
+		case HID_LOCAL_ITEM_TAG_DESIGNATOR_INDEX:
+			printf("-- Local Designator Index");
+			break;
+		case HID_LOCAL_ITEM_TAG_DESIGNATOR_MINIMUM:
+			printf("-- Local Designator Minimum");
+			break;
+		case HID_LOCAL_ITEM_TAG_DESIGNATOR_MAXIMUM:
+			printf("-- Local Designator Maximum");
+			break;
+		case HID_LOCAL_ITEM_TAG_STRING_INDEX:
+			printf("-- Local String Index");
+			break;
+		case HID_LOCAL_ITEM_TAG_STRING_MINIMUM:
+			printf("-- Local String Minimum");
+			break;
+		case HID_LOCAL_ITEM_TAG_STRING_MAXIMUM:
+			printf("-- Local String Maximum");
+			break;
+		case HID_LOCAL_ITEM_TAG_DELIMITER:
+			printf("-- Local Delimiter");
+			break;
+		default:
+			printf("-- Local reserved %d", item->tag);
+			break;
+		}
+		break;
+	default:
+		printf("--- reserved %d", item->type);
+		break;
+	}
+	switch (item->size) {
+	case 1:
+		printf("  %d", item->data.u8);
+		break;
+	case 2:
+		printf("  %d", item->data.u16);
+		break;
+	case 4:
+		printf("  %ld", item->data.u32);
+		break;
 	}
 	printf("\n");
 }
@@ -736,56 +759,63 @@ static int usb_kbd_get_hid_desc(struct usb_device *dev)
 	unsigned char buffer[256];
 	struct usb_descriptor_header *head;
 	struct usb_config_descriptor *config;
-	int index,len,i;
+	int index, len, i;
 	unsigned char *start, *end;
 	struct hid_item item;
 
-	if(usb_get_configuration_no(dev,&buffer[0],0)==-1)
+	if (usb_get_configuration_no(dev, &buffer[0], 0) == -1)
 		return -1;
-	head =(struct usb_descriptor_header *)&buffer[0];
-	if(head->bDescriptorType!=USB_DT_CONFIG) {
-		printf(" ERROR: NOT USB_CONFIG_DESC %x\n",head->bDescriptorType);
+	head = (struct usb_descriptor_header *)&buffer[0];
+	if (head->bDescriptorType != USB_DT_CONFIG) {
+		printf(" ERROR: NOT USB_CONFIG_DESC %x\n",
+				head->bDescriptorType);
 		return -1;
 	}
-	index=head->bLength;
-	config=(struct usb_config_descriptor *)&buffer[0];
-	len=le16_to_cpu(config->wTotalLength);
-	/* Ok the first entry must be a configuration entry, now process the others */
-	head=(struct usb_descriptor_header *)&buffer[index];
-	while(index+1 < len) {
-		if(head->bDescriptorType==USB_DT_HID) {
+	index = head->bLength;
+	config = (struct usb_config_descriptor *)&buffer[0];
+	len = le16_to_cpu(config->wTotalLength);
+	/*
+	 * Ok the first entry must be a configuration entry,
+	 * now process the others
+	 */
+	head = (struct usb_descriptor_header *)&buffer[index];
+	while (index+1 < len) {
+		if (head->bDescriptorType == USB_DT_HID) {
 			printf("HID desc found\n");
-			memcpy(&usb_kbd_hid_desc,&buffer[index],buffer[index]);
+			memcpy(&usb_kbd_hid_desc, &buffer[index],
+					buffer[index]);
 			le16_to_cpus(&usb_kbd_hid_desc.bcdHID);
 			le16_to_cpus(&usb_kbd_hid_desc.wDescriptorLength);
 			usb_kbd_display_hid(&usb_kbd_hid_desc);
-			len=0;
+			len = 0;
 			break;
 		}
-		index+=head->bLength;
-		head=(struct usb_descriptor_header *)&buffer[index];
+		index += head->bLength;
+		head = (struct usb_descriptor_header *)&buffer[index];
 	}
-	if(len>0)
+	if (len > 0)
 		return -1;
-	len=usb_kbd_hid_desc.wDescriptorLength;
-	if((index = usb_get_class_descriptor(dev, 0, USB_DT_REPORT, 0, &buffer[0], len)) < 0) {
+	len = usb_kbd_hid_desc.wDescriptorLength;
+	index = usb_get_class_descriptor(dev, 0, USB_DT_REPORT, 0, &buffer[0],
+						len);
+	if (index < 0) {
 		printf("reading report descriptor failed\n");
 		return -1;
 	}
 	printf(" report descriptor (size %u, read %d)\n", len, index);
 	start = &buffer[0];
 	end = &buffer[len];
-	i=0;
+	i = 0;
 	do {
-		index=fetch_item(start,end,&item);
-		i+=index;
+		index = fetch_item(start, end, &item);
+		i += index;
 		i++;
-		if(index>=0)
+		if (index >= 0)
 			usb_kbd_show_item(&item);
 
-		start+=index;
+		start += index;
 		start++;
-	} while(index>=0);
+	} while (index >= 0);
 
 }
 
-- 
1.7.6.3

^ permalink raw reply related	[flat|nested] 14+ messages in thread

* [U-Boot] [PATCH 2/3] USB: Rework usb_kbd.c
  2011-10-10 15:34 [U-Boot] [PATCH 0/3] USB keyboard driver rework (round 2) Marek Vasut
  2011-10-10 15:34 ` [U-Boot] [PATCH 1/3] USB: Squash checkpatch warnings in usb_kbd.c Marek Vasut
@ 2011-10-10 15:34 ` Marek Vasut
  2011-10-10 18:24   ` Mike Frysinger
  2011-10-10 15:34 ` [U-Boot] [PATCH 3/3] USB: Drop dead code from usb_kbd.c Marek Vasut
  2011-11-26 21:52 ` [U-Boot] [PATCH 0/3] USB keyboard driver rework (round 2) Remy Bohmer
  3 siblings, 1 reply; 14+ messages in thread
From: Marek Vasut @ 2011-10-10 15:34 UTC (permalink / raw)
  To: u-boot

* Support dynamic allocation of devices
* Passing data via usb device privptr
* Reorder functions to avoid forward declarations
* Introduce generic polling mechanism to fix musb and ehci-hcd breakage
  due to using "extern new;" to access keyboard driver data!

Signed-off-by: Marek Vasut <marek.vasut@gmail.com>
Cc: Mike Frysinger <vapier@gentoo.org>
Cc: Remy Bohmer <linux@bohmer.net>
Cc: Wolfgang Denk <wd@denx.de>
---
 common/usb_kbd.c |  593 ++++++++++++++++++++++++++++++------------------------
 1 files changed, 329 insertions(+), 264 deletions(-)

diff --git a/common/usb_kbd.c b/common/usb_kbd.c
index 0679420..94c8894 100644
--- a/common/usb_kbd.c
+++ b/common/usb_kbd.c
@@ -25,12 +25,18 @@
  *
  */
 #include <common.h>
+#include <malloc.h>
 #include <stdio_dev.h>
 #include <asm/byteorder.h>
 
 #include <usb.h>
 
-#undef USB_KBD_DEBUG
+#ifdef	USB_KBD_DEBUG
+#define USB_KBD_PRINTF(fmt, args...)	printf(fmt, ##args)
+#else
+#define USB_KBD_PRINTF(fmt, args...)
+#endif
+
 /*
  * If overwrite_console returns 1, the stdin, stderr and stdout
  * are switched to the serial port, else the settings in the
@@ -45,351 +51,258 @@ int overwrite_console(void)
 }
 #endif
 
-#ifdef USB_KBD_DEBUG
-#define USB_KBD_PRINTF(fmt, args...)	printf(fmt, ##args)
-#else
-#define USB_KBD_PRINTF(fmt, args...)
-#endif
-
-
-#define REPEAT_RATE	(40/4)	/* 40msec -> 25cps */
-#define REPEAT_DELAY	10	/* 10 x REPEAT_RATE = 400msec */
+/* Keyboard sampling rate */
+#define REPEAT_RATE	(40 / 4)	/* 40msec -> 25cps */
+#define REPEAT_DELAY	10		/* 10 x REPEAT_RATE = 400msec */
 
 #define NUM_LOCK	0x53
 #define CAPS_LOCK	0x39
 #define SCROLL_LOCK	0x47
 
-
 /* Modifier bits */
-#define LEFT_CNTR		0
-#define LEFT_SHIFT		1
-#define LEFT_ALT		2
-#define LEFT_GUI		3
-#define RIGHT_CNTR		4
-#define RIGHT_SHIFT		5
-#define RIGHT_ALT		6
-#define RIGHT_GUI		7
-
-#define USB_KBD_BUFFER_LEN	0x20	/* size of the keyboardbuffer */
-
-static char usb_kbd_buffer[USB_KBD_BUFFER_LEN];
-static int usb_in_pointer;
-static int usb_out_pointer;
-
-unsigned char new[8];
-unsigned char old[8];
-int repeat_delay;
+#define LEFT_CNTR	(1 << 0)
+#define LEFT_SHIFT	(1 << 1)
+#define LEFT_ALT	(1 << 2)
+#define LEFT_GUI	(1 << 3)
+#define RIGHT_CNTR	(1 << 4)
+#define RIGHT_SHIFT	(1 << 5)
+#define RIGHT_ALT	(1 << 6)
+#define RIGHT_GUI	(1 << 7)
+
+/* Size of the keyboard buffer */
+#define USB_KBD_BUFFER_LEN	0x20
+
+/* Device name */
 #define DEVNAME			"usbkbd"
-static unsigned char num_lock;
-static unsigned char caps_lock;
-static unsigned char scroll_lock;
-static unsigned char ctrl;
-
-static unsigned char leds __attribute__((aligned(0x4)));
 
-static unsigned char usb_kbd_numkey[] = {
+/* Keyboard maps */
+static const unsigned char usb_kbd_numkey[] = {
 	'1', '2', '3', '4', '5', '6', '7', '8', '9', '0',
 	'\r', 0x1b, '\b', '\t', ' ', '-', '=', '[', ']',
 	'\\', '#', ';', '\'', '`', ',', '.', '/'
 };
 
-static unsigned char usb_kbd_numkey_shifted[] = {
+static const unsigned char usb_kbd_numkey_shifted[] = {
 	'!', '@', '#', '$', '%', '^', '&', '*', '(', ')',
 	'\r', 0x1b, '\b', '\t', ' ', '_', '+', '{', '}',
 	'|', '~', ':', '"', '~', '<', '>', '?'
 };
 
+/*
+ * NOTE: It's important for the NUM, CAPS, SCROLL-lock bits to be in this
+ *       order. See usb_kbd_setled() function!
+ */
+#define USB_KBD_NUMLOCK		(1 << 0)
+#define USB_KBD_CAPSLOCK	(1 << 1)
+#define USB_KBD_SCROLLLOCK	(1 << 2)
+#define USB_KBD_CTRL		(1 << 3)
 
-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
-}
+#define USB_KBD_LEDMASK		\
+	(USB_KBD_NUMLOCK | USB_KBD_CAPSLOCK | USB_KBD_SCROLLLOCK)
 
-/******************************************************************
- * Queue handling
- ******************************************************************/
-/* puts character in the queue and sets up the in and out pointer */
-static void usb_kbd_put_queue(char data)
-{
-	if ((usb_in_pointer+1) == USB_KBD_BUFFER_LEN) {
-		if (usb_out_pointer == 0)
-			return; /* buffer full */
-		else
-			usb_in_pointer = 0;
-	} else {
-		if ((usb_in_pointer+1) == usb_out_pointer)
-			return; /* buffer full */
-		usb_in_pointer++;
-	}
-	usb_kbd_buffer[usb_in_pointer] = data;
-	return;
-}
+struct usb_kbd_pdata {
+	uint32_t	repeat_delay;
 
-/* test if a character is in the queue */
-static int usb_kbd_testc(void)
-{
-	struct stdio_dev *dev;
-	struct usb_device *usb_kbd_dev;
+	uint32_t	usb_in_pointer;
+	uint32_t	usb_out_pointer;
+	uint8_t		usb_kbd_buffer[USB_KBD_BUFFER_LEN];
 
-	dev = stdio_get_by_name("usbkbd");
-	usb_kbd_dev = (struct usb_device *)dev->priv;
+	uint8_t		new[8];
+	uint8_t		old[8];
 
-	usb_kbd_poll_for_event(usb_kbd_dev);
+	uint8_t		flags;
+};
 
-	if (usb_in_pointer == usb_out_pointer)
-		return 0; /* no data */
-	else
-		return 1;
-}
-/* gets the character from the queue */
-static int usb_kbd_getc(void)
+/* Generic keyboard event polling. */
+void usb_kbd_generic_poll(void)
 {
-	char c;
-
 	struct stdio_dev *dev;
 	struct usb_device *usb_kbd_dev;
+	struct usb_kbd_pdata *data;
+	struct usb_interface *iface;
+	struct usb_endpoint_descriptor *ep;
+	int pipe;
+	int maxp;
 
-	dev = stdio_get_by_name("usbkbd");
+	/* Get the pointer to USB Keyboard device pointer */
+	dev = stdio_get_by_name(DEVNAME);
 	usb_kbd_dev = (struct usb_device *)dev->priv;
+	data = usb_kbd_dev->privptr;
+	iface = &usb_kbd_dev->config.if_desc[0];
+	ep = &iface->ep_desc[0];
+	pipe = usb_rcvintpipe(usb_kbd_dev, ep->bEndpointAddress);
 
-	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
-		usb_out_pointer++;
-	c = usb_kbd_buffer[usb_out_pointer];
-	return (int)c;
-
+	/* Submit a interrupt transfer request */
+	maxp = usb_maxpacket(usb_kbd_dev, pipe);
+	usb_submit_int_msg(usb_kbd_dev, pipe, data->new,
+			maxp > 8 ? 8 : maxp, ep->bInterval);
 }
 
-/* forward decleration */
-static int usb_kbd_probe(struct usb_device *dev, unsigned int ifnum);
-
-/* search for keyboard and register it if found */
-int drv_usb_kbd_init(void)
+/* Puts character in the queue and sets up the in and out pointer. */
+static void usb_kbd_put_queue(struct usb_kbd_pdata *data, char c)
 {
-	int error, i;
-	struct stdio_dev usb_kbd_dev, *old_dev;
-	struct usb_device *dev;
-	char *stdinname = getenv("stdin");
+	if (data->usb_in_pointer == USB_KBD_BUFFER_LEN - 1) {
+		/* Check for buffer full. */
+		if (data->usb_out_pointer == 0)
+			return;
 
-	usb_in_pointer = 0;
-	usb_out_pointer = 0;
-	/* scan all USB Devices */
-	for (i = 0 ; i < USB_MAX_DEVICE ; i++) {
-		dev = usb_get_dev_index(i); /* get device */
-		if (dev == NULL)
-			return -1;
-		if (dev->devnum != -1) {
-			/* Ok, we found a keyboard */
-			if (usb_kbd_probe(dev, 0) == 1) {
-				/* check, if it is already registered */
-				USB_KBD_PRINTF("USB KBD found set up "
-						"device.\n");
-				old_dev = stdio_get_by_name(DEVNAME);
-				if (old_dev) {
-					/* already registered, just return ok */
-					USB_KBD_PRINTF("USB KBD is already "
-							"registered.\n");
-					return 1;
-				}
-				/* register the keyboard */
-				USB_KBD_PRINTF("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.putc = NULL;
-				usb_kbd_dev.puts = NULL;
-				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 == 0) {
-					/*
-					 * check if this is the standard
-					 * input device
-					 */
-					if (strcmp(stdinname, DEVNAME) == 0) {
-						/* reassign the console */
-						if (overwrite_console())
-							return 1;
-						error = console_assign(stdin,
-								DEVNAME);
-						if (error == 0)
-							return 1;
-						else
-							return error;
-					}
-					return 1;
-				}
-				return error;
-			}
-		}
-	}
-	/* no USB Keyboard found */
-	return -1;
-}
+		data->usb_in_pointer = 0;
+	} else {
+		/* Check for buffer full. */
+		if (data->usb_in_pointer == data->usb_out_pointer - 1)
+			return;
 
+		data->usb_in_pointer++;
+	}
 
-/* deregistering the keyboard */
-int usb_kbd_deregister(void)
-{
-#ifdef CONFIG_SYS_STDIO_DEREGISTER
-	return stdio_deregister(DEVNAME);
-#else
-	return 1;
-#endif
+	data->usb_kbd_buffer[data->usb_in_pointer] = c;
 }
 
-/**************************************************************************
- * Low Level drivers
+/*
+ * Set the LEDs. Since this is used in the irq routine, the control job is
+ * issued with a timeout of 0. This means, that the job is queued without
+ * waiting for job completion.
  */
-
-/* set the LEDs. Since this is used in the irq routine, the control job
-   is issued with a timeout of 0. This means, that the job is queued without
-   waiting for job completion */
-
 static void usb_kbd_setled(struct usb_device *dev)
 {
-	struct usb_interface *iface;
-	iface = &dev->config.if_desc[0];
-	leds = 0;
-	if (scroll_lock != 0)
-		leds |= 1;
-	leds <<= 1;
-	if (caps_lock != 0)
-		leds |= 1;
-	leds <<= 1;
-	if (num_lock != 0)
-		leds |= 1;
+	struct usb_interface *iface = &dev->config.if_desc[0];
+	struct usb_kbd_pdata *data = dev->privptr;
+	uint32_t leds = data->flags & USB_KBD_LEDMASK;
+
 	usb_control_msg(dev, usb_sndctrlpipe(dev, 0),
 		USB_REQ_SET_REPORT, USB_TYPE_CLASS | USB_RECIP_INTERFACE,
 		0x200, iface->desc.bInterfaceNumber, (void *)&leds, 1, 0);
-
 }
 
-
-#define CAPITAL_MASK 0x20
+#define CAPITAL_MASK	0x20
 /* Translate the scancode in ASCII */
-static int usb_kbd_translate(unsigned char scancode, unsigned char modifier,
-				int pressed)
+static int usb_kbd_translate(struct usb_kbd_pdata *data, unsigned char scancode,
+				unsigned char modifier, int pressed)
 {
-	unsigned char keycode;
+	uint8_t keycode = 0;
 
+	/* Key released */
 	if (pressed == 0) {
-		/* key released */
-		repeat_delay = 0;
+		data->repeat_delay = 0;
 		return 0;
 	}
+
 	if (pressed == 2) {
-		repeat_delay++;
-		if (repeat_delay < REPEAT_DELAY)
+		data->repeat_delay++;
+		if (data->repeat_delay < REPEAT_DELAY)
 			return 0;
-		repeat_delay = REPEAT_DELAY;
+
+		data->repeat_delay = REPEAT_DELAY;
 	}
-	keycode = 0;
-	if ((scancode > 3) && (scancode <= 0x1d)) { /* alpha numeric values */
-		keycode = scancode - 4 + 0x61;
-		if (caps_lock)
-			/* switch to capital Letters */
+
+	/* Alphanumeric values */
+	if ((scancode > 3) && (scancode <= 0x1d)) {
+		keycode = scancode - 4 + 'a';
+
+		if (data->flags & USB_KBD_CAPSLOCK)
 			keycode &= ~CAPITAL_MASK;
-		if (((modifier&(1 << LEFT_SHIFT)) != 0) ||
-			((modifier&(1 << RIGHT_SHIFT)) != 0)) {
+
+		if (modifier & (LEFT_SHIFT | RIGHT_SHIFT)) {
+			/* Handle CAPSLock + Shift pressed simultaneously */
 			if (keycode & CAPITAL_MASK)
-				/* switch to capital Letters */
 				keycode &= ~CAPITAL_MASK;
 			else
-				/* switch to non capital Letters */
 				keycode |= CAPITAL_MASK;
 		}
 	}
-	if ((scancode > 0x1d) && (scancode < 0x3A)) {
-		if (((modifier&(1 << LEFT_SHIFT)) != 0) ||
-			((modifier&(1 << RIGHT_SHIFT)) != 0))  /* shifted */
-			keycode = usb_kbd_numkey_shifted[scancode-0x1e];
-		else /* non shifted */
-			keycode = usb_kbd_numkey[scancode-0x1e];
+
+	if ((scancode > 0x1d) && (scancode < 0x3a)) {
+		/* Shift pressed */
+		if (modifier & (LEFT_SHIFT | RIGHT_SHIFT))
+			keycode = usb_kbd_numkey_shifted[scancode - 0x1e];
+		else
+			keycode = usb_kbd_numkey[scancode - 0x1e];
 	}
 
-	if (ctrl)
+	if (data->flags & USB_KBD_CTRL)
 		keycode = scancode - 0x3;
 
 	if (pressed == 1) {
 		if (scancode == NUM_LOCK) {
-			num_lock = ~num_lock;
+			data->flags ^= USB_KBD_NUMLOCK;
 			return 1;
 		}
+
 		if (scancode == CAPS_LOCK) {
-			caps_lock = ~caps_lock;
+			data->flags ^= USB_KBD_CAPSLOCK;
 			return 1;
 		}
 		if (scancode == SCROLL_LOCK) {
-			scroll_lock = ~scroll_lock;
+			data->flags ^= USB_KBD_SCROLLLOCK;
 			return 1;
 		}
 	}
-	if (keycode != 0) {
+
+	/* Report keycode if any */
+	if (keycode) {
 		USB_KBD_PRINTF("%c", keycode);
-		usb_kbd_put_queue(keycode);
+		usb_kbd_put_queue(data, keycode);
 	}
+
 	return 0;
 }
 
+static uint32_t usb_kbd_service_key(struct usb_device *dev, int i, int up)
+{
+	uint32_t res = 0;
+	struct usb_kbd_pdata *data = dev->privptr;
+	uint8_t *new;
+	uint8_t *old;
+
+	if (up) {
+		new = data->old;
+		old = data->new;
+	} else {
+		new = data->new;
+		old = data->old;
+	}
+
+	if ((old[i] > 3) && (memscan(new + 2, old[i], 6) == new + 8))
+		res |= usb_kbd_translate(data, old[i], data->new[0], up);
+
+	return res;
+}
+
 /* Interrupt service routine */
 static int usb_kbd_irq_worker(struct usb_device *dev)
 {
-	int i, res;
+	struct usb_kbd_pdata *data = dev->privptr;
+	int i, res = 0;
 
-	res = 0;
+	/* No combo key pressed */
+	if (data->new[0] == 0x00)
+		data->flags &= ~USB_KBD_CTRL;
+	/* Left or Right Ctrl pressed */
+	else if ((data->new[0] == LEFT_CNTR) || (data->new[0] == RIGHT_CNTR))
+		data->flags |= USB_KBD_CTRL;
 
-	switch (new[0]) {
-	case 0x0:	/* No combo key pressed */
-		ctrl = 0;
-		break;
-	case 0x01:	/* Left Ctrl pressed */
-	case 0x10:	/* Right Ctrl pressed */
-		ctrl = 1;
-		break;
+	for (i = 2; i < 8; i++) {
+		res |= usb_kbd_service_key(dev, i, 0);
+		res |= usb_kbd_service_key(dev, i, 1);
 	}
 
-	for (i = 2; i < 8; i++) {
-		if (old[i] > 3 && memscan(&new[2], old[i], 6) == &new[8])
-			res |= usb_kbd_translate(old[i], new[0], 0);
+	/* Key is still pressed */
+	if ((data->new[2] > 3) && (data->old[2] == data->new[2]))
+		res |= usb_kbd_translate(data, data->new[2], data->new[0], 2);
 
-		if (new[i] > 3 && memscan(&old[2], new[i], 6) == &old[8])
-			res |= usb_kbd_translate(new[i], new[0], 1);
-	}
-	if ((new[2] > 3) && (old[2] == new[2])) /* still pressed */
-		res |= usb_kbd_translate(new[2], new[0], 2);
 	if (res == 1)
 		usb_kbd_setled(dev);
-	memcpy(&old[0], &new[0], 8);
-	return 1; /* install IRQ Handler again */
+
+	memcpy(data->old, data->new, 8);
+
+	return 1;
 }
 
+/* Keyboard interrupt handler */
 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",
+		USB_KBD_PRINTF("USB KBD: Error %lX, len %d\n",
 				dev->irq_status, dev->irq_act_len);
 		return 1;
 	}
@@ -397,50 +310,202 @@ static int usb_kbd_irq(struct usb_device *dev)
 	return usb_kbd_irq_worker(dev);
 }
 
-/* probes the USB device dev for keyboard type */
+/* 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;
+	struct usb_kbd_pdata *data = dev->privptr;
+	iface = &dev->config.if_desc[0];
+	usb_get_report(dev, iface->desc.bInterfaceNumber,
+			1, 1, data->new, sizeof(data->new));
+	if (memcmp(data->old, data->new, sizeof(data->new)))
+		usb_kbd_irq_worker(dev);
+#endif
+}
+
+/* test if a character is in the queue */
+static int usb_kbd_testc(void)
+{
+	struct stdio_dev *dev;
+	struct usb_device *usb_kbd_dev;
+	struct usb_kbd_pdata *data;
+
+	dev = stdio_get_by_name(DEVNAME);
+	usb_kbd_dev = (struct usb_device *)dev->priv;
+	data = usb_kbd_dev->privptr;
+
+	usb_kbd_poll_for_event(usb_kbd_dev);
+
+	return !(data->usb_in_pointer == data->usb_out_pointer);
+}
+
+/* gets the character from the queue */
+static int usb_kbd_getc(void)
+{
+	struct stdio_dev *dev;
+	struct usb_device *usb_kbd_dev;
+	struct usb_kbd_pdata *data;
+
+	dev = stdio_get_by_name(DEVNAME);
+	usb_kbd_dev = (struct usb_device *)dev->priv;
+	data = usb_kbd_dev->privptr;
+
+	while (data->usb_in_pointer == data->usb_out_pointer)
+		usb_kbd_poll_for_event(usb_kbd_dev);
+
+	if (data->usb_out_pointer == USB_KBD_BUFFER_LEN - 1)
+		data->usb_out_pointer = 0;
+	else
+		data->usb_out_pointer++;
+
+	return data->usb_kbd_buffer[data->usb_out_pointer];
+}
+
+/* probes the USB device dev for keyboard type. */
 static int usb_kbd_probe(struct usb_device *dev, unsigned int ifnum)
 {
 	struct usb_interface *iface;
 	struct usb_endpoint_descriptor *ep;
+	struct usb_kbd_pdata *data;
 	int pipe, maxp;
 
 	if (dev->descriptor.bNumConfigurations != 1)
 		return 0;
+
 	iface = &dev->config.if_desc[ifnum];
 
 	if (iface->desc.bInterfaceClass != 3)
 		return 0;
+
 	if (iface->desc.bInterfaceSubClass != 1)
 		return 0;
+
 	if (iface->desc.bInterfaceProtocol != 1)
 		return 0;
+
 	if (iface->desc.bNumEndpoints != 1)
 		return 0;
 
 	ep = &iface->ep_desc[0];
 
+	/* Check if endpoint 1 is interrupt endpoint */
 	if (!(ep->bEndpointAddress & 0x80))
 		return 0;
+
 	if ((ep->bmAttributes & 3) != 3)
 		return 0;
-	USB_KBD_PRINTF("USB KBD found set protocol...\n");
-	/* ok, we found a USB Keyboard, install it */
-	/* usb_kbd_get_hid_desc(dev); */
-	usb_set_protocol(dev, iface->desc.bInterfaceNumber, 0);
-	USB_KBD_PRINTF("USB KBD found set idle...\n");
-	usb_set_idle(dev, iface->desc.bInterfaceNumber, REPEAT_RATE, 0);
-	memset(&new[0], 0, 8);
-	memset(&old[0], 0, 8);
-	repeat_delay = 0;
+
+	USB_KBD_PRINTF("USB KBD: found set protocol...\n");
+
+	data = malloc(sizeof(struct usb_kbd_pdata));
+	if (!data) {
+		printf("USB KBD: Error allocating private data\n");
+		return 0;
+	}
+
+	/* Clear private data */
+	memset(data, 0, sizeof(struct usb_kbd_pdata));
+
+	/* Insert private data into USB device structure */
+	dev->privptr = data;
+
+	/* Set IRQ handler */
+	dev->irq_handle = usb_kbd_irq;
+
 	pipe = usb_rcvintpipe(dev, ep->bEndpointAddress);
 	maxp = usb_maxpacket(dev, pipe);
-	dev->irq_handle = usb_kbd_irq;
-	USB_KBD_PRINTF("USB KBD enable interrupt pipe...\n");
-	usb_submit_int_msg(dev, pipe, &new[0], maxp > 8 ? 8 : maxp,
+
+	/* We found a USB Keyboard, install it. */
+	usb_set_protocol(dev, iface->desc.bInterfaceNumber, 0);
+
+	USB_KBD_PRINTF("USB KBD: found set idle...\n");
+	usb_set_idle(dev, iface->desc.bInterfaceNumber, REPEAT_RATE, 0);
+
+	USB_KBD_PRINTF("USB KBD: enable interrupt pipe...\n");
+	usb_submit_int_msg(dev, pipe, data->new, maxp > 8 ? 8 : maxp,
 				ep->bInterval);
+
+	/* Success. */
 	return 1;
 }
 
+/* Search for keyboard and register it if found. */
+int drv_usb_kbd_init(void)
+{
+	struct stdio_dev usb_kbd_dev, *old_dev;
+	struct usb_device *dev;
+	char *stdinname = getenv("stdin");
+	int error, i;
+
+	/* Scan all USB Devices */
+	for (i = 0; i < USB_MAX_DEVICE; i++) {
+		/* Get USB device. */
+		dev = usb_get_dev_index(i);
+		if (!dev)
+			return -1;
+
+		if (dev->devnum == -1)
+			continue;
+
+		/* Try probing the keyboard */
+		if (usb_kbd_probe(dev, 0) != 1)
+			continue;
+
+		/* We found a keyboard, check if it is already registered. */
+		USB_KBD_PRINTF("USB KBD: found set up device.\n");
+		old_dev = stdio_get_by_name(DEVNAME);
+		if (old_dev) {
+			/* Already registered, just return ok. */
+			USB_KBD_PRINTF("USB KBD: is already registered.\n");
+			return 1;
+		}
+
+		/* Register the keyboard */
+		USB_KBD_PRINTF("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.putc = NULL;
+		usb_kbd_dev.puts = NULL;
+		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;
+
+		/* 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;
+
+		return 1;
+	}
+
+	/* No USB Keyboard found */
+	return -1;
+}
+
+/* Deregister the keyboard. */
+int usb_kbd_deregister(void)
+{
+#ifdef CONFIG_SYS_STDIO_DEREGISTER
+	return stdio_deregister(DEVNAME);
+#else
+	return 1;
+#endif
+}
 
 #if 0
 struct usb_hid_descriptor {
-- 
1.7.6.3

^ permalink raw reply related	[flat|nested] 14+ messages in thread

* [U-Boot] [PATCH 3/3] USB: Drop dead code from usb_kbd.c
  2011-10-10 15:34 [U-Boot] [PATCH 0/3] USB keyboard driver rework (round 2) Marek Vasut
  2011-10-10 15:34 ` [U-Boot] [PATCH 1/3] USB: Squash checkpatch warnings in usb_kbd.c Marek Vasut
  2011-10-10 15:34 ` [U-Boot] [PATCH 2/3] USB: Rework usb_kbd.c Marek Vasut
@ 2011-10-10 15:34 ` Marek Vasut
  2011-10-10 18:25   ` Mike Frysinger
  2011-11-26 21:52 ` [U-Boot] [PATCH 0/3] USB keyboard driver rework (round 2) Remy Bohmer
  3 siblings, 1 reply; 14+ messages in thread
From: Marek Vasut @ 2011-10-10 15:34 UTC (permalink / raw)
  To: u-boot

Signed-off-by: Marek Vasut <marek.vasut@gmail.com>
Cc: Mike Frysinger <vapier@gentoo.org>
Cc: Remy Bohmer <linux@bohmer.net>
Cc: Wolfgang Denk <wd@denx.de>
---
 common/usb_kbd.c |  379 ------------------------------------------------------
 1 files changed, 0 insertions(+), 379 deletions(-)

diff --git a/common/usb_kbd.c b/common/usb_kbd.c
index 94c8894..670d953 100644
--- a/common/usb_kbd.c
+++ b/common/usb_kbd.c
@@ -506,382 +506,3 @@ int usb_kbd_deregister(void)
 	return 1;
 #endif
 }
-
-#if 0
-struct usb_hid_descriptor {
-	unsigned char  bLength;
-	unsigned char  bDescriptorType; /* 0x21 for HID */
-	unsigned short bcdHID; /* release number */
-	unsigned char  bCountryCode;
-	unsigned char  bNumDescriptors;
-	unsigned char  bReportDescriptorType;
-	unsigned short wDescriptorLength;
-} __packed;
-
-/*
- * We parse each description item into this structure. Short items data
- * values are expanded to 32-bit signed int, long items contain a pointer
- * into the data area.
- */
-
-struct hid_item {
-	unsigned char format;
-	unsigned char size;
-	unsigned char type;
-	unsigned char tag;
-	union {
-	    unsigned char   u8;
-	    char            s8;
-	    unsigned short  u16;
-	    short           s16;
-	    unsigned long   u32;
-	    long            s32;
-	    unsigned char  *longdata;
-	} data;
-};
-
-/*
- * HID report item format
- */
-
-#define HID_ITEM_FORMAT_SHORT	0
-#define HID_ITEM_FORMAT_LONG	1
-
-/*
- * Special tag indicating long items
- */
-
-#define HID_ITEM_TAG_LONG	15
-
-
-static struct usb_hid_descriptor usb_kbd_hid_desc;
-
-void usb_kbd_display_hid(struct usb_hid_descriptor *hid)
-{
-	printf("USB_HID_DESC:\n");
-	printf("  bLenght               0x%x\n", hid->bLength);
-	printf("  bcdHID                0x%x\n", hid->bcdHID);
-	printf("  bCountryCode          %d\n", hid->bCountryCode);
-	printf("  bNumDescriptors       0x%x\n", hid->bNumDescriptors);
-	printf("  bReportDescriptorType 0x%x\n", hid->bReportDescriptorType);
-	printf("  wDescriptorLength     0x%x\n", hid->wDescriptorLength);
-}
-
-
-/*
- * Fetch a report description item from the data stream. We support long
- * items, though they are not used yet.
- */
-
-static int fetch_item(unsigned char *start, unsigned char *end,
-			struct hid_item *item)
-{
-	if ((end - start) > 0) {
-		unsigned char b = *start++;
-		item->type = (b >> 2) & 3;
-		item->tag  = (b >> 4) & 15;
-		if (item->tag == HID_ITEM_TAG_LONG) {
-			item->format = HID_ITEM_FORMAT_LONG;
-			if ((end - start) >= 2) {
-				item->size = *start++;
-				item->tag  = *start++;
-				if ((end - start) >= item->size) {
-					item->data.longdata = start;
-					start += item->size;
-					return item->size;
-				}
-			}
-		} else {
-			item->format = HID_ITEM_FORMAT_SHORT;
-			item->size = b & 3;
-			switch (item->size) {
-			case 0:
-				return item->size;
-			case 1:
-				if ((end - start) >= 1) {
-					item->data.u8 = *start++;
-					return item->size;
-				}
-				break;
-			case 2:
-				if ((end - start) >= 2) {
-					item->data.u16 = le16_to_cpu(
-						(unsigned short *)start);
-					start += 2;
-					return item->size;
-				}
-			case 3:
-				item->size++;
-				if ((end - start) >= 4) {
-					item->data.u32 = le32_to_cpu(
-						(unsigned long *)start);
-					start += 4;
-					return item->size;
-				}
-			}
-		}
-	}
-	return -1;
-}
-
-/*
- * HID report descriptor item type (prefix bit 2, 3)
- */
-
-#define HID_ITEM_TYPE_MAIN		0
-#define HID_ITEM_TYPE_GLOBAL		1
-#define HID_ITEM_TYPE_LOCAL		2
-#define HID_ITEM_TYPE_RESERVED		3
-/*
- * HID report descriptor main item tags
- */
-
-#define HID_MAIN_ITEM_TAG_INPUT			8
-#define HID_MAIN_ITEM_TAG_OUTPUT		9
-#define HID_MAIN_ITEM_TAG_FEATURE		11
-#define HID_MAIN_ITEM_TAG_BEGIN_COLLECTION	10
-#define HID_MAIN_ITEM_TAG_END_COLLECTION	12
-/*
- * HID report descriptor main item contents
- */
-
-#define HID_MAIN_ITEM_CONSTANT		0x001
-#define HID_MAIN_ITEM_VARIABLE		0x002
-#define HID_MAIN_ITEM_RELATIVE		0x004
-#define HID_MAIN_ITEM_WRAP		0x008
-#define HID_MAIN_ITEM_NONLINEAR		0x010
-#define HID_MAIN_ITEM_NO_PREFERRED	0x020
-#define HID_MAIN_ITEM_NULL_STATE	0x040
-#define HID_MAIN_ITEM_VOLATILE		0x080
-#define HID_MAIN_ITEM_BUFFERED_BYTE	0x100
-
-/*
- * HID report descriptor collection item types
- */
-
-#define HID_COLLECTION_PHYSICAL		0
-#define HID_COLLECTION_APPLICATION	1
-#define HID_COLLECTION_LOGICAL		2
-/*
- * HID report descriptor global item tags
- */
-
-#define HID_GLOBAL_ITEM_TAG_USAGE_PAGE		0
-#define HID_GLOBAL_ITEM_TAG_LOGICAL_MINIMUM	1
-#define HID_GLOBAL_ITEM_TAG_LOGICAL_MAXIMUM	2
-#define HID_GLOBAL_ITEM_TAG_PHYSICAL_MINIMUM	3
-#define HID_GLOBAL_ITEM_TAG_PHYSICAL_MAXIMUM	4
-#define HID_GLOBAL_ITEM_TAG_UNIT_EXPONENT	5
-#define HID_GLOBAL_ITEM_TAG_UNIT		6
-#define HID_GLOBAL_ITEM_TAG_REPORT_SIZE		7
-#define HID_GLOBAL_ITEM_TAG_REPORT_ID		8
-#define HID_GLOBAL_ITEM_TAG_REPORT_COUNT	9
-#define HID_GLOBAL_ITEM_TAG_PUSH		10
-#define HID_GLOBAL_ITEM_TAG_POP			11
-
-/*
- * HID report descriptor local item tags
- */
-
-#define HID_LOCAL_ITEM_TAG_USAGE		0
-#define HID_LOCAL_ITEM_TAG_USAGE_MINIMUM	1
-#define HID_LOCAL_ITEM_TAG_USAGE_MAXIMUM	2
-#define HID_LOCAL_ITEM_TAG_DESIGNATOR_INDEX	3
-#define HID_LOCAL_ITEM_TAG_DESIGNATOR_MINIMUM	4
-#define HID_LOCAL_ITEM_TAG_DESIGNATOR_MAXIMUM	5
-#define HID_LOCAL_ITEM_TAG_STRING_INDEX		7
-#define HID_LOCAL_ITEM_TAG_STRING_MINIMUM	8
-#define HID_LOCAL_ITEM_TAG_STRING_MAXIMUM	9
-#define HID_LOCAL_ITEM_TAG_DELIMITER		10
-
-
-static void usb_kbd_show_item(struct hid_item *item)
-{
-	switch (item->type) {
-	case HID_ITEM_TYPE_MAIN:
-		switch (item->tag) {
-		case HID_MAIN_ITEM_TAG_INPUT:
-			printf("Main Input");
-			break;
-		case HID_MAIN_ITEM_TAG_OUTPUT:
-			printf("Main Output");
-			break;
-		case HID_MAIN_ITEM_TAG_FEATURE:
-			printf("Main Feature");
-			break;
-		case HID_MAIN_ITEM_TAG_BEGIN_COLLECTION:
-			printf("Main Begin Collection");
-			break;
-		case HID_MAIN_ITEM_TAG_END_COLLECTION:
-			printf("Main End Collection");
-			break;
-		default:
-			printf("Main reserved %d", item->tag);
-			break;
-		}
-		break;
-	case HID_ITEM_TYPE_GLOBAL:
-		switch (item->tag) {
-		case HID_GLOBAL_ITEM_TAG_USAGE_PAGE:
-			printf("- Global Usage Page");
-			break;
-		case HID_GLOBAL_ITEM_TAG_LOGICAL_MINIMUM:
-			printf("- Global Logical Minimum");
-			break;
-		case HID_GLOBAL_ITEM_TAG_LOGICAL_MAXIMUM:
-			printf("- Global Logical Maximum");
-			break;
-		case HID_GLOBAL_ITEM_TAG_PHYSICAL_MINIMUM:
-			printf("- Global physical Minimum");
-			break;
-		case HID_GLOBAL_ITEM_TAG_PHYSICAL_MAXIMUM:
-			printf("- Global physical Maximum");
-			break;
-		case HID_GLOBAL_ITEM_TAG_UNIT_EXPONENT:
-			printf("- Global Unit Exponent");
-			break;
-		case HID_GLOBAL_ITEM_TAG_UNIT:
-			printf("- Global Unit");
-			break;
-		case HID_GLOBAL_ITEM_TAG_REPORT_SIZE:
-			printf("- Global Report Size");
-			break;
-		case HID_GLOBAL_ITEM_TAG_REPORT_ID:
-			printf("- Global Report ID");
-			break;
-		case HID_GLOBAL_ITEM_TAG_REPORT_COUNT:
-			printf("- Global Report Count");
-			break;
-		case HID_GLOBAL_ITEM_TAG_PUSH:
-			printf("- Global Push");
-			break;
-		case HID_GLOBAL_ITEM_TAG_POP:
-			printf("- Global Pop");
-			break;
-		default:
-			printf("- Global reserved %d", item->tag);
-			break;
-		}
-		break;
-	case HID_ITEM_TYPE_LOCAL:
-		switch (item->tag) {
-		case HID_LOCAL_ITEM_TAG_USAGE:
-			printf("-- Local Usage");
-			break;
-		case HID_LOCAL_ITEM_TAG_USAGE_MINIMUM:
-			printf("-- Local Usage Minimum");
-			break;
-		case HID_LOCAL_ITEM_TAG_USAGE_MAXIMUM:
-			printf("-- Local Usage Maximum");
-			break;
-		case HID_LOCAL_ITEM_TAG_DESIGNATOR_INDEX:
-			printf("-- Local Designator Index");
-			break;
-		case HID_LOCAL_ITEM_TAG_DESIGNATOR_MINIMUM:
-			printf("-- Local Designator Minimum");
-			break;
-		case HID_LOCAL_ITEM_TAG_DESIGNATOR_MAXIMUM:
-			printf("-- Local Designator Maximum");
-			break;
-		case HID_LOCAL_ITEM_TAG_STRING_INDEX:
-			printf("-- Local String Index");
-			break;
-		case HID_LOCAL_ITEM_TAG_STRING_MINIMUM:
-			printf("-- Local String Minimum");
-			break;
-		case HID_LOCAL_ITEM_TAG_STRING_MAXIMUM:
-			printf("-- Local String Maximum");
-			break;
-		case HID_LOCAL_ITEM_TAG_DELIMITER:
-			printf("-- Local Delimiter");
-			break;
-		default:
-			printf("-- Local reserved %d", item->tag);
-			break;
-		}
-		break;
-	default:
-		printf("--- reserved %d", item->type);
-		break;
-	}
-	switch (item->size) {
-	case 1:
-		printf("  %d", item->data.u8);
-		break;
-	case 2:
-		printf("  %d", item->data.u16);
-		break;
-	case 4:
-		printf("  %ld", item->data.u32);
-		break;
-	}
-	printf("\n");
-}
-
-
-static int usb_kbd_get_hid_desc(struct usb_device *dev)
-{
-	unsigned char buffer[256];
-	struct usb_descriptor_header *head;
-	struct usb_config_descriptor *config;
-	int index, len, i;
-	unsigned char *start, *end;
-	struct hid_item item;
-
-	if (usb_get_configuration_no(dev, &buffer[0], 0) == -1)
-		return -1;
-	head = (struct usb_descriptor_header *)&buffer[0];
-	if (head->bDescriptorType != USB_DT_CONFIG) {
-		printf(" ERROR: NOT USB_CONFIG_DESC %x\n",
-				head->bDescriptorType);
-		return -1;
-	}
-	index = head->bLength;
-	config = (struct usb_config_descriptor *)&buffer[0];
-	len = le16_to_cpu(config->wTotalLength);
-	/*
-	 * Ok the first entry must be a configuration entry,
-	 * now process the others
-	 */
-	head = (struct usb_descriptor_header *)&buffer[index];
-	while (index+1 < len) {
-		if (head->bDescriptorType == USB_DT_HID) {
-			printf("HID desc found\n");
-			memcpy(&usb_kbd_hid_desc, &buffer[index],
-					buffer[index]);
-			le16_to_cpus(&usb_kbd_hid_desc.bcdHID);
-			le16_to_cpus(&usb_kbd_hid_desc.wDescriptorLength);
-			usb_kbd_display_hid(&usb_kbd_hid_desc);
-			len = 0;
-			break;
-		}
-		index += head->bLength;
-		head = (struct usb_descriptor_header *)&buffer[index];
-	}
-	if (len > 0)
-		return -1;
-	len = usb_kbd_hid_desc.wDescriptorLength;
-	index = usb_get_class_descriptor(dev, 0, USB_DT_REPORT, 0, &buffer[0],
-						len);
-	if (index < 0) {
-		printf("reading report descriptor failed\n");
-		return -1;
-	}
-	printf(" report descriptor (size %u, read %d)\n", len, index);
-	start = &buffer[0];
-	end = &buffer[len];
-	i = 0;
-	do {
-		index = fetch_item(start, end, &item);
-		i += index;
-		i++;
-		if (index >= 0)
-			usb_kbd_show_item(&item);
-
-		start += index;
-		start++;
-	} while (index >= 0);
-
-}
-
-#endif
-- 
1.7.6.3

^ permalink raw reply related	[flat|nested] 14+ messages in thread

* [U-Boot] [PATCH 1/3] USB: Squash checkpatch warnings in usb_kbd.c
  2011-10-10 15:34 ` [U-Boot] [PATCH 1/3] USB: Squash checkpatch warnings in usb_kbd.c Marek Vasut
@ 2011-10-10 18:23   ` Mike Frysinger
  2011-12-09  9:29   ` Wolfgang Denk
  1 sibling, 0 replies; 14+ messages in thread
From: Mike Frysinger @ 2011-10-10 18:23 UTC (permalink / raw)
  To: u-boot

Acked-by: Mike Frysinger <vapier@gentoo.org>
-mike
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 836 bytes
Desc: This is a digitally signed message part.
Url : http://lists.denx.de/pipermail/u-boot/attachments/20111010/9b305fc8/attachment.pgp 

^ permalink raw reply	[flat|nested] 14+ messages in thread

* [U-Boot] [PATCH 2/3] USB: Rework usb_kbd.c
  2011-10-10 15:34 ` [U-Boot] [PATCH 2/3] USB: Rework usb_kbd.c Marek Vasut
@ 2011-10-10 18:24   ` Mike Frysinger
  2011-10-10 18:33     ` Marek Vasut
  0 siblings, 1 reply; 14+ messages in thread
From: Mike Frysinger @ 2011-10-10 18:24 UTC (permalink / raw)
  To: u-boot

On Monday 10 October 2011 11:34:26 Marek Vasut wrote:
> --- a/common/usb_kbd.c
> +++ b/common/usb_kbd.c
>
> -#undef USB_KBD_DEBUG
> +#ifdef	USB_KBD_DEBUG
> +#define USB_KBD_PRINTF(fmt, args...)	printf(fmt, ##args)
> +#else
> +#define USB_KBD_PRINTF(fmt, args...)
> +#endif

could we possibly just get rid of USB_KBD_PRINTF() altogether ?  delete this 
chunk and convert everything else to debug() ?
-mike
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 836 bytes
Desc: This is a digitally signed message part.
Url : http://lists.denx.de/pipermail/u-boot/attachments/20111010/e3394298/attachment.pgp 

^ permalink raw reply	[flat|nested] 14+ messages in thread

* [U-Boot] [PATCH 3/3] USB: Drop dead code from usb_kbd.c
  2011-10-10 15:34 ` [U-Boot] [PATCH 3/3] USB: Drop dead code from usb_kbd.c Marek Vasut
@ 2011-10-10 18:25   ` Mike Frysinger
  0 siblings, 0 replies; 14+ messages in thread
From: Mike Frysinger @ 2011-10-10 18:25 UTC (permalink / raw)
  To: u-boot

Acked-by: Mike Frysinger <vapier@gentoo.org>
-mike
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 836 bytes
Desc: This is a digitally signed message part.
Url : http://lists.denx.de/pipermail/u-boot/attachments/20111010/25472042/attachment.pgp 

^ permalink raw reply	[flat|nested] 14+ messages in thread

* [U-Boot] [PATCH 2/3] USB: Rework usb_kbd.c
  2011-10-10 18:24   ` Mike Frysinger
@ 2011-10-10 18:33     ` Marek Vasut
  2011-10-10 18:45       ` Mike Frysinger
  0 siblings, 1 reply; 14+ messages in thread
From: Marek Vasut @ 2011-10-10 18:33 UTC (permalink / raw)
  To: u-boot

On Monday, October 10, 2011 08:24:48 PM Mike Frysinger wrote:
> On Monday 10 October 2011 11:34:26 Marek Vasut wrote:
> > --- a/common/usb_kbd.c
> > +++ b/common/usb_kbd.c
> > 
> > -#undef USB_KBD_DEBUG
> > +#ifdef	USB_KBD_DEBUG
> > +#define USB_KBD_PRINTF(fmt, args...)	printf(fmt, ##args)
> > +#else
> > +#define USB_KBD_PRINTF(fmt, args...)
> > +#endif
> 
> could we possibly just get rid of USB_KBD_PRINTF() altogether ?  delete
> this chunk and convert everything else to debug() ?
> -mike

I'll squash all these in the subsequence "gcc4.6, rework debug()" macro patch.

^ permalink raw reply	[flat|nested] 14+ messages in thread

* [U-Boot] [PATCH 2/3] USB: Rework usb_kbd.c
  2011-10-10 18:33     ` Marek Vasut
@ 2011-10-10 18:45       ` Mike Frysinger
  2011-10-14 15:50         ` Marek Vasut
  0 siblings, 1 reply; 14+ messages in thread
From: Mike Frysinger @ 2011-10-10 18:45 UTC (permalink / raw)
  To: u-boot

On Monday 10 October 2011 14:33:47 Marek Vasut wrote:
> On Monday, October 10, 2011 08:24:48 PM Mike Frysinger wrote:
> > On Monday 10 October 2011 11:34:26 Marek Vasut wrote:
> > > --- a/common/usb_kbd.c
> > > +++ b/common/usb_kbd.c
> > > 
> > > -#undef USB_KBD_DEBUG
> > > +#ifdef	USB_KBD_DEBUG
> > > +#define USB_KBD_PRINTF(fmt, args...)	printf(fmt, ##args)
> > > +#else
> > > +#define USB_KBD_PRINTF(fmt, args...)
> > > +#endif
> > 
> > could we possibly just get rid of USB_KBD_PRINTF() altogether ?  delete
> > this chunk and convert everything else to debug() ?
> 
> I'll squash all these in the subsequence "gcc4.6, rework debug()" macro
> patch.

WFM

Acked-by: Mike Frysinger <vapier@gentoo.org>
-mike
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 836 bytes
Desc: This is a digitally signed message part.
Url : http://lists.denx.de/pipermail/u-boot/attachments/20111010/cf4804c1/attachment.pgp 

^ permalink raw reply	[flat|nested] 14+ messages in thread

* [U-Boot] [PATCH 2/3] USB: Rework usb_kbd.c
  2011-10-10 18:45       ` Mike Frysinger
@ 2011-10-14 15:50         ` Marek Vasut
  0 siblings, 0 replies; 14+ messages in thread
From: Marek Vasut @ 2011-10-14 15:50 UTC (permalink / raw)
  To: u-boot

On Monday, October 10, 2011 08:45:05 PM Mike Frysinger wrote:
> On Monday 10 October 2011 14:33:47 Marek Vasut wrote:
> > On Monday, October 10, 2011 08:24:48 PM Mike Frysinger wrote:
> > > On Monday 10 October 2011 11:34:26 Marek Vasut wrote:
> > > > --- a/common/usb_kbd.c
> > > > +++ b/common/usb_kbd.c
> > > > 
> > > > -#undef USB_KBD_DEBUG
> > > > +#ifdef	USB_KBD_DEBUG
> > > > +#define USB_KBD_PRINTF(fmt, args...)	printf(fmt, ##args)
> > > > +#else
> > > > +#define USB_KBD_PRINTF(fmt, args...)
> > > > +#endif
> > > 
> > > could we possibly just get rid of USB_KBD_PRINTF() altogether ?  delete
> > > this chunk and convert everything else to debug() ?
> > 
> > I'll squash all these in the subsequence "gcc4.6, rework debug()" macro
> > patch.
> 
> WFM
> 
> Acked-by: Mike Frysinger <vapier@gentoo.org>
> -mike

Remy, bump ?

^ permalink raw reply	[flat|nested] 14+ messages in thread

* [U-Boot] [PATCH 0/3] USB keyboard driver rework (round 2)
  2011-10-10 15:34 [U-Boot] [PATCH 0/3] USB keyboard driver rework (round 2) Marek Vasut
                   ` (2 preceding siblings ...)
  2011-10-10 15:34 ` [U-Boot] [PATCH 3/3] USB: Drop dead code from usb_kbd.c Marek Vasut
@ 2011-11-26 21:52 ` Remy Bohmer
  3 siblings, 0 replies; 14+ messages in thread
From: Remy Bohmer @ 2011-11-26 21:52 UTC (permalink / raw)
  To: u-boot

Hi,

2011/10/10 Marek Vasut <marek.vasut@gmail.com>:
> This series reworks the common/usb_kbd.c driver. The code in the driver was
> messy so this is mostly cleanup and reorganisation.
>
> NOTE: I don't consider it a V2 of the previous series because the patch 1/2 from
> the old series is no longer present and there were also some changes in the dead
> code introduced by this series (coding style fixes).
>
> This depends on previous patches:
>
> [PATCH V2] USB: Add functionality to poll the USB keyboard via control EP
> Message-Id: <1316977237-8709-1-git-send-email-marek.vasut@gmail.com>
>
> [PATCH V2] USB: Add usb_event_poll() to get keyboards working with EHCI
> Message-Id: <1316977676-10284-1-git-send-email-marek.vasut@gmail.com>
>
> Cc: Mike Frysinger <vapier@gentoo.org>
> Cc: Remy Bohmer <linux@bohmer.net>
> Cc: Wolfgang Denk <wd@denx.de>
>
> Marek Vasut (3):
> ?USB: Squash checkpatch warnings in usb_kbd.c
> ?USB: Rework usb_kbd.c
> ?USB: Drop dead code from usb_kbd.c

Applied to u-boot-usb.
Thanks.

Kind regards,

Remy

^ permalink raw reply	[flat|nested] 14+ messages in thread

* [U-Boot] [PATCH 1/3] USB: Squash checkpatch warnings in usb_kbd.c
  2011-10-10 15:34 ` [U-Boot] [PATCH 1/3] USB: Squash checkpatch warnings in usb_kbd.c Marek Vasut
  2011-10-10 18:23   ` Mike Frysinger
@ 2011-12-09  9:29   ` Wolfgang Denk
  2011-12-09 11:11     ` [U-Boot] [PATCH] common/usb_kbd.c: fix bug introduced in commit 00b7d6e Wolfgang Denk
  1 sibling, 1 reply; 14+ messages in thread
From: Wolfgang Denk @ 2011-12-09  9:29 UTC (permalink / raw)
  To: u-boot

Dear Marek Vasut,

In message <1318260867-5606-2-git-send-email-marek.vasut@gmail.com> you wrote:
> Signed-off-by: Marek Vasut <marek.vasut@gmail.com>
> Cc: Mike Frysinger <vapier@gentoo.org>
> Cc: Remy Bohmer <linux@bohmer.net>
> Cc: Wolfgang Denk <wd@denx.de>
> ---
>  common/usb_kbd.c |  608 ++++++++++++++++++++++++++++--------------------------
>  1 files changed, 319 insertions(+), 289 deletions(-)

Applied (after rebasing to current code), thanks.

Remy, I hope this is OK with you. Thanks.

Best regards,

Wolfgang Denk

-- 
DENX Software Engineering GmbH,     MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: (+49)-8142-66989-10 Fax: (+49)-8142-66989-80 Email: wd at denx.de
[Braddock:] Mr. Churchill, you are drunk.
[Churchill:] And you madam, are ugly.  But I shall be sober tomorrow.

^ permalink raw reply	[flat|nested] 14+ messages in thread

* [U-Boot] [PATCH] common/usb_kbd.c: fix bug introduced in commit 00b7d6e
  2011-12-09  9:29   ` Wolfgang Denk
@ 2011-12-09 11:11     ` Wolfgang Denk
  2011-12-10 22:07       ` Wolfgang Denk
  0 siblings, 1 reply; 14+ messages in thread
From: Wolfgang Denk @ 2011-12-09 11:11 UTC (permalink / raw)
  To: u-boot

During the rebase of commit 00b7d6e "USB: Squash checkpatch warnings
in usb_kbd.c" I missed a brace, resulting in a number of build errors.
Fix these.

Signed-off-by: Wolfgang Denk <wd@denx.de>
---
 common/usb_kbd.c |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/common/usb_kbd.c b/common/usb_kbd.c
index dbdfe0d..69939f0 100644
--- a/common/usb_kbd.c
+++ b/common/usb_kbd.c
@@ -133,7 +133,7 @@ static int usb_kbd_testc(void)
 static int usb_kbd_getc(void)
 {
 	char c;
-	while (usb_in_pointer == usb_out_pointer)
+	while (usb_in_pointer == usb_out_pointer) {
 #ifdef CONFIG_SYS_USB_EVENT_POLL
 		usb_event_poll();
 #endif
-- 
1.7.7.3

^ permalink raw reply related	[flat|nested] 14+ messages in thread

* [U-Boot] [PATCH] common/usb_kbd.c: fix bug introduced in commit 00b7d6e
  2011-12-09 11:11     ` [U-Boot] [PATCH] common/usb_kbd.c: fix bug introduced in commit 00b7d6e Wolfgang Denk
@ 2011-12-10 22:07       ` Wolfgang Denk
  0 siblings, 0 replies; 14+ messages in thread
From: Wolfgang Denk @ 2011-12-10 22:07 UTC (permalink / raw)
  To: u-boot

Dear Wolfgang Denk,

In message <1323429107-26670-1-git-send-email-wd@denx.de> you wrote:
> During the rebase of commit 00b7d6e "USB: Squash checkpatch warnings
> in usb_kbd.c" I missed a brace, resulting in a number of build errors.
> Fix these.
> 
> Signed-off-by: Wolfgang Denk <wd@denx.de>
> ---
>  common/usb_kbd.c |    2 +-
>  1 files changed, 1 insertions(+), 1 deletions(-)

Applied, thanks.

Best regards,

Wolfgang Denk

-- 
DENX Software Engineering GmbH,     MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: (+49)-8142-66989-10 Fax: (+49)-8142-66989-80 Email: wd at denx.de
"Life is a garment we continuously alter, but which  never  seems  to
fit."                                                  - David McCord

^ permalink raw reply	[flat|nested] 14+ messages in thread

end of thread, other threads:[~2011-12-10 22:07 UTC | newest]

Thread overview: 14+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2011-10-10 15:34 [U-Boot] [PATCH 0/3] USB keyboard driver rework (round 2) Marek Vasut
2011-10-10 15:34 ` [U-Boot] [PATCH 1/3] USB: Squash checkpatch warnings in usb_kbd.c Marek Vasut
2011-10-10 18:23   ` Mike Frysinger
2011-12-09  9:29   ` Wolfgang Denk
2011-12-09 11:11     ` [U-Boot] [PATCH] common/usb_kbd.c: fix bug introduced in commit 00b7d6e Wolfgang Denk
2011-12-10 22:07       ` Wolfgang Denk
2011-10-10 15:34 ` [U-Boot] [PATCH 2/3] USB: Rework usb_kbd.c Marek Vasut
2011-10-10 18:24   ` Mike Frysinger
2011-10-10 18:33     ` Marek Vasut
2011-10-10 18:45       ` Mike Frysinger
2011-10-14 15:50         ` Marek Vasut
2011-10-10 15:34 ` [U-Boot] [PATCH 3/3] USB: Drop dead code from usb_kbd.c Marek Vasut
2011-10-10 18:25   ` Mike Frysinger
2011-11-26 21:52 ` [U-Boot] [PATCH 0/3] USB keyboard driver rework (round 2) Remy Bohmer

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.