xref: /plan9/sys/src/cmd/usb/serial/main.c (revision ba8542f7a64cb018d856de588f59d755d599b1d2)
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