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