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

CPU/显卡/打印机/USB设备等硬件问题
qdzheng
帖子: 277
注册时间: 2006-12-03 23:00

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

#1

帖子 qdzheng » 2008-02-09 23:35

因为工作原因,需要使用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.
附件
ch341.tar.gz
包含两个必要文件 ch341.c 与 Makfile
(2.76 KiB) 已下载 3505 次
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙

#2

帖子 eexpress » 2008-02-09 23:41

新芯片的驱动。是麻烦。你是按照usb id号找到的,还是按照芯片型号找到的?
● 鸣学
qdzheng
帖子: 277
注册时间: 2006-12-03 23:00

#3

帖子 qdzheng » 2008-02-10 9:55

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.
qdzheng
帖子: 277
注册时间: 2006-12-03 23:00

#4

帖子 qdzheng » 2008-02-11 23:04

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

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

有人愿意帮我看看吗? 感谢了。
qdzheng
帖子: 277
注册时间: 2006-12-03 23:00

#5

帖子 qdzheng » 2008-02-29 12:18

有解决方案了,呵呵。

简单些就这样:

代码: 全选

 modprobe usbserial && insmod ch341.ko
或者打补丁,参照:
http://ohioloco.ubuntuforums.org/showpo ... stcount=12
好吧,听某人的建议,修改下签名。
fanyfu
帖子: 2
注册时间: 2009-05-07 17:41

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

#6

帖子 fanyfu » 2009-05-07 17:44

我编译出错了,怎么会这样?

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


能帮忙解决一下吗?
xiaohai326
帖子: 1
注册时间: 2009-06-09 23:30

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

#7

帖子 xiaohai326 » 2009-06-09 23:31

楼上的错误解决没,分享下啊,谢谢!
fanyfu
帖子: 2
注册时间: 2009-05-07 17:41

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

#8

帖子 fanyfu » 2009-06-22 17:10

没有解决完,但应该是和ubunto的内核版本有关。
我重新搜索了另外一个驱动程序,错误就只有两处了。
头像
ccjsj1
帖子: 4
注册时间: 2009-12-01 21:49

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

#9

帖子 ccjsj1 » 2009-12-01 21:53

楼上的错误解决没有啊,分享下吧,谢谢! 你的msn多少啊?
jsscx
帖子: 4
注册时间: 2008-05-31 9:47

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

#10

帖子 jsscx » 2010-04-17 12:44

PL2303能用吗?兄弟们 !我的 不能啊 ,在搜索很久了
Arikee
帖子: 41
注册时间: 2010-04-09 20:18

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

#11

帖子 Arikee » 2010-04-17 16:35

jsscx 写了:PL2303能用吗?兄弟们 !我的 不能啊 ,在搜索很久了

家祭勿忘告乃翁
头像
weilihero
帖子: 2
注册时间: 2009-11-29 15:03

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

#12

帖子 weilihero » 2010-05-19 22:17

下载下来看看先,谢谢楼主分享
jeryzhang
帖子: 2
注册时间: 2007-06-07 11:11

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

#13

帖子 jeryzhang » 2010-11-10 10:35

我刚刚开始学,看不懂,高手给教下这个怎么解决啊

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
jiapper
帖子: 1
注册时间: 2010-12-20 15:01

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

#14

帖子 jiapper » 2010-12-20 15:04

那些代码适用于老的内核。内核不一样,很多结构体及函数的参数已经不一样了。


目前还不知道怎么改。
fe07fe
帖子: 11
注册时间: 2011-10-19 13:25

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

#15

帖子 fe07fe » 2011-10-19 13:29

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

这个怎么弄啊!
回复