Linux Kernel
3.7.1
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
File List
Globals
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
drivers
staging
iio
accel
sca3000.h
Go to the documentation of this file.
1
/*
2
* sca3000.c -- support VTI sca3000 series accelerometers
3
* via SPI
4
*
5
* Copyright (c) 2007 Jonathan Cameron <
[email protected]
>
6
*
7
* Partly based upon tle62x0.c
8
*
9
* This program is free software; you can redistribute it and/or modify
10
* it under the terms of the GNU General Public License version 2 as
11
* published by the Free Software Foundation.
12
*
13
* Initial mode is direct measurement.
14
*
15
* Untested things
16
*
17
* Temperature reading (the e05 I'm testing with doesn't have a sensor)
18
*
19
* Free fall detection mode - supported but untested as I'm not droping my
20
* dubious wire rig far enough to test it.
21
*
22
* Unsupported as yet
23
*
24
* Time stamping of data from ring. Various ideas on how to do this but none
25
* are remotely simple. Suggestions welcome.
26
*
27
* Individual enabling disabling of channels going into ring buffer
28
*
29
* Overflow handling (this is signaled for all but 8 bit ring buffer mode.)
30
*
31
* Motion detector using AND combinations of signals.
32
*
33
* Note: Be very careful about not touching an register bytes marked
34
* as reserved on the data sheet. They really mean it as changing convents of
35
* some will cause the device to lock up.
36
*
37
* Known issues - on rare occasions the interrupts lock up. Not sure why as yet.
38
* Can probably alleviate this by reading the interrupt register on start, but
39
* that is really just brushing the problem under the carpet.
40
*/
41
#define SCA3000_WRITE_REG(a) (((a) << 2) | 0x02)
42
#define SCA3000_READ_REG(a) ((a) << 2)
43
44
#define SCA3000_REG_ADDR_REVID 0x00
45
#define SCA3000_REVID_MAJOR_MASK 0xf0
46
#define SCA3000_REVID_MINOR_MASK 0x0f
47
48
#define SCA3000_REG_ADDR_STATUS 0x02
49
#define SCA3000_LOCKED 0x20
50
#define SCA3000_EEPROM_CS_ERROR 0x02
51
#define SCA3000_SPI_FRAME_ERROR 0x01
52
53
/* All reads done using register decrement so no need to directly access LSBs */
54
#define SCA3000_REG_ADDR_X_MSB 0x05
55
#define SCA3000_REG_ADDR_Y_MSB 0x07
56
#define SCA3000_REG_ADDR_Z_MSB 0x09
57
58
#define SCA3000_REG_ADDR_RING_OUT 0x0f
59
60
/* Temp read untested - the e05 doesn't have the sensor */
61
#define SCA3000_REG_ADDR_TEMP_MSB 0x13
62
63
#define SCA3000_REG_ADDR_MODE 0x14
64
#define SCA3000_MODE_PROT_MASK 0x28
65
66
#define SCA3000_RING_BUF_ENABLE 0x80
67
#define SCA3000_RING_BUF_8BIT 0x40
68
/* Free fall detection triggers an interrupt if the acceleration
69
* is below a threshold for equivalent of 25cm drop
70
*/
71
#define SCA3000_FREE_FALL_DETECT 0x10
72
#define SCA3000_MEAS_MODE_NORMAL 0x00
73
#define SCA3000_MEAS_MODE_OP_1 0x01
74
#define SCA3000_MEAS_MODE_OP_2 0x02
75
76
/* In motion detection mode the accelerations are band pass filtered
77
* (aprox 1 - 25Hz) and then a programmable threshold used to trigger
78
* and interrupt.
79
*/
80
#define SCA3000_MEAS_MODE_MOT_DET 0x03
81
82
#define SCA3000_REG_ADDR_BUF_COUNT 0x15
83
84
#define SCA3000_REG_ADDR_INT_STATUS 0x16
85
86
#define SCA3000_INT_STATUS_THREE_QUARTERS 0x80
87
#define SCA3000_INT_STATUS_HALF 0x40
88
89
#define SCA3000_INT_STATUS_FREE_FALL 0x08
90
#define SCA3000_INT_STATUS_Y_TRIGGER 0x04
91
#define SCA3000_INT_STATUS_X_TRIGGER 0x02
92
#define SCA3000_INT_STATUS_Z_TRIGGER 0x01
93
94
/* Used to allow access to multiplexed registers */
95
#define SCA3000_REG_ADDR_CTRL_SEL 0x18
96
/* Only available for SCA3000-D03 and SCA3000-D01 */
97
#define SCA3000_REG_CTRL_SEL_I2C_DISABLE 0x01
98
#define SCA3000_REG_CTRL_SEL_MD_CTRL 0x02
99
#define SCA3000_REG_CTRL_SEL_MD_Y_TH 0x03
100
#define SCA3000_REG_CTRL_SEL_MD_X_TH 0x04
101
#define SCA3000_REG_CTRL_SEL_MD_Z_TH 0x05
102
/* BE VERY CAREFUL WITH THIS, IF 3 BITS ARE NOT SET the device
103
will not function */
104
#define SCA3000_REG_CTRL_SEL_OUT_CTRL 0x0B
105
#define SCA3000_OUT_CTRL_PROT_MASK 0xE0
106
#define SCA3000_OUT_CTRL_BUF_X_EN 0x10
107
#define SCA3000_OUT_CTRL_BUF_Y_EN 0x08
108
#define SCA3000_OUT_CTRL_BUF_Z_EN 0x04
109
#define SCA3000_OUT_CTRL_BUF_DIV_4 0x02
110
#define SCA3000_OUT_CTRL_BUF_DIV_2 0x01
111
112
/* Control which motion detector interrupts are on.
113
* For now only OR combinations are supported.x
114
*/
115
#define SCA3000_MD_CTRL_PROT_MASK 0xC0
116
#define SCA3000_MD_CTRL_OR_Y 0x01
117
#define SCA3000_MD_CTRL_OR_X 0x02
118
#define SCA3000_MD_CTRL_OR_Z 0x04
119
/* Currently unsupported */
120
#define SCA3000_MD_CTRL_AND_Y 0x08
121
#define SCA3000_MD_CTRL_AND_X 0x10
122
#define SAC3000_MD_CTRL_AND_Z 0x20
123
124
/* Some control registers of complex access methods requiring this register to
125
* be used to remove a lock.
126
*/
127
#define SCA3000_REG_ADDR_UNLOCK 0x1e
128
129
#define SCA3000_REG_ADDR_INT_MASK 0x21
130
#define SCA3000_INT_MASK_PROT_MASK 0x1C
131
132
#define SCA3000_INT_MASK_RING_THREE_QUARTER 0x80
133
#define SCA3000_INT_MASK_RING_HALF 0x40
134
135
#define SCA3000_INT_MASK_ALL_INTS 0x02
136
#define SCA3000_INT_MASK_ACTIVE_HIGH 0x01
137
#define SCA3000_INT_MASK_ACTIVE_LOW 0x00
138
139
/* Values of multiplexed registers (write to ctrl_data after select) */
140
#define SCA3000_REG_ADDR_CTRL_DATA 0x22
141
142
/* Measurement modes available on some sca3000 series chips. Code assumes others
143
* may become available in the future.
144
*
145
* Bypass - Bypass the low-pass filter in the signal channel so as to increase
146
* signal bandwidth.
147
*
148
* Narrow - Narrow low-pass filtering of the signal channel and half output
149
* data rate by decimation.
150
*
151
* Wide - Widen low-pass filtering of signal channel to increase bandwidth
152
*/
153
#define SCA3000_OP_MODE_BYPASS 0x01
154
#define SCA3000_OP_MODE_NARROW 0x02
155
#define SCA3000_OP_MODE_WIDE 0x04
156
#define SCA3000_MAX_TX 6
157
#define SCA3000_MAX_RX 2
158
173
struct
sca3000_state
{
174
struct
spi_device
*
us
;
175
const
struct
sca3000_chip_info
*
info
;
176
struct
work_struct
interrupt_handler_ws
;
177
s64
last_timestamp
;
178
int
mo_det_use_count
;
179
struct
mutex
lock
;
180
int
bpse
;
181
/* Can these share a cacheline ? */
182
u8
rx
[2]
____cacheline_aligned
;
183
u8
tx
[6]
____cacheline_aligned
;
184
};
185
199
struct
sca3000_chip_info
{
200
unsigned
int
scale
;
201
bool
temp_output
;
202
int
measurement_mode_freq
;
203
int
option_mode_1
;
204
int
option_mode_1_freq
;
205
int
option_mode_2
;
206
int
option_mode_2_freq
;
207
int
mot_det_mult_xz
[6];
208
int
mot_det_mult_y
[7];
209
};
210
211
int
sca3000_read_data_short
(
struct
sca3000_state
*
st
,
212
u8
reg_address_high,
213
int
len);
214
222
int
sca3000_write_reg
(
struct
sca3000_state
*
st
,
u8
address
,
u8
val
);
223
224
#ifdef CONFIG_IIO_BUFFER
225
228
void
sca3000_register_ring_funcs
(
struct
iio_dev
*indio_dev);
229
239
int
sca3000_configure_ring
(
struct
iio_dev
*indio_dev);
240
245
void
sca3000_unconfigure_ring
(
struct
iio_dev
*indio_dev);
246
251
void
sca3000_ring_int_process
(
u8
val
,
struct
iio_buffer *
ring
);
252
253
#else
254
static
inline
void
sca3000_register_ring_funcs
(
struct
iio_dev
*indio_dev)
255
{
256
}
257
258
static
inline
259
int
sca3000_register_ring_access_and_init(
struct
iio_dev
*indio_dev)
260
{
261
return
0;
262
}
263
264
static
inline
void
sca3000_ring_int_process
(
u8
val
,
void
*
ring
)
265
{
266
}
267
268
#endif
269
Generated on Thu Jan 10 2013 14:28:34 for Linux Kernel by
1.8.2