2007年02月27日

Multimedia Commands 一覧(コード順)

Multimedia Commands のコード順の一覧も載せておきます。

コマンド名コード内容紹介ページ
TEST UNIT READY0x00デバイスが使用可能か調べる CDB
REWIND0x01巻き戻し CDB
REQUEST SENSE0x03--
FORMAT UNIT0x04--
INQUIRY0x12ドライブの名前やメーカー名などの情報を取得 CDB
START STOP UNIT0x1Bトレイの出し入れを行う CDB
PREVENT ALLOW MEDIUM REMOVAL0x1Eドア/トレイをロック/解除 CDB
READ FORMAT CAPACITIES0x23--
READ CAPACITY0x25--
READ (10)0x28ディスクのデータを読む CDB
WRITE (10)0x2Aメディアにデータを焼く CDB
SEEK (10)0x2B--
WRITE AND VERIFY (10)0x2E--
VERIFY (10)0x2Fデータを読み取れるか確かめる CDB
SYNCHRONIZE CACHE0x35書き込みを最後まで確実に行う CDB
WRITE BUFFER0x3B--
READ BUFFER0x3C--
READ TOC/PMA/ATIP0x43CDのトラックのリストを取得 CDB, 0000b, 0010b
GET CONFIGURATION0x46現在入っているメディアの種類と、ドライブが読み書きできるメディアの種類などを取得 CDB, Data, 0x00
GET EVENT STATUS NOTIFICATION0x4A--
READ DISC INFORMATION0x51ディスクの容量や空か消去可能かなどの情報を取得 CDB, Data
READ TRACK INFORMATION0x52--
RESERVE TRACK0x53DVDメディアにこれから書き込む容量を設定 CDB
SEND OPC INFORMATION0x54ディスクを焼くときにレーザーの出力を調整する CDB
MODE SELECT (10)0x55ドライブの書き込み方法やエラーに対する対応を設定 CDB, 0x01, 0x05(1), 0x05(2)
REPAIR TRACK0x58--
MODE SENSE (10)0x5Aドライブの書き込み方法やエラーに対する対応を取得 CDB, 0x01, 0x2A
CLOSE TRACK SESSION0x5B--
READ BUFFER CAPACITY0x5Cドライブのバッファの空き容量を調べる CDB
SEND CUE SHEET0x5DCDを焼くときにトラックのリストを設定 CDB, Data1, Data2
BLANK0xA1メディアを消去、初期化 CDB
SEND KEY0xA3--
REPORT KEY0xA4--
LOAD/UNLOAD MEDIUM0xA6--
SET READ AHEAD0xA7--
READ (12)0xA8--
WRITE (12)0xAA--
GET PERFORMANCE0xACメディアの読み取り、書き込み可能な速度などを取得 CDB, Header, 0x00, 0x03
READ DISC STRUCTURE
(READ DVD STRUCTURE)
0xADDVD以降のディスクの種類や各層の容量を取得 CDB, 0x00, 0xFF
SET STREAMING0xB6--
READ CD MSF0xB9時間アドレスで指定した位置からCDのデータを読む CDB
SET CD SPEED0xBBディスクの読み書き速度を設定 CDB
MECHANISM STATUS0xBD--
READ CD0xBE論理アドレスで指定した位置からCDのデータを読む CDB, (2), (3)
SEND DISC STRUCTURE
(SEND DVD STRUCTURE)
0xBFDVD(以降)を焼くときに、1層目の容量(多層ディスク)や日時(DVD-R)を設定 CDB, 0x20


抜けているコードの中には、定義されていないものだけではなく、ドライブメーカーが独自に割り当てているコマンドや、消えてしまったコマンドもあります。
posted by 七癖 at 10:22| Comment(0) | TrackBack(0) | Multimedia Commands | このブログの読者になる | 更新情報をチェックする

2007年02月25日

Multimedia Commands 一覧 (アルファベット順)

とりあえず、紹介する予定であったコマンドは一通り説明したので、 改めて一覧を載せておきます。 なお、このブログでは説明していないコマンドも、全てではありませんが名前とコードのみ載せておきます。

