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