ZCR/bLOG


[PC] 音無しPC

2012年06月30日 11時 更新

某仕事場関連機関の担当K、「動画見せ用のノートPC1台なんとかなねすか?」とのご所望。
んな都合よく余ってるPCあるわきゃねーだろ・・と、言いたいところだったが、廃棄予定のHDD無しの旧いノートと、これまた廃棄予定の40GBのHDDが発掘され、これらを合体させて FreeBSDをインストールしてみることにした。とにかく、Netに接続できて動画が観られればよいとのこと。

FreeBSD入れて、# kldload snd_driver し、# cat /dev/sndstat してみると、次のように出る。

FreeBSD Audio Driver (newpcm: 32bit 2009061500/i386)
Installed devices:
pcm0: <Intel ICH6 (82801FB)> (play/rec) default

つまり、検出されたデバイスに対応する ichドライバが組み込まれているわけだ。しかしながら・・肝心の音がさっぱり ぜんぜん まるっきり出てこないのである。

当初、以前書いたような hdaドライバの問題と勘違いし、snd_hdaを明示的に読み込ませてようとしてみたが失敗。そもそも前出の検出メッセージが出ているわけだから ichドライバは正常に読み込まれているっぽい。

おかしいな・・と、思いつつ、並行してKDE等のインストールを進めたが、動画は再生成功したものの、やっぱり音が出ないというマヌケな状態に・・

埒があかず、いったんあきらめかけたが、ここで、もう一度最初から・・と、BIOS設定の初期化からOSインストールまでやり直してみた。やはり音は出ないのだが、ichドライバを読み込ませるとビープ音が止まることを発見。本PCのビープ音は圧電素子等のブザーではなく、スピーカから出る仕様となっている。

まさか・・サウンドドライバ読んだら中身のアンプの電源切れたりして・・しかし、んなバカなことがあろうはずもない・・・と、思ったものの*1、そのバカな考えがアタマの中にモヤモヤと充満。その線でググってみることに。

したっけ、なんと、世の中には special *2な ボードがあり、それらのアンプの電源論理は通常とは逆になっている・・・というお告げが・・な、なんじゃそりゃあ !!

こ、これはビンゴかも・・と、さらにGoogle様にお伺いをたてると、カーネルのソースコードをハックして強制的にアンプの電源を入れるという手法にたどり着いた。なるほど。ドライバの記述に基づいてアンプ電源ON/OFFを行うのはカーネルだからね。

さて、その手法とは、ac97.c の616行目あたりと805行目あたり*3のラインの前に ac97_setflags(codec,AC97_F_EAPD_INV); という行を追加し、次のように修正するというものである。

ac97_setflags(codec,AC97_F_EAPD_INV);
ac97_wrcd(codec, AC97_REG_POWER, (codec->flags & AC97_F_EAPD_INV)? 0x8000 : 0x0000);
ac97_reset(codec);
ac97_wrcd(codec, AC97_REG_POWER, (codec->flags & AC97_F_EAPD_INV)? 0x8000 : 0x0000);

まあ、ノート機だし、これでいいのだけれど、なんとなく美しくない。で、ソースコードをながめていくと、ich.cの1008行目あたりに次のような部分がある。

       /*
        * Turn on inverted external amplifier sense flags for few
        * 'special' boards.
        */
       switch (subdev) {
       case 途中省略
       case 0x82131033:        /* NEC VersaPro VJ10F/BH */
       case 0x82be1033:        /* NEC VersaPro VJ12F/CH */
               ac97_setflags(sc->codec, ac97_getflags(sc->codec) | AC97_F_EAPD_INV);
               break;
       default:
               break;
       }

これって、サブベンダ ID レジスタ*4から判断して該当のカードだったら電源論理を反転させる設定なのでは? てぇことは、case の最後の行に問題のPCの ID レジスタを追加すればOK?

サブベンダ ID レジスタは、pciconfで表示可能。

> pciconf -lv
途中省略
pcm0@pci0:0:30:2: class=0x040100 card=0x82621033 chip=0x266e8086 rev=0x04 hdr=0x00
vendor = 'Intel Corporation'
device = 'VIA AC97 codec incorporated into VT82C686A/B, VT8231, VT8233/A/C, VT835, VT8237/R, VT8251 Southbrid (VIA Technologies Vinyl AC'97 Codec Combo Driver (W)'
class = multimedia
subclass = audio
以下省略

ということで、ich.cのcaseの行の最後に次のように追加した。

       case 0x82be1033:        /* NEC VersaPro VJ12F/CH */
       case 0x82621033:        /* NEC VY16M この行追加 */

しかる後に、カーネルをリコンパイルして再起動すると、やった!! ・・ようやく音が出たのであった。モノはNECの VersaPro VY16M/EX-Xである。まったく、困ったものよ。のうNEC。(^^;)

あとは粛々と xorg KDE4 firefox 各種プラグインをインストールし、/etc/rc.confに ifconfig_rl0="DHCP"と設定して納品。旧いとはいえ、元はWinXP機だったらしく、ウチの1.3GHzノートよりは さくさく動画再生してくれる。

今回は、久々に勉強になった。
Windowsしか使わない方には関係のないハナシではあろうが、ま、こんな世界もあるのよ・・ということで。


*1 ヘッドホンでモニタしてみたが、わりとS/Nが良く、ドライバ読み込みの前後でのノイズ変化は検出することができない。

*2 strange とか weird (^^;)などという表現も多い。

*3 つまり、2箇所ある。

*4 カード(ボード)毎の識別ID。

Tada/JA7KPI : 2012年06月29日(金)

«能代ロケット実験場50周年 最新 6&amp;Down 下見?»
編集