Merge remote-tracking branch 'warped-rudi/cubox-stable' into development. Closes #50
authorLars Op den Kamp <lars@opdenkamp.eu>
Mon, 8 Oct 2012 18:24:03 +0000 (20:24 +0200)
committerLars Op den Kamp <lars@opdenkamp.eu>
Mon, 8 Oct 2012 18:24:03 +0000 (20:24 +0200)
1  2 
configure.ac
include/cectypes.h
src/lib/CECTypeUtils.h
src/lib/platform/posix/os-socket.h

diff --combined configure.ac
index 2962a1562b979c7c24706cbf6e5cb1a2ae0311c5,6206ce0574ed51b9973158dc6e476fb1154c5732..967699255c51c1085d056f5f7276cb4f5061b6dc
@@@ -1,10 -1,10 +1,10 @@@
  AC_PREREQ(2.59)
 -AC_INIT([libcec], [1:9:0], [http://libcec.pulse-eight.com/])
 +AC_INIT([libcec], [2:0:0], [http://libcec.pulse-eight.com/])
  AC_CONFIG_HEADERS([config.h])
  AH_TOP([#pragma once])
  
  AM_INIT_AUTOMAKE([foreign])
 -m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES])
 +m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])])
  
  AM_INIT_AUTOMAKE(AC_PACKAGE_NAME, AC_PACKAGE_VERSION)
  
@@@ -43,6 -43,20 +43,20 @@@ AC_ARG_ENABLE([optimisation]
    [use_optimisation=$enableval],
    [use_optimisation=yes])
  
