usb.c 26.7 KB
Newer Older
W
wdenk 已提交
1 2 3
/*
 *
 * Most of this source has been derived from the Linux USB
4 5 6 7 8 9 10 11 12 13 14 15 16
 * project:
 * (C) Copyright Linus Torvalds 1999
 * (C) Copyright Johannes Erdfelt 1999-2001
 * (C) Copyright Andreas Gal 1999
 * (C) Copyright Gregory P. Smith 1999
 * (C) Copyright Deti Fliegl 1999 (new USB architecture)
 * (C) Copyright Randy Dunlap 2000
 * (C) Copyright David Brownell 2000 (kernel hotplug, usb_device_id)
 * (C) Copyright Yggdrasil Computing, Inc. 2000
 *     (usb_device_id matching changes by Adam J. Richter)
 *
 * Adapted for U-Boot:
 * (C) Copyright 2001 Denis Peter, MPL AG Switzerland
W
wdenk 已提交
17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
 *
 * See file CREDITS for list of people who contributed to this
 * project.
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License as
 * published by the Free Software Foundation; either version 2 of
 * the License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 * MA 02111-1307 USA
 *
 */

/*
 * How it works:
 *
 * Since this is a bootloader, the devices will not be automatic
 * (re)configured on hotplug, but after a restart of the USB the
 * device should work.
 *
 * For each transfer (except "Interrupt") we wait for completion.
 */
#include <common.h>
#include <command.h>
#include <asm/processor.h>
M
Mike Frysinger 已提交
50
#include <linux/compiler.h>
51
#include <linux/ctype.h>
52
#include <asm/byteorder.h>
53
#include <asm/unaligned.h>
W
wdenk 已提交
54 55 56

#include <usb.h>
#ifdef CONFIG_4xx
57
#include <asm/4xx_pci.h>
W
wdenk 已提交
58 59
#endif

60
#ifdef DEBUG
61 62
#define USB_DEBUG	1
#define USB_HUB_DEBUG	1
W
wdenk 已提交
63
#else
64 65
#define USB_DEBUG	0
#define USB_HUB_DEBUG	0
W
wdenk 已提交
66 67
#endif

68 69 70
#define USB_PRINTF(fmt, args...)	debug_cond(USB_DEBUG, fmt, ##args)
#define USB_HUB_PRINTF(fmt, args...)	debug_cond(USB_HUB_DEBUG, fmt, ##args)

W
wdenk 已提交
71 72
#define USB_BUFSIZ	512

W
wdenk 已提交
73 74 75 76 77
static struct usb_device usb_dev[USB_MAX_DEVICE];
static int dev_index;
static int running;
static int asynch_allowed;

78 79
char usb_started; /* flag for the started/stopped USB status */

W
wdenk 已提交
80 81 82
/**********************************************************************
 * some forward declerations...
 */
M
Marek Vasut 已提交
83
static void usb_scan_devices(void);
W
wdenk 已提交
84 85 86 87 88 89 90 91 92

/***************************************************************************
 * Init USB Device
 */

int usb_init(void)
{
	int result;

93 94 95
	running = 0;
	dev_index = 0;
	asynch_allowed = 1;
W
wdenk 已提交
96 97 98 99
	usb_hub_reset();
	/* init low_level USB */
	printf("USB:   ");
	result = usb_lowlevel_init();
100 101 102
	/* if lowlevel init is OK, scan the bus for devices
	 * i.e. search HUBs and configure them */
	if (result == 0) {
W
wdenk 已提交
103
		printf("scanning bus for devices... ");
104
		running = 1;
W
wdenk 已提交
105
		usb_scan_devices();
106
		usb_started = 1;
W
wdenk 已提交
107
		return 0;
108
	} else {
W
wdenk 已提交
109
		printf("Error, couldn't init Lowlevel part\n");
110
		usb_started = 0;
W
wdenk 已提交
111 112 113 114 115 116 117 118 119
		return -1;
	}
}

/******************************************************************************
 * Stop USB this stops the LowLevel Part and deregisters USB devices.
 */
int usb_stop(void)
{
120 121 122 123 124 125 126 127 128
	int res = 0;

	if (usb_started) {
		asynch_allowed = 1;
		usb_started = 0;
		usb_hub_reset();
		res = usb_lowlevel_stop();
	}
	return res;
W
wdenk 已提交
129 130 131 132 133
}

/*
 * disables the asynch behaviour of the control message. This is used for data
 * transfers that uses the exclusiv access to the control and bulk messages.
134
 * Returns the old value so it can be restored later.
W
wdenk 已提交
135
 */
136
int usb_disable_asynch(int disable)
W
wdenk 已提交
137
{
138 139
	int old_value = asynch_allowed;

140
	asynch_allowed = !disable;
141
	return old_value;
W
wdenk 已提交
142 143 144 145 146 147 148 149 150 151 152 153
}


/*-------------------------------------------------------------------
 * Message wrappers.
 *
 */

/*
 * submits an Interrupt Message
 */
int usb_submit_int_msg(struct usb_device *dev, unsigned long pipe,
154
			void *buffer, int transfer_len, int interval)
