分页: 1 / 2

[分享]CH340/CH341,USB转串口驱动模块

发表于 : 2008-02-09 23:35
qdzheng
因为工作原因,需要使用USB to serial的转接器,使用ch340芯片。
连上后发现,ubuntu只认出是USB设备,没有作为串口使用。
多方查询后得知,这款芯片没有被ubuntu 7.10支持。

还好,在一个老外的网站发现有支持该芯片的模块源码,编译成功。
在这里记下过程备忘,也希望对需要的人有用。

过程如下:
1、下载 ch341.c,见附件;
2、编写 Makefile

代码: 全选

obj-m := ch341.o

KDIR    := /lib/modules/$(shell uname -r)/build
PWD    := $(shell pwd)

default:
	$(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules
3、编译
编译前,确认你的系统中安装了Linux-headerkernel-headers-2.6.xx.xx.xx包。

代码: 全选

~/hong/ch341$make
4、载入模块

代码: 全选

~/hong/ch341$sudo insmod ./ch341.ko
5、连接串口设备,OK.

发表于 : 2008-02-09 23:41
eexpress
新芯片的驱动。是麻烦。你是按照usb id号找到的,还是按照芯片型号找到的?

发表于 : 2008-02-10 9:55
qdzheng
eexpress 写了:新芯片的驱动。是麻烦。你是按照usb id号找到的,还是按照芯片型号找到的?
我是按照芯片型号找到的。

不过,现在正郁闷着呢。
同一个模块前几天用的很好,昨天就不好使了。insmod时报unknow symbol错误。
重新编译可以成功,但是insmod还是报unknow symbol错误。

中间我记得升级过一次内核,象是从2.6.22-14.49升级到2.6.22-14.51,是不是这个原因呢?

怀疑是不是linux-headers包与image不一致所致,删除linux-header包,将软件源改成官方的源,再clean、update、install,重新编译,insmod还是报告同一个错误。

我在ubuntu官方论坛里发帖救助,却没有人理我(英文写得太烂?)。

代码: 全选

~$ dmesg|tail
[67714.964000] ch341: Unknown symbol usb_serial_disconnect
[67714.964000] ch341: Unknown symbol usb_serial_generic_open
[67714.964000] ch341: Unknown symbol usb_serial_probe
[67714.964000] ch341: Unknown symbol usb_serial_register
[67714.964000] ch341: Unknown symbol usb_serial_deregister
[68828.176000] ch341: Unknown symbol usb_serial_disconnect
[68828.176000] ch341: Unknown symbol usb_serial_generic_open
[68828.176000] ch341: Unknown symbol usb_serial_probe
[68828.176000] ch341: Unknown symbol usb_serial_register
[68828.176000] ch341: Unknown symbol usb_serial_deregister

代码: 全选

~$ dpkg -l|grep 2.6.22-14
ii  linux-headers-2.6.22-14                    2.6.22-14.51                                      Header files related to Linux kernel version
ii  linux-headers-2.6.22-14-generic            2.6.22-14.51                                      Linux kernel headers for version 2.6.22 on x
ii  linux-image-2.6.22-14-generic              2.6.22-14.51                                      Linux kernel image for version 2.6.22 on x86
ii  linux-libc-dev                             2.6.22-14.51                                      Linux Kernel Headers for development
ii  linux-restricted-modules-2.6.22-14-generic 2.6.22.4-14.10                                    Non-free Linux 2.6.22 modules on x86/x86_64
ii  linux-ubuntu-modules-2.6.22-14-generic     2.6.22-14.38                                      Ubuntu supplied Linux modules for version 2.

发表于 : 2008-02-11 23:04
qdzheng
做了个试验,将内核源码中的pl2303模块单独拿出来编译一次,
这个也是USB转串口的驱动模块。
编译是没有任何问题的,但insmod还是会出现上面的unknow symbol错误。

这样可以说明:
1、代码上应该没有什么问题了;
2、问题的原因可能由我的编译环境引起的;
3、也有可能是这次升级的内核本身引起的。

有人愿意帮我看看吗? 感谢了。

发表于 : 2008-02-29 12:18
qdzheng
有解决方案了,呵呵。

简单些就这样:

代码: 全选

 modprobe usbserial && insmod ch341.ko
或者打补丁,参照:
http://ohioloco.ubuntuforums.org/showpo ... stcount=12

Re: [分享]CH340/CH341,USB转串口驱动模块

发表于 : 2009-05-07 17:44
fanyfu
我编译出错了,怎么会这样?

make -C /lib/modules/2.6.27-7-generic/build SUBDIRS=/home/fanyfu/ch341 modules
make[1]: 正在进入目录 `/usr/src/linux-headers-2.6.27-7-generic'
CC [M] /home/fanyfu/ch341/ch341.o
/home/fanyfu/ch341/ch341.c: 在函数‘ch341_open’中:
/home/fanyfu/ch341/ch341.c:248: 警告: 传递‘usb_serial_generic_open’的第 1 个参数时在不兼容的指针类型间转换
/home/fanyfu/ch341/ch341.c:248: 警告: 传递‘usb_serial_generic_open’的第 2 个参数时在不兼容的指针类型间转换
/home/fanyfu/ch341/ch341.c:248: 错误: 提供给函数‘usb_serial_generic_open’的实参太少
/home/fanyfu/ch341/ch341.c: 在函数‘ch341_set_termios’中:
/home/fanyfu/ch341/ch341.c:260: 错误: ‘struct usb_serial_port’没有名为‘tty’的成员
/home/fanyfu/ch341/ch341.c:266: 错误: ‘struct usb_serial_port’没有名为‘tty’的成员
/home/fanyfu/ch341/ch341.c:266: 错误: ‘struct usb_serial_port’没有名为‘tty’的成员
/home/fanyfu/ch341/ch341.c: 在文件层:
/home/fanyfu/ch341/ch341.c:317: 错误: 初始值设定项里有未知的字段‘num_interrupt_in’
/home/fanyfu/ch341/ch341.c:317: 错误: ‘NUM_DONT_CARE’未声明(不在函数内)
/home/fanyfu/ch341/ch341.c:318: 错误: 初始值设定项里有未知的字段‘num_bulk_in’
/home/fanyfu/ch341/ch341.c:318: 警告: 初始化时将整数赋给指针,未作类型转换
/home/fanyfu/ch341/ch341.c:319: 错误: 初始值设定项里有未知的字段‘num_bulk_out’
/home/fanyfu/ch341/ch341.c:319: 警告: 初始化时将整数赋给指针,未作类型转换
/home/fanyfu/ch341/ch341.c:321: 警告: 从不兼容的指针类型初始化
/home/fanyfu/ch341/ch341.c:322: 警告: 从不兼容的指针类型初始化
/home/fanyfu/ch341/ch341.c:350: 致命错误: 打开依赖文件 /home/fanyfu/ch341/.ch341.o.d:Permission denied
编译中断。
make[2]: *** [/home/fanyfu/ch341/ch341.o] 错误 1
make[1]: *** [_module_/home/fanyfu/ch341] 错误 2
make[1]:正在离开目录 `/usr/src/linux-headers-2.6.27-7-generic'
make: *** [default] 错误 2


能帮忙解决一下吗?

Re: [分享]CH340/CH341,USB转串口驱动模块

发表于 : 2009-06-09 23:31
xiaohai326
楼上的错误解决没,分享下啊,谢谢!

Re: [分享]CH340/CH341,USB转串口驱动模块

发表于 : 2009-06-22 17:10
fanyfu
没有解决完,但应该是和ubunto的内核版本有关。
我重新搜索了另外一个驱动程序,错误就只有两处了。

Re: [分享]CH340/CH341,USB转串口驱动模块

发表于 : 2009-12-01 21:53
ccjsj1
楼上的错误解决没有啊,分享下吧,谢谢! 你的msn多少啊?

Re: [分享]CH340/CH341,USB转串口驱动模块

发表于 : 2010-04-17 12:44
jsscx
PL2303能用吗?兄弟们 !我的 不能啊 ,在搜索很久了

Re: [分享]CH340/CH341,USB转串口驱动模块

发表于 : 2010-04-17 16:35
Arikee
jsscx 写了:PL2303能用吗?兄弟们 !我的 不能啊 ,在搜索很久了

家祭勿忘告乃翁

Re: [分享]CH340/CH341,USB转串口驱动模块

发表于 : 2010-05-19 22:17
weilihero
下载下来看看先,谢谢楼主分享

Re: [分享]CH340/CH341,USB转串口驱动模块

发表于 : 2010-11-10 10:35
jeryzhang
我刚刚开始学,看不懂,高手给教下这个怎么解决啊

jeryzhang@jeryzhang-laptop:~/下载/ch341$ make
make -C /lib/modules/2.6.32-25-generic/build SUBDIRS=/home/jeryzhang/下载/ch341 modules
make[1]: 正在进入目录 `/usr/src/linux-headers-2.6.32-25-generic'
CC [M] /home/jeryzhang/下载/ch341/ch341.o
/home/jeryzhang/下载/ch341/ch341.c:31: error: expected ‘}’ before ‘{’ token
/home/jeryzhang/下载/ch341/ch341.c: In function ‘ch341_open’:
/home/jeryzhang/下载/ch341/ch341.c:249: warning: passing argument 1 of ‘usb_serial_generic_open’ from incompatible pointer type
include/linux/usb/serial.h:307: note: expected ‘struct tty_struct *’ but argument is of type ‘struct usb_serial_port *’
/home/jeryzhang/下载/ch341/ch341.c:249: warning: passing argument 2 of ‘usb_serial_generic_open’ from incompatible pointer type
include/linux/usb/serial.h:307: note: expected ‘struct usb_serial_port *’ but argument is of type ‘struct file *’
/home/jeryzhang/下载/ch341/ch341.c: In function ‘ch341_set_termios’:
/home/jeryzhang/下载/ch341/ch341.c:261: error: ‘struct usb_serial_port’ has no member named ‘tty’
/home/jeryzhang/下载/ch341/ch341.c:261: warning: initialization from incompatible pointer type
/home/jeryzhang/下载/ch341/ch341.c:267: error: ‘struct usb_serial_port’ has no member named ‘tty’
/home/jeryzhang/下载/ch341/ch341.c:267: error: ‘struct usb_serial_port’ has no member named ‘tty’
/home/jeryzhang/下载/ch341/ch341.c:267: error: ‘struct usb_device_id’ has no member named ‘termios’
/home/jeryzhang/下载/ch341/ch341.c: At top level:
/home/jeryzhang/下载/ch341/ch341.c:318: error: unknown field ‘num_interrupt_in’ specified in initializer
/home/jeryzhang/下载/ch341/ch341.c:318: error: ‘NUM_DONT_CARE’ undeclared here (not in a function)
/home/jeryzhang/下载/ch341/ch341.c:318: warning: missing braces around initializer
/home/jeryzhang/下载/ch341/ch341.c:318: warning: (near initialization for ‘ch341_device.dynids’)
/home/jeryzhang/下载/ch341/ch341.c:318: error: initializer element is not constant
/home/jeryzhang/下载/ch341/ch341.c:318: error: (near initialization for ‘ch341_device.dynids.lock.raw_lock.slock’)
/home/jeryzhang/下载/ch341/ch341.c:319: error: unknown field ‘num_bulk_in’ specified in initializer
/home/jeryzhang/下载/ch341/ch341.c:320: error: unknown field ‘num_bulk_out’ specified in initializer
/home/jeryzhang/下载/ch341/ch341.c:320: warning: initialization makes pointer from integer without a cast
/home/jeryzhang/下载/ch341/ch341.c:322: warning: initialization from incompatible pointer type
/home/jeryzhang/下载/ch341/ch341.c:323: warning: initialization from incompatible pointer type
make[2]: *** [/home/jeryzhang/下载/ch341/ch341.o] 错误 1
make[1]: *** [_module_/home/jeryzhang/下载/ch341] 错误 2
make[1]:正在离开目录 `/usr/src/linux-headers-2.6.32-25-generic'
make: *** [default] 错误 2

Re: [分享]CH340/CH341,USB转串口驱动模块

发表于 : 2010-12-20 15:04
jiapper
那些代码适用于老的内核。内核不一样,很多结构体及函数的参数已经不一样了。


目前还不知道怎么改。

Re: [分享]CH340/CH341,USB转串口驱动模块

发表于 : 2011-10-19 13:29
fe07fe
laan@laan-MS-7267:~/Ubuntu One/ch341$ make
make -C /lib/modules/3.0.0-12-generic/build SUBDIRS=/home/laan/Ubuntu One/ch341 modules
make[1]: 正在进入目录 `/usr/src/linux-headers-3.0.0-12-generic'
make[1]: *** 没有规则可以创建目标“One/ch341”。 停止。
make[1]:正在离开目录 `/usr/src/linux-headers-3.0.0-12-generic'
make: *** [default] 错误 2

这个怎么弄啊!