yanghn2002

View My GitHub Profile

我这次需要在 ARM 上适配 ADS1015 和 TMP117 温度传感器,这两颗芯片在 Linux 都归 IIO 子系统管, IIO 子系统主要就是各种 ADC 、 DAC。

首先需要配置 DTS (所有 ADDR 引脚全部接 GND):

&twi_ {
    ads1015@48 {
        compatible = "ti,ads1015";
        reg = <0x48>;
        status = "okay";
    };
};
&twi_{
    tmp117@48 {
        compatible = "ti,tmp117";
        reg = <0x48>;
        status = "okay";
    };
};

compatible 参数在驱动程序的 MODULE_DEVICE_TABLE 处定义

static const struct of_device_id ads1015_of_match[] = {
	{
		.compatible = "ti,ads1015",
		.data = (void *)ADS1015
	},
	{
		.compatible = "ti,ads1115",
		.data = (void *)ADS1115
	},
	{}
};
MODULE_DEVICE_TABLE(of, ads1015_of_match);

sysfs

驱动程序会将设备挂载到 /sys/bus/iio/devices/iio:device_ ,每一个设备有一个 ID ( iio:device_ ),设备目录下会有 iio:device_/name ,可以 cat 看到设备名:

cat /sys/bus/iio/devices/iio:device0/name
cat /sys/bus/iio/devices/iio:device1/name

设备目录下还会分配通道( channel ),以 ADS1015 为例:

in_voltage0-voltage1_raw
in_voltage0-voltage1_sampling_frequency
in_voltage0-voltage1_scale
in_voltage0-voltage3_raw
in_voltage0-voltage3_sampling_frequency
in_voltage0-voltage3_scale
in_voltage0_raw
in_voltage0_sampling_frequency
in_voltage0_scale
in_voltage1-voltage3_raw
in_voltage1-voltage3_sampling_frequency
in_voltage1-voltage3_scale
in_voltage1_raw
in_voltage1_sampling_frequency
in_voltage1_scale
in_voltage2-voltage3_raw
in_voltage2-voltage3_sampling_frequency
in_voltage2-voltage3_scale
in_voltage2_raw
in_voltage2_sampling_frequency
in_voltage2_scale
in_voltage3_raw
in_voltage3_sampling_frequency
in_voltage3_scale

对应驱动程序中的

enum ads1015_channels {
	ADS1015_AIN0_AIN1 = 0,
	ADS1015_AIN0_AIN3,
	ADS1015_AIN1_AIN3,
	ADS1015_AIN2_AIN3,
	ADS1015_AIN0,
	ADS1015_AIN1,
	ADS1015_AIN2,
	ADS1015_AIN3,
	ADS1015_TIMESTAMP,
};
static const unsigned int ads1015_data_rate[] = {
	128, 250, 490, 920, 1600, 2400, 3300, 3300
};
static int ads1015_fullscale_range[] = {
	6144, 4096, 2048, 1024, 512, 256, 256, 256
};