Canon_EOS_5D_Mark_II_back  

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 早一兩個月,不過 D90 錄影規格才 720 p 未達當時主流的 FullHD 標準,在此之前已經有 APS-C 感光尺寸的消費級錄影設備,並且開始有攝影團隊採用 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 >)
  • 連同目錄結構解壓縮到相機的記憶卡根目錄之後,將記憶卡安裝到相機內。

螢幕快照 2018-06-30 下午1.14.22  

  • 相機內執行韌體更新程式。
  • 若要解除 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 安裝完成。

螢幕快照 2018-06-30 下午1.03.44

(2) 下載 ML 原始碼

$ cd ~
$ hg clone -u unified https://bitbucket.org/hudson/magic-lantern
$ cd ~/magic-lantern

先 make clean 一次

$ make clean

螢幕快照 2018-06-30 下午1.06.03

(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 目錄下。

螢幕快照 2018-06-30 下午4.08.41

相機關機之後,把 /LOGS 目錄下的檔案(有兩個:ROM0.BIN,ROM1.BIN)拷貝到 ~/qemu-eos/5D2/ 底下:

螢幕快照 2018-06-30 下午4.10.23

 

- 編譯可讓 QEMU 運行的 5D2 ML 韌體的磁碟映像:

啟動 QEMU 時必須指定一個裡面包含作業系統的磁碟映像。所以我們必須產生一個磁碟映像檔。

$ cd ~/qemu-eos
$ make -C ../magic-lantern/platform/5D2.212 install_qemu

螢幕快照 2018-06-30 下午4.46.24

完成時,在 ~/qemu-eos 目錄下會出現一個 cf.img 磁碟映像。如果把這個映像掛載起來,就可以發現目錄結構內容與插入相機的 CF 卡完全相同。

螢幕快照 2018-06-30 下午4.44.26

看完記得載卸,不然待會 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 韌體

等個幾十秒,見證奇蹟吧!然後...

螢幕快照 2018-06-30 下午4.53.04

這是啥???

...烏鴉飛過,滿滿黑人問號....

這時候滑鼠在右邊的灰色範圍點擊一下,再按鍵盤上的 M 鈕:

螢幕快照 2018-06-30 下午4.57.07  

5D2 的選單畫面終於出來啦!

按 F1 鈕有熱鍵說明。

螢幕快照 2018-06-30 下午5.00.14

簡單來說,因為 5D2 雖然沒有鍵盤滑鼠,但機身上有一大堆的按鈕,所以鍵盤熱鍵大多對應 5D2 機身上的某個按鈕。

現在可以像是操作 5D2 的選單那樣,在電腦上模擬這個操作環境。

螢幕快照 2018-06-30 下午5.00.52

看得出來除了啟用 5D2 韌體,也載入 ML 外掛了。

如果一開始執行的是:

$ ./run_canon_fw.sh 5D2

則會掛載原廠韌體,不會掛載 ML 外掛。

至於要怎麼叫出 ML 的功能表呢?把它想成跟 5D2 操作方式一樣。先關閉 LCD 畫面( 鍵盤 M 鈕),再按垃圾統的按鈕(鍵盤 DEL 鈕)。

QEMU_5D2

QEMU_5D2

可以加掛 lua 模組,來執行一些亂七八糟的功能。

QEMU_5D2

QEMU_5D2

用 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。
arrow
arrow

    benjenq 發表在 痞客邦 留言(0) 人氣()