媒体の種類を取るのに、GET CONFIGURATIONコマンドもあるが、Read TOC/PMA/ATIPコマンドでもそれは可能である。
ググったら、こんなサイトに出会った。さすがはLinux。
Index: linux-2.6.7-ck/Documentation/cdrom/00-INDEXのpkt_media_speed()関数で次のようにしている。
/*
* reads the maximum media speed from ATIP
*/
static int pkt_media_speed(struct pktcdvd_device *pd, unsigned *speed)
{
struct packet_command cgc;
struct request_sense sense;
unsigned char buf[64];
unsigned int size, st, sp;
int ret;
init_cdrom_command(&cgc, buf, 2, CGC_DATA_READ);
cgc.sense = &sense;
cgc.cmd[0] = GPCMD_READ_TOC_PMA_ATIP;
cgc.cmd[1] = 2;
cgc.cmd[2] = 4; /* READ ATIP */
cgc.cmd[8] = 2;
ret = pkt_generic_packet(pd, &cgc);
if (ret) {
pkt_dump_sense(&cgc);
return ret;
}
size = ((unsigned int) buf[0]<<8) + buf[1] + 2;
if (size > sizeof(buf))
size = sizeof(buf);
init_cdrom_command(&cgc, buf, size, CGC_DATA_READ);
cgc.sense = &sense;
cgc.cmd[0] = GPCMD_READ_TOC_PMA_ATIP;
cgc.cmd[1] = 2;
cgc.cmd[2] = 4;
cgc.cmd[8] = size;
ret = pkt_generic_packet(pd, &cgc);
if (ret) {
pkt_dump_sense(&cgc);
return ret;
}
if (!buf[6] & 0x40) {
printk("pktcdvd: Disc type is not CD-RW\n");
return 1;
}
if (!buf[6] & 0x4) {
printk("pktcdvd: A1 values on media are not valid, maybe not CDRW?\n");
return 1;
}
st = (buf[6] >> 3) & 0x7; /* disc sub-type */
sp = buf[16] & 0xf; /* max speed from ATIP A1 field */
/* Info from cdrecord */
switch (st) {
case 0: /* standard speed */
*speed = clv_to_speed[sp];
break;
case 1: /* high speed */
*speed = hs_clv_to_speed[sp];
break;
case 2: /* ultra high speed */
*speed = us_clv_to_speed[sp];
break;
default:
printk("pktcdvd: Unknown disc sub-type %d\n",st);
return 1;
}
if (*speed) {
printk("pktcdvd: Max. media speed: %d\n",*speed);
return 0;
} else {
printk("pktcdvd: Unknown speed %d for sub-type %d\n",sp,st);
return 1;
}
}
GET CONFIGURATIONコマンドはCD-RWの速度(Normal/High/Ultra)が取れないので、そのくらいの粒度が必要な場合に使える。また、buffer[6]の落とし方次第で以下のようにも取れる(ようだ)。実際に試していないけど。(w試したら、全然違ったわい!
switch ((buffer[6] >> 6) & 0x01)
{
case 0: // CD-R
case 1: // CD-RW-NS
case 2: // CD-RW-HS
case 3: // CD-RW-US
case 4: // DVD-R
case 5: // DVD-RW
case 6: // DVD+R
case 7: // DVD+RW
}
Comments