公司的USB转串口设备是绿联的,在windows上识别为Prolific 旺玖科技的pl2303
系列,但是在ubuntu 1604.4
(内核版本4.15)上无法驱动。
运行lsusb
能看到它的product id
是0x23c3
,浏览公司ftp上几个linux内核源码包,发现4.19也不支持该设备,支持的起码是5.x内核。
在1604上编译5.10内核,安装后启动失败。
搜索资料得知ubuntu LTS版本包含2种内核,一种是GA
版,即1604.1的4.4内核不断打补丁,但不更新版本,所以没有新驱动;一种是HWE
版,是从非LTS发行版(1610 1704 1710)向后移植过来的内核和X server
,有新驱动,能支持新硬件。但是HWE版本不会无限更新,它在下一个LTS发布后就会中止,所以1604.4的内核版本恰好根1804.1一样,都是4.15,这还让我错怪过同事咋随意升级ubuntu大版本
启动失败很可能是因为我只更新了内核,没更新X server,二者不配套导致启动失败。
考虑到自己编译X server不确定性太大,转而考虑其他思路
想到USB转串口这个需求本身早已稳定下来,pl2303的代码应该改动不大,台湾人很可能只是在驱动里多注册了几个product id而已,决定尝试向后移植。
将5.10源码树/drivers/usb/serial/pl2303.c
和同目录的.h
文件拷贝到一个空文件夹下,然后添加符合kbuild
规范的Makefile
obj-m += pl2303.o
all:
$(MAKE) -C /lib/modules/`uanme -r`/build M=$(shell pwd)
clean:
@rm -rf *.o *.mod.c *.ko
执行make,失败,错误大意:
注册函数给一个不存在的回调函数接口get_serial
看了下新版驱动对get_serial的实现,不过是导出内部一些配置信息给用户而已,只要用户不用,应该就没关系。于是将
{
.get_serial = xxx_get_serial_xxx;
}
上面这行注释,再make,成功通过。
sudo modprobe usbserial
sudo insmod pl2303.ko
很幸运,内核除了在syslog抱怨这是个脏模块外,没有其他报错,而且/dev/ttyUSB0
终于出现了。
使用minicom测试,一般115200 8N1即可,不过配置串口时注意关掉硬件流控
(minicom默认打开-_-!),否则可能无法通信。
庆幸usbserial这个驱动中间件的接口在4.15到5.10基本没发生变化,而且向后兼容,这才让我有机会back port成功,感谢开源!