歡迎您光臨本站 註冊首頁

終於能讓BlackGold II Cannon音效卡在ubuntu8.04下發聲了

←手機掃碼閱讀     火星人 @ 2014-03-26 , reply:0

之前搞了塊BlackGold II Cannon的音效卡,感覺音質不錯。後來由於島谷的倒閉,音效卡的驅動就沒有人繼續維護了。島谷之前曾發布過一個linux下的驅動,可就是基於2.4內核的,在2.6上沒法編譯通過。自從升級到2.6內核后,cannon就一直沒有發過聲。今天裝上ubuntu8.04,啟動是無意中看到發現啟動信息中檢測到了CS46xx的晶元並載入了相關的驅動程序,心裡一陣狂喜,這回應該有戲了吧!

可現實總是那麼殘酷,系統啟動后折騰半天,音箱吱都沒吱一聲,faint~!白高興了一場。奇怪,一樣的晶元怎麼cannon就這麼難伺候呢?靜來分析一下:cannon的不可完全拋開CS4630晶元的公版來設計的,系統能順利檢測到CS46xx晶元並成功載入驅動程序就證明了這一點。那到底是什麼原因導致聲音發不出來呢。瞑思之中,突然想起音效卡之前在windows啟動過程中的一個細節,驅動載入后,機箱里會發出嗒的一聲,系統關閉的時候同樣也有這個聲音,那個是音效卡上繼電器吸合的聲音,而ubuntu載入完驅動后,不曾有過這個聲音。如果估計沒錯的話,現在的情況是萬事俱備,就欠東風了,ubuntu的驅動程序已經正確把cannon驅動起來了,就是由於繼電器沒有閉合,聲音沒法送出來,現在只要想辦法讓繼電器閉合就萬事大吉了!如何讓繼電器閉合呢?島谷之前曾發布過一個linux下驅動代碼中應該能找到些線索。果然,在cs46xx_lib.c中發現下面這段代碼:cannon應該就是使用CS4630的GPIO管腳來控制繼電器的吸合的,把這段代碼添加到系統內核代碼樹的sound/pci/cs46xx/cs46xx_lib.c中,並把cs46xx_t改成struct snd_cs46xx
CODE:
/*
* BlackGold II 5.1 Cannon card - EGPIO is used to enable the external amp.
*/
static void amp_cannon(cs46xx_t *chip, int change)
{
int old = chip->amplifier;
int val1 = snd_cs46xx_peekBA0(chip, BA0_EGPIOSR);

int mask = 0x0;

chip->amplifier += change;
if (chip->amplifier && !old)
{
snd_printdd ("BlackGold II 5.1 Cannon amplifier ON\n");

snd_cs46xx_pokeBA0(chip, BA0_EGPIODR, 0x1ff); /* enable all EGPIO output */
snd_cs46xx_pokeBA0(chip, BA0_EGPIOPTR,0x0 ); /* open-drain on output */
snd_cs46xx_pokeBA0(chip, BA0_EGPIOSR, (val1 & mask) | 0x1fb ); /* status on output */

} else if (old && !chip->amplifier) {
snd_printdd ("BlackGold II 5.1 Cannon amplifier OFF\n");
snd_cs46xx_pokeBA0(chip, BA0_EGPIOSR, (val1 & mask) | 0x0 ); /* disable */
}
}

再把島谷驅動中的這個部分加到系統內核樹的cs46xx_lib.c的結構static struct cs_card_type __devinitdata cards[]的末尾
CODE:
{
.vendor = 0x0425,
.id = 0x0634,
.name = "BlackGold II 5.1 Cannon",
.amp = amp_cannon,
//.mixer_init = BlackGold_mixer_init,
},

重新編譯和安裝內核和模塊,使用新的內核啟動,呵呵,這回終於聽到了久違的cannon的聲音了。(作者:sdecat)

[火星人 ] 終於能讓BlackGold II Cannon音效卡在ubuntu8.04下發聲了已經有548次圍觀

http://coctec.com/docs/linux/show-post-178648.html