1ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda/******************************************************************************
2ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda * $Id: AK8975Driver.c 580 2012-03-29 09:56:21Z yamada.rj $
3ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda ******************************************************************************
4ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda *
5ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda * Copyright (C) 2012 Asahi Kasei Microdevices Corporation, Japan
6ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda *
7ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda * Licensed under the Apache License, Version 2.0 (the "License");
8ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda * you may not use this file except in compliance with the License.
9ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda * You may obtain a copy of the License at
10ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda *
11ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda *      http://www.apache.org/licenses/LICENSE-2.0
12ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda *
13ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda * Unless required by applicable law or agreed to in writing, software
14ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda * distributed under the License is distributed on an "AS IS" BASIS,
15ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda * See the License for the specific language governing permissions and
17ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda * limitations under the License.
18ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda */
19ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda#include <fcntl.h>
20ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda#include "AKFS_Common.h"
21ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda#include "AK8975Driver.h"
22ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda
23ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda#define MSENSOR_NAME		"/dev/akm8975_dev"
24ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda
25ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masudastatic int s_fdDev = -1;
26ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda
27ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda/*!
28ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda Open device driver.
29ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda This function opens both device drivers of magnetic sensor and acceleration
30ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda sensor. Additionally, some initial hardware settings are done, such as
31ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda measurement range, built-in filter function and etc.
32ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda @return If this function succeeds, the return value is #AKD_SUCCESS.
33ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda Otherwise the return value is #AKD_FAIL.
34ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda */
35ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masudaint16_t AKD_InitDevice(void)
36ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda{
37ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda	if (s_fdDev < 0) {
38ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda		/* Open magnetic sensor's device driver. */
39ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda		if ((s_fdDev = open(MSENSOR_NAME, O_RDWR)) < 0) {
40ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda			AKMERROR_STR("open");
41ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda			return AKD_FAIL;
42ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda		}
43ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda	}
44ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda
45ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda	return AKD_SUCCESS;
46ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda}
47ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda
48ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda/*!
49ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda Close device driver.
50ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda This function closes both device drivers of magnetic sensor and acceleration
51ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda sensor.
52ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda */
53ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masudavoid AKD_DeinitDevice(void)
54ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda{
55ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda	if (s_fdDev >= 0) {
56ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda		close(s_fdDev);
57ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda		s_fdDev = -1;
58ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda	}
59ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda}
60ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda
61ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda/*!
62ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda Writes data to a register of the AK8975.  When more than one byte of data is
63ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda specified, the data is written in contiguous locations starting at an address
64ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda specified in \a address.
65ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda @return If this function succeeds, the return value is #AKD_SUCCESS. Otherwise
66ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda the return value is #AKD_FAIL.
67ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda @param[in] address Specify the address of a register in which data is to be
68ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda written.
69ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda @param[in] data Specify data to write or a pointer to a data array containing
70ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda the data.  When specifying more than one byte of data, specify the starting
71ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda address of the array.
72ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda @param[in] numberOfBytesToWrite Specify the number of bytes that make up the
73ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda data to write.  When a pointer to an array is specified in data, this argument
74ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda equals the number of elements of the array.
75ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda */
76ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masudaint16_t AKD_TxData(
77ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda				const BYTE address,
78ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda				const BYTE * data,
79ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda				const uint16_t numberOfBytesToWrite)
80ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda{
81ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda	int i;
82ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda	char buf[RWBUF_SIZE];
83ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda
84ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda	if (s_fdDev < 0) {
85ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda		ALOGE("%s: Device file is not opened.", __FUNCTION__);
86ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda		return AKD_FAIL;
87ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda	}
88ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda	if (numberOfBytesToWrite > (RWBUF_SIZE-2)) {
89ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda		ALOGE("%s: Tx size is too large.", __FUNCTION__);
90ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda		return AKD_FAIL;
91ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda	}
92ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda
93ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda	buf[0] = numberOfBytesToWrite + 1;
94ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda	buf[1] = address;
95ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda
96ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda	for (i = 0; i < numberOfBytesToWrite; i++) {
97ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda		buf[i + 2] = data[i];
98ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda	}
99ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda	if (ioctl(s_fdDev, ECS_IOCTL_WRITE, buf) < 0) {
100ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda		AKMERROR_STR("ioctl");
101ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda		return AKD_FAIL;
102ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda	} else {
103ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda
104ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda#if ENABLE_AKMDEBUG
105ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda		AKMDATA(AKMDATA_DRV, "addr(HEX)=%02x data(HEX)=", address);
106ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda		for (i = 0; i < numberOfBytesToWrite; i++) {
107ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda			AKMDATA(AKMDATA_DRV, " %02x", data[i]);
108ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda		}
109ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda		AKMDATA(AKMDATA_DRV, "\n");
110ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda#endif
111ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda		return AKD_SUCCESS;
112ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda	}
113ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda}
114ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda
115ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda/*!
116ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda Acquires data from a register or the EEPROM of the AK8975.
117ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda @return If this function succeeds, the return value is #AKD_SUCCESS. Otherwise
118ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda the return value is #AKD_FAIL.
119ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda @param[in] address Specify the address of a register from which data is to be
120ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda read.
121ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda @param[out] data Specify a pointer to a data array which the read data are
122ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda stored.
123ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda @param[in] numberOfBytesToRead Specify the number of bytes that make up the
124ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda data to read.  When a pointer to an array is specified in data, this argument
125ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda equals the number of elements of the array.
126ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda */
127ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masudaint16_t AKD_RxData(
128ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda				const BYTE address,
129ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda				BYTE * data,
130ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda				const uint16_t numberOfBytesToRead)
131ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda{
132ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda	int i;
133ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda	char buf[RWBUF_SIZE];
134ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda
135ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda	memset(data, 0, numberOfBytesToRead);
136ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda
137ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda	if (s_fdDev < 0) {
138ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda		ALOGE("%s: Device file is not opened.", __FUNCTION__);
139ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda		return AKD_FAIL;
140ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda	}
141ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda	if (numberOfBytesToRead > (RWBUF_SIZE-1)) {
142ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda		ALOGE("%s: Rx size is too large.", __FUNCTION__);
143ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda		return AKD_FAIL;
144ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda	}
145ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda
146ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda	buf[0] = numberOfBytesToRead;
147ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda	buf[1] = address;
148ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda
149ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda	if (ioctl(s_fdDev, ECS_IOCTL_READ, buf) < 0) {
150ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda		AKMERROR_STR("ioctl");
151ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda		return AKD_FAIL;
152ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda	} else {
153ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda		for (i = 0; i < numberOfBytesToRead; i++) {
154ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda			data[i] = buf[i + 1];
155ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda		}
156ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda#if ENABLE_AKMDEBUG
157ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda		AKMDATA(AKMDATA_DRV, "addr(HEX)=%02x len=%d data(HEX)=",
158ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda				address, numberOfBytesToRead);
159ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda		for (i = 0; i < numberOfBytesToRead; i++) {
160ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda			AKMDATA(AKMDATA_DRV, " %02x", data[i]);
161ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda		}
162ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda		AKMDATA(AKMDATA_DRV, "\n");
163ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda#endif
164ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda		return AKD_SUCCESS;
165ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda	}
166ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda}
167ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda
168ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda/*!
169ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda Acquire magnetic data from AK8975. If measurement is not done, this function
170ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda waits until measurement completion.
171ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda @return If this function succeeds, the return value is #AKD_SUCCESS. Otherwise
172ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda the return value is #AKD_FAIL.
173ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda @param[out] data A magnetic data array. The size should be larger than #SENSOR_DATA_SIZE.
174ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda */
175ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masudaint16_t AKD_GetMagneticData(BYTE data[SENSOR_DATA_SIZE])
176ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda{
177ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda	memset(data, 0, SENSOR_DATA_SIZE);
178ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda
179ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda	if (s_fdDev < 0) {
180ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda		ALOGE("%s: Device file is not opened.", __FUNCTION__);
181ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda		return AKD_FAIL;
182ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda	}
183ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda
184ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda	if (ioctl(s_fdDev, ECS_IOCTL_GETDATA, data) < 0) {
185ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda		AKMERROR_STR("ioctl");
186ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda		return AKD_FAIL;
187ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda	}
188ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda
189ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda	AKMDATA(AKMDATA_DRV,
190ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda		"bdata(HEX)= %02x %02x %02x %02x %02x %02x %02x %02x\n",
191ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda		data[0], data[1], data[2], data[3], data[4], data[5], data[6], data[7]);
192ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda
193ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda	return AKD_SUCCESS;
194ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda}
195ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda
196ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda/*!
197ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda Set calculated data to device driver.
198ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda @param[in] buf The order of input data depends on driver's specification.
199ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda */
200ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masudavoid AKD_SetYPR(const int buf[YPR_DATA_SIZE])
201ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda{
202ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda	if (s_fdDev < 0) {
203ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda		ALOGE("%s: Device file is not opened.", __FUNCTION__);
204ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda	} else {
205ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda		if (ioctl(s_fdDev, ECS_IOCTL_SET_YPR, buf) < 0) {
206ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda			AKMERROR_STR("ioctl");
207ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda		}
208ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda	}
209ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda}
210ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda
211ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda/*!
212ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda */
213ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masudaint AKD_GetOpenStatus(int* status)
214ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda{
215ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda	if (s_fdDev < 0) {
216ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda		ALOGE("%s: Device file is not opened.", __FUNCTION__);
217ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda		return AKD_FAIL;
218ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda	}
219ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda	if (ioctl(s_fdDev, ECS_IOCTL_GET_OPEN_STATUS, status) < 0) {
220ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda		AKMERROR_STR("ioctl");
221ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda		return AKD_FAIL;
222ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda	}
223ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda	return AKD_SUCCESS;
224ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda}
225ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda
226ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda/*!
227ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda */
228ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masudaint AKD_GetCloseStatus(int* status)
229ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda{
230ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda	if (s_fdDev < 0) {
231ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda		ALOGE("%s: Device file is not opened.", __FUNCTION__);
232ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda		return AKD_FAIL;
233ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda	}
234ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda	if (ioctl(s_fdDev, ECS_IOCTL_GET_CLOSE_STATUS, status) < 0) {
235ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda		AKMERROR_STR("ioctl");
236ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda		return AKD_FAIL;
237ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda	}
238ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda	return AKD_SUCCESS;
239ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda}
240ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda
241ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda/*!
242ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda Set AK8975 to the specific mode.
243ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda @return If this function succeeds, the return value is #AKD_SUCCESS. Otherwise
244ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda the return value is #AKD_FAIL.
245ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda @param[in] mode This value should be one of the AK8975_Mode which is defined in
246ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda akm8975.h file.
247ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda */
248ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masudaint16_t AKD_SetMode(const BYTE mode)
249ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda{
250ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda	if (s_fdDev < 0) {
251ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda		ALOGE("%s: Device file is not opened.", __FUNCTION__);
252ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda		return AKD_FAIL;
253ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda	}
254ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda
255ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda	if (ioctl(s_fdDev, ECS_IOCTL_SET_MODE, &mode) < 0) {
256ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda		AKMERROR_STR("ioctl");
257ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda		return AKD_FAIL;
258ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda	}
259ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda
260ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda	return AKD_SUCCESS;
261ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda}
262ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda
263ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda/*!
264ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda Acquire delay
265ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda @return If this function succeeds, the return value is #AKD_SUCCESS. Otherwise
266ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda the return value is #AKD_FAIL.
267ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda @param[out] delay A delay in nanosecond.
268ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda */
269ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masudaint16_t AKD_GetDelay(int64_t delay[AKM_NUM_SENSORS])
270ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda{
271ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda	if (s_fdDev < 0) {
272ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda		ALOGE("%s: Device file is not opened.\n", __FUNCTION__);
273ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda		return AKD_FAIL;
274ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda	}
275ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda	if (ioctl(s_fdDev, ECS_IOCTL_GET_DELAY, delay) < 0) {
276ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda		AKMERROR_STR("ioctl");
277ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda		return AKD_FAIL;
278ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda	}
279ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda	return AKD_SUCCESS;
280ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda}
281ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda
282ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda/*!
283ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda Get layout information from device driver, i.e. platform data.
284ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda */
285ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masudaint16_t AKD_GetLayout(int16_t* layout)
286ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda{
287ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda	char tmp;
288ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda
289ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda	if (s_fdDev < 0) {
290ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda		ALOGE("%s: Device file is not opened.", __FUNCTION__);
291ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda		return AKD_FAIL;
292ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda	}
293ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda
294ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda	if (ioctl(s_fdDev, ECS_IOCTL_GET_LAYOUT, &tmp) < 0) {
295ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda		AKMERROR_STR("ioctl");
296ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda		return AKD_FAIL;
297ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda	}
298ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda
299ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda	*layout = tmp;
300ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda	return AKD_SUCCESS;
301ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda}
302ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda
303ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda/* Get acceleration data. */
304ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masudaint16_t AKD_GetAccelerationData(int16_t data[3])
305ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda{
306ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda	if (s_fdDev < 0) {
307ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda		ALOGE("%s: Device file is not opened.", __FUNCTION__);
308ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda		return AKD_FAIL;
309ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda	}
310ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda	if (ioctl(s_fdDev, ECS_IOCTL_GET_ACCEL, data) < 0) {
311ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda		AKMERROR_STR("ioctl");
312ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda		return AKD_FAIL;
313ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda	}
314ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda
315ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda	AKMDATA(AKMDATA_DRV, "%s: acc=%d, %d, %d\n",
316ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda			__FUNCTION__, data[0], data[1], data[2]);
317ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda
318ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda	return AKD_SUCCESS;
319ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda}
320