Many bug fixes, including selection fixes.
[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 // Set this to true to log SCSI commands and status information via
29 // USB HID packets.  The can be captured and viewed in wireshark.
30 // For windows users, capture using USBPcap http://desowin.org/usbpcap/
31 #define MM_DEBUG 0
32
33 #include "geometry.h"
34 #include "sense.h"
35
36 typedef enum
37 {
38         // internal bits
39         __scsiphase_msg = 1,
40         __scsiphase_cd = 2,
41         __scsiphase_io = 4,
42
43         BUS_FREE = -1,
44         BUS_BUSY = -2,
45         ARBITRATION = -3,
46         SELECTION = -4,
47         RESELECTION = -5,
48         STATUS = __scsiphase_cd | __scsiphase_io,
49         COMMAND = __scsiphase_cd,
50         DATA_IN = __scsiphase_io,
51         DATA_OUT = 0,
52         MESSAGE_IN = __scsiphase_msg | __scsiphase_cd | __scsiphase_io,
53         MESSAGE_OUT = __scsiphase_msg | __scsiphase_cd
54 } SCSI_PHASE;
55
56 typedef enum
57 {
58         GOOD = 0,
59         CHECK_CONDITION = 2,
60         BUSY = 0x8,
61         CONFLICT = 0x18
62 } SCSI_STATUS;
63
64 typedef enum
65 {
66         MSG_COMMAND_COMPLETE = 0,
67         MSG_REJECT = 0x7
68
69 } SCSI_MESSAGE;
70
71 typedef struct
72 {
73         uint8_t scsiIdMask;
74
75         // Set to true (1) if the ATN flag was set, and we need to
76         // enter the MESSAGE_OUT phase.
77         volatile int atnFlag;
78
79         // Set to true (1) if the RST flag was set.
80         volatile int resetFlag;
81
82         // Set to true (1) if a parity error was observed.
83         int parityError;
84
85         int phase;
86
87         uint8 data[SCSI_BLOCK_SIZE];
88         int dataPtr; // Index into data, reset on [re]selection to savedDataPtr
89         int savedDataPtr; // Index into data, initially 0.
90         int dataLen;
91
92         uint8 cdb[12]; // command descriptor block
93
94         // Only let the reserved initiator talk to us.
95         // A 3rd party may be sending the RESERVE/RELEASE commands
96         int initiatorId; // 0 -> 7. Set during the selection phase.
97         int reservedId; // 0 -> 7 if reserved. -1 if not reserved.
98         int reserverId; // 0 -> 7 if reserved. -1 if not reserved.
99
100         // SCSI_STATUS value.
101         // Change to SCSI_STATUS_CHECK_CONDITION when setting a SENSE value
102         uint8 status;
103
104         ScsiSense sense;
105
106         uint16 unitAttention; // Set to the sense qualifier key to be returned.
107
108         uint8 msgIn;
109         uint8 msgOut;
110
111 #ifdef MM_DEBUG
112         uint8 selCount;
113         uint8 rstCount;
114         uint8 msgCount;
115         uint8 watchdogTick;
116         uint8 lastStatus;
117         uint8 lastSense;
118 #endif
119 } ScsiDevice;
120
121 extern ScsiDevice scsiDev;
122
123 void scsiInit(void);
124 void scsiPoll(void);
125
126
127 #endif