Дерево страниц

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

Ключ

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

Оглавление


Информация
titleДанная статья применима к:
  • Astra Linux Special Edition РУСБ.10015-01 (очередное обновление 1.7)

  • Astra Linux Special Edition РУСБ.10152-02 (очередное обновление 4.7)

  • Astra Linux Special Edition РУСБ.10015-01 (очередное обновление 1.6)

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

  • Astra Linux Special Edition РУСБ.10265-01 (очередное обновление 8.1)

  • Astra Linux Common Edition 2.12


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

Внимание! Если на планшете корректно работает акселерометр, то его калибровать не требуется.

Для настройки акселерометра требуется создать правило udev, определяющее привязку данных, получаемых от акселерометра, к осям координат устройства. Эта привязка может быть представлена в виде таблицы (матрицы) 3х3, содержащей коэффициенты коррекции для данных, получаемых от акселерометра

.

.

Ниже представлена таблица, содержащая в себе матрицу, используемую для калибровки экрана (Подробнее см.: iio-sensor-proxy).

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

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


xyz
(1)
x0y0z0
x1y1z1
(2)x2y2z2

Подробнее см.: iio-sensor-proxy.

Внимание! Если на планшете корректно работает акселерометр, то его калибровать не требуется.

(3)x3y3z3


Блок кода
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

Блок кода
ENV{IIO_SENSOR_PROXY_TYPE}=="*accel*", 
ENV{ACCEL_MOUNT_MATRIX}="1,0,0;0,1,0;0,0,1"

Для калибровки экрана, необходимо


Настройка акселерометра: проверка наличия целевой матрицы

Для проверки наличия целевой

Настройка акселерометра: получение исходной матрицы

Для получения исходной

матрицы устройства, необходимо получить DSL дамп (описание устройств из ACPI)

.Для этого необходимо выполнить следующие команды

, путем вызова следующих команд:

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

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

  1. Если известны DEV_ID/VEN_ID, необходимо найти данное устройство
  2. Затем у устройства необходимо найти метод ROTM (Rotation Matrix)
.В случае если нет информации о датчике, можно сразу перейти к п.2
  1. .

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

Блок кода
languagecpp
title
dsdt.dsl
Пример 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 правила

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


Настройка акселерометра: применение единичной матрицы

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

Поворот на -90o:

x0-1x1-10y0+1y1-10001

Поворот на 180o:

-x0x10y0-y10001

Поворот на 90o:

x0-1x1+10y0-1y1-10001

После внесения изменений перезагрузить устройство, и проверить правильность отображения портретного и альбомного режимов. Если изображение инвертировано, то:

Инверсия портретного режима (отразить по y):

-x0x10y0y10001

Инверсия альбомного режима (отразить по x):

x0x10y0-y10001Перезагрузить устройство. После выполненных действий датчик должен быть настроен.


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)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)-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)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).

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


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

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


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


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

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

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


xyz
(1)x1-y1z1
(2)x2-y2z2
(3)x3y3z3


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

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


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


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

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

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


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


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

TODO