serial.c 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758
  1. /*
  2. * This part takes care of locking except for initialization and
  3. * other threads created by the hw dep. drivers.
  4. * BUG: An error on the device does not make the driver exit.
  5. * It probably should.
  6. */
  7. #include <u.h>
  8. #include <libc.h>
  9. #include <ctype.h>
  10. #include <thread.h>
  11. #include "usb.h"
  12. #include "usbfs.h"
  13. #include "serial.h"
  14. #include "prolific.h"
  15. #include "ucons.h"
  16. #include "ftdi.h"
  17. int serialdebug;
  18. enum {
  19. /* Qids. Maintain order (relative to dirtabs structs) */
  20. Qroot = 0,
  21. Qctl,
  22. Qdata,
  23. Qmax,
  24. };
  25. typedef struct Dirtab Dirtab;
  26. struct Dirtab {
  27. char *name;
  28. int mode;
  29. };
  30. static Dirtab dirtab[] = {
  31. [Qroot] "/", DMDIR|0555,
  32. [Qdata] "eiaU", 0660,
  33. [Qctl] "eiaUctl", 0664,
  34. };
  35. static int sdebug;
  36. int
  37. serialnop(Serial *)
  38. {
  39. return 0;
  40. }
  41. int
  42. serialnopctl(Serial *, int)
  43. {
  44. return 0;
  45. }
  46. static void
  47. serialfatal(Serial *ser)
  48. {
  49. dsprint(2, "serial: fatal error, detaching\n");
  50. devctl(ser->dev, "detach");
  51. usbfsdel(&ser->fs);
  52. }
  53. /* I sleep with the lock... only way to drain in general */
  54. static void
  55. serialdrain(Serial *ser)
  56. {
  57. uint baud, pipesize;
  58. if(ser->maxwrite < 256)
  59. pipesize = 256;
  60. else
  61. pipesize = ser->maxwrite;
  62. baud = ser->baud;
  63. /* wait for the at least 256-byte pipe to clear */
  64. sleep(10 + pipesize/((1 + baud)*1000));
  65. if(ser->clearpipes != nil)
  66. ser->clearpipes(ser);
  67. }
  68. int
  69. serialreset(Serial *ser)
  70. {
  71. /* cmd for reset */
  72. serialdrain(ser);
  73. if(ser->reset != nil)
  74. ser->reset(ser);
  75. return 0;
  76. }
  77. /* call this if something goes wrong */
  78. int
  79. serialrecover(Serial *ser, char *err)
  80. {
  81. if(strstr(err, "detached") != nil)
  82. return -1;
  83. if(ser->recover > 1)
  84. serialfatal(ser);
  85. ser->recover++;
  86. if(serialreset(ser) < 0)
  87. return -1;
  88. ser->recover = 0;
  89. return 0;
  90. }
  91. static int
  92. serialctl(Serial *p, char *cmd)
  93. {
  94. int c, i, n, nf, nop, nw, par, drain, set, lines;
  95. char *f[16];
  96. uchar x;
  97. drain = set = lines = 0;
  98. nf = tokenize(cmd, f, nelem(f));
  99. for(i = 0; i < nf; i++){
  100. if(strncmp(f[i], "break", 5) == 0){
  101. if(p->setbreak != nil)
  102. p->setbreak(p, 1);
  103. continue;
  104. }
  105. nop = 0;
  106. n = atoi(f[i]+1);
  107. c = *f[i];
  108. if (isascii(c) && isupper(c))
  109. c = tolower(c);
  110. switch(c){
  111. case 'b':
  112. drain++;
  113. p->baud = n;
  114. set++;
  115. break;
  116. case 'c':
  117. p->dcd = n;
  118. // lines++;
  119. ++nop;
  120. break;
  121. case 'd':
  122. p->dtr = n;
  123. lines++;
  124. break;
  125. case 'e':
  126. p->dsr = n;
  127. // lines++;
  128. ++nop;
  129. break;
  130. case 'f': /* flush the pipes */
  131. drain++;
  132. break;
  133. case 'h': /* hangup?? */
  134. p->rts = p->dtr = 0;
  135. lines++;
  136. fprint(2, "serial: %c, unsure ctl\n", c);
  137. break;
  138. case 'i':
  139. ++nop;
  140. break;
  141. case 'k':
  142. drain++;
  143. p->setbreak(p, 1);
  144. sleep(n);
  145. p->setbreak(p, 0);
  146. break;
  147. case 'l':
  148. drain++;
  149. p->bits = n;
  150. set++;
  151. break;
  152. case 'm':
  153. drain++;
  154. if(p->modemctl != nil)
  155. p->modemctl(p, n);
  156. if(n == 0)
  157. p->cts = 0;
  158. break;
  159. case 'n':
  160. p->blocked = n;
  161. ++nop;
  162. break;
  163. case 'p': /* extended... */
  164. if(strlen(f[i]) != 2)
  165. return -1;
  166. drain++;
  167. par = f[i][1];
  168. if(par == 'n')
  169. p->parity = 0;
  170. else if(par == 'o')
  171. p->parity = 1;
  172. else if(par == 'e')
  173. p->parity = 2;
  174. else if(par == 'm') /* mark parity */
  175. p->parity = 3;
  176. else if(par == 's') /* space parity */
  177. p->parity = 4;
  178. else
  179. return -1;
  180. set++;
  181. break;
  182. case 'q':
  183. // drain++;
  184. p->limit = n;
  185. ++nop;
  186. break;
  187. case 'r':
  188. drain++;
  189. p->rts = n;
  190. lines++;
  191. break;
  192. case 's':
  193. drain++;
  194. p->stop = n;
  195. set++;
  196. break;
  197. case 'w':
  198. /* ?? how do I put this */
  199. p->timer = n * 100000LL;
  200. ++nop;
  201. break;
  202. case 'x':
  203. if(n == 0)
  204. x = CTLS;
  205. else
  206. x = CTLQ;
  207. if(p->wait4write != nil)
  208. nw = p->wait4write(p, &x, 1);
  209. else
  210. nw = write(p->epout->dfd, &x, 1);
  211. if(nw != 1){
  212. serialrecover(p, "");
  213. return -1;
  214. }
  215. break;
  216. }
  217. /*
  218. * don't print. the condition is harmless and the print
  219. * splatters all over the display.
  220. */
  221. USED(nop);
  222. if (0 && nop)
  223. fprint(2, "serial: %c, unsupported nop ctl\n", c);
  224. }
  225. if(drain)
  226. serialdrain(p);
  227. if(lines && !set){
  228. if(p->sendlines != nil && p->sendlines(p) < 0)
  229. return -1;
  230. } else if(set){
  231. if(p->setparam != nil && p->setparam(p) < 0)
  232. return -1;
  233. }
  234. return 0;
  235. }
  236. char *pformat = "noems";
  237. char *
  238. serdumpst(Serial *ser, char *buf, int bufsz)
  239. {
  240. char *e, *s;
  241. e = buf + bufsz;
  242. s = seprint(buf, e, "b%d ", ser->baud);
  243. s = seprint(s, e, "c%d ", ser->dcd); /* unimplemented */
  244. s = seprint(s, e, "d%d ", ser->dtr);
  245. s = seprint(s, e, "e%d ", ser->dsr); /* unimplemented */
  246. s = seprint(s, e, "l%d ", ser->bits);
  247. s = seprint(s, e, "m%d ", ser->mctl);
  248. if(ser->parity >= 0 || ser->parity < strlen(pformat))
  249. s = seprint(s, e, "p%c ", pformat[ser->parity]);
  250. else
  251. s = seprint(s, e, "p%c ", '?');
  252. s = seprint(s, e, "r%d ", ser->rts);
  253. s = seprint(s, e, "s%d ", ser->stop);
  254. s = seprint(s, e, "i%d ", ser->fifo);
  255. s = seprint(s, e, "\ndev(%d) ", 0);
  256. s = seprint(s, e, "type(%d) ", ser->type);
  257. s = seprint(s, e, "framing(%d) ", ser->nframeerr);
  258. s = seprint(s, e, "overruns(%d) ", ser->novererr);
  259. s = seprint(s, e, "berr(%d) ", ser->nbreakerr);
  260. s = seprint(s, e, " serr(%d) ", ser->nparityerr);
  261. return s;
  262. }
  263. static int
  264. serinit(Serial *ser)
  265. {
  266. int res;
  267. res = 0;
  268. if(ser->init != nil)
  269. res = ser->init(ser);
  270. if(ser->getparam != nil)
  271. ser->getparam(ser);
  272. ser->nframeerr = ser->nparityerr = ser->nbreakerr = ser->novererr = 0;
  273. return res;
  274. }
  275. static int
  276. dwalk(Usbfs *fs, Fid *fid, char *name)
  277. {
  278. int i;
  279. char *dname;
  280. Qid qid;
  281. Serial *ser;
  282. qid = fid->qid;
  283. if((qid.type & QTDIR) == 0){
  284. werrstr("walk in non-directory");
  285. return -1;
  286. }
  287. if(strcmp(name, "..") == 0){
  288. /* must be /eiaU%d; i.e. our root dir. */
  289. fid->qid.path = Qroot | fs->qid;
  290. fid->qid.vers = 0;
  291. fid->qid.type = QTDIR;
  292. return 0;
  293. }
  294. ser = fs->aux;
  295. for(i = 1; i < nelem(dirtab); i++){
  296. dname = smprint(dirtab[i].name, ser->fs.name);
  297. if(strcmp(name, dname) == 0){
  298. qid.path = i | fs->qid;
  299. qid.vers = 0;
  300. qid.type = dirtab[i].mode >> 24;
  301. fid->qid = qid;
  302. free(dname);
  303. return 0;
  304. } else
  305. free(dname);
  306. }
  307. werrstr(Enotfound);
  308. return -1;
  309. }
  310. static void
  311. dostat(Usbfs *fs, int path, Dir *d)
  312. {
  313. Dirtab *t;
  314. Serial *ser;
  315. t = &dirtab[path];
  316. d->qid.path = path;
  317. d->qid.type = t->mode >> 24;
  318. d->mode = t->mode;
  319. ser = fs->aux;
  320. if(strcmp(t->name, "/") == 0)
  321. d->name = t->name;
  322. else
  323. snprint(d->name, Namesz, t->name, ser->fs.name);
  324. d->length = 0;
  325. }
  326. static int
  327. dstat(Usbfs *fs, Qid qid, Dir *d)
  328. {
  329. int path;
  330. path = qid.path & ~fs->qid;
  331. dostat(fs, path, d);
  332. d->qid.path |= fs->qid;
  333. return 0;
  334. }
  335. static int
  336. dopen(Usbfs *fs, Fid *fid, int)
  337. {
  338. ulong path;
  339. // Serial *ser;
  340. path = fid->qid.path & ~fs->qid;
  341. // ser = fs->aux;
  342. switch(path){ /* BUG: unneeded? */
  343. case Qdata:
  344. dsprint(2, "serial, opened data\n");
  345. break;
  346. case Qctl:
  347. dsprint(2, "serial, opened ctl\n");
  348. break;
  349. }
  350. return 0;
  351. }
  352. static void
  353. filldir(Usbfs *fs, Dir *d, Dirtab *tab, int i)
  354. {
  355. d->qid.path = i | fs->qid;
  356. d->mode = tab->mode;
  357. if((d->mode & DMDIR) != 0)
  358. d->qid.type = QTDIR;
  359. else
  360. d->qid.type = QTFILE;
  361. d->name = tab->name;
  362. }
  363. static int
  364. dirgen(Usbfs *fs, Qid, int i, Dir *d, void *)
  365. {
  366. i++; /* skip root */
  367. if(i >= nelem(dirtab))
  368. return -1;
  369. filldir(fs, d, &dirtab[i], i);
  370. return 0;
  371. }
  372. enum {
  373. Serbufsize = 255,
  374. };
  375. static long
  376. dread(Usbfs *fs, Fid *fid, void *data, long count, vlong offset)
  377. {
  378. int dfd;
  379. long rcount;
  380. ulong path;
  381. char *e, *buf, *err; /* change */
  382. Qid q;
  383. Serial *ser;
  384. static int errrun, good;
  385. q = fid->qid;
  386. path = fid->qid.path & ~fs->qid;
  387. ser = fs->aux;
  388. buf = emallocz(Serbufsize, 1);
  389. err = emallocz(Serbufsize, 1);
  390. qlock(ser);
  391. switch(path){
  392. case Qroot:
  393. count = usbdirread(fs, q, data, count, offset, dirgen, nil);
  394. break;
  395. case Qdata:
  396. if(count > ser->maxread)
  397. count = ser->maxread;
  398. dsprint(2, "serial: reading from data\n");
  399. do {
  400. err[0] = 0;
  401. dfd = ser->epin->dfd;
  402. if(usbdebug >= 3)
  403. dsprint(2, "serial: reading: %ld\n", count);
  404. assert(count > 0);
  405. if(ser->wait4data != nil)
  406. rcount = ser->wait4data(ser, data, count);
  407. else{
  408. qunlock(ser);
  409. rcount = read(dfd, data, count);
  410. qlock(ser);
  411. }
  412. /*
  413. * if we encounter a long run of continuous read
  414. * errors, do something drastic so that our caller
  415. * doesn't just spin its wheels forever.
  416. */
  417. if(rcount < 0) {
  418. snprint(err, Serbufsize, "%r");
  419. ++errrun;
  420. sleep(20);
  421. if (good > 0 && errrun > 10000) {
  422. /* the line has been dropped; give up */
  423. qunlock(ser);
  424. fprint(2, "%s: line %s is gone: %r\n",
  425. argv0, ser->fs.name);
  426. threadexitsall("serial line gone");
  427. }
  428. } else {
  429. errrun = 0;
  430. good++;
  431. }
  432. if(usbdebug >= 3)
  433. dsprint(2, "serial: read: %s %ld\n", err, rcount);
  434. } while(rcount < 0 && strstr(err, "timed out") != nil);
  435. dsprint(2, "serial: read from bulk %ld, %10.10s\n", rcount, err);
  436. if(rcount < 0){
  437. dsprint(2, "serial: need to recover, data read %ld %r\n",
  438. count);
  439. serialrecover(ser, err);
  440. }
  441. dsprint(2, "serial: read from bulk %ld\n", rcount);
  442. count = rcount;
  443. break;
  444. case Qctl:
  445. if(offset != 0)
  446. count = 0;
  447. else {
  448. e = serdumpst(ser, buf, Serbufsize);
  449. count = usbreadbuf(data, count, 0, buf, e - buf);
  450. }
  451. break;
  452. }
  453. qunlock(ser);
  454. free(err);
  455. free(buf);
  456. return count;
  457. }
  458. static long
  459. altwrite(Serial *ser, uchar *buf, long count)
  460. {
  461. int nw, dfd;
  462. char err[128];
  463. do{
  464. if(ser->wait4write != nil)
  465. /* unlocked inside later */
  466. nw = ser->wait4write(ser, buf, count);
  467. else{
  468. dfd = ser->epout->dfd;
  469. qunlock(ser);
  470. nw = write(dfd, buf, count);
  471. qlock(ser);
  472. }
  473. rerrstr(err, sizeof err);
  474. } while(nw < 0 && strstr(err, "timed out") != nil);
  475. if(nw != count){
  476. dsprint(2, "serial: need to recover, status in write %d %r\n",
  477. nw);
  478. snprint(err, sizeof err, "%r");
  479. serialrecover(ser, err);
  480. }
  481. return nw;
  482. }
  483. static long
  484. dwrite(Usbfs *fs, Fid *fid, void *buf, long count, vlong)
  485. {
  486. ulong path;
  487. char *cmd;
  488. Serial *ser;
  489. ser = fs->aux;
  490. path = fid->qid.path & ~fs->qid;
  491. qlock(ser);
  492. switch(path){
  493. case Qdata:
  494. count = altwrite(ser, (uchar *)buf, count);
  495. break;
  496. case Qctl:
  497. cmd = emallocz(count+1, 1);
  498. memmove(cmd, buf, count);
  499. cmd[count] = 0;
  500. if(serialctl(ser, cmd) < 0){
  501. qunlock(ser);
  502. werrstr(Ebadctl);
  503. free(cmd);
  504. return -1;
  505. }
  506. free(cmd);
  507. break;
  508. default:
  509. qunlock(ser);
  510. werrstr(Eperm);
  511. return -1;
  512. }
  513. qunlock(ser);
  514. return count;
  515. }
  516. static int
  517. openeps(Serial *ser, int epin, int epout, int epintr)
  518. {
  519. ser->epin = openep(ser->dev, epin);
  520. if(ser->epin == nil){
  521. fprint(2, "serial: openep %d: %r\n", epin);
  522. return -1;
  523. }
  524. ser->epout = openep(ser->dev, epout);
  525. if(ser->epout == nil){
  526. fprint(2, "serial: openep %d: %r\n", epout);
  527. closedev(ser->epin);
  528. return -1;
  529. }
  530. devctl(ser->epin, "timeout 1000");
  531. devctl(ser->epout, "timeout 1000");
  532. if(ser->hasepintr){
  533. ser->epintr = openep(ser->dev, epintr);
  534. if(ser->epintr == nil){
  535. fprint(2, "serial: openep %d: %r\n", epintr);
  536. closedev(ser->epin);
  537. closedev(ser->epout);
  538. return -1;
  539. }
  540. opendevdata(ser->epintr, OREAD);
  541. devctl(ser->epintr, "timeout 1000");
  542. }
  543. if(ser->seteps!= nil)
  544. ser->seteps(ser);
  545. opendevdata(ser->epin, OREAD);
  546. opendevdata(ser->epout, OWRITE);
  547. if(ser->epin->dfd < 0 || ser->epout->dfd < 0 ||
  548. (ser->hasepintr && ser->epintr->dfd < 0)){
  549. fprint(2, "serial: open i/o ep data: %r\n");
  550. closedev(ser->epin);
  551. closedev(ser->epout);
  552. if(ser->hasepintr)
  553. closedev(ser->epintr);
  554. return -1;
  555. }
  556. return 0;
  557. }
  558. static int
  559. findendpoints(Serial *ser)
  560. {
  561. int i, epin, epout, epintr;
  562. Ep *ep, **eps;
  563. Usbdev *ud;
  564. epintr = epin = epout = -1;
  565. ud = ser->dev->usb;
  566. /*
  567. * interfc 0 means start from the start which is equiv to
  568. * iterate through endpoints probably, could be done better
  569. */
  570. if(ser->interfc == 0)
  571. eps = ud->ep;
  572. else
  573. eps = ser->dev->usb->conf[0]->iface[ser->interfc]->ep;
  574. for(i = 0; i < Niface; i++){
  575. if((ep = eps[i]) == nil)
  576. continue;
  577. if(ser->hasepintr && ep->type == Eintr &&
  578. ep->dir == Ein && epintr == -1)
  579. epintr = ep->id;
  580. if(ep->type == Ebulk){
  581. if(ep->dir == Ein && epin == -1)
  582. epin = ep->id;
  583. if(ep->dir == Eout && epout == -1)
  584. epout = ep->id;
  585. }
  586. }
  587. dprint(2, "serial: ep ids: in %d out %d intr %d\n", epin, epout, epintr);
  588. if(epin == -1 || epout == -1 || (ser->hasepintr && epintr == -1))
  589. return -1;
  590. if(openeps(ser, epin, epout, epintr) < 0)
  591. return -1;
  592. dprint(2, "serial: ep in %s out %s\n", ser->epin->dir, ser->epout->dir);
  593. if(ser->hasepintr)
  594. dprint(2, "serial: ep intr %s\n", ser->epintr->dir);
  595. if(usbdebug > 1 || serialdebug > 2){
  596. devctl(ser->epin, "debug 1");
  597. devctl(ser->epout, "debug 1");
  598. if(ser->hasepintr)
  599. devctl(ser->epintr, "debug 1");
  600. devctl(ser->dev, "debug 1");
  601. }
  602. return 0;
  603. }
  604. /* keep in sync with main.c */
  605. static int
  606. usage(void)
  607. {
  608. werrstr("usage: usb/serial [-dD] [-m mtpt] [-s srv]");
  609. return -1;
  610. }
  611. static void
  612. serdevfree(void *a)
  613. {
  614. Serial *ser = a;
  615. if(ser == nil)
  616. return;
  617. if(ser->hasepintr)
  618. closedev(ser->epintr);
  619. closedev(ser->epin);
  620. closedev(ser->epout);
  621. ser->epintr = ser->epin = ser->epout = nil;
  622. chanfree(ser->w4data);
  623. chanfree(ser->gotdata);
  624. chanfree(ser->w4empty);
  625. free(ser);
  626. }
  627. static Usbfs serialfs = {
  628. .walk = dwalk,
  629. .open = dopen,
  630. .read = dread,
  631. .write= dwrite,
  632. .stat = dstat,
  633. };
  634. int
  635. serialmain(Dev *dev, int argc, char* argv[])
  636. {
  637. Serial *ser;
  638. char buf[50];
  639. ARGBEGIN{
  640. case 'd':
  641. serialdebug++;
  642. break;
  643. default:
  644. return usage();
  645. }ARGEND
  646. if(argc != 0)
  647. return usage();
  648. ser = dev->aux = emallocz(sizeof(Serial), 1);
  649. /* BUG: could this go wrong? channel leaks? */
  650. ser->w4data = chancreate(sizeof(ulong), 0);
  651. ser->gotdata = chancreate(sizeof(ulong), 0);
  652. ser->w4empty = chancreate(sizeof(ulong), 0);
  653. ser->maxread = ser->maxwrite = sizeof ser->data;
  654. ser->dev = dev;
  655. dev->free = serdevfree;
  656. snprint(buf, sizeof buf, "vid %#06x did %#06x",
  657. dev->usb->vid, dev->usb->did);
  658. ser->fs = serialfs;
  659. if(plmatch(buf) == 0){
  660. ser->hasepintr = 1;
  661. ser->Serialops = plops;
  662. } else if(uconsmatch(buf) == 0)
  663. ser->Serialops = uconsops;
  664. else if(ftmatch(ser, buf) == 0)
  665. ser->Serialops = ftops;
  666. else {
  667. werrstr("serial: no serial devices found");
  668. closedev(dev);
  669. return -1;
  670. }
  671. if(findendpoints(ser) < 0){
  672. werrstr("serial: no endpoints found");
  673. closedev(dev);
  674. return -1;
  675. }
  676. if(serinit(ser) < 0){
  677. dprint(2, "serial: serinit: %r\n");
  678. closedev(dev);
  679. return -1;
  680. }
  681. snprint(ser->fs.name, sizeof ser->fs.name, "eiaU%d", dev->id);
  682. fprint(2, "%s\n", ser->fs.name);
  683. ser->fs.dev = dev;
  684. incref(dev);
  685. ser->fs.aux = ser;
  686. usbfsadd(&ser->fs);
  687. closedev(dev);
  688. return 0;
  689. }