コマンド名コード内容紹介ページ
BLANK0xA1メディアを消去、初期化 CDB
CLOSE TRACK SESSION0x5B--
FORMAT UNIT0x04--
GET CONFIGURATION0x46現在入っているメディアの種類と、ドライブが読み書きできるメディアの種類などを取得 CDB, Data, 0x00
GET EVENT STATUS NOTIFICATION0x4A--
GET PERFORMANCE0xACメディアの読み取り、書き込み可能な速度などを取得 CDB, Header, 0x00, 0x03
INQUIRY0x12ドライブの名前やメーカー名などの情報を取得 CDB
LOAD/UNLOAD MEDIUM0xA6--
MECHANISM STATUS0xBD--
MODE SELECT (10)0x55ドライブの書き込み方法やエラーに対する対応を設定 CDB, 0x01, 0x05(1), 0x05(2)
MODE SENSE (10)0x5Aドライブの書き込み方法やエラーに対する対応を取得 CDB, 0x01, 0x2A
PREVENT ALLOW MEDIUM REMOVAL0x1Eドア/トレイをロック/解除 CDB
READ (10)0x28ディスクのデータを読む CDB
READ (12)0xA8--
READ BUFFER0x3C--
READ BUFFER CAPACITY0x5Cドライブのバッファの空き容量を調べる CDB
READ CAPACITY0x25--
READ CD0xBE論理アドレスで指定した位置からCDのデータを読む CDB, (2), (3)
READ CD MSF0xB9時間アドレスで指定した位置からCDのデータを読む CDB
READ DISC INFORMATION0x51ディスクの容量や空か消去可能かなどの情報を取得 CDB, Data
READ DISC STRUCTURE
(READ DVD STRUCTURE)
0xADDVD以降のディスクの種類や各層の容量を取得 CDB, 0x00, 0xFF
READ FORMAT CAPACITIES0x23--
READ TOC/PMA/ATIP0x43CDのトラックのリストを取得 CDB, 0000b, 0010b
READ TRACK INFORMATION0x52--
REPAIR TRACK0x58--
REPORT KEY0xA4--
REQUEST SENSE0x03--
RESERVE TRACK0x53DVDメディアにこれから書き込む容量を設定 CDB
REWIND0x01巻き戻し CDB
SEEK (10)0x2B--
SEND CUE SHEET0x5DCDを焼くときにトラックのリストを設定 CDB, Data1, Data2
SEND DISC STRUCTURE
(SEND DVD STRUCTURE)
0xBFDVD(以降)を焼くときに、1層目の容量(多層ディスク)や日時(DVD-R)を設定 CDB, 0x20
SEND KEY0xA3--
SEND OPC INFORMATION0x54ディスクを焼くときにレーザーの出力を調整する CDB
SET CD SPEED0xBBディスクの読み書き速度を設定 CDB
SET READ AHEAD0xA7--
SET STREAMING0xB6--
START STOP UNIT0x1Bトレイの出し入れを行う CDB
SYNCHRONIZE CACHE0x35書き込みを最後まで確実に行う CDB
TEST UNIT READY0x00デバイスが使用可能か調べる CDB
VERIFY (10)0x2Fデータを読み取れるか確かめる CDB
WRITE (10)0x2Aメディアにデータを焼く CDB
WRITE (12)0xAA--
WRITE AND VERIFY (10)0x2E--
WRITE BUFFER0x3B--


MMC6 を参照して書き出しました。けっこう説明していないコマンドが多いです。 それらの中には、追記やランダム書き込みに使用するコマンドと、キー関係のコマンドがあります。 SET STREAMING と WRITE (12) は説明できるようになりたいです。

それから、 昨今の規格の乱立のため、コマンド名や内容が変わることがよくあります。 なお、ドライブのメーカーがその製品専用のコマンドを用意している場合もありますが、 当然汎用性はありません。

posted by 七癖 at 10:46| Comment(1) | TrackBack(0) | Multimedia Commands | このブログの読者になる | 更新情報をチェックする

2007年02月23日

READ(10)

DVD のデータや CD-ROM のデータ部分のみを読み取るときには、READ(10) コマンドを使います。

READ(10) コマンドの CDB は次のとおりです。

BYTE\bit 7 6 5 4 3 2 1 0
0Operation Code = 0x28
1予約DPO =0FMA予約廃止
2
(MSB)
 
Logical Block Address
 
(LSB)
3
4
5
6予約
7
(MSB)
Transfer Length
(LSB)
8
9Control

FUA (Force Unit Access) が 1 であれば、ディスクから直接読み取ります。
0 であれば、メモリ内のキャッシュがあればそれを使います。

Logical Block Address に読み取りを開始する位置をセクタで指定します。
Transfer Length に読み取るセクタ数を指定します。

データ用のバッファには、読み取ったデータが入ります。
必要な量("Transfer Length" × 1セクタの大きさ(大抵2048) [BYTE])のメモリをあらかじめ確保しておいてください。

posted by 七癖 at 12:05| Comment(0) | TrackBack(0) | Multimedia Commands | このブログの読者になる | 更新情報をチェックする

2007年02月17日

VERIFY(10)

Verify (ベリファイ) は"照合する"という意味らしいのですが、ライティングの世界では、 "ただ読み出せるか確かめる"という意味で使われているようです。 ちなみに Compare (コンペア) は、"比較する" という意味で、 こちらが元データと照らし合わせる為に使われております。 英語の微妙なニュアンスがわからないもので情けないです。
しかしながら、この VERIFY(10) コマンドは、私の使い方が間違っているためか、 上手く働かない場合が多いです。 一応書いておきますが、あまり信用しないでください。 読み出してみてかつデータの確認をするのであれば、READ(10) や、READ CD コマンドなどを 使ったほうが確実です。

VERIFY(10) コマンドの CDB は次のとおりです。

BYTE\bit 7 6 5 4 3 2 1 0
0Operation Code = 0x2F
1予約DPO =0予約BytChk =0廃止
2
(MSB)
 
Logical Block Address
 
