Use DMA for SCSI and SD card transfers for a massive performance boost.
[SCSI2SD-V6.git] / software / SCSI2SD / src / scsiPhy.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 SCSIPHY_H
18 #define SCSIPHY_H
19
20 // Definitions to match the scsiTarget status register.
21 typedef enum
22 {
23         SCSI_PHY_TX_FIFO_NOT_FULL =  0x01,
24         SCSI_PHY_RX_FIFO_NOT_EMPTY = 0x02,
25
26         // The TX FIFO is empty and the state machine is in the idle state
27         SCSI_PHY_TX_COMPLETE = 0x10
28 } SCSI_PHY_STATE;
29
30 #define scsiPhyStatus() CY_GET_REG8(scsiTarget_StatusReg__STATUS_REG)
31 #define scsiPhyTxFifoFull() ((scsiPhyStatus() & SCSI_PHY_TX_FIFO_NOT_FULL) == 0)
32 #define scsiPhyRxFifoEmpty() ((scsiPhyStatus() & SCSI_PHY_RX_FIFO_NOT_EMPTY) == 0)
33
34 // Clear 4 byte fifo
35 #define scsiPhyRxFifoClear() scsiPhyRx(); scsiPhyRx(); scsiPhyRx(); scsiPhyRx();
36
37 #define scsiPhyTx(val) CY_SET_REG8(scsiTarget_datapath__F0_REG, (val))
38 #define scsiPhyRx() CY_GET_REG8(scsiTarget_datapath__F1_REG)
39
40 #define SCSI_SetPin(pin) \
41         CyPins_SetPin((pin));
42
43 #define SCSI_ClearPin(pin) \
44         CyPins_ClearPin((pin));
45
46 // Active low: we interpret a 0 as "true", and non-zero as "false"
47 #define SCSI_ReadPin(pin) \
48         (CyPins_ReadPin((pin)) == 0)
49
50 // Contains the odd-parity flag for a given 8-bit value.
51 extern const uint8_t Lookup_OddParity[256];
52
53 void scsiPhyReset(void);
54 void scsiPhyInit(void);
55
56 uint8_t scsiReadByte(void);
57 void scsiRead(uint8_t* data, uint32_t count);
58 void scsiReadDMA(uint8_t* data, uint32_t count);
59 int scsiReadDMAPoll();
60
61 void scsiWriteByte(uint8_t value);
62 void scsiWrite(uint8_t* data, uint32_t count);
63 void scsiWriteDMA(uint8_t* data, uint32_t count);
64 int scsiWriteDMAPoll();
65
66 uint8_t scsiReadDBxPins(void);
67
68 void scsiEnterPhase(int phase);
69
70 #endif