赞
踩
在《RK3568------Openharmony 4.0-Release HDF串口驱动(USB转串口) 上》这篇文章中我详细向大家分享了如何编写构建编译一个应用层的测试程序,通过调用HDF驱动框架提供的串口API,实现串口的收发。本篇文章我将详细讲解如何利用OHOS的平台驱动框架,将我的CH9344 USB转串口驱动添加到HDF框架里。
我们不需要看全部的代码,就只是这一句话,大家就明白了吧!!!,所谓的HDF串口驱动,实际上就是重新封装了一层接口,实际上他就是直接打开文件,进行读写操作
获取到CH9344驱动压缩包,解压以后
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.
obj-$(CONFIG_USB_SERIAL_CH9344) += ch9344.o
这里注意一下,想要添加该驱动,需要在内核配置中 CONFIG_USB_SERIAL_CH9344 =y,否则不生效
思路中已经说,理论上来说,我只要将CH9344编译进linux内核中,HDF的串口驱动就已经适配好了。我们只需要把CH9344转换后的这几个串口信息,添加到HCS中,就可以了
上图可以看到,只需要在原有的串口配置上,添加CH9344的串口配置就可以了。!!!!特别注意的,就是deviceMatchAttr这个属性,这个属性是私有变量名,配置了该属性,在加载的时候,就会查找定义了该私有属性的hcs文件,deviceMatchAttr要与私有配置的match_attr一致
,这个串口私有属性的HCS路径在//vendor/hihope/rk3568/hdf_config/khdf/platform/
感谢讨论群里@哇 @刘安兴 @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没有完全,会使内核陷在死循环中无法退出。我做了修改,具体修改可进讨论群获取,不在此赘述
。
本人之前一直从事应用开发,借着这次电鸿的契机进行系统级开发的学习,将我在工作中的遇到的问题及解决思路记录并分享,希望可以与诸君共勉
目前网上技术讨论群大都是鸿蒙的应用开发,总结此类文章也是希望将同样进行鸿蒙设备开发的同僚召集到一起,一起讨论学习。如果有同样在进行鸿蒙设备开发的朋友,可以加我的联系方式,期待您的消息
个人微信
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。