SANYO製CD-R/RWドライブでC1/C2訂正数を求めたりする方法

miyuri <miyuri@p2.tcnet.ne.jp>

概要

 CRD-BP1700PでC1/C2訂正数を求めたり、内部温度を得る為のコマンドと注意点について述べる。


1.コマンドと得られるデータの説明
2.SPTIを利用する際の注意点
3.C1/C2訂正数を求める際の注意点

1.コマンドの説明
ベンダユニークなコマンドの一部の説明を次に示す。
適宜、TEST UNIT READYを挿み、KEY_NOTREADYでないことを確認するのを推奨する。
----
startup 1, 2 and 3
0xdf, 0x83, 0x00, 0x00, 0x00, 0x00, 0xff, 0xeb, 0xc0, 0x00
0xdf, 0x89, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
0xdf, 0x90, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00

C1/C2訂正数を求める一連の処理の前に次の手順で送信するのが望ましいと思われる。
read memoryについては後述する。
  startup 1、startup 2、startup 1、startup 2、read memory(9)、read memory(9)、
  startup 2、startup 2、startup 2、startup 3、START STOP UNIT(LOEJ=0, START=1)
----
quit
0xdf, 0xa3, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00

C1/C2訂正数を求める一連の処理を終えたらこのコマンドに続けて
START STOP UNIT(LOEJ=0, START=0)を送信するのが望ましいと思われる。
----
read memory
0xdf, 0x82, segment, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00

指定されたsegmentのデータを読み取る。
データは128[Byte]、LiteOn製の場合はこれより少ない。
----
seek 1, 2 and 3
0xdf, 0xa0, 0x00, minute, second, frame, 0x00, 0x00, 0x00, 0x00
0xdf, 0xa4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
0xdf, 0xa3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00

seek動作を行わせる手順は次の通り。
  seek1、目的の場所+75[frame]のMSFをBCDで指定して送信。
  seek2を送信。
  seek1、目的の場所-75[frame]のMSFをBCDで指定して送信。
  seek3を送信。

必ずしも指定した位置にseek動作が行えるとは限らない。
----
measure next
0xdf, 0x97, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00

現在位置から約75[frame]だけC1/C2訂正数を得る為に読み進める。
しかし、読み進めた後の現在位置が読み進める以前の場所に戻ることもあれば、
75[frame]を大幅に越えて進んでしまう場合もある。
====
segment 5及び9のデータの一部の説明をする。
----
segment 5
0	C1上位バイト
1	C1下位バイト
2	C2上位バイト
3	C2下位バイト
24	温度データ、次のような関数を作って温度を計算する。

bool getTemperature(double& temperature)
{
	BYTE data;
	int i;
	static const BYTE aTable[] =
	{
		0xf2, 0xee, 0xea, 0xe4, 0xde, 0xd6, 0xce, 0xc4,
		0xba, 0xaf, 0xa3, 0x97, 0x8b, 0x7f, 0x73, 0x68,
		0x5d, 0x54, 0x4a, 0x42, 0x3b, 0x34, 0x2e, 0x29,
		0x24, 0x20, 0x1c, 0x19, 0x16, 0x00
	};

	if (!readMemory(5))
		return false;

	data = m_pAspi->getBuffer()[24];

	temperature = -40;

	if (0xf2 <= data)
		return true;

	else if (0 == data)
	{
		temperature = 105;
		return true;
	}

	for (i=0; aTable[i]; i++)
	{
		if (data == aTable[i])
			return true;

		if (aTable[i+1] < data)
			break;

		temperature += 5;
	}

	temperature += 5*(aTable[i]-data) / double(aTable[i]-aTable[i+1]);

	return true;
}
----
segment 9
0	現在位置M(BCD)
1	現在位置S(BCD)
3	現在位置F(BCD)

read measureで読み進めている場合はREAD SUB CHANNELで現在位置を読み出すことはできない。

2.SPTIを利用する際の注意点 調べ直すのが面倒なので省略。 SANYO製ドライブ+SPTIの組み合わせでの問題なので、LiteOn製ドライブかASPIを使えば良い。



3.C1/C2訂正数を求める際の注意点
seek動作が必ずしも指定した位置に対して行われるとは限らない。
measure nextは約75[frame]だけ読み進めるとは限らない。

以上を注意すること。

April 24, 2004  初筆