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