Павел Курочкин General R&D, 2017
lm-sensors в embedded
От схемотехники до управления в linux
LM -- Linux Monitoring
Павел Курочкин General R&D, 2017
О чём пойдёт речь?
● Какую проблему решаем
● Схема, архитектура
● Чип сенсора в device-tree
● Детектим чип сенсора в linux
● hwmon userspace-интерфейс
● Конфигурируем sensors
● Конфигурируем управление вентиляторами
● Демо на живом устройстве
2
Павел Курочкин General R&D, 2017
Какую задачу решаем?
● Мониторинг напряжений на плате (3.3 В, 2.5 В, 5 В)
● Мониторинг напряжений БП (12 В)
● Мониторинг температуры (процессор, БП, среднее)
● Автоматическое управление вентиляторами
Нужен контроль подсистемы из linux!
3
Павел Курочкин General R&D, 2017
Блок-схема устройства
4
Павел Курочкин General R&D, 2017
Компоненты схемы
● adt7463 -- аналог National lm85
● ads7830 -- многоканальный АЦП
● Температурные сенсоры: 2N3906 и NTC-термистор
● AC/DC -- адаптер ~220V в 12V
● Power supply -- источники питания
5
Павел Курочкин General R&D, 2017
adt7463
Схемотехника:
● Мониторинг напряжений и температуры
● Автономное управление вентиляторами
● https://www.onsemi.com/pub/Collateral/ADT7463-D.PDF
Linux:
● https://www.kernel.org/doc/Documentation/hwmon/lm85
● modprobe lm85
6
Павел Курочкин General R&D, 2017
ads7830
Схемотехника:
● Мониторинг напряжений
● 8-ми канальный АЦП (8 бит)
● http://www.ti.com/lit/ds/symlink/ads7830.pdf
Linux:
● modprobe ads7828
● https://www.kernel.org/doc/Documentation/hwmon/ads7828
7
Павел Курочкин General R&D, 2017
Загрузка Linux на SoC
1. Первичный загрузчик (preloader)
2. Вторичный загрузчик (u-boot)
3. Linux kernel
4. init/systemd
Нужен корректный device-tree
8
Павел Курочкин General R&D, 2017
Добавляем чипы в device-tree
lm85@2d {
compatible = "national,adt7463";
reg = <0x2d>;
status = "okay";
};
adc@48 {
compatible = "at,ads7830";
reg = <0x48>;
status = "okay";
};
Поддерживается модулем ads7828.ko
~$ /sbin/modinfo ads7828 | grep ads7830
alias: i2c:ads7830
Поддерживается модулем lm85.ko
~$ /sbin/modinfo lm85 | grep adt7463
alias: i2c:adt7463
9
Павел Курочкин General R&D, 2017
Инструменты для i2c
● apt-get install i2c-tools
● Чтение-запись регистров: i2cget, i2cset
● Сканирование шины: i2cdetect, i2cdump
10
Павел Курочкин General R&D, 2017
Дебажим i2c
# i2cdetect -r 0
...
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: -- -- -- -- -- -- -- -- -- 0c -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- UU -- -- -- -- -- 2d 2e --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- 48 -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- UU -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- UU -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --
используется драйвером
не используется
драйвером
11
Павел Курочкин General R&D, 2017
Загружаем модули
# modprobe lm85
# modprobe ads7828
# i2cdetect -r 0
...
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: -- -- -- -- -- -- -- -- -- 0c -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- UU -- -- -- -- -- UU UU --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- UU -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- UU -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- UU -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --
12
Павел Курочкин General R&D, 2017
hwmon
● Documentation/hwmon
/sys/class/hwmon
Documentation/hwmon/sysfs-interface
13
Павел Курочкин General R&D, 2017
hwmon sysfs interface
● Напряжение
● Ток
● Мощность
● Температура
● Вторжение
● Обороты вентиляторов
● PWM
● Можно использовать без sensors
● Documentation/hwmon/sysfs-interface
Наш случай
14
Павел Курочкин General R&D, 2017
adt7463 sysfs contents
# ls /sys/class/hwmon/hwmon1/
alarms in0_max in4_min pwm3_auto_pwm_minctl temp2_auto_temp_off
cpu0_vid in0_min name pwm3_enable temp2_input
device in1_alarm pwm1 pwm3_freq temp2_max
fan1_alarm in1_input pwm1_auto_channels subsystem temp2_min
fan1_input in1_max pwm1_auto_pwm_min temp1_alarm temp3_alarm
fan1_min in1_min pwm1_auto_pwm_minctl temp1_auto_temp_crit temp3_auto_temp_crit
fan2_alarm in2_alarm pwm1_enable temp1_auto_temp_max temp3_auto_temp_max
fan2_input in2_input pwm1_freq temp1_auto_temp_min temp3_auto_temp_min
fan2_min in2_max pwm2 temp1_auto_temp_off temp3_auto_temp_off
fan3_alarm in2_min pwm2_auto_channels temp1_fault temp3_fault
fan3_input in3_alarm pwm2_auto_pwm_min temp1_input temp3_input
fan3_min in3_input pwm2_auto_pwm_minctl temp1_max temp3_max
fan4_alarm in3_max pwm2_enable temp1_min temp3_min
fan4_input in3_min pwm2_freq temp2_alarm uevent
fan4_min in4_alarm pwm3 temp2_auto_temp_crit vrm
in0_alarm in4_input pwm3_auto_channels temp2_auto_temp_max
in0_input in4_max pwm3_auto_pwm_min temp2_auto_temp_min
15
Павел Курочкин General R&D, 2017
ads7830 sysfs interface
# ls /sys/class/hwmon/hwmon2/
device in1_input in3_input in5_input in7_input subsystem
in0_input in2_input in4_input in6_input name uevent
16
Павел Курочкин General R&D, 2017
Checkpoint 1
Имеем:
● Возможность настраивать и измерять
● Полный доступ к чипам по i2c
Ещё нужно:
● Дать мнемонические названия
● Конвертировать попугаев в Вольты и градусы
● Настроить пределы
● Настроить автоматическое управление вентиляторами
17
Павел Курочкин General R&D, 2017
sensors без конфига
# sensors
adt7463-i2c-0-2d
Adapter: Synopsys DesignWare I2C adapter
in0: +0.00 V (min = +0.00 V, max = +3.32 V) ALARM
in1: +0.01 V (min = +0.00 V, max = +2.99 V) ALARM
in2: +3.30 V (min = +2.97 V, max = +3.63 V)
in3: +0.00 V (min = +4.50 V, max = +5.50 V) ALARM
in4: +0.00 V (min = +0.00 V, max = +15.94 V) ALARM
fan1: 15000 RPM (min = 0 RPM)
fan2: 15000 RPM (min = 0 RPM)
fan3: 0 RPM (min = 0 RPM)
fan4: 15000 RPM (min = 0 RPM)
temp1: +32.0 C (low = +5.0 C, high = +50.0 C)
temp2: +34.5 C (low = +5.0 C, high = +50.0 C)
temp3: +63.0 C (low = +5.0 C, high = +85.0 C)
cpu0_vid: +0.000 V
18
Павел Курочкин General R&D, 2017
Конфигурируем sensors
● Каталог для конфигов /etc/sensors.d/
● Можно:
○ Назначить alias
○ Настроить min/max
○ Математические операции
○ Игнорировать поля
● ‘sensors -s’ применяет настройки
19
Павел Курочкин General R&D, 2017
sensors c конфигурацией
# sensors
adt7463-i2c-0-2d
Adapter: Synopsys DesignWare I2C adapter
3.3V: +3.30 V (min = +2.97 V, max = +3.63 V)
PSB1FAN: 15000 RPM (min = 0 RPM)
PSB0FAN: 15000 RPM (min = 0 RPM)
CHTEMP: +32.0 C (low = +5.0 C, high = +50.0 C)
INTTEMP: +34.5 C (low = +5.0 C, high = +50.0 C)
SOMTEMP: +62.0 C (low = +5.0 C, high = +85.0 C)
ads7830-i2c-0-48
Adapter: Synopsys DesignWare I2C adapter
PSB0TEMP: -1.87 V
PSB1TEMP: +39.69 V
3V3: +3.32 V
5V: +4.98 V
PSB0VIN: +5.74 V
PSB1VIN: +12.19 V
SYS12V: +12.07 V
20
Павел Курочкин General R&D, 2017
А кто будет управлять вентиляторами?
# export DEVPATH=/sys/class/hwmon/hwmon1
# echo 1 > $DEVPATH/pwm1_auto_channels
# echo 0 > $DEVPATH/pwm1_auto_pwm_min
# echo 20000 > $DEVPATH/temp1_auto_temp_min
# echo 19000 > $DEVPATH/temp1_auto_temp_off
# echo 35000 > $DEVPATH/temp1_auto_temp_max
pwm1 работает от первого канала
измерения температуры
При низкой температуре вентиляторы
не крутятся
Настраиваем границы
температурного диапазона
21
Павел Курочкин General R&D, 2017
Нюансы (грабли)
● При двухпроводном подключении вентиляторов PID-регулятор работать
не будет
● Требуется ручная настройка (i2cget/i2cset)
● Точность измерения низкая
22
Павел Курочкин General R&D, 2017
Итого
● Выбираем чип
● Находим его в Documentation/hwmon
● Прописываем в device-tree
● Находим на шине i2c
● Загружаем модуль
● Конфигурируем sensors
● Настраиваем через sysfs управление вентиляторами
23
Павел Курочкин General R&D, 2017
Ссылки
● https://www.kernel.org/doc/Documentation/hwmon/
● https://www.onsemi.com/pub/Collateral/ADT7463-D.PDF
● http://www.ti.com/lit/ds/symlink/ads7830.pdf
24

