192af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang/*
292af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang * Copyright (C) 2008-2014 The Android Open Source Project
392af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang *
492af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang * Licensed under the Apache License, Version 2.0 (the "License");
592af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang * you may not use this file except in compliance with the License.
692af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang * You may obtain a copy of the License at
792af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang *
892af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang *      http://www.apache.org/licenses/LICENSE-2.0
992af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang *
1092af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang * Unless required by applicable law or agreed to in writing, software
1192af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang * distributed under the License is distributed on an "AS IS" BASIS,
1292af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1392af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang * See the License for the specific language governing permissions and
1492af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang * limitations under the License.
1592af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang */
1692af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang
1792af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang#define LOG_TAG "Sensors"
1892af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang
1992af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang#include <dirent.h>
2092af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang#include <errno.h>
2192af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang#include <fcntl.h>
2292af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang#include <linux/input.h>
2392af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang#include <math.h>
2492af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang#include <poll.h>
2592af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang#include <pthread.h>
2692af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang#include <stdlib.h>
2792af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang
2892af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang#include <utils/Atomic.h>
2992af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang#include <utils/Log.h>
3092af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang
3192af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang#include <hardware/sensors.h>
3292af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang
3392af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang#include "sensors.h"
3492af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang#include "CwMcuSensor.h"
3592af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang
3692af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang/*****************************************************************************/
3792af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang
3892af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang#define DELAY_OUT_TIME 0x7FFFFFFF
3992af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang
4092af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang#define LIGHT_SENSOR_POLLTIME    2000000000
4192af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang
4292af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang/*****************************************************************************/
4392af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuangstatic const struct sensor_t sSensorList[] = {
4442706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang        {.name =       "Accelerometer Sensor",
4542706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .vendor =     "HTC Group Ltd.",
4642706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .version =    1,
4742706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .handle =     ID_A,
4842706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .type =       SENSOR_TYPE_ACCELEROMETER,
4942706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .maxRange =   RANGE_A,
5042706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .resolution = CONVERT_A,
5142706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .power =      0.17f,
5242706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .minDelay =   10000,
5342706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .fifoReservedEventCount = 0,
540861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .fifoMaxEventCount =   1220,
5542706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .stringType =         0,
5642706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .requiredPermission = 0,
5742706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .maxDelay =      200000,
5842706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .flags = SENSOR_FLAG_CONTINUOUS_MODE,
5942706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .reserved =          {}
6042706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang        },
6142706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang        {.name =       "Magnetic field Sensor",
6242706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .vendor =     "HTC Group Ltd.",
6342706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .version =    1,
6442706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .handle =     ID_M,
6542706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .type =       SENSOR_TYPE_MAGNETIC_FIELD,
6642706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .maxRange =   200.0f,
6742706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .resolution = CONVERT_M,
6842706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .power =      5.0f,
69943e91771dc19f5e70b9d150ebbbc770b9db07b6Andy Chuang         .minDelay =   10000,
7042706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .fifoReservedEventCount = 0,
710861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .fifoMaxEventCount =   1220,
7242706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .stringType =         0,
7342706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .requiredPermission = 0,
7442706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .maxDelay =      200000,
7542706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .flags = SENSOR_FLAG_CONTINUOUS_MODE,
7642706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .reserved =          {}
7742706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang        },
7842706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang        {.name =       "Gyroscope Sensor",
7942706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .vendor =     "HTC Group Ltd.",
8042706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .version =    1,
8142706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .handle =     ID_GY,
8242706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .type =       SENSOR_TYPE_GYROSCOPE,
83943e91771dc19f5e70b9d150ebbbc770b9db07b6Andy Chuang         .maxRange =   2000.0f,
8442706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .resolution = CONVERT_GYRO,
8542706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .power =      6.1f,
8642706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .minDelay =   10000,
8742706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .fifoReservedEventCount = 0,
880861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .fifoMaxEventCount =   1220,
8942706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .stringType =         0,
9042706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .requiredPermission = 0,
9142706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .maxDelay =      200000,
9242706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .flags = SENSOR_FLAG_CONTINUOUS_MODE,
9342706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .reserved =          {}
9442706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang        },
9592af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang        {.name =       "CM32181 Light sensor",
9692af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang         .vendor =     "Capella Microsystems",
9792af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang         .version =    1,
9892af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang         .handle =     ID_L,
9992af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang         .type =       SENSOR_TYPE_LIGHT,
10092af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang         .maxRange =   10240.0f,
10192af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang         .resolution = 1.0f,
10292af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang         .power =      0.15f,
10392af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang         .minDelay =   0,
10442706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .fifoReservedEventCount = 0,
10542706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .fifoMaxEventCount =      0,
10642706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .stringType =         NULL,
10717c4ff58c6500cd0cb3ca0ff581d8109e82743ccAravind Akella         .requiredPermission = NULL,
10842706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .maxDelay =           0,
10942706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .flags = SENSOR_FLAG_ON_CHANGE_MODE,
11042706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .reserved =          {}
11142706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang        },
11242706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang        {.name =       "Pressure Sensor",
11342706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .vendor =     "HTC Group Ltd.",
11442706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .version =    1,
11542706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .handle =     ID_PS,
11642706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .type =       SENSOR_TYPE_PRESSURE,
11742706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .maxRange =   2000,
11842706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .resolution = 1.0f,
11942706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .power =      0.0027f,
12042706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .minDelay =   10000,
12142706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .fifoReservedEventCount = 0,
1220861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .fifoMaxEventCount =   1220,
12342706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .stringType =         0,
12442706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .requiredPermission = 0,
12542706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .maxDelay =      200000,
12642706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .flags = SENSOR_FLAG_CONTINUOUS_MODE,
12742706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .reserved =          {}
12842706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang        },
12942706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang        {.name =       "CWGD Orientation Sensor",
13042706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .vendor =     "HTC Group Ltd.",
13142706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .version =    1,
13242706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .handle =     ID_O,
13342706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .type =       SENSOR_TYPE_ORIENTATION,
13442706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .maxRange =   360.0f,
13542706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .resolution = 0.1f,
13642706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .power =      11.27f,
13742706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .minDelay =   10000,
13842706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .fifoReservedEventCount = 0,
1390861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .fifoMaxEventCount =   1220,
14042706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .stringType =         0,
14142706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .requiredPermission = 0,
14242706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .maxDelay =      200000,
14342706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .flags = SENSOR_FLAG_CONTINUOUS_MODE,
14442706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .reserved =          {}
14542706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang        },
14642706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang        {.name =       "Rotation Vector",
14742706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .vendor =     "HTC Group Ltd.",
14842706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .version =    1,
14942706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .handle =     ID_RV,
15042706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .type =       SENSOR_TYPE_ROTATION_VECTOR,
15142706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .maxRange =   1.0f,
152943e91771dc19f5e70b9d150ebbbc770b9db07b6Andy Chuang         .resolution = 0.0001f,
15342706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .power =      11.27f,
15442706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .minDelay =   10000,
15542706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .fifoReservedEventCount = 0,
1560861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .fifoMaxEventCount =   1220,
15742706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .stringType =         0,
15842706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .requiredPermission = 0,
15942706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .maxDelay =      200000,
16042706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .flags = SENSOR_FLAG_CONTINUOUS_MODE,
16142706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .reserved =          {}
16242706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang        },
16342706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang        {.name =       "Linear Acceleration",
16442706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .vendor =     "HTC Group Ltd.",
16542706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .version =    1,
16642706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .handle =     ID_LA,
16742706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .type =       SENSOR_TYPE_LINEAR_ACCELERATION,
16842706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .maxRange =   RANGE_A,
169943e91771dc19f5e70b9d150ebbbc770b9db07b6Andy Chuang         .resolution = 0.01,
17042706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .power =      11.27f,
17142706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .minDelay =   10000,
17242706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .fifoReservedEventCount = 0,
1730861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .fifoMaxEventCount =   1220,
17442706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .stringType =         0,
17542706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .requiredPermission = 0,
17642706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .maxDelay =      200000,
17742706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .flags = SENSOR_FLAG_CONTINUOUS_MODE,
17842706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .reserved =          {}
17942706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang        },
18042706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang        {.name =       "Gravity",
18142706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .vendor =     "HTC Group Ltd.",
18242706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .version =    1,
18342706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .handle =     ID_G,
18442706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .type =       SENSOR_TYPE_GRAVITY,
18542706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .maxRange =   GRAVITY_EARTH,
186943e91771dc19f5e70b9d150ebbbc770b9db07b6Andy Chuang         .resolution = 0.01,
18742706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .power =      11.27f,
18842706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .minDelay =   10000,
18942706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .fifoReservedEventCount = 0,
1900861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .fifoMaxEventCount =   1220,
19142706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .stringType =         0,
19242706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .requiredPermission = 0,
19342706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .maxDelay =      200000,
19442706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .flags = SENSOR_FLAG_CONTINUOUS_MODE,
19542706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .reserved =          {}
19642706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang        },
19742706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang        {.name =       "Magnetic Uncalibrated",
19842706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .vendor =     "hTC Corp.",
19942706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .version =    1,
20042706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .handle =     ID_CW_MAGNETIC_UNCALIBRATED,
20142706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .type =       SENSOR_TYPE_MAGNETIC_FIELD_UNCALIBRATED,
20242706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .maxRange =   200.0f,
203943e91771dc19f5e70b9d150ebbbc770b9db07b6Andy Chuang         .resolution = CONVERT_M,
20442706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .power =      5.0f,
205943e91771dc19f5e70b9d150ebbbc770b9db07b6Andy Chuang         .minDelay =   10000,
20642706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .fifoReservedEventCount = 0,
2070861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .fifoMaxEventCount =    610,
20842706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .stringType =         0,
20942706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .requiredPermission = 0,
21042706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .maxDelay =      200000,
21142706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .flags = SENSOR_FLAG_CONTINUOUS_MODE,
21242706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .reserved =          {}
21342706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang        },
21442706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang        {.name =       "Gyroscope Uncalibrated",
21542706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .vendor =     "hTC Corp.",
21642706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .version =    1,
21742706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .handle =     ID_CW_GYROSCOPE_UNCALIBRATED,
21842706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .type =       SENSOR_TYPE_GYROSCOPE_UNCALIBRATED,
219943e91771dc19f5e70b9d150ebbbc770b9db07b6Andy Chuang         .maxRange =   2000.0f,
220943e91771dc19f5e70b9d150ebbbc770b9db07b6Andy Chuang         .resolution = CONVERT_GYRO,
22142706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .power =      6.1f,
22242706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .minDelay =   10000,
22342706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .fifoReservedEventCount = 0,
2240861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .fifoMaxEventCount =    610,
22542706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .stringType =         0,
22642706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .requiredPermission = 0,
22742706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .maxDelay =      200000,
22842706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .flags = SENSOR_FLAG_CONTINUOUS_MODE,
22942706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .reserved =          {}
23042706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang        },
23142706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang        {.name =       "Game Rotation Vector",
23242706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .vendor =     "hTC Corp.",
23342706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .version =    1,
23442706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .handle =     ID_CW_GAME_ROTATION_VECTOR,
23542706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .type =       SENSOR_TYPE_GAME_ROTATION_VECTOR,
236943e91771dc19f5e70b9d150ebbbc770b9db07b6Andy Chuang         .maxRange =   1.0f,
237943e91771dc19f5e70b9d150ebbbc770b9db07b6Andy Chuang         .resolution = 0.0001f,
23842706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .power =      11.27f,
23942706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .minDelay =   10000,
24042706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .fifoReservedEventCount = 0,
2410861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .fifoMaxEventCount =   1220,
24242706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .stringType =         0,
24342706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .requiredPermission = 0,
24442706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .maxDelay =      200000,
24542706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .flags = SENSOR_FLAG_CONTINUOUS_MODE,
24642706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .reserved =          {}
24742706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang        },
24842706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang        {.name =       "Geomagnetic Rotation Vector",
24942706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .vendor =     "hTC Corp.",
25042706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .version =    1,
25142706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .handle =     ID_CW_GEOMAGNETIC_ROTATION_VECTOR,
25242706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .type =       SENSOR_TYPE_GEOMAGNETIC_ROTATION_VECTOR,
253943e91771dc19f5e70b9d150ebbbc770b9db07b6Andy Chuang         .maxRange =   1.0f,
254943e91771dc19f5e70b9d150ebbbc770b9db07b6Andy Chuang         .resolution = 0.0001f,
25542706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .power =      11.27f,
25642706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .minDelay =   10000,
25742706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .fifoReservedEventCount = 0,
2580861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .fifoMaxEventCount =   1220,
25942706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .stringType =         0,
26042706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .requiredPermission = 0,
26142706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .maxDelay =      200000,
26242706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .flags = SENSOR_FLAG_CONTINUOUS_MODE,
26342706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .reserved =          {}
26442706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang        },
26542706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang        {.name =       "Significant Motion",
26642706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .vendor =     "hTC Corp.",
26742706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .version =    1,
26842706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .handle =     ID_CW_SIGNIFICANT_MOTION,
26942706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .type =       SENSOR_TYPE_SIGNIFICANT_MOTION,
27042706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .maxRange =   200.0f,
27142706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .resolution = 1.0f,
27242706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .power =      0.17f,
27342706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .minDelay =   -1,
27442706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .fifoReservedEventCount = 0,
27542706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .fifoMaxEventCount =      0,
27642706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .stringType =         0,
27742706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .requiredPermission = 0,
27842706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .maxDelay =           0,
27942706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .flags = SENSOR_FLAG_ONE_SHOT_MODE | SENSOR_FLAG_WAKE_UP,
28042706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .reserved =          {}
28142706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang        },
28242706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang        {.name =       "Step Detector",
28342706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .vendor =     "hTC Corp.",
28442706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .version =    1,
28542706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .handle =     ID_CW_STEP_DETECTOR,
28642706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .type =       SENSOR_TYPE_STEP_DETECTOR,
28742706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .maxRange =   200.0f,
28842706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .resolution = 1.0f,
28942706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .power =      0.17f,
29042706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .minDelay =   0,
29142706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .fifoReservedEventCount = 0,
2920861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .fifoMaxEventCount =   1220,
29342706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .stringType =         0,
29442706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .requiredPermission = 0,
29542706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .maxDelay =           0,
29642706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .flags = SENSOR_FLAG_SPECIAL_REPORTING_MODE,
29742706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .reserved =          {}
29842706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang        },
29942706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang        {.name =       "Step Counter",
30042706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .vendor =     "hTC Corp.",
30142706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .version =    1,
30242706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .handle =     ID_CW_STEP_COUNTER,
30342706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .type =       SENSOR_TYPE_STEP_COUNTER,
30442706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .maxRange =   200.0f,
30542706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .resolution = 1.0f,
30642706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .power =      0.17f,
30742706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .minDelay =   0,
30842706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .fifoReservedEventCount = 0,
3090861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .fifoMaxEventCount =   1220,
31042706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .stringType =         0,
31142706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .requiredPermission = 0,
31242706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .maxDelay =           0,
31342706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .flags = SENSOR_FLAG_ON_CHANGE_MODE,
31442706cea96e8fb8385ad70d29dd67c80fefa9c17Andy Chuang         .reserved =          {}
31592af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang        },
3160861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang
3170861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang
3180861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang        {.name =       "Accelerometer Sensor (WAKE_UP)",
3190861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .vendor =     "HTC Group Ltd.",
3200861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .version =    1,
3210861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .handle =     ID_A_W,
3220861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .type =       SENSOR_TYPE_ACCELEROMETER,
3230861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .maxRange =   RANGE_A,
3240861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .resolution = CONVERT_A,
3250861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .power =      0.17f,
3260861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .minDelay =   10000,
3270861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .fifoReservedEventCount = 0,
3280861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .fifoMaxEventCount =   1220,
3290861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .stringType =         0,
3300861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .requiredPermission = 0,
3310861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .maxDelay =      200000,
3320861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .flags = SENSOR_FLAG_CONTINUOUS_MODE | SENSOR_FLAG_WAKE_UP,
3330861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .reserved =          {}
3340861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang        },
3350861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang        {.name =       "Magnetic field Sensor (WAKE_UP)",
3360861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .vendor =     "HTC Group Ltd.",
3370861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .version =    1,
3380861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .handle =     ID_M_W,
3390861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .type =       SENSOR_TYPE_MAGNETIC_FIELD,
3400861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .maxRange =   200.0f,
3410861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .resolution = CONVERT_M,
3420861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .power =      5.0f,
3430861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .minDelay =   10000,
3440861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .fifoReservedEventCount = 0,
3450861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .fifoMaxEventCount =   1220,
3460861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .stringType =         0,
3470861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .requiredPermission = 0,
3480861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .maxDelay =      200000,
3490861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .flags = SENSOR_FLAG_CONTINUOUS_MODE | SENSOR_FLAG_WAKE_UP,
3500861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .reserved =          {}
3510861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang        },
3520861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang        {.name =       "Gyroscope Sensor (WAKE_UP)",
3530861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .vendor =     "HTC Group Ltd.",
3540861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .version =    1,
3550861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .handle =     ID_GY_W,
3560861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .type =       SENSOR_TYPE_GYROSCOPE,
3570861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .maxRange =   2000.0f,
3580861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .resolution = CONVERT_GYRO,
3590861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .power =      6.1f,
3600861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .minDelay =   10000,
3610861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .fifoReservedEventCount = 0,
3620861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .fifoMaxEventCount =   1220,
3630861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .stringType =         0,
3640861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .requiredPermission = 0,
3650861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .maxDelay =      200000,
3660861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .flags = SENSOR_FLAG_CONTINUOUS_MODE | SENSOR_FLAG_WAKE_UP,
3670861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .reserved =          {}
3680861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang        },
3690861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang        {.name =       "Pressure Sensor (WAKE_UP)",
3700861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .vendor =     "HTC Group Ltd.",
3710861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .version =    1,
3720861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .handle =     ID_PS_W,
3730861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .type =       SENSOR_TYPE_PRESSURE,
3740861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .maxRange =   2000,
3750861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .resolution = 1.0f,
3760861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .power =      0.0027f,
3770861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .minDelay =   10000,
3780861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .fifoReservedEventCount = 0,
3790861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .fifoMaxEventCount =   1220,
3800861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .stringType =         0,
3810861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .requiredPermission = 0,
3820861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .maxDelay =      200000,
3830861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .flags = SENSOR_FLAG_CONTINUOUS_MODE | SENSOR_FLAG_WAKE_UP,
3840861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .reserved =          {}
3850861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang        },
3860861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang        {.name =       "CWGD Orientation Sensor (WAKE_UP)",
3870861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .vendor =     "HTC Group Ltd.",
3880861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .version =    1,
3890861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .handle =     ID_O_W,
3900861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .type =       SENSOR_TYPE_ORIENTATION,
3910861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .maxRange =   360.0f,
3920861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .resolution = 0.1f,
3930861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .power =      11.27f,
3940861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .minDelay =   10000,
3950861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .fifoReservedEventCount = 0,
3960861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .fifoMaxEventCount =   1220,
3970861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .stringType =         0,
3980861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .requiredPermission = 0,
3990861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .maxDelay =      200000,
4000861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .flags = SENSOR_FLAG_CONTINUOUS_MODE | SENSOR_FLAG_WAKE_UP,
4010861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .reserved =          {}
4020861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang        },
4030861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang        {.name =       "Rotation Vector (WAKE_UP)",
4040861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .vendor =     "HTC Group Ltd.",
4050861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .version =    1,
4060861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .handle =     ID_RV_W,
4070861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .type =       SENSOR_TYPE_ROTATION_VECTOR,
4080861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .maxRange =   1.0f,
4090861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .resolution = 0.0001f,
4100861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .power =      11.27f,
4110861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .minDelay =   10000,
4120861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .fifoReservedEventCount = 0,
4130861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .fifoMaxEventCount =   1220,
4140861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .stringType =         0,
4150861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .requiredPermission = 0,
4160861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .maxDelay =      200000,
4170861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .flags = SENSOR_FLAG_CONTINUOUS_MODE | SENSOR_FLAG_WAKE_UP,
4180861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .reserved =          {}
4190861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang        },
4200861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang        {.name =       "Linear Acceleration (WAKE_UP)",
4210861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .vendor =     "HTC Group Ltd.",
4220861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .version =    1,
4230861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .handle =     ID_LA_W,
4240861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .type =       SENSOR_TYPE_LINEAR_ACCELERATION,
4250861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .maxRange =   RANGE_A,
4260861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .resolution = 0.01,
4270861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .power =      11.27f,
4280861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .minDelay =   10000,
4290861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .fifoReservedEventCount = 0,
4300861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .fifoMaxEventCount =   1220,
4310861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .stringType =         0,
4320861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .requiredPermission = 0,
4330861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .maxDelay =      200000,
4340861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .flags = SENSOR_FLAG_CONTINUOUS_MODE | SENSOR_FLAG_WAKE_UP,
4350861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .reserved =          {}
4360861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang        },
4370861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang        {.name =       "Gravity (WAKE_UP)",
4380861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .vendor =     "HTC Group Ltd.",
4390861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .version =    1,
4400861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .handle =     ID_G_W,
4410861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .type =       SENSOR_TYPE_GRAVITY,
4420861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .maxRange =   GRAVITY_EARTH,
4430861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .resolution = 0.01,
4440861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .power =      11.27f,
4450861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .minDelay =   10000,
4460861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .fifoReservedEventCount = 0,
4470861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .fifoMaxEventCount =   1220,
4480861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .stringType =         0,
4490861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .requiredPermission = 0,
4500861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .maxDelay =      200000,
4510861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .flags = SENSOR_FLAG_CONTINUOUS_MODE | SENSOR_FLAG_WAKE_UP,
4520861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .reserved =          {}
4530861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang        },
4540861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang        {.name =       "Magnetic Uncalibrated (WAKE_UP)",
4550861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .vendor =     "hTC Corp.",
4560861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .version =    1,
4570861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .handle =     ID_CW_MAGNETIC_UNCALIBRATED_W,
4580861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .type =       SENSOR_TYPE_MAGNETIC_FIELD_UNCALIBRATED,
4590861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .maxRange =   200.0f,
4600861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .resolution = CONVERT_M,
4610861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .power =      5.0f,
4620861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .minDelay =   10000,
4630861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .fifoReservedEventCount = 0,
4640861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .fifoMaxEventCount =    610,
4650861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .stringType =         0,
4660861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .requiredPermission = 0,
4670861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .maxDelay =      200000,
4680861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .flags = SENSOR_FLAG_CONTINUOUS_MODE | SENSOR_FLAG_WAKE_UP,
4690861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .reserved =          {}
4700861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang        },
4710861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang        {.name =       "Gyroscope Uncalibrated (WAKE_UP)",
4720861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .vendor =     "hTC Corp.",
4730861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .version =    1,
4740861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .handle =     ID_CW_GYROSCOPE_UNCALIBRATED_W,
4750861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .type =       SENSOR_TYPE_GYROSCOPE_UNCALIBRATED,
4760861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .maxRange =   2000.0f,
4770861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .resolution = CONVERT_GYRO,
4780861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .power =      6.1f,
4790861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .minDelay =   10000,
4800861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .fifoReservedEventCount = 0,
4810861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .fifoMaxEventCount =    610,
4820861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .stringType =         0,
4830861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .requiredPermission = 0,
4840861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .maxDelay =      200000,
4850861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .flags = SENSOR_FLAG_CONTINUOUS_MODE | SENSOR_FLAG_WAKE_UP,
4860861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .reserved =          {}
4870861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang        },
4880861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang        {.name =       "Game Rotation Vector (WAKE_UP)",
4890861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .vendor =     "hTC Corp.",
4900861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .version =    1,
4910861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .handle =     ID_CW_GAME_ROTATION_VECTOR_W,
4920861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .type =       SENSOR_TYPE_GAME_ROTATION_VECTOR,
4930861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .maxRange =   1.0f,
4940861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .resolution = 0.0001f,
4950861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .power =      11.27f,
4960861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .minDelay =   10000,
4970861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .fifoReservedEventCount = 0,
4980861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .fifoMaxEventCount =   1220,
4990861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .stringType =         0,
5000861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .requiredPermission = 0,
5010861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .maxDelay =      200000,
5020861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .flags = SENSOR_FLAG_CONTINUOUS_MODE | SENSOR_FLAG_WAKE_UP,
5030861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .reserved =          {}
5040861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang        },
5050861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang        {.name =       "Geomagnetic Rotation Vector (WAKE_UP)",
5060861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .vendor =     "hTC Corp.",
5070861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .version =    1,
5080861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .handle =     ID_CW_GEOMAGNETIC_ROTATION_VECTOR_W,
5090861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .type =       SENSOR_TYPE_GEOMAGNETIC_ROTATION_VECTOR,
5100861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .maxRange =   1.0f,
5110861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .resolution = 0.0001f,
5120861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .power =      11.27f,
5130861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .minDelay =   10000,
5140861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .fifoReservedEventCount = 0,
5150861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .fifoMaxEventCount =   1220,
5160861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .stringType =         0,
5170861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .requiredPermission = 0,
5180861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .maxDelay =      200000,
5190861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .flags = SENSOR_FLAG_CONTINUOUS_MODE | SENSOR_FLAG_WAKE_UP,
5200861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .reserved =          {}
5210861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang        },
5220861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang        {.name =       "Step Detector (WAKE_UP)",
5230861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .vendor =     "hTC Corp.",
5240861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .version =    1,
5250861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .handle =     ID_CW_STEP_DETECTOR_W,
5260861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .type =       SENSOR_TYPE_STEP_DETECTOR,
5270861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .maxRange =   200.0f,
5280861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .resolution = 1.0f,
5290861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .power =      0.17f,
5300861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .minDelay =   0,
5310861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .fifoReservedEventCount = 0,
5320861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .fifoMaxEventCount =   1220,
5330861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .stringType =         0,
5340861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .requiredPermission = 0,
5350861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .maxDelay =           0,
5360861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .flags = SENSOR_FLAG_SPECIAL_REPORTING_MODE | SENSOR_FLAG_WAKE_UP,
5370861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .reserved =          {}
5380861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang        },
5390861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang        {.name =       "Step Counter (WAKE_UP)",
5400861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .vendor =     "hTC Corp.",
5410861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .version =    1,
5420861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .handle =     ID_CW_STEP_COUNTER_W,
5430861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .type =       SENSOR_TYPE_STEP_COUNTER,
5440861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .maxRange =   200.0f,
5450861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .resolution = 1.0f,
5460861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .power =      0.17f,
5470861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .minDelay =   0,
5480861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .fifoReservedEventCount = 0,
5490861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .fifoMaxEventCount =   1220,
5500861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .stringType =         0,
5510861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .requiredPermission = 0,
5520861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .maxDelay =           0,
5530861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .flags = SENSOR_FLAG_ON_CHANGE_MODE | SENSOR_FLAG_WAKE_UP,
5540861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang         .reserved =          {}
5550861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang        },
55692af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang};
55792af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang
55892af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuangstatic int open_sensors(const struct hw_module_t* module, const char* id,
55992af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang                        struct hw_device_t** device);
56092af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang
56192af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuangstatic int sensors__get_sensors_list(struct sensors_module_t*,
56292af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang                                     struct sensor_t const** list)
56392af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang{
56492af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang    *list = sSensorList;
56592af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang    return ARRAY_SIZE(sSensorList);
56692af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang}
56792af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang
56892af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuangstatic struct hw_module_methods_t sensors_module_methods = {
56992af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang    open: open_sensors
57092af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang};
57192af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang
57292af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuangstruct sensors_module_t HAL_MODULE_INFO_SYM = {
57392af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang    common: {
57492af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang            tag: HARDWARE_MODULE_TAG,
57592af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang            version_major: 1,
57692af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang            version_minor: 0,
57792af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang            id: SENSORS_HARDWARE_MODULE_ID,
57892af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang            name: "Sensor module",
57992af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang            author: "Electronic Company",
58092af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang            methods: &sensors_module_methods,
58192af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang            dso: NULL,
58292af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang            reserved: { },
58392af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang    },
58492af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang    get_sensors_list: sensors__get_sensors_list,
58592af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang};
58692af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang
58792af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuangstruct sensors_poll_context_t {
588facfc0ab044e00eda3e8763c4dc859552e4c95faAndy Chuang    sensors_poll_device_1_t device; // must be first
58992af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang
59092af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang        sensors_poll_context_t();
59192af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang        ~sensors_poll_context_t();
59292af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang    int activate(int handle, int enabled);
59392af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang    int setDelay(int handle, int64_t ns);
59492af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang    int pollEvents(sensors_event_t* data, int count);
595facfc0ab044e00eda3e8763c4dc859552e4c95faAndy Chuang    int batch(int handle, int flags, int64_t period_ns, int64_t timeout);
596facfc0ab044e00eda3e8763c4dc859552e4c95faAndy Chuang    int flush(int handle);
59792af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang
59892af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuangprivate:
59992af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang    enum {
60092af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang        cwmcu            = 0,
60192af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang        numSensorDrivers,
60292af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang        numFds,
60392af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang    };
60492af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang
60592af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang    static const size_t wake = numFds - 1;
60692af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang    static const char WAKE_MESSAGE = 'W';
60792af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang    struct pollfd mPollFds[numFds];
60892af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang    int mWritePipeFd;
60992af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang    SensorBase* mSensors[numSensorDrivers];
61092af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang
61192af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuangint handleToDriver(int handle) const {
61292af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang        switch (handle) {
61392af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang                case ID_A:
61492af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang                case ID_M:
61592af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang                case ID_GY:
61692af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang                case ID_L:
61792af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang                case ID_PS:
61892af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang                case ID_O:
61992af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang                case ID_RV:
62092af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang                case ID_LA:
62192af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang                case ID_G:
62292af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang                case ID_CW_MAGNETIC_UNCALIBRATED:
62392af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang                case ID_CW_GYROSCOPE_UNCALIBRATED:
62492af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang                case ID_CW_GAME_ROTATION_VECTOR:
62592af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang                case ID_CW_GEOMAGNETIC_ROTATION_VECTOR:
62692af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang                case ID_CW_SIGNIFICANT_MOTION:
62792af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang                case ID_CW_STEP_DETECTOR:
62892af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang                case ID_CW_STEP_COUNTER:
6290861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang                case ID_A_W:
6300861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang                case ID_M_W:
6310861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang                case ID_GY_W:
6320861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang                case ID_PS_W:
6330861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang                case ID_O_W:
6340861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang                case ID_RV_W:
6350861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang                case ID_LA_W:
6360861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang                case ID_G_W:
6370861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang                case ID_CW_MAGNETIC_UNCALIBRATED_W:
6380861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang                case ID_CW_GYROSCOPE_UNCALIBRATED_W:
6390861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang                case ID_CW_GAME_ROTATION_VECTOR_W:
6400861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang                case ID_CW_GEOMAGNETIC_ROTATION_VECTOR_W:
6410861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang                case ID_CW_STEP_DETECTOR_W:
6420861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang                case ID_CW_STEP_COUNTER_W:
64392af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang                        return cwmcu;
64492af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang        }
64592af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang        return -EINVAL;
64692af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang    }
64792af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang};
64892af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang
64992af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang/*****************************************************************************/
65092af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang
65192af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuangsensors_poll_context_t::sensors_poll_context_t()
65292af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang{
65392af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang    mSensors[cwmcu] = new CwMcuSensor();
65492af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang    mPollFds[cwmcu].fd = mSensors[cwmcu]->getFd();
65592af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang    mPollFds[cwmcu].events = POLLIN;
65692af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang    mPollFds[cwmcu].revents = 0;
65792af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang
65892af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang    int wakeFds[2];
65992af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang    int result = pipe(wakeFds);
66092af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang    ALOGE_IF(result<0, "error creating wake pipe (%s)", strerror(errno));
66192af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang    fcntl(wakeFds[0], F_SETFL, O_NONBLOCK);
66292af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang    fcntl(wakeFds[1], F_SETFL, O_NONBLOCK);
66392af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang    mWritePipeFd = wakeFds[1];
66492af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang
66592af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang    mPollFds[wake].fd = wakeFds[0];
66692af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang    mPollFds[wake].events = POLLIN;
66792af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang    mPollFds[wake].revents = 0;
66892af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang}
66992af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang
67092af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuangsensors_poll_context_t::~sensors_poll_context_t() {
67192af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang    for (int i=0 ; i<numSensorDrivers ; i++) {
67292af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang        delete mSensors[i];
67392af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang    }
67492af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang    close(mPollFds[wake].fd);
67592af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang    close(mWritePipeFd);
67692af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang}
67792af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang
67892af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuangint sensors_poll_context_t::activate(int handle, int enabled) {
67992af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang    int index = handleToDriver(handle);
68092af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang    if (index < 0) return index;
68192af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang    int err =  mSensors[index]->setEnable(handle, enabled);
68292af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang    if (enabled && !err) {
68392af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang        const char wakeMessage(WAKE_MESSAGE);
68492af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang        int result = write(mWritePipeFd, &wakeMessage, 1);
68592af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang        ALOGE_IF(result<0, "error sending wake message (%s)", strerror(errno));
68692af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang    }
68792af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang    return err;
68892af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang}
68992af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang
69092af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuangint sensors_poll_context_t::setDelay(int handle, int64_t ns) {
69192af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang
69292af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang    int index = handleToDriver(handle);
69392af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang    if (index < 0) return index;
69492af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang    return mSensors[index]->setDelay(handle, ns);
69592af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang}
69692af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang
69792af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuangint sensors_poll_context_t::pollEvents(sensors_event_t* data, int count)
69892af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang{
69992af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang    int nbEvents = 0;
70092af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang    int n = 0;
70192af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang    do {
70292af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang        // see if we have some leftover from the last poll()
70392af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang        for (int i=0 ; count && i<numSensorDrivers ; i++) {
70492af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang            SensorBase* const sensor(mSensors[i]);
70592af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang            if ((mPollFds[i].revents & POLLIN) || (sensor->hasPendingEvents())) {
70692af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang                int nb = sensor->readEvents(data, count);
70792af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang                if (nb < count) {
70892af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang                    // no more data for this sensor
70992af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang                    mPollFds[i].revents = 0;
71092af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang                }
71192af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang                count -= nb;
71292af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang                nbEvents += nb;
71392af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang                data += nb;
71492af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang            }
71592af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang        }
71692af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang
71792af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang        if (count) {
71892af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang            // we still have some room, so try to see if we can get
71992af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang            // some events immediately or just wait if we don't have
72092af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang            // anything to return
72192af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang            do {
72292af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang                TEMP_FAILURE_RETRY(n = poll(mPollFds, numFds, nbEvents ? 0 : -1));
72392af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang            } while (n < 0 && errno == EINTR);
72492af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang            if (n<0) {
72592af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang                ALOGE("poll() failed (%s)", strerror(errno));
72692af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang                return -errno;
72792af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang            }
72892af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang            if (mPollFds[wake].revents & POLLIN) {
72992af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang                char msg(WAKE_MESSAGE);
73092af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang                int result = read(mPollFds[wake].fd, &msg, 1);
73192af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang                ALOGE_IF(result<0, "error reading from wake pipe (%s)", strerror(errno));
73292af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang                ALOGE_IF(msg != WAKE_MESSAGE, "unknown message on wake queue (0x%02x)", int(msg));
73392af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang                mPollFds[wake].revents = 0;
73492af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang            }
73592af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang        }
73692af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang        // if we have events and space, go read them
73792af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang    } while (n && count);
73892af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang    return nbEvents;
73992af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang}
74092af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang
741facfc0ab044e00eda3e8763c4dc859552e4c95faAndy Chuangint sensors_poll_context_t::batch(int handle, int flags, int64_t period_ns, int64_t timeout)
742facfc0ab044e00eda3e8763c4dc859552e4c95faAndy Chuang{
743facfc0ab044e00eda3e8763c4dc859552e4c95faAndy Chuang    int index = handleToDriver(handle);
744facfc0ab044e00eda3e8763c4dc859552e4c95faAndy Chuang
745facfc0ab044e00eda3e8763c4dc859552e4c95faAndy Chuang    if (index < 0)
746facfc0ab044e00eda3e8763c4dc859552e4c95faAndy Chuang        return index;
747facfc0ab044e00eda3e8763c4dc859552e4c95faAndy Chuang
748facfc0ab044e00eda3e8763c4dc859552e4c95faAndy Chuang    int err = mSensors[index]->batch(handle, flags, period_ns, timeout);
749facfc0ab044e00eda3e8763c4dc859552e4c95faAndy Chuang
750facfc0ab044e00eda3e8763c4dc859552e4c95faAndy Chuang    return err;
751facfc0ab044e00eda3e8763c4dc859552e4c95faAndy Chuang}
752facfc0ab044e00eda3e8763c4dc859552e4c95faAndy Chuang
753facfc0ab044e00eda3e8763c4dc859552e4c95faAndy Chuangint sensors_poll_context_t::flush(int handle)
754facfc0ab044e00eda3e8763c4dc859552e4c95faAndy Chuang{
755facfc0ab044e00eda3e8763c4dc859552e4c95faAndy Chuang    int index = handleToDriver(handle);
756facfc0ab044e00eda3e8763c4dc859552e4c95faAndy Chuang
757facfc0ab044e00eda3e8763c4dc859552e4c95faAndy Chuang    if (index < 0)
758facfc0ab044e00eda3e8763c4dc859552e4c95faAndy Chuang        return index;
759facfc0ab044e00eda3e8763c4dc859552e4c95faAndy Chuang
760facfc0ab044e00eda3e8763c4dc859552e4c95faAndy Chuang    int err = mSensors[index]->flush(handle);
761facfc0ab044e00eda3e8763c4dc859552e4c95faAndy Chuang
762facfc0ab044e00eda3e8763c4dc859552e4c95faAndy Chuang    return err;
763facfc0ab044e00eda3e8763c4dc859552e4c95faAndy Chuang}
764facfc0ab044e00eda3e8763c4dc859552e4c95faAndy Chuang
765facfc0ab044e00eda3e8763c4dc859552e4c95faAndy Chuang
76692af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang/*****************************************************************************/
76792af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang
76892af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuangstatic int poll__close(struct hw_device_t *dev)
76992af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang{
77092af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang    sensors_poll_context_t *ctx = reinterpret_cast<sensors_poll_context_t *>(dev);
77192af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang    if (ctx) {
77292af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang        delete ctx;
77392af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang    }
77492af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang    return 0;
77592af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang}
77692af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang
77792af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuangstatic int poll__activate(struct sensors_poll_device_t *dev,
77892af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang        int handle, int enabled) {
77992af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang    sensors_poll_context_t *ctx = reinterpret_cast<sensors_poll_context_t *>(dev);
78092af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang    return ctx->activate(handle, enabled);
78192af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang}
78292af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang
78392af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuangstatic int poll__setDelay(struct sensors_poll_device_t *dev,
78492af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang        int handle, int64_t ns) {
78592af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang    sensors_poll_context_t *ctx = reinterpret_cast<sensors_poll_context_t *>(dev);
78692af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang    return ctx->setDelay(handle, ns);
78792af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang}
78892af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang
78992af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuangstatic int poll__poll(struct sensors_poll_device_t *dev,
79092af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang        sensors_event_t* data, int count) {
79192af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang    sensors_poll_context_t *ctx = reinterpret_cast<sensors_poll_context_t *>(dev);
79292af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang    return ctx->pollEvents(data, count);
79392af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang}
79492af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang
795facfc0ab044e00eda3e8763c4dc859552e4c95faAndy Chuangstatic int poll__batch(struct sensors_poll_device_1 *dev,
796facfc0ab044e00eda3e8763c4dc859552e4c95faAndy Chuang                      int handle, int flags, int64_t period_ns, int64_t timeout)
797facfc0ab044e00eda3e8763c4dc859552e4c95faAndy Chuang{
798facfc0ab044e00eda3e8763c4dc859552e4c95faAndy Chuang    sensors_poll_context_t *ctx = (sensors_poll_context_t *)dev;
799facfc0ab044e00eda3e8763c4dc859552e4c95faAndy Chuang    return ctx->batch(handle, flags, period_ns, timeout);
800facfc0ab044e00eda3e8763c4dc859552e4c95faAndy Chuang}
801facfc0ab044e00eda3e8763c4dc859552e4c95faAndy Chuang
802facfc0ab044e00eda3e8763c4dc859552e4c95faAndy Chuangstatic int poll__flush(struct sensors_poll_device_1 *dev,
803facfc0ab044e00eda3e8763c4dc859552e4c95faAndy Chuang                      int handle)
804facfc0ab044e00eda3e8763c4dc859552e4c95faAndy Chuang{
805facfc0ab044e00eda3e8763c4dc859552e4c95faAndy Chuang    sensors_poll_context_t *ctx = (sensors_poll_context_t *)dev;
806facfc0ab044e00eda3e8763c4dc859552e4c95faAndy Chuang    return ctx->flush(handle);
807facfc0ab044e00eda3e8763c4dc859552e4c95faAndy Chuang}
80892af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang/*****************************************************************************/
80992af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang
81092af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang// Open a new instance of a sensor device using name
81192af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuangstatic int open_sensors(const struct hw_module_t* module, const char*,
81292af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang                        struct hw_device_t** device)
81392af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang{
81492af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang    sensors_poll_context_t *dev = new sensors_poll_context_t();
81592af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang
816facfc0ab044e00eda3e8763c4dc859552e4c95faAndy Chuang    memset(&dev->device, 0, sizeof(sensors_poll_device_1_t));
81792af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang
81892af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang    dev->device.common.tag = HARDWARE_DEVICE_TAG;
8190861d7656a6615e70ec9b11463701a2f5f26fbc4Andy Chuang    dev->device.common.version  = SENSORS_DEVICE_API_VERSION_1_3;
82092af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang    dev->device.common.module   = const_cast<hw_module_t*>(module);
82192af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang    dev->device.common.close    = poll__close;
82292af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang    dev->device.activate        = poll__activate;
82392af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang    dev->device.setDelay        = poll__setDelay;
82492af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang    dev->device.poll            = poll__poll;
82592af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang
826facfc0ab044e00eda3e8763c4dc859552e4c95faAndy Chuang    // Batch processing
827facfc0ab044e00eda3e8763c4dc859552e4c95faAndy Chuang    dev->device.batch           = poll__batch;
828facfc0ab044e00eda3e8763c4dc859552e4c95faAndy Chuang    dev->device.flush           = poll__flush;
829facfc0ab044e00eda3e8763c4dc859552e4c95faAndy Chuang
83092af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang    *device = &dev->device.common;
83192af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang
83292af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang    return 0;
83392af8b26d261f8ce50980eeb41cf1406edb9f530Andy Chuang}
8343b6c76f413578d3941cc0efb15d2937a5eaa6856JP Abgrall
835