1 /*
2  * This file is part of OpenCorsairLink.
3  * Copyright (C) 2017-2019  Sean Nelson <audiohacked@gmail.com>
4 
5  * OpenCorsairLink 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 2 of the License, or
8  * any later version.
9 
10  * OpenCorsairLink 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 OpenCorsairLink.  If not, see <http://www.gnu.org/licenses/>.
17  */
18 
19 /*! \file protocol/asetek/core.c
20  *  \brief Core Routines for RMi Series of Power Supplies
21  */
22 #include "device.h"
23 #include "driver.h"
24 #include "lowlevel/asetek.h"
25 #include "print.h"
26 #include "protocol/asetekpro.h"
27 
28 #include <errno.h>
29 #include <libusb.h>
30 #include <stdio.h>
31 #include <stdlib.h>
32 #include <string.h>
33 #include <unistd.h>
34 
35 int
corsairlink_asetekpro_firmware_id(struct corsair_device_info * dev,struct libusb_device_handle * handle,char * firmware,uint8_t firmware_size)36 corsairlink_asetekpro_firmware_id(
37     struct corsair_device_info* dev,
38     struct libusb_device_handle* handle,
39     char* firmware,
40     uint8_t firmware_size )
41 {
42     int rr;
43     uint8_t response[64];
44     uint8_t commands[64];
45     memset( response, 0, sizeof( response ) );
46     memset( commands, 0, sizeof( commands ) );
47 
48     commands[0] = AsetekProReadFirmwareVersion; // query firmware id
49 
50     rr = dev->driver->write( handle, dev->write_endpoint, commands, 1 );
51     rr = dev->driver->read( handle, dev->read_endpoint, response, 7 );
52 
53     msg_debug2(
54         "%02X %02X %02X %02X %02X %02X %02X\n", response[0], response[1], response[2], response[3],
55         response[4], response[5], response[6] );
56 
57     // if (response[0] != 0xAA || response[1] != 0x12
58     //     || response[2] != 0x34 || response[3] != selector)
59     // {
60     //     msg_debug2("Bad Response\n");
61     // }
62 
63     snprintf(
64         firmware, firmware_size, "%d.%d.%d.%d", response[3], response[4], response[5],
65         response[6] );
66 
67     return rr;
68 }
69 
70 int
corsairlink_asetekpro_hardware_version(struct corsair_device_info * dev,struct libusb_device_handle * handle)71 corsairlink_asetekpro_hardware_version(
72     struct corsair_device_info* dev,
73     struct libusb_device_handle* handle)
74 
75 {
76     int rr;
77     uint8_t response[64];
78     uint8_t commands[64];
79     memset( response, 0, sizeof( response ) );
80     memset( commands, 0, sizeof( commands ) );
81 
82     commands[0] = AsetekProReadHardwareVersion;
83 
84     rr = dev->driver->write( handle, dev->write_endpoint, commands, 1 );
85     rr = dev->driver->read( handle, dev->read_endpoint, response, 7 );
86 
87     msg_debug(
88         "hardware version returned: %02X %02X %02X %02X %02X %02X %02X\n", response[0], response[1], response[2], response[3],
89         response[4], response[5], response[6] );
90 
91     return rr;
92 }
93