lm-sensors in embedded systems: from schematics to management from linux

  • 1.
    Павел Курочкин GeneralR&D, 2017 lm-sensors в embedded От схемотехники до управления в linux LM -- Linux Monitoring
  • 2.
    Павел Курочкин GeneralR&D, 2017 О чём пойдёт речь? ● Какую проблему решаем ● Схема, архитектура ● Чип сенсора в device-tree ● Детектим чип сенсора в linux ● hwmon userspace-интерфейс ● Конфигурируем sensors ● Конфигурируем управление вентиляторами ● Демо на живом устройстве 2
  • 3.
    Павел Курочкин GeneralR&D, 2017 Какую задачу решаем? ● Мониторинг напряжений на плате (3.3 В, 2.5 В, 5 В) ● Мониторинг напряжений БП (12 В) ● Мониторинг температуры (процессор, БП, среднее) ● Автоматическое управление вентиляторами Нужен контроль подсистемы из linux! 3
  • 4.
    Павел Курочкин GeneralR&D, 2017 Блок-схема устройства 4
  • 5.
    Павел Курочкин GeneralR&D, 2017 Компоненты схемы ● adt7463 -- аналог National lm85 ● ads7830 -- многоканальный АЦП ● Температурные сенсоры: 2N3906 и NTC-термистор ● AC/DC -- адаптер ~220V в 12V ● Power supply -- источники питания 5
  • 6.
    Павел Курочкин GeneralR&D, 2017 adt7463 Схемотехника: ● Мониторинг напряжений и температуры ● Автономное управление вентиляторами ● https://www.onsemi.com/pub/Collateral/ADT7463-D.PDF Linux: ● https://www.kernel.org/doc/Documentation/hwmon/lm85 ● modprobe lm85 6
  • 7.
    Павел Курочкин GeneralR&D, 2017 ads7830 Схемотехника: ● Мониторинг напряжений ● 8-ми канальный АЦП (8 бит) ● http://www.ti.com/lit/ds/symlink/ads7830.pdf Linux: ● modprobe ads7828 ● https://www.kernel.org/doc/Documentation/hwmon/ads7828 7
  • 8.
    Павел Курочкин GeneralR&D, 2017 Загрузка Linux на SoC 1. Первичный загрузчик (preloader) 2. Вторичный загрузчик (u-boot) 3. Linux kernel 4. init/systemd Нужен корректный device-tree 8
  • 9.
    Павел Курочкин GeneralR&D, 2017 Добавляем чипы в device-tree lm85@2d { compatible = "national,adt7463"; reg = <0x2d>; status = "okay"; }; adc@48 { compatible = "at,ads7830"; reg = <0x48>; status = "okay"; }; Поддерживается модулем ads7828.ko ~$ /sbin/modinfo ads7828 | grep ads7830 alias: i2c:ads7830 Поддерживается модулем lm85.ko ~$ /sbin/modinfo lm85 | grep adt7463 alias: i2c:adt7463 9
  • 10.
    Павел Курочкин GeneralR&D, 2017 Инструменты для i2c ● apt-get install i2c-tools ● Чтение-запись регистров: i2cget, i2cset ● Сканирование шины: i2cdetect, i2cdump 10
  • 11.
    Павел Курочкин GeneralR&D, 2017 Дебажим i2c # i2cdetect -r 0 ... 0 1 2 3 4 5 6 7 8 9 a b c d e f 00: -- -- -- -- -- -- -- -- -- 0c -- -- -- 10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 20: -- -- -- -- -- -- -- UU -- -- -- -- -- 2d 2e -- 30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 40: -- -- -- -- -- -- -- -- 48 -- -- -- -- -- -- -- 50: -- -- -- -- -- -- -- UU -- -- -- -- -- -- -- -- 60: -- -- -- -- -- -- -- -- UU -- -- -- -- -- -- -- 70: -- -- -- -- -- -- -- -- используется драйвером не используется драйвером 11
  • 12.
    Павел Курочкин GeneralR&D, 2017 Загружаем модули # modprobe lm85 # modprobe ads7828 # i2cdetect -r 0 ... 0 1 2 3 4 5 6 7 8 9 a b c d e f 00: -- -- -- -- -- -- -- -- -- 0c -- -- -- 10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 20: -- -- -- -- -- -- -- UU -- -- -- -- -- UU UU -- 30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 40: -- -- -- -- -- -- -- -- UU -- -- -- -- -- -- -- 50: -- -- -- -- -- -- -- UU -- -- -- -- -- -- -- -- 60: -- -- -- -- -- -- -- -- UU -- -- -- -- -- -- -- 70: -- -- -- -- -- -- -- -- 12
  • 13.
    Павел Курочкин GeneralR&D, 2017 hwmon ● Documentation/hwmon /sys/class/hwmon Documentation/hwmon/sysfs-interface 13
  • 14.
    Павел Курочкин GeneralR&D, 2017 hwmon sysfs interface ● Напряжение ● Ток ● Мощность ● Температура ● Вторжение ● Обороты вентиляторов ● PWM ● Можно использовать без sensors ● Documentation/hwmon/sysfs-interface Наш случай 14
  • 15.
    Павел Курочкин GeneralR&D, 2017 adt7463 sysfs contents # ls /sys/class/hwmon/hwmon1/ alarms in0_max in4_min pwm3_auto_pwm_minctl temp2_auto_temp_off cpu0_vid in0_min name pwm3_enable temp2_input device in1_alarm pwm1 pwm3_freq temp2_max fan1_alarm in1_input pwm1_auto_channels subsystem temp2_min fan1_input in1_max pwm1_auto_pwm_min temp1_alarm temp3_alarm fan1_min in1_min pwm1_auto_pwm_minctl temp1_auto_temp_crit temp3_auto_temp_crit fan2_alarm in2_alarm pwm1_enable temp1_auto_temp_max temp3_auto_temp_max fan2_input in2_input pwm1_freq temp1_auto_temp_min temp3_auto_temp_min fan2_min in2_max pwm2 temp1_auto_temp_off temp3_auto_temp_off fan3_alarm in2_min pwm2_auto_channels temp1_fault temp3_fault fan3_input in3_alarm pwm2_auto_pwm_min temp1_input temp3_input fan3_min in3_input pwm2_auto_pwm_minctl temp1_max temp3_max fan4_alarm in3_max pwm2_enable temp1_min temp3_min fan4_input in3_min pwm2_freq temp2_alarm uevent fan4_min in4_alarm pwm3 temp2_auto_temp_crit vrm in0_alarm in4_input pwm3_auto_channels temp2_auto_temp_max in0_input in4_max pwm3_auto_pwm_min temp2_auto_temp_min 15
  • 16.
    Павел Курочкин GeneralR&D, 2017 ads7830 sysfs interface # ls /sys/class/hwmon/hwmon2/ device in1_input in3_input in5_input in7_input subsystem in0_input in2_input in4_input in6_input name uevent 16
  • 17.
    Павел Курочкин GeneralR&D, 2017 Checkpoint 1 Имеем: ● Возможность настраивать и измерять ● Полный доступ к чипам по i2c Ещё нужно: ● Дать мнемонические названия ● Конвертировать попугаев в Вольты и градусы ● Настроить пределы ● Настроить автоматическое управление вентиляторами 17
  • 18.
    Павел Курочкин GeneralR&D, 2017 sensors без конфига # sensors adt7463-i2c-0-2d Adapter: Synopsys DesignWare I2C adapter in0: +0.00 V (min = +0.00 V, max = +3.32 V) ALARM in1: +0.01 V (min = +0.00 V, max = +2.99 V) ALARM in2: +3.30 V (min = +2.97 V, max = +3.63 V) in3: +0.00 V (min = +4.50 V, max = +5.50 V) ALARM in4: +0.00 V (min = +0.00 V, max = +15.94 V) ALARM fan1: 15000 RPM (min = 0 RPM) fan2: 15000 RPM (min = 0 RPM) fan3: 0 RPM (min = 0 RPM) fan4: 15000 RPM (min = 0 RPM) temp1: +32.0 C (low = +5.0 C, high = +50.0 C) temp2: +34.5 C (low = +5.0 C, high = +50.0 C) temp3: +63.0 C (low = +5.0 C, high = +85.0 C) cpu0_vid: +0.000 V 18
  • 19.
    Павел Курочкин GeneralR&D, 2017 Конфигурируем sensors ● Каталог для конфигов /etc/sensors.d/ ● Можно: ○ Назначить alias ○ Настроить min/max ○ Математические операции ○ Игнорировать поля ● ‘sensors -s’ применяет настройки 19
  • 20.
    Павел Курочкин GeneralR&D, 2017 sensors c конфигурацией # sensors adt7463-i2c-0-2d Adapter: Synopsys DesignWare I2C adapter 3.3V: +3.30 V (min = +2.97 V, max = +3.63 V) PSB1FAN: 15000 RPM (min = 0 RPM) PSB0FAN: 15000 RPM (min = 0 RPM) CHTEMP: +32.0 C (low = +5.0 C, high = +50.0 C) INTTEMP: +34.5 C (low = +5.0 C, high = +50.0 C) SOMTEMP: +62.0 C (low = +5.0 C, high = +85.0 C) ads7830-i2c-0-48 Adapter: Synopsys DesignWare I2C adapter PSB0TEMP: -1.87 V PSB1TEMP: +39.69 V 3V3: +3.32 V 5V: +4.98 V PSB0VIN: +5.74 V PSB1VIN: +12.19 V SYS12V: +12.07 V 20
  • 21.
    Павел Курочкин GeneralR&D, 2017 А кто будет управлять вентиляторами? # export DEVPATH=/sys/class/hwmon/hwmon1 # echo 1 > $DEVPATH/pwm1_auto_channels # echo 0 > $DEVPATH/pwm1_auto_pwm_min # echo 20000 > $DEVPATH/temp1_auto_temp_min # echo 19000 > $DEVPATH/temp1_auto_temp_off # echo 35000 > $DEVPATH/temp1_auto_temp_max pwm1 работает от первого канала измерения температуры При низкой температуре вентиляторы не крутятся Настраиваем границы температурного диапазона 21
  • 22.
    Павел Курочкин GeneralR&D, 2017 Нюансы (грабли) ● При двухпроводном подключении вентиляторов PID-регулятор работать не будет ● Требуется ручная настройка (i2cget/i2cset) ● Точность измерения низкая 22
  • 23.
    Павел Курочкин GeneralR&D, 2017 Итого ● Выбираем чип ● Находим его в Documentation/hwmon ● Прописываем в device-tree ● Находим на шине i2c ● Загружаем модуль ● Конфигурируем sensors ● Настраиваем через sysfs управление вентиляторами 23
  • 24.
    Павел Курочкин GeneralR&D, 2017 Ссылки ● https://www.kernel.org/doc/Documentation/hwmon/ ● https://www.onsemi.com/pub/Collateral/ADT7463-D.PDF ● http://www.ti.com/lit/ds/symlink/ads7830.pdf 24