usb-serial.c 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584
  1. /*
  2. * FTDI FT232BM Device emulation
  3. *
  4. * Copyright (c) 2006 CodeSourcery.
  5. * Copyright (c) 2008 Samuel Thibault <samuel.thibault@ens-lyon.org>
  6. * Written by Paul Brook, reused for FTDI by Samuel Thibault
  7. *
  8. * This code is licenced under the LGPL.
  9. */
  10. #include "qemu-common.h"
  11. #include "usb.h"
  12. #include "qemu-char.h"
  13. //#define DEBUG_Serial
  14. #ifdef DEBUG_Serial
  15. #define DPRINTF(fmt, args...) \
  16. do { printf("usb-serial: " fmt , ##args); } while (0)
  17. #else
  18. #define DPRINTF(fmt, args...) do {} while(0)
  19. #endif
  20. #define RECV_BUF 384
  21. /* Commands */
  22. #define FTDI_RESET 0
  23. #define FTDI_SET_MDM_CTRL 1
  24. #define FTDI_SET_FLOW_CTRL 2
  25. #define FTDI_SET_BAUD 3
  26. #define FTDI_SET_DATA 4
  27. #define FTDI_GET_MDM_ST 5
  28. #define FTDI_SET_EVENT_CHR 6
  29. #define FTDI_SET_ERROR_CHR 7
  30. #define FTDI_SET_LATENCY 9
  31. #define FTDI_GET_LATENCY 10
  32. #define DeviceOutVendor ((USB_DIR_OUT|USB_TYPE_VENDOR|USB_RECIP_DEVICE)<<8)
  33. #define DeviceInVendor ((USB_DIR_IN |USB_TYPE_VENDOR|USB_RECIP_DEVICE)<<8)
  34. /* RESET */
  35. #define FTDI_RESET_SIO 0
  36. #define FTDI_RESET_RX 1
  37. #define FTDI_RESET_TX 2
  38. /* SET_MDM_CTRL */
  39. #define FTDI_DTR 1
  40. #define FTDI_SET_DTR (FTDI_DTR << 8)
  41. #define FTDI_RTS 2
  42. #define FTDI_SET_RTS (FTDI_RTS << 8)
  43. /* SET_FLOW_CTRL */
  44. #define FTDI_RTS_CTS_HS 1
  45. #define FTDI_DTR_DSR_HS 2
  46. #define FTDI_XON_XOFF_HS 4
  47. /* SET_DATA */
  48. #define FTDI_PARITY (0x7 << 8)
  49. #define FTDI_ODD (0x1 << 8)
  50. #define FTDI_EVEN (0x2 << 8)
  51. #define FTDI_MARK (0x3 << 8)
  52. #define FTDI_SPACE (0x4 << 8)
  53. #define FTDI_STOP (0x3 << 11)
  54. #define FTDI_STOP1 (0x0 << 11)
  55. #define FTDI_STOP15 (0x1 << 11)
  56. #define FTDI_STOP2 (0x2 << 11)
  57. /* GET_MDM_ST */
  58. /* TODO: should be sent every 40ms */
  59. #define FTDI_CTS (1<<4) // CTS line status
  60. #define FTDI_DSR (1<<5) // DSR line status
  61. #define FTDI_RI (1<<6) // RI line status
  62. #define FTDI_RLSD (1<<7) // Receive Line Signal Detect
  63. /* Status */
  64. #define FTDI_DR (1<<0) // Data Ready
  65. #define FTDI_OE (1<<1) // Overrun Err
  66. #define FTDI_PE (1<<2) // Parity Err
  67. #define FTDI_FE (1<<3) // Framing Err
  68. #define FTDI_BI (1<<4) // Break Interrupt
  69. #define FTDI_THRE (1<<5) // Transmitter Holding Register
  70. #define FTDI_TEMT (1<<6) // Transmitter Empty
  71. #define FTDI_FIFO (1<<7) // Error in FIFO
  72. typedef struct {
  73. USBDevice dev;
  74. uint16_t vendorid;
  75. uint16_t productid;
  76. uint8_t recv_buf[RECV_BUF];
  77. uint16_t recv_ptr;
  78. uint16_t recv_used;
  79. uint8_t event_chr;
  80. uint8_t error_chr;
  81. uint8_t event_trigger;
  82. QEMUSerialSetParams params;
  83. int latency; /* ms */
  84. CharDriverState *cs;
  85. } USBSerialState;
  86. static const uint8_t qemu_serial_dev_descriptor[] = {
  87. 0x12, /* u8 bLength; */
  88. 0x01, /* u8 bDescriptorType; Device */
  89. 0x00, 0x02, /* u16 bcdUSB; v2.0 */
  90. 0x00, /* u8 bDeviceClass; */
  91. 0x00, /* u8 bDeviceSubClass; */
  92. 0x00, /* u8 bDeviceProtocol; [ low/full speeds only ] */
  93. 0x08, /* u8 bMaxPacketSize0; 8 Bytes */
  94. /* Vendor and product id are arbitrary. */
  95. 0x03, 0x04, /* u16 idVendor; */
  96. 0x00, 0xFF, /* u16 idProduct; */
  97. 0x00, 0x04, /* u16 bcdDevice */
  98. 0x01, /* u8 iManufacturer; */
  99. 0x02, /* u8 iProduct; */
  100. 0x03, /* u8 iSerialNumber; */
  101. 0x01 /* u8 bNumConfigurations; */
  102. };
  103. static const uint8_t qemu_serial_config_descriptor[] = {
  104. /* one configuration */
  105. 0x09, /* u8 bLength; */
  106. 0x02, /* u8 bDescriptorType; Configuration */
  107. 0x20, 0x00, /* u16 wTotalLength; */
  108. 0x01, /* u8 bNumInterfaces; (1) */
  109. 0x01, /* u8 bConfigurationValue; */
  110. 0x00, /* u8 iConfiguration; */
  111. 0x80, /* u8 bmAttributes;
  112. Bit 7: must be set,
  113. 6: Self-powered,
  114. 5: Remote wakeup,
  115. 4..0: resvd */
  116. 100/2, /* u8 MaxPower; */
  117. /* one interface */
  118. 0x09, /* u8 if_bLength; */
  119. 0x04, /* u8 if_bDescriptorType; Interface */
  120. 0x00, /* u8 if_bInterfaceNumber; */
  121. 0x00, /* u8 if_bAlternateSetting; */
  122. 0x02, /* u8 if_bNumEndpoints; */
  123. 0xff, /* u8 if_bInterfaceClass; Vendor Specific */
  124. 0xff, /* u8 if_bInterfaceSubClass; Vendor Specific */
  125. 0xff, /* u8 if_bInterfaceProtocol; Vendor Specific */
  126. 0x02, /* u8 if_iInterface; */
  127. /* Bulk-In endpoint */
  128. 0x07, /* u8 ep_bLength; */
  129. 0x05, /* u8 ep_bDescriptorType; Endpoint */
  130. 0x81, /* u8 ep_bEndpointAddress; IN Endpoint 1 */
  131. 0x02, /* u8 ep_bmAttributes; Bulk */
  132. 0x40, 0x00, /* u16 ep_wMaxPacketSize; */
  133. 0x00, /* u8 ep_bInterval; */
  134. /* Bulk-Out endpoint */
  135. 0x07, /* u8 ep_bLength; */
  136. 0x05, /* u8 ep_bDescriptorType; Endpoint */
  137. 0x02, /* u8 ep_bEndpointAddress; OUT Endpoint 2 */
  138. 0x02, /* u8 ep_bmAttributes; Bulk */
  139. 0x40, 0x00, /* u16 ep_wMaxPacketSize; */
  140. 0x00 /* u8 ep_bInterval; */
  141. };
  142. static void usb_serial_reset(USBSerialState *s)
  143. {
  144. /* TODO: Set flow control to none */
  145. s->event_chr = 0x0d;
  146. s->event_trigger = 0;
  147. s->recv_ptr = 0;
  148. s->recv_used = 0;
  149. /* TODO: purge in char driver */
  150. }
  151. static void usb_serial_handle_reset(USBDevice *dev)
  152. {
  153. USBSerialState *s = (USBSerialState *)dev;
  154. DPRINTF("Reset\n");
  155. usb_serial_reset(s);
  156. /* TODO: Reset char device, send BREAK? */
  157. }
  158. static uint8_t usb_get_modem_lines(USBSerialState *s)
  159. {
  160. int flags;
  161. uint8_t ret;
  162. if (qemu_chr_ioctl(s->cs, CHR_IOCTL_SERIAL_GET_TIOCM, &flags) == -ENOTSUP)
  163. return FTDI_CTS|FTDI_DSR|FTDI_RLSD;
  164. ret = 0;
  165. if (flags & CHR_TIOCM_CTS)
  166. ret |= FTDI_CTS;
  167. if (flags & CHR_TIOCM_DSR)
  168. ret |= FTDI_DSR;
  169. if (flags & CHR_TIOCM_RI)
  170. ret |= FTDI_RI;
  171. if (flags & CHR_TIOCM_CAR)
  172. ret |= FTDI_RLSD;
  173. return ret;
  174. }
  175. static int usb_serial_handle_control(USBDevice *dev, int request, int value,
  176. int index, int length, uint8_t *data)
  177. {
  178. USBSerialState *s = (USBSerialState *)dev;
  179. int ret = 0;
  180. //DPRINTF("got control %x, value %x\n",request, value);
  181. switch (request) {
  182. case DeviceRequest | USB_REQ_GET_STATUS:
  183. data[0] = (0 << USB_DEVICE_SELF_POWERED) |
  184. (dev->remote_wakeup << USB_DEVICE_REMOTE_WAKEUP);
  185. data[1] = 0x00;
  186. ret = 2;
  187. break;
  188. case DeviceOutRequest | USB_REQ_CLEAR_FEATURE:
  189. if (value == USB_DEVICE_REMOTE_WAKEUP) {
  190. dev->remote_wakeup = 0;
  191. } else {
  192. goto fail;
  193. }
  194. ret = 0;
  195. break;
  196. case DeviceOutRequest | USB_REQ_SET_FEATURE:
  197. if (value == USB_DEVICE_REMOTE_WAKEUP) {
  198. dev->remote_wakeup = 1;
  199. } else {
  200. goto fail;
  201. }
  202. ret = 0;
  203. break;
  204. case DeviceOutRequest | USB_REQ_SET_ADDRESS:
  205. dev->addr = value;
  206. ret = 0;
  207. break;
  208. case DeviceRequest | USB_REQ_GET_DESCRIPTOR:
  209. switch(value >> 8) {
  210. case USB_DT_DEVICE:
  211. memcpy(data, qemu_serial_dev_descriptor,
  212. sizeof(qemu_serial_dev_descriptor));
  213. data[8] = s->vendorid & 0xff;
  214. data[9] = ((s->vendorid) >> 8) & 0xff;
  215. data[10] = s->productid & 0xff;
  216. data[11] = ((s->productid) >> 8) & 0xff;
  217. ret = sizeof(qemu_serial_dev_descriptor);
  218. break;
  219. case USB_DT_CONFIG:
  220. memcpy(data, qemu_serial_config_descriptor,
  221. sizeof(qemu_serial_config_descriptor));
  222. ret = sizeof(qemu_serial_config_descriptor);
  223. break;
  224. case USB_DT_STRING:
  225. switch(value & 0xff) {
  226. case 0:
  227. /* language ids */
  228. data[0] = 4;
  229. data[1] = 3;
  230. data[2] = 0x09;
  231. data[3] = 0x04;
  232. ret = 4;
  233. break;
  234. case 1:
  235. /* vendor description */
  236. ret = set_usb_string(data, "QEMU " QEMU_VERSION);
  237. break;
  238. case 2:
  239. /* product description */
  240. ret = set_usb_string(data, "QEMU USB SERIAL");
  241. break;
  242. case 3:
  243. /* serial number */
  244. ret = set_usb_string(data, "1");
  245. break;
  246. default:
  247. goto fail;
  248. }
  249. break;
  250. default:
  251. goto fail;
  252. }
  253. break;
  254. case DeviceRequest | USB_REQ_GET_CONFIGURATION:
  255. data[0] = 1;
  256. ret = 1;
  257. break;
  258. case DeviceOutRequest | USB_REQ_SET_CONFIGURATION:
  259. ret = 0;
  260. break;
  261. case DeviceRequest | USB_REQ_GET_INTERFACE:
  262. data[0] = 0;
  263. ret = 1;
  264. break;
  265. case InterfaceOutRequest | USB_REQ_SET_INTERFACE:
  266. ret = 0;
  267. break;
  268. case EndpointOutRequest | USB_REQ_CLEAR_FEATURE:
  269. ret = 0;
  270. break;
  271. /* Class specific requests. */
  272. case DeviceOutVendor | FTDI_RESET:
  273. switch (value) {
  274. case FTDI_RESET_SIO:
  275. usb_serial_reset(s);
  276. break;
  277. case FTDI_RESET_RX:
  278. s->recv_ptr = 0;
  279. s->recv_used = 0;
  280. /* TODO: purge from char device */
  281. break;
  282. case FTDI_RESET_TX:
  283. /* TODO: purge from char device */
  284. break;
  285. }
  286. break;
  287. case DeviceOutVendor | FTDI_SET_MDM_CTRL:
  288. {
  289. static int flags;
  290. qemu_chr_ioctl(s->cs,CHR_IOCTL_SERIAL_GET_TIOCM, &flags);
  291. if (value & FTDI_SET_RTS) {
  292. if (value & FTDI_RTS)
  293. flags |= CHR_TIOCM_RTS;
  294. else
  295. flags &= ~CHR_TIOCM_RTS;
  296. }
  297. if (value & FTDI_SET_DTR) {
  298. if (value & FTDI_DTR)
  299. flags |= CHR_TIOCM_DTR;
  300. else
  301. flags &= ~CHR_TIOCM_DTR;
  302. }
  303. qemu_chr_ioctl(s->cs,CHR_IOCTL_SERIAL_SET_TIOCM, &flags);
  304. break;
  305. }
  306. case DeviceOutVendor | FTDI_SET_FLOW_CTRL:
  307. /* TODO: ioctl */
  308. break;
  309. case DeviceOutVendor | FTDI_SET_BAUD: {
  310. static const int subdivisors8[8] = { 0, 4, 2, 1, 3, 5, 6, 7 };
  311. int subdivisor8 = subdivisors8[((value & 0xc000) >> 14)
  312. | ((index & 1) << 2)];
  313. int divisor = value & 0x3fff;
  314. /* chip special cases */
  315. if (divisor == 1 && subdivisor8 == 0)
  316. subdivisor8 = 4;
  317. if (divisor == 0 && subdivisor8 == 0)
  318. divisor = 1;
  319. s->params.speed = (48000000 / 2) / (8 * divisor + subdivisor8);
  320. qemu_chr_ioctl(s->cs, CHR_IOCTL_SERIAL_SET_PARAMS, &s->params);
  321. break;
  322. }
  323. case DeviceOutVendor | FTDI_SET_DATA:
  324. switch (value & FTDI_PARITY) {
  325. case 0:
  326. s->params.parity = 'N';
  327. break;
  328. case FTDI_ODD:
  329. s->params.parity = 'O';
  330. break;
  331. case FTDI_EVEN:
  332. s->params.parity = 'E';
  333. break;
  334. default:
  335. DPRINTF("unsupported parity %d\n", value & FTDI_PARITY);
  336. goto fail;
  337. }
  338. switch (value & FTDI_STOP) {
  339. case FTDI_STOP1:
  340. s->params.stop_bits = 1;
  341. break;
  342. case FTDI_STOP2:
  343. s->params.stop_bits = 2;
  344. break;
  345. default:
  346. DPRINTF("unsupported stop bits %d\n", value & FTDI_STOP);
  347. goto fail;
  348. }
  349. qemu_chr_ioctl(s->cs, CHR_IOCTL_SERIAL_SET_PARAMS, &s->params);
  350. /* TODO: TX ON/OFF */
  351. break;
  352. case DeviceInVendor | FTDI_GET_MDM_ST:
  353. data[0] = usb_get_modem_lines(s) | 1;
  354. data[1] = 0;
  355. ret = 2;
  356. break;
  357. case DeviceOutVendor | FTDI_SET_EVENT_CHR:
  358. /* TODO: handle it */
  359. s->event_chr = value;
  360. break;
  361. case DeviceOutVendor | FTDI_SET_ERROR_CHR:
  362. /* TODO: handle it */
  363. s->error_chr = value;
  364. break;
  365. case DeviceOutVendor | FTDI_SET_LATENCY:
  366. s->latency = value;
  367. break;
  368. case DeviceInVendor | FTDI_GET_LATENCY:
  369. data[0] = s->latency;
  370. ret = 1;
  371. break;
  372. default:
  373. fail:
  374. DPRINTF("got unsupported/bogus control %x, value %x\n", request, value);
  375. ret = USB_RET_STALL;
  376. break;
  377. }
  378. return ret;
  379. }
  380. static int usb_serial_handle_data(USBDevice *dev, USBPacket *p)
  381. {
  382. USBSerialState *s = (USBSerialState *)dev;
  383. int ret = 0;
  384. uint8_t devep = p->devep;
  385. uint8_t *data = p->data;
  386. int len = p->len;
  387. int first_len;
  388. switch (p->pid) {
  389. case USB_TOKEN_OUT:
  390. if (devep != 2)
  391. goto fail;
  392. qemu_chr_write(s->cs, data, len);
  393. break;
  394. case USB_TOKEN_IN:
  395. if (devep != 1)
  396. goto fail;
  397. first_len = RECV_BUF - s->recv_ptr;
  398. if (len <= 2) {
  399. ret = USB_RET_NAK;
  400. break;
  401. }
  402. *data++ = usb_get_modem_lines(s) | 1;
  403. /* We do not have the uart details */
  404. *data++ = 0;
  405. len -= 2;
  406. if (len > s->recv_used)
  407. len = s->recv_used;
  408. if (!len) {
  409. ret = USB_RET_NAK;
  410. break;
  411. }
  412. if (first_len > len)
  413. first_len = len;
  414. memcpy(data, s->recv_buf + s->recv_ptr, first_len);
  415. if (len > first_len)
  416. memcpy(data + first_len, s->recv_buf, len - first_len);
  417. s->recv_used -= len;
  418. s->recv_ptr = (s->recv_ptr + len) % RECV_BUF;
  419. ret = len + 2;
  420. break;
  421. default:
  422. DPRINTF("Bad token\n");
  423. fail:
  424. ret = USB_RET_STALL;
  425. break;
  426. }
  427. return ret;
  428. }
  429. static void usb_serial_handle_destroy(USBDevice *dev)
  430. {
  431. USBSerialState *s = (USBSerialState *)dev;
  432. qemu_chr_close(s->cs);
  433. qemu_free(s);
  434. }
  435. static int usb_serial_can_read(void *opaque)
  436. {
  437. USBSerialState *s = opaque;
  438. return RECV_BUF - s->recv_used;
  439. }
  440. static void usb_serial_read(void *opaque, const uint8_t *buf, int size)
  441. {
  442. USBSerialState *s = opaque;
  443. int first_size = RECV_BUF - s->recv_ptr;
  444. if (first_size > size)
  445. first_size = size;
  446. memcpy(s->recv_buf + s->recv_ptr + s->recv_used, buf, first_size);
  447. if (size > first_size)
  448. memcpy(s->recv_buf, buf + first_size, size - first_size);
  449. s->recv_used += size;
  450. }
  451. static void usb_serial_event(void *opaque, int event)
  452. {
  453. USBSerialState *s = opaque;
  454. switch (event) {
  455. case CHR_EVENT_BREAK:
  456. /* TODO: Send Break to USB */
  457. break;
  458. case CHR_EVENT_FOCUS:
  459. break;
  460. case CHR_EVENT_RESET:
  461. usb_serial_reset(s);
  462. /* TODO: Reset USB port */
  463. break;
  464. }
  465. }
  466. USBDevice *usb_serial_init(const char *filename)
  467. {
  468. USBSerialState *s;
  469. CharDriverState *cdrv;
  470. unsigned short vendorid = 0x0403, productid = 0x6001;
  471. char label[32];
  472. static int index;
  473. while (*filename && *filename != ':') {
  474. const char *p;
  475. char *e;
  476. if (strstart(filename, "vendorid=", &p)) {
  477. vendorid = strtol(p, &e, 16);
  478. if (e == p || (*e && *e != ',' && *e != ':')) {
  479. printf("bogus vendor ID %s\n", p);
  480. return NULL;
  481. }
  482. filename = e;
  483. } else if (strstart(filename, "productid=", &p)) {
  484. productid = strtol(p, &e, 16);
  485. if (e == p || (*e && *e != ',' && *e != ':')) {
  486. printf("bogus product ID %s\n", p);
  487. return NULL;
  488. }
  489. filename = e;
  490. } else {
  491. printf("unrecognized serial USB option %s\n", filename);
  492. return NULL;
  493. }
  494. while(*filename == ',')
  495. filename++;
  496. }
  497. if (!*filename) {
  498. printf("character device specification needed\n");
  499. return NULL;
  500. }
  501. filename++;
  502. s = qemu_mallocz(sizeof(USBSerialState));
  503. snprintf(label, sizeof(label), "usbserial%d", index++);
  504. cdrv = qemu_chr_open(label, filename, NULL);
  505. if (!cdrv)
  506. goto fail;
  507. s->cs = cdrv;
  508. qemu_chr_add_handlers(cdrv, usb_serial_can_read, usb_serial_read, usb_serial_event, s);
  509. s->dev.speed = USB_SPEED_FULL;
  510. s->dev.handle_packet = usb_generic_handle_packet;
  511. s->dev.handle_reset = usb_serial_handle_reset;
  512. s->dev.handle_control = usb_serial_handle_control;
  513. s->dev.handle_data = usb_serial_handle_data;
  514. s->dev.handle_destroy = usb_serial_handle_destroy;
  515. s->vendorid = vendorid;
  516. s->productid = productid;
  517. snprintf(s->dev.devname, sizeof(s->dev.devname), "QEMU USB Serial(%.16s)",
  518. filename);
  519. usb_serial_handle_reset((USBDevice *)s);
  520. return (USBDevice *)s;
  521. fail:
  522. qemu_free(s);
  523. return NULL;
  524. }