(LSB)
3
4
5
6G3tout予約
7
(MSB)
Number of Blocks
(LSB)
8
9Control

Logical Block Address がベリファイを開始する位置です。
Number of Blocks がベリファイを行うセクタ数です。 0 だとベリファイを行いません。

G3tout が 0 の場合、処理が終わるまで戻りません(Group 2 Timeouts)。 1 はストリーミング方式で使用します(Group 3 Timeouts)。 実は、タイムアウト関係はよく理解していません。

VERIFY(10) コマンドのエラーは Read/Write Error Recovery Mode Page で決定されます。

posted by 七癖 at 10:42| Comment(0) | TrackBack(0) | Multimedia Commands | このブログの読者になる | 更新情報をチェックする

2007年01月25日

PREVENT ALLOW MEDIUM REMOVAL

PREVENT ALLOW MEDIUM REMOVAL コマンドは、ドライブのドアをロックしたり、ロックを解除するときに用います。

GET CONFIGURATION コマンドの CDB は次のとおりです。

BYTE\bit 7 6 5 4 3 2 1 0
0Operation Code = 0x1E
1予約
2予約
3予約
4予約PersistentPrevent
5予約

Persistent にはとりあえず0を入れておいてください。(よく判りません。)
Prevent = 1 でドアをロック、
Prevent = 0 でロックを解除
します。
posted by 七癖 at 10:36| Comment(0) | TrackBack(0) | Multimedia Commands | このブログの読者になる | 更新情報をチェックする

2007年01月23日

BLANK

-RW メディアを初期化するには、BLANK コマンドを使います。
BLANK コマンドの CDB は次のとおりです。

BYTE\bit 7 6 5 4 3 2 1 0
0Operation Code = 0xA1
1予約IMMED予約Blanking Type
2
(MSB)
 
Start Address/Logical Track Number
 
(LSB)
3
4
5
6予約
7予約
8予約
9予約
10予約
11Control

IMMED が 0 であれば、初期化が終わるまで戻りません。 1 ならば、バックグラウンドで初期化処理を行うと思います。

Blanking Type は、CD-RW と DVD-RW で異なります。 どちらも、0(全フォーマット) と 1(クイックフォーマット) しか使ったことがありませんので、 列挙するに留めておきます。

CD-RW の場合
Blanking TypeNameDescription
000bBlank the discPCA、PMA、リードインからリードアウトまで初期化する
001bMinimally blank the discPMAとディスクのリードイン、最初のトラックのプレギャップのみ初期化する
010bBlank a Track 
011bUn-reserve a Track 
100bBlank a Track Tail 
101bUnclose the last complete session 
110bBlank the last non-empty Session 
111b予約 

DVD-RW の場合
Blanking TypeNameDescription
000bBlank the discRMA、リードインからリードアウトまで初期化する
001bMinimally blank the discリードインとRMAのみ初期化する
010b予約 
011bUn-reserve a Track 
100bBlank a Track Tail 
101bUnclose the last complete session 
110bBlank Session 
111b予約 

Start Address は Blanking Type によって異なります。 Blanking Type = 0, 1 の場合、Start Address は無視されます。

なお、BLANK コマンドでは、データ用のバッファは必要ありません。

私の場合、IMMED = 0、 Blanking Type = 0 or 1 で使っており、経過表示が出来なくて困っています。

似たような名前のコマンドに ERASE(10)(=0x2C) と FORMAT UNIT(=0x04) があります。
ERASE(10) は指定したアドレスのデータを消去するようです。
FORMAT UNIT は相当細かく指定できるようですが、どちらも使ったことはありません。

posted by 七癖 at 10:36| Comment(0) | TrackBack(0) | Multimedia Commands | このブログの読者になる | 更新情報をチェックする

2007年01月19日

READ BUFFER CAPACITY

ドライブが持つバッファの全容量とその時点での空き容量を調べるには、 READ BUFFER CAPACITY コマンドを使います。
READ BUFFER CAPACITY の使い方については、cdrteach や cdm-fix のソースコードなどがこの記事よりもためになります。
READ BUFFER CAPACITY コマンドの CDB は次のとおりです。

BYTE\bit 7 6 5 4 3 2 1 0
0Operation Code = 0x5C
1予約予約BLOCK
2予約
3予約
4予約
5予約
6予約
7
(MSB)
Allocation Length
(LSB)
8
9Control

BLOCK が 0 であれば、容量はバイト単位で得られます。 1 ならば、ブロック単位で得られますが、 こちらをサポートしていないドライブもあります。

Allocation Length には用意したデータバッファの容量をセットします。 12 以上であればきちんと結果が返ってきますが、 それ以下(0を含む)でもエラーにはなりません。


READ BUFFER CAPACITY で得られるデータは、BLOCK が 0 と 1 とで異なります。 BLOCK = 0 では次のとおりです。

BYTE\bit 7 6 5 4 3 2 1 0
0
(MSB)
Data Length (=10)
(LSB)
1
2予約
3予約
4
(MSB)
Length of the Buffer
 
