📄 cmd_usb.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 + -