1ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda/****************************************************************************** 2ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda * $Id: main.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 "AKFS_Common.h" 20ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda#include "AKFS_Compass.h" 21ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda#include "AKFS_Disp.h" 22ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda#include "AKFS_FileIO.h" 23ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda#include "AKFS_Measure.h" 24ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda#include "AKFS_APIs.h" 25ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda 26ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda#ifndef WIN32 27ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda#include <sched.h> 28ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda#include <pthread.h> 29ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda#include <linux/input.h> 30ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda#endif 31ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda 32ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda#define ERROR_INITDEVICE (-1) 33ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda#define ERROR_OPTPARSE (-2) 34ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda#define ERROR_SELF_TEST (-3) 35ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda#define ERROR_READ_FUSE (-4) 36ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda#define ERROR_INIT (-5) 37ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda#define ERROR_GETOPEN_STAT (-6) 38ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda#define ERROR_STARTCLONE (-7) 39ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda#define ERROR_GETCLOSE_STAT (-8) 40ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda 41ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda/* Global variable. See AKFS_Common.h file. */ 42ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masudaint g_stopRequest = 0; 43ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masudaint g_opmode = 0; 44ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masudaint g_dbgzone = 0; 45ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masudaint g_mainQuit = AKD_FALSE; 46ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda 47ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda/* Static variable. */ 48ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masudastatic pthread_t s_thread; /*!< Thread handle */ 49ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda 50ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda/*! 51ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda A thread function which is raised when measurement is started. 52ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda @param[in] args This parameter is not used currently. 53ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda */ 54ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masudastatic void* thread_main(void* args) 55ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda{ 56ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda AKFS_MeasureLoop(); 57ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda return ((void*)0); 58ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda} 59ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda 60ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda/*! 61ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda Signal handler. This should be used only in DEBUG mode. 62ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda @param[in] sig Event 63ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda */ 64ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masudastatic void signal_handler(int sig) 65ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda{ 66ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda if (sig == SIGINT) { 67ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda ALOGE("SIGINT signal"); 68ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda g_stopRequest = 1; 69ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda g_mainQuit = AKD_TRUE; 70ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda } 71ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda} 72ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda 73ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda/*! 74ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda Starts new thread. 75ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda @return If this function succeeds, the return value is 1. Otherwise, 76ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda the return value is 0. 77ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda */ 78ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masudastatic int startClone(void) 79ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda{ 80ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda pthread_attr_t attr; 81ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda 82ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda pthread_attr_init(&attr); 83ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda g_stopRequest = 0; 84ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda if (pthread_create(&s_thread, &attr, thread_main, NULL) == 0) { 85ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda return 1; 86ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda } else { 87ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda return 0; 88ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda } 89ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda} 90ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda 91ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda/*! 92ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda This function parse the option. 93ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda @retval 1 Parse succeeds. 94ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda @retval 0 Parse failed. 95ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda @param[in] argc Argument count 96ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda @param[in] argv Argument vector 97ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda @param[out] layout_patno 98ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda */ 99ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masudaint OptParse( 100ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda int argc, 101ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda char* argv[], 102ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda AKFS_PATNO* layout_patno) 103ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda{ 104ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda#ifdef WIN32 105ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda /* Static */ 106ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda#if defined(AKFS_WIN32_PAT1) 107ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda *layout_patno = PAT1; 108ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda#elif defined(AKFS_WIN32_PAT2) 109ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda *layout_patno = PAT2; 110ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda#elif defined(AKFS_WIN32_PAT3) 111ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda *layout_patno = PAT3; 112ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda#elif defined(AKFS_WIN32_PAT4) 113ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda *layout_patno = PAT4; 114ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda#elif defined(AKFS_WIN32_PAT5) 115ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda *layout_patno = PAT5; 116ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda#else 117ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda *layout_patno = PAT1; 118ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda#endif 119ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda g_opmode = OPMODE_CONSOLE; 120ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda /*g_opmode = 0;*/ 121ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda g_dbgzone = AKMDATA_LOOP | AKMDATA_TEST; 122ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda#else 123ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda int opt; 124ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda char optVal; 125ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda 126ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda *layout_patno = PAT_INVALID; 127ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda 128ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda while ((opt = getopt(argc, argv, "sm:z:")) != -1) { 129ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda switch(opt){ 130ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda case 'm': 131ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda optVal = (char)(optarg[0] - '0'); 132ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda if ((PAT1 <= optVal) && (optVal <= PAT8)) { 133ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda *layout_patno = (AKFS_PATNO)optVal; 134ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda AKMDEBUG(DBG_LEVEL2, "%s: Layout=%d\n", __FUNCTION__, optVal); 135ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda } 136ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda break; 137ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda case 's': 138ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda g_opmode |= OPMODE_CONSOLE; 139ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda break; 140ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda case 'z': 141ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda /* If error detected, hopefully 0 is returned. */ 142ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda errno = 0; 143ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda g_dbgzone = (int)strtol(optarg, (char**)NULL, 0); 144ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda AKMDEBUG(DBG_LEVEL2, "%s: Dbg Zone=%d\n", __FUNCTION__, g_dbgzone); 145ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda break; 146ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda default: 147ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda ALOGE("%s: Invalid argument", argv[0]); 148ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda return 0; 149ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda } 150ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda } 151ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda 152ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda /* If layout is not specified with argument, get parameter from driver */ 153ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda if (*layout_patno == PAT_INVALID) { 154ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda int16_t n; 155ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda if (AKD_GetLayout(&n) == AKM_SUCCESS) { 156ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda if ((PAT1 <= n) && (n <= PAT8)) { 157ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda *layout_patno = (AKFS_PATNO)n; 158ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda } 159ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda } 160ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda } 161ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda /* Error */ 162ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda if (*layout_patno == PAT_INVALID) { 163ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda ALOGE("No layout is specified."); 164ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda return 0; 165ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda } 166ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda#endif 167ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda 168ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda return 1; 169ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda} 170ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda 171ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masudavoid ConsoleMode(void) 172ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda{ 173ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda /*** Console Mode *********************************************/ 174ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda while (AKD_TRUE) { 175ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda /* Select operation */ 176ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda switch (Menu_Main()) { 177ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda case MODE_SelfTest: 178ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda AKFS_SelfTest(); 179ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda break; 180ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda case MODE_Measure: 181ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda /* Reset flag */ 182ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda g_stopRequest = 0; 183ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda /* Measurement routine */ 184ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda AKFS_MeasureLoop(); 185ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda break; 186ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda 187ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda case MODE_Quit: 188ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda return; 189ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda 190ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda default: 191ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda AKMDEBUG(DBG_LEVEL0, "Unknown operation mode.\n"); 192ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda break; 193ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda } 194ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda } 195ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda} 196ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda 197ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masudaint main(int argc, char **argv) 198ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda{ 199ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda int retValue = 0; 200ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda AKFS_PATNO pat; 201ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda uint8 regs[3]; 202ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda 203ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda /* Show the version info of this software. */ 204ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda Disp_StartMessage(); 205ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda 206ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda#if ENABLE_AKMDEBUG 207ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda /* Register signal handler */ 208ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda signal(SIGINT, signal_handler); 209ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda#endif 210ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda 211ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda /* Open device driver */ 212ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda if(AKD_InitDevice() != AKD_SUCCESS) { 213ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda retValue = ERROR_INITDEVICE; 214ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda goto MAIN_QUIT; 215ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda } 216ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda 217ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda /* Parse command-line options */ 218ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda /* This function calls device driver function to get layout */ 219ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda if (OptParse(argc, argv, &pat) == 0) { 220ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda retValue = ERROR_OPTPARSE; 221ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda goto MAIN_QUIT; 222ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda } 223ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda 224ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda /* Self Test */ 225ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda if (g_opmode & OPMODE_FST){ 226ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda if (AKFS_SelfTest() != AKD_SUCCESS) { 227ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda retValue = ERROR_SELF_TEST; 228ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda goto MAIN_QUIT; 229ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda } 230ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda } 231ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda 232ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda /* OK, then start */ 233ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda if (AKFS_ReadAK8975FUSEROM(regs) != AKM_SUCCESS) { 234ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda retValue = ERROR_READ_FUSE; 235ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda goto MAIN_QUIT; 236ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda } 237ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda 238ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda /* Initialize library. */ 239ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda if (AKFS_Init(pat, regs) != AKM_SUCCESS) { 240ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda retValue = ERROR_INIT; 241ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda goto MAIN_QUIT; 242ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda } 243ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda 244ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda /* Start console mode */ 245ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda if (g_opmode & OPMODE_CONSOLE) { 246ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda ConsoleMode(); 247ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda goto MAIN_QUIT; 248ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda } 249ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda 250ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda /*** Start Daemon ********************************************/ 251ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda while (g_mainQuit == AKD_FALSE) { 252ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda int st = 0; 253ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda /* Wait until device driver is opened. */ 254ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda if (AKD_GetOpenStatus(&st) != AKD_SUCCESS) { 255ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda retValue = ERROR_GETOPEN_STAT; 256ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda goto MAIN_QUIT; 257ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda } 258ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda if (st == 0) { 259ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda ALOGI("Suspended."); 260ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda } else { 261ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda ALOGI("Compass Opened."); 262ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda /* Reset flag */ 263ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda g_stopRequest = 0; 264ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda /* Start measurement thread. */ 265ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda if (startClone() == 0) { 266ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda retValue = ERROR_STARTCLONE; 267ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda goto MAIN_QUIT; 268ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda } 269ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda 270ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda /* Wait until device driver is closed. */ 271ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda if (AKD_GetCloseStatus(&st) != AKD_SUCCESS) { 272ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda retValue = ERROR_GETCLOSE_STAT; 273ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda g_mainQuit = AKD_TRUE; 274ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda } 275ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda /* Wait thread completion. */ 276ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda g_stopRequest = 1; 277ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda pthread_join(s_thread, NULL); 278ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda ALOGI("Compass Closed."); 279ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda } 280ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda } 281ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda 282ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi MasudaMAIN_QUIT: 283ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda 284ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda /* Release library */ 285ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda AKFS_Release(); 286ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda /* Close device driver. */ 287ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda AKD_DeinitDevice(); 288ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda /* Show the last message. */ 289ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda Disp_EndMessage(retValue); 290ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda 291ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda return retValue; 292ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda} 293ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda 294ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda 295