RK3568 OpenHarmony 4.0 HDF串口驱动(USB转串口)适配与问题排查实战

RK3568------Openharmony 4.0-Release HDF串口驱动(USB转串口) 上 距离发布上一篇文章时隔半个月!之所以这么长时间没有发布文章,是因为一直在做适配CH9344 USB转串口驱动适配HDF驱动框架的工作,在这个过程遇到了很多问题,我将通过上、下两篇文章来详细讲解。本章的内容为-------如何在OHOS编译构建体系中,调用HDF提供的上层接口。本人之前一直从事应用开发,借着这次电鸿的契机进行系统级开发的学习,将我在工作中的遇到的问题及解决思路记录并分享,希望可以与诸君共勉。 阅读详情

1. 驱动适配思路与背景

最近在RK3568平台上做OpenHarmony 4.0项目时遇到了一个实际问题:板载的串口资源根本不够用!我们的设备需要连接多个外设,原生串口只有3-4个,完全无法满足需求。经过一番调研,最终选择了CH9344这款USB转串口芯片,它能够将USB接口扩展为4个独立的串口,正好解决了我们的痛点。

拿到CH9344的Linux驱动后,我开始分析OpenHarmony的HDF串口驱动框架。仔细阅读//drivers/hdf_core/adapter/khdf/linux/platform/uart/uart_adapter.c源码后发现一个关键点:HDF串口驱动本质上就是对Linux标准串口设备文件的封装。它通过open("/dev/ttySx")这样的操作来访问物理串口,然后提供统一的API给上层应用。

这就让我产生了第一个想法:既然CH9344在Linux内核中注册为标准的tty设备(会产生/dev/ttyCH9344USB0之类的设备节点),那么理论上HDF驱动应该能直接识别和使用这些设备。但实际测试发现,事情并没有这么简单——直接编译驱动后,应用层根本无法正确打开CH9344创建的串口设备。

2. CH9344驱动移植详解

首先需要获取CH9344的官方Linux驱动包。解压后重点关注driver目录下的.c和.h文件。将这些文件复制到内核源码的linux-5.10/drivers/usb/serial/目录下,这是USB转串口驱动的标准存放位置。

接下来要修改内核配置系统。编辑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.

然后在同目录的Makefile中添加编译规则:

obj-$(CONFIG_USB_SERIAL_CH9344) += ch9344.o

完成这些修改后,需要配置内核。执行make menuconfig,在Device Drivers → USB support → USB Serial Converter support中找到"USB Winchiphead ch9344 four Port Serial Driver"选项,将其编译为模块或直接内置到内核中。建议选择<Y>直接编译进内核,避免模块加载的复杂性。

编译内核时我遇到了一个坑:虽然配置了CONFIG_USB_SERIAL_CH9344=y,但编译后驱动并没有生效。后来发现是内核配置没有正确保存。解决方法是直接编辑.config文件,确保有以下行:

CONFIG_USB_SERIAL_CH9344=y

编译成功后,可以在/dev目录下看到新出现的ttyCH9344USB0到ttyCH9344USB3设备节点,这说明驱动已经成功加载。

3. HCS配置文件的关键配置

HDF驱动需要通过HCS配置文件来识别和管理硬件设备。在OpenHarmony中,串口设备的配置通常位于//vendor/hihope/rk3568/hdf_config/khdf/platform/目录下。

我们需要在现有的串口配置基础上添加CH9344的设备信息。以下是一个配置示例:

device_uart_ch9344_0 :: uart_device {
    num = 10;
    driver_name = "ttyCH9344USB";
    match_attr = "rockchip_rk3568_uart_10";
}

device_uart_ch9344_1 :: uart_device {
    num = 11;
    driver_name = "ttyCH9344USB";
    match_attr = "rockchip_rk3568_uart_11";
}

这里有几个关键参数需要特别注意:

  • num参数很重要,它会被HDF驱动用来构造完整的设备路径。比如num=10,driver_name="ttyCH9344USB",最终会尝试打开/dev/ttyCH9344USB10
  • driver_name必须与内核中注册的设备名前缀完全一致,大小写敏感
  • match_attr需要与device_info.hcs中的配置对应,这是HDF框架识别设备的关键标识