W
wdenk 已提交
155
{
156
	return submit_int_msg(dev, pipe, buffer, transfer_len, interval);
W
wdenk 已提交
157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172
}

/*
 * submits a control message and waits for comletion (at least timeout * 1ms)
 * If timeout is 0, we don't wait for completion (used as example to set and
 * clear keyboards LEDs). For data transfers, (storage transfers) we don't
 * allow control messages with 0 timeout, by previousely resetting the flag
 * asynch_allowed (usb_disable_asynch(1)).
 * returns the transfered length if OK or -1 if error. The transfered length
 * and the current status are stored in the dev->act_len and dev->status.
 */
int usb_control_msg(struct usb_device *dev, unsigned int pipe,
			unsigned char request, unsigned char requesttype,
			unsigned short value, unsigned short index,
			void *data, unsigned short size, int timeout)
{
173 174
	struct devrequest setup_packet;

175 176
	if ((timeout == 0) && (!asynch_allowed)) {
		/* request for a asynch control pipe is not allowed */
W
wdenk 已提交
177
		return -1;
178
	}
179

W
wdenk 已提交
180 181 182
	/* set setup command */
	setup_packet.requesttype = requesttype;
	setup_packet.request = request;
183 184 185
	setup_packet.value = cpu_to_le16(value);
	setup_packet.index = cpu_to_le16(index);
	setup_packet.length = cpu_to_le16(size);
186 187 188 189
	USB_PRINTF("usb_control_msg: request: 0x%X, requesttype: 0x%X, " \
		   "value 0x%X index 0x%X length 0x%X\n",
		   request, requesttype, value, index, size);
	dev->status = USB_ST_NOT_PROC; /*not yet processed */
W
wdenk 已提交
190

191 192
	submit_control_msg(dev, pipe, data, size, &setup_packet);
	if (timeout == 0)
W
wdenk 已提交
193
		return (int)size;
194

195 196 197 198 199 200 201 202
	/*
	 * Wait for status to update until timeout expires, USB driver
	 * interrupt handler may set the status when the USB operation has
	 * been completed.
	 */
	while (timeout--) {
		if (!((volatile unsigned long)dev->status & USB_ST_NOT_PROC))
			break;
203
		mdelay(1);
R
Remy Bohmer 已提交
204
	}
205 206
	if (dev->status)
		return -1;
R
Remy Bohmer 已提交
207 208

	return dev->act_len;
209

W
wdenk 已提交
210 211 212 213 214 215 216 217 218 219 220 221
}

/*-------------------------------------------------------------------
 * submits bulk message, and waits for completion. returns 0 if Ok or
 * -1 if Error.
 * synchronous behavior
 */
int usb_bulk_msg(struct usb_device *dev, unsigned int pipe,
			void *data, int len, int *actual_length, int timeout)
{
	if (len < 0)
		return -1;
222 223 224 225
	dev->status = USB_ST_NOT_PROC; /*not yet processed */
	submit_bulk_msg(dev, pipe, data, len);
	while (timeout--) {
		if (!((volatile unsigned long)dev->status & USB_ST_NOT_PROC))
W
wdenk 已提交
226
			break;
227
		mdelay(1);
W
wdenk 已提交
228
	}
229 230
	*actual_length = dev->act_len;
	if (dev->status == 0)
W
wdenk 已提交
231 232 233 234 235 236 237 238 239 240 241 242 243 244
		return 0;
	else
		return -1;
}


/*-------------------------------------------------------------------
 * Max Packet stuff
 */

/*
 * returns the max packet size, depending on the pipe direction and
 * the configurations values
 */
245
int usb_maxpacket(struct usb_device *dev, unsigned long pipe)
W
wdenk 已提交
246
{
247 248
	/* direction is out -> use emaxpacket out */
	if ((pipe & USB_DIR_IN) == 0)
249
		return dev->epmaxpacketout[((pipe>>15) & 0xf)];
W
wdenk 已提交
250
	else
251
		return dev->epmaxpacketin[((pipe>>15) & 0xf)];
W
wdenk 已提交
252 253
}

M
Marek Vasut 已提交
254 255
/*
 * The routine usb_set_maxpacket_ep() is extracted from the loop of routine
256 257 258 259 260 261
 * usb_set_maxpacket(), because the optimizer of GCC 4.x chokes on this routine
 * when it is inlined in 1 single routine. What happens is that the register r3
 * is used as loop-count 'i', but gets overwritten later on.
 * This is clearly a compiler bug, but it is easier to workaround it here than
 * to update the compiler (Occurs with at least several GCC 4.{1,2},x
 * CodeSourcery compilers like e.g. 2007q3, 2008q1, 2008q3 lite editions on ARM)
M
Marek Vasut 已提交
262 263
 *
 * NOTE: Similar behaviour was observed with GCC4.6 on ARMv5.
264
 */
