Mercurial > rcctl_linux
comparison rcctl.c @ 2:b16b82dbfe87
massive cleanup
author | Yoshiki Yazawa <yaz@honeyplanet.jp> |
---|---|
date | Wed, 05 Jan 2011 21:41:39 +0900 |
parents | 05cc06e88a57 |
children | cd846ca24ca4 |
comparison
equal
deleted
inserted
replaced
1:05cc06e88a57 | 2:b16b82dbfe87 |
---|---|
1 /* rcctl.c --------------------------------------------- | 1 /* rcctl.c --------------------------------------------- |
2 $Id: rcctl.c,v 1.1 2002/12/21 01:13:28 tosy Exp $ | 2 $Id: rcctl.c,v 1.1 2002/12/21 01:13:28 tosy Exp $ |
3 | 3 |
4 v0.10 97.08.15 初期版(コミケット52) | 4 v0.10 97.08.15 (潟宴52) |
5 v0.11 97.08.27 通信タイミング修正 | 5 v0.11 97.08.27 篆<帥ゃ潟遺信罩 |
6 v0.12 97.09.12 U-kara-2サポート | 6 v0.12 97.09.12 U-kara-2泣若 |
7 v0.12a 97.09.15 返り値設定 | 7 v0.12a 97.09.15 菴よ┃絎 |
8 v0.12b 97.09.20 Bug fix (JOY:[SP]) | 8 v0.12b 97.09.20 Bug fix (JOY:[SP]) |
9 v0.20 97.10.01 FreeBSD版 | 9 v0.20 97.10.01 FreeBSD |
10 v0.20a 97.10.18 Bug fix (X2k:[SP],[ST]) | 10 v0.20a 97.10.18 Bug fix (X2k:[SP],[ST]) |
11 v0.21 97.12.10 ALISA-3シーケンス修正 | 11 v0.21 97.12.10 ALISA-3激若宴潟剛信罩 |
12 v0.30 97.12.13 コード変換部(cdcnv.c)分離 | 12 v0.30 97.12.13 潟若紊(cdcnv.c) |
13 v0.40 02.12.16 USB版対応 | 13 v0.40 02.12.16 USB絲上 |
14 【cdcnv.c の履歴も参照のこと】 | 14 v0.50 11.01.06 linux絨吾眼 (yaz) |
15 cdcnv.c 絮ユ眼с | |
15 ------------------------------------------------------*/ | 16 ------------------------------------------------------*/ |
16 #define __LINUX__ | 17 #define __LINUX__ |
17 #include <fcntl.h> | 18 #include <fcntl.h> |
18 #include <stdio.h> | 19 #include <stdio.h> |
19 #include <termios.h> | 20 //#include <termios.h> |
20 #include <unistd.h> | 21 //#include <unistd.h> |
21 #include <sys/ioctl.h> | 22 //#include <sys/ioctl.h> |
22 | 23 |
23 #define HID_MAX_USAGES 16 | 24 #define HID_MAX_USAGES 16 |
24 typedef unsigned int __u32; | 25 typedef unsigned int __u32; |
25 typedef unsigned int kernel_ulong_t; | 26 typedef unsigned int kernel_ulong_t; |
26 | 27 |
33 | 34 |
34 #include <asm/types.h> | 35 #include <asm/types.h> |
35 #include <errno.h> | 36 #include <errno.h> |
36 #include <string.h> | 37 #include <string.h> |
37 | 38 |
39 #include "debug.h" | |
38 | 40 |
39 #ifndef S_VERS | 41 #ifndef S_VERS |
40 #define S_VERS "0.41" | 42 #define S_VERS "0.50" |
41 #endif | 43 #endif |
42 | 44 |
43 /* globals */ | 45 /* globals */ |
44 HIDInterface *hidif; | 46 HIDInterface *hidif; |
45 extern int errno; | 47 extern int errno; |
48 int debug = 0; | |
46 | 49 |
47 /* prototypes */ | 50 /* prototypes */ |
48 int cdcnv(int buf[], char *mak, char *cod); | 51 int cdcnv(int buf[], char *mak, char *cod); |
49 extern char *cverrstr[]; | 52 extern char *cverrstr[]; |
50 | 53 |
51 int init_usb(void) | 54 int init_usb(void) |
52 { | 55 { |
53 hid_return ret; | 56 hid_return ret; |
54 | 57 |
55 // unsigned int report_id; | |
56 // unsigned int report_type; | |
57 // unsigned int size; | |
58 | |
59 /* vendor id and product id of okecon */ | 58 /* vendor id and product id of okecon */ |
60 HIDInterfaceMatcher matcher = { 0x0bfe, 0x2022, NULL, NULL, 0 }; | 59 HIDInterfaceMatcher matcher = { 0x0bfe, 0x2022, NULL, NULL, 0 }; |
61 | 60 |
62 /* see include/debug.h for possible values */ | 61 /* see include/debug.h for possible values */ |
63 hid_set_debug(HID_DEBUG_ALL); | 62 hid_set_debug(debug); |
64 hid_set_debug_stream(stderr); | 63 hid_set_debug_stream(stderr); |
65 /* passed directly to libusb */ | 64 /* passed directly to libusb */ |
66 hid_set_usb_debug(0); | 65 hid_set_usb_debug(0); |
67 | 66 |
68 ret = hid_init(); | 67 ret = hid_init(); |
80 ret = hid_force_open(hidif, 0, &matcher, 3); | 79 ret = hid_force_open(hidif, 0, &matcher, 3); |
81 if (ret != HID_RET_SUCCESS) { | 80 if (ret != HID_RET_SUCCESS) { |
82 fprintf(stderr, "hid_force_open failed with return code %d\n", ret); | 81 fprintf(stderr, "hid_force_open failed with return code %d\n", ret); |
83 return 1; | 82 return 1; |
84 } | 83 } |
85 | |
86 | |
87 | |
88 #if 0 | |
89 /* read feature */ | |
90 ret = hid_get_feature_report(hidif, path, depth, buffer, size); | |
91 if(ret != HID_RET_SUCCESS) { | |
92 fprintf(stderr, "hid_get_feature_report failed with return code %d\n", ret); | |
93 return 1; | |
94 } | |
95 | |
96 /* parse */ | |
97 | |
98 /* prepare buffers */ | |
99 hid_get_report_size(hidif, report_id, report_type, &size); | |
100 if(size != 8) { | |
101 fprintf(stderr, "%s is not 'OKCon/USB'?\n", UDEV); | |
102 return 1; | |
103 }; | |
104 | |
105 | |
106 // BSD | |
107 /* read header */ | |
108 if ((rd = hid_get_report_desc(fd)) == 0) { | |
109 fprintf(stderr, "Failed on USB_GET_REPORT_DESC.\n"); | |
110 return 1; | |
111 } | |
112 | |
113 /* parse */ | |
114 hd = hid_start_parse(rd, 1<<hid_output); | |
115 while ( hid_get_item(hd, &shi) ) { | |
116 if(shi.kind == hid_output) | |
117 break; | |
118 } | |
119 hid_end_parse(hd); | |
120 | |
121 /* prepare buffers */ | |
122 hid_get_report_size(&hidif, report_id, report_type, &size); | |
123 if(size != 8) { | |
124 fprintf(stderr, "%s is not 'OKCon/USB'?\n", UDEV); | |
125 return 1; | |
126 }; | |
127 | |
128 hid_dispose_report_desc(rd); | |
129 #endif | |
130 | 84 |
131 return 0; | 85 return 0; |
132 } /* end of init_usb() */ | 86 } /* end of init_usb() */ |
133 | 87 |
134 | 88 |
151 } | 105 } |
152 | 106 |
153 return 0; | 107 return 0; |
154 } | 108 } |
155 | 109 |
110 void usage(char *cmd) | |
111 { | |
112 printf("'Oke-Con' controller, version " S_VERS ".\n"); | |
113 printf("Copyright (C) 1997-2002 by Tosy / W341IG.\n"); | |
114 printf("Adapted to linux by yaz / honeyplanet development\n"); | |
115 printf("usage: %s <options> <vender> <song number>\n", cmd); | |
116 printf("options: -d <debug level>\n"); | |
117 exit(0); | |
118 } | |
156 | 119 |
157 | 120 |
158 int main(int ac, char *av[]) | 121 int main(int argc, char **argv) |
159 { | 122 { |
160 int i, u, buf[16]; | 123 int i, u, buf[16]; |
161 unsigned char sbuf[8]; | 124 unsigned char sbuf[8]; |
162 hid_return ret; | 125 hid_return ret; |
126 int opt; | |
163 | 127 |
164 if (ac < 3) { | 128 if(argc < 3) { |
165 printf("'Oke-Con' controller, version " S_VERS ".\n"); | 129 usage(argv[0]); |
166 printf("Copyright (C) 1997-2002 by Tosy / W341IG.\n"); | |
167 printf("Usage: rcctl <maker> <code>\n"); | |
168 return 255; | |
169 } | 130 } |
170 | 131 |
171 if ((u = cdcnv(buf, av[1], av[2])) < 0) { | 132 while ((opt=getopt(argc, argv, "d:h")) != -1) { |
172 fprintf(stderr, "%s: %s\n", av[0], cverrstr[~u]); | 133 switch (opt) { |
134 case 'd': | |
135 debug = atoi(optarg); | |
136 break; | |
137 case 'h': | |
138 default: | |
139 usage(argv[0]); | |
140 break; | |
141 } | |
142 } | |
143 argc -= optind; | |
144 argv += optind; | |
145 | |
146 if ((u = cdcnv(buf, *argv, *(argv+1))) < 0) { | |
147 fprintf(stderr, "%s: %s\n", *argv, cverrstr[~u]); | |
173 return 1; | 148 return 1; |
174 } | 149 } |
175 printf("cdcnv %d\n", u); | 150 debug(1, "cdcnv %d\n", u); |
176 | 151 debug(1, "Initializing....\n"); |
177 #ifdef VERBOSE | |
178 printf("Initializing....\n"); | |
179 #endif | |
180 | 152 |
181 if (init_usb()) | 153 if (init_usb()) |
182 return 255; | 154 return 255; |
183 | 155 |
184 #ifdef VERBOSE | 156 debug(1, " done.\n"); |
185 printf(" done.\n"); | |
186 #endif | |
187 | 157 |
188 #ifdef VERBOSE | |
189 for(i=0; i<u; i++ ) { | 158 for(i=0; i<u; i++ ) { |
190 printf("%02x ", buf[i]); | 159 debug(1, "%02x ", buf[i]); |
191 } | 160 } |
192 printf("\n"); | 161 debug(1, "\n"); |
193 #endif | |
194 | 162 |
195 /* xxx */ | |
196 const int PATH_IN[1] = { 0xffa10004 }; | 163 const int PATH_IN[1] = { 0xffa10004 }; |
197 // const int PATH_OUT[1] = { 0xffa10008 }; | |
198 | 164 |
199 /* u is the total length of the packet to send */ | 165 /* u is the total length of the packet to send */ |
200 for(i=1; i<u; i++ ) { | 166 for(i=1; i<u; i++ ) { |
201 sbuf[(i-1)%8] = buf[i] & 0x00ff; | 167 sbuf[(i-1)%8] = buf[i] & 0x00ff; |
202 #ifdef VERBOSE | 168 debug(1, "%02x ", sbuf[(i-1)%8]); |
203 printf("%02x ", sbuf[(i-1)%8]); | |
204 #endif | |
205 if ((i == 8)||(i == (u-1))) { | 169 if ((i == 8)||(i == (u-1))) { |
206 ret = hid_set_output_report(hidif, PATH_IN, 2, (char *)sbuf, 8); | 170 ret = hid_set_output_report(hidif, PATH_IN, 2, (char *)sbuf, 8); |
207 fprintf(stderr, "**WRITE**\n"); | 171 fprintf(stderr, "**WRITE**\n"); |
208 if (ret != HID_RET_SUCCESS) { | 172 if (ret != HID_RET_SUCCESS) { |
209 fprintf(stderr, "hid_set_output_report failed with return code %d\n", ret); | 173 fprintf(stderr, "hid_set_output_report failed with return code %d\n", ret); |
210 } | 174 } |
211 | |
212 #if 0 | |
213 char packet[8]; | |
214 ret = hid_get_input_report(hidif, PATH_OUT, 2, packet, 8); | |
215 if (ret != HID_RET_SUCCESS) { | |
216 fprintf(stderr, "hid_get_input_report failed with return code %d\n", ret); | |
217 } | |
218 #endif | |
219 } | 175 } |
220 } | 176 } |
221 #ifdef VERBOSE | 177 debug(1, "\n"); |
222 printf("\n"); | |
223 #endif | |
224 | 178 |
225 if(fin_usb()) | 179 if(fin_usb()) |
226 return 255; | 180 return 255; |
227 | 181 |
228 return 0; | 182 return 0; |