542f1625b9aa6116bdc154eaa9c92eb0ddf3a6ee
[SCSI2SD-V6.git] / software / scsi2sd-debug / scsi2sd-debug.cc
1 //      Copyright (C) 2014 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
18 #include <getopt.h>
19 #include <inttypes.h>
20 #include <stdint.h>
21 #include <stdio.h>
22 #include <stdlib.h>
23 #include <string.h>
24 #include <unistd.h>
25
26 // htonl/ntohl includes.
27 #ifdef _WIN32
28 #include <winsock2.h>
29 #else
30 #include <arpa/inet.h>
31 #endif
32
33 #include "hidapi.h"
34
35 #define MIN(a,b) (a < b ? a : b)
36
37 FILE* logfile = NULL;
38
39 static void readConfig(hid_device* handle)
40 {
41         // First byte is the report ID (0)
42         unsigned char buf[65];
43         memset(buf, 0, sizeof(buf));
44         int result = hid_read(handle, buf, sizeof(buf));
45
46         if (result < 0)
47         {
48                 fprintf(stderr, "USB HID Read Failure: %ls\n", hid_error(handle));
49         }
50         int i;
51         for (i = 0; i < 32; ++i)
52         {
53                 fprintf(logfile, "%02x ", buf[i]);
54         }
55         fprintf(logfile, "\n");
56         fflush(logfile);
57 }
58
59 static void usage()
60 {
61         printf("Usage: scsi2sd-debug outputfile\n");
62         printf("\n");
63         printf("outputfile\tPath to the output log file.\n\n");
64         printf("\n\n");
65         exit(1);
66 }
67
68
69 int main(int argc, char* argv[])
70 {
71         printf("SCSI2SD Debug Utility.\n");
72         printf("Copyright (C) 2014 Michael McMaster <michael@codesrc.com>\n\n");
73
74         if (argc != 2)
75         {
76                 usage();
77                 exit(1);
78         }
79
80         logfile = fopen(argv[1], "w");
81         if (!logfile)
82         {
83                 fprintf(stderr, "Could not write to file %s.\n", argv[1]);
84                 exit(1);
85         }
86
87
88         uint16_t vendorId = 0x04B4; // Cypress
89         uint16_t productId = 0x1337; // SCSI2SD
90
91         printf(
92                 "USB device parameters\n\tVendor ID:\t0x%04X\n\tProduct ID:\t0x%04X\n",
93                 vendorId,
94                 productId);
95
96         // Enumerate and print the HID devices on the system
97         struct hid_device_info *dev = hid_enumerate(vendorId, productId);
98
99         if (!dev)
100         {
101                 fprintf(stderr, "ERROR: SCSI2SD USB device not found.\n");
102                 exit(1);
103         }
104
105         // We need the SECOND interface for debug data
106         while (dev && dev->interface_number != 1)
107         {
108                 dev = dev->next;
109         }
110         if (!dev)
111         {
112                 fprintf(stderr, "ERROR: SCSI2SD Debug firmware not enabled.\n");
113                 exit(1);
114         }
115
116         printf("USB Device Found\n  type: %04hx %04hx\n  path: %s\n  serial_number: %ls",
117                 dev->vendor_id, dev->product_id, dev->path, dev->serial_number);
118         printf("\n");
119         printf("  Manufacturer: %ls\n", dev->manufacturer_string);
120         printf("  Product:      %ls\n", dev->product_string);
121         printf("\n");
122
123         hid_device* handle = hid_open_path(dev->path);
124         if (!handle)
125         {
126                 fprintf(
127                         stderr,
128                         "ERROR: Could not open device %s. Check permissions.\n", dev->path
129                         );
130                 exit(1);
131         }
132
133
134         while (1)
135         {
136                 readConfig(handle);
137         }
138
139         return 0;
140 }
141