M
Mike Frysinger 已提交
265
static void noinline
M
Marek Vasut 已提交
266
usb_set_maxpacket_ep(struct usb_device *dev, int if_idx, int ep_idx)
267 268
{
	int b;
M
Marek Vasut 已提交
269
	struct usb_endpoint_descriptor *ep;
270
	u16 ep_wMaxPacketSize;
M
Marek Vasut 已提交
271 272

	ep = &dev->config.if_desc[if_idx].ep_desc[ep_idx];
273 274

	b = ep->bEndpointAddress & USB_ENDPOINT_NUMBER_MASK;
275
	ep_wMaxPacketSize = get_unaligned(&ep->wMaxPacketSize);
276 277 278 279

	if ((ep->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) ==
						USB_ENDPOINT_XFER_CONTROL) {
		/* Control => bidirectional */
280 281
		dev->epmaxpacketout[b] = ep_wMaxPacketSize;
		dev->epmaxpacketin[b] = ep_wMaxPacketSize;
282 283 284 285 286
		USB_PRINTF("##Control EP epmaxpacketout/in[%d] = %d\n",
			   b, dev->epmaxpacketin[b]);
	} else {
		if ((ep->bEndpointAddress & 0x80) == 0) {
			/* OUT Endpoint */
287 288
			if (ep_wMaxPacketSize > dev->epmaxpacketout[b]) {
				dev->epmaxpacketout[b] = ep_wMaxPacketSize;
289 290 291 292 293
				USB_PRINTF("##EP epmaxpacketout[%d] = %d\n",
					   b, dev->epmaxpacketout[b]);
			}
		} else {
			/* IN Endpoint */
294 295
			if (ep_wMaxPacketSize > dev->epmaxpacketin[b]) {
				dev->epmaxpacketin[b] = ep_wMaxPacketSize;
296 297 298 299 300 301 302
				USB_PRINTF("##EP epmaxpacketin[%d] = %d\n",
					   b, dev->epmaxpacketin[b]);
			}
		} /* if out */
	} /* if control */
}

W
wdenk 已提交
303 304 305
/*
 * set the max packed value of all endpoints in the given configuration
 */
M
Marek Vasut 已提交
306
static int usb_set_maxpacket(struct usb_device *dev)
W
wdenk 已提交
307
{
308
	int i, ii;
W
wdenk 已提交
309

T
Tom Rix 已提交
310 311
	for (i = 0; i < dev->config.desc.bNumInterfaces; i++)
		for (ii = 0; ii < dev->config.if_desc[i].desc.bNumEndpoints; ii++)
M
Marek Vasut 已提交
312
			usb_set_maxpacket_ep(dev, i, ii);
W
wdenk 已提交
313 314 315 316 317 318 319 320

	return 0;
}

/*******************************************************************************
 * Parse the config, located in buffer, and fills the dev->config structure.
 * Note that all little/big endian swapping are done automatically.
 */
M
Marek Vasut 已提交
321 322
static int usb_parse_config(struct usb_device *dev,
			unsigned char *buffer, int cfgno)
W
wdenk 已提交
323 324
{
	struct usb_descriptor_header *head;
325 326
	int index, ifno, epno, curr_if_num;
	int i;
327
	u16 ep_wMaxPacketSize;
328 329 330 331 332 333 334

	ifno = -1;
	epno = -1;
	curr_if_num = -1;

	dev->configno = cfgno;
	head = (struct usb_descriptor_header *) &buffer[0];
335 336 337
	if (head->bDescriptorType != USB_DT_CONFIG) {
		printf(" ERROR: NOT USB_CONFIG_DESC %x\n",
			head->bDescriptorType);
W
wdenk 已提交
338 339
		return -1;
	}
340
	memcpy(&dev->config, buffer, buffer[0]);
T
Tom Rix 已提交
341
	le16_to_cpus(&(dev->config.desc.wTotalLength));
342
	dev->config.no_of_if = 0;
W
wdenk 已提交
343

T
Tom Rix 已提交
344
	index = dev->config.desc.bLength;
345 346
	/* Ok the first entry must be a configuration entry,
	 * now process the others */
347
	head = (struct usb_descriptor_header *) &buffer[index];
T
Tom Rix 已提交
348
	while (index + 1 < dev->config.desc.wTotalLength) {
349 350 351 352 353 354 355 356
		switch (head->bDescriptorType) {
		case USB_DT_INTERFACE:
			if (((struct usb_interface_descriptor *) \
			     &buffer[index])->bInterfaceNumber != curr_if_num) {
				/* this is a new interface, copy new desc */
				ifno = dev->config.no_of_if;
				dev->config.no_of_if++;
				memcpy(&dev->config.if_desc[ifno],
357
					&buffer[index], buffer[index]);
358 359 360
				dev->config.if_desc[ifno].no_of_ep = 0;
				dev->config.if_desc[ifno].num_altsetting = 1;
				curr_if_num =
T
Tom Rix 已提交
361
				     dev->config.if_desc[ifno].desc.bInterfaceNumber;
362 363 364 365 366 367 368 369 370 371 372
			} else {
				/* found alternate setting for the interface */
				dev->config.if_desc[ifno].num_altsetting++;
			}
			break;
		case USB_DT_ENDPOINT:
			epno = dev->config.if_desc[ifno].no_of_ep;
			/* found an endpoint */
			dev->config.if_desc[ifno].no_of_ep++;
			memcpy(&dev->config.if_desc[ifno].ep_desc[epno],
				&buffer[index], buffer[index]);
373 374 375 376 377 378 379 380 381
			ep_wMaxPacketSize = get_unaligned(&dev->config.\
							if_desc[ifno].\
							ep_desc[epno].\
							wMaxPacketSize);
			put_unaligned(le16_to_cpu(ep_wMaxPacketSize),
					&dev->config.\
					if_desc[ifno].\
					ep_desc[epno].\
					wMaxPacketSize);
382 383 384 385 386 387 388 389 390 391
			USB_PRINTF("if %d, ep %d\n", ifno, epno);
			break;
		default:
			if (head->bLength == 0)
				return 1;

			USB_PRINTF("unknown Description Type : %x\n",
				   head->bDescriptorType);

			{
392 393 394
#ifdef USB_DEBUG
				unsigned char *ch = (unsigned char *)head;
#endif
395 396 397 398 399
				for (i = 0; i < head->bLength; i++)
					USB_PRINTF("%02X ", *ch++);
				USB_PRINTF("\n\n\n");
			}
			break;
W
wdenk 已提交
400
		}
401 402
		index += head->bLength;
		head = (struct usb_descriptor_header *)&buffer[index];
W
wdenk 已提交
403 404 405 406 407 408 409 410 411 412 413 414
	}
	return 1;
}

