1 #include <u.h> 2 #include <libc.h> 3 #include <thread.h> 4 #include "usb.h" 5 #include "usbfs.h" 6 #include "serial.h" 7 #include "prolific.h" 8 9 typedef struct Parg Parg; 10 11 enum { 12 Arglen = 80, 13 }; 14 15 Cinfo cinfo[] = { 16 { PL2303Vid, PL2303Did }, 17 { PL2303Vid, PL2303DidRSAQ2 }, 18 { PL2303Vid, PL2303DidDCU11 }, 19 { PL2303Vid, PL2303DidRSAQ3 }, 20 { PL2303Vid, PL2303DidPHAROS }, 21 { PL2303Vid, PL2303DidALDIGA }, 22 { PL2303Vid, PL2303DidMMX }, 23 { PL2303Vid, PL2303DidGPRS }, 24 { IODATAVid, IODATADid }, 25 { IODATAVid, IODATADidRSAQ5 }, 26 { ATENVid, ATENDid }, 27 { ATENVid2, ATENDid }, 28 { ELCOMVid, ELCOMDid }, 29 { ELCOMVid, ELCOMDidUCSGT }, 30 { ITEGNOVid, ITEGNODid }, 31 { ITEGNOVid, ITEGNODid2080 }, 32 { MA620Vid, MA620Did }, 33 { RATOCVid, RATOCDid }, 34 { TRIPPVid, TRIPPDid }, 35 { RADIOSHACKVid,RADIOSHACKDid }, 36 { DCU10Vid, DCU10Did }, 37 { SITECOMVid, SITECOMDid }, 38 { ALCATELVid, ALCATELDid }, 39 { SAMSUNGVid, SAMSUNGDid }, 40 { SIEMENSVid, SIEMENSDidSX1 }, 41 { SIEMENSVid, SIEMENSDidX65 }, 42 { SIEMENSVid, SIEMENSDidX75 }, 43 { SIEMENSVid, SIEMENSDidEF81 }, 44 { SYNTECHVid, SYNTECHDid }, 45 { NOKIACA42Vid, NOKIACA42Did }, 46 { CA42CA42Vid, CA42CA42Did }, 47 { SAGEMVid, SAGEMDid }, 48 { LEADTEKVid, LEADTEK9531Did }, 49 { SPEEDDRAGONVid,SPEEDDRAGONDid }, 50 { DATAPILOTU2Vid,DATAPILOTU2Did }, 51 { BELKINVid, BELKINDid }, 52 { ALCORVid, ALCORDid }, 53 { WS002INVid, WS002INDid }, 54 { COREGAVid, COREGADid }, 55 { YCCABLEVid, YCCABLEDid }, 56 { SUPERIALVid, SUPERIALDid }, 57 { HPVid, HPLD220Did }, 58 { 0, 0 }, 59 }; 60 61 static void 62 usage(void) 63 { 64 fprint(2, "usage: %s [-d] [-a n] [dev...]\n", argv0); 65 threadexitsall("usage"); 66 } 67 68 static int 69 matchserial(char *info, void*) 70 { 71 Cinfo *ip; 72 char buf[50]; 73 74 for(ip = cinfo; ip->vid != 0; ip++){ 75 snprint(buf, sizeof buf, "vid %#06x did %#06x", 76 ip->vid, ip->did); 77 dsprint(2, "serial: %s %s", buf, info); 78 if(strstr(info, buf) != nil) 79 return 0; 80 } 81 return -1; 82 } 83 84 void 85 threadmain(int argc, char **argv) 86 { 87 char *mnt, *srv, *as, *ae; 88 char args[Arglen]; 89 90 mnt = "/dev"; 91 srv = nil; 92 93 quotefmtinstall(); 94 ae = args + sizeof args; 95 as = seprint(args, ae, "serial"); 96 ARGBEGIN{ 97 case 'D': 98 usbfsdebug++; 99 break; 100 case 'd': 101 usbdebug++; 102 as = seprint(as, ae, " -d"); 103 break; 104 case 'm': 105 mnt = EARGF(usage()); 106 break; 107 case 's': 108 srv = EARGF(usage()); 109 break; 110 default: 111 usage(); 112 break; 113 }ARGEND; 114 115 rfork(RFNOTEG); 116 fmtinstall('U', Ufmt); 117 threadsetgrp(threadid()); 118 119 usbfsinit(srv, mnt, &usbdirfs, MAFTER|MCREATE); 120 startdevs(args, argv, argc, matchserial, nil, serialmain); 121 threadexits(nil); 122 } 123