2. 構建媒體裝置支援

第一步是下載核心原始碼,可以透過特定發行版的原始檔,也可以透過核心主 git 樹[1]

然而請注意,如果

  • 你是個勇者,想嘗試新事物;

  • 如果你想報告一個 bug;

  • 如果你正在開發新的補丁

你應該使用主媒體開發樹的 master 分支

在這種情況下,你可能會在 LinuxTv wiki 頁面上找到一些有用的資訊

2.1. 配置 Linux 核心

你可以透過以下命令訪問核心構建選項選單

$ make menuconfig

然後,選擇所有所需選項並退出,儲存配置。

更改後的配置將位於 .config 檔案中。它看起來像

...
# CONFIG_RC_CORE is not set
# CONFIG_CEC_CORE is not set
CONFIG_MEDIA_SUPPORT=m
CONFIG_MEDIA_SUPPORT_FILTER=y
...

媒體子系統由這些選單配置選項控制

Device Drivers --->
    <M> Remote Controller support  --->
    [ ] HDMI CEC RC integration
    [ ] Enable CEC error injection support
    [*] HDMI CEC drivers  --->
    <*> Multimedia support  --->

Remote Controller support 選項啟用遙控器的核心支援[2]

HDMI CEC RC integration 選項啟用 HDMI CEC 與 Linux 的整合,允許透過 HDMI CEC 接收資料,就如同資料是由直接連線到機器的遙控器產生一樣。

HDMI CEC drivers 選項允許選擇透過 HDMI 介面接收和/或傳輸 CEC 程式碼的平臺和 USB 驅動[3]

最後一個選項 (Multimedia support) 啟用對攝像頭、音影片採集卡和電視的支援。

媒體子系統支援可以與主核心一起構建,也可以作為模組構建。對於大多數用例,首選將其構建為模組。

注意

核心提供了一個指令碼,而不是使用選單,它允許直接啟用配置選項。要使用核心模組啟用媒體支援和遙控器支援,你可以使用

$ scripts/config -m RC_CORE
$ scripts/config -m MEDIA_SUPPORT

2.1.1. 媒體依賴項

應該注意的是,從乾淨配置啟用上述功能通常是不夠的。媒體子系統依賴於其他幾個 Linux 核心支援才能工作。

例如,大多數媒體裝置使用序列通訊匯流排與某些外設通訊。這種匯流排稱為 I²C (Inter-Integrated Circuit)。為了能夠構建對此硬體的支援,必須啟用 I²C 匯流排支援,可以透過選單或使用

./scripts/config -m I2C

另一個例子:遙控器核心需要輸入裝置的支援,可以透過以下方式啟用

./scripts/config -m INPUT

根據你希望啟用的特定驅動,可能還需要其他核心功能(例如 PCI 和/或 USB 支援)。

2.1.2. 啟用遙控器支援

遙控器選單允許選擇特定裝置的驅動。其選單如下所示

--- Remote Controller support
<M>   Compile Remote Controller keymap modules
[*]   LIRC user interface
[*]     Support for eBPF programs attached to lirc devices
[*]   Remote controller decoders  --->
[*]   Remote Controller devices  --->

Compile Remote Controller keymap modules 選項為幾個流行的遙控器建立按鍵對映。

LIRC user interface 選項在使用 lirc 程式時新增增強功能,透過啟用一個 API,允許使用者空間從遙控器接收原始資料。

Support for eBPF programs attached to lirc devices 選項允許使用特殊程式(稱為 eBPF),這些程式將允許應用程式向 Linux 核心新增額外的遙控器解碼功能。

Remote controller decoders 選項允許選擇 Linux 核心將識別的協議。除非你想停用某個特定解碼器,否則建議保持所有子選項啟用。

Remote Controller devices 允許你選擇支援你的裝置所需的驅動。

相同的配置也可以透過 script/config 指令碼設定。因此,例如,為了支援 ITE 遙控器驅動(在 Intel NUC 和某些 ASUS x86 桌上型電腦上找到),你可以這樣做

$ scripts/config -e INPUT
$ scripts/config -e ACPI
$ scripts/config -e MODULES
$ scripts/config -m RC_CORE
$ scripts/config -e RC_DEVICES
$ scripts/config -e RC_DECODERS
$ scripts/config -m IR_RC5_DECODER
$ scripts/config -m IR_ITE_CIR

2.1.3. 啟用 HDMI CEC 支援

當驅動需要 HDMI CEC 支援時,它會自動設定。因此,你所需要做的就是啟用圖形卡或現有 HDMI 驅動的支援。

HDMI 特定驅動在 HDMI CEC drivers 選單中可用[4]

--- HDMI CEC drivers
< >   ChromeOS EC CEC driver
< >   Amlogic Meson AO CEC driver
< >   Amlogic Meson G12A AO CEC driver
< >   Generic GPIO-based CEC driver
< >   Samsung S5P CEC driver
< >   STMicroelectronics STiH4xx HDMI CEC driver
< >   STMicroelectronics STM32 HDMI CEC driver
< >   Tegra HDMI CEC driver
< >   SECO Boards HDMI CEC driver
[ ]     SECO Boards IR RC5 support
< >   Pulse Eight HDMI CEC
< >   RainShadow Tech HDMI CEC

