目录
前言
本文主要介绍RK3568 CPU内部ADC的使用方法,CPU内部使用逐次逼近ADC (Successive Approximation Register),支持六通道单端10位的SAR-ADC,时钟频率必须小于13MHZ。内核采用工业 I/O 子系统来控制 ADC,该子系统主要为 AD 转换或者 DA 转换的传感器设计。 下面以 SAR-ADC 为例子,介绍 ADC 的基本配置方法。
一、部分原理图
SAR-ADC部分原理图如下所示,根据原理图采用SARADC_VIN4第四个通道作为AD数据采集通道:
二、DTS设备树节点配置
设备树文件采用官方SDK设备树文件为基础进行修改,/rk356x_linux_220118/kernel/arch/arm64/boot/dts/rockchip/rk3568.dtsi
saradc: saradc@fe720000 {
compatible = "rockchip,rk3568-saradc", "rockchip,rk3399-saradc";
reg = <0x0 0xfe720000 0x0 0x100>;
interrupts = <GIC_SPI 93 IRQ_TYPE_LEVEL_HIGH>;
#io-channel-cells = <1>;
clocks = <&cru CLK_SARADC>, <&cru PCLK_SARADC>;
clock-names = "saradc", "apb_pclk";
resets = <&cru SRST_P_SARADC>;
reset-names = "saradc-apb";
status = "disabled";
};
板级设备树dts配置节点如下所示:
&saradc {
status = "okay";
vref-supply = <&vcca_1v8>;
compatible = "rockchip,rk3568-saradc";
io-channels = <&saradc 4>; // x为通道编号,申请 SARADC 通道0 则 x 为 0
};
三、SARADC驱动说明
官方SDK SARADC驱动文件路径在/rk356x_linux_220118/kernel/drivers/iio/adc/rockchip_saradc.c文件中,驱动文件所用到的接口主要有如下几个:
1. 获取 AD 通道
struct iio_channel *chan; #定义 IIO 通道结构体 chan = iio_channel_get(&pdev->dev, NULL); #获取 IIO 通道结构体
注意: iio_channel_get
通过 probe 函数传进来的参数 pdev 获取 IIO 通道结构体,probe 函数如下:
static int XXX_probe(struct platform_device *pdev);
2. 读取 AD 采集到的原始数据
int val,ret; ret = iio_read_channel_raw(chan, &val);
调用 iio_read_channel_raw 函数读取 AD 采集的原始数据并存入 val 中。
3. 计算采集到的电压
使用标准电压将 AD 转换的值转换为用户所需要的电压值。其计算公式如下:
Vref / (2^n-1) = Vresult / raw
注意:
-
Vref 为标准电压
-
n 为 AD 转换的位数
-
Vresult 为用户所需要的采集电压
-
raw 为 AD 采集的原始数据
例如,标准电压为 1.8V,AD 采集位数为 10 位,AD 采集到的原始数据为 568,则:
Vresult = (1800mv * 568) / 1023;
4. 接口说明
struct iio_channel *iio_channel_get(struct device *dev, const char *consumer_channel);
-
功能:获取 iio 通道描述
-
参数:
-
dev: 使用该通道的设备描述指针
-
consumer_channel: 该设备所使用的 IIO 通道描述指针
-
void iio_channel_release(struct iio_channel *chan);
-
功能:释放 iio_channel_get 函数获取到的通道
-
参数:
-
chan:要被释放的通道描述指针
-
int iio_read_channel_raw(struct iio_channel *chan, int *val);
-
功能:读取 chan 通道 AD 采集的原始数据。
-
参数:
-
chan:要读取的采集通道指针
-
val:存放读取结果的指针
-
三、调试使用说明
在文件系统中使用cat /sys/bus/iio/devices/iio:device0/in_voltage4_raw命令可以直接查看该通道所采集到的电压值:
当前电压值为V=(1800mv * 1015) / 1024=1784mv。
总结
以上就是在RK3568平台上使用内部ADC的调试方法。