top page > PC unix > here

Talk Master II と PC unix との接続 (2)


概要

目的は次のようなものです.

  1. Talk Master II (トークマスター II) と PC unix との USB 接続を例示する.
  2. その接続の成功例,失敗例およびそれらに関連する資料を提示する.

対象は次のものです.

  1. PC は AT 互換機 のみです.(うちの PC-98 には USB port はありません.)
  2. OS は FreeBSD (4.11, 6.2) です.
    (FreeBSD 7.4, 8.2 は Talk Master (3) に,8.4, 10.3 は Talk Master (4) に記します.)
  3. drive は Talk Master II の内蔵メモリーと SD card です.
  4. SD card は,アイ・オー・データ機器の SD-S1G (1GB, Class 6) です.

結果は次のようになりました.

  1. FreeBSD 4.11, 6.2 ともに,そのままでは接続できませんでした.
  2. driver のソースを修正すれば,接続できるようになりました.

注意事項

  1. 以下はあくまで当方の環境にて動作した記録であり,同様の環境にて動作することを保障するものではありません.
  2. PC unix との接続はメーカーの保障の範囲外です. トラブルに関しては自己責任でお願い致します.
  3. この HP の内容に関し,メーカーに問い合わせしないようお願い致します.

目次

1. FreeBSD との接続
1.1 prologue
1.2 接続と最初の問題
1.3 fdisk まで
1.4 mount と第二の問題
1.5 epilogue
2. 資料
3. 補足

1. FreeBSD との接続

1.1  prologue

FreeBSD においては,二つの問題が生じます. すなわち,

  1. Talk Master II と FreeBSD とが,fdiskdd が実行できるようなレベルで繋がらない.
    この問題には CAM や USB driver (umass) を修正して対処できました.
  2. 内蔵メモリが mount ができない. この問題には msdosfs_vfsops.c を修正して対処できました.

以下にこれらの問題の現われ方と対処法とを提示致します.

(注) 少なくとも FreeBSD 6.2 においては,Talk Mastet II の「使用メモリ」を「内蔵メモリ」[INT] にしておく必要があります. 「SD card」[SD] になっていると,3.2 節にて示した問題の対策が効きません. (Linux ではどちらでも大丈夫です.)

1.2  接続と最初の問題

先ず install したそのままの FreeBSD 6.2 に Talk Master II を繋げると,次のような log が出ます.

ohci0: <OHCI (generic) USB controller> mem 0xfea6f000-0xfea6ffff irq 10 at device 15.2 on pci0
(中略)
umass0: YOUNTEL CO.LTD. YMDC-407X UMS DEVICE, rev 1.10/1.00, addr 2
umass0: SCSI over Bulk-Only; quirks = 0x0000
umass0:1:0:-1: Attached to scbus1
da1 at umass-sim0 bus 0 target 0 lun 0     ← こちらは内蔵メモリーの drive です.
da1: < TalkMasterII > Removable Direct Access SCSI-0 device
da1: 1.000MB/s transfers
da1: 997MB (2042880 512 byte sectors: 64H 32S/T 997C)
da2 at umass-sim0 bus 0 target 0 lun 1     ← こちらは SD card の drive です.
da2: < TalkMasterII > Removable Direct Access SCSI-0 device
da2: 1.000MB/s transfers
da2: Attempt to query device size failed: NOT READY, Medium not present     ← SD card が入っていない.

SD card が入っている場合には,この最後の行は次のようになります.

da2: 974MB (1995777 512 byte sectors: 64H 32S/T 974C)

この後,次のような log が続きます.

umass0: BBB bulk-in clear stall failed, STALLED
umass0: BBB bulk-out clear stall failed, STALLED
(da1:umass-sim0:0:0:0): Synchronize cache failed, status == 0x4, scsi status == 0x0
umass0: BBB reset failed, STALLED
umass0: BBB bulk-in clear stall failed, STALLED
umass0: BBB bulk-out clear stall failed, STALLED

/devda1da2 も作られず,最後の三行が間欠的に繰り返し出力され続けます. この段階では fdisk /dev/da1 などは実行できません.

