9.1.1. bttv 驅動

9.1.1.1. bttv 和聲音迷你指南

現在有大量基於 bt848/849/878/879 的板卡可用。讓影片工作通常不是什麼大問題,因為這完全由 bt8xx 晶片處理,該晶片在所有板卡上都很常見。但是聲音在每個板卡上的處理方式略有不同。

為了正確處理採集卡,bttv-cards.c 中有一個數組 tvcards[],其中包含每個板卡所需的資訊。只有使用正確的條目,聲音才能工作(對於影片,通常沒有區別)。bttv 驅動程式會在核心日誌中列印一行,說明使用的卡型別。 像這樣

bttv0: model: BT848(Hauppauge old) [autodetected]

您應該驗證這是正確的。 如果不是,則必須將正確的板型別作為 insmod 引數傳遞,例如 insmod bttv card=2。 檔案 BTTV 卡列表 列出了 card 的有效引數。

如果您的卡未在此處列出,您可以檢查原始碼中尚未列出的新條目。 如果沒有適用於您的卡,您可以檢查現有條目之一是否適用於您(只需反覆試驗......)。

一些板卡有一個額外的處理器用於聲音,以進行立體聲解碼和其他不錯的功能。 例如,Hauppauge 使用 msp34xx 晶片。 如果您的板卡有,您可能需要載入一個輔助模組,如 msp3400,以使聲音工作。 如果沒有適用於您的板卡上使用的晶片:運氣不好。 開始編寫一個新的。 好吧,您可能想先檢查一下 video4linux 郵件列表存檔......

當然,您需要正確安裝的音效卡,除非您將揚聲器直接連線到採集卡。 提示:也要檢查混音器設定。 例如,ALSA 預設情況下會靜音所有內容。

9.1.1.1.1. 聲音如何工作(詳細)

仍然無法工作? 看起來需要進行一些驅動程式駭客攻擊。 以下是為您準備的自助說明。

bt8xx 晶片有 32 個通用引腳和用於控制這些引腳的暫存器。 一個暫存器是輸出使能暫存器 (BT848_GPIO_OUT_EN),它說明了哪些引腳由 bt848 晶片主動驅動。 另一個是資料暫存器 (BT848_GPIO_DATA),您可以在其中獲取/設定這些引腳的狀態。 它們可以用於輸入和輸出。

大多數採集卡供應商使用這些引腳來控制外部晶片,該晶片執行聲音路由。 但是每個板卡都略有不同。 一些公司也使用這些引腳來驅動遙控接收器晶片。 一些板卡使用 i2c 匯流排而不是 gpio 引腳來連線 mux 晶片。

如上所述,有一個數組儲存每個已知板卡所需的資訊。 您基本上必須為您的板卡建立新的一行。 重要的欄位是這兩個

struct tvcard
{
      [ ... ]
      u32 gpiomask;
      u32 audiomux[6]; /* Tuner, Radio, external, internal, mute, stereo */
};

gpiomask 指定哪些引腳用於控制音訊 mux 晶片。 輸出使能暫存器 (BT848_GPIO_OUT_EN) 中的相應位將被設定,因為這些引腳必須由 bt848 晶片驅動。

audiomux[] 陣列儲存不同輸入的資料值(即,對於調諧器/靜音/...,哪些引腳必須為高/低)。 這將被寫入資料暫存器 (BT848_GPIO_DATA) 以切換音訊 mux。

您必須做的是找出 gpiomask 和 audiomux 陣列的正確值。 如果您有 Windows 並且安裝了您的卡的驅動程式,您可以檢查是否可以讀取 Windows 驅動程式使用的這些暫存器值。 可以從 http://btwincap.sourceforge.net/download.html 獲得執行此操作的工具。

您也可以在 Windows 應用程式的 *.ini 檔案中挖掘。 您可以查看板卡,以檢視哪些 gpio 引腳已連線,然後開始反覆試驗...

從 0.7.41 版本開始,bttv 有一些 insmod 選項,可以更輕鬆地進行 gpio 除錯

bttv_gpio=0/1

啟用/停用 gpio 除錯訊息

gpiomask=n

設定 gpiomask 值

audiomux=i,j,...

設定 audiomux 陣列的值

audioall=a

設定 audiomux 陣列的值(所有陣列元素的一個值,可用於檢查特定值的影響)。

使用 bttv_gpio=1 列印的訊息如下所示

bttv0: gpio: en=00000027, out=00000024 in=00ffffd8 [audio: off]

en  =   output _en_able register (BT848_GPIO_OUT_EN)
out =   _out_put bits of the data register (BT848_GPIO_DATA),
        i.e. BT848_GPIO_DATA & BT848_GPIO_OUT_EN
in  =   _in_put bits of the data register,
        i.e. BT848_GPIO_DATA & ~BT848_GPIO_OUT_EN