NetBSD お遊び日記 (2001年11月)。
$Id: diary-200111.html,v 1.18 2001/12/22 06:31:30 isaki Exp $
≪ 2001年10月 | 2001年12月 ≫

2001/11/04

[x68k/vs] 最近ずっと PRO-II で NetBSD を (カーネルだけ) 起動してたんだけど、久しぶりに X68030 のほうの NetBSD を起動してみた。 何気に IPv6 な NFS マウントで遊んでみたりしてて、 そこにおいてあった wav ファイルを鳴らそうとしたが鳴らなかったので vs ドライバを見てみることにした。

鳴らそうと思ったファイルは 11.025kHz でサンプリングされている。 X68k の ADPCM なら 15.6kHz までは(段階的にだが)再生できるので、 11.025kHz も 10.4kHz モードで再生できるはずなのだが、 現在の vs ドライバはサンプリングレートを2倍にして再生してるもんだから 22.05kHz 扱いになって、そんなレートじゃ再生できねえといって 門前払いになる。

なので vs ドライバでレートを倍にしているのをやめてみる。 半分のレートで再生されるだけでなく音が飛んだりするので 仕方なく数カ月ぶりに再び sys/dev/audio.c を眺めることにする。 見ただけじゃ分からないので今回は日本語でコメント入れながら sys/dev/audio.c の audio_write() とにらめっこしてみる。 まあ前回見た時はおうちに NetBSD/x68k しか UNIX がなくて (UNIX での)日本語入力環境がなかったともいうが。 しかし、おかしなところは見当たらなかった。じゃあ割り込み側かなあ。


2001/11/10

[x68k/ne_intio] Nereid のイーサネット部分の コードを commit する準備にかかる。

[x68k/vs] 先週に引続き、audio ドライバを眺めていた。 何気なく dev/ic/msm6258.c を読んでいたら、なんと msm6258_ulinear8_to_adpcm() にバグを見つけた。 この関数は2*nサンプル分の 8bit リニア PCM のデータ (2*nバイト) から 4bit ADPCM のデータ (nバイト) を作るルーチンなんだけど みのうらさんが commit したやつは各バイトを2度読みして1バイト作っている。 これだと、音が2倍に間延びする変わりに sw_code を通してもバイト数が 変化しない。 だから vs 側でサンプリングレートを2倍に上げることで 正常に再生されてたのね。うーん、バグが重なるって美しい。 なので2度読みを修正して、vs のサンプリングレートを2倍に上げるところも 1倍のままにすると、okiadpcm0 ドライバ時代のバグがきれいに再現した。 ああ、やっと4月末の段階まで戻ってきた。 さあて、これからが audio ドライバ改造の本番だねえ。

[x68k/vs] やはりかなり根が深い問題だということは分かった。 ユーザランドから読み込んだデータの例えば半分のサイズのデータを リングバッファに格納するということは、 読み込みポインタがバッファの末尾まで来たら先頭に 戻すといういつもの処理が書けないのだ。 バッファの後ろに空き領域を作っておいてそこから先には inp が 進まないような構造にしないといけない。うーん、ややこしいぞ。


2001/11/11

[x68k/ne_intio] Nereid のイーサネット部分を commit する。

[x68k/vs] 境界や断片をうまく処理できずカーネルが 死に気味だったので、仕方なく途中にもう一段バッファをかましてみた。 というかこっちの方が明らかに実装が簡単だし。 おおう、ちゃんとノイズ乗らずに再生できてるぜ。 と思ったら時々バッファ踏み倒してるのかな。 再生時間は同じなのに同じ箇所を再生してることがある。 しかしこんなに変更して認められるんかなあ。

[x68k/ne_intio] 外人さん(developerの人)から今日 commit した Nereid についてメールが来た。Nereid を NE2000 だと思わずに Nereid だから ne0 という名前にしたのだとおそらく勘違いして、 ne って名前はすでに MI ドライバにあるからその名前どうなん、て いうものだった。そういや Nereid が NE2000 使ってるって 一言も書かなかったなあ。ごめんね、外人さん。

[x68k/vs] バッファの計算間違えてただけだった。 という訳で vs ドライバの前身の okiadpcm ドライバで最初に何かしらの音が出て から8カ月、ようやく念願の mulaw とリニア PCM の (正しい) 再生に成功した。 しかし変更点大きすぎるなあ。どうやって英語でバトルしよう...。

[x68k/vs] 調子に乗って 4分周までの周波数変換(ていうのか?)を 実装してみる。 これで 74.4kHz までのリニア PCM が再生できるぞ :-)。 ということで念願の MP3 を再生してみる。

う゛、、、3秒くらいに1回0.5秒だけずつ音が出る。 デコードが間に合ってねえー(68030/30MHz)。


2001/11/13

[x68k/vs] さすがに昨日までの vs の改造はハチャメチャすぎるので とりあえず、公共性の高いデバッグメッセージの改良と query_encoding() の 改良だけ commit する。


2001/11/15

[x68k/vs] vs ドライバが非常に快適に動作しているが、 これをいつまでも一人で楽しんでいても仕方ないので、 この修正を MI audio ドライバに採用してもらうべく tech-kern あたりへの投稿用の文章を英作文する。かなり泣きそう(笑)。 うーん、日本語ですら説明しづらいのになあ。しかもコードもへぼいし。 さて、これを投稿したとして、英語が理解してもらえないに1万票。 私が英語が書けないあまりに、かなりはしょって書いたので 技術的に理解してもらえないに10万票。 誰かが返事をくれたとしてもその英語が読めないに100万票。

