dff2f345456bd3b86943c369d2e7ca60772b80ef
[SCSI2SD-V6.git] / src / firmware / 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 #define SCSI_CTRL_IDMASK ((volatile uint8_t*)0x60000000)
21 #define SCSI_CTRL_PHASE ((volatile uint8_t*)0x60000001)
22 #define SCSI_CTRL_BSY ((volatile uint8_t*)0x60000002)
23 #define SCSI_FIFO_SEL ((volatile uint8_t*)0x60000003)
24 #define SCSI_DATA_CNT_HI ((volatile uint8_t*)0x60000004)
25 #define SCSI_DATA_CNT_LO ((volatile uint8_t*)0x60000005)
26 #define SCSI_DATA_CNT_SET ((volatile uint8_t*)0x60000006)
27
28 #define SCSI_STS_FIFO ((volatile uint8_t*)0x60000010)
29 #define SCSI_STS_ALTFIFO ((volatile uint8_t*)0x60000011)
30 #define SCSI_STS_FIFO_COMPLETE ((volatile uint8_t*)0x60000012)
31 #define SCSI_STS_SELECTED ((volatile uint8_t*)0x60000013)
32 #define SCSI_STS_SCSI ((volatile uint8_t*)0x60000014)
33
34 #define SCSI_FIFO_DATA ((volatile uint8_t*)0x60000020)
35 #define SCSI_FIFO_DEPTH 512
36
37
38 #define scsiPhyFifoFull() ((*SCSI_STS_FIFO & 0x02) == 0x02)
39 #define scsiPhyFifoEmpty() ((*SCSI_STS_FIFO & 0x01) == 0x01)
40
41 #define scsiPhyFifoFlip() \
42 {\
43         scsiPhyFifoSel ^= 1; \
44         *SCSI_FIFO_SEL = scsiPhyFifoSel; \
45 }
46
47 // Clear 4 byte fifo
48 #define scsiPhyFifoClear() (void) scsiPhyRx(); (void) scsiPhyRx(); (void) scsiPhyRx(); (void) scsiPhyRx();
49
50 #define scsiPhyTx(val) *SCSI_FIFO_DATA = (val)
51 #define scsiPhyRx() *SCSI_FIFO_DATA
52 #define scsiPhyComplete() ((*SCSI_STS_FIFO_COMPLETE & 0x01) == 0x01)
53
54 #define scsiStatusATN() ((*SCSI_STS_SCSI & 0x01) == 0x01)
55 #define scsiStatusBSY() ((*SCSI_STS_SCSI & 0x02) == 0x02)
56 #define scsiStatusRST() ((*SCSI_STS_SCSI & 0x04) == 0x04)
57
58 extern uint8_t scsiPhyFifoSel;
59
60 void scsiPhyInit(void);
61 void scsiPhyConfig(void);
62 void scsiPhyReset(void);
63
64 void scsiEnterPhase(int phase);
65 void scsiEnterBusFree(void);
66
67 void scsiWrite(const uint8_t* data, uint32_t count);
68 void scsiRead(uint8_t* data, uint32_t count);
69 void scsiWriteByte(uint8_t value);
70 uint8_t scsiReadByte(void);
71
72
73 void sdTmpRead(uint8_t* data, uint32_t lba, int sectors);
74 void sdTmpWrite(uint8_t* data, uint32_t lba, int sectors);
75 #if 0
76
77
78
79
80
81 #define SCSI_SetPin(pin) \
82         CyPins_SetPin((pin));
83
84 #define SCSI_ClearPin(pin) \
85         CyPins_ClearPin((pin));
86
87 // Active low: we interpret a 0 as "true", and non-zero as "false"
88 #define SCSI_ReadPin(pin) \
89         (CyPins_ReadPin((pin)) == 0)
90
91 // These signals go through a glitch filter - we do not access the pin
92 // directly
93 enum FilteredInputs
94 {
95         SCSI_Filt_ATN = 0x01,
96         SCSI_Filt_BSY = 0x02,
97         SCSI_Filt_SEL = 0x04,
98         SCSI_Filt_RST = 0x08,
99         SCSI_Filt_ACK = 0x10            
100 };
101 #define SCSI_ReadFilt(filt) \
102         ((SCSI_Filtered_Read() & (filt)) == 0)
103
104 // SCSI delays, as referenced to the cpu clock
105 #define CPU_CLK_PERIOD_NS (1000000000U / BCLK__BUS_CLK__HZ)
106 #define scsiDeskewDelay() CyDelayCycles((55 / CPU_CLK_PERIOD_NS) + 1)
107
108 // Contains the odd-parity flag for a given 8-bit value.
109 extern const uint8_t Lookup_OddParity[256];
110
111 #endif
112
113 extern volatile uint8_t scsiRxDMAComplete;
114 extern volatile uint8_t scsiTxDMAComplete;
115 #define scsiDMABusy() (!(scsiRxDMAComplete && scsiTxDMAComplete))
116
117 void scsiReadDMA(uint8_t* data, uint32_t count);
118 int scsiReadDMAPoll();
119
120 void scsiWriteDMA(const uint8_t* data, uint32_t count);
121 int scsiWriteDMAPoll();
122
123 #if 0
124 uint8_t scsiReadDBxPins(void);
125
126
127 int scsiSelfTest(void);
128
129 #endif
130
131 #endif