Linux驱动:UART串口通信、GT9147触摸屏与IIO-ADC驱动开发

本文基于i.MX6ULL平台,梳理UART串口通信、GPS、RS485+Modbus、GT9147电容触摸屏、TSlib校准以及IIO子系统ADC驱动的完整开发要点,同时包含开机自启动配置、AI辅助嵌入式开发的实战经验。

一、UART串口通信体系与GPS模块开发

串口是跨设备通信最常用的接口,和并行、I2C、SPI有着明确分工。并行通信单次传输多位,带宽高但引脚占用多;I2C适合板内低速外设,节省引脚;SPI适合板内高速外设;UART主打不同硬件之间的远距离通信。

电平标准分为TTL、RS232、RS485。TTL为3.3V/5V板间短距离通信;RS232单端信号,抗干扰弱;RS485差分信号,抗干扰能力强,适合工业场景,属于半双工通信。UART帧结构包含起始位、数据位、校验位、停止位,由片上UART控制器自动生成时序。

GPS模块(ATGM336H)使用UART输出NMEA协议文本,硬件交叉接线:模块TX接开发板RX、模块RX接开发板TX。常用参数9600N81,需要在室外才能正常搜星定位,解析GNGGA报文即可提取经纬度。Linux内核自带UART驱动,设备树节点设置status = "okay"后生成ttymxc系列设备节点,应用层直接按文件读写操作串口。

RS485一般跑Modbus RTU主从协议,数据包包含从站地址、功能码、数据区、CRC校验;03、04功能码用于读寄存器,10功能码用于批量写寄存器,一条总线最多挂载32个从设备。

二、AI辅助嵌入式开发与项目扩展

Cursor是嵌入式开发高效工具,支持直接操作工程文件、运行代码调试。使用时提示词要写清三点:需求、接口参数、当前项目上下文,内置多款国产大模型可按需切换。

项目拓展思路:读取GPS经纬度之后,可以通过Socket把坐标上传,调用地图API回显图片,在LCD屏幕上展示定位画面。

三、驱动模块开机自启动

简单的开机自动加载驱动方案:在/etc/profile脚本中添加insmod命令。系统启动过程会自动执行该脚本,上电即可加载指定.ko驱动,适合触摸屏这类必须开机生效的驱动。

注意:该方式简单直接,适合调试阶段使用。

四、GT9147 I2C电容触摸屏驱动与TSlib校准

GT9147是I2C接口电容触摸芯片,依托Linux I2C子系统+Input输入子系统开发。

设备树配置要点:挂载到对应I2C总线,配置中断引脚INT、复位引脚RST为GPIO,填写compatible = "goodix,gt9147"和正确从机地址。驱动基于i2c_driver框架,probe函数完成资源申请、硬件复位、中断注册;触摸触发中断后,在底半部读取坐标,调用input_report_abs上报X/Y坐标与触摸按键事件,内核生成/dev/input/eventX事件节点。

原始触摸坐标存在偏移,需要移植TSlib库做五点校准。交叉编译TSlib源码,部署库文件,在/etc/profile配置TSlib相关环境变量,指定设备节点和校准文件。校准后的坐标可以直接供给LVGL图形库使用,是GUI界面的基础。

五、ADC模数转换驱动(IIO子系统)

ADC实现模拟量转数字量,DAC反之。传感器链路:物理量→模拟电信号→调理电路→ADC→数字数据。

ADC三大核心指标:

  1. 量程:i.MX6ULL内置ADC量程0~3.3V,超量程需要电阻分压;
  2. 分辨率:12位ADC输出范围0~4095,3.3V下单步约0.8mV;高精度场景选用ADS1115等16位外部ADC;
  3. 采样速率:遵循奈奎斯特采样定理,采样频率至少为信号最高频率2倍。

Linux中ADC归类为IIO(Industrial I/O)工业IO子系统,采用Platform总线。内核打开Industrial I/O support配置项,设备树把引脚复用为ADC功能,配置通道。驱动加载后在/sys/bus/iio/devices/iio:device0提供文件接口:读取in_voltage0_raw得到原始值,读取scale,实际电压 = 原始值 × scale。

ADC采集容易受噪声干扰,常用中值滤波、低通滤波、卡尔曼滤波等算法稳定数据;高速变化信号单纯Linux内核驱动难以满足,可考虑FPGA方案。

六、后续学习路线

ADC之后将进入LVGL图形界面开发,结合Framebuffer显示、TSlib触摸校准,把之前调试完成的各类传感器数据、GPS定位信息整合到GUI界面,完成整套嵌入式综合项目。

相关推荐
zbyyd1 小时前
Linux驱动:SPI子系统与ADXL345三轴加速度传感器驱动开发
linux·驱动开发·arm
coward912 小时前
全志和瑞芯微平台反编译设备树
linux·嵌入式硬件
zbyyd2 小时前
Linux驱动开发:Misc混杂设备与设备树实战
linux·驱动开发
业余程序员plus2 小时前
RDMA-Verbs-软件架构(二)
linux·rdma·rocev2·mlx5·verbs·uverbs·libibverbs
坤坤子吖2 小时前
Linux 线程同步与互斥——条件变量与线程同步
linux·开发语言·c++·笔记·学习
张文君3 小时前
vmware克隆后ubuntu26.04 ip怎么更改
linux·运维·服务器
2402_882893863 小时前
Linux进程控制(上):fork、写时拷贝、进程终止与进程等待,一篇吃透!
linux·进程·fork·写时拷贝
小此方3 小时前
Linux网络(二十九):从内网穿透到P2P打洞:NAT转换、代理机制与局域网通信的底层全景解析
linux·网络·p2p
Brilliantwxx3 小时前
【Linux】基础IO(下):输出重定向、dup2 与 minishell 重定向实战
linux·运维·服务器·github·bash