xref: /plan9/sys/src/cmd/usb/serial/main.c (revision ed868a7c1f0ac853ba7f6fe1cfc03d41d6ae4523)
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"
105e4f5c78SDavid du Colombier 
115e4f5c78SDavid du Colombier enum {
125e4f5c78SDavid du Colombier 	Arglen = 80,
135e4f5c78SDavid du Colombier };
145e4f5c78SDavid du Colombier 
1580e9508eSDavid du Colombier typedef struct Parg Parg;
164d52e0f0SDavid du Colombier 
1780e9508eSDavid du Colombier /* keep in sync with serial.c */
185e4f5c78SDavid du Colombier static void
195e4f5c78SDavid du Colombier usage(void)
205e4f5c78SDavid du Colombier {
21*ed868a7cSDavid du Colombier 	fprint(2, "usage: %s [-dD] [-N nb] [-m mtpt] [-s srv] [dev...]\n", argv0);
225e4f5c78SDavid du Colombier 	threadexitsall("usage");
235e4f5c78SDavid du Colombier }
245e4f5c78SDavid du Colombier 
255e4f5c78SDavid du Colombier static int
265e4f5c78SDavid du Colombier matchserial(char *info, void*)
275e4f5c78SDavid du Colombier {
2880e9508eSDavid du Colombier 	if(uconsmatch(info) == 0 || plmatch(info) == 0 ||
2980e9508eSDavid du Colombier 	    ftmatch(nil, info) == 0)
305e4f5c78SDavid du Colombier 		return 0;
315e4f5c78SDavid du Colombier 	return -1;
325e4f5c78SDavid du Colombier }
335e4f5c78SDavid du Colombier 
345e4f5c78SDavid du Colombier void
355e4f5c78SDavid du Colombier threadmain(int argc, char **argv)
365e4f5c78SDavid du Colombier {
375e4f5c78SDavid du Colombier 	char *mnt, *srv, *as, *ae;
385e4f5c78SDavid du Colombier 	char args[Arglen];
395e4f5c78SDavid du Colombier 
40b2495906SDavid du Colombier 	mnt = "/dev";
415e4f5c78SDavid du Colombier 	srv = nil;
425e4f5c78SDavid du Colombier 
435e4f5c78SDavid du Colombier 	quotefmtinstall();
445e4f5c78SDavid du Colombier 	ae = args + sizeof args;
455e4f5c78SDavid du Colombier 	as = seprint(args, ae, "serial");
465e4f5c78SDavid du Colombier 	ARGBEGIN{
475e4f5c78SDavid du Colombier 	case 'D':
485e4f5c78SDavid du Colombier 		usbfsdebug++;
495e4f5c78SDavid du Colombier 		break;
505e4f5c78SDavid du Colombier 	case 'd':
515e4f5c78SDavid du Colombier 		usbdebug++;
525e4f5c78SDavid du Colombier 		as = seprint(as, ae, " -d");
535e4f5c78SDavid du Colombier 		break;
54*ed868a7cSDavid du Colombier 	case 'N':
55*ed868a7cSDavid du Colombier 		as = seprint(as, ae, " -N %s", EARGF(usage()));
56*ed868a7cSDavid du Colombier 		break;
575e4f5c78SDavid du Colombier 	case 'm':
585e4f5c78SDavid du Colombier 		mnt = EARGF(usage());
595e4f5c78SDavid du Colombier 		break;
605e4f5c78SDavid du Colombier 	case 's':
615e4f5c78SDavid du Colombier 		srv = EARGF(usage());
625e4f5c78SDavid du Colombier 		break;
635e4f5c78SDavid du Colombier 	default:
645e4f5c78SDavid du Colombier 		usage();
655e4f5c78SDavid du Colombier 		break;
665e4f5c78SDavid du Colombier 	}ARGEND;
675e4f5c78SDavid du Colombier 
685e4f5c78SDavid du Colombier 	rfork(RFNOTEG);
695e4f5c78SDavid du Colombier 	fmtinstall('U', Ufmt);
705e4f5c78SDavid du Colombier 	threadsetgrp(threadid());
715e4f5c78SDavid du Colombier 
725e4f5c78SDavid du Colombier 	usbfsinit(srv, mnt, &usbdirfs, MAFTER|MCREATE);
735e4f5c78SDavid du Colombier 	startdevs(args, argv, argc, matchserial, nil, serialmain);
745e4f5c78SDavid du Colombier 	threadexits(nil);
755e4f5c78SDavid du Colombier }
76