Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > linux.kernel > #1380264
| From | Grigori Goronzy <greg@chown.ath.cx> |
|---|---|
| Newsgroups | linux.kernel |
| Subject | [PATCH v4 06/13] USB: ch341: add support for parity, frame length, stop bits |
| Date | 2016-04-15 23:20 +0200 |
| Message-ID | <rojjI-119-13@gated-at.bofh.it> (permalink) |
| References | <rojjH-119-3@gated-at.bofh.it> |
| Organization | linux.* mail to news gateway |
With the new reinitialization method, configuring parity, different
frame lengths and different stop bit settings work as expected on
both CH340G and CH341A. This has been extensively tested with a
logic analyzer.
v2: only set mark/space when parity is enabled, simplifications,
patch termios HW flags.
v3: fix parity odd/even regression.
Tested-by: Ryan Barber <rfb@skyscraper.nu>
Signed-off-by: Grigori Goronzy <greg@chown.ath.cx>
---
drivers/usb/serial/ch341.c | 40 ++++++++++++++++++++++++++++++----------
1 file changed, 30 insertions(+), 10 deletions(-)
diff --git a/drivers/usb/serial/ch341.c b/drivers/usb/serial/ch341.c
index 6181616..2fbec4a 100644
--- a/drivers/usb/serial/ch341.c
+++ b/drivers/usb/serial/ch341.c
@@ -341,7 +341,6 @@ static void ch341_set_termios(struct tty_struct *tty,
struct usb_serial_port *port, struct ktermios *old_termios)
{
struct ch341_private *priv = usb_get_serial_port_data(port);
- unsigned baud_rate;
unsigned long flags;
unsigned char ctrl;
int r;
@@ -350,13 +349,39 @@ static void ch341_set_termios(struct tty_struct *tty,
if (old_termios && !tty_termios_hw_change(&tty->termios, old_termios))
return;
- baud_rate = tty_get_baud_rate(tty);
+ priv->baud_rate = tty_get_baud_rate(tty);
- priv->baud_rate = baud_rate;
+ ctrl = CH341_LCR_ENABLE_RX | CH341_LCR_ENABLE_TX;
- ctrl = CH341_LCR_ENABLE_RX | CH341_LCR_ENABLE_TX | CH341_LCR_CS8;
+ switch (C_CSIZE(tty)) {
+ case CS5:
+ ctrl |= CH341_LCR_CS5;
+ break;
+ case CS6:
+ ctrl |= CH341_LCR_CS6;
+ break;
+ case CS7:
+ ctrl |= CH341_LCR_CS7;
+ break;
+ default:
+ tty->termios.c_cflag |= CS8;
+ case CS8:
+ ctrl |= CH341_LCR_CS8;
+ break;
+ }
+
+ if (C_PARENB(tty)) {
+ ctrl |= CH341_LCR_ENABLE_PAR;
+ if (C_PARODD(tty) == 0)
+ ctrl |= CH341_LCR_PAR_EVEN;
+ if (C_CMSPAR(tty))
+ ctrl |= CH341_LCR_MARK_SPACE;
+ }
+
+ if (C_CSTOPB(tty))
+ ctrl |= CH341_LCR_STOP_BITS_2;
- if (baud_rate) {
+ if (priv->baud_rate) {
spin_lock_irqsave(&priv->lock, flags);
priv->line_control |= (CH341_BIT_DTR | CH341_BIT_RTS);
spin_unlock_irqrestore(&priv->lock, flags);
@@ -373,11 +398,6 @@ static void ch341_set_termios(struct tty_struct *tty,
ch341_set_handshake(port->serial->dev, priv->line_control);
- /* Unimplemented:
- * (cflag & CSIZE) : data bits [5, 8]
- * (cflag & PARENB) : parity {NONE, EVEN, ODD}
- * (cflag & CSTOPB) : stop bits [1, 2]
- */
}
static void ch341_break_ctl(struct tty_struct *tty, int break_state)
--
1.9.1
Back to linux.kernel | Previous | Next — Previous in thread | Next in thread | Find similar | Unroll thread
Major improvements to the ch341 driver v4 Grigori Goronzy <greg@chown.ath.cx> - 2016-04-15 23:20 +0200 [PATCH v4 06/13] USB: ch341: add support for parity, frame length, stop bits Grigori Goronzy <greg@chown.ath.cx> - 2016-04-15 23:20 +0200 [PATCH v4 01/13] USB: ch341: fix error handling on resume Grigori Goronzy <greg@chown.ath.cx> - 2016-04-15 23:20 +0200 [PATCH v4 04/13] USB: ch341: fix USB buffer allocations Grigori Goronzy <greg@chown.ath.cx> - 2016-04-15 23:20 +0200 [PATCH v4 08/13] USB: ch341: add support for RTS/CTS flow control Grigori Goronzy <greg@chown.ath.cx> - 2016-04-15 23:20 +0200 [PATCH v4 09/13] USB: ch341: fix coding style Grigori Goronzy <greg@chown.ath.cx> - 2016-04-15 23:20 +0200 [PATCH v4 13/13] USB: ch341: implement tx_empty callback Grigori Goronzy <greg@chown.ath.cx> - 2016-04-15 23:20 +0200 [PATCH v4 12/13] USB: ch341: get rid of default configuration Grigori Goronzy <greg@chown.ath.cx> - 2016-04-15 23:20 +0200 [PATCH v4 03/13] USB: ch341: add definitions for modem control Grigori Goronzy <greg@chown.ath.cx> - 2016-04-15 23:20 +0200 [PATCH v4 10/13] USB: ch341: clean up messages Grigori Goronzy <greg@chown.ath.cx> - 2016-04-15 23:20 +0200 [PATCH v4 07/13] USB: ch341: add debug output for chip version Grigori Goronzy <greg@chown.ath.cx> - 2016-04-15 23:20 +0200
csiph-web