ВНИМАНИЕ!

Автор данного документа не несет никакой ответственности за возможные ошибки и неточности, допущенные в документе, и за то, что вы можете сделать со своим телефоном, используя этот документ.

Все предложения, уточнения, исправления принимаются автором, т.е. SPU, по электронной почте.

Версия 1.3 от 19.05.2007.

Введение

Файл драйвера камеры представляет собой текстовый файл с названием camdriver0.dat.

NB! Все числовые значения в драйвере указываются в шестнадцатеричном виде!

NB! Будте внимательны! Вся информация, относительно которой есть только догадки, заключена в красные знаки вопросов. Пример: ??? информация под вопросом ???

NB! Данное описание не претендует на абсолютную полноту. Информация, еще не проверенная мной, специально не включена в данный файл.

Вся дальнейшая информация относится исключительно к драйверам телефонов моделей k750, w800, w810

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

NB! Если интерпретатор обнаруживает некорректную команду, то он помечает ВЕСЬ блок кода как некорректный и более не запускает его. Таково поведение интерпретатора в лучшем случае, в худшем телефон может перезагрузиться (например, так часто происходит если нарушена стандартная структура своиств).

Для программирования драйвера доступны 16 регистров r0rf. Размер регистра 4 байта.

NB! Все команды работают с аргументом в 1 байт! Однако вычисления всегда проводятся с регистрами полного размера.

Для вставки комментария в код используется пара символов //. Все, что начинается с этих символов и заканчивается концом строки, считается комментарием. Например: //комментарий

Любая последовательность команд начинается с названия блока и, следующего за ним, знака = и заканчивается символом ;. Например: SOME_CODE=…какой-то код…;

Блоки команд/данных бывают двух типов: стандартные (их названия начинаются с info_, cam_,sec_,jpeg_) и макросы.

Макрос — это такой блок команд, который выполняется, когда интерпретатор обнаруживает ссылку на этот макрос в текущем исполняемом коде.

Макросу можно передавать «параметры». Слово параметры взяты в кавычки по следующей причине: интерпретатор проверяет и выполняет одну команду за другой, поэтому к моменту вставки параметра в текст кода предыдущая команда должна быть полностью завершенной, иначе код будет считаться некорректным, т.е. в качестве параметра может использоваться только кусок кода (но есть одно исключение). Чтобы указать, в какое место макроса следует вставить параметр, используются последовательности !0, !1 и т.д. по количеству параметров.

Пример: MACRO=$z0 $c0 00 !0 $cl !1 $cx;

NB! Макрос нужно определить до первого использования в коде!

В код макрос вставляется конструкцией #MACROS, если требуется передать куски кода, то писать #MACROS(…код1…,…код2…)

Пример: #MACRO($s1 01,$s1 02)

NB! Макросы при использовании могут быть вложенными: #MACRO1(#MACRO2(#MACRO3))

NB! Передавать макросу можно только код или данные, входящие в состав raw команд (см. раздел «Подробное описание raw команд»)!

Пример: MACRO=$s0 !0; #MACRO(01) работать не будет (причину см. выше)! Работать будет только: MACRO = 06 02 00 01 !1 !2 $f; #MACRO(02,01)

Описание структуры драйвера

NB! В тексте драйвера часто встречаются стандартные блоки с названиями, отличающимися только цифрами на конце. Таких блоков есть два типа:

  1. *_vf_*, *_vf_*_X, *_ss_*, *_ss_*_X — это блоки, отвечающие за процесс просмотра изображения на экране (видоискатель), съемку видео и фотографирование. Каждому из режимов работы камеры (в основном это определяется разрешением) соответствует свой номер. При работе камеры логика выполнения блоков такая: ищется блок с номером на конце, соответствующий текущему режиму, если найден, то он выполняется, и на этом все заканчивается, если не наден, то ищется блок без номера на конце и выполняется.
  2. seq_*_prop_Y, seq_*_prop_Y_X — это блоки, отвечающие за совершение определенных действий при изменении значения свойства с номером Y. Число в конце соответствует текущему значению данного свойства. Например: seq_set_prop_1=…; seq_set_prop_1_0=…; Если свойство 1 имеет значение 0, то выполнится seq_set_prop_1_0, если не 0, то seq_set_prop_1

