summaryrefslogtreecommitdiff
path: root/etzkx.h
blob: 23bab6d92c4fdb73a4673dc568a5f550beea549b (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
/*
 *  etzkx: lisn3dsh/kxtnk 3d accelerometer driver
 *
 *  Copyright (C) 2013  Andi Shyti <andi@etezian.org>
 *
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 2 of the License, or
 *  (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program; if not, write to the Free Software
 *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 */

#ifndef __ETZKX_H__
#define __ETZKX_H__

#define ETZKX_G_RANGE_DONT_CARE		0
#define ETZKX_G_RANGE_2G		2
#define ETZKX_G_RANGE_4G		4
#define ETZKX_G_RANGE_6G		6
#define ETZKX_G_RANGE_8G		8

#define ETZKX_ODR_3_125			0x00
#define ETZKX_ODR_6_25			0x01
#define ETZKX_ODR_12_5			0x02
#define ETZKX_ODR_25			0x03
#define ETZKX_ODR_50			0x04
#define ETZKX_ODR_100			0x05
#define ETZKX_ODR_400			0x06
#define ETZKX_ODR_1600			0x07
#define ETZKX_ODR_DONT_CARE		0xFF

#define ETZKX_STM_ID_NO_STM		0
#define ETZKX_STM_ID_TIMING		1
#define ETZKX_STM_ID_ORIENTATION	2
#define ETZKX_STM_ID_DOUBLE_TAP		3
#define ETZKX_STM_ID_WAKEUP		4
#define ETZKX_STM_ID_V_DOUBLE_TAP	5

#define ETZKX_DEFAULT_G_RANGE		ETZKX_G_RANGE_4G
#define ETZKX_DEFAULT_ODR		ETZKX_ODR_50

/* ioctl-number: 'x' 00-2F (32 commands) */
#define ETZKX_IOCTL_NUM			('x')

struct etzkx_stm_data {
	s32 id;
	union {
		/* double tap */
		struct {
			u8 x;
			u8 y;
			u8 z;
			u8 peak;
		};
		/* orientation */
		struct {
			u16 portrait;
			u16 landscape;
		};
		/* wake up */
		struct {
			u16 wakeup;
			u16 sleep;
		};
		/* v double tap */
		struct {
			u32 vtap;
		};
		/* running algos */
		struct {
			u16 stm1;
			u16 stm2;
		};
	} algo;
};

/* etzkx ioctl command types */
#define ETZKXIO_ENABLE			0x01
#define ETZKXIO_DISABLE			0x02
#define ETZKXIO_STATE			0x03
/*
 * etzkx ioctl commands
 *   - first 6 bits identify the algorithm id
 *   - last 2 bits identify the operation type on the algorithm
 */
#define ETZKXIO_ENABLE_TIMING		_IO(ETZKX_IOCTL_NUM, \
					(ETZKX_STM_ID_TIMING << 2) | \
						ETZKXIO_ENABLE)
#define ETZKXIO_DISABLE_TIMING		_IO(ETZKX_IOCTL_NUM, \
					(ETZKX_STM_ID_TIMING << 2) | \
						ETZKXIO_DISABLE)
#define ETZKXIO_ENABLE_ORIENTATION	_IO(ETZKX_IOCTL_NUM, \
					(ETZKX_STM_ID_ORIENTATION << 2) | \
						ETZKXIO_ENABLE)
#define ETZKXIO_DISABLE_ORIENTATION	_IO(ETZKX_IOCTL_NUM, \
					(ETZKX_STM_ID_ORIENTATION << 2) | \
						ETZKXIO_DISABLE)
#define ETZKXIO_ENABLE_WAKEUP		_IO(ETZKX_IOCTL_NUM, \
					(ETZKX_STM_ID_WAKEUP << 2) | \
						ETZKXIO_ENABLE)
#define ETZKXIO_DISABLE_WAKEUP		_IO(ETZKX_IOCTL_NUM, \
					(ETZKX_STM_ID_WAKEUP << 2) | \
						ETZKXIO_DISABLE)
#define ETZKXIO_ENABLE_V_DOUBLE_TAP	_IO(ETZKX_IOCTL_NUM, \
					(ETZKX_STM_ID_V_DOUBLE_TAP << 2) | \
						ETZKXIO_ENABLE)
#define ETZKXIO_DISABLE_V_DOUBLE_TAP	_IO(ETZKX_IOCTL_NUM, \
					(ETZKX_STM_ID_V_DOUBLE_TAP << 2) | \
						ETZKXIO_DISABLE)
#define ETZKXIO_WHICH_ORIENTATION	_IOR(ETZKX_IOCTL_NUM, \
					(ETZKX_STM_ID_ORIENTATION << 2) | \
						ETZKXIO_STATE, \
						struct etzkx_stm_data *)
#define ETZKXIO_ENABLE_DOUBLE_TAP	_IO(ETZKX_IOCTL_NUM, \
					(ETZKX_STM_ID_DOUBLE_TAP << 2) | \
						ETZKXIO_ENABLE)
#define ETZKXIO_DISABLE_DOUBLE_TAP	_IO(ETZKX_IOCTL_NUM, \
					(ETZKX_STM_ID_DOUBLE_TAP << 2) | \
						ETZKXIO_DISABLE)
#define ETZKXIO_RUNNING_ALGO		_IOR(ETZKX_IOCTL_NUM, \
					(0x0A << 2) | ETZKXIO_STATE, \
						struct etzkx_stm_data *)
#define ETZKXIO_INSTANT_ORIENTATION	_IOR(ETZKX_IOCTL_NUM, \
					(0x0B << 2) | ETZKXIO_STATE, \
						struct etzkx_stm_data *)

#define ETZKX_DEV_NAME		"etzkx"
#define ETZKX_DRV_VERSION	5

struct etzkx_platform_data {
	int (*init)(void);
	void (*release)(void);

	u8 x_map;
	u8 y_map;
	u8 z_map;

	u8 x_negate;
	u8 y_negate;
	u8 z_negate;

	u8 odr;
	u8 range;

	u16 irq1;
	u16 irq2;
};

#endif