/* Transmit an Active Source message from this output port to a sink */ staticvoid cec_port_out_active_source(struct cec_splitter_port *p)
{ struct cec_adapter *adap = p->adap; struct cec_msg msg;
/* Transmit Active Source messages from all output ports to the sinks */ staticvoid cec_out_active_source(struct cec_splitter *splitter)
{ unsignedint i;
for (i = 0; i < splitter->num_out_ports; i++)
cec_port_out_active_source(splitter->ports[i]);
}
/* Transmit a Standby message from this output port to a sink */ staticvoid cec_port_out_standby(struct cec_splitter_port *p)
{ struct cec_adapter *adap = p->adap; struct cec_msg msg;
/* Transmit Standby messages from all output ports to the sinks */ staticvoid cec_out_standby(struct cec_splitter *splitter)
{ unsignedint i;
for (i = 0; i < splitter->num_out_ports; i++)
cec_port_out_standby(splitter->ports[i]);
}
/* Transmit an Image/Text View On message from this output port to a sink */ staticvoid cec_port_out_wakeup(struct cec_splitter_port *p, u8 opcode)
{ struct cec_adapter *adap = p->adap;
u8 la = adap->log_addrs.log_addr[0]; struct cec_msg msg;
if (la == CEC_LOG_ADDR_INVALID)
la = CEC_LOG_ADDR_UNREGISTERED;
cec_msg_init(&msg, la, 0);
msg.len = 2;
msg.msg[1] = opcode;
cec_transmit_msg(adap, &msg, false);
}
/* Transmit Image/Text View On messages from all output ports to the sinks */ staticvoid cec_out_wakeup(struct cec_splitter *splitter, u8 opcode)
{ unsignedint i;
for (i = 0; i < splitter->num_out_ports; i++)
cec_port_out_wakeup(splitter->ports[i], opcode);
}
/* Pass the in_msg on to all output ports */ staticvoid cec_out_passthrough(struct cec_splitter *splitter, conststruct cec_msg *in_msg)
{ unsignedint i;
for (i = 0; i < splitter->num_out_ports; i++) { struct cec_splitter_port *p = splitter->ports[i]; struct cec_adapter *adap = p->adap; struct cec_msg msg;
for (i = 0; i < splitter->num_out_ports; i++) { struct cec_splitter_port *p = splitter->ports[i]; struct cec_adapter *adap = p->adap;
/* Skip unconfigured ports */ if (!adap->is_configured) continue; /* Return if a port is still waiting for a reply */ if (p->out_request_current_latency_seq) return;
reply_lat += p->video_latency - 1;
cnt++;
}
/* *Allportsthatcanreply,replied,soclearthesequence *andtimestampvalues.
*/ for (i = 0; i < splitter->num_out_ports; i++) { struct cec_splitter_port *p = splitter->ports[i];
for (i = 0; i < splitter->num_out_ports; i++) { struct cec_splitter_port *p = splitter->ports[i];
/* Skip if no sink was found (HPD was low for more than 5s) */ if (!p->found_sink) continue;
/* Return if a port is still waiting for a reply */ if (p->out_give_device_power_status_seq) return; if (p->power_status != splitter_pwr)
reply_pwr = splitter_transient_pwr;
}
/* *Allportsthatcanreply,replied,soclearthesequence *andtimestampvalues.
*/ for (i = 0; i < splitter->num_out_ports; i++) { struct cec_splitter_port *p = splitter->ports[i];
/* Return if the input port is no longer configured. */ if (!input_adap->is_configured) return;
/* Reply with the new power status */
cec_msg_init(&reply, input_adap->log_addrs.log_addr[0],
splitter->give_device_power_status_dest);
cec_msg_report_power_status(&reply, reply_pwr);
cec_transmit_msg(input_adap, &reply, false);
}
/* Transmit Give Device Power Status to all output ports */ staticint cec_out_give_device_power_status(struct cec_splitter *splitter)
{
ktime_t now = ktime_get(); bool error = true; unsignedint i;
for (i = 0; i < splitter->num_out_ports; i++) { struct cec_splitter_port *p = splitter->ports[i]; struct cec_adapter *adap = p->adap;
/* *CECmessagesreceivedontheHDMIinputofthesplitterare *forwarded(ifrelevant)totheHDMIoutputsofthesplitter.
*/ int cec_splitter_received_input(struct cec_splitter_port *p, struct cec_msg *msg)
{ if (!cec_msg_status_is_ok(msg)) return0;
if (msg->len < 2) return -ENOMSG;
switch (msg->msg[1]) { case CEC_MSG_DEVICE_VENDOR_ID: case CEC_MSG_REPORT_POWER_STATUS: case CEC_MSG_SET_STREAM_PATH: case CEC_MSG_ROUTING_CHANGE: case CEC_MSG_REQUEST_ACTIVE_SOURCE: case CEC_MSG_SYSTEM_AUDIO_MODE_STATUS: return0;
case CEC_MSG_STANDBY:
p->splitter->is_standby = true;
cec_out_standby(p->splitter); return0;
case CEC_MSG_IMAGE_VIEW_ON: case CEC_MSG_TEXT_VIEW_ON:
p->splitter->is_standby = false;
cec_out_wakeup(p->splitter, msg->msg[1]); return0;
case CEC_MSG_ACTIVE_SOURCE:
cec_out_active_source(p->splitter); return0;
case CEC_MSG_SET_SYSTEM_AUDIO_MODE:
cec_out_passthrough(p->splitter, msg); return0;
case CEC_MSG_GIVE_DEVICE_POWER_STATUS:
p->splitter->give_device_power_status_dest =
cec_msg_initiator(msg); if (cec_out_give_device_power_status(p->splitter))
cec_feature_abort_reason(p->adap, msg,
CEC_OP_ABORT_INCORRECT_MODE); return0;
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.