Структура драйвера

Список команд

Примечание: Если команда в качестве параметра принимает 1 байт, т.е. два символа (это записывается как XX или YY и т.п.), то если не оговорено противное, кроме чисел 00–FF можно использовать ссылки на регистры в виде rX, где X от 0 до f, и последовательность %0, которая представляет собой текущее значение свойства (если код является частью seq_set_prop).

NB! Строго соблюдайте количество символов в команде! Например, команда $m 1 2 верна, а $m 1 02 уже нет.

.
КомандаОписаниеПримечание
$sX YYrX=YY, поместить значение YY в регистр rXYY не может быть регистром
$m X Y (или $mX Y)rX=rY, поместить значение регистра rY в регистр rX
$dXXXXпауза на XXXX милисекунд
$cX YYif (rX==YY), если rX=YY, тоYY не может быть регистром
$clelse, иначе (эту команду можно опускать, если алтернативный вариант кода не требуется)
$cxendif, конец блока ветвления
$bX YY Z Nустановить биты с номера Z по номер Z+N-1 в регистре rX равным битам 0 — N-1 значения YYYY не может быть регистром. Не проверялось: с Z>7, с N>8
$zXпоместить идентификатор размера кадра в rX
$pX YYпоместить текущее значение свойства номер YY в rXYY только число
$uXXвыполнить код seq_set_prop_XX или seq_set_prop_XX_*, если последний существует для текущего значения свойства XXXX только число
$<X YrX=rX<<Y, сдивнуть регистр rX на Y бит влевоНе тестировалось с Y>8
$>X YrX=rX>>Y, сдивнуть регистр rX на Y бит вправоНе тестировалось с Y>8
$*X YYrX=rX*YY, умножить регистр rX на YY
$/X YYrX=rX/YY, делить регистр rX на YY
$-X YYrX=rX-YY, вычесть YY из регистра rX
$+X YYrX=rX+YY, прибавить YY к регистру rX
$tXXXX??? запускает процесс получения фотографии. Назначение параметра не очень ясно. ???
$fмаркер конца raw команды
$wXзаписать значение регистра rX на шину i2c. Используется только как часть raw команд вместо одного из байт.
$rX S A B … Fпопытаться прочитать с шины i2c X байт, подготовленных предыдущей raw командой в регистры rS, rA, rB,…, rF, где X — это общее количество байт, которое должно быть прочитано (всегда на 1 больше, чем было указано в raw команде чтения), S — номер регистра, в который будет записано реальное прочитанное количество байт (в некоторых случаях это значение может быть меньше X), A–F — номера регистров в количестве X-1, в которые будут записаны прочитанные данные. Пример: $r3 0 0 1. Статусный байт практически всегда игнорируется, поэтому первые два номера регистров в списке обычно совпадают.Не проверялось: X>5

Подробное описание свойств, имеющих режим "записи"

Описывается соответствие значений, передаваемых прошивкой в %0, стандартным значениям свойств (тем, которые предполагает прошивка).

0 - экспозиция

Примечание: Реально прошивкой используются только значения 3–f.

1 - баланс белого

Примечание: Реально прошивкой используются только значения 0–4.

2 - коррекция эффекта мерцания

3 - вертикальный переворот видоискателя

В прошивке данное свойство не используется, но в оригинальном драйвере присутствует.

4 - горизонтальный переворот видоискателя

В прошивке данное свойство не используется, но в оригинальном драйвере присутствует.

5 - степень сжатия JPEG

6 - увеличение

7 - ночной режим

8 - эффекты

9 - режим фокусировки (макро)

Примечание: Реально прошивкой используются только 0 и 1.

a - управление фокусировкой

d - светодиодная вспышка

В оригинальном драйвере не используется.

e - ксеноновая вспышка

Примечание: Значение 2 прошивкой не используется

f - управление спящим режимом сенсора

10 - сцена

В прошивке данное свойство не используется, но в оригинальном драйвере присутствует, поэтому реальный список значений неизвестен. Названия подобраны приблизительно (на основе других драйверов).