/***********************************************************************
 * Clears an endpoint
 * endp: endpoint number in bits 0-3;
 * direction flag in bit 7 (1 = IN, 0 = OUT)
 */
int usb_clear_halt(struct usb_device *dev, int pipe)
{
	int result;
415
	int endp = usb_pipeendpoint(pipe)|(usb_pipein(pipe)<<7);
W
wdenk 已提交
416 417

	result = usb_control_msg(dev, usb_sndctrlpipe(dev, 0),
418 419
				 USB_REQ_CLEAR_FEATURE, USB_RECIP_ENDPOINT, 0,
				 endp, NULL, 0, USB_CNTL_TIMEOUT * 3);
W
wdenk 已提交
420 421 422 423

	/* don't clear if failed */
	if (result < 0)
		return result;
424

W
Wolfgang Denk 已提交
425
	/*
426 427 428 429
	 * NOTE: we do not get status and verify reset was successful
	 * as some devices are reported to lock up upon this check..
	 */

W
wdenk 已提交
430
	usb_endpoint_running(dev, usb_pipeendpoint(pipe), usb_pipeout(pipe));
431

W
wdenk 已提交
432 433 434 435 436 437 438 439 440
	/* toggle is reset on clear */
	usb_settoggle(dev, usb_pipeendpoint(pipe), usb_pipeout(pipe), 0);
	return 0;
}


/**********************************************************************
 * get_descriptor type
 */
M
Marek Vasut 已提交
441
static int usb_get_descriptor(struct usb_device *dev, unsigned char type,
442
			unsigned char index, void *buf, int size)
W
wdenk 已提交
443 444
{
	int res;
W
Wolfgang Denk 已提交
445
	res = usb_control_msg(dev, usb_rcvctrlpipe(dev, 0),
W
wdenk 已提交
446 447 448 449 450 451 452 453 454
			USB_REQ_GET_DESCRIPTOR, USB_DIR_IN,
			(type << 8) + index, 0,
			buf, size, USB_CNTL_TIMEOUT);
	return res;
}

/**********************************************************************
 * gets configuration cfgno and store it in the buffer
 */
455 456
int usb_get_configuration_no(struct usb_device *dev,
			     unsigned char *buffer, int cfgno)
W
wdenk 已提交
457
{
W
Wolfgang Denk 已提交
458
	int result;
W
wdenk 已提交
459
	unsigned int tmp;
T
Tom Rix 已提交
460
	struct usb_configuration_descriptor *config;
W
wdenk 已提交
461

T
Tom Rix 已提交
462
	config = (struct usb_configuration_descriptor *)&buffer[0];
R
Remy Bohmer 已提交
463 464
	result = usb_get_descriptor(dev, USB_DT_CONFIG, cfgno, buffer, 9);
	if (result < 9) {
W
wdenk 已提交
465
		if (result < 0)
466 467
			printf("unable to get descriptor, error %lX\n",
				dev->status);
W
wdenk 已提交
468
		else
469
			printf("config descriptor too short " \
R
Remy Bohmer 已提交
470
				"(expected %i, got %i)\n", 9, result);
W
wdenk 已提交
471 472
		return -1;
	}
473
	tmp = le16_to_cpu(config->wTotalLength);
W
wdenk 已提交
474

W
wdenk 已提交
475
	if (tmp > USB_BUFSIZ) {
476 477
		USB_PRINTF("usb_get_configuration_no: failed to get " \
			   "descriptor - too long: %d\n", tmp);
W
wdenk 已提交
478 479 480
		return -1;
	}

W
wdenk 已提交
481
	result = usb_get_descriptor(dev, USB_DT_CONFIG, cfgno, buffer, tmp);
482 483
	USB_PRINTF("get_conf_no %d Result %d, wLength %d\n",
		   cfgno, result, tmp);
W
wdenk 已提交
484 485 486 487 488 489 490
	return result;
}

