blob: 0b3a81fb33531dec9550f53f50d7a797bd2d42ad
1 | #define LOG_TAG "CSourceConnectDetect" |
2 | |
3 | #include "CTvin.h" |
4 | #include <CTvLog.h> |
5 | #include <stdio.h> |
6 | #include <stdlib.h> |
7 | #include <unistd.h> |
8 | #include <sys/prctl.h> |
9 | #include <fcntl.h> |
10 | #include <errno.h> |
11 | |
12 | #include <cutils/log.h> |
13 | |
14 | #include "../tvutils/tvutils.h" |
15 | #include "../tvconfig/tvconfig.h" |
16 | |
17 | #include "CSourceConnectDetect.h" |
18 | |
19 | CSourceConnectDetect::CSourceConnectDetect() |
20 | { |
21 | mpObserver = NULL; |
22 | if (mEpoll.create() < 0) { |
23 | return; |
24 | } |
25 | //avin |
26 | if (mAvinDetectFile.openFile(AVIN_DETECT_PATH) > 0) { |
27 | m_event.data.fd = mAvinDetectFile.getFd(); |
28 | m_event.events = EPOLLIN | EPOLLET; |
29 | mEpoll.add(mAvinDetectFile.getFd(), &m_event); |
30 | } |
31 | //HDMI |
32 | if (mHdmiDetectFile.openFile(HDMI_DETECT_PATH) > 0) { |
33 | m_event.data.fd = mHdmiDetectFile.getFd(); |
34 | m_event.events = EPOLLIN | EPOLLET; |
35 | mEpoll.add(mHdmiDetectFile.getFd(), &m_event); |
36 | } |
37 | //vfame size change |
38 | if (mVppPollFile.openFile(VPP_POLL_PATCH) > 0) { |
39 | m_event.data.fd = mVppPollFile.getFd(); |
40 | m_event.events = EPOLLIN | EPOLLET; |
41 | mEpoll.add(mVppPollFile.getFd(), &m_event); |
42 | } |
43 | } |
44 | |
45 | CSourceConnectDetect::~CSourceConnectDetect() |
46 | { |
47 | } |
48 | |
49 | int CSourceConnectDetect::startDetect() |
50 | { |
51 | this->run(); |
52 | |
53 | return 0; |
54 | } |
55 | |
56 | int CSourceConnectDetect::SourceInputMaptoChipHdmiPort(tv_source_input_t source_input) |
57 | { |
58 | tvin_port_t source_port = TVIN_PORT_NULL; |
59 | source_port = CTvin::getInstance()->Tvin_GetSourcePortBySourceInput(source_input); |
60 | switch (source_port) { |
61 | case TVIN_PORT_HDMI0: |
62 | return HDMI_DETECT_STATUS_BIT_A; |
63 | break; |
64 | case TVIN_PORT_HDMI1: |
65 | return HDMI_DETECT_STATUS_BIT_B; |
66 | break; |
67 | case TVIN_PORT_HDMI2: |
68 | return HDMI_DETECT_STATUS_BIT_C; |
69 | break; |
70 | case TVIN_PORT_HDMI3: |
71 | return HDMI_DETECT_STATUS_BIT_D; |
72 | break; |
73 | default: |
74 | return HDMI_DETECT_STATUS_BIT_A; |
75 | break; |
76 | } |
77 | |
78 | } |
79 | |
80 | tv_source_input_t CSourceConnectDetect::ChipHdmiPortMaptoSourceInput(int port) |
81 | { |
82 | switch (port) { |
83 | case HDMI_DETECT_STATUS_BIT_A: |
84 | return CTvin::getInstance()->Tvin_PortToSourceInput(TVIN_PORT_HDMI0); |
85 | break; |
86 | case HDMI_DETECT_STATUS_BIT_B: |
87 | return CTvin::getInstance()->Tvin_PortToSourceInput(TVIN_PORT_HDMI1); |
88 | break; |
89 | case HDMI_DETECT_STATUS_BIT_C: |
90 | return CTvin::getInstance()->Tvin_PortToSourceInput(TVIN_PORT_HDMI2); |
91 | break; |
92 | case HDMI_DETECT_STATUS_BIT_D: |
93 | return CTvin::getInstance()->Tvin_PortToSourceInput(TVIN_PORT_HDMI3); |
94 | break; |
95 | default: |
96 | return CTvin::getInstance()->Tvin_PortToSourceInput(TVIN_PORT_HDMI0); |
97 | break; |
98 | } |
99 | } |
100 | |
101 | int CSourceConnectDetect::GetSourceConnectStatus(tv_source_input_t source_input) |
102 | { |
103 | int PlugStatus = -1; |
104 | int hdmi_status = 0; |
105 | int source = -1; |
106 | int HdmiDetectStatusBit = SourceInputMaptoChipHdmiPort((tv_source_input_t)source_input); |
107 | switch (source_input) { |
108 | case SOURCE_AV2: |
109 | case SOURCE_AV1: { |
110 | struct report_data_s status[2]; |
111 | mAvinDetectFile.readFile((void *)(&status), sizeof(struct report_data_s) * 2); |
112 | for (int i = 0; i < 2; i++) { |
113 | if (status[i].channel == AVIN_CHANNEL1) { |
114 | source = SOURCE_AV1; |
115 | } else if (status[i].channel == AVIN_CHANNEL2) { |
116 | source = SOURCE_AV2; |
117 | } |
118 | |
119 | if (source == source_input) { |
120 | if (status[i].status == AVIN_STATUS_IN) { |
121 | PlugStatus = CC_SOURCE_PLUG_IN; |
122 | } else { |
123 | PlugStatus = CC_SOURCE_PLUG_OUT; |
124 | } |
125 | break; |
126 | } |
127 | m_avin_status[i] = status[i]; |
128 | }//end for |
129 | |
130 | break; |
131 | } |
132 | case SOURCE_HDMI1: |
133 | case SOURCE_HDMI2: |
134 | case SOURCE_HDMI3: { |
135 | mHdmiDetectFile.readFile((void *)(&hdmi_status), sizeof(int)); |
136 | if ((hdmi_status & HdmiDetectStatusBit) == HdmiDetectStatusBit) { |
137 | PlugStatus = CC_SOURCE_PLUG_IN; |
138 | } else { |
139 | PlugStatus = CC_SOURCE_PLUG_OUT; |
140 | } |
141 | m_hdmi_status = hdmi_status; |
142 | break; |
143 | } |
144 | default: |
145 | LOGD("GetSourceConnectStatus not support source!!!!!!!!!!!!!!!1"); |
146 | break; |
147 | } |
148 | |
149 | return PlugStatus; |
150 | } |
151 | |
152 | bool CSourceConnectDetect::threadLoop() |
153 | { |
154 | if ( mpObserver == NULL ) { |
155 | return false; |
156 | } |
157 | |
158 | LOGD("%s, entering...\n", "TV"); |
159 | |
160 | prctl(PR_SET_NAME, (unsigned long)"CSourceConnectDetect thread loop"); |
161 | //init status |
162 | mHdmiDetectFile.readFile((void *)(&m_hdmi_status), sizeof(int)); |
163 | mAvinDetectFile.readFile((void *)(&m_avin_status), sizeof(struct report_data_s) * 2); |
164 | LOGD("CSourceConnectDetect Loop, get init hdmi = 0x%x avin[0].status = %d, avin[1].status = %d", m_hdmi_status, m_avin_status[0].status, m_avin_status[1].status); |
165 | |
166 | while (!exitPending()) { //requietexit() or requietexitWait() not call |
167 | int num = mEpoll.wait(); |
168 | for (int i = 0; i < num; ++i) { |
169 | int fd = (mEpoll)[i].data.fd; |
170 | /** |
171 | * EPOLLIN event |
172 | */ |
173 | if ((mEpoll)[i].events & EPOLLIN) { |
174 | if (fd == mAvinDetectFile.getFd()) {//avin |
175 | struct report_data_s status[2]; |
176 | mAvinDetectFile.readFile((void *)(&status), sizeof(struct report_data_s) * 2); |
177 | for (int i = 0; i < 2; i++) { |
178 | int source = -1, plug = -1; |
179 | if (/*status[i].channel == m_avin_status[i].channel &&*/ status[i].status != m_avin_status[i].status) { |
180 | //LOGD("status[i].status != m_avin_status[i].status"); |
181 | if (status[i].status == AVIN_STATUS_IN) { |
182 | plug = CC_SOURCE_PLUG_IN; |
183 | } else { |
184 | plug = CC_SOURCE_PLUG_OUT; |
185 | } |
186 | |
187 | if (status[i].channel == AVIN_CHANNEL1) { |
188 | source = SOURCE_AV1; |
189 | } else if (status[i].channel == AVIN_CHANNEL2) { |
190 | source = SOURCE_AV2; |
191 | } |
192 | |
193 | if (mpObserver != NULL) { |
194 | mpObserver->onSourceConnect(source, plug); |
195 | } |
196 | }//not equal |
197 | m_avin_status[i] = status[i]; |
198 | } |
199 | } else if (fd == mHdmiDetectFile.getFd()) { //hdmi |
200 | int hdmi_status = 0; |
201 | mHdmiDetectFile.readFile((void *)(&hdmi_status), sizeof(int)); |
202 | int source = -1, plug = -1; |
203 | if ((hdmi_status & HDMI_DETECT_STATUS_BIT_A) != (m_hdmi_status & HDMI_DETECT_STATUS_BIT_A) ) { |
204 | if ((hdmi_status & HDMI_DETECT_STATUS_BIT_A) == HDMI_DETECT_STATUS_BIT_A) { |
205 | source = ChipHdmiPortMaptoSourceInput(HDMI_DETECT_STATUS_BIT_A); |
206 | plug = CC_SOURCE_PLUG_IN; |
207 | } else { |
208 | source = ChipHdmiPortMaptoSourceInput(HDMI_DETECT_STATUS_BIT_A);; |
209 | plug = CC_SOURCE_PLUG_OUT; |
210 | } |
211 | mpObserver->onSourceConnect(source, plug); |
212 | } |
213 | |
214 | if ((hdmi_status & HDMI_DETECT_STATUS_BIT_B) != (m_hdmi_status & HDMI_DETECT_STATUS_BIT_B) ) { |
215 | if ((hdmi_status & HDMI_DETECT_STATUS_BIT_B) == HDMI_DETECT_STATUS_BIT_B) { |
216 | source = ChipHdmiPortMaptoSourceInput(HDMI_DETECT_STATUS_BIT_B); |
217 | plug = CC_SOURCE_PLUG_IN; |
218 | } else { |
219 | source = ChipHdmiPortMaptoSourceInput(HDMI_DETECT_STATUS_BIT_B);; |
220 | plug = CC_SOURCE_PLUG_OUT; |
221 | } |
222 | mpObserver->onSourceConnect(source, plug); |
223 | } |
224 | |
225 | if ((hdmi_status & HDMI_DETECT_STATUS_BIT_C) != (m_hdmi_status & HDMI_DETECT_STATUS_BIT_C) ) { |
226 | if ((hdmi_status & HDMI_DETECT_STATUS_BIT_C) == HDMI_DETECT_STATUS_BIT_C) { |
227 | source = ChipHdmiPortMaptoSourceInput(HDMI_DETECT_STATUS_BIT_C); |
228 | plug = CC_SOURCE_PLUG_IN; |
229 | } else { |
230 | source = ChipHdmiPortMaptoSourceInput(HDMI_DETECT_STATUS_BIT_C);; |
231 | plug = CC_SOURCE_PLUG_OUT; |
232 | } |
233 | mpObserver->onSourceConnect(source, plug); |
234 | } |
235 | |
236 | if ((hdmi_status & HDMI_DETECT_STATUS_BIT_D) != (m_hdmi_status & HDMI_DETECT_STATUS_BIT_D) ) { |
237 | if ((hdmi_status & HDMI_DETECT_STATUS_BIT_D) == HDMI_DETECT_STATUS_BIT_D) { |
238 | source = ChipHdmiPortMaptoSourceInput(HDMI_DETECT_STATUS_BIT_D); |
239 | plug = CC_SOURCE_PLUG_IN; |
240 | } else { |
241 | source = ChipHdmiPortMaptoSourceInput(HDMI_DETECT_STATUS_BIT_D);; |
242 | plug = CC_SOURCE_PLUG_OUT; |
243 | } |
244 | mpObserver->onSourceConnect(source, plug); |
245 | } |
246 | m_hdmi_status = hdmi_status; |
247 | } else if (fd == mVppPollFile.getFd()) { //vframe size change |
248 | mpObserver->onVframeSizeChange(); |
249 | } |
250 | /** |
251 | * EPOLLOUT event |
252 | */ |
253 | if ((mEpoll)[i].events & EPOLLOUT) { |
254 | |
255 | } |
256 | } |
257 | } |
258 | }//exit |
259 | |
260 | LOGD("%s, exiting...\n", "CSourceConnectDetect"); |
261 | //return true, run again, return false,not run. |
262 | return false; |
263 | } |
264 |