11 - чувствительность ISO

Примечание: Реально в прошивке скорее всего используются только значения 0–5.

13 - яркость

00-0f от нормального, до самого светлого. В прошивке данное свойство не используется, но в оригинальном драйвере присутствует.

14 - контраст

00-10 от самого блеклого, до самого контрастного. В прошивке данное свойство не используется, но в оригинальном драйвере присутствует.

15 - четкость (выраженность деталей)

00-10 от самого "размытого", до самого "четкого". В прошивке данное свойство не используется, но в оригинальном драйвере присутствует.

18 - режим фотометрии

В оригинальном драйвере не используется.

Подробное описание raw команд

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

Каждая команда имеет длину от 3 до 8 байт и обязана заканчиваться командой $f, последнее сделано для универсализации применяемого в прошивке телефона интерпретатора, т.к. фактически для рассматриваемой модели телефонов эта команда не нужна (см. ниже).

Каждый байт raw команды имеет свое значение, которое зависит от первых двух байт команды. Первый байт определяет тип команды и одновременно общее количество байт в команде (поэтому команда $f нужна только формально).

Список команд

Примечание 1: После всех команд записи вставляется небольшая пауза в 5 милисекунд, чтобы контроллер успел обработать запрос.

Примечание 2: Вместо байт, означенных выше как данные, можно использовать команду $wX, которая фактически передаст значение регистра rX вместо замещенного байта, например, 05 02 00 08 $w0 $f $d0005, т.е. в качестве данных в регистр 0008 будет записано значение регистра r0.

Примечание 3: Чтобы прочитать данные, переданные raw командой используйте конструкцию вида 05 01 BB CC DD $f $rX S A … F, например, 05 01 00 03 03 $f $r4 0 1 2 3, в r0 запишется статусный байт, а в r1–r3 — данные.

Примечание 4: Поскольку синтаксис raw команды не проверяется, она может прерываться другими командами, например: 06 02 00 01 01 $c0 00 03 $cl 05 $cx $f $d0005 или 06 02 00 01 !1 !0 $f $d0005 (при использовании в макросе).

Назначение известных регистров модуля камеры

Символом w помечены регистры, которые в оригинальном драйвере работают на запись, а r — на чтение. Группировка регистров обусловлена либо логическим единством, либо тем, что в оригинальном драйвере регистры читаются одним блоком.

01,02 - регистры передачи команд модулю камеры (w)

См. описание в разделе "Описание команд модуля камеры"

03,04,05,06 - события модуля камеры (состояние модуля) (r)

Используются в макросах ожидания и т.п. для определения момента смены режимов работы

07 - разрешение сенсора в режиме видео и видоискателя (w)

08 - максимальный FPS сенсора (w)

Значение вычисляется по формуле: желаемый FPS*2

0B,0C - максимальное время ожидания сжатия в JPEG (w)

Значение задается в милисекундах. Младший байт заносится в регистр 0B, старший — в 0C.

0D,0E - максимальный объем JPEG (w)

Значение задается в килобайтах. Младший байт заносится в регистр 0D, старший — в 0E.

0F,10 - минимальный объем JPEG (w)

Значение задается в килобайтах. Младший байт заносится в регистр 0F, старший — в 10.

11,12 - средний (??? рекомендуемый ???) объем JPEG (w)

Значение задается в килобайтах. Младший байт заносится в регистр 11, старший — в 12.

13,14,15 - качество сжатия JPEG (w)

Задается в процентах, т.е. от 0 до 100. Регистр 13 — начальное качество (максимальное), регистр 14 — рекомендуемое значение (среднее), регистр 15 — предельное качество (минимальное). В официальных версиях драйверов во все три регистра помещают одно и то же значение.

18 - ??? непрерывный режим JPEG ??? (w)

Назначение данного регистра не выяснялось, значение 00 соответствует бесконечности (отсутствие ограничения)

19 - разрешение сенсора в режиме фото (w)

1B - текущий (получившийся) процент качества сжатия JPEG (r)

Используется прошивкой после окончания процесса сжатия фотографии.

20,21 - коррекция баланса белого (w)

