Re: Likely issue with ch341 kernel-module/driver

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

 



Johan Hovold wrote:
> > I started in the morning to build the driver from the source provided
> > by the vendor, but it was written in the times of kernel-version 2.4,
> > and I got hopelessly stuck.
> 
> The vendor driver is only for 2.4? Peter?

http://www.wch.cn/download/CH341SER_LINUX_ZIP.html
http://www.wch.cn/downfile/177

The vendor driver version 1.2 readme.txt from 2014-10-10 says:

Current Driver support versions of linux kernel range from 2.6.25 to 3.13.x

It didn't build immediately against the kernel I had at hand, but with
a small touchup (patch attached) it built fine against a 3.10 kernel.


> > Also, as per http://lxr.free-electrons.com/source/drivers/usb/serial/ch341.c?v=3.16,
> > the particular serial-USB-adapter device is added into the id_table,
> > so seems supported as per say.
> 
> That id was added by 82078234d402 ("USB: serial: ch341: New VID/PID for
> CH341 USB-serial") in 2008, which claims that the driver supports both
> old and new devices.

My hardware has that same VID/PID, but there is a version request
sent to the device and my version number is quite a bit higher (20-30)
than what is mentioned in the in-tree driver comments; I guess the
protocol grew with newer versions of the device, but VID/PID weren't
updated. I'm sure it's possible to have a backwards-compatible
driver, but the vendor driver differs enough from the in-tree driver
that I can't be confident that simply doing what the vendor driver
does will work also on older versions of the device.


> > ###########################################################
> > usb 2-2: device not accepting address 8, error -71
> > ###########################################################
> 
> This still looks like a hardware issue to me. Specifically, this happens
> before the ch341 driver is even involved.

I haven't seen any messages like this with my hardware.


//Peter
--- ch34x.c.orig	2014-04-14 10:38:44.000000000 +0200
+++ ch34x.c	2015-06-15 19:26:39.000000000 +0200
@@ -10,11 +10,7 @@
 // Support linux kernel version 2.6.25 and later
 //
 
-#include <linux/version.h>
-#ifndef KERNEL_VERSION
-#define	KERNEL_VERSION(ver, rel, seq)	((ver << 16) | (rel << 8) | (seq))
-#endif
-
+#include <generated/uapi/linux/version.h>
 #include <linux/kernel.h>
 #include <linux/errno.h>
 #include <linux/init.h>
@@ -380,7 +376,7 @@
 	unsigned char reg_value = 0;
 	unsigned short value = 0;
 	unsigned short index = 0;
-#if(LINUX_VERSION_CODE < KERNEL_VERSION(3, 10, 0))
+#if(LINUX_VERSION_CODE < KERNEL_VERSION(3, 11, 0))
 	dbg_ch34x("%s - port:%d", __func__, port->number);
 #else
 	dbg_ch34x("%s - port:%d", __func__, port->port_number);
@@ -405,7 +401,7 @@
 		return;
 
 	cflag = termios->c_cflag;
-#if(LINUX_VERSION_CODE < KERNEL_VERSION(3, 10, 0))
+#if(LINUX_VERSION_CODE < KERNEL_VERSION(3, 11, 0))
 	dbg_ch34x("%s (%d) cflag=0x%x\n", __func__, port->number, cflag);
 #else
 	dbg_ch34x("%s (%d) cflag=0x%x\n", __func__, port->port_number, cflag);
@@ -515,7 +511,7 @@
 	/*unsigned int msr;*/
 	unsigned int retval;
 
-#if(LINUX_VERSION_CODE < KERNEL_VERSION(3, 10, 0))
+#if(LINUX_VERSION_CODE < KERNEL_VERSION(3, 11, 0))
 	dbg_ch34x("%s - port:%d", __func__, port->number);
 #else
 	dbg_ch34x("%s - port:%d", __func__, port->port_number);
@@ -561,7 +557,7 @@
 	long timeout;
 	wait_queue_t wait;
 
-#if(LINUX_VERSION_CODE < KERNEL_VERSION(3, 10, 0))
+#if(LINUX_VERSION_CODE < KERNEL_VERSION(3, 11, 0))
 	dbg_ch34x("%s - port:%d", __func__, port->number);
 #else
 	dbg_ch34x("%s - port:%d", __func__, port->port_number);
@@ -636,7 +632,7 @@
 	struct usb_serial *serial = port->serial;
 	int retval;
 
-#if(LINUX_VERSION_CODE < KERNEL_VERSION(3, 10, 0))
+#if(LINUX_VERSION_CODE < KERNEL_VERSION(3, 11, 0))
 	dbg_ch34x("%s - port:%d", __func__, port->number );
 #else
 	dbg_ch34x("%s - port:%d", __func__, port->port_number );
@@ -710,7 +706,7 @@
 	/*unsigned int mcr = priv->line_control;*/
 	u8 control;
 
-#if(LINUX_VERSION_CODE < KERNEL_VERSION(3, 10, 0))
+#if(LINUX_VERSION_CODE < KERNEL_VERSION(3, 11, 0))
 	dbg_ch34x("%s - port:%d", __func__, port->number);
 #else
 	dbg_ch34x("%s - port:%d", __func__, port->port_number);
@@ -743,7 +739,7 @@
 	unsigned int status;
 	unsigned int changed;
 
-#if(LINUX_VERSION_CODE < KERNEL_VERSION(3, 10, 0))
+#if(LINUX_VERSION_CODE < KERNEL_VERSION(3, 11, 0))
 	dbg_ch34x("%s -port:%d", __func__, port->number);
 #else
 	dbg_ch34x("%s -port:%d", __func__, port->port_number);
@@ -793,7 +789,7 @@
 {
 	//struct usb_serial_port *port = tty->driver_data;
 #endif
-#if(LINUX_VERSION_CODE < KERNEL_VERSION(3, 10, 0))
+#if(LINUX_VERSION_CODE < KERNEL_VERSION(3, 11, 0))
 	dbg_ch34x("%s - port:%d, cmd=0x%04x", __func__, port->number, cmd);
 #else
 	dbg_ch34x("%s - port:%d, cmd=0x%04x", __func__, port->port_number, cmd);
@@ -802,7 +798,7 @@
 	{
 		// Note here 
 		case TIOCMIWAIT:
-#if(LINUX_VERSION_CODE < KERNEL_VERSION(3, 10, 0))
+#if(LINUX_VERSION_CODE < KERNEL_VERSION(3, 11, 0))
 			dbg_ch34x("%s - port:%d TIOCMIWAIT", __func__, port->number);
 #else
 			dbg_ch34x("%s - port:%d TIOCMIWAIT", __func__, port->port_number);
@@ -824,7 +820,7 @@
 	struct ch34x_private *priv = usb_get_serial_port_data( port );
 	unsigned long flags;
 
-#if(LINUX_VERSION_CODE < KERNEL_VERSION(3, 10, 0))
+#if(LINUX_VERSION_CODE < KERNEL_VERSION(3, 11, 0))
 	dbg_ch34x("%s - port:%d", __func__, port->number);
 #else
 	dbg_ch34x("%s - port:%d", __func__, port->port_number);
@@ -877,7 +873,7 @@
 	struct ch34x_private *priv = usb_get_serial_port_data(port);
 	unsigned long flags;
 
-#if(LINUX_VERSION_CODE < KERNEL_VERSION(3, 10, 0))
+#if(LINUX_VERSION_CODE < KERNEL_VERSION(3, 11, 0))
 	dbg_ch34x("%s - port:%d, %d bytes", __func__, port->number, count);
 #else
 	dbg_ch34x("%s - port:%d, %d bytes", __func__, port->port_number, count);
@@ -907,7 +903,7 @@
 	int room = 0;
 	unsigned long flags;
 
-#if(LINUX_VERSION_CODE < KERNEL_VERSION(3, 10, 0))
+#if(LINUX_VERSION_CODE < KERNEL_VERSION(3, 11, 0))
 	dbg_ch34x("%s - port:%d", __func__, port->number);
 #else
 	dbg_ch34x("%s - port:%d", __func__, port->port_number);
@@ -933,7 +929,7 @@
 	int chars = 0;
 	unsigned long flags;
 
-#if(LINUX_VERSION_CODE < KERNEL_VERSION(3, 10, 0))
+#if(LINUX_VERSION_CODE < KERNEL_VERSION(3, 11, 0))
 	dbg_ch34x("%s - port:%d", __func__, port->number);
 #else
 	dbg_ch34x("%s - port:%d", __func__, port->port_number);
@@ -1043,7 +1039,7 @@
 	int status = urb->status;
 	int retval;
 
-#if(LINUX_VERSION_CODE < KERNEL_VERSION(3, 10, 0))
+#if(LINUX_VERSION_CODE < KERNEL_VERSION(3, 11, 0))
 	dbg_ch34x("%s port:%d", __func__, port->number );
 #else
 	dbg_ch34x("%s port:%d", __func__, port->port_number );
@@ -1091,7 +1087,7 @@
 	u8 line_status;
 	char tty_flag;
 
-#if(LINUX_VERSION_CODE < KERNEL_VERSION(3, 10, 0))
+#if(LINUX_VERSION_CODE < KERNEL_VERSION(3, 11, 0))
 	dbg_ch34x("%s - port:%d", __func__, port->number );
 #else
 	dbg_ch34x("%s - port:%d", __func__, port->port_number);
@@ -1197,7 +1193,7 @@
 	int retval;
 	int status = urb->status;
 
-#if(LINUX_VERSION_CODE < KERNEL_VERSION(3, 10, 0))
+#if(LINUX_VERSION_CODE < KERNEL_VERSION(3, 11, 0))
 	dbg_ch34x("%s - port:%d", __func__, port->number );
 #else
 	dbg_ch34x("%s - port:%d", __func__, port->port_number );

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

  Powered by Linux