From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1KT4fU-00086e-Ja for qemu-devel@nongnu.org; Tue, 12 Aug 2008 20:56:52 -0400 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1KT4fR-000864-UV for qemu-devel@nongnu.org; Tue, 12 Aug 2008 20:56:52 -0400 Received: from [199.232.76.173] (port=39408 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1KT4fR-000861-Mt for qemu-devel@nongnu.org; Tue, 12 Aug 2008 20:56:49 -0400 Received: from mtaout01-winn.ispmail.ntl.com ([81.103.221.47]:51963) by monty-python.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1KT4fR-0003Q6-Ga for qemu-devel@nongnu.org; Tue, 12 Aug 2008 20:56:49 -0400 Received: from aamtaout01-winn.ispmail.ntl.com ([81.103.221.35]) by mtaout01-winn.ispmail.ntl.com with ESMTP id <20080813005646.PCFD777.mtaout01-winn.ispmail.ntl.com@aamtaout01-winn.ispmail.ntl.com> for ; Wed, 13 Aug 2008 01:56:46 +0100 Received: from implementation.famille.thibault.fr ([82.21.96.230]) by aamtaout01-winn.ispmail.ntl.com with ESMTP id <20080813005646.YKAT5827.aamtaout01-winn.ispmail.ntl.com@implementation.famille.thibault.fr> for ; Wed, 13 Aug 2008 01:56:46 +0100 Received: from samy by implementation.famille.thibault.fr with local (Exim 4.69) (envelope-from ) id 1KT4fO-000627-L5 for qemu-devel@nongnu.org; Wed, 13 Aug 2008 02:56:46 +0200 Date: Wed, 13 Aug 2008 01:56:46 +0100 From: Samuel Thibault Message-ID: <20080813005646.GD4468@implementation> MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Disposition: inline Content-Transfer-Encoding: 8bit Subject: [Qemu-devel] [PATCH] usb-serial: add support for modem lines Reply-To: qemu-devel@nongnu.org List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org usb-serial: add support for modem lines Signed-off-by: Samuel Thibault Index: hw/usb-serial.c =================================================================== --- hw/usb-serial.c (révision 4995) +++ hw/usb-serial.c (copie de travail) @@ -47,9 +47,10 @@ /* SET_MDM_CTRL */ -#define FTDI_MDM_CTRL 3 #define FTDI_DTR 1 +#define FTDI_SET_DTR (FTDI_DTR << 8) #define FTDI_RTS 2 +#define FTDI_SET_RTS (FTDI_RTS << 8) /* SET_FLOW_CTRL */ @@ -99,7 +100,6 @@ uint8_t event_chr; uint8_t error_chr; uint8_t event_trigger; - uint8_t lines; QEMUSerialSetParams params; int latency; /* ms */ CharDriverState *cs; @@ -178,7 +178,6 @@ s->recv_ptr = 0; s->recv_used = 0; /* TODO: purge in char driver */ - s->lines &= ~(FTDI_DTR|FTDI_RTS); } static void usb_serial_handle_reset(USBDevice *dev) @@ -191,6 +190,27 @@ /* TODO: Reset char device, send BREAK? */ } +static uint8_t usb_get_modem_lines(USBSerialState *s) +{ + int flags; + uint8_t ret; + + if (qemu_chr_ioctl(s->cs, CHR_IOCTL_SERIAL_GET_TIOCM, &flags) == -ENOTSUP) + return FTDI_CTS|FTDI_DSR|FTDI_RLSD; + + ret = 0; + if (flags & CHR_TIOCM_CTS) + ret |= FTDI_CTS; + if (flags & CHR_TIOCM_DSR) + ret |= FTDI_DSR; + if (flags & CHR_TIOCM_RI) + ret |= FTDI_RI; + if (flags & CHR_TIOCM_CAR) + ret |= FTDI_RLSD; + + return ret; +} + static int usb_serial_handle_control(USBDevice *dev, int request, int value, int index, int length, uint8_t *data) { @@ -306,8 +326,24 @@ } break; case DeviceOutVendor | FTDI_SET_MDM_CTRL: - s->lines = value & FTDI_MDM_CTRL; + { + static int flags; + qemu_chr_ioctl(s->cs,CHR_IOCTL_SERIAL_GET_TIOCM, &flags); + if (value & FTDI_SET_RTS) { + if (value & FTDI_RTS) + flags |= CHR_TIOCM_RTS; + else + flags &= ~CHR_TIOCM_RTS; + } + if (value & FTDI_SET_DTR) { + if (value & FTDI_DTR) + flags |= CHR_TIOCM_DTR; + else + flags &= ~CHR_TIOCM_DTR; + } + qemu_chr_ioctl(s->cs,CHR_IOCTL_SERIAL_SET_TIOCM, &flags); break; + } case DeviceOutVendor | FTDI_SET_FLOW_CTRL: /* TODO: ioctl */ break; @@ -357,9 +393,9 @@ /* TODO: TX ON/OFF */ break; case DeviceInVendor | FTDI_GET_MDM_ST: - /* TODO: return modem status */ - data[0] = 0; - ret = 1; + data[0] = usb_get_modem_lines(s) | 1; + data[1] = 0; + ret = 2; break; case DeviceOutVendor | FTDI_SET_EVENT_CHR: /* TODO: handle it */ @@ -409,9 +445,9 @@ ret = USB_RET_NAK; break; } - /* TODO: Report serial line status */ + *data++ = usb_get_modem_lines(s) | 1; + /* We do not have the uart details */ *data++ = 0; - *data++ = 0; len -= 2; if (len > s->recv_used) len = s->recv_used;