1 /*
2 * Copyright (c) 2020-2021 Huawei Device Co., Ltd.
3 *
4 * HDF is dual licensed: you can use it either under the terms of
5 * the GPL, or the BSD license, at your option.
6 * See the LICENSE file in the root of this repository for complete details.
7 */
8
9 #include "hdf_log.h"
10 #include "hdmi_core.h"
11 #include "securec.h"
12
13 #define HDF_LOG_TAG hdmi_cec_c
14
15 #define HDMI_CEC_PHY_ADDR_PHASE(addr) \
16 ((addr) >> 12), ((addr) >> 8) & 0xf, ((addr) >> 4) & 0xf, (addr) & 0xf
17
18 typedef void (*HdmiCecHandleMsgFunc)(struct HdmiCntlr *cntlr, struct HdmiCecMsg *oldMsg, struct HdmiCecMsg *newMsg);
19
20 struct HdmiCecHandleMsgFuncMap {
21 uint8_t opcode;
22 HdmiCecHandleMsgFunc func;
23 };
24
25 struct HdmiCecMsgLenInfo g_cecMsg[] = {
26 { HDMI_CEC_OPCODE_ACTIVE_SOURCE, HDMI_CEC_GET_MSG_LEN(HDMI_CEC_ACTIVE_SOURCE_MSG_PARAM_LEN),
27 HDMI_CEC_MSG_BROADCAST },
28 { HDMI_CEC_OPCODE_IMAGE_VIEW_ON, HDMI_CEC_GET_MSG_LEN(0), HDMI_CEC_MSG_DIRECTED },
29 { HDMI_CEC_OPCODE_TEXT_VIEW_ON, HDMI_CEC_GET_MSG_LEN(0), HDMI_CEC_MSG_DIRECTED },
30 { HDMI_CEC_OPCODE_INACTIVE_SOURCE, HDMI_CEC_GET_MSG_LEN(HDMI_CEC_INACTIVE_SOURCE_MSG_PARAM_LEN),
31 HDMI_CEC_MSG_DIRECTED },
32 { HDMI_CEC_OPCODE_REQUEST_ACTIVE_SOURCE, HDMI_CEC_GET_MSG_LEN(0), HDMI_CEC_MSG_BROADCAST },
33 { HDMI_CEC_OPCODE_ROUTING_CHANGE, HDMI_CEC_GET_MSG_LEN(HDMI_CEC_ROUTING_CHANGE_MSG_PARAM_LEN),
34 HDMI_CEC_MSG_BROADCAST },
35 { HDMI_CEC_OPCODE_ROUTING_INFORMATION, HDMI_CEC_GET_MSG_LEN(HDMI_CEC_ROUTING_INFORMATIO_MSG_PARAM_LEN),
36 HDMI_CEC_MSG_BROADCAST },
37 { HDMI_CEC_OPCODE_SET_STREAM_PATH, HDMI_CEC_GET_MSG_LEN(HDMI_CEC_SET_STREAM_PATH_MSG_PARAM_LEN),
38 HDMI_CEC_MSG_BROADCAST },
39 { HDMI_CEC_OPCODE_STANDBY, HDMI_CEC_GET_MSG_LEN(0), HDMI_CEC_MSG_DIRECTED },
40 { HDMI_CEC_OPCODE_RECORD_OFF, HDMI_CEC_GET_MSG_LEN(0), HDMI_CEC_MSG_DIRECTED },
41 { HDMI_CEC_OPCODE_RECORD_ON, HDMI_CEC_GET_MSG_LEN(HDMI_CEC_RECORD_SOURCE_TYPE_LEN), HDMI_CEC_MSG_DIRECTED },
42 { HDMI_CEC_OPCODE_RECORD_STATUS, HDMI_CEC_GET_MSG_LEN(HDMI_CEC_RECORD_STATUS_MSG_PARAM_LEN),
43 HDMI_CEC_MSG_DIRECTED },
44 { HDMI_CEC_OPCODE_RECORD_TV_SCREEN, HDMI_CEC_GET_MSG_LEN(0), HDMI_CEC_MSG_DIRECTED },
45 { HDMI_CEC_OPCODE_CLEAR_ANALOGUE_TIMER, HDMI_CEC_GET_MSG_LEN(HDMI_CEC_ANALOGUE_TIMER_INFO_LEN),
46 HDMI_CEC_MSG_DIRECTED },
47 { HDMI_CEC_OPCODE_CLEAR_DIGITAL_TIMER, HDMI_CEC_GET_MSG_LEN(HDMI_CEC_DIGITAL_TIMER_INFO_LEN),
48 HDMI_CEC_MSG_DIRECTED },
49 { HDMI_CEC_OPCODE_CLEAR_EXTERNAL_TIMER, HDMI_CEC_GET_MSG_LEN(HDMI_CEC_EXTERNAL_TIMER_INFO_LEN),
50 HDMI_CEC_MSG_DIRECTED },
51 { HDMI_CEC_OPCODE_SET_ANALOGUE_TIMER, HDMI_CEC_GET_MSG_LEN(HDMI_CEC_ANALOGUE_TIMER_INFO_LEN),
52 HDMI_CEC_MSG_DIRECTED },
53 { HDMI_CEC_OPCODE_SET_DIGITAL_TIMER, HDMI_CEC_GET_MSG_LEN(HDMI_CEC_DIGITAL_TIMER_INFO_LEN),
54 HDMI_CEC_MSG_DIRECTED },
55 { HDMI_CEC_OPCODE_SET_EXTERNAL_TIMER, HDMI_CEC_GET_MSG_LEN(HDMI_CEC_EXTERNAL_TIMER_INFO_LEN),
56 HDMI_CEC_MSG_DIRECTED },
57 { HDMI_CEC_OPCODE_SET_TIMER_PROGRAM_TITLE, HDMI_CEC_GET_MSG_LEN(0), HDMI_CEC_MSG_DIRECTED },
58 { HDMI_CEC_OPCODE_TIMER_CLEARED_STATUS, HDMI_CEC_GET_MSG_LEN(HDMI_CEC_TIMER_CLEARED_STATUS_MSG_PARAM_LEN),
59 HDMI_CEC_MSG_DIRECTED },
60 { HDMI_CEC_OPCODE_TIMER_STATUS, HDMI_CEC_GET_MSG_LEN(HDMI_CEC_TIMER_STATUS_DATA_MIN_LEN), HDMI_CEC_MSG_DIRECTED },
61 { HDMI_CEC_OPCODE_CEC_VERSION, HDMI_CEC_GET_MSG_LEN(HDMI_CEC_CEC_VERSION_MSG_PARAM_LEN), HDMI_CEC_MSG_DIRECTED },
62 { HDMI_CEC_OPCODE_GET_CEC_VERSION, HDMI_CEC_GET_MSG_LEN(0), HDMI_CEC_MSG_DIRECTED },
63 { HDMI_CEC_OPCODE_GIVE_PHYSICAL_ADDRESS, HDMI_CEC_GET_MSG_LEN(0), HDMI_CEC_MSG_DIRECTED },
64 { HDMI_CEC_OPCODE_GET_MENU_LANGUAGE, HDMI_CEC_GET_MSG_LEN(0), HDMI_CEC_MSG_DIRECTED },
65 { HDMI_CEC_OPCODE_REPORT_PHYSICAL_ADDRESS, HDMI_CEC_GET_MSG_LEN(HDMI_CEC_REPORT_PHYSICAL_ADDRESS_MSG_PARAM_LEN),
66 HDMI_CEC_MSG_BROADCAST },
67 { HDMI_CEC_OPCODE_SET_MENU_LANGUAGE, HDMI_CEC_GET_MSG_LEN(HDMI_CEC_SET_MENU_LANGUAGE_MSG_PARAM_LEN),
68 HDMI_CEC_MSG_BROADCAST },
69 { HDMI_CEC_OPCODE_REPORT_FEATURES, HDMI_CEC_GET_MSG_LEN(HDMI_CEC_REPORT_FEATURES_MSG_PARAM_MIN_LEN),
70 HDMI_CEC_MSG_BROADCAST },
71 { HDMI_CEC_OPCODE_GIVE_FEATURES, HDMI_CEC_GET_MSG_LEN(0), HDMI_CEC_MSG_DIRECTED },
72 { HDMI_CEC_OPCODE_DECK_CONTROL, HDMI_CEC_GET_MSG_LEN(HDMI_CEC_DECK_CONTROL_MSG_PARAM_LEN), HDMI_CEC_MSG_DIRECTED },
73 { HDMI_CEC_OPCODE_DECK_STATUS, HDMI_CEC_GET_MSG_LEN(HDMI_CEC_DECK_STATUS_MSG_PARAM_LEN), HDMI_CEC_MSG_DIRECTED },
74 { HDMI_CEC_OPCODE_GIVE_DECK_STATUS, HDMI_CEC_GET_MSG_LEN(HDMI_CEC_GIVE_DECK_STATUS_MSG_PARAM_LEN),
75 HDMI_CEC_MSG_DIRECTED },
76 { HDMI_CEC_OPCODE_PLAY, HDMI_CEC_GET_MSG_LEN(HDMI_CEC_PLAY_MSG_PARAM_LEN), HDMI_CEC_MSG_DIRECTED },
77 { HDMI_CEC_OPCODE_GIVE_TUNER_DEVICE_STATUS, HDMI_CEC_GET_MSG_LEN(HDMI_CEC_GIVE_TUNER_DEVICE_STATU_MSG_PARAM_LEN),
78 HDMI_CEC_MSG_DIRECTED },
79 { HDMI_CEC_OPCODE_SELECT_ANALOGUE_SERVICE, HDMI_CEC_GET_MSG_LEN(HDMI_CEC_SELECT_ANALOGUE_SERVICE_MSG_PARAM_LEN),
80 HDMI_CEC_MSG_DIRECTED },
81 { HDMI_CEC_OPCODE_SELECT_DIGITAL_SERVICE, HDMI_CEC_GET_MSG_LEN(HDMI_CEC_SELECT_DIGITAL_SERVICE_MSG_PARAM_LEN),
82 HDMI_CEC_MSG_DIRECTED },
83 { HDMI_CEC_OPCODE_TUNER_DEVICE_STATUS, HDMI_CEC_GET_MSG_LEN(HDMI_CEC_TUNER_DEVICE_STATUS_MSG_ANA_PARAM_LEN),
84 HDMI_CEC_MSG_DIRECTED },
85 { HDMI_CEC_OPCODE_TUNER_STEP_DECREMENT, HDMI_CEC_GET_MSG_LEN(0), HDMI_CEC_MSG_DIRECTED },
86 { HDMI_CEC_OPCODE_TUNER_STEP_INCREMENT, HDMI_CEC_GET_MSG_LEN(0), HDMI_CEC_MSG_DIRECTED },
87 { HDMI_CEC_OPCODE_DEVICE_VENDOR_ID, HDMI_CEC_GET_MSG_LEN(HDMI_CEC_DEVICE_VENDOR_ID_MSG_PARAM_LEN),
88 HDMI_CEC_MSG_DIRECTED },
89 { HDMI_CEC_OPCODE_GIVE_DEVICE_VENDOR_ID, HDMI_CEC_GET_MSG_LEN(0), HDMI_CEC_MSG_DIRECTED },
90 { HDMI_CEC_OPCODE_VENDOR_COMMAND, HDMI_CEC_GET_MSG_LEN(0), HDMI_CEC_MSG_DIRECTED },
91 { HDMI_CEC_OPCODE_VENDOR_COMMAND_WITH_ID, HDMI_CEC_GET_MSG_LEN(HDMI_CEC_VENDOR_ID_LEN), HDMI_CEC_MSG_ALL },
92 { HDMI_CEC_OPCODE_VENDOR_REMOTE_BUTTON_DOWN, HDMI_CEC_GET_MSG_LEN(0), HDMI_CEC_MSG_ALL },
93 { HDMI_CEC_OPCODE_VENDOR_REMOTE_BUTTON_UP, HDMI_CEC_GET_MSG_LEN(0), HDMI_CEC_MSG_ALL },
94 { HDMI_CEC_OPCODE_SET_OSD_STRING, HDMI_CEC_GET_MSG_LEN(HDMI_CEC_DISPLAY_CONTROL_LEN), HDMI_CEC_MSG_DIRECTED },
95 { HDMI_CEC_OPCODE_GIVE_OSD_NAME, HDMI_CEC_GET_MSG_LEN(0), HDMI_CEC_MSG_DIRECTED },
96 { HDMI_CEC_OPCODE_SET_OSD_NAME, HDMI_CEC_GET_MSG_LEN(0), HDMI_CEC_MSG_DIRECTED },
97 { HDMI_CEC_OPCODE_MENU_REQUEST, HDMI_CEC_GET_MSG_LEN(HDMI_CEC_MENU_REQUEST_MSG_PARAM_LEN),
98 HDMI_CEC_MSG_DIRECTED },
99 { HDMI_CEC_OPCODE_MENU_STATUS, HDMI_CEC_GET_MSG_LEN(HDMI_CEC_MENU_STATUS_MSG_PARAM_LEN), HDMI_CEC_MSG_DIRECTED },
100 { HDMI_CEC_OPCODE_USER_CONTROL_PRESSED, HDMI_CEC_GET_MSG_LEN(HDMI_CEC_UI_COMMAND_LEN), HDMI_CEC_MSG_DIRECTED },
101 { HDMI_CEC_OPCODE_USER_CONTROL_RELEASED, HDMI_CEC_GET_MSG_LEN(0), HDMI_CEC_MSG_DIRECTED },
102 { HDMI_CEC_OPCODE_GIVE_DEVICE_POWER_STATUS, HDMI_CEC_GET_MSG_LEN(0), HDMI_CEC_MSG_DIRECTED },
103 { HDMI_CEC_OPCODE_REPORT_POWER_STATUS, HDMI_CEC_GET_MSG_LEN(HDMI_CEC_REPORT_POWER_STATUS_MSG_PARA_LEN),
104 HDMI_CEC_MSG_DIRECTED_OR_BROADCAST_2_0 },
105 { HDMI_CEC_OPCODE_FEATURE_ABORT, HDMI_CEC_GET_MSG_LEN(HDMI_CEC_FEATURE_ABORT_MSG_PARA_LEN),
106 HDMI_CEC_MSG_DIRECTED },
107 { HDMI_CEC_OPCODE_ABORT, HDMI_CEC_GET_MSG_LEN(0), HDMI_CEC_MSG_DIRECTED },
108 { HDMI_CEC_OPCODE_GIVE_AUDIO_STATUS, HDMI_CEC_GET_MSG_LEN(0), HDMI_CEC_MSG_DIRECTED },
109 { HDMI_CEC_OPCODE_GIVE_SYSTEM_AUDIO_MODE_STATUS, HDMI_CEC_GET_MSG_LEN(0), HDMI_CEC_MSG_DIRECTED },
110 { HDMI_CEC_OPCODE_REPORT_AUDIO_STATUS, HDMI_CEC_GET_MSG_LEN(HDMI_CEC_REPORT_AUDIO_STATUSMSG_PARAM_LEN),
111 HDMI_CEC_MSG_DIRECTED },
112 { HDMI_CEC_OPCODE_REPORT_SHORT_AUDIO_DESCRIPTOR, HDMI_CEC_GET_MSG_LEN(0), HDMI_CEC_MSG_DIRECTED },
113 { HDMI_CEC_OPCODE_REQUEST_SHORT_AUDIO_DESCRIPTOR, HDMI_CEC_GET_MSG_LEN(0), HDMI_CEC_MSG_DIRECTED },
114 { HDMI_CEC_OPCODE_SET_SYSTEM_AUDIO_MODE, HDMI_CEC_GET_MSG_LEN(HDMI_CEC_SYSTEM_AUDIO_STATUS_LEN),
115 HDMI_CEC_MSG_DIRECTED },
116 { HDMI_CEC_OPCODE_SYSTEM_AUDIO_MODE_REQUEST, HDMI_CEC_GET_MSG_LEN(HDMI_CEC_SYSTEM_AUDIO_MODE_REQUEST_PARAM_LEN),
117 HDMI_CEC_MSG_DIRECTED },
118 { HDMI_CEC_OPCODE_SYSTEM_AUDIO_MODE_STATUS, HDMI_CEC_GET_MSG_LEN(HDMI_CEC_SYSTEM_AUDIO_STATUS_LEN),
119 HDMI_CEC_MSG_DIRECTED },
120 { HDMI_CEC_OPCODE_SET_AUDIO_RATE, HDMI_CEC_GET_MSG_LEN(HDMI_CEC_SET_AUDIO_RATE_PARAM_LEN),
121 HDMI_CEC_MSG_DIRECTED },
122 { HDMI_CEC_OPCODE_INITIATE_ARC, HDMI_CEC_GET_MSG_LEN(0), HDMI_CEC_MSG_DIRECTED },
123 { HDMI_CEC_OPCODE_REPORT_ARC_INITIATED, HDMI_CEC_GET_MSG_LEN(0), HDMI_CEC_MSG_DIRECTED },
124 { HDMI_CEC_OPCODE_REPORT_ARC_TERMINATION, HDMI_CEC_GET_MSG_LEN(0), HDMI_CEC_MSG_DIRECTED },
125 { HDMI_CEC_OPCODE_REQUEST_ARC_INITIATION, HDMI_CEC_GET_MSG_LEN(0), HDMI_CEC_MSG_DIRECTED },
126 { HDMI_CEC_OPCODE_REQUEST_ARC_TERMINATION, HDMI_CEC_GET_MSG_LEN(0), HDMI_CEC_MSG_DIRECTED },
127 { HDMI_CEC_OPCODE_TERMINATE_ARC, HDMI_CEC_GET_MSG_LEN(0), HDMI_CEC_MSG_DIRECTED },
128 { HDMI_CEC_OPCODE_CDC_MESSAGE, HDMI_CEC_GET_MSG_LEN(0), HDMI_CEC_MSG_BROADCAST },
129 { HDMI_CEC_OPCODE_REQUEST_CURRENT_LATENCY, HDMI_CEC_GET_MSG_LEN(HDMI_CEC_REQUEST_CURRENT_LATENCY_MSG_LEN),
130 HDMI_CEC_MSG_BROADCAST },
131 { HDMI_CEC_OPCODE_REPORT_CURRENT_LATENCY, HDMI_CEC_GET_MSG_LEN(HDMI_CEC_REPORT_CURRENT_LATENCY_MSG_PARAM_MIN_LEN),
132 HDMI_CEC_MSG_BROADCAST }
133 };
134
HdmiCecGetMsgLenInfo(uint8_t opcode)135 static struct HdmiCecMsgLenInfo *HdmiCecGetMsgLenInfo(uint8_t opcode)
136 {
137 uint32_t i, len;
138
139 len = sizeof(g_cecMsg) / sizeof(g_cecMsg[0]);
140 for (i = 0; i < len; i++) {
141 if (opcode == g_cecMsg[i].opcode) {
142 return (&g_cecMsg[i]);
143 }
144 }
145 return NULL;
146 }
147
HdmiCecCheckTimerStatusMsgLen(struct HdmiCecMsg * msg)148 static bool HdmiCecCheckTimerStatusMsgLen(struct HdmiCecMsg *msg)
149 {
150 /* Progremmed Info or Not Progremmed Error Info. */
151 uint8_t info = (msg->data[HDMI_CEC_MSG_DATA_SECOND_ELEMENT] & 0xf);
152
153 /* Progremmed Indicator Check. */
154 if ((msg->data[HDMI_CEC_MSG_DATA_SECOND_ELEMENT] & 0x10) > 0) {
155 if (((info == HDMI_CEC_PROGRAMMED_INFO_NOT_ENOUGH_SPAC) ||
156 (info == HDMI_CEC_PROGRAMMED_INFO_MIGHT_NOT_BE_ENOUGH_SPACE)) &&
157 (msg->len < HDMI_CEC_GET_MSG_LEN(HDMI_CEC_TIMER_STATUS_DATA_MAX_LEN))) {
158 HDF_LOGD("check Timer_Status(Indicator) Msg fail.");
159 return false;
160 }
161 } else if (info == HDMI_CEC_NOT_PROG_ERR_DUPLICATE) {
162 if (msg->len < HDMI_CEC_GET_MSG_LEN(HDMI_CEC_TIMER_STATUS_DATA_MAX_LEN)) {
163 HDF_LOGD("check Timer_Status Msg fail.");
164 return false;
165 }
166 }
167 return true;
168 }
169
HdmiCecCheckRecordOnMsgLen(struct HdmiCecMsg * msg)170 static bool HdmiCecCheckRecordOnMsgLen(struct HdmiCecMsg *msg)
171 {
172 switch (msg->data[HDMI_CEC_MSG_DATA_SECOND_ELEMENT]) {
173 case HDMI_CEC_RECORD_SRC_OWN:
174 break;
175 case HDMI_CEC_RECORD_SRC_DIGITAL:
176 if (msg->len < HDMI_CEC_GET_MSG_LEN(HDMI_CEC_RECORD_ON_DIGITAL_MSG_PARAM_LEN)) {
177 HDF_LOGD("check Record_On(DIGITAL) Msg fail.");
178 return false;
179 }
180 break;
181 case HDMI_CEC_RECORD_SRC_ANALOG:
182 if (msg->len < HDMI_CEC_GET_MSG_LEN(HDMI_CEC_RECORD_ON_ANALOG_MSG_PARAM_LEN)) {
183 HDF_LOGD("check Record_On(ANALOG) Msg fail.");
184 return false;
185 }
186 break;
187 case HDMI_CEC_RECORD_SRC_EXT_PLUG:
188 if (msg->len < HDMI_CEC_GET_MSG_LEN(HDMI_CEC_RECORD_ON_EXT_PLUG_MSG_PARAM_LEN)) {
189 HDF_LOGD("check Record_On(EXT_PLUG) Msg fail.");
190 return false;
191 }
192 break;
193 case HDMI_CEC_RECORD_SRC_EXT_PHY_ADDR:
194 if (msg->len < HDMI_CEC_GET_MSG_LEN(HDMI_CEC_RECORD_ON_EXT_PHY_ADDR_MSG_PARAM_LEN)) {
195 HDF_LOGD("check Record_On(EXT_PHY_ADDR) Msg fail.");
196 return false;
197 }
198 break;
199 default:
200 break;
201 }
202 return true;
203 }
204
HdmiCecCheckSomeSpecialfMsgLen(struct HdmiCecMsg * msg,uint8_t opcode)205 static bool HdmiCecCheckSomeSpecialfMsgLen(struct HdmiCecMsg *msg, uint8_t opcode)
206 {
207 bool ret = true;
208
209 switch (opcode) {
210 case HDMI_CEC_OPCODE_TIMER_STATUS:
211 ret = HdmiCecCheckTimerStatusMsgLen(msg);
212 break;
213 case HDMI_CEC_OPCODE_RECORD_ON:
214 ret = HdmiCecCheckRecordOnMsgLen(msg);
215 break;
216 default:
217 break;
218 }
219 return ret;
220 }
221
HdmiCecCheckMsgLen(struct HdmiCec * cec,struct HdmiCecMsg * msg,uint8_t opcode)222 static bool HdmiCecCheckMsgLen(struct HdmiCec *cec, struct HdmiCecMsg *msg, uint8_t opcode)
223 {
224 struct HdmiCecMsgLenInfo *info = NULL;
225
226 info = HdmiCecGetMsgLenInfo(opcode);
227 if (info == NULL) {
228 HDF_LOGD("have no this cec msg");
229 return false;
230 }
231
232 if (msg->len < info->minLen) {
233 HDF_LOGD("this cec msg is invalid, opcode = 0x%x, len = %d.", opcode, msg->len);
234 return false;
235 }
236 if (HdmiCecIsBroadcastMsg(msg) == true &&
237 (info->type & HDMI_CEC_MSG_BROADCAST) == 0) {
238 HDF_LOGD("this cec msg,check broadcast msg fail.");
239 return false;
240 }
241 if (HdmiCecIsBroadcastMsg(msg) == false &&
242 (info->type & HDMI_CEC_MSG_BROADCAST) > 0) {
243 HDF_LOGD("this cec msg,check directed msg fail.");
244 return false;
245 }
246 if (HdmiCecIsBroadcastMsg(msg) == true &&
247 (info->type & HDMI_CEC_MSG_BROADCAST_1_4) > 0 &&
248 cec->info.cecVersion < HDMI_CEC_VERSION_2_0) {
249 HDF_LOGD("this cec msg,check broadcast msg version fail.");
250 return false;
251 }
252 return HdmiCecCheckSomeSpecialfMsgLen(msg, opcode);
253 }
254
255 /* message encoding/decoding functions. */
HdmiCecEncodingActiveSourceMsg(struct HdmiCecMsg * msg,uint16_t phyAddr)256 void HdmiCecEncodingActiveSourceMsg(struct HdmiCecMsg *msg, uint16_t phyAddr)
257 {
258 msg->len = HDMI_CEC_GET_MSG_LEN(HDMI_CEC_ACTIVE_SOURCE_MSG_PARAM_LEN);
259 msg->data[HDMI_CEC_MSG_DATA_ZEROTH_ELEMENT] |= HDMI_CEC_LOG_ADDR_UNREGISTERED_OR_BROADCAST;
260 msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_ACTIVE_SOURCE;
261 msg->data[HDMI_CEC_MSG_DATA_SECOND_ELEMENT] = (phyAddr >> HDMI_ONE_BYTE_SHIFT);
262 msg->data[HDMI_CEC_MSG_DATA_THIRD_ELEMENT] = (phyAddr & HDMI_ONE_BYTE_MARK);
263 }
264
HdmiCecEncodingImageViewOnMsg(struct HdmiCecMsg * msg)265 void HdmiCecEncodingImageViewOnMsg(struct HdmiCecMsg *msg)
266 {
267 msg->len = HDMI_CEC_GET_MSG_LEN(0);
268 msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_IMAGE_VIEW_ON;
269 }
270
HdmiCecEncodingTextViewOnMsg(struct HdmiCecMsg * msg)271 void HdmiCecEncodingTextViewOnMsg(struct HdmiCecMsg *msg)
272 {
273 msg->len = HDMI_CEC_GET_MSG_LEN(0);
274 msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_TEXT_VIEW_ON;
275 }
276
HdmiCecEncodingInactiveSourceMsg(struct HdmiCecMsg * msg,uint16_t phyAddr)277 void HdmiCecEncodingInactiveSourceMsg(struct HdmiCecMsg *msg, uint16_t phyAddr)
278 {
279 msg->len = HDMI_CEC_GET_MSG_LEN(HDMI_CEC_INACTIVE_SOURCE_MSG_PARAM_LEN);
280 msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_INACTIVE_SOURCE;
281 msg->data[HDMI_CEC_MSG_DATA_SECOND_ELEMENT] = (phyAddr >> HDMI_ONE_BYTE_SHIFT);
282 msg->data[HDMI_CEC_MSG_DATA_THIRD_ELEMENT] = (phyAddr & HDMI_ONE_BYTE_MARK);
283 }
284
HdmiCecEncodingRequestActiveSourceMsg(struct HdmiCecMsg * msg,bool response)285 void HdmiCecEncodingRequestActiveSourceMsg(struct HdmiCecMsg *msg, bool response)
286 {
287 msg->len = HDMI_CEC_GET_MSG_LEN(0);
288 msg->data[HDMI_CEC_MSG_DATA_ZEROTH_ELEMENT] |= HDMI_CEC_LOG_ADDR_UNREGISTERED_OR_BROADCAST;
289 msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_REQUEST_ACTIVE_SOURCE;
290 if (response == true) {
291 msg->rspMsg = HDMI_CEC_OPCODE_ACTIVE_SOURCE;
292 }
293 }
294
HdmiCecEncodingRoutingChangeMsg(struct HdmiCecMsg * msg,uint16_t orgAddr,uint16_t newAddr,bool response)295 void HdmiCecEncodingRoutingChangeMsg(struct HdmiCecMsg *msg, uint16_t orgAddr, uint16_t newAddr, bool response)
296 {
297 msg->len = HDMI_CEC_GET_MSG_LEN(HDMI_CEC_ROUTING_CHANGE_MSG_PARAM_LEN);
298 msg->data[HDMI_CEC_MSG_DATA_ZEROTH_ELEMENT] |= HDMI_CEC_LOG_ADDR_UNREGISTERED_OR_BROADCAST;
299 msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_ROUTING_CHANGE;
300 msg->data[HDMI_CEC_MSG_DATA_SECOND_ELEMENT] = (orgAddr >> HDMI_ONE_BYTE_SHIFT);
301 msg->data[HDMI_CEC_MSG_DATA_THIRD_ELEMENT] = (orgAddr & HDMI_ONE_BYTE_MARK);
302 msg->data[HDMI_CEC_MSG_DATA_FORTH_ELEMENT] = (newAddr >> HDMI_ONE_BYTE_SHIFT);
303 msg->data[HDMI_CEC_MSG_DATA_FIFTH_ELEMENT] = (newAddr & HDMI_ONE_BYTE_MARK);
304 if (response == true) {
305 msg->rspMsg = HDMI_CEC_OPCODE_ROUTING_INFORMATION;
306 }
307 }
308
HdmiCecEncodingRoutingInfomationMsg(struct HdmiCecMsg * msg,uint16_t phyAddr)309 void HdmiCecEncodingRoutingInfomationMsg(struct HdmiCecMsg *msg, uint16_t phyAddr)
310 {
311 msg->len = HDMI_CEC_GET_MSG_LEN(HDMI_CEC_ROUTING_INFORMATIO_MSG_PARAM_LEN);
312 msg->data[HDMI_CEC_MSG_DATA_ZEROTH_ELEMENT] |= HDMI_CEC_LOG_ADDR_UNREGISTERED_OR_BROADCAST;
313 msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_ROUTING_INFORMATION;
314 msg->data[HDMI_CEC_MSG_DATA_SECOND_ELEMENT] = (phyAddr >> HDMI_ONE_BYTE_SHIFT);
315 msg->data[HDMI_CEC_MSG_DATA_THIRD_ELEMENT] = (phyAddr & HDMI_ONE_BYTE_MARK);
316 }
317
HdmiCecEncodingSetStreamPathMsg(struct HdmiCecMsg * msg,uint16_t phyAddr)318 void HdmiCecEncodingSetStreamPathMsg(struct HdmiCecMsg *msg, uint16_t phyAddr)
319 {
320 msg->len = HDMI_CEC_GET_MSG_LEN(HDMI_CEC_SET_STREAM_PATH_MSG_PARAM_LEN);
321 msg->data[HDMI_CEC_MSG_DATA_ZEROTH_ELEMENT] |= HDMI_CEC_LOG_ADDR_UNREGISTERED_OR_BROADCAST;
322 msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_SET_STREAM_PATH;
323 msg->data[HDMI_CEC_MSG_DATA_SECOND_ELEMENT] = (phyAddr >> HDMI_ONE_BYTE_SHIFT);
324 msg->data[HDMI_CEC_MSG_DATA_THIRD_ELEMENT] = (phyAddr & HDMI_ONE_BYTE_MARK);
325 }
326
HdmiCecEncodingStandbyMsg(struct HdmiCecMsg * msg)327 void HdmiCecEncodingStandbyMsg(struct HdmiCecMsg *msg)
328 {
329 msg->len = HDMI_CEC_GET_MSG_LEN(0);
330 msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_STANDBY;
331 }
332
HdmiCecEncodingRecordOffMsg(struct HdmiCecMsg * msg,bool response)333 void HdmiCecEncodingRecordOffMsg(struct HdmiCecMsg *msg, bool response)
334 {
335 msg->len = HDMI_CEC_GET_MSG_LEN(0);
336 msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_RECORD_OFF;
337 if (response == true) {
338 msg->rspMsg = HDMI_CEC_OPCODE_RECORD_STATUS;
339 }
340 }
341
HdmiCecEncodingRecordOnOwn(struct HdmiCecMsg * msg)342 static void HdmiCecEncodingRecordOnOwn(struct HdmiCecMsg *msg)
343 {
344 msg->len = HDMI_CEC_GET_MSG_LEN(HDMI_CEC_RECORD_SOURCE_TYPE_LEN);
345 msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_RECORD_ON;
346 msg->data[HDMI_CEC_MSG_DATA_SECOND_ELEMENT] = HDMI_CEC_RECORD_SRC_OWN;
347 }
348
HdmiCecEncodingDigitalServiceId(uint8_t * data,uint8_t len,struct HdmiCecDigitalServiceId * digital)349 static void HdmiCecEncodingDigitalServiceId(uint8_t *data, uint8_t len, struct HdmiCecDigitalServiceId *digital)
350 {
351 if (len < HDMI_CEC_DIGITAL_SERVICE_ID_LEN) {
352 return;
353 }
354
355 data[DATA_ZEROTH_OFFSET_ELEMENT] = (digital->method << HDMI_CEC_DIGITAL_SERVICE_ID_METHOD_SHIFT) |
356 (digital->system);
357 if (digital->method == HDMI_CEC_SERVICE_ID_METHOD_BY_CHANNEL) {
358 data[DATA_FIRST_OFFSET_ELEMENT] =
359 (digital->systemData.channel.format << HDMI_CEC_CHANNEL_NUMBER_FORMAT_SHIFT) |
360 (digital->systemData.channel.major >> HDMI_ONE_BYTE_SHIFT);
361 data[DATA_SECOND_OFFSET_ELEMENT] = digital->systemData.channel.major & HDMI_ONE_BYTE_MARK;
362 data[DATA_THIRD_OFFSET_ELEMENT] = digital->systemData.channel.minor >> HDMI_ONE_BYTE_SHIFT;
363 data[DATA_FORTH_OFFSET_ELEMENT] = digital->systemData.channel.minor & HDMI_ONE_BYTE_MARK;
364 return;
365 }
366 switch (digital->system) {
367 case HDMI_CEC_DIG_SERVICE_BCAST_SYSTEM_ARIB_GEN:
368 case HDMI_CEC_DIG_SERVICE_BCAST_SYSTEM_ARIB_BS:
369 case HDMI_CEC_DIG_SERVICE_BCAST_SYSTEM_ARIB_CS:
370 case HDMI_CEC_DIG_SERVICE_BCAST_SYSTEM_ARIB_T:
371 data[DATA_FIRST_OFFSET_ELEMENT] = digital->systemData.arib.transportId >> HDMI_ONE_BYTE_SHIFT;
372 data[DATA_SECOND_OFFSET_ELEMENT] = digital->systemData.arib.transportId & HDMI_ONE_BYTE_MARK;
373 data[DATA_THIRD_OFFSET_ELEMENT] = digital->systemData.arib.serviceId >> HDMI_ONE_BYTE_SHIFT;
374 data[DATA_FORTH_OFFSET_ELEMENT] = digital->systemData.arib.serviceId & HDMI_ONE_BYTE_MARK;
375 data[DATA_FIFTH_OFFSET_ELEMENT] = digital->systemData.arib.orgNetworkId >> HDMI_ONE_BYTE_SHIFT;
376 data[DATA_SIXTH_OFFSET_ELEMENT] = digital->systemData.arib.orgNetworkId & HDMI_ONE_BYTE_MARK;
377 break;
378 case HDMI_CEC_DIG_SERVICE_BCAST_SYSTEM_ATSC_GEN:
379 case HDMI_CEC_DIG_SERVICE_BCAST_SYSTEM_ATSC_CABLE:
380 case HDMI_CEC_DIG_SERVICE_BCAST_SYSTEM_ATSC_SATELLITE:
381 case HDMI_CEC_DIG_SERVICE_BCAST_SYSTEM_ATSC_TERRESTRIAL:
382 data[DATA_FIRST_OFFSET_ELEMENT] = digital->systemData.atsc.transportId >> HDMI_ONE_BYTE_SHIFT;
383 data[DATA_SECOND_OFFSET_ELEMENT] = digital->systemData.atsc.transportId & HDMI_ONE_BYTE_MARK;
384 data[DATA_THIRD_OFFSET_ELEMENT] = digital->systemData.atsc.programNumber >> HDMI_ONE_BYTE_SHIFT;
385 data[DATA_FORTH_OFFSET_ELEMENT] = digital->systemData.atsc.programNumber & HDMI_ONE_BYTE_MARK;
386 break;
387 case HDMI_CEC_DIG_SERVICE_BCAST_SYSTEM_DVB_GEN:
388 case HDMI_CEC_DIG_SERVICE_BCAST_SYSTEM_DVB_C:
389 case HDMI_CEC_DIG_SERVICE_BCAST_SYSTEM_DVB_S:
390 case HDMI_CEC_DIG_SERVICE_BCAST_SYSTEM_DVB_S2:
391 case HDMI_CEC_DIG_SERVICE_BCAST_SYSTEM_DVB_T:
392 data[DATA_FIRST_OFFSET_ELEMENT] = digital->systemData.dvb.transportId >> HDMI_ONE_BYTE_SHIFT;
393 data[DATA_SECOND_OFFSET_ELEMENT] = digital->systemData.dvb.transportId & HDMI_ONE_BYTE_MARK;
394 data[DATA_THIRD_OFFSET_ELEMENT] = digital->systemData.dvb.serviceId >> HDMI_ONE_BYTE_SHIFT;
395 data[DATA_FORTH_OFFSET_ELEMENT] = digital->systemData.dvb.serviceId & HDMI_ONE_BYTE_MARK;
396 data[DATA_FIFTH_OFFSET_ELEMENT] = digital->systemData.dvb.orgNetworkId >> HDMI_ONE_BYTE_SHIFT;
397 data[DATA_SIXTH_OFFSET_ELEMENT] = digital->systemData.dvb.orgNetworkId & HDMI_ONE_BYTE_MARK;
398 break;
399 default:
400 HDF_LOGE("digital system 0x%x is invalid", digital->system);
401 }
402 }
403
HdmiCecEncodingRecordOnDigital(struct HdmiCecMsg * msg,struct HdmiCecDigitalServiceId * digital)404 static void HdmiCecEncodingRecordOnDigital(struct HdmiCecMsg *msg, struct HdmiCecDigitalServiceId *digital)
405 {
406 msg->len = HDMI_CEC_GET_MSG_LEN(HDMI_CEC_RECORD_ON_DIGITAL_MSG_PARAM_LEN);
407 msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_RECORD_ON;
408 msg->data[HDMI_CEC_MSG_DATA_SECOND_ELEMENT] = HDMI_CEC_RECORD_SRC_DIGITAL;
409 HdmiCecEncodingDigitalServiceId(&(msg->data[HDMI_CEC_MSG_DATA_THIRD_ELEMENT]),
410 HDMI_CEC_DIGITAL_SERVICE_ID_LEN,
411 digital);
412 }
413
HdmiCecEncodingRecordOnAnalog(struct HdmiCecMsg * msg,uint8_t anaBcastType,uint16_t anaFreq,uint8_t bcstSystem)414 static void HdmiCecEncodingRecordOnAnalog(struct HdmiCecMsg *msg,
415 uint8_t anaBcastType, uint16_t anaFreq, uint8_t bcstSystem)
416 {
417 msg->len = HDMI_CEC_GET_MSG_LEN(HDMI_CEC_RECORD_ON_ANALOG_MSG_PARAM_LEN);
418 msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_RECORD_ON;
419 msg->data[HDMI_CEC_MSG_DATA_SECOND_ELEMENT] = HDMI_CEC_RECORD_SRC_ANALOG;
420 msg->data[HDMI_CEC_MSG_DATA_THIRD_ELEMENT] = anaBcastType;
421 msg->data[HDMI_CEC_MSG_DATA_FORTH_ELEMENT] = (anaFreq >> HDMI_ONE_BYTE_SHIFT);
422 msg->data[HDMI_CEC_MSG_DATA_FIFTH_ELEMENT] = (anaFreq & HDMI_ONE_BYTE_MARK);
423 msg->data[HDMI_CEC_MSG_DATA_SIXTH_ELEMENT] = bcstSystem;
424 }
425
HdmiCecEncodingRecordOnExtPlug(struct HdmiCecMsg * msg,uint8_t extPlug)426 static void HdmiCecEncodingRecordOnExtPlug(struct HdmiCecMsg *msg, uint8_t extPlug)
427 {
428 msg->len = HDMI_CEC_GET_MSG_LEN(HDMI_CEC_RECORD_ON_EXT_PLUG_MSG_PARAM_LEN);
429 msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_RECORD_ON;
430 msg->data[HDMI_CEC_MSG_DATA_SECOND_ELEMENT] = HDMI_CEC_RECORD_SRC_EXT_PLUG;
431 msg->data[HDMI_CEC_MSG_DATA_THIRD_ELEMENT] = extPlug;
432 }
433
HdmiCecEncodingRecordOnExtPhyAddr(struct HdmiCecMsg * msg,uint16_t extPhyAddr)434 static void HdmiCecEncodingRecordOnExtPhyAddr(struct HdmiCecMsg *msg, uint16_t extPhyAddr)
435 {
436 msg->len = HDMI_CEC_GET_MSG_LEN(HDMI_CEC_RECORD_ON_EXT_PHY_ADDR_MSG_PARAM_LEN);
437 msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_RECORD_ON;
438 msg->data[HDMI_CEC_MSG_DATA_SECOND_ELEMENT] = HDMI_CEC_RECORD_SRC_EXT_PHY_ADDR;
439 msg->data[HDMI_CEC_MSG_DATA_THIRD_ELEMENT] = (extPhyAddr >> HDMI_ONE_BYTE_SHIFT);
440 msg->data[HDMI_CEC_MSG_DATA_FORTH_ELEMENT] = (extPhyAddr & HDMI_ONE_BYTE_MARK);
441 }
442
HdmiCecEncodingRecordOnMsg(struct HdmiCecMsg * msg,struct HdmiCecRecordSource * src,bool response)443 void HdmiCecEncodingRecordOnMsg(struct HdmiCecMsg *msg, struct HdmiCecRecordSource *src, bool response)
444 {
445 switch (src->type) {
446 case HDMI_CEC_RECORD_SRC_OWN:
447 HdmiCecEncodingRecordOnOwn(msg);
448 break;
449 case HDMI_CEC_RECORD_SRC_DIGITAL:
450 HdmiCecEncodingRecordOnDigital(msg, &(src->data.id));
451 break;
452 case HDMI_CEC_RECORD_SRC_ANALOG:
453 HdmiCecEncodingRecordOnAnalog(msg, src->data.analog.anaBcastType,
454 src->data.analog.anaFreq, src->data.analog.bcstSystem);
455 break;
456 case HDMI_CEC_RECORD_SRC_EXT_PLUG:
457 HdmiCecEncodingRecordOnExtPlug(msg, src->data.extPlug);
458 break;
459 case HDMI_CEC_RECORD_SRC_EXT_PHY_ADDR:
460 HdmiCecEncodingRecordOnExtPhyAddr(msg, src->data.extPhyAddr);
461 break;
462 default:
463 HDF_LOGE("cec record on: type %d unknow", src->type);
464 }
465
466 if (response == true) {
467 msg->rspMsg = HDMI_CEC_OPCODE_RECORD_STATUS;
468 }
469 }
470
HdmiCecEncodingRecordStatusMsg(struct HdmiCecMsg * msg,uint8_t recordStatusInfo)471 void HdmiCecEncodingRecordStatusMsg(struct HdmiCecMsg *msg, uint8_t recordStatusInfo)
472 {
473 msg->len = HDMI_CEC_GET_MSG_LEN(HDMI_CEC_RECORD_STATUS_MSG_PARAM_LEN);
474 msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_RECORD_STATUS;
475 msg->data[HDMI_CEC_MSG_DATA_SECOND_ELEMENT] = recordStatusInfo;
476 }
477
HdmiCecEncodingRecordTvScreenMsg(struct HdmiCecMsg * msg,bool response)478 void HdmiCecEncodingRecordTvScreenMsg(struct HdmiCecMsg *msg, bool response)
479 {
480 msg->len = HDMI_CEC_GET_MSG_LEN(0);
481 msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_RECORD_TV_SCREEN;
482 if (response == true) {
483 msg->rspMsg = HDMI_CEC_OPCODE_RECORD_ON;
484 }
485 }
486
HdmiCecEncodingCommTimerInfo(uint8_t * data,uint8_t len,struct HdmiCecCommTimerInfo * info)487 static void HdmiCecEncodingCommTimerInfo(uint8_t *data, uint8_t len, struct HdmiCecCommTimerInfo *info)
488 {
489 if (len < HDMI_CEC_COMM_TIMER_INFO_LEN) {
490 return;
491 }
492 data[DATA_ZEROTH_OFFSET_ELEMENT] = info->data;
493 data[DATA_FIRST_OFFSET_ELEMENT] = info->month;
494 data[DATA_SECOND_OFFSET_ELEMENT] = HDMI_CEC_BCD_FORMAT_TIME(info->startHour);
495 data[DATA_THIRD_OFFSET_ELEMENT] = HDMI_CEC_BCD_FORMAT_TIME(info->startMinute);
496 data[DATA_FORTH_OFFSET_ELEMENT] = HDMI_CEC_BCD_FORMAT_TIME(info->durationHour);
497 data[DATA_FIFTH_OFFSET_ELEMENT] = HDMI_CEC_BCD_FORMAT_TIME(info->durationMinute);
498 data[DATA_SIXTH_OFFSET_ELEMENT] = info->recordingSeq;
499 }
500
HdmiCecEncodingAnalogueTimerInfo(uint8_t * data,uint8_t len,struct HdmiCecAnalogueTimerInfo * info)501 static void HdmiCecEncodingAnalogueTimerInfo(uint8_t *data, uint8_t len, struct HdmiCecAnalogueTimerInfo *info)
502 {
503 if (len < HDMI_CEC_ANALOGUE_TIMER_INFO_LEN) {
504 return;
505 }
506 HdmiCecEncodingCommTimerInfo(data, HDMI_CEC_COMM_TIMER_INFO_LEN, &(info->commInfo));
507 data[DATA_SEVENTH_OFFSET_ELEMENT] = info->anaBcastType;
508 data[DATA_EIGHTH_OFFSET_ELEMENT] = (info->anaFreq >> HDMI_ONE_BYTE_SHIFT);
509 data[DATA_NINTH_OFFSET_ELEMENT] = (info->anaFreq & HDMI_ONE_BYTE_MARK);
510 data[DATA_TENTH_OFFSET_ELEMENT] = info->bcstSystem;
511 }
512
HdmiCecEncodingClearAnalogueTimerMsg(struct HdmiCecMsg * msg,struct HdmiCecAnalogueTimerInfo * info,bool response)513 void HdmiCecEncodingClearAnalogueTimerMsg(struct HdmiCecMsg *msg, struct HdmiCecAnalogueTimerInfo *info, bool response)
514 {
515 msg->len = HDMI_CEC_GET_MSG_LEN(HDMI_CEC_ANALOGUE_TIMER_INFO_LEN);
516 msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_CLEAR_ANALOGUE_TIMER;
517 HdmiCecEncodingAnalogueTimerInfo(&(msg->data[HDMI_CEC_MSG_DATA_SECOND_ELEMENT]),
518 HDMI_CEC_ANALOGUE_TIMER_INFO_LEN,
519 info);
520 if (response == true) {
521 msg->rspMsg = HDMI_CEC_OPCODE_TIMER_CLEARED_STATUS;
522 }
523 }
524
HdmiCecEncodingDigitalTimerInfo(uint8_t * data,uint8_t len,struct HdmiCecDigitalTimerInfo * info)525 static void HdmiCecEncodingDigitalTimerInfo(uint8_t *data, uint8_t len, struct HdmiCecDigitalTimerInfo *info)
526 {
527 if (len < HDMI_CEC_DIGITAL_TIMER_INFO_LEN) {
528 return;
529 }
530 HdmiCecEncodingCommTimerInfo(data, HDMI_CEC_COMM_TIMER_INFO_LEN, &(info->commInfo));
531 HdmiCecEncodingDigitalServiceId(&data[DATA_SEVENTH_OFFSET_ELEMENT],
532 len - HDMI_CEC_COMM_TIMER_INFO_LEN,
533 &(info->id));
534 }
535
HdmiCecEncodingClearDigitalTimerMsg(struct HdmiCecMsg * msg,struct HdmiCecDigitalTimerInfo * info,bool response)536 void HdmiCecEncodingClearDigitalTimerMsg(struct HdmiCecMsg *msg, struct HdmiCecDigitalTimerInfo *info, bool response)
537 {
538 msg->len = HDMI_CEC_GET_MSG_LEN(HDMI_CEC_DIGITAL_TIMER_INFO_LEN);
539 msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_CLEAR_DIGITAL_TIMER;
540 HdmiCecEncodingDigitalTimerInfo(&(msg->data[HDMI_CEC_MSG_DATA_SECOND_ELEMENT]),
541 HDMI_CEC_DIGITAL_TIMER_INFO_LEN,
542 info);
543 if (response == true) {
544 msg->rspMsg = HDMI_CEC_OPCODE_TIMER_CLEARED_STATUS;
545 }
546 }
547
HdmiCecEncodingExternalTimerInfo(uint8_t * data,uint8_t len,struct HdmiCecExternalTimerInfo * info)548 static void HdmiCecEncodingExternalTimerInfo(uint8_t *data, uint8_t len, struct HdmiCecExternalTimerInfo *info)
549 {
550 if (len < HDMI_CEC_EXTERNAL_TIMER_INFO_LEN) {
551 return;
552 }
553 HdmiCecEncodingCommTimerInfo(data, HDMI_CEC_COMM_TIMER_INFO_LEN, &(info->commInfo));
554 data[DATA_SEVENTH_OFFSET_ELEMENT] = info->extSrcSpec;
555 data[DATA_EIGHTH_OFFSET_ELEMENT] = info->extPlug;
556 data[DATA_NINTH_OFFSET_ELEMENT] = (info->extPhyAddr >> HDMI_ONE_BYTE_SHIFT);
557 data[DATA_TENTH_OFFSET_ELEMENT] = (info->extPhyAddr & HDMI_ONE_BYTE_MARK);
558 }
559
HdmiCecEncodingClearExternalTimerMsg(struct HdmiCecMsg * msg,struct HdmiCecExternalTimerInfo * info,bool response)560 void HdmiCecEncodingClearExternalTimerMsg(struct HdmiCecMsg *msg, struct HdmiCecExternalTimerInfo *info, bool response)
561 {
562 msg->len = HDMI_CEC_GET_MSG_LEN(HDMI_CEC_EXTERNAL_TIMER_INFO_LEN);
563 msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_CLEAR_EXTERNAL_TIMER;
564 HdmiCecEncodingExternalTimerInfo(&(msg->data[HDMI_CEC_MSG_DATA_SECOND_ELEMENT]),
565 HDMI_CEC_EXTERNAL_TIMER_INFO_LEN,
566 info);
567 if (response == true) {
568 msg->rspMsg = HDMI_CEC_OPCODE_TIMER_CLEARED_STATUS;
569 }
570 }
571
HdmiCecEncodingSetAnalogueTimerMsg(struct HdmiCecMsg * msg,struct HdmiCecAnalogueTimerInfo * info,bool response)572 void HdmiCecEncodingSetAnalogueTimerMsg(struct HdmiCecMsg *msg, struct HdmiCecAnalogueTimerInfo *info, bool response)
573 {
574 msg->len = HDMI_CEC_GET_MSG_LEN(HDMI_CEC_ANALOGUE_TIMER_INFO_LEN);
575 msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_SET_ANALOGUE_TIMER;
576 HdmiCecEncodingAnalogueTimerInfo(&(msg->data[HDMI_CEC_MSG_DATA_SECOND_ELEMENT]),
577 HDMI_CEC_ANALOGUE_TIMER_INFO_LEN,
578 info);
579 if (response == true) {
580 msg->rspMsg = HDMI_CEC_OPCODE_TIMER_STATUS;
581 }
582 }
583
HdmiCecEncodingSetDigitalTimerMsg(struct HdmiCecMsg * msg,struct HdmiCecDigitalTimerInfo * info,bool response)584 void HdmiCecEncodingSetDigitalTimerMsg(struct HdmiCecMsg *msg, struct HdmiCecDigitalTimerInfo *info, bool response)
585 {
586 msg->len = HDMI_CEC_GET_MSG_LEN(HDMI_CEC_DIGITAL_TIMER_INFO_LEN);
587 msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_SET_DIGITAL_TIMER;
588 HdmiCecEncodingDigitalTimerInfo(&(msg->data[HDMI_CEC_MSG_DATA_SECOND_ELEMENT]),
589 HDMI_CEC_DIGITAL_TIMER_INFO_LEN,
590 info);
591 if (response == true) {
592 msg->rspMsg = HDMI_CEC_OPCODE_TIMER_STATUS;
593 }
594 }
595
HdmiCecEncodingSetExternalTimerMsg(struct HdmiCecMsg * msg,struct HdmiCecExternalTimerInfo * info,bool response)596 void HdmiCecEncodingSetExternalTimerMsg(struct HdmiCecMsg *msg, struct HdmiCecExternalTimerInfo *info, bool response)
597 {
598 msg->len = HDMI_CEC_GET_MSG_LEN(HDMI_CEC_EXTERNAL_TIMER_INFO_LEN);
599 msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_SET_EXTERNAL_TIMER;
600 HdmiCecEncodingExternalTimerInfo(&(msg->data[HDMI_CEC_MSG_DATA_SECOND_ELEMENT]),
601 HDMI_CEC_EXTERNAL_TIMER_INFO_LEN,
602 info);
603 if (response == true) {
604 msg->rspMsg = HDMI_CEC_OPCODE_TIMER_STATUS;
605 }
606 }
607
HdmiCecEncodingSetTimerProgramTitleMsg(struct HdmiCecMsg * msg,uint8_t * title,uint32_t len)608 void HdmiCecEncodingSetTimerProgramTitleMsg(struct HdmiCecMsg *msg, uint8_t *title, uint32_t len)
609 {
610 uint32_t length;
611
612 if (title == NULL || len < HDMI_CEC_PROGRAM_TITLE_STR_MIN_LEN) {
613 HDF_LOGE("encoding set timer program title, input param invalid.");
614 return;
615 }
616 length = ((len <= HDMI_CEC_PROGRAM_TITLE_STR_MAX_LEN) ? len : HDMI_CEC_PROGRAM_TITLE_STR_MAX_LEN);
617 msg->len = HDMI_CEC_GET_MSG_LEN(length);
618 msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_SET_TIMER_PROGRAM_TITLE;
619 if (memcpy_s(&(msg->data[HDMI_CEC_MSG_DATA_SECOND_ELEMENT]), (msg->len - HDMI_CEC_MSG_DATA_SECOND_ELEMENT),
620 title, length) != EOK) {
621 HDF_LOGE("encoding set timer program title, memcpy_s fail.");
622 }
623 }
624
HdmiCecEncodingTimerClearedStatusMsg(struct HdmiCecMsg * msg,uint8_t status)625 void HdmiCecEncodingTimerClearedStatusMsg(struct HdmiCecMsg *msg, uint8_t status)
626 {
627 msg->len = HDMI_CEC_GET_MSG_LEN(HDMI_CEC_TIMER_CLEARED_STATUS_MSG_PARAM_LEN);
628 msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_TIMER_CLEARED_STATUS;
629 msg->data[HDMI_CEC_MSG_DATA_SECOND_ELEMENT] = status;
630 }
631
HdmiCecEncodingTimerStatusMsg(struct HdmiCecMsg * msg,struct HdmiCecTimerStatusData * status)632 void HdmiCecEncodingTimerStatusMsg(struct HdmiCecMsg *msg, struct HdmiCecTimerStatusData *status)
633 {
634 bool duration = false;
635
636 msg->len = HDMI_CEC_GET_MSG_LEN(HDMI_CEC_TIMER_STATUS_DATA_MIN_LEN);
637 msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_TIMER_STATUS;
638 msg->data[HDMI_CEC_MSG_DATA_SECOND_ELEMENT] |= (status->timerOverlap << HDMI_CEC_TIMER_OVERLAP_WARNING_SHIFT);
639 msg->data[HDMI_CEC_MSG_DATA_SECOND_ELEMENT] |= (status->mediaInfo << HDMI_CEC_MEDIA_INFO_SHIFT);
640 msg->data[HDMI_CEC_MSG_DATA_SECOND_ELEMENT] |= (status->progInfo.indicator << HDMI_CEC_PROG_IND_SHIFT);
641 msg->data[HDMI_CEC_MSG_DATA_SECOND_ELEMENT] |= (status->progInfo.info);
642 if (status->progInfo.indicator > 0) {
643 /* Progremmed Info */
644 if (status->progInfo.info == HDMI_CEC_PROGRAMMED_INFO_NOT_ENOUGH_SPAC ||
645 status->progInfo.info == HDMI_CEC_PROGRAMMED_INFO_MIGHT_NOT_BE_ENOUGH_SPACE) {
646 duration = true;
647 }
648 } else {
649 /* Not Progremmed Error Info */
650 if (status->progInfo.info == HDMI_CEC_NOT_PROG_ERR_DUPLICATE) {
651 duration = true;
652 }
653 }
654 if (duration == true) {
655 msg->len = HDMI_CEC_GET_MSG_LEN(HDMI_CEC_TIMER_STATUS_DATA_MAX_LEN);
656 msg->data[HDMI_CEC_MSG_DATA_THIRD_ELEMENT] = HDMI_CEC_BCD_FORMAT_TIME(status->progInfo.durationHour);
657 msg->data[HDMI_CEC_MSG_DATA_FORTH_ELEMENT] = HDMI_CEC_BCD_FORMAT_TIME(status->progInfo.durationMinute);
658 }
659 }
660
HdmiCecEncodingCecVersionMsg(struct HdmiCecMsg * msg,uint8_t version)661 void HdmiCecEncodingCecVersionMsg(struct HdmiCecMsg *msg, uint8_t version)
662 {
663 msg->len = HDMI_CEC_GET_MSG_LEN(HDMI_CEC_CEC_VERSION_MSG_PARAM_LEN);
664 msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_CEC_VERSION;
665 msg->data[HDMI_CEC_MSG_DATA_SECOND_ELEMENT] = version;
666 }
667
HdmiCecEncodingGetCecVersionMsg(struct HdmiCecMsg * msg,bool response)668 void HdmiCecEncodingGetCecVersionMsg(struct HdmiCecMsg *msg, bool response)
669 {
670 msg->len = HDMI_CEC_GET_MSG_LEN(0);
671 msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_GET_CEC_VERSION;
672 if (response == true) {
673 msg->rspMsg = HDMI_CEC_OPCODE_CEC_VERSION;
674 }
675 }
676
HdmiCecEncodingGetPhyAddressMsg(struct HdmiCecMsg * msg,bool response)677 void HdmiCecEncodingGetPhyAddressMsg(struct HdmiCecMsg *msg, bool response)
678 {
679 msg->len = HDMI_CEC_GET_MSG_LEN(0);
680 msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_GIVE_PHYSICAL_ADDRESS;
681 if (response == true) {
682 msg->rspMsg = HDMI_CEC_OPCODE_REPORT_PHYSICAL_ADDRESS;
683 }
684 }
685
HdmiCecEncodingGetMenuLanguageMsg(struct HdmiCecMsg * msg,bool response)686 void HdmiCecEncodingGetMenuLanguageMsg(struct HdmiCecMsg *msg, bool response)
687 {
688 msg->len = HDMI_CEC_GET_MSG_LEN(0);
689 msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_GET_MENU_LANGUAGE;
690 if (response == true) {
691 msg->rspMsg = HDMI_CEC_OPCODE_SET_MENU_LANGUAGE;
692 }
693 }
694
HdmiCecEncodingReportPhyAddressMsg(struct HdmiCecMsg * msg,uint16_t phyAddr,uint8_t deviceType)695 void HdmiCecEncodingReportPhyAddressMsg(struct HdmiCecMsg *msg, uint16_t phyAddr, uint8_t deviceType)
696 {
697 msg->len = HDMI_CEC_GET_MSG_LEN(HDMI_CEC_REPORT_PHYSICAL_ADDRESS_MSG_PARAM_LEN);
698 msg->data[HDMI_CEC_MSG_DATA_ZEROTH_ELEMENT] |= HDMI_CEC_LOG_ADDR_UNREGISTERED_OR_BROADCAST;
699 msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_REPORT_PHYSICAL_ADDRESS;
700 msg->data[HDMI_CEC_MSG_DATA_SECOND_ELEMENT] = (phyAddr >> HDMI_ONE_BYTE_SHIFT);
701 msg->data[HDMI_CEC_MSG_DATA_THIRD_ELEMENT] = (phyAddr & HDMI_ONE_BYTE_MARK);
702 msg->data[HDMI_CEC_MSG_DATA_FORTH_ELEMENT] = deviceType;
703 }
704
HdmiCecEncodingSetMenuLanguageMsg(struct HdmiCecMsg * msg,uint8_t * language,uint32_t len)705 void HdmiCecEncodingSetMenuLanguageMsg(struct HdmiCecMsg *msg, uint8_t *language, uint32_t len)
706 {
707 if (language == NULL || len != HDMI_CEC_SET_MENU_LANGUAGE_MSG_PARAM_LEN) {
708 HDF_LOGE("encoding set menu language, input param invalid.");
709 return;
710 }
711
712 msg->len = HDMI_CEC_GET_MSG_LEN(len);
713 msg->data[HDMI_CEC_MSG_DATA_ZEROTH_ELEMENT] |= HDMI_CEC_LOG_ADDR_UNREGISTERED_OR_BROADCAST;
714 msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_SET_MENU_LANGUAGE;
715 if (memcpy_s(&(msg->data[HDMI_CEC_MSG_DATA_SECOND_ELEMENT]), (msg->len - HDMI_CEC_MSG_DATA_SECOND_ELEMENT),
716 language, len) != EOK) {
717 HDF_LOGE("encoding set menu language, memcpy_s fail.");
718 }
719 }
720
HdmiCecEncodingReportFeaturesMsg(struct HdmiCecMsg * msg,struct HdmiCecInfo * info)721 void HdmiCecEncodingReportFeaturesMsg(struct HdmiCecMsg *msg, struct HdmiCecInfo *info)
722 {
723 uint32_t i;
724
725 msg->len = HDMI_CEC_GET_MSG_LEN(0);
726 msg->data[HDMI_CEC_MSG_DATA_ZEROTH_ELEMENT] |= HDMI_CEC_LOG_ADDR_UNREGISTERED_OR_BROADCAST;
727 msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_REPORT_FEATURES;
728 msg->data[HDMI_CEC_MSG_DATA_SECOND_ELEMENT] = info->cecVersion;
729 msg->len++;
730 msg->data[HDMI_CEC_MSG_DATA_THIRD_ELEMENT] = info->allDeviceType;
731 msg->len++;
732 /* fill RC Profile. */
733 for (i = 0; i < HDMI_CEC_RC_PROFILE_MAX_NUM; i++) {
734 msg->data[msg->len] = info->rcProfile[i];
735 msg->len++;
736 if ((info->rcProfile[i] & HDMI_CEC_RC_PROFILE_EXTERNSION_MARK) == 0) {
737 break;
738 }
739 }
740 /* fill Device Features. */
741 for (i = 0; i < HDMI_CEC_DEVICE_FEATURES_MAX_NUM; i++) {
742 msg->data[msg->len] = info->devFeatures[i];
743 msg->len++;
744 if ((info->devFeatures[i] & HDMI_CEC_DEVICE_FEATURES_EXTERNSION_MARK) == 0) {
745 break;
746 }
747 }
748 }
749
HdmiCecEncodingGiveFeaturesMsg(struct HdmiCecMsg * msg,bool response)750 void HdmiCecEncodingGiveFeaturesMsg(struct HdmiCecMsg *msg, bool response)
751 {
752 msg->len = HDMI_CEC_GET_MSG_LEN(0);
753 msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_GIVE_FEATURES;
754 if (response == true) {
755 msg->rspMsg = HDMI_CEC_OPCODE_SET_MENU_LANGUAGE;
756 }
757 }
758
759
HdmiCecEncodingDeckControlMsg(struct HdmiCecMsg * msg,uint8_t mode)760 void HdmiCecEncodingDeckControlMsg(struct HdmiCecMsg *msg, uint8_t mode)
761 {
762 msg->len = HDMI_CEC_GET_MSG_LEN(HDMI_CEC_DECK_CONTROL_MSG_PARAM_LEN);
763 msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_DECK_CONTROL;
764 msg->data[HDMI_CEC_MSG_DATA_SECOND_ELEMENT] = mode;
765 }
766
HdmiCecEncodingDeckStatusMsg(struct HdmiCecMsg * msg,uint8_t info)767 void HdmiCecEncodingDeckStatusMsg(struct HdmiCecMsg *msg, uint8_t info)
768 {
769 msg->len = HDMI_CEC_GET_MSG_LEN(HDMI_CEC_DECK_STATUS_MSG_PARAM_LEN);
770 msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_DECK_STATUS;
771 msg->data[HDMI_CEC_MSG_DATA_SECOND_ELEMENT] = info;
772 }
773
HdmiCecEncodingGiveDeckStatusMsg(struct HdmiCecMsg * msg,uint8_t statusReq,bool response)774 void HdmiCecEncodingGiveDeckStatusMsg(struct HdmiCecMsg *msg, uint8_t statusReq, bool response)
775 {
776 msg->len = HDMI_CEC_GET_MSG_LEN(HDMI_CEC_GIVE_DECK_STATUS_MSG_PARAM_LEN);
777 msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_GIVE_DECK_STATUS;
778 msg->data[HDMI_CEC_MSG_DATA_SECOND_ELEMENT] = statusReq;
779 if (response == true) {
780 msg->rspMsg = HDMI_CEC_OPCODE_DECK_STATUS;
781 }
782 }
783
HdmiCecEncodingPlayMsg(struct HdmiCecMsg * msg,uint8_t playMode)784 void HdmiCecEncodingPlayMsg(struct HdmiCecMsg *msg, uint8_t playMode)
785 {
786 msg->len = HDMI_CEC_GET_MSG_LEN(HDMI_CEC_PLAY_MSG_PARAM_LEN);
787 msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_PLAY;
788 msg->data[HDMI_CEC_MSG_DATA_SECOND_ELEMENT] = playMode;
789 }
790
HdmiCecEncodingGiveTunerDeviceStatusMsg(struct HdmiCecMsg * msg,uint8_t statusReq,bool response)791 void HdmiCecEncodingGiveTunerDeviceStatusMsg(struct HdmiCecMsg *msg, uint8_t statusReq, bool response)
792 {
793 msg->len = HDMI_CEC_GET_MSG_LEN(HDMI_CEC_GIVE_TUNER_DEVICE_STATU_MSG_PARAM_LEN);
794 msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_GIVE_TUNER_DEVICE_STATUS;
795 msg->data[HDMI_CEC_MSG_DATA_SECOND_ELEMENT] = statusReq;
796 if (response == true) {
797 msg->rspMsg = HDMI_CEC_OPCODE_TUNER_DEVICE_STATUS;
798 }
799 }
800
HdmiCecEncodingSelectAnalogueServiceMsg(struct HdmiCecMsg * msg,uint8_t anaBcastType,uint16_t anaFreq,uint8_t bcstSystem)801 void HdmiCecEncodingSelectAnalogueServiceMsg(struct HdmiCecMsg *msg,
802 uint8_t anaBcastType, uint16_t anaFreq, uint8_t bcstSystem)
803 {
804 msg->len = HDMI_CEC_GET_MSG_LEN(HDMI_CEC_SELECT_ANALOGUE_SERVICE_MSG_PARAM_LEN);
805 msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_SELECT_ANALOGUE_SERVICE;
806 msg->data[HDMI_CEC_MSG_DATA_SECOND_ELEMENT] = anaBcastType;
807 msg->data[HDMI_CEC_MSG_DATA_THIRD_ELEMENT] = (anaFreq >> HDMI_ONE_BYTE_SHIFT);
808 msg->data[HDMI_CEC_MSG_DATA_FORTH_ELEMENT] = (anaFreq & HDMI_ONE_BYTE_MARK);
809 msg->data[HDMI_CEC_MSG_DATA_FIFTH_ELEMENT] = bcstSystem;
810 }
811
HdmiCecEncodingSelectDigitalServiceMsg(struct HdmiCecMsg * msg,struct HdmiCecDigitalServiceId * digital)812 void HdmiCecEncodingSelectDigitalServiceMsg(struct HdmiCecMsg *msg, struct HdmiCecDigitalServiceId *digital)
813 {
814 msg->len = HDMI_CEC_GET_MSG_LEN(HDMI_CEC_SELECT_DIGITAL_SERVICE_MSG_PARAM_LEN);
815 msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_SELECT_DIGITAL_SERVICE;
816 HdmiCecEncodingDigitalServiceId(&(msg->data[HDMI_CEC_MSG_DATA_SECOND_ELEMENT]),
817 HDMI_CEC_SELECT_DIGITAL_SERVICE_MSG_PARAM_LEN,
818 digital);
819 }
820
HdmiCecEncodingTunerDeviceStatusMsg(struct HdmiCecMsg * msg,struct HdmiCecTunerDeviceInfo * info)821 void HdmiCecEncodingTunerDeviceStatusMsg(struct HdmiCecMsg *msg, struct HdmiCecTunerDeviceInfo *info)
822 {
823 msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_TUNER_DEVICE_STATUS;
824 msg->data[HDMI_CEC_MSG_DATA_SECOND_ELEMENT] = (info->recordingFlag << HDMI_CEC_RECORDING_FALG_SHIFT) |
825 (info->dispInfo);
826 if (info->isAnalogService == true) {
827 msg->len = HDMI_CEC_GET_MSG_LEN(HDMI_CEC_TUNER_DEVICE_STATUS_MSG_ANA_PARAM_LEN);
828 msg->data[HDMI_CEC_MSG_DATA_THIRD_ELEMENT] = info->data.analog.anaBcastType;
829 msg->data[HDMI_CEC_MSG_DATA_FORTH_ELEMENT] = (info->data.analog.anaFreq >> HDMI_ONE_BYTE_SHIFT);
830 msg->data[HDMI_CEC_MSG_DATA_FIFTH_ELEMENT] = (info->data.analog.anaFreq & HDMI_ONE_BYTE_MARK);
831 msg->data[HDMI_CEC_MSG_DATA_SIXTH_ELEMENT] = info->data.analog.bcstSystem;
832 } else {
833 msg->len = HDMI_CEC_GET_MSG_LEN(HDMI_CEC_TUNER_DEVICE_STATUS_MSG_DIG_PARAM_LEN);
834 HdmiCecEncodingDigitalServiceId(&(msg->data[HDMI_CEC_MSG_DATA_THIRD_ELEMENT]),
835 HDMI_CEC_SELECT_DIGITAL_SERVICE_MSG_PARAM_LEN,
836 &(info->data.digital));
837 }
838 }
839
HdmiCecEncodingTunerStepDecrementMsg(struct HdmiCecMsg * msg)840 void HdmiCecEncodingTunerStepDecrementMsg(struct HdmiCecMsg *msg)
841 {
842 msg->len = HDMI_CEC_GET_MSG_LEN(0);
843 msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_TUNER_STEP_DECREMENT;
844 }
845
HdmiCecEncodingTunerStepIncrementMsg(struct HdmiCecMsg * msg)846 void HdmiCecEncodingTunerStepIncrementMsg(struct HdmiCecMsg *msg)
847 {
848 msg->len = HDMI_CEC_GET_MSG_LEN(0);
849 msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_TUNER_STEP_INCREMENT;
850 }
851
HdmiCecEncodingDeviceVendorIdMsg(struct HdmiCecMsg * msg,uint32_t devVendorId)852 void HdmiCecEncodingDeviceVendorIdMsg(struct HdmiCecMsg *msg, uint32_t devVendorId)
853 {
854 msg->len = HDMI_CEC_GET_MSG_LEN(HDMI_CEC_DEVICE_VENDOR_ID_MSG_PARAM_LEN);
855 msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_DEVICE_VENDOR_ID;
856 msg->data[HDMI_CEC_MSG_DATA_SECOND_ELEMENT] = (devVendorId >> HDMI_TWO_BYTES_SHIFT) & HDMI_ONE_BYTE_MARK;
857 msg->data[HDMI_CEC_MSG_DATA_THIRD_ELEMENT] = (devVendorId >> HDMI_ONE_BYTE_SHIFT) & HDMI_ONE_BYTE_MARK;
858 msg->data[HDMI_CEC_MSG_DATA_FORTH_ELEMENT] = (devVendorId & HDMI_ONE_BYTE_MARK);
859 }
860
HdmiCecEncodingGiveDeviceVendorIdMsg(struct HdmiCecMsg * msg,bool response)861 void HdmiCecEncodingGiveDeviceVendorIdMsg(struct HdmiCecMsg *msg, bool response)
862 {
863 msg->len = HDMI_CEC_GET_MSG_LEN(0);
864 msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_GIVE_DEVICE_VENDOR_ID;
865 if (response == true) {
866 msg->rspMsg = HDMI_CEC_OPCODE_DEVICE_VENDOR_ID;
867 }
868 }
869
HdmiCecEncodingVendorCommandMsg(struct HdmiCecMsg * msg,uint8_t * data,uint32_t len)870 void HdmiCecEncodingVendorCommandMsg(struct HdmiCecMsg *msg, uint8_t *data, uint32_t len)
871 {
872 uint32_t length;
873
874 if (data == NULL || len == 0) {
875 HDF_LOGE("encoding vendor cmd, input param invalid.");
876 return;
877 }
878 length = (len > HDMI_CEC_VENDOR_SPECIFIC_DATA_MAX_LEN) ? HDMI_CEC_VENDOR_SPECIFIC_DATA_MAX_LEN : len;
879 msg->len = HDMI_CEC_GET_MSG_LEN(length);
880 msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_VENDOR_COMMAND;
881 if (memcpy_s(&(msg->data[HDMI_CEC_MSG_DATA_SECOND_ELEMENT]), (msg->len - HDMI_CEC_MSG_MIN_LEN), data, length)
882 != EOK) {
883 HDF_LOGE("encoding vendor cmd, memcpy_s fail.");
884 }
885 }
886
HdmiCecEncodingVendorCommandWithIdMsg(struct HdmiCecMsg * msg,uint32_t vendorId,uint8_t * data,uint32_t len)887 void HdmiCecEncodingVendorCommandWithIdMsg(struct HdmiCecMsg *msg, uint32_t vendorId, uint8_t *data, uint32_t len)
888 {
889 uint32_t length;
890
891 if (data == NULL || len == 0) {
892 HDF_LOGE("encoding vendor cmd with id, input param invalid.");
893 return;
894 }
895 length = (len > HDMI_CEC_VENDOR_SPECIFIC_DATA_WITH_ID_MAX_LEN) ?
896 HDMI_CEC_VENDOR_SPECIFIC_DATA_WITH_ID_MAX_LEN : len;
897 msg->len = HDMI_CEC_GET_MSG_LEN(HDMI_CEC_VENDOR_ID_LEN + length);
898 msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_VENDOR_COMMAND_WITH_ID;
899 msg->data[HDMI_CEC_MSG_DATA_SECOND_ELEMENT] = (vendorId >> HDMI_TWO_BYTES_SHIFT) & HDMI_ONE_BYTE_MARK;
900 msg->data[HDMI_CEC_MSG_DATA_THIRD_ELEMENT] = (vendorId >> HDMI_ONE_BYTE_SHIFT) & HDMI_ONE_BYTE_MARK;
901 msg->data[HDMI_CEC_MSG_DATA_FORTH_ELEMENT] = (vendorId & HDMI_ONE_BYTE_MARK);
902 if (memcpy_s(&(msg->data[HDMI_CEC_MSG_DATA_FIFTH_ELEMENT]), (msg->len - HDMI_CEC_MSG_DATA_FIFTH_ELEMENT),
903 data, length) != EOK) {
904 HDF_LOGE("encoding vendor cmd with id, memcpy_s fail.");
905 }
906 }
907
HdmiCecEncodingVendorRemoteButtonDownMsg(struct HdmiCecMsg * msg,uint8_t * rcCode,uint32_t len)908 void HdmiCecEncodingVendorRemoteButtonDownMsg(struct HdmiCecMsg *msg, uint8_t *rcCode, uint32_t len)
909 {
910 uint32_t length;
911
912 if (rcCode == NULL || len == 0) {
913 HDF_LOGE("encoding vendor remote button down, input param invalid.");
914 return;
915 }
916 length = (len > HDMI_CEC_VENDOR_SPECIFIC_RC_CODE_MAX_LEN) ? HDMI_CEC_VENDOR_SPECIFIC_RC_CODE_MAX_LEN : len;
917 msg->len = HDMI_CEC_GET_MSG_LEN(length);
918 msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_VENDOR_REMOTE_BUTTON_DOWN;
919 if (memcpy_s(&(msg->data[HDMI_CEC_MSG_DATA_SECOND_ELEMENT]), (msg->len - HDMI_CEC_MSG_DATA_SECOND_ELEMENT),
920 rcCode, length) != EOK) {
921 HDF_LOGE("encoding vendor remote button down, memcpy_s fail.");
922 }
923 }
924
HdmiCecEncodingVendorRemoteButtonUpMsg(struct HdmiCecMsg * msg)925 void HdmiCecEncodingVendorRemoteButtonUpMsg(struct HdmiCecMsg *msg)
926 {
927 msg->len = HDMI_CEC_GET_MSG_LEN(0);
928 msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_VENDOR_REMOTE_BUTTON_UP;
929 }
930
HdmiCecEncodingSetOsdStringMsg(struct HdmiCecMsg * msg,uint8_t dispControl,uint8_t * str,uint32_t len)931 void HdmiCecEncodingSetOsdStringMsg(struct HdmiCecMsg *msg, uint8_t dispControl, uint8_t *str, uint32_t len)
932 {
933 uint32_t length;
934
935 if (str == NULL || len == 0) {
936 HDF_LOGE("encoding set OSD string, input param invalid.");
937 return;
938 }
939 length = (len > HDMI_CEC_OSD_STRING_MAX_LEN) ? HDMI_CEC_OSD_STRING_MAX_LEN : len;
940 msg->len = HDMI_CEC_GET_MSG_LEN(length + HDMI_CEC_DISPLAY_CONTROL_LEN);
941 msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_SET_OSD_STRING;
942 msg->data[HDMI_CEC_MSG_DATA_SECOND_ELEMENT] = dispControl;
943 if (memcpy_s(&(msg->data[HDMI_CEC_MSG_DATA_THIRD_ELEMENT]), (msg->len - HDMI_CEC_MSG_DATA_THIRD_ELEMENT),
944 str, length) != EOK) {
945 HDF_LOGE("encoding set OSD string, memcpy_s fail.");
946 }
947 }
948
HdmiCecEncodingGiveOsdNameMsg(struct HdmiCecMsg * msg,bool response)949 void HdmiCecEncodingGiveOsdNameMsg(struct HdmiCecMsg *msg, bool response)
950 {
951 msg->len = HDMI_CEC_GET_MSG_LEN(0);
952 msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_GIVE_OSD_NAME;
953 if (response == true) {
954 msg->rspMsg = HDMI_CEC_OPCODE_SET_OSD_NAME;
955 }
956 }
957
HdmiCecEncodingSetOsdNameMsg(struct HdmiCecMsg * msg,uint8_t * name,uint32_t len)958 void HdmiCecEncodingSetOsdNameMsg(struct HdmiCecMsg *msg, uint8_t *name, uint32_t len)
959 {
960 uint32_t length;
961
962 if (name == NULL || len == 0) {
963 HDF_LOGE("encoding set OSD name, input param invalid.");
964 return;
965 }
966 length = (len > HDMI_CEC_OSD_NAME_MAX_LEN) ? HDMI_CEC_OSD_NAME_MAX_LEN : len;
967 msg->len = HDMI_CEC_GET_MSG_LEN(length);
968 msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_SET_OSD_NAME;
969 if (memcpy_s(&(msg->data[HDMI_CEC_MSG_DATA_SECOND_ELEMENT]), (msg->len - HDMI_CEC_MSG_DATA_SECOND_ELEMENT),
970 name, length) != EOK) {
971 HDF_LOGE("encoding set OSD name, memcpy_s fail.");
972 }
973 }
974
HdmiCecEncodingMenuRequestMsg(struct HdmiCecMsg * msg,uint8_t menuReq,bool response)975 void HdmiCecEncodingMenuRequestMsg(struct HdmiCecMsg *msg, uint8_t menuReq, bool response)
976 {
977 msg->len = HDMI_CEC_GET_MSG_LEN(HDMI_CEC_MENU_REQUEST_MSG_PARAM_LEN);
978 msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_MENU_REQUEST;
979 msg->data[HDMI_CEC_MSG_DATA_SECOND_ELEMENT] = menuReq;
980 if (response == true) {
981 msg->rspMsg = HDMI_CEC_OPCODE_MENU_STATUS;
982 }
983 }
984
HdmiCecEncodingMenuStatusMsg(struct HdmiCecMsg * msg,uint8_t menuStatus)985 void HdmiCecEncodingMenuStatusMsg(struct HdmiCecMsg *msg, uint8_t menuStatus)
986 {
987 msg->len = HDMI_CEC_GET_MSG_LEN(HDMI_CEC_MENU_STATUS_MSG_PARAM_LEN);
988 msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_MENU_STATUS;
989 msg->data[HDMI_CEC_MSG_DATA_SECOND_ELEMENT] = menuStatus;
990 }
991
HdmiCecEncodingUserControlPrtessedMsg(struct HdmiCecMsg * msg,struct HdmiCecUiCmd * cmd)992 void HdmiCecEncodingUserControlPrtessedMsg(struct HdmiCecMsg *msg, struct HdmiCecUiCmd *cmd)
993 {
994 if (cmd == NULL) {
995 return;
996 }
997 msg->len = HDMI_CEC_GET_MSG_LEN(HDMI_CEC_UI_COMMAND_LEN);
998 msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_USER_CONTROL_PRESSED;
999 msg->data[HDMI_CEC_MSG_DATA_SECOND_ELEMENT] = cmd->cmdType;
1000 if (cmd->hasAddOp == false) {
1001 return;
1002 }
1003 switch (cmd->cmdType) {
1004 case HDMI_CEC_UI_CMD_SELECT_BROADCAST_TYPE:
1005 case HDMI_CEC_UI_CMD_SELECT_SOUND_PRESENTATION:
1006 case HDMI_CEC_UI_CMD_PLAY_FUNCTION:
1007 case HDMI_CEC_UI_CMD_SELECT_MEDIA_FUNCTION:
1008 case HDMI_CEC_UI_CMD_SELECT_AV_INPUT_FUNCTION:
1009 case HDMI_CEC_UI_CMD_SELECT_AUDIO_INPUT_FUNCTION:
1010 (msg->len)++;
1011 /* The additional operand is one byte for all these UI commands */
1012 msg->data[HDMI_CEC_MSG_DATA_THIRD_ELEMENT] = cmd->addOperands.uiBroadcastType;
1013 break;
1014 case HDMI_CEC_UI_CMD_TUNE_FUNCTION:
1015 msg->len += HDMI_CEC_CHANNEL_IDENTIFIER_LEN;
1016 msg->data[HDMI_CEC_MSG_DATA_THIRD_ELEMENT] = (cmd->addOperands.channel.format <<
1017 HDMI_CEC_CHANNEL_NUMBER_FORMAT_SHIFT) |
1018 (cmd->addOperands.channel.major >> HDMI_ONE_BYTE_SHIFT);
1019 msg->data[HDMI_CEC_MSG_DATA_FORTH_ELEMENT] = (cmd->addOperands.channel.major & HDMI_ONE_BYTE_MARK);
1020 msg->data[HDMI_CEC_MSG_DATA_FIFTH_ELEMENT] = (cmd->addOperands.channel.minor >> HDMI_ONE_BYTE_SHIFT);
1021 msg->data[HDMI_CEC_MSG_DATA_SIXTH_ELEMENT] = (cmd->addOperands.channel.minor & HDMI_ONE_BYTE_MARK);
1022 break;
1023 default:
1024 HDF_LOGI("UI type %d have no additional operands.", cmd->cmdType);
1025 break;
1026 }
1027 }
1028
HdmiCecEncodingUserControlReleasedMsg(struct HdmiCecMsg * msg)1029 void HdmiCecEncodingUserControlReleasedMsg(struct HdmiCecMsg *msg)
1030 {
1031 msg->len = HDMI_CEC_GET_MSG_LEN(0);
1032 msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_USER_CONTROL_RELEASED;
1033 }
1034
HdmiCecEncodingGiveDevicePowerStatusMsg(struct HdmiCecMsg * msg,bool response)1035 void HdmiCecEncodingGiveDevicePowerStatusMsg(struct HdmiCecMsg *msg, bool response)
1036 {
1037 msg->len = HDMI_CEC_GET_MSG_LEN(0);
1038 msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_GIVE_DEVICE_POWER_STATUS;
1039 if (response == true) {
1040 msg->rspMsg = HDMI_CEC_OPCODE_REPORT_POWER_STATUS;
1041 }
1042 }
1043
HdmiCecEncodingReportDevicePowerStatusMsg(struct HdmiCecMsg * msg,uint8_t powerStatus)1044 void HdmiCecEncodingReportDevicePowerStatusMsg(struct HdmiCecMsg *msg, uint8_t powerStatus)
1045 {
1046 msg->len = HDMI_CEC_GET_MSG_LEN(HDMI_CEC_REPORT_POWER_STATUS_MSG_PARA_LEN);
1047 msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_REPORT_POWER_STATUS;
1048 msg->data[HDMI_CEC_MSG_DATA_SECOND_ELEMENT] = powerStatus;
1049 }
1050
HdmiCecEncodingFeatureAbortMsg(struct HdmiCecMsg * msg,uint8_t opcode,uint8_t reason)1051 void HdmiCecEncodingFeatureAbortMsg(struct HdmiCecMsg *msg, uint8_t opcode, uint8_t reason)
1052 {
1053 msg->len = HDMI_CEC_GET_MSG_LEN(HDMI_CEC_FEATURE_ABORT_MSG_PARA_LEN);
1054 msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_FEATURE_ABORT;
1055 msg->data[HDMI_CEC_MSG_DATA_SECOND_ELEMENT] = opcode;
1056 msg->data[HDMI_CEC_MSG_DATA_THIRD_ELEMENT] = reason;
1057 }
1058
HdmiCecEncodingAbortMsg(struct HdmiCecMsg * msg)1059 void HdmiCecEncodingAbortMsg(struct HdmiCecMsg *msg)
1060 {
1061 msg->len = HDMI_CEC_GET_MSG_LEN(0);
1062 msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_ABORT;
1063 }
1064
HdmiCecEncodingGiveAudioStatusMsg(struct HdmiCecMsg * msg,bool response)1065 void HdmiCecEncodingGiveAudioStatusMsg(struct HdmiCecMsg *msg, bool response)
1066 {
1067 msg->len = HDMI_CEC_GET_MSG_LEN(0);
1068 msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_GIVE_AUDIO_STATUS;
1069 if (response == true) {
1070 msg->rspMsg = HDMI_CEC_OPCODE_REPORT_AUDIO_STATUS;
1071 }
1072 }
1073
HdmiCecEncodingGiveSystemAudioModeMsg(struct HdmiCecMsg * msg,bool response)1074 void HdmiCecEncodingGiveSystemAudioModeMsg(struct HdmiCecMsg *msg, bool response)
1075 {
1076 msg->len = HDMI_CEC_GET_MSG_LEN(0);
1077 msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_GIVE_SYSTEM_AUDIO_MODE_STATUS;
1078 if (response == true) {
1079 msg->rspMsg = HDMI_CEC_OPCODE_SYSTEM_AUDIO_MODE_STATUS;
1080 }
1081 }
1082
HdmiCecEncodingReportAudioStatusMsg(struct HdmiCecMsg * msg,uint8_t audioMuteStatus,uint8_t audioVolumeStatus)1083 void HdmiCecEncodingReportAudioStatusMsg(struct HdmiCecMsg *msg, uint8_t audioMuteStatus, uint8_t audioVolumeStatus)
1084 {
1085 msg->len = HDMI_CEC_GET_MSG_LEN(HDMI_CEC_REPORT_AUDIO_STATUSMSG_PARAM_LEN);
1086 msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_REPORT_AUDIO_STATUS;
1087 msg->data[HDMI_CEC_MSG_DATA_SECOND_ELEMENT] = (audioMuteStatus << HDMI_CEC_AUDIO_MUTE_STATUS_SHIFT) |
1088 (audioVolumeStatus & HDMI_CEC_AUDIO_VOLUME_STATUS_MARK);
1089 }
1090
HdmiCecEncodingRequestShortAudioDescriptorMsg(struct HdmiCecMsg * msg,uint8_t * id,uint8_t * code,uint32_t len,bool response)1091 void HdmiCecEncodingRequestShortAudioDescriptorMsg(struct HdmiCecMsg *msg,
1092 uint8_t *id, uint8_t *code, uint32_t len, bool response)
1093 {
1094 uint32_t num, i;
1095
1096 if (id == NULL || code == NULL || len == 0) {
1097 HDF_LOGE("encoding request short audio descriptor, input param invalid.");
1098 return;
1099 }
1100 num = (len > HDMI_CEC_MAX_AUDIO_FORMAT_NUM) ? HDMI_CEC_MAX_AUDIO_FORMAT_NUM : len;
1101 msg->len = HDMI_CEC_GET_MSG_LEN(num * HDMI_CEC_AUDIO_FORMAT_LEN);
1102 msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_REQUEST_SHORT_AUDIO_DESCRIPTOR;
1103 for (i = 0; i < num; i++) {
1104 msg->data[HDMI_CEC_MSG_DATA_SECOND_ELEMENT + i] = (id[i] << HDMI_CEC_AUDIO_FORMAT_ID_SHIFT) |
1105 (code[i] & HDMI_CEC_AUDIO_FORMAT_CODE_MARK);
1106 }
1107 if (response == true) {
1108 msg->rspMsg = HDMI_CEC_OPCODE_REPORT_SHORT_AUDIO_DESCRIPTOR;
1109 }
1110 }
1111
HdmiCecEncodingReportShortAudioDescriptorMsg(struct HdmiCecMsg * msg,uint32_t * descriptor,uint32_t len)1112 void HdmiCecEncodingReportShortAudioDescriptorMsg(struct HdmiCecMsg *msg, uint32_t *descriptor, uint32_t len)
1113 {
1114 uint32_t num, i;
1115
1116 if (descriptor == NULL || len == 0) {
1117 HDF_LOGE("encoding report short audio descriptor, input param invalid.");
1118 return;
1119 }
1120 num = (len > HDMI_CEC_MAX_SHORT_AUDIO_DESCRIPTOR_NUM) ? HDMI_CEC_MAX_SHORT_AUDIO_DESCRIPTOR_NUM : len;
1121 msg->len = HDMI_CEC_GET_MSG_LEN(HDMI_CEC_SHORT_AUDIO_DESCRIPTOR_LEN * num);
1122 msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_REPORT_SHORT_AUDIO_DESCRIPTOR;
1123 for (i = 0; i < num; i++) {
1124 msg->data[HDMI_CEC_MSG_DATA_SECOND_ELEMENT + i * HDMI_CEC_SHORT_AUDIO_DESCRIPTOR_LEN] =
1125 (descriptor[i] >> HDMI_TWO_BYTES_SHIFT) & HDMI_ONE_BYTE_MARK;
1126 msg->data[HDMI_CEC_MSG_DATA_THIRD_ELEMENT + i * HDMI_CEC_SHORT_AUDIO_DESCRIPTOR_LEN] =
1127 (descriptor[i] >> HDMI_ONE_BYTE_SHIFT) & HDMI_ONE_BYTE_MARK;
1128 msg->data[HDMI_CEC_MSG_DATA_FORTH_ELEMENT + i * HDMI_CEC_SHORT_AUDIO_DESCRIPTOR_LEN] =
1129 descriptor[i] & HDMI_ONE_BYTE_MARK;
1130 }
1131 }
1132
HdmiCecEncodingSetSystemAudioModeMsg(struct HdmiCecMsg * msg,uint8_t status)1133 void HdmiCecEncodingSetSystemAudioModeMsg(struct HdmiCecMsg *msg, uint8_t status)
1134 {
1135 msg->len = HDMI_CEC_GET_MSG_LEN(HDMI_CEC_SYSTEM_AUDIO_STATUS_LEN);
1136 msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_SET_SYSTEM_AUDIO_MODE;
1137 msg->data[HDMI_CEC_MSG_DATA_SECOND_ELEMENT] = status;
1138 }
1139
HdmiCecEncodingSystemAudioModeRequestMsg(struct HdmiCecMsg * msg,uint16_t phyAddr,bool response)1140 void HdmiCecEncodingSystemAudioModeRequestMsg(struct HdmiCecMsg *msg, uint16_t phyAddr, bool response)
1141 {
1142 msg->len = HDMI_CEC_GET_MSG_LEN(HDMI_CEC_SYSTEM_AUDIO_MODE_REQUEST_PARAM_LEN);
1143 msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_SYSTEM_AUDIO_MODE_REQUEST;
1144 msg->data[HDMI_CEC_MSG_DATA_SECOND_ELEMENT] = (phyAddr >> HDMI_ONE_BYTE_SHIFT);
1145 msg->data[HDMI_CEC_MSG_DATA_THIRD_ELEMENT] = (phyAddr & HDMI_ONE_BYTE_MARK);
1146 if (response == true) {
1147 msg->rspMsg = HDMI_CEC_OPCODE_SET_SYSTEM_AUDIO_MODE;
1148 }
1149 }
1150
HdmiCecEncodingSystemAudioModeStatusMsg(struct HdmiCecMsg * msg,uint8_t status)1151 void HdmiCecEncodingSystemAudioModeStatusMsg(struct HdmiCecMsg *msg, uint8_t status)
1152 {
1153 msg->len = HDMI_CEC_GET_MSG_LEN(HDMI_CEC_SYSTEM_AUDIO_STATUS_LEN);
1154 msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_SYSTEM_AUDIO_MODE_STATUS;
1155 msg->data[HDMI_CEC_MSG_DATA_SECOND_ELEMENT] = status;
1156 }
1157
HdmiCecEncodingSetAudioRateMsg(struct HdmiCecMsg * msg,uint8_t rate)1158 void HdmiCecEncodingSetAudioRateMsg(struct HdmiCecMsg *msg, uint8_t rate)
1159 {
1160 msg->len = HDMI_CEC_GET_MSG_LEN(HDMI_CEC_SET_AUDIO_RATE_PARAM_LEN);
1161 msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_SET_AUDIO_RATE;
1162 msg->data[HDMI_CEC_MSG_DATA_SECOND_ELEMENT] = rate;
1163 }
1164
HdmiCecEncodingInitiateArcMsg(struct HdmiCecMsg * msg,bool response)1165 void HdmiCecEncodingInitiateArcMsg(struct HdmiCecMsg *msg, bool response)
1166 {
1167 msg->len = HDMI_CEC_GET_MSG_LEN(0);
1168 msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_INITIATE_ARC;
1169 if (response == true) {
1170 msg->rspMsg = HDMI_CEC_OPCODE_REPORT_ARC_INITIATED;
1171 }
1172 }
1173
HdmiCecEncodingReportArcInitiatedMsg(struct HdmiCecMsg * msg)1174 void HdmiCecEncodingReportArcInitiatedMsg(struct HdmiCecMsg *msg)
1175 {
1176 msg->len = HDMI_CEC_GET_MSG_LEN(0);
1177 msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_REPORT_ARC_INITIATED;
1178 }
1179
HdmiCecEncodingReportArcTerminationMsg(struct HdmiCecMsg * msg)1180 void HdmiCecEncodingReportArcTerminationMsg(struct HdmiCecMsg *msg)
1181 {
1182 msg->len = HDMI_CEC_GET_MSG_LEN(0);
1183 msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_REPORT_ARC_TERMINATION;
1184 }
1185
HdmiCecEncodingRequestArcInitiationMsg(struct HdmiCecMsg * msg,bool response)1186 void HdmiCecEncodingRequestArcInitiationMsg(struct HdmiCecMsg *msg, bool response)
1187 {
1188 msg->len = HDMI_CEC_GET_MSG_LEN(0);
1189 msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_REQUEST_ARC_INITIATION;
1190 if (response == true) {
1191 msg->rspMsg = HDMI_CEC_OPCODE_INITIATE_ARC;
1192 }
1193 }
1194
HdmiCecEncodingRequestArcTerminationMsg(struct HdmiCecMsg * msg,bool response)1195 void HdmiCecEncodingRequestArcTerminationMsg(struct HdmiCecMsg *msg, bool response)
1196 {
1197 msg->len = HDMI_CEC_GET_MSG_LEN(0);
1198 msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_REQUEST_ARC_TERMINATION;
1199 if (response == true) {
1200 msg->rspMsg = HDMI_CEC_OPCODE_TERMINATE_ARC;
1201 }
1202 }
1203
HdmiCecEncodingTerminateArcMsg(struct HdmiCecMsg * msg,bool response)1204 void HdmiCecEncodingTerminateArcMsg(struct HdmiCecMsg *msg, bool response)
1205 {
1206 msg->len = HDMI_CEC_GET_MSG_LEN(0);
1207 msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_TERMINATE_ARC;
1208 if (response == true) {
1209 msg->rspMsg = HDMI_CEC_OPCODE_REPORT_ARC_TERMINATION;
1210 }
1211 }
1212
HdmiCecEncodingRequestCurrentLatencyMsg(struct HdmiCecMsg * msg,uint16_t phyAddr,bool response)1213 void HdmiCecEncodingRequestCurrentLatencyMsg(struct HdmiCecMsg *msg, uint16_t phyAddr, bool response)
1214 {
1215 msg->len = HDMI_CEC_GET_MSG_LEN(HDMI_CEC_REQUEST_CURRENT_LATENCY_MSG_LEN);
1216 msg->data[HDMI_CEC_MSG_DATA_ZEROTH_ELEMENT] |= HDMI_CEC_LOG_ADDR_UNREGISTERED_OR_BROADCAST;
1217 msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_REQUEST_CURRENT_LATENCY;
1218 msg->data[HDMI_CEC_MSG_DATA_SECOND_ELEMENT] = (phyAddr >> HDMI_ONE_BYTE_SHIFT);
1219 msg->data[HDMI_CEC_MSG_DATA_THIRD_ELEMENT] = (phyAddr & HDMI_ONE_BYTE_MARK);
1220 if (response == true) {
1221 msg->rspMsg = HDMI_CEC_OPCODE_REPORT_CURRENT_LATENCY;
1222 }
1223 }
1224
HdmiCecEncodingReportCurrentLatencyMsg(struct HdmiCecMsg * msg,uint16_t phyAddr,struct HdmiCecLatencyInfo * info)1225 void HdmiCecEncodingReportCurrentLatencyMsg(struct HdmiCecMsg *msg,
1226 uint16_t phyAddr, struct HdmiCecLatencyInfo *info)
1227 {
1228 msg->len = HDMI_CEC_GET_MSG_LEN(HDMI_CEC_REPORT_CURRENT_LATENCY_MSG_PARAM_MIN_LEN);
1229 msg->data[HDMI_CEC_MSG_DATA_ZEROTH_ELEMENT] |= HDMI_CEC_LOG_ADDR_UNREGISTERED_OR_BROADCAST;
1230 msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_REPORT_CURRENT_LATENCY;
1231 msg->data[HDMI_CEC_MSG_DATA_SECOND_ELEMENT] = (phyAddr >> HDMI_ONE_BYTE_SHIFT);
1232 msg->data[HDMI_CEC_MSG_DATA_THIRD_ELEMENT] = (phyAddr & HDMI_ONE_BYTE_MARK);
1233 msg->data[HDMI_CEC_MSG_DATA_FORTH_ELEMENT] = info->videoLatency;
1234 msg->data[HDMI_CEC_MSG_DATA_FIFTH_ELEMENT] = (info->lowLatencyMode << HDMI_CEC_LOW_LATENCY_MODE_SHIFT) |
1235 (info->audioOutputCompensated);
1236 /* Operand[Audio Output Delay] is only present when [Audio Output Compensated] is 3. */
1237 if (info->audioOutputCompensated == HDMI_CEC_AUDIO_OUTPUT_COMPENSATED_PARTIAL_DELAY) {
1238 msg->len++;
1239 msg->data[HDMI_CEC_MSG_DATA_SIXTH_ELEMENT] = info->audioOutputDelay;
1240 }
1241 }
1242
1243 /* CDC Message Encoding. */
HdmiCdcEncodingHecInquireStateMsg(struct HdmiCecMsg * msg,uint16_t initiatorPhyAddr,uint16_t phyAddr1,uint16_t phyAddr2,bool response)1244 void HdmiCdcEncodingHecInquireStateMsg(struct HdmiCecMsg *msg, uint16_t initiatorPhyAddr,
1245 uint16_t phyAddr1, uint16_t phyAddr2, bool response)
1246 {
1247 msg->len = HDMI_CDC_GET_MSG_LEN(HDMI_CDC_HEC_INQUIRE_STATE_MSG_PARAM_LEN);
1248 msg->data[HDMI_CEC_MSG_DATA_ZEROTH_ELEMENT] |= HDMI_CEC_LOG_ADDR_UNREGISTERED_OR_BROADCAST;
1249 msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_CDC_MESSAGE;
1250 msg->data[HDMI_CEC_MSG_DATA_SECOND_ELEMENT] = (initiatorPhyAddr >> HDMI_ONE_BYTE_SHIFT);
1251 msg->data[HDMI_CEC_MSG_DATA_THIRD_ELEMENT] = (initiatorPhyAddr & HDMI_ONE_BYTE_MARK);
1252 msg->data[HDMI_CEC_MSG_DATA_FORTH_ELEMENT] = HDMI_CDC_HEC_INQUIRE_STATE;
1253 msg->data[HDMI_CEC_MSG_DATA_FIFTH_ELEMENT] = (phyAddr1 >> HDMI_ONE_BYTE_SHIFT);
1254 msg->data[HDMI_CEC_MSG_DATA_SIXTH_ELEMENT] = (phyAddr1 & HDMI_ONE_BYTE_MARK);
1255 msg->data[HDMI_CEC_MSG_DATA_SEVENTH_ELEMENT] = (phyAddr2 >> HDMI_ONE_BYTE_SHIFT);
1256 msg->data[HDMI_CEC_MSG_DATA_EIGHTH_ELEMENT] = (phyAddr2 & HDMI_ONE_BYTE_MARK);
1257 if (response == true) {
1258 msg->rspMsg = HDMI_CDC_HEC_REPORT_STATE;
1259 }
1260 }
1261
HdmiCdcEncodingHecReportStateMsg(struct HdmiCecMsg * msg,uint16_t initiatorPhyAddr,uint16_t phyAddr,struct HdmiCdcHecState * state)1262 void HdmiCdcEncodingHecReportStateMsg(struct HdmiCecMsg *msg, uint16_t initiatorPhyAddr,
1263 uint16_t phyAddr, struct HdmiCdcHecState *state)
1264 {
1265 msg->len = HDMI_CDC_GET_MSG_LEN(HDMI_CDC_HEC_REPORT_STATE_MSG_PARAM_MIN_LEN);
1266 msg->data[HDMI_CEC_MSG_DATA_ZEROTH_ELEMENT] |= HDMI_CEC_LOG_ADDR_UNREGISTERED_OR_BROADCAST;
1267 msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_CDC_MESSAGE;
1268 msg->data[HDMI_CEC_MSG_DATA_SECOND_ELEMENT] = (initiatorPhyAddr >> HDMI_ONE_BYTE_SHIFT);
1269 msg->data[HDMI_CEC_MSG_DATA_THIRD_ELEMENT] = (initiatorPhyAddr & HDMI_ONE_BYTE_MARK);
1270 msg->data[HDMI_CEC_MSG_DATA_FORTH_ELEMENT] = HDMI_CDC_HEC_REPORT_STATE;
1271 msg->data[HDMI_CEC_MSG_DATA_FIFTH_ELEMENT] = (phyAddr >> HDMI_ONE_BYTE_SHIFT);
1272 msg->data[HDMI_CEC_MSG_DATA_SIXTH_ELEMENT] = (phyAddr & HDMI_ONE_BYTE_MARK);
1273 msg->data[HDMI_CEC_MSG_DATA_SEVENTH_ELEMENT] = (state->hecFuncState << HDMI_CDC_HEC_FUNC_STATE_SHIFT) |
1274 (state->hostFuncState << HDMI_CDC_HOST_FUNC_STATE_SHIFT) |
1275 (state->encFuncState << HDMI_CDC_ENC_FUNC_STATE_SHIFT) |
1276 (state->cdcErrCode);
1277 if (state->haveHecField == true) {
1278 msg->len = HDMI_CDC_GET_MSG_LEN(HDMI_CDC_HEC_REPORT_STATE_MSG_PARAM_MAX_LEN);
1279 msg->data[HDMI_CEC_MSG_DATA_EIGHTH_ELEMENT] = (state->hecField >> HDMI_ONE_BYTE_SHIFT);
1280 msg->data[DATA_NINTH_OFFSET_ELEMENT] = (state->hecField & HDMI_ONE_BYTE_MARK);
1281 }
1282 }
1283
HdmiCdcEncodingHecSetStateAdjacentMsg(struct HdmiCecMsg * msg,uint16_t initiatorPhyAddr,uint16_t phyAddr,uint8_t hecSetState,bool response)1284 void HdmiCdcEncodingHecSetStateAdjacentMsg(struct HdmiCecMsg *msg, uint16_t initiatorPhyAddr,
1285 uint16_t phyAddr, uint8_t hecSetState, bool response)
1286 {
1287 msg->len = HDMI_CDC_GET_MSG_LEN(HDMI_CDC_HEC_SET_STATE_ADJACENT_MSG_PARAM_LEN);
1288 msg->data[HDMI_CEC_MSG_DATA_ZEROTH_ELEMENT] |= HDMI_CEC_LOG_ADDR_UNREGISTERED_OR_BROADCAST;
1289 msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_CDC_MESSAGE;
1290 msg->data[HDMI_CEC_MSG_DATA_SECOND_ELEMENT] = (initiatorPhyAddr >> HDMI_ONE_BYTE_SHIFT);
1291 msg->data[HDMI_CEC_MSG_DATA_THIRD_ELEMENT] = (initiatorPhyAddr & HDMI_ONE_BYTE_MARK);
1292 msg->data[HDMI_CEC_MSG_DATA_FORTH_ELEMENT] = HDMI_CDC_HEC_SET_STATE_ADJACENT;
1293 msg->data[HDMI_CEC_MSG_DATA_FIFTH_ELEMENT] = (phyAddr >> HDMI_ONE_BYTE_SHIFT);
1294 msg->data[HDMI_CEC_MSG_DATA_SIXTH_ELEMENT] = (phyAddr & HDMI_ONE_BYTE_MARK);
1295 msg->data[HDMI_CEC_MSG_DATA_SEVENTH_ELEMENT] = hecSetState;
1296 if (response == true) {
1297 msg->rspMsg = HDMI_CDC_HEC_REPORT_STATE;
1298 }
1299 }
1300
HdmiCdcEncodingHecSetStateMsg(struct HdmiCecMsg * msg,uint16_t initiatorPhyAddr,struct HemiCdcHecStateInfo * info,bool response)1301 void HdmiCdcEncodingHecSetStateMsg(struct HdmiCecMsg *msg, uint16_t initiatorPhyAddr,
1302 struct HemiCdcHecStateInfo *info, bool response)
1303 {
1304 uint32_t i;
1305
1306 msg->len = HDMI_CDC_GET_MSG_LEN(HDMI_CDC_HEC_SET_STATE_MSG_MIN_LEN);
1307 msg->data[HDMI_CEC_MSG_DATA_ZEROTH_ELEMENT] |= HDMI_CEC_LOG_ADDR_UNREGISTERED_OR_BROADCAST;
1308 msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_CDC_MESSAGE;
1309 msg->data[HDMI_CEC_MSG_DATA_SECOND_ELEMENT] = (initiatorPhyAddr >> HDMI_ONE_BYTE_SHIFT);
1310 msg->data[HDMI_CEC_MSG_DATA_THIRD_ELEMENT] = (initiatorPhyAddr & HDMI_ONE_BYTE_MARK);
1311 msg->data[HDMI_CEC_MSG_DATA_FORTH_ELEMENT] = HDMI_CDC_HEC_SET_STATE;
1312 msg->data[HDMI_CEC_MSG_DATA_FIFTH_ELEMENT] = (info->phyAddr1 >> HDMI_ONE_BYTE_SHIFT);
1313 msg->data[HDMI_CEC_MSG_DATA_SIXTH_ELEMENT] = (info->phyAddr1 & HDMI_ONE_BYTE_MARK);
1314 msg->data[HDMI_CEC_MSG_DATA_SEVENTH_ELEMENT] = (info->phyAddr2 >> HDMI_ONE_BYTE_SHIFT);
1315 msg->data[HDMI_CEC_MSG_DATA_EIGHTH_ELEMENT] = (info->phyAddr2 & HDMI_ONE_BYTE_MARK);
1316 msg->data[DATA_NINTH_OFFSET_ELEMENT] = info->hecSetState;
1317 for (i = 0; (i < info->phyAddrLen) && (i < HDMI_CDC_HEC_SET_STATE_MSG_OPTIONAL_PA_MAX_NUM); i++) {
1318 if (info->phyAddr[i] == HDMI_CEC_INVALID_PHY_ADDR) {
1319 break;
1320 }
1321 msg->data[msg->len] = (info->phyAddr[i] >> HDMI_ONE_BYTE_SHIFT);
1322 (msg->len)++;
1323 msg->data[msg->len] = (info->phyAddr[i] & HDMI_ONE_BYTE_MARK);
1324 (msg->len)++;
1325 }
1326 if (response == true) {
1327 msg->rspMsg = HDMI_CDC_HEC_REPORT_STATE;
1328 }
1329 }
1330
HdmiCdcEncodingHecRequestDeactivationMsg(struct HdmiCecMsg * msg,uint16_t initiatorPhyAddr,uint16_t * phyAddr,uint32_t len,bool response)1331 void HdmiCdcEncodingHecRequestDeactivationMsg(struct HdmiCecMsg *msg, uint16_t initiatorPhyAddr,
1332 uint16_t *phyAddr, uint32_t len, bool response)
1333 {
1334 uint32_t i;
1335
1336 if (phyAddr == NULL || len != HDMI_CDC_HEC_REQUEST_DEACTIVATION_MSG_PHY_ADDR_NUM) {
1337 return;
1338 }
1339 msg->len = HDMI_CDC_GET_MSG_LEN(0);
1340 msg->data[HDMI_CEC_MSG_DATA_ZEROTH_ELEMENT] |= HDMI_CEC_LOG_ADDR_UNREGISTERED_OR_BROADCAST;
1341 msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_CDC_MESSAGE;
1342 msg->data[HDMI_CEC_MSG_DATA_SECOND_ELEMENT] = (initiatorPhyAddr >> HDMI_ONE_BYTE_SHIFT);
1343 msg->data[HDMI_CEC_MSG_DATA_THIRD_ELEMENT] = (initiatorPhyAddr & HDMI_ONE_BYTE_MARK);
1344 msg->data[HDMI_CEC_MSG_DATA_FORTH_ELEMENT] = HDMI_CDC_HEC_REQUEST_DEACTIVATION;
1345 for (i = 0; i < len; i++) {
1346 msg->data[msg->len] = (phyAddr[i] >> HDMI_ONE_BYTE_SHIFT);
1347 (msg->len)++;
1348 msg->data[msg->len] = (phyAddr[i] & HDMI_ONE_BYTE_MARK);
1349 (msg->len)++;
1350 }
1351 if (response == true) {
1352 msg->rspMsg = HDMI_CDC_HEC_REPORT_STATE;
1353 }
1354 }
1355
HdmiCdcEncodingHecNotifyAliveMsg(struct HdmiCecMsg * msg,uint16_t initiatorPhyAddr)1356 void HdmiCdcEncodingHecNotifyAliveMsg(struct HdmiCecMsg *msg, uint16_t initiatorPhyAddr)
1357 {
1358 msg->len = HDMI_CDC_GET_MSG_LEN(0);
1359 msg->data[HDMI_CEC_MSG_DATA_ZEROTH_ELEMENT] |= HDMI_CEC_LOG_ADDR_UNREGISTERED_OR_BROADCAST;
1360 msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_CDC_MESSAGE;
1361 msg->data[HDMI_CEC_MSG_DATA_SECOND_ELEMENT] = (initiatorPhyAddr >> HDMI_ONE_BYTE_SHIFT);
1362 msg->data[HDMI_CEC_MSG_DATA_THIRD_ELEMENT] = (initiatorPhyAddr & HDMI_ONE_BYTE_MARK);
1363 msg->data[HDMI_CEC_MSG_DATA_FORTH_ELEMENT] = HDMI_CDC_HEC_NOTIFY_ALIVE;
1364 }
1365
HdmiCdcEncodingHecDiscoverMsg(struct HdmiCecMsg * msg,uint16_t initiatorPhyAddr,bool response)1366 void HdmiCdcEncodingHecDiscoverMsg(struct HdmiCecMsg *msg, uint16_t initiatorPhyAddr, bool response)
1367 {
1368 msg->len = HDMI_CDC_GET_MSG_LEN(0);
1369 msg->data[HDMI_CEC_MSG_DATA_ZEROTH_ELEMENT] |= HDMI_CEC_LOG_ADDR_UNREGISTERED_OR_BROADCAST;
1370 msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_CDC_MESSAGE;
1371 msg->data[HDMI_CEC_MSG_DATA_SECOND_ELEMENT] = (initiatorPhyAddr >> HDMI_ONE_BYTE_SHIFT);
1372 msg->data[HDMI_CEC_MSG_DATA_THIRD_ELEMENT] = (initiatorPhyAddr & HDMI_ONE_BYTE_MARK);
1373 msg->data[HDMI_CEC_MSG_DATA_FORTH_ELEMENT] = HDMI_CDC_HEC_DISCOVER;
1374 if (response == true) {
1375 msg->rspMsg = HDMI_CDC_HEC_REPORT_STATE;
1376 }
1377 }
1378
HdmiCdcEncodingHpdSetStateMsg(struct HdmiCecMsg * msg,uint16_t initiatorPhyAddr,uint8_t portNum,uint8_t hpdState,bool response)1379 void HdmiCdcEncodingHpdSetStateMsg(struct HdmiCecMsg *msg, uint16_t initiatorPhyAddr,
1380 uint8_t portNum, uint8_t hpdState, bool response)
1381 {
1382 msg->len = HDMI_CDC_GET_MSG_LEN(HDMI_CDC_HPD_SET_STATE_MSG_LEN);
1383 msg->data[HDMI_CEC_MSG_DATA_ZEROTH_ELEMENT] |= HDMI_CEC_LOG_ADDR_UNREGISTERED_OR_BROADCAST;
1384 msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_CDC_MESSAGE;
1385 msg->data[HDMI_CEC_MSG_DATA_SECOND_ELEMENT] = (initiatorPhyAddr >> HDMI_ONE_BYTE_SHIFT);
1386 msg->data[HDMI_CEC_MSG_DATA_THIRD_ELEMENT] = (initiatorPhyAddr & HDMI_ONE_BYTE_MARK);
1387 msg->data[HDMI_CEC_MSG_DATA_FORTH_ELEMENT] = HDMI_CDC_HPD_SET_STATE;
1388 msg->data[HDMI_CEC_MSG_DATA_FIFTH_ELEMENT] = (portNum << HDMI_CDC_INPUT_PORT_NUMBER_SHIFT) | hpdState;
1389 if (response == true) {
1390 msg->rspMsg = CEC_MSG_CDC_HPD_REPORT_STATE;
1391 }
1392 }
1393
HdmiCdcEncodingHpdReportStateMsg(struct HdmiCecMsg * msg,uint16_t initiatorPhyAddr,uint8_t hpdState,uint8_t errCode)1394 void HdmiCdcEncodingHpdReportStateMsg(struct HdmiCecMsg *msg, uint16_t initiatorPhyAddr,
1395 uint8_t hpdState, uint8_t errCode)
1396 {
1397 msg->len = HDMI_CDC_GET_MSG_LEN(HDMI_CDC_HPD_REPORT_STATE_MSG_LEN);
1398 msg->data[HDMI_CEC_MSG_DATA_ZEROTH_ELEMENT] |= HDMI_CEC_LOG_ADDR_UNREGISTERED_OR_BROADCAST;
1399 msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_CDC_MESSAGE;
1400 msg->data[HDMI_CEC_MSG_DATA_SECOND_ELEMENT] = (initiatorPhyAddr >> HDMI_ONE_BYTE_SHIFT);
1401 msg->data[HDMI_CEC_MSG_DATA_THIRD_ELEMENT] = (initiatorPhyAddr & HDMI_ONE_BYTE_MARK);
1402 msg->data[HDMI_CEC_MSG_DATA_FORTH_ELEMENT] = CEC_MSG_CDC_HPD_REPORT_STATE;
1403 msg->data[HDMI_CEC_MSG_DATA_FIFTH_ELEMENT] = (hpdState << HDMI_CDC_INPUT_PORT_NUMBER_SHIFT) | errCode;
1404 }
1405
HdmiCecSendMsg(struct HdmiCntlr * cntlr,struct HdmiCecMsg * msg)1406 static int32_t HdmiCecSendMsg(struct HdmiCntlr *cntlr, struct HdmiCecMsg *msg)
1407 {
1408 int32_t ret;
1409
1410 if (cntlr->ops == NULL || cntlr->ops->cecMsgSend == NULL) {
1411 return HDF_ERR_NOT_SUPPORT;
1412 }
1413
1414 if (msg->response == true) {
1415 msg->timeout = HDMI_CEC_WAIT_RESPONSE_MSG_MAX_TIME;
1416 }
1417
1418 HdmiCntlrLock(cntlr);
1419 ret = cntlr->ops->cecMsgSend(cntlr, msg);
1420 HdmiCntlrUnlock(cntlr);
1421 return ret;
1422 }
1423
HdmiCecMsgIgnore(uint8_t opcode,bool unregistered,bool broadcast)1424 static bool HdmiCecMsgIgnore(uint8_t opcode, bool unregistered, bool broadcast)
1425 {
1426 switch (opcode) {
1427 case HDMI_CEC_OPCODE_GET_CEC_VERSION:
1428 case HDMI_CEC_OPCODE_ABORT:
1429 case HDMI_CEC_OPCODE_GIVE_DEVICE_POWER_STATUS:
1430 case HDMI_CEC_OPCODE_GIVE_OSD_NAME:
1431 /* Ignore if initiator is Unregistered, because these messages should reply with a directed message. */
1432 if (unregistered == true) {
1433 return true;
1434 }
1435 /* fallthrough */
1436 case HDMI_CEC_OPCODE_GIVE_DEVICE_VENDOR_ID:
1437 case HDMI_CEC_OPCODE_GIVE_FEATURES:
1438 case HDMI_CEC_OPCODE_GIVE_PHYSICAL_ADDRESS:
1439 /* Ignore if addressing is wrong */
1440 if (broadcast == true) {
1441 return true;
1442 }
1443 break;
1444 case HDMI_CEC_OPCODE_USER_CONTROL_PRESSED:
1445 case HDMI_CEC_OPCODE_USER_CONTROL_RELEASED:
1446 if (unregistered == true || broadcast == true) {
1447 return true;
1448 }
1449 break;
1450 case HDMI_CEC_OPCODE_REPORT_PHYSICAL_ADDRESS:
1451 if (broadcast == false) {
1452 return true;
1453 }
1454 break;
1455 default:
1456 break;
1457 }
1458 return false;
1459 }
1460
HdmiCecHandleReportPhyAddressMsg(struct HdmiCntlr * cntlr,struct HdmiCecMsg * msg,struct HdmiCecMsg * txMsg)1461 static void HdmiCecHandleReportPhyAddressMsg(struct HdmiCntlr *cntlr,
1462 struct HdmiCecMsg *msg, struct HdmiCecMsg *txMsg)
1463 {
1464 uint16_t phyAddr;
1465
1466 phyAddr = ((msg->data[HDMI_CEC_MSG_DATA_SECOND_ELEMENT] << HDMI_ONE_BYTE_SHIFT) |
1467 msg->data[HDMI_CEC_MSG_DATA_THIRD_ELEMENT]);
1468 (void)cntlr;
1469 (void)txMsg;
1470
1471 HDF_LOGD("reported phy address is %x.%x.%x.%x, logical address is %d",
1472 HDMI_CEC_PHY_ADDR_PHASE(phyAddr), HdmiCecGetMsgInitiator(msg));
1473 }
1474
HdmiCecHandleUserControlPrtessedMsg(struct HdmiCntlr * cntlr,struct HdmiCecMsg * msg,struct HdmiCecMsg * txMsg)1475 static void HdmiCecHandleUserControlPrtessedMsg(struct HdmiCntlr *cntlr,
1476 struct HdmiCecMsg *msg, struct HdmiCecMsg *txMsg)
1477 {
1478 (void)msg;
1479 (void)txMsg;
1480
1481 /* Not support CEC Remote Control. */
1482 if (cntlr->cap.baseCap.bits.cecRc == 0) {
1483 return;
1484 }
1485 HDF_LOGD("Now User Control Prtessed not support.");
1486 }
1487
HdmiCecHandleUserControlReleasedMsg(struct HdmiCntlr * cntlr,struct HdmiCecMsg * msg,struct HdmiCecMsg * txMsg)1488 static void HdmiCecHandleUserControlReleasedMsg(struct HdmiCntlr *cntlr,
1489 struct HdmiCecMsg *msg, struct HdmiCecMsg *txMsg)
1490 {
1491 (void)msg;
1492 (void)txMsg;
1493
1494 /* Not support CEC Remote Control. */
1495 if (cntlr->cap.baseCap.bits.cecRc == 0) {
1496 return;
1497 }
1498 HDF_LOGD("Now User Control Released not support.");
1499 }
1500
HdmiCecHandleGetCecVersionMsg(struct HdmiCntlr * cntlr,struct HdmiCecMsg * msg,struct HdmiCecMsg * txMsg)1501 static void HdmiCecHandleGetCecVersionMsg(struct HdmiCntlr *cntlr,
1502 struct HdmiCecMsg *msg, struct HdmiCecMsg *txMsg)
1503 {
1504 HdmiCecEncodingCecVersionMsg(txMsg, cntlr->cec->info.cecVersion);
1505 if (HdmiCecSendMsg(cntlr, txMsg) != HDF_SUCCESS) {
1506 HDF_LOGE("get cec version msg send fail");
1507 }
1508 }
1509
HdmiCecHandleGivePhyAddressMsg(struct HdmiCntlr * cntlr,struct HdmiCecMsg * msg,struct HdmiCecMsg * txMsg)1510 static void HdmiCecHandleGivePhyAddressMsg(struct HdmiCntlr *cntlr,
1511 struct HdmiCecMsg *msg, struct HdmiCecMsg *txMsg)
1512 {
1513 /* Ignore for CEC switches using addr 15. */
1514 if ((cntlr->cec->info.primaryDeviceType == HDMI_CEC_DEVICE_TYPE_PURE_CEC_SWITCH) &&
1515 (HdmiCecGetMsgDestination(msg) == HDMI_CEC_LOG_ADDR_UNREGISTERED_OR_BROADCAST)) {
1516 return;
1517 }
1518
1519 HdmiCecEncodingReportPhyAddressMsg(txMsg, cntlr->cec->info.phyAddr, cntlr->cec->info.primaryDeviceType);
1520 if (HdmiCecSendMsg(cntlr, txMsg) != HDF_SUCCESS) {
1521 HDF_LOGE("give phy address msg send fail");
1522 }
1523 }
1524
HdmiCecHandleGiveDeviceVendorIdMsg(struct HdmiCntlr * cntlr,struct HdmiCecMsg * msg,struct HdmiCecMsg * txMsg)1525 static void HdmiCecHandleGiveDeviceVendorIdMsg(struct HdmiCntlr *cntlr,
1526 struct HdmiCecMsg *msg, struct HdmiCecMsg *txMsg)
1527 {
1528 if (cntlr->cec->info.vendorId == HDMI_CEC_VENDOR_ID_UNKNOWN) {
1529 HdmiCecEncodingFeatureAbortMsg(txMsg,
1530 msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT],
1531 HDMI_CEC_ABORT_UNRECOGNIZED_OPCODE);
1532 if (HdmiCecSendMsg(cntlr, txMsg) != HDF_SUCCESS) {
1533 HDF_LOGE("feature abort msg send fail");
1534 }
1535 return;
1536 }
1537 HdmiCecEncodingDeviceVendorIdMsg(txMsg, cntlr->cec->info.vendorId);
1538 if (HdmiCecSendMsg(cntlr, txMsg) != HDF_SUCCESS) {
1539 HDF_LOGE("give device vendor id msg send fail");
1540 }
1541 }
1542
HdmiCecHandleAbortMsg(struct HdmiCntlr * cntlr,struct HdmiCecMsg * msg,struct HdmiCecMsg * txMsg)1543 static void HdmiCecHandleAbortMsg(struct HdmiCntlr *cntlr,
1544 struct HdmiCecMsg *msg, struct HdmiCecMsg *txMsg)
1545 {
1546 /* Ignore for CEC switches. */
1547 if (cntlr->cec->info.primaryDeviceType == HDMI_CEC_DEVICE_TYPE_PURE_CEC_SWITCH) {
1548 return;
1549 }
1550 HdmiCecEncodingFeatureAbortMsg(txMsg, msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT], HDMI_CEC_ABORT_REFUSED);
1551 if (HdmiCecSendMsg(cntlr, txMsg) != HDF_SUCCESS) {
1552 HDF_LOGE("feature abort msg send fail");
1553 }
1554 }
1555
HdmiCecHandleGiveOsdNameMsg(struct HdmiCntlr * cntlr,struct HdmiCecMsg * msg,struct HdmiCecMsg * txMsg)1556 static void HdmiCecHandleGiveOsdNameMsg(struct HdmiCntlr *cntlr,
1557 struct HdmiCecMsg *msg, struct HdmiCecMsg *txMsg)
1558 {
1559 if (cntlr->cec->info.osdName[0] == 0) {
1560 HdmiCecEncodingFeatureAbortMsg(txMsg,
1561 msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT],
1562 HDMI_CEC_ABORT_UNRECOGNIZED_OPCODE);
1563 if (HdmiCecSendMsg(cntlr, txMsg) != HDF_SUCCESS) {
1564 HDF_LOGE("feature abort msg send fail");
1565 }
1566 return;
1567 }
1568
1569 HdmiCecEncodingSetOsdNameMsg(txMsg, cntlr->cec->info.osdName, cntlr->cec->info.osdNameLen);
1570 if (HdmiCecSendMsg(cntlr, txMsg) != HDF_SUCCESS) {
1571 HDF_LOGE("set osd name msg send fail");
1572 }
1573 }
1574
HdmiCecHandleGiveFeaturesMsg(struct HdmiCntlr * cntlr,struct HdmiCecMsg * msg,struct HdmiCecMsg * txMsg)1575 static void HdmiCecHandleGiveFeaturesMsg(struct HdmiCntlr *cntlr,
1576 struct HdmiCecMsg *msg, struct HdmiCecMsg *txMsg)
1577 {
1578 if (cntlr->cec->info.cecVersion < HDMI_CEC_VERSION_2_0) {
1579 HdmiCecEncodingFeatureAbortMsg(txMsg,
1580 msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT],
1581 HDMI_CEC_ABORT_UNRECOGNIZED_OPCODE);
1582 if (HdmiCecSendMsg(cntlr, txMsg) != HDF_SUCCESS) {
1583 HDF_LOGE("feature abort msg send fail");
1584 }
1585 return;
1586 }
1587
1588 HdmiCecEncodingReportFeaturesMsg(txMsg, &(cntlr->cec->info));
1589 if (HdmiCecSendMsg(cntlr, txMsg) != HDF_SUCCESS) {
1590 HDF_LOGE("report feature msg send fail");
1591 }
1592 }
1593
HdmiCecMsgDefaultHandle(struct HdmiCntlr * cntlr,struct HdmiCecMsg * msg,struct HdmiCecMsg * txMsg)1594 static void HdmiCecMsgDefaultHandle(struct HdmiCntlr *cntlr,
1595 struct HdmiCecMsg *msg, struct HdmiCecMsg *txMsg)
1596 {
1597 bool broadcast = HdmiCecIsBroadcastMsg(msg);
1598 uint8_t opcode = msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT];
1599 bool isResponse = (cntlr->cec->info.isWaitingResponse == true && cntlr->cec->info.response == opcode);
1600
1601 if (broadcast == true || isResponse == true) {
1602 return;
1603 }
1604 if (opcode != HDMI_CEC_OPCODE_FEATURE_ABORT) {
1605 return;
1606 }
1607
1608 HdmiCecEncodingFeatureAbortMsg(txMsg, opcode, HDMI_CEC_ABORT_UNRECOGNIZED_OPCODE);
1609 if (HdmiCecSendMsg(cntlr, txMsg) != HDF_SUCCESS) {
1610 HDF_LOGE("feature abort msg send fail");
1611 }
1612 }
1613
HdmiCecMsgHandle(struct HdmiCntlr * cntlr,struct HdmiCecMsg * msg,struct HdmiCecMsg * txMsg,uint8_t opcode)1614 static void HdmiCecMsgHandle(struct HdmiCntlr *cntlr, struct HdmiCecMsg *msg,
1615 struct HdmiCecMsg *txMsg, uint8_t opcode)
1616 {
1617 uint32_t i, len;
1618
1619 struct HdmiCecHandleMsgFuncMap funcMap[] = {
1620 { HDMI_CEC_OPCODE_GET_CEC_VERSION, HdmiCecHandleGetCecVersionMsg },
1621 { HDMI_CEC_OPCODE_REPORT_PHYSICAL_ADDRESS, HdmiCecHandleReportPhyAddressMsg },
1622 { HDMI_CEC_OPCODE_USER_CONTROL_PRESSED, HdmiCecHandleUserControlPrtessedMsg },
1623 { HDMI_CEC_OPCODE_USER_CONTROL_RELEASED, HdmiCecHandleUserControlReleasedMsg },
1624 { HDMI_CEC_OPCODE_GIVE_PHYSICAL_ADDRESS, HdmiCecHandleGivePhyAddressMsg },
1625 { HDMI_CEC_OPCODE_GIVE_DEVICE_VENDOR_ID, HdmiCecHandleGiveDeviceVendorIdMsg },
1626 { HDMI_CEC_OPCODE_ABORT, HdmiCecHandleAbortMsg },
1627 { HDMI_CEC_OPCODE_GIVE_OSD_NAME, HdmiCecHandleGiveOsdNameMsg },
1628 { HDMI_CEC_OPCODE_GIVE_FEATURES, HdmiCecHandleGiveFeaturesMsg }
1629 };
1630
1631 len = sizeof(funcMap) / sizeof(funcMap[0]);
1632 for (i = 0; i < len; i++) {
1633 if (opcode == funcMap[i].opcode) {
1634 funcMap[i].func(cntlr, msg, txMsg);
1635 return;
1636 }
1637 }
1638 HdmiCecMsgDefaultHandle(cntlr, msg, txMsg);
1639 }
1640
HdmiCecUpdateResponseFlag(struct HdmiCec * cec,uint8_t opcode)1641 static void HdmiCecUpdateResponseFlag(struct HdmiCec *cec, uint8_t opcode)
1642 {
1643 /* receive response msg. */
1644 if (cec->info.isWaitingResponse == true && cec->info.response == opcode) {
1645 cec->info.isWaitingResponse = false;
1646 cec->info.response = 0;
1647 }
1648 }
1649
HdmiCecReceivedMsgHandle(struct HdmiCntlr * cntlr,struct HdmiCecMsg * msg)1650 static void HdmiCecReceivedMsgHandle(struct HdmiCntlr *cntlr, struct HdmiCecMsg *msg)
1651 {
1652 uint8_t opcode = msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT];
1653 bool broadcast = HdmiCecIsBroadcastMsg(msg);
1654 bool unregistered = (HdmiCecGetMsgInitiator(msg) == HDMI_CEC_LOG_ADDR_UNREGISTERED_OR_BROADCAST);
1655 struct HdmiCecMsg txMsg = {0};
1656
1657 if (HdmiCecMsgIgnore(opcode, unregistered, broadcast) == true) {
1658 HdmiCecUpdateResponseFlag(cntlr->cec, opcode);
1659 return;
1660 }
1661
1662 HdmiCecFillMsgHeader(&txMsg, msg);
1663 HdmiCecMsgHandle(cntlr, msg, &txMsg, opcode);
1664 HdmiCecUpdateResponseFlag(cntlr->cec, opcode);
1665 }
1666
HdmiCecReceivedMsg(struct HdmiCec * cec,struct HdmiCecMsg * msg)1667 int32_t HdmiCecReceivedMsg(struct HdmiCec *cec, struct HdmiCecMsg *msg)
1668 {
1669 struct HdmiCntlr *cntlr = NULL;
1670 uint8_t opcode, initiator, destination;
1671
1672 if (cec == NULL || cec->priv == NULL || msg == NULL) {
1673 HDF_LOGE("cec receive msg, input param invalid.");
1674 return HDF_ERR_INVALID_PARAM;
1675 }
1676
1677 cntlr = (struct HdmiCntlr *)cec->priv;
1678 if (cntlr->cap.baseCap.bits.cec == 0) {
1679 HDF_LOGD("not support cec.");
1680 return HDF_ERR_NOT_SUPPORT;
1681 }
1682
1683 if (msg->len < HDMI_CEC_MSG_MIN_LEN) {
1684 HDF_LOGE("cec receive msg, len is error.");
1685 return HDF_ERR_INVALID_PARAM;
1686 }
1687
1688 initiator = HdmiCecGetMsgInitiator(msg);
1689 destination = HdmiCecGetMsgDestination(msg);
1690 opcode = msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT];
1691 /* Check if this message is for us. */
1692 if ((initiator != HDMI_CEC_LOG_ADDR_UNREGISTERED_OR_BROADCAST) &&
1693 (HdmiCecLogAddrValid(cntlr->cec, initiator) == true)) {
1694 return HDF_ERR_INVALID_PARAM;
1695 }
1696 if ((HdmiCecIsBroadcastMsg(msg) == false) &&
1697 (HdmiCecLogAddrValid(cec, destination) == false)) {
1698 HDF_LOGD("this cec msg is not for us!");
1699 return HDF_ERR_INVALID_PARAM;
1700 }
1701
1702 if (cntlr->cec->info.logAddrMask == 0) {
1703 return HDF_ERR_NOT_SUPPORT;
1704 }
1705
1706 /* CDC Only devices should ignore non-CDC messages. */
1707 if ((HdmiCecIsCdcOnlyDevice(cec) == true) &&
1708 (opcode != HDMI_CEC_OPCODE_CDC_MESSAGE)) {
1709 HDF_LOGD("this cec msg is not cdc msg.");
1710 return HDF_ERR_NOT_SUPPORT;
1711 }
1712 if (HdmiCecCheckMsgLen(cec, msg, opcode) == false) {
1713 return HDF_ERR_INVALID_PARAM;
1714 }
1715
1716 HdmiCecReceivedMsgHandle(cntlr, msg);
1717 return HDF_SUCCESS;
1718 }
1719