OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [tags/] [nog_patch_65/] [or1ksim/] [peripheral/] [atadevice.h] - Blame information for rev 1778

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 876 rherveille
/*
2
    atahost.h -- ATA Host code simulation
3
    Copyright (C) 2002 Richard Herveille, rherveille@opencores.org
4
 
5
    This file is part of OpenRISC 1000 Architectural Simulator
6
 
7
    This program is free software; you can redistribute it and/or modify
8
    it under the terms of the GNU General Public License as published by
9
    the Free Software Foundation; either version 2 of the License, or
10
    (at your option) any later version
11
 
12
    This program is distributed in the hope that it will be useful,
13
    but WITHOUT ANY WARRANTY; without even the implied warranty of
14
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15
    GNU General Public License for more details.
16
 
17
    You should have received a copy of the GNU General Public License
18
    along with this program; if not, write to the Free Software
19
    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20
*/
21
 
22
/*
23
 * Definitions for the Opencores ATA Controller Core, Device model
24
 */
25
 
26
#ifndef __OR1KSIM_ATAD_H
27
#define __OR1KSIM_ATAD_H
28
 
29
#include <stdio.h>
30
 
31
/*
32
   ata device debug level
33
   0: don't display debug information
34
   1: display general (debug) information
35
   2: display program flow control information
36
   3: display internal statemachine flow information
37
   4: display all debug information
38
*/
39
#define ATA_DEVICE_DEBUG_LVL 4
40
 
41
 
42
/* --- Register definitions --- */
43
/* ----- ATA Registers                                                */
44
/* These are actually the memory locations where the ATA registers    */
45
/* can be found in the host system; i.e. as seen from the CPU.        */
46
/* However, this doesn't matter for the simulator.                    */
47
#define ATA_ASR   0x78         /* Alternate Status Register      (R)  */
48
#define ATA_CR    0x5c         /* Command Register               (W)  */
49
#define ATA_CHR   0x54         /* Cylinder High Register       (R/W)  */
50
#define ATA_CLR   0x50         /* Cylinder Low Register        (R/W)  */
51
#define ATA_DR    0x40         /* Data Register                       */
52
#define ATA_DCR   0x78         /* Device Control Register        (W)  */
53
#define ATA_DHR   0x58         /* Device/Head Register         (R/W)  */
54
#define ATA_ERR   0x44         /* Error Register                 (R)  */
55
#define ATA_FR    0x44         /* Features Register              (W)  */
56
#define ATA_SCR   0x48         /* Sector Count Register        (R/W)  */
57
#define ATA_SNR   0x4c         /* Sector Number Register       (R/W)  */
58
#define ATA_SR    0x5c         /* Status Register                (R)  */
59
#define ATA_DA    0x7c         /* Device Address Register        (R)  */
60
             /* ATA/ATAPI-5 does not describe Device Status Register  */
61
 
62
/* --------------------------------------                             */
63
/* ----- ATA Device bit defenitions -----                             */
64
/* --------------------------------------                             */
65
 
66
/* ----- ATA (Alternate) Status Register                              */
67
#define ATA_SR_BSY  0x80        /* Busy                               */
68
#define ATA_SR_DRDY 0x40        /* Device Ready                       */
69
#define ATA_SR_DF   0x20        /* Device Fault                       */
70
#define ATA_SR_DSC  0x10        /* Device Seek Complete               */
71
#define ATA_SR_DRQ  0x08        /* Data Request                       */
72
#define ATA_SR_COR  0x04        /* Corrected data (obsolete)          */
73
#define ATA_SR_IDX  0x02        /*                (obsolete)          */
74
#define ATA_SR_ERR  0x01        /* Error                              */
75
 
76
/* ----- ATA Device Control Register                                  */
77
                                /* bits 7-3 are reserved              */
78
#define ATA_DCR_RST 0x04        /* Software reset   (RST=1, reset)    */
79
#define ATA_DCR_IEN 0x02        /* Interrupt Enable (IEN=0, enabled)  */
80
                                /* always write a '0' to bit0         */
81
 
82
/* ----- ATA Device Address Register                                  */
83
/* All values in this register are one's complement (i.e. inverted)   */
84
#define ATA_DAR_WTG 0x40        /* Write Gate                         */
85
#define ATA_DAR_H   0x3c        /* Head Select                        */
86
#define ATA_DAR_DS1 0x02        /* Drive select 1                     */
87
#define ATA_DAR_DS0 0x01        /* Drive select 0                     */
88
 
89
/* ----- Device/Head Register                                         */
90
#define ATA_DHR_LBA 0x40        /* LBA/CHS mode ('1'=LBA mode)        */
91
#define ATA_DHR_DEV 0x10        /* Device       ('0'=dev0, '1'=dev1)  */
92
#define ATA_DHR_H   0x0f        /* Head Select                        */
93
 
94
/* ----- Error Register                                               */
95
#define ATA_ERR_BBK  0x80       /* Bad Block                          */
96
#define ATA_ERR_UNC  0x40       /* Uncorrectable Data Error           */
97
#define ATA_ERR_IDNF 0x10       /* ID Not Found                       */
98
#define ATA_ERR_ABT  0x04       /* Aborted Command                    */
99
#define ATA_ERR_TON  0x02       /* Track0 Not Found                   */
100
#define ATA_ERR_AMN  0x01       /* Address Mark Not Found             */
101
 
102
/* --------------------------                                         */
103
/* ----- Device Defines -----                                         */
104
/* --------------------------                                         */
105
 
106
/* types for hard disk simulation                                     */
107
#define TYPE_NO_CONNECT 0
108
#define TYPE_FILE       1
109
#define TYPE_LOCAL      2
110
 
111
 
112
/* -----------------------------                                      */
113
/* ----- Statemachine defines --                                      */
114
/* -----------------------------                                      */
115
#define ATA_STATE_IDLE   0x00
116
#define ATA_STATE_SW_RST 0x01
117
#define ATA_STATE_HW_RST 0x02
118
 
119
 
120
/* ----------------------------                                       */
121
/* ----- Structs          -----                                       */
122
/* ----------------------------                                       */
123
typedef struct{
124
 
125
        /******* Housekeeping *****************************************/
126
        struct {
127
                /* device number                                      */
128
                int dev;
129
 
130
                /* current PIO mode                                   */
131
                int pio_mode;
132
 
133
                /* current DMA mode                                   */
134
                int dma_mode;
135
 
136
                /* databuffer                                         */
137 919 rherveille
                unsigned short dbuf[4096];
138 1067 rherveille
                unsigned short *dbuf_ptr;
139 919 rherveille
                unsigned short dbuf_cnt;
140 876 rherveille
 
141
                /* current statemachine state                         */
142
                int state;
143
 
144
                /* current CHS translation settings                   */
145
                unsigned int heads_per_cylinder;
146
                unsigned int sectors_per_track;
147 1067 rherveille
        } internals;
148 876 rherveille
 
149
 
150
        /******* ATA Device Registers *********************************/
151
        struct {
152
                unsigned char command;
153
                unsigned char cylinder_low;
154
                unsigned char cylinder_high;
155
                unsigned char device_control;
156
                unsigned char device_head;
157
                unsigned char error;
158
                unsigned char features;
159
                unsigned char sector_count;
160
                unsigned char sector_number;
161
                unsigned char status;
162
 
163
                short dataport_i;
164
        } regs;
165
 
166
        /******** ata device output signals **************************/
167
        struct {
168
                int iordy;
169
                int intrq;
170
                int dmarq;
171
                int pdiagi, pdiago;
172
                int daspi, daspo;
173
        } sigs;
174
 
175
        /******** simulator settings **********************************/
176
        /* simulate ata-device                                        */
177 1364 nogj
        char *file;   /* Filename (if type == FILE)                   */
178 876 rherveille
        FILE *stream; /* stream where the simulated device connects to*/
179
        int  type;    /* Simulate device using                        */
180
                      /* NO_CONNECT: no device connected (dummy)      */
181
                      /* FILE      : a file                           */
182
                      /* LOCAL     : a local stream, e.g./dev/hda1    */
183
        unsigned long size;    /* size in MB of the simulated device  */
184
        int  packet;  /* device implements PACKET command set         */
185
} ata_device;
186
 
187
typedef struct{
188
  ata_device device0, device1;
189
} ata_devices;
190
 
191
 
192
/* ------------------------------                                     */
193
/* ----- Device Prototypes  -----                                     */
194
/* ------------------------------                                     */
195
int ata_device_debug(int lvl, char *format, ...);
196
 
197
/* all devices                                                        */
198 1364 nogj
void  ata_devices_init(ata_devices *devices);
199 876 rherveille
void  ata_devices_hw_reset(ata_devices *devices, int reset_signal);
200
short ata_devices_read(ata_devices *devices, char adr);
201
void  ata_devices_write(ata_devices *devices, char adr, short value);
202
 
203
/* single device                                                      */
204 1364 nogj
void ata_device_init(ata_device *device, int dev);
205 876 rherveille
void ata_device_hw_reset(ata_device *device, int reset_signal, int daspo, int pdiagi, int daspi);
206
void ata_device_do_control_register(ata_device *device);
207
void ata_device_do_command_register(ata_device *device);
208
void ata_device_write(ata_device *device, char adr, short value);
209
 
210
/* housekeeping routines                                              */
211
FILE  *open_file(unsigned long *size, const char *filename);
212
FILE  *open_local(void);
213
 
214
 
215
#endif

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.