+ ## CuBox support
+ AC_ARG_ENABLE([cubox],
+   [AS_HELP_STRING([--enable-cubox],
+   [enable support for the CuBox (default is no)])],
+   [use_tda995x=$enableval],
+   [use_tda995x=no])
+ ## Optional path to the tda995x dev toolkit
+ AC_ARG_WITH([tda995x-toolkit-path],
+   [AS_HELP_STRING([--with-tda995x-toolkit-path],
+     [location of the TDA995x driver toolkit (default is ./nxp_hdmi)])],
+   [TDA995X_CFLAGS="-I$withval/inc"],
+   [TDA995X_CFLAGS="-I\$(abs_top_srcdir)/nxp_hdmi/inc"])
  ## Raspberry Pi support
  AC_ARG_ENABLE([rpi],
    [AS_HELP_STRING([--enable-rpi],
@@@ -235,6 -249,18 +249,18 @@@ els
    features="$features\n  Raspberry Pi support :\t\tno"
  fi
  
+ ## mark CuBox support as available
+ if test "x$use_tda995x" != "xno"; then
+   AC_DEFINE([HAVE_TDA995X_API],[1],[Define to 1 to include CuBox support])
+   AM_CONDITIONAL(USE_TDA995X_API, true)
+   features="$features\n  CuBox support :\t\t\tyes"
+   LIB_INFO="$LIB_INFO 'CuBox'"
+   CPPFLAGS="$CPPFLAGS $TDA995X_CFLAGS"
+ else
+   AM_CONDITIONAL(USE_TDA995X_API, false)
+   features="$features\n  CuBox support :\t\t\tno"
+ fi
  ## check if our build system is complete
  AC_CHECK_HEADER(algorithm,,AC_MSG_ERROR($msg_required_header_missing))
  AC_CHECK_HEADER(ctype.h,,AC_MSG_ERROR($msg_required_header_missing))
  LIBS_LIBCEC="$LIBS"
  LIBS="$libs_client"
  
 -CXXFLAGS="$CXXFLAGS -fPIC -Wall -Wextra -Wno-missing-field-initializers"
 +CXXFLAGS="$CXXFLAGS -fPIC -Wall -Wextra -Werror -Wno-missing-field-initializers"
  
  if test "x$use_debug" = "xyes"; then
    CXXFLAGS="$CXXFLAGS -g"
 +  AC_DEFINE(CEC_DEBUGGING,"1", "generate libCEC debug output")
  fi
  
  if test "x$optimisation" = "xyes"; then
diff --combined include/cectypes.h
index 58b6ef4cc97bd0ff44df0d5d6bfcf6de9fee3605,a44bbeaaf3c3d033aceabe4abb5b79e01d74e4aa..2af86437c726152708000c6cb77b3b8422aa2d11
@@@ -61,251 -61,77 +61,262 @@@ extern "C" 
  namespace CEC {
  #endif
  
 -//default physical address 1.0.0.0, HDMI port 1
 +/*!
 + * default physical address 1.0.0.0, HDMI port 1
 + */
  #define CEC_DEFAULT_PHYSICAL_ADDRESS 0x1000
 +/*!
 + * default HDMI port to which the adapter is connected, port 1
 + */
  #define CEC_DEFAULT_HDMI_PORT        1
 +/*!
 + * default logical address of the device to which the adapter is connected, TV
 + */
  #define CEC_DEFAULT_BASE_DEVICE      0
 -#define MSGSTART                     0xFF
 -#define MSGEND                       0xFE
 -#define MSGESC                       0xFD
 -#define ESCOFFSET                    3
 +
 +/*!
 + * timeout in milliseconds to send a key release event after receiving a key press
 + */
  #define CEC_BUTTON_TIMEOUT           500
 +
 +/*!
 + * don't send the same key twice within this timeout in milliseconds
 + */
 +#define CEC_DOUBLE_TAP_TIMEOUT_MS    200
 +
 +/*!
 + * don't query the power state for the same device within this timeout in milliseconds
 + */
  #define CEC_POWER_STATE_REFRESH_TIME 30000
 +
 +/*!
 + * unknown firmware version value
 + */
  #define CEC_FW_VERSION_UNKNOWN       0xFFFF
 +
 +/*!
 + * unknown build date value
 + */
  #define CEC_FW_BUILD_UNKNOWN         0
 +
 +/*!
 + * maximum number of retries when opening a connection
 + */
  #define CEC_CONNECT_TRIES            3
  
 +/*!
 + * physical address of the TV
 + */
  #define CEC_PHYSICAL_ADDRESS_TV      0
 +
 +/*!
 + * minimum physical address for the adapter
 + */
  #define CEC_MIN_PHYSICAL_ADDRESS     0x1000
 +
 +/*!
 + * maximum physical address for the adapter
 + */
  #define CEC_MAX_PHYSICAL_ADDRESS     0xFFFE
 +
 +/*!
 + * invalid physical address value
 + */
  #define CEC_INVALID_PHYSICAL_ADDRESS 0xFFFF
  
 +/*!
 + * minimum vendor ID value
 + */
  #define CEC_MIN_VENDORID             1
 +
 +/*!
 + * maximum vendor ID value
 + */
  #define CEC_MAX_VENDORID             0xFFFFFE
 +
 +/*!
 + * invalid vendor ID value
 + */
  #define CEC_INVALID_VENDORID         0xFFFFFF
  
 +/*!
 + * minimum HDMI port number value
 + */
  #define CEC_MIN_HDMI_PORTNUMBER      1
 +
 +/*!
 + * maximum HDMI port number value
 + */
  #define CEC_MAX_HDMI_PORTNUMBER      15
 +
 +/*!
 + * invalid HDMI port number value
 + */
  #define CEC_HDMI_PORTNUMBER_NONE     0
  
 +/*!
 + * default value for settings "use tv menu language"
 + */
  #define CEC_DEFAULT_SETTING_USE_TV_MENU_LANGUAGE      1
 +
 +/*!
 + * default value for settings "activate source"
 + */
  #define CEC_DEFAULT_SETTING_ACTIVATE_SOURCE           1
 +
 +/*!
 + * default value for settings "power off on shutdown"
 + */
  #define CEC_DEFAULT_SETTING_POWER_OFF_SHUTDOWN        1
 +
 +/*!
 + * default value for settings "power off when activating the screensaver"
 + */
  #define CEC_DEFAULT_SETTING_POWER_OFF_SCREENSAVER     1
 +
 +/*!
 + * default value for settings "power off on standby"
 + */
  #define CEC_DEFAULT_SETTING_POWER_OFF_ON_STANDBY      1
 +
 +/*!
 + * default value for settings "shutdown on standby"
 + */
  #define CEC_DEFAULT_SETTING_SHUTDOWN_ON_STANDBY       0
 +
 +/*!
 + * default value for settings "send inactive source when stopping"
 + */
  #define CEC_DEFAULT_SETTING_SEND_INACTIVE_SOURCE      1
 +
 +/*!
 + * default value for settings "power off devices when going to standby"
 + */
  #define CEC_DEFAULT_SETTING_POWER_OFF_DEVICES_STANDBY 1
 +
 +/*!
 + * default value for settings "device menu language"
 + */
  #define CEC_DEFAULT_DEVICE_LANGUAGE                   "eng"
 +
 +/*!
 + * default value for settings "autodetect physical address"
 + */
  #define CEC_DEFAULT_SETTING_AUTODETECT_ADDRESS        0
 +
 +/*!
 + * default value for settings "get settings from ROM"
 + */
  #define CEC_DEFAULT_SETTING_GET_SETTINGS_FROM_ROM     0
 +
 +/*!
 + * default value for settings "libCEC CEC version"
 + */
  #define CEC_DEFAULT_SETTING_CEC_VERSION               0x05
  
 +/*!
 + * wait this amount of milliseconds before retrying to send a failed message
 + */
  #define CEC_DEFAULT_TRANSMIT_RETRY_WAIT 500
 +
 +/*!
 + * transmission fails when not acked within this amount of milliseconds after sending the initial packet
 + */
  #define CEC_DEFAULT_TRANSMIT_TIMEOUT    1000
 +
 +/*!
 + * wait this amount of milliseconds for an ack
 + */
  #define CEC_DEFAULT_TRANSMIT_WAIT       1000
 +
 +/*!
 + * default number of retries
 + */
  #define CEC_DEFAULT_TRANSMIT_RETRIES    1
  
 +/*!
 + * default connection timeout in milliseconds
 + */
  #define CEC_DEFAULT_CONNECT_TIMEOUT     10000
 +
 +/*!
 + * wait this amount of milliseconds before retrying when failing to connect
 + */
  #define CEC_DEFAULT_CONNECT_RETRY_WAIT  1000
 +
 +/*!
 + * default serial baudrate
 + */
  #define CEC_SERIAL_DEFAULT_BAUDRATE     38400
 +
 +/*!
 + * maximum time to wait when clearing input
 + */
  #define CEC_CLEAR_INPUT_DEFAULT_WAIT    1000
  
 +/*!
 + * wait this amount of milliseconds before retrying when libCEC failed to make itself the active source
 + */
  #define CEC_ACTIVE_SOURCE_SWITCH_RETRY_TIME_MS 5000
 +
 +/*!
 + * don't forward any power off command to the client application for this amount of milliseconds after sending a power off command
 + */
  #define CEC_FORWARD_STANDBY_MIN_INTERVAL 10000
  
 +/*!
 + * the virtual device path to use for the Raspberry Pi's CEC wire
 + */
  #define CEC_RPI_VIRTUAL_PATH           "Raspberry Pi"
 +
 +/*!
 + * the name of the virtual COM port to use for the Raspberry Pi's CEC wire
 + */
  #define CEC_RPI_VIRTUAL_COM            "RPI"
  
 -#define CEC_MIN_LIB_VERSION          1
 -#define CEC_LIB_VERSION_MAJOR        1
 -#define CEC_LIB_VERSION_MAJOR_STR    "1"
 -#define CEC_LIB_VERSION_MINOR        9
++/*!
++ * the path to use for the TDA995x's CEC wire
++ */
+ #define CEC_TDA995x_PATH              "/dev/hdmicec"
++
++/*!
++ * the name of the virtual COM port to use for the TDA995x's CEC wire
++ */
+ #define CEC_TDA995x_VIRTUAL_COM               "CuBox"
 +/*!
 + * Mimimum client version
 + */
 +#define CEC_MIN_LIB_VERSION          2
 +
 +/*!
 + * libCEC's major version number
 + */
 +#define CEC_LIB_VERSION_MAJOR        2
 +
 +/*!
 + * libCEC's major version number as string
 + */
 +#define CEC_LIB_VERSION_MAJOR_STR    "2"
 +
 +/*!
 + * libCEC's minor version number
 + */
 +#define CEC_LIB_VERSION_MINOR        0
 +
 +#define MSGSTART                     0xFF
 +#define MSGEND                       0xFE
 +#define MSGESC                       0xFD
 +#define ESCOFFSET                    3
 +
  typedef enum cec_abort_reason
  {
 -  CEC_ABORT_REASON_UNRECOGNIZED_OPCODE            = 0,
 -  CEC_ABORT_REASON_NOT_IN_CORRECT_MODE_TO_RESPOND = 1,
 -  CEC_ABORT_REASON_CANNOT_PROVIDE_SOURCE          = 2,
 -  CEC_ABORT_REASON_INVALID_OPERAND                = 3,
 -  CEC_ABORT_REASON_REFUSED                        = 4
 +  CEC_ABORT_REASON_UNRECOGNIZED_OPCODE            = 0,//!< CEC_ABORT_REASON_UNRECOGNIZED_OPCODE
 +  CEC_ABORT_REASON_NOT_IN_CORRECT_MODE_TO_RESPOND = 1,//!< CEC_ABORT_REASON_NOT_IN_CORRECT_MODE_TO_RESPOND
 +  CEC_ABORT_REASON_CANNOT_PROVIDE_SOURCE          = 2,//!< CEC_ABORT_REASON_CANNOT_PROVIDE_SOURCE
 +  CEC_ABORT_REASON_INVALID_OPERAND                = 3,//!< CEC_ABORT_REASON_INVALID_OPERAND
 +  CEC_ABORT_REASON_REFUSED                        = 4 //!< CEC_ABORT_REASON_REFUSED
  } cec_abort_reason;
  
  typedef enum cec_analogue_broadcast_type
@@@ -820,7 -646,6 +831,7 @@@ typedef enum cec_vendor_i
    CEC_VENDOR_SHARP     = 0x08001F,
    CEC_VENDOR_VIZIO     = 0x6B746D,
    CEC_VENDOR_BROADCOM  = 0x18C086,
 +  CEC_VENDOR_LOEWE     = 0x000982,
     
    CEC_VENDOR_UNKNOWN   = 0
  } cec_vendor_id;
@@@ -830,7 -655,8 +841,8 @@@ typedef enum cec_adapter_typ
    ADAPTERTYPE_UNKNOWN          = 0,
    ADAPTERTYPE_P8_EXTERNAL      = 0x1,
    ADAPTERTYPE_P8_DAUGHTERBOARD = 0x2,
-   ADAPTERTYPE_RPI              = 0x100
+   ADAPTERTYPE_RPI              = 0x100,
+   ADAPTERTYPE_TDA995x          = 0x200
  } cec_adapter_type;
  
  typedef struct cec_menu_language
@@@ -947,10 -773,11 +959,10 @@@ typedef struct cec_comman
    int32_t             transmit_timeout; /**< the timeout to use in ms */
  
  #ifdef __cplusplus
 -  // @todo re-add in v2.0 (breaks ABI)
 -  //cec_command(void)
 -  //{
 -  //  Clear();
 -  //}
 +  cec_command(void)
 +  {
 +    Clear();
 +  }
  
    cec_command &operator =(const struct cec_command &command)
    {
@@@ -1072,6 -899,18 +1084,6 @@@ typedef struct cec_device_type_lis
    cec_device_type types[5]; /**< the list of device types */
  
  #ifdef __cplusplus
 -  /*!
 -   * @deprecated Use Clear() instead.
 -   * @brief Clear this list.
 -   */
 -  void clear(void) { Clear(); }
 -  /*!
 -   * @deprecated Use Add() instead.
 -   * @brief Add a type to this list.
 -   * @param type The type to add.
 -   */
 -  void add(const cec_device_type type) { Add(type); }
 -
    /*!
     * @brief Clear this list.
     */
@@@ -1253,21 -1092,21 +1265,21 @@@ typedef enum libcec_parameter_typ
    CEC_PARAMETER_TYPE_UNKOWN
  } libcec_parameter_type;
  
 -struct libcec_parameter
 +typedef struct libcec_parameter
  {
    libcec_parameter_type paramType; /**< the type of this parameter */
    void*                 paramData; /**< the value of this parameter */
 -};
 +} libcec_parameter;
  
 -struct libcec_configuration;
 +typedef struct libcec_configuration libcec_configuration;
  
 -typedef int (CEC_CDECL* CBCecLogMessageType)(void *param, const cec_log_message &);
 -typedef int (CEC_CDECL* CBCecKeyPressType)(void *param, const cec_keypress &);
 -typedef int (CEC_CDECL* CBCecCommandType)(void *param, const cec_command &);
 -typedef int (CEC_CDECL* CBCecConfigurationChangedType)(void *param, const libcec_configuration &);
 -typedef int (CEC_CDECL* CBCecAlertType)(void *param, const libcec_alert, const libcec_parameter &);
 -typedef int (CEC_CDECL* CBCecMenuStateChangedType)(void *param, const cec_menu_state);
 -typedef void (CEC_CDECL* CBCecSourceActivatedType)(void *param, const cec_logical_address, const uint8_t);
 +typedef int (CEC_CDECL* CBCecLogMessageType)(void*, const cec_log_message);
 +typedef int (CEC_CDECL* CBCecKeyPressType)(void*, const cec_keypress);
 +typedef int (CEC_CDECL* CBCecCommandType)(void*, const cec_command);
 +typedef int (CEC_CDECL* CBCecConfigurationChangedType)(void*, const libcec_configuration);
 +typedef int (CEC_CDECL* CBCecAlertType)(void*, const libcec_alert, const libcec_parameter);
 +typedef int (CEC_CDECL* CBCecMenuStateChangedType)(void*, const cec_menu_state);
 +typedef void (CEC_CDECL* CBCecSourceActivatedType)(void*, const cec_logical_address, const uint8_t);
  
  typedef struct ICECCallbacks
  {
    CBCecSourceActivatedType CBCecSourceActivated;
  
  #ifdef __cplusplus
 -  // @todo re-add in v2.0 (breaks ABI)
 -  // ICECCallbacks(void) { Clear(); }
 -  //~ICECCallbacks(void) { Clear(); };
 +   ICECCallbacks(void) { Clear(); }
 +  ~ICECCallbacks(void) { Clear(); };
  
    void Clear(void)
    {
@@@ -1359,9 -1199,7 +1371,9 @@@ typedef enum cec_client_versio
    CEC_CLIENT_VERSION_1_8_0   = 0x1800,
    CEC_CLIENT_VERSION_1_8_1   = 0x1801,
    CEC_CLIENT_VERSION_1_8_2   = 0x1802,
 -  CEC_CLIENT_VERSION_1_9_0   = 0x1900
 +  CEC_CLIENT_VERSION_1_9_0   = 0x1900,
 +  CEC_CLIENT_VERSION_1_99_0  = 0x1990,
 +  CEC_CLIENT_VERSION_2_0_0   = 0x2000,
  } cec_client_version;
  
  typedef enum cec_server_version
    CEC_SERVER_VERSION_1_8_0   = 0x1800,
    CEC_SERVER_VERSION_1_8_1   = 0x1801,
    CEC_SERVER_VERSION_1_8_2   = 0x1802,
 -  CEC_SERVER_VERSION_1_9_0   = 0x1900
 +  CEC_SERVER_VERSION_1_9_0   = 0x1900,
 +  CEC_SERVER_VERSION_1_99_0  = 0x1990,
 +  CEC_SERVER_VERSION_2_0_0   = 0x2000,
  } cec_server_version;
  
 -typedef struct libcec_configuration
 +struct libcec_configuration
  {
    uint32_t              clientVersion;        /*!< the version of the client that is connecting */
 -  char                  strDeviceName[13];    /*!< how to name the device on the CEC bus */
 -  cec_device_type_list  deviceTypes;          /*!< the CEC device types to emulate */
 +  char                  strDeviceName[13];    /*!< the device name to use on the CEC bus */
 +  cec_device_type_list  deviceTypes;          /*!< the device type(s) to use on the CEC bus for libCEC */
    uint8_t               bAutodetectAddress;   /*!< (read only) set to 1 by libCEC when the physical address was autodetected */
 -  uint16_t              iPhysicalAddress;     /*!< the physical address of the CEC adapter. only used when bAutodetectAddress = 0 or when the adapter doesn't support autodetection */
 -  cec_logical_address   baseDevice;           /*!< the logical address of the device to which the adapter is connected. only used when iPhysicalAddress = 0 and bAutodetectAddress = 0 or when the adapter doesn't support autodetection */
 -  uint8_t               iHDMIPort;            /*!< the HDMI port to which the adapter is connected. only used when iPhysicalAddress = 0 and bAutodetectAddress = 0 or when the adapter doesn't support autodetection */
 +  uint16_t              iPhysicalAddress;     /*!< the physical address of the CEC adapter */
 +  cec_logical_address   baseDevice;           /*!< the logical address of the device to which the adapter is connected. only used when iPhysicalAddress = 0 or when the adapter doesn't support autodetection */
 +  uint8_t               iHDMIPort;            /*!< the HDMI port to which the adapter is connected. only used when iPhysicalAddress = 0 or when the adapter doesn't support autodetection */
    uint64_t              tvVendor;             /*!< override the vendor ID of the TV. leave this untouched to autodetect */
 -  cec_logical_addresses wakeDevices;          /*!< wake these CEC devices when initialising libCEC or when calling PowerOnDevices() without any parameter */
 -  cec_logical_addresses powerOffDevices;      /*!< power off these devices when calling StandbyDevices() without any parameter */
 +  cec_logical_addresses wakeDevices;          /*!< list of devices to wake when initialising libCEC or when calling PowerOnDevices() without any parameter. */
 +  cec_logical_addresses powerOffDevices;      /*!< list of devices to power off when calling StandbyDevices() without any parameter. */
  
    uint32_t              serverVersion;        /*!< the version number of the server. read-only */
  
    uint8_t               bMonitorOnly;         /*!< won't allocate a CCECClient when starting the connection when set (same as monitor mode). added in 1.6.3 */
    cec_version           cecVersion;           /*!< CEC spec version to use by libCEC. defaults to v1.4. added in 1.8.0 */
    cec_adapter_type      adapterType;          /*!< type of the CEC adapter that we're connected to. added in 1.8.2 */
 +  uint8_t               iDoubleTapTimeoutMs;  /*!< prevent double taps withing this timeout. defaults to 200ms. added in 2.0.0 */
  
  #ifdef __cplusplus
 -  // @todo re-add in v2.0 (breaks ABI)
 -  // libcec_configuration(void) { Clear(); }
 -  //~libcec_configuration(void) { Clear(); }
 +   libcec_configuration(void) { Clear(); }
 +  ~libcec_configuration(void) { Clear(); }
  
    bool operator==(const libcec_configuration &other) const
    {
 -    return (     clientVersion        == other.clientVersion &&
 -        !strncmp(strDeviceName,          other.strDeviceName, 13) &&
 -                 deviceTypes          == other.deviceTypes &&
 -                 bAutodetectAddress   == other.bAutodetectAddress &&
 -                 iPhysicalAddress     == other.iPhysicalAddress &&
 -                 baseDevice           == other.baseDevice &&
 -                 iHDMIPort            == other.iHDMIPort &&
 -                 tvVendor             == other.tvVendor &&
 -                 wakeDevices          == other.wakeDevices &&
 -                 powerOffDevices      == other.powerOffDevices &&
 -                 serverVersion        == other.serverVersion &&
 -                 bGetSettingsFromROM  == other.bGetSettingsFromROM &&
 -                 bUseTVMenuLanguage   == other.bUseTVMenuLanguage &&
 -                 bActivateSource      == other.bActivateSource &&
 -                 bPowerOffScreensaver == other.bPowerOffScreensaver &&
 -                 bPowerOffOnStandby   == other.bPowerOffOnStandby &&
 -                 bSendInactiveSource  == other.bSendInactiveSource &&
 -        /* libcec 1.5.3+ */
 -        (other.clientVersion < CEC_CLIENT_VERSION_1_5_3 || logicalAddresses == other.logicalAddresses) &&
 -        /* libcec 1.6.0+ */
 -        (other.clientVersion < CEC_CLIENT_VERSION_1_6_0 || iFirmwareVersion          == other.iFirmwareVersion) &&
 -        (other.clientVersion < CEC_CLIENT_VERSION_1_6_0 || bPowerOffDevicesOnStandby == other.bPowerOffDevicesOnStandby) &&
 -        (other.clientVersion < CEC_CLIENT_VERSION_1_6_0 || bShutdownOnStandby        == other.bShutdownOnStandby) &&
 -        /* libcec 1.6.2+ */
 -        (other.clientVersion < CEC_CLIENT_VERSION_1_6_2 || !strncmp(strDeviceLanguage, other.strDeviceLanguage, 3)) &&
 -        (other.clientVersion < CEC_CLIENT_VERSION_1_6_2 || iFirmwareBuildDate        == other.iFirmwareBuildDate) &&
 -        /* libcec 1.6.3+ */
 -        (other.clientVersion < CEC_CLIENT_VERSION_1_6_3 || bMonitorOnly              == other.bMonitorOnly) &&
 -        /* libcec 1.8.0+ */
 -        (other.clientVersion < CEC_CLIENT_VERSION_1_8_0 || cecVersion                == other.cecVersion) &&
 -        /* libcec 1.8.2+ */
 -        (other.clientVersion < CEC_CLIENT_VERSION_1_8_2 || adapterType               == other.adapterType));
 +    return (     clientVersion             == other.clientVersion &&
 +        !strncmp(strDeviceName,               other.strDeviceName, 13) &&
 +                  deviceTypes               == other.deviceTypes &&
 +                  bAutodetectAddress        == other.bAutodetectAddress &&
 +                  iPhysicalAddress          == other.iPhysicalAddress &&
 +                  baseDevice                == other.baseDevice &&
 +                  iHDMIPort                 == other.iHDMIPort &&
 +                  tvVendor                  == other.tvVendor &&
 +                  wakeDevices               == other.wakeDevices &&
 +                  powerOffDevices           == other.powerOffDevices &&
 +                  serverVersion             == other.serverVersion &&
 +                  bGetSettingsFromROM       == other.bGetSettingsFromROM &&
 +                  bUseTVMenuLanguage        == other.bUseTVMenuLanguage &&
 +                  bActivateSource           == other.bActivateSource &&
 +                  bPowerOffScreensaver      == other.bPowerOffScreensaver &&
 +                  bPowerOffOnStandby        == other.bPowerOffOnStandby &&
 +                  bSendInactiveSource       == other.bSendInactiveSource &&
 +                  logicalAddresses          == other.logicalAddresses &&
 +                  iFirmwareVersion          == other.iFirmwareVersion &&
 +                  bPowerOffDevicesOnStandby == other.bPowerOffDevicesOnStandby &&
 +                  bShutdownOnStandby        == other.bShutdownOnStandby &&
 +        !strncmp(strDeviceLanguage,           other.strDeviceLanguage, 3) &&
 +                  iFirmwareBuildDate        == other.iFirmwareBuildDate &&
 +                  bMonitorOnly              == other.bMonitorOnly &&
 +                  cecVersion                == other.cecVersion &&
 +                  adapterType               == other.adapterType &&
 +                  iDoubleTapTimeoutMs       == other.iDoubleTapTimeoutMs);
    }
  
    bool operator!=(const libcec_configuration &other) const
      baseDevice = (cec_logical_address)CEC_DEFAULT_BASE_DEVICE;
      iHDMIPort =                       CEC_DEFAULT_HDMI_PORT;
      tvVendor =              (uint64_t)CEC_VENDOR_UNKNOWN;
 -    clientVersion =         (uint32_t)CEC_CLIENT_VERSION_PRE_1_5;
 -    serverVersion =         (uint32_t)CEC_SERVER_VERSION_PRE_1_5;
 +    clientVersion =         (uint32_t)CEC_CLIENT_VERSION_2_0_0;
 +    serverVersion =         (uint32_t)CEC_SERVER_VERSION_2_0_0;
      bAutodetectAddress =              0;
      bGetSettingsFromROM =             CEC_DEFAULT_SETTING_GET_SETTINGS_FROM_ROM;
      bUseTVMenuLanguage =              CEC_DEFAULT_SETTING_USE_TV_MENU_LANGUAGE;
      bMonitorOnly =                    0;
      cecVersion =         (cec_version)CEC_DEFAULT_SETTING_CEC_VERSION;
      adapterType =                     ADAPTERTYPE_UNKNOWN;
 +    iDoubleTapTimeoutMs =             CEC_DOUBLE_TAP_TIMEOUT_MS;
  
      memset(strDeviceName, 0, 13);
 -    deviceTypes.clear();
 +    deviceTypes.Clear();
      logicalAddresses.Clear();
      wakeDevices.Clear();
      powerOffDevices.Clear();
      callbacks     = NULL;
    }
  #endif
 -} libcec_configuration;
 +};
  
  #ifdef __cplusplus
  };
