• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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