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