[i386/freebsd] FreeBSD 版の today を /usr/local/bin に おいて、やっとログイン時に today が見れる環境が復活 :-)。 エミュレーション万歳。


2001/11/18

[x68k/vs] audio ドライバの修正を yds(port-i386) でも試してみた。 見事に音が出なかったのでびっくりしたが、1箇所初期化し忘れてた。

[MI/midi] 今まで全く知らなかったのだが midiplay(1) という コマンドを発見した。MIDI ファイルを渡してやるとちゃんと鳴らせるでは ないか。すげー。さすが NetBSD。 でも鳴らないファイルもあるのね。その辺はさすがに自前で音源持ってて PCM 合成する timidity のようにはいかないけど、お手軽だなー。 これは x68k でも OPM(YM2151) のドライバ書くしかないでしょう。

[x68k/opm] ということでまた別スレッドが立ち上がってしまった。 いきなり OPM のドライバ書くのはたいぎいので、とりあえず OPL として認識させてみる。アタッチルーチン書くだけなので30分くらいで 書き上がる。

[x68k/etc] 早速試してみようと X68030 を起動する。 見慣れない dmesg が出ている。あら /home やってる外付け SCSI HD が ご機嫌斜めで sd1 が認識できない。 ちょっと冷えてきたところにもって1週間稼働させてなかった からかなあ。やっぱ冬は常時稼働して乗り切らないと駄目なのね。 ということはもっと怪しげな hdc 実験用 HDD も電源入れてみないと いかんなあ。夏に Nereid が届いてからというもの1回も電源入れてないや。 冬は越せるか。(Dash村みたいだ(笑))

[x68k/opm] さすがに即席すぎて無理があった。 OPL2 か OPL3 かをちゃんとチェックしてるので OPM はアタッチできなかった。 最初からコードかマニュアル読めよ。 まあとりあえずやってみるのを楽しんでるからいいんだけど。 ということで、次回からはちゃんと opm.c の前面書き換えに挑戦だな。 その前に fd と vs が opm に依存してるのを切り離したほうがいいかな。 ああ、でも OPM はレジスタ読みだせないので1箇所で集中管理しないと いけないんだよなあ。困ったなあ。 NetBSD がデバイスの親を複数サポートしてくれないかなあ。

[x68k/etc] なんとなく x68k での私的 TODO。 改めて並べると多いな(笑)。


2001/11/24

[x68k/MMU] Nereid のおまけメモリについて構想中。 つーか、仮想記憶が分からんのでまったく話にならない。 ウェブをみても仮想記憶の解説はあまり載ってないし、そういう本も もってない。いや大学の教科書くらいならもってるけど所詮 授業でやるのって上辺だけで実用的じゃない。 今までで一番役にたったのって高専の時の放課後に菅原さんと 雑談してたことかな。あれが一番実用的で勉強になった。

[x68k/commit] と思ってソース読んでたら sys/arch/x68k/x68k/pmap.c に typo を発見した。 grep すると m68k port 全体でまんべんなく同じ箇所が typo してたので全部修正して commit する。

[x68k/ne_intio] Nereid を 1.5.x に backport する。 おうち CVS リポジトリへの import の仕方がまずくて お手軽 MFC (FreeBSD 用語) できない構造になってしまっていた。むう。 と思いつつ、1.5.2 と -current なんて x68k-port はほとんど 変わってないはずなので cvs update -j 使って作ってみる。

[x68k/ne_intio] NE2000 のアタッチ方法が変わってた...。 まあ neptune.c を見て即解決。


2001/11/25

[x68k/etc] X68030 の外付け HDD がお亡くなりになったので 恐くなって X68000 PRO-II につながっている2台の HDD も数カ月ぶりに 火をいれてみた。ちゃんと動いた。よかったよかった。

[x68k/opm] OPM で MIDI を鳴らそうと思い立った。 でコードを眺めてたら、OPM のレジスタ回りが結構面倒なことに気づいた。 OPM のレジスタは fdc (FDコントローラ) と vs (ADPCM) も使用しているため fdc0 か vs0 を使う場合 opm0 は無効にできない。 それと OPM のレジスタは読み込みができないため、 ドライバ側で値を一元管理しておく必要がある。 とか考えてると OPM のレジスタを bus_space で実装すると きれいかなーと思い始めた。 そこで、そのあたりのソースを読んでて気づいたけど、 今の intio0 って bus_space_read_1 とかは埋め込みでマクロに なってるのね。これじゃ他の bus_space は実装できないじゃん。 要大改造。

[x68k/hdc] X68000 PRO-II に火をいれたついでに 久しぶりに hdc カーネルを コンパイルしなおして起動してみた。 あら、前より早い地点で固まったぞ。うーむ。先は長い。

[x68k/slhci] それはさておき、こちらも久しぶりに Nereid の USB 部分を再開する。こないだ bsd-usb メーリングリストで SL811HST のドライバ書いてますなんて言ったのでちょっと焦る。 ドライバ名は ohic, uhci に倣って slhci。うーん単純。

[x68k/slhci] USB 1.1 の仕様書を読む。 やっと一番最初にだすべきパケットの構造が分かった。


≪ 2001年10月 | 2001年12月 ≫
井崎のホームページへ戻る
isaki@NetBSD.org / isaki@x68k.net