/********************************************************************
 * set address of a device to the value in dev->devnum.
 * This can only be done by addressing the device via the default address (0)
 */
M
Marek Vasut 已提交
491
static int usb_set_address(struct usb_device *dev)
W
wdenk 已提交
492 493 494
{
	int res;

495 496 497 498 499
	USB_PRINTF("set address %d\n", dev->devnum);
	res = usb_control_msg(dev, usb_snddefctrl(dev),
				USB_REQ_SET_ADDRESS, 0,
				(dev->devnum), 0,
				NULL, 0, USB_CNTL_TIMEOUT);
W
wdenk 已提交
500 501 502 503 504 505 506 507
	return res;
}

/********************************************************************
 * set interface number to interface
 */
int usb_set_interface(struct usb_device *dev, int interface, int alternate)
{
T
Tom Rix 已提交
508
	struct usb_interface *if_face = NULL;
W
wdenk 已提交
509 510
	int ret, i;

T
Tom Rix 已提交
511 512
	for (i = 0; i < dev->config.desc.bNumInterfaces; i++) {
		if (dev->config.if_desc[i].desc.bInterfaceNumber == interface) {
W
wdenk 已提交
513 514 515 516 517 518 519 520
			if_face = &dev->config.if_desc[i];
			break;
		}
	}
	if (!if_face) {
		printf("selecting invalid interface %d", interface);
		return -1;
	}
521 522
	/*
	 * We should return now for devices with only one alternate setting.
523 524 525 526
	 * According to 9.4.10 of the Universal Serial Bus Specification
	 * Revision 2.0 such devices can return with a STALL. This results in
	 * some USB sticks timeouting during initialization and then being
	 * unusable in U-Boot.
527 528 529
	 */
	if (if_face->num_altsetting == 1)
		return 0;
W
wdenk 已提交
530

531 532 533 534 535
	ret = usb_control_msg(dev, usb_sndctrlpipe(dev, 0),
				USB_REQ_SET_INTERFACE, USB_RECIP_INTERFACE,
				alternate, interface, NULL, 0,
				USB_CNTL_TIMEOUT * 5);
	if (ret < 0)
W
wdenk 已提交
536 537 538 539 540 541 542 543
		return ret;

	return 0;
}

/********************************************************************
 * set configuration number to configuration
 */
M
Marek Vasut 已提交
544
static int usb_set_configuration(struct usb_device *dev, int configuration)
W
wdenk 已提交
545 546
{
	int res;
547
	USB_PRINTF("set configuration %d\n", configuration);
W
wdenk 已提交
548
	/* set setup command */
549 550 551 552 553
	res = usb_control_msg(dev, usb_sndctrlpipe(dev, 0),
				USB_REQ_SET_CONFIGURATION, 0,
				configuration, 0,
				NULL, 0, USB_CNTL_TIMEOUT);
	if (res == 0) {
W
wdenk 已提交
554 555 556
		dev->toggle[0] = 0;
		dev->toggle[1] = 0;
		return 0;
557
	} else
W
wdenk 已提交
558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583
		return -1;
}

/********************************************************************
 * set protocol to protocol
 */
int usb_set_protocol(struct usb_device *dev, int ifnum, int protocol)
{
	return usb_control_msg(dev, usb_sndctrlpipe(dev, 0),
		USB_REQ_SET_PROTOCOL, USB_TYPE_CLASS | USB_RECIP_INTERFACE,
		protocol, ifnum, NULL, 0, USB_CNTL_TIMEOUT);
}

/********************************************************************
 * set idle
 */
int usb_set_idle(struct usb_device *dev, int ifnum, int duration, int report_id)
{
	return usb_control_msg(dev, usb_sndctrlpipe(dev, 0),
		USB_REQ_SET_IDLE, USB_TYPE_CLASS | USB_RECIP_INTERFACE,
		(duration << 8) | report_id, ifnum, NULL, 0, USB_CNTL_TIMEOUT);
}

/********************************************************************
 * get report
 */
584 585
int usb_get_report(struct usb_device *dev, int ifnum, unsigned char type,
		   unsigned char id, void *buf, int size)
W
wdenk 已提交
586 587
{
	return usb_control_msg(dev, usb_rcvctrlpipe(dev, 0),
588 589 590
			USB_REQ_GET_REPORT,
			USB_DIR_IN | USB_TYPE_CLASS | USB_RECIP_INTERFACE,
			(type << 8) + id, ifnum, buf, size, USB_CNTL_TIMEOUT);
W
wdenk 已提交
591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606
}

/********************************************************************
 * get class descriptor
 */
int usb_get_class_descriptor(struct usb_device *dev, int ifnum,
		unsigned char type, unsigned char id, void *buf, int size)
{
	return usb_control_msg(dev, usb_rcvctrlpipe(dev, 0),
		USB_REQ_GET_DESCRIPTOR, USB_RECIP_INTERFACE | USB_DIR_IN,
		(type << 8) + id, ifnum, buf, size, USB_CNTL_TIMEOUT);
}

/********************************************************************
 * get string index in buffer
 */
