安卓 - 发送HDMI CEC指令到电视 - Minix - libCEC

15
我正在处理一个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

(注:dmesg是Linux和其他Unix系统上的命令,用于显示内核环缓冲区的信息)
<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控制器配合使用,或者如果构建了树莓派支持功能,则可以在树莓派上平稳运行,利用其集成的视频控制器。
如果它可以在树莓派上运行,那么我想它应该能够在Minix上运行。
cec-client是一个演示客户端,开发用于与串行接口通信,但实际上由于一些错误,它无法与/dev/input/event7通信。
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

据我所知,HDMI-CEC使用HDMI连接器的13号引脚进行串行通信协议,因此即使“cec-client”是一个演示客户端,它也必须能够正常工作!正如您所看到的,存在锁定设备或类似问题。
问题:
  • 是否可以使用Java通过Android发送CEC命令?
  • 如果不行,有人知道如何适配libCEC / cec-client以在Minix上工作吗?
如果Java方式不可行,则没有问题:我的应用程序使用Qt构建,实际上已经使用了几个本地共享库“.so”
任何人有提示吗?如何完成这个任务?

你对这个有什么进展?这是我很快要研究的一个项目。我已经成功地在嵌入式Linux上运行了它,但还没有在Android上运行。我简单地搜索了一下,找到了这个链接:http://0x1c3.blogspot.co.uk/2015/09/libcec-compilation-for-android-example.html - WLGfx
@Matt,你能帮我解决一下在Android中如何集成libCEC的问题吗? - PankajAndroid
@Matt,你找到通过Minix硬件控制电视的解决方案了吗? - Remco Beugels
今天我还没有找到任何解决方案! - Matt
@Matt兄弟,你找到任何解决方案了吗? - hio
@ParthPitroda,我已经停止寻找解决方案了。在这个现代时代,随着最近的Android发布,这不应该再是一个问题了。 - Matt
2个回答

3

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

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

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

我建议这作为一个可能的解决方案,因为它修复了其中一个问题: 修复 HDMI-CEC 多设备问题 这意味着该设备不仅是"从属"的,而且也是"主控"的(即可以向其他 HDMI 设备发送命令)。 请注意,正如链接中所述,它不适用于 Plus 版本。 祝好运!

1
谢谢你的建议,但是在将近三年的时间里,我没有找到任何解决这个问题的方法! - Matt

3

我对这个问题的看法:

第一章:同情心

我也经历了你经历的所有麻烦,特别是在处理libCEC方面,所以我想描述一下我唯一成功让连接HDMI电缆的Android电视盒子和电视之间有任何交互的方法。

第二章:慢火煮食

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

要获取响应,可以进行以下操作:

  1. 读取“注册表” cat /sys/class/cec/dump_reg

  2. 等待并在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-Maticamlogic上构建或阅读。

第三章:新的希望

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

如果有任何更新,将进行更新。


@Matt,您接受了这个答案作为解决方案,那么它对您有用吗? - Malo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接