• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2019 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 #define LOG_TAG "android.hardware.tv.cec@2.0-impl"
18 #include <android-base/logging.h>
19 
20 #include <hardware/hardware.h>
21 #include <hardware/hdmi_cec.h>
22 #include "HdmiCec.h"
23 
24 namespace android {
25 namespace hardware {
26 namespace tv {
27 namespace cec {
28 namespace V2_0 {
29 namespace implementation {
30 
31 static_assert(CEC_DEVICE_INACTIVE == static_cast<int>(CecDeviceType::INACTIVE),
32               "CecDeviceType::INACTIVE must match legacy value.");
33 static_assert(CEC_DEVICE_TV == static_cast<int>(CecDeviceType::TV),
34               "CecDeviceType::TV must match legacy value.");
35 static_assert(CEC_DEVICE_RECORDER == static_cast<int>(CecDeviceType::RECORDER),
36               "CecDeviceType::RECORDER must match legacy value.");
37 static_assert(CEC_DEVICE_TUNER == static_cast<int>(CecDeviceType::TUNER),
38               "CecDeviceType::TUNER must match legacy value.");
39 static_assert(CEC_DEVICE_PLAYBACK == static_cast<int>(CecDeviceType::PLAYBACK),
40               "CecDeviceType::PLAYBACK must match legacy value.");
41 static_assert(CEC_DEVICE_AUDIO_SYSTEM == static_cast<int>(CecDeviceType::AUDIO_SYSTEM),
42               "CecDeviceType::AUDIO_SYSTEM must match legacy value.");
43 /* TODO: Adjust for cec@2.0
44 static_assert(CEC_DEVICE_MAX == static_cast<int>(CecDeviceType::MAX),
45         "CecDeviceType::MAX must match legacy value.");
46 */
47 static_assert(CEC_ADDR_TV == static_cast<int>(CecLogicalAddress::TV),
48               "CecLogicalAddress::TV must match legacy value.");
49 static_assert(CEC_ADDR_RECORDER_1 == static_cast<int>(CecLogicalAddress::RECORDER_1),
50               "CecLogicalAddress::RECORDER_1 must match legacy value.");
51 static_assert(CEC_ADDR_RECORDER_2 == static_cast<int>(CecLogicalAddress::RECORDER_2),
52               "CecLogicalAddress::RECORDER_2 must match legacy value.");
53 static_assert(CEC_ADDR_TUNER_1 == static_cast<int>(CecLogicalAddress::TUNER_1),
54               "CecLogicalAddress::TUNER_1 must match legacy value.");
55 static_assert(CEC_ADDR_PLAYBACK_1 == static_cast<int>(CecLogicalAddress::PLAYBACK_1),
56               "CecLogicalAddress::PLAYBACK_1 must match legacy value.");
57 static_assert(CEC_ADDR_AUDIO_SYSTEM == static_cast<int>(CecLogicalAddress::AUDIO_SYSTEM),
58               "CecLogicalAddress::AUDIO_SYSTEM must match legacy value.");
59 static_assert(CEC_ADDR_TUNER_2 == static_cast<int>(CecLogicalAddress::TUNER_2),
60               "CecLogicalAddress::TUNER_2 must match legacy value.");
61 static_assert(CEC_ADDR_TUNER_3 == static_cast<int>(CecLogicalAddress::TUNER_3),
62               "CecLogicalAddress::TUNER_3 must match legacy value.");
63 static_assert(CEC_ADDR_PLAYBACK_2 == static_cast<int>(CecLogicalAddress::PLAYBACK_2),
64               "CecLogicalAddress::PLAYBACK_2 must match legacy value.");
65 static_assert(CEC_ADDR_RECORDER_3 == static_cast<int>(CecLogicalAddress::RECORDER_3),
66               "CecLogicalAddress::RECORDER_3 must match legacy value.");
67 static_assert(CEC_ADDR_TUNER_4 == static_cast<int>(CecLogicalAddress::TUNER_4),
68               "CecLogicalAddress::TUNER_4 must match legacy value.");
69 static_assert(CEC_ADDR_PLAYBACK_3 == static_cast<int>(CecLogicalAddress::PLAYBACK_3),
70               "CecLogicalAddress::PLAYBACK_3 must match legacy value.");
71 /* TODO: Adjust for cec@2.0
72 static_assert(CEC_ADDR_FREE_USE == static_cast<int>(CecLogicalAddress::FREE_USE),
73         "CecLogicalAddress::FREE_USE must match legacy value.");
74 */
75 static_assert(CEC_ADDR_UNREGISTERED == static_cast<int>(CecLogicalAddress::UNREGISTERED),
76               "CecLogicalAddress::UNREGISTERED must match legacy value.");
77 static_assert(CEC_ADDR_BROADCAST == static_cast<int>(CecLogicalAddress::BROADCAST),
78               "CecLogicalAddress::BROADCAST must match legacy value.");
79 
80 static_assert(CEC_MESSAGE_FEATURE_ABORT == static_cast<int>(CecMessageType::FEATURE_ABORT),
81               "CecMessageType::FEATURE_ABORT must match legacy value.");
82 static_assert(CEC_MESSAGE_IMAGE_VIEW_ON == static_cast<int>(CecMessageType::IMAGE_VIEW_ON),
83               "CecMessageType::IMAGE_VIEW_ON must match legacy value.");
84 static_assert(CEC_MESSAGE_TUNER_STEP_INCREMENT ==
85                       static_cast<int>(CecMessageType::TUNER_STEP_INCREMENT),
86               "CecMessageType::TUNER_STEP_INCREMENT must match legacy value.");
87 static_assert(CEC_MESSAGE_TUNER_STEP_DECREMENT ==
88                       static_cast<int>(CecMessageType::TUNER_STEP_DECREMENT),
89               "CecMessageType::TUNER_STEP_DECREMENT must match legacy value.");
90 static_assert(CEC_MESSAGE_TUNER_DEVICE_STATUS ==
91                       static_cast<int>(CecMessageType::TUNER_DEVICE_STATUS),
92               "CecMessageType::TUNER_DEVICE_STATUS must match legacy value.");
93 static_assert(CEC_MESSAGE_GIVE_TUNER_DEVICE_STATUS ==
94                       static_cast<int>(CecMessageType::GIVE_TUNER_DEVICE_STATUS),
95               "CecMessageType::GIVE_TUNER_DEVICE_STATUS must match legacy value.");
96 static_assert(CEC_MESSAGE_RECORD_ON == static_cast<int>(CecMessageType::RECORD_ON),
97               "CecMessageType::RECORD_ON must match legacy value.");
98 static_assert(CEC_MESSAGE_RECORD_STATUS == static_cast<int>(CecMessageType::RECORD_STATUS),
99               "CecMessageType::RECORD_STATUS must match legacy value.");
100 static_assert(CEC_MESSAGE_RECORD_OFF == static_cast<int>(CecMessageType::RECORD_OFF),
101               "CecMessageType::RECORD_OFF must match legacy value.");
102 static_assert(CEC_MESSAGE_TEXT_VIEW_ON == static_cast<int>(CecMessageType::TEXT_VIEW_ON),
103               "CecMessageType::TEXT_VIEW_ON must match legacy value.");
104 static_assert(CEC_MESSAGE_RECORD_TV_SCREEN == static_cast<int>(CecMessageType::RECORD_TV_SCREEN),
105               "CecMessageType::RECORD_TV_SCREEN must match legacy value.");
106 static_assert(CEC_MESSAGE_GIVE_DECK_STATUS == static_cast<int>(CecMessageType::GIVE_DECK_STATUS),
107               "CecMessageType::GIVE_DECK_STATUS must match legacy value.");
108 static_assert(CEC_MESSAGE_STANDBY == static_cast<int>(CecMessageType::STANDBY),
109               "CecMessageType::STANDBY must match legacy value.");
110 static_assert(CEC_MESSAGE_PLAY == static_cast<int>(CecMessageType::PLAY),
111               "CecMessageType::PLAY must match legacy value.");
112 static_assert(CEC_MESSAGE_DECK_CONTROL == static_cast<int>(CecMessageType::DECK_CONTROL),
113               "CecMessageType::DECK_CONTROL must match legacy value.");
114 static_assert(CEC_MESSAGE_TIMER_CLEARED_STATUS ==
115                       static_cast<int>(CecMessageType::TIMER_CLEARED_STATUS),
116               "CecMessageType::TIMER_CLEARED_STATUS must match legacy value.");
117 static_assert(CEC_MESSAGE_USER_CONTROL_PRESSED ==
118                       static_cast<int>(CecMessageType::USER_CONTROL_PRESSED),
119               "CecMessageType::USER_CONTROL_PRESSED must match legacy value.");
120 static_assert(CEC_MESSAGE_USER_CONTROL_RELEASED ==
121                       static_cast<int>(CecMessageType::USER_CONTROL_RELEASED),
122               "CecMessageType::USER_CONTROL_RELEASED must match legacy value.");
123 static_assert(CEC_MESSAGE_GIVE_OSD_NAME == static_cast<int>(CecMessageType::GIVE_OSD_NAME),
124               "CecMessageType::GIVE_OSD_NAME must match legacy value.");
125 static_assert(CEC_MESSAGE_SET_OSD_NAME == static_cast<int>(CecMessageType::SET_OSD_NAME),
126               "CecMessageType::SET_OSD_NAME must match legacy value.");
127 static_assert(CEC_MESSAGE_SYSTEM_AUDIO_MODE_REQUEST ==
128                       static_cast<int>(CecMessageType::SYSTEM_AUDIO_MODE_REQUEST),
129               "CecMessageType::SYSTEM_AUDIO_MODE_REQUEST must match legacy value.");
130 static_assert(CEC_MESSAGE_GIVE_AUDIO_STATUS == static_cast<int>(CecMessageType::GIVE_AUDIO_STATUS),
131               "CecMessageType::GIVE_AUDIO_STATUS must match legacy value.");
132 static_assert(CEC_MESSAGE_SET_SYSTEM_AUDIO_MODE ==
133                       static_cast<int>(CecMessageType::SET_SYSTEM_AUDIO_MODE),
134               "CecMessageType::SET_SYSTEM_AUDIO_MODE must match legacy value.");
135 static_assert(CEC_MESSAGE_REPORT_AUDIO_STATUS ==
136                       static_cast<int>(CecMessageType::REPORT_AUDIO_STATUS),
137               "CecMessageType::REPORT_AUDIO_STATUS must match legacy value.");
138 static_assert(CEC_MESSAGE_GIVE_SYSTEM_AUDIO_MODE_STATUS ==
139                       static_cast<int>(CecMessageType::GIVE_SYSTEM_AUDIO_MODE_STATUS),
140               "CecMessageType::GIVE_SYSTEM_AUDIO_MODE_STATUS must match legacy value.");
141 static_assert(CEC_MESSAGE_SYSTEM_AUDIO_MODE_STATUS ==
142                       static_cast<int>(CecMessageType::SYSTEM_AUDIO_MODE_STATUS),
143               "CecMessageType::SYSTEM_AUDIO_MODE_STATUS must match legacy value.");
144 static_assert(CEC_MESSAGE_ROUTING_CHANGE == static_cast<int>(CecMessageType::ROUTING_CHANGE),
145               "CecMessageType::ROUTING_CHANGE must match legacy value.");
146 static_assert(CEC_MESSAGE_ROUTING_INFORMATION ==
147                       static_cast<int>(CecMessageType::ROUTING_INFORMATION),
148               "CecMessageType::ROUTING_INFORMATION must match legacy value.");
149 static_assert(CEC_MESSAGE_ACTIVE_SOURCE == static_cast<int>(CecMessageType::ACTIVE_SOURCE),
150               "CecMessageType::ACTIVE_SOURCE must match legacy value.");
151 static_assert(CEC_MESSAGE_GIVE_PHYSICAL_ADDRESS ==
152                       static_cast<int>(CecMessageType::GIVE_PHYSICAL_ADDRESS),
153               "CecMessageType::GIVE_PHYSICAL_ADDRESS must match legacy value.");
154 static_assert(CEC_MESSAGE_REPORT_PHYSICAL_ADDRESS ==
155                       static_cast<int>(CecMessageType::REPORT_PHYSICAL_ADDRESS),
156               "CecMessageType::REPORT_PHYSICAL_ADDRESS must match legacy value.");
157 static_assert(CEC_MESSAGE_REQUEST_ACTIVE_SOURCE ==
158                       static_cast<int>(CecMessageType::REQUEST_ACTIVE_SOURCE),
159               "CecMessageType::REQUEST_ACTIVE_SOURCE must match legacy value.");
160 static_assert(CEC_MESSAGE_SET_STREAM_PATH == static_cast<int>(CecMessageType::SET_STREAM_PATH),
161               "CecMessageType::SET_STREAM_PATH must match legacy value.");
162 static_assert(CEC_MESSAGE_DEVICE_VENDOR_ID == static_cast<int>(CecMessageType::DEVICE_VENDOR_ID),
163               "CecMessageType::DEVICE_VENDOR_ID must match legacy value.");
164 static_assert(CEC_MESSAGE_VENDOR_COMMAND == static_cast<int>(CecMessageType::VENDOR_COMMAND),
165               "CecMessageType::VENDOR_COMMAND must match legacy value.");
166 static_assert(CEC_MESSAGE_VENDOR_REMOTE_BUTTON_DOWN ==
167                       static_cast<int>(CecMessageType::VENDOR_REMOTE_BUTTON_DOWN),
168               "CecMessageType::VENDOR_REMOTE_BUTTON_DOWN must match legacy value.");
169 static_assert(CEC_MESSAGE_VENDOR_REMOTE_BUTTON_UP ==
170                       static_cast<int>(CecMessageType::VENDOR_REMOTE_BUTTON_UP),
171               "CecMessageType::VENDOR_REMOTE_BUTTON_UP must match legacy value.");
172 static_assert(CEC_MESSAGE_GIVE_DEVICE_VENDOR_ID ==
173                       static_cast<int>(CecMessageType::GIVE_DEVICE_VENDOR_ID),
174               "CecMessageType::GIVE_DEVICE_VENDOR_ID must match legacy value.");
175 static_assert(CEC_MESSAGE_MENU_REQUEST == static_cast<int>(CecMessageType::MENU_REQUEST),
176               "CecMessageType::MENU_REQUEST must match legacy value.");
177 static_assert(CEC_MESSAGE_MENU_STATUS == static_cast<int>(CecMessageType::MENU_STATUS),
178               "CecMessageType::MENU_STATUS must match legacy value.");
179 static_assert(CEC_MESSAGE_GIVE_DEVICE_POWER_STATUS ==
180                       static_cast<int>(CecMessageType::GIVE_DEVICE_POWER_STATUS),
181               "CecMessageType::GIVE_DEVICE_POWER_STATUS must match legacy value.");
182 static_assert(CEC_MESSAGE_REPORT_POWER_STATUS ==
183                       static_cast<int>(CecMessageType::REPORT_POWER_STATUS),
184               "CecMessageType::REPORT_POWER_STATUS must match legacy value.");
185 static_assert(CEC_MESSAGE_GET_MENU_LANGUAGE == static_cast<int>(CecMessageType::GET_MENU_LANGUAGE),
186               "CecMessageType::GET_MENU_LANGUAGE must match legacy value.");
187 static_assert(CEC_MESSAGE_SELECT_ANALOG_SERVICE ==
188                       static_cast<int>(CecMessageType::SELECT_ANALOG_SERVICE),
189               "CecMessageType::SELECT_ANALOG_SERVICE must match legacy value.");
190 static_assert(CEC_MESSAGE_SELECT_DIGITAL_SERVICE ==
191                       static_cast<int>(CecMessageType::SELECT_DIGITAL_SERVICE),
192               "CecMessageType::SELECT_DIGITAL_SERVICE must match legacy value.");
193 static_assert(CEC_MESSAGE_SET_DIGITAL_TIMER == static_cast<int>(CecMessageType::SET_DIGITAL_TIMER),
194               "CecMessageType::SET_DIGITAL_TIMER must match legacy value.");
195 static_assert(CEC_MESSAGE_CLEAR_DIGITAL_TIMER ==
196                       static_cast<int>(CecMessageType::CLEAR_DIGITAL_TIMER),
197               "CecMessageType::CLEAR_DIGITAL_TIMER must match legacy value.");
198 static_assert(CEC_MESSAGE_SET_AUDIO_RATE == static_cast<int>(CecMessageType::SET_AUDIO_RATE),
199               "CecMessageType::SET_AUDIO_RATE must match legacy value.");
200 static_assert(CEC_MESSAGE_INACTIVE_SOURCE == static_cast<int>(CecMessageType::INACTIVE_SOURCE),
201               "CecMessageType::INACTIVE_SOURCE must match legacy value.");
202 static_assert(CEC_MESSAGE_CEC_VERSION == static_cast<int>(CecMessageType::CEC_VERSION),
203               "CecMessageType::CEC_VERSION must match legacy value.");
204 static_assert(CEC_MESSAGE_GET_CEC_VERSION == static_cast<int>(CecMessageType::GET_CEC_VERSION),
205               "CecMessageType::GET_CEC_VERSION must match legacy value.");
206 static_assert(CEC_MESSAGE_VENDOR_COMMAND_WITH_ID ==
207                       static_cast<int>(CecMessageType::VENDOR_COMMAND_WITH_ID),
208               "CecMessageType::VENDOR_COMMAND_WITH_ID must match legacy value.");
209 static_assert(CEC_MESSAGE_CLEAR_EXTERNAL_TIMER ==
210                       static_cast<int>(CecMessageType::CLEAR_EXTERNAL_TIMER),
211               "CecMessageType::CLEAR_EXTERNAL_TIMER must match legacy value.");
212 static_assert(CEC_MESSAGE_SET_EXTERNAL_TIMER ==
213                       static_cast<int>(CecMessageType::SET_EXTERNAL_TIMER),
214               "CecMessageType::SET_EXTERNAL_TIMER must match legacy value.");
215 static_assert(CEC_MESSAGE_INITIATE_ARC == static_cast<int>(CecMessageType::INITIATE_ARC),
216               "CecMessageType::INITIATE_ARC must match legacy value.");
217 static_assert(CEC_MESSAGE_REPORT_ARC_INITIATED ==
218                       static_cast<int>(CecMessageType::REPORT_ARC_INITIATED),
219               "CecMessageType::REPORT_ARC_INITIATED must match legacy value.");
220 static_assert(CEC_MESSAGE_REPORT_ARC_TERMINATED ==
221                       static_cast<int>(CecMessageType::REPORT_ARC_TERMINATED),
222               "CecMessageType::REPORT_ARC_TERMINATED must match legacy value.");
223 static_assert(CEC_MESSAGE_REQUEST_ARC_INITIATION ==
224                       static_cast<int>(CecMessageType::REQUEST_ARC_INITIATION),
225               "CecMessageType::REQUEST_ARC_INITIATION must match legacy value.");
226 static_assert(CEC_MESSAGE_REQUEST_ARC_TERMINATION ==
227                       static_cast<int>(CecMessageType::REQUEST_ARC_TERMINATION),
228               "CecMessageType::REQUEST_ARC_TERMINATION must match legacy value.");
229 static_assert(CEC_MESSAGE_TERMINATE_ARC == static_cast<int>(CecMessageType::TERMINATE_ARC),
230               "CecMessageType::TERMINATE_ARC must match legacy value.");
231 static_assert(CEC_MESSAGE_ABORT == static_cast<int>(CecMessageType::ABORT),
232               "CecMessageType::ABORT must match legacy value.");
233 
234 static_assert(ABORT_UNRECOGNIZED_MODE == static_cast<int>(AbortReason::UNRECOGNIZED_MODE),
235               "AbortReason::UNRECOGNIZED_MODE must match legacy value.");
236 static_assert(ABORT_NOT_IN_CORRECT_MODE == static_cast<int>(AbortReason::NOT_IN_CORRECT_MODE),
237               "AbortReason::NOT_IN_CORRECT_MODE must match legacy value.");
238 static_assert(ABORT_CANNOT_PROVIDE_SOURCE == static_cast<int>(AbortReason::CANNOT_PROVIDE_SOURCE),
239               "AbortReason::CANNOT_PROVIDE_SOURCE must match legacy value.");
240 static_assert(ABORT_INVALID_OPERAND == static_cast<int>(AbortReason::INVALID_OPERAND),
241               "AbortReason::INVALID_OPERAND must match legacy value.");
242 static_assert(ABORT_REFUSED == static_cast<int>(AbortReason::REFUSED),
243               "AbortReason::REFUSED must match legacy value.");
244 static_assert(ABORT_UNABLE_TO_DETERMINE == static_cast<int>(AbortReason::UNABLE_TO_DETERMINE),
245               "AbortReason::UNABLE_TO_DETERMINE must match legacy value.");
246 
247 static_assert(HDMI_RESULT_SUCCESS == static_cast<int>(SendMessageResult::SUCCESS),
248               "SendMessageResult::SUCCESS must match legacy value.");
249 static_assert(HDMI_RESULT_NACK == static_cast<int>(SendMessageResult::NACK),
250               "SendMessageResult::NACK must match legacy value.");
251 static_assert(HDMI_RESULT_BUSY == static_cast<int>(SendMessageResult::BUSY),
252               "SendMessageResult::BUSY must match legacy value.");
253 static_assert(HDMI_RESULT_FAIL == static_cast<int>(SendMessageResult::FAIL),
254               "SendMessageResult::FAIL must match legacy value.");
255 
256 static_assert(HDMI_INPUT == static_cast<int>(HdmiPortType::INPUT),
257               "HdmiPortType::INPUT must match legacy value.");
258 static_assert(HDMI_OUTPUT == static_cast<int>(HdmiPortType::OUTPUT),
259               "HdmiPortType::OUTPUT must match legacy value.");
260 
261 static_assert(HDMI_OPTION_WAKEUP == static_cast<int>(OptionKey::WAKEUP),
262               "OptionKey::WAKEUP must match legacy value.");
263 static_assert(HDMI_OPTION_ENABLE_CEC == static_cast<int>(OptionKey::ENABLE_CEC),
264               "OptionKey::ENABLE_CEC must match legacy value.");
265 static_assert(HDMI_OPTION_SYSTEM_CEC_CONTROL == static_cast<int>(OptionKey::SYSTEM_CEC_CONTROL),
266               "OptionKey::SYSTEM_CEC_CONTROL must match legacy value.");
267 
268 sp<IHdmiCecCallback> HdmiCec::mCallback = nullptr;
269 
HdmiCec(hdmi_cec_device_t * device)270 HdmiCec::HdmiCec(hdmi_cec_device_t* device) : mDevice(device) {}
271 
272 // Methods from ::android::hardware::tv::cec::V2_0::IHdmiCec follow.
addDeviceType(CecDeviceType deviceType)273 Return<Result> HdmiCec::addDeviceType(CecDeviceType deviceType) {
274     // TODO implement
275     if (deviceType <= CecDeviceType::MAX) {
276         return Result::SUCCESS;
277     } else {
278         return Result::FAILURE_INVALID_ARGS;
279     }
280 }
281 
clearDeviceTypes()282 Return<void> HdmiCec::clearDeviceTypes() {
283     // TODO implement
284     return Void();
285 }
286 
setAllDeviceTypes(CecAllDeviceTypes allDeviceTypes)287 Return<void> HdmiCec::setAllDeviceTypes(CecAllDeviceTypes allDeviceTypes) {
288     // TODO implement
289     if (allDeviceTypes == 1) {
290     }
291     return Void();
292 }
293 
setDeviceFeatures(CecDeviceType deviceType,CecDeviceFeatures)294 Return<void> HdmiCec::setDeviceFeatures(CecDeviceType deviceType,
295                                         CecDeviceFeatures /* deviceFeatures */) {
296     // TODO implement
297     if (deviceType != CecDeviceType::MAX) {
298     }
299     return Void();
300 }
301 
setRcProfile(CecDeviceType deviceType,const CecRcProfile &)302 Return<void> HdmiCec::setRcProfile(CecDeviceType deviceType, const CecRcProfile& /* rcProfile */) {
303     // TODO implement
304     if (deviceType != CecDeviceType::MAX) {
305     }
306     return Void();
307 }
308 
readDeviceInfo(CecLogicalAddress logicalAddress,CecPhysicalAddress physicalAddress,const readDeviceInfo_cb _hidl_cb)309 Return<void> HdmiCec::readDeviceInfo(CecLogicalAddress logicalAddress,
310                                      CecPhysicalAddress physicalAddress,
311                                      const readDeviceInfo_cb _hidl_cb) {
312     // TODO implement
313     CecDeviceInfo deviceInfo;
314 
315     if (logicalAddress == CecLogicalAddress::TV) {
316         _hidl_cb(Result::SUCCESS, deviceInfo);
317         if (physicalAddress) {
318         }
319     }
320     return Void();
321 }
322 
sendMessage(const CecMessage & message)323 Return<SendMessageResult> HdmiCec::sendMessage(const CecMessage& message) {
324     cec_message_t legacyMessage{
325             .initiator = static_cast<cec_logical_address_t>(message.initiator),
326             .destination = static_cast<cec_logical_address_t>(message.destination),
327             .length = message.body.size(),
328     };
329     for (size_t i = 0; i < message.body.size(); ++i) {
330         legacyMessage.body[i] = static_cast<unsigned char>(message.body[i]);
331     }
332     return static_cast<SendMessageResult>(mDevice->send_message(mDevice, &legacyMessage));
333 }
334 
setCallback(const sp<IHdmiCecCallback> & callback)335 Return<void> HdmiCec::setCallback(const sp<IHdmiCecCallback>& callback) {
336     if (mCallback != nullptr) {
337         mCallback->unlinkToDeath(this);
338         mCallback = nullptr;
339     }
340 
341     if (callback != nullptr) {
342         mCallback = callback;
343         mCallback->linkToDeath(this, 0 /*cookie*/);
344         mDevice->register_event_callback(mDevice, eventCallback, nullptr);
345     }
346     return Void();
347 }
348 
getPortInfo(getPortInfo_cb _hidl_cb)349 Return<void> HdmiCec::getPortInfo(getPortInfo_cb _hidl_cb) {
350     struct hdmi_port_info* legacyPorts;
351     int numPorts;
352     hidl_vec<HdmiPortInfo> portInfos;
353     mDevice->get_port_info(mDevice, &legacyPorts, &numPorts);
354     portInfos.resize(numPorts);
355     for (int i = 0; i < numPorts; ++i) {
356         portInfos[i] = {.type = static_cast<HdmiPortType>(legacyPorts[i].type),
357                         .portId = static_cast<HdmiPortId>(legacyPorts[i].port_id),
358                         .cecSupported = legacyPorts[i].cec_supported != 0,
359                         .arcSupported = legacyPorts[i].arc_supported != 0,
360                         .physicalAddress = legacyPorts[i].physical_address};
361     }
362     _hidl_cb(portInfos);
363     return Void();
364 }
365 
setOption(OptionKey key,bool value)366 Return<void> HdmiCec::setOption(OptionKey key, bool value) {
367     mDevice->set_option(mDevice, static_cast<int>(key), value ? 1 : 0);
368     return Void();
369 }
370 
setLanguage(const hidl_string & language)371 Return<void> HdmiCec::setLanguage(const hidl_string& language) {
372     if (language.size() != 3) {
373         LOG(ERROR) << "Wrong language code: expected 3 letters, but it was " << language.size()
374                    << ".";
375         return Void();
376     }
377     const char* languageStr = language.c_str();
378     int convertedLanguage = ((languageStr[0] & 0xFF) << 16) | ((languageStr[1] & 0xFF) << 8) |
379                             (languageStr[2] & 0xFF);
380     mDevice->set_option(mDevice, HDMI_OPTION_SET_LANG, convertedLanguage);
381     return Void();
382 }
383 
enableAudioReturnChannel(HdmiPortId portId,bool enable)384 Return<void> HdmiCec::enableAudioReturnChannel(HdmiPortId portId, bool enable) {
385     mDevice->set_audio_return_channel(mDevice, portId, enable ? 1 : 0);
386     return Void();
387 }
388 
isConnected(HdmiPortId portId)389 Return<bool> HdmiCec::isConnected(HdmiPortId portId) {
390     return mDevice->is_connected(mDevice, portId) > 0;
391 }
392 
HIDL_FETCH_IHdmiCec(const char * hal)393 IHdmiCec* HIDL_FETCH_IHdmiCec(const char* hal) {
394     hdmi_cec_device_t* hdmi_cec_device;
395     int ret = 0;
396     const hw_module_t* hw_module = nullptr;
397 
398     ret = hw_get_module(HDMI_CEC_HARDWARE_MODULE_ID, &hw_module);
399     if (ret == 0) {
400         ret = hdmi_cec_open(hw_module, &hdmi_cec_device);
401         if (ret != 0) {
402             LOG(ERROR) << "hdmi_cec_open " << hal << " failed: " << ret;
403         }
404     } else {
405         LOG(ERROR) << "hw_get_module " << hal << " failed: " << ret;
406     }
407 
408     if (ret == 0) {
409         return new HdmiCec(hdmi_cec_device);
410     } else {
411         LOG(ERROR) << "Passthrough failed to load legacy HAL.";
412         return nullptr;
413     }
414 }
415 
416 }  // namespace implementation
417 }  // namespace V2_0
418 }  // namespace cec
419 }  // namespace tv
420 }  // namespace hardware
421 }  // namespace android
422