author | Jinping Wang <jinping.wang@amlogic.com> | 2017-11-15 06:09:34 (GMT) |
---|---|---|
committer | Jinping Wang <jinping.wang@amlogic.com> | 2017-11-16 06:00:56 (GMT) |
commit | 0f86c56b502b1ef8a915913df42e843c766dfde2 (patch) | |
tree | c8dd6a4790285079065038298b26263102d96f06 | |
parent | 4637daae91d0645afb42b6594e4166e7aa69b9bf (diff) | |
download | frameworks-0f86c56b502b1ef8a915913df42e843c766dfde2.zip frameworks-0f86c56b502b1ef8a915913df42e843c766dfde2.tar.gz frameworks-0f86c56b502b1ef8a915913df42e843c766dfde2.tar.bz2 |
xcec: tv wakeup playback [1/1]
PD# 152844
tv wakeup playback for full treble
Change-Id: I58d042a17bd0027e9ba7f2f5517dfb355efd804d
-rw-r--r-- | services/hdmicec/libhdmi_cec/HdmiCecControl.cpp | 123 | ||||
-rw-r--r-- | services/hdmicec/libhdmi_cec/HdmiCecControl.h | 13 |
2 files changed, 97 insertions, 39 deletions
diff --git a/services/hdmicec/libhdmi_cec/HdmiCecControl.cpp b/services/hdmicec/libhdmi_cec/HdmiCecControl.cpp index babcb55..8aa7467 100644 --- a/services/hdmicec/libhdmi_cec/HdmiCecControl.cpp +++ b/services/hdmicec/libhdmi_cec/HdmiCecControl.cpp @@ -139,7 +139,7 @@ void* HdmiCecControl::__threadLoop(void *user) void HdmiCecControl::threadLoop() { - unsigned char msg_buf[CEC_MESSAGE_BODY_MAX_LENGTH]; + unsigned char msgBuf[CEC_MESSAGE_BODY_MAX_LENGTH]; hdmi_cec_event_t event; int r = -1; @@ -157,37 +157,44 @@ void HdmiCecControl::threadLoop() } checkConnectStatus(); - memset(msg_buf, 0, sizeof(msg_buf)); + memset(msgBuf, 0, sizeof(msgBuf)); //try to get a message from dev. - r = readMessage(msg_buf, CEC_MESSAGE_BODY_MAX_LENGTH); + r = readMessage(msgBuf, CEC_MESSAGE_BODY_MAX_LENGTH); if (r <= 1)//ignore received ping messages continue; - printCecMsgBuf((const char*)msg_buf, r); + printCecMsgBuf((const char*)msgBuf, r); event.eventType = 0; - memcpy(event.cec.body, msg_buf + 1, r - 1); - event.cec.initiator = cec_logical_address_t((msg_buf[0] >> 4) & 0xf); - event.cec.destination = cec_logical_address_t((msg_buf[0] >> 0) & 0xf); + memcpy(event.cec.body, msgBuf + 1, r - 1); + event.cec.initiator = cec_logical_address_t((msgBuf[0] >> 4) & 0xf); + event.cec.destination = cec_logical_address_t((msgBuf[0] >> 0) & 0xf); event.cec.length = r - 1; - if (mCecDevice.mDeviceType == DEV_TYPE_PLAYBACK - && msg_buf[1] == CEC_MESSAGE_SET_MENU_LANGUAGE && mCecDevice.mExtendControl) { - ALOGD("[hcc] ignore menu language change for hdmi-tx."); + ALOGD("[hcc] mExtendControl = %d, mDeviceType = %d, isCecControlled = %d", + mCecDevice.mExtendControl, mCecDevice.mDeviceType, mCecDevice.isCecControlled); + + if (mCecDevice.isCecControlled) { + event.eventType |= HDMI_EVENT_CEC_MESSAGE; + /* call java method to process cec message for ext control */ + if (mCecDevice.mExtendControl) { + event.eventType |= HDMI_EVENT_RECEIVE_MESSAGE; + } + if (mCecDevice.mDeviceType == DEV_TYPE_PLAYBACK + && msgBuf[1] == CEC_MESSAGE_SET_MENU_LANGUAGE) { + event.eventType &= 0; + ALOGD("[hcc] ignore menu language change for hdmi-tx."); + } } else { - if (mCecDevice.isCecControlled) { + /* wakeup playback device */ + if (isWakeUpMsg((char*)msgBuf, r, mCecDevice.mDeviceType)) { + memset(event.cec.body, 0, sizeof(event.cec.body)); + memcpy(event.cec.body, msgBuf + 1, r - 1); event.eventType |= HDMI_EVENT_CEC_MESSAGE; + ALOGD("[hcc] receive wake up message for hdmi_tx"); } } - ALOGD("[hcc] mExtendControl = %d, mDeviceType = %d, isCecControlled = %d", - mCecDevice.mExtendControl, mCecDevice.mDeviceType, mCecDevice.isCecControlled); - /* call java method to process cec message for ext control */ - if ((mCecDevice.mExtendControl == 0x03) - && (mCecDevice.mDeviceType == DEV_TYPE_PLAYBACK) - && mCecDevice.isCecControlled) { - event.eventType |= HDMI_EVENT_RECEIVE_MESSAGE; - } if (mEventListener != NULL && event.eventType != 0) { mEventListener->onEventUpdate(&event); } @@ -196,13 +203,55 @@ void HdmiCecControl::threadLoop() mCecDevice.mExited = true; } +/** + * Check if received a wakeup message if mCecDevice.isCecControlled is false +* @param msgBuf is a message Buf +* msgBuf[1]: message type +* msgBuf[2]-msgBuf[n]: message para +* @param len is message lenth +* @param deviceType is type of device +*/ + +bool HdmiCecControl::isWakeUpMsg(char *msgBuf, int len, int deviceType) +{ + bool ret = false; + if (deviceType == DEV_TYPE_PLAYBACK) { + switch (msgBuf[1]) { + case CEC_MESSAGE_SET_STREAM_PATH: + case CEC_MESSAGE_DECK_CONTROL: + case CEC_MESSAGE_PLAY: + case CEC_MESSAGE_ACTIVE_SOURCE: + ret = true; + break; + case CEC_MESSAGE_ROUTING_CHANGE: + /* build <set stream path> message*/ + msgBuf[1] = CEC_MESSAGE_SET_STREAM_PATH; + msgBuf[2] = msgBuf[len - 2]; + msgBuf[3] = msgBuf[len - 1]; + msgBuf[len - 2] &= 0x0; + msgBuf[len - 1] &= 0x0; + ret = true; + break; + case CEC_MESSAGE_USER_CONTROL_PRESSED: + if (msgBuf[2] == CEC_KEYCODE_POWER + || msgBuf[2] == CEC_KEYCODE_ROOT_MENU + || msgBuf[2] == CEC_KEYCODE_POWER_ON_FUNCTION) { + ret = true; + } + break; + default: + break; + } + } + return ret; +} void HdmiCecControl::checkConnectStatus() { - unsigned int prev_status, bit; + unsigned int prevStatus, bit; int i, port, ret; hdmi_cec_event_t event; - prev_status = mCecDevice.mConnectStatus; + prevStatus = mCecDevice.mConnectStatus; for (i = 0; i < mCecDevice.mTotalPort && mCecDevice.mpPortData != NULL; i++) { port = mCecDevice.mpPortData[i].port_id; ret = ioctl(mCecDevice.mFd, CEC_IOC_GET_CONNECT_STATUS, &port); @@ -210,33 +259,33 @@ void HdmiCecControl::checkConnectStatus() ALOGE("[hcc] get port %d connected status failed, ret:%d\n", mCecDevice.mpPortData[i].port_id, ret); continue; } - bit = prev_status & (1 << i); + bit = prevStatus & (1 << i); if (bit ^ ((port ? 1 : 0) << i)) {//connect status has changed - ALOGD("[hcc] port:%d, connect status changed, now:%d, prev_status:%x\n", - mCecDevice.mpPortData[i].port_id, port, prev_status); + ALOGD("[hcc] port:%d, connect status changed, now:%d, prevStatus:%x\n", + mCecDevice.mpPortData[i].port_id, port, prevStatus); if (mEventListener != NULL && mCecDevice.isCecEnabled && mCecDevice.isCecControlled) { event.eventType = HDMI_EVENT_HOT_PLUG; event.hotplug.connected = port; event.hotplug.port_id = mCecDevice.mpPortData[i].port_id; mEventListener->onEventUpdate(&event); } - prev_status &= ~(bit); - prev_status |= ((port ? 1 : 0) << i); - //ALOGD("[hcc] now mask:%x\n", prev_status); + prevStatus &= ~(bit); + prevStatus |= ((port ? 1 : 0) << i); + //ALOGD("[hcc] now mask:%x\n", prevStatus); } } - mCecDevice.mConnectStatus = prev_status; + mCecDevice.mConnectStatus = prevStatus; } -int HdmiCecControl::readMessage(unsigned char *buf, int msg_cnt) +int HdmiCecControl::readMessage(unsigned char *buf, int msgCount) { - if (msg_cnt <= 0 || !buf) { + if (msgCount <= 0 || !buf) { return 0; } int ret = -1; /* maybe blocked at driver */ - ret = read(mCecDevice.mFd, buf, msg_cnt); + ret = read(mCecDevice.mFd, buf, msgCount); if (ret < 0) { ALOGE("[hcc] read :%s failed, ret:%d\n", CEC_FILE, ret); return -1; @@ -333,7 +382,7 @@ void HdmiCecControl::setOption(int flag, int value) case HDMI_OPTION_SYSTEM_CEC_CONTROL: ret = ioctl(mCecDevice.mFd, CEC_IOC_SET_OPTION_SYS_CTRL, value); - mCecDevice.isCecEnabled = (value == 1) ? true : false; + mCecDevice.isCecEnabled = (value == 1 && !mCecDevice.isCecEnabled) ? true : mCecDevice.isCecEnabled; mCecDevice.isCecControlled = (value == 1) ? true : false; break; @@ -464,13 +513,13 @@ int HdmiCecControl::sendExtMessage(const cec_message_t* message) int HdmiCecControl::send(const cec_message_t* message) { - unsigned char msg_buf[CEC_MESSAGE_BODY_MAX_LENGTH]; + unsigned char msgBuf[CEC_MESSAGE_BODY_MAX_LENGTH]; int ret = -1; - memset(msg_buf, 0, sizeof(msg_buf)); - msg_buf[0] = ((message->initiator & 0xf) << 4) | (message->destination & 0xf); - memcpy(msg_buf + 1, message->body, message->length); - ret = write(mCecDevice.mFd, msg_buf, message->length + 1); + memset(msgBuf, 0, sizeof(msgBuf)); + msgBuf[0] = ((message->initiator & 0xf) << 4) | (message->destination & 0xf); + memcpy(msgBuf + 1, message->body, message->length); + ret = write(mCecDevice.mFd, msgBuf, message->length + 1); printCecMessage(message, ret); return ret; } diff --git a/services/hdmicec/libhdmi_cec/HdmiCecControl.h b/services/hdmicec/libhdmi_cec/HdmiCecControl.h index 99ad506..4662e5b 100644 --- a/services/hdmicec/libhdmi_cec/HdmiCecControl.h +++ b/services/hdmicec/libhdmi_cec/HdmiCecControl.h @@ -44,6 +44,15 @@ enum { HDMI_OPTION_CEC_AUTO_DEVICE_OFF = 4, }; +/* + * HDMI CEC messages para value + */ +enum cec_message_para_value{ + CEC_KEYCODE_POWER = 0x40, + CEC_KEYCODE_ROOT_MENU = 0x09, + CEC_KEYCODE_POWER_ON_FUNCTION = 0x6D +}; + /** * struct for information of cec device. * @mDeviceType Indentify type of cec device, such as TV or BOX. @@ -105,12 +114,12 @@ private: int sendExtMessage(const cec_message_t* message); int send(const cec_message_t* message); - int readMessage(unsigned char *buf, int msg_cnt); + int readMessage(unsigned char *buf, int msgCount); void checkConnectStatus(); bool assertHdmiCecDevice(); bool hasHandledByExtend(const cec_message_t* message); - + bool isWakeUpMsg(char *msgBuf, int len, int deviceType); hdmi_device_t mCecDevice; sp<HdmiCecEventListener> mEventListener; }; |