Android - 将 HDMI CEC 命令发送到电视 - minix - libCEC

Posted

技术标签:

【中文标题】Android - 将 HDMI CEC 命令发送到电视 - minix - libCEC【英文标题】:Android - send HDMI CEC commands to TV - minix - libCEC 【发布时间】:2015-06-22 14:20:10 【问题描述】:

我正在开发 Minix NEO X8-H(android 媒体中心,4.4.2),我需要向电视发送 HDMI-CEC 命令:当我的应用接到电话时,我想自动将电视源更改为Minix hdmi 源代码。

实际上 Minix 提供了一些启用 HDMI-CEC 的选项,据报道媒体中心软件 XBMC 支持 CEC。但我猜只有在“接收模式”下:用户可以使用电视遥控器命令 Android 设备。我想以相反的方式工作。我浏览了 XBMC 的源代码,发现了非常有趣的代码,但不知道它是否对我有用。

我找到了获得 HDMI-CEC 输入命令的串行设备

/dev/input/event7

内核引用位于:“/sys/devices/virtual/input/input7/”

# cat /sys/devices/virtual/input/input7/name
cec_input

这是 dmesg 日志的一部分:

http://pastebin.com/raw.php?i=A5dE3qLu

<5>[    0.000000@0] Kernel command line: init=/init console=ttyS0,115200n8 no_console_suspend storage=5 cvbsdrv=0 vdaccfg=0xa007 logo=osd1,loaded,0x15100000,4k2ksmpte,full hdmimode=4k2ksmpte cvbsmode=576cvbs androidboot.firstboot=0 hdmitx=cec0
<4>[    0.000000@0] kernel get hdmimode form uboot is 4k2ksmpte
<4>[    0.000000@0] hdmitx: cec: Function List: disable, , , 
<4>[    0.000000@0] hdmitx: cec: HDMI aml_read_reg32(P_AO_DEBUG_REG0):0x0
<4>[    0.000000@0] hdmitx: cec: HDMI hdmi_cec_func_config:0x0
<4>[    1.392440@1] hdmitx: cec: CEC not ready
<4>[    4.872752@0] hdmitx: cec: CEC init
<4>[    4.876194@1] hdmitx: cec: CEC task process
<4>[    4.876398@0] hdmitx: cec: hdmitx_device->cec_init_ready:0x1

这证明了 HDMI-CEC 内置支持的有效存在。

我找到了libCEC,并设法使用 Android NDK 工具链对其进行了交叉编译,并且能够将“libcec.so”和演示客户端二进制文件“cec-client”安装到 Minix 上。

这些是构建选项:

asd@vm-ubuntu:~/Desktop/libcec/libcec-master/build$ cmake ..
-- Could NOT find PythonLibs (missing:  PYTHON_LIBRARIES PYTHON_INCLUDE_DIRS)
-- Could NOT find PythonLibs (missing:  PYTHON_LIBRARIES PYTHON_INCLUDE_DIRS)
-- Could NOT find PythonLibs (missing:  PYTHON_LIBRARIES PYTHON_INCLUDE_DIRS)
-- Could NOT find PythonLibs (missing:  PYTHON_LIBRARIES PYTHON_INCLUDE_DIRS)
-- Could NOT find SWIG (missing:  SWIG_EXECUTABLE SWIG_DIR)
-- Configured features:
-- Pulse-Eight CEC Adapter:                no
-- Pulse-Eight CEC Adapter detection:      no
-- lockdev support:                        no
-- xrandr support:                         no
-- Raspberry Pi support:                   no
-- TDA995x support:                        no
-- Exynos support:                         no
-- Python support:                         no
-- lib info: compiled on Linux-3.13.0-35-generic, features: P8_USB
-- Configuring done
-- Generating done
-- Build files have been written to: /home/asd/Desktop/libcec/libcec-master/build

我知道 libcec 可以与外部 hdmi-cec 控制器配合使用,或者,如果使用 Raspberry 支持功能构建,它可以使用其集成的视频控制器在 raspi 上流畅运行。

如果它可以在 raspi 上运行,我猜它必须能够在 Minix 上运行。

cec-client 是一个演示客户端,开发用于与串行接口通信,但由于一些错误,它实际上无法与 /dev/input/evet7 通信:

