source: libvcomm/vcomm.c @ a92d0c9

Revision a92d0c9, 4.3 KB checked in by Tarmo Kople <tarmo@…>, 5 years ago (diff)

+ New VID & PID support

  • Property mode set to 100755
Line 
1/*
2 * vcomm.c
3 *
4 *  Created on: 10.09.2012
5 *      Author: tarmo
6 */
7
8#include <stdlib.h>
9#include <stdint.h>
10#include <stdio.h>
11#include <string.h>
12#include "hidapi.h"
13#include "proto.h"
14#include "vcomm.h"
15
16struct hid_device_info * Vlist(void) {
17        struct hid_device_info *devs;
18        devs = hid_enumerate(VENDOR_ID, PRODUCT_ID);
19        return devs;
20}
21
22VCOMMAPI void VCOMMCALL Vfree_list(struct hid_device_info *vlist) {
23
24        hid_free_enumeration(vlist);
25        return;
26}
27
28VCOMMAPI int VCOMMCALL Vopen(hid_device **vhandle, char *serial) {
29        int status;
30        status = Vopen_by_vid_pid(vhandle, VENDOR_ID_OLD, PRODUCT_ID_OLD, serial);
31        if(status == SUCCESS){
32                return SUCCESS;         // Found by old VID & PID
33        }else if (status != ERR_DEV_NOT_FOUND) {
34                return status;          // Error opening IRvoodoo
35        }
36        status = Vopen_by_vid_pid(vhandle, VENDOR_ID, PRODUCT_ID, serial);
37        return status;
38}
39
40VCOMMAPI int VCOMMCALL Vopen_by_vid_pid(hid_device **vhandle, unsigned short vid, unsigned short pid , char *serial) {
41
42        char bufserial[33];
43        struct hid_device_info *devs, *cur_dev, *v_dev; // HID dev info struct pointers
44        v_dev = NULL;
45
46        devs = hid_enumerate(vid, pid); // Get linked list of IRvoodoo info structs
47
48        // Loop while last HID is found(4 EP found)
49        cur_dev = devs;
50
51        // Find device (first or by serial)
52        while (cur_dev) {
53
54                if (serial) {
55                        sprintf(bufserial, "%ls", cur_dev->serial_number);
56                        if (strcmp(serial, bufserial) == 0) {
57
58#ifdef mac
59                                if (cur_dev->usage_page == 0xFF00 && cur_dev->usage == 0x01) {
60                                        v_dev = cur_dev;
61                                        break;
62                                }
63#else
64                                if (cur_dev->interface_number == 3) {
65                                        v_dev = cur_dev;
66                                        break;
67                                }
68#endif
69                        }
70                } else {
71#ifdef mac
72                        if (cur_dev->usage_page == 0xFF00 && cur_dev->usage == 0x01) {
73                                v_dev = cur_dev;
74                                break; // select first IRvoodoo config interface
75                        }
76#else
77                                if (cur_dev->interface_number == 3) {
78                                        v_dev = cur_dev;
79                                        break; // select first IRvoodoo config interface
80                                }
81#endif
82                }
83                cur_dev = cur_dev->next;
84        }
85
86        // IRvoodo not found
87        if (!v_dev)
88                return ERR_DEV_NOT_FOUND;
89
90        // Open IRvoodoo confg HID interface by system path
91
92        *vhandle = hid_open_path(v_dev->path);
93
94        // Insufficent permissions ?
95        if (!*vhandle)
96                return ERR_OPEN_DEV;
97
98        // free devs linked list
99        hid_free_enumeration(devs);
100        return SUCCESS;
101}
102
103VCOMMAPI int VCOMMCALL Vclose(hid_device **vhandle) {
104
105        hid_close(*vhandle);
106        *vhandle = NULL;
107        hid_exit();
108
109        return SUCCESS;
110}
111
112VCOMMAPI int VCOMMCALL Vcomm(hid_device **vhandle, request_t *req,
113                response_t *resp) {
114#define BUFF_SIZE 64
115#define HID_REPORT_ID 0
116
117#ifdef LOG
118        setbuf(stdout, NULL);
119        printf("-------Request------------\n");
120        printf("Type 0x%02X\n", req->type);
121#endif
122
123        unsigned char buff[BUFF_SIZE]; // buffer for incoming HID raport
124        int16_t num_in_reports; // number of incoming hid reports
125
126        req->report_id = HID_REPORT_ID; // always 0, since we have only one report descriptor
127        hid_write(*vhandle, (unsigned char *) req, 65);
128
129        // Entering ISP mode, dont wait response, end communication
130        if (req->type == REQ_ENTER_ISP) {
131                return 0;
132        }
133
134        int res = hid_read(*vhandle, buff, BUFF_SIZE); // send report
135        if (res < 0)
136                // FAIL
137                return res; // comm err
138
139        memcpy(resp, buff, BUFF_SIZE);
140
141#ifdef LOG
142        printf("-------Response------------\n");
143        printf("Response size %d bytes\n", resp->len);
144#endif
145
146        if (resp->len <= 60) { // 1 in report, no more incoming data
147
148#ifdef LOG
149                printf("Response length 1 packet \n");
150                printf("-----------End-------------\n");
151#endif
152                return SUCCESS;
153        }
154
155        /*
156         *  receive and defragment remaining reports
157         */
158
159        // compute number of in remaining reports
160        num_in_reports = ((resp->len + 4) / BUFF_SIZE);
161        if ((resp->len + 4) % BUFF_SIZE)
162                num_in_reports++;
163
164#ifdef LOG
165        printf("Response length %d packets \n", num_in_reports );
166        printf(".");
167#endif
168
169        // receive remaining
170        uint16_t i;
171        for (i = 1; i < num_in_reports; ++i) {
172                res = hid_read(*vhandle, buff, BUFF_SIZE);
173#ifdef LOG
174                printf(".");
175#endif
176                if (res < 0)
177                        // FAIL
178                        return res;
179                memcpy(((char *) resp) + BUFF_SIZE * i, buff, BUFF_SIZE);
180        }
181#ifdef LOG
182        printf("\n-----------End-------------\n");
183#endif
184        // success
185        return SUCCESS;
186}
187
188VCOMMAPI unsigned int VCOMMCALL Vtest(hid_device **vhandle) {
189        request_t request;
190        response_t response;
191        memset(&response, 0x00, sizeof(response));
192
193        unsigned int *fwver;
194        fwver = (unsigned int *) &response.data[0];
195
196        request.type = REQ_GET_FW_VERSION;
197
198        if (Vcomm(vhandle, &request, &response)) {
199                return 0;
200        }
201
202        return *fwver;
203}
Note: See TracBrowser for help on using the repository browser.