usb.c 26.9 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>
50
#include <linux/ctype.h>
51
#include <asm/byteorder.h>
52
#include <asm/unaligned.h>
W
wdenk 已提交
53 54 55

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

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

67 68 69
#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 已提交
70 71
#define USB_BUFSIZ	512

W
wdenk 已提交
72 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;
static struct devrequest setup_packet;

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

/***********************************************************************
 * wait_ms
 */

89
inline void wait_ms(unsigned long ms)
W
wdenk 已提交
90
{
91
	while (ms-- > 0)
W
wdenk 已提交
92 93
		udelay(1000);
}
94

W
wdenk 已提交
95 96 97 98 99 100 101 102
/***************************************************************************
 * Init USB Device
 */

int usb_init(void)
{
	int result;

103 104 105
	running = 0;
	dev_index = 0;
	asynch_allowed = 1;
W
wdenk 已提交
106 107 108 109
	usb_hub_reset();
	/* init low_level USB */
	printf("USB:   ");
	result = usb_lowlevel_init();
110 111 112
	/* if lowlevel init is OK, scan the bus for devices
	 * i.e. search HUBs and configure them */
	if (result == 0) {
W
wdenk 已提交
113
		printf("scanning bus for devices... ");
114
		running = 1;
W
wdenk 已提交
115
		usb_scan_devices();
116
		usb_started = 1;
W
wdenk 已提交
117
		return 0;
118
	} else {
W
wdenk 已提交
119
		printf("Error, couldn't init Lowlevel part\n");
120
		usb_started = 0;
W
wdenk 已提交
121 122 123 124 125 126 127 128 129
		return -1;
	}
}

/******************************************************************************
 * Stop USB this stops the LowLevel Part and deregisters USB devices.
 */
int usb_stop(void)
{
130 131 132 133 134 135 136 137 138
	int res = 0;

	if (usb_started) {
		asynch_allowed = 1;
		usb_started = 0;
		usb_hub_reset();
		res = usb_lowlevel_stop();
	}
	return res;
W
wdenk 已提交
139 140 141 142 143
}

/*
 * 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.
144
 * Returns the old value so it can be restored later.
W
wdenk 已提交
145
 */
146
int usb_disable_asynch(int disable)
W
wdenk 已提交
147
{
148 149
	int old_value = asynch_allowed;

150
	asynch_allowed = !disable;
151
	return old_value;
W
wdenk 已提交
152 153 154 155 156 157 158 159 160 161 162 163
}


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

/*
 * submits an Interrupt Message
 */
int usb_submit_int_msg(struct usb_device *dev, unsigned long pipe,
164
			void *buffer, int transfer_len, int interval)
W
wdenk 已提交
165
{
166
	return submit_int_msg(dev, pipe, buffer, transfer_len, interval);
W
wdenk 已提交
167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182
}

/*
 * 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)
{
183 184
	if ((timeout == 0) && (!asynch_allowed)) {
		/* request for a asynch control pipe is not allowed */
W
wdenk 已提交
185
		return -1;
186
	}
187

W
wdenk 已提交
188 189 190
	/* set setup command */
	setup_packet.requesttype = requesttype;
	setup_packet.request = request;
191 192 193
	setup_packet.value = cpu_to_le16(value);
	setup_packet.index = cpu_to_le16(index);
	setup_packet.length = cpu_to_le16(size);
194 195 196 197
	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 已提交
198

199 200
	submit_control_msg(dev, pipe, data, size, &setup_packet);
	if (timeout == 0)
W
wdenk 已提交
201
		return (int)size;
202

203 204 205 206 207 208 209 210 211
	/*
	 * 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;
		wait_ms(1);
R
Remy Bohmer 已提交
212
	}
213 214
	if (dev->status)
		return -1;
R
Remy Bohmer 已提交
215 216

	return dev->act_len;
217

W
wdenk 已提交
218 219 220 221 222 223 224 225 226 227 228 229
}

/*-------------------------------------------------------------------
 * 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;
230 231 232 233
	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 已提交
234 235 236
			break;
		wait_ms(1);
	}
237 238
	*actual_length = dev->act_len;
	if (dev->status == 0)
W
wdenk 已提交
239 240 241 242 243 244 245 246 247 248 249 250 251 252
		return 0;
	else
		return -1;
}


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

/*
 * returns the max packet size, depending on the pipe direction and
 * the configurations values
 */
