Search
lxdream.org :: lxdream/src/drivers/cdrom/defs.h
lxdream 0.9.1
released Jun 29
Download Now
filename src/drivers/cdrom/defs.h
changeset 1296:30ecee61f811
prev1178:e55ec927d55d
author nkeynes
date Sat Jan 26 14:00:48 2013 +1000 (9 years ago)
permissions -rw-r--r--
last change Change glib includes to #include <glib.h> rather than the individual
headers, as recent glib versions are breaking on this
view annotate diff log raw
     1 /**
     2  * $Id$
     3  *
     4  * Global cdrom definitions.
     5  *
     6  * Copyright (c) 2009 Nathan Keynes.
     7  *
     8  * This program is free software; you can redistribute it and/or modify
     9  * it under the terms of the GNU General Public License as published by
    10  * the Free Software Foundation; either version 2 of the License, or
    11  * (at your option) any later version.
    12  *
    13  * This program is distributed in the hope that it will be useful,
    14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
    15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    16  * GNU General Public License for more details.
    17  */
    19 #ifndef cdrom_defs_H
    20 #define cdrom_defs_H 1
    22 #include "lxdream.h"
    23 #include <stdint.h>
    24 #include <glib.h>
    27 #ifdef __cplusplus
    28 extern "C" {
    29 #endif
    31 typedef uint32_t cdrom_lba_t;
    32 typedef uint32_t cdrom_count_t;
    34 /** Tracks are numbered 1..99, with 0 reserved for errors */
    35 typedef uint8_t  cdrom_trackno_t;
    37 typedef uint8_t  cdrom_sessionno_t;
    39 typedef const struct cdrom_track *cdrom_track_t;
    40 typedef struct cdrom_disc *cdrom_disc_t;
    42 /** sector read mode - values are based on the MMC READ CD command. */
    43 typedef uint16_t cdrom_read_mode_t;
    44 #define CDROM_READ_ANY         (0<<2)
    45 #define CDROM_READ_CDDA        (1<<2)
    46 #define CDROM_READ_MODE1       (2<<2)
    47 #define CDROM_READ_MODE2       (3<<2)
    48 #define CDROM_READ_MODE2_FORM1 (4<<2)
    49 #define CDROM_READ_MODE2_FORM2 (5<<2)
    51 #define CDROM_READ_NONE      0x0000
    52 #define CDROM_READ_SYNC      0x8000
    53 #define CDROM_READ_DATA      0x1000
    54 #define CDROM_READ_ECC       0x0800
    55 #define CDROM_READ_HEADER    0x2000
    56 #define CDROM_READ_SUBHEADER 0x4000
    57 #define CDROM_READ_RAW       0xF800 /* Read full sector */
    58 #define CDROM_READ_TYPE(x)   ((x) & 0x1C)
    59 #define CDROM_READ_FIELDS(x) ((x) & 0xF800)
    61 /** Actual sector mode */
    62 typedef enum {
    63     SECTOR_UNKNOWN,        // Unknown sector mode
    64     SECTOR_CDDA,           // Standard audio track
    65     /* Data-only modes */
    66     SECTOR_MODE1,          // Standard CD-Rom Mode 1 data track
    67     SECTOR_MODE2_FORMLESS, // Mode 2 data track with no sub-structure (rare)
    68     SECTOR_MODE2_FORM1,    // Mode 2/Form 1 data track (standard for multisession)
    69     SECTOR_MODE2_FORM2,    // Mode 2/Form 2 data track (also fairly uncommon).
    71     /* 2336-byte Mode 2 XA sector with subheader and ecc data */
    72     SECTOR_SEMIRAW_MODE2,
    73     /* 2352-byte raw data sector in an XA session */
    74     SECTOR_RAW_XA,
    75     /* 2352-byte raw data sector in a non-XA session */
    76     SECTOR_RAW_NONXA,
    77     /* CDDA + subchannel data */
    78     SECTOR_CDDA_SUBCHANNEL
    79 } sector_mode_t;
    82 extern const uint32_t cdrom_sector_size[];
    83 extern const uint32_t cdrom_sector_read_mode[];
    84 #define CDROM_MAX_SECTOR_SIZE    2352
    85 #define CDROM_MAX_TRACKS         99
    86 #define CDROM_MSF_START          150 /* MSF numbering starts after the initial pregap */
    87 #define CDROM_FRAMES_PER_SECOND  75
    88 #define CDROM_SECONDS_PER_MINUTE 60
    89 #define CDROM_FRAMES_PER_MINUTE  (CDROM_FRAMES_PER_SECOND*CDROM_SECONDS_PER_MINUTE)
    90 #define CDROM_PREGAP             150  /* Standard pregap, in frames */
    91 #define CDROM_SECTOR_SIZE(x)     cdrom_sector_size[x]
    92 #define CDROM_SECTOR_READ_MODE(x) cdrom_sector_read_mode[x]
    93 #define MSFTOLBA( m,s,f ) ((f) + ((s)*CDROM_FRAMES_PER_SECOND) + ((m)*CDROM_FRAMES_PER_MINUTE) - CDROM_MSF_START)
    95 /**
    96  * Convert an 8-bit BCD number to integer form.
    97  * Eg, 0x79 => 79
    98  */
    99 uint8_t static inline BCDTOU8( uint8_t bcd )
   100 {
   101     return (bcd & 0x0F) + (((bcd & 0xF0)>>4)*10);
   102 }
   104 /**
   105  * Convert a 32 bit BCD-encoded MSF address to the
   106  * equivalent LBA form.
   107  * Eg, 0x
   108  */
   109 cdrom_lba_t static inline BCD_MSFTOLBA( uint32_t msf )
   110 {
   111     msf = GUINT32_FROM_BE(msf);
   112     int f = BCDTOU8(msf);
   113     int s = BCDTOU8(msf>>8);
   114     int m = BCDTOU8(msf>>16);
   115     return MSFTOLBA(m,s,f);
   116 }
   118 /* Disc types */
   119 typedef uint8_t cdrom_type_t;
   120 #define CDROM_TYPE_NONXA 0x00  /* Audio or straight mode-1 data */
   121 #define CDROM_TYPE_CDI   0x10
   122 #define CDROM_TYPE_XA    0x20
   123 #define CDROM_TYPE_GD    0x80  /* SEGA only */
   126 /* Error codes are defined as MMC sense data - low byte is the sense key,
   127  * next byte, is the ASC code, and third byte is the ASCQ (not currently used)
   128  */
   129 typedef uint32_t cdrom_error_t;
   130 #define CDROM_ERROR_OK        0x0000
   131 #define CDROM_ERROR_NODISC    0x3A02
   132 #define CDROM_ERROR_BADCMD    0x2005
   133 #define CDROM_ERROR_BADFIELD  0x2405
   134 #define CDROM_ERROR_BADREAD   0x3002
   135 #define CDROM_ERROR_BADREADMODE 0x6405  /* Illegal mode for this track */
   136 #define CDROM_ERROR_READERROR 0x1103    /* Read failed due to uncorrectable error */
   137 #define CDROM_ERROR_RESET     0x2906
   139 #ifdef __cplusplus
   140 }
   141 #endif
   143 #endif /* !cdrom_defs_H */
.