summaryrefslogtreecommitdiff
path: root/sys/dev/usb/uoak.h
blob: b58daf74c9d7ccfcb10c3b7a81c9e7825accfabb (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
/*	$OpenBSD: uoak.h,v 1.3 2013/04/15 09:23:02 mglocker Exp $   */

/*
 * Copyright (c) 2012 Yojiro UO <yuo@nui.org>
 *
 * Permission to use, copy, modify, and distribute this software for any
 * purpose with or without fee is hereby granted, provided that the above
 * copyright notice and this permission notice appear in all copies.
 *
 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCAIMS ALL WARRANTIES
 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 */

/* TORADEX OAK seriese sensors */
/* http://developer.toradex.com/files/toradex-dev/uploads/media/Oak/Oak_ProgrammingGuide.pdf */

/* feture request direction */
#define OAK_SET			0x0
#define OAK_GET			0x1

/* specification */
#define OAK_V_MAXSENSORS	8

/* OAK sensor command */
/* 1 byte commands */
#define OAK_CMD_REPORTMODE	0x0000
#define  OAK_REPORTMODE_AFTERSAMPLING	0x0	/* default */
#define  OAK_REPORTMODE_AFTERCHANGE	0x1
#define  OAK_REPORTMODE_FIXEDRATE	0x2
#define OAK_CMD_LEDMODE		0x0001
#define OAK_CMD_SENSORSETTING	0x0002
/* RH */
#define  OAK_RH_SENSOR_HEATER_MASK	(0x1 << 3)
#define  OAK_RH_SENSOR_RES_MASK		(0x1 << 0)
#define  OAK_RH_SENSOR_HEATER_OFF	0x0	/* default */
#define  OAK_RH_SENSOR_HEATER_ON	0x1
#define  OAK_RH_SENSOR_HIGHRES		0x0	/* default */
#define  OAK_RH_SENSOR_LOWRES		0x1
/* LUX */
#define  OAK_LUX_SENSOR_GAIN_MASK	(0x1 << 4)
#define  OAK_LUX_SENSOR_LOWGAIN		0x0	/* default */
#define  OAK_LUX_SENSOR_HIGHGAIN	0x1
#define  OAK_LUX_SENSOR_INTTIME_MASK	0x3
#define  OAK_LUX_SENSOR_INTTIME_13_7ms	0x0	/* 13.7ms */
#define  OAK_LUX_SENSOR_INTTIME_101ms	0x1	/* 101 ms */
#define  OAK_LUX_SENSOR_INTTIME_402ms	0x2	/* 402 ms (default) */
/* 10V */
#define  OAK_V_SENSOR_INPUTMODEMASK	(0x1 << 0)
#define  OAK_V_SENSOR_SINGLEENDED	0x0	/* default */
#define  OAK_V_SENSOR_DIFFERENTIAL	0x1

/* 2 bytes commands */
#define OAK_CMD_REPORTRATE	0x0000
#define OAK_CMD_SAMPLERATE	0x0001

/* 21 bytes (0x15) commands */
#define OAK_CMD_DEVNAME		0x0000
#define OAK_CMD_CHANNAME0	0x0001
#define OAK_CMD_CHANNAME1	0x0002
#define OAK_CMD_CHANNAME2	0x0003
#define OAK_CMD_CHANNAME3	0x0004
#define OAK_CMD_CHANNAME4	0x0005
#define OAK_CMD_CHANNAME5	0x0006
#define OAK_CMD_CHANNAME6	0x0007
#define OAK_CMD_CHANNAME7	0x0008
#define OAK_CMD_CHANNAME8	0x0009

/* OAK LED command */
#define OAK_LED_OFF		0x0
#define OAK_LED_ON		0x1
#define OAK_LED_BLINK_SLOW	0x2
#define OAK_LED_BLINK_FAST	0x3
#define OAK_LED_BLINK_PULSES	0x4

/* OAK config storage targets */
enum uoak_target {
	OAK_TARGET_RAM,
	OAK_TARGET_FLASH,
	OAK_TARGET_CPU,
	OAK_TARGET_SENSOR,
	OAK_TARGET_OTHER,
	OAK_TARGET_MAXTYPES
};

#define OAK_RH_TARGET_MAX	2
#define OAK_V_TARGET_MAX	2
#define OAK_LUX_TARGET_MAX	2

struct uoak_rcmd {
	uint8_t dir;
	uint8_t target;
	uint8_t datasize;
	uint16_t cmd;
	uint8_t val[26];
} __packed;

struct uoak_config {
	char devname[24];
	int  report_mode;
	int  report_rate;
	int  sample_rate;
};

struct uoak_methods {
	void (*dev_print)(void *parent, enum uoak_target target);
	void (*dev_setting)(void *parent, enum uoak_target target);
};

struct uoak_softc {
	struct uhidev		*sc_hdev;
	void			*sc_parent;
	struct ksensordev	*sc_sensordev;
	struct usbd_device	*sc_udev;
	uint16_t		 sc_flag;
	struct usb_device_info	 sc_udi;

	/* uhidev parameters */
	size_t			 sc_flen;	/* feature report length */
	size_t			 sc_ilen;	/* input report length */
	size_t			 sc_olen;	/* output report length */
	uint8_t			*sc_ibuf;	

	/* buffers */
	struct uoak_rcmd	 sc_rcmd;
	uint8_t			 sc_buf[32];

	/* configurations */
	struct uoak_config	 sc_config[OAK_TARGET_MAXTYPES];

	/* device specific methods */
	struct uoak_methods	 *sc_methods;
};


struct uoak_sensor {
	struct ksensor		 avg;
	struct ksensor		 max;
	struct ksensor		 min;
	int64_t vavg, vmax, vmin;
	unsigned int count;
};


int uoak_check_device_ready(struct uoak_softc *);
int uoak_set_cmd(struct uoak_softc *);
int uoak_get_cmd(struct uoak_softc *);

int uoak_get_device_name(struct uoak_softc *, enum uoak_target);
int uoak_get_report_mode(struct uoak_softc *, enum uoak_target);
int uoak_get_report_rate(struct uoak_softc *, enum uoak_target);
int uoak_get_sample_rate(struct uoak_softc *, enum uoak_target);
int uoak_set_sample_rate(struct uoak_softc *, enum uoak_target, int);

int uoak_led_ctrl(struct uoak_softc *, enum uoak_target, uint8_t);
int uoak_led_status(struct uoak_softc *, enum uoak_target, uint8_t *);

void uoak_get_devinfo(struct uoak_softc *);
void uoak_get_setting(struct uoak_softc *, enum uoak_target);
void uoak_print_devinfo(struct uoak_softc *);
void uoak_print_setting(struct uoak_softc *, enum uoak_target);

void uoak_sensor_attach(struct uoak_softc *, struct uoak_sensor *,
  enum sensor_type);
void uoak_sensor_detach(struct uoak_softc *, struct uoak_sensor *);
void uoak_sensor_update(struct uoak_sensor *, int);
void uoak_sensor_refresh(struct uoak_sensor *, int, int);