家庭用コンピュータ環境の模索 >デジタル一眼レフをフリーソフトで活用する
最終更新: 2015-12-19
Magic Lantern はキヤノンのデジタル一眼レフカメラ用のカスタムファームウエアアドオンです。Magic Lantern 自体はSDカードに書き込まれて、カメラ内部のファームウエアをフックして独自機能を追加します。本体のファームウエアは変更しません。そして、オープンソースで開発されていて、世界中の開発者が魅力的な新機能を追加しています。
本家サイトは http://www.magiclantern.fm/です。
現在の対応機種は 5D2, 5D3, 6D, 7D, 50D, 60D, 500D/T1i(Kiss X3), 550D/T2i(Kiss X4), 600D/T3i(Kiss X5), 650D/T4i(Kiss X6), 700D/T5i(Kiss X7), 1100D/T3(Kiss X50), EOS M、進行中の機種は、70D, 100D/SL1、サポートを必要としている機種は 5D classic (old version available), 40D (not working at all) です。
私は EOS70D で本家マージ候補のバージョンを使っています。
日本語の情報は、公式Wikiの日本語ページが詳しいです。
もともとは、Canon の DigicII, DigicIII を対象とした、CHDKというプロジェクトが発端のようで、随所にその痕跡が見られます。
カメラによってサポートされている機能のレベルは異なります。また、非常に多機能なので、代表的なものを次に挙げます。すこし古いですがYouTube: Magic Lantern's Most Important Functionsも参考になります。
if [ "$DEV16" = 'FAT16 ' ]; then offset1=43 offset2=64 FS='FAT16' elif [ "$DEV32" = 'FAT32 ' ]; then offset1=71 offset2=92 FS='FAT32' elif [ "$EXFAT" = 'EXFAT ' ]; then offset1=130 offset2=122 FS='EXFAT' fi echo EOS_DEVELOP | dd of="$dev" bs=1 seek=$offset1 count=11 echo BOOTDISK | dd of="$dev" bs=1 seek=$offset2 count=8
想定されるブートシーケンスは次のようなものです。
MLが暴走したら、省電力機能が働かず、ARMがフルパワーで稼働し続けます。ハングアップした時には、カメラの電源を切っても暴走したままです。電池を取り外してください。
展開したファームウエアをSDカードに上書きしてください。
左上から右上にかけて、時刻、記録フォーマット、HTP? AUTO? カード空き容量。
左下から右下にかけて、撮影モード、レンズ、絞り、シャッタースピード、ISO、ホワイトバランス、合焦点までの距離、AFモード、露出補正、バッテリー残量。
その上を、合焦範囲(29cm 30cm と表示されている。薄い…)、ヒストグラム。
左上から右上にかけて、オーディオレベルメータ、ファイル名、フレームレート、カード空き容量。
それぞれの機能は[SET]ボタンで ON/OFF できます。詳細設定が無い場合は、[SET]を押したあとに8方向キーの上下ボタンで値が設定できます。詳細設定がある場合は[Q]キーで詳細設定に、再度、[Q]キーで詳細から戻ります。
[INFO]を押した時にヘルプが表示されない場合は、他のリリースから doc/ 以下をコピーする。
直近に編集した項目がここに出てくる。
Modules メニューで、arkanoid.mo をロードした場合、次回起動時に、MLメニューに [Game] タブが出現します。そこで、Arkanoid を実行すれば、ゲームができます。←面白い、以上の意味はありません。
lua.mo モジュールをロードした場合、Lua 言語によってスクリプティングが可能です。http://magiclantern.wikia.com/wiki/Lua
Magic Lantern の開発はオープンソースで進んでます。本家サイトは、http://www.magiclantern.fm/で、情報交換はフォーラムでなされています。EOS 70D 用は別のフォーク(https://bitbucket.org/nikfreak/magic-lantern/commits/branch/70D-merge)で開発されていて、本家にはまだ取り込まれていません。
ソースコードはhttps://bitbucket.org/hudson/magic-lanternにて公開されています。DVCSとしてmercurialが使われているので、チェックアウトするには hg のインストールが必要です。Linux 環境であれば apt-get でインストールできます。Windows 環境では、SourceTree か TorsoiseHgが便利です。私見ですが、TortoiseHg (とそれに付随する hg Workbench)が十分便利なので、SourceTreeは不要ではないかと思います。gitの場合は、公式としてGit for Windowsがあるのですが、git-gui+gitk といった感じであまり使いやすくないので SourceTree の方が便利です。
コンパイルするには gcc(arm-none-eabi)が必要です。Linux ならば apt-get で入るでしょう。場合によっては dietlibc も入れる必要があるかもしれません。Windows の場合は Launchpad GCC ARM Embedded(https://launchpad.net/gcc-arm-embedded)が使えますが、MLプロジェクト自体は Linux上でのビルドを想定しており、Windows 上でのビルドは自力で頑張る必要があります。仮想PC上にLinuxをインストールしてしまうほうが楽だと思います。
$ML/Makefile.user.default を Makefile.user にコピーして編集したのち、
すこし古いところもありますが、Wikia の情報も参考にしてください。
$ hg clone -r 70D-merge https://nkon@bitbucket.org/nikfreak/magic-lantern 複製先ディレクトリ: magic-lantern リビジョンを追加中 マニフェストを追加中 ファイルの変更を追加中 11520 個のリビジョン(25493 の変更を 2775 ファイルに適用)を追加 ブランチ 70D-merge へ更新中 ファイルの更新数 1598、 マージ数 0、 削除数 0、 衝突未解消数 0 # 70D の開発先頭ブランチは 70D-merge $ cd magic-lantern/ $ ls COPYING Makefile.setup data/ installer/ src/ Doxyfile Makefile.top doc/ logo.png tcc/ Makefile Makefile.user.default doxygen/ minimal/ Makefile.filerules README.md features/ modules/ Makefile.inc build_tools/ icons/ platform/ Makefile.obsolete contrib/ include/ scripts/ $ which arm-none-eabi-gcc /usr/bin/arm-none-eabi-gcc $ arm-none-eabi-gcc --version arm-none-eabi-gcc (4.8.2-14ubuntu1+6) 4.8.2 Copyright (C) 2013 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. $ cp Makefile.user.default Makefile.user $ vim Makefile.user #GCC_VERSION, ARM_PATH などを修正する。 #CF_CARDをSDカードのマウントパスではなく実在のディレクトリに設定しておくと便利。 $ make 70D.111B # make -C platform/70D.111B でも同じ $ cd platform/70D.111B/ $ ls # autoexec.bin, ML_SETUP.FIR ができていればOK。 $ make all_modules #モジュールをビルドする。 #rst2html が無い場合は apt-get install rst2pdf を入れる。 $ make -C platform/70D.111B install #CF_CARD で示されたパスに、必要なファイル(autoexec.bin ML/* など)をコピーする。
make のターゲットの意味。
一般ユーザが持っているカメラは JTAG 端子など出ていないので、printf デバッグなどに頼らざるを得ません。
最近、QEMU上で動かして gdb でデバッグすることができるようになっているようです。
$ ./install.sh #…次のように表示される。 Next steps: =========== 1) Compile QEMU cd /home/(USER_NAME)/src/c/qemu/qemu-1.6.0 ./configure --target-list=arm-softmmu --disable-docs --enable-sdl make -j8 2) Grab a copy of the Canon firmware from your own camera (don't request one and don't share it online - it's copyrighted) Look on your SD card - you should find ML/LOGS/ROM0.BIN and ROM1.BIN Copy those in /home/(USER_NAME)/src/c/qemu/ and then run (for 60D): cat ROM0.BIN ROM1.BIN > ROM-60D.BIN 3) Enable CONFIG_QEMU=y in your Makefile.user from magic-lantern directory, then run 'make clean' to make sure you will rebuild ML from scratch. 4) Create a subdirectory named 'sdcard' or 'cfcard' and copy ML files there. Make sure all ML files are UPPERCASE (just copy them from a FAT32 card). You should get something like: /home/(USER_NAME)/src/c/qemu/sdcard/ML/AUTOEXEC.BIN /home/(USER_NAME)/src/c/qemu/sdcard/ML/FONTS/ARGNOR32.RBF /home/(USER_NAME)/src/c/qemu/sdcard/ML/MODULES/ARKANOID.MO and so on. 5) Start emulation with: cd /home/(USER_NAME)/src/c/qemu/ ./run_ml_60D.sh (this will recompile ML and QEMU - handy if you edit the sources often) Enjoy! $ cd ../../../qemu/qemu-1.6.0/ $ ./configure --target-list=arm-softmmu --disable-docs --enable-sdl $ make -j8
`dirname $0`/run_ml.sh 70D 111B $*
ML_MACHINE(50D, 0xFF010000); ML_MACHINE(60D, 0xFF010000); ML_MACHINE(70D, 0xFF010000); ML_MACHINE(600D, 0xFF010000); ML_MACHINE(500D, 0xFF010000); : : EOS_MACHINE(50D, 0xFF010000); EOS_MACHINE(60D, 0xFF010000); EOS_MACHINE(70D, 0xFF010000); EOS_MACHINE(600D, 0xFF010000); EOS_MACHINE(500D, 0xFF010000); … qemu_register_machine(&canon_eos_machine_ml_50D); qemu_register_machine(&canon_eos_machine_ml_60D); qemu_register_machine(&canon_eos_machine_ml_70D); qemu_register_machine(&canon_eos_machine_ml_600D); qemu_register_machine(&canon_eos_machine_ml_500D); : : qemu_register_machine(&canon_eos_machine_50D); qemu_register_machine(&canon_eos_machine_60D); qemu_register_machine(&canon_eos_machine_70D); qemu_register_machine(&canon_eos_machine_600D); qemu_register_machine(&canon_eos_machine_500D);
$ cat ROM0.BIN ROM1.BIN > ROM-70D.BIN
./run_ml_70D.shで起動します。さすがに遅いです、がCPUをブン回している感じもしません。