[bytes]
(LSB)
5
6
7
8
(MSB)
Blank Length of Buffer
 
[bytes]
(LSB)
9
10
11

Length of the Buffer がドライブの持つバッファの全容量
Blank Length of Buffer が未使用量=使用可能な量
です。


BLOCK = 1 は使ったことがありませんので、表だけ載せておきます。

BYTE\bit 7 6 5 4 3 2 1 0
0
(MSB)
Data Length (=10)
(LSB)
1
2予約
3予約Block = 1
4予約
5予約
6予約
7予約
8
(MSB)
Available Length of Buffer
 
[bytes]
(LSB)
9
10
11

posted by 七癖 at 19:23| Comment(0) | TrackBack(0) | Multimedia Commands | このブログの読者になる | 更新情報をチェックする

2007年01月11日

REWIND のテスト

REWIND コマンドの動作確認用のサンプルプログラムです。

rewind.cpp

DOSプロンプト上で動きます。
例によって ASPI 専用です。

これを作ってみたのは、REWIND コマンドが CD/DVD ドライブで動作するか確認するためです。

結果は、
メディアが入っていないとエラーになります。
(SK=2, ASC=3A, ASCQ=00 MEDIUM NOT PRESENT)

メディアを認識していれば、一応成功するようです。
IMMED が 0 でも 1 でも、成功します。
でも違いがわかりません。


追伸
posted by 七癖 at 10:19| Comment(0) | TrackBack(0) | Multimedia Commands | このブログの読者になる | 更新情報をチェックする

2007年01月09日

REWIND

Rewind の意味は"巻き戻し(す)"です。 このコマンドは、一応SCSIデバイス共通のコマンドに載っているのですが、 SEQUENTIAL ACCESS DEVICE、つまり磁気テープ以外ではあまり使われないようです。CD/DVD関係の INF-8070 や MMC の仕様書には載っていません。 "せんべえ焼き"では、CD Manipulator に倣って 書き込みが全て終了した後に使用しています。おまじないも込めて。

REWIND コマンドの CDB は、多分次のとおりです。 (SCSI-2 の SEQUENTIAL ACCESS DEVICE と、CD Manipulator のソースを元にしています。)

BYTE\bit 7 6 5 4 3 2 1 0
0Operation Code = 0x01
1予約予約IMMED
2予約
3予約
4予約
5Control

IMMED = 0 と置いて使っています。
IMMED = 1 とすれば、操作の終了を待たずに処理が返ると思われます。

なお、REWIND コマンドでは、データ用のバッファは必要ありません。

小話を一つ
posted by 七癖 at 09:50| Comment(0) | TrackBack(0) | Multimedia Commands | このブログの読者になる | 更新情報をチェックする

2006年12月27日

SEND DISC STRUCTURE - Layer Boundary Information

SEND DISC STRUCTURE コマンドの Layer Boundary Information (Format = 0x20)では、 二層ディスクで一層目の容量を指定するときに使います(らしいです)。

Layer Boundary Information では、次のようにデータを置いて送ります。

BYTE\bit 7 6 5 4 3 2 1 0
0
(MSB)
Structure Data Length
(LSB)
1
2予約
3予約
Layer Boundary Information
4予約
5予約
6予約
7予約
8
(MSB)
 
L0 Data Area Capacity
 
(LSB)
9
10
11

L0 Data Area Capacity に 一層目の容量を設定します。 これは0以上です。 一層目の最後の LBA は L0 Data Area Capacity -1 になります。
L0 Data Area Capacity は 16 の倍数です。16の倍数でない場合、 それ以上の 16 の倍数に設定されます。

二層目は自動的にこれ以下の容量になります。

とはいえ、これを使ったことはありません。 一層の DVD であれば、このコマンドを使う必要はありません。

追伸
posted by 七癖 at 09:29| Comment(0) | TrackBack(0) | Multimedia Commands | このブログの読者になる | 更新情報をチェックする

2006年12月25日

SEND DISC STRUCTURE

SEND DISC STRUCTURE コマンドについて説明しようと思うのですが、実はこのコマンドを使ったことがありません。 なにせ書き込み時に使うコマンドでして、下手に試すことも出来ません。 逆にいえば、最も簡単な1層DVDの書き込みでは、このコマンドを使用する必要がないということです。 話半分に読んでください。

少し古いバージョンだと SEND DVD STRUCTURE となっているこのコマンドは、 書き込みの際に DVD や HD-DVD メディアに情報の設定を行うために使います。 READ DISC STRUCTURE (READ DVD STRUCTURE) と対になっていると言えなくもありません。

SEND DISC STRUCTURE コマンドの CDB は次のとおりです。

BYTE\bit 7 6 5 4 3 2 1 0
0Operation Code = 0xBF
1予約Media Type
2予約
3予約
4予約
5予約
6予約
7Format
8
(MSB)
Parameter List Length
(LSB)
9
10予約
11Control


Media Type は次の通りです。

Media Typeディスクの種類
0x00DVD, HD-DVD
0x01Bru-ray
予約


Parameter List Length には送るデータのバイト数を入れます。

