将USB转串口驱动pl2303从5.10内核向后移植(back port)到4.15内核

背景

公司的USB转串口设备是绿联的,在windows上识别为Prolific 旺玖科技的pl2303系列,但是在ubuntu 1604.4(内核版本4.15)上无法驱动。
运行lsusb能看到它的product id0x23c3,浏览公司ftp上几个linux内核源码包,发现4.19也不支持该设备,支持的起码是5.x内核。

失败的尝试:升级内核到5.10

在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

解决编译error

执行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成功,感谢开源!

你可能感兴趣的:(驱动开发,linux,usb,串口,向后移植,back,port)