1 /*
2 * Copyright (C) 2014 ASUSTek COMPUTER INC.
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17 #include <stdint.h>
18 #include <stdlib.h>
19 #include <unistd.h>
20 #include <sys/ioctl.h>
21 #include <sys/types.h>
22 #include <log/log.h>
23 #include <hardware/hdmi_cec.h>
24
25 extern struct hw_module_t HAL_MODULE_INFO_SYM;
26 static int (*hdmicec_open)(const struct hw_module_t *, const char *, struct hw_device_t **);
27
28 static struct hw_module_t *device;
29 static struct hw_module_t **device2 = &device;
30
main(int argc,char * argv[])31 int main(int argc, char* argv[])
32 {
33 struct hdmi_cec_device *cec_device;
34 int err, type = -1;
35
36 if (argc > 1)
37 type = atoi(argv[1]);
38
39 ALOGI("open hdmicec");
40 hdmicec_open = HAL_MODULE_INFO_SYM.methods->open;
41 err = (*hdmicec_open)(&HAL_MODULE_INFO_SYM, NULL, (struct hw_device_t **)device2);
42 if (!err) {
43 ALOGI("open success");
44 } else {
45 ALOGE("open fail");
46 }
47
48 cec_device = (struct hdmi_cec_device *)(*device2);
49 #if 0
50 if (type != -1) {
51 int fd;
52
53 ALOGI("0. test type change: %d\n", type);
54 fd = open("/dev/cec0", O_RDWR);
55 if (fd < 0) {
56 ALOGE("fail to open CEC device\n");
57 } else {
58 err = ioctl(fd, CEC_IOC_SET_DEV_TYPE, type);
59 if (!err) {
60 ALOGI("type change success\n");
61 } else {
62 ALOGE("type change fail\n");
63 }
64 close(fd);
65 }
66 }
67 #endif
68
69 ALOGI("1. test add logical address\n");
70 err = cec_device->add_logical_address(cec_device, CEC_ADDR_PLAYBACK_1);
71 if (!err) {
72 ALOGI("add logical address success\n");
73 } else {
74 ALOGE("add logical address fail\n");
75 }
76
77 ALOGI("2. test send cec message\n");
78 cec_message_t send_msg;
79
80 ALOGI("2.a header\n");
81 send_msg.initiator = CEC_ADDR_PLAYBACK_1;
82 send_msg.destination = CEC_ADDR_PLAYBACK_1;
83 send_msg.length = 0;
84
85 err = cec_device->send_message(cec_device, &send_msg);
86 ALOGI("send_message result= %d", err);
87
88 ALOGI("2.b header + opcode\n");
89 send_msg.initiator = CEC_ADDR_PLAYBACK_1;
90 send_msg.destination = CEC_ADDR_TV;
91 send_msg.length = 1;
92 send_msg.body[0] = CEC_MESSAGE_IMAGE_VIEW_ON;
93
94 err = cec_device->send_message(cec_device, &send_msg);
95 ALOGI("send_message result= %d", err);
96
97 ALOGI("2.c header + opcode + operands\n");
98 send_msg.initiator = CEC_ADDR_PLAYBACK_1;
99 send_msg.destination = CEC_ADDR_TV;
100 send_msg.length = 15; //max opcode + operands should be 15
101 send_msg.body[0] = CEC_MESSAGE_VENDOR_COMMAND;
102 for (size_t i = 1; i < send_msg.length; i++)
103 send_msg.body[i] = i;
104
105 err = cec_device->send_message(cec_device, &send_msg);
106 ALOGI("send_message result= %d", err);
107
108 ALOGI("3 check hdmi connect status\n");
109 err = cec_device->is_connected(cec_device, 1);
110 ALOGI("is connected= %d", err);
111
112 ALOGI("4 get hdmi physical address\n");
113 uint16_t addr;
114 err = cec_device->get_physical_address(cec_device, &addr);
115 ALOGI("addr= %d, err= %d", addr, err);
116
117 sleep(3);
118 ALOGI("close hdmicec");
119 cec_device->common.close((struct hw_device_t *)cec_device);
120
121 return 0;
122 }
123