Format で送るデータの種類をセットします。 Format は DVD/HD-DVD と Bru-ray とで異なります。

DVD,HD-DVD
FormatDataDescription
0x04User Specific DataSend User Specific Data to the RMD cache
0x05Copyright ManagementSend data to CPR_MAI in data area cache. (CPM, CGMS, ADP_TY)
0x0FTimestampSend Timestamp data to the Drive
0x20Layer Boundary InformationSend capacity of L0
0x21Shifted Middle AreaSend start logical block address of Shifted Middle Area on L0
0x22Jump Interval sizeSend Jump Interval size of Regular Interval Layer Jump recording
0x23Manual Layer Jump AddressSend logical block address for Layer Jump on L0
0x24Remapping AddressSend logical block address for remapping Anchor Point
0x30Disc Control BlockSend a Disc Control Block
0xC0Write ProtectionSend PWP status

Bru-ray はとりあえず割愛します。
たくさんありますが、しばらくは増え続けるでしょう。
mmc05r03.pdf を元に調子に乗って書き連ねましたが、 Bru-ray、HD-DVD はおろか2層DVDの書き込みすら出来ない私の環境では、 やはり、大半は使えません。

posted by 七癖 at 09:10| Comment(0) | TrackBack(0) | Multimedia Commands | このブログの読者になる | 更新情報をチェックする

2006年12月13日

READ DISC STRUCTURE のテスト

READ DISC STRUCTURE コマンドの動作確認用のサンプルプログラムです。

discstr.cpp

DOSプロンプト上で動きます。
例によって ASPI 専用です。

Format を 10進数 で入力するとそれに応じた結果が返ってきます。
DVD を入れて、まず 255 を入力して一覧を見て、
それから各 Format を見てゆけばよいかと思います。

コードの量がこれまでで最大ですが、Format を出来るだけ多く試そうとしたためです。
結果は、エラーばかりで撃沈しました。

結局、まともに動作するのが
Format = 0x00 (Physical Format Information)
位のものです。
このとき、ImgBurn でディスクを入れたときに見られる情報と同じ情報が見られます。

古いドライブでは、一覧すら見れません。
2層ディスクの書き込みは出来ないので、0x20 番台は試せません。
HD-DVD 関係は言わずもがなです。
CD を入れると、エラーになります。一覧では何も表示されなかったりします。
posted by 七癖 at 10:50| Comment(0) | TrackBack(0) | Multimedia Commands | このブログの読者になる | 更新情報をチェックする

2006年12月11日

READ DISC STRUCTURE - Physical Format Information

READ DISC STRUCTURE コマンドの Format=0x00 では、 メディアの種類や直径といった 今ドライブに入っているメディアの物理的な情報を提供します。
これは、4バイトのヘッダとそれ以降のデータよりなります。

BYTE\bit 7 6 5 4 3 2 1 0
0
(MSB)
DISC STRUCTURE Data Length
(LSB)
1
2予約
3予約
Physical Format Information
4Book TypePart Version
5Disc SizeMaximum Rate
6予約Number of LayersTrackLayer Type
7Linear DensityTrack Density
80x00
9
(MSB)
Starting Physical Sector Number of Data Area
(LSB)
10
11
120x00
13
(MSB)
End Physical Sector Number of Data Area
(LSB)
14
15
160x00
17
(MSB)
End Physical Sector Number in Layer 0
(LSB)
18
19
20BCA予約
21〜2051Media Specific


ヘッダの DISC STRUCTURE Data Length はデータのバイト数です。 但し、DISC STRUCTURE Data Length 自体の大きさ(2バイト)を含みません。

Book Type はメディアの種類を表します。

Book TypeMedia
0000bDVD-ROM
0001bDVD-RAM
0010bDVD-R
0011bDVD-RW
0100bHD DVD-ROM
0101bHD DVD-RAM
0110bHD DVD-R
1001bDVD+RW
1010bDVD+R
予約

Part Version は、メディアのバージョンです。

Disc Size はディスクの直径です。0000b ならば 120mm、0001b ならば 80mm です。

Maximum Rate は読み取りの最速値で、以下のように対応しています。

Maximum RateRead Rate
0000b2.52 Mbps
0001b5.04 Mbps
0010b10.08 Mbps
0011b20.16 Mbps
0100b30.24 Mbps
1111b明記せず
予約

Number of Layers はその面の層の数です。00b は一層、01b は二層です。

Track は 0 のとき Parallel Track Path (PTP)、1 のとき Opposite Track Path (OTP) です。

Layer Type はビット毎に意味があり、その層が書き込み可能かを示します。

BitLayer Type
0Layer contains embossed data
1Layer contains recordable area
2Layer contains rewritable area
3予約

Linear Density はピット長で、次のとおりです。

Linear Densitypit length
0000b0.267 μm/bit
0001b0.293 μm/bit
0010b0.409 to 0.435 μm/bit
0100b0.280 to 0.291 μm/bit
0110b0130 to 0.140 μm/bit
1000b0.353 μm/bit
予約

Track Density はトラックの幅で、次のとおりです。

