Re: [PATCH] usb/serial/ch341: Add parity support

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Apply this patch because I have a device that uses even parity. It is
a tax machine, it worked perfect in that case. I want to thank you
again, though I did in my thread, I write only to support you and
implement this PATCH soon.


> Based on wireshark packet traces from a windows machine.
>
> ch340 and ch341 both seem to support all parity modes, but only the ch341
> appears to support variable data bits and variable stop bits, so those are left
> unimplemented, as before.
>
> Tested on a generic usb-rs485 dongle with the chip label scratched off, and
> some Modbus/RTU devices that required various parity settings.
>
> Signed-off-by: Karl Palsson <karlp@xxxxxxxxxxxx>
> ---
>  drivers/usb/serial/ch341.c | 27 ++++++++++++++++++++++++++-
>  1 file changed, 26 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/usb/serial/ch341.c b/drivers/usb/serial/ch341.c
> index 82371f6..b870f6f 100644
> --- a/drivers/usb/serial/ch341.c
> +++ b/drivers/usb/serial/ch341.c
> @@ -346,6 +346,7 @@ static void ch341_set_termios(struct tty_struct *tty,
>         struct ch341_private *priv = usb_get_serial_port_data(port);
>         unsigned baud_rate;
>         unsigned long flags;
> +       unsigned int par_flags;
>
>         baud_rate = tty_get_baud_rate(tty);
>
> @@ -366,9 +367,33 @@ static void ch341_set_termios(struct tty_struct *tty,
>
>         /* Unimplemented:
>          * (cflag & CSIZE) : data bits [5, 8]
> -        * (cflag & PARENB) : parity {NONE, EVEN, ODD}
>          * (cflag & CSTOPB) : stop bits [1, 2]
>          */
> +       /* CH340 doesn't appear to support variable stop bits or data bits */
> +       if (C_PARENB(tty)) {
> +               if (C_PARODD(tty)) {
> +                       if (C_CMSPAR(tty)) {
> +                               dev_dbg(&port->dev, "parity = mark\n");
> +                               par_flags = 0xeb;
> +                       } else {
> +                               dev_dbg(&port->dev, "parity = odd\n");
> +                               par_flags = 0xcb;
> +                       }
> +               } else {
> +                       if (C_CMSPAR(tty)) {
> +                               dev_dbg(&port->dev, "parity = space\n");
> +                               par_flags = 0xfb;
> +                       } else {
> +                               dev_dbg(&port->dev, "parity = even\n");
> +                               par_flags = 0xdb;
> +                       }
> +               }
> +       } else {
> +               dev_dbg(&port->dev, "parity = none\n");
> +               par_flags = 0xc3;
> +       }
> +       ch341_control_out(port->serial->dev, 0x9a, 0x2518, par_flags);
> +
>  }
>
>  static void ch341_break_ctl(struct tty_struct *tty, int break_state)
> --
> 1.9.0
>
--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [Linux Media]     [Linux Input]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Old Linux USB Devel Archive]

  Powered by Linux