M
Marek Vasut 已提交
607
static int usb_get_string(struct usb_device *dev, unsigned short langid,
608
		   unsigned char index, void *buf, int size)
W
wdenk 已提交
609
{
610 611 612 613 614 615 616
	int i;
	int result;

	for (i = 0; i < 3; ++i) {
		/* some devices are flaky */
		result = usb_control_msg(dev, usb_rcvctrlpipe(dev, 0),
			USB_REQ_GET_DESCRIPTOR, USB_DIR_IN,
W
Wolfgang Denk 已提交
617
			(USB_DT_STRING << 8) + index, langid, buf, size,
618 619 620 621
			USB_CNTL_TIMEOUT);

		if (result > 0)
			break;
W
Wolfgang Denk 已提交
622 623
	}

624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639
	return result;
}


static void usb_try_string_workarounds(unsigned char *buf, int *length)
{
	int newlength, oldlength = *length;

	for (newlength = 2; newlength + 1 < oldlength; newlength += 2)
		if (!isprint(buf[newlength]) || buf[newlength + 1])
			break;

	if (newlength > 2) {
		buf[0] = newlength;
		*length = newlength;
	}
W
wdenk 已提交
640 641
}

642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671

static int usb_string_sub(struct usb_device *dev, unsigned int langid,
		unsigned int index, unsigned char *buf)
{
	int rc;

	/* Try to read the string descriptor by asking for the maximum
	 * possible number of bytes */
	rc = usb_get_string(dev, langid, index, buf, 255);

	/* If that failed try to read the descriptor length, then
	 * ask for just that many bytes */
	if (rc < 2) {
		rc = usb_get_string(dev, langid, index, buf, 2);
		if (rc == 2)
			rc = usb_get_string(dev, langid, index, buf, buf[0]);
	}

	if (rc >= 2) {
		if (!buf[0] && !buf[1])
			usb_try_string_workarounds(buf, &rc);

		/* There might be extra junk at the end of the descriptor */
		if (buf[0] < rc)
			rc = buf[0];

		rc = rc - (rc & 1); /* force a multiple of two */
	}

	if (rc < 2)
W
Wolfgang Denk 已提交
672
		rc = -1;
673 674 675 676 677

	return rc;
}


W
wdenk 已提交
678 679 680 681 682 683 684
/********************************************************************
 * usb_string:
 * Get string index and translate it to ascii.
 * returns string length (> 0) or error (< 0)
 */
int usb_string(struct usb_device *dev, int index, char *buf, size_t size)
{
W
wdenk 已提交
685
	unsigned char mybuf[USB_BUFSIZ];
W
wdenk 已提交
686 687 688 689 690 691 692
	unsigned char *tbuf;
	int err;
	unsigned int u, idx;

	if (size <= 0 || !buf || !index)
		return -1;
	buf[0] = 0;
693
	tbuf = &mybuf[0];
W
wdenk 已提交
694 695 696

	/* get langid for strings if it's not yet known */
	if (!dev->have_langid) {
697
		err = usb_string_sub(dev, 0, 0, tbuf);
W
wdenk 已提交
698
		if (err < 0) {
699
			USB_PRINTF("error getting string descriptor 0 " \
700
				   "(error=%lx)\n", dev->status);
W
wdenk 已提交
701 702 703 704 705 706
			return -1;
		} else if (tbuf[0] < 4) {
			USB_PRINTF("string descriptor 0 too short\n");
			return -1;
		} else {
			dev->have_langid = -1;
707
			dev->string_langid = tbuf[2] | (tbuf[3] << 8);
W
wdenk 已提交
708
				/* always use the first langid listed */
709 710 711
			USB_PRINTF("USB device number %d default " \
				   "language ID 0x%x\n",
				   dev->devnum, dev->string_langid);
W
wdenk 已提交
712 713
		}
	}
W
wdenk 已提交
714

715
	err = usb_string_sub(dev, dev->string_langid, index, tbuf);
W
wdenk 已提交
716 717
	if (err < 0)
		return err;
718

W
wdenk 已提交
719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742
	size--;		/* leave room for trailing NULL char in output buffer */
	for (idx = 0, u = 2; u < err; u += 2) {
		if (idx >= size)
			break;
		if (tbuf[u+1])			/* high byte */
			buf[idx++] = '?';  /* non-ASCII character */
		else
			buf[idx++] = tbuf[u];
	}
	buf[idx] = 0;
	err = idx;
	return err;
}


/********************************************************************
 * USB device handling:
 * the USB device are static allocated [USB_MAX_DEVICE].
 */


/* returns a pointer to the device with the index [index].
 * if the device is not assigned (dev->devnum==-1) returns NULL
 */
743
struct usb_device *usb_get_dev_index(int index)
W
wdenk 已提交
744
{
745
	if (usb_dev[index].devnum == -1)
W
wdenk 已提交
746 747 748 749 750 751 752 753 754
		return NULL;
	else
		return &usb_dev[index];
}


/* returns a pointer of a new device structure or NULL, if
 * no device struct is available
 */
