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

Ключ

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

Оглавление

Информация
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-01 37 (очередное обновление 17.67)
  • Astra Linux Special Edition РУСБ.10015-16 исп. 1 и исп. 203 (очередное обновление 7.6)
  • Astra Linux Special Edition РУСБ.1026510015-01 (очередное обновление 81.16)
  • Astra Linux Common Special Edition 2.12

Основная информация

  • РУСБ.10015-16 исп. 1
  • Astra Linux Common Edition 2.12

Общие сведения

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

Внимание!
Предупреждение
Предупреждение
title
Если на акселерометр на устройстве работает корректно, то его калиброватьне требуется.

Для настройки акселерометра требуется создать правило 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"

По умолчанию , 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), путем вызова следующих команд:выполнив следующие команды:

Command
Блок кода
languagebash
titleПолучение DSL дампа устройства
cat /sys/firmware/acpi/tables/DSDT > dsdt.dat
iasl -d dsdt.dat
iasl -tc dsdt.dsl

В полученном файле (dsdt.dsl) необходимо найти матрицу по умолчанию:

  • Если известны DEVICE_ID/VENDOR_ID, необходимо найти данное устройство
  • - 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).

    В случае , если целевая матрица не была обнаружена - необходимо перейти к другому способу калибровки, описанному в п.3., необходимо выполнить калибровку с помощью правила 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"
    Вычисления:

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


    xyz
    (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-координату (из тех, которые участвуют в калибровке)умножить на -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
    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
    languagebashtitleСоздание файла, папки
    • 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"
      
      
    freqLine
    • minFreq=
    $(cat
    • `cat $AV_FREQ_FILE
    ) minFreq=0 for freq in $freqLine do minFreq=$freq break done
    •  | cut -d' ' -f1`
      
      echo $minFreq > $SET_FREQ_FILE

    Теперь необходимо создать сервис:

    Блок кода
    languagebash
    titleСоздание файла для сервиса, установка прав доступа
    sudo touch /etc/systemd/system/mig-t8x-accel-sampling-fix.service sudo chmod 644 /etc/systemd/system
    • создать файл службы, выполнив команды:
      Command

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

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

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

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