Track Densitytrack width
0000b0.74 μm/track
0001b0.80 μm/track
0010b0.615 μm/track
0011b0.40 μm/track
0100b0.34 μm/track
予約

Starting Physical Sector Number of Data Area はユーザーデータの開始位置です。 READ(10) や WRITE(10) コマンドで読み書きする場合、この位置が始点 (=0) になります。

Starting Sector NumberMedia Type
30000hDVD-ROM, DVD-R/-RW, DVD+RW, HD DVD-ROM, HD DVD-RAM, HD DVD-R
31000hDVD-RAM
予約

End Physical Sector Number of Data Area はデータの終点です。 End - Starting +1 がそのディスクが持つデータセクタ数、 もしくは書き込み可能なセクタ数になります。

End Physical Sector Number in Layer 0 はメディアが Opposite Track Path (OTP) の場合 に意味があり、一層目のデータの大きさを表します。 メディアが一層、もしくは Opposite Track Path (OTP) でない場合、0 です。

BCA (Burst Cutting Area) が 1 であれば、BCA が存在します(不良セクタがある?)。

Media Specific は大抵 全て 0 です。

posted by 七癖 at 10:37| Comment(0) | TrackBack(0) | Multimedia Commands | このブログの読者になる | 更新情報をチェックする

2006年12月09日

READ DISC STRUCTURE - Disc Structure List

READ DISC STRUCTURE コマンドの Format=0xFF では、今ドライブに入っているメディアが使える READ/SEND DISC STRUCTURE の Format の一覧を提供します。
これは、4バイトのヘッダとそれ以降のデータよりなります。

BYTE\bit 7 6 5 4 3 2 1 0
0
(MSB)
DISC STRUCTURE Data Length
(LSB)
1
2予約
3予約
Disc Structure List
4〜nStructure List

DISC STRUCTURE Data Length はデータのバイト数です。 但し、DISC STRUCTURE Data Length 自体の大きさ(2バイト)を含みません。
Structure List の数 = (Data Length - 2) / 4
となります。

個々の Structure List の大きさは4バイトで、以下のとおりです。

BYTE\bit 7 6 5 4 3 2 1 0
0Format Code
1SDSRDS予約
2
(MSB)
Structure Length
(LSB)
3

Format Code は使える Format です。
SDS が 1 であれば、この Format で SEND DISC STRUCTURE コマンドが使えます。
RDS が 1 であれば、この Format で READ DISC STRUCTURE コマンドが使えます。
Structure Length は、この Format に必要なバッファのバイト数です。ヘッダの4バイトを含みます。

posted by 七癖 at 10:30| Comment(0) | TrackBack(0) | Multimedia Commands | このブログの読者になる | 更新情報をチェックする

2006年12月07日

READ DISC STRUCTURE

少し古いバージョンだと READ DVD STRUCTURE となっているこのコマンドは、 DVD や HD-DVD ディスクそれぞれがもつ固有の様々な情報を 入手するために使います。

READ DISC STRUCTURE コマンドの CDB は次のとおりです。

BYTE\bit 7 6 5 4 3 2 1 0
0Operation Code = 0xAD
1予約Media Type
2
(MSB)

Address
(LSB)
3
4
5
6Layer Number
7Format
8
(MSB)
Allocation Length
(LSB)
9
10AGID予約
11Control


Media Type は次の通りです。

Media Typeディスクの種類
0000BDVD, HD-DVD
0001BBru-ray
0010B〜1111B予約


Allocation Length には受け取るバッファのバイト数を入れます。

Address、Layer Number、AGID は Format によって使い方が変わります。 というより、Format によっては使われません。

つまり、Format に応じて様々な情報を入手できます。 Format は DVD/HD-DVD と Bru-ray とで異なります。

共通
FormatLayer NumberAddressDescription
0xC0予約予約Write Protection Status
0xFF予約予約READ/SEND DISC STRUCTURE capability list

