1*8197d3ceSnaddy /* $OpenBSD: uoak.h,v 1.5 2022/04/09 20:09:03 naddy Exp $ */ 2ae06e6b2Syuo 3ae06e6b2Syuo /* 4ae06e6b2Syuo * Copyright (c) 2012 Yojiro UO <yuo@nui.org> 5ae06e6b2Syuo * 6ae06e6b2Syuo * Permission to use, copy, modify, and distribute this software for any 7ae06e6b2Syuo * purpose with or without fee is hereby granted, provided that the above 8ae06e6b2Syuo * copyright notice and this permission notice appear in all copies. 9ae06e6b2Syuo * 10ae06e6b2Syuo * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCAIMS ALL WARRANTIES 11ae06e6b2Syuo * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 12ae06e6b2Syuo * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 13ae06e6b2Syuo * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 14ae06e6b2Syuo * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 15ae06e6b2Syuo * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 16ae06e6b2Syuo * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 17ae06e6b2Syuo */ 18ae06e6b2Syuo 194b1a56afSjsg /* TORADEX OAK series sensors */ 20ae06e6b2Syuo /* http://developer.toradex.com/files/toradex-dev/uploads/media/Oak/Oak_ProgrammingGuide.pdf */ 21ae06e6b2Syuo 224b1a56afSjsg /* feature request direction */ 23ae06e6b2Syuo #define OAK_SET 0x0 24ae06e6b2Syuo #define OAK_GET 0x1 25ae06e6b2Syuo 26ae06e6b2Syuo /* specification */ 27ae06e6b2Syuo #define OAK_V_MAXSENSORS 8 28ae06e6b2Syuo 29ae06e6b2Syuo /* OAK sensor command */ 30ae06e6b2Syuo /* 1 byte commands */ 31ae06e6b2Syuo #define OAK_CMD_REPORTMODE 0x0000 32448c0c4aSderaadt #define OAK_REPORTMODE_AFTERSAMPLING 0x0 /* default */ 33ae06e6b2Syuo #define OAK_REPORTMODE_AFTERCHANGE 0x1 34ae06e6b2Syuo #define OAK_REPORTMODE_FIXEDRATE 0x2 35ae06e6b2Syuo #define OAK_CMD_LEDMODE 0x0001 36ae06e6b2Syuo #define OAK_CMD_SENSORSETTING 0x0002 37ae06e6b2Syuo /* RH */ 38ae06e6b2Syuo #define OAK_RH_SENSOR_HEATER_MASK (0x1 << 3) 39ae06e6b2Syuo #define OAK_RH_SENSOR_RES_MASK (0x1 << 0) 40ae06e6b2Syuo #define OAK_RH_SENSOR_HEATER_OFF 0x0 /* default */ 41ae06e6b2Syuo #define OAK_RH_SENSOR_HEATER_ON 0x1 42ae06e6b2Syuo #define OAK_RH_SENSOR_HIGHRES 0x0 /* default */ 43ae06e6b2Syuo #define OAK_RH_SENSOR_LOWRES 0x1 44ae06e6b2Syuo /* LUX */ 45ae06e6b2Syuo #define OAK_LUX_SENSOR_GAIN_MASK (0x1 << 4) 46ae06e6b2Syuo #define OAK_LUX_SENSOR_LOWGAIN 0x0 /* default */ 47ae06e6b2Syuo #define OAK_LUX_SENSOR_HIGHGAIN 0x1 48ae06e6b2Syuo #define OAK_LUX_SENSOR_INTTIME_MASK 0x3 49ae06e6b2Syuo #define OAK_LUX_SENSOR_INTTIME_13_7ms 0x0 /* 13.7ms */ 50ae06e6b2Syuo #define OAK_LUX_SENSOR_INTTIME_101ms 0x1 /* 101 ms */ 51ae06e6b2Syuo #define OAK_LUX_SENSOR_INTTIME_402ms 0x2 /* 402 ms (default) */ 52ae06e6b2Syuo /* 10V */ 53ae06e6b2Syuo #define OAK_V_SENSOR_INPUTMODEMASK (0x1 << 0) 54ae06e6b2Syuo #define OAK_V_SENSOR_SINGLEENDED 0x0 /* default */ 55ae06e6b2Syuo #define OAK_V_SENSOR_DIFFERENTIAL 0x1 56ae06e6b2Syuo 57ae06e6b2Syuo /* 2 bytes commands */ 58ae06e6b2Syuo #define OAK_CMD_REPORTRATE 0x0000 59ae06e6b2Syuo #define OAK_CMD_SAMPLERATE 0x0001 60ae06e6b2Syuo 61ae06e6b2Syuo /* 21 bytes (0x15) commands */ 62ae06e6b2Syuo #define OAK_CMD_DEVNAME 0x0000 63ae06e6b2Syuo #define OAK_CMD_CHANNAME0 0x0001 64ae06e6b2Syuo #define OAK_CMD_CHANNAME1 0x0002 65ae06e6b2Syuo #define OAK_CMD_CHANNAME2 0x0003 66ae06e6b2Syuo #define OAK_CMD_CHANNAME3 0x0004 67ae06e6b2Syuo #define OAK_CMD_CHANNAME4 0x0005 68ae06e6b2Syuo #define OAK_CMD_CHANNAME5 0x0006 69ae06e6b2Syuo #define OAK_CMD_CHANNAME6 0x0007 70ae06e6b2Syuo #define OAK_CMD_CHANNAME7 0x0008 71ae06e6b2Syuo #define OAK_CMD_CHANNAME8 0x0009 72ae06e6b2Syuo 73ae06e6b2Syuo /* OAK LED command */ 74ae06e6b2Syuo #define OAK_LED_OFF 0x0 75ae06e6b2Syuo #define OAK_LED_ON 0x1 76ae06e6b2Syuo #define OAK_LED_BLINK_SLOW 0x2 77ae06e6b2Syuo #define OAK_LED_BLINK_FAST 0x3 78ae06e6b2Syuo #define OAK_LED_BLINK_PULSES 0x4 79ae06e6b2Syuo 80ae06e6b2Syuo /* OAK config storage targets */ 81ae06e6b2Syuo enum uoak_target { 82ae06e6b2Syuo OAK_TARGET_RAM, 83ae06e6b2Syuo OAK_TARGET_FLASH, 84ae06e6b2Syuo OAK_TARGET_CPU, 85ae06e6b2Syuo OAK_TARGET_SENSOR, 86ae06e6b2Syuo OAK_TARGET_OTHER, 87ae06e6b2Syuo OAK_TARGET_MAXTYPES 88ae06e6b2Syuo }; 89ae06e6b2Syuo 90ae06e6b2Syuo #define OAK_RH_TARGET_MAX 2 91ae06e6b2Syuo #define OAK_V_TARGET_MAX 2 92ae06e6b2Syuo #define OAK_LUX_TARGET_MAX 2 93ae06e6b2Syuo 94ae06e6b2Syuo struct uoak_rcmd { 95ae06e6b2Syuo uint8_t dir; 96ae06e6b2Syuo uint8_t target; 97ae06e6b2Syuo uint8_t datasize; 98ae06e6b2Syuo uint16_t cmd; 99ae06e6b2Syuo uint8_t val[26]; 100ae06e6b2Syuo } __packed; 101ae06e6b2Syuo 102ae06e6b2Syuo struct uoak_config { 103ae06e6b2Syuo char devname[24]; 104ae06e6b2Syuo int report_mode; 105ae06e6b2Syuo int report_rate; 106ae06e6b2Syuo int sample_rate; 107ae06e6b2Syuo }; 108ae06e6b2Syuo 109ae06e6b2Syuo struct uoak_methods { 110ae06e6b2Syuo void (*dev_print)(void *parent, enum uoak_target target); 111ae06e6b2Syuo void (*dev_setting)(void *parent, enum uoak_target target); 112ae06e6b2Syuo }; 113ae06e6b2Syuo 114ae06e6b2Syuo struct uoak_softc { 115ae06e6b2Syuo struct uhidev *sc_hdev; 116ae06e6b2Syuo void *sc_parent; 117ae06e6b2Syuo struct ksensordev *sc_sensordev; 118ab0b1be7Smglocker struct usbd_device *sc_udev; 119ae06e6b2Syuo uint16_t sc_flag; 120ae06e6b2Syuo struct usb_device_info sc_udi; 121ae06e6b2Syuo 122ae06e6b2Syuo /* uhidev parameters */ 123ae06e6b2Syuo size_t sc_flen; /* feature report length */ 124ae06e6b2Syuo size_t sc_ilen; /* input report length */ 125ae06e6b2Syuo size_t sc_olen; /* output report length */ 126ae06e6b2Syuo uint8_t *sc_ibuf; 127ae06e6b2Syuo 128ae06e6b2Syuo /* buffers */ 129ae06e6b2Syuo struct uoak_rcmd sc_rcmd; 130ae06e6b2Syuo uint8_t sc_buf[32]; 131ae06e6b2Syuo 132ae06e6b2Syuo /* configurations */ 133ae06e6b2Syuo struct uoak_config sc_config[OAK_TARGET_MAXTYPES]; 134ae06e6b2Syuo 135ae06e6b2Syuo /* device specific methods */ 136*8197d3ceSnaddy const struct uoak_methods *sc_methods; 137ae06e6b2Syuo }; 138ae06e6b2Syuo 139ae06e6b2Syuo 140ae06e6b2Syuo struct uoak_sensor { 141448c0c4aSderaadt struct ksensor avg; 142ae06e6b2Syuo struct ksensor max; 143ae06e6b2Syuo struct ksensor min; 144448c0c4aSderaadt int64_t vavg, vmax, vmin; 145ae06e6b2Syuo unsigned int count; 146ae06e6b2Syuo }; 147ae06e6b2Syuo 148ae06e6b2Syuo 149ae06e6b2Syuo int uoak_check_device_ready(struct uoak_softc *); 150ae06e6b2Syuo int uoak_set_cmd(struct uoak_softc *); 151ae06e6b2Syuo int uoak_get_cmd(struct uoak_softc *); 152ae06e6b2Syuo 153ae06e6b2Syuo int uoak_get_device_name(struct uoak_softc *, enum uoak_target); 154ae06e6b2Syuo int uoak_get_report_mode(struct uoak_softc *, enum uoak_target); 155ae06e6b2Syuo int uoak_get_report_rate(struct uoak_softc *, enum uoak_target); 156ae06e6b2Syuo int uoak_get_sample_rate(struct uoak_softc *, enum uoak_target); 157ae06e6b2Syuo int uoak_set_sample_rate(struct uoak_softc *, enum uoak_target, int); 158ae06e6b2Syuo 159ae06e6b2Syuo int uoak_led_ctrl(struct uoak_softc *, enum uoak_target, uint8_t); 160ae06e6b2Syuo int uoak_led_status(struct uoak_softc *, enum uoak_target, uint8_t *); 161ae06e6b2Syuo 162ae06e6b2Syuo void uoak_get_devinfo(struct uoak_softc *); 163ae06e6b2Syuo void uoak_get_setting(struct uoak_softc *, enum uoak_target); 164ae06e6b2Syuo void uoak_print_devinfo(struct uoak_softc *); 165ae06e6b2Syuo void uoak_print_setting(struct uoak_softc *, enum uoak_target); 166ae06e6b2Syuo 167ae06e6b2Syuo void uoak_sensor_attach(struct uoak_softc *, struct uoak_sensor *, 168ae06e6b2Syuo enum sensor_type); 169ae06e6b2Syuo void uoak_sensor_detach(struct uoak_softc *, struct uoak_sensor *); 170ae06e6b2Syuo void uoak_sensor_update(struct uoak_sensor *, int); 171ae06e6b2Syuo void uoak_sensor_refresh(struct uoak_sensor *, int, int); 172