一.简介
模数转换器(analog to Digital Converter,简称ADC)是一种数据转换器,它通过将模拟信号编码为二进制代码,使数字电路能够与现实世界进行接口。
二.ADC硬件原理图
这里我们使用的是VIN3通道读取ADC的值。
三.修改设备树
SAR-ADC 的 DTS 节点在 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中描述:
tshhwctrl:tshhwctrl {
compatible = "tsh,tshhwctrl";
pinctrl-names = "default";
pinctrl-0 = <&tshw_pin_en>;
io-channels = <&saradc 3>;//通道三
status = "okay";
};
四.在probe 中对 DTS 所添加的资源进行解析
static int tshhwctl_probe(struct platform_device *pdev)
{
int status; //函数返回值
int ret;
chan = iio_channel_get(&(pdev->dev), NULL);
if (IS_ERR(chan))
{
chan = NULL;
printk("%s() have not set adc chan\n", __FUNCTION__);
return -1;
}
ret = iio_read_channel_raw(chan, &raw);
printk("iio_read_channel_raw gvol gvol gvol:%d\n",raw);
if (ret < 0) {
printk("read hook adc channel() error: %d\n", ret);
return -1;
}
return 0;
}
五.驱动说明
获取 AD 通道:
struct iio_channel *chan; #定义 IIO 通道结构体
chan = iio_channel_get(&pdev->dev, NULL); #获取 IIO 通道结构体
读取 AD 采集到的原始数据:
int val,ret;
ret = iio_read_channel_raw(chan, &val);
调用 iio_read_channel_raw 函数读取 AD 采集的原始数据并存入 val 中。
六.获取所有 ADC 值
有个便捷的方法可以查询到每个 SARADC 的值:
cat /sys/bus/iio/devices/iio\:device0/in_voltage*_raw