Fix bug in using nor flash storage without SD
[SCSI2SD.git] / software / SCSI2SD / src / storedevice.h
1 //      Copyright (C) 2020 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 S2S_DEVICE_H
18 #define S2S_DEVICE_H
19
20 #include "scsi2sd.h"
21 #include "sense.h"
22
23 #include <stdint.h>
24
25 struct S2S_DeviceStruct;
26 typedef struct S2S_DeviceStruct S2S_Device;
27
28 struct S2S_TargetStruct;
29 typedef struct S2S_TargetStruct S2S_Target;
30
31 struct S2S_TargetStateStruct;
32 typedef struct S2S_TargetStateStruct S2S_TargetState;
33
34 typedef enum
35 {
36         MEDIA_STARTED = 1,     // Controlled via START STOP UNIT
37         MEDIA_PRESENT = 2,     // SD card is physically present
38         MEDIA_INITIALISED = 4, // SD card responded to init sequence
39         MEDIA_WP = 8           // Write-protect.
40 } MEDIA_STATE;
41
42 struct S2S_TargetStateStruct
43 {
44         ScsiSense sense;
45
46         uint16_t unitAttention; // Set to the sense qualifier key to be returned.
47
48         // Only let the reserved initiator talk to us.
49         // A 3rd party may be sending the RESERVE/RELEASE commands
50         int reservedId; // 0 -> 7 if reserved. -1 if not reserved.
51         int reserverId; // 0 -> 7 if reserved. -1 if not reserved.
52
53         // Shadow parameters, possibly not saved to flash yet.
54         // Set via Mode Select
55         uint16_t bytesPerSector;
56 };
57
58 struct S2S_TargetStruct
59 {
60         S2S_Device* device;
61         S2S_TargetCfg* cfg;
62
63         S2S_TargetState state;
64 };
65
66 struct S2S_DeviceStruct
67 {
68         void (*earlyInit)(S2S_Device* dev);
69     void (*init)(S2S_Device* dev);
70
71         S2S_Target* (*getTargets)(S2S_Device* dev, int* count);
72
73         // Get the number of 512 byte blocks
74         uint32_t (*getCapacity)(S2S_Device* dev);
75
76         int (*pollMediaChange)(S2S_Device* dev);
77         void (*pollMediaBusy)(S2S_Device* dev);
78
79     void (*erase)(S2S_Device* dev, uint32_t sectorNumber, uint32_t count);
80     void (*read)(S2S_Device* dev, uint32_t sectorNumber, uint32_t count, uint8_t* buffer);
81     void (*readAsync)(S2S_Device* dev, uint32_t sectorNumber, uint32_t count, uint8_t* buffer);
82     int  (*readAsyncPoll)(S2S_Device* dev);
83     void (*write)(S2S_Device* dev, uint32_t sectorNumber, uint32_t count, const uint8_t* buffer);
84
85         MEDIA_STATE mediaState;
86     CONFIG_STOREDEVICE deviceType;
87 };
88
89 S2S_Target* s2s_DeviceFindByScsiId(int scsiId);
90
91 S2S_Device** s2s_GetDevices(int* count);
92
93 void s2s_deviceEarlyInit();
94 void s2s_deviceInit();
95 int s2s_pollMediaChange();
96 #endif
97
98