M
Marek Vasut 已提交
755
struct usb_device *usb_alloc_new_device(void)
W
wdenk 已提交
756 757
{
	int i;
758 759 760
	USB_PRINTF("New Device %d\n", dev_index);
	if (dev_index == USB_MAX_DEVICE) {
		printf("ERROR, too many USB Devices, max=%d\n", USB_MAX_DEVICE);
W
wdenk 已提交
761 762
		return NULL;
	}
763 764 765 766 767 768
	/* default Address is 0, real addresses start with 1 */
	usb_dev[dev_index].devnum = dev_index + 1;
	usb_dev[dev_index].maxchild = 0;
	for (i = 0; i < USB_MAXCHILDREN; i++)
		usb_dev[dev_index].children[i] = NULL;
	usb_dev[dev_index].parent = NULL;
W
wdenk 已提交
769
	dev_index++;
770
	return &usb_dev[dev_index - 1];
W
wdenk 已提交
771 772 773 774 775 776 777 778 779 780
}


/*
 * By the time we get here, the device has gotten a new device ID
 * and is in the default state. We need to identify the thing and
 * get the ball rolling..
 *
 * Returns 0 for success, != 0 for error.
 */
M
Marek Vasut 已提交
781
int usb_new_device(struct usb_device *dev)
W
wdenk 已提交
782 783 784
{
	int addr, err;
	int tmp;
W
wdenk 已提交
785
	unsigned char tmpbuf[USB_BUFSIZ];
W
wdenk 已提交
786 787 788 789

	/* We still haven't set the Address yet */
	addr = dev->devnum;
	dev->devnum = 0;
790

791 792 793 794 795 796 797
#ifdef CONFIG_LEGACY_USB_INIT_SEQ
	/* this is the old and known way of initializing devices, it is
	 * different than what Windows and Linux are doing. Windows and Linux
	 * both retrieve 64 bytes while reading the device descriptor
	 * Several USB stick devices report ERR: CTL_TIMEOUT, caused by an
	 * invalid header while reading 8 bytes as device descriptor. */
	dev->descriptor.bMaxPacketSize0 = 8;	    /* Start off at 8 bytes  */
R
Remy Bohmer 已提交
798
	dev->maxpacketsize = PACKET_SIZE_8;
799
	dev->epmaxpacketin[0] = 8;
800 801 802 803 804
	dev->epmaxpacketout[0] = 8;

	err = usb_get_descriptor(dev, USB_DT_DEVICE, 0, &dev->descriptor, 8);
	if (err < 8) {
		printf("\n      USB device not responding, " \
805
		       "giving up (status=%lX)\n", dev->status);
806 807 808
		return 1;
	}
#else
R
Remy Bohmer 已提交
809 810
	/* This is a Windows scheme of initialization sequence, with double
	 * reset of the device (Linux uses the same sequence)
811 812
	 * Some equipment is said to work only with such init sequence; this
	 * patch is based on the work by Alan Stern:
813 814
	 * http://sourceforge.net/mailarchive/forum.php?
	 * thread_id=5729457&forum_id=5398
815 816 817 818 819 820 821 822 823
	 */
	struct usb_device_descriptor *desc;
	int port = -1;
	struct usb_device *parent = dev->parent;
	unsigned short portstatus;

	/* send 64-byte GET-DEVICE-DESCRIPTOR request.  Since the descriptor is
	 * only 18 bytes long, this will terminate with a short packet.  But if
	 * the maxpacket size is 8 or 16 the device may be waiting to transmit
824
	 * some more, or keeps on retransmitting the 8 byte header. */
825 826

	desc = (struct usb_device_descriptor *)tmpbuf;
827
	dev->descriptor.bMaxPacketSize0 = 64;	    /* Start off at 64 bytes  */
R
Remy Bohmer 已提交
828 829
	/* Default to 64 byte max packet size */
	dev->maxpacketsize = PACKET_SIZE_64;
830
	dev->epmaxpacketin[0] = 64;
831
	dev->epmaxpacketout[0] = 64;
R
Remy Bohmer 已提交
832 833 834 835 836

	err = usb_get_descriptor(dev, USB_DT_DEVICE, 0, desc, 64);
	if (err < 0) {
		USB_PRINTF("usb_new_device: usb_get_descriptor() failed\n");
		return 1;
837
	}
R
Remy Bohmer 已提交
838

839
	dev->descriptor.bMaxPacketSize0 = desc->bMaxPacketSize0;
W
Wolfgang Denk 已提交
840

841 842
	/* find the port number we're at */
	if (parent) {
R
Remy Bohmer 已提交
843
		int j;
W
Wolfgang Denk 已提交
844

845 846 847 848 849 850 851
		for (j = 0; j < parent->maxchild; j++) {
			if (parent->children[j] == dev) {
				port = j;
				break;
			}
		}
		if (port < 0) {
852
			printf("usb_new_device:cannot locate device's port.\n");
853 854 855 856 857 858 859 860 861 862 863 864
			return 1;
		}

		/* reset the port for the second time */
		err = hub_port_reset(dev->parent, port, &portstatus);
		if (err < 0) {
			printf("\n     Couldn't reset port %i\n", port);
			return 1;
		}
	}
#endif

865
	dev->epmaxpacketin[0] = dev->descriptor.bMaxPacketSize0;
W
wdenk 已提交
866 867
	dev->epmaxpacketout[0] = dev->descriptor.bMaxPacketSize0;
	switch (dev->descriptor.bMaxPacketSize0) {
868 869 870 871 872 873 874 875 876 877 878 879
	case 8:
		dev->maxpacketsize  = PACKET_SIZE_8;
		break;
	case 16:
		dev->maxpacketsize = PACKET_SIZE_16;
		break;
	case 32:
		dev->maxpacketsize = PACKET_SIZE_32;
		break;
	case 64:
		dev->maxpacketsize = PACKET_SIZE_64;
		break;
W
wdenk 已提交
880 881 882 883 884 885
	}
	dev->devnum = addr;

	err = usb_set_address(dev); /* set address */

	if (err < 0) {
886 887
		printf("\n      USB device not accepting new address " \
			"(error=%lX)\n", dev->status);
W
wdenk 已提交
888 889 890
		return 1;
	}

891
	mdelay(10);	/* Let the SET_ADDRESS settle */
W
wdenk 已提交
892 893 894

	tmp = sizeof(dev->descriptor);

895 896
	err = usb_get_descriptor(dev, USB_DT_DEVICE, 0,
				 &dev->descriptor, sizeof(dev->descriptor));
W
wdenk 已提交
897 898
	if (err < tmp) {
		if (err < 0)
899 900
			printf("unable to get device descriptor (error=%d)\n",
			       err);
W
wdenk 已提交
901
		else
902 903
			printf("USB device descriptor short read " \
				"(expected %i, got %i)\n", tmp, err);
W
wdenk 已提交
904 905 906
		return 1;
	}
	/* correct le values */
907 908 909 910
	le16_to_cpus(&dev->descriptor.bcdUSB);
	le16_to_cpus(&dev->descriptor.idVendor);
	le16_to_cpus(&dev->descriptor.idProduct);
	le16_to_cpus(&dev->descriptor.bcdDevice);
W
wdenk 已提交
911
	/* only support for one config for now */
912 913
	usb_get_configuration_no(dev, &tmpbuf[0], 0);
	usb_parse_config(dev, &tmpbuf[0], 0);
W
wdenk 已提交
914 915
	usb_set_maxpacket(dev);
	/* we set the default configuration here */
T
Tom Rix 已提交
916
	if (usb_set_configuration(dev, dev->config.desc.bConfigurationValue)) {
917 918
		printf("failed to set default configuration " \
			"len %d, status %lX\n", dev->act_len, dev->status);
W
wdenk 已提交
919 920 921
		return -1;
	}
	USB_PRINTF("new device strings: Mfr=%d, Product=%d, SerialNumber=%d\n",
922 923
		   dev->descriptor.iManufacturer, dev->descriptor.iProduct,
		   dev->descriptor.iSerialNumber);
W
wdenk 已提交
924 925 926 927
	memset(dev->mf, 0, sizeof(dev->mf));
	memset(dev->prod, 0, sizeof(dev->prod));
	memset(dev->serial, 0, sizeof(dev->serial));
	if (dev->descriptor.iManufacturer)
928 929
		usb_string(dev, dev->descriptor.iManufacturer,
			   dev->mf, sizeof(dev->mf));
W
wdenk 已提交
930
	if (dev->descriptor.iProduct)
931 932
		usb_string(dev, dev->descriptor.iProduct,
			   dev->prod, sizeof(dev->prod));
W
wdenk 已提交
933
	if (dev->descriptor.iSerialNumber)
934 935
		usb_string(dev, dev->descriptor.iSerialNumber,
			   dev->serial, sizeof(dev->serial));
W
wdenk 已提交
936 937 938 939
	USB_PRINTF("Manufacturer %s\n", dev->mf);
	USB_PRINTF("Product      %s\n", dev->prod);
	USB_PRINTF("SerialNumber %s\n", dev->serial);
	/* now prode if the device is a hub */
940
	usb_hub_probe(dev, 0);
W
wdenk 已提交
941 942 943 944
	return 0;
}

/* build device Tree  */
M
Marek Vasut 已提交
945
static void usb_scan_devices(void)
W
wdenk 已提交
946 947 948 949 950
{
	int i;
	struct usb_device *dev;

	/* first make all devices unknown */
951 952
	for (i = 0; i < USB_MAX_DEVICE; i++) {
		memset(&usb_dev[i], 0, sizeof(struct usb_device));
953
		usb_dev[i].devnum = -1;
W
wdenk 已提交
954
	}
955
	dev_index = 0;
W
wdenk 已提交
956
	/* device 0 is always present (root hub, so let it analyze) */
957
	dev = usb_alloc_new_device();
958 959 960 961
	if (usb_new_device(dev))
		printf("No USB Device found\n");
	else
		printf("%d USB Device(s) found\n", dev_index);
W
wdenk 已提交
962 963 964 965
	/* insert "driver" if possible */
#ifdef CONFIG_USB_KEYBOARD
	drv_usb_kbd_init();
#endif
966
	USB_PRINTF("scan end\n");
W
wdenk 已提交
967 968 969
}

/* EOF */