xref: /plan9/sys/src/cmd/usb/serial/main.c (revision 9b7bf7df4595c26f1e9b67beb0c6e44c9876fb05)
15e4f5c78SDavid du Colombier #include <u.h>
25e4f5c78SDavid du Colombier #include <libc.h>
35e4f5c78SDavid du Colombier #include <thread.h>
45e4f5c78SDavid du Colombier #include "usb.h"
55e4f5c78SDavid du Colombier #include "usbfs.h"
65e4f5c78SDavid du Colombier #include "serial.h"
74d52e0f0SDavid du Colombier #include "ucons.h"
85e4f5c78SDavid du Colombier #include "prolific.h"
980e9508eSDavid du Colombier #include "ftdi.h"
10*9b7bf7dfSDavid du Colombier #include "silabs.h"
115e4f5c78SDavid du Colombier 
125e4f5c78SDavid du Colombier enum {
135e4f5c78SDavid du Colombier 	Arglen = 80,
145e4f5c78SDavid du Colombier };
155e4f5c78SDavid du Colombier 
1680e9508eSDavid du Colombier typedef struct Parg Parg;
174d52e0f0SDavid du Colombier 
1880e9508eSDavid du Colombier /* keep in sync with serial.c */
195e4f5c78SDavid du Colombier static void
usage(void)205e4f5c78SDavid du Colombier usage(void)
215e4f5c78SDavid du Colombier {
22ed868a7cSDavid du Colombier 	fprint(2, "usage: %s [-dD] [-N nb] [-m mtpt] [-s srv] [dev...]\n", argv0);
235e4f5c78SDavid du Colombier 	threadexitsall("usage");
245e4f5c78SDavid du Colombier }
255e4f5c78SDavid du Colombier 
265e4f5c78SDavid du Colombier static int
matchserial(char * info,void *)275e4f5c78SDavid du Colombier matchserial(char *info, void*)
285e4f5c78SDavid du Colombier {
2980e9508eSDavid du Colombier 	if(uconsmatch(info) == 0 || plmatch(info) == 0 ||
30*9b7bf7dfSDavid du Colombier 	    ftmatch(nil, info) == 0 || slmatch(info) == 0)
315e4f5c78SDavid du Colombier 		return 0;
325e4f5c78SDavid du Colombier 	return -1;
335e4f5c78SDavid du Colombier }
345e4f5c78SDavid du Colombier 
355e4f5c78SDavid du Colombier void
threadmain(int argc,char ** argv)365e4f5c78SDavid du Colombier threadmain(int argc, char **argv)
375e4f5c78SDavid du Colombier {
385e4f5c78SDavid du Colombier 	char *mnt, *srv, *as, *ae;
395e4f5c78SDavid du Colombier 	char args[Arglen];
405e4f5c78SDavid du Colombier 
41b2495906SDavid du Colombier 	mnt = "/dev";
425e4f5c78SDavid du Colombier 	srv = nil;
435e4f5c78SDavid du Colombier 
445e4f5c78SDavid du Colombier 	quotefmtinstall();
455e4f5c78SDavid du Colombier 	ae = args + sizeof args;
465e4f5c78SDavid du Colombier 	as = seprint(args, ae, "serial");
475e4f5c78SDavid du Colombier 	ARGBEGIN{
485e4f5c78SDavid du Colombier 	case 'D':
495e4f5c78SDavid du Colombier 		usbfsdebug++;
505e4f5c78SDavid du Colombier 		break;
515e4f5c78SDavid du Colombier 	case 'd':
525e4f5c78SDavid du Colombier 		usbdebug++;
535e4f5c78SDavid du Colombier 		as = seprint(as, ae, " -d");
545e4f5c78SDavid du Colombier 		break;
55ed868a7cSDavid du Colombier 	case 'N':
56ed868a7cSDavid du Colombier 		as = seprint(as, ae, " -N %s", EARGF(usage()));
57ed868a7cSDavid du Colombier 		break;
585e4f5c78SDavid du Colombier 	case 'm':
595e4f5c78SDavid du Colombier 		mnt = EARGF(usage());
605e4f5c78SDavid du Colombier 		break;
615e4f5c78SDavid du Colombier 	case 's':
625e4f5c78SDavid du Colombier 		srv = EARGF(usage());
635e4f5c78SDavid du Colombier 		break;
645e4f5c78SDavid du Colombier 	default:
655e4f5c78SDavid du Colombier 		usage();
665e4f5c78SDavid du Colombier 		break;
675e4f5c78SDavid du Colombier 	}ARGEND;
685e4f5c78SDavid du Colombier 
695e4f5c78SDavid du Colombier 	rfork(RFNOTEG);
705e4f5c78SDavid du Colombier 	fmtinstall('U', Ufmt);
715e4f5c78SDavid du Colombier 	threadsetgrp(threadid());
725e4f5c78SDavid du Colombier 
735e4f5c78SDavid du Colombier 	usbfsinit(srv, mnt, &usbdirfs, MAFTER|MCREATE);
745e4f5c78SDavid du Colombier 	startdevs(args, argv, argc, matchserial, nil, serialmain);
755e4f5c78SDavid du Colombier 	threadexits(nil);
765e4f5c78SDavid du Colombier }
77