概述 RK3588内置的ADC设备有两种一种是温度传感器(Temperature Sensor),一种是逐次逼近传感器(Successive Approximation Register)。 TSADC支持7个通道,分别用于监控A76_0/1核,A76_2/3核,DSU,A55_0/1/2/3核,PD_CENTER,NPU,GPU的温度。在初始化后默认使能每个通道进行循环转换。如果在一段时间内温度过高则会产生中断信号,可以用于触发降温措施,如果一段时间内超过设定温度后,会发送一个TSHUT信号给CRU模块用于复位SOC或者使用GPIO复位PMIC,目前设备树中描述的是采用前者。 SARADC是一个8通道单端12位逐次逼近A/D转换器,在20MHz时钟下,最大转换率位1MSPS。输入范围通常是0v~1.8v。 驱动文件驱动文件在drivers/iio/adc/rockchip_saradc.c DTS节点配置DTS 配置参考文档为Documentation/devicetree/bindings/iio/adc/rockchip-saradc.txt 。 DTS节点所在文件kernel/arch/arm64/boot/dts/rockchip/rk3588.dtsi examples: - | #include <dt-bindings/clock/rk3288-cru.h> #include <dt-bindings/interrupt-controller/arm-gic.h> saradc: saradc@2006c000 { compatible = "rockchip,saradc"; reg = <0x2006c000 0x100>; interrupts = <GIC_SPI 26 IRQ_TYPE_LEVEL_HIGH>; clocks = <&cru SCLK_SARADC>, <&cru PCLK_SARADC>; clock-names = "saradc", "apb_pclk"; resets = <&cru SRST_SARADC>; reset-names = "saradc-apb"; vref-supply = <&vcc18>; #io-channel-cells = <1>; }; interrupts 表示当转换完成时产生的中断描述。 io-channel-cells这个属性在iio-bindings.txt文档中有描述,当设备可以有多个iio输出时,设为1。 vref-supply 表示saradc值对应的参考电压,需要根据具体的硬件环境设置,最大为1.8V,对应的saradc值为
1024,电压和adc值成线性关系。 SARADC使用Linux内核采用IIO子系统来控制SARADC,目前OK3588内核中默认配置了IIO子系统对SARADC的支持,与TSADC的情况相同,在初始化后八个通道会循环转换。 可以参考/drivers/input/keyboard/adc-keys.c 在驱动程序中使用iio_read_channel_raw() 获取ADC通道转换后的数据,不过在设备树中需要编写相关节点,并引用对应的IIO通道。 adc_keys: adc-keys { compatible = "adc-keys"; io-channels = <&saradc 1>; //作为消费者描述iio通道的生产者,占用的是通道1 io-channel-names = "buttons";//在驱动中获取iio通道的句柄 keyup-threshold-microvolt = <1800000>; poll-interval = <100>; ··· }
或者可以直接通过用户态接口获取ADC的值,其中*表示ADC第多少通道: cat /sys/bus/iio/devices/iio\:device0/in_voltage*_raw |