Android - 发送 HDMI CEC 命令到电视 - minix - libCEC
Android - send HDMI CEC commands to TV - minix - libCEC
我正在使用 Minix NEO X8-H(Android 媒体中心,4.4.2),我需要向电视发送 HDMI-CEC 命令:当我的应用程序接到电话时,我想自动将电视源更改为 Minix hdmi 源。
实际上Minix提供了一些启用HDMI-CEC的选项,据报道媒体中心软件XBMC支持CEC。但我猜只在 "receive mode" 中:用户可以使用电视遥控器命令 Android 设备。我想以相反的方式工作。我浏览了XBMC的源代码,发现了非常有趣的代码,但不知道它是否对我有用。
找到了获取HDMI-CEC输入命令的串口设备
/dev/input/event7
内核引用位于:“/sys/devices/virtual/input/input7/”
# cat /sys/devices/virtual/input/input7/name
cec_input
这是 dmesg 日志的一部分:
<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" 是一个演示客户端,它也必须能够正常工作!如您所见,锁定设备或类似问题时出现问题。
问题:
- 可以使用 Java 通过 Android 发送 CEC 命令吗?
- 如果没有,有人知道如何调整 libCEC/cec-client 以在 Minix 上工作吗?
如果 Java 方法不可行,则没有问题:我自己的应用程序是使用 Qt 构建的,实际上我已经在使用几个本机共享库“.so”
有人有提示吗?如何做到这一点?
首先,非常令人印象深刻的逆向工程工作!
其次,我面临着类似的问题(但不是 Minix 产品)。您是否尝试过升级到更新的固件,例如这个:
http://minixforum.com/threads/x8-x8-plus-x8-h-official-firmware-004a-not-for-x8-h-plus.5567/
我建议将此作为可能的解决方案,因为它解决的问题之一是:
修复了 HDMI-CEC 多设备问题
这意味着该设备不仅是 "slave",而且是 "master"(即可以向其他 hdmi 设备发送命令)。
请注意,如 link 中所述,它不适用于 plus 版本。
祝你好运!
我对这个问题的两分钱:
第一章:慈悲
我也遇到了你遇到的所有麻烦,尤其是 libCEC,所以我想描述一下我在 Android 电视盒和连接到它的电视之间进行任何交互的唯一方法使用 HDMI 电缆。
第二章:低温慢煮
发送连接设备电源状态的请求
echo 0x40 0x8F > /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 or amlogic 上构建或阅读其他可用代码。
第三章:新希望
我仍然需要尝试到达 Android 的 HdmiControlService,但我仍然不知道如何,可能是通过 Java 反思。你可以看到 HdmiCecExtend: onCecMessageRx
所以 API 在设备上可用,但你不能在 Android Studio 中使用它,据我所知,它只适用于 Android TV供应商。
有什么事情会更新。
我正在使用 Minix NEO X8-H(Android 媒体中心,4.4.2),我需要向电视发送 HDMI-CEC 命令:当我的应用程序接到电话时,我想自动将电视源更改为 Minix hdmi 源。
实际上Minix提供了一些启用HDMI-CEC的选项,据报道媒体中心软件XBMC支持CEC。但我猜只在 "receive mode" 中:用户可以使用电视遥控器命令 Android 设备。我想以相反的方式工作。我浏览了XBMC的源代码,发现了非常有趣的代码,但不知道它是否对我有用。
找到了获取HDMI-CEC输入命令的串口设备
/dev/input/event7
内核引用位于:“/sys/devices/virtual/input/input7/”
# cat /sys/devices/virtual/input/input7/name
cec_input
这是 dmesg 日志的一部分:
<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" 是一个演示客户端,它也必须能够正常工作!如您所见,锁定设备或类似问题时出现问题。
问题:
- 可以使用 Java 通过 Android 发送 CEC 命令吗?
- 如果没有,有人知道如何调整 libCEC/cec-client 以在 Minix 上工作吗?
如果 Java 方法不可行,则没有问题:我自己的应用程序是使用 Qt 构建的,实际上我已经在使用几个本机共享库“.so”
有人有提示吗?如何做到这一点?
首先,非常令人印象深刻的逆向工程工作!
其次,我面临着类似的问题(但不是 Minix 产品)。您是否尝试过升级到更新的固件,例如这个:
http://minixforum.com/threads/x8-x8-plus-x8-h-official-firmware-004a-not-for-x8-h-plus.5567/
我建议将此作为可能的解决方案,因为它解决的问题之一是:
修复了 HDMI-CEC 多设备问题
这意味着该设备不仅是 "slave",而且是 "master"(即可以向其他 hdmi 设备发送命令)。
请注意,如 link 中所述,它不适用于 plus 版本。
祝你好运!
我对这个问题的两分钱:
第一章:慈悲
我也遇到了你遇到的所有麻烦,尤其是 libCEC,所以我想描述一下我在 Android 电视盒和连接到它的电视之间进行任何交互的唯一方法使用 HDMI 电缆。
第二章:低温慢煮
发送连接设备电源状态的请求
echo 0x40 0x8F > /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 or amlogic 上构建或阅读其他可用代码。
第三章:新希望
我仍然需要尝试到达 Android 的 HdmiControlService,但我仍然不知道如何,可能是通过 Java 反思。你可以看到 HdmiCecExtend: onCecMessageRx
所以 API 在设备上可用,但你不能在 Android Studio 中使用它,据我所知,它只适用于 Android TV供应商。
有什么事情会更新。