一、实验基础与硬件
实验基于I.MX6ULL平台,选用内部ADC1通道1(对应GPIO1_IO01引脚)采集电压,输入电压需严格控制在0~3.3V,避免烧坏开发板。
二、设备树配置
内核默认dtsi已定义ADC1节点,需在板级设备树完成三项关键配置:
- 引脚复用:新增pinctrl节点,将GPIO1_IO01复用为adc1_CH1功能,并配置对应电气属性;
- 参考电压:添加regulator-fixed节点,提供3.3V固定参考电压,确保ADC转换基准稳定;
- 节点启用:在ADC1节点绑定引脚复用、挂载参考电压,将status设为"okay",激活ADC控制器。
三、内核驱动解析
驱动核心为内核原生的vf610_adc.c,采用platform驱动模型与IIO框架,核心逻辑如下:
1.数据结构:vf610_adc结构体承载私有数据,包含寄存器映射地址、时钟、参考电压、中断及同步机制;
- 初始化流程:probe函数完成IIO设备申请、寄存器映射、中断注册、时钟与参考电压获取,随后配置硬件并注册IIO设备;
- 数据交互:
vf610_read_raw回调处理用户读取请求,触发ADC转换后等待中断,中断服务函数读取硬件结果存入缓存,再唤醒等待队列返回数据,同时提供缩放系数获取接口;
- 内核配置:需在内核配置菜单中启用Freescale vf610 ADC驱动,确保驱动编译进内核或以模块形式加载。
四、用户态测试
- sysfs接口:通过
/sys/bus/iio/devices/iio:device0/目录下的in_voltage1_raw获取原始采样值,in_voltage_scale获取缩放系数,实际电压计算公式为“电压=原始值×缩放系数÷1000”;
- 测试程序:
adcApp.c循环读取上述文件,解析数值并计算电压,每100ms打印一次结果,编译时需开启硬件浮点支持;
- 测试操作:用杜邦线连接待测电压与GPIO1_IO01引脚,执行程序即可实时查看ADC原始值与电压值。
五、关键注意事项
接线前需确认待测电压不超3.3V,杜邦线移动时出现的电压跳变属于物理抖动,并非测量误差,稳定连接后即可获取准确结果。