filename | src/gdrom/ide.h |
changeset | 1097:d4807997e450 |
prev | 858:368fc0dcd57c |
author | nkeynes |
date | Sun Feb 12 16:30:26 2012 +1000 (12 years ago) |
permissions | -rw-r--r-- |
last change | Add -Werror for mregparm check, so it actually fails if mregparm isn't accepted |
view | annotate | diff | log | raw |
1 /**
2 * $Id$
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 lxdream_ide_H
24 #define lxdream_ide_H 1
26 #include "lxdream.h"
28 #ifdef __cplusplus
29 extern "C" {
30 #endif
32 #define GDROM_DRIVE_STATUS_LENGTH 10
33 #define GDROM_SENSE_LENGTH 10
34 #define GDROM_MODE_LENGTH 32
36 #define IDE_DISC_READY 0x01 /* ored with above */
37 #define IDE_DISC_IDLE 0x02 /* ie spun-down */
38 #define IDE_DISC_NONE 0x06 /* No media in drive */
40 struct ide_registers {
41 /* IDE interface registers */
42 uint8_t status; /* A05F709C + A05F7018 Read-only */
43 uint8_t control; /* A05F7018 Write-only 01110 */
44 uint8_t error; /* A05F7084 Read-only 10001 */
45 uint8_t feature; /* A05F7084 Write-only 10001 */
46 uint8_t count; /* A05F7088 Read/Write 10010 */
47 uint8_t disc; /* A05F708C Read-only 10011 */
48 uint8_t lba0; /* A05F708C Write-only 10011 (NB: Presumed, TBV */
49 uint8_t lba1; /* A05F7090 Read/Write 10100 */
50 uint8_t lba2; /* A05F7094 Read/Write 10101 */
51 uint8_t device; /* A05F7098 Read/Write 10110 */
52 uint8_t command; /* A05F709C Write-only 10111 */
54 /* Internal IDE state */
55 uint8_t intrq_pending; /* Flag to indicate if the INTRQ line is active */
56 gboolean interface_enabled;
57 gboolean was_reset; /* Flag indicating that the device has just been reset */
58 uint32_t state;
59 uint32_t last_packet_command; /* Identifies the command executing during a r/w cycle */
61 /* Sense response for the last executed packet command */
62 unsigned char gdrom_sense[GDROM_SENSE_LENGTH];
63 unsigned char gdrom_mode[GDROM_MODE_LENGTH];
65 /* offset in the buffer of the next word to read/write, or -1
66 * if inactive.
67 */
68 int32_t data_offset;
69 int32_t data_length;
71 /* Status reporting information */
72 uint8_t last_read_track;
73 uint32_t current_lba;
74 uint32_t current_mode;
75 uint32_t sectors_left; /* sectors left after current read */
76 };
78 #define IDE_STATE_IDLE 0
79 #define IDE_STATE_CMD_WRITE 1
80 #define IDE_STATE_PIO_READ 2
81 #define IDE_STATE_PIO_WRITE 3
82 #define IDE_STATE_DMA_READ 4
83 #define IDE_STATE_DMA_WRITE 5
84 #define IDE_STATE_BUSY 6
86 /* Flag bits */
87 #define IDE_STATUS_BSY 0x80 /* Busy */
88 #define IDE_STATUS_DRDY 0x40 /* Device ready */
89 #define IDE_STATUS_DMRD 0x20 /* DMA Request */
90 #define IDE_STATUS_SERV 0x10
91 #define IDE_STATUS_DRQ 0x08
92 #define IDE_STATUS_CHK 0x01 /* Check condition (ie error) */
94 #define IDE_FEAT_DMA 0x01
95 #define IDE_FEAT_OVL 0x02
97 #define IDE_COUNT_CD 0x01 /* Command (1)/Data (0) */
98 #define IDE_COUNT_IO 0x02 /* Input (1)/Output (0) */
99 #define IDE_COUNT_REL 0x04 /* Release device */
102 #define IDE_CTL_RESET 0x04
103 #define IDE_CTL_IRQEN 0x02 /* IRQ enabled when == 0 */
105 #define IDE_CMD_NOP 0x00
106 #define IDE_CMD_RESET_DEVICE 0x08
107 #define IDE_CMD_PACKET 0xA0
108 #define IDE_CMD_IDENTIFY_PACKET_DEVICE 0xA1
109 #define IDE_CMD_SERVICE 0xA2
110 #define IDE_CMD_SET_FEATURE 0xEF
112 #define IDE_FEAT_SET_TRANSFER_MODE 0x03
113 #define IDE_XFER_PIO 0x00
114 #define IDE_XFER_PIO_FLOW 0x08
115 #define IDE_XFER_MULTI_DMA 0x20
116 #define IDE_XFER_ULTRA_DMA 0x40
118 extern struct ide_registers idereg;
120 /* Note: control can be written at any time - all other registers are writable
121 * only when ide_can_write_regs() is true
122 */
123 #define ide_can_write_regs() ((idereg.status&0x80)==0)
124 #define IS_IDE_IRQ_ENABLED() ((idereg.control&0x02)==0)
127 uint16_t ide_read_data_pio(void);
128 void ide_write_data_pio( uint16_t value );
129 uint32_t ide_read_data_dma( uint32_t addr, uint32_t length );
130 uint8_t ide_read_status(void);
131 uint8_t ide_get_drive_status(void);
132 void ide_write_buffer( unsigned char *data, uint32_t length );
134 void ide_write_command( uint8_t command );
135 void ide_write_control( uint8_t value );
137 void ide_dma_read_req( uint32_t addr, uint32_t length );
139 #ifdef __cplusplus
140 }
141 #endif
143 #endif /* !lxdream_ide_H */
.