Регистр 20 — оттенок (т.е. баланс между малиновым и зеленым). Регистр 21 — цветовая температура (т.е. баланс между синим и желтым). Диапазон 81–80, среднее (нейтральное) — 00. Установка значений регистром сама по себе ничего не меняет (см. команду номер 13 модуля камеры). Будте внимательны! Данные значения являются лишь смещением относительно текущего пресета баланса белого!

22,23 - автоэкспозиция (r)

Используются прошивкой для чтения текущего состояния автоэкспозиции. 22 — младший байт, 23 — старший байт.

25,26,27,28 - EXIF: чувствительность ISO и экспозиция(r)

Используются прошивкой для чтения содержимого EXIF после получения фотографии. Чувствительность ISO: 25 — младший байт, 26 — старший. Экспозиция: 27 — младший байт, 28 — старший.

29,2A,2B - EXIF: баланс белого, ???расстояние вспышки для светодиодов???, состояние ксеноновой заполняющей вспышки (r)

Используются прошивкой для чтения содержимого EXIF после получения фотографии. Баланс белого — регистр 29, ???расстояние светодиодной вспышки??? — регистр 2A, флаг ксеноновой вспышки — регистр 2B.

2C - фокус (положение оптической системы) (r)

Содержит значение, соответствующее текущему положению оптической системы камеры (т.е. расстоянию фокусировки).

2E - автофокус (r)

Используется прошивкой для чтения текущего состояния системы автофокуса.

36 - версия модуля камеры (r)

Используется для получения информации о установленном модуле камеры.

Описание команд модуля камеры, записываемых в регистры 01,02

Далее будут описаны команды, передаваемые модулю камеры, raw командой 06 02 00 01 PP CC, где СС — номер команды, а PP — параметр команды.

01 - блокировка автоэкспозиции на текущем значении

Примечание: Блокировка сбрасывается при попытке принудительно установить значение чувствительности ISO или скорости затвора (выдержки).

03 - скорость медленного затвора (минимальный FPS)

Вычисляется по формуле: желаемый fps*2. Соответственно, выдержка будет 1/fps.

04 - скорость затвора

05 - чувствительность ISO

06 - экспозиция

08 - режим фотометрии

11 - баланс белого

13 - пользовательская коррекция баланса белого

Параметр 01. Установить коррекцию баланса белого равным значениям регистров модуля камеры с номерами 20 и 21. Будте внимательны! Значения регистров 20,21 являются лишь смещением относительно текущего пресета баланса белого!

21 - коррекция эффекта мерцания

32 - перевести сенсор в режим получения фотографии и установить выходной формат JPEG

В официальном драйвере используется только с параметром 01.

33 - перевести сенсор в режим получения фотографии и установить выходной формат YUV422

В официальном драйвере используется только с параметром 01.

34 - перевести сенсор в режим визирования/видео

Известны два варианта параметра:

41 - режим фокусировки

42 - включение, отключение процесса автоматической фокусировки

43 - ручная фокусировка

Диапазон параметра: от 00 (бесконечность) до 20 (около 8-8.5 см).

51 - сцена (тематический пресет)

52 - зеркальнный переворот видоискателя

Бит 0 — отражение право-лево (вкл/выкл), Бит 1 — отражение верх-низ (вкл/выкл). Биты 3 и 4 используются в официальном драйвере, но функций никаких не выполняют.

53 - эффекты

54 - яркость

00 — нормальная, 0F — максимальная, стандартная — 00.

55 - контраст

F8 — минимальный, 08 — максимальный, стандартный — 00.

56 - четкость (выраженность деталей)

F8 — минимальный, 08 — максимальный, стандартный — 04.

58 - насыщенность

E0 — минимальная (Ч/Б), 20 — максимальная, стандартная — 00.

5A - режимы работы ксеноновой вспышки

61 - увеличение

Примечание: Существует вид увеличения, который не используется в оригинальной прошивке, он характеризуется плавным переходом между предыдыщим и следующим значением увеличения. Для использования этого вида увеличения необходимо прибавить ко всем значениям 80.

72 - обновить данные EXIF в регистрах камеры

Используется с параметром 00.