Сравнение версий

Ключ

  • Эта строка добавлена.
  • Эта строка удалена.
  • Изменено форматирование.

Оглавление

Информация
titleДанная статья применима к:
  • Astra Linux Special Edition РУСБ.10015-01 (очередное обновление 1.78)
  • Astra Linux Special Edition РУСБ.1015210015-02 01 (очередное обновление 41.7), РУСБ.10015-10
  • Astra Linux Special Edition РУСБ.10015-17
  • Astra Linux Special Edition РУСБ.10015-37 01 (очередное обновление 17.67)
  • Astra Linux Special Edition РУСБ.10015-16 исп. 1 и исп. 203 (очередное обновление 7.6)
  • Astra Linux Special Edition РУСБ.1026510015-01 (очередное обновление 81.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).Голубым , представлена в виде таблицы. Синим отмечены заголовки строк и столбцов, относительно которых в дальнейшем будет производится калибровка. Красным в таблице отмечены участкизначения, которыене нужно редактировать (,так как они не участвуют в калибровке).


xyz
(1)x1y1z1
(2)x2y2z2
(3)x3y3z3
Блок кода
languagebash
titleПример содержимого файла на основе таблицы
ENV{IIO_SENSOR_PROXY_TYPE}=="*accel*", 
ENV{ACCEL_MOUNT_MATRIX}="x1,y1,z1;x2,y2,z2;x3,y3,z3"
Значения интерпретируется в виде udev правила следующим образом:

По умолчанию , iio-sensor-proxy принимает такую ( использует единичную ) матрицу:.


xyz
(1)100
(2)010
(3)001

Матрица интерпретируется в виде правила udev следующим образом:

Блок кода
languagebash
title/etc/udev/rules.d/99-astra-orientation.rules
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), путем вызова следующих команд:выполнив следующие команды:

Получение DSL дампа устройства
Command
Блок кода
languagebash
title
cat /sys/firmware/acpi/tables/DSDT > dsdt.dat
iasl -d dsdt.dat
iasl -tc dsdt.dsl
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) необходимо найти матрицу по умолчанию:

Если
  • если известны
DEV
  • DEVICE_ID/
VEN
  • VENDOR_ID,
необходимо найти данное устройствоЗатем у устройства необходимо
  • найти по нему запись о данном устройстве;
  • в записи об устройстве найти методROTM (Rotation Matrix).

В случае если целевая матрица не была обнаружена, необходимо выполнить калибровку с помощью правила udev (см. Калибровка при помощи правила udev).

Пример метода ROTM Рассмотрим пример для планшета Lenovo IdeaPad 3IGL5-LTE:

Блок кода
languagecpp
titleПример ROTM матрицы
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 */
}

Отсюда мы видим, что исходная Целевая матрица для данной модели :имеет следующий вид.


xyz
(1)0-10
(2)100
(3)001
Блок кода
languagebash
title/etc/udev/rules.d/99-astra-orientation.rules
ENV{IIO_SENSOR_PROXY_TYPE}=="*accel*", 
ENV{ACCEL_MOUNT_MATRIX}="0,-1,0;1,0,0;0,0,1"

В случае если полученная матрица некорректно откалибровала устройство, необходимо произвести калибровку по алгоритму, приведенному ниже (п.3).

Настройка акселерометра: калибровка при помощи udev правила

выполнить калибровку с помощью правила udev (см. Калибровка при помощи правила udev).

Якорь
Калибровка при помощи правила udev
Калибровка при помощи правила udev
Калибровка при помощи правила udev

Порядок калибровки

В

Как откалибровать датчик, в

случае если целевая матрица отсутствует

,

или

некорректно откалибровала сенсор:Определить желаемое

если при её применении калибровка сенсора выполняется некорректно, для калибровки датчика необходимо:

  • определить нормальное положение устройства (портретная
либо
  • или альбомная ориентация). Нормальное положение зависит от нужд пользователя. За нормальное можно принять любое положение
,
  • и отталкиваясь от этого проводить настройку. Можно также в качестве нормальной использовать ориентацию, в которой отображается экран при включении устройства (например, для планшетов iRU
, например,
  • это альбомный режим);
Если
  • задать начальную матрицу в виде правила udev (см. Применение единичной матрицы);
  • если режим отображения экрана не соответствует положению устройства
, то
  • определить, на сколько нужно осуществить поворот
