1

LibCEC on Raspberry Pi

 2 years ago
source link: https://oopsmonk.github.io/posts/2015-11-03-libcec-on-raspberry-pi/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

LibCEC on Raspberry Pi

November 3, 2015 · 11 min · oopsmonk | Suggest Changes

Install requirements#

sudo apt-get install build-essential autoconf liblockdev1-dev \
libudev-dev git libtool pkg-config cmake libxrandr-dev -y  

Python and Swing support (Optional)

sudo apt-get install python-dev swig -y  

Checkout and build libcec source code#

The current version is libcec-3.0.1, but I got an error as follows:

make[2]: *** No rule to make target '1', needed by 'src/libcec/libcec.so.3.0.1'.  Stop.  

Using libcec-3.0.0 instead of libcec-3.0.1, it’s work properly.

git clone https://github.com/Pulse-Eight/libcec.git  
cd libcec
git checkout libcec-3.0.0 -b cec3.0.0  

Checkout platform source

cd libcec/src/platform  
git clone https://github.com/Pulse-Eight/platform.git .
mkdir build && cd $_ 

Build platform

cmake -DCMAKE_CXX_COMPILER=g++-4.8 ..
make && sudo make install  

Modify ~/libcec/src/libcec/cmake/CheckPlatformSupport.cmake

diff --git a/src/libcec/cmake/CheckPlatformSupport.cmake b/src/libcec/cmake/CheckPlatformSupport.cmake
index 828cdb2..b1ec498 100644
--- a/src/libcec/cmake/CheckPlatformSupport.cmake
+++ b/src/libcec/cmake/CheckPlatformSupport.cmake
@@ -75,9 +75,10 @@ else()
   endif()
 
   # raspberry pi
-  check_library_exists(bcm_host vchi_initialise "" HAVE_RPI_API)
+  check_library_exists(bcm_host bcm_host_init "" HAVE_RPI_API)
   if (HAVE_RPI_API)
     set(LIB_INFO "${LIB_INFO}, 'RPi'")
