⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cmd_usb.c

📁 USB monitor
💻 C
字号:
/* cmd_usb.c - Nereid USB Monitor / USB command * Copyright (C) 2003 Tachibana Eriko * * 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 */#include <stdio.h>#include <stdlib.h>#include "include/usbdef.h"#include "cmd_usb.h"#include "usbdesc.h"#include "usbinfo.h"#include "usbio.h"#include "usbmon.h"#include "util.h"/* Defines */#define INTFDESC_MAX	16		/* 巄掕 */#define EPDESC_MAX	(1 + 15 + 15)	/* DefaultPile=1, In=15, Out=15 */#define MAX_CONFDESC_SIZE (64 * 1024)/* Variables *//* Functions */static int usb_setup_sub (int devadr);/* Command: USB 偵愙懕偝傟偰偄傞婡婍偺懍搙傪敾暿偡傞 */intusb_detect_speed (int argc, char* argv[]){  UsbInfo* usb0 = get_usbinfo (0);  init_all_usbinfo ();  usb0->speed = UsbDetectSpeed ();  /* 惓忢廔椆 */  return RET_SUCCESS;}/* Command: USB 偵愙懕偝傟偰偄傞婡婍傪儕僙僢僩偡傞 */intusb_reset (int argc, char* argv[]){  UsbReset ();  init_all_usbinfo ();  /* 惓忢廔椆 */  return RET_SUCCESS;}/* Command: USB 偵愙懕偝傟偰偄傞婡婍偺僙僢僩傾僢僾傪峴偆 */intusb_setup (int argc, char* argv[]){  int i;  /* 堷悢徣棯帪 */  /* RootHub 僨僶僀僗忋(Nereid 捈寢)偺僨僶僀僗傪僙僢僩傾僢僾 */  if (argc == 0)    {      usb_setup_sub (1);      /* 惓忢廔椆 */      return RET_SUCCESS;    }  /* 僨僶僀僗傾僪儗僗仌億乕僩斣崋巜掕帪 */  /* Hub 僨僶僀僗忋偺僨僶僀僗傪僙僢僩傾僢僾 */  printf ("Hub 僨僶僀僗偵偼傑偩懳墳偟偰偄傑偣傫.\n");  for (i = 0; i < argc; i += 2)    {      int devadr, port;      if ((sscanf (argv[i + 0], "%i", &devadr) != 1)       || (sscanf (argv[i + 1], "%i", &port) != 1)       || (devadr < 1 || DEVADR_MAX < devadr))	{	  printf ("usb setup: 堷悢偑惓偟偔偁傝傑偣傫.\n");	  return RET_FAILURE;	}#if 0      usb_setup_via_hub (devadr, port);#endif    }  /* 惓忢廔椆 */  return RET_SUCCESS;}/* USB 婡婍僙僢僩傾僢僾 */static intusb_setup_sub (int mode){  UsbInfo* usb0 = alloc_usbinfo0 ();  UsbInfo* usb = NULL;  DevDesc devdesc;  int rc;#if 1	/* 崱偺偲偙傠堄枴側偟 */  IntfDesc intfdesc[INTFDESC_MAX];  EpDesc epdesc[EPDESC_MAX];  int intfdesc_num = 0;  int epdesc_num = 0;#endif  /* 僐儞僼傿僊儏儗乕僔儑儞僨僗僋儕僾僞撉傒崬傒僶僢僼傽傪妋曐 */  {    usb0->confdescp = malloc (MAX_CONFDESC_SIZE);    if (usb0->confdescp == NULL)      {        printf ("僶僢僼傽傪妋曐偱偒傑偣傫.\n");        goto error;      }  }  /* USB = Powered 忬懺 */  /* 愙懕僠僃僢僋徣棯 */  usb0->phase = PHASE_POWERED;  if (mode == 1)    {      init_all_usbinfo ();      usb0->speed = UsbDetectSpeed ();      if (usb0->speed == SPEED_UNKNOWN)	goto error;    }  /* USB = Default 忬懺 */  /* Set Address 偑姰椆偡傞傑偱偼 Device Address = 0 傪巊偆 */  usb0->phase = PHASE_DEFAULT;  /* 僨僶僀僗僨僗僋儕僾僞傪撉傒崬傓(嵟戝僷働僢僩挿偺庢摼梡) */  printf ("<< Get Device Descriptor #0 >>\n");  {    /* 僨僶僀僗僨僗僋儕僾僞偺愭摢晹暘偩偗撉傒崬傓曽朄傪帋 */    /* 偟偨偑丄庤帩偪偺儊儌儕僇乕僪儕乕僟乕偱僙僢僩傾僢僾 */    /* 偵幐攕偡傞偺偱僨僶僀僗僨僗僋儕僾僞慡懱傪撉傒崬傓   */    const int reqsize = sizeof_DevDesc;#if 0    const int reqsize = ((char*) &devdesc.bMaxPacketSize0) - ((char*) &devdesc)			+ sizeof (devdesc.bMaxPacketSize0);#endif    /* 庤帩偪偺僇乕僪儕乕僟偱 payload = 32 偱側偄偲庴怣偱偒 */    /* 側偄傕偺偑偁偭偨偺偱丄payload 傪曄偊偰帋偡傛偆偵偟偨 */    for (usb0->bMaxPacketSize0 = 8; ;)      {	rc = GetDesc0 (usb0->devadr, DES_DEVICE << 8, reqsize, &devdesc,						usb0->bMaxPacketSize0, usb0->speed);	/* 惓忢偵庢摼偱偒傟偽妋掕 */	if (rc == reqsize)	  break;	if (usb0->speed != FULL_SPEED || usb0->bMaxPacketSize0 == 64)	  goto error;	/* Full Speed 僨僶僀僗偺応崌丄payload = 16, 32, 64 偱嵞帋峴 */	usb0->bMaxPacketSize0 *= 2;	printf ("嵟戝僷働僢僩挿傪 %d 偵曄峏偟偰嵞帋峴偟傑偡.\n", usb0->bMaxPacketSize0);      }    /* 偁傑傝堄枴偼側偄偗偳僠僃僢僋 */    if (rc != reqsize || devdesc.bLength != sizeof_DevDesc)      {	printf ("Device Descriptor 傪庢摼偱偒傑偣傫偱偟偨.\n");	goto error;      }    /* bMaxPacketSize0 偲堎側傞僷働僢僩僒僀僘偱傕撉傒崬傔傞僨僶僀僗 */    /* 偑偁傞偺偱丄僨僶僀僗僨僗僋儕僾僞撪偺抣傪惓幃偵嵦梡偡傞.	    */    usb0->bMaxPacketSize0 = devdesc.bMaxPacketSize0;    printf ("bMaxPacketSize0 = %d\n", usb0->bMaxPacketSize0);  }  /* 僙僢僩傾僪儗僗埲崀偵巊梡偡傞僨僶僀僗忣曬僥乕僽儖傪弶婜壔 */  {    usb = alloc_usbinfo ();    if (usb == NULL)      goto error;    usb->bMaxPacketSize0 = usb0->bMaxPacketSize0;    usb->speed = usb0->speed;    usb->confdescp = usb0->confdescp;    /* 偙傟埲奜偼弶婜抣偺傑傑巊梡仌傑偩晄柧 */  }  /* 僨僶僀僗傾僪儗僗傪愝掕偡傞 */  printf ("<< Set Address >>\n");  {    rc = SetAddress (TYPE_STANDARD, usb->devadr, usb->bMaxPacketSize0, usb->speed);    if (rc < 0)      {	printf ("Set Address 偵幐攕偟傑偟偨.\n");	goto error;      }    printf ("僨僶僀僗傾僪儗僗 = %d\n", usb->devadr);    usb0->confdescp = NULL;    free_usbinfo (usb0);  }  /* USB = Address 忬懺 */  /* Set Address 偑惉岟偟偨傜埲崀偼愝掕偟偨僨僶僀僗傾僪儗僗傪巊偆 */  usb->phase = PHASE_ADDRESS;  /* 僨僶僀僗僨僗僋儕僾僞傪撉傒崬傓 */  printf ("<< Get Device Descriptor #1 >>\n");  {    rc = GetDesc0 (usb->devadr, DES_DEVICE << 8, sizeof_DevDesc, &devdesc,					usb->bMaxPacketSize0, usb->speed);    if (rc < 0)      goto error;    if (rc != sizeof_DevDesc)      {	printf ("Device Descriptor 傪庢摼偱偒傑偣傫偱偟偨.\n");	goto error;      }    if (verbose_level >= 2)      print_descriptor (&devdesc);  }  /* 僐儞僼傿僊儏儗乕僔儑儞僨僗僋儕僾僞傪撉傒崬傓(崌寁僒僀僘偺庢摼梡) */  printf ("<< Get Configuration #0 >>\n");  {    const int reqsize = ((char*) &usb->confdescp->wTotalLength) - ((char*) usb->confdescp)		      + sizeof (usb->confdescp->wTotalLength);    rc = GetDesc0 (usb->devadr, DES_CONFIGURATION << 8, reqsize, usb->confdescp,					usb->bMaxPacketSize0, usb->speed);    if (rc < 0)      goto error;    if (rc != reqsize)      {	printf ("Configuration Descriptor 傪庢摼偱偒傑偣傫偱偟偨.\n");	goto error;      }    usb->total_confdesc = read_w (usb->confdescp->wTotalLength);    realloc (usb->confdescp, usb->total_confdesc);  }  /* 僐儞僼傿僊儏儗乕僔儑儞僨僗僋儕僾僞傪撉傒崬傓 */  printf ("<< Get Configuration #1 >>\n");  {    rc = GetDesc0 (usb->devadr, DES_CONFIGURATION << 8, usb->total_confdesc,				usb->confdescp, usb->bMaxPacketSize0, usb->speed);    if (rc < 0)      goto error;    if (rc != usb->total_confdesc)      {	printf ("Configuration Descriptor 傪庢摼偱偒傑偣傫偱偟偨.\n");	goto error;      }    if (verbose_level >= 2)      print_descriptor (usb->confdescp);  }  /* 僐儞僼傿僊儏儗乕僔儑儞傪愝掕偡傞 */  printf ("<< Set Configuration >>\n");  {    /* 愝掕偡傞僐儞僼傿僊儏儗乕僔儑儞斣崋 */    usb->confno = usb->confdescp->bConfigurationValue;    rc = SetConfiguration (TYPE_STANDARD, usb->devadr, usb->confno,					usb->bMaxPacketSize0, usb->speed);    if (rc < 0)      goto error;  }  /* USB = Configuration 忬懺 */  usb->phase = PHASE_CONFIGURATION;  /* 撉傒崬傫偩僨僗僋儕僾僞傪弴偵夝庍偟偰偄偔 */  {    unsigned char* p = (unsigned char*) usb->confdescp;    unsigned char* tail = (unsigned char*) usb->confdescp + usb->total_confdesc;    print_descriptor (&devdesc);    while (p < tail)      {	const int minsize = ((char*) &devdesc.bDescriptorType) - ((char*) &devdesc)			    + sizeof (devdesc.bDescriptorType);	int desc_len, desc_type;	if ((tail - p) < minsize)	  {	    printf ("Descriptor 偺僒僀僘偑晄惓偱偡.\n");	    goto error;	  }	desc_len = ((DevDesc*) p)->bLength;	desc_type = ((DevDesc*) p)->bDescriptorType;	if (tail < &p[desc_len])	  {	    printf ("Descriptor 偺僒僀僘偑晄惓偱偡.\n");	    goto error;	  }	/* 僨僗僋儕僾僞偺撪梕傪昞帵 */	print_descriptor (p);	switch (desc_type)	  {	  case DES_INTERFACE:	    if (intfdesc_num < INTFDESC_MAX)	      intfdesc[intfdesc_num++] = *(IntfDesc*) p;	    else	      printf ("僀儞僞乕僼僃乕僗僨僗僋儕僾僞偺悢偑懡偡偓偰 usbmon 偱偼埖偊傑偣傫.\n"		      "%d 屄栚埲崀偼柍帇偟傑偡.\n", INTFDESC_MAX + 1);	    break;	  case DES_ENDPOINT:	    if (epdesc_num < EPDESC_MAX)	      epdesc[epdesc_num++] = *(EpDesc*) p;	    else	      printf ("僄儞僪億僀儞僩偺悢偑懡偡偓傑偡.\n");	    break;	  default:	    break;	}	p += desc_len;      }  }/* success: */  printf ("僨僶僀僗傾僪儗僗 = %d, 僙僢僩傾僢僾偑姰椆偟傑偟偨.\n", usb->devadr);  return 1;error:  printf ("僙僢僩傾僢僾偵幐攕偟傑偟偨.\n");  free_usbinfo (usb0);  free_usbinfo (usb);  return 0;}/* 晄嬶崌2003-11-10	儅僂僗傪僙僢僩傾僢僾偟偰敳偒丄Justy UHB-02G 僴僽傪儂僢僩僾儔僌偱憓偟偰	僙僢僩傾僢僾傪峴偆偲丄<< Get Device Descriptor #0 >> 偱巭傑傞.*//* EOF */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -