68ec8bdc48e0ecdb05b9bb11e1db5e746f06b677
[SCSI2SD.git] / software / SCSI2SD / SCSI2SD.cydsn / scsi.h
1 //      Copyright (C) 2013 Michael McMaster <michael@codesrc.com>
2 //
3 //      This file is part of SCSI2SD.
4 //
5 //      SCSI2SD is free software: you can redistribute it and/or modify
6 //      it under the terms of the GNU General Public License as published by
7 //      the Free Software Foundation, either version 3 of the License, or
8 //      (at your option) any later version.
9 //
10 //      SCSI2SD is distributed in the hope that it will be useful,
11 //      but WITHOUT ANY WARRANTY; without even the implied warranty of
12 //      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 //      GNU General Public License for more details.
14 //
15 //      You should have received a copy of the GNU General Public License
16 //      along with SCSI2SD.  If not, see <http://www.gnu.org/licenses/>.
17 #ifndef SCSI_H
18 #define SCSI_H
19
20 // SCSI documentation goes here
21 // SCSI-2.
22 // Single LUN
23 // No tagged-queuing support - single command at a time.
24 // All read/write commands disconnect. State SD card latency.
25 // Fixed 512 byte sector size.
26 // 2TB limit, based on 32bit LBA (read16/write16 not supported)
27
28 #include "geometry.h"
29 #include "sense.h"
30
31 typedef enum
32 {
33         // internal bits
34         __scsiphase_msg = 1,
35         __scsiphase_cd = 2,
36         __scsiphase_io = 4,
37
38         BUS_FREE = -1,
39         BUS_BUSY = -2,
40         ARBITRATION = -3,
41         SELECTION = -4,
42         RESELECTION = -5,
43         STATUS = __scsiphase_cd | __scsiphase_io,
44         COMMAND = __scsiphase_cd,
45         DATA_IN = __scsiphase_io,
46         DATA_OUT = 0,
47         MESSAGE_IN = __scsiphase_msg | __scsiphase_cd | __scsiphase_io,
48         MESSAGE_OUT = __scsiphase_msg | __scsiphase_cd
49 } SCSI_PHASE;
50
51 typedef enum
52 {
53         GOOD = 0,
54         CHECK_CONDITION = 2,
55         BUSY = 0x8,
56         CONFLICT = 0x18
57 } SCSI_STATUS;
58
59 typedef enum
60 {
61         MSG_COMMAND_COMPLETE = 0,
62         MSG_REJECT = 0x7
63
64 } SCSI_MESSAGE;
65
66 typedef struct
67 {
68         uint8_t scsiIdMask;
69
70         // Set to true (1) if the ATN flag was set, and we need to
71         // enter the MESSAGE_OUT phase.
72         volatile int atnFlag;
73
74         // Set to true (1) if the RST flag was set.
75         volatile int resetFlag;
76
77         // Set to true (1) if a parity error was observed.
78         int parityError;
79
80         int phase;
81
82         uint8 data[SCSI_BLOCK_SIZE];
83         int dataPtr; // Index into data, reset on [re]selection to savedDataPtr
84         int savedDataPtr; // Index into data, initially 0.
85         int dataLen;
86
87         uint8 cdb[12]; // command descriptor block
88
89         // Only let the reserved initiator talk to us.
90         // A 3rd party may be sending the RESERVE/RELEASE commands
91         int initiatorId; // 0 -> 7. Set during the selection phase.
92         int reservedId; // 0 -> 7 if reserved. -1 if not reserved.
93         int reserverId; // 0 -> 7 if reserved. -1 if not reserved.
94
95         // SCSI_STATUS value.
96         // Change to SCSI_STATUS_CHECK_CONDITION when setting a SENSE value
97         uint8 status;
98
99         ScsiSense sense;
100         
101         uint16 unitAttention; // Set to the sense qualifier key to be returned.
102
103         uint8 msgIn;
104         uint8 msgOut;
105 } ScsiDevice;
106
107 extern ScsiDevice scsiDev;
108
109 void scsiInit(void);
110 void scsiPoll(void);
111
112
113 #endif