Search
lxdream.org :: lxdream/src/gdrom/ide.h
lxdream 0.9.1
released Jun 29
Download Now
filename src/gdrom/ide.h
changeset 31:495e480360d7
prev2:42349f6ea216
next47:da09bcb7ce69
author nkeynes
date Mon Dec 26 10:48:45 2005 +0000 (18 years ago)
permissions -rw-r--r--
last change Remove default MMIO trace
view annotate diff log raw
     1 /**
     2  * $Id: ide.h,v 1.2 2005-12-25 08:24:11 nkeynes Exp $
     3  *
     4  * This file defines the interface and structures of the dreamcast's IDE 
     5  * port. Note that the register definitions are in asic.h, as the registers
     6  * fall into the general ASIC ranges (and I don't want to use smaller pages
     7  * at this stage). The registers here are exactly as per the ATA 
     8  * specifications, which makes things a little easier.
     9  *
    10  * Copyright (c) 2005 Nathan Keynes.
    11  *
    12  * This program is free software; you can redistribute it and/or modify
    13  * it under the terms of the GNU General Public License as published by
    14  * the Free Software Foundation; either version 2 of the License, or
    15  * (at your option) any later version.
    16  *
    17  * This program is distributed in the hope that it will be useful,
    18  * but WITHOUT ANY WARRANTY; without even the implied warranty of
    19  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    20  * GNU General Public License for more details.
    21  */
    23 #ifndef dream_ide_H
    24 #define dream_ide_H 1
    26 #include "dream.h"
    28 struct ide_registers {
    29     uint8_t status;  /* A05F709C + A05F7018 Read-only */
    30     uint8_t control; /* A05F7018 Write-only 01110 */
    31     uint8_t error;   /* A05F7084 Read-only  10001 */
    32     uint8_t feature; /* A05F7084 Write-only 10001 */
    33     uint8_t count;   /* A05F7088 Read/Write 10010 */
    34     uint8_t disc;    /* A05F708C Read-only 10011 */
    35     uint8_t lba0;    /* A05F708C Write-only 10011 (NB: Presumed, TBV */
    36     uint8_t lba1;    /* A05F7090 Read/Write 10100 */
    37     uint8_t lba2;    /* A05F7094 Read/Write 10101 */
    38     uint8_t device;  /* A05F7098 Read/Write 10110 */
    39     uint8_t command; /* A05F709C Write-only 10111 */
    41     /* We don't keep the data register per se, rather the currently pending
    42      * data is kept here and read out a byte at a time (in PIO mode) or all at
    43      * once (in DMA mode). The IDE routines are responsible for managing this
    44      * memory. If dataptr == NULL, there is no data available.
    45      */
    46     char *data;
    47     uint16_t *readptr, *writeptr;
    48     int datalen;
    49 };
    51 #define IDE_ST_BUSY  0x80
    52 #define IDE_ST_READY 0x40
    53 #define IDE_ST_SERV  0x10
    54 #define IDE_ST_DATA  0x08
    55 #define IDE_ST_ERROR 0x01
    57 #define IDE_CTL_RESET 0x04
    58 #define IDE_CTL_IRQEN 0x02 /* IRQ enabled when == 0 */
    60 #define IDE_CMD_RESET_DEVICE 0x08
    61 #define IDE_CMD_PACKET 0xA0
    62 #define IDE_CMD_IDENTIFY_PACKET_DEVICE 0xA1
    63 #define IDE_CMD_SERVICE 0xA2
    64 #define IDE_CMD_SET_FEATURE 0xEF
    66 /* The disc register indicates the current contents of the drive. When open
    67  * contains 0x06.
    68  */
    69 #define IDE_DISC_AUDIO 0x00
    70 #define IDE_DISC_NONE  0x06
    71 #define IDE_DISC_CDROM 0x20
    72 #define IDE_DISC_GDROM 0x80
    73 #define IDE_DISC_READY 0x01 /* ored with above */
    74 #define IDE_DISC_IDLE  0x02 /* ie spun-down */
    76 #define PKT_CMD_RESET    0x00 /* Wild-ass guess */
    77 #define PKT_CMD_IDENTIFY 0x11
    79 extern struct ide_registers idereg;
    81 /* Note: control can be written at any time - all other registers are writable
    82  * only when ide_can_write_regs() is true
    83  */
    84 #define ide_can_write_regs() ((idereg.status&0x88)==0)
    86 /* Called upon:
    87  *   a) Writing the command register
    88  *   b) Reading the status (but not altstatus) register
    89  *  (whether this actually has any effect an the ASIC event is TBD)
    90  */
    91 void ide_clear_interrupt(void);
    93 void ide_reset(void);
    95 uint16_t ide_read_data_pio(void);
    96 void ide_write_data_pio( uint16_t value );
    97 void ide_write_buffer( char * ); 
    99 void ide_write_command( uint8_t command );
   100 void ide_write_control( uint8_t value );
   101 #endif
.