9.1.5. pvrusb2 驅動程式¶
作者:Mike Isely <isely@pobox.com>
9.1.5.1. 背景¶
此驅動程式適用於“Hauppauge WinTV PVR USB 2.0”,這是一款 USB 2.0 託管的電視調諧器。 此驅動程式正在開發中。 它的歷史始於 Björn Danielsson <pvrusb2@dax.nu> 的逆向工程工作,其網頁可在此處找到:http://pvrusb2.dax.nu/
由此,Aurelien Alleaume <slts@free.fr> 開始努力建立與 video4linux 相容的驅動程式。 我從 Aurelien 的最後已知快照開始,並將驅動程式發展到現在的狀態。
有關此驅動程式的更多資訊,請訪問:https://www.isely.net/pvrusb2.html
此驅動程式具有很強的層分離。 它們大致是
與裝置的底層線協議實現。
I2C 介面卡實現和 V4L 中其他地方實現的相應 I2C 客戶端驅動程式。
高階硬體驅動程式實現,它協調所有活動,以確保裝置的正確執行。
一個“上下文”層,用於管理驅動程式的例項化、設定、拆卸、仲裁以及與高階介面的互動,因為裝置熱插拔到系統中。
將驅動程式連線到各種已釋出的 Linux API(V4L、sysfs,未來可能還有 DVB)的高階介面。
最重要的剪下層是頂層 2 層之間。 為了確保任何型別的可設想的 API 都可以放在核心驅動程式的頂部,驅動程式進行了大量工作。 (是的,驅動程式在內部利用 V4L 來完成其工作,但這與驅動程式釋出到外部世界的 API 沒有任何關係。)該架構允許不同的 API 同時訪問該驅動程式。 我對 API 有很強的公平感,並且認為將實現和介面彼此隔離是一個良好的設計原則。 因此,雖然現在 V4L 高階介面是最完整的,但 sysfs 高階介面對於類似的功能也能很好地工作,並且我現在看不到任何理由說明為什麼不可能生成可以與 V4L 並排使用的 DVB 高階介面。
9.1.5.2. 構建¶
構建這些模組基本上只是執行“Make”,但是您需要附近的核心原始碼樹,並且您可能還需要首先設定一些控制環境變數,以便將它們與該原始碼樹連線起來。 請參閱此處的 Makefile,以獲取解釋如何執行此操作的註釋。
9.1.5.3. 原始檔列表/功能概述¶
(注意:下面使用的術語“模組”通常指 pvrusb2 驅動程式中鬆散定義的功能單元,與 Linux 核心的可載入模組的概念無關。)
- pvrusb2-audio.[ch] - 這是位於
此驅動程式和 msp3400.ko I2C 客戶端驅動程式(可在 V4L 中的其他位置找到)之間的粘合邏輯。
- pvrusb2-context.[ch] - 此模組實現驅動程式例項的上下文。
其他所有內容最終都繫結到此處實現的資料結構中,或以其他方式在此處例項化。 熱插拔最終在此處協調。 所有高階介面都透過此模組連線到驅動程式。 此模組有助於仲裁每個介面對實際驅動程式核心的訪問,並旨在允許透過多個介面的多個例項進行併發訪問(因此,例如,您可以透過 sysfs 更改調諧器的頻率,同時透過 V4L 將影片流式傳輸到 mplayer 的例項)。
- pvrusb2-debug.h - 此標頭定義了一個 printk() 包裝器和一個掩碼
除錯位定義,用於可以在驅動程式中啟用的各種除錯訊息。
- pvrusb2-debugifc.[ch] - 此模組實現了一個粗略的命令列
面向驅動程式的除錯介面。 除了作為實現手動韌體提取過程的一部分(請參閱前面提到的 pvrusb2 網站)之外,可能只有我使用過它。 它主要是一個除錯輔助工具。
- pvrusb2-eeprom.[ch] - 這是位於
驅動程式和 tveeprom.ko 模組之間的粘合邏輯,該模組本身在 V4L 中的其他位置實現。
- pvrusb2-encoder.[ch] - 此模組實現了與
與 pvrusb2 裝置中的 Conexant mpeg2 編碼器晶片互動所需的所有協議。 它是 ivtv 中相應邏輯的粗略回顯,但是設計目標(嚴格隔離)和物理層(透過 USB 而不是 PCI 代理)的不同足以使此實現必須完全不同。
- pvrusb2-hdw-internal.h - 此標頭定義了核心資料結構
在驅動程式中用於跟蹤與硬體控制相關的所有內部狀態。 核心硬體處理模組之外的任何人都不得使用此標頭。 對驅動程式的所有外部訪問都應透過高階介面之一(例如 V4L、sysfs 等),實際上,即使這些高階介面也僅限於 pvrusb2-hdw.h 中定義的 API,而不是此標頭。
- pvrusb2-hdw.h - 此標頭定義了完整的內部 API,用於
控制硬體。 高階介面(例如 V4L、sysfs)將透過此處工作。
- pvrusb2-hdw.c - 此模組實現各種邏輯位,
處理特定 pvrusb2 裝置的總體控制。 (pvrusb2 裝置的策略、例項化和仲裁屬於 pvrusb-context 的管轄範圍,而不是此處)。
- pvrusb2-i2c-chips-*.c - 這些模組實現了粘合邏輯,以
將各種 I2C 模組連線並配置為連線到 I2C 匯流排。 此檔案有兩個版本。 “v4l2”版本旨在與 V4L 一起在樹中使用,我們在其中僅實現對於純 V4L 環境有意義的邏輯。 “all”版本旨在在 V4L 之外使用,在那裡我們可能會遇到來自 ivtv 或舊核心快照的其他可能“具有挑戰性”的模組(甚至獨立快照中的支援模組)。
- pvrusb2-i2c-cmd-v4l1.[ch] - 此模組實現了通用 V4L1
相容的 I2C 模組命令。 在這裡,pvrusb2 驅動程式內部的狀態更改被轉換為 V4L1 命令,這些命令又被髮送到各種 I2C 模組。
- pvrusb2-i2c-cmd-v4l2.[ch] - 此模組實現了通用 V4L2
相容的 I2C 模組命令。 在這裡,pvrusb2 驅動程式內部的狀態更改被轉換為 V4L2 命令,這些命令又被髮送到各種 I2C 模組。
- pvrusb2-i2c-core.[ch] - 此模組提供了一個實現
核心友好的 I2C 介面卡驅動程式,其他外部 I2C 客戶端驅動程式(例如 msp3400、tuner、lirc)可以透過該驅動程式連線和操作 pvrusb2 裝置中的相應晶片。 透過此處,其他 V4L 模組可以訪問此驅動程式以操作特定部分(這些模組又由粘合邏輯驅動,該粘合邏輯由 pvrusb2-hdw 協調,由 pvrusb2-context 分配,然後最終透過高階介面之一提供給使用者)。
- pvrusb2-io.[ch] - 此模組實現了一個非常低階的
傳輸緩衝區環,需要該緩衝區才能從裝置流式傳輸資料。 此模組是非常低階的。 它僅操作緩衝區,並且不嘗試定義任何策略或機制來說明如何使用這些緩衝區。
- pvrusb2-ioread.[ch] - 此模組分層在 pvrusb2-io.[ch] 之上
以提供可由 read() 系統呼叫 I/O 樣式使用的流式傳輸 API。 目前,這是 pvrusb2-io.[ch] 之上的唯一層,但是此處的底層架構旨在允許使用其他模組實現其他 I/O 樣式,例如 mmap() 的緩衝區或更奇特的緩衝區。
- pvrusb2-main.c - 這是驅動程式的頂層。 模組級別
和 USB 核心入口點位於此處。 這是我們的“main”。
- pvrusb2-sysfs.[ch] - 這是將
pvrusb2 驅動程式連線到 sysfs 的高階介面。 透過此介面,您可以對驅動程式執行所有操作,但實際上無法流式傳輸資料。
- pvrusb2-tuner.[ch] - 這是位於
驅動程式和 tuner.ko I2C 客戶端驅動程式(可在 V4L 中的其他位置找到)之間的粘合邏輯。
- pvrusb2-util.h - 此標頭定義了一些常用的宏
在整個驅動程式中使用。 這些宏實際上並非特定於驅動程式,但它們必須放在某個地方。
- pvrusb2-v4l2.[ch] - 這是將
pvrusb2 驅動程式連線到 video4linux 的高階介面。 透過此處,V4L 應用程式可以以常用的 V4L 方式開啟和操作驅動程式。 請注意,所有 V4L 功能僅透過此處釋出,而不在其他任何地方釋出。
- pvrusb2-video-*.[ch] - 這是位於
驅動程式和 saa711x.ko I2C 客戶端驅動程式(可在 V4L 中的其他位置找到)之間的粘合邏輯。 請注意,saa711x.ko 過去在 ivtv 中稱為 saa7115.ko。 有兩個版本,一個版本是根據找到的特定 saa711[5x].ko 選擇的。
- pvrusb2.h - 此標頭包含編譯時可調引數
(目前,驅動程式幾乎沒有需要調整的內容)。