xref: /openbsd-src/sys/dev/usb/uoak.h (revision 8197d3cebbbf540fcab06930029975b7c4e7b843)
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