nkeynes@125: /** nkeynes@422: * $Id: gdrom.h,v 1.11 2007-10-06 08:58:00 nkeynes Exp $ nkeynes@125: * nkeynes@125: * This file defines the structures and functions used by the GD-Rom nkeynes@125: * disc driver. (ie, the modules that supply a CD image to be used by the nkeynes@125: * system). nkeynes@125: * nkeynes@125: * Copyright (c) 2005 Nathan Keynes. nkeynes@125: * nkeynes@125: * This program is free software; you can redistribute it and/or modify nkeynes@125: * it under the terms of the GNU General Public License as published by nkeynes@125: * the Free Software Foundation; either version 2 of the License, or nkeynes@125: * (at your option) any later version. nkeynes@125: * nkeynes@125: * This program is distributed in the hope that it will be useful, nkeynes@125: * but WITHOUT ANY WARRANTY; without even the implied warranty of nkeynes@125: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the nkeynes@125: * GNU General Public License for more details. nkeynes@125: */ nkeynes@125: nkeynes@125: #ifndef dream_gdrom_H nkeynes@125: #define dream_gdrom_H 1 nkeynes@125: nkeynes@125: #include "dream.h" nkeynes@125: nkeynes@342: #define MAX_SECTOR_SIZE 2352 nkeynes@342: nkeynes@149: typedef uint16_t gdrom_error_t; nkeynes@149: nkeynes@138: struct gdrom_toc { nkeynes@142: uint32_t track[99]; nkeynes@125: uint32_t first, last, leadout; nkeynes@138: }; nkeynes@138: nkeynes@138: #define GDROM_PREGAP 150 /* Sectors */ nkeynes@138: nkeynes@138: extern uint32_t gdrom_sector_size[]; nkeynes@138: #define GDROM_SECTOR_SIZE(x) gdrom_sector_size[x] nkeynes@138: typedef enum { nkeynes@138: GDROM_MODE1, nkeynes@138: GDROM_MODE2, nkeynes@138: GDROM_MODE2_XA1, nkeynes@138: GDROM_MODE2_XA2, nkeynes@138: GDROM_CDDA, nkeynes@143: GDROM_GD, nkeynes@143: GDROM_RAW nkeynes@138: } gdrom_track_mode_t; nkeynes@138: nkeynes@138: /* The disc register indicates the current contents of the drive. When open nkeynes@138: * contains 0x06. nkeynes@138: */ nkeynes@138: #define IDE_DISC_AUDIO 0x00 nkeynes@138: #define IDE_DISC_NONE 0x06 nkeynes@138: #define IDE_DISC_CDROM 0x20 nkeynes@138: #define IDE_DISC_GDROM 0x80 nkeynes@138: #define IDE_DISC_READY 0x01 /* ored with above */ nkeynes@138: #define IDE_DISC_IDLE 0x02 /* ie spun-down */ nkeynes@138: nkeynes@142: #define TRACK_PRE_EMPHASIS 0x10 nkeynes@142: #define TRACK_COPY_PERMITTED 0x20 nkeynes@142: #define TRACK_DATA 0x40 nkeynes@142: #define TRACK_FOUR_CHANNEL 0x80 nkeynes@142: nkeynes@245: typedef struct gdrom_track { nkeynes@138: gdrom_track_mode_t mode; nkeynes@142: uint8_t flags; /* Track flags */ nkeynes@138: int session; /* session # containing this track */ nkeynes@138: uint32_t lba; /* start sector address */ nkeynes@138: uint32_t sector_size; /* For convenience, determined by mode */ nkeynes@138: uint32_t sector_count; nkeynes@138: uint32_t offset; /* File offset of start of track - image files only */ nkeynes@245: } *gdrom_track_t; nkeynes@125: nkeynes@342: typedef struct gdrom_disc { nkeynes@342: /** nkeynes@342: * Read a single sector from the disc at the specified logical address. nkeynes@342: * @param disc pointer to the disc structure nkeynes@342: * @param lba logical address to read from nkeynes@342: * @param mode mode field from the read command nkeynes@342: * @param buf buffer to receive data (at least MAX_SECTOR_SIZE bytes) nkeynes@342: * @param length unsigned int to receive the number of bytes actually read. nkeynes@342: * @return PKT_ERR_OK on success, or another PKT_ERR_* code on failure. nkeynes@342: */ nkeynes@342: gdrom_error_t (*read_sector)( struct gdrom_disc *disc, nkeynes@342: uint32_t lba, int mode, nkeynes@422: unsigned char *buf, uint32_t *length ); nkeynes@342: nkeynes@342: /** nkeynes@342: * Read the TOC from the disc and write it into the specified buffer. nkeynes@342: * The method is responsible for returning the data in gd-rom nkeynes@342: * format. nkeynes@342: * @param disc pointer to the disc structure nkeynes@342: * @param buf buffer to receive data (0x198 bytes long) nkeynes@342: */ nkeynes@422: gdrom_error_t (*read_toc)(struct gdrom_disc *disc, unsigned char *buf); nkeynes@125: nkeynes@342: /** nkeynes@342: * Read the information for the specified sector and return it in the nkeynes@342: * supplied buffer. nkeynes@342: * @param disc pointer to the disc structure nkeynes@342: * @param session of interest. If 0, return end of disc information. nkeynes@342: * @param buf buffer to receive data (6 bytes) nkeynes@342: */ nkeynes@422: gdrom_error_t (*read_session)(struct gdrom_disc *disc, int session, unsigned char *buf); nkeynes@342: nkeynes@342: /** nkeynes@342: * Read the position information (subchannel) for the specified sector nkeynes@342: * and return it in the supplied buffer. This method does not need to nkeynes@342: * write the first 4 bytes of the buffer. nkeynes@342: * @param disc pointer to the disc structure nkeynes@342: * @param lba sector to get position information for nkeynes@342: * @param buf buffer to receive data (14 bytes) nkeynes@342: */ nkeynes@422: gdrom_error_t (*read_position)(struct gdrom_disc *disc, uint32_t lba, unsigned char *buf); nkeynes@342: nkeynes@342: /** nkeynes@342: * Return the current disc status, expressed as a combination of the nkeynes@342: * IDE_DISC_* flags above. nkeynes@342: * @param disc pointer to the disc structure nkeynes@342: * @return an integer status value. nkeynes@342: */ nkeynes@342: int (*drive_status)(struct gdrom_disc *disc); nkeynes@342: nkeynes@342: /** nkeynes@342: * Begin playing audio from the given lba address on the disc. nkeynes@342: */ nkeynes@342: gdrom_error_t (*play_audio)(struct gdrom_disc *disc, uint32_t lba); nkeynes@342: nkeynes@342: /** nkeynes@342: * Executed once per time slice to perform house-keeping operations nkeynes@342: * (checking disc status, media changed, etc). nkeynes@342: */ nkeynes@342: uint32_t (*run_time_slice)( struct gdrom_disc *disc, uint32_t nanosecs ); nkeynes@342: nkeynes@342: /** nkeynes@342: * Close the disc and release any storage or resources allocated including nkeynes@342: * the disc structure itself. nkeynes@342: */ nkeynes@342: void (*close)( struct gdrom_disc *disc ); nkeynes@342: } *gdrom_disc_t; nkeynes@342: nkeynes@342: nkeynes@342: typedef struct gdrom_image { nkeynes@342: struct gdrom_disc disc; nkeynes@138: int disc_type; nkeynes@138: int track_count; nkeynes@138: struct gdrom_track track[99]; nkeynes@138: gchar mcn[14]; /* Media catalogue number */ nkeynes@138: const gchar *filename; /* Image filename */ nkeynes@342: FILE *file; /* Open file stream */ nkeynes@342: } *gdrom_image_t; nkeynes@125: nkeynes@138: /** nkeynes@168: * nkeynes@168: */ nkeynes@168: typedef struct gdrom_image_class { nkeynes@168: const gchar *name; nkeynes@168: const gchar *extension; nkeynes@168: gboolean (*is_valid_file)(FILE *f); nkeynes@168: gdrom_disc_t (*open_image_file)(const gchar *filename, FILE *f); nkeynes@168: } *gdrom_image_class_t; nkeynes@168: nkeynes@168: extern struct gdrom_image_class nrg_image_class; nkeynes@168: extern struct gdrom_image_class cdi_image_class; nkeynes@237: extern struct gdrom_image_class linux_device_class; nkeynes@168: nkeynes@168: /** nkeynes@138: * Construct a new image file using the default methods. nkeynes@138: */ nkeynes@138: gdrom_disc_t gdrom_image_new( FILE *file ); nkeynes@125: nkeynes@138: /** nkeynes@138: * Open an image file nkeynes@138: */ nkeynes@138: gdrom_disc_t gdrom_image_open( const gchar *filename ); nkeynes@138: nkeynes@138: /** nkeynes@422: * Dump image info nkeynes@422: */ nkeynes@422: void gdrom_image_dump_info( gdrom_disc_t d ); nkeynes@422: nkeynes@422: /** nkeynes@138: * Retrieve the disc table of contents, and write it into the buffer in the nkeynes@138: * format expected by the DC. nkeynes@149: * @return 0 on success, error code on failure (eg no disc mounted) nkeynes@138: */ nkeynes@422: gdrom_error_t gdrom_get_toc( unsigned char *buf ); nkeynes@149: nkeynes@149: /** nkeynes@152: * Retrieve the short (6-byte) session info, and write it into the buffer. nkeynes@149: * @return 0 on success, error code on failure. nkeynes@149: */ nkeynes@422: gdrom_error_t gdrom_get_info( unsigned char *buf, int session ); nkeynes@138: nkeynes@245: gdrom_track_t gdrom_get_track( int track_no ); nkeynes@245: nkeynes@245: uint8_t gdrom_get_track_no_by_lba( uint32_t lba ); nkeynes@245: nkeynes@138: /** nkeynes@138: * Shortcut to open and mount an image file nkeynes@138: */ nkeynes@138: gdrom_disc_t gdrom_mount_image( const gchar *filename ); nkeynes@138: nkeynes@138: void gdrom_mount_disc( gdrom_disc_t disc ); nkeynes@138: nkeynes@138: void gdrom_unmount_disc( void ); nkeynes@138: nkeynes@138: gboolean gdrom_is_mounted( void ); nkeynes@138: nkeynes@138: uint32_t gdrom_read_sectors( uint32_t sector, uint32_t sector_count, nkeynes@422: int mode, unsigned char *buf, uint32_t *length ); nkeynes@125: nkeynes@125: #endif