diff --combined src/lib/CECTypeUtils.h
index 45a62b63d5ffe51d45d7d85d919f45e9264101b4,548fc9723132e1dcbd9895eebd28cde2336df9fe..6662182f50802be831d67e4f6174686fa842b766
@@@ -510,8 -510,6 +510,8 @@@ namespace CE
          return "Vizio";
        case CEC_VENDOR_BROADCOM:
          return "Broadcom";
 +      case CEC_VENDOR_LOEWE:
 +        return "Loewe";
        default:
          return "Unknown";
        }
          return "1.8.2";
        case CEC_CLIENT_VERSION_1_9_0:
          return "1.9.0";
 +      case CEC_CLIENT_VERSION_1_99_0:
 +        return "2.0.0-pre";
 +      case CEC_CLIENT_VERSION_2_0_0:
 +        return "2.0.0";
        default:
          return "Unknown";
        }
          return "1.8.2";
        case CEC_SERVER_VERSION_1_9_0:
          return "1.9.0";
 +      case CEC_SERVER_VERSION_1_99_0:
 +        return "2.0.0-pre";
 +      case CEC_CLIENT_VERSION_2_0_0:
 +        return "2.0.0";
        default:
          return "Unknown";
        }
          return "Pulse-Eight USB-CEC Daughterboard";
        case ADAPTERTYPE_RPI:
          return "Raspberry Pi";
