Данная статья применима к:
- Astra Linux Special Edition РУСБ.10015-01 (очередное обновление 1.8)
- Astra Linux Special Edition РУСБ.10015-01 (очередное обновление 1.7), РУСБ.10015-10
- Astra Linux Special Edition РУСБ.10015-17
- Astra Linux Special Edition РУСБ.10015-37 (очередное обновление 7.7)
- Astra Linux Special Edition РУСБ.10015-03 (очередное обновление 7.6)
- Astra Linux Special Edition РУСБ.10015-01 (очередное обновление 1.6)
- Astra Linux Special Edition РУСБ.10015-16 исп. 1
- Astra Linux Common Edition 2.12
Общие сведения
В данной статье приведено описание настройки акселерометра устройства, необходимой для корректной работы автоматической ориентации экрана.
Для настройки акселерометра требуется создать правило udev
, определяющее соответствие данных, получаемых от акселерометра, и осей координат устройства. Это соответствие может быть представлено в виде матрицы размером 3х3, содержащей коэффициенты коррекции для данных, получаемых от акселерометра.
За взаимодействие с датчиком поворота отвечает IIO-подсистема ядра Linux, в частности — утилита iio-sensor-proxy
(см. https://gitlab.freedesktop.org/hadess/iio-sensor-proxy/#iio-sensor-proxy).
Матрица, используемая для калибровки экрана (подробное описание см. https://gitlab.freedesktop.org/hadess/iio-sensor-proxy/#accelerometer-orientation), представлена в виде таблицы. Синим отмечены заголовки строк и столбцов, относительно которых в дальнейшем будет производится калибровка. Красным отмечены значения, которые не нужно редактировать,так как они не участвуют в калибровке.
x | y | z | |
(1) | x1 | y1 | z1 |
(2) | x2 | y2 | z2 |
(3) | x3 | y3 | z3 |
ENV{IIO_SENSOR_PROXY_TYPE}=="*accel*", ENV{ACCEL_MOUNT_MATRIX}="x1,y1,z1;x2,y2,z2;x3,y3,z3"
По умолчанию iio-sensor-proxy
использует единичную матрицу.
x | y | z | |
(1) | 1 | 0 | 0 |
(2) | 0 | 1 | 0 |
(3) | 0 | 0 | 1 |
Матрица интерпретируется в виде правила udev
следующим образом:
ENV{IIO_SENSOR_PROXY_TYPE}=="*accel*", ENV{ACCEL_MOUNT_MATRIX}="1,0,0;0,1,0;0,0,1"
Калибровка экрана подразумевает изменение значений данной матрицы.
Проверка наличия целевой матрицы
Целевая матрица используется для калибровки датчика поворота. По умолчанию она должна находится в описании устройств из ACPI (Advanced Configuration and Power Interface, см. https://ru.wikipedia.org/wiki/ACPI).
Для проверки наличия целевой матрицы устройства необходимо получить выгрузку DSL (описание устройств из ACPI), выполнив следующие команды:
cat /sys/firmware/acpi/tables/DSDT > dsdt.dat iasl -d dsdt.dat
iasl
- Intel ACPI компилятор/декомпилятор, используется для работы с ACPI и не только (см. https://linux.die.net/man/1/iasl). Команда
iasl -d dsdt.dat
дизассемблирует dsdt.dat
в dsdt.dsl
(формат ASL). ASL - ACPI Source Language, исходный язык для определения и написания методов ACPI (см. https://wiki.osdev.org/AML).
В полученном файле (dsdt.dsl
) необходимо найти матрицу по умолчанию:
- если известны
DEVICE_ID
/VENDOR_ID
, найти по нему запись о данном устройстве; - в записи об устройстве найти метод ROTM (Rotation Matrix).
В случае если целевая матрица не была обнаружена, необходимо выполнить калибровку с помощью правила udev
(см. Калибровка при помощи правила udev).
Пример метода ROTM для планшета Lenovo IdeaPad 3IGL5-LTE:
Method (ROTM, 0, NotSerialized) { Name (RBUF, Package (0x03) { "0 -1 0", "1 0 0", "0 0 1" }) Return (RBUF) /* \_SB_.PCI0.I2C5.DEV_.ROTM.RBUF */ }
Целевая матрица для данной модели имеет следующий вид.
x | y | z | |
(1) | 0 | -1 | 0 |
(2) | 1 | 0 | 0 |
(3) | 0 | 0 | 1 |
ENV{IIO_SENSOR_PROXY_TYPE}=="*accel*", ENV{ACCEL_MOUNT_MATRIX}="0,-1,0;1,0,0;0,0,1"
В случае если полученная матрица некорректно откалибровала устройство, необходимо выполнить калибровку с помощью правила udev
(см. Калибровка при помощи правила udev).
Калибровка при помощи правила udev
Порядок калибровки
В случае если целевая матрица отсутствует или если при её применении калибровка сенсора выполняется некорректно, для калибровки датчика необходимо:
- определить нормальное положение устройства (портретная или альбомная ориентация). Нормальное положение зависит от нужд пользователя. За нормальное можно принять любое положение и отталкиваясь от этого проводить настройку. Можно также в качестве нормальной использовать ориентацию, в которой отображается экран при включении устройства (например, для планшетов iRU это альбомный режим);
- задать начальную матрицу в виде правила
udev
(см. Применение единичной матрицы); - если режим отображения экрана не соответствует положению устройства — определить, на сколько нужно осуществить поворот экрана для приведения его в правильное положение, и выполнить указанные далее изменения элементов матрицы для получения нужного режима отображения экрана (см. Приведение экрана в правильное положение).
Применение единичной матрицы
Необходимо задать начальную (единичную) матрицу в виде правила udev
, помещенного в файл /etc/udev/rules.d/99-astra-orientation.rules
(все дальнейшие действия по калибровке экрана подразумевают редактирование этого файла):
x | y | z | |
(1) | 1 | 0 | 0 |
(2) | 0 | 1 | 0 |
(3) | 0 | 0 | 1 |
ENV{IIO_SENSOR_PROXY_TYPE}=="*accel*", ENV{ACCEL_MOUNT_MATRIX}="1,0,0;0,1,0;0,0,1"
Для применения правил необходимо перезагрузить устройство.
После того, как была задана начальная матрица, необходимо определить, на сколько градусов нужно осуществить поворот экрана для приведения его в правильное положение (см. Приведение экрана в правильное положение).
Приведенное описание поворота экрана применимо только к начальной (единичной) матрице.
Приведение экрана в правильное положение
Поворот изображения на 90° по часовой стрелке
Начальная матрица имеет следующий вид.
x | y | z | |
(1) | 1 | 0 | 0 |
(2) | 0 | 1 | 0 |
(3) | 0 | 0 | 1 |
ENV{IIO_SENSOR_PROXY_TYPE}=="*accel*", ENV{ACCEL_MOUNT_MATRIX}="1,0,0;0,1,0;0,0,1"
Необходимые для поворота вычисления имеют следующий вид.
x | y | z | |
(1) | cos (90) | -1 * sin (90) | 0 |
(2) | sin (90) | cos (90) | 0 |
(3) | 0 | 0 | 1 |
Результирующая матрица имеет следующий вид.
x | y | z | |
(1) | 0 | -1 | 0 |
(2) | 1 | 0 | 0 |
(3) | 0 | 0 | 1 |
ENV{IIO_SENSOR_PROXY_TYPE}=="*accel*", ENV{ACCEL_MOUNT_MATRIX}="0,-1,0;1,0,0;0,0,1"
Поворот изображения на 180° по часовой стрелке
Начальная матрица имеет следующий вид.
x | y | z | |
(1) | 1 | 0 | 0 |
(2) | 0 | 1 | 0 |
(3) | 0 | 0 | 1 |
ENV{IIO_SENSOR_PROXY_TYPE}=="*accel*", ENV{ACCEL_MOUNT_MATRIX}="1,0,0;0,1,0;0,0,1"
Необходимые для поворота вычисления имеют следующий вид.
x | y | z | |
(1) | cos (180) | -1 * sin (180) | 0 |
(2) | sin (180) | cos (180) | 0 |
(3) | 0 | 0 | 1 |
Результирующая матрица имеет следующий вид.
x | y | z | |
(1) | -1 | 0 | 0 |
(2) | 0 | -1 | 0 |
(3) | 0 | 0 | 1 |
ENV{IIO_SENSOR_PROXY_TYPE}=="*accel*", ENV{ACCEL_MOUNT_MATRIX}="-1,0,0;0,-1,0;0,0,1"
Поворот изображения на 270° по часовой стрелке
Начальная матрица имеет следующий вид.
x | y | z | |
(1) | 1 | 0 | 0 |
(2) | 0 | 1 | 0 |
(3) | 0 | 0 | 1 |
ENV{IIO_SENSOR_PROXY_TYPE}=="*accel*", ENV{ACCEL_MOUNT_MATRIX}="1,0,0;0,1,0;0,0,1"
Необходимые для поворота вычисления имеют следующий вид.
x | y | z | |
(1) | cos (270) | -1 * sin (270) | 0 |
(2) | sin (270) | cos (270) | 0 |
(3) | 0 | 0 | 1 |
Результирующая матрица имеет следующий вид.
x | y | z | |
(1) | 0 | 1 | 0 |
(2) | -1 | 0 | 0 |
(3) | 0 | 0 | 1 |
ENV{IIO_SENSOR_PROXY_TYPE}=="*accel*", ENV{ACCEL_MOUNT_MATRIX}="0,1,0;-1,0,0;0,0,1"
Определение необходимости инвертирования
Если после определения нормального положения устройства (см. Приведение экрана в правильное положение) получилась инверсия какого-либо из режимов просмотра (инвертированный альбомный/портретный режим), необходимо произвести инверсию относительно Y-координат (см. Инвертирование Y-координат).
В случае если после применения инверсии относительно Y-координат не был достигнут желаемый результат, необходимо вернуть матрицу к состоянию, полученному в Приведение экрана в правильное положение, и произвести инверсию относительно X-координат (см. Инвертирование X-координат).
Инвертирование Y-координат
Для инверсии в качестве исходной матрицы необходимо брать матрицу, полученную после поворота (см. Приведение экрана в правильное положение).
x | y | z | |
(1) | x1 | y1 | z1 |
(2) | x2 | y2 | z2 |
(3) | x3 | y3 | z3 |
Для выполнения инверсии необходимо каждую Y-координату (из тех, которые участвуют в калибровке) умножить на -1:
- y1 * -1;
- y2 * -1.
Таким образом, результирующая матрица будет иметь следующий вид.
x | y | z | |
(1) | x1 | y1 = -1 * y1 | z1 |
(2) | x2 | y2 = -1 * y2 | z2 |
(3) | x3 | y3 | z3 |
ENV{IIO_SENSOR_PROXY_TYPE}=="*accel*", ENV{ACCEL_MOUNT_MATRIX}="x1,-y1,z1;x2,-y2,z2;x3,y3,z3"
Инвертирование X-координат
Для инверсии в качестве исходной матрицы необходимо брать матрицу, полученную после поворота (см. Приведение экрана в правильное положение).
x | y | z | |
(1) | x1 | y1 | z1 |
(2) | x2 | y2 | z2 |
(3) | x3 | y3 | z3 |
Для выполнения инверсии необходимо каждую X-координату (из тех, которые участвуют в калибровке) умножить на -1:
- x1 * -1;
- x2 * -1.
Таким образом, результирующая матрица будет иметь следующий вид.
x | y | z | |
(1) | x1 = -1 * x1 | y1 | z1 |
(2) | x2 = -1 * x2 | y2 | z2 |
(3) | x3 | y3 | z3 |
ENV{IIO_SENSOR_PROXY_TYPE}=="*accel*", ENV{ACCEL_MOUNT_MATRIX}="-x1,y1,z1;-x2,y2,z2;x3,y3,z3"
Настройка частоты опроса датчика поворота на устройстве МИГ Т8х
Для снижения чувствительности (частоты опроса) датчика поворота на планшете МИГ Т8х необходимо:
- получить минимально возможное значение из файла
/sys/bus/iio/devices/iio:device0/in_accel_sampling_frequency_available
; - обновить значение на полученное минимальное путем редактирования файла
/sys/bus/iio/devices/iio:device0/in_accel_sampling_frequency
.
Недостаток данного подхода в том, что после перезагрузки датчик не запоминает измененное значение.
Для того чтобы система могла автоматически устанавливать минимальную частоту обновления датчика, необходимо:
- выполнить команды:
sudo mkdir /etc/mig sudo touch /etc/mig/mig-t8x-accel-sampling-freq-fix.sh
- в файл
/etc/mig/mig-t8x-accel-sampling-freq-fix.sh
вставить следующий текст:/etc/mig/mig-t8x-accel-sampling-freq-fix.shSET_FREQ_FILE="/sys/bus/iio/devices/iio:device0/in_accel_sampling_frequency" AV_FREQ_FILE="/sys/bus/iio/devices/iio:device0/in_accel_sampling_frequency_available" minFreq=`cat $AV_FREQ_FILE | cut -d' ' -f1` echo $minFreq > $SET_FREQ_FILE
- создать файл службы, выполнив команды:sudo mkdir /etc/mig
sudo touch /etc/mig/mig-t8x-accel-sampling-freq-fix.sh - в созданный файл вставить следующий текст:/etc/systemd/system/mig-t8x-accel-sampling-fix.service
[Unit] Description=Fix accel sampling frequency for MIG T8x [Service] Type=simple ExecStart=/bin/bash /etc/mig/mig-t8x-accel-sampling-freq-fix.sh [Install] WantedBy=multi-user.target
- после сохранения файла активировать службу командой:
sudo systemctl enable mig-t8x-accel-sampling-fix.service
После перезагрузки системы датчик будет автоматически настраиваться на минимальную частоту обновления.
Сценарий, автоматически выполняющий приведенные выше шаги, доступен по ссылке generate_mig-t8x-fix-accel-sampling-frequency.sh.