2.1.4. 啟用媒體支援

媒體選單比遙控器選單有更多的選項。一旦選中,你應該會看到以下選項

--- Media support
[ ] Filter media drivers
[*] Autoselect ancillary drivers
    Media device types --->
    Media core support --->
    Video4Linux options --->
    Media controller options --->
    Digital TV options --->
    HDMI CEC options --->
    Media drivers --->
    Media ancillary drivers --->

除非你確切知道自己在做什麼,或者如果你想為 SoC 平臺構建驅動,強烈建議保持 Autoselect ancillary drivers 選項開啟,因為它將自動選擇所需的 I²C 輔助驅動。

現在有兩種方法選擇媒體裝置驅動,如下所述。

2.1.4.1. Filter media drivers 選單

此選單旨在方便 PC 和筆記型電腦硬體的設定。它透過讓使用者指定所需的媒體驅動型別來工作,選項如下

[ ] Cameras and video grabbers
[ ] Analog TV
[ ] Digital TV
[ ] AM/FM radio receivers/transmitters
[ ] Software defined radio
[ ] Platform-specific devices
[ ] Test drivers

因此,如果你只想新增對攝像頭或影片採集卡的支援,只需選擇第一個選項。允許多選。

一旦此選單中的選項被選中,構建系統將自動選擇所需的核心驅動以支援所選功能。

注意

大多數電視卡是混合型的:它們同時支援模擬電視和數字電視。

如果你有一張混合卡,你可能需要在選單中同時啟用 Analog TVDigital TV

使用此選項時,媒體支援核心功能的預設設定通常足以提供驅動的基本功能。但是,你仍然可以使用以下每個 Media support 子選單下的設定手動啟用一些所需的額外(可選)功能

Media core support --->
Video4Linux options --->
Media controller options --->
Digital TV options --->
HDMI CEC options --->

一旦你選擇了所需的過濾器,符合過濾條件的驅動將在 Media support->Media drivers 子選單中可用。

2.1.4.2. 不帶過濾的 Media Core Support 選單

如果你停用 Filter media drivers 選單,所有符合你係統依賴性的可用驅動都將在 Media drivers 選單中顯示。

然而請注意,你應該首先確保 Media Core Support 選單包含了你的驅動所需的所有核心功能,否則相應的裝置驅動將不會顯示。

2.1.5. 示例

為了啟用 此表 中列出的其中一塊板卡的模組化支援,以及模組化的媒體核心模組,.config 檔案應該包含以下行

CONFIG_MODULES=y
CONFIG_USB=y
CONFIG_I2C=y
CONFIG_INPUT=y
CONFIG_RC_CORE=m
CONFIG_MEDIA_SUPPORT=m
CONFIG_MEDIA_SUPPORT_FILTER=y
CONFIG_MEDIA_ANALOG_TV_SUPPORT=y
CONFIG_MEDIA_DIGITAL_TV_SUPPORT=y
CONFIG_MEDIA_USB_SUPPORT=y
CONFIG_VIDEO_CX231XX=y
CONFIG_VIDEO_CX231XX_DVB=y

2.2. 構建和安裝新核心

一旦 .config 檔案包含了所需的一切,構建只需執行 make 命令

$ make

然後安裝新核心及其模組

$ sudo make modules_install
$ sudo make install

2.3. 只構建新的媒體驅動和核心

從開發樹執行新的開發核心通常有風險,因為它可能包含實驗性更改,可能存在 bug。因此,有一些方法可以使用替代樹來只構建新驅動。

有一個 Linux 核心回溯移植專案,它包含了旨在針對穩定核心編譯的較新驅動。

負責維護媒體子系統的 LinuxTV 開發者也維護著一個回溯移植樹,其中只包含從最新核心每日更新的媒體驅動。該樹位於

https://git.linuxtv.org/media_build.git/

需要注意的是,雖然使用 media_build 樹進行測試通常是相對安全的,但不能保證它能在隨機核心上工作(甚至構建成功)。這個樹是根據“盡力而為”的原則維護的,只要我們有時間來修復其中的問題。

如果你發現其中有任何問題,請隨時向 Linux 媒體子系統的郵件列表提交補丁:media@vger.kernel.org。如果你為 media-build 提交新補丁,請在郵件主題中新增 [PATCH media-build]

在使用它之前,你應該執行

$ ./build

注意

  1. 如果 media-build 樹更新了,你可能需要執行兩次;

  2. 如果你過去為與當前使用的核心版本不同的核心版本構建過它,你可能需要執行 make distclean

  3. 預設情況下,它將使用與你正在執行的核心中定義的媒體相同的配置選項。

要選擇不同的驅動或不同的配置選項,請使用

$ make menuconfig

然後,你可以構建並安裝新驅動

$ make && sudo make install

這將覆蓋你的核心之前使用的媒體驅動。