标准linux4.4--驱动开发(一)ADC驱动编写
简介
Firefly-RK3308开发板上的 AD 接口有两种
TS-ADC(Temperature Sensor):支持两通道,时钟频率必须低于800KHZ
SAR-ADC(Successive Approximation Register):支持六通道单端10位的SAR-ADC,时钟频率必须小于13MHZ。(常用)
内核采用工业 I/O 子系统来控制 ADC,该子系统主要为 AD 转换或者 DA 转换的传感器设计。 下面以 SAR-ADC 为例子,介绍 ADC 的基本配置方法。
DTS配置
SAR-ADC 的 DTS 节点在 kernel/arch/arm64/boot/dts/rockchip/rk3308.dtsi 文件中定义,如下所示:
saradc: saradc@ff1e0000 {
compatible = "rockchip,rk3308-saradc", "rockchip,rk3399-saradc";
reg = <0x0 0xff1e0000 0x0 0x100>;
interrupts = <GIC_SPI 37 IRQ_TYPE_LEVEL_HIGH>;
#io-channel-cells = <1>;
clocks = <&cru SCLK_SARADC>, <&cru PCLK_SARADC>;
clock-names = "saradc", "apb_pclk";
resets = <&cru SRST_SARADC_P>;
reset-names = "saradc-apb";
status = "disabled";
};
想要使用CPU上的ADC资源,必须要添加DTS配置及设备树,所以用户首先需在 DTS 文件中添加 ADC 的资源描述:
这里我举2个例子
(1)adc模拟的按键驱动(RK适配的)
(2)萤火虫firefly适配的adc使用demo
接下来看下他们分别的设备树如何描述
(1)adc模拟的按键(简单逻辑根据adc检测的电压的不同,转换成数字信号范围去检测按了哪个按键)
adc-keys {
compatible = "adc-keys";
io-channels = <&saradc 1>;//这里申请的是 SARADC 通道1。
io-channel-names = "buttons";
poll-interval = <100>;
keyup-threshold-microvolt = <1800000>;
esc-key {
linux,code = <KEY_MICMUTE>;
label = "micmute";
press-threshold-microvolt = <1130000>;
};
home-key {
linux,code = <KEY_MODE>;
label = "mode";
press-threshold-microvolt = <901000>;
};
menu-key {
linux,code = <KEY_PLAY>;
label = "play";
press-threshold-microvolt = <624000>;
};
vol-down-key {
linux,code = <KEY_VOLUMEDOWN>;
label = "volume down";
press-threshold-microvolt = <300000>;
};
vol-up-key {
linux,code = <KEY_VOLUMEUP>;
label = "volume up";
press-threshold-microvolt = <18000>;
};
};
(2)adc-demo
adc_demo: adc_demo{
status = "disabled";
compatible = "firefly,rk3399-adc";
io-channels = <&saradc 3>;//这里申请的是 SARADC 通道3。
};
在驱动文件中关联DTS的配置
用户