usb.c 36 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247
  1. /*
  2. *
  3. * Most of this source has been derived from the Linux USB
  4. * project:
  5. * (C) Copyright Linus Torvalds 1999
  6. * (C) Copyright Johannes Erdfelt 1999-2001
  7. * (C) Copyright Andreas Gal 1999
  8. * (C) Copyright Gregory P. Smith 1999
  9. * (C) Copyright Deti Fliegl 1999 (new USB architecture)
  10. * (C) Copyright Randy Dunlap 2000
  11. * (C) Copyright David Brownell 2000 (kernel hotplug, usb_device_id)
  12. * (C) Copyright Yggdrasil Computing, Inc. 2000
  13. * (usb_device_id matching changes by Adam J. Richter)
  14. *
  15. * Adapted for U-Boot:
  16. * (C) Copyright 2001 Denis Peter, MPL AG Switzerland
  17. *
  18. * See file CREDITS for list of people who contributed to this
  19. * project.
  20. *
  21. * This program is free software; you can redistribute it and/or
  22. * modify it under the terms of the GNU General Public License as
  23. * published by the Free Software Foundation; either version 2 of
  24. * the License, or (at your option) any later version.
  25. *
  26. * This program is distributed in the hope that it will be useful,
  27. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  28. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  29. * GNU General Public License for more details.
  30. *
  31. * You should have received a copy of the GNU General Public License
  32. * along with this program; if not, write to the Free Software
  33. * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
  34. * MA 02111-1307 USA
  35. *
  36. */
  37. /*
  38. * How it works:
  39. *
  40. * Since this is a bootloader, the devices will not be automatic
  41. * (re)configured on hotplug, but after a restart of the USB the
  42. * device should work.
  43. *
  44. * For each transfer (except "Interrupt") we wait for completion.
  45. */
  46. #include <common.h>
  47. #include <command.h>
  48. #include <asm/processor.h>
  49. #include <linux/ctype.h>
  50. #if (CONFIG_COMMANDS & CFG_CMD_USB)
  51. #include <usb.h>
  52. #ifdef CONFIG_4xx
  53. #include <405gp_pci.h>
  54. #endif
  55. #undef USB_DEBUG
  56. #ifdef USB_DEBUG
  57. #define USB_PRINTF(fmt,args...) printf (fmt ,##args)
  58. #else
  59. #define USB_PRINTF(fmt,args...)
  60. #endif
  61. #define USB_BUFSIZ 512
  62. static struct usb_device usb_dev[USB_MAX_DEVICE];
  63. static int dev_index;
  64. static int running;
  65. static int asynch_allowed;
  66. static struct devrequest setup_packet;
  67. /**********************************************************************
  68. * some forward declerations...
  69. */
  70. void usb_scan_devices(void);
  71. int usb_hub_probe(struct usb_device *dev, int ifnum);
  72. void usb_hub_reset(void);
  73. /***********************************************************************
  74. * wait_ms
  75. */
  76. void __inline__ wait_ms(unsigned long ms)
  77. {
  78. while(ms-->0)
  79. udelay(1000);
  80. }
  81. /***************************************************************************
  82. * Init USB Device
  83. */
  84. int usb_init(void)
  85. {
  86. int result;
  87. running=0;
  88. dev_index=0;
  89. asynch_allowed=1;
  90. usb_hub_reset();
  91. /* init low_level USB */
  92. printf("USB: ");
  93. result = usb_lowlevel_init();
  94. /* if lowlevel init is OK, scan the bus for devices i.e. search HUBs and configure them */
  95. if(result==0) {
  96. printf("scanning bus for devices... ");
  97. running=1;
  98. usb_scan_devices();
  99. return 0;
  100. }
  101. else {
  102. printf("Error, couldn't init Lowlevel part\n");
  103. return -1;
  104. }
  105. }
  106. /******************************************************************************
  107. * Stop USB this stops the LowLevel Part and deregisters USB devices.
  108. */
  109. int usb_stop(void)
  110. {
  111. asynch_allowed=1;
  112. usb_hub_reset();
  113. return usb_lowlevel_stop();
  114. }
  115. /*
  116. * disables the asynch behaviour of the control message. This is used for data
  117. * transfers that uses the exclusiv access to the control and bulk messages.
  118. */
  119. void usb_disable_asynch(int disable)
  120. {
  121. asynch_allowed=!disable;
  122. }
  123. /*-------------------------------------------------------------------
  124. * Message wrappers.
  125. *
  126. */
  127. /*
  128. * submits an Interrupt Message
  129. */
  130. int usb_submit_int_msg(struct usb_device *dev, unsigned long pipe,
  131. void *buffer,int transfer_len, int interval)
  132. {
  133. return submit_int_msg(dev,pipe,buffer,transfer_len,interval);
  134. }
  135. /*
  136. * submits a control message and waits for comletion (at least timeout * 1ms)
  137. * If timeout is 0, we don't wait for completion (used as example to set and
  138. * clear keyboards LEDs). For data transfers, (storage transfers) we don't
  139. * allow control messages with 0 timeout, by previousely resetting the flag
  140. * asynch_allowed (usb_disable_asynch(1)).
  141. * returns the transfered length if OK or -1 if error. The transfered length
  142. * and the current status are stored in the dev->act_len and dev->status.
  143. */
  144. int usb_control_msg(struct usb_device *dev, unsigned int pipe,
  145. unsigned char request, unsigned char requesttype,
  146. unsigned short value, unsigned short index,
  147. void *data, unsigned short size, int timeout)
  148. {
  149. if((timeout==0)&&(!asynch_allowed)) /* request for a asynch control pipe is not allowed */
  150. return -1;
  151. /* set setup command */
  152. setup_packet.requesttype = requesttype;
  153. setup_packet.request = request;
  154. setup_packet.value = swap_16(value);
  155. setup_packet.index = swap_16(index);
  156. setup_packet.length = swap_16(size);
  157. USB_PRINTF("usb_control_msg: request: 0x%X, requesttype: 0x%X\nvalue 0x%X index 0x%X length 0x%X\n",
  158. request,requesttype,value,index,size);
  159. dev->status=USB_ST_NOT_PROC; /*not yet processed */
  160. submit_control_msg(dev,pipe,data,size,&setup_packet);
  161. if(timeout==0) {
  162. return (int)size;
  163. }
  164. while(timeout--) {
  165. if(!((volatile unsigned long)dev->status & USB_ST_NOT_PROC))
  166. break;
  167. wait_ms(1);
  168. }
  169. if(dev->status==0)
  170. return dev->act_len;
  171. else {
  172. return -1;
  173. }
  174. }
  175. /*-------------------------------------------------------------------
  176. * submits bulk message, and waits for completion. returns 0 if Ok or
  177. * -1 if Error.
  178. * synchronous behavior
  179. */
  180. int usb_bulk_msg(struct usb_device *dev, unsigned int pipe,
  181. void *data, int len, int *actual_length, int timeout)
  182. {
  183. if (len < 0)
  184. return -1;
  185. dev->status=USB_ST_NOT_PROC; /*not yet processed */
  186. submit_bulk_msg(dev,pipe,data,len);
  187. while(timeout--) {
  188. if(!((volatile unsigned long)dev->status & USB_ST_NOT_PROC))
  189. break;
  190. wait_ms(1);
  191. }
  192. *actual_length=dev->act_len;
  193. if(dev->status==0)
  194. return 0;
  195. else
  196. return -1;
  197. }
  198. /*-------------------------------------------------------------------
  199. * Max Packet stuff
  200. */
  201. /*
  202. * returns the max packet size, depending on the pipe direction and
  203. * the configurations values
  204. */
  205. int usb_maxpacket(struct usb_device *dev,unsigned long pipe)
  206. {
  207. if((pipe & USB_DIR_IN)==0) /* direction is out -> use emaxpacket out */
  208. return(dev->epmaxpacketout[((pipe>>15) & 0xf)]);
  209. else
  210. return(dev->epmaxpacketin[((pipe>>15) & 0xf)]);
  211. }
  212. /*
  213. * set the max packed value of all endpoints in the given configuration
  214. */
  215. int usb_set_maxpacket(struct usb_device *dev)
  216. {
  217. int i,ii,b;
  218. struct usb_endpoint_descriptor *ep;
  219. for(i=0; i<dev->config.bNumInterfaces;i++) {
  220. for(ii=0; ii<dev->config.if_desc[i].bNumEndpoints; ii++) {
  221. ep=&dev->config.if_desc[i].ep_desc[ii];
  222. b=ep->bEndpointAddress & USB_ENDPOINT_NUMBER_MASK;
  223. if((ep->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK)==USB_ENDPOINT_XFER_CONTROL) { /* Control => bidirectional */
  224. dev->epmaxpacketout[b] = ep->wMaxPacketSize;
  225. dev->epmaxpacketin [b] = ep->wMaxPacketSize;
  226. USB_PRINTF("##Control EP epmaxpacketout/in[%d] = %d\n",b,dev->epmaxpacketin[b]);
  227. }
  228. else {
  229. if ((ep->bEndpointAddress & 0x80)==0) { /* OUT Endpoint */
  230. if(ep->wMaxPacketSize > dev->epmaxpacketout[b]) {
  231. dev->epmaxpacketout[b] = ep->wMaxPacketSize;
  232. USB_PRINTF("##EP epmaxpacketout[%d] = %d\n",b,dev->epmaxpacketout[b]);
  233. }
  234. }
  235. else { /* IN Endpoint */
  236. if(ep->wMaxPacketSize > dev->epmaxpacketin[b]) {
  237. dev->epmaxpacketin[b] = ep->wMaxPacketSize;
  238. USB_PRINTF("##EP epmaxpacketin[%d] = %d\n",b,dev->epmaxpacketin[b]);
  239. }
  240. } /* if out */
  241. } /* if control */
  242. } /* for each endpoint */
  243. }
  244. return 0;
  245. }
  246. /*******************************************************************************
  247. * Parse the config, located in buffer, and fills the dev->config structure.
  248. * Note that all little/big endian swapping are done automatically.
  249. */
  250. int usb_parse_config(struct usb_device *dev, unsigned char *buffer, int cfgno)
  251. {
  252. struct usb_descriptor_header *head;
  253. int index, ifno, epno, curr_if_num;
  254. int i;
  255. unsigned char *ch;
  256. ifno = -1;
  257. epno = -1;
  258. curr_if_num = -1;
  259. dev->configno = cfgno;
  260. head = (struct usb_descriptor_header *) &buffer[0];
  261. if(head->bDescriptorType != USB_DT_CONFIG) {
  262. printf(" ERROR: NOT USB_CONFIG_DESC %x\n", head->bDescriptorType);
  263. return -1;
  264. }
  265. memcpy(&dev->config, buffer, buffer[0]);
  266. dev->config.wTotalLength = swap_16(dev->config.wTotalLength);
  267. dev->config.no_of_if = 0;
  268. index = dev->config.bLength;
  269. /* Ok the first entry must be a configuration entry, now process the others */
  270. head = (struct usb_descriptor_header *) &buffer[index];
  271. while(index + 1 < dev->config.wTotalLength) {
  272. switch(head->bDescriptorType) {
  273. case USB_DT_INTERFACE:
  274. if(((struct usb_interface_descriptor *) &buffer[index])->
  275. bInterfaceNumber != curr_if_num) {
  276. /* this is a new interface, copy new desc */
  277. ifno = dev->config.no_of_if;
  278. dev->config.no_of_if++;
  279. memcpy(&dev->config.if_desc[ifno],
  280. &buffer[index], buffer[index]);
  281. dev->config.if_desc[ifno].no_of_ep = 0;
  282. dev->config.if_desc[ifno].num_altsetting = 1;
  283. curr_if_num = dev->config.if_desc[ifno].bInterfaceNumber;
  284. } else {
  285. /* found alternate setting for the interface */
  286. dev->config.if_desc[ifno].num_altsetting++;
  287. }
  288. break;
  289. case USB_DT_ENDPOINT:
  290. epno = dev->config.if_desc[ifno].no_of_ep;
  291. dev->config.if_desc[ifno].no_of_ep++; /* found an endpoint */
  292. memcpy(&dev->config.if_desc[ifno].ep_desc[epno],
  293. &buffer[index], buffer[index]);
  294. dev->config.if_desc[ifno].ep_desc[epno].wMaxPacketSize =
  295. swap_16(dev->config.if_desc[ifno].ep_desc[epno].wMaxPacketSize);
  296. USB_PRINTF("if %d, ep %d\n", ifno, epno);
  297. break;
  298. default:
  299. if(head->bLength == 0)
  300. return 1;
  301. USB_PRINTF("unknown Description Type : %x\n", head->bDescriptorType);
  302. {
  303. ch = (unsigned char *)head;
  304. for(i = 0; i < head->bLength; i++)
  305. USB_PRINTF("%02X ", *ch++);
  306. USB_PRINTF("\n\n\n");
  307. }
  308. break;
  309. }
  310. index += head->bLength;
  311. head = (struct usb_descriptor_header *)&buffer[index];
  312. }
  313. return 1;
  314. }
  315. /***********************************************************************
  316. * Clears an endpoint
  317. * endp: endpoint number in bits 0-3;
  318. * direction flag in bit 7 (1 = IN, 0 = OUT)
  319. */
  320. int usb_clear_halt(struct usb_device *dev, int pipe)
  321. {
  322. int result;
  323. int endp = usb_pipeendpoint(pipe)|(usb_pipein(pipe)<<7);
  324. result = usb_control_msg(dev, usb_sndctrlpipe(dev, 0),
  325. USB_REQ_CLEAR_FEATURE, USB_RECIP_ENDPOINT, 0, endp, NULL, 0, USB_CNTL_TIMEOUT * 3);
  326. /* don't clear if failed */
  327. if (result < 0)
  328. return result;
  329. /*
  330. * NOTE: we do not get status and verify reset was successful
  331. * as some devices are reported to lock up upon this check..
  332. */
  333. usb_endpoint_running(dev, usb_pipeendpoint(pipe), usb_pipeout(pipe));
  334. /* toggle is reset on clear */
  335. usb_settoggle(dev, usb_pipeendpoint(pipe), usb_pipeout(pipe), 0);
  336. return 0;
  337. }
  338. /**********************************************************************
  339. * get_descriptor type
  340. */
  341. int usb_get_descriptor(struct usb_device *dev, unsigned char type, unsigned char index, void *buf, int size)
  342. {
  343. int res;
  344. res = usb_control_msg(dev, usb_rcvctrlpipe(dev, 0),
  345. USB_REQ_GET_DESCRIPTOR, USB_DIR_IN,
  346. (type << 8) + index, 0,
  347. buf, size, USB_CNTL_TIMEOUT);
  348. return res;
  349. }
  350. /**********************************************************************
  351. * gets configuration cfgno and store it in the buffer
  352. */
  353. int usb_get_configuration_no(struct usb_device *dev,unsigned char *buffer,int cfgno)
  354. {
  355. int result;
  356. unsigned int tmp;
  357. struct usb_config_descriptor *config;
  358. config=(struct usb_config_descriptor *)&buffer[0];
  359. result = usb_get_descriptor(dev, USB_DT_CONFIG, cfgno, buffer, 8);
  360. if (result < 8) {
  361. if (result < 0)
  362. printf("unable to get descriptor, error %lX\n",dev->status);
  363. else
  364. printf("config descriptor too short (expected %i, got %i)\n",8,result);
  365. return -1;
  366. }
  367. tmp=swap_16(config->wTotalLength);
  368. if (tmp > USB_BUFSIZ) {
  369. USB_PRINTF("usb_get_configuration_no: failed to get descriptor - too long: %d\n",
  370. tmp);
  371. return -1;
  372. }
  373. result = usb_get_descriptor(dev, USB_DT_CONFIG, cfgno, buffer, tmp);
  374. USB_PRINTF("get_conf_no %d Result %d, wLength %d\n",cfgno,result,tmp);
  375. return result;
  376. }
  377. /********************************************************************
  378. * set address of a device to the value in dev->devnum.
  379. * This can only be done by addressing the device via the default address (0)
  380. */
  381. int usb_set_address(struct usb_device *dev)
  382. {
  383. int res;
  384. USB_PRINTF("set address %d\n",dev->devnum);
  385. res=usb_control_msg(dev, usb_snddefctrl(dev),
  386. USB_REQ_SET_ADDRESS, 0,
  387. (dev->devnum),0,
  388. NULL,0, USB_CNTL_TIMEOUT);
  389. return res;
  390. }
  391. /********************************************************************
  392. * set interface number to interface
  393. */
  394. int usb_set_interface(struct usb_device *dev, int interface, int alternate)
  395. {
  396. struct usb_interface_descriptor *if_face = NULL;
  397. int ret, i;
  398. for (i = 0; i < dev->config.bNumInterfaces; i++) {
  399. if (dev->config.if_desc[i].bInterfaceNumber == interface) {
  400. if_face = &dev->config.if_desc[i];
  401. break;
  402. }
  403. }
  404. if (!if_face) {
  405. printf("selecting invalid interface %d", interface);
  406. return -1;
  407. }
  408. /*
  409. * We should return now for devices with only one alternate setting.
  410. * According to 9.4.10 of the Universal Serial Bus Specification Revision 2.0
  411. * such devices can return with a STALL. This results in some USB sticks
  412. * timeouting during initialization and then being unusable in U-Boot.
  413. */
  414. if (if_face->num_altsetting == 1)
  415. return 0;
  416. if ((ret = usb_control_msg(dev, usb_sndctrlpipe(dev, 0),
  417. USB_REQ_SET_INTERFACE, USB_RECIP_INTERFACE, alternate,
  418. interface, NULL, 0, USB_CNTL_TIMEOUT * 5)) < 0)
  419. return ret;
  420. return 0;
  421. }
  422. /********************************************************************
  423. * set configuration number to configuration
  424. */
  425. int usb_set_configuration(struct usb_device *dev, int configuration)
  426. {
  427. int res;
  428. USB_PRINTF("set configuration %d\n",configuration);
  429. /* set setup command */
  430. res=usb_control_msg(dev, usb_sndctrlpipe(dev,0),
  431. USB_REQ_SET_CONFIGURATION, 0,
  432. configuration,0,
  433. NULL,0, USB_CNTL_TIMEOUT);
  434. if(res==0) {
  435. dev->toggle[0] = 0;
  436. dev->toggle[1] = 0;
  437. return 0;
  438. }
  439. else
  440. return -1;
  441. }
  442. /********************************************************************
  443. * set protocol to protocol
  444. */
  445. int usb_set_protocol(struct usb_device *dev, int ifnum, int protocol)
  446. {
  447. return usb_control_msg(dev, usb_sndctrlpipe(dev, 0),
  448. USB_REQ_SET_PROTOCOL, USB_TYPE_CLASS | USB_RECIP_INTERFACE,
  449. protocol, ifnum, NULL, 0, USB_CNTL_TIMEOUT);
  450. }
  451. /********************************************************************
  452. * set idle
  453. */
  454. int usb_set_idle(struct usb_device *dev, int ifnum, int duration, int report_id)
  455. {
  456. return usb_control_msg(dev, usb_sndctrlpipe(dev, 0),
  457. USB_REQ_SET_IDLE, USB_TYPE_CLASS | USB_RECIP_INTERFACE,
  458. (duration << 8) | report_id, ifnum, NULL, 0, USB_CNTL_TIMEOUT);
  459. }
  460. /********************************************************************
  461. * get report
  462. */
  463. int usb_get_report(struct usb_device *dev, int ifnum, unsigned char type, unsigned char id, void *buf, int size)
  464. {
  465. return usb_control_msg(dev, usb_rcvctrlpipe(dev, 0),
  466. USB_REQ_GET_REPORT, USB_DIR_IN | USB_TYPE_CLASS | USB_RECIP_INTERFACE,
  467. (type << 8) + id, ifnum, buf, size, USB_CNTL_TIMEOUT);
  468. }
  469. /********************************************************************
  470. * get class descriptor
  471. */
  472. int usb_get_class_descriptor(struct usb_device *dev, int ifnum,
  473. unsigned char type, unsigned char id, void *buf, int size)
  474. {
  475. return usb_control_msg(dev, usb_rcvctrlpipe(dev, 0),
  476. USB_REQ_GET_DESCRIPTOR, USB_RECIP_INTERFACE | USB_DIR_IN,
  477. (type << 8) + id, ifnum, buf, size, USB_CNTL_TIMEOUT);
  478. }
  479. /********************************************************************
  480. * get string index in buffer
  481. */
  482. int usb_get_string(struct usb_device *dev, unsigned short langid, unsigned char index, void *buf, int size)
  483. {
  484. int i;
  485. int result;
  486. for (i = 0; i < 3; ++i) {
  487. /* some devices are flaky */
  488. result = usb_control_msg(dev, usb_rcvctrlpipe(dev, 0),
  489. USB_REQ_GET_DESCRIPTOR, USB_DIR_IN,
  490. (USB_DT_STRING << 8) + index, langid, buf, size,
  491. USB_CNTL_TIMEOUT);
  492. if (result > 0)
  493. break;
  494. }
  495. return result;
  496. }
  497. static void usb_try_string_workarounds(unsigned char *buf, int *length)
  498. {
  499. int newlength, oldlength = *length;
  500. for (newlength = 2; newlength + 1 < oldlength; newlength += 2)
  501. if (!isprint(buf[newlength]) || buf[newlength + 1])
  502. break;
  503. if (newlength > 2) {
  504. buf[0] = newlength;
  505. *length = newlength;
  506. }
  507. }
  508. static int usb_string_sub(struct usb_device *dev, unsigned int langid,
  509. unsigned int index, unsigned char *buf)
  510. {
  511. int rc;
  512. /* Try to read the string descriptor by asking for the maximum
  513. * possible number of bytes */
  514. rc = usb_get_string(dev, langid, index, buf, 255);
  515. /* If that failed try to read the descriptor length, then
  516. * ask for just that many bytes */
  517. if (rc < 2) {
  518. rc = usb_get_string(dev, langid, index, buf, 2);
  519. if (rc == 2)
  520. rc = usb_get_string(dev, langid, index, buf, buf[0]);
  521. }
  522. if (rc >= 2) {
  523. if (!buf[0] && !buf[1])
  524. usb_try_string_workarounds(buf, &rc);
  525. /* There might be extra junk at the end of the descriptor */
  526. if (buf[0] < rc)
  527. rc = buf[0];
  528. rc = rc - (rc & 1); /* force a multiple of two */
  529. }
  530. if (rc < 2)
  531. rc = -1;
  532. return rc;
  533. }
  534. /********************************************************************
  535. * usb_string:
  536. * Get string index and translate it to ascii.
  537. * returns string length (> 0) or error (< 0)
  538. */
  539. int usb_string(struct usb_device *dev, int index, char *buf, size_t size)
  540. {
  541. unsigned char mybuf[USB_BUFSIZ];
  542. unsigned char *tbuf;
  543. int err;
  544. unsigned int u, idx;
  545. if (size <= 0 || !buf || !index)
  546. return -1;
  547. buf[0] = 0;
  548. tbuf=&mybuf[0];
  549. /* get langid for strings if it's not yet known */
  550. if (!dev->have_langid) {
  551. err = usb_string_sub(dev, 0, 0, tbuf);
  552. if (err < 0) {
  553. USB_PRINTF("error getting string descriptor 0 (error=%x)\n",dev->status);
  554. return -1;
  555. } else if (tbuf[0] < 4) {
  556. USB_PRINTF("string descriptor 0 too short\n");
  557. return -1;
  558. } else {
  559. dev->have_langid = -1;
  560. dev->string_langid = tbuf[2] | (tbuf[3]<< 8);
  561. /* always use the first langid listed */
  562. USB_PRINTF("USB device number %d default language ID 0x%x\n",
  563. dev->devnum, dev->string_langid);
  564. }
  565. }
  566. err = usb_string_sub(dev, dev->string_langid, index, tbuf);
  567. if (err < 0)
  568. return err;
  569. size--; /* leave room for trailing NULL char in output buffer */
  570. for (idx = 0, u = 2; u < err; u += 2) {
  571. if (idx >= size)
  572. break;
  573. if (tbuf[u+1]) /* high byte */
  574. buf[idx++] = '?'; /* non-ASCII character */
  575. else
  576. buf[idx++] = tbuf[u];
  577. }
  578. buf[idx] = 0;
  579. err = idx;
  580. return err;
  581. }
  582. /********************************************************************
  583. * USB device handling:
  584. * the USB device are static allocated [USB_MAX_DEVICE].
  585. */
  586. /* returns a pointer to the device with the index [index].
  587. * if the device is not assigned (dev->devnum==-1) returns NULL
  588. */
  589. struct usb_device * usb_get_dev_index(int index)
  590. {
  591. if(usb_dev[index].devnum==-1)
  592. return NULL;
  593. else
  594. return &usb_dev[index];
  595. }
  596. /* returns a pointer of a new device structure or NULL, if
  597. * no device struct is available
  598. */
  599. struct usb_device * usb_alloc_new_device(void)
  600. {
  601. int i;
  602. USB_PRINTF("New Device %d\n",dev_index);
  603. if(dev_index==USB_MAX_DEVICE) {
  604. printf("ERROR, too many USB Devices, max=%d\n",USB_MAX_DEVICE);
  605. return NULL;
  606. }
  607. usb_dev[dev_index].devnum=dev_index+1; /* default Address is 0, real addresses start with 1 */
  608. usb_dev[dev_index].maxchild=0;
  609. for(i=0;i<USB_MAXCHILDREN;i++)
  610. usb_dev[dev_index].children[i]=NULL;
  611. usb_dev[dev_index].parent=NULL;
  612. dev_index++;
  613. return &usb_dev[dev_index-1];
  614. }
  615. /*
  616. * By the time we get here, the device has gotten a new device ID
  617. * and is in the default state. We need to identify the thing and
  618. * get the ball rolling..
  619. *
  620. * Returns 0 for success, != 0 for error.
  621. */
  622. int usb_new_device(struct usb_device *dev)
  623. {
  624. int addr, err;
  625. int tmp;
  626. unsigned char tmpbuf[USB_BUFSIZ];
  627. dev->descriptor.bMaxPacketSize0 = 8; /* Start off at 8 bytes */
  628. dev->maxpacketsize = 0; /* Default to 8 byte max packet size */
  629. dev->epmaxpacketin [0] = 8;
  630. dev->epmaxpacketout[0] = 8;
  631. /* We still haven't set the Address yet */
  632. addr = dev->devnum;
  633. dev->devnum = 0;
  634. #undef NEW_INIT_SEQ
  635. #ifdef NEW_INIT_SEQ
  636. /* this is a Windows scheme of initialization sequence, with double
  637. * reset of the device. Some equipment is said to work only with such
  638. * init sequence; this patch is based on the work by Alan Stern:
  639. * http://sourceforge.net/mailarchive/forum.php?thread_id=5729457&forum_id=5398
  640. */
  641. int j;
  642. struct usb_device_descriptor *desc;
  643. int port = -1;
  644. struct usb_device *parent = dev->parent;
  645. unsigned short portstatus;
  646. /* send 64-byte GET-DEVICE-DESCRIPTOR request. Since the descriptor is
  647. * only 18 bytes long, this will terminate with a short packet. But if
  648. * the maxpacket size is 8 or 16 the device may be waiting to transmit
  649. * some more. */
  650. desc = (struct usb_device_descriptor *)tmpbuf;
  651. desc->bMaxPacketSize0 = 0;
  652. for (j = 0; j < 3; ++j) {
  653. err = usb_get_descriptor(dev, USB_DT_DEVICE, 0, desc, 64);
  654. if (err < 0) {
  655. USB_PRINTF("usb_new_device: 64 byte descr\n");
  656. break;
  657. }
  658. }
  659. dev->descriptor.bMaxPacketSize0 = desc->bMaxPacketSize0;
  660. /* find the port number we're at */
  661. if (parent) {
  662. for (j = 0; j < parent->maxchild; j++) {
  663. if (parent->children[j] == dev) {
  664. port = j;
  665. break;
  666. }
  667. }
  668. if (port < 0) {
  669. printf("usb_new_device: cannot locate device's port..\n");
  670. return 1;
  671. }
  672. /* reset the port for the second time */
  673. err = hub_port_reset(dev->parent, port, &portstatus);
  674. if (err < 0) {
  675. printf("\n Couldn't reset port %i\n", port);
  676. return 1;
  677. }
  678. }
  679. #else
  680. /* and this is the old and known way of initializing devices */
  681. err = usb_get_descriptor(dev, USB_DT_DEVICE, 0, &dev->descriptor, 8);
  682. if (err < 8) {
  683. printf("\n USB device not responding, giving up (status=%lX)\n",dev->status);
  684. return 1;
  685. }
  686. #endif
  687. dev->epmaxpacketin [0] = dev->descriptor.bMaxPacketSize0;
  688. dev->epmaxpacketout[0] = dev->descriptor.bMaxPacketSize0;
  689. switch (dev->descriptor.bMaxPacketSize0) {
  690. case 8: dev->maxpacketsize = 0; break;
  691. case 16: dev->maxpacketsize = 1; break;
  692. case 32: dev->maxpacketsize = 2; break;
  693. case 64: dev->maxpacketsize = 3; break;
  694. }
  695. dev->devnum = addr;
  696. err = usb_set_address(dev); /* set address */
  697. if (err < 0) {
  698. printf("\n USB device not accepting new address (error=%lX)\n", dev->status);
  699. return 1;
  700. }
  701. wait_ms(10); /* Let the SET_ADDRESS settle */
  702. tmp = sizeof(dev->descriptor);
  703. err = usb_get_descriptor(dev, USB_DT_DEVICE, 0, &dev->descriptor, sizeof(dev->descriptor));
  704. if (err < tmp) {
  705. if (err < 0)
  706. printf("unable to get device descriptor (error=%d)\n",err);
  707. else
  708. printf("USB device descriptor short read (expected %i, got %i)\n",tmp,err);
  709. return 1;
  710. }
  711. /* correct le values */
  712. dev->descriptor.bcdUSB=swap_16(dev->descriptor.bcdUSB);
  713. dev->descriptor.idVendor=swap_16(dev->descriptor.idVendor);
  714. dev->descriptor.idProduct=swap_16(dev->descriptor.idProduct);
  715. dev->descriptor.bcdDevice=swap_16(dev->descriptor.bcdDevice);
  716. /* only support for one config for now */
  717. usb_get_configuration_no(dev,&tmpbuf[0],0);
  718. usb_parse_config(dev,&tmpbuf[0],0);
  719. usb_set_maxpacket(dev);
  720. /* we set the default configuration here */
  721. if (usb_set_configuration(dev, dev->config.bConfigurationValue)) {
  722. printf("failed to set default configuration len %d, status %lX\n",dev->act_len,dev->status);
  723. return -1;
  724. }
  725. USB_PRINTF("new device strings: Mfr=%d, Product=%d, SerialNumber=%d\n",
  726. dev->descriptor.iManufacturer, dev->descriptor.iProduct, dev->descriptor.iSerialNumber);
  727. memset(dev->mf, 0, sizeof(dev->mf));
  728. memset(dev->prod, 0, sizeof(dev->prod));
  729. memset(dev->serial, 0, sizeof(dev->serial));
  730. if (dev->descriptor.iManufacturer)
  731. usb_string(dev, dev->descriptor.iManufacturer, dev->mf, sizeof(dev->mf));
  732. if (dev->descriptor.iProduct)
  733. usb_string(dev, dev->descriptor.iProduct, dev->prod, sizeof(dev->prod));
  734. if (dev->descriptor.iSerialNumber)
  735. usb_string(dev, dev->descriptor.iSerialNumber, dev->serial, sizeof(dev->serial));
  736. USB_PRINTF("Manufacturer %s\n", dev->mf);
  737. USB_PRINTF("Product %s\n", dev->prod);
  738. USB_PRINTF("SerialNumber %s\n", dev->serial);
  739. /* now prode if the device is a hub */
  740. usb_hub_probe(dev,0);
  741. return 0;
  742. }
  743. /* build device Tree */
  744. void usb_scan_devices(void)
  745. {
  746. int i;
  747. struct usb_device *dev;
  748. /* first make all devices unknown */
  749. for(i=0;i<USB_MAX_DEVICE;i++) {
  750. memset(&usb_dev[i],0,sizeof(struct usb_device));
  751. usb_dev[i].devnum=-1;
  752. }
  753. dev_index=0;
  754. /* device 0 is always present (root hub, so let it analyze) */
  755. dev=usb_alloc_new_device();
  756. usb_new_device(dev);
  757. printf("%d USB Device(s) found\n",dev_index);
  758. /* insert "driver" if possible */
  759. #ifdef CONFIG_USB_KEYBOARD
  760. drv_usb_kbd_init();
  761. USB_PRINTF("scan end\n");
  762. #endif
  763. }
  764. /****************************************************************************
  765. * HUB "Driver"
  766. * Probes device for being a hub and configurate it
  767. */
  768. #undef USB_HUB_DEBUG
  769. #ifdef USB_HUB_DEBUG
  770. #define USB_HUB_PRINTF(fmt,args...) printf (fmt ,##args)
  771. #else
  772. #define USB_HUB_PRINTF(fmt,args...)
  773. #endif
  774. static struct usb_hub_device hub_dev[USB_MAX_HUB];
  775. static int usb_hub_index;
  776. int usb_get_hub_descriptor(struct usb_device *dev, void *data, int size)
  777. {
  778. return usb_control_msg(dev, usb_rcvctrlpipe(dev, 0),
  779. USB_REQ_GET_DESCRIPTOR, USB_DIR_IN | USB_RT_HUB,
  780. USB_DT_HUB << 8, 0, data, size, USB_CNTL_TIMEOUT);
  781. }
  782. int usb_clear_hub_feature(struct usb_device *dev, int feature)
  783. {
  784. return usb_control_msg(dev, usb_sndctrlpipe(dev, 0),
  785. USB_REQ_CLEAR_FEATURE, USB_RT_HUB, feature, 0, NULL, 0, USB_CNTL_TIMEOUT);
  786. }
  787. int usb_clear_port_feature(struct usb_device *dev, int port, int feature)
  788. {
  789. return usb_control_msg(dev, usb_sndctrlpipe(dev, 0),
  790. USB_REQ_CLEAR_FEATURE, USB_RT_PORT, feature, port, NULL, 0, USB_CNTL_TIMEOUT);
  791. }
  792. int usb_set_port_feature(struct usb_device *dev, int port, int feature)
  793. {
  794. return usb_control_msg(dev, usb_sndctrlpipe(dev, 0),
  795. USB_REQ_SET_FEATURE, USB_RT_PORT, feature, port, NULL, 0, USB_CNTL_TIMEOUT);
  796. }
  797. int usb_get_hub_status(struct usb_device *dev, void *data)
  798. {
  799. return usb_control_msg(dev, usb_rcvctrlpipe(dev, 0),
  800. USB_REQ_GET_STATUS, USB_DIR_IN | USB_RT_HUB, 0, 0,
  801. data, sizeof(struct usb_hub_status), USB_CNTL_TIMEOUT);
  802. }
  803. int usb_get_port_status(struct usb_device *dev, int port, void *data)
  804. {
  805. return usb_control_msg(dev, usb_rcvctrlpipe(dev, 0),
  806. USB_REQ_GET_STATUS, USB_DIR_IN | USB_RT_PORT, 0, port,
  807. data, sizeof(struct usb_hub_status), USB_CNTL_TIMEOUT);
  808. }
  809. static void usb_hub_power_on(struct usb_hub_device *hub)
  810. {
  811. int i;
  812. struct usb_device *dev;
  813. dev=hub->pusb_dev;
  814. /* Enable power to the ports */
  815. USB_HUB_PRINTF("enabling power on all ports\n");
  816. for (i = 0; i < dev->maxchild; i++) {
  817. usb_set_port_feature(dev, i + 1, USB_PORT_FEAT_POWER);
  818. USB_HUB_PRINTF("port %d returns %lX\n",i+1,dev->status);
  819. wait_ms(hub->desc.bPwrOn2PwrGood * 2);
  820. }
  821. }
  822. void usb_hub_reset(void)
  823. {
  824. usb_hub_index=0;
  825. }
  826. struct usb_hub_device *usb_hub_allocate(void)
  827. {
  828. if(usb_hub_index<USB_MAX_HUB) {
  829. return &hub_dev[usb_hub_index++];
  830. }
  831. printf("ERROR: USB_MAX_HUB (%d) reached\n",USB_MAX_HUB);
  832. return NULL;
  833. }
  834. #define MAX_TRIES 5
  835. static int hub_port_reset(struct usb_device *dev, int port,
  836. unsigned short *portstat)
  837. {
  838. int tries;
  839. struct usb_port_status portsts;
  840. unsigned short portstatus, portchange;
  841. USB_HUB_PRINTF("hub_port_reset: resetting port %d...\n", port);
  842. for(tries=0;tries<MAX_TRIES;tries++) {
  843. usb_set_port_feature(dev, port + 1, USB_PORT_FEAT_RESET);
  844. wait_ms(200);
  845. if (usb_get_port_status(dev, port + 1, &portsts)<0) {
  846. USB_HUB_PRINTF("get_port_status failed status %lX\n",dev->status);
  847. return -1;
  848. }
  849. portstatus = swap_16(portsts.wPortStatus);
  850. portchange = swap_16(portsts.wPortChange);
  851. USB_HUB_PRINTF("portstatus %x, change %x, %s\n", portstatus ,portchange,
  852. portstatus&(1<<USB_PORT_FEAT_LOWSPEED) ? "Low Speed" : "High Speed");
  853. USB_HUB_PRINTF("STAT_C_CONNECTION = %d STAT_CONNECTION = %d USB_PORT_STAT_ENABLE %d\n",
  854. (portchange & USB_PORT_STAT_C_CONNECTION) ? 1 : 0,
  855. (portstatus & USB_PORT_STAT_CONNECTION) ? 1 : 0,
  856. (portstatus & USB_PORT_STAT_ENABLE) ? 1 : 0);
  857. if ((portchange & USB_PORT_STAT_C_CONNECTION) ||
  858. !(portstatus & USB_PORT_STAT_CONNECTION))
  859. return -1;
  860. if (portstatus & USB_PORT_STAT_ENABLE) {
  861. break;
  862. }
  863. wait_ms(200);
  864. }
  865. if (tries==MAX_TRIES) {
  866. USB_HUB_PRINTF("Cannot enable port %i after %i retries, disabling port.\n", port+1, MAX_TRIES);
  867. USB_HUB_PRINTF("Maybe the USB cable is bad?\n");
  868. return -1;
  869. }
  870. usb_clear_port_feature(dev, port + 1, USB_PORT_FEAT_C_RESET);
  871. *portstat = portstatus;
  872. return 0;
  873. }
  874. void usb_hub_port_connect_change(struct usb_device *dev, int port)
  875. {
  876. struct usb_device *usb;
  877. struct usb_port_status portsts;
  878. unsigned short portstatus, portchange;
  879. /* Check status */
  880. if (usb_get_port_status(dev, port + 1, &portsts)<0) {
  881. USB_HUB_PRINTF("get_port_status failed\n");
  882. return;
  883. }
  884. portstatus = swap_16(portsts.wPortStatus);
  885. portchange = swap_16(portsts.wPortChange);
  886. USB_HUB_PRINTF("portstatus %x, change %x, %s\n", portstatus, portchange,
  887. portstatus&(1<<USB_PORT_FEAT_LOWSPEED) ? "Low Speed" : "High Speed");
  888. /* Clear the connection change status */
  889. usb_clear_port_feature(dev, port + 1, USB_PORT_FEAT_C_CONNECTION);
  890. /* Disconnect any existing devices under this port */
  891. if (((!(portstatus & USB_PORT_STAT_CONNECTION)) &&
  892. (!(portstatus & USB_PORT_STAT_ENABLE)))|| (dev->children[port])) {
  893. USB_HUB_PRINTF("usb_disconnect(&hub->children[port]);\n");
  894. /* Return now if nothing is connected */
  895. if (!(portstatus & USB_PORT_STAT_CONNECTION))
  896. return;
  897. }
  898. wait_ms(200);
  899. /* Reset the port */
  900. if (hub_port_reset(dev, port, &portstatus) < 0) {
  901. printf("cannot reset port %i!?\n", port + 1);
  902. return;
  903. }
  904. wait_ms(200);
  905. /* Allocate a new device struct for it */
  906. usb=usb_alloc_new_device();
  907. usb->slow = (portstatus & USB_PORT_STAT_LOW_SPEED) ? 1 : 0;
  908. dev->children[port] = usb;
  909. usb->parent=dev;
  910. /* Run it through the hoops (find a driver, etc) */
  911. if (usb_new_device(usb)) {
  912. /* Woops, disable the port */
  913. USB_HUB_PRINTF("hub: disabling port %d\n", port + 1);
  914. usb_clear_port_feature(dev, port + 1, USB_PORT_FEAT_ENABLE);
  915. }
  916. }
  917. int usb_hub_configure(struct usb_device *dev)
  918. {
  919. unsigned char buffer[USB_BUFSIZ], *bitmap;
  920. struct usb_hub_descriptor *descriptor;
  921. struct usb_hub_status *hubsts;
  922. int i;
  923. struct usb_hub_device *hub;
  924. /* "allocate" Hub device */
  925. hub=usb_hub_allocate();
  926. if(hub==NULL)
  927. return -1;
  928. hub->pusb_dev=dev;
  929. /* Get the the hub descriptor */
  930. if (usb_get_hub_descriptor(dev, buffer, 4) < 0) {
  931. USB_HUB_PRINTF("usb_hub_configure: failed to get hub descriptor, giving up %lX\n",dev->status);
  932. return -1;
  933. }
  934. descriptor = (struct usb_hub_descriptor *)buffer;
  935. /* silence compiler warning if USB_BUFSIZ is > 256 [= sizeof(char)] */
  936. i = descriptor->bLength;
  937. if (i > USB_BUFSIZ) {
  938. USB_HUB_PRINTF("usb_hub_configure: failed to get hub descriptor - too long: %d\N",
  939. descriptor->bLength);
  940. return -1;
  941. }
  942. if (usb_get_hub_descriptor(dev, buffer, descriptor->bLength) < 0) {
  943. USB_HUB_PRINTF("usb_hub_configure: failed to get hub descriptor 2nd giving up %lX\n",dev->status);
  944. return -1;
  945. }
  946. memcpy((unsigned char *)&hub->desc,buffer,descriptor->bLength);
  947. /* adjust 16bit values */
  948. hub->desc.wHubCharacteristics=swap_16(descriptor->wHubCharacteristics);
  949. /* set the bitmap */
  950. bitmap=(unsigned char *)&hub->desc.DeviceRemovable[0];
  951. memset(bitmap,0xff,(USB_MAXCHILDREN+1+7)/8); /* devices not removable by default */
  952. bitmap=(unsigned char *)&hub->desc.PortPowerCtrlMask[0];
  953. memset(bitmap,0xff,(USB_MAXCHILDREN+1+7)/8); /* PowerMask = 1B */
  954. for(i=0;i<((hub->desc.bNbrPorts + 1 + 7)/8);i++) {
  955. hub->desc.DeviceRemovable[i]=descriptor->DeviceRemovable[i];
  956. }
  957. for(i=0;i<((hub->desc.bNbrPorts + 1 + 7)/8);i++) {
  958. hub->desc.DeviceRemovable[i]=descriptor->PortPowerCtrlMask[i];
  959. }
  960. dev->maxchild = descriptor->bNbrPorts;
  961. USB_HUB_PRINTF("%d ports detected\n", dev->maxchild);
  962. switch (hub->desc.wHubCharacteristics & HUB_CHAR_LPSM) {
  963. case 0x00:
  964. USB_HUB_PRINTF("ganged power switching\n");
  965. break;
  966. case 0x01:
  967. USB_HUB_PRINTF("individual port power switching\n");
  968. break;
  969. case 0x02:
  970. case 0x03:
  971. USB_HUB_PRINTF("unknown reserved power switching mode\n");
  972. break;
  973. }
  974. if (hub->desc.wHubCharacteristics & HUB_CHAR_COMPOUND)
  975. USB_HUB_PRINTF("part of a compound device\n");
  976. else
  977. USB_HUB_PRINTF("standalone hub\n");
  978. switch (hub->desc.wHubCharacteristics & HUB_CHAR_OCPM) {
  979. case 0x00:
  980. USB_HUB_PRINTF("global over-current protection\n");
  981. break;
  982. case 0x08:
  983. USB_HUB_PRINTF("individual port over-current protection\n");
  984. break;
  985. case 0x10:
  986. case 0x18:
  987. USB_HUB_PRINTF("no over-current protection\n");
  988. break;
  989. }
  990. USB_HUB_PRINTF("power on to power good time: %dms\n", descriptor->bPwrOn2PwrGood * 2);
  991. USB_HUB_PRINTF("hub controller current requirement: %dmA\n", descriptor->bHubContrCurrent);
  992. for (i = 0; i < dev->maxchild; i++)
  993. USB_HUB_PRINTF("port %d is%s removable\n", i + 1,
  994. hub->desc.DeviceRemovable[(i + 1)/8] & (1 << ((i + 1)%8)) ? " not" : "");
  995. if (sizeof(struct usb_hub_status) > USB_BUFSIZ) {
  996. USB_HUB_PRINTF("usb_hub_configure: failed to get Status - too long: %d\n",
  997. descriptor->bLength);
  998. return -1;
  999. }
  1000. if (usb_get_hub_status(dev, buffer) < 0) {
  1001. USB_HUB_PRINTF("usb_hub_configure: failed to get Status %lX\n",dev->status);
  1002. return -1;
  1003. }
  1004. hubsts = (struct usb_hub_status *)buffer;
  1005. USB_HUB_PRINTF("get_hub_status returned status %X, change %X\n",
  1006. swap_16(hubsts->wHubStatus),swap_16(hubsts->wHubChange));
  1007. USB_HUB_PRINTF("local power source is %s\n",
  1008. (swap_16(hubsts->wHubStatus) & HUB_STATUS_LOCAL_POWER) ? "lost (inactive)" : "good");
  1009. USB_HUB_PRINTF("%sover-current condition exists\n",
  1010. (swap_16(hubsts->wHubStatus) & HUB_STATUS_OVERCURRENT) ? "" : "no ");
  1011. usb_hub_power_on(hub);
  1012. for (i = 0; i < dev->maxchild; i++) {
  1013. struct usb_port_status portsts;
  1014. unsigned short portstatus, portchange;
  1015. if (usb_get_port_status(dev, i + 1, &portsts) < 0) {
  1016. USB_HUB_PRINTF("get_port_status failed\n");
  1017. continue;
  1018. }
  1019. portstatus = swap_16(portsts.wPortStatus);
  1020. portchange = swap_16(portsts.wPortChange);
  1021. USB_HUB_PRINTF("Port %d Status %X Change %X\n",i+1,portstatus,portchange);
  1022. if (portchange & USB_PORT_STAT_C_CONNECTION) {
  1023. USB_HUB_PRINTF("port %d connection change\n", i + 1);
  1024. usb_hub_port_connect_change(dev, i);
  1025. }
  1026. if (portchange & USB_PORT_STAT_C_ENABLE) {
  1027. USB_HUB_PRINTF("port %d enable change, status %x\n", i + 1, portstatus);
  1028. usb_clear_port_feature(dev, i + 1, USB_PORT_FEAT_C_ENABLE);
  1029. /* EM interference sometimes causes bad shielded USB devices to
  1030. * be shutdown by the hub, this hack enables them again.
  1031. * Works at least with mouse driver */
  1032. if (!(portstatus & USB_PORT_STAT_ENABLE) &&
  1033. (portstatus & USB_PORT_STAT_CONNECTION) && (dev->children[i])) {
  1034. USB_HUB_PRINTF("already running port %i disabled by hub (EMI?), re-enabling...\n",
  1035. i + 1);
  1036. usb_hub_port_connect_change(dev, i);
  1037. }
  1038. }
  1039. if (portstatus & USB_PORT_STAT_SUSPEND) {
  1040. USB_HUB_PRINTF("port %d suspend change\n", i + 1);
  1041. usb_clear_port_feature(dev, i + 1, USB_PORT_FEAT_SUSPEND);
  1042. }
  1043. if (portchange & USB_PORT_STAT_C_OVERCURRENT) {
  1044. USB_HUB_PRINTF("port %d over-current change\n", i + 1);
  1045. usb_clear_port_feature(dev, i + 1, USB_PORT_FEAT_C_OVER_CURRENT);
  1046. usb_hub_power_on(hub);
  1047. }
  1048. if (portchange & USB_PORT_STAT_C_RESET) {
  1049. USB_HUB_PRINTF("port %d reset change\n", i + 1);
  1050. usb_clear_port_feature(dev, i + 1, USB_PORT_FEAT_C_RESET);
  1051. }
  1052. } /* end for i all ports */
  1053. return 0;
  1054. }
  1055. int usb_hub_probe(struct usb_device *dev, int ifnum)
  1056. {
  1057. struct usb_interface_descriptor *iface;
  1058. struct usb_endpoint_descriptor *ep;
  1059. int ret;
  1060. iface = &dev->config.if_desc[ifnum];
  1061. /* Is it a hub? */
  1062. if (iface->bInterfaceClass != USB_CLASS_HUB)
  1063. return 0;
  1064. /* Some hubs have a subclass of 1, which AFAICT according to the */
  1065. /* specs is not defined, but it works */
  1066. if ((iface->bInterfaceSubClass != 0) &&
  1067. (iface->bInterfaceSubClass != 1))
  1068. return 0;
  1069. /* Multiple endpoints? What kind of mutant ninja-hub is this? */
  1070. if (iface->bNumEndpoints != 1)
  1071. return 0;
  1072. ep = &iface->ep_desc[0];
  1073. /* Output endpoint? Curiousier and curiousier.. */
  1074. if (!(ep->bEndpointAddress & USB_DIR_IN))
  1075. return 0;
  1076. /* If it's not an interrupt endpoint, we'd better punt! */
  1077. if ((ep->bmAttributes & 3) != 3)
  1078. return 0;
  1079. /* We found a hub */
  1080. USB_HUB_PRINTF("USB hub found\n");
  1081. ret=usb_hub_configure(dev);
  1082. return ret;
  1083. }
  1084. #endif /* (CONFIG_COMMANDS & CFG_CMD_USB) */
  1085. /* EOF */