RK3568------Openharmony 4.0-Release HDF串口驱动(USB转串口) 下
文章目录
前言
在《RK3568------Openharmony 4.0-Release HDF串口驱动(USB转串口) 上》这篇文章中我详细向大家分享了如何编写构建编译一个应用层的测试程序,通过调用HDF驱动框架提供的串口API,实现串口的收发。本篇文章我将详细讲解如何利用OHOS的平台驱动框架,将我的CH9344 USB转串口驱动添加到HDF框架里。
一、驱动适配思路
- 背景:RK3568本身的串口资源对于我的项目是不够的,因此我们的底板采用CH9344芯片,将USB接口转换为RS485
- 准备:获取CH9344的Linux 驱动CH9344
- 分析:
通过解析CH9344驱动源码,首先我们需要明白,ch9344驱动里已经在内核中注册了tty的驱动
那么我们就可以认为,ch9344就是额外变出几个串口,就把他当串口就行,实际上将驱动成功移植到内核中,/dev下也确实产生了串口
接下来,我们就是看OHOS内核中,HDF的串口驱动是怎么实现的
//drivers/hdf_core/adapter/khdf/linux/platform/uart/uart_adapter.c
我们不需要看全部的代码,就只是这一句话,大家就明白了吧!!!,所谓的HDF串口驱动,实际上就是重新封装了一层接口,实际上他就是直接打开文件,进行读写操作
- 思路:
通过上面的分析,我们的思路就很清晰了,HDF的串口驱动是直接打开串口进行文件操作,CH9344驱动也是直接转成串口,实际上什么也不需要改动HDF的串口驱动就已经适配了。但是,实际上真的是这样吗?我们继续向下进行
二、CH9344 驱动移植
获取到CH9344驱动压缩包,解压以后
- 将driver中的.c和.h复制到linux内核中linux-5.10/drivers/usb/serial/
- 修改linux-5.10/drivers/usb/serial/Kconfig
config USB_SERIAL_CH9344 tristate "USB Winchiphead ch9344 four Port Serial Driver" help Say Y here if you want to use a Winchiphead CH9344 four port USB to serial adapter. To compile this driver as a module, choose M here: the module will be called ch9344.
- 修改inux-5.10/drivers/usb/serial/Makefile
obj-$(CONFIG_USB_SERIAL_CH9344) += ch9344.o
这里注意一下,想要添加该驱动,需要在内核配置中 CONFIG_USB_SERIAL_CH9344 =y,否则不生效
三、HCS配置
思路中已经说,理论上来说,我只要将CH9344编译进linux内核中,HDF的串口驱动就已经适配好了。我们只需要把CH9344转换后的这几个串口信息,添加到HCS中,就可以了
上图可以看到,只需要在原有的串口配置上,添加CH9344的串口配置就可以了。!!!!特别注意的,就是deviceMatchAttr这个属性,这个属性是私有变量名,配置了该属性,在加载的时候,就会查找定义了该私有属性的hcs文件,deviceMatchAttr要与私有配置的match_attr一致
,这个串口私有属性的HCS路径在//vendor/hihope/rk3568/hdf_config/khdf/platform/
- driver_name:该属性配置的不是随便填写的,HDF的串口驱动中,会根据这个属性去打开/dev/下的串口,所以CH9344注册到内核中是什么名字,就填写什么
- num:该属性会和driver_name组成字符串,去/dev/下打开实际串口
- match_attr:要与deviceMatchAttr一致
四、遇到的问题
感谢讨论群里@哇 @刘安兴 @Promise三位群友提供的问题以及解决方案
- 应用层接口中port到底应该是什么,才可以正确打开CH9344的串口
在《RK3568------Openharmony 4.0-Release HDF串口驱动(USB转串口) 上》文章中,留了一个悬念,应用层接口中port参数是几,才能正确打开串口,我们具体分析源码
通过源码可以得出,在HCS中会解析并拆分serviceName,拆分后的数字,就是对应的平台实际port
- HCS配置后不生效
配置后HCS后,在内核启动日志中,并没有看到成功加载HDF的CH9344驱动,反编译HCB文件后,发现配置的信息没有写进HCB,查找编译构建文件,发现如果已经有HCB文件了,是不会重新编译生成HCB的,删除HCB,重新编译即可生效
填写正确的port后,打开CH9344串口失败
在HDF串口驱动中增加调试打印,发现解析的CH9344串口名异常
打印可以看到,目标文件名应该是/dev/ttyCH9344USB1,实际名为/dev/ttySH9344USB1,产看串口驱动源码,发现是因为源码中只创建了一个数组,逻辑上串口名应该是一对一,但是现在是一对多,这里逻辑上是BUG,我做了修改,具体修改可进讨论群获取,不在此赘述
。设置阻塞模式不生效
查看源码发现,设置阻塞模式是伪实现,实际上的功能没有实现,我做了修改,具体修改可进讨论群获取,不在此赘述
。串口接收异常
进行收发测试发现可以发送,但是不可以接收,查看源码发现是描述符的FLAG参数配置项缺少我做了修改,具体修改可进讨论群获取,不在此赘述
。
6.串口驱动的接收是有一个逻辑BUG,会有可能在阻塞模式下使内核陷入异常死循环的风险
查看源码可以看到循环条件为 size >= tmp,当在阻塞模式下,如果接收的tmp没有完全,会使内核陷在死循环中无法退出。我做了修改,具体修改可进讨论群获取,不在此赘述
。
五、效果展示
总结
本人之前一直从事应用开发,借着这次电鸿的契机进行系统级开发的学习,将我在工作中的遇到的问题及解决思路记录并分享,希望可以与诸君共勉目前网上技术讨论群大都是鸿蒙的应用开发,总结此类文章也是希望将同样进行鸿蒙设备开发的同僚召集到一起,一起讨论学习。如果有同样在进行鸿蒙设备开发的朋友,可以加我的联系方式,期待您的消息
个人微信