"Synchronize cache failed" に対処するため,/usr/src/sys/cam/scsi/scsi_da.c を修正し SYNCHRONIZE_CACHE を使わないようにします.

(FreeBSD 4.11 ではさらに /usr/src/sys/dev/usb/umass.c の修正も必要です. この修正なしに Talk Master II を繋げると shutdown ができなくなり,またそれを抜くと OS が落ちます. FreeBSD 6.2 ではこの問題は生じません.)

それらの修正のための patch はここです.tm2.tgz

1.3  fdisk まで

この修正をして kernel を再構築すれば,接続時に /dev/da1, /dev/da1s1 が作成され,fdisk /dev/da1 も実行できるようになります.

# fdisk /dev/da1
******* Working on device /dev/da1 *******
parameters extracted from in-core disklabel are:
cylinders=997 heads=64 sectors/track=32 (2048 blks/cyl)

parameters to be used for BIOS calculations are:
cylinders=997 heads=64 sectors/track=32 (2048 blks/cyl)

Media sector size is 512
Warning: BIOS sector numbering starts with sector 1
Information from DOS bootblock is:
The data for partition 1 is:
sysid 6 (0x06),(Primary 'big' DOS (>= 32MB))
    start 485, size 2042395 (997 Meg), flag 80 (active)
        beg: cyl 0/ head 7/ sector 38;
        end: cyl 999/ head 31/ sector 0
The data for partition 2 is:
<UNUSED>
The data for partition 3 is:
<UNUSED>
The data for partition 4 is:
<UNUSED>

同様に,SD card が入っている場合には fdisk /dev/da2 が実行できます.

# fdisk /dev/da2
******* Working on device /dev/da2 *******
parameters extracted from in-core disklabel are:
cylinders=974 heads=64 sectors/track=32 (2048 blks/cyl)
(中略)

The data for partition 1 is:
sysid 6 (0x06),(Primary 'big' DOS (>= 32MB))
    start 107, size 1995669 (974 Meg), flag 80 (active)
        beg: cyl 0/ head 1/ sector 45;
        end: cyl 123/ head 254/ sector 63
(以下略)

どちらも heads=64, sectors/track=32 のように本来の値と違っているのが気になります. 実はこれらは /usr/src/sys/cam/cam.c にて意図的に変更されています.

