FreeBSD on
ThinkPad i1620
〜 ThinkPad i1620 で、FreeBSD を使おう 〜
注意)この記事は、FreeBSD 4.4R の時のものです。
ポータブルな 8倍速以上のCD-R が欲しいと思って探していたけれども、どれもこれも、USB接続なやつばかりで、6倍速どまりのものしか見当たりません。
そんな時、panasonic製の KXL-CB10AN というのをみつけました。
PC-CARD接続で x8/x4/x24 となっており、しかもDVD-ROM とのコンボドライブになっています。
かなり値が張りますが、ATAPI接続/Card-BUS/16bit の切り替え可能/LINUXでは使えたらしい、という情報を仕入れたので、さっそく買ってきました。
残念ながら、カードを認識してくれません。
まあ、おそらく、ATAPIかなんかの接続だろう、ということで、
/etc/pccard.conf を作成して、
card "KME" "KXLC006"と記述して、再起動を行ないました。(再起動しなくても、# kill -HUP `cat /var/run/pccardd` でいいんだけど……)
config auto ata ?
これで、PCCARDを挿入すれば、/dev/acd0c として認識されました。good !
補足)KXL-CB10ANを使って、CD の読み込み、CD-R の読み書き、CD-RW の読み書きを行いましたが、特に問題はありませんでした。(CD-Rへは8倍速、CD-RWへは4倍速での書き込みがとりあえず出来ています)
なお、ウルトラベースX2 をドッキングして起動した場合、ウルトラベースX2のCDが、/dev/acd0c となり、KXL-CB10AN は、/dev/acd1c になります。
なお、/dev/acd1c のデバイスファイルがない場合は、デバイスを作る必要があります。(多分、あるはず)# cd /dev
# ./MAKEDEV acd1
しかし、DVD-ROM のファイルにアクセスしたとたんに、リブートしてしまいました。
何種類かのDVD-ROMを試してみましたが、いずれもpage fault でpanicし、リブートがかかります。
(もっとも、必ずpanic するわけではなく、特定のファイルをアクセスしたときに、panic
します。これはどのDVD-ROMでも同じです。)
なんとかうごかないか?インターネットで検索してみましたが、特に情報はありません。
4.3R では動いていたのだから、4.4R で変更されたところを調べればわかるのでは?ふと考え、無謀にもカーネルソースを見比べました。
・・・なんじゃこら。わけわからん。まあ、カーネルソースなんざ一度も読んだことがないので、当然でしょう。
とりあえず、/sys/dev/ata/ 以下のファイルを、4.3R と 4.4R とで見比べてみました。
何個所か変更されているようですが、何をどう変更したのかさっぱりわかりません。
4.3R のソースを、4.4Rに突っ込んだら、動くのでは?めちゃくちゃな考えが頭をよぎり、/sys/dev/ata/ 以下のファイルを4.3Rのソースに差し替え、カーネルの再構築を行いました。コンパイルは問題なく終わり、早速再起動。
動いた………なんと、panic せずに DVD-ROM が読めるようになりました。
やった! というか、いいのか???
しかし処理内容は不明のままで、これによりどんな副作用がでるのかは不明です。
--- /sys/dev/ata/atapi-cd.c Wed Aug 29 02:56:14 2001
+++ /sys/dev/ataNEW/atapi-cd.c Fri Jan 11 13:10:39 2002
@@ -1246,8 +1246,21 @@
}
cdp->toc.hdr.len = ntohs(cdp->toc.hdr.len);- cdp->block_size = (cdp->toc.tab[0].control & 4) ? 2048 : 2352;
- cdp->disk_size = ntohl(cdp->toc.tab[cdp->toc.hdr.ending_track].addr.lba);
+ {
+ struct {
+ u_int32_t volsize; /* volume size in blocks */
+ u_int32_t blksize; /* block size in bytes */
+ } info;
+
+ bzero(ccb, sizeof(ccb));
+ ccb[0] = ATAPI_READ_CAPACITY;
+ if (atapi_queue_cmd(cdp->atp, ccb, (caddr_t)&info, sizeof(info),
+ ATPR_F_READ, 30, NULL, NULL))
+ bzero(&info, sizeof(info));
+
+ cdp->disk_size = ntohl(info.volsize);
+ cdp->block_size = (cdp->toc.tab[0].control & 4) ? 2048 : 2352;
+ }#ifdef ACD_DEBUG
if (cdp->disk_size && cdp->toc.hdr.ending_track) {
(でもなんか、コンパクトフラッシュを挿入すると、抜く時にハングしてしまう。副作用か?)
でも、今回のことで、「ソースが公開されているので、トラブってもなんとかなる
!!」ということが実体験できました。
やっぱり、オープンソースっていいですね〜。
なお、FreeBSD 4.5R では当然、なんの問題もなく使えています。