diff --git a/Android.bp b/Android.bp index a12524e0bb..d948da9e33 100644 --- a/Android.bp +++ b/Android.bp @@ -41,6 +41,7 @@ subdirs = [ "tests/pointer/1.0/default/lib", "thermal/1.0", "thermal/1.0/default", + "tv/input/1.0", "vehicle/2.0", "vibrator/1.0", "vibrator/1.0/default", diff --git a/tv/input/1.0/Android.bp b/tv/input/1.0/Android.bp new file mode 100644 index 0000000000..5acb9373b2 --- /dev/null +++ b/tv/input/1.0/Android.bp @@ -0,0 +1,55 @@ +// This file is autogenerated by hidl-gen. Do not edit manually. + +genrule { + name: "android.hardware.tv.input@1.0_genc++", + tool: "hidl-gen", + cmd: "$tool -o $genDir -Lc++ -randroid.hardware:hardware/interfaces android.hardware.tv.input@1.0", + srcs: [ + "types.hal", + "ITvInput.hal", + "ITvInputCallback.hal", + ], + out: [ + "android/hardware/tv/input/1.0/types.cpp", + "android/hardware/tv/input/1.0/TvInputAll.cpp", + "android/hardware/tv/input/1.0/TvInputCallbackAll.cpp", + ], +} + +genrule { + name: "android.hardware.tv.input@1.0_genc++_headers", + tool: "hidl-gen", + cmd: "$tool -o $genDir -Lc++ -randroid.hardware:hardware/interfaces android.hardware.tv.input@1.0", + srcs: [ + "types.hal", + "ITvInput.hal", + "ITvInputCallback.hal", + ], + out: [ + "android/hardware/tv/input/1.0/types.h", + "android/hardware/tv/input/1.0/ITvInput.h", + "android/hardware/tv/input/1.0/IHwTvInput.h", + "android/hardware/tv/input/1.0/BnTvInput.h", + "android/hardware/tv/input/1.0/BpTvInput.h", + "android/hardware/tv/input/1.0/BsTvInput.h", + "android/hardware/tv/input/1.0/ITvInputCallback.h", + "android/hardware/tv/input/1.0/IHwTvInputCallback.h", + "android/hardware/tv/input/1.0/BnTvInputCallback.h", + "android/hardware/tv/input/1.0/BpTvInputCallback.h", + "android/hardware/tv/input/1.0/BsTvInputCallback.h", + ], +} + +cc_library_shared { + name: "android.hardware.tv.input@1.0", + generated_sources: ["android.hardware.tv.input@1.0_genc++"], + generated_headers: ["android.hardware.tv.input@1.0_genc++_headers"], + export_generated_headers: ["android.hardware.tv.input@1.0_genc++_headers"], + shared_libs: [ + "libhidl", + "libhwbinder", + "libutils", + "libcutils", + "android.hardware.audio.common@2.0", + ], +} diff --git a/tv/input/1.0/ITvInput.hal b/tv/input/1.0/ITvInput.hal new file mode 100644 index 0000000000..43de276f00 --- /dev/null +++ b/tv/input/1.0/ITvInput.hal @@ -0,0 +1,79 @@ +/* + * Copyright (C) 2016 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. + */ + +package android.hardware.tv.input@1.0; + +import ITvInputCallback; + +interface ITvInput { + /* + * Sets a callback for events. + * + * Note that initially no device is available in the client side, so the + * implementation must notify all the currently available devices including + * static devices via callback once callback is set. + * + * @param callback Callback object to pass events. + */ + @entry + @exit + @callflow(next={"getStreamConfigurations"}) + setCallback(ITvInputCallback callback); + + /* + * Gets stream configurations for a specific device. + * + * The configs object is valid only until the next + * STREAM_CONFIGURATIONS_CHANGED event. + * + * @param deviceId Device ID for the configurations. + * @return result OK upon success. Otherwise, + * INVALID_ARGUMENTS if the given device ID is not valid. + * @return configurations An array of available configurations. + */ + @callflow(next={"openStream", "getStreamConfigurations", "closeStream"}) + getStreamConfigurations(int32_t deviceId) + generates (Result result, vec configurations); + + /* + * Opens a specific stream in a device. + * + * @param deviceId Device ID for the steam to open. + * @param streamId Steam ID for the steam to open. Must be one of the + * stream IDs returned from getStreamConfigurations(). + * @return result OK upon success. Otherwise, + * INVALID_ARGUMENTS if any of given IDs are not valid; + * INVALID_STATE if the stream with the given ID is already open; + * NO_RESOURCE if the client must close other streams to open the + * stream. + * @return sidebandStream handle for sideband stream. + */ + @callflow(next={"closeStream", "getStreamConfigurations", "openStream"}) + openStream(int32_t deviceId, int32_t streamId) + generates (Result result, handle sidebandStream); + + /* + * Closes a specific stream in a device. + * + * @param deviceId Device ID for the steam to open. + * @param streamId Steam ID for the steam to open. + * @return result OK upon success. Otherwise, + * INVALID_ARGUMENTS if any of given IDs are not valid; + * INVALID_STATE if the stream with the given ID is not open. + */ + @callflow(next={"getStreamConfigurations", "openStream", "closeStream"}) + closeStream(int32_t deviceId, int32_t streamId) generates (Result result); +}; diff --git a/tv/input/1.0/ITvInputCallback.hal b/tv/input/1.0/ITvInputCallback.hal new file mode 100644 index 0000000000..f2f07a039b --- /dev/null +++ b/tv/input/1.0/ITvInputCallback.hal @@ -0,0 +1,27 @@ +/* + * Copyright (C) 2016 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. + */ + +package android.hardware.tv.input@1.0; + +interface ITvInputCallback { + /* + * Notifies the client that an event has occured. For possible event types, + * check TvInputEventType. + * + * @param event Event passed to the client. +     */ + notify(TvInputEvent event); +}; diff --git a/tv/input/1.0/types.hal b/tv/input/1.0/types.hal new file mode 100644 index 0000000000..89a7acc0c6 --- /dev/null +++ b/tv/input/1.0/types.hal @@ -0,0 +1,125 @@ +/* + * Copyright (C) 2016 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. + */ + +package android.hardware.tv.input@1.0; + +import android.hardware.audio.common@2.0; + +enum Result { + OK, + UNKNOWN, + NO_RESOURCE, + INVALID_ARGUMENTS, + INVALID_STATE, +}; + +/* Type of physical TV input. */ +enum TvInputType { + OTHER = 1, // Generic hardware. + TUNER = 2, // Tuner. e.g. built-in terrestrial tuner + COMPOSITE = 3, + SVIDEO = 4, + SCART = 5, + COMPONENT = 6, + VGA = 7, + DVI = 8, + HDMI = 9, // Physical HDMI port. e.g. HDMI 1 + DISPLAY_PORT = 10, +}; + +struct TvInputDeviceInfo { + int32_t deviceId; + TvInputType type; + uint32_t portId; // HDMI port ID number. e.g. 2 for HDMI 2 + AudioDevice audioType; // Audio device type. e.g AudioDevice::IN_HDMI + uint8_t[32] audioAddress; // Audio device address. "" if N/A. If the text + // length is less than 32, the remaining part + // must be filled with 0s. +}; + +enum TvInputEventType { + /* + * Hardware notifies the framework that a device is available. + * + * Note that DEVICE_AVAILABLE and DEVICE_UNAVAILABLE events do not represent + * hotplug events (i.e. plugging cable into or out of the physical port). + * These events notify the framework whether the port is available or not. + * For a concrete example, when a user plugs in or pulls out the HDMI cable + * from a HDMI port, it does not generate DEVICE_AVAILABLE and/or + * DEVICE_UNAVAILABLE events. However, if a user inserts a pluggable USB + * tuner into the Android device, it must generate a DEVICE_AVAILABLE event + * and when the port is removed, it must generate a DEVICE_UNAVAILABLE + * event. + * + * For hotplug events, please see STREAM_CONFIGURATION_CHANGED for more + * details. + * + * HAL implementation must register devices by using this event when the + * device boots up. The framework must recognize device reported via this + * event only. + */ + DEVICE_AVAILABLE = 1, + + /* + * Hardware notifies the framework that a device is unavailable. + * + * HAL implementation must generate this event when a device registered + * by DEVICE_AVAILABLE is no longer available. For example, + * the event can indicate that a USB tuner is plugged out from the Android + * device. + * + * Note that this event is not for indicating cable plugged out of the port; + * for that purpose, the implementation must use + * STREAM_CONFIGURATION_CHANGED event. This event represents the port itself + * being no longer available. + */ + DEVICE_UNAVAILABLE = 2, + + /* + * Stream configurations are changed. Client must regard all open streams + * at the specific device are closed, and must call + * getStreamConfigurations() again, opening some of them if necessary. + * + * HAL implementation must generate this event when the available stream + * configurations change for any reason. A typical use case of this event + * is to notify the framework that the input signal has changed resolution, + * or that the cable is plugged out so that the number of available streams + * is 0. + * + * The implementation must use this event to indicate hotplug status of the + * port. the framework regards input devices with no available streams as + * disconnected, so the implementation can generate this event with no + * available streams to indicate that this device is disconnected, and vice + * versa. + */ + STREAM_CONFIGURATIONS_CHANGED = 3, +}; + +struct TvInputEvent { + TvInputEventType type; + /* + * DEVICE_AVAILABLE: all fields are relevant. + * DEVICE_UNAVAILABLE: only deviceId is relevant. + * STREAM_CONFIGURATIONS_CHANGED: only deviceId is relevant. + */ + TvInputDeviceInfo deviceInfo; +}; + +struct TvStreamConfig { + int32_t streamId; + uint32_t maxVideoWidth; // Max width of the stream. + uint32_t maxVideoHeight; // Max height of the stream. +};