|
Packit |
dd8086 |
/*
|
|
Packit |
dd8086 |
Copyright (C) 2006, 2008-2012
|
|
Packit |
dd8086 |
Rocky Bernstein <rocky@gnu.org>
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
This program is free software: you can redistribute it and/or modify
|
|
Packit |
dd8086 |
it under the terms of the GNU General Public License as published by
|
|
Packit |
dd8086 |
the Free Software Foundation, either version 3 of the License, or
|
|
Packit |
dd8086 |
(at your option) any later version.
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
This program is distributed in the hope that it will be useful,
|
|
Packit |
dd8086 |
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
Packit |
dd8086 |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
Packit |
dd8086 |
GNU General Public License for more details.
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
You should have received a copy of the GNU General Public License
|
|
Packit |
dd8086 |
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
Packit |
dd8086 |
*/
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
/* Sample program to show use of the MMC interface.
|
|
Packit |
dd8086 |
An optional drive name can be supplied as an argument.
|
|
Packit |
dd8086 |
This basically calls to the libdio mmc_mode_sense_10() and mmc_mode_sense_6
|
|
Packit |
dd8086 |
routines.
|
|
Packit |
dd8086 |
*/
|
|
Packit |
dd8086 |
#ifdef HAVE_CONFIG_H
|
|
Packit |
dd8086 |
#include "config.h"
|
|
Packit |
dd8086 |
#define __CDIO_CONFIG_H__ 1
|
|
Packit |
dd8086 |
#endif
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
#ifdef HAVE_STDIO_H
|
|
Packit |
dd8086 |
#include <stdio.h>
|
|
Packit |
dd8086 |
#endif
|
|
Packit |
dd8086 |
#ifdef HAVE_SYS_TYPES_H
|
|
Packit |
dd8086 |
#include <sys/types.h>
|
|
Packit |
dd8086 |
#endif
|
|
Packit |
dd8086 |
#ifdef HAVE_STRING_H
|
|
Packit |
dd8086 |
#include <string.h>
|
|
Packit |
dd8086 |
#endif
|
|
Packit |
dd8086 |
#ifdef HAVE_STDLIB_H
|
|
Packit |
dd8086 |
#include <stdlib.h>
|
|
Packit |
dd8086 |
#endif
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
#include <cdio/cdio.h>
|
|
Packit |
dd8086 |
#include <cdio/mmc.h>
|
|
Packit |
dd8086 |
#include <cdio/mmc_cmds.h>
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
static void
|
|
Packit |
dd8086 |
print_mode_sense (const char *psz_drive, const char *six_or_ten,
|
|
Packit |
dd8086 |
const uint8_t buf[30])
|
|
Packit |
dd8086 |
{
|
|
Packit |
dd8086 |
printf("-- Mode sense %s information for %s:\n", six_or_ten, psz_drive);
|
|
Packit |
dd8086 |
if (buf[2] & 0x01) {
|
|
Packit |
dd8086 |
printf("-- \tReads CD-R media.\n");
|
|
Packit |
dd8086 |
}
|
|
Packit |
dd8086 |
if (buf[2] & 0x02) {
|
|
Packit |
dd8086 |
printf("-- \tReads CD-RW media.\n");
|
|
Packit |
dd8086 |
}
|
|
Packit |
dd8086 |
if (buf[2] & 0x04) {
|
|
Packit |
dd8086 |
printf("-- \tReads fixed-packet tracks when Addressing type is method 2.\n");
|
|
Packit |
dd8086 |
}
|
|
Packit |
dd8086 |
if (buf[2] & 0x08) {
|
|
Packit |
dd8086 |
printf("-- \tReads DVD ROM media.\n");
|
|
Packit |
dd8086 |
}
|
|
Packit |
dd8086 |
if (buf[2] & 0x10) {
|
|
Packit |
dd8086 |
printf("-- \tReads DVD-R media.\n");
|
|
Packit |
dd8086 |
}
|
|
Packit |
dd8086 |
if (buf[2] & 0x20) {
|
|
Packit |
dd8086 |
printf("-- \tReads DVD-RAM media.\n");
|
|
Packit |
dd8086 |
}
|
|
Packit |
dd8086 |
if (buf[2] & 0x40) {
|
|
Packit |
dd8086 |
printf("-- \tReads DVD-RAM media.\n");
|
|
Packit |
dd8086 |
}
|
|
Packit |
dd8086 |
if (buf[3] & 0x01) {
|
|
Packit |
dd8086 |
printf("-- \tWrites CD-R media.\n");
|
|
Packit |
dd8086 |
}
|
|
Packit |
dd8086 |
if (buf[3] & 0x02) {
|
|
Packit |
dd8086 |
printf("-- \tWrites CD-RW media.\n");
|
|
Packit |
dd8086 |
}
|
|
Packit |
dd8086 |
if (buf[3] & 0x04) {
|
|
Packit |
dd8086 |
printf("-- \tSupports emulation write.\n");
|
|
Packit |
dd8086 |
}
|
|
Packit |
dd8086 |
if (buf[3] & 0x10) {
|
|
Packit |
dd8086 |
printf("-- \tWrites DVD-R media.\n");
|
|
Packit |
dd8086 |
}
|
|
Packit |
dd8086 |
if (buf[3] & 0x20) {
|
|
Packit |
dd8086 |
printf("-- \tWrites DVD-RAM media.\n");
|
|
Packit |
dd8086 |
}
|
|
Packit |
dd8086 |
if (buf[4] & 0x01) {
|
|
Packit |
dd8086 |
printf("-- \tCan play audio.\n");
|
|
Packit |
dd8086 |
}
|
|
Packit |
dd8086 |
if (buf[4] & 0x02) {
|
|
Packit |
dd8086 |
printf("-- \tDelivers composition A/V stream.\n");
|
|
Packit |
dd8086 |
}
|
|
Packit |
dd8086 |
if (buf[4] & 0x04) {
|
|
Packit |
dd8086 |
printf("-- \tSupports digital output on port 2.\n");
|
|
Packit |
dd8086 |
}
|
|
Packit |
dd8086 |
if (buf[4] & 0x08) {
|
|
Packit |
dd8086 |
printf("-- \tSupports digital output on port 1.\n");
|
|
Packit |
dd8086 |
}
|
|
Packit |
dd8086 |
if (buf[4] & 0x10) {
|
|
Packit |
dd8086 |
printf("-- \tReads Mode-2 form 1 (e.g. XA) media.\n");
|
|
Packit |
dd8086 |
}
|
|
Packit |
dd8086 |
if (buf[4] & 0x20) {
|
|
Packit |
dd8086 |
printf("-- \tReads Mode-2 form 2 media.\n");
|
|
Packit |
dd8086 |
}
|
|
Packit |
dd8086 |
if (buf[4] & 0x40) {
|
|
Packit |
dd8086 |
printf("-- \tReads multi-session CD media.\n");
|
|
Packit |
dd8086 |
}
|
|
Packit |
dd8086 |
if (buf[4] & 0x80) {
|
|
Packit |
dd8086 |
printf("-- \tSupports Buffer under-run free recording on CD-R/RW media.\n");
|
|
Packit |
dd8086 |
}
|
|
Packit |
dd8086 |
if (buf[4] & 0x01) {
|
|
Packit |
dd8086 |
printf("-- \tCan read audio data with READ CD.\n");
|
|
Packit |
dd8086 |
}
|
|
Packit |
dd8086 |
if (buf[4] & 0x02) {
|
|
Packit |
dd8086 |
printf("-- \tREAD CD data stream is accurate.\n");
|
|
Packit |
dd8086 |
}
|
|
Packit |
dd8086 |
if (buf[5] & 0x04) {
|
|
Packit |
dd8086 |
printf("-- \tReads R-W subchannel information.\n");
|
|
Packit |
dd8086 |
}
|
|
Packit |
dd8086 |
if (buf[5] & 0x08) {
|
|
Packit |
dd8086 |
printf("-- \tReads de-interleaved R-W subchannel.\n");
|
|
Packit |
dd8086 |
}
|
|
Packit |
dd8086 |
if (buf[5] & 0x10) {
|
|
Packit |
dd8086 |
printf("-- \tSupports C2 error pointers.\n");
|
|
Packit |
dd8086 |
}
|
|
Packit |
dd8086 |
if (buf[5] & 0x20) {
|
|
Packit |
dd8086 |
printf("-- \tReads ISRC information.\n");
|
|
Packit |
dd8086 |
}
|
|
Packit |
dd8086 |
if (buf[5] & 0x40) {
|
|
Packit |
dd8086 |
printf("-- \tReads ISRC informaton.\n");
|
|
Packit |
dd8086 |
}
|
|
Packit |
dd8086 |
if (buf[5] & 0x40) {
|
|
Packit |
dd8086 |
printf("-- \tReads media catalog number (MCN also known as UPC).\n");
|
|
Packit |
dd8086 |
}
|
|
Packit |
dd8086 |
if (buf[5] & 0x80) {
|
|
Packit |
dd8086 |
printf("-- \tReads bar codes.\n");
|
|
Packit |
dd8086 |
}
|
|
Packit |
dd8086 |
if (buf[6] & 0x01) {
|
|
Packit |
dd8086 |
printf("-- \tPREVENT/ALLOW may lock media.\n");
|
|
Packit |
dd8086 |
}
|
|
Packit |
dd8086 |
printf("-- \tLock state is %slocked.\n", (buf[6] & 0x02) ? "" : "un");
|
|
Packit |
dd8086 |
printf("-- \tPREVENT/ALLOW jumper is %spresent.\n", (buf[6] & 0x04) ? "": "not ");
|
|
Packit |
dd8086 |
if (buf[6] & 0x08) {
|
|
Packit |
dd8086 |
printf("-- \tEjects media with START STOP UNIT.\n");
|
|
Packit |
dd8086 |
}
|
|
Packit |
dd8086 |
{
|
|
Packit |
dd8086 |
const unsigned int i_load_type = (buf[6]>>5 & 0x07);
|
|
Packit |
dd8086 |
printf("-- \tLoading mechanism type is %d: ", i_load_type);
|
|
Packit |
dd8086 |
switch (buf[6]>>5 & 0x07) {
|
|
Packit |
dd8086 |
case 0:
|
|
Packit |
dd8086 |
printf("caddy type loading mechanism.\n");
|
|
Packit |
dd8086 |
break;
|
|
Packit |
dd8086 |
case 1:
|
|
Packit |
dd8086 |
printf("tray type loading mechanism.\n");
|
|
Packit |
dd8086 |
break;
|
|
Packit |
dd8086 |
case 2:
|
|
Packit |
dd8086 |
printf("popup type loading mechanism.\n");
|
|
Packit |
dd8086 |
break;
|
|
Packit |
dd8086 |
case 3:
|
|
Packit |
dd8086 |
printf("reserved\n");
|
|
Packit |
dd8086 |
break;
|
|
Packit |
dd8086 |
case 4:
|
|
Packit |
dd8086 |
printf("changer with individually changeable discs.\n");
|
|
Packit |
dd8086 |
break;
|
|
Packit |
dd8086 |
case 5:
|
|
Packit |
dd8086 |
printf("changer using Magazine mechanism.\n");
|
|
Packit |
dd8086 |
break;
|
|
Packit |
dd8086 |
case 6:
|
|
Packit |
dd8086 |
printf("changer using Magazine mechanism.\n");
|
|
Packit |
dd8086 |
break;
|
|
Packit |
dd8086 |
default:
|
|
Packit |
dd8086 |
printf("Invalid.\n");
|
|
Packit |
dd8086 |
break;
|
|
Packit |
dd8086 |
}
|
|
Packit |
dd8086 |
}
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
if (buf[7] & 0x01) {
|
|
Packit |
dd8086 |
printf("-- \tVolume controls each channel separately.\n");
|
|
Packit |
dd8086 |
}
|
|
Packit |
dd8086 |
if (buf[7] & 0x02) {
|
|
Packit |
dd8086 |
printf("-- \tHas a changer that supports disc present reporting.\n");
|
|
Packit |
dd8086 |
}
|
|
Packit |
dd8086 |
if (buf[7] & 0x04) {
|
|
Packit |
dd8086 |
printf("-- \tCan load empty slot in changer.\n");
|
|
Packit |
dd8086 |
}
|
|
Packit |
dd8086 |
if (buf[7] & 0x08) {
|
|
Packit |
dd8086 |
printf("-- \tSide change capable.\n");
|
|
Packit |
dd8086 |
}
|
|
Packit |
dd8086 |
if (buf[7] & 0x10) {
|
|
Packit |
dd8086 |
printf("-- \tReads raw R-W subchannel information from lead in.\n");
|
|
Packit |
dd8086 |
}
|
|
Packit |
dd8086 |
{
|
|
Packit |
dd8086 |
const unsigned int i_speed_Kbs = CDIO_MMC_GETPOS_LEN16(buf, 8);
|
|
Packit |
dd8086 |
printf("-- \tMaximum read speed is %d K bytes/sec (about %dX)\n",
|
|
Packit |
dd8086 |
i_speed_Kbs, i_speed_Kbs / 176) ;
|
|
Packit |
dd8086 |
}
|
|
Packit |
dd8086 |
printf("-- \tNumber of Volume levels is %d\n",
|
|
Packit |
dd8086 |
CDIO_MMC_GETPOS_LEN16(buf, 10));
|
|
Packit |
dd8086 |
printf("-- \tBuffers size for data is %d KB\n",
|
|
Packit |
dd8086 |
CDIO_MMC_GETPOS_LEN16(buf, 12));
|
|
Packit |
dd8086 |
printf("-- \tCurrent read speed is %d KB\n",
|
|
Packit |
dd8086 |
CDIO_MMC_GETPOS_LEN16(buf, 14));
|
|
Packit |
dd8086 |
printf("-- \tMaximum write speed is %d KB\n",
|
|
Packit |
dd8086 |
CDIO_MMC_GETPOS_LEN16(buf, 18));
|
|
Packit |
dd8086 |
printf("-- \tCurrent write speed is %d KB\n",
|
|
Packit |
dd8086 |
CDIO_MMC_GETPOS_LEN16(buf, 28));
|
|
Packit |
dd8086 |
}
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
int
|
|
Packit |
dd8086 |
main(int argc, const char *argv[])
|
|
Packit |
dd8086 |
{
|
|
Packit |
dd8086 |
CdIo_t *p_cdio;
|
|
Packit |
dd8086 |
const char *psz_drive = NULL;
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
if (argc > 1) psz_drive = argv[1];
|
|
Packit |
dd8086 |
p_cdio = cdio_open (psz_drive, DRIVER_UNKNOWN);
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
if (!p_cdio) {
|
|
Packit |
dd8086 |
printf("-- Couldn't find CD\n");
|
|
Packit |
dd8086 |
return 77;
|
|
Packit |
dd8086 |
} else {
|
|
Packit |
dd8086 |
uint8_t buf[30] = { 0, }; /* Place to hold returned data */
|
|
Packit |
dd8086 |
char *psz_cd = cdio_get_default_device(p_cdio);
|
|
Packit |
dd8086 |
if (DRIVER_OP_SUCCESS == mmc_mode_sense_6(p_cdio, buf, sizeof(buf),
|
|
Packit |
dd8086 |
CDIO_MMC_CAPABILITIES_PAGE) ) {
|
|
Packit |
dd8086 |
print_mode_sense(psz_cd, "6", buf);
|
|
Packit |
dd8086 |
} else {
|
|
Packit |
dd8086 |
printf("-- Couldn't get MODE_SENSE 6 data.\n");
|
|
Packit |
dd8086 |
}
|
|
Packit |
dd8086 |
if (DRIVER_OP_SUCCESS == mmc_mode_sense_10(p_cdio, buf, sizeof(buf),
|
|
Packit |
dd8086 |
CDIO_MMC_CAPABILITIES_PAGE) ) {
|
|
Packit |
dd8086 |
print_mode_sense(psz_cd, "10", buf);
|
|
Packit |
dd8086 |
} else {
|
|
Packit |
dd8086 |
printf("-- Couldn't get MODE_SENSE 10 data.\n");
|
|
Packit |
dd8086 |
}
|
|
Packit |
dd8086 |
free(psz_cd);
|
|
Packit |
dd8086 |
}
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
cdio_destroy(p_cdio);
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
return 0;
|
|
Packit |
dd8086 |
}
|