1. 环境准备与基础知识
在开始编写基于IIO框架的ADC驱动之前,我们需要先准备好开发环境。我习惯使用Ubuntu 20.04作为开发系统,内核版本选择5.10以上的长期支持版本,这样既能保证稳定性,又能使用较新的IIO子系统特性。
开发环境配置其实很简单,只需要几个命令就能搞定。我一般先安装基础开发工具:
sudo apt update
sudo apt install build-essential git make gcc
然后是内核头文件,这个很重要,因为我们要编译内核模块:
sudo apt install linux-headers-$(uname -r)
IIO子系统相关的开发包也要安装,很多人会忽略这个:
sudo apt install libiio-dev iio-utils
装好之后,可以用iio_info命令检查一下系统当前的IIO设备情况。这个工具很实用,我在调试的时候经常用它来查看设备是否被正确识别。
硬件准备方面,我手头用的是一块基于STM32MP157的开发板,上面自带了一个12位的ADC模块。你也可以用树莓派或者其他带ADC的开发板,原理都是相通的。重要的是要搞清楚你的ADC芯片型号和连接方式,这个信息后面写设备树的时候会用到。
说到设备树,这里有个小技巧:在开始写驱动之前,先用ls /proc/device-tree看看系统已经加载的设备树结构,这样能避免很多低级错误。我刚开始学的时候就是没注意这个,浪费了好几个小时排查一个简单的节点命名问题。
2. 理解IIO框架架构
IIO(Industrial I/O)框架是Linux内核专门为模拟数字转换器(ADC)和数字模拟转换器(DAC)设计的子系统。它的设计真的很巧妙,把硬件操作和用户接口分离得清清楚楚。
核心组件包括:
- IIO设备:对应物理的ADC芯片
- IIO通道:每个ADC输入通道
- IIO触发器:数据采集的触发机制
- IIO缓冲区:用于高速数据采集
我最欣赏IIO框架的一点是它的sysfs接口,所有ADC数据都能在/sys/bus/iio/devices/下面找到。比如你可以直接cat一个通道的值:
cat /sys/bus/iio/devices/iio:device0/in_voltage0_raw
这种设计让调试变得特别方便。我记得有一次在调试一个温度传感器,就是通过直接读取sysfs节点快速定位到了是硬件连接问题。
IIO与Platform框架的配合也很重要。Platform框架负责设备与驱动的匹配,而IIO框架专门处理数据转换。这种分工让代码结构更清晰,维护起来也容易很多。
在实际项目中,我习惯先用IIO Utils测试硬件是否工作正常,再开始写驱动。这样可以先排除硬件问题,避免驱动调试时走弯路。iio_readdev是个很实用的工具,可以直接读取IIO设备的数据,验证硬件基本功能。
3. 设备树配置详解
设备树配置是驱动开发中最容易出错的环节,我来详细说说我的经验。首先要知道,设备树的作用是告诉内核硬件是怎么连接的,相当于硬件的说明书。
ADC节点定义通常长这样:
adc: adc@40012000 {
compatible = "st,stm32mp1-adc";
reg = <0x40012000 0x400>;
interrupts = <GIC_SPI 18 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&rcc ADC12_K>;
vref-supply = <&vrefbuf>;
status = "okay";
adc1: adc@0 {
compatible = "st,stm32mp1-adc";
#io-channel-cells = <1>;
reg = <0>;
st,adc-channels = <0 1 2>;
st,min-sample-time-nsecs = <100>;
};
};
这里有几个关键点需要注意:
compatible属性必须和驱动中的匹配表一致reg地址要和芯片手册对应- 时钟配置很重要,ADC


2640

被折叠的 条评论
为什么被折叠?



