Оглавление |
---|
Информация | ||
---|---|---|
| ||
|
Основная информация
|
Общие сведения
В данной статье приведено описание настройки акселерометра устройства, необходимой для корректной работы автоматической ориентации экрана.
Предупреждение |
---|
Предупреждение | 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), представлена в виде таблицы. Синим отмечены заголовки строк и столбцов, относительно которых в дальнейшем будет производится калибровка. Красным в таблице отмечены участкизначения, которыене нужно редактировать (,так как они не участвуют в калибровке).
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" |
Значения интерпретируется в виде udev правила следующим образом:
По умолчанию, По умолчанию 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), путем вызова следующих командвыполнив следующие команды:
language | bash |
---|---|
title | Получение DSL дампа устройства |
Command |
---|
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).cat /sys/firmware/acpi/tables/DSDT > dsdt.dat iasl -d dsdt.dat iasl -tc dsdt.dsl
В полученном файле (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" |
В случае если полученная матрица некорректно откалибровала устройство, необходимо произвести калибровку по алгоритму, приведенному ниже (п.3).
Настройка акселерометра: калибровка при помощи 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" |
Определение необходимости инвертирования
Если после выполнения п. 3.2 получилось инверсия какого определения нормального положения устройства (см. Приведение экрана в правильное положение) получилась инверсия какого-либо из режимов просмотра (инвертированный альбомный/портретный режим), необходимо произвести инверсию относительно Y-координат . (п. 3.3.1см. Инвертирование Y-координат).
В случае , если после применение инверсии желаемый результат применения инверсии относительно Y-координат не был достигнут желаемый результат, необходимо вернуть матрицу , полученную из п. 3.2.хк состоянию, полученному в Приведение экрана в правильное положение, и произвести инверсию относительно X-координат (п. 3.3.2см. Инвертирование X-координат).
Якорь | ||||
---|---|---|---|---|
|
Для инверсии , в качестве исходной матрицы необходимо брать матрицу, полученную после поворота (из п. 3.2.хсм. Приведение экрана в правильное положение).
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" |
Якорь | ||||
---|---|---|---|---|
|
Для инверсии , в качестве исходной матрицынеобходимо брать матрицу, полученную после поворота (из п. 3.2.хсм. Приведение экрана в правильное положение).
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
.
У Недостаток данного подхода есть недостатокв том, что после перезагрузки датчик не запоминает измененное значение.
Ниже будет перечислен порядок действий, необходимый для того, Для того чтобы система могла автоматически устанавливать минимальную частоту обновления датчика.
language | bash |
---|---|
title | Создание файла, папки |
, необходимо:
- выполнить команды:
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
- вставить следующий текст:
Блок кода language bash 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
Теперь необходимо создать сервис:
language | bash |
---|---|
title | Создание файла для сервиса, установка прав доступа |
- создать файл службы, выполнив команды:
Command sudo mkdir /etc/mig
sudo touch /etc/mig/mig-t8x-accel-sampling-freq-fix.
sh
- в созданный файл
- вставить следующий текст:
Блок кода language bash 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
- после сохранения файла
- активировать
- службу командой:
language | bash |
---|---|
title | Активация сервиса |
Command sudo systemctl enable mig-t8x-accel-sampling-fix.service
Теперь после После перезагрузки системы датчик будет автоматически настраиваться на минимальную частоту обновления.
Ниже прикреплен сценарий Сценарий, автоматически выполняющий все предыдущие шаги: приведенные выше шаги, доступен по ссылке generate_mig-t8x-fix-accel-sampling-frequency.sh.