DVD, HD-DVD
FormatLayer NumberAddressDescription
0x00Layer予約Physical Information from the DVD/HD DVD Lead-in area
0x01Layer予約Copyright Information from the DVD Lead-in area
0x02予約予約Disc Key obfuscated by a Bus Key
0x03予約予約Burst Cutting Area information on DVD/HD DVD media
0x04Layer予約Disc Manufacturing Information from the DVD/HD DVD Lead-in area
0x05予約LBACopyright Management information from specified sector
0x06予約予約Media Identifier protected by a Bus Key
0x07h予約Pack NumberMedia Key Block protected by a Bus Key
0x08予約予約DDS information on DVD-RAM/HD DVD-RAM Media
0x09予約予約DVD-RAM/HD DVD-RAM Medium Status
0x0A予約予約DVD-RAM/HD DVD-RAM Spare Area Information
0x0B予約LBADVD-RAM/HD DVD-RAM Recording Type Information is returned from
0x0C予約予約DVD-R/-RW/HD DVD-R RMD in last border-out
0x0Dh予約Start Field Number of RMA blocksSpecified RMD field from last recorded border out on DVD-R/-RW
0x0E予約予約Pre-recorded information from DVD-R/-RW lead-in
0x0F予約予約DVD-R/-RW/HD DVD-R Media Identifier
0x10Layer予約DVD-R/-RW/HD DVD-R Physical Format Information
0x11予約予約ADIP Information
0x12Layer予約Copyright Protection Information from HD DVD Lead-in
0x15LayerStart Copyright sectorCopyright Data Section from HD DVD Lead-in or DVD-ROM 3. adapted to AACS Lead-in
0x19予約予約HD DVD-R Medium Status
0x1A予約Start Field Number of RMD BlockHD DVD-R - Last recorded RMD in the latest RMZ
0x20予約予約DVD+/-R DL - Layer Capacity
0x21予約予約DVD-R DL - Middle Zone start address
0x22予約予約DVD-R DL ・Jump Interval Size
0x23予約予約DVD-R DL - Start LBA of the manual layer jump
0x24予約Anchor Point NumberDVD-R DL - Remapping information of the specified Ancor Point
0x30予約 /
Session number
Content DescriptorDisc Control Block identified by content descriptor
0x31予約PSNRead MTA ECC Block from DVD+MRW disc
0x80予約予約AACS volume identifier
0x81予約予約AACS media serial number
0x82予約予約AACS media identifier
0x83Layer NumberPack NumberAACS media key block
0x90予約予約List of recognized format layers


Bru-ray はとりあえず割愛します。
たくさんありますが、しばらくは増え続けるでしょう。
mmc05r03.pdf を元に調子に乗って書き連ねましたが、 Bru-ray、HD-DVD はおろか2層DVDの書き込みすら出来ない私の環境では、 大半は使えません。 さらに、KEY関係のやばそうなのがちらほらあります。 何故か手元に2層DVD-ROMも見つからないため、 次回以降、Format=0xFF (Format list) と 0x00 (Physical) を説明する予定です。

posted by 七癖 at 17:07| Comment(0) | TrackBack(0) | Multimedia Commands | このブログの読者になる | 更新情報をチェックする

2006年12月03日

RESERVE TRACK

DVD の Disc-at-once 書き込みでは,CD の SEND CUE SHEET ではなく、 RESERVE TRACK コマンドを使います。 RESERVE TRACK コマンドでは、使用するディスクの容量を設定します。

RESERVE TRACK コマンドは、CDB は、パラメータ ARSV によって 容量で指定する場合と位置(LBA)で指定する場合の2種類があります。

ARSV = 0 が先に作られたフォーマットで、容量で指定します。それは次のとおりです。

BYTE\bit 7 6 5 4 3 2 1 0
0Operation Code = 0x53
1予約RMZARSV = 0
2予約
3予約
4予約
5
(MSB)
 
Reservation Size
 
(LSB)
6
7
8
9Control

Reservation Size に書き込むディスクの容量をセクタ単位で入力します。

RMZ は HD DVD-R で使用され、1のとき U-RMZ だそうです。


ARSV = 1 は後から加えられたフォーマットで、使ったことはありません。 古いドライブでは対応していないかもしれません。 容量を最後の論理ブロックアドレスで指定します。

BYTE\bit 7 6 5 4 3 2 1 0
0Operation Code = 0x53
1予約RMZ = 0ARSV = 1
2
(MSB)
 
Reservation LBA
 
(LSB)
3
4
5
6予約
7予約
8予約
9Control

Reservation LBA に最後の位置を記入します。
読める最終アドレスは Reservation LBA -1 になります。

以下、共通項目です。
DVD-R/-RW の場合、1セクタは 2048 バイトです。 その Disc-at-once では Reservation Size と Reservation LBA は同じで、そのまま容量になります。 DVD-R/RW の Incremental や layer jump の使い方もありますが、わからないので割愛します。
DVD+R および +RW DL では、1セクタは 2048 バイトで、 容量は16の倍数になるよう自動的にかさ上げされます。
CD の Session at once ではエラーになります。
CD の Track-at-once での使い方もありますが、やはりわかりません。

なお、RESERVE TRACK コマンドでは、データ用のバッファは必要ありません。

posted by 七癖 at 13:02| Comment(0) | TrackBack(0) | Multimedia Commands | このブログの読者になる | 更新情報をチェックする

2006年11月29日

GET PERFORMANCE のテスト

GET PERFORMANCE コマンドの動作確認用のサンプルプログラムです。

getperfo.cpp

DOSプロンプト上で動きます。
例によって ASPI 専用です。

Performance と Write Speed の一覧が取得できます。

空のメディア以外では、正確な値が出てきません。

あと「せんべえ焼き、もしくはコースターメーカー」では、 使い方が間違っている事がわかりました。 ソースコードを参考にしている方は気をつけてください。

こちらの環境で試した結果を見る。
posted by 七癖 at 10:43| Comment(0) | TrackBack(0) | Multimedia Commands | このブログの読者になる | 更新情報をチェックする

2006年11月27日

GET PERFORMANCE - Write Speed

GET PERFORMANCE コマンドの Write Speed(Type = 0x03)では、 CDB の Data Type は予約です。