配置完成后,需要将HCS文件编译为HCB二进制格式。有时候修改HCS后不生效,可能是因为系统使用了旧的HCB文件。解决方法是删除旧的HCB文件,强制重新编译生成新的HCB。

4. 问题排查与解决方案

在实际适配过程中,我遇到了几个典型问题,这里分享排查思路和解决方法。

应用层port参数问题:在应用调用UartOpen(port)时,port参数应该填什么值?通过分析HDF源码发现,port参数实际上对应HCS配置中的num值。如果你配置的num=10,那么port就应该传10。

阻塞模式失效问题:测试发现设置阻塞模式后,读操作仍然立即返回。查阅HDF串口驱动源码发现,阻塞模式的实现存在缺陷。在uart_adapter.c中,需要修改UartRead函数的实现,正确设置文件描述符的阻塞标志位:

// 修改前:缺少阻塞设置
int flags = fcntl(fd, F_GETFL);
// 修改后:根据模式设置阻塞标志
if (mode == BLOCKING_MODE) {
    flags &= ~O_NONBLOCK;
} else {
    flags |= O_NONBLOCK;
}
fcntl(fd, F_SETFL, flags);

串口接收异常问题:能够发送数据但无法接收。通过添加调试打印发现,在设置串口参数时,某些必要的标志位没有被正确设置。需要在驱动中确保CRTSCTS、CREAD等标志位被正确配置:

struct termios options;
tcgetattr(fd, &options);
options.c_cflag |= (CLOCAL | CREAD); // 添加本地连接和接收使能
tcsetattr(fd, TCSANOW, &options);

内核死循环风险:在分析HDF串口驱动源码时,发现一个潜在的死循环问题。在阻塞读取模式下,当接收数据不完整时,代码可能会陷入无限循环。需要修改循环条件,添加超时机制:

// 修改前:可能死循环
while (size >= tmp) {
    // 读取操作
}

// 修改后:添加超时保护
int timeout = 1000; // 超时时间
while (size >= tmp && timeout-- > 0) {
    // 读取操作
    usleep(1000); // 适当休眠
}

这些修改都需要重新编译内核或驱动模块,建议在修改前备份原始文件,方便出现问题时的回退。

5. 效果验证与测试

完成所有配置和修改后,需要进行全面的功能测试。首先编写一个简单的测试程序:

#include <stdio.h>
#include "uart_if.h"

void test_ch9344_uart() {
    DevHandle handle = UartOpen(10); // 对应HCS中的num值
    if (handle == NULL) {
        printf("Open UART failed!\n");
        return;
    }
    
    // 配置串口参数
    UartSetBaud(handle, 115200);
    // 其他配置...
    
    // 测试发送
    uint8_t data[] = "Hello CH9344!";
    UartWrite(handle, data, sizeof(data));
    
    // 测试接收
    uint8_t buffer[128];
    int received = UartRead(handle, buffer, sizeof(buffer));
    printf("Received %d bytes\n", received);
    
    UartClose(handle);
}

测试时需要注意物理连接的正确性。CH9344的TX应该接目标设备的RX,RX接目标设备的TX,地线要共地。如果使用RS485模式,还需要正确连接方向控制引脚。

通过dmesg | grep ch9344可以查看内核日志,确认驱动加载状态和设备识别情况。如果一切正常,应该能看到类似这样的输出:

ch9344 1-1.2:1.0: ch9344 converter detected
usb 1-1.2: ch9344 converter now attached to ttyCH9344USB0

6. 性能优化建议

在实际使用中,我发现CH9344的性能还可以进一步优化。首先建议调整内核的USB相关参数,提高传输效率:

# 增加USB核心的传输缓冲区大小
echo 1000 > /sys/module/usbcore/parameters/usbfs_memory_mb

# 调整USB中断处理频率
echo 1 > /sys/bus/usb/devices/usb1/power/autosuspend_delay_ms

对于高速数据传输场景,可以考虑修改HDF驱动的缓冲区大小。在uart_adapter.c中调整读写缓冲区的大小:

#define READ_BUFFER_SIZE 4096  // 默认是1024
#define WRITE_BUFFER_SIZE 4096

另外,如果遇到数据丢失问题,可以启用流控功能。在HCS配置中添加硬件流控支持:

