25#include <sys/stdint.h>
26#include <sys/stddef.h>
31#include <sys/kernel.h>
33#include <sys/module.h>
36#include <sys/condvar.h>
37#include <sys/sysctl.h>
39#include <sys/unistd.h>
40#include <sys/callout.h>
41#include <sys/malloc.h>
45#include <dev/hid/hid.h>
54#define USB_DEBUG_VAR usb_debug
59#define UGOLD_MAX_SENSORS 2
61#define UGOLD_CMD_DATA 0x80
62#define UGOLD_CMD_INIT 0x82
85static uint8_t
cmd_data[8] = {0x01, 0x80, 0x33, 0x01, 0x00, 0x00, 0x00, 0x00};
86static uint8_t
cmd_init[8] = {0x01, 0x82, 0x77, 0x01, 0x00, 0x00, 0x00, 0x00};
89static uint8_t cmd_type[8] = {0x01, 0x86, 0xff, 0x01, 0x00, 0x00, 0x00, 0x00};
142 {
USB_VPI(USB_VENDOR_CHICONY2, USB_PRODUCT_CHICONY2_TEMPER, 0)},
156 .flags = {.pipe_bof = 1,.short_xfer_ok = 1,},
181 uaa = device_get_ivars(
dev);
197 struct sysctl_oid *sensor_tree;
212 mtx_init(&sc->
sc_mtx,
"ugold lock", NULL, MTX_DEF | MTX_RECURSE);
232 (void)hid_report_size_max(d_ptr, d_len, hid_input, &sc->
sc_report_id);
242 sensor_tree = SYSCTL_ADD_NODE(device_get_sysctl_ctx(
dev),
243 SYSCTL_CHILDREN(device_get_sysctl_tree(
dev)), OID_AUTO,
"sensors",
244 CTLFLAG_RD | CTLFLAG_MPSAFE, NULL,
"");
246 if (sensor_tree == NULL) {
250 SYSCTL_ADD_INT(device_get_sysctl_ctx(
dev),
251 SYSCTL_CHILDREN(sensor_tree),
253 "Inner temperature in microCelsius");
255 SYSCTL_ADD_INT(device_get_sysctl_ctx(
dev),
256 SYSCTL_CHILDREN(sensor_tree),
258 "Inner temperature is valid");
260 SYSCTL_ADD_INT(device_get_sysctl_ctx(
dev),
261 SYSCTL_CHILDREN(sensor_tree),
263 "Inner calibration temperature in microCelsius");
265 SYSCTL_ADD_INT(device_get_sysctl_ctx(
dev),
266 SYSCTL_CHILDREN(sensor_tree),
268 "Outer temperature in microCelsius");
270 SYSCTL_ADD_INT(device_get_sysctl_ctx(
dev),
271 SYSCTL_CHILDREN(sensor_tree),
273 "Outer calibration temperature in microCelsius");
275 SYSCTL_ADD_INT(device_get_sysctl_ctx(
dev),
276 SYSCTL_CHILDREN(sensor_tree),
278 "Outer temperature is valid");
317 int32_t temp = (msb << 24) | ((lsb & 0xF0) << 16);
318 return (((int64_t)temp * (int64_t)1000000LL) >> 24);
334 memset(buf, 0,
sizeof(buf));
346 DPRINTF(
"%d sensor%s type ds75/12bit (temperature)\n",
362 DPRINTF(
"invalid data length (%d bytes)\n", buf[1]);
366 DPRINTF(
"unknown command 0x%02x\n", buf[0]);
struct ugold_readout_msg sc_readout_msg[2]
int sc_valid[UGOLD_MAX_SENSORS]
struct usb_xfer * sc_xfer[UGOLD_N_TRANSFER]
struct usb_device * sc_udev
uint8_t sc_iface_index[2]
struct callout sc_callout
int sc_calib[UGOLD_MAX_SENSORS]
int sc_sensor[UGOLD_MAX_SENSORS]
enum usb_hc_mode usb_mode
struct usbd_lookup_info info
struct usb_device * device
usb_proc_callback_t * pm_callback
static int ugold_issue_cmd(struct ugold_softc *sc, uint8_t *cmd, int len)
static usb_proc_callback_t ugold_readout_msg
static device_detach_t ugold_detach
static device_attach_t ugold_attach
static driver_t ugold_driver
USB_PNP_HOST_INFO(ugold_devs)
static uint8_t cmd_data[8]
static const struct usb_config ugold_config[UGOLD_N_TRANSFER]
static usb_callback_t ugold_intr_callback
static device_probe_t ugold_probe
static devclass_t ugold_devclass
MODULE_DEPEND(ugold, usb, 1, 1, 1)
static const STRUCT_USB_HOST_ID ugold_devs[]
static void ugold_timeout(void *arg)
static uint8_t cmd_init[8]
DRIVER_MODULE(ugold, uhub, ugold_driver, ugold_devclass, NULL, NULL)
static int ugold_ds75_temp(uint8_t msb, uint8_t lsb)
static device_method_t ugold_methods[]
#define UGOLD_MAX_SENSORS
void usbd_copy_out(struct usb_page_cache *cache, usb_frlength_t offset, void *ptr, usb_frlength_t len)
void * usb_proc_explore_msignal(struct usb_device *udev, void *pm1, void *pm2)
void usb_proc_explore_mwait(struct usb_device *udev, void *pm1, void *pm2)
void usb_proc_explore_unlock(struct usb_device *udev)
void usb_proc_explore_lock(struct usb_device *udev)
void usbd_set_parent_iface(struct usb_device *udev, uint8_t iface_index, uint8_t parent_index)
struct usb_interface * usbd_get_iface(struct usb_device *udev, uint8_t iface_index)
const char * usbd_errstr(usb_error_t err)
usb_error_t usbd_req_get_hid_desc(struct usb_device *udev, struct mtx *mtx, void **descp, uint16_t *sizep, struct malloc_type *mem, uint8_t iface_index)
int usbd_lookup_id_by_uaa(const struct usb_device_id *id, usb_size_t sizeof_id, struct usb_attach_arg *uaa)
usb_error_t usbd_req_set_report(struct usb_device *udev, struct mtx *mtx, void *data, uint16_t len, uint8_t iface_index, uint8_t type, uint8_t id)
void usbd_transfer_submit(struct usb_xfer *xfer)
void usbd_transfer_unsetup(struct usb_xfer **pxfer, uint16_t n_setup)
void usbd_xfer_set_frame_len(struct usb_xfer *xfer, usb_frcount_t frindex, usb_frlength_t len)
struct usb_page_cache * usbd_xfer_get_frame(struct usb_xfer *xfer, usb_frcount_t frindex)
usb_error_t usbd_transfer_setup(struct usb_device *udev, const uint8_t *ifaces, struct usb_xfer **ppxfer, const struct usb_config *setup_start, uint16_t n_setup, void *priv_sc, struct mtx *xfer_mtx)
void usbd_transfer_start(struct usb_xfer *xfer)
void * usbd_xfer_softc(struct usb_xfer *xfer)
void usbd_xfer_set_stall(struct usb_xfer *xfer)
void usbd_xfer_status(struct usb_xfer *xfer, int *actlen, int *sumlen, int *aframes, int *nframes)
usb_frlength_t usbd_xfer_max_len(struct usb_xfer *xfer)
void device_set_usb_desc(device_t dev)
void() usb_proc_callback_t(struct usb_proc_msg *)
#define USB_ST_TRANSFERRED
void() usb_callback_t(struct usb_xfer *, usb_error_t)
#define USB_VPI(vend, prod, info)
#define STRUCT_USB_HOST_ID
#define USB_GET_STATE(xfer)
#define UHID_OUTPUT_REPORT