1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
|
/*
* Copyright (C) 2013 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include <errno.h>
#include <stdlib.h>
#include <cutils/log.h>
#define QEMU_HARDWARE
#include <qemu.h>
#include <hardware/hardware.h>
#include <hardware/vibrator.h>
static int sendit(unsigned int timeout_ms)
{
if (qemu_check()) {
if (qemu_control_command("vibrator:%u", timeout_ms) < 0) {
return -errno;
}
return 0;
}
return -ENOSYS;
}
static int qemu_vibra_on(vibrator_device_t* vibradev __unused, unsigned int timeout_ms)
{
return sendit(timeout_ms);
}
static int qemu_vibra_off(vibrator_device_t* vibradev __unused)
{
return sendit(0);
}
static int qemu_vibra_close(hw_device_t *device)
{
free(device);
return 0;
}
static int qemu_vibra_open(const hw_module_t* module, const char* id __unused,
hw_device_t** device) {
vibrator_device_t *vibradev = calloc(1, sizeof(vibrator_device_t));
if (!vibradev) {
ALOGE("No memory available to create Goldfish vibrator device!");
return -ENOMEM;
}
vibradev->common.tag = HARDWARE_DEVICE_TAG;
vibradev->common.module = (hw_module_t *) module;
vibradev->common.version = HARDWARE_DEVICE_API_VERSION(1,0);
vibradev->common.close = qemu_vibra_close;
vibradev->vibrator_on = qemu_vibra_on;
vibradev->vibrator_off = qemu_vibra_off;
*device = (hw_device_t *) vibradev;
return 0;
}
/*===========================*/
/* Emulator vibrator module */
/*===========================*/
static struct hw_module_methods_t qemu_vibrator_module_methods = {
.open = qemu_vibra_open,
};
struct hw_module_t HAL_MODULE_INFO_SYM = {
.tag = HARDWARE_MODULE_TAG,
.module_api_version = VIBRATOR_API_VERSION,
.hal_api_version = HARDWARE_HAL_API_VERSION,
.id = VIBRATOR_HARDWARE_MODULE_ID,
.name = "Goldfish vibrator module",
.author = "The Android Open Source Project",
.methods = &qemu_vibrator_module_methods,
};
|