device_uart_ch9344_0 :: uart_device {
    num = 10;
    driver_name = "ttyCH9344USB";
    match_attr = "rockchip_rk3568_uart_10";
    flow_control = 2; // 1:软件流控, 2:硬件流控
}

7. 实际项目中的注意事项

在真实项目环境中,有几点特别需要注意。首先是电源管理问题,CH9344作为USB设备,容易受到电源噪声干扰。建议在硬件设计时添加适当的滤波电容,并在软件中配置合理的电源管理策略:

// 禁用USB自动挂起
echo -1 > /sys/bus/usb/devices/1-1.2/power/autosuspend_delay_ms

其次是热插拔支持。在实际部署中,USB设备可能会被频繁插拔,需要确保驱动能够正确处理这些事件。在驱动中需要完善disconnect和probe函数的实现,添加必要的错误处理和资源释放逻辑。

最后是日志记录,建议在驱动中添加详细的调试信息,方便后续的问题排查:

// 在关键函数中添加日志输出
HDF_LOGI("CH9344 probe started, device=%s", dev_name(dev));

这些经验都是从实际项目中总结出来的,希望能够帮助大家少走弯路。如果在实施过程中遇到其他问题,建议仔细阅读内核文档和CH9344的数据手册,很多时候问题的答案就在这些文档中。

手把手教你为OpenHarmony 4.0的RK3568板子搞定USB转串口(CH9344驱动移植与HDF配置避坑) 本文详细解析了在OpenHarmony 4.0系统中为RK3568开发板移植CH9344 USB转串口驱动的全流程,包括内核配置、HDF框架适配及常见问题解决方案。重点介绍了驱动加载验证、HCS配置文件详解以及典型问题修复方法,帮助开发者高效实现串口资源扩展。 阅读详情

相关推荐

RK3568上给OpenHarmony 4.0加USB串口(CH9344芯片)的保姆级避坑指南

本文详细介绍了在RK3568平台上为OpenHarmony 4.0添加CH9344 USB串口驱动的完整避坑指南。从HCS配置失效、串口名解析错误到阻塞模式伪实现等五大典型问题,提供深度排障方案和修复代码,帮助开发者高效解决USB转串口驱动适配中的疑难杂症。

weixin_30415113的博客 318

RK 3568 移植CH9344驱动流程记录

1.简介 因为我们有个项目需要挂载多个USB设备,导致原本rk3568的4路USB不够用,所以硬件画板就添加了一个USB Hub IC (Ch9344)一分四。接下来我们就要开始在rk3568上移植ch9344的驱动,让它跑起来。因为是挂在USB上的,所以不需要配置dts,移植完驱动就可以使用了 2.移植过程 因为走USB,所以原理图就没有必要看了,就是一路USB口插了一个hub 2.1下载驱动文件 在沁恒微官网(http://www.wch.cn/bbs/thread-67447-1.html)上直接下载

Kamin的博客 2469

OpenHarmony 5.0.2 RK3568开发板USB摄像头适配保姆级教程(附HCS配置修改与调试命令)

本文提供OpenHarmony 5.0.2 RK3568开发板USB摄像头适配的详细教程,涵盖硬件验证、HCS配置修改、编译系统处理及高级调试技巧。通过实战案例和优化建议,帮助开发者快速解决USB摄像头适配中的常见问题,提升开发效率。

weixin_33704234的博客 404

RK3568 OpenHarmony 4.0 HDF串口驱动(USB转串口)适配实战与问题解析

本文详细介绍了在RK3568平台上适配OpenHarmony 4.0 HDF框架下USB转串口驱动的实战经验。重点解析了CH9344驱动移植、HCS配置及常见问题解决方案,为开发者提供了一套完整的USB转串口驱动适配指南,有效解决了多串口扩展需求。

zero1的博客 924

OpenHarmony 5.0.2 RK3568开发板USB摄像头无图像?手把手教你修改HCS配置搞定

本文详细解析了OpenHarmony 5.0.2 RK3568开发板USB摄像头无图像的问题,提供了修改HCS配置的完整解决方案。通过排查驱动适配、清理编译缓存和重新编译系统等步骤,帮助开发者快速解决USB摄像头适配问题,提升开发效率。

weixin_29306317的博客 151

OpenHarmony 5.0.2 USB摄像头适配:从配置修改到图像采集的完整调试指南

本文详细介绍了在OpenHarmony 5.0.2系统中适配USB摄像头的完整流程,包括环境准备、关键配置修改、深度调试与验证等步骤。通过修改HCS配置文件、清理编译缓存、使用v4l2工具检查摄像头等实用技巧,帮助开发者快速解决USB摄像头适配问题,实现图像采集功能。

weixin_29232507的博客 244

RK3568------Openharmony 4.0-Release HDF串口驱动(USB转串口) 下

在《RK3568------Openharmony 4.0-Release HDF串口驱动(USB转串口) 上》这篇文章中我详细向大家分享了如何编写构建编译一个应用层的测试程序,通过调用HDF驱动框架提供的串口API,实现串口的收发。本篇文章我将详细讲解如何利用OHOS的平台驱动框架,将我的CH9344 USB转串口驱动添加到HDF框架里。本人之前一直从事应用开发,借着这次电鸿的契机进行系统级开发的学习,将我在工作中的遇到的问题及解决思路记录并分享,希望可以与诸君共勉。

weixin_42868855的博客 3917

RK3568 GPIO开发全解析:从设备树到用户空间实战指南

GPIO(通用输入输出)是嵌入式系统连接微处理器与外部物理世界的基础接口,其核心原理在于通过可编程引脚实现数字信号的输入与输出控制。在Linux等复杂操作系统中,GPIO子系统通过设备树(DTS)进行硬件抽象与配置,管理引脚的复用功能、电气属性及中断机制,为驱动开发提供统一框架。这一技术价值在于实现了硬件资源的软件化定义与动态管理,极大地提升了嵌入式设备外设控制的灵活性与可维护性。其典型应用场景包括按键检测、LED控制、传感器通信及外设复位等。本文聚焦于瑞芯微RK3568平台,针对GPIO开发中设备树配置、

weixin_33851429的博客 397

RK3568平台OpenHarmony 4.0 HDF串口驱动适配实战:从USB转串口芯片CH9344到HCS配置与问题排查

本文详细介绍了在RK3568平台上适配OpenHarmony 4.0 HDF串口驱动的全过程,重点聚焦于USB转串口芯片CH9344的驱动移植、HCS配置细节与常见问题排查。通过解析驱动框架原理和提供实战配置示例,帮助开发者高效解决多串口扩展需求,提升在OpenHarmony系统上的外设驱动开发能力。

neovim7hacker的博客 757

OpenHarmony RK3568开发板救砖实录:从MaskRom模式恢复到完整测试套执行

本文详细记录了OpenHarmony RK3568开发板从MaskRom模式救砖到系统完整性验证的全过程。通过硬件短接、按键组合和电压脉冲三种方法强制进入MaskRom模式,并分阶段安全烧写系统镜像,最终完成核心子系统测试和性能回归验证,为开发者提供了一套完整的救砖方案。

weixin_34194829的博客 265

OpenHarmony调试三板斧:RK3568串口、HDC与内核日志

嵌入式系统开发中,调试是核心技术环节,日志分析与远程交互工具则是定位问题的关键抓手。在OpenHarmony与RK3568组合的开发场景中,开发者需掌握基于Linux内核机制的多层次调试手段:串口日志用于观察启动早期链路,HDC提供类似ADB的运行时交互,内核日志则深挖崩溃现场。结合设备树选型基础,通过实际案例讲解如何从启动日志对比、进程状态检查到时钟竞态分析,系统化解决偶发黑屏等疑难问题。掌握这些基础调试技能,能大幅提升面向鸿蒙生态的嵌入式开发效率。

weixin_31236101的博客 322

RK3568平台OpenHarmony 4.0 HDF串口驱动适配实战:USB转串口芯片CH9344的调试与优化

本文详细介绍了在RK3568平台OpenHarmony 4.0系统上适配USB转串口芯片CH9344的HDF驱动实战过程。内容包括驱动移植、内核配置、HDF框架适配、常见问题解决方案及性能优化,重点解决了串口名解析、阻塞模式失效等关键问题,为多串口扩展需求提供了完整可靠的实现方案。

z5a6b的博客 739

OpenHarmony源码树全解剖:从目录结构到RK3568设备树实战

开源操作系统源码规模庞大,源码树是理解其架构与工程实践的入口。OpenHarmony采用模块化与分布式设计,顶层目录按系统核心组件、能力子系统与工具链清晰划分,理解这套组织逻辑是进行系统裁剪、设备移植和驱动适配的基础。在硬件适配过程中,设备树起着关键作用,尤其RK3568平台常包含多份dts文件,如何依据硬件规格正确选择并配置设备树,直接影响系统能否稳定启动。结合编译环境搭建、镜像烧录和日志排查,开发者可以高效定位硬件与驱动问题。本文从源码树的通用概念出发,深入OpenHarmony的目录结构,重点解析RK

weixin_42535703的博客 301

OpenHarmony 4.0 HDF串口驱动深度排雷:从CH9344移植到修复5个隐藏Bug的完整记录

本文详细记录了在OpenHarmony 4.0 HDF框架下,将CH9344 USB转串口驱动移植到RK3568平台的全过程,并修复了5个关键隐藏Bug。从HCS配置失效到内核死循环风险,文章提供了完整的排雷经验和实用解决方案,帮助开发者提升驱动稳定性和系统可靠性。

weixin_42631411的博客 155

RK356X系列(RK3568)GL857L芯片 USB驱动开发

RK356X系列(RK3568)GL857L芯片 USB驱动开发

yinsui1839的博客 1560

USC EE450 CSCI455 CSCI571 Midterm 总结

EE450 Compter Network                1.历年Midterm考题。(更新至2017年spring,如果大家有新的资源欢迎编辑)                 google drive:https://drive.google.com/drive/folders/0B_LCDxpiiXZ1cUNReFpZZHo4NG8?usp=sharing

Small_hour 7112

HDF串口驱动开发中的陷阱与修复:从阻塞模式死循环到数据接收异常

本文深入探讨了在OpenHarmony系统RK3568平台上开发HDF串口驱动时遇到的典型问题,特别是阻塞模式下的死循环和数据接收异常。通过分析问题根源并提供了具体的代码修复方案和调试技巧,为开发者解决USB转串口驱动开发中的棘手问题提供了实战指南。

tcp8optimizer的博客 423

Aras Innovator生命周期图实战:从配置到权限管理的全流程解析

本文详细解析了Aras Innovator生命周期图的全流程配置与权限管理,从基础概念到实战应用,涵盖状态设置、路径配置、权限控制等核心功能。通过实际案例和代码示例,帮助用户掌握如何高效管理数据生命周期,提升业务流程的规范性和效率。

ee345的博客 169

OpenHarmony 4G模组EC20驱动适配与网络连接实战指南

在物联网设备开发中,实现稳定可靠的远程数据传输是核心需求,尤其依赖蜂窝网络技术。4G通信模组作为关键硬件,通过串口或USB接口与主控系统连接,其驱动适配与网络协议栈集成是技术难点。其工作原理涉及硬件接口识别、内核驱动加载、PPP拨号协议栈建立以及与操作系统网络管理服务的对接。这项技术的价值在于为无Wi-Fi或有线网络环境的户外设备提供了自主联网能力,广泛应用于智能仪表、远程监控、车载终端等数据采集与传输场景。本文以移远通信EC20这款经典4G模组为例,详细解析其在OpenHarmony分布式操作系统上的完整

weixin_34321753的博客 371

【Pytorch】DCGAN实战(三):二次元动漫头像生成

文章目录1.实现效果2.环境配置2.1Python2.2Pytorch、CUDA2.3Python IDE3.具体实现3.1数据预处理(data.py)(1)导入包(2)定义数据类3.2模型Generator,Discriminator,权重初始化(model.py)(1)导入包(2)Generator(3)Discriminator(4)权重初始化3.3网络训练(net.py)(1)导入包(2)创建类3.4 主函数(main.py)(1)导入文件(2)定义超参数(3)实例化(4)进行训练4.训练过程4.1

qq_44031210的博客 4918

FANUC机器人S523 新款PN板卡与西门子PLC通信配置介绍

FANUC机器人S523 新款PN板卡与西门子PLC通信配置介绍

Robot_PLC_HMI_Automation 354
上一篇: 从数据流到稳定通信:环形队列在嵌入式系统中的异步处理艺术
下一篇: 从零到一:ARM32嵌入式设备上的SIP语音通信与WebRTC-AEC3回声消除实战指南
devops8pract
博客等级 码龄4年 533粉丝 849原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值