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