+       case ADAPTERTYPE_TDA995x:
+         return "TDA995x";
        default:
          return "unknown";
        }
index 06df1e45888af8b5ba26037755808501fd571032,9d98d9ad9285f3646046597b9ef1a71bc35f08d9..739c6a71823d76ee002f306fb11888325775010e
@@@ -36,6 -36,7 +36,7 @@@
  #include "lib/platform/util/timeutils.h"
  #include <stdio.h>
  #include <fcntl.h>
+ #include <sys/ioctl.h>
  #include <sys/socket.h>
  #include <netinet/in.h>
  #include <netinet/tcp.h>
@@@ -86,7 -87,7 +87,7 @@@ namespace PLATFOR
      {
        FD_ZERO(&port);
        FD_SET(socket, &port);
 -      int returnv = select(socket + 1, NULL, &port, NULL, tv);
 +      ssize_t returnv = (ssize_t)select(socket + 1, NULL, &port, NULL, tv);
        if (returnv < 0)
        {
          *iError = errno;
  
        FD_ZERO(&port);
        FD_SET(socket, &port);
 -      int32_t returnv = select(socket + 1, &port, NULL, NULL, tv);
 +      ssize_t returnv = (ssize_t)select(socket + 1, &port, NULL, NULL, tv);
  
        if (returnv == -1)
        {
  
      return iBytesRead;
    }
+   inline int SocketIoctl(socket_t socket, int *iError, int request, void* data)
+   {
+     if (socket == INVALID_SOCKET_VALUE)
+     {
+       *iError = EINVAL;
+       return -1;
+     }
+     int iReturn = ioctl(socket, request, data);
+     if (iReturn < 0)
+       *iError = errno;
+     return iReturn;
+   }
    //@}
  
    // TCP
      {
        if (iTimeoutMs > 0)
        {
 -        int iPollResult = poll(&fds, 1, iTarget - iNow);
 +        int iPollResult = poll(&fds, 1, (int)(iTarget - iNow));
          if (iPollResult == 0)
          {
            *iError = ETIMEDOUT;
          pfd.events = POLLOUT;
          pfd.revents = 0;
  
 -        int iPollResult = poll(&pfd, 1, iTimeout);
 +        int iPollResult = poll(&pfd, 1, (int)iTimeout);
          if (iPollResult == 0)
            *iError = ETIMEDOUT;
          else if (iPollResult == -1)