Maximum Number of Descriptors には取得できるデータの最大数を指定します。
(確保したバッファのバイト数 - 8) / 16
です。


個々の Write Speed Descriptor は 16 バイトのブロックよりなり、それは次のとおりです。

BYTE\bit 7 6 5 4 3 2 1 0
0 予約 WRCRDDExactMRW
1予約
2予約
3予約
4
(MSB)
 
End LBA
 
(LSB)
5
6
7
8
(MSB)
Lowest Read Speed
 
[kilobytes per second]
(LSB)
9
10
11
12
(MSB)
Lowest Write Speed
 
[kilobytes per second]
(LSB)
13
14
15

一つの Write Speed Descriptor ブロックが一つの選択できる倍速値における速さを示します。

WRC (Write Rotation Control) は次のとおりです。

WRC定義
00B標準
01BCAV
予約

各メディアにおける"標準"は次のとおりです。

CD-R/RWCLV
DVD-R/-RWCLV
DVD-RAMZCLV
DVD+RWCLV
HD DVD-RCLV
HD DVD-RAMZCLV
BDCLV

RDD は 0 です。

Exact が 1 であれば、確実です。0 であれば、採用しない方がいいかもしれません。

MRW は、例えば上書きモードの場合、1 になります。

End LBA は読み書きが可能な終了地点で、要するにメディアの容量です。 一つのメディアでは、全てのブロックの End LBA は同じです。

Lowest Read Speed と Lowest Write Speed は、 その選択できる倍速値におけるもっとも遅い値です。 CLV の場合、これは単純な読み書きの速さです。 ZCLV の場合、もっとも遅い段階の速さで、 最も内側における速さになります。 このため、Lowest Write Speed が同じブロックが幾つも出てくることがあります。

posted by 七癖 at 11:23| Comment(0) | TrackBack(0) | Multimedia Commands | このブログの読者になる | 更新情報をチェックする

2006年11月25日

GET PERFORMANCE - Performance

GET PERFORMANCE コマンドの Performance (Type = 0x00)では、 CDB の Data Type に次のデータをセットします。

BYTE\bit 4 3 2 1 0
Data Type Tolerance Write Except

ここで、
Tolerance :10B = 10%, nominal; 20%, exceptions
       他は予約(デフォルト)
Write:0=読み取りの場合、1=書き込みの場合
Except:00B=標準、01B=全体、10B=例外のみ、11B=予約
です。ただ、00100B しか使ったことがありません。

Starting LBA は、Except=01B のときのみ意味があり、これ以上のLBAでの Performance を取得します。

Maximum Number of Descriptors には取得できるデータの最大数を指定します。
Except=00B の場合、
(確保したバッファのバイト数 - 8)/16
です。


Except=00B の場合、個々の Performance Descriptor は 16 バイトのブロックよりなり、それは次のとおりです。

BYTE\bit 7 6 5 4 3 2 1 0
0
(MSB)
 
Start LBA
 
(LSB)
1
2
3
4
(MSB)
Start Performance
 
[1,000 Bytes/second]
(LSB)
5
6
7
8
(MSB)
 
End LBA
 
(LSB)
9
10
11
12
(MSB)
End Performance
 
[1,000 Bytes/second]
(LSB)
13
14
15

CD の場合、全てのセクタは 2352 バイトとします。

一つの Performance Descriptor ブロックがその区間における読み書きの速さを示します。
Start LBA が区間の開始位置で、そこでの速さが Start Performance
End LBA が区間の終了位置で、そこでの速さが End Performance
です。
CLV の場合、Start Performance と End Performance は同じ値になります。

Except=10B の場合は、使ったことがありませんので、表のみ載せておきます。

BYTE\bit 7 6 5 4 3 2 1 0
0
(MSB)
 
LBA
 
(LSB)
1
2
3
4
(MSB)
Time
(LSB)
5
posted by 七癖 at 09:23| Comment(0) | TrackBack(0) | Multimedia Commands | このブログの読者になる | 更新情報をチェックする

2006年11月23日

GET PERFORMANCE その2

GET PERFORMANCE コマンドで入手できるデータは、 8バイトのヘッダとそれ以降のデータよりなります。

BYTE\bit 7 6 5 4 3 2 1 0
0〜7Performance Header
8〜nPerformance Descriptor(s)


ヘッダの構造は、次のとおりです。

BYTE\bit 7 6 5 4 3 2 1 0
0
(MSB)
 
Performance Data Length
 
(LSB)
1
2
3
4予約WriteExcept
5予約
6予約
7予約

Performance Data Length は、データのバイト数です。 但し、それ自体のバイト数 (4バイト) を含みません。
データブロック数 = (Performance Data Length - 4) / 1データブロックのバイト数
になります。
全データの取得に必要なバイト数とも言えますので、 これを見てメモリを確保しなおせば確実です。

posted by 七癖 at 11:15| Comment(0) | TrackBack(0) | Multimedia Commands | このブログの読者になる | 更新情報をチェックする
×

この広告は90日以上新しい記事の投稿がないブログに表示されております。