Creating new repository to prune history.
[SCSI2SD-V6.git] / software / SCSI2SD / SCSI2SD.cydsn / loopback.c
1 //      Copyright (C) 2013 Michael McMaster <michael@codesrc.com>\r
2 //\r
3 //      This file is part of SCSI2SD.\r
4 //\r
5 //      SCSI2SD is free software: you can redistribute it and/or modify\r
6 //      it under the terms of the GNU General Public License as published by\r
7 //      the Free Software Foundation, either version 3 of the License, or\r
8 //      (at your option) any later version.\r
9 //\r
10 //      SCSI2SD is distributed in the hope that it will be useful,\r
11 //      but WITHOUT ANY WARRANTY; without even the implied warranty of\r
12 //      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
13 //      GNU General Public License for more details.\r
14 //\r
15 //      You should have received a copy of the GNU General Public License\r
16 //      along with SCSI2SD.  If not, see <http://www.gnu.org/licenses/>.\r
17 \r
18 #include "loopback.h"\r
19 #include "device.h"\r
20 \r
21 // Return true if all inputs are un-asserted (1)\r
22 // Note that CyPins returns non-zero if pin is active. It does NOT\r
23 // necessarily return 1.\r
24 static int test_initial_inputs(void)\r
25 {\r
26         uint8 dbx = SCSI_In_DBx_Read();\r
27         int result =\r
28                 (dbx == 0xFF) &&\r
29                 CyPins_ReadPin(SCSI_In_DBP) &&\r
30                 CyPins_ReadPin(SCSI_In_ATN) &&\r
31                 CyPins_ReadPin(SCSI_In_BSY)     &&\r
32                 CyPins_ReadPin(SCSI_In_ACK) &&\r
33                 CyPins_ReadPin(SCSI_In_RST) &&\r
34                 CyPins_ReadPin(SCSI_In_MSG) &&\r
35                 CyPins_ReadPin(SCSI_In_SEL) &&\r
36                 CyPins_ReadPin(SCSI_In_CD) &&\r
37                 CyPins_ReadPin(SCSI_In_REQ) &&\r
38                 CyPins_ReadPin(SCSI_In_IO);\r
39 \r
40         return result;\r
41 }\r
42 \r
43 static int test_data_lines(void)\r
44 {\r
45         int result = 1;\r
46         int i;\r
47         for (i = 0; i < 8; ++i)\r
48         {\r
49                 // We write using Active High\r
50                 SCSI_Out_DBx_Write(1 << i);\r
51                 CyDelay(1); // ms\r
52                 \r
53                 // And expect an Active Low response.\r
54                 uint8 dbx = SCSI_In_DBx_Read();\r
55                 result = result && (dbx == (0xFF ^ (1 << i)));\r
56         }\r
57         SCSI_Out_DBx_Write(0);\r
58         return result;\r
59 }\r
60 \r
61 static int test_data_10MHz(void)\r
62 {\r
63         // 10MHz = 100ns period.\r
64         // We'll try and go high -> low -> high in 100ns.\r
65         // At 66MHz, 50ns ~= 3 cycles.\r
66         \r
67         int result = 1;\r
68         int i;\r
69         for (i = 0; i < 100; ++i)\r
70         {\r
71                 // We write using Active High\r
72                 SCSI_Out_DBx_Write(0xFF);\r
73                 CyDelayCycles(3);\r
74                 // And expect an Active Low response.\r
75                 uint8 dbx = SCSI_In_DBx_Read();\r
76                 result = result && (dbx == 0);\r
77                 \r
78                 // We write using Active High\r
79                 SCSI_Out_DBx_Write(0);\r
80                 CyDelayCycles(3);\r
81                 // And expect an Active Low response.\r
82                 dbx = SCSI_In_DBx_Read();\r
83                 result = result && (dbx == 0xFF);\r
84         }\r
85         SCSI_Out_DBx_Write(0);\r
86         return result;\r
87 }\r
88 \r
89 static void test_error(void)\r
90 {\r
91         // Toggle LED.\r
92         while (1)\r
93         {\r
94                 LED1_Write(0);\r
95                 CyDelay(250); // ms\r
96                 LED1_Write(1);\r
97                 CyDelay(250); // ms\r
98         }\r
99 }\r
100 \r
101 static void test_success(void)\r
102 {\r
103         // Toggle LED.\r
104         while (1)\r
105         {\r
106                 LED1_Write(0);\r
107                 CyDelay(1000); // ms\r
108                 LED1_Write(1);\r
109                 CyDelay(1000); // ms\r
110         }\r
111 }\r
112 void scsi2sd_test_loopback(void)\r
113 {\r
114         if (!test_initial_inputs() || !test_data_lines() || !test_data_10MHz())\r
115         {\r
116                 test_error();\r
117         }\r
118         else\r
119         {\r
120                 test_success();\r
121         }\r
122 }