+    include_directories(/opt/vc/include /opt/vc/include/interface/vcos/pthreads /opt/vc/include/interface/vmcs_host/linux)
     list(APPEND CMAKE_REQUIRED_LIBRARIES "vcos")
     list(APPEND CMAKE_REQUIRED_LIBRARIES "vchiq_arm")
     set(CEC_SOURCES_ADAPTER_RPI adapter/RPi/RPiCECAdapterDetection.cpp

Build libcec

cd ~/libcec  
mkdir build && cd $_  
cmake -DBUILD_SHARED_LIBS=1 -DCMAKE_CXX_COMPILER=g++-4.8 ..  

The configuration on my pi

-- Configured features:
-- Pulse-Eight CEC Adapter:                yes
-- Pulse-Eight CEC Adapter detection:      yes
-- lockdev support:                        yes
-- xrandr support:                         yes
-- Raspberry Pi support:                   no
-- TDA995x support:                        no
-- Exynos support:                         no
-- Python support:                         version 2.7.3 (2.7)
-- lib info: compiled on Linux-3.18.11+, features: P8_USB, P8_detect, randr
-- Configuring done
-- Generating done

Make and install library

make && sudo make install 

Test libcec#

Testing Samsung UA46B6000VM
You can test via cec-client or libcec/src/pyCecClient/pyCecClient.py(if you built with python support). h for help and q for exit cec-client.
As a playback device:

oopsmonk@raspberrypi ~ $ sudo cec-client -t p
[sudo] password for oopsmonk: 
== using device type 'playback device'
CEC Parser created - libCEC version 3.0.0
no serial port given. trying autodetect: 
 path:     Raspberry Pi
 com port: RPI

opening a connection to the CEC adapter...
DEBUG:   [             102]     Broadcast (F): osd name set to 'Broadcast'
DEBUG:   [             104]     InitHostCEC - vchiq_initialise succeeded
DEBUG:   [             105]     InitHostCEC - vchi_initialise succeeded
DEBUG:   [             107]     InitHostCEC - vchi_connect succeeded
DEBUG:   [             109]     logical address changed to Free use (e)
DEBUG:   [             111]     Open - vc_cec initialised
NOTICE:  [             112]     connection opened
DEBUG:   [             114]     << Broadcast (F) -> TV (0): POLL
DEBUG:   [             114]     initiator 'Broadcast' is not supported by the CEC adapter. using 'Free use' instead
TRAFFIC: [             115]     << e0
DEBUG:   [             119]     processor thread started
DEBUG:   [             176]     >> POLL sent
DEBUG:   [             176]     TV (0): device status changed into 'present'
DEBUG:   [             176]     << requesting vendor ID of 'TV' (0)
TRAFFIC: [             177]     << e0:8c
TRAFFIC: [             369]     >> 0f:87:00:00:f0
DEBUG:   [             369]     TV (0): vendor = Samsung (0000f0)
DEBUG:   [             371]     >> TV (0) -> Broadcast (F): device vendor id (87)
DEBUG:   [             372]     expected response received (87: device vendor id)
DEBUG:   [             373]     replacing the command handler for device 'TV' (0)
NOTICE:  [             373]     registering new CEC client - v3.0.0
DEBUG:   [             373]     detecting logical address for type 'playback device'
DEBUG:   [             373]     trying logical address 'Playback 1'
DEBUG:   [             373]     << Playback 1 (4) -> Playback 1 (4): POLL
TRAFFIC: [             374]     << 44
TRAFFIC: [             464]     << 44
DEBUG:   [             555]     >> POLL not sent
DEBUG:   [             555]     using logical address 'Playback 1'
DEBUG:   [             555]     Playback 1 (4): device status changed into 'handled by libCEC'
DEBUG:   [             555]     Playback 1 (4): power status changed from 'unknown' to 'on'
DEBUG:   [             555]     Playback 1 (4): vendor = Pulse Eight (001582)
DEBUG:   [             556]     Playback 1 (4): CEC version 1.4
DEBUG:   [             556]     AllocateLogicalAddresses - device '0', type 'playback device', LA '4'
DEBUG:   [             557]     logical address changed to Playback 1 (4)
DEBUG:   [             560]     Playback 1 (4): osd name set to 'CECTester'
DEBUG:   [             560]     Playback 1 (4): menu language set to 'eng'
DEBUG:   [             564]     GetPhysicalAddress - physical address = 1000
DEBUG:   [             565]     AutodetectPhysicalAddress - autodetected physical address '1000'
DEBUG:   [             565]     Playback 1 (4): physical address changed from ffff to 1000
DEBUG:   [             565]     << Playback 1 (4) -> broadcast (F): physical adddress 1000
TRAFFIC: [             565]     << 4f:84:10:00:04
NOTICE:  [             716]     CEC client registered: libCEC version = 3.0.0, client version = 3.0.0, firmware version = 1, logical address(es) = Playback 1 (4) , physical address: 1.0.0.0, compiled on Linux-3.18.11+, features: P8_USB, P8_detect, randr, 'RPi'
DEBUG:   [             717]     << Playback 1 (4) -> TV (0): OSD name 'CECTester'
TRAFFIC: [             717]     << 40:47:43:45:43:54:65:73:74:65:72
DEBUG:   [            1018]     << requesting power status of 'TV' (0)
TRAFFIC: [            1018]     << 40:8f
waiting for input
TRAFFIC: [            1162]     >> 04:90:00
DEBUG:   [            1162]     TV (0): power status changed from 'unknown' to 'on'
DEBUG:   [            1163]     expected response received (90: report power status)
DEBUG:   [            1165]     >> TV (0) -> Playback 1 (4): report power status (90)

Get CEC version

ver 0
DEBUG:   [          209560]     << requesting CEC version of 'TV' (0)
TRAFFIC: [          209561]     << 40:9f
TRAFFIC: [          209718]     >> 04:9e:04
DEBUG:   [          209718]     TV (0): CEC version 1.3a
DEBUG:   [          209720]     >> TV (0) -> Playback 1 (4): cec version (9E)
CEC version 1.3a
DEBUG:   [          209723]     expected response received (9E: cec version)

Set inactive source

is
DEBUG:   [          281092]     marking Playback 1 (4) as inactive source
NOTICE:  [          281094]     >> source deactivated: Playback 1 (4)
NOTICE:  [          281095]     << Playback 1 (4) -> broadcast (F): inactive source
TRAFFIC: [          281097]     << 40:9d:10:00
TRAFFIC: [          283632]     >> 0f:82:00:00
DEBUG:   [          283632]     making TV (0) the active source
DEBUG:   [          283635]     >> TV (0) -> Broadcast (F): active source (82)
TRAFFIC: [          283850]     >> 0f:80:10:00:00:00
DEBUG:   [          283852]     >> TV (0) -> Broadcast (F): routing change (80)

Set active source

as
DEBUG:   [          288309]     making Playback 1 (4) the active source
DEBUG:   [          288310]     marking TV (0) as inactive source
NOTICE:  [          288312]     >> source activated: Playback 1 (4)
DEBUG:   [          288314]     sending active source message for 'Playback 1'
NOTICE:  [          288315]     << powering on 'TV' (0)
TRAFFIC: [          288317]     << 40:04
NOTICE:  [          288379]     << Playback 1 (4) -> broadcast (F): active source (1000)
TRAFFIC: [          288381]     << 4f:82:10:00
DEBUG:   [          288503]     << Playback 1 (4) -> TV (0): menu state 'activated'
TRAFFIC: [          288505]     << 40:8e:00
TRAFFIC: [          288675]     >> 04:8d:02
DEBUG:   [          288675]     << Playback 1 (4) -> TV (0): menu state 'activated'
TRAFFIC: [          288675]     << 40:8e:00
DEBUG:   [          288677]     >> TV (0) -> Playback 1 (4): menu request (8D)
TRAFFIC: [          288853]     >> 04:1a:01
DEBUG:   [          288853]     << Playback 1 (4) -> TV (0): deck status 'stop'
TRAFFIC: [          288853]     << 40:1b:1a
DEBUG:   [          288855]     >> TV (0) -> Playback 1 (4): give deck status (1A)

Emit Standby command to TV

standby 0
NOTICE:  [           40210]     << putting 'TV' (0) in standby mode
TRAFFIC: [           40212]     << 40:36
TRAFFIC: [           40577]     >> 0f:36
DEBUG:   [           40577]     TV (0): power status changed from 'on' to 'standby'
DEBUG:   [           40579]     >> TV (0) -> Broadcast (F): standby (36)

Power on TV

on 0
NOTICE:  [           57151]     << powering on 'TV' (0)
TRAFFIC: [           57153]     << 40:04
DEBUG:   [           57215]     TV (0): power status changed from 'standby' to 'in transition from standby to on'
DEBUG:   [           63175]     GetPhysicalAddress - physical address = 1000
NOTICE:  [           63176]     physical address changed to 1000
DEBUG:   [           63176]     physical address unchanged (1000)
TRAFFIC: [           70645]     >> 0f:80:00:00:10:00
DEBUG:   [           70646]     TV (0): power status changed from 'in transition from standby to on' to 'on'
DEBUG:   [           70646]     making Playback 1 (4) the active source
NOTICE:  [           70646]     >> source activated: Playback 1 (4)
DEBUG:   [           70646]     sending active source message for 'Playback 1'
NOTICE:  [           70646]     << powering on 'TV' (0)
TRAFFIC: [           70647]     << 40:04
DEBUG:   [           70648]     >> TV (0) -> Broadcast (F): routing change (80)
NOTICE:  [           70737]     << Playback 1 (4) -> broadcast (F): active source (1000)
TRAFFIC: [           70738]     << 4f:82:10:00
DEBUG:   [           70889]     << Playback 1 (4) -> TV (0): menu state 'activated'
TRAFFIC: [           70889]     << 40:8e:00
TRAFFIC: [           71160]     >> 0f:85
DEBUG:   [           71160]     >> 0 requests active source
NOTICE:  [           71161]     << Playback 1 (4) -> broadcast (F): active source (1000)
TRAFFIC: [           71161]     << 4f:82:10:00
DEBUG:   [           71162]     >> TV (0) -> Broadcast (F): request active source (85)
TRAFFIC: [           71402]     >> 0f:80:00:00:10:00
DEBUG:   [           71403]     Playback 1 (4) was already marked as active source
NOTICE:  [           71403]     >> source activated: Playback 1 (4)
DEBUG:   [           71403]     sending active source message for 'Playback 1'
NOTICE:  [           71403]     << powering on 'TV' (0)
TRAFFIC: [           71403]     << 40:04
DEBUG:   [           71405]     >> TV (0) -> Broadcast (F): routing change (80)
NOTICE:  [           71554]     << Playback 1 (4) -> broadcast (F): active source (1000)
TRAFFIC: [           71555]     << 4f:82:10:00
DEBUG:   [           71765]     << Playback 1 (4) -> TV (0): menu state 'activated'
TRAFFIC: [           71766]     << 40:8e:00
TRAFFIC: [           71947]     >> 0f:32:65:6e:67
DEBUG:   [           71947]     TV (0): menu language set to 'eng'
TRAFFIC: [           71948]     >> 04:8d:02
DEBUG:   [           71948]     << Playback 1 (4) -> TV (0): menu state 'activated'
TRAFFIC: [           71948]     << 40:8e:00
DEBUG:   [           71950]     >> TV (0) -> Broadcast (F): set menu language (32)
DEBUG:   [           71952]     >> TV (0) -> Playback 1 (4): menu request (8D)
TRAFFIC: [           72129]     >> 04:1a:01
DEBUG:   [           72129]     << Playback 1 (4) -> TV (0): deck status 'stop'
TRAFFIC: [           72129]     << 40:1b:1a
DEBUG:   [           72132]     >> TV (0) -> Playback 1 (4): give deck status (1A)
TRAFFIC: [           72371]     >> 04:8d:02
DEBUG:   [           72371]     << Playback 1 (4) -> TV (0): menu state 'activated'
TRAFFIC: [           72371]     << 40:8e:00
DEBUG:   [           72373]     >> TV (0) -> Playback 1 (4): menu request (8D)
TRAFFIC: [           72642]     >> 04:8d:02
DEBUG:   [           72643]     << Playback 1 (4) -> TV (0): menu state 'activated'
TRAFFIC: [           72643]     << 40:8e:00
DEBUG:   [           72645]     >> TV (0) -> Playback 1 (4): menu request (8D)
TRAFFIC: [           75054]     >> 04:8c
DEBUG:   [           75055]     << Playback 1 (4) -> TV (0): vendor id Pulse Eight (1582)
TRAFFIC: [           75055]     << 4f:87:00:15:82
DEBUG:   [           75057]     >> TV (0) -> Playback 1 (4): give device vendor id (8C)
TRAFFIC: [           75275]     >> 04:46
DEBUG:   [           75276]     << Playback 1 (4) -> TV (0): OSD name 'CECTester'
TRAFFIC: [           75276]     << 40:47:43:45:43:54:65:73:74:65:72
DEBUG:   [           75278]     >> TV (0) -> Playback 1 (4): give osd name (46)
TRAFFIC: [           75744]     >> 04:a0:00:00:f0:23
TRAFFIC: [           75745]     << 40:a0:00:00:f0:24:00:80
DEBUG:   [           75746]     >> TV (0) -> Playback 1 (4): vendor command with id (A0)
TRAFFIC: [           76037]     >> 04:9f
DEBUG:   [           76037]     << Playback 1 (4) -> TV (0): cec version 1.4
TRAFFIC: [           76037]     << 40:9e:05
DEBUG:   [           76039]     >> TV (0) -> Playback 1 (4): get cec version (9F)
TRAFFIC: [           76214]     >> 0f:85
DEBUG:   [           76214]     >> 0 requests active source
NOTICE:  [           76214]     << Playback 1 (4) -> broadcast (F): active source (1000)
TRAFFIC: [           76214]     << 4f:82:10:00
DEBUG:   [           76216]     >> TV (0) -> Broadcast (F): request active source (85)
TRAFFIC: [           76417]     >> 04:8d:02
DEBUG:   [           76417]     << Playback 1 (4) -> TV (0): menu state 'activated'
TRAFFIC: [           76417]     << 40:8e:00
DEBUG:   [           76419]     >> TV (0) -> Playback 1 (4): menu request (8D)
TRAFFIC: [           76595]     >> 04:8d:02
DEBUG:   [           76595]     << Playback 1 (4) -> TV (0): menu state 'activated'
TRAFFIC: [           76595]     << 40:8e:00
DEBUG:   [           76597]     >> TV (0) -> Playback 1 (4): menu request (8D)
h

================================================================================
Available commands:

[tx] {bytes}              transfer bytes over the CEC line.
[txn] {bytes}             transfer bytes but don't wait for transmission ACK.
[on] {address}            power on the device with the given logical address.
[standby] {address}       put the device with the given address in standby mode.
[la] {logical address}    change the logical address of the CEC adapter.
[p] {device} {port}       change the HDMI port number of the CEC adapter.
[pa] {physical address}   change the physical address of the CEC adapter.
[as]                      make the CEC adapter the active source.
[is]                      mark the CEC adapter as inactive source.
[osd] {addr} {string}     set OSD message on the specified device.
[ver] {addr}              get the CEC version of the specified device.
[ven] {addr}              get the vendor ID of the specified device.
[lang] {addr}             get the menu language of the specified device.
[pow] {addr}              get the power status of the specified device.
[name] {addr}             get the OSD name of the specified device.
[poll] {addr}             poll the specified device.
[lad]                     lists active devices on the bus
[ad] {addr}               checks whether the specified device is active.
[at] {type}               checks whether the specified device type is active.
[sp] {addr}               makes the specified physical address active.
[spl] {addr}              makes the specified logical address active.
[volup]                   send a volume up command to the amp if present
[voldown]                 send a volume down command to the amp if present
[mute]                    send a mute/unmute command to the amp if present
[self]                    show the list of addresses controlled by libCEC
[scan]                    scan the CEC bus and display device info
[mon] {1|0}               enable or disable CEC bus monitoring.
[log] {1 - 31}            change the log level. see cectypes.h for values.
[ping]                    send a ping command to the CEC adapter.
[bl]                      to let the adapter enter the bootloader, to upgrade
                          the flash rom.
[r]                       reconnect to the CEC adapter.
[h] or [help]             show this help.
[q] or [quit]             to quit the CEC test client and switch off all
                          connected CEC devices.
================================================================================

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK