当前位置: 首页 > news >正文

在嵌入式Linux平台为CH348串口芯片移植与适配驱动

1. 环境准备:搭建嵌入式Linux开发环境

在开始CH348驱动移植之前,我们需要先准备好开发环境。我建议使用OrangePi Zero 2作为目标开发板,它搭载了全志H616四核Cortex-A53处理器,运行ARM64架构的Linux系统。这个板子性价比高,社区支持也不错,特别适合做嵌入式开发实验。

首先得确保你的主机开发环境已经配置好交叉编译工具链。对于ARM64架构,我习惯使用Linaro提供的gcc工具链:

wget https://releases.linaro.org/components/toolchain/binaries/latest-7/aarch64-linux-gnu/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu.tar.xz tar -xvf gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu.tar.xz export PATH=$PATH:/path/to/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/bin

接下来需要获取开发板的内核源码并编译。这里有个坑要注意:一定要使用开发板厂商提供的内核版本,不要随便用主线内核。以OrangePi为例,可以从官方GitHub仓库获取:

git clone --branch orangepi-5.4 https://github.com/orangepi-xunlong/linux-orangepi.git cd linux-orangepi make ARCH=arm64 orangepi_zero2_defconfig make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- -j$(nproc)

编译内核可能需要30分钟到1小时,取决于你的主机性能。完成后记得把生成的Image和设备树文件(dtb)拷贝到SD卡启动分区。

2. 获取并准备CH348驱动源码

CH348是沁恒微电子推出的一款USB转8串口芯片,在工业控制领域应用广泛。官方驱动下载地址是https://www.wch.cn/downloads/CH348EVT_ZIP.html。我下载的是最新版的Linux驱动包,解压后看到以下关键文件:

  • Makefile:驱动编译配置文件
  • ch348.c:驱动核心源码
  • ch348.h:头文件
  • readme.txt:简要说明文档

这里有个重要提示:官方驱动默认是针对x86架构编写的,我们需要手动修改Makefile以适应ARM64平台。我建议先备份原始文件:

cp Makefile Makefile.bak

然后用文本编辑器打开Makefile,主要修改以下参数:

ARCH ?= arm64 CROSS_COMPILE ?= aarch64-linux-gnu- KERNELDIR ?= /path/to/linux-orangepi

特别注意KERNELDIR要指向你之前编译的内核源码目录,这是很多新手容易出错的地方。如果路径不对,编译时会报各种头文件找不到的错误。

3. 驱动编译与问题排查

准备好环境后,就可以开始编译驱动了。在驱动目录下执行:

make clean make

理想情况下会生成ch348.ko驱动模块文件。但实际过程中可能会遇到各种问题,我遇到过几个典型错误:

问题1:内核版本不匹配报错信息类似"version magic '5.4.xx' should be '5.4.yy'"。 解决方法是在Makefile中添加:

CONFIG_MODULE_SIG=n

问题2:缺少依赖的头文件错误提示找不到linux/version.h等文件。 这通常是因为KERNELDIR路径设置不正确,或者内核没有完整编译。确保先执行过make modules

问题3:架构相关错误出现"implicit declaration of function"等警告。 需要在源码中添加ARM64相关的宏定义,在ch348.h开头加入:

#ifdef CONFIG_ARM64 #define __ARCH_WANT_SYS_OLD_MMAP #endif

编译成功后,用file命令检查生成的ko文件:

file ch348.ko

应该显示"ARM64 aarch64"架构信息。

4. 驱动加载与设备节点验证

把编译好的ch348.ko通过scp或U盘拷贝到开发板上,准备加载测试。我建议先检查当前系统的串口设备:

ls /dev/tty*

然后加载驱动:

insmod ch348.ko dmesg | tail

成功的加载会在内核日志中看到类似信息:

[ 123.456789] ch348: loading out-of-tree module taints kernel. [ 123.567890] ch348: module verification failed: signature and/or required key missing - tainting kernel [ 123.678901] usbcore: registered new interface driver ch348

这时候再查看设备节点,应该能看到新增的串口设备:

ls /dev/ttyCH348*

正常情况下会显示ttyCH348USB0到ttyCH348USB7共8个串口节点。

如果没看到设备节点,可能是权限问题,试试:

chmod 666 /dev/ttyCH348*

5. 串口通信功能测试

为了验证驱动是否真正工作,我们需要进行实际的串口通信测试。准备一个USB转串口模块,连接到CH348的任意一个串口(比如COM0)。

在开发板上安装串口调试工具:

apt-get install minicom

配置minicom连接第一个串口:

minicom -D /dev/ttyCH348USB0 -b 115200

在另一个终端发送测试数据:

echo "Hello CH348" > /dev/ttyCH348USB0

如果一切正常,在minicom界面应该能看到接收到的字符串。为了更全面测试,可以编写一个简单的C测试程序:

#include <stdio.h> #include <fcntl.h> #include <termios.h> int main() { int fd = open("/dev/ttyCH348USB0", O_RDWR | O_NOCTTY); if (fd < 0) { perror("Open port failed"); return -1; } struct termios options; tcgetattr(fd, &options); cfsetispeed(&options, B115200); cfsetospeed(&options, B115200); options.c_cflag |= (CLOCAL | CREAD); options.c_cflag &= ~PARENB; options.c_cflag &= ~CSTOPB; options.c_cflag &= ~CSIZE; options.c_cflag |= CS8; tcsetattr(fd, TCSANOW, &options); write(fd, "CH348 test message\n", 19); char buf[32]; int n = read(fd, buf, sizeof(buf)); if (n > 0) { printf("Received: %.*s", n, buf); } close(fd); return 0; }

交叉编译这个测试程序:

aarch64-linux-gnu-gcc test.c -o test

6. 常见问题与解决方案

在实际项目中,我遇到过CH348驱动的一些典型问题,这里分享几个常见案例:

问题1:插入USB设备后系统无反应

  • 检查dmesg输出,确认USB设备是否被识别
  • 尝试不同的USB端口,有些开发板的USB供电不足
  • 确认驱动已正确加载,使用lsmod | grep ch348

问题2:串口数据收发不稳定

  • 降低波特率测试,排除硬件问题
  • 检查流控设置,建议初始测试时禁用硬件流控
  • 确保地线连接良好,避免共模干扰

问题3:多串口同时使用时出现混乱

  • 给每个串口分配独立的缓冲区大小
  • 增加数据传输间隔,避免总线过载
  • 考虑使用多线程分别处理各个串口

问题4:驱动加载后系统崩溃

  • 可能是内核版本不兼容,尝试重新编译驱动
  • 检查内核配置是否启用了必要的USB和串口子系统
  • 降低驱动中的调试信息输出级别

对于需要长期运行的系统,我建议将驱动编译进内核镜像而不是以模块形式加载。在内核配置中:

make ARCH=arm64 menuconfig

找到Device Drivers -> USB support -> USB Serial Converter support,将CH348驱动设为<*>内置。

最后提醒一点,CH348的每个串口都可以独立配置参数,包括波特率、数据位、停止位和校验位。在实际应用中,要根据对接设备的规格正确设置这些参数,否则会导致通信失败。

http://www.jsqmd.com/news/613549/

相关文章:

  • Winhance中文版:让Windows系统效能提升的一站式优化工具
  • 并查集计算
  • RMBG-2.0多场景落地:从淘宝主图抠图到AI数字人素材生成全流程解析
  • Mathesar安全配置终极指南:保护PostgreSQL数据库免受未经授权访问
  • 好用的圆锥破品牌推荐,宝创工程机械怎么样 - 工业品网
  • 高效实战:AdvancedSessionsPlugin多玩家管理解决方案全解析
  • Katran TPR功能终极指南:如何实现高性能TCP包路由和智能流量管理
  • 【蓝桥杯算法】2026/4/9 贪心+双指针
  • 数字孪生与元宇宙:虚拟测试的终极形态
  • 剑指offer-61、序列化二叉树
  • Steam Achievement Manager:全方位掌控游戏成就的开源解决方案
  • 【Flink】Flink 作业执行大致流程
  • 论文写作软件哪家强?2026年选型全攻略,一篇看懂
  • 工程师选型指南:如何评估一款高性价比的自动化控制系统?以久茂为例 - 品牌推荐大师
  • ubuntu截图工具推荐:Flameshot
  • 京东e卡回收多久到账?高效渠道这样选! - 购物卡回收找京尔回收
  • FreakStudio滞
  • 黑苹果配置革命:15分钟完成OpenCore EFI的终极简单指南
  • 解决学术文献格式兼容难题:本地CAJ转PDF工具提升研究效率
  • AI 模型训练数据预处理策略
  • 2026江苏重型筛分站经验丰富的供应企业,费用和服务情况揭秘 - 工业设备
  • p0wny-shell项目演进分析:从2016到2023的版本更新与功能增强
  • [技术突破]AppleRa1n:iOS设备激活验证的高效解决方案
  • 3个革新性步骤:Cursor Free VIP突破AI编程助手使用限制
  • 2026年深圳靠谱的数字化服务公司排名:中汇高科技术是否先进,价格贵不贵? - myqiye
  • DotNetPy:现代.NET 与 Python 互操作 实战指南允
  • 如何轻松备份微信聊天记录:WeChatExporter完整使用指南
  • 跨平台游戏串流:Sunshine构建家庭娱乐中心全指南
  • 想找好用的排水防涝监测服务,深圳恒星物联值得推荐吗? - 工业品牌热点
  • 2026年深圳靠谱数字化服务商推荐,中汇高科产品质量好吗 - 工业设备