253
int usb_maxpacket(struct usb_device *dev, unsigned long pipe)
W
wdenk 已提交
254
{
255 256
	/* direction is out -> use emaxpacket out */
	if ((pipe & USB_DIR_IN) == 0)
257
		return dev->epmaxpacketout[((pipe>>15) & 0xf)];
W
wdenk 已提交
258
	else
259
		return dev->epmaxpacketin[((pipe>>15) & 0xf)];
W
wdenk 已提交
260 261
}

M
Marek Vasut 已提交
262 263
/*
 * The routine usb_set_maxpacket_ep() is extracted from the loop of routine
264 265 266 267 268 269
 * 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 已提交
270 271
 *
 * NOTE: Similar behaviour was observed with GCC4.6 on ARMv5.
272 273
 */
static void  __attribute__((noinline))
M
Marek Vasut 已提交
274
usb_set_maxpacket_ep(struct usb_device *dev, int if_idx, int ep_idx)
275 276
{
	int b;
M
Marek Vasut 已提交
277
	struct usb_endpoint_descriptor *ep;
278
	u16 ep_wMaxPacketSize;
M
Marek Vasut 已提交
279 280

	ep = &dev->config.if_desc[if_idx].ep_desc[ep_idx];
281 282

	b = ep->bEndpointAddress & USB_ENDPOINT_NUMBER_MASK;
283
	ep_wMaxPacketSize = get_unaligned(&ep->wMaxPacketSize);
284 285 286 287

	if ((ep->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) ==
						USB_ENDPOINT_XFER_CONTROL) {
		/* Control => bidirectional */
288 289
		dev->epmaxpacketout[b] = ep_wMaxPacketSize;
		dev->epmaxpacketin[b] = ep_wMaxPacketSize;
290 291 292 293 294
		USB_PRINTF("##Control EP epmaxpacketout/in[%d] = %d\n",
			   b, dev->epmaxpacketin[b]);
	} else {
		if ((ep->bEndpointAddress & 0x80) == 0) {
			/* OUT Endpoint */
295 296
			if (ep_wMaxPacketSize > dev->epmaxpacketout[b]) {
				dev->epmaxpacketout[b] = ep_wMaxPacketSize;
297 298 299 300 301
				USB_PRINTF("##EP epmaxpacketout[%d] = %d\n",
					   b, dev->epmaxpacketout[b]);
			}
		} else {
			/* IN Endpoint */
302 303
			if (ep_wMaxPacketSize > dev->epmaxpacketin[b]) {
				dev->epmaxpacketin[b] = ep_wMaxPacketSize;
304 305 306 307 308 309 310
				USB_PRINTF("##EP epmaxpacketin[%d] = %d\n",
					   b, dev->epmaxpacketin[b]);
			}
		} /* if out */
	} /* if control */
}

W
wdenk 已提交
311 312 313
/*
 * set the max packed value of all endpoints in the given configuration
 */
