xref: /haiku/src/add-ons/kernel/drivers/input/i2c_hid/HIDDevice.h (revision e1c4049fed1047bdb957b0529e1921e97ef94770)
1 /*
2  * Copyright 2020, Jérôme Duval, jerome.duval@gmail.com.
3  * Copyright 2008-2011, Michael Lotz <mmlr@mlotz.ch>
4  * Distributed under the terms of the MIT license.
5  */
6 #ifndef I2C_HID_DEVICE_H
7 #define I2C_HID_DEVICE_H
8 
9 
10 #include <i2c.h>
11 
12 #include "HIDParser.h"
13 #include "I2CHIDProtocol.h"
14 
15 
16 class ProtocolHandler;
17 
18 
19 class HIDDevice {
20 public:
21 								HIDDevice(uint16 descriptorAddress, i2c_device_interface* i2c,
22 									i2c_device i2cCookie);
23 								~HIDDevice();
24 
25 			status_t			InitCheck() const { return fStatus; }
26 
27 			bool				IsOpen() const { return fOpenCount > 0; }
28 			status_t			Open(ProtocolHandler *handler, uint32 flags);
29 			status_t			Close(ProtocolHandler *handler);
30 			int32				OpenCount() const { return fOpenCount; }
31 
32 			void				Removed();
33 			bool				IsRemoved() const { return fRemoved; }
34 
35 			status_t			MaybeScheduleTransfer(HIDReport *report);
36 
37 			status_t			SendReport(HIDReport *report);
38 
39 			HIDParser &			Parser() { return fParser; }
40 			ProtocolHandler *	ProtocolHandlerAt(uint32 index) const;
41 
42 private:
43 	static	void				_TransferCallback(void *cookie,
44 									status_t status, void *data,
45 									size_t actualLength);
46 	static	void				_UnstallCallback(void *cookie,
47 									status_t status, void *data,
48 									size_t actualLength);
49 
50 			status_t			_Reset();
51 			status_t			_SetPower(uint8 power);
52 			status_t			_FetchBuffer(uint8* cmd, size_t cmdLength,
53 									void* buffer, size_t bufferLength);
54 			status_t			_FetchReport(uint8 type, uint8 id,
55 									size_t reportSize);
56 			status_t			_ExecCommand(i2c_op op, uint8* cmd,
57 									size_t cmdLength, void* buffer,
58 									size_t bufferLength);
59 
60 private:
61 			status_t			fStatus;
62 
63 
64 			bigtime_t			fTransferLastschedule;
65 			int32				fTransferScheduled;
66 			size_t				fTransferBufferSize;
67 			uint8 *				fTransferBuffer;
68 
69 			int32				fOpenCount;
70 			bool				fRemoved;
71 
72 			HIDParser			fParser;
73 
74 			uint32				fProtocolHandlerCount;
75 			ProtocolHandler *	fProtocolHandlerList;
76 
77 			uint16				fDescriptorAddress;
78 			i2c_hid_descriptor	fDescriptor;
79 
80 			uint8*				fReportDescriptor;
81 
82 			i2c_device_interface*	fI2C;
83 			i2c_device				fI2CCookie;
84 
85 };
86 
87 
88 #endif // I2C_HID_DEVICE_H
89