1 /*
2  * Copyright (C) 2014 Andrew Duggan
3  * Copyright (C) 2014 Synaptics Inc
4  *
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at
8  *
9  *      http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  */
17 
18 #ifndef _HIDDEVICE_H_
19 #define _HIDDEVICE_H_
20 
21 #include <linux/hidraw.h>
22 #include <string>
23 #include "rmidevice.h"
24 
25 class HIDDevice : public RMIDevice
26 {
27 public:
HIDDevice()28 	HIDDevice() : RMIDevice(), m_inputReport(NULL), m_outputReport(NULL), m_attnData(NULL),
29 		      m_readData(NULL),
30 		      m_inputReportSize(0),
31 		      m_outputReportSize(0),
32 		      m_featureReportSize(0),
33 		      m_deviceOpen(false)
34 	{}
35 	virtual int Open(const char * filename);
36 	virtual int Read(unsigned short addr, unsigned char *buf,
37 				unsigned short len);
38 	virtual int Write(unsigned short addr, const unsigned char *buf,
39 				 unsigned short len);
40 	virtual int SetMode(int mode);
41 	virtual int WaitForAttention(struct timeval * timeout = NULL,
42 					unsigned int source_mask = RMI_INTERUPT_SOURCES_ALL_MASK);
43 	virtual int GetAttentionReport(struct timeval * timeout, unsigned int source_mask,
44 					unsigned char *buf, unsigned int *len);
45 	virtual void Close();
46 	virtual void RebindDriver();
~HIDDevice()47 	~HIDDevice() { Close(); }
48 
49 	virtual void PrintDeviceInfo();
50 
51 private:
52 	int m_fd;
53 
54 	struct hidraw_report_descriptor m_rptDesc;
55 	struct hidraw_devinfo m_info;
56 
57 	unsigned char *m_inputReport;
58 	unsigned char *m_outputReport;
59 
60 	unsigned char *m_attnData;
61 	unsigned char *m_readData;
62 	int m_dataBytesRead;
63 
64 	size_t m_inputReportSize;
65 	size_t m_outputReportSize;
66 	size_t m_featureReportSize;
67 
68 	bool m_deviceOpen;
69 
70 	enum mode_type {
71 		HID_RMI4_MODE_MOUSE			= 0,
72 		HID_RMI4_MODE_ATTN_REPORTS		= 1,
73 		HID_RMI4_MODE_NO_PACKED_ATTN_REPORTS	= 2,
74 	};
75 
76 	int GetReport(int *reportId, struct timeval * timeout = NULL);
77 	void PrintReport(const unsigned char *report);
78 	void ParseReportSizes();
79 
80 	// static HID utility functions
81 	static bool LookupHidDeviceName(int bus, int vendorId, int productId, std::string &deviceName);
82 	static bool FindTransportDevice(int bus, std::string & hidDeviceName,
83 					std::string & transportDeviceName, std::string & driverPath);
84 	static bool FindHidRawFile(std::string & hidDeviceName, std::string & hidrawFile);
85  };
86 
87 #endif /* _HIDDEVICE_H_ */
88