void
cam_calc_geometry(struct ccb_calc_geometry *ccg, int extended)
{
        uint32_t size_mb, secs_per_cylinder;

        size_mb = ccg->volume_size / ((1024L * 1024L) / ccg->block_size);
        if (size_mb > 1024 && extended) {
                ccg->heads = 255;
                ccg->secs_per_track = 63;
        } else {
                ccg->heads = 64;
                ccg->secs_per_track = 32;
        }

ただし,この変更が行なわれた場合には,
start 485beg: cyl 0/ head 7/ sector 38 および
start 107beg: cyl 0/ head 1/ sector 45 とが辻褄が合わなくなります.

1.4  mount と第二の問題

内蔵メモリの mount ですが,次のように失敗します.

# mount_msdosfs -o longnames -m 644 -M 755 /dev/da1s1 /mnt
mount: /dev/da1s1: Invalid argument

一方,SD card の mount成功します.

# mount_msdosfs -o longnames -m 644 -M 755 /dev/da2s1 /mnt
# mount
/dev/da0s1a on / (ufs, local)
devfs on /dev (devfs, local)
/dev/da0s1e on /tmp (ufs, local, soft-updates)
/dev/da0s1f on /usr (ufs, local, soft-updates)
/dev/da0s1d on /var (ufs, local, soft-updates)
procfs on /proc (procfs, local)
/dev/da2s1 on /mnt (msdosfs, local)     ← mount されている.

内蔵メモリの場合のエラーの原因は,pmp->pm_SecPerTrack = 64 であるがゆえに次の if に引っ掛かることです. (SD card がエラーにならないのはこの値が 63 だからです.)

--- sys/fs/msdosfs/msdosfs_vfsops.c.org Wed Dec 20 12:05:30 2006
+++ sys/fs/msdosfs/msdosfs_vfsops.c     Tue May 31 23:38:06 2011
@@ -480,11 +480,11 @@
        if (!pmp->pm_BytesPerSec || !SecPerClust
                || !pmp->pm_Heads
 #ifdef PC98
                || !pmp->pm_SecPerTrack || pmp->pm_SecPerTrack > 255) {
 #else
-               || !pmp->pm_SecPerTrack || pmp->pm_SecPerTrack > 63) {
+               || !pmp->pm_SecPerTrack || pmp->pm_SecPerTrack > 64) {
 #endif
                error = EINVAL;
                goto error_exit;
        }

要するに,cam.c に変更されない Talk Master II 固有の sectors/track の値 (= 64) が使われて,それではダメだと言われるのです. 上記のように 6364 に変更すれば,正常に動作します. (これを試したのは FreeBSD 6.2 のみで,FreeBSD 4.11 では未確認です.)

後で述べますが,この 64 という数値は CHS 方式の表現の規格外です. 上記の patch はそれを認めるように OS 側を修正したものですが,正しくフォーマットし直せば動くか否かも確認したいところです. とはいえ,Talk Master II の内蔵メモリーを PC でフォーマットし直す根性はありません.
(メーカーさんの方で heads=64, sectors/track=32 でフォーマットして試していただければ,それが一番楽なのですが.)

/mntls で見てみます. (以下の例では /mnt/TIMERREC を.) タイマー録音で作成される directory/file の日付や時刻は「固定値」です. それらの名前はすべて大文字です. 一方,FreeBSD にてそれらを作成した場合には,作成時の日付,時刻になります. 名前は大文字小文字を区別することができます.

# ls -l /mnt/TIMERREC/*
/mnt/TIMERREC/BOX01:
total 103200
-rw-r--r--  1 root root 9577984 1970-01-01 00:00 01001_070427_0645A0693I.MP3
-rw-r--r--  1 root root 9585152 1970-01-01 00:00 01002_070428_0645A0693I.MP3
-rw-r--r--  1 root root 9563648 1970-01-01 00:00 01003_070430_0645A0693I.MP3

1.5  epilogue

usbdevs, camcontrol の出力は各々次のとおりです.

# usbdevs -v
Controller /dev/usb0:
addr 1: full speed, self powered, config 1, OHCI root hub(0x0000), (0x1166)(0x0000), rev 1.00
 port 1 addr 2: full speed, self powered, config 1, YMDC-407X UMS DEVICE(0x4100), YOUNTEL CO.LTD.(0x0dab), rev 1.00
# camcontrol devlist
<IBM DDYS-T36950N S96H>            at scbus0 target 6 lun 0 (pass0,da0)
< TalkMasterII >                   at scbus1 target 0 lun 0 (da1,pass1)
< TalkMasterII >                   at scbus1 target 0 lun 1 (da2,pass2)

最後に,Talk Master II の USB ケーブルを抜けば,次のような log が出ます.

umass0: at uhub0 port 2 (addr 2) disconnected
(da1:umass-sim0:0:0:0): lost device
(da1:umass-sim0:0:0:0): removing device entry
(da2:umass-sim0:0:0:1): lost device
(da2:umass-sim0:0:0:1): removing device entry
umass0: detached

2. 資料

内蔵メモリーの論理的な仕切りの情報は fdisk を使えば得られますが,「加工」されている場合があります. (実際,Linux でも FreeBSD でもされていました.)
それらの情報を直接取得したい場合は次のようにします. (FreeBSD について例示しますが,Linux でも同様です.)

先ず sector 0 と 485 の内容をファイルに書き出します.

# dd if=/dev/da1   bs=512 count=1 > s0
# dd if=/dev/da1s1 bs=512 count=1 > s485

sector 0 は MBR (Master Boot Record) と呼ばれています. その中身を見ます.

% hexdump -Cv s0
00000000  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
(中略)
000001b0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 80 07  |................|
000001c0  26 00 06 1f c0 e7 e5 01  00 00 1b 2a 1f 00 00 00  |&.........*....|
000001d0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
000001e0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
000001f0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 55 aa  |..............U|

ここで薄青色を付けた部分に 1 番目の partition の情報が書かれています. これは次のように区切ります.

80 07 26 00 06 1f c0 e7 e5 01 00 00 1b 2a 1f 00

07 26 00 の部分は,さらに 10, 6, 8 bit に三分割されます. (いわゆる CHS 方式の表現.)

002607 (hex) = 0000 0000 0010 0110 0000 0111 (bin) = 00, 26, 07 (hex) = 0, 38, 7

各々の意味は次の通りです. (これらは fdisk で表示される内容に一致してしています.)

80          : active である.
07 26 00    : 開始位置は cylinder 0, sector 38, head 7 である.
06          : file system は "Primary 'big' DOS (>= 32MB)" である.
e5 01 00 00 : 開始位置は 1e5 (hex) = 485 sector である.
1b 2a 1f 00 : 大きさは 1f2a1b (hex) = 2042395 sector である.

位置を示すための sector は 0 からでなく 1 から数えます. 従って,開始位置は

0 x (32 x 64) + 7 x 64 + (38 - 1) = 485

であり,二通りの記述は一致していることが確認されます. (順序が逆だが,32, 64 の出所は下記.)

次に sector 485 の中身を見ます. ここは (partition 1 の) Boot Sector と呼ばれています.

# hexdump -Cv s485
00000000  e9 00 00 53 4d 46 53 33  2e 30 00 00 02 40 01 00  |...SMFS3.0...@..|
00000010  02 00 02 00 00 f8 7d 00  40 00 20 00 e5 01 00 00  |......}.@. .....|
00000020  1b 2a 1f 00 00 00 29 00  00 00 00 2d 2d 2d 2d 2d  |.*....)....-----|
00000030  2d 2d 2d 2d 2d 2d 46 41  54 31 36 20 20 20 00 00  |------FAT16   ..|
(中略)
000001f0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 55 aa  |..............U|

