Изучение прошивок фотиков Canon с DIGICII

Изучение прошивок фотиков Canon с DIGICII
По материалам соответсвующей ветки форума iXBT.

Для чего это нужно
Исначально предполагалось просто научить камеру сохранять RAW файлы.

Смотрим в прошивку
Для анализа прошивки вам понадобится дизассемблер. Я использовал IDA Pro. Для автоматического распознавания функций можно использовать FLIRT-сигнатуры, а также IDC-скрипт, которые можно взять здесь.
 * Полезная информация работе прошивки

Исходники
На данный момент самые свежие исходники можно взять из SVN репозитория, логин anonymous, без пароля. Прошивка постоянно (но не очень регулярно) обновляется, за что огромное спасибо vitalyb. Для работы с Wikipedia:Subversion_(software)|SVN-репозиторием вам понадобится SVN-клиент (хотя можно и через web, но это не очень удобно, так как файлов очень много и не будет возможности накладывать изменения), который можно скачать здесь.

Собранные прошивки
Пока нет одного места, где бы выкладывались бы последние собранные версии прошивок. Ищите по форуму.

Собираем прошивку сами
На данный момент сборка прошивки может осуществляться либо под Windows, либо под Linux 64bit.

Сборка под Windows
Вам понадобится gcc для ARM под Windows. А тагже Unux-подобная среда типа Cygwin или Mingw/MSys.

Если не хочется возиться с настройкой, можно взять готовый environment здесь. Вот инструкция по установке:
 * 1) Запускаем Far (или ваш любимый файловый менеджер).
 * 2) Создаём на каком-нибудь диске рабочую папку, скажем 'D:\hdk-devel'.
 * 3) Переходим в неё.
 * 4) Скачиваем все необходимые файлы: gcc_env_for_hdk.rar, hdk-pre5.zip, hdk.patch.
 * 5) Создаём подпапку 'gcc' (в нашем рабочем каталоге 'hdk-devel').
 * 6) Распаковываем в неё gcc_env_for_hdk.rar.
 * 7) Распаковываем hdk-pre5.zip. (Должна появиться папка 'hdk'. Напоминаю, что мы всё ещё находимся в каталоге 'hdk-devel'). Итак. Каталог 'hdk-devel' должен содержать две папки - 'gcc' и 'hdk'.
 * 8) Добавляем каталог 'D:\hdk-devel\gcc\bin' в PATH. Для этого идём в настройки Windows (у меня WinXP Eng): 'Start' -> 'Control Panel' -> 'System', закладка 'Advanced', кнопка 'Environment Variables'. Я добавлял в переменные пользователя. Если у вас такой переменной, как PATH, ещё не было, то жмём 'New' и вписываем имя переменной 'PATH' и значение 'D:\hdk-devel\gcc\bin'. Если такая переменная была, то жмём 'Edit', и добавляем к значению в конец ';D:\hdk-devel\gcc\bin' (не забываем разделитель ';' (точка с запятой)). Отбиваемся от всей этой кучи окон кнопками 'Ok'.
 * 9) На всякий случай, перезапускаем Far (или ваш любимый файл менеджер), чтобы он зацепил изменения в переменных окружения. Не для всех файл менеджеров этот шаг необходим, но лучше перестраховаться.
 * 10) Находясь в нашей рабочей папке 'D:\hdk-devel', заходим в папку 'hdk'.
 * 11) Накладываем патч - 'patch -p1 -ci ..\hdk.patch'.
 * 12) Патч может выругаться, что не смог пропатчить Makefile в каталоге 'core'. Можно забить, прошивка всё равно соберётся. Но не будет до конца проходить 'gmake clean'. Если не забиваем, то открываем непропатчившийся Makefile в редакторе и стираем '*.a' у rm'а в секции clean. (Важно: редактор не должен заменять символы табуляции на пробелы).
 * 13) Всё. Подготовка завершена.
 * 14) Для сборки прошивки находясь в каталоге 'D:\hdk-devel\hdk' набираем 'gmake fir'. Для запаковки прошивки в zip-архив - 'gmake firzip'.
 * 15) По-умолчанию собирается прошивка для A610 версии 1.00e. Для сборки под другую модель и/или версию прошивки можно указать параметры для gmake: PLATFORM=<модель> PLATFORMSUB=<версия прошивки>.  Например, 'gmake PLATFORM=a620 PLATFORMSUB=100f fir'
 * 16) Для очистки дерева исходников от всех объектников и собранных бинарников - 'gmake clean'.

Сборка под Linux
Здесь всё гораздо проще, так как почти всё уже есть в системе... Скачиваете gcc для ARM, распаковываете, настраиваете на него путь в файле makefile.inc, и вперёд.

Загрузка "прошивки" в камеру
Для загрузки прошивки вам возможно понадобится картридер, тат как необходимо записать файл прошивки PS.FIR в корень флэшки. Включаете фотоаппарат в режиме просмотра, заходите в меню и выбираете пункт меню Update Firmware....
 * Здесь нужно сделать важное замечание - данная операция на самом деле ничего перепрошивать не будет, так как алтернативная прошивка не я вляется прошивкой, а по сути есть резидентная программа, которая остаётся в памяти и работает только до выключения питания. Так что, даже если что-нибудь пойдёт не так и прошивка зависнет, то ничего плохого не произойдёт, так как после выключения и повторного включения аппарата никаких следов прошивки не останится.