M
Marek Vasut 已提交
314
static int usb_set_maxpacket(struct usb_device *dev)
W
wdenk 已提交
315
{
316
	int i, ii;
W
wdenk 已提交
317

T
Tom Rix 已提交
318 319
	for (i = 0; i < dev->config.desc.bNumInterfaces; i++)
		for (ii = 0; ii < dev->config.if_desc[i].desc.bNumEndpoints; ii++)
M
Marek Vasut 已提交
320
			usb_set_maxpacket_ep(dev, i, ii);
W
wdenk 已提交
321 322 323 324 325 326 327 328

	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 已提交
329 330
static int usb_parse_config(struct usb_device *dev,
			unsigned char *buffer, int cfgno)
W
wdenk 已提交
331 332
{
	struct usb_descriptor_header *head;
333 334
	int index, ifno, epno, curr_if_num;
	int i;
335
	u16 ep_wMaxPacketSize;
336 337 338 339 340 341 342

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

	dev->configno = cfgno;
	head = (struct usb_descriptor_header *) &buffer[0];
343 344 345
	if (head->bDescriptorType != USB_DT_CONFIG) {
		printf(" ERROR: NOT USB_CONFIG_DESC %x\n",
			head->bDescriptorType);
W
wdenk 已提交
346 347
		return -1;
	}
348
	memcpy(&dev->config, buffer, buffer[0]);
T
Tom Rix 已提交
349
	le16_to_cpus(&(dev->config.desc.wTotalLength));
350
	dev->config.no_of_if = 0;
W
wdenk 已提交
351

T
Tom Rix 已提交
352
	index = dev->config.desc.bLength;
353 354
	/* Ok the first entry must be a configuration entry,
	 * now process the others */
355
	head = (struct usb_descriptor_header *) &buffer[index];
T
Tom Rix 已提交
356
	while (index + 1 < dev->config.desc.wTotalLength) {
357 358 359 360 361 362 363 364
		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],
365
					&buffer[index], buffer[index]);
366 367 368
				dev->config.if_desc[ifno].no_of_ep = 0;
				dev->config.if_desc[ifno].num_altsetting = 1;
				curr_if_num =
T
Tom Rix 已提交
369
				     dev->config.if_desc[ifno].desc.bInterfaceNumber;
370 371 372 373 374 375 376 377 378 379 380
			} 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]);
381 382 383 384 385 386 387 388 389
			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);
390 391 392 393 394 395 396 397 398 399
			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);

			{
400 401 402
#ifdef USB_DEBUG
				unsigned char *ch = (unsigned char *)head;
#endif
403 404 405 406 407
				for (i = 0; i < head->bLength; i++)
					USB_PRINTF("%02X ", *ch++);
				USB_PRINTF("\n\n\n");
			}
			break;
W
wdenk 已提交
408
		}
409 410
		index += head->bLength;
		head = (struct usb_descriptor_header *)&buffer[index];
W
wdenk 已提交
411 412 413 414 415 416 417 418 419 420 421 422
	}
	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;
423
	int endp = usb_pipeendpoint(pipe)|(usb_pipein(pipe)<<7);
W
wdenk 已提交
424 425

	result = usb_control_msg(dev, usb_sndctrlpipe(dev, 0),
426 427
				 USB_REQ_CLEAR_FEATURE, USB_RECIP_ENDPOINT, 0,
				 endp, NULL, 0, USB_CNTL_TIMEOUT * 3);
W
wdenk 已提交
428 429 430 431

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

W
Wolfgang Denk 已提交
433
	/*
434 435 436 437
	 * NOTE: we do not get status and verify reset was successful
	 * as some devices are reported to lock up upon this check..
	 */

W
wdenk 已提交
438
	usb_endpoint_running(dev, usb_pipeendpoint(pipe), usb_pipeout(pipe));
439

W
wdenk 已提交
440 441 442 443 444 445 446 447 448
	/* toggle is reset on clear */
	usb_settoggle(dev, usb_pipeendpoint(pipe), usb_pipeout(pipe), 0);
	return 0;
}


/**********************************************************************
 * get_descriptor type
 */
M
Marek Vasut 已提交
449
static int usb_get_descriptor(struct usb_device *dev, unsigned char type,
450
			unsigned char index, void *buf, int size)
