10b78afb191aa3c8748bf4837e4693801f3ee762eWonsik Kim/*
20b78afb191aa3c8748bf4837e4693801f3ee762eWonsik Kim * Copyright 2014 The Android Open Source Project
30b78afb191aa3c8748bf4837e4693801f3ee762eWonsik Kim *
40b78afb191aa3c8748bf4837e4693801f3ee762eWonsik Kim * Licensed under the Apache License, Version 2.0 (the "License");
50b78afb191aa3c8748bf4837e4693801f3ee762eWonsik Kim * you may not use this file except in compliance with the License.
60b78afb191aa3c8748bf4837e4693801f3ee762eWonsik Kim * You may obtain a copy of the License at
70b78afb191aa3c8748bf4837e4693801f3ee762eWonsik Kim *
80b78afb191aa3c8748bf4837e4693801f3ee762eWonsik Kim *      http://www.apache.org/licenses/LICENSE-2.0
90b78afb191aa3c8748bf4837e4693801f3ee762eWonsik Kim *
100b78afb191aa3c8748bf4837e4693801f3ee762eWonsik Kim * Unless required by applicable law or agreed to in writing, software
110b78afb191aa3c8748bf4837e4693801f3ee762eWonsik Kim * distributed under the License is distributed on an "AS IS" BASIS,
120b78afb191aa3c8748bf4837e4693801f3ee762eWonsik Kim * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
130b78afb191aa3c8748bf4837e4693801f3ee762eWonsik Kim * See the License for the specific language governing permissions and
140b78afb191aa3c8748bf4837e4693801f3ee762eWonsik Kim * limitations under the License.
150b78afb191aa3c8748bf4837e4693801f3ee762eWonsik Kim */
160b78afb191aa3c8748bf4837e4693801f3ee762eWonsik Kim
170b78afb191aa3c8748bf4837e4693801f3ee762eWonsik Kim#include <fcntl.h>
180b78afb191aa3c8748bf4837e4693801f3ee762eWonsik Kim#include <errno.h>
190b78afb191aa3c8748bf4837e4693801f3ee762eWonsik Kim
200b78afb191aa3c8748bf4837e4693801f3ee762eWonsik Kim#include <cutils/log.h>
210b78afb191aa3c8748bf4837e4693801f3ee762eWonsik Kim#include <cutils/native_handle.h>
220b78afb191aa3c8748bf4837e4693801f3ee762eWonsik Kim
230b78afb191aa3c8748bf4837e4693801f3ee762eWonsik Kim#include <hardware/tv_input.h>
240b78afb191aa3c8748bf4837e4693801f3ee762eWonsik Kim
250b78afb191aa3c8748bf4837e4693801f3ee762eWonsik Kim/*****************************************************************************/
260b78afb191aa3c8748bf4837e4693801f3ee762eWonsik Kim
270b78afb191aa3c8748bf4837e4693801f3ee762eWonsik Kimtypedef struct tv_input_private {
280b78afb191aa3c8748bf4837e4693801f3ee762eWonsik Kim    tv_input_device_t device;
290b78afb191aa3c8748bf4837e4693801f3ee762eWonsik Kim
300b78afb191aa3c8748bf4837e4693801f3ee762eWonsik Kim    // Callback related data
310b78afb191aa3c8748bf4837e4693801f3ee762eWonsik Kim    const tv_input_callback_ops_t* callback;
320b78afb191aa3c8748bf4837e4693801f3ee762eWonsik Kim    void* callback_data;
330b78afb191aa3c8748bf4837e4693801f3ee762eWonsik Kim} tv_input_private_t;
340b78afb191aa3c8748bf4837e4693801f3ee762eWonsik Kim
350b78afb191aa3c8748bf4837e4693801f3ee762eWonsik Kimstatic int tv_input_device_open(const struct hw_module_t* module,
360b78afb191aa3c8748bf4837e4693801f3ee762eWonsik Kim        const char* name, struct hw_device_t** device);
370b78afb191aa3c8748bf4837e4693801f3ee762eWonsik Kim
380b78afb191aa3c8748bf4837e4693801f3ee762eWonsik Kimstatic struct hw_module_methods_t tv_input_module_methods = {
390b78afb191aa3c8748bf4837e4693801f3ee762eWonsik Kim    open: tv_input_device_open
400b78afb191aa3c8748bf4837e4693801f3ee762eWonsik Kim};
410b78afb191aa3c8748bf4837e4693801f3ee762eWonsik Kim
420b78afb191aa3c8748bf4837e4693801f3ee762eWonsik Kimtv_input_module_t HAL_MODULE_INFO_SYM = {
430b78afb191aa3c8748bf4837e4693801f3ee762eWonsik Kim    common: {
440b78afb191aa3c8748bf4837e4693801f3ee762eWonsik Kim        tag: HARDWARE_MODULE_TAG,
450b78afb191aa3c8748bf4837e4693801f3ee762eWonsik Kim        version_major: 0,
460b78afb191aa3c8748bf4837e4693801f3ee762eWonsik Kim        version_minor: 1,
470b78afb191aa3c8748bf4837e4693801f3ee762eWonsik Kim        id: TV_INPUT_HARDWARE_MODULE_ID,
480b78afb191aa3c8748bf4837e4693801f3ee762eWonsik Kim        name: "Sample TV input module",
490b78afb191aa3c8748bf4837e4693801f3ee762eWonsik Kim        author: "The Android Open Source Project",
500b78afb191aa3c8748bf4837e4693801f3ee762eWonsik Kim        methods: &tv_input_module_methods,
510b78afb191aa3c8748bf4837e4693801f3ee762eWonsik Kim    }
520b78afb191aa3c8748bf4837e4693801f3ee762eWonsik Kim};
530b78afb191aa3c8748bf4837e4693801f3ee762eWonsik Kim
540b78afb191aa3c8748bf4837e4693801f3ee762eWonsik Kim/*****************************************************************************/
550b78afb191aa3c8748bf4837e4693801f3ee762eWonsik Kim
560b78afb191aa3c8748bf4837e4693801f3ee762eWonsik Kimstatic int tv_input_initialize(struct tv_input_device* dev,
570b78afb191aa3c8748bf4837e4693801f3ee762eWonsik Kim        const tv_input_callback_ops_t* callback, void* data)
580b78afb191aa3c8748bf4837e4693801f3ee762eWonsik Kim{
590b78afb191aa3c8748bf4837e4693801f3ee762eWonsik Kim    if (dev == NULL || callback == NULL) {
600b78afb191aa3c8748bf4837e4693801f3ee762eWonsik Kim        return -EINVAL;
610b78afb191aa3c8748bf4837e4693801f3ee762eWonsik Kim    }
620b78afb191aa3c8748bf4837e4693801f3ee762eWonsik Kim    tv_input_private_t* priv = (tv_input_private_t*)dev;
630b78afb191aa3c8748bf4837e4693801f3ee762eWonsik Kim    if (priv->callback != NULL) {
640b78afb191aa3c8748bf4837e4693801f3ee762eWonsik Kim        return -EEXIST;
650b78afb191aa3c8748bf4837e4693801f3ee762eWonsik Kim    }
660b78afb191aa3c8748bf4837e4693801f3ee762eWonsik Kim
670b78afb191aa3c8748bf4837e4693801f3ee762eWonsik Kim    priv->callback = callback;
680b78afb191aa3c8748bf4837e4693801f3ee762eWonsik Kim    priv->callback_data = data;
690b78afb191aa3c8748bf4837e4693801f3ee762eWonsik Kim
700b78afb191aa3c8748bf4837e4693801f3ee762eWonsik Kim    return 0;
710b78afb191aa3c8748bf4837e4693801f3ee762eWonsik Kim}
720b78afb191aa3c8748bf4837e4693801f3ee762eWonsik Kim
730b78afb191aa3c8748bf4837e4693801f3ee762eWonsik Kimstatic int tv_input_get_stream_configurations(
740b78afb191aa3c8748bf4837e4693801f3ee762eWonsik Kim        const struct tv_input_device*, int, int*, const tv_stream_config_t**)
750b78afb191aa3c8748bf4837e4693801f3ee762eWonsik Kim{
760b78afb191aa3c8748bf4837e4693801f3ee762eWonsik Kim    return -EINVAL;
770b78afb191aa3c8748bf4837e4693801f3ee762eWonsik Kim}
780b78afb191aa3c8748bf4837e4693801f3ee762eWonsik Kim
790b78afb191aa3c8748bf4837e4693801f3ee762eWonsik Kimstatic int tv_input_open_stream(struct tv_input_device*, int, tv_stream_t*)
800b78afb191aa3c8748bf4837e4693801f3ee762eWonsik Kim{
810b78afb191aa3c8748bf4837e4693801f3ee762eWonsik Kim    return -EINVAL;
820b78afb191aa3c8748bf4837e4693801f3ee762eWonsik Kim}
830b78afb191aa3c8748bf4837e4693801f3ee762eWonsik Kim
840b78afb191aa3c8748bf4837e4693801f3ee762eWonsik Kimstatic int tv_input_close_stream(struct tv_input_device*, int, int)
850b78afb191aa3c8748bf4837e4693801f3ee762eWonsik Kim{
860b78afb191aa3c8748bf4837e4693801f3ee762eWonsik Kim    return -EINVAL;
870b78afb191aa3c8748bf4837e4693801f3ee762eWonsik Kim}
880b78afb191aa3c8748bf4837e4693801f3ee762eWonsik Kim
89dce529a1488a13f3c0df8cc7de5f93262af81646Wonsik Kimstatic int tv_input_request_capture(
90dce529a1488a13f3c0df8cc7de5f93262af81646Wonsik Kim        struct tv_input_device*, int, int, buffer_handle_t, uint32_t)
91dce529a1488a13f3c0df8cc7de5f93262af81646Wonsik Kim{
92dce529a1488a13f3c0df8cc7de5f93262af81646Wonsik Kim    return -EINVAL;
93dce529a1488a13f3c0df8cc7de5f93262af81646Wonsik Kim}
94dce529a1488a13f3c0df8cc7de5f93262af81646Wonsik Kim
95dce529a1488a13f3c0df8cc7de5f93262af81646Wonsik Kimstatic int tv_input_cancel_capture(struct tv_input_device*, int, int, uint32_t)
96dce529a1488a13f3c0df8cc7de5f93262af81646Wonsik Kim{
97dce529a1488a13f3c0df8cc7de5f93262af81646Wonsik Kim    return -EINVAL;
98dce529a1488a13f3c0df8cc7de5f93262af81646Wonsik Kim}
99dce529a1488a13f3c0df8cc7de5f93262af81646Wonsik Kim
1000b78afb191aa3c8748bf4837e4693801f3ee762eWonsik Kim/*****************************************************************************/
1010b78afb191aa3c8748bf4837e4693801f3ee762eWonsik Kim
1020b78afb191aa3c8748bf4837e4693801f3ee762eWonsik Kimstatic int tv_input_device_close(struct hw_device_t *dev)
1030b78afb191aa3c8748bf4837e4693801f3ee762eWonsik Kim{
1040b78afb191aa3c8748bf4837e4693801f3ee762eWonsik Kim    tv_input_private_t* priv = (tv_input_private_t*)dev;
1050b78afb191aa3c8748bf4837e4693801f3ee762eWonsik Kim    if (priv) {
1060b78afb191aa3c8748bf4837e4693801f3ee762eWonsik Kim        free(priv);
1070b78afb191aa3c8748bf4837e4693801f3ee762eWonsik Kim    }
1080b78afb191aa3c8748bf4837e4693801f3ee762eWonsik Kim    return 0;
1090b78afb191aa3c8748bf4837e4693801f3ee762eWonsik Kim}
1100b78afb191aa3c8748bf4837e4693801f3ee762eWonsik Kim
1110b78afb191aa3c8748bf4837e4693801f3ee762eWonsik Kim/*****************************************************************************/
1120b78afb191aa3c8748bf4837e4693801f3ee762eWonsik Kim
1130b78afb191aa3c8748bf4837e4693801f3ee762eWonsik Kimstatic int tv_input_device_open(const struct hw_module_t* module,
1140b78afb191aa3c8748bf4837e4693801f3ee762eWonsik Kim        const char* name, struct hw_device_t** device)
1150b78afb191aa3c8748bf4837e4693801f3ee762eWonsik Kim{
1160b78afb191aa3c8748bf4837e4693801f3ee762eWonsik Kim    int status = -EINVAL;
1170b78afb191aa3c8748bf4837e4693801f3ee762eWonsik Kim    if (!strcmp(name, TV_INPUT_DEFAULT_DEVICE)) {
1180b78afb191aa3c8748bf4837e4693801f3ee762eWonsik Kim        tv_input_private_t* dev = (tv_input_private_t*)malloc(sizeof(*dev));
1190b78afb191aa3c8748bf4837e4693801f3ee762eWonsik Kim
1200b78afb191aa3c8748bf4837e4693801f3ee762eWonsik Kim        /* initialize our state here */
1210b78afb191aa3c8748bf4837e4693801f3ee762eWonsik Kim        memset(dev, 0, sizeof(*dev));
1220b78afb191aa3c8748bf4837e4693801f3ee762eWonsik Kim
1230b78afb191aa3c8748bf4837e4693801f3ee762eWonsik Kim        /* initialize the procs */
1240b78afb191aa3c8748bf4837e4693801f3ee762eWonsik Kim        dev->device.common.tag = HARDWARE_DEVICE_TAG;
1250b78afb191aa3c8748bf4837e4693801f3ee762eWonsik Kim        dev->device.common.version = TV_INPUT_DEVICE_API_VERSION_0_1;
1260b78afb191aa3c8748bf4837e4693801f3ee762eWonsik Kim        dev->device.common.module = const_cast<hw_module_t*>(module);
1270b78afb191aa3c8748bf4837e4693801f3ee762eWonsik Kim        dev->device.common.close = tv_input_device_close;
1280b78afb191aa3c8748bf4837e4693801f3ee762eWonsik Kim
1290b78afb191aa3c8748bf4837e4693801f3ee762eWonsik Kim        dev->device.initialize = tv_input_initialize;
1300b78afb191aa3c8748bf4837e4693801f3ee762eWonsik Kim        dev->device.get_stream_configurations =
1310b78afb191aa3c8748bf4837e4693801f3ee762eWonsik Kim                tv_input_get_stream_configurations;
1320b78afb191aa3c8748bf4837e4693801f3ee762eWonsik Kim        dev->device.open_stream = tv_input_open_stream;
1330b78afb191aa3c8748bf4837e4693801f3ee762eWonsik Kim        dev->device.close_stream = tv_input_close_stream;
134dce529a1488a13f3c0df8cc7de5f93262af81646Wonsik Kim        dev->device.request_capture = tv_input_request_capture;
135dce529a1488a13f3c0df8cc7de5f93262af81646Wonsik Kim        dev->device.cancel_capture = tv_input_cancel_capture;
1360b78afb191aa3c8748bf4837e4693801f3ee762eWonsik Kim
1370b78afb191aa3c8748bf4837e4693801f3ee762eWonsik Kim        *device = &dev->device.common;
1380b78afb191aa3c8748bf4837e4693801f3ee762eWonsik Kim        status = 0;
1390b78afb191aa3c8748bf4837e4693801f3ee762eWonsik Kim    }
1400b78afb191aa3c8748bf4837e4693801f3ee762eWonsik Kim    return status;
1410b78afb191aa3c8748bf4837e4693801f3ee762eWonsik Kim}
142