Систематизировал информацию об акселерометре для добавления в шапку. Вот что получилось:
В планшетах Elf II, Aurora II установлен акселерометер Bosch BMA250. Полную информацию по данному датчику можно посмотреть тут:
Bosch BMA250 datasheet
Такой же датчик установлен в некоторых других устройствах, в частности Samsun Galaxy Nexus.
Информацию о состоянии датчика можно получить через регистры используя протокол I2C. Данные регистры можно использовать и для управления работой датчика, в частности, можно его откалибровать.
Для того чтобы получить информацию из регистров я написал приложение. Данное приложение позволяет прочитать или изменить значение регистров, откалибровать датчик, попытаться решить некоторые проблемы. Так-же, для анализа состояния датчика можно использовать программу Accelerometer Log, бесплатная из Google Play: Accelerometer Log
У некоторых пользователей с датчиком возникли проблемы. Ниже я опишу возможные состояния датчика и методы решения некоторых проблем. Для демонстрации я буду приводить скриншоты и значения регистров. Скриншоты делал так: держу планшет вертикально, в портретном режиме, запускаю Accelerometer Log с установками по умолчанию. Держу планшет 5 секунд, поворачиваю на 90 градусов по часовой стрелке. Держу еще 5 секунд, снова поворачиваю по часовой стрелке на 90 градусов. Так делаю пока планшет не вернется в исходной положение. Делаю скриншот (одновременно нажимаю кнопки vol- + power). Так мы можем проанализировать оси X и Y, в большинстве случаев этого достаточно. Для анализа оси Z - положить планшет на стол, подождать 5 секунд, поставить вертикально, подождать, положить на стол экраном вниз, подождать, поставить вертикально, экраном от себя, подождать, положить на стол сделать скриншот.
У датчика есть регистр 0x00 в котором хранится значение Chip ID, по datasheet его значение для нашего датчика должно быть 0x03, но как оказалось, не всегда. Состояния датчика я привяжу к значению этого регистра.
Спойлер (+/-) (1. Значение регистра 0x03)
Значение как и в datasheet - 0x03. К сожалению, в моей Авроре датчик с проблемой, поэтому покажу скриншот и регистры с Samsung Galaxy Nexus.
--- 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
00: 03 32 c0 3b 00 03 80 f7 07 00 00 00 00 00 00 03
10: 08 80 00 00 00 00 00 00 00 00 00 00 00 00 00 00
20: 05 00 09 30 81 0f c0 00 14 00 04 0a 18 08 08 10
30: 00 00 70 04 00 00 10 00 00 00 00 00 00 00 00 00
Уменьшено на 69%
720 x 1280 (39.85 КБ)
В регистре 0x00 значение 0x03 и с датчиком проблем нет.
Спойлер (+/-) (2. Значение регистра 0xf9)
У меня планшет Aurora II. Когда пришел планшет, то он работал отлично, проблем не было, но через некоторое время перестал работать автоповорот экрана. Причем, в приложении Камера - иконки поворачиваются как нужно. Почитал форум slatedroid (
http://www.slatedroid.com/topic/37448-solved-accelerometer-works-fine-but-screen-doesnt-rotate/ пользователь LexaR там это я) и нашел пользователей с такой же проблемой.
--- 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
00: f9 10 00 f8 c0 8c 80 07 1d 00 00 00 00 ff 81 00
10: 0c 80 00 00 00 ff 00 00 00 00 00 00 ff ff 00 ff
20: 05 00 09 30 81 0f c0 00 14 14 04 0a 18 48 08 11
30: 00 ff 00 f4 00 00 00 00 00 00 00 00 00 ff 00 00
Видно, что в регистре 0x00 значение 0xf9, а должно быть 0x03
В Accelerometer log выглядит это вот так:
Уменьшено на 61%
600 x 1024 (27.84 КБ)
А тут бросается в глаза то, что если в нормальном датчике значение по осям изменяется +-g (когда планшет в состоянии покоя), то в случае с ”проблемным” планшетом - +-2g. После некоторых экспериментов я нашел решение. У датчика есть регистр 0x0f - через него задается диапазон измерения. По умолчанию там значение 0x03, что соответствует +-2g. Значение 0x00 соответствует также диапазону +-2g. Если в этот регистр занести значение 0x05 (что соответствует диапазону +-4g), то на ”проблемных” планшетах все приходит в норму и начинает работать автоповорот. Вот сриншот, когда у регистра 0x0f значение 0x05:
Уменьшено на 61%
600 x 1024 (25.71 КБ)
Так-же, есть еще один вариант проблемы - когда ”залипает” ось. Т.е. по одной из оси нет изменения значения вообще. Если посмотреть на регистры, то значения по осям показывается в регистрах 0x02-0x07. В случае ”залипания” оси мы при при вращении планшета в одном из регистров все время видим значение 0x00 или 0xff. Можно попробовать несколько раз сделать soft reset планшета, перекалибровать, сбросить калибровку. Если это не помогает - то видимо поможет только замена датчика. Почитать можно тут: Ainol NOVO 7 Aurora II / Elf II - Обсуждение , Ainol NOVO 7 Aurora II / Elf II - Обсуждение
Спойлер (+/-) (3. Значение регистра 0xfa)
Лечение 0xfa тут: Ainol NOVO 7 Aurora II / Elf II - Прошивка (OS 4.0) (Пост #16866615)
Есть еще вариант, при котором планшет вообще не видит датчика, но он есть и работает. Вот пример значения регистров:
--- 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
00: fa 10 31 69 21 88 01 80 00 00 00 00 00 ff 81 05
10: 0f 00 00 00 00 ff 00 00 00 00 00 00 ff ff 00 ff
20: 05 00 09 30 81 0f c0 00 14 14 04 0a 18 48 08 11
30: 00 ff 00 c4 00 00 10 00 00 00 00 00 00 ff 00 b5
В данном случае, в регистре 0x00 значение 0xfa. Почему система не видит датчик? Посмотрим в исходниках. Там есть такой файл: /common/customer/drivers/misc/bma250.c
Вот из него кусок:
Код
// line 48
#define BMA250_CHIP_ID 3
#define BMA250E_CHIP_ID 249
//...
// line 3524
if (tempvalue == BMA250_CHIP_ID || tempvalue == BMA250E_CHIP_ID) {
249 в десятеричной системе счисления равно 0xf9 в шестнадцатеричной. Видно, что для варианта, когда ChipID == 0xf9 добавили условие, если в эту строку добавить условие, что ChipID == 250, то планшет увидит датчик. К сожалению, я не умею компилировать драйвера, поэтому сам исправить ее не могу.
Спойлер (+/-) (4. Про калибровку датчика)
Теперь о проблеме калибровки. Некоторые пользователи жалуются, что в играх ”машину ведет в сторону” и чтобы ровно ехала надо держать планшет немного повернутым. Ну и похожие ситуации. Это происходит от того, что датчик не откалиброван. Посмотрите, например, на мой второй скриншот в п.2. Там видно, что когда планшет стоит вертикально, оси X и Y смещены от 0, да и Z тоже. в нашем датчике встроена возможность откалибровать его. За это отвечают регистры 0x36, 0x37, 0x38-0x3d. Кому интересно - в datasheet там много и подробно расписано. Кому не интересно - я сделал в программе возможность калибровки датчика. Вот так выглядит Accelerometer Log после калибровки:
Уменьшено на 61%
600 x 1024 (27.55 КБ)
Тут видно, что оси X и Y равны 0, когда планшет стоит вертикально.
Для решения некоторых проблем я написал программу (для функционирования нужен root): BMA+Calibration.apk ( 199.05 КБ )Кол-во скачиваний: 127
Для решения:
Спойлер (+/-) (1. Если у вас есть проблема с автоповоротом)
то нажмите кнопку ”Исправить авто поворот”. Пометьте пункт: ”Исправлять при загрузке”. Если через некоторое время автоповорот снова прекращает работать (у меня после долгого сна значения датчика сбрасываются и автоповорот перестает работать), тогда пометьте еще и пункт ”Исправлять при каждом включении экрана”. На slatedroid было 2 случая, когда через некоторое время автоповорот ”исправляется” и начинает работать сам, без программы. Почему это происходит - я не знаю. Но видимо как-то датчик выходит из своего аварийного режима.
Спойлер (+/-) (2. Калибровка)
Нажмите кнопку ”Калибровка датчика”. Полодите планшет на ровную горизонтальную поверхность, например пол или подоконник и нажмите кнопку ”Откалибровать оси X и Y”. После этого, поставте планшет вертикально, под 90 градусов. Можете использовать угольник, книгу, журнал, чтобы точно выставить вертикально, можно и ”на глазок”. После этого нажмите кнопку ”Откалибровать ось Z”. Все. Датчик откалиброван. Попробуйте в Accelerometer Log посмотреть его графики. Если хотите сбросить калибровку в первоначальное - то для этого есть кнопка на главном экране: ”Сброс калибровки”. Программа калибрует датчик по 0, можно откалибровать датчик на +-g по каждой из оси, можно вообще задавать параметры калибровки в ручную, но это все в ручном режиме и по datasheet. Если очень интересно - пишите мне, расскажу.
Спойлер (+/-) (3. Soft Reset)
сброс датчика в первоначальное состояние. Параметры калибровки не сбрасываются, их надо сбросить отдельно.
4. Для просмотра изменения регистров есть пункт в МЕНЮ ”Значения регистров”.
5. Если все равно не работает или хотите подробнее - пишите мне в личку или на email (есть в программе), при этом сразу приложите скриншоты из Accelerometer Log по описаной мной методике, значение регистров и подробное описание проблемы. Постараюсь помочь.
6. Как проверить датчик не устанавливая программ. Только работоспособность при автоповороте: работает или нет, можно еще запустить ”Камеру” - при повороте планшета на 90 градусов - должны поворачиваться иконки. Но тут как повезет, т.к. почти у всех, изначально планшет работал нормально, проблема возникала через некоторое время.
7. Ну и disclaimer: программу вы используете на свой страх и риск, я не несу никакой ответственности за результаты ее работы.
Переменная ro.sf.gsensorposition из build.prop отвечает за сопоставление показаний датчика с привязкой к осям. Т.е. у датчика есть показания по осям x, y и z. Но датчик в разных планшетах может быть припаян как угодно: оси соответствует, повернут на 180 градусов, на 90, припаян с обратной стороны платы - и для привязки осей датчика к осям планшета служит эта переменная. Значения переменной могут изменяться от 0 до 7. В наших планшетах значение по умолчанию 2. Вот описание возможных значений:
0: xп=xд, yп=yд, zп=zд
1: yп=xд, xп=-yд, zп=zд
2: xп=-xд, yп=-yд, zп=zд
3: yп=-xд, xп=yд, zп=zд
4: xп=-xд, yп=yд, zп=-zд
5: yп=-xд, xп=-yд, zп=-zд
6: xп=xд, yп=-yд, zп=-zд
7: yп=xд, xп=yд, zп=-zд
где:
xп - ускорение планшета относительно оси x;
xд - ускорение датчика относительно оси x;