W
wdenk 已提交
451 452
{
	int res;
W
Wolfgang Denk 已提交
453
	res = usb_control_msg(dev, usb_rcvctrlpipe(dev, 0),
W
wdenk 已提交
454 455 456 457 458 459 460 461 462
			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
 */
463 464
int usb_get_configuration_no(struct usb_device *dev,
			     unsigned char *buffer, int cfgno)
W
wdenk 已提交
465
{
W
Wolfgang Denk 已提交
466
	int result;
W
wdenk 已提交
467
	unsigned int tmp;
T
Tom Rix 已提交
468
	struct usb_configuration_descriptor *config;
W
wdenk 已提交
469

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

W
wdenk 已提交
483
	if (tmp > USB_BUFSIZ) {
484 485
		USB_PRINTF("usb_get_configuration_no: failed to get " \
			   "descriptor - too long: %d\n", tmp);
W
wdenk 已提交
486 487 488
		return -1;
	}

W
wdenk 已提交
489
	result = usb_get_descriptor(dev, USB_DT_CONFIG, cfgno, buffer, tmp);
490 491
	USB_PRINTF("get_conf_no %d Result %d, wLength %d\n",
		   cfgno, result, tmp);
W
wdenk 已提交
492 493 494 495 496 497 498
	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 已提交
499
static int usb_set_address(struct usb_device *dev)
W
wdenk 已提交
500 501 502
{
	int res;

503 504 505 506 507
	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 已提交
508 509 510 511 512 513 514 515
	return res;
}

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

T
Tom Rix 已提交
519 520
	for (i = 0; i < dev->config.desc.bNumInterfaces; i++) {
		if (dev->config.if_desc[i].desc.bInterfaceNumber == interface) {
W
wdenk 已提交
521 522 523 524 525 526 527 528
			if_face = &dev->config.if_desc[i];
			break;
		}
	}
	if (!if_face) {
		printf("selecting invalid interface %d", interface);
		return -1;
	}
529 530
	/*
	 * We should return now for devices with only one alternate setting.
531 532 533 534
	 * 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.
535 536 537
	 */
	if (if_face->num_altsetting == 1)
		return 0;
W
wdenk 已提交
538

539 540 541 542 543
	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 已提交
544 545 546 547 548 549 550 551
		return ret;

	return 0;
}

/********************************************************************
 * set configuration number to configuration
 */
M
Marek Vasut 已提交
552
static int usb_set_configuration(struct usb_device *dev, int configuration)
W
wdenk 已提交
553 554
{
	int res;
555
	USB_PRINTF("set configuration %d\n", configuration);
W
wdenk 已提交
556
	/* set setup command */
557 558 559 560 561
	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 已提交
562 563 564
		dev->toggle[0] = 0;
		dev->toggle[1] = 0;
		return 0;
565
	} else
W
wdenk 已提交
566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591
		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
 */
592 593
int usb_get_report(struct usb_device *dev, int ifnum, unsigned char type,
		   unsigned char id, void *buf, int size)
W
wdenk 已提交
594 595
{
	return usb_control_msg(dev, usb_rcvctrlpipe(dev, 0),
596 597 598
			USB_REQ_GET_REPORT,
			USB_DIR_IN | USB_TYPE_CLASS | USB_RECIP_INTERFACE,
			(type << 8) + id, ifnum, buf, size, USB_CNTL_TIMEOUT);
W
wdenk 已提交
599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614
}

/********************************************************************
 * 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 已提交
615
static int usb_get_string(struct usb_device *dev, unsigned short langid,
616
		   unsigned char index, void *buf, int size)
W
wdenk 已提交
617
{
618 619 620 621 622 623 624
	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 已提交
625
			(USB_DT_STRING << 8) + index, langid, buf, size,
626 627 628 629
			USB_CNTL_TIMEOUT);

		if (result > 0)
			break;
W
Wolfgang Denk 已提交
630 631
	}

632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647
	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 已提交
648 649
}

650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679

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 已提交
680
		rc = -1;
681 682 683 684 685

	return rc;
}


W
wdenk 已提交
686 687 688 689 690 691 692
/********************************************************************
 * 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 已提交
693
	unsigned char mybuf[USB_BUFSIZ];
W
wdenk 已提交
694 695 696 697 698 699 700
	unsigned char *tbuf;
	int err;
	unsigned int u, idx;

	if (size <= 0 || !buf || !index)
		return -1;
	buf[0] = 0;
701
	tbuf = &mybuf[0];
W
wdenk 已提交
702 703 704

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

723
	err = usb_string_sub(dev, dev->string_langid, index, tbuf);
W
wdenk 已提交
724 725
	if (err < 0)
		return err;
726

W
wdenk 已提交
727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750
	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
 */
751
struct usb_device *usb_get_dev_index(int index)
W
wdenk 已提交
752
{
753
	if (usb_dev[index].devnum == -1)
W
wdenk 已提交
754 755 756 757 758 759 760 761 762
		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 已提交
763
struct usb_device *usb_alloc_new_device(void)
W
wdenk 已提交
764 765
{
	int i;
766 767 768
	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 已提交
769 770
		return NULL;
	}
771 772 773 774 775 776
	/* 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 已提交
777
	dev_index++;
778
	return &usb_dev[dev_index - 1];
W
wdenk 已提交
779 780 781 782 783 784 785 786 787 788
}


/*
 * 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 已提交
789
int usb_new_device(struct usb_device *dev)
W
wdenk 已提交
790 791 792
{
	int addr, err;
	int tmp;
W
wdenk 已提交
793
	unsigned char tmpbuf[USB_BUFSIZ];
W
wdenk 已提交
794 795 796 797

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

799 800 801 802 803 804 805
#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 已提交
806
	dev->maxpacketsize = PACKET_SIZE_8;
807
	dev->epmaxpacketin[0] = 8;
808 809 810 811 812
	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, " \
813
		       "giving up (status=%lX)\n", dev->status);
814 815 816
		return 1;
	}
#else
R
Remy Bohmer 已提交
817 818
	/* This is a Windows scheme of initialization sequence, with double
	 * reset of the device (Linux uses the same sequence)
819 820
	 * Some equipment is said to work only with such init sequence; this
	 * patch is based on the work by Alan Stern:
821 822
	 * http://sourceforge.net/mailarchive/forum.php?
	 * thread_id=5729457&forum_id=5398
823 824 825 826 827 828 829 830 831
	 */
	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
832
	 * some more, or keeps on retransmitting the 8 byte header. */
833 834

	desc = (struct usb_device_descriptor *)tmpbuf;
835
	dev->descriptor.bMaxPacketSize0 = 64;	    /* Start off at 64 bytes  */
R
Remy Bohmer 已提交
836 837
	/* Default to 64 byte max packet size */
	dev->maxpacketsize = PACKET_SIZE_64;
838
	dev->epmaxpacketin[0] = 64;
839
	dev->epmaxpacketout[0] = 64;
R
Remy Bohmer 已提交
840 841 842 843 844

	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;
845
	}
R
Remy Bohmer 已提交
846

847
	dev->descriptor.bMaxPacketSize0 = desc->bMaxPacketSize0;
W
Wolfgang Denk 已提交
848

849 850
	/* find the port number we're at */
	if (parent) {
R
Remy Bohmer 已提交
851
		int j;
W
Wolfgang Denk 已提交
852

853 854 855 856 857 858 859
		for (j = 0; j < parent->maxchild; j++) {
			if (parent->children[j] == dev) {
				port = j;
				break;
			}
		}
		if (port < 0) {
860
			printf("usb_new_device:cannot locate device's port.\n");
861 862 863 864 865 866 867 868 869 870 871 872
			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

873
	dev->epmaxpacketin[0] = dev->descriptor.bMaxPacketSize0;
W
wdenk 已提交
874 875
	dev->epmaxpacketout[0] = dev->descriptor.bMaxPacketSize0;
	switch (dev->descriptor.bMaxPacketSize0) {
876 877 878 879 880 881 882 883 884 885 886 887
	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 已提交
888 889 890 891 892 893
	}
	dev->devnum = addr;

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

	if (err < 0) {
894 895
		printf("\n      USB device not accepting new address " \
			"(error=%lX)\n", dev->status);
W
wdenk 已提交
896 897 898 899 900 901 902
		return 1;
	}

	wait_ms(10);	/* Let the SET_ADDRESS settle */

	tmp = sizeof(dev->descriptor);

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

/* build device Tree  */
M
Marek Vasut 已提交
953
static void usb_scan_devices(void)
W
wdenk 已提交
954 955 956 957 958
{
	int i;
	struct usb_device *dev;

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

/* EOF */