Автор данного документа не несет никакой ответственности за возможные ошибки и неточности, допущенные в документе, и за то, что вы можете сделать со своим телефоном, используя этот документ.
Все предложения, уточнения, исправления принимаются автором, т.е. SPU, по электронной почте.
Версия 1.3 от 19.05.2007.
Файл драйвера камеры представляет собой текстовый файл с названием camdriver0.dat.
NB! Все числовые значения в драйвере указываются в шестнадцатеричном виде!
NB! Будте внимательны! Вся информация, относительно которой есть только догадки, заключена в красные знаки вопросов. Пример: ??? информация под вопросом ???
NB! Данное описание не претендует на абсолютную полноту. Информация, еще не проверенная мной, специально не включена в данный файл.
Вся дальнейшая информация относится исключительно к драйверам телефонов моделей k750, w800, w810
Содержимое драйвера является интерпретируемым кодом. Интерпретация происходит непосредственно в момент использования. Например, если в драйвере содержится ошибка, то выполнение команд будет продолжаться, пока интерпретатор не достигнет некорректной команды, т.е. правильность всего кода не проверяется перед использованием.
NB! Если интерпретатор обнаруживает некорректную команду, то он помечает ВЕСЬ блок кода как некорректный и более не запускает его. Таково поведение интерпретатора в лучшем случае, в худшем телефон может перезагрузиться (например, так часто происходит если нарушена стандартная структура своиств).
Для программирования драйвера доступны 16 регистров r0
–rf
. Размер регистра 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! В тексте драйвера часто встречаются стандартные блоки с названиями, отличающимися только цифрами на конце. Таких блоков есть два типа:
*_vf_*, *_vf_*_X, *_ss_*, *_ss_*_X
— это блоки, отвечающие за процесс просмотра изображения на экране (видоискатель), съемку видео и фотографирование. Каждому из режимов работы камеры (в основном это определяется разрешением) соответствует свой номер. При работе камеры логика выполнения блоков такая: ищется блок с номером на конце, соответствующий текущему режиму, если найден, то он выполняется, и на этом все заканчивается, если не наден, то ищется блок без номера на конце и выполняется.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
info_*
. Используется прошивкой телефона при загрузке драйвера.cam_power_on_*
и cam_power_off_*
.cam_i2c_address
: номер порта для операций с модулем камерыcam_vf_clock_freq
: тактовая частота модуля камеры в режиме просмотра и видеоcam_ss_clock_freq
: тактовая частота модуля камеры при фотографированииcam_vf_format, cam_ss_format
: идентификатор формата получаемого изображения (0001
- JPEG, B100
- YUV422)cam_data_offset
: смещение блока данных (0 для YUV422, 2 для JPEG)cam_vf_sync, cam_ss_sync
: ??? количество кадров на синзхонизацию вертикальной развертки ???cam_ss_retries
: количество попыток которое можно сделать модулю камеры в процессе получения фотографии с сенсора и кодирования в JPEG (сохранение в эту процедуру не входит)cam_ss_jpeg_buf_size_*
: размер буфера в байтах для изображения в формате JPEG для каждого режимов. В большинстве случаев данное ограничение игнорируется прошивкой телефона.sup_sizes
: список параметров режимов в формате N[W,H,F]
, где N
— номер режима, W
— ширина изображения, H
— высота, F
— количество кадров в секунду (используется только для vf
режимов, считается как реальный fps * 100
, например, fps 7.5 => 750 => 2EE
):
1 - 100x160 (ss, JPEG)
, не используется2 - 160x120 (ss, JPEG)
3 - 320x240 (ss, JPEG)
, не используется4 - 640x480 (ss, JPEG)
5 - 1280x960 (ss, JPEG)
, не используется6 - 1600x1200 (ss, JPEG)
, не используется7 - 1632x1088 (ss, JPEG)
, не используется8 - 1632x1224 (ss, JPEG)
9 - 640x480 (ss, YUV422)
, используется в режимах Панорама, Рамки, Серия11 - 100x60 (vf, видоискатель)
12 - 160x120 (vf, видоискатель)
13 - 220x146 (vf, видоискатель)
14 - 220x165 (vf, видоискатель)
15 - 236x177 (vf, видоискатель)
21 - 128x96 (vf, 3GP, дневной)
22 - 128x96 (vf, 3GP, ночной)
23 - 176x144 (vf, 3GP, дневной)
24 - 176x144 (vf, 3GP, ночной)
30 - 78x144 (ss, YUV422)
, используется при тестировании сенсораsup_properties
: список параметров свойств драйвера в формате N[MN,MX,DF]
, где N
— номер свойства, MN
— минимальное значение, MX
— максимальное значение, DF
— значение при старте драйвера. Список свойств (не все из них прописаны в таблице sup_properties
):
seq_set_prop
и/или seq_get_prop
, соответственно.
seq_ping
: назначение неизвестно, в драйвере не используетсяseq_init
: код, выполняющийся при старте камеры, используется для установки некоторых начальных параметровseq_set_prop_X
: код, выполняющийся при изменении СО СТОРОНЫ ПРОШИВКИ значения свойства с номером X
(в том числе и при старте драйвера) или в результате команды принудительного выполнения. NB! Значения, которые прошивка передает коду соответствующего свойства со стороны драйвера изменить никак нелья! Т.е. если из меню был включен ночной режим (и на экране соответствующий значок), то никаким кодом драйвера нельзя заставить прошивку телефона выключить ночной режим и убрать значок, можно только проигнорировать "команду" прошивки и, например, не включать ночной режим.seq_get_prop_X
: код, выполняющийся ТОЛЬКО по запросу СО СТОРОНЫ ПРОШИВКИ. Код должен возвращать значения прошивке в заранее определенных регистрах.seq_ss_config, seq_vf_config
: код, выполняющийся при включении камеры и смене режимов ее работыseq_vf_start, seq_vf_stop
: код, выполняющийся в момент начала и остановки, соответственно, работы видоискателя и записи видеоseq_ss_start, seq_ss_stop
: код, выполняющийся в момент перехода в режим получения фотографии и после его окончания, соответственно.seq_ss_take
: код, непосредственно запускающий процесс получения фотографии.seq_ss_verify
: код, проверяющий, окончен ли процесс получения и сжатия фотографии, и возвращающиий параметры EXIF, если фотография готова.jpeg_qtable_selector_*
: возвращает текущий ??? множитель ??? для таблицы квантования JPEG.jpeg_qtable_*
: таблицы квантования для предыдущего пункта.jpeg_qtable_factors
: таблица соответсвия процента качества сжатия и среднестатистического объемама получаемых файлов.jpeg_header
: заголовок JPEG файла, в который в нужных местах вставляются необходимые значения: таблицы квантования и размеры изображения.Примечание: Если команда в качестве параметра принимает 1 байт, т.е. два символа (это записывается как XX
или YY
и т.п.), то если не оговорено противное, кроме чисел 00–FF
можно использовать ссылки на регистры в виде rX
, где X
от 0
до f
, и последовательность %0
, которая представляет собой текущее значение свойства (если код является частью seq_set_prop
).
NB! Строго соблюдайте количество символов в команде! Например, команда $m 1 2
верна, а $m 1 02
уже нет.
Команда | Описание | Примечание |
---|---|---|
$sX YY | rX=YY , поместить значение YY в регистр rX | YY не может быть регистром |
| rX=rY , поместить значение регистра rY в регистр rX | |
$dXXXX | пауза на XXXX милисекунд | |
$cX YY | if (rX==YY) , если rX=YY , то | YY не может быть регистром |
$cl | else , иначе (эту команду можно опускать, если алтернативный вариант кода не требуется) | |
$cx | endif , конец блока ветвления | |
$bX YY Z N | установить биты с номера Z по номер Z+N-1 в регистре rX равным битам 0 — N-1 значения YY | YY не может быть регистром. Не проверялось: с Z>7 , с N>8 |
$zX | поместить идентификатор размера кадра в rX | |
$pX YY | поместить текущее значение свойства номер YY в rX | YY только число |
$uXX | выполнить код seq_set_prop_XX или seq_set_prop_XX_* , если последний существует для текущего значения свойства XX | XX только число |
$<X Y | rX=rX<<Y , сдивнуть регистр rX на Y бит влево | Не тестировалось с Y>8 |
$>X Y | rX=rX>>Y , сдивнуть регистр rX на Y бит вправо | Не тестировалось с Y>8 |
$*X YY | rX=rX*YY , умножить регистр rX на YY | |
$/X YY | rX=rX/YY , делить регистр rX на YY | |
$-X YY | rX=rX-YY , вычесть YY из регистра rX | |
$+X YY | rX=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
, стандартным значениям свойств (тем, которые предполагает прошивка).
Примечание: Реально прошивкой используются только значения 3–f.
Примечание: Реально прошивкой используются только значения 0–4.
В прошивке данное свойство не используется, но в оригинальном драйвере присутствует.
В прошивке данное свойство не используется, но в оригинальном драйвере присутствует.
Примечание: Реально прошивкой используются только 0 и 1.
В оригинальном драйвере не используется.
Примечание: Значение 2 прошивкой не используется
В прошивке данное свойство не используется, но в оригинальном драйвере присутствует, поэтому реальный список значений неизвестен. Названия подобраны приблизительно (на основе других драйверов).
Примечание: Реально в прошивке скорее всего используются только значения 0–5.
00-0f от нормального, до самого светлого. В прошивке данное свойство не используется, но в оригинальном драйвере присутствует.
00-10 от самого блеклого, до самого контрастного. В прошивке данное свойство не используется, но в оригинальном драйвере присутствует.
00-10 от самого "размытого", до самого "четкого". В прошивке данное свойство не используется, но в оригинальном драйвере присутствует.
В оригинальном драйвере не используется.
Помимо обычных команд в драйвере есть особый тип команд, синтаксис которых не проверяется, т.к. они представлены просто последовательностями байт. Эти команды предназначены для непосредственного взаимодействия с модулем камеры телефона.
Каждая команда имеет длину от 3 до 8 байт и обязана заканчиваться командой $f
, последнее сделано для универсализации применяемого в прошивке телефона интерпретатора, т.к. фактически для рассматриваемой модели телефонов эта команда не нужна (см. ниже).
Каждый байт raw команды имеет свое значение, которое зависит от первых двух байт команды. Первый байт определяет тип команды и одновременно общее количество байт в команде (поэтому команда $f
нужна только формально).
03 AA BB
: Используется при тестировании сенсора. Точное назначение не выяснялось.04 AA BB CC
: в оригинальном драйвере не используется (возможно, что и не существует).05 AA BB CC DD
:
05 01 BB CC DD
: Подготовить на i2c шине DD
байт из регистров модуля камеры с номерами с BBCC
по BBCC+DD-1
для дальнейшего чтения их со стороны драйвера.05 02 BB CC DD
: Записать байт DD
в регистр модуля камеры с номером BBCC
.06 AA BB CC DD EE
:
06 02 BB CC DD EE
: Записать байт DD
в регистр модуля камеры с номером BBCC
, а байт EE
в регистр BBCC+1
.BB
всегда равен нулю, возможно, что он не является частью номера регистра, а просто не используется.
07 AA BB CC DD EE FF
:
07 02 BB CC DD EE FF
: Записать байт DD
в регистр модуля камеры с номером BBCC
, байт EE
в регистр BBCC+1
, а байт FF
в регистр BBCC+2
. Примечание: На практике байт BB
всегда равен нулю, возможно, что он не является частью номера регистра, а просто не используется.07 04 BB CC DD EE FF
: Используется при тестировании сенсора. Точное назначение не выяснялось.08 AA BB CC DD EE FF GG
: Используется при тестировании сенсора. Точное назначение не выяснялось.Примечание 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 — на чтение. Группировка регистров обусловлена либо логическим единством, либо тем, что в оригинальном драйвере регистры читаются одним блоком.
См. описание в разделе "Описание команд модуля камеры"
Используются в макросах ожидания и т.п. для определения момента смены режимов работы
Значение вычисляется по формуле: желаемый FPS*2
Значение задается в милисекундах. Младший байт заносится в регистр 0B, старший — в 0C.
Значение задается в килобайтах. Младший байт заносится в регистр 0D, старший — в 0E.
Значение задается в килобайтах. Младший байт заносится в регистр 0F, старший — в 10.
Значение задается в килобайтах. Младший байт заносится в регистр 11, старший — в 12.
Задается в процентах, т.е. от 0 до 100. Регистр 13 — начальное качество (максимальное), регистр 14 — рекомендуемое значение (среднее), регистр 15 — предельное качество (минимальное). В официальных версиях драйверов во все три регистра помещают одно и то же значение.
Назначение данного регистра не выяснялось, значение 00 соответствует бесконечности (отсутствие ограничения)
Используется прошивкой после окончания процесса сжатия фотографии.
Регистр 20 — оттенок (т.е. баланс между малиновым и зеленым). Регистр 21 — цветовая температура (т.е. баланс между синим и желтым). Диапазон 81–80, среднее (нейтральное) — 00. Установка значений регистром сама по себе ничего не меняет (см. команду номер 13 модуля камеры). Будте внимательны! Данные значения являются лишь смещением относительно текущего пресета баланса белого!
Используются прошивкой для чтения текущего состояния автоэкспозиции. 22 — младший байт, 23 — старший байт.
Используются прошивкой для чтения содержимого EXIF после получения фотографии. Чувствительность ISO: 25 — младший байт, 26 — старший. Экспозиция: 27 — младший байт, 28 — старший.
Используются прошивкой для чтения содержимого EXIF после получения фотографии. Баланс белого — регистр 29, ???расстояние светодиодной вспышки??? — регистр 2A, флаг ксеноновой вспышки — регистр 2B.
Содержит значение, соответствующее текущему положению оптической системы камеры (т.е. расстоянию фокусировки).
Используется прошивкой для чтения текущего состояния системы автофокуса.
Используется для получения информации о установленном модуле камеры.
Далее будут описаны команды, передаваемые модулю камеры, raw командой 06 02 00 01 PP CC
, где СС
— номер команды, а PP
— параметр команды.
Примечание: Блокировка сбрасывается при попытке принудительно установить значение чувствительности ISO или скорости затвора (выдержки).
Вычисляется по формуле: желаемый fps*2. Соответственно, выдержка будет 1/fps.
Параметр 01. Установить коррекцию баланса белого равным значениям регистров модуля камеры с номерами 20 и 21. Будте внимательны! Значения регистров 20,21 являются лишь смещением относительно текущего пресета баланса белого!
В официальном драйвере используется только с параметром 01.
В официальном драйвере используется только с параметром 01.
Известны два варианта параметра:
Диапазон параметра: от 00 (бесконечность) до 20 (около 8-8.5 см).
Бит 0 — отражение право-лево (вкл/выкл), Бит 1 — отражение верх-низ (вкл/выкл). Биты 3 и 4 используются в официальном драйвере, но функций никаких не выполняют.
00 — нормальная, 0F — максимальная, стандартная — 00.
F8 — минимальный, 08 — максимальный, стандартный — 00.
F8 — минимальный, 08 — максимальный, стандартный — 04.
E0 — минимальная (Ч/Б), 20 — максимальная, стандартная — 00.
Примечание: Существует вид увеличения, который не используется в оригинальной прошивке, он характеризуется плавным переходом между предыдыщим и следующим значением увеличения. Для использования этого вида увеличения необходимо прибавить ко всем значениям 80.
Используется с параметром 00.