изображения
  • экрана для приведения его в правильное положение, и выполнить указанные далее изменения элементов матрицы для получения нужного режима отображения экрана (см. Приведение экрана
.

Якорь
Применение единичной матрицы
Применение единичной матрицы
Применение

Настройка акселерометра: применение

единичной матрицы

Первым шагом необходимо Необходимо задать начальную (единичную) матрицу в виде правила udev правила, помещенного в файл /etc/udev/rules.d/99-astra-orientation.rules (все дальнейшие действия по калибровке экрана будут сводится к его редактированиюподразумевают редактирование этого файла):


xyz
(1)100
(2)010
(3)001
Блок кода
title/etc/udev/rules.d/99-astra-orientation.rules
ENV{IIO_SENSOR_PROXY_TYPE}=="*accel*", 
ENV{ACCEL_MOUNT_MATRIX}="1,0,0;0,1,0;0,0,1"

Для применения правил необходимо перезагрузить устройство (можно упомянуть вариант с тригеррами и прочим, но у меня после этого не всегда нормально работает гироскоп, перезагрузить надежнее).

Настройка акселерометра: определение необходимого нормального положения устройства

После того, как была

применена

задана начальная матрица, необходимо

выяснить

определить, на

сколько (

сколько градусов

?)

нужно осуществить поворот

изображения,

экрана для приведения его в правильное положение (см. Приведение экрана в правильное положение

. Все дальнейшие изменения по повороту применимы только

).

Информация

Приведенное описание поворота экрана применимо только к начальной (единичной) матрице

(п. 3.1).
Настройка акселерометра: поворот устройства

.

Якорь
Приведение экрана в правильное положение
Приведение экрана в правильное положение
Приведение экрана в правильное положение

Поворот изображения на 90° по часовой стрелке

Исходная матрица:

Начальная матрица имеет следующий вид.


xyz
(1)100
(2)010
(3)001
Блок кода
languagebash
title/etc/udev/rules.d/99-astra-orientation.rules
ENV{IIO_SENSOR_PROXY_TYPE}=="*accel*", 
ENV{ACCEL_MOUNT_MATRIX}="1,0,0;0,1,0;0,0,1"

Необходимые для поворота вычисления имеют следующий вид.


xy
Результирующая матрица:
z
(1)cos (90)-1 * sin (90) 0
(2)sin (90)cos (90)0
(3)001

Результирующая матрица имеет следующий вид.


xyz
(1)0-10
(2)100
(3)001
Блок кода
languagebash
title/etc/udev/rules.d/99-astra-orientation.rules
ENV{IIO_SENSOR_PROXY_TYPE}=="*accel*", 
ENV{ACCEL_MOUNT_MATRIX}="0,-1,0;1,0,0;0,0,1"
Настройка акселерометра: поворот устройства

Поворот изображения на 180° по часовой стрелке

Исходная матрица:

Начальная матрица имеет следующий вид.


xyz
(1)100
(2)010
(3)001
Блок кода
languagebash
title/etc/udev/rules.d/99-astra-orientation.rules
ENV{IIO_SENSOR_PROXY_TYPE}=="*accel*", 
ENV{ACCEL_MOUNT_MATRIX}="1,0,0;0,1,0;0,0,1"

Необходимые для поворота вычисления имеют следующий вид.


xyz
(1)cos (180)-1 * sin (180) 0
(2)sin (180)
Результирующая матрица:
cos (180)0
(3)001

Результирующая матрица имеет следующий вид.


xyz
(1)-100
(2)0-10
(3)001
Блок кода
languagebash
title/etc/udev/rules.d/99-astra-orientation.rules
ENV{IIO_SENSOR_PROXY_TYPE}=="*accel*", 
ENV{ACCEL_MOUNT_MATRIX}="-1,0,0;0,-1,0;0,0,1"
Настройка акселерометра: поворот устройства

Поворот изображения на 270° по часовой стрелке

Исходная матрица:

Начальная матрица имеет следующий вид.


xyz
(1)100
(2)010
(3)001
Блок кода
languagebash
title/etc/udev/rules.d/99-astra-orientation.rules
ENV{IIO_SENSOR_PROXY_TYPE}=="*accel*", 
ENV{ACCEL_MOUNT_MATRIX}="1,0,0;0,1,0;0,0,1"

Необходимые для поворота вычисления имеют следующий вид.


xyz
(1)cos (270)-1 * sin (270) 0
(2)sin (270)cos (270)0
(3)001

Результирующая матрица

:

имеет следующий вид.


xyz
(1)010
(2)-100
(3)001
Блок кода
languagebash
title/etc/udev/rules.d/99-astra-orientation.rules
ENV{IIO_SENSOR_PROXY_TYPE}=="*accel*", 
ENV{ACCEL_MOUNT_MATRIX}="0,1,0;-1,0,0;0,0,1"
Настройка акселерометра: определение

Определение необходимости инвертирования

Если после выполнения п. 3.2 получилось инверсия какого определения нормального положения устройства (см. Приведение экрана в правильное положение) получилась инверсия какого-либо из режимов просмотра (инвертированный альбомный/портретный режим), необходимо произвести инверсию относительно Y-координат (п. 3.3.1см. Инвертирование Y-координат).

В случае , если после применение инверсии желаемый результат применения инверсии относительно Y-координат не был достигнут желаемый результат, необходимо вернуть матрицу , полученную из п. 3.2.хк состоянию, полученному в Приведение экрана в правильное положение, и произвести инверсию относительно X-координат (п. 3.3.2).

Настройка акселерометра: инвертирование Y координаты

Для инверсии,

Якорь
Инвертирование Y-координат
Инвертирование Y-координат
Инвертирование Y-координат

Для инверсии в качестве исходной матрицы необходимо брать матрицу, полученную после поворота (

из п. 3.2.х

см. Приведение экрана в правильное положение).


xyz
(1)x1y1z1
(2)x2y2z2
(3)x3y3z3

Для выполнения инверсии

, необходимо каждую Y координату 

необходимо каждуюY-координату (из тех, которые участвуют в калибровке)умножить на -1

, т. е.

:

  • y1 * -1;
  • y2 * -1.

Таким образом, результирующая матрица будет

выглядеть следующим образом:

иметь следующий вид.


xyz
(1)x1y1 = -1 * y1z1
(2)x2y2 = -1 * y2z2
(3)x3y3z3
Блок кода
languagebash
title/etc/udev/rules.d/99-astra-orientation.rules
ENV{IIO_SENSOR_PROXY_TYPE}=="*accel*", 
ENV{ACCEL_MOUNT_MATRIX}="x1,-y1,z1;x2,-y2,z2;x3,y3,z3
"

Якорь
Инвертирование X-координат
Инвертирование X-координат
Инвертирование X-координат

Настройка акселерометра: инвертирование X координаты

Для инверсии

,

в качестве исходной матрицынеобходимо брать матрицу, полученную после поворота (

из п. 3.2.х

см. Приведение экрана в правильное положение).


xyz
(1)x1y1z1
(2)x2y2z2
(3)x3y3z3

Для выполнения инверсии

,

необходимо

каждую 

каждую X-координату (из тех, которые участвуют в калибровке) умножить на -1

, т. е.

:

  • x1 * -1;
  • x2 * -1.

Таким образом, результирующая матрица будет

выглядеть следующим образом:

иметь следующий вид.


xyz
(1)x1 = -1 * x1y1z1
(2)x2 = -1 * x2y2z2
(3)x3y3z3
Блок кода
languagebash

Настройка акселерометра: настройка частоты опроса датчика на примере (МИГ т8х)

title/etc/udev/rules.d/99-astra-orientation.rules
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.

Недостаток данного подхода в том, что после перезагрузки датчик не запоминает измененное значение.

Для того чтобы система могла автоматически устанавливать минимальную частоту обновления датчика, необходимо:

  • выполнить команды:
    Command
    sudo mkdir /etc/mig
    sudo touch /etc/mig/mig-t8x-accel-sampling-freq-fix.sh
  • в файл /etc/mig/mig-t8x-accel-sampling-freq-fix.sh вставить следующий текст:
    Блок кода
    languagebash
    title/etc/mig/mig-t8x-accel-sampling-freq-fix.sh
    SET_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
  • создать файл службы, выполнив команды:
    Command

    sudo mkdir /etc/mig
    sudo touch /etc/mig/mig-t8x-accel-sampling-freq-fix.sh

  • в созданный файл вставить следующий текст:
    Блок кода
    languagebash
    title/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
  • после сохранения файла активировать службу командой:
    Command
    sudo systemctl enable mig-t8x-accel-sampling-fix.service

После перезагрузки системы датчик будет автоматически настраиваться на минимальную частоту обновления.

Сценарий, автоматически выполняющий приведенные выше шаги, доступен по ссылке generate_mig-t8x-fix-accel-sampling-frequency.sh.

TODO