ここで薄青色を付けた部分にこの partition の情報が書かれています. 各々の意味は次の通りです,

00 02       : byte/sector   200 (hex) = 512
40          : number of sector        =  64
01 00       : reserved sector         =   1
02          : number of FAT           =   2
00 02       : number of entry         = 512
00 00       : sector on logical image =   0
f8          : media descriptor
7d 00       : number of FAT sector    = 125
40 00       : sectors/track           =  64
20 00       : number of head          =  32
e5 01 00 00 : hidden sector           = 485
1b 2a 1f 00 : size                    = 2042395

同様に,SD card の情報も見てみました. 抜粋すれば次の通りです.

# dd if=/dev/da2s1 bs=512 count=1 > t107
# hexdump -Cv t107
00000000  e9 00 00 53 4d 46 53 33  2e 30 00 00 02 40 01 00  |...SMFS3.0...@..|
00000010  02 00 02 00 00 f8 7a 00  3f 00 ff 00 6b 00 00 00  |......z.?...k...|
00000020  95 73 1e 00 00 00 29 00  00 00 00 2d 2d 2d 2d 2d  |.s....)....-----|
00000030  2d 2d 2d 2d 2d 2d 46 41  54 31 36 20 20 20 00 00  |------FAT16   ..|
3f 00       : sectors/track           =  63
ff 00       : number of head          = 255

参考までに,FreeBSD や Linux を install した HDD はどちらも sectors/track=63, heads=255 で仕切られていました.

FreeBSD にて % man fdisk を見ると次のような記述があります.

             It is an error if the following is not true:

                   1 <= number of cylinders
                   1 <= number of heads <= 256
                   1 <= number of sectors/track < 64

6 bit で表わせる数値の上限が 3f (hex) = 63, 8 bit で表わせる数値の上限が ff (hex) = 255 ですから,これらの制限は当然です.
(head に関しては "1 <= number of heads < 256" の間違いだと思います.)
例え OS の内部では CHS 方式を使っていないにしても,記憶媒体の側にはこの制限に従うようなダミーの値を設定しておくべきでしょう.

3. 補足

FreeBSD 6.2 にて FAT (すなわち VFAT) でフォーマットされた USB メモリーの接続を試みる機会がありましたが,Talk Master II の内蔵メモリーや SD crd と同様に mount することができました.