1/*
2 $License:
3    Copyright (C) 2011 InvenSense Corporation, All Rights Reserved.
4 $
5 */
6
7#ifndef __MLSL_H__
8#define __MLSL_H__
9
10#ifdef __cplusplus
11extern "C" {
12#endif
13
14/**
15 *  @defgroup   MLSL
16 *  @brief      Motion Library - Serial Layer.
17 *              The Motion Library System Layer provides the Motion Library
18 *              with the communication interface to the hardware.
19 *
20 *              The communication interface is assumed to support serial
21 *              transfers in burst of variable length up to
22 *              SERIAL_MAX_TRANSFER_SIZE.
23 *              The default value for SERIAL_MAX_TRANSFER_SIZE is 128 bytes.
24 *              Transfers of length greater than SERIAL_MAX_TRANSFER_SIZE, will
25 *              be subdivided in smaller transfers of length <=
26 *              SERIAL_MAX_TRANSFER_SIZE.
27 *              The SERIAL_MAX_TRANSFER_SIZE definition can be modified to
28 *              overcome any host processor transfer size limitation down to
29 *              1 B, the minimum.
30 *              An higher value for SERIAL_MAX_TRANSFER_SIZE will favor
31 *              performance and efficiency while requiring higher resource usage
32 *              (mostly buffering). A smaller value will increase overhead and
33 *              decrease efficiency but allows to operate with more resource
34 *              constrained processor and master serial controllers.
35 *              The SERIAL_MAX_TRANSFER_SIZE definition can be found in the
36 *              mlsl.h header file and master serial controllers.
37 *              The SERIAL_MAX_TRANSFER_SIZE definition can be found in the
38 *              mlsl.h header file.
39 *
40 *  @{
41 *      @file   mlsl.h
42 *      @brief  The Motion Library System Layer.
43 *
44 */
45
46/*
47 * NOTE : to properly support Yamaha compass reads,
48 *	  the max transfer size should be at least 9 B.
49 *	  Length in bytes, typically a power of 2 >= 2
50 */
51#define SERIAL_MAX_TRANSFER_SIZE 31
52
53#ifndef __KERNEL__
54/**
55 *  inv_serial_open() - used to open the serial port.
56 *  @port	The COM port specification associated with the device in use.
57 *  @sl_handle	a pointer to the file handle to the serial device to be open
58 *		for the communication.
59 *	This port is used to send and receive data to the device.
60 *
61 *	This function is called by inv_serial_start().
62 *	Unlike previous MPL Software releases, explicitly calling
63 *	inv_serial_start() is mandatory to instantiate the communication
64 *	with the device.
65 *
66 *  returns INV_SUCCESS if successful, a non-zero error code otherwise.
67 */
68int inv_serial_open(char const *port, void **sl_handle);
69
70/**
71 *  inv_serial_close() - used to close the serial port.
72 *  @sl_handle	a file handle to the serial device used for the communication.
73 *
74 *	This port is used to send and receive data to the device.
75 *
76 *	This function is called by inv_serial_stop().
77 *	Unlike previous MPL Software releases, explicitly calling
78 *	inv_serial_stop() is mandatory to properly shut-down the
79 *	communication with the device.
80 *
81 *  returns INV_SUCCESS if successful, a non-zero error code otherwise.
82 */
83int inv_serial_close(void *sl_handle);
84
85/**
86 *  inv_serial_reset() - used to reset any buffering the driver may be doing
87 *  returns INV_SUCCESS if successful, a non-zero error code otherwise.
88 */
89int inv_serial_reset(void *sl_handle);
90#endif
91
92/**
93 *  inv_serial_single_write() - used to write a single byte of data.
94 *  @sl_handle		pointer to the serial device used for the communication.
95 *  @slave_addr		I2C slave address of device.
96 *  @register_addr	Register address to write.
97 *  @data		Single byte of data to write.
98 *
99 *	It is called by the MPL to write a single byte of data to the MPU.
100 *
101 *  returns INV_SUCCESS if successful, a non-zero error code otherwise.
102 */
103int inv_serial_single_write(
104	void *sl_handle,
105	unsigned char slave_addr,
106	unsigned char register_addr,
107	unsigned char data);
108
109/**
110 *  inv_serial_write() - used to write multiple bytes of data to registers.
111 *  @sl_handle	a file handle to the serial device used for the communication.
112 *  @slave_addr	I2C slave address of device.
113 *  @register_addr	Register address to write.
114 *  @length	Length of burst of data.
115 *  @data	Pointer to block of data.
116 *
117 *  returns INV_SUCCESS if successful, a non-zero error code otherwise.
118 */
119int inv_serial_write(
120	void *sl_handle,
121	unsigned char slave_addr,
122	unsigned short length,
123	unsigned char const *data);
124
125/**
126 *  inv_serial_read() - used to read multiple bytes of data from registers.
127 *  @sl_handle	a file handle to the serial device used for the communication.
128 *  @slave_addr	I2C slave address of device.
129 *  @register_addr	Register address to read.
130 *  @length	Length of burst of data.
131 *  @data	Pointer to block of data.
132 *
133 *  returns INV_SUCCESS == 0 if successful; a non-zero error code otherwise.
134 */
135int inv_serial_read(
136	void *sl_handle,
137	unsigned char slave_addr,
138	unsigned char register_addr,
139	unsigned short length,
140	unsigned char *data);
141
142/**
143 *  inv_serial_read_mem() - used to read multiple bytes of data from the memory.
144 *	    This should be sent by I2C or SPI.
145 *
146 *  @sl_handle	a file handle to the serial device used for the communication.
147 *  @slave_addr	I2C slave address of device.
148 *  @mem_addr	The location in the memory to read from.
149 *  @length	Length of burst data.
150 *  @data	Pointer to block of data.
151 *
152 *  returns INV_SUCCESS == 0 if successful; a non-zero error code otherwise.
153 */
154int inv_serial_read_mem(
155	void *sl_handle,
156	unsigned char slave_addr,
157	unsigned short mem_addr,
158	unsigned char bank_reg,
159	unsigned char addr_reg,
160	unsigned char mem_reg,
161	unsigned short length,
162	unsigned char *data);
163
164/**
165 *  inv_serial_write_mem() - used to write multiple bytes of data to the memory.
166 *  @sl_handle	a file handle to the serial device used for the communication.
167 *  @slave_addr	I2C slave address of device.
168 *  @mem_addr	The location in the memory to write to.
169 *  @length	Length of burst data.
170 *  @data	Pointer to block of data.
171 *
172 *  returns INV_SUCCESS == 0 if successful; a non-zero error code otherwise.
173 */
174int inv_serial_write_mem(
175	void *sl_handle,
176	unsigned char slave_addr,
177	unsigned short mem_addr,
178	unsigned char bank_reg,
179	unsigned char addr_reg,
180	unsigned char mem_reg,
181	unsigned short length,
182	unsigned char *data);
183
184/**
185 *  inv_serial_read_fifo() - used to read multiple bytes of data from the fifo.
186 *  @sl_handle	a file handle to the serial device used for the communication.
187 *  @slave_addr	I2C slave address of device.
188 *  @length	Length of burst of data.
189 *  @data	Pointer to block of data.
190 *
191 *  returns INV_SUCCESS == 0 if successful; a non-zero error code otherwise.
192 */
193int inv_serial_read_fifo(
194	void *sl_handle,
195	unsigned char slave_addr,
196	unsigned char fifo_reg,
197	unsigned short length,
198	unsigned char *data);
199
200/**
201 *  inv_serial_write_fifo() - used to write multiple bytes of data to the fifo.
202 *  @sl_handle	a file handle to the serial device used for the communication.
203 *  @slave_addr	I2C slave address of device.
204 *  @length	Length of burst of data.
205 *  @data	Pointer to block of data.
206 *
207 *  returns INV_SUCCESS == 0 if successful; a non-zero error code otherwise.
208 */
209int inv_serial_write_fifo(
210	void *sl_handle,
211	unsigned char slave_addr,
212	unsigned char fifo_reg,
213	unsigned short length,
214	unsigned char const *data);
215
216#ifndef __KERNEL__
217/**
218 *  inv_serial_read_cfg() - used to get the configuration data.
219 *  @cfg	Pointer to the configuration data.
220 *  @len	Length of the configuration data.
221 *
222 *		Is called by the MPL to get the configuration data
223 *		used by the motion library.
224 *		This data would typically be saved in non-volatile memory.
225 *
226 *  returns INV_SUCCESS if successful, a non-zero error code otherwise.
227 */
228int inv_serial_read_cfg(unsigned char *cfg, unsigned int len);
229
230/**
231 *  inv_serial_write_cfg() - used to save the configuration data.
232 *  @cfg	Pointer to the configuration data.
233 *  @len	Length of the configuration data.
234 *
235 *		Is called by the MPL to save the configuration data used by the
236 *		motion library.
237 *		This data would typically be saved in non-volatile memory.
238 *
239 *  returns INV_SUCCESS if successful, a non-zero error code otherwise.
240 */
241int inv_serial_write_cfg(unsigned char *cfg, unsigned int len);
242
243/**
244 *  inv_serial_read_cal() - used to get the calibration data.
245 *  @cfg	Pointer to the calibration data.
246 *  @len	Length of the calibration data.
247 *
248 *		It is called by the MPL to get the calibration data used by the
249 *		motion library.
250 *		This data is typically be saved in non-volatile memory.
251 *
252 *  returns INV_SUCCESS if successful, a non-zero error code otherwise.
253 */
254int inv_serial_read_cal(unsigned char *cal, unsigned int len);
255
256/**
257 *  inv_serial_write_cal() - used to save the calibration data.
258 *
259 *  @cfg	Pointer to the calibration data.
260 *  @len	Length of the calibration data.
261 *
262 *	    It is called by the MPL to save the calibration data used by the
263 *	    motion library.
264 *	    This data is typically be saved in non-volatile memory.
265 *  returns INV_SUCCESS if successful, a non-zero error code otherwise.
266 */
267int inv_serial_write_cal(unsigned char *cal, unsigned int len);
268
269/**
270 *  inv_serial_get_cal_length() - Get the calibration length from the storage.
271 *  @len	lenght to be returned
272 *
273 *  returns INV_SUCCESS if successful, a non-zero error code otherwise.
274 */
275int inv_serial_get_cal_length(unsigned int *len);
276#endif
277#ifdef __cplusplus
278}
279#endif
280/**
281 * @}
282 */
283#endif				/* __MLSL_H__ */
284