Оглавление |
---|
Информация | ||
---|---|---|
| ||
|
Основная информация
Внимание! Если на планшете корректно работает акселерометр, то его калибровать не требуется.
Для настройки акселерометра требуется создать правило udev, определяющее привязку данных, получаемых от акселерометра, к осям координат устройства. Эта привязка может быть представлена в виде таблицы (матрицы) 3х3, содержащей коэффициенты коррекции для данных, получаемых от акселерометра.
Ниже представлена таблица, содержащая в себе матрицу, используемую для калибровки экрана (Подробнее см.: iio-sensor-proxy).
Голубым отмечены заголовки строк и столбцов, относительно которых в дальнейшем будет производится калибровка.
Красным в таблице отмечены участки, которые не нужно редактировать (не участвуют в калибровке).
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 |
Блок кода |
---|
ENV{IIO_SENSOR_PROXY_TYPE}=="*accel*", ENV{ACCEL_MOUNT_MATRIX}="1,0,0;0,1,0;0,0,1" |
Для калибровки экрана, необходимо
Настройка акселерометра: проверка наличия целевой матрицы
Для проверки наличия целевой матрицы устройства, необходимо получить DSL дамп (описание устройств из ACPI), путем вызова следующих команд:
Блок кода | ||||
---|---|---|---|---|
| ||||
cat /sys/firmware/acpi/tables/DSDT > dsdt.dat iasl -d dsdt.dat iasl -tc dsdt.dsl |
В полученном файле (dsdt.dsl) необходимо найти матрицу по умолчанию:
- Если известны DEV_ID/VEN_ID, необходимо найти данное устройство
- Затем у устройства необходимо найти метод ROTM (Rotation Matrix).
Рассмотрим пример для планшета 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 правила
- Определить желаемое нормальное положение устройства (портретная либо альбомная ориентация). Нормальное положение зависит от нужд пользователя. За нормальное можно принять любое положение, и отталкиваясь от этого проводить настройку. Можно также в качестве нормальной использовать ориентацию, в которой отображается экран при включении устройства (для планшетов iRU, например, это альбомный режим);
- Если режим отображения экрана не соответствует положению устройства, то определить, на сколько нужно осуществить поворот изображения для приведения его в правильное положение, и выполнить указанные далее изменения элементов матрицы для получения нужного режима отображения экрана.
Настройка акселерометра: применение единичной матрицы
Первым шагом необходимо задать начальную(единичную) матрицу в виде 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" |
Для применения правил необходимо перезагрузить устройство (можно упомянуть вариант с тригеррами и прочим, но у меня после этого не всегда нормально работает гироскоп, перезагрузить надежнее).
Настройка акселерометра: определение необходимого нормального положения устройства
После того, как была применена начальная матрица, необходимо выяснить, на сколько (градусов?) нужно осуществить поворот изображения, для приведения его в правильное положение. Все дальнейшие изменения по повороту применимы только к начальной (единичной) матрице (п. 3.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) | 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) | -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) | 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).
В случае, если после применение инверсии желаемый результат не был достигнут, необходимо вернуть матрицу, полученную из п. 3.2.х, и произвести инверсию относительно X координат (п. 3.3.2).
Настройка акселерометра: инвертирование Y координаты
Для инверсии, в качестве исходной матрицы необходимо брать матрицу, полученную после поворота (из п. 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 | z1 |
(2) | x2 | -y2 | z2 |
(3) | x3 | y3 | z3 |
Настройка акселерометра: инвертирование X координаты
Для инверсии, в качестве исходной матрицы необходимо брать матрицу, полученную после поворота (из п. 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 | y1 | z1 |
(2) | -x2 | y2 | z2 |
(3) | x3 | y3 | z3 |
Настройка акселерометра: настройка частоты опроса датчика на примере (МИГ т8х)
TODO