Canon 數位單眼的用戶或許都聽過這個東西:MagicLantern(以下簡稱 ML ),中文稱之為「魔燈」。這玩意簡單地說,它是幫 Canon 數位單眼相機開外掛的軟體,獲得一些原廠可以給卻不願給的功能。2008 年 Canon 將錄影功能加入 DSLR 機產品 5D Mark II(以下簡稱 5D2),不僅是 Canon 第一台可錄影的數位單眼相機(DSLR),也是史上第一台 135 全片幅底片尺寸感光元件可錄影的 DSLR,搭配一狗票 EF 鏡頭,可產出與一般小感光元件攝錄影機截然不同的影像氛圍。5D2 的出現,對當時的影音工作者造成了不少震撼,從此 DSLR 附帶錄影功能成為標配,是 Canon 迄今「最後一次」改變攝影生態的創舉。
(註:第一台可錄影的 DSLR 為 APS-C 尺寸的 Nikon D90,硬是比 5D2 早一兩個月。然而 Nikon D90 錄影規格才 720 p 未達當時主流的 FullHD 標準,並且市面上已經有 APS-C 感光尺寸的消費級錄影設備,因此 D90 並未成功進入影音產業的工作流。 5D2 上市之後,是當時的影視界公認「俗又大碗」的錄影利器,並開始採用 5D2 錄製商業影片,例如:美國隊長第一集、復仇者聯盟第一集 的部分打怪場景,5D2 很適合拍攝一些 POV 動作視角、大型攝影機難以深入的取景位、容易碰撞的近景場合等,畢竟撞壞一台 5D2 比撞壞一台百萬級攝影機還划算 ,以及豪斯醫生第六季最終集全部,因此一般仍首推 5D2 為「改變 DSLR 歷史的經典產品」)
如今 Canon 已被兩個「尼」超車領先:尼康(Nikon)和索尼(SONY)。尤其 SONY 這幾年不斷創紀錄超車的黑科技,持續挖走不少 Canon 原有的族群,出佳為尼已然是常態。
然而在 5D2 上市初期時,當時的錄影功能實在廢到無力吐槽,就我個人的回憶是,它不允許用戶手動調整光圈、快門、ISO 值,就跟現在的手機錄影一樣是全自動對應,自動強制介入的結果,等同於閹割 DSLR 最重要的強項:大光圈淺景深效果。記得當時想在白天取得淺景深的錄影效果,得遮斷鏡頭的電子接點,強迫 5D2 機身接收最大光圈去對應快門與 ISO 值,最簡單的方式是裝鏡頭時不要轉到底,但壞處是小心鏡頭不要掉下來。例如在以下這段試錄影片第 27 秒開始的波斯菊,就是遮斷 135mm F2L 電子接點,搭配一般相機腳架錄出來的效果。
這方法在遮斷電子訊號後還能手動對焦時才有用。手上另外一支絕版鏡 Canon EF 200mm F1.8L 可就行不通了,遮斷電子訊號之後對焦環就罷工了,除非選在晚上,否則很難一窺絕版傳說 200mm F1.8 超大光圈下迷人淺景深的畫面效果。
直到 Canon 在 2.0 版韌體之後,總算解放了 5D2 原來的錄影功能限制。如今回想起來,這種 Hack 錄影手段的黑歷史還真是笑話一則。
也因為當時的錄影功能太廢,有個攝影工作者本身也具備軟體工程背景的神人 Trammell Hudson,開啟了 MagicLantern - 一般俗稱「魔燈」的軟體專案(以下簡稱 ML ),並且以開放原始碼的型態發表。專案最初目的就是補足 Canon 5D2 數位單眼在錄影功能的不足,如今 ML 早已超乎當初只為補足錄影功能而生的目的,現在不僅有了 RAW Video(範例) ,就連一般的拍照對焦功能也有大幅增進(例如讓 5D2 支援群組對焦點<雖然 5D2 只有 9+6 點做群組可能用處不大>),支援的相機也越來越多,到現在 ML 的功能花樣多到讓 5D2 上面跑計算機、玩玩遊戲打發時間也就不足為奇了。
MagicLantern ( ML ) 本質上並不是一款破解軟體,而是在原廠韌體的基礎上去實現其他功能,差不多是外掛的形式。安裝的方式很簡單:
- 到這裡下載(網址)對應的 DSLR 機種。(5D2 的用戶可以到 這裡下載,作者 reddeercity 有特別針對 5D2 RAW Video 優化的版本 < crop_rec-5632x3124_3.8fps-5D2-eXperimental.9.42pm.2020Jan05.5D2212.zip >)
- 連同目錄結構解壓縮到相機的記憶卡根目錄之後,將記憶卡安裝到相機內。
- 相機內執行韌體更新程式。
- 若要解除 MagicLantern ,再執行一次韌體更新,更新完成之後先別急著關機,等上面提示的秒數(60 秒)讀完,就會自動解除,之後重新開機就是原廠韌體功能。
ML 的功能實在太多,不是本文要說的內容,讀者可直接參考手冊(網址)。
由於 ML 是開放原始碼的專案,這意味著我們如果有能力,也可以自己編譯產出,厲害一點還可以自己改程式碼,自製充滿個人風格的 ML 外掛。ML 專案從 2009 年就開始了(5D2 發表隔年),在很多年前我就嘗試過自行編譯,無奈當時學藝不精,所以一直搞不出來。近幾年經歷人生與工作上的風雨波折,無奈逼迫我去接觸一些資訊領域中相對冷門的議題,以期待將來冷門議題有天突然發光發熱,提升自己的價值。例如 iOS App 開發,我在大家才在觀望的 iOS 3 就開始切入,後來讓我有機會以個人開發的規模,一舉登上台灣不分區排行第一名的輝煌成績,如今想要以個人開發之姿拿下不分區 App 榜單,幾乎是不可能的事...啊~話題扯遠了!
這幾年走完一圈(Windows / macOS / Linux),做過一些跨平台的開發之後,差點遺忘昔日不會編譯 ML 的遺憾。如今回過頭來看,編譯 ML 並不難,而搞懂這個 ML 專案的部屬方式之後,還可以在電腦上弄個 QEMU 環境,把 ML 丟進去模擬一遍,在電腦上跑 5D2 的韌體系統,感覺其實滿好玩的。
所以這篇文章要說的,就是如何編譯對應 5D2 的 ML 韌體,並且在電腦上模擬操作 5D2 的韌體系統操作。
編譯 Canon 5D Mark II 的 MagicLantern 韌體。
ML 編譯環境支援 macOS 與 Linux,本文用 macOS (10.13)說明。討論區中有人也用 Windows 成功過,操作方式也不外乎是用 Windows 模擬 Linux 的環境。
零、準備工作
硬體部分
- 一台執行 macOS(以 macOS 10.13 High Sierra 為例)、可連網際網路的電腦。
- ㄧ台Canon 5D Mark II 相機與記憶卡。
軟體部分:安裝相關需要的套件
- 安裝 Xcode Command Line Tools
兩種方式。兩種擇一:
- 方法 1:安裝 Xcode 之後,選單 Xcode -> Preferences -> Locations 頁籤,Command Line Tools 項目下拉選擇。
- 方法 2:終端機視窗:$ xcode-select --install
- 安裝 HomeBrew:
Homebrew 是 macOS 終端環境下的套件管理,相當於 Linux 的 apt。也就是說,把這篇文章中的 brew 換成 apt-get ,就是 Linux 上面的操作方式。開啟終端機,執行一行指令:
$ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
另外 Homebrew 禁止在 sudo 權限下執行,但有些套件運行指令又預設在 /usr/local/bin ,所以為求日後保平安免受權限不足騷擾,再加上一行指令:
$ sudo chown $(whoami):admin /usr/local && sudo chown -R $(whoami):admin /usr/local
這行開權限的指令,又必須在關閉 SIP 的狀態下運作(蘋果從 10.11 開始搞一個 SIP 機制,簡直是工程師痛腳)。其他詳細內容可參考這裡(網址)。
- 安裝 Python
macOS 安裝的方式有三種:macOS 內建,Python 官網安裝,Homebrew 安裝。這裡建議 Homebrew 安裝比較省事,因為後面有些過程會偵測套件相依性,偵測不到還是會跑 Homebrew 去安裝相依套件。Homebrew 都在終端機模式下操作。
用 Homebrew 安裝 Python (這裡的 Python 指的是 Python2,而非 Python3)
$ brew install python
執行 python 看看是哪個版本,必須是 Python2,否則後面編譯會出錯
Python 2.7.16 (default, Jun 30 2018, 14:43:11)
[GCC Apple LLVM 12.0.5 (clang-1205.0.19.59.6) [+internal-os, ptrauth-isa=deploy on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>>
- 安裝 docutils
docutils 是 python 的套件,在魔燈專案中是用來從 module/XXXX/README.rst 產生 module_strings.h 的工具,用 pip 安裝即可。pip 又是 python 的套件管理程式,安裝 python 也會自動安裝 pip。安裝 docutils 的指令
$ pip install docutils
- 安裝 Mercurial
Mercurial 是跨平台的程式碼版本管理,就跟 Git 有 87% 像。要安裝 Mercurial 才能下載 ML 原始碼,因為 ML 原始碼並不在 Github 託管。
$ brew install mercural
Mercurial 跟 Git 的操作方式也很像,指令是 hg 。
一、編譯操作
(1) 下載與安裝 Toolchain
- 下載 Toolchain:
在「親手打造任天堂遊樂器」一文中提到,Toolchain 是用來編譯另一種處理器架構的工具軟體,不同的處理器有不同的 Toolchain。在電腦上編譯 5D2 韌體的 Toolchain:
下載網址:https://developer.arm.com/open-source/gnu-toolchain/gnu-rm/downloads
選「5-2016-q3-update September 28, 2016」這個版本。有分 Windows 32-bit / OS X (macOS) 64-bit / Linux 32-bit. 選擇 Mac OS X 64-bit 這個版本 。
如果用的是 Ubuntu x64 作業系統,除了要下載 Linux 32-bit 這個版本,還得在系統內安裝 gcc-multilib 套件( $ apt-get install gcc-multilib),才能在 [此字元已遮蔽] 位元環境中使用 32-bit 的程式。
- 安裝 Toolchain
下載後解壓縮到 Home 目錄下,即 ~/gcc-arm-none-eabi-5_4-2016q3
之後在 ~/.bash_profile 增加一行( Ubuntu 對應的是 ~/.profile )
export PATH=$PATH:~/gcc-arm-none-eabi-5_4-2016q3/bin
將 Toolchain 加入執行搜尋目錄。
測試:終端機模式下輸入 arm-none-eabi,連按兩次 tab 鍵,會出現一堆 arm-none-eabi 的指令清單,表示 Toolchain 安裝完成。
(2) 下載 ML 原始碼
$ cd ~
$ hg clone -u unified https://bitbucket.org/hudson/magic-lantern
$ cd ~/magic-lantern
先 make clean 一次
$ make clean
(3) 編譯 5D2 的 ML
$ cd ~/magic-lantern/platform/5D2.212/
$ make clean && make zip
經過一段漫長的編譯過程後,~/magic-lantern/platform/5D2.212 目錄會出現一個 magiclantern-Nightly.<日期>.5D2212.zip 的壓縮檔,再依照上面提到的方式安裝在記憶卡上面即可。
二、用 QEMU 模擬 Canon 5D Mark II 韌體功能介面
(1) 安裝與編譯 QEMU
一樣都是在終端機模式下操作
- 安裝 vncdotool
$ brew install vncdotool
- 安裝設定 QEMU:開啟終端機視窗,執行下列四行指令:
$ cd ~/magic-lantern
$ hg update qemu -C
$ cd contrib/qemu
$ ./install.sh
出現
This will setup QEMU for emulating Magic Lantern.
Thou shalt not be afraid of compiling stuff on Linux ;)
Continue? [y/n]
按 y 開始進入設定與安裝程序
...[漫長過程,省略]...
若出現
Error: Could not link:
並出現詢問視窗( y/n ),則先查看訊息說明是建立哪個捷徑出問題,按 n 離開之後,處理(刪除)捷徑的問題之後,再重新執行一次 ./install.sh。
若出現
./install.sh: line ###: xxxxx command not found
表示少了 xxxxx 命令。再用 Homebrew 安裝該命令所對應的套件 xxx(用 google 查一下)即可
$ brew install xxx
再重新執行 ./install.sh 命另。
若之後都沒問題,則出現以下訊息:
*** Will compile gdb 8.1 from source and install it under your home directory.
Continue? [y/n] y
按 y 開始編譯,程序會在 Home 目錄(~/)底下建立 gdb-arm-none-eabi-8_1 目錄和相關檔案。
...[漫長過程,省略]...
一切沒問題後會出現:
*** Please add GDB binaries to your executable PATH, then run this script again.
*** Run this command, or paste it into your .profile and reopen the terminal:
export PATH=/Users/administrator/gdb-arm-none-eabi-8_1/bin/:$PATH
編輯 .bash_profile: nano ~/.bash_profile ,加入一行
export PATH=/Users/administrator/gdb-arm-none-eabi-8_1/bin/:$PATH
存檔離開,並關閉這個終端機視窗。再開啟一個新的終端機視窗,從「(2) 安裝設定 QEMU」步驟重來一次即可。
上述若一切都搞定沒問題之後,會出現:
Next steps:
===========
1) Compile QEMU
cd /Users/administrator/qemu-eos/qemu-2.5.0
../configure_eos.sh
make -j8
Shall this script attempt to compile QEMU now? [y/n]
這邊回應 y,繼續出現
Setting up QEMU on Darwin...
Using clang / clang++ with -Wno-format-extra-args -Wno-format-zero-length
Options: --disable-sdl
ld: unknown option: --verbose
...[漫長的 QEMU 編譯程序,省略]...
最後出現以下訊息就表示完成了。
*** Done compiling.
Next steps:
===========
1) Go to QEMU directory
cd /Users/使用者名稱/qemu-eos/
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 them under your camera model's subdirectory, for example:
/Users/使用者名稱/qemu-eos/60D/
For models that use a serial flash, you may have to dump its contents
using the sf_dump module, then copy SFDATA.BIN as well.
3) Install Magic Lantern on your SD/CF card image:
make -C ../magic-lantern 60D_install_qemu
The included card image is bootable and contains a small autoexec.bin
that runs on all supported EOS cameras and prints some basic info.
4) Start emulation with:
cd /Users/[使用者名稱]/qemu-eos/
./run_canon_fw.sh 60D
This will recompile QEMU, but not ML.
Note: Canon GUI emulation (menu navigation, no LiveView) only works on:
5D2 5D3 6D 40D 50D 60D 70D 450D 500D 550D 600D 650D 700D 100D 1000D 1100D 1200D 1300D EOSM EOSM2
5) Tips & tricks:
- to enable or disable the boot flag in ROM, use something like:
./run_canon_fw.sh 60D,firmware="boot=1"
- to use multiple firmware versions, place the ROMs under e.g. 5D3/113/ROM*.BIN and run:
./run_canon_fw.sh 5D3,firmware="113;boot=1"
- to show MMIO activity (registers) and interrupts, use:
./run_canon_fw.sh 60D -d io,int
- to show the executed ASM code, step by step, use:
./run_canon_fw.sh 60D -d exec,int -singlestep
- to trace debug messages and various functions in the firmware, use:
./run_canon_fw.sh 60D -d debugmsg -s -S & arm-none-eabi-gdb -x 60D/debugmsg.gdb
- some camera models require GDB patches to bypass tricky code sequences:
./run_canon_fw.sh EOSM -s -S & arm-none-eabi-gdb -x EOSM/patches.gdb
Online documentation:
https://bitbucket.org/hudson/magic-lantern/src/qemu/contrib/qemu/README.rst
https://bitbucket.org/hudson/magic-lantern/src/qemu/contrib/qemu/HACKING.rst
Enjoy!
上面的訊息已經清楚說明,如何用 QEMU 來運行 Canon DSLR 韌體了。底下繼續說明實際操作方式。
(2) 用 QEMU 運行 Canon 5D Mark II 韌體
- 從 5D2 設備提取 ROM0.BIN 與 ROM1.BIN。
先讓 5D2 執行一次 ML 韌體,這個動作會提取 5D2 的原廠韌體,並儲存在記憶卡的 /LOGS 目錄下。
相機關機之後,把 /LOGS 目錄下的檔案(有兩個:ROM0.BIN,ROM1.BIN)拷貝到 ~/qemu-eos/5D2/ 底下:
- 編譯可讓 QEMU 運行的 5D2 ML 韌體的磁碟映像:
啟動 QEMU 時必須指定一個裡面包含作業系統的磁碟映像。所以我們必須產生一個磁碟映像檔。
$ cd ~/qemu-eos
$ make -C ../magic-lantern/platform/5D2.212 install_qemu
完成時,在 ~/qemu-eos 目錄下會出現一個 cf.img 磁碟映像。如果把這個映像掛載起來,就可以發現目錄結構內容與插入相機的 CF 卡完全相同。
看完記得載卸,不然待會 qemu 會無法存取而導致啟動失敗。
- 啟動 qemu 運行 Canon 5D Mark II 的 ML 韌體。
$ cd ~/qemu-eos
$ ./run_canon_fw.sh 5D2,firmware="boot=1"
說明:
./run_canon_fw.sh 5D2,firmware="boot=1" 是掛載 ML 韌體,
./run_canon_fw.sh 5D2 是掛載原廠 5D2 韌體
等個幾十秒,見證奇蹟吧!然後...
這是啥???
...烏鴉飛過,滿滿黑人問號....
這時候滑鼠在右邊的灰色範圍點擊一下,再按鍵盤上的 M 鈕:
5D2 的選單畫面終於出來啦!
按 F1 鈕有熱鍵說明。
簡單來說,因為 5D2 雖然沒有鍵盤滑鼠,但機身上有一大堆的按鈕,所以鍵盤熱鍵大多對應 5D2 機身上的某個按鈕。
現在可以像是操作 5D2 的選單那樣,在電腦上模擬這個操作環境。
看得出來除了啟用 5D2 韌體,也載入 ML 外掛了。
如果一開始執行的是:
$ ./run_canon_fw.sh 5D2
則會掛載原廠韌體,不會掛載 ML 外掛。
至於要怎麼叫出 ML 的功能表呢?把它想成跟 5D2 操作方式一樣。先關閉 LCD 畫面( 鍵盤 M 鈕),再按垃圾統的按鈕(鍵盤 DEL 鈕)。
可以加掛 lua 模組,來執行一些亂七八糟的功能。
用 5D2 玩 Pong 遊戲,頗呵咧~
補充:有關 Canon EOS 5D Makr II 使用 Magic Lantern 錄製 RAW Video 的資訊:
- 預設值為關閉,需進入 Magic Lantern 選單內,設定 mlv_rec.mo 為 ON 之後方能啟用 RAW Video 錄影。
- RAW Video 檔案的副檔名為 .MLV,一般影片編輯軟體無法直接處理,可用免費工具 MLV app 轉檔至其他相容格式(如 Apple ProRes 422 HQ)。
- 個人實測,錄製 1880 × 1058 / 29.97fps 的 RAW VIDEO 且手邊最快的 CF 卡寫入速度只有 30MB/s 時,僅只能錄製 229 幀(7.6409 秒)後自動停止,產生檔案大小為 574,567,424 bytes。經換算為每秒 75.19557 MB/s,位元率 601.56456 Mbit/s,也就是說,5D2 錄製 RAW Video 時,CF 卡寫入速度至少必須超過 75MB/s 門檻。
- 其他細節可參考此說明影片(英語發音)。影片中外國人建議 5D2 錄製 RAW Video 的 CF 卡為 SanDisk Extreme Pro 64/128GB(超過容量則 5D2 不支援),讀寫速度為 160MB/150MB。
- 後續購入 SanDisk Extreme Pro 128GB,經實測此卡在 5D2 的最大寫入速度約為 80MB/s(應該是 5D2 連續寫入的速度極限),可連續錄製最高 1600 x 900 29.97fps 的 RAW Video。