2019-05-03 14:47:45 +00:00
|
|
|
// Copyright 2019, Collabora, Ltd.
|
|
|
|
// SPDX-License-Identifier: BSL-1.0
|
|
|
|
/*!
|
|
|
|
* @file
|
|
|
|
* @brief Wrapper around OS native hid functions.
|
|
|
|
* @author Jakob Bornecrantz <jakob@collabora.com>
|
2019-06-21 20:00:53 +00:00
|
|
|
* @author Ryan Pavlik <ryan.pavlik@collabora.com>
|
2019-05-03 14:47:45 +00:00
|
|
|
*
|
|
|
|
* @ingroup aux_os
|
|
|
|
*/
|
|
|
|
|
|
|
|
#pragma once
|
|
|
|
|
|
|
|
#include "xrt/xrt_config.h"
|
|
|
|
#include "xrt/xrt_compiler.h"
|
|
|
|
|
2019-06-18 18:22:30 +00:00
|
|
|
#ifdef __cplusplus
|
|
|
|
extern "C" {
|
|
|
|
#endif
|
|
|
|
|
2019-05-03 14:47:45 +00:00
|
|
|
|
|
|
|
/*!
|
|
|
|
* Representing a single hid interface on a device.
|
|
|
|
*/
|
|
|
|
struct os_hid_device
|
|
|
|
{
|
|
|
|
int (*read)(struct os_hid_device *hid_dev,
|
|
|
|
uint8_t *data,
|
|
|
|
size_t size,
|
|
|
|
int milliseconds);
|
|
|
|
|
|
|
|
int (*write)(struct os_hid_device *hid_dev,
|
|
|
|
const uint8_t *data,
|
|
|
|
size_t size);
|
|
|
|
|
2019-06-21 20:00:53 +00:00
|
|
|
int (*get_feature)(struct os_hid_device *hid_dev,
|
|
|
|
uint8_t report_num,
|
|
|
|
uint8_t *data,
|
|
|
|
size_t size);
|
|
|
|
|
|
|
|
int (*set_feature)(struct os_hid_device *hid_dev,
|
|
|
|
const uint8_t *data,
|
|
|
|
size_t size);
|
|
|
|
|
2019-05-03 14:47:45 +00:00
|
|
|
void (*destroy)(struct os_hid_device *hid_dev);
|
|
|
|
};
|
|
|
|
|
|
|
|
/*!
|
2019-06-21 20:00:53 +00:00
|
|
|
* Read the next input report, if any, from the given hid device.
|
|
|
|
*
|
|
|
|
* If milliseconds are negative, this call blocks indefinitely, 0 polls,
|
|
|
|
* and positive will block for that amount of milliseconds.
|
2019-05-03 14:47:45 +00:00
|
|
|
*/
|
|
|
|
XRT_MAYBE_UNUSED static inline int
|
|
|
|
os_hid_read(struct os_hid_device *hid_dev,
|
|
|
|
uint8_t *data,
|
|
|
|
size_t size,
|
|
|
|
int milliseconds)
|
|
|
|
{
|
|
|
|
return hid_dev->read(hid_dev, data, size, milliseconds);
|
|
|
|
}
|
|
|
|
|
|
|
|
/*!
|
2019-06-21 20:00:53 +00:00
|
|
|
* Write an output report to the given device.
|
2019-05-03 14:47:45 +00:00
|
|
|
*/
|
|
|
|
XRT_MAYBE_UNUSED static inline int
|
|
|
|
os_hid_write(struct os_hid_device *hid_dev, const uint8_t *data, size_t size)
|
|
|
|
{
|
|
|
|
return hid_dev->write(hid_dev, data, size);
|
|
|
|
}
|
|
|
|
|
2019-06-21 20:00:53 +00:00
|
|
|
/*!
|
|
|
|
* Get a numbered feature report.
|
|
|
|
*
|
|
|
|
* If the device doesn't have more than one feature report, just request
|
|
|
|
* report 0.
|
|
|
|
*/
|
|
|
|
XRT_MAYBE_UNUSED static inline int
|
|
|
|
os_hid_get_feature(struct os_hid_device *hid_dev,
|
|
|
|
uint8_t report_num,
|
|
|
|
uint8_t *data,
|
|
|
|
size_t size)
|
|
|
|
{
|
|
|
|
return hid_dev->get_feature(hid_dev, report_num, data, size);
|
|
|
|
}
|
|
|
|
|
|
|
|
/*!
|
|
|
|
* Set a feature report.
|
|
|
|
*
|
|
|
|
* The first byte of the buffer is the report number, to be followed by
|
|
|
|
* the data of the report.
|
|
|
|
*/
|
|
|
|
XRT_MAYBE_UNUSED static inline int
|
|
|
|
os_hid_set_feature(struct os_hid_device *hid_dev,
|
|
|
|
const uint8_t *data,
|
|
|
|
size_t size)
|
|
|
|
{
|
|
|
|
return hid_dev->set_feature(hid_dev, data, size);
|
|
|
|
}
|
|
|
|
|
2019-05-03 14:47:45 +00:00
|
|
|
/*!
|
|
|
|
* Close and free the given device.
|
|
|
|
*/
|
|
|
|
XRT_MAYBE_UNUSED static inline void
|
|
|
|
os_hid_destroy(struct os_hid_device *hid_dev)
|
|
|
|
{
|
|
|
|
hid_dev->destroy(hid_dev);
|
|
|
|
}
|
|
|
|
|
|
|
|
#ifdef XRT_OS_LINUX
|
|
|
|
/*!
|
|
|
|
* Open the given path as a hidraw device.
|
|
|
|
*/
|
|
|
|
int
|
|
|
|
os_hid_open_hidraw(const char *path, struct os_hid_device **out_hid);
|
|
|
|
#endif
|
2019-06-18 18:22:30 +00:00
|
|
|
|
|
|
|
#ifdef __cplusplus
|
|
|
|
} // extern "C"
|
|
|
|
#endif
|