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