root@NEO-X8:/data # cec-client -t p -p 4 /dev/input/event7                    
== using device type 'playback device'
using HDMI port '4'
CEC Parser created - libCEC version 3.0.0
opening a connection to the CEC adapter...
DEBUG:   [               7]     Broadcast (F): osd name set to 'Broadcast'
ERROR:   [            3520]     error opening serial port '/dev/input/event7': Invalid argument
ERROR:   [            3521]     could not open a connection (try 1)
ERROR:   [            6355]     error opening serial port '/dev/input/event7': Too many open files
ERROR:   [            6355]     could not open a connection (try 2)
ERROR:   [            8243]     error opening serial port '/dev/input/event7': Too many open files
ERROR:   [            8243]     could not open a connection (try 3)
ERROR:   [            9501]     error opening serial port '/dev/input/event7': Too many open files
ERROR:   [            9501]     could not open a connection (try 4)
unable to open the device on port /dev/input/event7
NOTICE:  [           10506]     connection opened

但是 AFAIK Hdmi-CEC 使用串行通信协议,使用 HDMI 连接器的第 13 针,因此即使“cec-client”是演示客户端,它也必须能够正常工作!如您所见,锁定设备或类似问题存在问题。

问题:

是否可以通过 Android 使用 Java 发送 CEC 命令? 如果没有,有人知道如何调整 libCEC/cec-client 以在 Minix 上工作吗?

如果 Java 方式不可行,则没有问题:我自己的应用程序是使用 Qt 构建的,实际上我已经在使用几个本机共享库“.so”

有人有提示吗?如何做到这一点?

【问题讨论】:

你最近过得怎么样?对于我正在从事的项目,这是我必须尽快研究的事情。我已经设法让它与嵌入式 linux 一起工作,但还不能用于 Android。快速多管闲事,我发现了这个:0x1c3.blogspot.co.uk/2015/09/… @Matt 你能帮我看看你是如何在 Android 中集成 libCEC @Matt 你找到通过 Minix 硬件控制电视的解决方案了吗? 今天我没有找到任何解决方案! @Matt 兄弟你找到解决办法了吗! 【参考方案1】:

我在这个问题上的两分钱:

第一章:慈悲

我也遇到了你遇到的所有麻烦,尤其是在使用 libCEC 时,所以我想描述一下我在 Android 电视盒和通过 HDMI 电缆连接到它的电视之间进行任何交互的唯一方法。

第二章:低速烹饪

发送连接设备电源状态的请求 echo 0x40 0x8F &gt; /sys/class/cec/cmd

要获得响应,您可以:

    阅读“注册表” cat /sys/class/cec/dump_reg

    等待并在 logcat 中查找响应

// Example:
02-06 16:33:10.568  4012  4105 D CEC     : [cec_rx_loop]msg:04 90 00
02-06 16:33:10.570  4012  4105 D HdmiCecExtend: onCecMessageRx
02-06 16:33:10.657  4012  4012 W HDMI    : [1]:Unhandled cec command:<Report Power Status> src: 0, dst: 4, params: 00
02-06 16:33:10.762  4012  4104 D CEC     : [cec_send_message][4 -> 0]len:3, body:00 90 00 , result:success

幻数(代码)解释:

40 - Playback device #1
04 - TV device #1
On - 90 00
Off - 00 00 // in registry or no response at all in logcat

可以在Cec-O-Matic 或amlogic 上构造或读取其他可用代码。

第三章:新希望

我仍然必须尝试访问 Android 的 HdmiControlService,但我仍然不知道如何,可能是通过 Java 反射。您可以看到HdmiCecExtend: onCecMessageRx,因此该 API 在设备上可用,但您不能在 Android Studio 中使用它,据我所知,它仅适用于 Android TV 供应商。

如果有什么会更新。

【讨论】:

【参考方案2】:

首先,令人印象深刻的逆向工程工作!

其次,我面临着类似的问题(但使用的是非 Minix 产品)。您是否尝试过升级到较新的固件,例如这个:

http://minixforum.com/threads/x8-x8-plus-x8-h-official-firmware-004a-not-for-x8-h-plus.5567/

我建议这是一个可能的解决方案,因为它解决的问题之一是:

修复了 HDMI-CEC 多设备问题

这意味着设备不仅是“从”,而且是“主”(即可以向其他 hdmi 设备发送命令)。

请注意,如链接中所述,它不适用于 plus 版本。

祝你好运!

【讨论】:

感谢您的提示,但将近 3 年后我没有找到任何解决此问题的方法!

以上是关于Android - 将 HDMI CEC 命令发送到电视 - minix - libCEC的主要内容,如果未能解决你的问题,请参考以下文章

使用 HDMI CEC android 打开/关闭电视

7. HDMI接口

HDMI 接口及CEC信号

HDMI的CEC是如何控制外围互联设备的

HDMI CEC协议

HDMI的I2C和CEC冲突么