mirror of
https://github.com/archlinuxarm/PKGBUILDs.git
synced 2024-11-28 22:57:37 +00:00
58333 lines
2.1 MiB
58333 lines
2.1 MiB
From e3ac39121d2feed4e701ac45dad68fb7af556121 Mon Sep 17 00:00:00 2001
|
|
From: Ashokkumar G <0xfee1dead.sa@gmail.com>
|
|
Date: Thu, 27 Jun 2013 17:49:39 -0600
|
|
Subject: [PATCH] GPLUGD: These modifications are for testing and in single big
|
|
file. Still need to create individual peripheral patches for maintainers
|
|
|
|
Signed-off-by: Ashokkumar G <0xfee1dead.sa@gmail.com>
|
|
---
|
|
arch/arm/configs/gplugd_defconfig | 988 ++-
|
|
arch/arm/mach-mmp/devices.c | 36 +
|
|
arch/arm/mach-mmp/include/mach/pxa168.h | 52 +
|
|
arch/arm/mach-mmp/pxa168.c | 14 +
|
|
drivers/clk/mmp/clk-pxa168.c | 610 +-
|
|
drivers/i2c/busses/i2c-pxa.c | 6 +-
|
|
drivers/mmc/host/Kconfig | 5 +-
|
|
drivers/mmc/host/sdhci.c | 14 +
|
|
drivers/mmc/host/sdhci.h | 1 +
|
|
drivers/net/ethernet/marvell/pxa168_eth.c | 20 +-
|
|
drivers/rtc/Kconfig | 2 +-
|
|
drivers/spi/Kconfig | 4 +-
|
|
drivers/video/Kconfig | 3 +
|
|
drivers/video/Makefile | 2 +-
|
|
drivers/video/hdmi/Kconfig | 7 +
|
|
drivers/video/hdmi/MakeModules | 55 +
|
|
drivers/video/hdmi/Makefile | 202 +
|
|
.../hdmi/comps/tmbslHdmiTx/inc/tmbslHdmiTx_types.h | 1799 +++++
|
|
.../hdmi/comps/tmbslTDA9983/inc/tmbslHdmiTx.h | 4202 +++++++++++
|
|
.../hdmi/comps/tmbslTDA9983/inc/tmbslHdmiTx_app.h | 551 ++
|
|
.../hdmi/comps/tmbslTDA9983/src/tmbslHdmiTx_1.c | 5520 ++++++++++++++
|
|
.../hdmi/comps/tmbslTDA9983/src/tmbslHdmiTx_2.c | 2404 ++++++
|
|
.../comps/tmbslTDA9983/src/tmbslHdmiTx_local.c | 898 +++
|
|
.../comps/tmbslTDA9983/src/tmbslHdmiTx_local.h | 1967 +++++
|
|
.../hdmi/comps/tmdlHdmiCEC/cfg/tmdlHdmiCEC_IW.c | 1062 +++
|
|
.../hdmi/comps/tmdlHdmiCEC/cfg/tmdlHdmiCEC_IW.h | 297 +
|
|
.../hdmi/comps/tmdlHdmiCEC/cfg/tmdlHdmiCEC_Linux.c | 423 ++
|
|
.../hdmi/comps/tmdlHdmiCEC/cfg/tmdlHdmiCEC_cfg.c | 298 +
|
|
.../hdmi/comps/tmdlHdmiCEC/cfg/tmdlHdmiCEC_cfg.h | 94 +
|
|
.../hdmi/comps/tmdlHdmiCEC/cfg/tmdlHdmiCecCfg.def | 16 +
|
|
.../video/hdmi/comps/tmdlHdmiCEC/inc/tmdlHdmiCEC.h | 46 +
|
|
.../comps/tmdlHdmiCEC/inc/tmdlHdmiCEC_Functions.h | 3147 ++++++++
|
|
.../hdmi/comps/tmdlHdmiCEC/inc/tmdlHdmiCEC_Types.h | 1114 +++
|
|
.../video/hdmi/comps/tmdlHdmiCEC/src/tmdlHdmiCEC.c | 7969 ++++++++++++++++++++
|
|
.../hdmi/comps/tmdlHdmiCEC/src/tmdlHdmiCEC_local.c | 286 +
|
|
.../hdmi/comps/tmdlHdmiCEC/src/tmdlHdmiCEC_local.h | 208 +
|
|
.../hdmi/comps/tmdlTDA9983/cfg/tmdlHdmiTx_IW.c | 659 ++
|
|
.../hdmi/comps/tmdlTDA9983/cfg/tmdlHdmiTx_IW.h | 281 +
|
|
.../hdmi/comps/tmdlTDA9983/cfg/tmdlHdmiTx_Linux.c | 924 +++
|
|
.../hdmi/comps/tmdlTDA9983/cfg/tmdlHdmiTx_cfg.c | 797 ++
|
|
.../hdmi/comps/tmdlTDA9983/cfg/tmdlHdmiTx_cfg.h | 246 +
|
|
.../video/hdmi/comps/tmdlTDA9983/inc/tmdlHdmiTx.h | 54 +
|
|
.../comps/tmdlTDA9983/inc/tmdlHdmiTx_Functions.h | 1446 ++++
|
|
.../hdmi/comps/tmdlTDA9983/inc/tmdlHdmiTx_Types.h | 839 +++
|
|
.../video/hdmi/comps/tmdlTDA9983/src/tmdlHdmiTx.c | 5163 +++++++++++++
|
|
.../hdmi/comps/tmdlTDA9983/src/tmdlHdmiTx_local.h | 802 ++
|
|
drivers/video/hdmi/inc/tmNxCompId.h | 287 +
|
|
drivers/video/hdmi/inc/tmNxTypes.h | 177 +
|
|
drivers/video/hdmi/release_note.txt | 305 +
|
|
drivers/video/hdmi/tda998x.c | 2481 ++++++
|
|
drivers/video/hdmi/tda998x.h | 139 +
|
|
drivers/video/hdmi/tda998x_cec.c | 2629 +++++++
|
|
drivers/video/hdmi/tda998x_cec.h | 140 +
|
|
drivers/video/hdmi/tda998x_ioctl.h | 1142 +++
|
|
drivers/video/hdmi/tda998x_version.h | 16 +
|
|
drivers/video/pxa168fb.c | 1029 ++-
|
|
drivers/video/pxa168fb.h | 7 +
|
|
drivers/video/pxa168fb_ovly.c | 2209 ++++++
|
|
include/linux/pxa168_eth.h | 2 +
|
|
include/linux/pxa2xx_ssp.h | 3 +-
|
|
include/video/pxa168fb.h | 279 +
|
|
61 files changed, 55957 insertions(+), 421 deletions(-)
|
|
create mode 100644 drivers/video/hdmi/Kconfig
|
|
create mode 100644 drivers/video/hdmi/MakeModules
|
|
create mode 100644 drivers/video/hdmi/Makefile
|
|
create mode 100755 drivers/video/hdmi/comps/tmbslHdmiTx/inc/tmbslHdmiTx_types.h
|
|
create mode 100755 drivers/video/hdmi/comps/tmbslTDA9983/inc/tmbslHdmiTx.h
|
|
create mode 100755 drivers/video/hdmi/comps/tmbslTDA9983/inc/tmbslHdmiTx_app.h
|
|
create mode 100755 drivers/video/hdmi/comps/tmbslTDA9983/src/tmbslHdmiTx_1.c
|
|
create mode 100755 drivers/video/hdmi/comps/tmbslTDA9983/src/tmbslHdmiTx_2.c
|
|
create mode 100755 drivers/video/hdmi/comps/tmbslTDA9983/src/tmbslHdmiTx_local.c
|
|
create mode 100755 drivers/video/hdmi/comps/tmbslTDA9983/src/tmbslHdmiTx_local.h
|
|
create mode 100755 drivers/video/hdmi/comps/tmdlHdmiCEC/cfg/tmdlHdmiCEC_IW.c
|
|
create mode 100755 drivers/video/hdmi/comps/tmdlHdmiCEC/cfg/tmdlHdmiCEC_IW.h
|
|
create mode 100755 drivers/video/hdmi/comps/tmdlHdmiCEC/cfg/tmdlHdmiCEC_Linux.c
|
|
create mode 100755 drivers/video/hdmi/comps/tmdlHdmiCEC/cfg/tmdlHdmiCEC_cfg.c
|
|
create mode 100755 drivers/video/hdmi/comps/tmdlHdmiCEC/cfg/tmdlHdmiCEC_cfg.h
|
|
create mode 100755 drivers/video/hdmi/comps/tmdlHdmiCEC/cfg/tmdlHdmiCecCfg.def
|
|
create mode 100755 drivers/video/hdmi/comps/tmdlHdmiCEC/inc/tmdlHdmiCEC.h
|
|
create mode 100755 drivers/video/hdmi/comps/tmdlHdmiCEC/inc/tmdlHdmiCEC_Functions.h
|
|
create mode 100755 drivers/video/hdmi/comps/tmdlHdmiCEC/inc/tmdlHdmiCEC_Types.h
|
|
create mode 100755 drivers/video/hdmi/comps/tmdlHdmiCEC/src/tmdlHdmiCEC.c
|
|
create mode 100755 drivers/video/hdmi/comps/tmdlHdmiCEC/src/tmdlHdmiCEC_local.c
|
|
create mode 100755 drivers/video/hdmi/comps/tmdlHdmiCEC/src/tmdlHdmiCEC_local.h
|
|
create mode 100755 drivers/video/hdmi/comps/tmdlTDA9983/cfg/tmdlHdmiTx_IW.c
|
|
create mode 100755 drivers/video/hdmi/comps/tmdlTDA9983/cfg/tmdlHdmiTx_IW.h
|
|
create mode 100755 drivers/video/hdmi/comps/tmdlTDA9983/cfg/tmdlHdmiTx_Linux.c
|
|
create mode 100755 drivers/video/hdmi/comps/tmdlTDA9983/cfg/tmdlHdmiTx_cfg.c
|
|
create mode 100755 drivers/video/hdmi/comps/tmdlTDA9983/cfg/tmdlHdmiTx_cfg.h
|
|
create mode 100755 drivers/video/hdmi/comps/tmdlTDA9983/inc/tmdlHdmiTx.h
|
|
create mode 100755 drivers/video/hdmi/comps/tmdlTDA9983/inc/tmdlHdmiTx_Functions.h
|
|
create mode 100755 drivers/video/hdmi/comps/tmdlTDA9983/inc/tmdlHdmiTx_Types.h
|
|
create mode 100755 drivers/video/hdmi/comps/tmdlTDA9983/src/tmdlHdmiTx.c
|
|
create mode 100755 drivers/video/hdmi/comps/tmdlTDA9983/src/tmdlHdmiTx_local.h
|
|
create mode 100644 drivers/video/hdmi/inc/tmNxCompId.h
|
|
create mode 100644 drivers/video/hdmi/inc/tmNxTypes.h
|
|
create mode 100644 drivers/video/hdmi/release_note.txt
|
|
create mode 100644 drivers/video/hdmi/tda998x.c
|
|
create mode 100644 drivers/video/hdmi/tda998x.h
|
|
create mode 100644 drivers/video/hdmi/tda998x_cec.c
|
|
create mode 100644 drivers/video/hdmi/tda998x_cec.h
|
|
create mode 100644 drivers/video/hdmi/tda998x_ioctl.h
|
|
create mode 100644 drivers/video/hdmi/tda998x_version.h
|
|
create mode 100644 drivers/video/pxa168fb_ovly.c
|
|
|
|
diff --git a/arch/arm/configs/gplugd_defconfig b/arch/arm/configs/gplugd_defconfig
|
|
index 154e4f8..24b0e6d 100755
|
|
--- a/arch/arm/configs/gplugd_defconfig
|
|
+++ b/arch/arm/configs/gplugd_defconfig
|
|
@@ -1,30 +1,26 @@
|
|
#
|
|
# Automatically generated file; DO NOT EDIT.
|
|
-# Linux/arm 3.4.35 Kernel Configuration
|
|
+# Linux/arm 3.8.11 Kernel Configuration
|
|
#
|
|
CONFIG_ARM=y
|
|
CONFIG_SYS_SUPPORTS_APM_EMULATION=y
|
|
CONFIG_GENERIC_GPIO=y
|
|
-# CONFIG_ARCH_USES_GETTIMEOFFSET is not set
|
|
-CONFIG_GENERIC_CLOCKEVENTS=y
|
|
-CONFIG_KTIME_SCALAR=y
|
|
CONFIG_HAVE_PROC_CPU=y
|
|
CONFIG_STACKTRACE_SUPPORT=y
|
|
CONFIG_HAVE_LATENCYTOP_SUPPORT=y
|
|
CONFIG_LOCKDEP_SUPPORT=y
|
|
CONFIG_TRACE_IRQFLAGS_SUPPORT=y
|
|
-CONFIG_HARDIRQS_SW_RESEND=y
|
|
-CONFIG_GENERIC_IRQ_PROBE=y
|
|
CONFIG_RWSEM_GENERIC_SPINLOCK=y
|
|
-CONFIG_ARCH_HAS_CPU_IDLE_WAIT=y
|
|
CONFIG_GENERIC_HWEIGHT=y
|
|
CONFIG_GENERIC_CALIBRATE_DELAY=y
|
|
CONFIG_NEED_DMA_MAP_STATE=y
|
|
CONFIG_VECTORS_BASE=0xffff0000
|
|
CONFIG_ARM_PATCH_PHYS_VIRT=y
|
|
+CONFIG_NEED_MACH_GPIO_H=y
|
|
CONFIG_GENERIC_BUG=y
|
|
CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
|
|
CONFIG_HAVE_IRQ_WORK=y
|
|
+CONFIG_BUILDTIME_EXTABLE_SORT=y
|
|
|
|
#
|
|
# General setup
|
|
@@ -33,8 +29,8 @@ CONFIG_EXPERIMENTAL=y
|
|
CONFIG_BROKEN_ON_SMP=y
|
|
CONFIG_INIT_ENV_ARG_LIMIT=32
|
|
CONFIG_CROSS_COMPILE=""
|
|
-CONFIG_LOCALVERSION=""
|
|
-CONFIG_LOCALVERSION_AUTO=y
|
|
+CONFIG_LOCALVERSION="-gplugd"
|
|
+# CONFIG_LOCALVERSION_AUTO is not set
|
|
CONFIG_HAVE_KERNEL_GZIP=y
|
|
CONFIG_HAVE_KERNEL_LZMA=y
|
|
CONFIG_HAVE_KERNEL_XZ=y
|
|
@@ -48,9 +44,7 @@ CONFIG_SWAP=y
|
|
CONFIG_SYSVIPC=y
|
|
CONFIG_SYSVIPC_SYSCTL=y
|
|
# CONFIG_POSIX_MQUEUE is not set
|
|
-# CONFIG_BSD_PROCESS_ACCT is not set
|
|
# CONFIG_FHANDLE is not set
|
|
-# CONFIG_TASKSTATS is not set
|
|
# CONFIG_AUDIT is not set
|
|
CONFIG_HAVE_GENERIC_HARDIRQS=y
|
|
|
|
@@ -58,8 +52,29 @@ CONFIG_HAVE_GENERIC_HARDIRQS=y
|
|
# IRQ subsystem
|
|
#
|
|
CONFIG_GENERIC_HARDIRQS=y
|
|
+CONFIG_GENERIC_IRQ_PROBE=y
|
|
CONFIG_GENERIC_IRQ_SHOW=y
|
|
+CONFIG_HARDIRQS_SW_RESEND=y
|
|
+CONFIG_IRQ_DOMAIN=y
|
|
+# CONFIG_IRQ_DOMAIN_DEBUG is not set
|
|
CONFIG_SPARSE_IRQ=y
|
|
+CONFIG_KTIME_SCALAR=y
|
|
+CONFIG_GENERIC_CLOCKEVENTS=y
|
|
+CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
|
|
+
|
|
+#
|
|
+# Timers subsystem
|
|
+#
|
|
+CONFIG_TICK_ONESHOT=y
|
|
+CONFIG_NO_HZ=y
|
|
+CONFIG_HIGH_RES_TIMERS=y
|
|
+
|
|
+#
|
|
+# CPU/Task time and stats accounting
|
|
+#
|
|
+CONFIG_TICK_CPU_ACCOUNTING=y
|
|
+# CONFIG_BSD_PROCESS_ACCT is not set
|
|
+# CONFIG_TASKSTATS is not set
|
|
|
|
#
|
|
# RCU Subsystem
|
|
@@ -68,14 +83,22 @@ CONFIG_TINY_PREEMPT_RCU=y
|
|
CONFIG_PREEMPT_RCU=y
|
|
# CONFIG_TREE_RCU_TRACE is not set
|
|
# CONFIG_RCU_BOOST is not set
|
|
-# CONFIG_IKCONFIG is not set
|
|
-CONFIG_LOG_BUF_SHIFT=14
|
|
-# CONFIG_CGROUPS is not set
|
|
+CONFIG_IKCONFIG=y
|
|
+CONFIG_IKCONFIG_PROC=y
|
|
+CONFIG_LOG_BUF_SHIFT=17
|
|
+CONFIG_CGROUPS=y
|
|
+# CONFIG_CGROUP_DEBUG is not set
|
|
+# CONFIG_CGROUP_FREEZER is not set
|
|
+# CONFIG_CGROUP_DEVICE is not set
|
|
+# CONFIG_CPUSETS is not set
|
|
+# CONFIG_CGROUP_CPUACCT is not set
|
|
+# CONFIG_RESOURCE_COUNTERS is not set
|
|
+# CONFIG_CGROUP_SCHED is not set
|
|
+# CONFIG_BLK_CGROUP is not set
|
|
# CONFIG_CHECKPOINT_RESTORE is not set
|
|
CONFIG_NAMESPACES=y
|
|
CONFIG_UTS_NS=y
|
|
CONFIG_IPC_NS=y
|
|
-CONFIG_USER_NS=y
|
|
CONFIG_PID_NS=y
|
|
CONFIG_NET_NS=y
|
|
# CONFIG_SCHED_AUTOGROUP is not set
|
|
@@ -86,6 +109,7 @@ CONFIG_NET_NS=y
|
|
CONFIG_SYSCTL=y
|
|
CONFIG_ANON_INODES=y
|
|
# CONFIG_EXPERT is not set
|
|
+CONFIG_HAVE_UID16=y
|
|
CONFIG_UID16=y
|
|
# CONFIG_SYSCTL_SYSCALL is not set
|
|
CONFIG_KALLSYMS=y
|
|
@@ -110,25 +134,35 @@ CONFIG_PERF_USE_VMALLOC=y
|
|
# Kernel Performance Events And Counters
|
|
#
|
|
# CONFIG_PERF_EVENTS is not set
|
|
-# CONFIG_PERF_COUNTERS is not set
|
|
CONFIG_VM_EVENT_COUNTERS=y
|
|
CONFIG_COMPAT_BRK=y
|
|
CONFIG_SLAB=y
|
|
# CONFIG_SLUB is not set
|
|
-# CONFIG_PROFILING is not set
|
|
+CONFIG_PROFILING=y
|
|
+CONFIG_OPROFILE=m
|
|
CONFIG_HAVE_OPROFILE=y
|
|
# CONFIG_KPROBES is not set
|
|
# CONFIG_JUMP_LABEL is not set
|
|
CONFIG_HAVE_KPROBES=y
|
|
CONFIG_HAVE_KRETPROBES=y
|
|
+CONFIG_HAVE_ARCH_TRACEHOOK=y
|
|
+CONFIG_HAVE_DMA_ATTRS=y
|
|
+CONFIG_HAVE_DMA_CONTIGUOUS=y
|
|
+CONFIG_GENERIC_SMP_IDLE_THREAD=y
|
|
CONFIG_HAVE_REGS_AND_STACK_ACCESS_API=y
|
|
CONFIG_HAVE_CLK=y
|
|
CONFIG_HAVE_DMA_API_DEBUG=y
|
|
CONFIG_HAVE_ARCH_JUMP_LABEL=y
|
|
+CONFIG_ARCH_WANT_IPC_PARSE_VERSION=y
|
|
+CONFIG_HAVE_ARCH_SECCOMP_FILTER=y
|
|
+CONFIG_HAVE_MOD_ARCH_SPECIFIC=y
|
|
+CONFIG_MODULES_USE_ELF_REL=y
|
|
+CONFIG_CLONE_BACKWARDS=y
|
|
|
|
#
|
|
# GCOV-based kernel profiling
|
|
#
|
|
+# CONFIG_GCOV_KERNEL is not set
|
|
CONFIG_HAVE_GENERIC_DMA_COHERENT=y
|
|
CONFIG_SLABINFO=y
|
|
CONFIG_RT_MUTEXES=y
|
|
@@ -139,6 +173,7 @@ CONFIG_MODULE_UNLOAD=y
|
|
CONFIG_MODULE_FORCE_UNLOAD=y
|
|
# CONFIG_MODVERSIONS is not set
|
|
# CONFIG_MODULE_SRCVERSION_ALL is not set
|
|
+# CONFIG_MODULE_SIG is not set
|
|
CONFIG_BLOCK=y
|
|
CONFIG_LBDAF=y
|
|
# CONFIG_BLK_DEV_BSG is not set
|
|
@@ -150,6 +185,7 @@ CONFIG_LBDAF=y
|
|
#
|
|
# CONFIG_PARTITION_ADVANCED is not set
|
|
CONFIG_MSDOS_PARTITION=y
|
|
+CONFIG_EFI_PARTITION=y
|
|
|
|
#
|
|
# IO Schedulers
|
|
@@ -161,76 +197,42 @@ CONFIG_IOSCHED_CFQ=y
|
|
CONFIG_DEFAULT_CFQ=y
|
|
# CONFIG_DEFAULT_NOOP is not set
|
|
CONFIG_DEFAULT_IOSCHED="cfq"
|
|
-# CONFIG_INLINE_SPIN_TRYLOCK is not set
|
|
-# CONFIG_INLINE_SPIN_TRYLOCK_BH is not set
|
|
-# CONFIG_INLINE_SPIN_LOCK is not set
|
|
-# CONFIG_INLINE_SPIN_LOCK_BH is not set
|
|
-# CONFIG_INLINE_SPIN_LOCK_IRQ is not set
|
|
-# CONFIG_INLINE_SPIN_LOCK_IRQSAVE is not set
|
|
CONFIG_UNINLINE_SPIN_UNLOCK=y
|
|
-# CONFIG_INLINE_SPIN_UNLOCK_BH is not set
|
|
-# CONFIG_INLINE_SPIN_UNLOCK_IRQ is not set
|
|
-# CONFIG_INLINE_SPIN_UNLOCK_IRQRESTORE is not set
|
|
-# CONFIG_INLINE_READ_TRYLOCK is not set
|
|
-# CONFIG_INLINE_READ_LOCK is not set
|
|
-# CONFIG_INLINE_READ_LOCK_BH is not set
|
|
-# CONFIG_INLINE_READ_LOCK_IRQ is not set
|
|
-# CONFIG_INLINE_READ_LOCK_IRQSAVE is not set
|
|
-# CONFIG_INLINE_READ_UNLOCK is not set
|
|
-# CONFIG_INLINE_READ_UNLOCK_BH is not set
|
|
-# CONFIG_INLINE_READ_UNLOCK_IRQ is not set
|
|
-# CONFIG_INLINE_READ_UNLOCK_IRQRESTORE is not set
|
|
-# CONFIG_INLINE_WRITE_TRYLOCK is not set
|
|
-# CONFIG_INLINE_WRITE_LOCK is not set
|
|
-# CONFIG_INLINE_WRITE_LOCK_BH is not set
|
|
-# CONFIG_INLINE_WRITE_LOCK_IRQ is not set
|
|
-# CONFIG_INLINE_WRITE_LOCK_IRQSAVE is not set
|
|
-# CONFIG_INLINE_WRITE_UNLOCK is not set
|
|
-# CONFIG_INLINE_WRITE_UNLOCK_BH is not set
|
|
-# CONFIG_INLINE_WRITE_UNLOCK_IRQ is not set
|
|
-# CONFIG_INLINE_WRITE_UNLOCK_IRQRESTORE is not set
|
|
-# CONFIG_MUTEX_SPIN_ON_OWNER is not set
|
|
-# CONFIG_FREEZER is not set
|
|
+CONFIG_FREEZER=y
|
|
|
|
#
|
|
# System Type
|
|
#
|
|
CONFIG_MMU=y
|
|
+# CONFIG_ARCH_MULTIPLATFORM is not set
|
|
# CONFIG_ARCH_INTEGRATOR is not set
|
|
# CONFIG_ARCH_REALVIEW is not set
|
|
# CONFIG_ARCH_VERSATILE is not set
|
|
-# CONFIG_ARCH_VEXPRESS is not set
|
|
# CONFIG_ARCH_AT91 is not set
|
|
-# CONFIG_ARCH_BCMRING is not set
|
|
-# CONFIG_ARCH_HIGHBANK is not set
|
|
-# CONFIG_ARCH_CLPS711X is not set
|
|
+# CONFIG_ARCH_BCM2835 is not set
|
|
# CONFIG_ARCH_CNS3XXX is not set
|
|
+# CONFIG_ARCH_CLPS711X is not set
|
|
# CONFIG_ARCH_GEMINI is not set
|
|
-# CONFIG_ARCH_PRIMA2 is not set
|
|
+# CONFIG_ARCH_SIRF is not set
|
|
# CONFIG_ARCH_EBSA110 is not set
|
|
# CONFIG_ARCH_EP93XX is not set
|
|
# CONFIG_ARCH_FOOTBRIDGE is not set
|
|
-# CONFIG_ARCH_MXC is not set
|
|
# CONFIG_ARCH_MXS is not set
|
|
# CONFIG_ARCH_NETX is not set
|
|
# CONFIG_ARCH_H720X is not set
|
|
# CONFIG_ARCH_IOP13XX is not set
|
|
# CONFIG_ARCH_IOP32X is not set
|
|
# CONFIG_ARCH_IOP33X is not set
|
|
-# CONFIG_ARCH_IXP23XX is not set
|
|
-# CONFIG_ARCH_IXP2000 is not set
|
|
# CONFIG_ARCH_IXP4XX is not set
|
|
# CONFIG_ARCH_DOVE is not set
|
|
# CONFIG_ARCH_KIRKWOOD is not set
|
|
-# CONFIG_ARCH_LPC32XX is not set
|
|
# CONFIG_ARCH_MV78XX0 is not set
|
|
# CONFIG_ARCH_ORION5X is not set
|
|
CONFIG_ARCH_MMP=y
|
|
# CONFIG_ARCH_KS8695 is not set
|
|
# CONFIG_ARCH_W90X900 is not set
|
|
+# CONFIG_ARCH_LPC32XX is not set
|
|
# CONFIG_ARCH_TEGRA is not set
|
|
-# CONFIG_ARCH_PICOXCELL is not set
|
|
-# CONFIG_ARCH_PNX4008 is not set
|
|
# CONFIG_ARCH_PXA is not set
|
|
# CONFIG_ARCH_MSM is not set
|
|
# CONFIG_ARCH_SHMOBILE is not set
|
|
@@ -246,25 +248,28 @@ CONFIG_ARCH_MMP=y
|
|
# CONFIG_ARCH_U300 is not set
|
|
# CONFIG_ARCH_U8500 is not set
|
|
# CONFIG_ARCH_NOMADIK is not set
|
|
+# CONFIG_PLAT_SPEAR is not set
|
|
# CONFIG_ARCH_DAVINCI is not set
|
|
# CONFIG_ARCH_OMAP is not set
|
|
-# CONFIG_PLAT_SPEAR is not set
|
|
-# CONFIG_ARCH_VT8500 is not set
|
|
-# CONFIG_ARCH_ZYNQ is not set
|
|
+# CONFIG_ARCH_VT8500_SINGLE is not set
|
|
+CONFIG_GPIO_PCA953X=y
|
|
+# CONFIG_KEYBOARD_GPIO_POLLED is not set
|
|
+# CONFIG_MACH_TAVOREVB is not set
|
|
CONFIG_PXA_SSP=y
|
|
|
|
#
|
|
# Marvell PXA168/910/MMP2 Implmentations
|
|
#
|
|
-# CONFIG_MACH_MMP_DT is not set
|
|
# CONFIG_MACH_ASPENITE is not set
|
|
# CONFIG_MACH_ZYLONITE2 is not set
|
|
# CONFIG_MACH_AVENGERS_LITE is not set
|
|
-# CONFIG_MACH_TAVOREVB is not set
|
|
# CONFIG_MACH_TTC_DKB is not set
|
|
# CONFIG_MACH_TETON_BGA is not set
|
|
CONFIG_MACH_GPLUGD=y
|
|
+# CONFIG_MACH_MMP_DT is not set
|
|
CONFIG_CPU_PXA168=y
|
|
+CONFIG_USB_EHCI_MV_U2O=y
|
|
+# CONFIG_ARCH_VT8500 is not set
|
|
CONFIG_PLAT_PXA=y
|
|
|
|
#
|
|
@@ -300,16 +305,11 @@ CONFIG_IWMMXT=y
|
|
# Bus support
|
|
#
|
|
# CONFIG_PCI_SYSCALL is not set
|
|
-# CONFIG_ARCH_SUPPORTS_MSI is not set
|
|
# CONFIG_PCCARD is not set
|
|
|
|
#
|
|
# Kernel Features
|
|
#
|
|
-CONFIG_TICK_ONESHOT=y
|
|
-CONFIG_NO_HZ=y
|
|
-CONFIG_HIGH_RES_TIMERS=y
|
|
-CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
|
|
CONFIG_VMSPLIT_3G=y
|
|
# CONFIG_VMSPLIT_2G is not set
|
|
# CONFIG_VMSPLIT_1G is not set
|
|
@@ -339,34 +339,41 @@ CONFIG_ZONE_DMA_FLAG=0
|
|
CONFIG_VIRT_TO_BUS=y
|
|
# CONFIG_KSM is not set
|
|
CONFIG_DEFAULT_MMAP_MIN_ADDR=4096
|
|
+CONFIG_CROSS_MEMORY_ATTACH=y
|
|
CONFIG_NEED_PER_CPU_KM=y
|
|
# CONFIG_CLEANCACHE is not set
|
|
+# CONFIG_FRONTSWAP is not set
|
|
CONFIG_FORCE_MAX_ZONEORDER=11
|
|
CONFIG_ALIGNMENT_TRAP=y
|
|
# CONFIG_UACCESS_WITH_MEMCPY is not set
|
|
# CONFIG_SECCOMP is not set
|
|
# CONFIG_CC_STACKPROTECTOR is not set
|
|
-# CONFIG_DEPRECATED_PARAM_STRUCT is not set
|
|
|
|
#
|
|
# Boot options
|
|
#
|
|
# CONFIG_USE_OF is not set
|
|
+CONFIG_ATAGS=y
|
|
+# CONFIG_DEPRECATED_PARAM_STRUCT is not set
|
|
CONFIG_ZBOOT_ROM_TEXT=0x0
|
|
CONFIG_ZBOOT_ROM_BSS=0x0
|
|
-CONFIG_CMDLINE="root=/dev/nfs rootfstype=nfs nfsroot=192.168.2.100:/nfsroot/ ip=192.168.2.101:192.168.2.100::255.255.255.0::eth0:on console=ttyS0,115200 mem=128M"
|
|
+CONFIG_CMDLINE="root=/dev/mmcblk0p2 console=ttyS2,115200 uart_dma rootwait"
|
|
CONFIG_CMDLINE_FROM_BOOTLOADER=y
|
|
# CONFIG_CMDLINE_EXTEND is not set
|
|
# CONFIG_CMDLINE_FORCE is not set
|
|
# CONFIG_XIP_KERNEL is not set
|
|
# CONFIG_KEXEC is not set
|
|
-# CONFIG_CRASH_DUMP is not set
|
|
+CONFIG_CRASH_DUMP=y
|
|
# CONFIG_AUTO_ZRELADDR is not set
|
|
|
|
#
|
|
# CPU Power Management
|
|
#
|
|
-# CONFIG_CPU_IDLE is not set
|
|
+CONFIG_CPU_IDLE=y
|
|
+CONFIG_CPU_IDLE_MULTIPLE_DRIVERS=y
|
|
+CONFIG_CPU_IDLE_GOV_LADDER=y
|
|
+CONFIG_CPU_IDLE_GOV_MENU=y
|
|
+# CONFIG_ARCH_NEEDS_CPU_IDLE_COUPLED is not set
|
|
|
|
#
|
|
# Floating point emulation
|
|
@@ -388,18 +395,31 @@ CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS=y
|
|
CONFIG_HAVE_AOUT=y
|
|
# CONFIG_BINFMT_AOUT is not set
|
|
# CONFIG_BINFMT_MISC is not set
|
|
+CONFIG_COREDUMP=y
|
|
|
|
#
|
|
# Power management options
|
|
#
|
|
-# CONFIG_PM_RUNTIME is not set
|
|
-# CONFIG_ARM_CPU_SUSPEND is not set
|
|
+CONFIG_SUSPEND=y
|
|
+CONFIG_SUSPEND_FREEZER=y
|
|
+CONFIG_PM_SLEEP=y
|
|
+# CONFIG_PM_AUTOSLEEP is not set
|
|
+# CONFIG_PM_WAKELOCKS is not set
|
|
+CONFIG_PM_RUNTIME=y
|
|
+CONFIG_PM=y
|
|
+# CONFIG_PM_DEBUG is not set
|
|
+# CONFIG_APM_EMULATION is not set
|
|
+CONFIG_PM_CLK=y
|
|
+CONFIG_CPU_PM=y
|
|
+CONFIG_ARCH_SUSPEND_POSSIBLE=y
|
|
+CONFIG_ARM_CPU_SUSPEND=y
|
|
CONFIG_NET=y
|
|
|
|
#
|
|
# Networking options
|
|
#
|
|
CONFIG_PACKET=y
|
|
+# CONFIG_PACKET_DIAG is not set
|
|
CONFIG_UNIX=y
|
|
# CONFIG_UNIX_DIAG is not set
|
|
CONFIG_XFRM=y
|
|
@@ -412,13 +432,14 @@ CONFIG_INET=y
|
|
# CONFIG_IP_MULTICAST is not set
|
|
# CONFIG_IP_ADVANCED_ROUTER is not set
|
|
CONFIG_IP_PNP=y
|
|
-# CONFIG_IP_PNP_DHCP is not set
|
|
+CONFIG_IP_PNP_DHCP=y
|
|
# CONFIG_IP_PNP_BOOTP is not set
|
|
# CONFIG_IP_PNP_RARP is not set
|
|
# CONFIG_NET_IPIP is not set
|
|
# CONFIG_NET_IPGRE_DEMUX is not set
|
|
# CONFIG_ARPD is not set
|
|
# CONFIG_SYN_COOKIES is not set
|
|
+# CONFIG_NET_IPVTI is not set
|
|
# CONFIG_INET_AH is not set
|
|
# CONFIG_INET_ESP is not set
|
|
# CONFIG_INET_IPCOMP is not set
|
|
@@ -446,7 +467,7 @@ CONFIG_DEFAULT_TCP_CONG="cubic"
|
|
# CONFIG_ATM is not set
|
|
# CONFIG_L2TP is not set
|
|
# CONFIG_BRIDGE is not set
|
|
-# CONFIG_NET_DSA is not set
|
|
+CONFIG_HAVE_NET_DSA=y
|
|
# CONFIG_VLAN_8021Q is not set
|
|
# CONFIG_DECNET is not set
|
|
# CONFIG_LLC2 is not set
|
|
@@ -454,7 +475,6 @@ CONFIG_DEFAULT_TCP_CONG="cubic"
|
|
# CONFIG_ATALK is not set
|
|
# CONFIG_X25 is not set
|
|
# CONFIG_LAPB is not set
|
|
-# CONFIG_ECONET is not set
|
|
# CONFIG_WAN_ROUTER is not set
|
|
# CONFIG_PHONET is not set
|
|
# CONFIG_IEEE802154 is not set
|
|
@@ -463,8 +483,8 @@ CONFIG_DEFAULT_TCP_CONG="cubic"
|
|
CONFIG_DNS_RESOLVER=y
|
|
# CONFIG_BATMAN_ADV is not set
|
|
# CONFIG_OPENVSWITCH is not set
|
|
+# CONFIG_NETPRIO_CGROUP is not set
|
|
CONFIG_BQL=y
|
|
-CONFIG_HAVE_BPF_JIT=y
|
|
# CONFIG_BPF_JIT is not set
|
|
|
|
#
|
|
@@ -477,18 +497,25 @@ CONFIG_HAVE_BPF_JIT=y
|
|
# CONFIG_BT is not set
|
|
# CONFIG_AF_RXRPC is not set
|
|
CONFIG_WIRELESS=y
|
|
-# CONFIG_CFG80211 is not set
|
|
+CONFIG_WEXT_CORE=y
|
|
+CONFIG_WEXT_PROC=y
|
|
+CONFIG_CFG80211=y
|
|
+# CONFIG_NL80211_TESTMODE is not set
|
|
+# CONFIG_CFG80211_DEVELOPER_WARNINGS is not set
|
|
+# CONFIG_CFG80211_REG_DEBUG is not set
|
|
+CONFIG_CFG80211_DEFAULT_PS=y
|
|
+# CONFIG_CFG80211_DEBUGFS is not set
|
|
+# CONFIG_CFG80211_INTERNAL_REGDB is not set
|
|
+CONFIG_CFG80211_WEXT=y
|
|
# CONFIG_LIB80211 is not set
|
|
-
|
|
-#
|
|
-# CFG80211 needs to be enabled for MAC80211
|
|
-#
|
|
+# CONFIG_MAC80211 is not set
|
|
# CONFIG_WIMAX is not set
|
|
# CONFIG_RFKILL is not set
|
|
# CONFIG_NET_9P is not set
|
|
# CONFIG_CAIF is not set
|
|
# CONFIG_CEPH_LIB is not set
|
|
# CONFIG_NFC is not set
|
|
+CONFIG_HAVE_BPF_JIT=y
|
|
|
|
#
|
|
# Device Drivers
|
|
@@ -498,18 +525,28 @@ CONFIG_WIRELESS=y
|
|
# Generic Driver Options
|
|
#
|
|
CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
|
|
-# CONFIG_DEVTMPFS is not set
|
|
+CONFIG_DEVTMPFS=y
|
|
+CONFIG_DEVTMPFS_MOUNT=y
|
|
# CONFIG_STANDALONE is not set
|
|
# CONFIG_PREVENT_FIRMWARE_BUILD is not set
|
|
CONFIG_FW_LOADER=y
|
|
CONFIG_FIRMWARE_IN_KERNEL=y
|
|
CONFIG_EXTRA_FIRMWARE=""
|
|
-# CONFIG_DEBUG_DRIVER is not set
|
|
-# CONFIG_DEBUG_DEVRES is not set
|
|
+CONFIG_DEBUG_DRIVER=y
|
|
+CONFIG_DEBUG_DEVRES=y
|
|
# CONFIG_SYS_HYPERVISOR is not set
|
|
# CONFIG_GENERIC_CPU_DEVICES is not set
|
|
-# CONFIG_DMA_SHARED_BUFFER is not set
|
|
-# CONFIG_CONNECTOR is not set
|
|
+CONFIG_REGMAP=y
|
|
+CONFIG_REGMAP_I2C=y
|
|
+CONFIG_REGMAP_SPI=y
|
|
+CONFIG_DMA_SHARED_BUFFER=y
|
|
+# CONFIG_CMA is not set
|
|
+
|
|
+#
|
|
+# Bus devices
|
|
+#
|
|
+CONFIG_CONNECTOR=y
|
|
+CONFIG_PROC_EVENTS=y
|
|
CONFIG_MTD=y
|
|
# CONFIG_MTD_TESTS is not set
|
|
# CONFIG_MTD_REDBOOT_PARTS is not set
|
|
@@ -521,6 +558,7 @@ CONFIG_MTD=y
|
|
# User Modules And Translation Layers
|
|
#
|
|
CONFIG_MTD_CHAR=y
|
|
+CONFIG_HAVE_MTD_OTP=y
|
|
# CONFIG_MTD_BLKDEVS is not set
|
|
# CONFIG_MTD_BLOCK is not set
|
|
# CONFIG_MTD_BLOCK_RO is not set
|
|
@@ -563,7 +601,7 @@ CONFIG_MTD_CFI_I2=y
|
|
#
|
|
CONFIG_MTD_DATAFLASH=y
|
|
# CONFIG_MTD_DATAFLASH_WRITE_VERIFY is not set
|
|
-# CONFIG_MTD_DATAFLASH_OTP is not set
|
|
+CONFIG_MTD_DATAFLASH_OTP=y
|
|
# CONFIG_MTD_M25P80 is not set
|
|
# CONFIG_MTD_SST25L is not set
|
|
# CONFIG_MTD_SLRAM is not set
|
|
@@ -604,7 +642,8 @@ CONFIG_MTD_DATAFLASH=y
|
|
# CONFIG_HMC6352 is not set
|
|
# CONFIG_DS1682 is not set
|
|
# CONFIG_TI_DAC7512 is not set
|
|
-# CONFIG_BMP085 is not set
|
|
+# CONFIG_BMP085_I2C is not set
|
|
+# CONFIG_BMP085_SPI is not set
|
|
# CONFIG_USB_SWITCH_FSA9480 is not set
|
|
# CONFIG_C2PORT is not set
|
|
|
|
@@ -617,7 +656,6 @@ CONFIG_MTD_DATAFLASH=y
|
|
# CONFIG_EEPROM_MAX6875 is not set
|
|
# CONFIG_EEPROM_93CX6 is not set
|
|
# CONFIG_EEPROM_93XX46 is not set
|
|
-# CONFIG_IWMC3200TOP is not set
|
|
|
|
#
|
|
# Texas Instruments shared transport line discipline
|
|
@@ -655,7 +693,6 @@ CONFIG_SCSI_MULTI_LUN=y
|
|
# CONFIG_SCSI_CONSTANTS is not set
|
|
# CONFIG_SCSI_LOGGING is not set
|
|
# CONFIG_SCSI_SCAN_ASYNC is not set
|
|
-CONFIG_SCSI_WAIT_SCAN=m
|
|
|
|
#
|
|
# SCSI Transports
|
|
@@ -693,6 +730,7 @@ CONFIG_ATA_BMDMA=y
|
|
#
|
|
# SATA SFF controllers with BMDMA
|
|
#
|
|
+# CONFIG_SATA_HIGHBANK is not set
|
|
# CONFIG_SATA_MV is not set
|
|
|
|
#
|
|
@@ -716,6 +754,7 @@ CONFIG_NET_CORE=y
|
|
CONFIG_MII=y
|
|
# CONFIG_NET_TEAM is not set
|
|
# CONFIG_MACVLAN is not set
|
|
+# CONFIG_VXLAN is not set
|
|
# CONFIG_NETCONSOLE is not set
|
|
# CONFIG_NETPOLL is not set
|
|
# CONFIG_NET_POLL_CONTROLLER is not set
|
|
@@ -725,46 +764,43 @@ CONFIG_MII=y
|
|
#
|
|
# CAIF transport drivers
|
|
#
|
|
+
|
|
+#
|
|
+# Distributed Switch Architecture drivers
|
|
+#
|
|
+# CONFIG_NET_DSA_MV88E6XXX is not set
|
|
+# CONFIG_NET_DSA_MV88E6060 is not set
|
|
+# CONFIG_NET_DSA_MV88E6XXX_NEED_PPU is not set
|
|
+# CONFIG_NET_DSA_MV88E6131 is not set
|
|
+# CONFIG_NET_DSA_MV88E6123_61_65 is not set
|
|
CONFIG_ETHERNET=y
|
|
-CONFIG_NET_VENDOR_BROADCOM=y
|
|
-# CONFIG_B44 is not set
|
|
+# CONFIG_NET_CADENCE is not set
|
|
+# CONFIG_NET_VENDOR_BROADCOM is not set
|
|
# CONFIG_NET_CALXEDA_XGMAC is not set
|
|
-CONFIG_NET_VENDOR_CHELSIO=y
|
|
-CONFIG_NET_VENDOR_CIRRUS=y
|
|
-# CONFIG_CS89x0 is not set
|
|
+# CONFIG_NET_VENDOR_CIRRUS is not set
|
|
# CONFIG_DM9000 is not set
|
|
# CONFIG_DNET is not set
|
|
-CONFIG_NET_VENDOR_FARADAY=y
|
|
-# CONFIG_FTMAC100 is not set
|
|
-# CONFIG_FTGMAC100 is not set
|
|
-CONFIG_NET_VENDOR_INTEL=y
|
|
-CONFIG_NET_VENDOR_I825XX=y
|
|
+# CONFIG_NET_VENDOR_FARADAY is not set
|
|
+# CONFIG_NET_VENDOR_INTEL is not set
|
|
CONFIG_NET_VENDOR_MARVELL=y
|
|
+CONFIG_MVMDIO=y
|
|
CONFIG_PXA168_ETH=y
|
|
-CONFIG_NET_VENDOR_MICREL=y
|
|
-# CONFIG_KS8851 is not set
|
|
-# CONFIG_KS8851_MLL is not set
|
|
-CONFIG_NET_VENDOR_MICROCHIP=y
|
|
-# CONFIG_ENC28J60 is not set
|
|
-CONFIG_NET_VENDOR_NATSEMI=y
|
|
-CONFIG_NET_VENDOR_8390=y
|
|
-# CONFIG_AX88796 is not set
|
|
+# CONFIG_NET_VENDOR_MICREL is not set
|
|
+# CONFIG_NET_VENDOR_MICROCHIP is not set
|
|
+# CONFIG_NET_VENDOR_NATSEMI is not set
|
|
# CONFIG_ETHOC is not set
|
|
-CONFIG_NET_VENDOR_SEEQ=y
|
|
-# CONFIG_SEEQ8005 is not set
|
|
-CONFIG_NET_VENDOR_SMSC=y
|
|
-CONFIG_SMC91X=y
|
|
-# CONFIG_SMC911X is not set
|
|
-# CONFIG_SMSC911X is not set
|
|
-CONFIG_NET_VENDOR_STMICRO=y
|
|
-# CONFIG_STMMAC_ETH is not set
|
|
+# CONFIG_NET_VENDOR_SEEQ is not set
|
|
+# CONFIG_NET_VENDOR_SMSC is not set
|
|
+# CONFIG_NET_VENDOR_STMICRO is not set
|
|
+# CONFIG_NET_VENDOR_WIZNET is not set
|
|
CONFIG_PHYLIB=y
|
|
|
|
#
|
|
# MII PHY device drivers
|
|
#
|
|
+# CONFIG_AT803X_PHY is not set
|
|
# CONFIG_AMD_PHY is not set
|
|
-# CONFIG_MARVELL_PHY is not set
|
|
+CONFIG_MARVELL_PHY=y
|
|
# CONFIG_DAVICOM_PHY is not set
|
|
# CONFIG_QSEMI_PHY is not set
|
|
# CONFIG_LXT_PHY is not set
|
|
@@ -772,6 +808,7 @@ CONFIG_PHYLIB=y
|
|
# CONFIG_VITESSE_PHY is not set
|
|
# CONFIG_SMSC_PHY is not set
|
|
# CONFIG_BROADCOM_PHY is not set
|
|
+# CONFIG_BCM87XX_PHY is not set
|
|
# CONFIG_ICPLUS_PHY is not set
|
|
# CONFIG_REALTEK_PHY is not set
|
|
# CONFIG_NATIONAL_PHY is not set
|
|
@@ -795,7 +832,13 @@ CONFIG_PHYLIB=y
|
|
# CONFIG_USB_IPHETH is not set
|
|
CONFIG_WLAN=y
|
|
# CONFIG_USB_ZD1201 is not set
|
|
+# CONFIG_USB_NET_RNDIS_WLAN is not set
|
|
+# CONFIG_ATH_CARDS is not set
|
|
+# CONFIG_BRCMFMAC is not set
|
|
# CONFIG_HOSTAP is not set
|
|
+# CONFIG_LIBERTAS is not set
|
|
+# CONFIG_WL_TI is not set
|
|
+# CONFIG_MWIFIEX is not set
|
|
|
|
#
|
|
# Enable WiMAX (Networking options) to see the WiMAX drivers
|
|
@@ -807,9 +850,10 @@ CONFIG_WLAN=y
|
|
# Input device support
|
|
#
|
|
CONFIG_INPUT=y
|
|
-# CONFIG_INPUT_FF_MEMLESS is not set
|
|
+CONFIG_INPUT_FF_MEMLESS=y
|
|
# CONFIG_INPUT_POLLDEV is not set
|
|
-# CONFIG_INPUT_SPARSEKMAP is not set
|
|
+CONFIG_INPUT_SPARSEKMAP=y
|
|
+CONFIG_INPUT_MATRIXKMAP=y
|
|
|
|
#
|
|
# Userland interfaces
|
|
@@ -819,23 +863,119 @@ CONFIG_INPUT_MOUSEDEV=y
|
|
CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024
|
|
CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
|
|
# CONFIG_INPUT_JOYDEV is not set
|
|
-# CONFIG_INPUT_EVDEV is not set
|
|
+CONFIG_INPUT_EVDEV=y
|
|
# CONFIG_INPUT_EVBUG is not set
|
|
|
|
#
|
|
# Input Device Drivers
|
|
#
|
|
-# CONFIG_INPUT_KEYBOARD is not set
|
|
-# CONFIG_INPUT_MOUSE is not set
|
|
+CONFIG_INPUT_KEYBOARD=y
|
|
+# CONFIG_KEYBOARD_ADP5588 is not set
|
|
+# CONFIG_KEYBOARD_ADP5589 is not set
|
|
+CONFIG_KEYBOARD_ATKBD=y
|
|
+# CONFIG_KEYBOARD_QT1070 is not set
|
|
+# CONFIG_KEYBOARD_QT2160 is not set
|
|
+# CONFIG_KEYBOARD_LKKBD is not set
|
|
+# CONFIG_KEYBOARD_GPIO is not set
|
|
+# CONFIG_KEYBOARD_TCA6416 is not set
|
|
+# CONFIG_KEYBOARD_TCA8418 is not set
|
|
+# CONFIG_KEYBOARD_MATRIX is not set
|
|
+# CONFIG_KEYBOARD_LM8323 is not set
|
|
+# CONFIG_KEYBOARD_LM8333 is not set
|
|
+# CONFIG_KEYBOARD_MAX7359 is not set
|
|
+# CONFIG_KEYBOARD_MCS is not set
|
|
+# CONFIG_KEYBOARD_MPR121 is not set
|
|
+# CONFIG_KEYBOARD_NEWTON is not set
|
|
+# CONFIG_KEYBOARD_OPENCORES is not set
|
|
+CONFIG_KEYBOARD_PXA27x=y
|
|
+# CONFIG_KEYBOARD_SAMSUNG is not set
|
|
+# CONFIG_KEYBOARD_STOWAWAY is not set
|
|
+# CONFIG_KEYBOARD_SUNKBD is not set
|
|
+# CONFIG_KEYBOARD_XTKBD is not set
|
|
+CONFIG_INPUT_MOUSE=y
|
|
+CONFIG_MOUSE_PS2=y
|
|
+CONFIG_MOUSE_PS2_ALPS=y
|
|
+CONFIG_MOUSE_PS2_LOGIPS2PP=y
|
|
+CONFIG_MOUSE_PS2_SYNAPTICS=y
|
|
+CONFIG_MOUSE_PS2_TRACKPOINT=y
|
|
+# CONFIG_MOUSE_PS2_ELANTECH is not set
|
|
+# CONFIG_MOUSE_PS2_SENTELIC is not set
|
|
+# CONFIG_MOUSE_PS2_TOUCHKIT is not set
|
|
+# CONFIG_MOUSE_SERIAL is not set
|
|
+# CONFIG_MOUSE_APPLETOUCH is not set
|
|
+# CONFIG_MOUSE_BCM5974 is not set
|
|
+# CONFIG_MOUSE_VSXXXAA is not set
|
|
+# CONFIG_MOUSE_GPIO is not set
|
|
+# CONFIG_MOUSE_SYNAPTICS_I2C is not set
|
|
+# CONFIG_MOUSE_SYNAPTICS_USB is not set
|
|
# CONFIG_INPUT_JOYSTICK is not set
|
|
# CONFIG_INPUT_TABLET is not set
|
|
-# CONFIG_INPUT_TOUCHSCREEN is not set
|
|
-# CONFIG_INPUT_MISC is not set
|
|
+CONFIG_INPUT_TOUCHSCREEN=y
|
|
+# CONFIG_TOUCHSCREEN_ADS7846 is not set
|
|
+# CONFIG_TOUCHSCREEN_AD7877 is not set
|
|
+# CONFIG_TOUCHSCREEN_AD7879 is not set
|
|
+# CONFIG_TOUCHSCREEN_ATMEL_MXT is not set
|
|
+# CONFIG_TOUCHSCREEN_AUO_PIXCIR is not set
|
|
+# CONFIG_TOUCHSCREEN_BU21013 is not set
|
|
+# CONFIG_TOUCHSCREEN_CY8CTMG110 is not set
|
|
+# CONFIG_TOUCHSCREEN_CYTTSP_CORE is not set
|
|
+# CONFIG_TOUCHSCREEN_DYNAPRO is not set
|
|
+# CONFIG_TOUCHSCREEN_HAMPSHIRE is not set
|
|
+# CONFIG_TOUCHSCREEN_EETI is not set
|
|
+# CONFIG_TOUCHSCREEN_FUJITSU is not set
|
|
+# CONFIG_TOUCHSCREEN_ILI210X is not set
|
|
+# CONFIG_TOUCHSCREEN_GUNZE is not set
|
|
+# CONFIG_TOUCHSCREEN_ELO is not set
|
|
+# CONFIG_TOUCHSCREEN_WACOM_W8001 is not set
|
|
+# CONFIG_TOUCHSCREEN_WACOM_I2C is not set
|
|
+# CONFIG_TOUCHSCREEN_MAX11801 is not set
|
|
+# CONFIG_TOUCHSCREEN_MCS5000 is not set
|
|
+# CONFIG_TOUCHSCREEN_MMS114 is not set
|
|
+# CONFIG_TOUCHSCREEN_MTOUCH is not set
|
|
+# CONFIG_TOUCHSCREEN_INEXIO is not set
|
|
+# CONFIG_TOUCHSCREEN_MK712 is not set
|
|
+# CONFIG_TOUCHSCREEN_PENMOUNT is not set
|
|
+# CONFIG_TOUCHSCREEN_EDT_FT5X06 is not set
|
|
+# CONFIG_TOUCHSCREEN_TOUCHRIGHT is not set
|
|
+# CONFIG_TOUCHSCREEN_TOUCHWIN is not set
|
|
+# CONFIG_TOUCHSCREEN_PIXCIR is not set
|
|
+# CONFIG_TOUCHSCREEN_USB_COMPOSITE is not set
|
|
+# CONFIG_TOUCHSCREEN_TOUCHIT213 is not set
|
|
+# CONFIG_TOUCHSCREEN_TSC_SERIO is not set
|
|
+# CONFIG_TOUCHSCREEN_TSC2005 is not set
|
|
+CONFIG_TOUCHSCREEN_TSC2007=y
|
|
+# CONFIG_TOUCHSCREEN_W90X900 is not set
|
|
+# CONFIG_TOUCHSCREEN_ST1232 is not set
|
|
+# CONFIG_TOUCHSCREEN_TPS6507X is not set
|
|
+CONFIG_INPUT_MISC=y
|
|
+# CONFIG_INPUT_AD714X is not set
|
|
+# CONFIG_INPUT_BMA150 is not set
|
|
+# CONFIG_INPUT_MMA8450 is not set
|
|
+# CONFIG_INPUT_MPU3050 is not set
|
|
+# CONFIG_INPUT_GP2A is not set
|
|
+# CONFIG_INPUT_GPIO_TILT_POLLED is not set
|
|
+# CONFIG_INPUT_ATI_REMOTE2 is not set
|
|
+# CONFIG_INPUT_KEYSPAN_REMOTE is not set
|
|
+# CONFIG_INPUT_KXTJ9 is not set
|
|
+# CONFIG_INPUT_POWERMATE is not set
|
|
+# CONFIG_INPUT_YEALINK is not set
|
|
+# CONFIG_INPUT_CM109 is not set
|
|
+# CONFIG_INPUT_UINPUT is not set
|
|
+# CONFIG_INPUT_PCF8574 is not set
|
|
+# CONFIG_INPUT_GPIO_ROTARY_ENCODER is not set
|
|
+# CONFIG_INPUT_ADXL34X is not set
|
|
+# CONFIG_INPUT_CMA3000 is not set
|
|
|
|
#
|
|
# Hardware I/O ports
|
|
#
|
|
-# CONFIG_SERIO is not set
|
|
+CONFIG_SERIO=y
|
|
+CONFIG_SERIO_SERPORT=y
|
|
+CONFIG_SERIO_LIBPS2=y
|
|
+# CONFIG_SERIO_RAW is not set
|
|
+# CONFIG_SERIO_ALTERA_PS2 is not set
|
|
+# CONFIG_SERIO_PS2MULT is not set
|
|
+# CONFIG_SERIO_ARC_PS2 is not set
|
|
# CONFIG_GAMEPORT is not set
|
|
|
|
#
|
|
@@ -844,8 +984,9 @@ CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
|
|
CONFIG_VT=y
|
|
CONFIG_CONSOLE_TRANSLATIONS=y
|
|
CONFIG_VT_CONSOLE=y
|
|
+CONFIG_VT_CONSOLE_SLEEP=y
|
|
CONFIG_HW_CONSOLE=y
|
|
-# CONFIG_VT_HW_CONSOLE_BINDING is not set
|
|
+CONFIG_VT_HW_CONSOLE_BINDING=y
|
|
CONFIG_UNIX98_PTYS=y
|
|
# CONFIG_DEVPTS_MULTIPLE_INSTANCES is not set
|
|
# CONFIG_LEGACY_PTYS is not set
|
|
@@ -863,29 +1004,37 @@ CONFIG_DEVKMEM=y
|
|
# Non-8250 serial port support
|
|
#
|
|
# CONFIG_SERIAL_MAX3100 is not set
|
|
-# CONFIG_SERIAL_MAX3107 is not set
|
|
+# CONFIG_SERIAL_MAX310X is not set
|
|
CONFIG_SERIAL_PXA=y
|
|
CONFIG_SERIAL_PXA_CONSOLE=y
|
|
CONFIG_SERIAL_CORE=y
|
|
CONFIG_SERIAL_CORE_CONSOLE=y
|
|
+# CONFIG_SERIAL_SCCNXP is not set
|
|
# CONFIG_SERIAL_TIMBERDALE is not set
|
|
# CONFIG_SERIAL_ALTERA_JTAGUART is not set
|
|
# CONFIG_SERIAL_ALTERA_UART is not set
|
|
# CONFIG_SERIAL_IFX6X60 is not set
|
|
-# CONFIG_SERIAL_XILINX_PS_UART is not set
|
|
+# CONFIG_SERIAL_ARC is not set
|
|
# CONFIG_HVC_DCC is not set
|
|
# CONFIG_IPMI_HANDLER is not set
|
|
# CONFIG_HW_RANDOM is not set
|
|
# CONFIG_R3964 is not set
|
|
# CONFIG_RAW_DRIVER is not set
|
|
# CONFIG_TCG_TPM is not set
|
|
-# CONFIG_RAMOOPS is not set
|
|
CONFIG_I2C=y
|
|
CONFIG_I2C_BOARDINFO=y
|
|
CONFIG_I2C_COMPAT=y
|
|
-# CONFIG_I2C_CHARDEV is not set
|
|
+CONFIG_I2C_CHARDEV=y
|
|
# CONFIG_I2C_MUX is not set
|
|
-CONFIG_I2C_HELPER_AUTO=y
|
|
+# CONFIG_I2C_HELPER_AUTO is not set
|
|
+CONFIG_I2C_SMBUS=y
|
|
+
|
|
+#
|
|
+# I2C Algorithms
|
|
+#
|
|
+CONFIG_I2C_ALGOBIT=y
|
|
+CONFIG_I2C_ALGOPCF=y
|
|
+CONFIG_I2C_ALGOPCA=y
|
|
|
|
#
|
|
# I2C Hardware Bus support
|
|
@@ -894,6 +1043,7 @@ CONFIG_I2C_HELPER_AUTO=y
|
|
#
|
|
# I2C system bus drivers (mostly embedded / system-on-chip)
|
|
#
|
|
+# CONFIG_I2C_CBUS_GPIO is not set
|
|
# CONFIG_I2C_DESIGNWARE_PLATFORM is not set
|
|
# CONFIG_I2C_GPIO is not set
|
|
# CONFIG_I2C_OCORES is not set
|
|
@@ -932,6 +1082,8 @@ CONFIG_SPI_MASTER=y
|
|
# CONFIG_SPI_OC_TINY is not set
|
|
CONFIG_SPI_PXA2XX=y
|
|
# CONFIG_SPI_PXA2XX_PCI is not set
|
|
+# CONFIG_SPI_SC18IS602 is not set
|
|
+# CONFIG_SPI_XCOMM is not set
|
|
# CONFIG_SPI_XILINX is not set
|
|
# CONFIG_SPI_DESIGNWARE is not set
|
|
|
|
@@ -954,10 +1106,25 @@ CONFIG_SPI_PXA2XX=y
|
|
#
|
|
# PTP clock support
|
|
#
|
|
+# CONFIG_PTP_1588_CLOCK is not set
|
|
|
|
#
|
|
-# Enable Device Drivers -> PPS to see the PTP clock options.
|
|
+# Enable PHYLIB and NETWORK_PHY_TIMESTAMPING to see the additional clocks.
|
|
+#
|
|
+# CONFIG_PTP_1588_CLOCK_PCH is not set
|
|
+CONFIG_PINCTRL=y
|
|
+
|
|
#
|
|
+# Pin controllers
|
|
+#
|
|
+# CONFIG_PINMUX is not set
|
|
+# CONFIG_PINCONF is not set
|
|
+# CONFIG_DEBUG_PINCTRL is not set
|
|
+# CONFIG_PINCTRL_MMP2 is not set
|
|
+# CONFIG_PINCTRL_PXA168 is not set
|
|
+# CONFIG_PINCTRL_PXA910 is not set
|
|
+# CONFIG_PINCTRL_EXYNOS5440 is not set
|
|
+CONFIG_ARCH_HAVE_CUSTOM_GPIO_H=y
|
|
CONFIG_ARCH_REQUIRE_GPIOLIB=y
|
|
CONFIG_GPIOLIB=y
|
|
# CONFIG_DEBUG_GPIO is not set
|
|
@@ -967,14 +1134,16 @@ CONFIG_GPIOLIB=y
|
|
# Memory mapped GPIO drivers:
|
|
#
|
|
# CONFIG_GPIO_GENERIC_PLATFORM is not set
|
|
+# CONFIG_GPIO_EM is not set
|
|
CONFIG_GPIO_PXA=y
|
|
+# CONFIG_GPIO_TS5500 is not set
|
|
|
|
#
|
|
# I2C GPIO expanders:
|
|
#
|
|
# CONFIG_GPIO_MAX7300 is not set
|
|
# CONFIG_GPIO_MAX732X is not set
|
|
-# CONFIG_GPIO_PCA953X is not set
|
|
+CONFIG_GPIO_PCA953X_IRQ=y
|
|
# CONFIG_GPIO_PCF857X is not set
|
|
# CONFIG_GPIO_SX150X is not set
|
|
# CONFIG_GPIO_ADP5588 is not set
|
|
@@ -998,8 +1167,13 @@ CONFIG_GPIO_PXA=y
|
|
#
|
|
# MODULbus GPIO expanders:
|
|
#
|
|
+
|
|
+#
|
|
+# USB GPIO expanders:
|
|
+#
|
|
# CONFIG_W1 is not set
|
|
# CONFIG_POWER_SUPPLY is not set
|
|
+# CONFIG_POWER_AVS is not set
|
|
# CONFIG_HWMON is not set
|
|
# CONFIG_THERMAL is not set
|
|
# CONFIG_WATCHDOG is not set
|
|
@@ -1019,13 +1193,17 @@ CONFIG_BCMA_POSSIBLE=y
|
|
#
|
|
# Multifunction device drivers
|
|
#
|
|
-# CONFIG_MFD_CORE is not set
|
|
+CONFIG_MFD_CORE=m
|
|
# CONFIG_MFD_88PM860X is not set
|
|
+# CONFIG_MFD_88PM800 is not set
|
|
+# CONFIG_MFD_88PM805 is not set
|
|
# CONFIG_MFD_SM501 is not set
|
|
# CONFIG_MFD_ASIC3 is not set
|
|
+# CONFIG_MFD_TI_AM335X_TSCADC is not set
|
|
# CONFIG_HTC_EGPIO is not set
|
|
# CONFIG_HTC_PASIC3 is not set
|
|
# CONFIG_HTC_I2CPLD is not set
|
|
+# CONFIG_MFD_LM3533 is not set
|
|
# CONFIG_TPS6105X is not set
|
|
# CONFIG_TPS65010 is not set
|
|
# CONFIG_TPS6507X is not set
|
|
@@ -1034,54 +1212,335 @@ CONFIG_BCMA_POSSIBLE=y
|
|
# CONFIG_MFD_TPS65910 is not set
|
|
# CONFIG_MFD_TPS65912_I2C is not set
|
|
# CONFIG_MFD_TPS65912_SPI is not set
|
|
+# CONFIG_MFD_TPS80031 is not set
|
|
# CONFIG_TWL4030_CORE is not set
|
|
# CONFIG_TWL6040_CORE is not set
|
|
# CONFIG_MFD_STMPE is not set
|
|
# CONFIG_MFD_TC3589X is not set
|
|
# CONFIG_MFD_TMIO is not set
|
|
# CONFIG_MFD_T7L66XB is not set
|
|
+# CONFIG_MFD_SMSC is not set
|
|
# CONFIG_MFD_TC6387XB is not set
|
|
# CONFIG_MFD_TC6393XB is not set
|
|
# CONFIG_PMIC_DA903X is not set
|
|
# CONFIG_MFD_DA9052_SPI is not set
|
|
# CONFIG_MFD_DA9052_I2C is not set
|
|
+# CONFIG_MFD_DA9055 is not set
|
|
# CONFIG_PMIC_ADP5520 is not set
|
|
+# CONFIG_MFD_LP8788 is not set
|
|
+# CONFIG_MFD_MAX77686 is not set
|
|
+# CONFIG_MFD_MAX77693 is not set
|
|
+# CONFIG_MFD_MAX8907 is not set
|
|
# CONFIG_MFD_MAX8925 is not set
|
|
# CONFIG_MFD_MAX8997 is not set
|
|
# CONFIG_MFD_MAX8998 is not set
|
|
-# CONFIG_MFD_S5M_CORE is not set
|
|
+# CONFIG_MFD_SEC_CORE is not set
|
|
+# CONFIG_MFD_ARIZONA_I2C is not set
|
|
+# CONFIG_MFD_ARIZONA_SPI is not set
|
|
# CONFIG_MFD_WM8400 is not set
|
|
# CONFIG_MFD_WM831X_I2C is not set
|
|
# CONFIG_MFD_WM831X_SPI is not set
|
|
# CONFIG_MFD_WM8350_I2C is not set
|
|
# CONFIG_MFD_WM8994 is not set
|
|
# CONFIG_MFD_PCF50633 is not set
|
|
-# CONFIG_MFD_MC13XXX is not set
|
|
+# CONFIG_MFD_MC13XXX_SPI is not set
|
|
+# CONFIG_MFD_MC13XXX_I2C is not set
|
|
# CONFIG_ABX500_CORE is not set
|
|
# CONFIG_EZX_PCAP is not set
|
|
# CONFIG_MFD_WL1273_CORE is not set
|
|
# CONFIG_MFD_TPS65090 is not set
|
|
# CONFIG_MFD_AAT2870_CORE is not set
|
|
# CONFIG_MFD_RC5T583 is not set
|
|
+# CONFIG_MFD_PALMAS is not set
|
|
+# CONFIG_MFD_VIPERBOARD is not set
|
|
+# CONFIG_MFD_RETU is not set
|
|
+# CONFIG_MFD_AS3711 is not set
|
|
# CONFIG_REGULATOR is not set
|
|
-# CONFIG_MEDIA_SUPPORT is not set
|
|
+CONFIG_MEDIA_SUPPORT=y
|
|
+
|
|
+#
|
|
+# Multimedia core support
|
|
+#
|
|
+CONFIG_MEDIA_CAMERA_SUPPORT=y
|
|
+# CONFIG_MEDIA_ANALOG_TV_SUPPORT is not set
|
|
+# CONFIG_MEDIA_DIGITAL_TV_SUPPORT is not set
|
|
+# CONFIG_MEDIA_RADIO_SUPPORT is not set
|
|
+# CONFIG_MEDIA_RC_SUPPORT is not set
|
|
+CONFIG_MEDIA_CONTROLLER=y
|
|
+CONFIG_VIDEO_DEV=y
|
|
+CONFIG_VIDEO_V4L2_SUBDEV_API=y
|
|
+CONFIG_VIDEO_V4L2=y
|
|
+# CONFIG_VIDEO_ADV_DEBUG is not set
|
|
+# CONFIG_VIDEO_FIXED_MINOR_RANGES is not set
|
|
+
|
|
+#
|
|
+# Media drivers
|
|
+#
|
|
+# CONFIG_MEDIA_USB_SUPPORT is not set
|
|
+CONFIG_V4L_PLATFORM_DRIVERS=y
|
|
+# CONFIG_VIDEO_MMP_CAMERA is not set
|
|
+# CONFIG_SOC_CAMERA is not set
|
|
+# CONFIG_V4L_MEM2MEM_DRIVERS is not set
|
|
+# CONFIG_V4L_TEST_DRIVERS is not set
|
|
+
|
|
+#
|
|
+# Supported MMC/SDIO adapters
|
|
+#
|
|
+CONFIG_MEDIA_SUBDRV_AUTOSELECT=y
|
|
+
|
|
+#
|
|
+# Media ancillary drivers (tuners, sensors, i2c, frontends)
|
|
+#
|
|
+
|
|
+#
|
|
+# Audio decoders, processors and mixers
|
|
+#
|
|
+
|
|
+#
|
|
+# RDS decoders
|
|
+#
|
|
+
|
|
+#
|
|
+# Video decoders
|
|
+#
|
|
+
|
|
+#
|
|
+# Video and audio decoders
|
|
+#
|
|
+
|
|
+#
|
|
+# MPEG video encoders
|
|
+#
|
|
+
|
|
+#
|
|
+# Video encoders
|
|
+#
|
|
+
|
|
+#
|
|
+# Camera sensor devices
|
|
+#
|
|
+
|
|
+#
|
|
+# Flash devices
|
|
+#
|
|
+
|
|
+#
|
|
+# Video improvement chips
|
|
+#
|
|
+
|
|
+#
|
|
+# Miscelaneous helper chips
|
|
+#
|
|
+
|
|
+#
|
|
+# Sensors used on soc_camera driver
|
|
+#
|
|
+
|
|
+#
|
|
+# Tools to develop new frontends
|
|
+#
|
|
+# CONFIG_DVB_DUMMY_FE is not set
|
|
|
|
#
|
|
# Graphics support
|
|
#
|
|
-# CONFIG_DRM is not set
|
|
+CONFIG_DRM=y
|
|
+# CONFIG_DRM_UDL is not set
|
|
# CONFIG_VGASTATE is not set
|
|
-# CONFIG_VIDEO_OUTPUT_CONTROL is not set
|
|
-# CONFIG_FB is not set
|
|
+CONFIG_VIDEO_OUTPUT_CONTROL=y
|
|
+CONFIG_FB=y
|
|
+# CONFIG_FIRMWARE_EDID is not set
|
|
+# CONFIG_FB_DDC is not set
|
|
+# CONFIG_FB_BOOT_VESA_SUPPORT is not set
|
|
+CONFIG_FB_CFB_FILLRECT=y
|
|
+CONFIG_FB_CFB_COPYAREA=y
|
|
+CONFIG_FB_CFB_IMAGEBLIT=y
|
|
+# CONFIG_FB_CFB_REV_PIXELS_IN_BYTE is not set
|
|
+CONFIG_FB_SYS_FILLRECT=y
|
|
+CONFIG_FB_SYS_COPYAREA=y
|
|
+CONFIG_FB_SYS_IMAGEBLIT=y
|
|
+# CONFIG_FB_FOREIGN_ENDIAN is not set
|
|
+CONFIG_FB_SYS_FOPS=y
|
|
+# CONFIG_FB_WMT_GE_ROPS is not set
|
|
+CONFIG_FB_DEFERRED_IO=y
|
|
+# CONFIG_FB_SVGALIB is not set
|
|
+# CONFIG_FB_MACMODES is not set
|
|
+# CONFIG_FB_BACKLIGHT is not set
|
|
+CONFIG_FB_MODE_HELPERS=y
|
|
+CONFIG_FB_TILEBLITTING=y
|
|
+
|
|
+#
|
|
+# Frame buffer hardware drivers
|
|
+#
|
|
+# CONFIG_FB_UVESA is not set
|
|
+# CONFIG_FB_S1D13XXX is not set
|
|
+CONFIG_TDA9981=y
|
|
+CONFIG_TDA9950=y
|
|
+CONFIG_FB_PXA168=y
|
|
+# CONFIG_FB_TMIO is not set
|
|
+# CONFIG_FB_SMSCUFX is not set
|
|
+# CONFIG_FB_UDL is not set
|
|
+CONFIG_FB_VIRTUAL=y
|
|
+# CONFIG_FB_METRONOME is not set
|
|
+# CONFIG_FB_BROADSHEET is not set
|
|
+# CONFIG_FB_AUO_K190X is not set
|
|
# CONFIG_EXYNOS_VIDEO is not set
|
|
-# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
|
|
+CONFIG_BACKLIGHT_LCD_SUPPORT=y
|
|
+CONFIG_LCD_CLASS_DEVICE=y
|
|
+# CONFIG_LCD_L4F00242T03 is not set
|
|
+# CONFIG_LCD_LMS283GF05 is not set
|
|
+# CONFIG_LCD_LTV350QV is not set
|
|
+# CONFIG_LCD_ILI9320 is not set
|
|
+# CONFIG_LCD_TDO24M is not set
|
|
+# CONFIG_LCD_VGG2432A4 is not set
|
|
+# CONFIG_LCD_PLATFORM is not set
|
|
+# CONFIG_LCD_S6E63M0 is not set
|
|
+# CONFIG_LCD_LD9040 is not set
|
|
+# CONFIG_LCD_AMS369FG06 is not set
|
|
+CONFIG_BACKLIGHT_CLASS_DEVICE=y
|
|
+CONFIG_BACKLIGHT_GENERIC=y
|
|
+# CONFIG_BACKLIGHT_ADP8860 is not set
|
|
+# CONFIG_BACKLIGHT_ADP8870 is not set
|
|
+# CONFIG_BACKLIGHT_LM3630 is not set
|
|
+# CONFIG_BACKLIGHT_LM3639 is not set
|
|
+# CONFIG_BACKLIGHT_LP855X is not set
|
|
|
|
#
|
|
# Console display driver support
|
|
#
|
|
CONFIG_DUMMY_CONSOLE=y
|
|
-# CONFIG_SOUND is not set
|
|
-# CONFIG_HID_SUPPORT is not set
|
|
+# CONFIG_FRAMEBUFFER_CONSOLE is not set
|
|
+# CONFIG_LOGO is not set
|
|
+CONFIG_SOUND=y
|
|
+# CONFIG_SOUND_OSS_CORE is not set
|
|
+CONFIG_SND=y
|
|
+CONFIG_SND_TIMER=y
|
|
+CONFIG_SND_PCM=y
|
|
+CONFIG_SND_RAWMIDI=m
|
|
+CONFIG_SND_COMPRESS_OFFLOAD=y
|
|
+CONFIG_SND_JACK=y
|
|
+# CONFIG_SND_SEQUENCER is not set
|
|
+# CONFIG_SND_MIXER_OSS is not set
|
|
+# CONFIG_SND_PCM_OSS is not set
|
|
+# CONFIG_SND_HRTIMER is not set
|
|
+# CONFIG_SND_DYNAMIC_MINORS is not set
|
|
+CONFIG_SND_SUPPORT_OLD_API=y
|
|
+CONFIG_SND_VERBOSE_PROCFS=y
|
|
+# CONFIG_SND_VERBOSE_PRINTK is not set
|
|
+# CONFIG_SND_DEBUG is not set
|
|
+# CONFIG_SND_RAWMIDI_SEQ is not set
|
|
+# CONFIG_SND_OPL3_LIB_SEQ is not set
|
|
+# CONFIG_SND_OPL4_LIB_SEQ is not set
|
|
+# CONFIG_SND_SBAWE_SEQ is not set
|
|
+# CONFIG_SND_EMU10K1_SEQ is not set
|
|
+CONFIG_SND_DRIVERS=y
|
|
+CONFIG_SND_DUMMY=y
|
|
+# CONFIG_SND_ALOOP is not set
|
|
+# CONFIG_SND_MTPAV is not set
|
|
+# CONFIG_SND_SERIAL_U16550 is not set
|
|
+# CONFIG_SND_MPU401 is not set
|
|
+CONFIG_SND_ARM=y
|
|
+CONFIG_SND_SPI=y
|
|
+CONFIG_SND_USB=y
|
|
+# CONFIG_SND_USB_AUDIO is not set
|
|
+# CONFIG_SND_USB_UA101 is not set
|
|
+# CONFIG_SND_USB_CAIAQ is not set
|
|
+# CONFIG_SND_USB_6FIRE is not set
|
|
+CONFIG_SND_SOC=y
|
|
+# CONFIG_SND_DESIGNWARE_I2S is not set
|
|
+# CONFIG_SND_MMP_SOC is not set
|
|
+# CONFIG_SND_PXA910_SOC is not set
|
|
+CONFIG_SND_SOC_I2C_AND_SPI=y
|
|
+# CONFIG_SND_SOC_ALL_CODECS is not set
|
|
+# CONFIG_SND_SIMPLE_CARD is not set
|
|
+# CONFIG_SOUND_PRIME is not set
|
|
+
|
|
+#
|
|
+# HID support
|
|
+#
|
|
+CONFIG_HID=y
|
|
+# CONFIG_HIDRAW is not set
|
|
+CONFIG_UHID=y
|
|
+CONFIG_HID_GENERIC=y
|
|
+
|
|
+#
|
|
+# Special HID drivers
|
|
+#
|
|
+CONFIG_HID_A4TECH=y
|
|
+CONFIG_HID_ACRUX=m
|
|
+CONFIG_HID_ACRUX_FF=y
|
|
+CONFIG_HID_APPLE=y
|
|
+CONFIG_HID_AUREAL=m
|
|
+CONFIG_HID_BELKIN=y
|
|
+CONFIG_HID_CHERRY=y
|
|
+CONFIG_HID_CHICONY=y
|
|
+CONFIG_HID_PRODIKEYS=m
|
|
+CONFIG_HID_CYPRESS=y
|
|
+CONFIG_HID_DRAGONRISE=m
|
|
+CONFIG_DRAGONRISE_FF=y
|
|
+CONFIG_HID_EMS_FF=m
|
|
+CONFIG_HID_EZKEY=y
|
|
+CONFIG_HID_HOLTEK=m
|
|
+CONFIG_HOLTEK_FF=y
|
|
+CONFIG_HID_KEYTOUCH=m
|
|
+CONFIG_HID_KYE=m
|
|
+CONFIG_HID_UCLOGIC=m
|
|
+CONFIG_HID_WALTOP=m
|
|
+CONFIG_HID_GYRATION=m
|
|
+CONFIG_HID_TWINHAN=m
|
|
+CONFIG_HID_KENSINGTON=y
|
|
+CONFIG_HID_LCPOWER=m
|
|
+CONFIG_HID_LENOVO_TPKBD=m
|
|
+CONFIG_HID_LOGITECH=y
|
|
+CONFIG_HID_LOGITECH_DJ=m
|
|
+CONFIG_LOGITECH_FF=y
|
|
+CONFIG_LOGIRUMBLEPAD2_FF=y
|
|
+CONFIG_LOGIG940_FF=y
|
|
+CONFIG_LOGIWHEELS_FF=y
|
|
+CONFIG_HID_MICROSOFT=y
|
|
+CONFIG_HID_MONTEREY=y
|
|
+CONFIG_HID_MULTITOUCH=m
|
|
+CONFIG_HID_NTRIG=m
|
|
+CONFIG_HID_ORTEK=m
|
|
+CONFIG_HID_PANTHERLORD=m
|
|
+CONFIG_PANTHERLORD_FF=y
|
|
+CONFIG_HID_PETALYNX=m
|
|
+CONFIG_HID_PICOLCD=m
|
|
+CONFIG_HID_PICOLCD_FB=y
|
|
+CONFIG_HID_PICOLCD_BACKLIGHT=y
|
|
+CONFIG_HID_PICOLCD_LCD=y
|
|
+CONFIG_HID_PICOLCD_LEDS=y
|
|
+CONFIG_HID_PRIMAX=m
|
|
+CONFIG_HID_ROCCAT=m
|
|
+CONFIG_HID_SAITEK=m
|
|
+CONFIG_HID_SAMSUNG=m
|
|
+CONFIG_HID_SONY=m
|
|
+CONFIG_HID_SPEEDLINK=m
|
|
+CONFIG_HID_SUNPLUS=m
|
|
+CONFIG_HID_GREENASIA=m
|
|
+CONFIG_GREENASIA_FF=y
|
|
+CONFIG_HID_SMARTJOYPLUS=m
|
|
+CONFIG_SMARTJOYPLUS_FF=y
|
|
+CONFIG_HID_TIVO=m
|
|
+CONFIG_HID_TOPSEED=m
|
|
+CONFIG_HID_THRUSTMASTER=m
|
|
+CONFIG_THRUSTMASTER_FF=y
|
|
+CONFIG_HID_ZEROPLUS=m
|
|
+CONFIG_ZEROPLUS_FF=y
|
|
+CONFIG_HID_ZYDACRON=m
|
|
+CONFIG_HID_SENSOR_HUB=m
|
|
+
|
|
+#
|
|
+# USB HID support
|
|
+#
|
|
+CONFIG_USB_HID=y
|
|
+CONFIG_HID_PID=y
|
|
+CONFIG_USB_HIDDEV=y
|
|
+
|
|
+#
|
|
+# I2C HID support
|
|
+#
|
|
+CONFIG_I2C_HID=y
|
|
# CONFIG_USB_ARCH_HAS_OHCI is not set
|
|
CONFIG_USB_ARCH_HAS_EHCI=y
|
|
# CONFIG_USB_ARCH_HAS_XHCI is not set
|
|
@@ -1089,16 +1548,19 @@ CONFIG_USB_SUPPORT=y
|
|
CONFIG_USB_COMMON=y
|
|
CONFIG_USB_ARCH_HAS_HCD=y
|
|
CONFIG_USB=y
|
|
-# CONFIG_USB_DEBUG is not set
|
|
-# CONFIG_USB_ANNOUNCE_NEW_DEVICES is not set
|
|
+CONFIG_USB_DEBUG=y
|
|
+CONFIG_USB_ANNOUNCE_NEW_DEVICES=y
|
|
|
|
#
|
|
# Miscellaneous USB options
|
|
#
|
|
-# CONFIG_USB_DEVICEFS is not set
|
|
-CONFIG_USB_DEVICE_CLASS=y
|
|
-# CONFIG_USB_DYNAMIC_MINORS is not set
|
|
-# CONFIG_USB_MON is not set
|
|
+CONFIG_USB_DYNAMIC_MINORS=y
|
|
+CONFIG_USB_SUSPEND=y
|
|
+CONFIG_USB_OTG=y
|
|
+CONFIG_USB_OTG_WHITELIST=y
|
|
+# CONFIG_USB_OTG_BLACKLIST_HUB is not set
|
|
+# CONFIG_USB_DWC3 is not set
|
|
+CONFIG_USB_MON=y
|
|
# CONFIG_USB_WUSB_CBAF is not set
|
|
|
|
#
|
|
@@ -1116,6 +1578,9 @@ CONFIG_USB_EHCI_MV=y
|
|
# CONFIG_USB_EHCI_HCD_PLATFORM is not set
|
|
# CONFIG_USB_SL811_HCD is not set
|
|
# CONFIG_USB_R8A66597_HCD is not set
|
|
+# CONFIG_USB_MUSB_HDRC is not set
|
|
+# CONFIG_USB_CHIPIDEA is not set
|
|
+# CONFIG_USB_RENESAS_USBHS is not set
|
|
|
|
#
|
|
# USB Device Class drivers
|
|
@@ -1133,21 +1598,21 @@ CONFIG_USB_WDM=y
|
|
# also be needed; see USB_STORAGE Help for more info
|
|
#
|
|
CONFIG_USB_STORAGE=y
|
|
-# CONFIG_USB_STORAGE_DEBUG is not set
|
|
-# CONFIG_USB_STORAGE_REALTEK is not set
|
|
-# CONFIG_USB_STORAGE_DATAFAB is not set
|
|
-# CONFIG_USB_STORAGE_FREECOM is not set
|
|
-# CONFIG_USB_STORAGE_ISD200 is not set
|
|
-# CONFIG_USB_STORAGE_USBAT is not set
|
|
-# CONFIG_USB_STORAGE_SDDR09 is not set
|
|
-# CONFIG_USB_STORAGE_SDDR55 is not set
|
|
-# CONFIG_USB_STORAGE_JUMPSHOT is not set
|
|
-# CONFIG_USB_STORAGE_ALAUDA is not set
|
|
-# CONFIG_USB_STORAGE_ONETOUCH is not set
|
|
-# CONFIG_USB_STORAGE_KARMA is not set
|
|
-# CONFIG_USB_STORAGE_CYPRESS_ATACB is not set
|
|
-# CONFIG_USB_STORAGE_ENE_UB6250 is not set
|
|
-# CONFIG_USB_LIBUSUAL is not set
|
|
+CONFIG_USB_STORAGE_DEBUG=y
|
|
+CONFIG_USB_STORAGE_REALTEK=m
|
|
+CONFIG_REALTEK_AUTOPM=y
|
|
+CONFIG_USB_STORAGE_DATAFAB=m
|
|
+CONFIG_USB_STORAGE_FREECOM=m
|
|
+CONFIG_USB_STORAGE_ISD200=m
|
|
+CONFIG_USB_STORAGE_USBAT=m
|
|
+CONFIG_USB_STORAGE_SDDR09=m
|
|
+CONFIG_USB_STORAGE_SDDR55=m
|
|
+CONFIG_USB_STORAGE_JUMPSHOT=m
|
|
+CONFIG_USB_STORAGE_ALAUDA=m
|
|
+CONFIG_USB_STORAGE_ONETOUCH=m
|
|
+CONFIG_USB_STORAGE_KARMA=m
|
|
+CONFIG_USB_STORAGE_CYPRESS_ATACB=m
|
|
+CONFIG_USB_STORAGE_ENE_UB6250=m
|
|
|
|
#
|
|
# USB Imaging devices
|
|
@@ -1159,8 +1624,7 @@ CONFIG_USB_STORAGE=y
|
|
# USB port drivers
|
|
#
|
|
CONFIG_USB_SERIAL=y
|
|
-# CONFIG_USB_SERIAL_CONSOLE is not set
|
|
-# CONFIG_USB_EZUSB is not set
|
|
+CONFIG_USB_SERIAL_CONSOLE=y
|
|
CONFIG_USB_SERIAL_GENERIC=y
|
|
# CONFIG_USB_SERIAL_AIRCABLE is not set
|
|
# CONFIG_USB_SERIAL_ARK3116 is not set
|
|
@@ -1210,7 +1674,9 @@ CONFIG_USB_SERIAL_PL2303=y
|
|
# CONFIG_USB_SERIAL_OPTICON is not set
|
|
# CONFIG_USB_SERIAL_VIVOPAY_SERIAL is not set
|
|
# CONFIG_USB_SERIAL_ZIO is not set
|
|
+# CONFIG_USB_SERIAL_ZTE is not set
|
|
# CONFIG_USB_SERIAL_SSU100 is not set
|
|
+# CONFIG_USB_SERIAL_QT2 is not set
|
|
# CONFIG_USB_SERIAL_DEBUG is not set
|
|
|
|
#
|
|
@@ -1222,8 +1688,8 @@ CONFIG_USB_SERIAL_PL2303=y
|
|
# CONFIG_USB_SEVSEG is not set
|
|
# CONFIG_USB_RIO500 is not set
|
|
# CONFIG_USB_LEGOTOWER is not set
|
|
-# CONFIG_USB_LCD is not set
|
|
-# CONFIG_USB_LED is not set
|
|
+CONFIG_USB_LCD=y
|
|
+CONFIG_USB_LED=y
|
|
# CONFIG_USB_CYPRESS_CY7C63 is not set
|
|
# CONFIG_USB_CYTHERM is not set
|
|
# CONFIG_USB_IDMOUSE is not set
|
|
@@ -1236,14 +1702,59 @@ CONFIG_USB_SERIAL_PL2303=y
|
|
# CONFIG_USB_TEST is not set
|
|
# CONFIG_USB_ISIGHTFW is not set
|
|
# CONFIG_USB_YUREX is not set
|
|
-# CONFIG_USB_GADGET is not set
|
|
+# CONFIG_USB_EZUSB_FX2 is not set
|
|
+
|
|
+#
|
|
+# USB Physical Layer drivers
|
|
+#
|
|
+# CONFIG_USB_ISP1301 is not set
|
|
+# CONFIG_USB_RCAR_PHY is not set
|
|
+CONFIG_USB_GADGET=y
|
|
+# CONFIG_USB_GADGET_DEBUG is not set
|
|
+# CONFIG_USB_GADGET_DEBUG_FILES is not set
|
|
+# CONFIG_USB_GADGET_DEBUG_FS is not set
|
|
+CONFIG_USB_GADGET_VBUS_DRAW=2
|
|
+CONFIG_USB_GADGET_STORAGE_NUM_BUFFERS=2
|
|
+
|
|
+#
|
|
+# USB Peripheral Controller
|
|
+#
|
|
+# CONFIG_USB_FUSB300 is not set
|
|
+# CONFIG_USB_R8A66597 is not set
|
|
+CONFIG_USB_MV_UDC=y
|
|
+# CONFIG_USB_M66592 is not set
|
|
+# CONFIG_USB_NET2272 is not set
|
|
+# CONFIG_USB_DUMMY_HCD is not set
|
|
+CONFIG_USB_LIBCOMPOSITE=m
|
|
+# CONFIG_USB_ZERO is not set
|
|
+# CONFIG_USB_AUDIO is not set
|
|
+# CONFIG_USB_ETH is not set
|
|
+# CONFIG_USB_G_NCM is not set
|
|
+CONFIG_USB_GADGETFS=m
|
|
+# CONFIG_USB_FUNCTIONFS is not set
|
|
+CONFIG_USB_MASS_STORAGE=m
|
|
+CONFIG_USB_G_SERIAL=m
|
|
+# CONFIG_USB_MIDI_GADGET is not set
|
|
+CONFIG_USB_G_PRINTER=m
|
|
+# CONFIG_USB_CDC_COMPOSITE is not set
|
|
+CONFIG_USB_G_ACM_MS=m
|
|
+CONFIG_USB_G_MULTI=m
|
|
+CONFIG_USB_G_MULTI_RNDIS=y
|
|
+CONFIG_USB_G_MULTI_CDC=y
|
|
+CONFIG_USB_G_HID=m
|
|
+CONFIG_USB_G_DBGP=m
|
|
+CONFIG_USB_G_DBGP_PRINTK=y
|
|
+# CONFIG_USB_G_DBGP_SERIAL is not set
|
|
+CONFIG_USB_G_WEBCAM=m
|
|
|
|
#
|
|
# OTG and related infrastructure
|
|
#
|
|
-# CONFIG_USB_GPIO_VBUS is not set
|
|
+CONFIG_USB_OTG_UTILS=y
|
|
+CONFIG_USB_GPIO_VBUS=y
|
|
# CONFIG_USB_ULPI is not set
|
|
# CONFIG_NOP_USB_XCEIV is not set
|
|
+CONFIG_USB_MV_OTG=y
|
|
CONFIG_MMC=y
|
|
# CONFIG_MMC_DEBUG is not set
|
|
# CONFIG_MMC_UNSAFE_RESUME is not set
|
|
@@ -1269,10 +1780,37 @@ CONFIG_MMC_SDHCI_PXAV2=y
|
|
# CONFIG_MMC_SPI is not set
|
|
# CONFIG_MMC_DW is not set
|
|
# CONFIG_MMC_VUB300 is not set
|
|
-# CONFIG_MMC_USHC is not set
|
|
+CONFIG_MMC_USHC=m
|
|
# CONFIG_MEMSTICK is not set
|
|
-# CONFIG_NEW_LEDS is not set
|
|
+CONFIG_NEW_LEDS=y
|
|
+CONFIG_LEDS_CLASS=m
|
|
+
|
|
+#
|
|
+# LED drivers
|
|
+#
|
|
+# CONFIG_LEDS_LM3530 is not set
|
|
+# CONFIG_LEDS_LM3642 is not set
|
|
+# CONFIG_LEDS_PCA9532 is not set
|
|
+# CONFIG_LEDS_GPIO is not set
|
|
+# CONFIG_LEDS_LP3944 is not set
|
|
+# CONFIG_LEDS_LP5521 is not set
|
|
+# CONFIG_LEDS_LP5523 is not set
|
|
+# CONFIG_LEDS_PCA955X is not set
|
|
+# CONFIG_LEDS_PCA9633 is not set
|
|
+# CONFIG_LEDS_DAC124S085 is not set
|
|
+# CONFIG_LEDS_BD2802 is not set
|
|
+# CONFIG_LEDS_LT3593 is not set
|
|
+# CONFIG_LEDS_TCA6507 is not set
|
|
+# CONFIG_LEDS_LM355x is not set
|
|
+# CONFIG_LEDS_OT200 is not set
|
|
+# CONFIG_LEDS_BLINKM is not set
|
|
+# CONFIG_LEDS_TRIGGERS is not set
|
|
+
|
|
+#
|
|
+# LED Triggers
|
|
+#
|
|
# CONFIG_ACCESSIBILITY is not set
|
|
+# CONFIG_EDAC is not set
|
|
CONFIG_RTC_LIB=y
|
|
CONFIG_RTC_CLASS=y
|
|
CONFIG_RTC_HCTOSYS=y
|
|
@@ -1300,6 +1838,7 @@ CONFIG_RTC_INTF_DEV=y
|
|
CONFIG_RTC_DRV_ISL1208=y
|
|
# CONFIG_RTC_DRV_ISL12022 is not set
|
|
# CONFIG_RTC_DRV_X1205 is not set
|
|
+# CONFIG_RTC_DRV_PCF8523 is not set
|
|
# CONFIG_RTC_DRV_PCF8563 is not set
|
|
# CONFIG_RTC_DRV_PCF8583 is not set
|
|
# CONFIG_RTC_DRV_M41T80 is not set
|
|
@@ -1340,6 +1879,7 @@ CONFIG_RTC_DRV_ISL1208=y
|
|
# CONFIG_RTC_DRV_BQ4802 is not set
|
|
# CONFIG_RTC_DRV_RP5C01 is not set
|
|
# CONFIG_RTC_DRV_V3020 is not set
|
|
+# CONFIG_RTC_DRV_DS2404 is not set
|
|
|
|
#
|
|
# on-CPU RTC drivers
|
|
@@ -1353,7 +1893,6 @@ CONFIG_RTC_DRV_ISL1208=y
|
|
#
|
|
# Virtio drivers
|
|
#
|
|
-# CONFIG_VIRTIO_BALLOON is not set
|
|
# CONFIG_VIRTIO_MMIO is not set
|
|
|
|
#
|
|
@@ -1361,6 +1900,13 @@ CONFIG_RTC_DRV_ISL1208=y
|
|
#
|
|
# CONFIG_STAGING is not set
|
|
CONFIG_CLKDEV_LOOKUP=y
|
|
+CONFIG_HAVE_CLK_PREPARE=y
|
|
+CONFIG_COMMON_CLK=y
|
|
+
|
|
+#
|
|
+# Common Clock Framework
|
|
+#
|
|
+CONFIG_COMMON_CLK_DEBUG=y
|
|
|
|
#
|
|
# Hardware Spinlock drivers
|
|
@@ -1370,12 +1916,18 @@ CONFIG_IOMMU_SUPPORT=y
|
|
#
|
|
# Remoteproc drivers (EXPERIMENTAL)
|
|
#
|
|
+# CONFIG_STE_MODEM_RPROC is not set
|
|
|
|
#
|
|
# Rpmsg drivers (EXPERIMENTAL)
|
|
#
|
|
# CONFIG_VIRT_DRIVERS is not set
|
|
# CONFIG_PM_DEVFREQ is not set
|
|
+# CONFIG_EXTCON is not set
|
|
+# CONFIG_MEMORY is not set
|
|
+# CONFIG_IIO is not set
|
|
+# CONFIG_PWM is not set
|
|
+# CONFIG_IPACK_BUS is not set
|
|
|
|
#
|
|
# File systems
|
|
@@ -1389,12 +1941,13 @@ CONFIG_EXT3_FS_XATTR=y
|
|
# CONFIG_EXT3_FS_POSIX_ACL is not set
|
|
# CONFIG_EXT3_FS_SECURITY is not set
|
|
CONFIG_EXT4_FS=y
|
|
-CONFIG_EXT4_FS_XATTR=y
|
|
# CONFIG_EXT4_FS_POSIX_ACL is not set
|
|
# CONFIG_EXT4_FS_SECURITY is not set
|
|
# CONFIG_EXT4_DEBUG is not set
|
|
CONFIG_JBD=y
|
|
+# CONFIG_JBD_DEBUG is not set
|
|
CONFIG_JBD2=y
|
|
+# CONFIG_JBD2_DEBUG is not set
|
|
CONFIG_FS_MBCACHE=y
|
|
# CONFIG_REISERFS_FS is not set
|
|
# CONFIG_JFS_FS is not set
|
|
@@ -1433,12 +1986,15 @@ CONFIG_MSDOS_FS=y
|
|
CONFIG_VFAT_FS=y
|
|
CONFIG_FAT_DEFAULT_CODEPAGE=437
|
|
CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1"
|
|
-# CONFIG_NTFS_FS is not set
|
|
+CONFIG_NTFS_FS=m
|
|
+# CONFIG_NTFS_DEBUG is not set
|
|
+CONFIG_NTFS_RW=y
|
|
|
|
#
|
|
# Pseudo filesystems
|
|
#
|
|
CONFIG_PROC_FS=y
|
|
+CONFIG_PROC_VMCORE=y
|
|
CONFIG_PROC_SYSCTL=y
|
|
CONFIG_PROC_PAGE_MONITOR=y
|
|
CONFIG_SYSFS=y
|
|
@@ -1470,11 +2026,14 @@ CONFIG_CRAMFS=y
|
|
# CONFIG_PSTORE is not set
|
|
# CONFIG_SYSV_FS is not set
|
|
# CONFIG_UFS_FS is not set
|
|
+# CONFIG_F2FS_FS is not set
|
|
CONFIG_NETWORK_FILESYSTEMS=y
|
|
CONFIG_NFS_FS=y
|
|
+CONFIG_NFS_V2=y
|
|
CONFIG_NFS_V3=y
|
|
CONFIG_NFS_V3_ACL=y
|
|
CONFIG_NFS_V4=y
|
|
+# CONFIG_NFS_SWAP is not set
|
|
# CONFIG_NFS_V4_1 is not set
|
|
CONFIG_ROOT_NFS=y
|
|
# CONFIG_NFS_USE_LEGACY_DNS is not set
|
|
@@ -1531,6 +2090,17 @@ CONFIG_NLS_ISO8859_1=y
|
|
# CONFIG_NLS_ISO8859_15 is not set
|
|
# CONFIG_NLS_KOI8_R is not set
|
|
# CONFIG_NLS_KOI8_U is not set
|
|
+# CONFIG_NLS_MAC_ROMAN is not set
|
|
+# CONFIG_NLS_MAC_CELTIC is not set
|
|
+# CONFIG_NLS_MAC_CENTEURO is not set
|
|
+# CONFIG_NLS_MAC_CROATIAN is not set
|
|
+# CONFIG_NLS_MAC_CYRILLIC is not set
|
|
+# CONFIG_NLS_MAC_GAELIC is not set
|
|
+# CONFIG_NLS_MAC_GREEK is not set
|
|
+# CONFIG_NLS_MAC_ICELAND is not set
|
|
+# CONFIG_NLS_MAC_INUIT is not set
|
|
+# CONFIG_NLS_MAC_ROMANIAN is not set
|
|
+# CONFIG_NLS_MAC_TURKISH is not set
|
|
# CONFIG_NLS_UTF8 is not set
|
|
|
|
#
|
|
@@ -1543,20 +2113,23 @@ CONFIG_ENABLE_MUST_CHECK=y
|
|
CONFIG_FRAME_WARN=1024
|
|
CONFIG_MAGIC_SYSRQ=y
|
|
# CONFIG_STRIP_ASM_SYMS is not set
|
|
+# CONFIG_READABLE_ASM is not set
|
|
# CONFIG_UNUSED_SYMBOLS is not set
|
|
-# CONFIG_DEBUG_FS is not set
|
|
+CONFIG_DEBUG_FS=y
|
|
# CONFIG_HEADERS_CHECK is not set
|
|
# CONFIG_DEBUG_SECTION_MISMATCH is not set
|
|
CONFIG_DEBUG_KERNEL=y
|
|
# CONFIG_DEBUG_SHIRQ is not set
|
|
# CONFIG_LOCKUP_DETECTOR is not set
|
|
-# CONFIG_HARDLOCKUP_DETECTOR is not set
|
|
+# CONFIG_PANIC_ON_OOPS is not set
|
|
+CONFIG_PANIC_ON_OOPS_VALUE=0
|
|
# CONFIG_DETECT_HUNG_TASK is not set
|
|
CONFIG_SCHED_DEBUG=y
|
|
# CONFIG_SCHEDSTATS is not set
|
|
# CONFIG_TIMER_STATS is not set
|
|
# CONFIG_DEBUG_OBJECTS is not set
|
|
# CONFIG_DEBUG_SLAB is not set
|
|
+CONFIG_HAVE_DEBUG_KMEMLEAK=y
|
|
# CONFIG_DEBUG_KMEMLEAK is not set
|
|
# CONFIG_DEBUG_PREEMPT is not set
|
|
# CONFIG_DEBUG_RT_MUTEXES is not set
|
|
@@ -1565,6 +2138,7 @@ CONFIG_SCHED_DEBUG=y
|
|
# CONFIG_DEBUG_MUTEXES is not set
|
|
# CONFIG_DEBUG_LOCK_ALLOC is not set
|
|
# CONFIG_PROVE_LOCKING is not set
|
|
+# CONFIG_PROVE_RCU_DELAY is not set
|
|
# CONFIG_SPARSE_RCU_POINTER is not set
|
|
# CONFIG_LOCK_STAT is not set
|
|
# CONFIG_DEBUG_ATOMIC_SLEEP is not set
|
|
@@ -1588,6 +2162,8 @@ CONFIG_DEBUG_MEMORY_INIT=y
|
|
# CONFIG_BACKTRACE_SELF_TEST is not set
|
|
# CONFIG_DEBUG_BLOCK_EXT_DEVT is not set
|
|
# CONFIG_DEBUG_FORCE_WEAK_PER_CPU is not set
|
|
+CONFIG_LKDTM=y
|
|
+# CONFIG_NOTIFIER_ERROR_INJECTION is not set
|
|
# CONFIG_FAULT_INJECTION is not set
|
|
# CONFIG_LATENCYTOP is not set
|
|
# CONFIG_DEBUG_PAGEALLOC is not set
|
|
@@ -1595,7 +2171,11 @@ CONFIG_HAVE_FUNCTION_TRACER=y
|
|
CONFIG_HAVE_FUNCTION_GRAPH_TRACER=y
|
|
CONFIG_HAVE_DYNAMIC_FTRACE=y
|
|
CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y
|
|
+CONFIG_HAVE_SYSCALL_TRACEPOINTS=y
|
|
CONFIG_HAVE_C_RECORDMCOUNT=y
|
|
+CONFIG_TRACE_CLOCK=y
|
|
+CONFIG_RING_BUFFER=y
|
|
+CONFIG_RING_BUFFER_ALLOW_SWAP=y
|
|
CONFIG_TRACING_SUPPORT=y
|
|
CONFIG_FTRACE=y
|
|
# CONFIG_FUNCTION_TRACER is not set
|
|
@@ -1603,11 +2183,17 @@ CONFIG_FTRACE=y
|
|
# CONFIG_PREEMPT_TRACER is not set
|
|
# CONFIG_SCHED_TRACER is not set
|
|
# CONFIG_ENABLE_DEFAULT_TRACERS is not set
|
|
+# CONFIG_FTRACE_SYSCALLS is not set
|
|
CONFIG_BRANCH_PROFILE_NONE=y
|
|
# CONFIG_PROFILE_ANNOTATED_BRANCHES is not set
|
|
# CONFIG_PROFILE_ALL_BRANCHES is not set
|
|
# CONFIG_STACK_TRACER is not set
|
|
# CONFIG_BLK_DEV_IO_TRACE is not set
|
|
+# CONFIG_PROBE_EVENTS is not set
|
|
+# CONFIG_RING_BUFFER_BENCHMARK is not set
|
|
+# CONFIG_RBTREE_TEST is not set
|
|
+# CONFIG_INTERVAL_TREE_TEST is not set
|
|
+CONFIG_DYNAMIC_DEBUG=y
|
|
# CONFIG_DMA_API_DEBUG is not set
|
|
# CONFIG_ATOMIC64_SELFTEST is not set
|
|
# CONFIG_SAMPLES is not set
|
|
@@ -1618,11 +2204,13 @@ CONFIG_HAVE_ARCH_KGDB=y
|
|
CONFIG_ARM_UNWIND=y
|
|
CONFIG_DEBUG_USER=y
|
|
CONFIG_DEBUG_LL=y
|
|
+# CONFIG_DEBUG_MMP_UART2 is not set
|
|
+CONFIG_DEBUG_MMP_UART3=y
|
|
# CONFIG_DEBUG_LL_UART_NONE is not set
|
|
-CONFIG_DEBUG_MMP_UART2=y
|
|
# CONFIG_DEBUG_ICEDCC is not set
|
|
# CONFIG_DEBUG_SEMIHOSTING is not set
|
|
-# CONFIG_EARLY_PRINTK is not set
|
|
+CONFIG_DEBUG_LL_INCLUDE="mach/debug-macro.S"
|
|
+CONFIG_EARLY_PRINTK=y
|
|
|
|
#
|
|
# Security options
|
|
@@ -1640,11 +2228,22 @@ CONFIG_CRYPTO=y
|
|
#
|
|
# Crypto core or helper
|
|
#
|
|
-# CONFIG_CRYPTO_MANAGER is not set
|
|
-# CONFIG_CRYPTO_MANAGER2 is not set
|
|
+CONFIG_CRYPTO_ALGAPI=y
|
|
+CONFIG_CRYPTO_ALGAPI2=y
|
|
+CONFIG_CRYPTO_AEAD2=y
|
|
+CONFIG_CRYPTO_BLKCIPHER=y
|
|
+CONFIG_CRYPTO_BLKCIPHER2=y
|
|
+CONFIG_CRYPTO_HASH=y
|
|
+CONFIG_CRYPTO_HASH2=y
|
|
+CONFIG_CRYPTO_RNG2=y
|
|
+CONFIG_CRYPTO_PCOMP2=y
|
|
+CONFIG_CRYPTO_MANAGER=y
|
|
+CONFIG_CRYPTO_MANAGER2=y
|
|
# CONFIG_CRYPTO_USER is not set
|
|
+CONFIG_CRYPTO_MANAGER_DISABLE_TESTS=y
|
|
# CONFIG_CRYPTO_GF128MUL is not set
|
|
# CONFIG_CRYPTO_NULL is not set
|
|
+CONFIG_CRYPTO_WORKQUEUE=y
|
|
# CONFIG_CRYPTO_CRYPTD is not set
|
|
# CONFIG_CRYPTO_AUTHENC is not set
|
|
# CONFIG_CRYPTO_TEST is not set
|
|
@@ -1659,7 +2258,7 @@ CONFIG_CRYPTO=y
|
|
#
|
|
# Block modes
|
|
#
|
|
-# CONFIG_CRYPTO_CBC is not set
|
|
+CONFIG_CRYPTO_CBC=y
|
|
# CONFIG_CRYPTO_CTR is not set
|
|
# CONFIG_CRYPTO_CTS is not set
|
|
# CONFIG_CRYPTO_ECB is not set
|
|
@@ -1677,16 +2276,17 @@ CONFIG_CRYPTO=y
|
|
#
|
|
# Digest
|
|
#
|
|
-# CONFIG_CRYPTO_CRC32C is not set
|
|
+CONFIG_CRYPTO_CRC32C=y
|
|
# CONFIG_CRYPTO_GHASH is not set
|
|
# CONFIG_CRYPTO_MD4 is not set
|
|
-# CONFIG_CRYPTO_MD5 is not set
|
|
+CONFIG_CRYPTO_MD5=y
|
|
# CONFIG_CRYPTO_MICHAEL_MIC is not set
|
|
# CONFIG_CRYPTO_RMD128 is not set
|
|
# CONFIG_CRYPTO_RMD160 is not set
|
|
# CONFIG_CRYPTO_RMD256 is not set
|
|
# CONFIG_CRYPTO_RMD320 is not set
|
|
# CONFIG_CRYPTO_SHA1 is not set
|
|
+# CONFIG_CRYPTO_SHA1_ARM is not set
|
|
# CONFIG_CRYPTO_SHA256 is not set
|
|
# CONFIG_CRYPTO_SHA512 is not set
|
|
# CONFIG_CRYPTO_TGR192 is not set
|
|
@@ -1695,14 +2295,15 @@ CONFIG_CRYPTO=y
|
|
#
|
|
# Ciphers
|
|
#
|
|
-# CONFIG_CRYPTO_AES is not set
|
|
+CONFIG_CRYPTO_AES=y
|
|
+CONFIG_CRYPTO_AES_ARM=y
|
|
# CONFIG_CRYPTO_ANUBIS is not set
|
|
# CONFIG_CRYPTO_ARC4 is not set
|
|
# CONFIG_CRYPTO_BLOWFISH is not set
|
|
# CONFIG_CRYPTO_CAMELLIA is not set
|
|
# CONFIG_CRYPTO_CAST5 is not set
|
|
# CONFIG_CRYPTO_CAST6 is not set
|
|
-# CONFIG_CRYPTO_DES is not set
|
|
+CONFIG_CRYPTO_DES=y
|
|
# CONFIG_CRYPTO_FCRYPT is not set
|
|
# CONFIG_CRYPTO_KHAZAD is not set
|
|
# CONFIG_CRYPTO_SALSA20 is not set
|
|
@@ -1714,9 +2315,9 @@ CONFIG_CRYPTO=y
|
|
#
|
|
# Compression
|
|
#
|
|
-# CONFIG_CRYPTO_DEFLATE is not set
|
|
+CONFIG_CRYPTO_DEFLATE=y
|
|
# CONFIG_CRYPTO_ZLIB is not set
|
|
-# CONFIG_CRYPTO_LZO is not set
|
|
+CONFIG_CRYPTO_LZO=y
|
|
|
|
#
|
|
# Random Number Generation
|
|
@@ -1725,14 +2326,18 @@ CONFIG_CRYPTO=y
|
|
# CONFIG_CRYPTO_USER_API_HASH is not set
|
|
# CONFIG_CRYPTO_USER_API_SKCIPHER is not set
|
|
CONFIG_CRYPTO_HW=y
|
|
+# CONFIG_ASYMMETRIC_KEY_TYPE is not set
|
|
# CONFIG_BINARY_PRINTF is not set
|
|
|
|
#
|
|
# Library routines
|
|
#
|
|
CONFIG_BITREVERSE=y
|
|
+CONFIG_GENERIC_STRNCPY_FROM_USER=y
|
|
+CONFIG_GENERIC_STRNLEN_USER=y
|
|
CONFIG_GENERIC_PCI_IOMAP=y
|
|
CONFIG_GENERIC_IO=y
|
|
+CONFIG_PERCPU_RWSEM=y
|
|
CONFIG_CRC_CCITT=y
|
|
CONFIG_CRC16=y
|
|
# CONFIG_CRC_T10DIF is not set
|
|
@@ -1747,6 +2352,9 @@ CONFIG_CRC32_SLICEBY8=y
|
|
# CONFIG_LIBCRC32C is not set
|
|
# CONFIG_CRC8 is not set
|
|
CONFIG_ZLIB_INFLATE=y
|
|
+CONFIG_ZLIB_DEFLATE=y
|
|
+CONFIG_LZO_COMPRESS=y
|
|
+CONFIG_LZO_DECOMPRESS=y
|
|
# CONFIG_XZ_DEC is not set
|
|
# CONFIG_XZ_DEC_BCJ is not set
|
|
CONFIG_GENERIC_ALLOCATOR=y
|
|
@@ -1756,5 +2364,7 @@ CONFIG_HAS_DMA=y
|
|
CONFIG_DQL=y
|
|
CONFIG_NLATTR=y
|
|
CONFIG_GENERIC_ATOMIC64=y
|
|
+CONFIG_ARCH_HAS_ATOMIC64_DEC_IF_POSITIVE=y
|
|
# CONFIG_AVERAGE is not set
|
|
# CONFIG_CORDIC is not set
|
|
+# CONFIG_DDR is not set
|
|
diff --git a/arch/arm/mach-mmp/devices.c b/arch/arm/mach-mmp/devices.c
|
|
index dd2d8b1..1030c91 100644
|
|
--- a/arch/arm/mach-mmp/devices.c
|
|
+++ b/arch/arm/mach-mmp/devices.c
|
|
@@ -241,6 +241,42 @@ void pxa_usb_phy_deinit(void __iomem *phy_reg)
|
|
#ifdef CONFIG_USB_SUPPORT
|
|
static u64 usb_dma_mask = ~(u32)0;
|
|
|
|
+#ifdef CONFIG_USB_EHCI_MV
|
|
+struct resource pxa168_u2h_resources[] = {
|
|
+ /* regbase */
|
|
+ [0] = {
|
|
+ .start = PXA168_U2H_REGBASE + U2x_CAPREGS_OFFSET,
|
|
+ .end = PXA168_U2H_REGBASE + USB_REG_RANGE,
|
|
+ .flags = IORESOURCE_MEM,
|
|
+ .name = "capregs",
|
|
+ },
|
|
+ /* phybase */
|
|
+ [1] = {
|
|
+ .start = PXA168_U2H_PHYBASE,
|
|
+ .end = PXA168_U2H_PHYBASE + USB_PHY_RANGE,
|
|
+ .flags = IORESOURCE_MEM,
|
|
+ .name = "phyregs",
|
|
+ },
|
|
+ [2] = {
|
|
+ .start = IRQ_PXA168_USB2,
|
|
+ .end = IRQ_PXA168_USB2,
|
|
+ .flags = IORESOURCE_IRQ,
|
|
+ },
|
|
+};
|
|
+
|
|
+struct platform_device pxa168_device_u2h = {
|
|
+ .name = "pxa-sph",
|
|
+ .id = -1,
|
|
+ .resource = pxa168_u2h_resources,
|
|
+ .num_resources = ARRAY_SIZE(pxa168_u2h_resources),
|
|
+ .dev = {
|
|
+ .dma_mask = &usb_dma_mask,
|
|
+ .coherent_dma_mask = 0xffffffff,
|
|
+ /*.release = ehci_hcd_pxa_device_release,*/
|
|
+ },
|
|
+};
|
|
+#endif
|
|
+
|
|
#ifdef CONFIG_USB_MV_UDC
|
|
struct resource pxa168_u2o_resources[] = {
|
|
/* regbase */
|
|
diff --git a/arch/arm/mach-mmp/include/mach/pxa168.h b/arch/arm/mach-mmp/include/mach/pxa168.h
|
|
index 7ed1df2..eb3ffcb 100644
|
|
--- a/arch/arm/mach-mmp/include/mach/pxa168.h
|
|
+++ b/arch/arm/mach-mmp/include/mach/pxa168.h
|
|
@@ -14,6 +14,7 @@
|
|
#include <linux/platform_data/keypad-pxa27x.h>
|
|
#include <mach/cputype.h>
|
|
#include <linux/pxa168_eth.h>
|
|
+#include <linux/platform_data/pxa_sdhci.h>
|
|
#include <linux/platform_data/mv_usb.h>
|
|
|
|
extern struct pxa_device_desc pxa168_device_uart1;
|
|
@@ -34,6 +35,25 @@
|
|
extern struct pxa_device_desc pxa168_device_fb;
|
|
extern struct pxa_device_desc pxa168_device_keypad;
|
|
extern struct pxa_device_desc pxa168_device_eth;
|
|
+extern struct pxa_device_desc pxa168_device_sdh1;
|
|
+extern struct pxa_device_desc pxa168_device_sdh2;
|
|
+extern struct pxa_device_desc pxa168_device_sdh3;
|
|
+extern struct pxa_device_desc pxa168_device_sdh4;
|
|
+
|
|
+extern struct platform_device pxa168_device_u2o;
|
|
+extern struct platform_device pxa168_device_u2h;
|
|
+extern struct platform_device pxa168_device_u2oehci;
|
|
+extern struct platform_device pxa168_device_u2ootg;
|
|
+extern struct pxa_device_desc pxa168_device_fb_ovly;
|
|
+extern struct pxa_device_desc pxa168_device_onenand;
|
|
+extern struct pxa_device_desc pxa168_device_pcie;
|
|
+extern struct platform_device pxa168_device_freq;
|
|
+extern struct platform_device pxa168_device_cir;
|
|
+extern struct pxa_device_desc pxa168_device_camera;
|
|
+extern struct pxa_device_desc pxa168_device_ov529;
|
|
+extern struct pxa_device_desc pxa168_device_msp;
|
|
+extern struct pxa_device_desc pxa168_device_cf;
|
|
+extern struct pxa_device_desc pxa168_device_icr;
|
|
|
|
/* pdata can be NULL */
|
|
extern int __init pxa168_add_usb_host(struct mv_usb_platform_data *pdata);
|
|
@@ -119,6 +139,23 @@ static inline int pxa168_add_fb(struct pxa168fb_mach_info *mi)
|
|
return pxa_register_device(&pxa168_device_fb, mi, sizeof(*mi));
|
|
}
|
|
|
|
+static inline int pxa168_add_fb_ovly(struct pxa168fb_mach_info *mi)
|
|
+{
|
|
+ return pxa_register_device(&pxa168_device_fb_ovly, mi, sizeof(*mi));
|
|
+}
|
|
+
|
|
+static inline int pxa168_add_cam(void)
|
|
+{
|
|
+ return pxa_register_device(&pxa168_device_camera, NULL, 0);
|
|
+}
|
|
+
|
|
+#if 0
|
|
+static inline int pxa168_add_ov529(struct ov529_platform_data *pd)
|
|
+{
|
|
+ return pxa_register_device(&pxa168_device_ov529, pd, sizeof(*pd));
|
|
+}
|
|
+#endif
|
|
+
|
|
static inline int pxa168_add_keypad(struct pxa27x_keypad_platform_data *data)
|
|
{
|
|
if (cpu_is_pxa168())
|
|
@@ -131,4 +168,19 @@ static inline int pxa168_add_eth(struct pxa168_eth_platform_data *data)
|
|
{
|
|
return pxa_register_device(&pxa168_device_eth, data, sizeof(*data));
|
|
}
|
|
+
|
|
+static inline int pxa168_add_sdh(int id, struct sdhci_pxa_platdata *data)
|
|
+{
|
|
+ struct pxa_device_desc *d = NULL;
|
|
+
|
|
+ switch (id) {
|
|
+ case 1: d = &pxa168_device_sdh1; break;
|
|
+ case 2: d = &pxa168_device_sdh2; break;
|
|
+ case 3: d = &pxa168_device_sdh3; break;
|
|
+ case 4: d = &pxa168_device_sdh4; break;
|
|
+ default:
|
|
+ return -EINVAL;
|
|
+ }
|
|
+ return pxa_register_device(d, data, sizeof(*data));
|
|
+}
|
|
#endif /* __ASM_MACH_PXA168_H */
|
|
diff --git a/arch/arm/mach-mmp/pxa168.c b/arch/arm/mach-mmp/pxa168.c
|
|
index a30dcf3..9ea674e 100644
|
|
--- a/arch/arm/mach-mmp/pxa168.c
|
|
+++ b/arch/arm/mach-mmp/pxa168.c
|
|
@@ -108,8 +108,22 @@ void pxa168_clear_keypad_wakeup(void)
|
|
PXA168_DEVICE(ssp4, "pxa168-ssp", 3, SSP4, 0xd4020000, 0x40, 58, 59);
|
|
PXA168_DEVICE(ssp5, "pxa168-ssp", 4, SSP5, 0xd4021000, 0x40, 60, 61);
|
|
PXA168_DEVICE(fb, "pxa168-fb", -1, LCD, 0xd420b000, 0x1c8);
|
|
+PXA168_DEVICE(fb_ovly, "pxa168fb_ovly", -1, LCD, 0xd420b000, 0x1c8);
|
|
PXA168_DEVICE(keypad, "pxa27x-keypad", -1, KEYPAD, 0xd4012000, 0x4c);
|
|
PXA168_DEVICE(eth, "pxa168-eth", -1, MFU, 0xc0800000, 0x0fff);
|
|
+PXA168_DEVICE(sdh1, "sdhci-pxav2", 0, SDH1, 0xd4280000, 0x100);
|
|
+PXA168_DEVICE(sdh2, "sdhci-pxav2", 1, SDH1, 0xd4281000, 0x100);
|
|
+PXA168_DEVICE(sdh3, "sdhci-pxav2", 2, SDH2, 0xd427e000, 0x100);
|
|
+PXA168_DEVICE(sdh4, "sdhci-pxav2", 3, SDH2, 0xd427f000, 0x100);
|
|
+PXA168_DEVICE(cf, "pxa168-cf", -1, CF, 0xd4285000, 0x800); /*Compact Flash*/
|
|
+PXA168_DEVICE(onenand, "onenand", -1, NONE, 0x80000000, 0x100000); /*NOR Flash*/
|
|
+/*PXA168_DEVICE(pcie, "pxa168-pcie", -1, PCIE_CORE, 0xd1200000, 0x0FFF);*/ /*PCIe DMA*/
|
|
+PXA168_DEVICE(camera, "pxa168-camera", -1, CI, 0xd420a000, 0xfff);
|
|
+PXA168_DEVICE(ov529, "pxa168-ov529", -1, NONE, SMC_CS0_PHYS_BASE, 0x100); /*NOR Flash PHY Base*/
|
|
+PXA168_DEVICE(msp, "pxa168-msp", -1, MSP, 0xd4286000, 0x0FFF); /*MS/MSPRO Memory Stick*/
|
|
+/*PXA168_DEVICE(icr, "pxa168-icr", -1, ICR, 0xC0802000, 0x1000);*/ /*CMU Color Management Unit*/
|
|
+
|
|
+/***********/
|
|
|
|
struct resource pxa168_resource_gpio[] = {
|
|
{
|
|
diff --git a/drivers/clk/mmp/clk-pxa168.c b/drivers/clk/mmp/clk-pxa168.c
|
|
index 28b3b51..321a9ed 100644
|
|
--- a/drivers/clk/mmp/clk-pxa168.c
|
|
+++ b/drivers/clk/mmp/clk-pxa168.c
|
|
@@ -20,30 +20,137 @@
|
|
|
|
#include "clk.h"
|
|
|
|
-#define APBC_RTC 0x28
|
|
-#define APBC_TWSI0 0x2c
|
|
-#define APBC_KPC 0x30
|
|
-#define APBC_UART0 0x0
|
|
-#define APBC_UART1 0x4
|
|
-#define APBC_GPIO 0x8
|
|
-#define APBC_PWM0 0xc
|
|
-#define APBC_PWM1 0x10
|
|
-#define APBC_PWM2 0x14
|
|
-#define APBC_PWM3 0x18
|
|
-#define APBC_SSP0 0x81c
|
|
-#define APBC_SSP1 0x820
|
|
-#define APBC_SSP2 0x84c
|
|
-#define APBC_SSP3 0x858
|
|
-#define APBC_SSP4 0x85c
|
|
-#define APBC_TWSI1 0x6c
|
|
-#define APBC_UART2 0x70
|
|
-#define APMU_SDH0 0x54
|
|
-#define APMU_SDH1 0x58
|
|
-#define APMU_USB 0x5c
|
|
-#define APMU_DISP0 0x4c
|
|
-#define APMU_CCIC0 0x50
|
|
-#define APMU_DFC 0x60
|
|
-#define MPMU_UART_PLL 0x14
|
|
+#define APBC_UART0 0x0000
|
|
+#define APBC_UART1 0x0004
|
|
+#define APBC_GPIO 0x0008
|
|
+#define APBC_PWM0 0x000c
|
|
+#define APBC_PWM1 0x0010
|
|
+#define APBC_PWM2 0x0014
|
|
+#define APBC_PWM3 0x0018
|
|
+#define APBC_RTC 0x0028
|
|
+#define APBC_TWSI0 0x002c
|
|
+#define APBC_KPC 0x0030
|
|
+#define APBC_TWSI1 0x006c
|
|
+#define APBC_UART2 0x0070
|
|
+#define APBC_SSP0 0x081c
|
|
+#define APBC_SSP1 0x0820
|
|
+#define APBC_SSP2 0x084c
|
|
+#define APBC_SSP3 0x0858
|
|
+#define APBC_SSP4 0x085c
|
|
+
|
|
+#define APBC_UART1_CLK_RST 0x0000 /*UART1 Clock/Reset Control*/
|
|
+#define APBC_UART2_CLK_RST 0x0004 /*UART2 Clock/Reset Control*/
|
|
+#define APBC_GPIO_CLK_RST 0x0008 /*GPIO Clock/Reset Control*/
|
|
+#define APBC_PWM1_CLK_RST 0x000C /*PWM1 Clock/Reset Control*/
|
|
+#define APBC_PWM2_CLK_RST 0x0010 /*PWM2 Clock/Reset Control*/
|
|
+#define APBC_PWM3_CLK_RST 0x0014 /*PWM3 Clock/Reset Control*/
|
|
+#define APBC_PWM4_CLK_RST 0x0018 /*PWM4 Clock/Reset Control*/
|
|
+#define APBC_RTC_CLK_RST 0x0028 /*RTC Clock/Reset Control*/
|
|
+#define APBC_TWSI0_CLK_RST 0x002C /*TWSI0 Clock/Reset Control*/
|
|
+#define APBC_KPC_CLK_RST 0x0030 /*Keypad Controller Clock/Reset
|
|
+ Control*/
|
|
+#define APBC_TIMERS_CLK_RST 0x0034 /*Timers Clock/Reset Control*/
|
|
+#define APBC_AIB_CLK_RST 0x003C /*AIB Clock/Reset Control*/
|
|
+#define APBC_SW_JTAG_CLK_RST 0x0040 /*Software emulated JTAG
|
|
+ Clock/Reset Control*/
|
|
+#define APBC_ONEWIRE_CLK_RST 0x0048 /*OneWire Clock/Reset
|
|
+ Control*/
|
|
+#define APBC_PWR_TWSI_CLK_RST 0x006C /*PWR_TWSI Clock/Reset
|
|
+ Control*/
|
|
+#define APBC_UART3_CLK_RST 0x0070 /*UART3 Clock/Reset Control*/
|
|
+#define APBC_AC97_CLK_RST 0x0084 /*AC97 Clock/Reset Control*/
|
|
+
|
|
+#define APBC_SSP0_CLK_RST 0x081C /*SSP1 Clock/Reset Control*/
|
|
+#define APBC_SSP1_CLK_RST 0x0820 /*SSP2 Clock/Reset Control*/
|
|
+#define APBC_SSP2_CLK_RST 0x084C /*SSP3 Clock/Reset Control*/
|
|
+#define APBC_SSP3_CLK_RST 0x0858 /*SSP4 Clock/Reset Control*/
|
|
+#define APBC_SSP4_CLK_RST 0x085C /*SSP5 Clock/Reset Control*/
|
|
+
|
|
+#define MPMU_UART_PLL 0x0014
|
|
+
|
|
+#define APMU_CCIC_GATE 0x0028
|
|
+#define APMU_IRE 0x0048
|
|
+#define APMU_DISP0 0x004c
|
|
+#define APMU_CCIC0 0x0050
|
|
+#define APMU_SDH0 0x0054
|
|
+#define APMU_SDH1 0x0058
|
|
+#define APMU_USB 0x005c
|
|
+#define APMU_DFC 0x0060
|
|
+#define APMU_DMA 0x0064
|
|
+#define APMU_GEU 0x0068
|
|
+#define APMU_BUS 0x006c
|
|
+#define APMU_WAKE_CLR 0x007c
|
|
+#define APMU_CCIC_DBG 0x0088
|
|
+#define APMU_GC 0x00cc
|
|
+#define APMU_GC_PD 0x00d0
|
|
+#define APMU_SMC 0x00d4
|
|
+#define APMU_SDH2 0x00e0
|
|
+#define APMU_SDH3 0x00e4
|
|
+#define APMU_CF 0x00f0
|
|
+#define APMU_ICR 0x00f8
|
|
+#define APMU_ETH 0x00fc
|
|
+
|
|
+#define APMU_PCR 0x0000
|
|
+#define APMU_CCR 0x0004
|
|
+#define APMU_CCSR 0x000c
|
|
+#define APMU_FC_TIMER 0x0010
|
|
+#define APMU_CP_IDLE_CFG 0x0014 /*Not listed in PXA16X
|
|
+ Document*/
|
|
+#define APMU_IDLE_CFG 0x0018
|
|
+#define APMU_LCD_CLK_RES_CTRL 0x004c
|
|
+#define APMU_CCIC_CLK_RES_CTRL 0x0050
|
|
+#define APMU_SDH0_CLK_RES_CTRL 0x0054 /*SD1*/
|
|
+#define APMU_SDH1_CLK_RES_CTRL 0x0058 /*SD2*/
|
|
+#define APMU_SDH2_CLK_RES_CTRL 0x00e0 /*SD3*/
|
|
+#define APMU_SDH3_CLK_RES_CTRL 0x00e4 /*SD4*/
|
|
+#define APMU_USB_CLK_RES_CTRL 0x005c
|
|
+#define APMU_NFC_CLK_RES_CTRL 0x0060 /*NAND Flash Controller
|
|
+ Clock/Reset*/
|
|
+#define APMU_DMA_CLK_RES_CTRL 0x0064 /*DMA Clock/Reset Control*/
|
|
+#define APMU_BUS_CLK_RES_CTRL 0x006c /*Bus Clock/Reste Control*/
|
|
+#define APMU_WAKE_CLK 0x007c /*Wake Clear*/
|
|
+#define APMU_PWR_STBL_TIMER 0x0084 /*Not listed in PXA16X
|
|
+ Document*/
|
|
+#define APMU_SRAM_PWR_DWN 0x008c /*Not listed in PXA16X
|
|
+ Document*/
|
|
+#define APMU_CORE_STATUS 0x0090 /*Core Status*/
|
|
+#define APMU_RES_FRM_SLP_CLR 0x0094 /*Resume from Sleep clear*/
|
|
+#define APMU_IMR 0x0098 /*PMU Interrupt Mask*/
|
|
+#define APMU_IRWC 0x009c /*Interrupt RD/WR Clear*/
|
|
+#define APMU_ISR 0x00a0 /*Interrupt Status*/
|
|
+#define APMU_DX8_CLK_RES_CTRL 0x00a4 /*Not listed in PXA16X
|
|
+ Document*/
|
|
+#define APMU_DTC_CLK_RES_CTRL 0x00ac /*Not listed in PXA16X
|
|
+ Document*/
|
|
+#define APMU_MC_HW_SLP_TYPE 0x00b0 /*Memory Controller Hardware
|
|
+ Sleep Type*/
|
|
+#define APMU_MC_SLP_REQ 0x00b4 /*Memory Controller Sleep
|
|
+ Request*/
|
|
+#define APMU_MC_SW_SLP_TYPE 0x00c0 /*Memory Controller Software
|
|
+ Sleep Type*/
|
|
+#define APMU_PLL_SEL_STATUS 0x00c4 /*PLL Clock select status*/
|
|
+#define APMU_SYNC_MODE_BYPASS 0x00c8 /*Sync Mode Bypass*/
|
|
+#define APMU_GC_CLK_RES_CTRL 0x00cc /*GC300 2D Graphics Controller
|
|
+ Clock/Reset control*/
|
|
+#define APMU_SMC_CLK_RES_CTRL 0x00d4 /*Static Memory controller
|
|
+ Clock/Reset control*/
|
|
+#define APMU_XD_CLK_RES_CTRL 0x00dc /*XD Controller clock/reset
|
|
+ control*/
|
|
+#define APMU_CF_CLK_RES_CTRL 0x00f0 /*Compact Flash controller
|
|
+ clock/reset control*/
|
|
+#define APMU_MSP_CLK_RES_CTRL 0x00f4 /*Memory Stick Pro clock/reset
|
|
+ control*/
|
|
+#define APMU_CMU_CLK_RES_CTRL 0x00f8 /*CMU clock/reset control*/
|
|
+#define APMU_MFU_CLK_RES_CTRL 0x00fc /*FE(Fast Ethernet)
|
|
+ clock/reset control*/
|
|
+#define APMU_PCIe_CLK_RES_CTRL 0x0100 /*PCIe clock/reset control*/
|
|
+#define APMU_EPD_CLK_RES_CTRL 0x0104 /*EPD clock/reset control*/
|
|
+
|
|
+#define APMU_GC_156M 0x0
|
|
+#define APMU_GC_312M 0x40
|
|
+#define APMU_GC_PLL2 0x80
|
|
+#define APMU_GC_PLL2_DIV2 0xc0
|
|
+#define APMU_GC_624M 0xc0 /* added according to Aspen SW spec v2.8*/
|
|
|
|
static DEFINE_SPINLOCK(clk_lock);
|
|
|
|
@@ -59,15 +166,122 @@
|
|
{.num = 8125, .den = 1536}, /*14.745MHZ */
|
|
};
|
|
|
|
+#if 0
|
|
+struct gc_rate_table {
|
|
+ unsigned long rate;
|
|
+ unsigned int flag;
|
|
+};
|
|
+
|
|
+static struct gc_rate_table gc300_rates [] = {
|
|
+ /* put highest rate at the top of the table */
|
|
+ {
|
|
+ .rate = 624000000,
|
|
+ .flag = APMU_GC_624M,
|
|
+ },
|
|
+ {
|
|
+ .rate = 312000000,
|
|
+ .flag = APMU_GC_312M,
|
|
+ },
|
|
+ {
|
|
+ .rate = 156000000,
|
|
+ .flag = APMU_GC_156M,
|
|
+ },
|
|
+};
|
|
+
|
|
+static int gc_lookaround_rate(int target_rate, u32 *flag)
|
|
+{
|
|
+ int i;
|
|
+
|
|
+ for (i=0; i<ARRAY_SIZE(gc300_rates); i++) {
|
|
+ if (target_rate >= gc300_rates[i].rate)
|
|
+ break;
|
|
+ }
|
|
+ if (i==ARRAY_SIZE(gc300_rates)) i--;
|
|
+ *flag = gc300_rates[i].flag;
|
|
+ return gc300_rates[i].rate;
|
|
+}
|
|
+
|
|
+static void gc300_clk_enable(struct clk *clk)
|
|
+{
|
|
+ u32 tmp = __raw_readl(clk->clk_rst), flag;
|
|
+
|
|
+ /* reset gc clock */
|
|
+ __raw_writel(tmp & ~0x07, clk->clk_rst);
|
|
+ tmp = __raw_readl(clk->clk_rst);
|
|
+ udelay(1);
|
|
+
|
|
+ /* select GC clock source */
|
|
+ gc_lookaround_rate(clk->rate, &flag);
|
|
+ tmp &= ~0xc0;
|
|
+ tmp |= flag;
|
|
+ __raw_writel(tmp, clk->clk_rst);
|
|
+
|
|
+ /* enable GC CLK EN */
|
|
+ __raw_writel(tmp | 0x10, clk->clk_rst);
|
|
+ tmp = __raw_readl(clk->clk_rst);
|
|
+
|
|
+ /* enable GC HCLK EN */
|
|
+ __raw_writel(tmp | 0x08, clk->clk_rst);
|
|
+ tmp = __raw_readl(clk->clk_rst);
|
|
+
|
|
+ /* enable GC ACLK EN */
|
|
+ __raw_writel(tmp | 0x20, clk->clk_rst);
|
|
+ tmp = __raw_readl(clk->clk_rst);
|
|
+
|
|
+ /* reset GC */
|
|
+ __raw_writel(tmp & ~0x07, clk->clk_rst);
|
|
+ tmp = __raw_readl(clk->clk_rst);
|
|
+
|
|
+ /* pull GC out of reset */
|
|
+ __raw_writel(tmp | 0x2, clk->clk_rst);
|
|
+ tmp = __raw_readl(clk->clk_rst);
|
|
+
|
|
+ /* delay 48 cycles */
|
|
+ udelay(1);
|
|
+
|
|
+ /* pull GC AXI/AHB out of reset */
|
|
+ __raw_writel(tmp | 0x5, clk->clk_rst);
|
|
+ tmp = __raw_readl(clk->clk_rst);
|
|
+}
|
|
+
|
|
+static void gc300_clk_disable(struct clk *clk)
|
|
+{
|
|
+ __raw_writel(0, clk->clk_rst);
|
|
+}
|
|
+
|
|
+static int gc300_clk_setrate(struct clk *clk, unsigned long target_rate)
|
|
+{
|
|
+ u32 flag;
|
|
+
|
|
+ clk->rate = gc_lookaround_rate(target_rate, &flag);
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+static unsigned long gc300_clk_getrate(struct clk *clk)
|
|
+{
|
|
+ return clk->rate;
|
|
+}
|
|
+
|
|
+struct clkops gc300_clk_ops = {
|
|
+ .enable = gc300_clk_enable,
|
|
+ .disable = gc300_clk_disable,
|
|
+ .setrate = gc300_clk_setrate,
|
|
+ .getrate = gc300_clk_getrate,
|
|
+};
|
|
+#endif
|
|
+
|
|
static const char *uart_parent[] = {"pll1_3_16", "uart_pll"};
|
|
static const char *ssp_parent[] = {"pll1_96", "pll1_48", "pll1_24", "pll1_12"};
|
|
static const char *sdh_parent[] = {"pll1_12", "pll1_13"};
|
|
static const char *disp_parent[] = {"pll1_2", "pll1_12"};
|
|
static const char *ccic_parent[] = {"pll1_2", "pll1_12"};
|
|
static const char *ccic_phy_parent[] = {"pll1_6", "pll1_12"};
|
|
+static const char *usb_sph_otg_parent[] = {"pll1_2_1_5"};
|
|
|
|
void __init pxa168_clk_init(void)
|
|
{
|
|
+#if !defined(CONFIG_MACH_GPLUGD)
|
|
struct clk *clk;
|
|
struct clk *uart_pll;
|
|
void __iomem *mpmu_base;
|
|
@@ -343,4 +557,352 @@ void __init pxa168_clk_init(void)
|
|
clk = mmp_clk_register_apmu("ccic0_sphy", "ccic0_sphy_div",
|
|
apmu_base + APMU_CCIC0, 0x300, &clk_lock);
|
|
clk_register_clkdev(clk, "sphyclk", "mmp-ccic.0");
|
|
+#else
|
|
+ struct clk *clk;
|
|
+ struct clk *uart_pll;
|
|
+ void __iomem *mpmu_base;
|
|
+ void __iomem *apmu_base;
|
|
+ void __iomem *apbc_base;
|
|
+
|
|
+ mpmu_base = ioremap(APB_PHYS_BASE + 0x50000, SZ_4K);
|
|
+ if (mpmu_base == NULL) {
|
|
+ pr_err("error to ioremap MPMU base\n");
|
|
+ return;
|
|
+ }
|
|
+
|
|
+ apmu_base = ioremap(AXI_PHYS_BASE + 0x82800, SZ_4K);
|
|
+ if (apmu_base == NULL) {
|
|
+ pr_err("error to ioremap APMU base\n");
|
|
+ return;
|
|
+ }
|
|
+
|
|
+ apbc_base = ioremap(APB_PHYS_BASE + 0x15000, SZ_4K);
|
|
+ if (apbc_base == NULL) {
|
|
+ pr_err("error to ioremap APBC base\n");
|
|
+ return;
|
|
+ }
|
|
+
|
|
+ clk = clk_register_fixed_rate(NULL, "clk32", NULL, CLK_IS_ROOT, 3200);
|
|
+ clk_register_clkdev(clk, "clk32", NULL);
|
|
+
|
|
+ clk = clk_register_fixed_rate(NULL, "vctcxo", NULL, CLK_IS_ROOT,
|
|
+ 26000000);
|
|
+ clk_register_clkdev(clk, "vctcxo", NULL);
|
|
+
|
|
+ clk = clk_register_fixed_rate(NULL, "pll1", NULL, CLK_IS_ROOT,
|
|
+ 624000000);
|
|
+ clk_register_clkdev(clk, "pll1", NULL);
|
|
+
|
|
+ clk = clk_register_fixed_factor(NULL, "pll1_2", "pll1",
|
|
+ CLK_SET_RATE_PARENT, 1, 2);
|
|
+ clk_register_clkdev(clk, "pll1_2", NULL);
|
|
+
|
|
+ clk = clk_register_fixed_factor(NULL, "pll1_4", "pll1_2",
|
|
+ CLK_SET_RATE_PARENT, 1, 2);
|
|
+ clk_register_clkdev(clk, "pll1_4", NULL);
|
|
+
|
|
+ clk = clk_register_fixed_factor(NULL, "pll1_8", "pll1_4",
|
|
+ CLK_SET_RATE_PARENT, 1, 2);
|
|
+ clk_register_clkdev(clk, "pll1_8", NULL);
|
|
+
|
|
+ clk = clk_register_fixed_factor(NULL, "pll1_16", "pll1_8",
|
|
+ CLK_SET_RATE_PARENT, 1, 2);
|
|
+ clk_register_clkdev(clk, "pll1_16", NULL);
|
|
+
|
|
+ clk = clk_register_fixed_factor(NULL, "pll1_6", "pll1_2",
|
|
+ CLK_SET_RATE_PARENT, 1, 3);
|
|
+ clk_register_clkdev(clk, "pll1_6", NULL);
|
|
+
|
|
+ clk = clk_register_fixed_factor(NULL, "pll1_12", "pll1_6",
|
|
+ CLK_SET_RATE_PARENT, 1, 2);
|
|
+ clk_register_clkdev(clk, "pll1_12", NULL);
|
|
+
|
|
+ clk = clk_register_fixed_factor(NULL, "pll1_24", "pll1_12",
|
|
+ CLK_SET_RATE_PARENT, 1, 2);
|
|
+ clk_register_clkdev(clk, "pll1_24", NULL);
|
|
+
|
|
+ clk = clk_register_fixed_factor(NULL, "pll1_48", "pll1_24",
|
|
+ CLK_SET_RATE_PARENT, 1, 2);
|
|
+ clk_register_clkdev(clk, "pll1_48", NULL);
|
|
+
|
|
+ clk = clk_register_fixed_factor(NULL, "pll1_96", "pll1_48",
|
|
+ CLK_SET_RATE_PARENT, 1, 2);
|
|
+ clk_register_clkdev(clk, "pll1_96", NULL);
|
|
+
|
|
+ clk = clk_register_fixed_factor(NULL, "pll1_13", "pll1",
|
|
+ CLK_SET_RATE_PARENT, 1, 13);
|
|
+ clk_register_clkdev(clk, "pll1_13", NULL);
|
|
+
|
|
+ clk = clk_register_fixed_factor(NULL, "pll1_13_1_5", "pll1",
|
|
+ CLK_SET_RATE_PARENT, 2, 3);
|
|
+ clk_register_clkdev(clk, "pll1_13_1_5", NULL);
|
|
+
|
|
+ clk = clk_register_fixed_factor(NULL, "pll1_2_1_5", "pll1",
|
|
+ CLK_SET_RATE_PARENT, 2, 3);
|
|
+ clk_register_clkdev(clk, "pll1_2_1_5", NULL);
|
|
+
|
|
+ clk = clk_register_fixed_factor(NULL, "pll1_3_16", "pll1",
|
|
+ CLK_SET_RATE_PARENT, 3, 16);
|
|
+ clk_register_clkdev(clk, "pll1_3_16", NULL);
|
|
+
|
|
+ uart_pll = mmp_clk_register_factor("uart_pll", "pll1_4", 0,
|
|
+ mpmu_base + MPMU_UART_PLL,
|
|
+ &uart_factor_masks, uart_factor_tbl,
|
|
+ ARRAY_SIZE(uart_factor_tbl));
|
|
+ clk_set_rate(uart_pll, 14745600);
|
|
+ clk_register_clkdev(uart_pll, "uart_pll", NULL);
|
|
+
|
|
+ clk = mmp_clk_register_apbc("twsi0", "pll1_13_1_5",
|
|
+ apbc_base + APBC_TWSI0, 0, 0, &clk_lock);
|
|
+ clk_register_clkdev(clk, NULL, "pxa2xx-i2c.0");
|
|
+
|
|
+ clk = mmp_clk_register_apbc("twsi1", "pll1_13_1_5",
|
|
+ apbc_base + APBC_TWSI1, 0, 0, &clk_lock);
|
|
+ clk_register_clkdev(clk, NULL, "pxa2xx-i2c.1");
|
|
+
|
|
+ clk = mmp_clk_register_apbc("gpio", "vctcxo",
|
|
+ apbc_base + APBC_GPIO, 10, 0, &clk_lock);
|
|
+ clk_register_clkdev(clk, NULL, "pxa-gpio");
|
|
+
|
|
+ clk = mmp_clk_register_apbc("kpc", "clk32",
|
|
+ apbc_base + APBC_KPC, 10, 0, &clk_lock);
|
|
+ clk_register_clkdev(clk, NULL, "pxa27x-keypad");
|
|
+
|
|
+ clk = mmp_clk_register_apbc("rtc", "clk32",
|
|
+ apbc_base + APBC_RTC, 10, 0, &clk_lock);
|
|
+ clk_register_clkdev(clk, NULL, "sa1100-rtc");
|
|
+
|
|
+ clk = mmp_clk_register_apbc("pwm0", "pll1_48",
|
|
+ apbc_base + APBC_PWM0, 10, 0, &clk_lock);
|
|
+ clk_register_clkdev(clk, NULL, "pxa168-pwm.0");
|
|
+
|
|
+ clk = mmp_clk_register_apbc("pwm1", "pll1_48",
|
|
+ apbc_base + APBC_PWM1, 10, 0, &clk_lock);
|
|
+ clk_register_clkdev(clk, NULL, "pxa168-pwm.1");
|
|
+
|
|
+ clk = mmp_clk_register_apbc("pwm2", "pll1_48",
|
|
+ apbc_base + APBC_PWM2, 10, 0, &clk_lock);
|
|
+ clk_register_clkdev(clk, NULL, "pxa168-pwm.2");
|
|
+
|
|
+ clk = mmp_clk_register_apbc("pwm3", "pll1_48",
|
|
+ apbc_base + APBC_PWM3, 10, 0, &clk_lock);
|
|
+ clk_register_clkdev(clk, NULL, "pxa168-pwm.3");
|
|
+
|
|
+ clk = clk_register_mux(NULL, "uart0_mux", uart_parent,
|
|
+ ARRAY_SIZE(uart_parent), CLK_SET_RATE_PARENT,
|
|
+ apbc_base + APBC_UART0, 4, 3, 0, &clk_lock);
|
|
+ clk_set_parent(clk, uart_pll);
|
|
+ clk_register_clkdev(clk, "uart_mux.0", NULL);
|
|
+
|
|
+ clk = mmp_clk_register_apbc("uart0", "uart0_mux",
|
|
+ apbc_base + APBC_UART0, 10, 0, &clk_lock);
|
|
+ clk_register_clkdev(clk, NULL, "pxa2xx-uart.0");
|
|
+
|
|
+ clk = clk_register_mux(NULL, "uart1_mux", uart_parent,
|
|
+ ARRAY_SIZE(uart_parent), CLK_SET_RATE_PARENT,
|
|
+ apbc_base + APBC_UART1, 4, 3, 0, &clk_lock);
|
|
+ clk_set_parent(clk, uart_pll);
|
|
+ clk_register_clkdev(clk, "uart_mux.1", NULL);
|
|
+
|
|
+ clk = mmp_clk_register_apbc("uart1", "uart1_mux",
|
|
+ apbc_base + APBC_UART1, 10, 0, &clk_lock);
|
|
+ clk_register_clkdev(clk, NULL, "pxa2xx-uart.1");
|
|
+
|
|
+ clk = clk_register_mux(NULL, "uart2_mux", uart_parent,
|
|
+ ARRAY_SIZE(uart_parent), CLK_SET_RATE_PARENT,
|
|
+ apbc_base + APBC_UART2, 4, 3, 0, &clk_lock);
|
|
+ clk_set_parent(clk, uart_pll);
|
|
+ clk_register_clkdev(clk, "uart_mux.2", NULL);
|
|
+
|
|
+ clk = mmp_clk_register_apbc("uart2", "uart2_mux",
|
|
+ apbc_base + APBC_UART2, 10, 0, &clk_lock);
|
|
+ clk_register_clkdev(clk, NULL, "pxa2xx-uart.2");
|
|
+
|
|
+ clk = clk_register_mux(NULL, "ssp0_mux", ssp_parent,
|
|
+ ARRAY_SIZE(ssp_parent), CLK_SET_RATE_PARENT,
|
|
+ apbc_base + APBC_SSP0, 4, 3, 0, &clk_lock);
|
|
+ clk_register_clkdev(clk, "ssp_mux.0", NULL);
|
|
+
|
|
+ clk = mmp_clk_register_apbc("ssp0", "ssp0_mux", apbc_base + APBC_SSP0,
|
|
+ 0, 0, &clk_lock);
|
|
+ clk_register_clkdev(clk, NULL, "pxa168-ssp.0");
|
|
+
|
|
+ clk = clk_register_mux(NULL, "ssp1_mux", ssp_parent,
|
|
+ ARRAY_SIZE(ssp_parent), CLK_SET_RATE_PARENT,
|
|
+ apbc_base + APBC_SSP1, 4, 3, 0, &clk_lock);
|
|
+ clk_register_clkdev(clk, "ssp_mux.1", NULL);
|
|
+
|
|
+ clk = mmp_clk_register_apbc("ssp1", "ssp1_mux", apbc_base + APBC_SSP1,
|
|
+ 0, 0, &clk_lock);
|
|
+ clk_register_clkdev(clk, NULL, "pxa168-ssp.1");
|
|
+
|
|
+ clk = clk_register_mux(NULL, "ssp2_mux", ssp_parent,
|
|
+ ARRAY_SIZE(ssp_parent), CLK_SET_RATE_PARENT,
|
|
+ apbc_base + APBC_SSP2, 4, 3, 0, &clk_lock);
|
|
+ clk_register_clkdev(clk, "ssp_mux.2", NULL);
|
|
+
|
|
+ clk = mmp_clk_register_apbc("ssp2", "ssp2_mux", apbc_base + APBC_SSP2,
|
|
+ 0, 0, &clk_lock);
|
|
+ clk_register_clkdev(clk, NULL, "pxa168-ssp.2");
|
|
+
|
|
+ clk = clk_register_mux(NULL, "ssp3_mux", ssp_parent,
|
|
+ ARRAY_SIZE(ssp_parent), CLK_SET_RATE_PARENT,
|
|
+ apbc_base + APBC_SSP3, 4, 3, 0, &clk_lock);
|
|
+ clk_register_clkdev(clk, "ssp_mux.3", NULL);
|
|
+
|
|
+ clk = mmp_clk_register_apbc("ssp3", "ssp3_mux", apbc_base + APBC_SSP3,
|
|
+ 0, 0, &clk_lock);
|
|
+ clk_register_clkdev(clk, NULL, "pxa168-ssp.3");
|
|
+
|
|
+ clk = clk_register_mux(NULL, "ssp4_mux", ssp_parent,
|
|
+ ARRAY_SIZE(ssp_parent), CLK_SET_RATE_PARENT,
|
|
+ apbc_base + APBC_SSP4, 4, 3, 0, &clk_lock);
|
|
+ clk_register_clkdev(clk, "ssp_mux.4", NULL);
|
|
+
|
|
+ clk = mmp_clk_register_apbc("ssp4", "ssp4_mux", apbc_base + APBC_SSP4,
|
|
+ 0, 0, &clk_lock);
|
|
+ clk_register_clkdev(clk, NULL, "pxa168-ssp.4");
|
|
+
|
|
+ clk = mmp_clk_register_apmu("dfc", "pll1_4", apmu_base + APMU_DFC,
|
|
+ 0x19b, &clk_lock);
|
|
+ clk_register_clkdev(clk, NULL, "pxa3xx-nand.0");
|
|
+
|
|
+ clk = clk_register_mux(NULL, "PXA-SDHCLK", sdh_parent,
|
|
+ ARRAY_SIZE(sdh_parent), CLK_SET_RATE_PARENT,
|
|
+ apmu_base + APMU_SDH0, 6, 1, 0, &clk_lock);
|
|
+ clk_register_clkdev(clk, "PXA-SDHCLK", NULL);
|
|
+
|
|
+ clk = mmp_clk_register_apmu("sdh0", "PXA-SDHCLK", apmu_base + APMU_SDH0,
|
|
+ 0x1b, &clk_lock);
|
|
+ clk_register_clkdev(clk, NULL, "sdhci-pxav2.0");
|
|
+
|
|
+ clk = mmp_clk_register_apmu("sdh1", "PXA-SDHCLK", apmu_base + APMU_SDH1,
|
|
+ 0x1b, &clk_lock);
|
|
+ clk_register_clkdev(clk, NULL, "sdhci-pxav2.1");
|
|
+
|
|
+ clk = mmp_clk_register_apmu("sdh2", "PXA-SDHCLK", apmu_base + APMU_SDH2,
|
|
+ 0x1b, &clk_lock);
|
|
+ clk_register_clkdev(clk, NULL, "sdhci-pxav2.2");
|
|
+
|
|
+ clk = mmp_clk_register_apmu("sdh3", "PXA-SDHCLK", apmu_base + APMU_SDH3,
|
|
+ 0x1b, &clk_lock);
|
|
+ clk_register_clkdev(clk, NULL, "sdhci-pxav2.3");
|
|
+
|
|
+#if 0
|
|
+ clk = mmp_clk_register_apmu("usb", "usb_pll", apmu_base + APMU_USB,
|
|
+ 0x9, &clk_lock);
|
|
+ clk_register_clkdev(clk, "usb_clk", NULL);
|
|
+
|
|
+ clk = mmp_clk_register_apmu("sph", "usb_pll", apmu_base + APMU_USB,
|
|
+ 0x12, &clk_lock);
|
|
+ clk_register_clkdev(clk, "sph_clk", NULL);
|
|
+#endif
|
|
+
|
|
+ clk = mmp_clk_register_apmu("sph", "U2HCLK", apmu_base + APMU_USB,
|
|
+ 0x12, &clk_lock);
|
|
+ clk_register_clkdev(clk, "U2HCLK", NULL);
|
|
+
|
|
+ clk = mmp_clk_register_apmu("usb", "U2OCLK", apmu_base + APMU_USB,
|
|
+ 0x09, &clk_lock);
|
|
+ clk_register_clkdev(clk, "U2OCLK", NULL);
|
|
+
|
|
+#if 0
|
|
+ /*Check USB clock start*/
|
|
+ /*clk = mmp_clk_register_apmu("u2h", "PXA168-U2HCLK", apmu_base + APMU_USB,*/
|
|
+ clk = clk_register_mux(NULL, "PXA168-U2HCLK", usb_sph_otg_parent/*"pll1_2_1_5"*/,
|
|
+ ARRAY_SIZE(usb_sph_otg_parent)/*1*/, CLK_SET_RATE_PARENT,
|
|
+ apmu_base + APMU_USB, 0, 5, 0, &clk_lock);
|
|
+ clk_register_clkdev(clk, "PXA168-U2HCLK", NULL);
|
|
+
|
|
+ clk = mmp_clk_register_apmu("pxa-sph", "PXA168-U2HCLK", apmu_base + APMU_USB,
|
|
+ 0x12, &clk_lock);
|
|
+ clk_register_clkdev(clk, "pxa-sph", NULL);
|
|
+
|
|
+ clk = clk_register_mux(NULL, "PXA168-U2OCLK", usb_sph_otg_parent/*"pll1_2_1_5"*/,
|
|
+ ARRAY_SIZE(usb_sph_otg_parent)/*1*/, CLK_SET_RATE_PARENT,
|
|
+ apmu_base + APMU_USB, 0, 5, 0, &clk_lock);
|
|
+ clk_register_clkdev(clk, "PXA168-U2OCLK", NULL);
|
|
+
|
|
+ clk = mmp_clk_register_apmu("mv-otg", "PXA168-U2OCLK", apmu_base + APMU_USB,
|
|
+ 0x09, &clk_lock);
|
|
+ clk_register_clkdev(clk, NULL, "mv-otg");
|
|
+#if 1
|
|
+ clk = clk_register_mux(NULL, "PXA168-U2OEHCICLK", usb_sph_otg_parent/*"pll1_2_1_5"*/,
|
|
+ ARRAY_SIZE(usb_sph_otg_parent)/*1*/, CLK_SET_RATE_PARENT,
|
|
+ apmu_base + APMU_USB, 0, 5, 0, &clk_lock);
|
|
+ clk_register_clkdev(clk, "PXA168-U2OCLK", NULL);
|
|
+
|
|
+ clk = mmp_clk_register_apmu("pxa-sph.0", "PXA168-U2OEHCICLK", apmu_base + APMU_USB,
|
|
+ 0x09, &clk_lock);
|
|
+ clk_register_clkdev(clk, NULL, "pxa-sph.0");
|
|
+
|
|
+ /*clk = mmp_clk_register_apmu("PXA168-U2OEHCICLK", "PXA168-U2HCLK", apmu_base + APMU_USB,
|
|
+ 0x12, &clk_lock);
|
|
+ clk_register_clkdev(clk, "PXA168-U2OEHCICLK", NULL);*/
|
|
+
|
|
+ clk = clk_register_mux(NULL, "PXA168-U2OGADGETCLK", usb_sph_otg_parent/*"pll1_2_1_5"*/,
|
|
+ ARRAY_SIZE(usb_sph_otg_parent)/*1*/, CLK_SET_RATE_PARENT,
|
|
+ apmu_base + APMU_USB, 0, 5, 0, &clk_lock);
|
|
+ clk_register_clkdev(clk, "PXA168-U2OGADGETCLK", NULL);
|
|
+ clk = mmp_clk_register_apmu("mv-udc", "PXA168-U2OGADGETCLK", apmu_base + APMU_USB,
|
|
+ 0x09, &clk_lock);
|
|
+ clk_register_clkdev(clk, NULL, "mv-udc");
|
|
+ /*clk_register_clkdev(clk, "PXA168-U2OGADGETCLK", NULL);*/
|
|
+#endif
|
|
+
|
|
+ /*Check USB clock End*/
|
|
+#endif
|
|
+
|
|
+ /*clk = clk_register_mux(NULL, "disp0_mux", disp_parent,*/
|
|
+ clk = clk_register_mux(NULL, "LCDCLK", disp_parent,
|
|
+ ARRAY_SIZE(disp_parent), CLK_SET_RATE_PARENT,
|
|
+ apmu_base + APMU_DISP0, 0, 7, 0, &clk_lock);
|
|
+ /*apmu_base + APMU_DISP0, 6, 1, 0, &clk_lock);*/
|
|
+ /*clk_register_clkdev(clk, "disp_mux.0", NULL);*/
|
|
+ clk_register_clkdev(clk, "LCDCLK", NULL);
|
|
+
|
|
+ clk = mmp_clk_register_apmu("disp0", "LCDCLK",
|
|
+ apmu_base + APMU_DISP0, 0x7f, &clk_lock);
|
|
+ /*apmu_base + APMU_DISP0, 0x1b, &clk_lock);*/
|
|
+ clk_register_clkdev(clk, NULL, "pxa168-fb");
|
|
+
|
|
+ clk = clk_register_mux(NULL, "ccic0_mux", ccic_parent,
|
|
+ ARRAY_SIZE(ccic_parent), CLK_SET_RATE_PARENT,
|
|
+ apmu_base + APMU_CCIC0, 6, 1, 0, &clk_lock);
|
|
+ clk_register_clkdev(clk, "ccic_mux.0", NULL);
|
|
+
|
|
+ clk = mmp_clk_register_apmu("ccic0", "ccic0_mux",
|
|
+ apmu_base + APMU_CCIC0, 0x1b, &clk_lock);
|
|
+ clk_register_clkdev(clk, "fnclk", "mmp-ccic.0");
|
|
+
|
|
+ clk = clk_register_mux(NULL, "ccic0_phy_mux", ccic_phy_parent,
|
|
+ ARRAY_SIZE(ccic_phy_parent),
|
|
+ CLK_SET_RATE_PARENT, apmu_base + APMU_CCIC0,
|
|
+ 7, 1, 0, &clk_lock);
|
|
+ clk_register_clkdev(clk, "ccic_phy_mux.0", NULL);
|
|
+
|
|
+ clk = mmp_clk_register_apmu("ccic0_phy", "ccic0_phy_mux",
|
|
+ apmu_base + APMU_CCIC0, 0x24, &clk_lock);
|
|
+ clk_register_clkdev(clk, "phyclk", "mmp-ccic.0");
|
|
+
|
|
+ clk = clk_register_divider(NULL, "ccic0_sphy_div", "ccic0_mux",
|
|
+ CLK_SET_RATE_PARENT, apmu_base + APMU_CCIC0,
|
|
+ 10, 5, 0, &clk_lock);
|
|
+ clk_register_clkdev(clk, "sphyclk_div", NULL);
|
|
+
|
|
+ clk = mmp_clk_register_apmu("ccic0_sphy", "ccic0_sphy_div",
|
|
+ apmu_base + APMU_CCIC0, 0x300, &clk_lock);
|
|
+ clk_register_clkdev(clk, "sphyclk", "mmp-ccic.0");
|
|
+
|
|
+#if 0
|
|
+ clk = clk_register_mux(NULL, "GCCLK", "pll1_16",
|
|
+ 1, CLK_SET_RATE_PARENT, apmu_base + APMU_GC,
|
|
+ 0, 8, 0, &clk_lock);
|
|
+ /*clk->ops = gc300_clk_ops;*/
|
|
+ clk_register_clkdev(clk, "GCCLK", NULL);
|
|
+#endif
|
|
+ clk = mmp_clk_register_apmu("pxa168-eth", "MFUCLK", apmu_base + APMU_ETH,
|
|
+ 0x9, &clk_lock);
|
|
+ clk_register_clkdev(clk, "MFUCLK", NULL);
|
|
+#endif
|
|
}
|
|
diff --git a/drivers/i2c/busses/i2c-pxa.c b/drivers/i2c/busses/i2c-pxa.c
|
|
index ea6d45d..e525151 100644
|
|
--- a/drivers/i2c/busses/i2c-pxa.c
|
|
+++ b/drivers/i2c/busses/i2c-pxa.c
|
|
@@ -1160,7 +1160,8 @@ static int i2c_pxa_probe(struct platform_device *dev)
|
|
i2c->adap.class = plat->class;
|
|
}
|
|
|
|
- clk_enable(i2c->clk);
|
|
+ /*clk_enable(i2c->clk);*/
|
|
+ clk_prepare_enable(i2c->clk);
|
|
|
|
if (i2c->use_pio) {
|
|
i2c->adap.algo = &i2c_pxa_pio_algorithm;
|
|
@@ -1202,7 +1203,8 @@ static int i2c_pxa_probe(struct platform_device *dev)
|
|
if (!i2c->use_pio)
|
|
free_irq(irq, i2c);
|
|
ereqirq:
|
|
- clk_disable(i2c->clk);
|
|
+ /*clk_disable(i2c->clk);*/
|
|
+ clk_disable_unprepare(i2c->clk);
|
|
iounmap(i2c->reg_base);
|
|
eremap:
|
|
clk_put(i2c->clk);
|
|
diff --git a/drivers/mmc/host/Kconfig b/drivers/mmc/host/Kconfig
|
|
index 9ab8f8d..d6fd06b 100644
|
|
--- a/drivers/mmc/host/Kconfig
|
|
+++ b/drivers/mmc/host/Kconfig
|
|
@@ -219,10 +219,11 @@ config MMC_SDHCI_PXAV2
|
|
depends on CLKDEV_LOOKUP
|
|
select MMC_SDHCI
|
|
select MMC_SDHCI_PLTFM
|
|
- default CPU_PXA910
|
|
+ select MMC_SDHCI_IO_ACCESSORS
|
|
+ default y if (CPU_PXA910 || CPU_PXA168)
|
|
help
|
|
This selects the Marvell(R) PXAV2 SD Host Controller.
|
|
- If you have a PXA9XX platform with SD Host Controller
|
|
+ If you have a PXAXXX platform with SD Host Controller
|
|
and a card slot, say Y or M here.
|
|
|
|
If unsure, say N.
|
|
diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c
|
|
index 2ea429c..346d384 100644
|
|
--- a/drivers/mmc/host/sdhci.c
|
|
+++ b/drivers/mmc/host/sdhci.c
|
|
@@ -1002,6 +1002,9 @@ static void sdhci_send_command(struct sdhci_host *host, struct mmc_command *cmd)
|
|
mdelay(1);
|
|
}
|
|
|
|
+ if (host->ops->platform_specific_completion)
|
|
+ host->ops->platform_specific_completion(host);
|
|
+
|
|
mod_timer(&host->timer, jiffies + 10 * HZ);
|
|
|
|
host->cmd = cmd;
|
|
@@ -1162,6 +1165,16 @@ static void sdhci_set_clock(struct sdhci_host *host, unsigned int clock)
|
|
* Mode.
|
|
*/
|
|
if (host->clk_mul) {
|
|
+ u16 ctrl;
|
|
+
|
|
+ /*
|
|
+ * We need to figure out whether the Host Driver needs
|
|
+ * to select Programmable Clock Mode, or the value can
|
|
+ * be set automatically by the Host Controller based on
|
|
+ * the Preset Value registers.
|
|
+ */
|
|
+ ctrl = sdhci_readw(host, SDHCI_HOST_CONTROL2);
|
|
+ if (!(ctrl & SDHCI_CTRL_PRESET_VAL_ENABLE)) {
|
|
for (div = 1; div <= 1024; div++) {
|
|
if ((host->max_clk * host->clk_mul / div)
|
|
<= clock)
|
|
@@ -1175,6 +1188,7 @@ static void sdhci_set_clock(struct sdhci_host *host, unsigned int clock)
|
|
real_div = div;
|
|
clk_mul = host->clk_mul;
|
|
div--;
|
|
+ }
|
|
} else {
|
|
/* Version 3.00 divisors must be a multiple of 2. */
|
|
if (host->max_clk <= clock)
|
|
diff --git a/drivers/mmc/host/sdhci.h b/drivers/mmc/host/sdhci.h
|
|
index 379e09d..08e60e0 100644
|
|
--- a/drivers/mmc/host/sdhci.h
|
|
+++ b/drivers/mmc/host/sdhci.h
|
|
@@ -292,6 +292,7 @@ struct sdhci_ops {
|
|
void (*hw_reset)(struct sdhci_host *host);
|
|
void (*platform_suspend)(struct sdhci_host *host);
|
|
void (*platform_resume)(struct sdhci_host *host);
|
|
+ void (*platform_specific_completion)(struct sdhci_host *host);
|
|
void (*adma_workaround)(struct sdhci_host *host, u32 intmask);
|
|
void (*platform_init)(struct sdhci_host *host);
|
|
};
|
|
diff --git a/drivers/net/ethernet/marvell/pxa168_eth.c b/drivers/net/ethernet/marvell/pxa168_eth.c
|
|
index 1c8af8b..d66e10c 100644
|
|
--- a/drivers/net/ethernet/marvell/pxa168_eth.c
|
|
+++ b/drivers/net/ethernet/marvell/pxa168_eth.c
|
|
@@ -1482,7 +1482,8 @@ static int pxa168_eth_probe(struct platform_device *pdev)
|
|
DRIVER_NAME);
|
|
return -ENODEV;
|
|
}
|
|
- clk_enable(clk);
|
|
+ /*clk_enable(clk);*/
|
|
+ clk_prepare_enable(clk);
|
|
|
|
dev = alloc_etherdev(sizeof(struct pxa168_eth_private));
|
|
if (!dev) {
|
|
@@ -1514,10 +1515,18 @@ static int pxa168_eth_probe(struct platform_device *pdev)
|
|
|
|
INIT_WORK(&pep->tx_timeout_task, pxa168_eth_tx_timeout_task);
|
|
|
|
- printk(KERN_INFO "%s:Using random mac address\n", DRIVER_NAME);
|
|
- eth_hw_addr_random(dev);
|
|
-
|
|
pep->pd = pdev->dev.platform_data;
|
|
+
|
|
+ if (pep->pd->init)
|
|
+ pep->pd->init();
|
|
+
|
|
+ if (is_valid_ether_addr(pep->pd->mac_addr))
|
|
+ memcpy(dev->dev_addr, pep->pd->mac_addr, 6);
|
|
+ else {
|
|
+ printk(KERN_INFO "%s:Using random mac address\n", DRIVER_NAME);
|
|
+ eth_hw_addr_random(dev);
|
|
+ }
|
|
+
|
|
pep->rx_ring_size = NUM_RX_DESCS;
|
|
if (pep->pd->rx_queue_size)
|
|
pep->rx_ring_size = pep->pd->rx_queue_size;
|
|
@@ -1572,7 +1581,8 @@ static int pxa168_eth_probe(struct platform_device *pdev)
|
|
err_netdev:
|
|
free_netdev(dev);
|
|
err_clk:
|
|
- clk_disable(clk);
|
|
+ /*clk_disable(clk);*/
|
|
+ clk_disable_unprepare(clk);
|
|
clk_put(clk);
|
|
return err;
|
|
}
|
|
diff --git a/drivers/rtc/Kconfig b/drivers/rtc/Kconfig
|
|
index b983813..c6d0b63 100644
|
|
--- a/drivers/rtc/Kconfig
|
|
+++ b/drivers/rtc/Kconfig
|
|
@@ -1044,7 +1044,7 @@ config RTC_DRV_GENERIC
|
|
|
|
config RTC_DRV_PXA
|
|
tristate "PXA27x/PXA3xx"
|
|
- depends on ARCH_PXA
|
|
+ depends on (ARCH_PXA || ARCH_MMP)
|
|
help
|
|
If you say Y here you will get access to the real time clock
|
|
built into your PXA27x or PXA3xx CPU.
|
|
diff --git a/drivers/spi/Kconfig b/drivers/spi/Kconfig
|
|
index 92a9345..b155c02 100644
|
|
--- a/drivers/spi/Kconfig
|
|
+++ b/drivers/spi/Kconfig
|
|
@@ -329,8 +329,8 @@ config SPI_PXA2XX_DMA
|
|
|
|
config SPI_PXA2XX
|
|
tristate "PXA2xx SSP SPI master"
|
|
- depends on (ARCH_PXA || PCI || ACPI) && GENERIC_HARDIRQS
|
|
- select PXA_SSP if ARCH_PXA
|
|
+ depends on (ARCH_PXA || ARCH_MMP || PCI || ACPI) && GENERIC_HARDIRQS
|
|
+ select PXA_SSP if (ARCH_PXA || ARCH_MMP)
|
|
help
|
|
This enables using a PXA2xx or Sodaville SSP port as a SPI master
|
|
controller. The driver can be configured to use any SSP port and
|
|
diff --git a/drivers/video/Kconfig b/drivers/video/Kconfig
|
|
index 2e937bd..2d9516b 100644
|
|
--- a/drivers/video/Kconfig
|
|
+++ b/drivers/video/Kconfig
|
|
@@ -1879,12 +1879,15 @@ config FB_68328
|
|
Say Y here if you want to support the built-in frame buffer of
|
|
the Motorola 68328 CPU family.
|
|
|
|
+source "drivers/video/hdmi/Kconfig"
|
|
config FB_PXA168
|
|
tristate "PXA168/910 LCD framebuffer support"
|
|
depends on FB && (CPU_PXA168 || CPU_PXA910)
|
|
select FB_CFB_FILLRECT
|
|
select FB_CFB_COPYAREA
|
|
select FB_CFB_IMAGEBLIT
|
|
+ select TDA9981
|
|
+ select TDA9950
|
|
---help---
|
|
Frame buffer driver for the built-in LCD controller in the Marvell
|
|
MMP processor.
|
|
diff --git a/drivers/video/Makefile b/drivers/video/Makefile
|
|
index e8bae8d..c42bb09 100644
|
|
--- a/drivers/video/Makefile
|
|
+++ b/drivers/video/Makefile
|
|
@@ -105,7 +105,7 @@ obj-$(CONFIG_FB_GBE) += gbefb.o
|
|
obj-$(CONFIG_FB_CIRRUS) += cirrusfb.o
|
|
obj-$(CONFIG_FB_ASILIANT) += asiliantfb.o
|
|
obj-$(CONFIG_FB_PXA) += pxafb.o
|
|
-obj-$(CONFIG_FB_PXA168) += pxa168fb.o
|
|
+obj-$(CONFIG_FB_PXA168) += pxa168fb.o pxa168fb_ovly.o hdmi/
|
|
obj-$(CONFIG_PXA3XX_GCU) += pxa3xx-gcu.o
|
|
obj-$(CONFIG_MMP_DISP) += mmp/
|
|
obj-$(CONFIG_FB_W100) += w100fb.o
|
|
diff --git a/drivers/video/hdmi/Kconfig b/drivers/video/hdmi/Kconfig
|
|
new file mode 100644
|
|
index 0000000..e6aeb5f
|
|
--- /dev/null
|
|
+++ b/drivers/video/hdmi/Kconfig
|
|
@@ -0,0 +1,7 @@
|
|
+config TDA9981
|
|
+ tristate
|
|
+ default n
|
|
+
|
|
+config TDA9950
|
|
+ tristate
|
|
+ default n
|
|
diff --git a/drivers/video/hdmi/MakeModules b/drivers/video/hdmi/MakeModules
|
|
new file mode 100644
|
|
index 0000000..2fdc1db
|
|
--- /dev/null
|
|
+++ b/drivers/video/hdmi/MakeModules
|
|
@@ -0,0 +1,55 @@
|
|
+PACKAGE_NAME:=hdmi
|
|
+
|
|
+RULES:=compile
|
|
+
|
|
+ARCH:=arm
|
|
+CROSS_COMPILE:=arm-none-linux-gnueabi-
|
|
+# CROSS_COMPILE:=arm-marvell-linux-gnueabi-
|
|
+VARS:= ARCH=$(ARCH) CROSS_COMPILE=$(CROSS_COMPILE)
|
|
+# VARS:= V=1 ARCH=$(ARCH) CROSS_COMPILE=$(CROSS_COMPILE)
|
|
+
|
|
+# module to be put in driver/video/hdmi
|
|
+
|
|
+LINUX_DIR=../../..
|
|
+LINUXKERNEL_SRC=$(LINUX_DIR)
|
|
+
|
|
+all: $(RULES)
|
|
+
|
|
+compile:
|
|
+ @echo "\t-----> $(PACKAGE_NAME):$@"
|
|
+ @rm -rf *.o *.ko *.mod.c .*.cmd .tmp_versions *.c.* *.h.*
|
|
+# @mv tda998x_version.h temp && cat temp | awk '$$2~"PATCHLEVEL" {$$3=$$3+1};{print};' >tda998x_version.h && rm temp
|
|
+ $(MAKE) -C $(LINUXKERNEL_SRC) M=`pwd` $(VARS) modules
|
|
+# @touch $@
|
|
+
|
|
+uptx:
|
|
+ adb shell rm hdmitx.ko
|
|
+ adb shell rmmod hdmitx
|
|
+ adb push hdmitx.ko hdmitx.ko
|
|
+ adb shell insmod hdmitx.ko verbose=1
|
|
+# adb shell insmod hdmitx.ko
|
|
+
|
|
+upcec:
|
|
+ adb shell rm hdmicec.ko
|
|
+ adb shell rmmod hdmicec
|
|
+ adb push hdmicec.ko hdmicec.ko
|
|
+ adb shell insmod hdmicec.ko verbose=1 device=4
|
|
+
|
|
+strip:
|
|
+ strip -g -I elf32-little hdmitx.ko -o hdmitx_striped.ko
|
|
+ strip -g -I elf32-little hdmicec.ko -o hdmicec_striped.ko
|
|
+
|
|
+clean:
|
|
+ @echo "\t-----> $(PACKAGE_NAME):$@"
|
|
+ @rm -rf *.o *.ko *.mod.c .*.cmd .tmp_versions *.c.* *.h.* *.symvers *.order
|
|
+ @cd comps/tmdlHdmiCEC/src && rm -rf *.o *.ko *.mod.c .*.cmd .tmp_versions *.c.* *.h.*
|
|
+ @cd comps/tmdlHdmiCEC/cfg && rm -rf *.o *.ko *.mod.c .*.cmd .tmp_versions *.c.* *.h.*
|
|
+ @cd comps/tmdlTDA9983/src && rm -rf *.o *.ko *.mod.c .*.cmd .tmp_versions *.c.* *.h.*
|
|
+ @cd comps/tmdlTDA9983/cfg && rm -rf *.o *.ko *.mod.c .*.cmd .tmp_versions *.c.* *.h.*
|
|
+ @cd comps/tmbslTDA9983/src && rm -rf *.o *.ko *.mod.c .*.cmd .tmp_versions *.c.* *.h.*
|
|
+
|
|
+ @if [ -e .compiled ]; then rm .compiled; fi
|
|
+
|
|
+# install: .install
|
|
+# .install:
|
|
+# cp ....
|
|
diff --git a/drivers/video/hdmi/Makefile b/drivers/video/hdmi/Makefile
|
|
new file mode 100644
|
|
index 0000000..cfc132a
|
|
--- /dev/null
|
|
+++ b/drivers/video/hdmi/Makefile
|
|
@@ -0,0 +1,202 @@
|
|
+
|
|
+
|
|
+############### select your chip + platform here ###################
|
|
+
|
|
+# TDA_TX := TDA9984
|
|
+# TDA_TX := TDA9983
|
|
+
|
|
+#HDMICEC := $(TDA9950)
|
|
+#CONFIG_TDA9981 := m
|
|
+#CONFIG_TDA9950 := m
|
|
+
|
|
+ifneq ($(CONFIG_TDA9981),)
|
|
+TDA_TX := TDA9981
|
|
+HDMITX := $(CONFIG_TDA9981)
|
|
+#HDMICEC := $(CONFIG_TDA9950)
|
|
+else ifneq ($(CONFIG_TDA19989),)
|
|
+TDA_TX := TDA19989
|
|
+HDMITX := $(CONFIG_TDA19989)
|
|
+HDMICEC := $(CONFIG_TDA19989)
|
|
+endif
|
|
+
|
|
+# TDA_PLATFORM := ZOOMII
|
|
+TDA_PLATFORM := OTHERS
|
|
+
|
|
+TDA_HDCP := 0
|
|
+# TDA_HDCP := TMFL_HDCP_SUPPORT
|
|
+
|
|
+####################################################################
|
|
+
|
|
+EXTRA_CFLAGS += -DFUNC_PTR=" " -DCONST_DAT="const " -DRAM_DAT=" "
|
|
+EXTRA_CFLAGS += -DTDA_NAME=$(TDA_TX)
|
|
+EXTRA_CFLAGS += -DTMFL_NO_RTOS -DIRQ
|
|
+EXTRA_CFLAGS += "-Dinit_MUTEX(sem)=sema_init(sem,1)"
|
|
+
|
|
+ifeq ($(TDA_PLATFORM),ZOOMII)
|
|
+EXTRA_CFLAGS += -DZOOMII_PATCH
|
|
+EXTRA_CFLAGS += -DTWL4030_HACK
|
|
+EXTRA_CFLAGS += -DANDROID_DSS
|
|
+EXTRA_CFLAGS += -DGUI_OVER_HDMI
|
|
+endif
|
|
+
|
|
+ifeq ($(TDA_TX),TDA19989)
|
|
+EXTRA_CFLAGS += -DTMFL_TDA19989 -DTMFL_TDA9989
|
|
+ifeq ($(TDA_HDCP),TMFL_HDCP_SUPPORT)
|
|
+EXTRA_CFLAGS += -D$(TDA_HDCP)
|
|
+else
|
|
+EXTRA_CFLAGS += -DNO_HDCP
|
|
+endif
|
|
+endif
|
|
+
|
|
+ifeq ($(TDA_TX),TDA9984)
|
|
+EXTRA_CFLAGS += -DNO_HDCP
|
|
+endif
|
|
+
|
|
+ifeq ($(TDA_TX),TDA9981)
|
|
+EXTRA_CFLAGS += -DTMFL_TDA9981_SUPPORT -DTMFL_RX_SENSE_ON
|
|
+endif
|
|
+
|
|
+########## devlib ##################################################
|
|
+
|
|
+ifeq ($(TDA_TX),TDA19989)
|
|
+TXSRC := comps/tmdlHdmiTx/src
|
|
+TXCFG := comps/tmdlHdmiTx/cfg/TDA9989
|
|
+CECSRC := comps/tmdlHdmiCEC/src
|
|
+CECCFG := comps/tmdlHdmiCEC/cfg
|
|
+endif
|
|
+
|
|
+ifeq ($(TDA_TX),TDA9984)
|
|
+TXSRC := comps/tmdlHdmiTx/src
|
|
+TXCFG := comps/tmdlHdmiTx/cfg/TDA9989
|
|
+endif
|
|
+
|
|
+ifeq ($(TDA_TX),TDA9983)
|
|
+TXSRC := comps/tmdlTDA9983/src
|
|
+TXCFG := comps/tmdlTDA9983/cfg
|
|
+endif
|
|
+
|
|
+ifeq ($(TDA_TX),TDA9981)
|
|
+TXSRC := comps/tmdlTDA9983/src
|
|
+TXCFG := comps/tmdlTDA9983/cfg
|
|
+CECSRC := comps/tmdlHdmiCEC/src
|
|
+CECCFG := comps/tmdlHdmiCEC/cfg
|
|
+endif
|
|
+
|
|
+########## board service layer #####################################
|
|
+
|
|
+ifeq ($(TDA_TX),TDA19989)
|
|
+BSL := comps/tmbslTDA9989NoHdcp/src/TDA9989n2
|
|
+endif
|
|
+
|
|
+ifeq ($(TDA_TX),TDA9984)
|
|
+BSL := comps/tmbslTDA9984NoHdcp/src
|
|
+endif
|
|
+
|
|
+ifeq ($(TDA_TX),TDA9983)
|
|
+BSL := comps/tmbslTDA9983/src
|
|
+endif
|
|
+
|
|
+ifeq ($(TDA_TX),TDA9981)
|
|
+BSL := comps/tmbslTDA9983/src
|
|
+endif
|
|
+
|
|
+####################################################################
|
|
+
|
|
+obj-$(HDMITX) += hdmitx.o
|
|
+obj-$(HDMICEC) += hdmicec.o
|
|
+
|
|
+# Linux module
|
|
+hdmitx-objs := tda998x.o
|
|
+hdmicec-objs := tda998x_cec.o
|
|
+
|
|
+# NXP comps
|
|
+ifeq ($(TDA_TX),TDA19989)
|
|
+hdmitx-objs += $(TXSRC)/tmdlHdmiTx.o
|
|
+hdmitx-objs += $(TXSRC)/tmdlHdmiTx_local.o
|
|
+hdmitx-objs += $(TXCFG)/tmdlHdmiTx_Linux.o
|
|
+hdmitx-objs += $(BSL)/tmbslTDA9989_local.o
|
|
+hdmitx-objs += $(BSL)/tmbslTDA9989_InOut.o
|
|
+hdmitx-objs += $(BSL)/tmbslTDA9989_HDCP.o
|
|
+hdmitx-objs += $(BSL)/tmbslTDA9989_State.o
|
|
+hdmitx-objs += $(BSL)/tmbslTDA9989_Misc.o
|
|
+hdmitx-objs += $(BSL)/tmbslTDA9989_Edid.o
|
|
+hdmicec-objs += $(CECSRC)/tmdlHdmiCEC.o
|
|
+hdmicec-objs += $(CECSRC)/tmdlHdmiCEC_local.o
|
|
+hdmicec-objs += $(CECCFG)/tmdlHdmiCEC_Linux.o
|
|
+endif
|
|
+
|
|
+ifeq ($(TDA_TX),TDA9984)
|
|
+hdmitx-objs += $(TXSRC)/tmdlHdmiTx.o
|
|
+hdmitx-objs += $(TXSRC)/tmdlHdmiTx_local.o
|
|
+hdmitx-objs += $(TXCFG)/tmdlHdmiTx_Linux.o
|
|
+hdmitx-objs += $(BSL)/tmbslTDA9984_local.o
|
|
+hdmitx-objs += $(BSL)/tmbslTDA9984_InOut.o
|
|
+hdmitx-objs += $(BSL)/tmbslTDA9984_HDCP.o
|
|
+hdmitx-objs += $(BSL)/tmbslTDA9984_State.o
|
|
+hdmitx-objs += $(BSL)/tmbslTDA9984_Misc.o
|
|
+hdmitx-objs += $(BSL)/tmbslTDA9984_Edid.o
|
|
+endif
|
|
+
|
|
+ifeq ($(TDA_TX),TDA9983)
|
|
+hdmitx-objs += $(BSL)/tmbslHdmiTx_2.o
|
|
+hdmitx-objs += $(BSL)/tmbslHdmiTx_1.o
|
|
+hdmitx-objs += $(BSL)/tmbslHdmiTx_local.o
|
|
+hdmitx-objs += $(TXSRC)/tmdlHdmiTx.o
|
|
+hdmitx-objs += $(TXCFG)/tmdlHdmiTx_Linux.o
|
|
+endif
|
|
+
|
|
+ifeq ($(TDA_TX),TDA9981)
|
|
+hdmitx-objs += $(BSL)/tmbslHdmiTx_2.o
|
|
+hdmitx-objs += $(BSL)/tmbslHdmiTx_1.o
|
|
+hdmitx-objs += $(BSL)/tmbslHdmiTx_local.o
|
|
+hdmitx-objs += $(TXSRC)/tmdlHdmiTx.o
|
|
+hdmitx-objs += $(TXCFG)/tmdlHdmiTx_Linux.o
|
|
+hdmicec-objs += $(CECSRC)/tmdlHdmiCEC.o
|
|
+hdmicec-objs += $(CECSRC)/tmdlHdmiCEC_local.o
|
|
+hdmicec-objs += $(CECCFG)/tmdlHdmiCEC_Linux.o
|
|
+endif
|
|
+
|
|
+####################################################################
|
|
+
|
|
+EXTRA_CFLAGS += -I$(obj)
|
|
+EXTRA_CFLAGS += -I$(obj)/inc
|
|
+
|
|
+ifeq ($(TDA_TX),TDA19989)
|
|
+EXTRA_CFLAGS += -I$(obj)/comps/tmbslHdmiTx/inc
|
|
+EXTRA_CFLAGS += -I$(obj)/comps/tmdlHdmiTx/src
|
|
+EXTRA_CFLAGS += -I$(obj)/comps/tmdlHdmiTx/cfg
|
|
+EXTRA_CFLAGS += -I$(obj)/comps/tmdlHdmiTx/inc
|
|
+EXTRA_CFLAGS += -I$(obj)/comps/tmbslTDA9989NoHdcp/inc
|
|
+EXTRA_CFLAGS += -I$(obj)/comps/tmbslTDA9989NoHdcp/src/TDA9989n2
|
|
+EXTRA_CFLAGS += -I$(obj)/comps/tmdlHdmiCEC/inc
|
|
+EXTRA_CFLAGS += -I$(obj)/comps/tmdlHdmiCEC/src
|
|
+EXTRA_CFLAGS += -I$(obj)/comps/tmdlHdmiCEC/cfg
|
|
+endif
|
|
+
|
|
+ifeq ($(TDA_TX),TDA9984)
|
|
+EXTRA_CFLAGS += -I$(obj)/comps/tmbslHdmiTx/inc
|
|
+EXTRA_CFLAGS += -I$(obj)/comps/tmdlHdmiTx/src
|
|
+EXTRA_CFLAGS += -I$(obj)/comps/tmdlHdmiTx/cfg
|
|
+EXTRA_CFLAGS += -I$(obj)/comps/tmdlHdmiTx/inc
|
|
+EXTRA_CFLAGS += -I$(obj)/comps/tmbslTDA9984NoHdcp/inc
|
|
+EXTRA_CFLAGS += -I$(obj)/comps/tmbslTDA9984NoHdcp/src
|
|
+endif
|
|
+
|
|
+ifeq ($(TDA_TX),TDA9983)
|
|
+EXTRA_CFLAGS += -I$(obj)/comps/tmbslTDA9983/inc
|
|
+EXTRA_CFLAGS += -I$(obj)/comps/tmdlTDA9983/inc
|
|
+EXTRA_CFLAGS += -I$(obj)/comps/tmdlTDA9983/src
|
|
+EXTRA_CFLAGS += -I$(obj)/comps/tmdlTDA9983/cfg
|
|
+endif
|
|
+
|
|
+ifeq ($(TDA_TX),TDA9981)
|
|
+EXTRA_CFLAGS += -I$(obj)/comps/tmbslTDA9983/inc
|
|
+EXTRA_CFLAGS += -I$(obj)/comps/tmdlTDA9983/inc
|
|
+EXTRA_CFLAGS += -I$(obj)/comps/tmdlTDA9983/src
|
|
+EXTRA_CFLAGS += -I$(obj)/comps/tmdlTDA9983/cfg
|
|
+EXTRA_CFLAGS += -I$(obj)/comps/tmdlHdmiCEC/inc
|
|
+EXTRA_CFLAGS += -I$(obj)/comps/tmdlHdmiCEC/src
|
|
+EXTRA_CFLAGS += -I$(obj)/comps/tmdlHdmiCEC/cfg
|
|
+endif
|
|
+
|
|
+
|
|
diff --git a/drivers/video/hdmi/comps/tmbslHdmiTx/inc/tmbslHdmiTx_types.h b/drivers/video/hdmi/comps/tmbslHdmiTx/inc/tmbslHdmiTx_types.h
|
|
new file mode 100755
|
|
index 0000000..a03593e
|
|
--- /dev/null
|
|
+++ b/drivers/video/hdmi/comps/tmbslHdmiTx/inc/tmbslHdmiTx_types.h
|
|
@@ -0,0 +1,1799 @@
|
|
+/**
|
|
+ * Copyright (C) 2007 NXP N.V., All Rights Reserved.
|
|
+ * This source code and any compilation or derivative thereof is the proprietary
|
|
+ * information of NXP N.V. and is confidential in nature. Under no circumstances
|
|
+ * is this software to be exposed to or placed under an Open Source License of
|
|
+ * any type without the expressed written permission of NXP N.V.
|
|
+ *
|
|
+ * \file bsl_types.h
|
|
+ *
|
|
+ * \version $Revision: 18 $
|
|
+ *
|
|
+ * \date $Date: 17/03/08 $
|
|
+ *
|
|
+ * \brief HDMI Transmitter common types
|
|
+ *
|
|
+ * \section refs Reference Documents
|
|
+ *
|
|
+ * \section info Change Information
|
|
+ *
|
|
+ * \verbatim
|
|
+ *
|
|
+ * $History: bsl_types.h $
|
|
+ *
|
|
+ *
|
|
+ * **************** Version 18 ******************
|
|
+ * User: G.Burnouf Date: 01/04/08
|
|
+ * Updated in $/Source/bsl/inc
|
|
+ * PR1468 : add new function bslTDA9984GetSinkCategory
|
|
+ *
|
|
+ *
|
|
+ * **************** Version 17 ******************
|
|
+ * User: G.Burnouf Date: 17/03/08
|
|
+ * Updated in $/Source/bsl/inc
|
|
+ * PR1430 : Increase size of table for
|
|
+ * Short Audio Descriptor
|
|
+ *
|
|
+ * **************** Version 16 ******************
|
|
+ * User: G.Burnouf Date: 06/03/08
|
|
+ * Updated in $/Source/bsl/inc
|
|
+ * PR1406 : new reset audio fifo sequence
|
|
+ *
|
|
+ * **************** Version 15 ******************
|
|
+ * User: G.Burnouf Date: 05/02/08
|
|
+ * Updated in $/Source/bsl/inc
|
|
+ * PR1251 : add new type for function
|
|
+ * bslTDA9984EdidGetBasicDisplayParam
|
|
+ *
|
|
+ ****************** version 14 ******************
|
|
+ * User: G.Burnouf Date: 14/01/08
|
|
+ * Updated in $/Source/bsl/inc
|
|
+ * PR580 - Change BSL error base address
|
|
+ *
|
|
+ ****************** version 13 ******************
|
|
+ * User: G.Burnouf Date: 10/01/08
|
|
+ * Updated in $/Source/bsl/inc
|
|
+ * PR606 - Apply audio port config in function
|
|
+ * of audio format
|
|
+ *
|
|
+ * **************** Version 12 ******************
|
|
+ * User: G.Burnouf Date: 10/12/07 Time: 08:30
|
|
+ * Updated in $/Source/bsl/inc
|
|
+ * PR1145 : return DTD and monitor description
|
|
+ *
|
|
+ * ***************** Version 11 *****************
|
|
+ * User: G.Burnouf Date: 04/12/07
|
|
+ * Updated in $/Source/bsl/inc
|
|
+ * PR948 : add new formats, 1080p24/25/30
|
|
+ *
|
|
+ * ***************** Version 10 *****************
|
|
+ * User: C. Diehl Date: 27/11/07
|
|
+ * Updated in $/Source/bsl/inc
|
|
+ * PR1030 : - Align with the common interface
|
|
+ * reworked for the LIPP4200
|
|
+ *
|
|
+ * ***************** Version 9 *****************
|
|
+ * User: J.Lamotte Date: 23/11/07 Time: 09:35
|
|
+ * Updated in $/Source/bsl/src
|
|
+ * PR1078 : - update HDMI_TX_SVD_MAX_CNT from 30
|
|
+ * to 113
|
|
+ *
|
|
+ * ***************** Version 8 *****************
|
|
+ * User: G.Burnouf Date: 13/11/07 Time: 09:29
|
|
+ * Updated in $/Source/bsl/src
|
|
+ * PR1008 : - update type bslHwFeature_t
|
|
+ *
|
|
+ * ***************** Version 7 *****************
|
|
+ * User: G.Burnouf Date: 16/10/07 Time: 14:32
|
|
+ * Updated in $/Source/bsl/src
|
|
+ * PR882 : - add type bslPowerState_t
|
|
+ * - add type bslPktGmt_t for gamut
|
|
+ * - add new interrupt callback for VS
|
|
+ *
|
|
+ * ***************** Version 6 *****************
|
|
+ * User: G.Burnouf Date: 05/10/07 Time: 14:32
|
|
+ * Updated in $/Source/bsl/src
|
|
+ * PR824 : add type for enum _bslCallbackInt
|
|
+ *
|
|
+ * ***************** Version 5 *****************
|
|
+ * User: J.Turpin Date: 13/09/07 Time: 14:32
|
|
+ * Updated in $/Source/bsl/src
|
|
+ * PR693 : add black pattern functionality
|
|
+ * - add HDMITX_PATTERN_BLACK in
|
|
+ * enum bslTestPattern_t
|
|
+ *
|
|
+ * ***************** Version 4 *****************
|
|
+ * User: G.Burnouf Date: 06/09/07 Time: 17:22
|
|
+ * Updated in $/Source/bslTDA9984/Inc
|
|
+ * PR656 : - add HBR format
|
|
+ * - add format I2s Philips left and right justified
|
|
+ *
|
|
+ * ***************** Version 3 *****************
|
|
+ * User: G. Burnouf Date: 07/08/07 Time: 10:30
|
|
+ * Updated in $/Source/bslTDA9984/Inc
|
|
+ * PR572 - change type name of bslTDA9984_ to bsl_
|
|
+ *
|
|
+ * ***************** Version 2 *****************
|
|
+ * User: B.Vereecke Date: 07/08/07 Time: 10:30
|
|
+ * Updated in $/Source/bslTDA9984/Inc
|
|
+ * PR551 - Add a new Pattern type in bslTestPattern_t
|
|
+ * it is used for set the bluescreen
|
|
+ *
|
|
+ * ***************** Version 1 *****************
|
|
+ * User: G. Burnouf Date: 05/07/07 Time: 17:00
|
|
+ * Updated in $/Source/bslTDA9984/Inc
|
|
+ * PR 414 : Add new edid management
|
|
+ *
|
|
+ * \endverbatim
|
|
+ *
|
|
+ * */
|
|
+
|
|
+#ifndef BSLHDMITX_TYPES_H
|
|
+#define BSLHDMITX_TYPES_H
|
|
+
|
|
+/*============================================================================*/
|
|
+/* INCLUDE FILES */
|
|
+/*============================================================================*/
|
|
+
|
|
+#include "tmNxCompId.h"
|
|
+
|
|
+/*============================================================================*/
|
|
+/* MACRO DEFINITIONS */
|
|
+/*============================================================================*/
|
|
+
|
|
+/**
|
|
+ * The maximum number of supported HDMI Transmitter units
|
|
+ * */
|
|
+#define HDMITX_UNITS_MAX 2
|
|
+
|
|
+/** \name Errors
|
|
+ * The group of error codes returned by all API and internal functions
|
|
+ * */
|
|
+/*@{*/
|
|
+/** The base offset for all error codes.
|
|
+ * This needs defining as non-zero if this component is integrated with others
|
|
+ * and all component error ranges are to be kept separate.
|
|
+ * */
|
|
+#define ERR_HDMI_BASE CID_BSL_HDMITX
|
|
+
|
|
+/** Define the OK code if not defined already */
|
|
+#ifndef TM_OK
|
|
+#define TM_OK 0
|
|
+#endif
|
|
+
|
|
+/** SW interface compatibility error */
|
|
+#define ERR_HDMI_COMPATIBILITY (ERR_HDMI_BASE + 0x001U)
|
|
+
|
|
+/** SW major version error */
|
|
+#define ERR_HDMI_MAJOR_VERSION (ERR_HDMI_BASE + 0x002U)
|
|
+
|
|
+/** SW component version error */
|
|
+#define ERR_HDMI_COMP_VERSION (ERR_HDMI_BASE + 0x003U)
|
|
+
|
|
+/** Invalid device unit number */
|
|
+#define ERR_HDMI_BAD_UNIT_NUMBER (ERR_HDMI_BASE + 0x005U)
|
|
+
|
|
+/** Invalid input parameter other than unit number */
|
|
+#define ERR_HDMI_BAD_PARAMETER (ERR_HDMI_BASE + 0x009U)
|
|
+
|
|
+/* Ressource not available */
|
|
+#define ERR_HDMI_RESOURCE_NOT_AVAILABLE (ERR_HDMI_BASE + 0x00CU)
|
|
+
|
|
+/** Inconsistent input parameters */
|
|
+#define ERR_HDMI_INCONSISTENT_PARAMS (ERR_HDMI_BASE + 0x010U)
|
|
+
|
|
+/** Component is not initialized */
|
|
+#define ERR_HDMI_NOT_INITIALIZED (ERR_HDMI_BASE + 0x011U)
|
|
+
|
|
+/** Command not supported for current device */
|
|
+#define ERR_HDMI_NOT_SUPPORTED (ERR_HDMI_BASE + 0x013U)
|
|
+
|
|
+/** Initialization failed */
|
|
+#define ERR_HDMI_INIT_FAILED (ERR_HDMI_BASE + 0x014U)
|
|
+
|
|
+/** Component is busy and cannot do a new operation */
|
|
+#define ERR_HDMI_BUSY (ERR_HDMI_BASE + 0x015U)
|
|
+
|
|
+/** I2C read error */
|
|
+#define ERR_HDMI_I2C_READ (ERR_HDMI_BASE + 0x017U)
|
|
+
|
|
+/** I2C write error */
|
|
+#define ERR_HDMI_I2C_WRITE (ERR_HDMI_BASE + 0x018U)
|
|
+
|
|
+/** Assertion failure */
|
|
+#define ERR_HDMI_ASSERTION (ERR_HDMI_BASE + 0x049U)
|
|
+
|
|
+/** Bad EDID block checksum */
|
|
+#define ERR_HDMI_INVALID_STATE (ERR_HDMI_BASE + 0x066U)
|
|
+#define ERR_HDMI_INVALID_CHECKSUM ERR_HDMI_INVALID_STATE
|
|
+
|
|
+/** No connection to HPD pin */
|
|
+#define ERR_HDMI_NULL_CONNECTION (ERR_HDMI_BASE + 0x067U)
|
|
+
|
|
+/** Not allowed in DVI mode */
|
|
+#define ERR_HDMI_OPERATION_NOT_PERMITTED (ERR_HDMI_BASE + 0x068U)
|
|
+
|
|
+/** Maximum error code defined */
|
|
+#define ERR_HDMI_MAX ERR_HDMI_OPERATION_NOT_PERMITTED
|
|
+
|
|
+/*============================================================================*/
|
|
+
|
|
+#define HDMITX_ENABLE_VP_TABLE_LEN 3
|
|
+#define HDMITX_GROUND_VP_TABLE_LEN 3
|
|
+
|
|
+/** EDID block size */
|
|
+#define EDID_BLOCK_SIZE 128
|
|
+
|
|
+/** size descriptor block of monitor descriptor */
|
|
+#define EDID_MONITOR_DESCRIPTOR_SIZE 13
|
|
+
|
|
+/*@}*/
|
|
+
|
|
+/*============================================================================*/
|
|
+/* ENUM OR TYPE DEFINITIONS */
|
|
+/*============================================================================*/
|
|
+
|
|
+/**
|
|
+ * \brief TX IP/IC versions
|
|
+ * */
|
|
+typedef enum {
|
|
+ BSLHDMITX_UNKNOWN = 0x00, /**< IC/IP is not recognized */
|
|
+ BSLHDMITX_TDA9984, /**< IC is a TDA9984 */
|
|
+ /**< IC is a TDA9989 (TDA9989N2 64 balls) */
|
|
+ BSLHDMITX_TDA9989,
|
|
+ BSLHDMITX_TDA9981, /**< IC is a TDA9981 */
|
|
+ BSLHDMITX_TDA9983, /**< IC is a TDA9983 */
|
|
+ BSLHDMITX_TDA19989 /**< IC is a TDA19989 */
|
|
+} bsl_version_t;
|
|
+
|
|
+/**
|
|
+ * \brief System function pointer type, to call user I2C read/write functions
|
|
+ * \param slaveAddr The I2C slave address
|
|
+ * \param firstRegister The first device register address to read or write
|
|
+ * \param lenData Length of data to read or write (i.e. no. of registers)
|
|
+ * \param pData Pointer to data to write, or to buffer to receive data
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_HDMI_I2C_WRITE: failed when writing
|
|
+ * - ERR_HDMI_I2C_READ: failed when reading
|
|
+ * */
|
|
+typedef struct _bsl_sys_args_t {
|
|
+ u8 slave_addr;
|
|
+ u8 first_register;
|
|
+ u8 len_data;
|
|
+ u8 *p_data;
|
|
+} bsl_sys_args_t;
|
|
+typedef error_code_t (FUNC_PTR *pbsl_sys_func_t)
|
|
+(bsl_sys_args_t *p_sys_args);
|
|
+
|
|
+/**
|
|
+ * \brief System function pointer type, to call user I2C EDID read function
|
|
+ * \param segPtrAddr The EDID segment pointer address 0 to 7Fh
|
|
+ * \param segPtr The EDID segment pointer 0 to 7Fh
|
|
+ * \param dataRegAddr The EDID data register address 0 to 7Fh
|
|
+ * \param wordOffset The first word offset 0 to FFh to read
|
|
+ * \param lenData Length of data to read (i.e. number of registers),
|
|
+ * 1 to max starting at wordOffset
|
|
+ * \param pData Pointer to buffer to receive lenData data bytes
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_HDMI_I2C_WRITE: failed when writing
|
|
+ * - ERR_HDMI_I2C_READ: failed when reading
|
|
+ * */
|
|
+typedef struct _bsl_sys_args_edid_t {
|
|
+ u8 seg_ptr_addr;
|
|
+ u8 seg_ptr;
|
|
+ u8 data_reg_addr;
|
|
+ u8 word_offset;
|
|
+ u8 len_data;
|
|
+ u8 *p_data;
|
|
+} bsl_sys_args_edid_t;
|
|
+
|
|
+/**
|
|
+ * \brief EDID function pointer type, to call application EDID read function
|
|
+ * \param pSysArgs pointer to the structure containing necessary information to read EDID
|
|
+ * */
|
|
+typedef error_code_t (FUNC_PTR *pbsl_sys_func_edid_t)
|
|
+(bsl_sys_args_edid_t *p_sys_args);
|
|
+
|
|
+/**
|
|
+ * \brief Timer function pointer type, to call an application timer
|
|
+ * \param ms delay in milliseconds
|
|
+ * */
|
|
+typedef void(FUNC_PTR *pbsl_sys_func_timer_t)(u16 ms);
|
|
+
|
|
+/*============================================================================*/
|
|
+/**
|
|
+ * \brief Callback function pointer type, to call a user interrupt handler
|
|
+ * \param txUnit: The transmitter unit that interrupted, 0 to max
|
|
+ * */
|
|
+typedef void(FUNC_PTR *pbsl_callback_t)(unit_select_t tx_unit);
|
|
+
|
|
+/*============================================================================*/
|
|
+/**
|
|
+ * EIA/CEA-861B video format type
|
|
+ * */
|
|
+typedef enum {
|
|
+ /**< Not a valid format... */
|
|
+ HDMITX_VFMT_NULL = 0,
|
|
+ /**< ...or no change required */
|
|
+ HDMITX_VFMT_NO_CHANGE = 0,
|
|
+ /**< Lowest valid format */
|
|
+ HDMITX_VFMT_MIN = 1,
|
|
+ /**< Lowest valid TV format */
|
|
+ HDMITX_VFMT_TV_MIN = 1,
|
|
+ /**< Format 01 640 x 480p 60Hz */
|
|
+ hdmitx_vfmt_01_640x480p_60hz = 1,
|
|
+ /**< Format 02 720 x 480p 60Hz */
|
|
+ hdmitx_vfmt_02_720x480p_60hz = 2,
|
|
+ /**< Format 03 720 x 480p 60Hz */
|
|
+ hdmitx_vfmt_03_720x480p_60hz = 3,
|
|
+ /**< Format 04 1280 x 720p 60Hz */
|
|
+ hdmitx_vfmt_04_1280x720p_60hz = 4,
|
|
+ /**< Format 05 1920 x 1080i 60Hz */
|
|
+ hdmitx_vfmt_05_1920x1080i_60hz = 5,
|
|
+ /**< Format 06 720 x 480i 60Hz */
|
|
+ hdmitx_vfmt_06_720x480i_60hz = 6,
|
|
+ /**< Format 07 720 x 480i 60Hz */
|
|
+ hdmitx_vfmt_07_720x480i_60hz = 7,
|
|
+ /**< Format 08 720 x 240p 60Hz */
|
|
+ hdmitx_vfmt_08_720x240p_60hz = 8,
|
|
+ /**< Format 09 720 x 240p 60Hz */
|
|
+ hdmitx_vfmt_09_720x240p_60hz = 9,
|
|
+ /**< Format 10 720 x 480i 60Hz */
|
|
+ hdmitx_vfmt_10_720x480i_60hz = 10,
|
|
+ /**< Format 11 720 x 480i 60Hz */
|
|
+ hdmitx_vfmt_11_720x480i_60hz = 11,
|
|
+ /**< Format 12 720 x 240p 60Hz */
|
|
+ hdmitx_vfmt_12_720x240p_60hz = 12,
|
|
+ /**< Format 13 720 x 240p 60Hz */
|
|
+ hdmitx_vfmt_13_720x240p_60hz = 13,
|
|
+ /**< Format 14 1440 x 480p 60Hz */
|
|
+ hdmitx_vfmt_14_1440x480p_60hz = 14,
|
|
+ /**< Format 15 1440 x 480p 60Hz */
|
|
+ hdmitx_vfmt_15_1440x480p_60hz = 15,
|
|
+ /**< Format 16 1920 x 1080p 60Hz */
|
|
+ hdmitx_vfmt_16_1920x1080p_60hz = 16,
|
|
+ /**< Format 17 720 x 576p 50Hz */
|
|
+ hdmitx_vfmt_17_720x576p_50hz = 17,
|
|
+ /**< Format 18 720 x 576p 50Hz */
|
|
+ hdmitx_vfmt_18_720x576p_50hz = 18,
|
|
+ /**< Format 19 1280 x 720p 50Hz */
|
|
+ hdmitx_vfmt_19_1280x720p_50hz = 19,
|
|
+ /**< Format 20 1920 x 1080i 50Hz */
|
|
+ hdmitx_vfmt_20_1920x1080i_50hz = 20,
|
|
+ /**< Format 21 720 x 576i 50Hz */
|
|
+ hdmitx_vfmt_21_720x576i_50hz = 21,
|
|
+ /**< Format 22 720 x 576i 50Hz */
|
|
+ hdmitx_vfmt_22_720x576i_50hz = 22,
|
|
+ /**< Format 23 720 x 288p 50Hz */
|
|
+ hdmitx_vfmt_23_720x288p_50hz = 23,
|
|
+ /**< Format 24 720 x 288p 50Hz */
|
|
+ hdmitx_vfmt_24_720x288p_50hz = 24,
|
|
+ /**< Format 25 720 x 576i 50Hz */
|
|
+ hdmitx_vfmt_25_720x576i_50hz = 25,
|
|
+ /**< Format 26 720 x 576i 50Hz */
|
|
+ hdmitx_vfmt_26_720x576i_50hz = 26,
|
|
+ /**< Format 27 720 x 288p 50Hz */
|
|
+ hdmitx_vfmt_27_720x288p_50hz = 27,
|
|
+ /**< Format 28 720 x 288p 50Hz */
|
|
+ hdmitx_vfmt_28_720x288p_50hz = 28,
|
|
+ /**< Format 29 1440 x 576p 50Hz */
|
|
+ hdmitx_vfmt_29_1440x576p_50hz = 29,
|
|
+ /**< Format 30 1440 x 576p 50Hz */
|
|
+ hdmitx_vfmt_30_1440x576p_50hz = 30,
|
|
+ /**< Format 31 1920 x 1080p 50Hz */
|
|
+ hdmitx_vfmt_31_1920x1080p_50hz = 31,
|
|
+
|
|
+ /**< Format 32 1920 x 1080p 24Hz */
|
|
+ hdmitx_vfmt_32_1920x1080p_24hz = 32,
|
|
+ /**< Format 33 1920 x 1080p 25Hz */
|
|
+ hdmitx_vfmt_33_1920x1080p_25hz = 33,
|
|
+ /**< Format 34 1920 x 1080p 30Hz */
|
|
+ hdmitx_vfmt_34_1920x1080p_30hz = 34,
|
|
+
|
|
+ /**< Format 35 2880 x 480p 60Hz 4:3 */
|
|
+ hdmitx_vfmt_35_2880x480p_60hz = 35,
|
|
+ /**< Format 36 2880 x 480p 60Hz 16:9 */
|
|
+ hdmitx_vfmt_36_2880x480p_60hz = 36,
|
|
+ /**< Format 37 2880 x 576p 50Hz 4:3 */
|
|
+ hdmitx_vfmt_37_2880x576p_50hz = 37,
|
|
+ /**< Format 38 2880 x 576p 50Hz 16:9 */
|
|
+ hdmitx_vfmt_38_2880x576p_50hz = 38,
|
|
+
|
|
+ /**< Highest valid TV format */
|
|
+ HDMITX_VFMT_TV_MAX = 38,
|
|
+ /**< Lowest TV format without prefetched table */
|
|
+ HDMITX_VFMT_TV_NO_REG_MIN = 32,
|
|
+ /**< Number of TV formats & null */
|
|
+ HDMITX_VFMT_TV_NUM = 39,
|
|
+
|
|
+ /**< Lowest valid PC format */
|
|
+ HDMITX_VFMT_PC_MIN = 128,
|
|
+ /**< PC format 128 */
|
|
+ hdmitx_vfmt_pc_640x480p_60hz = 128,
|
|
+ /**< PC format 129 */
|
|
+ hdmitx_vfmt_pc_800x600p_60hz = 129,
|
|
+ /**< PC format 130 */
|
|
+ hdmitx_vfmt_pc_1152x960p_60hz = 130,
|
|
+ /**< PC format 131 */
|
|
+ hdmitx_vfmt_pc_1024x768p_60hz = 131,
|
|
+ /**< PC format 132 */
|
|
+ hdmitx_vfmt_pc_1280x768p_60hz = 132,
|
|
+ /**< PC format 133 */
|
|
+ hdmitx_vfmt_pc_1280x1024p_60hz = 133,
|
|
+ /**< PC format 134 */
|
|
+ hdmitx_vfmt_pc_1360x768p_60hz = 134,
|
|
+ /**< PC format 135 */
|
|
+ hdmitx_vfmt_pc_1400x1050p_60hz = 135,
|
|
+ /**< PC format 136 */
|
|
+ hdmitx_vfmt_pc_1600x1200p_60hz = 136,
|
|
+ /**< PC format 137 */
|
|
+ hdmitx_vfmt_pc_1024x768p_70hz = 137,
|
|
+ /**< PC format 138 */
|
|
+ hdmitx_vfmt_pc_640x480p_72hz = 138,
|
|
+ /**< PC format 139 */
|
|
+ hdmitx_vfmt_pc_800x600p_72hz = 139,
|
|
+ /**< PC format 140 */
|
|
+ hdmitx_vfmt_pc_640x480p_75hz = 140,
|
|
+ /**< PC format 141 */
|
|
+ hdmitx_vfmt_pc_1024x768p_75hz = 141,
|
|
+ /**< PC format 142 */
|
|
+ hdmitx_vfmt_pc_800x600p_75hz = 142,
|
|
+ /**< PC format 143 */
|
|
+ hdmitx_vfmt_pc_1024x864p_75hz = 143,
|
|
+ /**< PC format 144 */
|
|
+ hdmitx_vfmt_pc_1280x1024p_75hz = 144,
|
|
+ /**< PC format 145 */
|
|
+ hdmitx_vfmt_pc_640x350p_85hz = 145,
|
|
+ /**< PC format 146 */
|
|
+ hdmitx_vfmt_pc_640x400p_85hz = 146,
|
|
+ /**< PC format 147 */
|
|
+ hdmitx_vfmt_pc_720x400p_85hz = 147,
|
|
+ /**< PC format 148 */
|
|
+ hdmitx_vfmt_pc_640x480p_85hz = 148,
|
|
+ /**< PC format 149 */
|
|
+ hdmitx_vfmt_pc_800x600p_85hz = 149,
|
|
+ /**< PC format 150 */
|
|
+ hdmitx_vfmt_pc_1024x768p_85hz = 150,
|
|
+ /**< PC format 151 */
|
|
+ hdmitx_vfmt_pc_1152x864p_85hz = 151,
|
|
+ /**< PC format 152 */
|
|
+ hdmitx_vfmt_pc_1280x960p_85hz = 152,
|
|
+ /**< PC format 153 */
|
|
+ hdmitx_vfmt_pc_1280x1024p_85hz = 153,
|
|
+ /**< PC format 154 */
|
|
+ hdmitx_vfmt_pc_1024x768i_87hz = 154,
|
|
+ /**< Highest valid PC format */
|
|
+ HDMITX_VFMT_PC_MAX = 154,
|
|
+ /**< Number of PC formats */
|
|
+ HDMITX_VFMT_PC_NUM = (1 + 154 - 128)
|
|
+} bsl_vid_fmt_t;
|
|
+
|
|
+/*============================================================================*/
|
|
+/**
|
|
+ * bslTDA9984AudioInSetConfig() parameter types
|
|
+ * */
|
|
+/** Audio input formats */
|
|
+typedef enum {
|
|
+ HDMITX_AFMT_SPDIF = 0, /**< SPDIF */
|
|
+ HDMITX_AFMT_I2S = 1, /**< I2S */
|
|
+ HDMITX_AFMT_OBA = 2, /**< One bit audio / DSD */
|
|
+ HDMITX_AFMT_DST = 3, /**< DST */
|
|
+ HDMITX_AFMT_HBR = 4, /**< HBR */
|
|
+ HDMITX_AFMT_NUM = 5, /**< Number of Audio input format */
|
|
+ HDMITX_AFMT_INVALID = 5 /**< Invalid format */
|
|
+} bsla_fmt_t;
|
|
+
|
|
+/** I2s formats */
|
|
+typedef enum {
|
|
+ HDMITX_I2SFOR_PHILIPS_L = 0, /**< Philips like format */
|
|
+ HDMITX_I2SFOR_OTH_L = 2, /**< Other non Philips left justified */
|
|
+ HDMITX_I2SFOR_OTH_R = 3, /**< Other non Philips right justified */
|
|
+ HDMITX_I2SFOR_INVALID = 4 /**< Invalid format*/
|
|
+} bsl_i2s_for_t;
|
|
+
|
|
+/** DSD clock polarities */
|
|
+typedef enum {
|
|
+ HDMITX_CLKPOLDSD_ACLK = 0, /**< Same as ACLK */
|
|
+ HDMITX_CLKPOLDSD_NACLK = 1, /**< Not ACLK, i.e. inverted */
|
|
+ HDMITX_CLKPOLDSD_NO_CHANGE = 2, /**< No change */
|
|
+ HDMITX_CLKPOLDSD_INVALID = 3 /**< Invalid */
|
|
+} bsl_clk_pol_dsd_t;
|
|
+
|
|
+/** DSD data swap values */
|
|
+typedef enum {
|
|
+ HDMITX_SWAPDSD_OFF = 0, /**< No swap */
|
|
+ HDMITX_SWAPDSD_ON = 1, /**< Swap */
|
|
+ HDMITX_SWAPDSD_NO_CHANGE = 2, /**< No change */
|
|
+ HDMITX_SWAPDSD_INVALID = 3 /**< Invalid */
|
|
+} bsl_swap_dsd_t;
|
|
+
|
|
+/** DST data transfer rates */
|
|
+typedef enum {
|
|
+ HDMITX_DSTRATE_SINGLE = 0, /**< Single transfer rate */
|
|
+ HDMITX_DSTRATE_DOUBLE = 1, /**< Double data rate */
|
|
+ HDMITX_DSTRATE_NO_CHANGE = 2, /**< No change */
|
|
+ HDMITX_DSTRATE_INVALID = 3 /**< Invalid */
|
|
+} bsl_dst_rate_t;
|
|
+
|
|
+/** I2S, SPDIF and DSD channel allocation values */
|
|
+enum _bsl_chan {
|
|
+ HDMITX_CHAN_MIN = 0,
|
|
+ HDMITX_CHAN_MAX = 31,
|
|
+ HDMITX_CHAN_NO_CHANGE = 32,
|
|
+ HDMITX_CHAN_INVALID = 33
|
|
+};
|
|
+
|
|
+/** Audio layout values */
|
|
+enum _bsl_layout {
|
|
+ HDMITX_LAYOUT_MIN = 0,
|
|
+ HDMITX_LAYOUT_MAX = 1,
|
|
+ HDMITX_LAYOUT_NO_CHANGE = 2,
|
|
+ HDMITX_LAYOUT_INVALID = 3
|
|
+};
|
|
+
|
|
+/** Audio FIFO read latency values */
|
|
+enum _bsllatency_rd {
|
|
+ HDMITX_LATENCY_MIN = 0x000,
|
|
+ HDMITX_LATENCY_CURRENT = 0x080,
|
|
+ HDMITX_LATENCY_MAX = 0x0FF,
|
|
+ HDMITX_LATENCY_NO_CHANGE = 0x100,
|
|
+ HDMITX_LATENCY_INVALID = 0x101
|
|
+};
|
|
+
|
|
+/*============================================================================*/
|
|
+/**
|
|
+ * bslTDA9984AudioInSetCts() parameter types
|
|
+ * */
|
|
+/** Clock Time Stamp reference source */
|
|
+typedef enum {
|
|
+ HDMITX_CTSREF_ACLK = 0, /**< Clock input pin for I2S */
|
|
+ HDMITX_CTSREF_MCLK = 1, /**< Clock input pin for EXTREF */
|
|
+ HDMITX_CTSREF_FS64SPDIF = 2, /**< 64xsample rate, for SPDIF */
|
|
+ HDMITX_CTSREF_INVALID = 3 /**< Invalid value */
|
|
+} bslcts_ref_t;
|
|
+
|
|
+/** Audio sample rate kHz indexes */
|
|
+typedef enum {
|
|
+ hdmitx_afs_32k = 0, /**< 32kHz */
|
|
+ hdmitx_afs_44_1k = 1, /**< 44.1kHz */
|
|
+ HDMITX_AFS_48K = 2, /**< 48kHz */
|
|
+ HDMITX_AFS_88_2K = 3, /**< 88.2kHz */
|
|
+ HDMITX_AFS_96K = 4, /**< 96kHz */
|
|
+ HDMITX_AFS_176_4K = 5, /**< 176.4kHz */
|
|
+ HDMITX_AFS_192K = 6, /**< 192kHz */
|
|
+ HDMITX_AFS_768K = 7, /**< 768kHz */
|
|
+ HDMITX_AFS_NOT_INDICATED = 8, /**< Not Indicated (Channel Status) */
|
|
+ HDMITX_AFS_INVALID = 8, /**< Invalid */
|
|
+ HDMITX_AFS_NUM = 8 /**< # rates */
|
|
+} bslafs_t;
|
|
+
|
|
+/** Vertical output frequencies */
|
|
+typedef enum {
|
|
+ hdmitx_vfreq_24hz = 0, /**< 24Hz */
|
|
+ hdmitx_vfreq_25hz = 1, /**< 25Hz */
|
|
+ hdmitx_vfreq_30hz = 2, /**< 30Hz */
|
|
+ hdmitx_vfreq_50hz = 3, /**< 50Hz */
|
|
+ hdmitx_vfreq_59hz = 4, /**< 59.94Hz */
|
|
+ hdmitx_vfreq_60hz = 5, /**< 60Hz */
|
|
+#ifndef FORMAT_PC
|
|
+ HDMITX_VFREQ_INVALID = 6, /**< Invalid */
|
|
+ HDMITX_VFREQ_NUM = 6 /**< No. of values */
|
|
+#else /* FORMAT_PC */
|
|
+ hdmitx_vfreq_70hz = 6, /**< 70Hz */
|
|
+ hdmitx_vfreq_72hz = 7, /**< 72Hz */
|
|
+ hdmitx_vfreq_75hz = 8, /**< 75Hz */
|
|
+ hdmitx_vfreq_85hz = 9, /**< 85Hz */
|
|
+ hdmitx_vfreq_87hz = 10, /**< 87Hz */
|
|
+ HDMITX_VFREQ_INVALID = 11, /**< Invalid */
|
|
+ HDMITX_VFREQ_NUM = 11 /**< No. of values */
|
|
+#endif /* FORMAT_PC */
|
|
+} bsl_vfreq_t;
|
|
+
|
|
+/** Clock Time Stamp predivider - scales N */
|
|
+typedef enum {
|
|
+ HDMITX_CTSK1 = 0, /**< k=1 */
|
|
+ HDMITX_CTSK2 = 1, /**< k=2 */
|
|
+ HDMITX_CTSK3 = 2, /**< k=3 */
|
|
+ HDMITX_CTSK4 = 3, /**< k=4 */
|
|
+ HDMITX_CTSK8 = 4, /**< k=8 */
|
|
+ HDMITX_CTSK_USE_CTSX = 5, /**< Calculate from ctsX factor */
|
|
+ HDMITX_CTSK_INVALID = 6 /**< Invalid */
|
|
+} bslcts_k_t;
|
|
+
|
|
+/** Clock Time Stamp postdivider measured time stamp */
|
|
+typedef enum {
|
|
+ HDMITX_CTSMTS = 0, /**< =mts */
|
|
+ HDMITX_CTSMTS2 = 1, /**< =mts%2 */
|
|
+ HDMITX_CTSMTS4 = 2, /**< =mts%4 */
|
|
+ HDMITX_CTSMTS8 = 3, /**< =mts%8 */
|
|
+ HDMITX_CTSMTS_USE_CTSX = 4, /**< Calculate from ctsX factor */
|
|
+ HDMITX_CTSMTS_INVALID = 5 /**< Invalid */
|
|
+} bslcts_m_t;
|
|
+
|
|
+/** Cycle Time Stamp values */
|
|
+enum _bsl_cts {
|
|
+ HDMITX_CTS_AUTO = 0,
|
|
+ HDMITX_CTS_MIN = 0x000001
|
|
+};
|
|
+
|
|
+/** Cycle Time Stamp X factors */
|
|
+enum _bsl_cts_x {
|
|
+ HDMITX_CTSX_16 = 0,
|
|
+ HDMITX_CTSX_32 = 1,
|
|
+ HDMITX_CTSX_48 = 2,
|
|
+ HDMITX_CTSX_64 = 3,
|
|
+ HDMITX_CTSX_128 = 4,
|
|
+ HDMITX_CTSX_NUM = 5,
|
|
+ /**< CTX value unused when K and Mts used */
|
|
+ HDMITX_CTSX_UNUSED = 5,
|
|
+ HDMITX_CTSX_INVALID = 6
|
|
+};
|
|
+
|
|
+/*============================================================================*/
|
|
+/**
|
|
+ * bslTDA9984AudioOutSetChanStatus() parameter types
|
|
+ * */
|
|
+
|
|
+typedef enum {
|
|
+ /**< Main data field represents linear PCM samples. */
|
|
+ HDMITX_AUDIO_DATA_PCM = 0,
|
|
+ /**< Main data field used for purposes other purposes. */
|
|
+ HDMITX_AUDIO_DATA_OTHER = 1,
|
|
+ HDMITX_AUDIO_DATA_INVALID = 2 /**< Invalid value */
|
|
+} bsl_audio_data_t;
|
|
+
|
|
+/** BYTE 0: Channel Status Format information */
|
|
+typedef enum {
|
|
+ /**< PCM 2 channels without pre-emphasis */
|
|
+ HDMITX_CSFI_PCM_2CHAN_NO_PRE = 0,
|
|
+ /**< PCM 2 channels with 50us/15us pre-emphasis */
|
|
+ HDMITX_CSFI_PCM_2CHAN_PRE = 1,
|
|
+ /**< PCM Reserved for 2 channels with pre-emphasis */
|
|
+ HDMITX_CSFI_PCM_2CHAN_PRE_RSVD1 = 2,
|
|
+ /**< PCM Reserved for 2 channels with pre-emphasis */
|
|
+ HDMITX_CSFI_PCM_2CHAN_PRE_RSVD2 = 3,
|
|
+ /**< Non-PCM Default state */
|
|
+ HDMITX_CSFI_NOTPCM_DEFAULT = 4,
|
|
+ /**< Invalid value */
|
|
+ HDMITX_CSFI_INVALID = 5
|
|
+} bsl_csformat_info_t;
|
|
+
|
|
+/** BYTE 0: Channel Status Copyright assertion */
|
|
+typedef enum {
|
|
+ HDMITX_CSCOPYRIGHT_PROTECTED = 0, /**< Copyright protected */
|
|
+ HDMITX_CSCOPYRIGHT_UNPROTECTED = 1, /**< Not copyright protected */
|
|
+ HDMITX_CSCOPYRIGHT_INVALID = 2 /**< Invalid value */
|
|
+} bsl_cscopyright_t;
|
|
+
|
|
+/** BYTE 3: Channel Status Clock Accuracy */
|
|
+typedef enum {
|
|
+ HDMITX_CSCLK_LEVEL_II = 0, /**< Level II */
|
|
+ HDMITX_CSCLK_LEVEL_I = 1, /**< Level I */
|
|
+ HDMITX_CSCLK_LEVEL_III = 2, /**< Level III */
|
|
+ HDMITX_CSCLK_NOT_MATCHED = 3, /**< Not matched to sample freq. */
|
|
+ HDMITX_CSCLK_INVALID = 4 /**< Invalid */
|
|
+} bsl_csclk_acc_t;
|
|
+
|
|
+/** BYTE 4: Channel Status Maximum sample word length */
|
|
+typedef enum {
|
|
+ HDMITX_CSMAX_LENGTH_20 = 0, /**< Max word length is 20 bits */
|
|
+ HDMITX_CSMAX_LENGTH_24 = 1, /**< Max word length is 24 bits */
|
|
+ HDMITX_CSMAX_INVALID = 2 /**< Invalid value */
|
|
+} bsl_csmax_word_length_t;
|
|
+
|
|
+/** BYTE 4: Channel Status Sample word length */
|
|
+typedef enum {
|
|
+ /**< Word length is not indicated */
|
|
+ HDMITX_CSWORD_DEFAULT = 0,
|
|
+ /**< Sample length is 20 bits out of max 24 possible */
|
|
+ HDMITX_CSWORD_20_OF_24 = 1,
|
|
+ /**< Sample length is 16 bits out of max 20 possible */
|
|
+ HDMITX_CSWORD_16_OF_20 = 1,
|
|
+ /**< Sample length is 22 bits out of max 24 possible */
|
|
+ HDMITX_CSWORD_22_OF_24 = 2,
|
|
+ /**< Sample length is 18 bits out of max 20 possible */
|
|
+ HDMITX_CSWORD_18_OF_20 = 2,
|
|
+ /**< Reserved - shall not be used */
|
|
+ HDMITX_CSWORD_RESVD = 3,
|
|
+ /**< Sample length is 23 bits out of max 24 possible */
|
|
+ HDMITX_CSWORD_23_OF_24 = 4,
|
|
+ /**< Sample length is 19 bits out of max 20 possible */
|
|
+ HDMITX_CSWORD_19_OF_20 = 4,
|
|
+ /**< Sample length is 24 bits out of max 24 possible */
|
|
+ HDMITX_CSWORD_24_OF_24 = 5,
|
|
+ /**< Sample length is 20 bits out of max 20 possible */
|
|
+ HDMITX_CSWORD_20_OF_20 = 5,
|
|
+ /**< Sample length is 21 bits out of max 24 possible */
|
|
+ HDMITX_CSWORD_21_OF_24 = 6,
|
|
+ /**< Sample length is 17 bits out of max 20 possible */
|
|
+ HDMITX_CSWORD_17_OF_20 = 6,
|
|
+ HDMITX_CSWORD_INVALID = 7 /**< Invalid */
|
|
+} bsl_csword_length_t;
|
|
+
|
|
+/** BYTE 4: Channel Status Original sample frequency */
|
|
+typedef enum {
|
|
+ HDMITX_CSOFREQ_NOT_INDICATED = 0, /**< Not Indicated */
|
|
+ hdmitx_csofreq_192k = 1, /**< 192kHz */
|
|
+ hdmitx_csofreq_12k = 2, /**< 12kHz */
|
|
+ hdmitx_csofreq_176_4k = 3, /**< 176.4kHz */
|
|
+ HDMITX_CSOFREQ_RSVD1 = 4, /**< Reserved */
|
|
+ hdmitx_csofreq_96k = 5, /**< 96kHz */
|
|
+ hdmitx_csofreq_8k = 6, /**< 8kHz */
|
|
+ hdmitx_csofreq_88_2k = 7, /**< 88.2kHz */
|
|
+ hdmitx_csofreq_16k = 8, /**< 16kHz */
|
|
+ hdmitx_csofreq_24k = 9, /**< 24kHz */
|
|
+ hdmitx_csofreq_11_025k = 10, /**< 11.025kHz */
|
|
+ hdmitx_csofreq_22_05k = 11, /**< 22.05kHz */
|
|
+ hdmitx_csofreq_32k = 12, /**< 32kHz */
|
|
+ hdmitx_csofreq_48k = 13, /**< 48kHz */
|
|
+ HDMITX_CSOFREQ_RSVD2 = 14, /**< Reserved */
|
|
+ hdmitx_csofreq_44_1k = 15, /**< 44.1kHz */
|
|
+ HDMITX_CSAFS_INVALID = 16 /**< Invalid value */
|
|
+} bsl_csorig_afs_t;
|
|
+
|
|
+/*============================================================================*/
|
|
+/**
|
|
+ * bslTDA9984AudioOutSetChanStatusMapping() parameter types
|
|
+ * */
|
|
+/** Channel Status source/channel number limits */
|
|
+enum _bsl_chan_status_chan_limits {
|
|
+ HDMITX_CS_CHANNELS_MAX = 0x0F,
|
|
+ HDMITX_CS_SOURCES_MAX = 0x0F
|
|
+};
|
|
+
|
|
+/*============================================================================*/
|
|
+/**
|
|
+ * bslTDA9984AudioOutSetMute() parameter type
|
|
+ * */
|
|
+/** Audio mute state */
|
|
+typedef enum {
|
|
+ HDMITX_AMUTE_OFF = 0, /**< Mute off */
|
|
+ HDMITX_AMUTE_ON = 1, /**< Mute on */
|
|
+ HDMITX_AMUTE_INVALID = 2 /**< Invalid */
|
|
+} bsla_mute_t;
|
|
+
|
|
+/** Number of 3 byte Short Audio Descriptors stored in pEdidAFmts */
|
|
+#define HDMI_TX_SAD_MAX_CNT 30
|
|
+
|
|
+/*============================================================================*/
|
|
+/**
|
|
+ * bslTDA9984EdidGetBlockData() parameter types
|
|
+ * */
|
|
+/** An enum to represent the current EDID status */
|
|
+enum _bsl_edid_sta_t {
|
|
+ HDMITX_EDID_READ = 0, /* All blocks read OK */
|
|
+ /* All blocks read OK but buffer too
|
|
+ * HDMITX_EDID_READ_INCOMPLETE = 1,
|
|
+ * small to return all of them */
|
|
+ HDMITX_EDID_ERROR_CHK_BLOCK_0 = 2, /* Block 0 checksum error */
|
|
+
|
|
+ /* Block 0 OK, checksum error in one
|
|
+ * HDMITX_EDID_ERROR_CHK = 3,
|
|
+ * or more other blocks */
|
|
+ HDMITX_EDID_NOT_READ = 4, /* EDID not read */
|
|
+
|
|
+ HDMITX_EDID_STATUS_INVALID = 5 /**< Invalid */
|
|
+
|
|
+};
|
|
+
|
|
+/*============================================================================*/
|
|
+/**
|
|
+ * bslTDA9984EdidGetSinkType() parameter types
|
|
+ * */
|
|
+/** Sink device type */
|
|
+typedef enum {
|
|
+ HDMITX_SINK_DVI = 0, /**< DVI */
|
|
+ HDMITX_SINK_HDMI = 1, /**< HDMI */
|
|
+ HDMITX_SINK_EDID = 2, /**< As currently defined in EDID */
|
|
+ HDMITX_SINK_INVALID = 3 /**< Invalid */
|
|
+} bsl_sink_type_t;
|
|
+
|
|
+/*============================================================================*/
|
|
+/**
|
|
+ * \brief The bslTDA9984EdidGetVideoPreferred() parameter type
|
|
+ * Detailed timining description structure
|
|
+ * */
|
|
+typedef struct _bsl_edid_dtd_t {
|
|
+ u16 u_pixel_clock; /**< Pixel Clock/10,000 */
|
|
+ u16 u_hactive_pixels; /**< Horizontal Active Pixels */
|
|
+ u16 u_hblank_pixels; /**< Horizontal Blanking Pixels */
|
|
+ u16 u_vactive_lines; /**< Vertical Active Lines */
|
|
+ u16 u_vblank_lines; /**< Vertical Blanking Lines */
|
|
+ u16 u_hsync_offset; /**< Horizontal Sync Offset */
|
|
+ u16 u_hsync_width; /**< Horiz. Sync Pulse Width */
|
|
+ u16 u_vsync_offset; /**< Vertical Sync Offset */
|
|
+ u16 u_vsync_width; /**< Vertical Sync Pulse Width */
|
|
+ u16 u_himage_size; /**< Horizontal Image Size */
|
|
+ u16 u_vimage_size; /**< Vertical Image Size */
|
|
+ u16 u_hborder_pixels; /**< Horizontal Border */
|
|
+ u16 u_vborder_pixels; /**< Vertical Border */
|
|
+ u8 flags; /**< Interlace/sync info */
|
|
+} bsl_edid_dtd_t;
|
|
+
|
|
+/*============================================================================*/
|
|
+/**
|
|
+ * First monitor descriptor structure
|
|
+ * */
|
|
+typedef struct _bsl_edid_first_md_t {
|
|
+ /**< true when parameters of struct are available */
|
|
+ bool b_desc_record;
|
|
+ /**< Monitor Name */
|
|
+ u8 u_monitor_name[EDID_MONITOR_DESCRIPTOR_SIZE];
|
|
+} bsl_edid_first_md_t;
|
|
+
|
|
+/*============================================================================*/
|
|
+/**
|
|
+ * Second monitor descriptor structure
|
|
+ * */
|
|
+typedef struct _bsl_edid_second_md_t {
|
|
+ /**< true when parameters of struct are available */
|
|
+ bool b_desc_record;
|
|
+ /**< Min vertical rate in Hz */
|
|
+ u8 u_min_vertical_rate;
|
|
+ /**< Max vertical rate in Hz */
|
|
+ u8 u_max_vertical_rate;
|
|
+ /**< Min horizontal rate in Hz */
|
|
+ u8 u_min_horizontal_rate;
|
|
+ /**< Max horizontal rate in Hz */
|
|
+ u8 u_max_horizontal_rate;
|
|
+ /**< Max suuported pixel clock rate in MHz */
|
|
+ u8 u_max_supported_pixel_clk;
|
|
+} bsl_edid_second_md_t;
|
|
+
|
|
+/*============================================================================*/
|
|
+/**
|
|
+ * Other monitor descriptor structure
|
|
+ * */
|
|
+typedef struct _bsl_edid_other_md_t {
|
|
+ /**< true when parameters of struct are available */
|
|
+ bool b_desc_record;
|
|
+ /**< Other monitor Descriptor */
|
|
+ u8 u_other_descriptor[EDID_MONITOR_DESCRIPTOR_SIZE];
|
|
+} bsl_edid_other_md_t;
|
|
+
|
|
+/*============================================================================*/
|
|
+/**
|
|
+ * basic display parameters structure
|
|
+ * */
|
|
+typedef struct _bsl_edid_bdparam_t {
|
|
+ /**< Video Input Definition */
|
|
+ u8 u_video_input_def;
|
|
+ /**< Max. Horizontal Image Size in cm */
|
|
+ u8 u_max_horizontal_size;
|
|
+ /**< Max. Vertical Image Size in cm */
|
|
+ u8 u_max_vertical_size;
|
|
+ /**< Gamma */
|
|
+ u8 u_gamma;
|
|
+ /**< Feature support */
|
|
+ u8 u_feature_support;
|
|
+} bsl_edid_bdparam_t;
|
|
+
|
|
+/*============================================================================*/
|
|
+/**
|
|
+ * \brief The bslTDA9984EdidGetAudioCapabilities() parameter type
|
|
+ * */
|
|
+typedef struct _bsl_edid_sad_t {
|
|
+ u8 mode_chans; /* Bits[6:3]: EIA/CEA861 mode; Bits[2:0]: channels */
|
|
+ u8 freqs; /* Bits for each supported frequency */
|
|
+ u8 byte3; /* EIA/CEA861B p83: data depending on audio mode */
|
|
+} bsl_edid_sad_t;
|
|
+
|
|
+/*============================================================================*/
|
|
+/**
|
|
+ * \brief struc to store parameter provide by function bslTDA9984EdidRequestBlockData()
|
|
+ * */
|
|
+typedef struct _bsl_edid_to_app_t {
|
|
+ /* pointer on a tab to store edid requested by application */
|
|
+ u8 *p_raw_edid;
|
|
+ int num_blocks; /* number of edid block requested by application */
|
|
+} bsl_edid_to_app_t;
|
|
+
|
|
+/*============================================================================*/
|
|
+/**
|
|
+ * bslTDA9984EdidGetVideoCapabilities() parameter types
|
|
+ * */
|
|
+/** Number of 1 byte Short Video Descriptors stored in pEdidVFmts */
|
|
+#define HDMI_TX_SVD_MAX_CNT 113
|
|
+
|
|
+/** number of detailed timing descriptor stored in BSL */
|
|
+#define NUMBER_DTD_STORED 10
|
|
+
|
|
+/** Flag set in Short Video Descriptor to indicate native format */
|
|
+#define HDMI_TX_SVD_NATIVE_MASK 0x80
|
|
+#define HDMI_TX_SVD_NATIVE_NOT 0x7F
|
|
+
|
|
+/** Video capability flags */
|
|
+enum _bsl_vid_cap_t {
|
|
+ HDMITX_VIDCAP_UNDERSCAN = 0x80, /**< Underscan supported */
|
|
+ HDMITX_VIDCAP_YUV444 = 0x40, /**< YCbCr 4:4:4 supported */
|
|
+ HDMITX_VIDCAP_YUV422 = 0x20, /**< YCbCr 4:2:2 supported */
|
|
+ HDMITX_VIDCAP_UNUSED = 0x1F /**< Unused flags */
|
|
+};
|
|
+
|
|
+/*============================================================================*/
|
|
+/**
|
|
+ * bslTDA9984HdcpCheck() parameter type
|
|
+ * */
|
|
+/** HDCP check result */
|
|
+typedef enum {
|
|
+ HDMITX_HDCP_CHECK_NOT_STARTED = 0, /**< Check not started */
|
|
+ HDMITX_HDCP_CHECK_IN_PROGRESS = 1, /**< No failures, more to do */
|
|
+ HDMITX_HDCP_CHECK_PASS = 2, /**< Final check has passed */
|
|
+ /**< First check failure code */
|
|
+ HDMITX_HDCP_CHECK_FAIL_FIRST = 3,
|
|
+ /**< Driver not AUTHENTICATED */
|
|
+ HDMITX_HDCP_CHECK_FAIL_DRIVER_STATE = 3,
|
|
+ HDMITX_HDCP_CHECK_FAIL_DEVICE_T0 = 4, /**< A T0 interrupt occurred */
|
|
+ HDMITX_HDCP_CHECK_FAIL_DEVICE_RI = 5, /**< Device RI changed */
|
|
+ HDMITX_HDCP_CHECK_FAIL_DEVICE_FSM = 6, /**< Device FSM not 10h */
|
|
+ HDMITX_HDCP_CHECK_NUM = 7 /**< Number of check results */
|
|
+} bsl_hdcp_check_t;
|
|
+
|
|
+/*============================================================================*/
|
|
+/**
|
|
+ * bslTDA9984HdcpConfigure() parameter type
|
|
+ * */
|
|
+/** HDCP DDC slave addresses */
|
|
+enum _bsl_hdcp_slave_address {
|
|
+ HDMITX_HDCP_SLAVE_PRIMARY = 0x74,
|
|
+ HDMITX_HDCP_SLAVE_SECONDARY = 0x76
|
|
+};
|
|
+
|
|
+/** HDCP transmitter modes */
|
|
+typedef enum {
|
|
+ HDMITX_HDCP_TXMODE_NOT_SET = 0,
|
|
+ HDMITX_HDCP_TXMODE_REPEATER = 1,
|
|
+ HDMITX_HDCP_TXMODE_TOP_LEVEL = 2,
|
|
+ HDMITX_HDCP_TXMODE_MAX = 2
|
|
+} bsl_hdcp_tx_mode_t;
|
|
+
|
|
+/** HDCP option flags */
|
|
+typedef enum {
|
|
+ /* Not set: obey PJ result */
|
|
+ HDMITX_HDCP_OPTION_FORCE_PJ_IGNORED = 0x01,
|
|
+ /* Not set: obey BCAPS setting */
|
|
+ HDMITX_HDCP_OPTION_FORCE_SLOW_DDC = 0x02,
|
|
+ /* Not set: obey BCAPS setting */
|
|
+ HDMITX_HDCP_OPTION_FORCE_NO_1_1 = 0x04,
|
|
+ /* Not set: obey BCAPS setting */
|
|
+ HDMITX_HDCP_OPTION_FORCE_REPEATER = 0x08,
|
|
+ /* Not set: obey BCAPS setting */
|
|
+ HDMITX_HDCP_OPTION_FORCE_NO_REPEATER = 0x10,
|
|
+ /* Not set: obey V=V' result */
|
|
+ HDMITX_HDCP_OPTION_FORCE_V_EQU_VBAR = 0x20,
|
|
+ HDMITX_HDCP_OPTION_FORCE_VSLOW_DDC = 0x40,/* Set: 50kHz DDC */
|
|
+ HDMITX_HDCP_OPTION_DEFAULT = 0x00,/* All the above Not Set vals */
|
|
+ /* Only these bits are allowed */
|
|
+ HDMITX_HDCP_OPTION_MASK = 0x7F,
|
|
+ /* These bits are not allowed */
|
|
+ HDMITX_HDCP_OPTION_MASK_BAD = 0x80
|
|
+} bsl_hdcp_options_t;
|
|
+
|
|
+/*============================================================================*/
|
|
+/**
|
|
+ * bslTDA9984HdcpDownloadKeys() parameter type
|
|
+ * */
|
|
+/** HDCP decryption mode */
|
|
+typedef enum {
|
|
+ HDMITX_HDCP_DECRYPT_DISABLE = 0,
|
|
+ HDMITX_HDCP_DECRYPT_ENABLE = 1,
|
|
+ HDMITX_HDCP_DECRYPT_MAX = 1
|
|
+} bsl_decrypt_t;
|
|
+
|
|
+/*============================================================================*/
|
|
+/**
|
|
+ * bslTDA9984HdcpHandleBSTATUS() parameter type
|
|
+ * */
|
|
+/** BSTATUS bit fields */
|
|
+enum _bsl_hdcp_handle_bstatus {
|
|
+ HDMITX_HDCP_BSTATUS_HDMI_MODE = 0x1000,
|
|
+ HDMITX_HDCP_BSTATUS_MAX_CASCADE_EXCEEDED = 0x0800,
|
|
+ HDMITX_HDCP_BSTATUS_CASCADE_DEPTH = 0x0700,
|
|
+ HDMITX_HDCP_BSTATUS_MAX_DEVS_EXCEEDED = 0x0080,
|
|
+ HDMITX_HDCP_BSTATUS_DEVICE_COUNT = 0x007F
|
|
+};
|
|
+
|
|
+/*============================================================================*/
|
|
+/**
|
|
+ * bslTDA9984HdcpHandleSHA_1() parameter types
|
|
+ * */
|
|
+/** KSV list sizes */
|
|
+enum _bsl_hdcp_handle_sha_1 {
|
|
+ HDMITX_KSV_LIST_MAX_DEVICES = 128,
|
|
+ HDMITX_KSV_BYTES_PER_DEVICE = 5
|
|
+};
|
|
+
|
|
+/*============================================================================*/
|
|
+/**
|
|
+ * bslTDA9984HotPlugGetStatus() parameter type
|
|
+ * */
|
|
+/** Current hotplug status */
|
|
+typedef enum {
|
|
+ HDMITX_HOTPLUG_INACTIVE = 0, /**< Hotplug inactive */
|
|
+ HDMITX_HOTPLUG_ACTIVE = 1, /**< Hotplug active */
|
|
+ HDMITX_HOTPLUG_INVALID = 2 /**< Invalid Hotplug */
|
|
+} bsl_hot_plug_t;
|
|
+
|
|
+/*============================================================================*/
|
|
+/**
|
|
+ * bslTDA9984RxSenseGetStatus() parameter type
|
|
+ * */
|
|
+/** Current RX Sense status */
|
|
+typedef enum {
|
|
+ HDMITX_RX_SENSE_INACTIVE = 0, /**< RxSense inactive */
|
|
+ HDMITX_RX_SENSE_ACTIVE = 1, /**< RxSense active */
|
|
+ HDMITX_RX_SENSE_INVALID = 2 /**< Invalid RxSense */
|
|
+} bsl_rx_sense_t;
|
|
+
|
|
+/*============================================================================*/
|
|
+/**
|
|
+ * bslTDA9984HwGetCapabilities() parameter type
|
|
+ * */
|
|
+/** List of HW features that may be supported by HW */
|
|
+typedef enum {
|
|
+ HDMITX_FEATURE_HW_HDCP = 0, /**< HDCP feature */
|
|
+ HDMITX_FEATURE_HW_SCALER = 1, /**< Scaler feature */
|
|
+ HDMITX_FEATURE_HW_AUDIO_OBA = 2, /**< One Bit Audio feature */
|
|
+ HDMITX_FEATURE_HW_AUDIO_DST = 3, /**< DST Audio feature */
|
|
+ HDMITX_FEATURE_HW_AUDIO_HBR = 4, /**< HBR Audio feature */
|
|
+ HDMITX_FEATURE_HW_HDMI_1_1 = 5, /**< HDMI 1.1 feature */
|
|
+ HDMITX_FEATURE_HW_HDMI_1_2A = 6, /**< HDMI 1.2a feature */
|
|
+ HDMITX_FEATURE_HW_HDMI_1_3A = 7, /**< HDMI 1.3a feature */
|
|
+ HDMITX_FEATURE_HW_DEEP_COLOR_30 = 8, /**< 30 bits deep color support */
|
|
+ HDMITX_FEATURE_HW_DEEP_COLOR_36 = 9, /**< 36 bits deep color support */
|
|
+ HDMITX_FEATURE_HW_DEEP_COLOR_48 = 11, /**< 48 bits deep color support */
|
|
+ HDMITX_FEATURE_HW_UPSAMPLER = 12, /**< Up sampler feature */
|
|
+ HDMITX_FEATURE_HW_DOWNSAMPLER = 13, /**< Down sampler feature */
|
|
+ HDMITX_FEATURE_HW_COLOR_CONVERSION = 14 /**< Color conversion matrix */
|
|
+} bsl_hw_feature_t;
|
|
+
|
|
+/*============================================================================*/
|
|
+/**
|
|
+ * bslTDA9984Init() parameter types
|
|
+ * */
|
|
+/** Supported range of I2C slave addresses */
|
|
+enum _bsl_slave_address {
|
|
+ HDMITX_SLAVE_ADDRESS_MIN = 1,
|
|
+ HDMITX_SLAVE_ADDRESS_MAX = 127
|
|
+};
|
|
+
|
|
+/**
|
|
+ * Indexes into the funcCallback[] array of interrupt callback function pointers
|
|
+ * */
|
|
+typedef enum _bsl_callback_int {
|
|
+ /**< HDCP encryption switched off */
|
|
+ HDMITX_CALLBACK_INT_SECURITY = 0,
|
|
+ /**< HDCP encrypt as above (Obsolete) */
|
|
+ HDMITX_CALLBACK_INT_ENCRYPT = 0,
|
|
+ /**< Transition on HPD input */
|
|
+ HDMITX_CALLBACK_INT_HPD = 1,
|
|
+ /**< HDCP state machine in state T0 */
|
|
+ HDMITX_CALLBACK_INT_T0 = 2,
|
|
+ /**< BCAPS available */
|
|
+ HDMITX_CALLBACK_INT_BCAPS = 3,
|
|
+ /**< BSTATUS available */
|
|
+ HDMITX_CALLBACK_INT_BSTATUS = 4,
|
|
+ /**< sha-1(ksv,bstatus,m0)=V' */
|
|
+ HDMITX_CALLBACK_INT_SHA_1 = 5,
|
|
+ /**< pj=pj' check fails */
|
|
+ HDMITX_CALLBACK_INT_PJ = 6,
|
|
+ /**< R0 interrupt */
|
|
+ HDMITX_CALLBACK_INT_R0 = 7,
|
|
+ /**< SW DEBUG interrupt */
|
|
+ HDMITX_CALLBACK_INT_SW_INT = 8,
|
|
+ /**< RX SENSE interrupt */
|
|
+ HDMITX_CALLBACK_INT_RX_SENSE = 9,
|
|
+ /**< EDID BLK READ interrupt */
|
|
+ HDMITX_CALLBACK_INT_EDID_BLK_READ = 10,
|
|
+ /**< Pll Lock (Serial or Formatter) */
|
|
+ HDMITX_CALLBACK_INT_PLL_LOCK = 11,
|
|
+ /**< VS Interrupt for Gamut packets */
|
|
+ HDMITX_CALLBACK_INT_VS_RPT = 12,
|
|
+ /**< Number of callbacks */
|
|
+ HDMITX_CALLBACK_INT_NUM = 13
|
|
+} bsl_callback_int_t;
|
|
+
|
|
+/** Pixel rate */
|
|
+typedef enum {
|
|
+ HDMITX_PIXRATE_DOUBLE = 0, /**< Double pixel rate */
|
|
+ HDMITX_PIXRATE_SINGLE = 1, /**< Single pixel rate */
|
|
+ /**< Single pixel repeated */
|
|
+ HDMITX_PIXRATE_SINGLE_REPEATED = 2,
|
|
+ HDMITX_PIXRATE_NO_CHANGE = 3, /**< No Change */
|
|
+ HDMITX_PIXRATE_INVALID = 4 /**< Invalid */
|
|
+} bsl_pix_rate_t;
|
|
+
|
|
+/**
|
|
+ * \brief The bslTDA9984Init() parameter structure
|
|
+ * */
|
|
+typedef struct _bsl_callback_list_t {
|
|
+ /** Interrupt callback function pointers (each ptr if null = not used) */
|
|
+ pbsl_callback_t func_callback[HDMITX_CALLBACK_INT_NUM];
|
|
+
|
|
+} bsl_callback_list_t;
|
|
+
|
|
+/*============================================================================*/
|
|
+/**
|
|
+ * bslTDA9984MatrixSetCoeffs() parameter type
|
|
+ * */
|
|
+/** Parameter structure array size */
|
|
+enum _bsl_mat_coeff {
|
|
+ HDMITX_MAT_COEFF_NUM = 9
|
|
+};
|
|
+
|
|
+/** \brief The bslTDA9984MatrixSetCoeffs() parameter structure */
|
|
+/** Array of coefficients (values -1024 to +1023) */
|
|
+typedef struct _bsl_mat_coeff_t {
|
|
+ /** Array of coefficients (values -1024 to +1023) */
|
|
+ s16 coeff[HDMITX_MAT_COEFF_NUM];
|
|
+} bsl_mat_coeff_t;
|
|
+
|
|
+/*============================================================================*/
|
|
+/**
|
|
+ * bslTDA9984MatrixSetConversion() parameter type
|
|
+ * */
|
|
+/** Video input mode */
|
|
+typedef enum {
|
|
+ HDMITX_VINMODE_CCIR656 = 0, /**< ccir656 */
|
|
+ HDMITX_VINMODE_RGB444 = 1, /**< RGB444 */
|
|
+ HDMITX_VINMODE_YUV444 = 2, /**< YUV444 */
|
|
+ HDMITX_VINMODE_YUV422 = 3, /**< YUV422 */
|
|
+ HDMITX_VINMODE_NO_CHANGE = 4, /**< No change */
|
|
+ HDMITX_VINMODE_INVALID = 5 /**< Invalid */
|
|
+} bsl_vin_mode_t;
|
|
+
|
|
+/** Video output mode */
|
|
+typedef enum {
|
|
+ HDMITX_VOUTMODE_RGB444 = 0, /**< RGB444 */
|
|
+ HDMITX_VOUTMODE_YUV422 = 1, /**< YUV422 */
|
|
+ HDMITX_VOUTMODE_YUV444 = 2, /**< YUV444 */
|
|
+ HDMITX_VOUTMODE_NO_CHANGE = 3, /**< No change */
|
|
+ HDMITX_VOUTMODE_INVALID = 4 /**< Invalid */
|
|
+} bsl_vout_mode_t;
|
|
+
|
|
+/*============================================================================*/
|
|
+/**
|
|
+ * bslTDA9984MatrixSetMode() parameter types
|
|
+ * */
|
|
+/** Matrix control values */
|
|
+typedef enum {
|
|
+ HDMITX_MCNTRL_ON = 0, /**< Matrix on */
|
|
+ HDMITX_MCNTRL_OFF = 1, /**< Matrix off */
|
|
+ HDMITX_MCNTRL_NO_CHANGE = 2, /**< Matrix unchanged */
|
|
+ HDMITX_MCNTRL_MAX = 2, /**< Max value */
|
|
+ HDMITX_MCNTRL_INVALID = 3 /**< Invalid */
|
|
+} bslm_cntrl_t;
|
|
+
|
|
+/** Matrix scale values */
|
|
+typedef enum {
|
|
+ HDMITX_MSCALE_256 = 0, /**< Factor 1/256 */
|
|
+ HDMITX_MSCALE_512 = 1, /**< Factor 1/512 */
|
|
+ HDMITX_MSCALE_1024 = 2, /**< Factor 1/1024 */
|
|
+ HDMITX_MSCALE_NO_CHANGE = 3, /**< Factor unchanged */
|
|
+ HDMITX_MSCALE_MAX = 3, /**< Max value */
|
|
+ HDMITX_MSCALE_INVALID = 4 /**< Invalid value */
|
|
+} bslm_scale_t;
|
|
+
|
|
+/*============================================================================*/
|
|
+/**
|
|
+ * Data Island Packet structure
|
|
+ * */
|
|
+/** Parameter structure array sizes */
|
|
+enum _bsl_pkt {
|
|
+ HDMITX_PKT_DATA_BYTE_CNT = 28
|
|
+};
|
|
+
|
|
+/** \brief The parameter structure for bslTDA9984Pkt*() APIs */
|
|
+typedef struct _bsl_pkt_t {
|
|
+ u8 data_byte[HDMITX_PKT_DATA_BYTE_CNT]; /**< Packet Data */
|
|
+} bsl_pkt_t;
|
|
+
|
|
+/*============================================================================*/
|
|
+/**
|
|
+ * \brief The Audio Infoframe Parameter structure
|
|
+ * */
|
|
+typedef struct _bsl_pkt_aif_t {
|
|
+ u8 coding_type; /**< Coding Type 0 to 0Fh */
|
|
+ u8 channel_count; /**< Channel Count 0 to 07h */
|
|
+ u8 sample_freq; /**< Sample Frequency 0 to 07h */
|
|
+ u8 sample_size; /**< Sample Size 0 to 03h */
|
|
+ u8 channel_alloc; /**< Channel Allocation 0 to FFh */
|
|
+ bool down_mix_inhibit; /**< Downmix inhibit flag 0/1 */
|
|
+ u8 level_shift; /**< Level Shift 0 to 0Fh */
|
|
+} bsl_pkt_aif_t;
|
|
+
|
|
+/*============================================================================*/
|
|
+/**
|
|
+ * bslTDA9984PktSetMpegInfoframe() parameter types
|
|
+ * */
|
|
+/** MPEG frame types */
|
|
+typedef enum {
|
|
+ HDMITX_MPEG_FRAME_UNKNOWN = 0, /**< Unknown */
|
|
+ HDMITX_MPEG_FRAME_I = 1, /**< i-frame */
|
|
+ HDMITX_MPEG_FRAME_B = 2, /**< b-frame */
|
|
+ HDMITX_MPEG_FRAME_P = 3, /**< p-frame */
|
|
+ HDMITX_MPEG_FRAME_INVALID = 4 /**< Invalid */
|
|
+} bsl_mpeg_frame_t;
|
|
+
|
|
+/** \brief The MPEG Infoframe Parameter structure */
|
|
+typedef struct _bsl_pkt_mpeg_t {
|
|
+ u32 bit_rate; /**< MPEG bit rate in Hz */
|
|
+ bsl_mpeg_frame_t frame_type; /**< MPEG frame type */
|
|
+ /**< 0: new field, 1:repeated field */
|
|
+ bool b_field_repeat;
|
|
+} bsl_pkt_mpeg_t;
|
|
+
|
|
+/*============================================================================*/
|
|
+/**
|
|
+ * Source Product Description Infoframe Parameter types
|
|
+ * */
|
|
+/** SDI frame types */
|
|
+typedef enum {
|
|
+ HDMITX_SPD_INFO_UNKNOWN = 0,
|
|
+ HDMITX_SPD_INFO_DIGITAL_STB = 1,
|
|
+ HDMITX_SPD_INFO_DVD = 2,
|
|
+ HDMITX_SPD_INFO_DVHS = 3,
|
|
+ HDMITX_SPD_INFO_HDD_VIDEO = 4,
|
|
+ HDMITX_SPD_INFO_DVC = 5,
|
|
+ HDMITX_SPD_INFO_DSC = 6,
|
|
+ HDMITX_SPD_INFO_VIDEO_CD = 7,
|
|
+ HDMITX_SPD_INFO_GAME = 8,
|
|
+ HDMITX_SPD_INFO_PC = 9,
|
|
+ HDMITX_SPD_INFO_INVALID = 10
|
|
+} bsl_source_dev_t;
|
|
+
|
|
+#define HDMI_TX_SPD_VENDOR_SIZE 8
|
|
+#define HDMI_TX_SPD_DESCR_SIZE 16
|
|
+#define HDMI_TX_SPD_LENGTH 25
|
|
+
|
|
+/** \brief The Source Product Description Infoframe Parameter structure */
|
|
+typedef struct _bsl_pkt_spd_t {
|
|
+ /**< Vendor name */
|
|
+ u8 vendor_name[HDMI_TX_SPD_VENDOR_SIZE];
|
|
+ /**< Product Description */
|
|
+ u8 prod_descr[HDMI_TX_SPD_DESCR_SIZE];
|
|
+ /**< Source Device Info */
|
|
+ bsl_source_dev_t source_dev_info;
|
|
+} bsl_pkt_spd_t;
|
|
+
|
|
+/*============================================================================*/
|
|
+/**
|
|
+ * \brief The Video Infoframe Parameter structure
|
|
+ * */
|
|
+typedef struct _bsl_pkt_vif_t {
|
|
+ u8 colour; /**< 0 to 03h */
|
|
+ bool active_info; /**< 0/1 */
|
|
+ u8 bar_info; /**< 0 to 03h */
|
|
+ u8 scan_info; /**< 0 to 03h */
|
|
+ u8 colorimetry; /**< 0 to 03h */
|
|
+ u8 picture_aspect_ratio; /**< 0 to 03h */
|
|
+ u8 active_format_ratio; /**< 0 to 0Fh */
|
|
+ u8 scaling; /**< 0 to 03h */
|
|
+ u8 vid_format; /**< 0 to 7Fh */
|
|
+ u8 pixel_repeat; /**< 0 to 0Fh */
|
|
+ u16 end_top_bar_line;
|
|
+ u16 start_bottom_bar_line;
|
|
+ u16 end_left_bar_pixel;
|
|
+ u16 start_right_bar_pixel;
|
|
+} bsl_pkt_vif_t;
|
|
+
|
|
+/*============================================================================*/
|
|
+/**
|
|
+ * bslTDA9984ScalerGetMode() parameter types
|
|
+ * */
|
|
+/** Scaler modes */
|
|
+typedef enum {
|
|
+ HDMITX_SCAMODE_OFF = 0, /**< Off */
|
|
+ HDMITX_SCAMODE_ON = 1, /**< On */
|
|
+ HDMITX_SCAMODE_AUTO = 2, /**< Auto */
|
|
+ HDMITX_SCAMODE_NO_CHANGE = 3, /**< No change */
|
|
+ HDMITX_SCAMODE_INVALID = 4 /**< Invalid */
|
|
+} bsl_sca_mode_t;
|
|
+
|
|
+/*============================================================================*/
|
|
+/**
|
|
+ * \brief The bslTDA9984ScalerGet() parameter type
|
|
+ * */
|
|
+typedef struct _bsl_scaler_diag_t {
|
|
+ u16 max_buffill_p; /**< Filling primary video buffer */
|
|
+ u16 max_buffill_d; /**< Filling video deinterlaced buffer */
|
|
+ u8 max_fifofill_pi; /**< Filling primary video input FIFO */
|
|
+ u8 min_fifofill_po1; /**< Filling primary video output FIFO #1 */
|
|
+ u8 min_fifofill_po2; /**< Filling primary video output FIFO #2 */
|
|
+ u8 min_fifofill_po3; /**< Filling primary video output FIFO #3 */
|
|
+ u8 min_fifofill_po4; /**< Filling primary video output FIFO #4 */
|
|
+ u8 max_fifofill_di; /**< Filling deinterlaced video input FIFO */
|
|
+ u8 max_fifofill_do; /**< Filling deinterlaced video output FIFO */
|
|
+} bsl_scaler_diag_t;
|
|
+
|
|
+/*============================================================================*/
|
|
+/**
|
|
+ * bslTDA9984ScalerSetCoeffs() parameter types
|
|
+ * */
|
|
+/** Scaler lookup table selection */
|
|
+typedef enum {
|
|
+ HDMITX_SCALUT_DEFAULT_TAB1 = 0, /**< Use default table 1 */
|
|
+ HDMITX_SCALUT_DEFAULT_TAB2 = 1, /**< Use default table 2 */
|
|
+ HDMITX_SCALUT_USE_VSLUT = 2, /**< Use vsLut parameter */
|
|
+ HDMITX_SCALUT_INVALID = 3 /**< Invalid value */
|
|
+} bsl_sca_lut_t;
|
|
+
|
|
+/** Scaler control parameter structure array size */
|
|
+enum _bslvs_lut {
|
|
+ HDMITX_VSLUT_COEFF_NUM = 45
|
|
+};
|
|
+/*============================================================================*/
|
|
+/**
|
|
+ * bslTDA9984ScalerSetFieldOrder() parameter types
|
|
+ * */
|
|
+/** IntExt values */
|
|
+typedef enum {
|
|
+ HDMITX_INTEXT_INTERNAL = 0, /**< Internal */
|
|
+ HDMITX_INTEXT_EXTERNAL = 1, /**< External */
|
|
+ HDMITX_INTEXT_NO_CHANGE = 2, /**< No change */
|
|
+ HDMITX_INTEXT_INVALID = 3 /**< Invalid */
|
|
+} bsl_int_ext_t;
|
|
+
|
|
+/** TopSel values */
|
|
+typedef enum {
|
|
+ HDMITX_TOPSEL_INTERNAL = 0, /**< Internal */
|
|
+ HDMITX_TOPSEL_VRF = 1, /**< VRF */
|
|
+ HDMITX_TOPSEL_NO_CHANGE = 2, /**< No change */
|
|
+ HDMITX_TOPSEL_INVALID = 3 /**< Invalid */
|
|
+} bsl_top_sel_t;
|
|
+
|
|
+/** TopTgl values */
|
|
+typedef enum {
|
|
+ HDMITX_TOPTGL_NO_ACTION = 0, /**< NO action */
|
|
+ HDMITX_TOPTGL_TOGGLE = 1, /**< Toggle */
|
|
+ HDMITX_TOPTGL_NO_CHANGE = 2, /**< No change */
|
|
+ HDMITX_TOPTGL_INVALID = 3 /**< Invalid */
|
|
+} bsl_top_tgl_t;
|
|
+
|
|
+/*============================================================================*/
|
|
+/**
|
|
+ * bslTDA9984ScalerSetPhase() parameter types
|
|
+ * */
|
|
+/** Phases_h values */
|
|
+typedef enum {
|
|
+ HDMITX_H_PHASES_16 = 0, /**< 15 horizontal phases */
|
|
+ HDMITX_H_PHASES_15 = 1, /**< 16 horizontal phases */
|
|
+ HDMITX_H_PHASES_INVALID = 2 /**< Invalid */
|
|
+} bsl_hphases_t;
|
|
+
|
|
+/*============================================================================*/
|
|
+/**
|
|
+ * bslTDA9984ScalerSetFine() parameter types
|
|
+ * */
|
|
+/** Reference pixel values */
|
|
+enum _bsl_scaler_fine_pixel_limits {
|
|
+ HDMITX_SCALER_FINE_PIXEL_MIN = 0x0000,
|
|
+ HDMITX_SCALER_FINE_PIXEL_MAX = 0x1FFF,
|
|
+ HDMITX_SCALER_FINE_PIXEL_NO_CHANGE = 0x2000,
|
|
+ HDMITX_SCALER_FINE_PIXEL_INVALID = 0x2001
|
|
+};
|
|
+
|
|
+/** Reference line values */
|
|
+enum _bsl_scaler_fine_line_limits {
|
|
+ HDMITX_SCALER_FINE_LINE_MIN = 0x0000,
|
|
+ HDMITX_SCALER_FINE_LINE_MAX = 0x07FF,
|
|
+ HDMITX_SCALER_FINE_LINE_NO_CHANGE = 0x0800,
|
|
+ HDMITX_SCALER_FINE_LINE_INVALID = 0x0801
|
|
+};
|
|
+/*============================================================================*/
|
|
+/**
|
|
+ * bslTDA9984ScalerSetSync() parameter types
|
|
+ * */
|
|
+/** Video sync method */
|
|
+typedef enum {
|
|
+ HDMITX_VSMETH_V_H = 0, /**< V and H */
|
|
+ HDMITX_VSMETH_V_XDE = 1, /**< V and X-DE */
|
|
+ HDMITX_VSMETH_NO_CHANGE = 2, /**< No change */
|
|
+ HDMITX_VSMETH_INVALID = 3 /**< Invalid */
|
|
+} bsl_vs_meth_t;
|
|
+
|
|
+/** Line/pixel counters sync */
|
|
+typedef enum {
|
|
+ HDMITX_VSONCE_EACH_FRAME = 0, /**< Sync on each frame */
|
|
+ HDMITX_VSONCE_ONCE = 1, /**< Sync once only */
|
|
+ HDMITX_VSONCE_NO_CHANGE = 2, /**< No change */
|
|
+ HDMITX_VSONCE_INVALID = 3 /**< Invalid */
|
|
+} bsl_vs_once_t;
|
|
+
|
|
+/*============================================================================*/
|
|
+/**
|
|
+ * bslTDA9984TmdsSetOutputs() parameter types
|
|
+ * */
|
|
+/** TMDS output mode */
|
|
+typedef enum {
|
|
+ HDMITX_TMDSOUT_NORMAL = 0, /**< Normal outputs */
|
|
+ HDMITX_TMDSOUT_NORMAL1 = 1, /**< Normal outputs, same as 0 */
|
|
+ HDMITX_TMDSOUT_FORCED0 = 2, /**< Forced 0 outputs */
|
|
+ HDMITX_TMDSOUT_FORCED1 = 3, /**< Forced 1 outputs */
|
|
+ HDMITX_TMDSOUT_INVALID = 4 /**< Invalid */
|
|
+} bsl_tmds_out_t;
|
|
+
|
|
+/*============================================================================*/
|
|
+/**
|
|
+ * bslTDA9984TmdsSetSerializer() parameter types
|
|
+ * */
|
|
+/** Serializer phase limits */
|
|
+enum _bsl_tmds_phase {
|
|
+ HDMITX_TMDSPHASE_MIN = 0,
|
|
+ HDMITX_TMDSPHASE_MAX = 15,
|
|
+ HDMITX_TMDSPHASE_INVALID = 16
|
|
+};
|
|
+
|
|
+/*============================================================================*/
|
|
+/**
|
|
+ * bslTDA9984TestSetPattern() parameter types
|
|
+ * */
|
|
+/** Test pattern types */
|
|
+typedef enum {
|
|
+ HDMITX_PATTERN_OFF = 0, /**< Insert test pattern */
|
|
+ HDMITX_PATTERN_CBAR4 = 1, /**< Insert 4-bar colour bar */
|
|
+ HDMITX_PATTERN_CBAR8 = 2, /**< Insert 8-bar colour bar */
|
|
+ HDMITX_PATTERN_BLUE = 3, /**< Insert Blue screen */
|
|
+ HDMITX_PATTERN_BLACK = 4, /**< Insert Blue screen */
|
|
+ HDMITX_PATTERN_INVALID = 5 /**< Invalid pattern */
|
|
+} bsl_test_pattern_t;
|
|
+
|
|
+/*============================================================================*/
|
|
+/**
|
|
+ * bslTDA9984TestSetMode() parameter types
|
|
+ * */
|
|
+/** Test modes */
|
|
+typedef enum {
|
|
+ HDMITX_TESTMODE_PAT = 0,/**< Insert test pattern */
|
|
+ HDMITX_TESTMODE_656 = 1,/**< Inject CCIR-656 video via audio port */
|
|
+ HDMITX_TESTMODE_SERPHOE = 2,/**< Activate srl_tst_ph2_o & srl_tst_ph3_o */
|
|
+ HDMITX_TESTMODE_NOSC = 3,/**< Input nosc predivider = PLL-ref input */
|
|
+ HDMITX_TESTMODE_HVP = 4,/**< Test high voltage protection cells */
|
|
+ HDMITX_TESTMODE_PWD = 5,/**< Test PLLs in sleep mode */
|
|
+ HDMITX_TESTMODE_DIVOE = 6,/**< Enable scaler PLL divider test output */
|
|
+ HDMITX_TESTMODE_INVALID = 7 /**< Invalid test */
|
|
+} bsl_test_mode_t;
|
|
+
|
|
+/** Test states */
|
|
+typedef enum {
|
|
+ HDMITX_TESTSTATE_OFF = 0, /**< Disable the selected test */
|
|
+ HDMITX_TESTSTATE_ON = 1, /**< Enable the selected test */
|
|
+ HDMITX_TESTSTATE_INVALID = 2 /**< Invalid value */
|
|
+} bsl_test_state_t;
|
|
+
|
|
+/*============================================================================*/
|
|
+/**
|
|
+ * bslTDA9984VideoInSetBlanking() parameter types
|
|
+ * */
|
|
+/** Blankit Source */
|
|
+typedef enum {
|
|
+ HDMITX_BLNKSRC_NOT_DE = 0, /**< Source=Not DE */
|
|
+ HDMITX_BLNKSRC_VS_HS = 1, /**< Source=VS And HS */
|
|
+ HDMITX_BLNKSRC_VS_NOT_HS = 2, /**< Source=VS And Not HS */
|
|
+ HDMITX_BLNKSRC_VS_HEMB_VEMB = 3, /**< Source=Hemb And Vemb */
|
|
+ HDMITX_BLNKSRC_NO_CHANGE = 4, /**< No change */
|
|
+ HDMITX_BLNKSRC_INVALID = 5 /**< Invalid */
|
|
+} bsl_blnk_src_t;
|
|
+
|
|
+/** Blanking Codes */
|
|
+typedef enum {
|
|
+ HDMITX_BLNKCODE_ALL_0 = 0, /**< Code=All Zero */
|
|
+ HDMITX_BLNKCODE_RGB444 = 1, /**< Code=RGB444 */
|
|
+ HDMITX_BLNKCODE_YUV444 = 2, /**< Code=YUV444 */
|
|
+ HDMITX_BLNKCODE_YUV422 = 3, /**< Code=YUV422 */
|
|
+ HDMITX_BLNKCODE_NO_CHANGE = 4, /**< No change */
|
|
+ HDMITX_BLNKCODE_INVALID = 5 /**< Invalid */
|
|
+} bsl_blnk_code_t;
|
|
+
|
|
+/*============================================================================*/
|
|
+/**
|
|
+ * bslTDA9984VideoInSetConfig() parameter types
|
|
+ * */
|
|
+/** Sample edge */
|
|
+typedef enum {
|
|
+ HDMITX_PIXEDGE_CLK_POS = 0, /**< Pixel Clock Positive Edge */
|
|
+ HDMITX_PIXEDGE_CLK_NEG = 1, /**< Pixel Clock Negative Edge */
|
|
+ HDMITX_PIXEDGE_NO_CHANGE = 2, /**< No Change */
|
|
+ HDMITX_PIXEDGE_INVALID = 3 /**< Invalid */
|
|
+} bsl_pix_edge_t;
|
|
+
|
|
+/** Upsample modes */
|
|
+typedef enum {
|
|
+ HDMITX_UPSAMPLE_BYPASS = 0, /**< Bypass */
|
|
+ HDMITX_UPSAMPLE_COPY = 1, /**< Copy */
|
|
+ HDMITX_UPSAMPLE_INTERPOLATE = 2, /**< Interpolate */
|
|
+ /**< Auto: driver chooses best value */
|
|
+ HDMITX_UPSAMPLE_AUTO = 3,
|
|
+ HDMITX_UPSAMPLE_NO_CHANGE = 4, /**< No Change */
|
|
+ HDMITX_UPSAMPLE_INVALID = 5 /**< Invalid */
|
|
+} bsl_upsample_mode_t;
|
|
+
|
|
+/*============================================================================*/
|
|
+/**
|
|
+ * bslTDA9984VideoInSetFine() parameter types
|
|
+ * */
|
|
+/** Subpacket count */
|
|
+typedef enum {
|
|
+ HDMITX_PIXSUBPKT_FIX_0 = 0, /**< Fix At 0 */
|
|
+ HDMITX_PIXSUBPKT_FIX_1 = 1, /**< Fix At 1 */
|
|
+ HDMITX_PIXSUBPKT_FIX_2 = 2, /**< Fix At 2 */
|
|
+ HDMITX_PIXSUBPKT_FIX_3 = 3, /**< Fix At 3 */
|
|
+ HDMITX_PIXSUBPKT_SYNC_FIRST = 4, /**< First Sync value */
|
|
+ HDMITX_PIXSUBPKT_SYNC_HEMB = 4, /**< Sync By Hemb */
|
|
+ HDMITX_PIXSUBPKT_SYNC_DE = 5, /**< Sync By Rising Edge DE */
|
|
+ HDMITX_PIXSUBPKT_SYNC_HS = 6, /**< Sync By Rising Edge HS */
|
|
+ HDMITX_PIXSUBPKT_NO_CHANGE = 7, /**< No Change */
|
|
+ HDMITX_PIXSUBPKT_INVALID = 8, /**< Invalid */
|
|
+ HDMITX_PIXSUBPKT_SYNC_FIXED = 3 /**< Not used as a parameter value,
|
|
+ * but used internally when
|
|
+ * Fix at 0/1/2/3 values are set */
|
|
+} bsl_pix_subpkt_t;
|
|
+
|
|
+/** Toggling */
|
|
+typedef enum {
|
|
+ HDMITX_PIXTOGL_NO_ACTION = 0, /**< No Action */
|
|
+ HDMITX_PIXTOGL_ENABLE = 1, /**< Toggle */
|
|
+ HDMITX_PIXTOGL_NO_CHANGE = 2, /**< No Change */
|
|
+ HDMITX_PIXTOGL_INVALID = 3 /**< Invalid */
|
|
+} bsl_pix_togl_t;
|
|
+
|
|
+/*============================================================================*/
|
|
+/**
|
|
+ * bslTDA9984VideoInSetMapping() parameter types
|
|
+ * */
|
|
+/** Video input port parameter structure array size and limits */
|
|
+enum _bsl_vin_port_map {
|
|
+ HDMITX_VIN_PORT_MAP_TABLE_LEN = 6,
|
|
+
|
|
+ HDMITX_VIN_PORT_SWAP_NO_CHANGE = 6,
|
|
+ HDMITX_VIN_PORT_SWAP_INVALID = 7,
|
|
+
|
|
+ HDMITX_VIN_PORT_MIRROR_NO_CHANGE = 2,
|
|
+ HDMITX_VIN_PORT_MIRROR_INVALID = 3
|
|
+};
|
|
+
|
|
+/*============================================================================*/
|
|
+/**
|
|
+ * bslTDA9984VideoInSetSyncAuto() parameter types
|
|
+ * */
|
|
+/** Sync source - was Embedded sync HDMITX_PIXEMBSYNC_ */
|
|
+typedef enum {
|
|
+ HDMITX_SYNCSRC_EMBEDDED = 0, /**< Embedded sync */
|
|
+ HDMITX_SYNCSRC_EXT_VREF = 1, /**< External sync Vref, Href, Fref */
|
|
+ HDMITX_SYNCSRC_EXT_VS = 2, /**< External sync Vs, Hs */
|
|
+ HDMITX_SYNCSRC_NO_CHANGE = 3, /**< No Change */
|
|
+ HDMITX_SYNCSRC_INVALID = 4 /**< Invalid */
|
|
+} bsl_sync_source_t;
|
|
+
|
|
+/*============================================================================*/
|
|
+/**
|
|
+ * bslTDA9984VideoInSetSyncManual() parameter types
|
|
+ * */
|
|
+/** Video output frame pixel values */
|
|
+enum _bsl_vout_fine_pixel_limits {
|
|
+ HDMITX_VOUT_FINE_PIXEL_MIN = 0x0000,
|
|
+ HDMITX_VOUT_FINE_PIXEL_MAX = 0x1FFF,
|
|
+ HDMITX_VOUT_FINE_PIXEL_NO_CHANGE = 0x2000,
|
|
+ HDMITX_VOUT_FINE_PIXEL_INVALID = 0x2001
|
|
+};
|
|
+
|
|
+/** Video output frame line values */
|
|
+enum _bsl_vout_fine_line_limits {
|
|
+ HDMITX_VOUT_FINE_LINE_MIN = 0x0000,
|
|
+ HDMITX_VOUT_FINE_LINE_MAX = 0x07FF,
|
|
+ HDMITX_VOUT_FINE_LINE_NO_CHANGE = 0x0800,
|
|
+ HDMITX_VOUT_FINE_LINE_INVALID = 0x0801
|
|
+};
|
|
+
|
|
+/*============================================================================*/
|
|
+/**
|
|
+ * bslTDA9984VideoOutSetConfig() parameter types
|
|
+ * */
|
|
+/** Prefilter */
|
|
+typedef enum {
|
|
+ HDMITX_VOUT_PREFIL_OFF = 0, /**< Off */
|
|
+ HDMITX_VOUT_PREFIL_121 = 1, /**< 121 */
|
|
+ HDMITX_VOUT_PREFIL_109 = 2, /**< 109 */
|
|
+ HDMITX_VOUT_PREFIL_CCIR601 = 3, /**< CCIR601 */
|
|
+ HDMITX_VOUT_PREFIL_NO_CHANGE = 4, /**< No Change */
|
|
+ HDMITX_VOUT_PREFIL_INVALID = 5 /**< Invalid */
|
|
+} bsl_vout_prefil_t;
|
|
+
|
|
+/** YUV blanking */
|
|
+typedef enum {
|
|
+ HDMITX_VOUT_YUV_BLNK_16 = 0, /**< 16 */
|
|
+ HDMITX_VOUT_YUV_BLNK_0 = 1, /**< 0 */
|
|
+ HDMITX_VOUT_YUV_BLNK_NO_CHANGE = 2, /**< No Change */
|
|
+ HDMITX_VOUT_YUV_BLNK_INVALID = 3 /**< Invalid */
|
|
+} bsl_vout_yuv_blnk_t;
|
|
+
|
|
+/** Video quantization range */
|
|
+typedef enum {
|
|
+ HDMITX_VOUT_QRANGE_FS = 0, /**< Full Scale */
|
|
+ HDMITX_VOUT_QRANGE_RGB_YUV = 1, /**< RGB Or YUV */
|
|
+ HDMITX_VOUT_QRANGE_YUV = 2, /**< YUV */
|
|
+ HDMITX_VOUT_QRANGE_NO_CHANGE = 3, /**< No Change */
|
|
+ HDMITX_VOUT_QRANGE_INVALID = 4 /**< Invalid */
|
|
+} bsl_vout_qrange_t;
|
|
+
|
|
+/*============================================================================*/
|
|
+/**
|
|
+ * bslTDA9984VideoOutSetSync() parameter types
|
|
+ * */
|
|
+/** Video sync source */
|
|
+typedef enum {
|
|
+ HDMITX_VSSRC_INTERNAL = 0, /**< Internal */
|
|
+ HDMITX_VSSRC_EXTERNAL = 1, /**< External */
|
|
+ HDMITX_VSSRC_NO_CHANGE = 2, /**< No change */
|
|
+ HDMITX_VSSRC_INVALID = 3 /**< Invalid */
|
|
+} bsl_vs_src_t;
|
|
+
|
|
+/** Video sync toggle */
|
|
+typedef enum {
|
|
+ HDMITX_VSTGL_TABLE = 0, /**< Vs/Hs polarity from table */
|
|
+ HDMITX_VSTGL_UNUSED_1 = 1, /**< Unused */
|
|
+ HDMITX_VSTGL_UNUSED_2 = 2, /**< Unused */
|
|
+ HDMITX_VSTGL_UNUSED_3 = 3, /**< Unused */
|
|
+ HDMITX_VSTGL_NO_ACTION = 4, /**< No toggle */
|
|
+ HDMITX_VSTGL_HS = 5, /**< Toggle Hs */
|
|
+ HDMITX_VSTGL_VS = 6, /**< Toggle Vs */
|
|
+ HDMITX_VSTGL_HS_VS = 7, /**< Toggle Hs & Vs */
|
|
+ HDMITX_VSTGL_NO_CHANGE = 8, /**< No change */
|
|
+ HDMITX_VSTGL_INVALID = 9 /**< Invalid */
|
|
+} bsl_vs_tgl_t;
|
|
+
|
|
+/*============================================================================*/
|
|
+/**
|
|
+ * bslTDA9984VideoSetInOut() parameter types
|
|
+ * */
|
|
+/** Pixel repetition values */
|
|
+enum _bsl_pix_repeat {
|
|
+ HDMITX_PIXREP_NONE = 0, /**< No repetition */
|
|
+ HDMITX_PIXREP_MIN = 0, /**< 1 repetition */
|
|
+
|
|
+ HDMITX_PIXREP_0 = 0,
|
|
+ HDMITX_PIXREP_1 = 1,
|
|
+ HDMITX_PIXREP_2 = 2,
|
|
+ HDMITX_PIXREP_3 = 3,
|
|
+ HDMITX_PIXREP_4 = 4,
|
|
+ HDMITX_PIXREP_5 = 5,
|
|
+ HDMITX_PIXREP_6 = 6,
|
|
+ HDMITX_PIXREP_7 = 7,
|
|
+ HDMITX_PIXREP_8 = 8,
|
|
+ HDMITX_PIXREP_9 = 9,
|
|
+
|
|
+ HDMITX_PIXREP_MAX = 9, /**< 10 repetitions */
|
|
+ /**< Default repetitions for output format */
|
|
+ HDMITX_PIXREP_DEFAULT = 10,
|
|
+ HDMITX_PIXREP_NO_CHANGE = 11, /**< No change */
|
|
+ HDMITX_PIXREP_INVALID = 12 /**< Invalid */
|
|
+};
|
|
+
|
|
+/** Matrix modes */
|
|
+typedef enum {
|
|
+ HDMITX_MATMODE_OFF = 0, /**< Off */
|
|
+ HDMITX_MATMODE_AUTO = 1, /**< Auto */
|
|
+ HDMITX_MATMODE_NO_CHANGE = 2, /**< No change */
|
|
+ HDMITX_MATMODE_INVALID = 3 /**< Invalid */
|
|
+} bsl_mat_mode_t;
|
|
+
|
|
+/** Datapath bitwidth */
|
|
+typedef enum {
|
|
+ HDMITX_VOUT_DBITS_12 = 0, /**< 12 bits */
|
|
+ HDMITX_VOUT_DBITS_8 = 1, /**< 8 bits */
|
|
+ HDMITX_VOUT_DBITS_10 = 2, /**< 10 bits */
|
|
+ HDMITX_VOUT_DBITS_NO_CHANGE = 3, /**< No change */
|
|
+ HDMITX_VOUT_DBITS_INVALID = 4 /**< Invalid */
|
|
+} bsl_vout_dbits_t;
|
|
+
|
|
+/** Color depth */
|
|
+typedef enum {
|
|
+ HDMITX_COLORDEPTH_24 = 0, /**< 24 bits per pixel */
|
|
+ HDMITX_COLORDEPTH_30 = 1, /**< 30 bits per pixel */
|
|
+ HDMITX_COLORDEPTH_36 = 2, /**< 36 bits per pixel */
|
|
+ HDMITX_COLORDEPTH_48 = 3, /**< 48 bits per pixel */
|
|
+ HDMITX_COLORDEPTH_NO_CHANGE = 4, /**< No change */
|
|
+ HDMITX_COLORDEPTH_INVALID = 5 /**< Invalid */
|
|
+} bsl_color_depth;
|
|
+
|
|
+/*============================================================================*/
|
|
+/**
|
|
+ * bslTDA9984MatrixSetInputOffset() parameter type
|
|
+ * */
|
|
+/** Parameter structure array size */
|
|
+enum _bsl_mat_offset {
|
|
+ HDMITX_MAT_OFFSET_NUM = 3
|
|
+};
|
|
+
|
|
+/** \brief The bslTDA9984MatrixSetInputOffset() parameter structure */
|
|
+typedef struct _bsl_mat_offset_t {
|
|
+ /** Offset array (values -1024 to +1023) */
|
|
+ s16 offset[HDMITX_MAT_OFFSET_NUM];
|
|
+} bsl_mat_offset_t;
|
|
+
|
|
+/** Matrix numeric limits */
|
|
+enum _bsl_mat_limits {
|
|
+ HDMITX_MAT_OFFSET_MIN = -1024,
|
|
+ HDMITX_MAT_OFFSET_MAX = 1023
|
|
+};
|
|
+
|
|
+/*============================================================================*/
|
|
+/**
|
|
+ * tdaPowerSetState() and tdaPowerGetState() parameter types
|
|
+ * */
|
|
+typedef enum {
|
|
+ HDMITX_POWER_STATE_STAND_BY = 0, /**< Stand by mode */
|
|
+ HDMITX_POWER_STATE_SLEEP_MODE = 1, /**< Sleep mode */
|
|
+ HDMITX_POWER_STATE_ON = 2, /**< On mode */
|
|
+ HDMITX_POWER_STATE_INVALID = 3 /**< Invalid format */
|
|
+} bsl_power_state_t;
|
|
+
|
|
+/**
|
|
+ * \brief Structure describing gamut metadata packet (P0 or P1 profiles)
|
|
+ * */
|
|
+typedef struct {
|
|
+ u8 HB[3]; /**< Header bytes (HB0, HB1 & HB2) */
|
|
+ u8 PB[28]; /**< Payload bytes 0..27 */
|
|
+} bsl_pkt_gamut_t;
|
|
+
|
|
+/**
|
|
+ * \brief Structure describing RAW AVI infoframe
|
|
+ * */
|
|
+typedef struct {
|
|
+ u8 HB[3]; /**< Header bytes (HB0, HB1 & HB2) */
|
|
+ u8 PB[28]; /**< Payload bytes 0..27 */
|
|
+} bsl_pkt_raw_avi_t;
|
|
+
|
|
+/** Sink category */
|
|
+typedef enum {
|
|
+ HDMITX_SINK_CAT_NOT_REPEATER = 0, /**< Not repeater */
|
|
+ HDMITX_SINK_CAT_REPEATER = 1, /**< repeater */
|
|
+ HDMITX_SINK_CAT_INVALID = 3 /**< Invalid */
|
|
+} bsl_sink_category_t;
|
|
+
|
|
+typedef struct {
|
|
+ bool latency_available;
|
|
+ bool ilatency_available;
|
|
+ u8 edidvideo_latency;
|
|
+ u8 edidaudio_latency;
|
|
+ u8 edid_ivideo_latency;
|
|
+ u8 edid_iaudio_latency;
|
|
+
|
|
+} bsl_edid_latency_t;
|
|
+
|
|
+/**
|
|
+ * \brief Structure defining additional VSDB data
|
|
+ * */
|
|
+typedef struct {
|
|
+ u8 max_tmds_clock; /* maximum supported TMDS clock */
|
|
+ u8 cnc0; /* content type Graphics (text) */
|
|
+ u8 cnc1; /* content type Photo */
|
|
+ u8 cnc2; /* content type Cinema */
|
|
+ u8 cnc3; /* content type Game */
|
|
+ u8 hdmi_video_present; /* additional video format */
|
|
+ u8 h3dpresent; /* 3D support by the HDMI Sink */
|
|
+ u8 h3dmulti_present; /* 3D multi strctures present */
|
|
+ /* additional info for the values in the image size area */
|
|
+ u8 image_size;
|
|
+ u8 hdmi3dlen; /* total length of 3D video formats */
|
|
+ u8 hdmi_vic_len; /* total length of extended video formats */
|
|
+ u8 ext3ddata[21]; /* max_len-10, ie: 31-10=21 */
|
|
+} bsl_edid_extra_vsdb_data_t;
|
|
+
|
|
+/**
|
|
+ * \brief Enum defining possible quantization range
|
|
+ * */
|
|
+typedef enum {
|
|
+ HDMITX_VQR_DEFAULT = 0, /* Follow HDMI spec. */
|
|
+ HDMITX_RGB_FULL = 1, /* Force RGB FULL , DVI only */
|
|
+ HDMITX_RGB_LIMITED = 2 /* Force RGB LIMITED , DVI only */
|
|
+} bsl_vqr_t;
|
|
+
|
|
+#endif /* BSLHDMITX_TYPES_H */
|
|
+
|
|
+/*============================================================================*/
|
|
+/* END OF FILE */
|
|
+/*============================================================================*/
|
|
+
|
|
diff --git a/drivers/video/hdmi/comps/tmbslTDA9983/inc/tmbslHdmiTx.h b/drivers/video/hdmi/comps/tmbslTDA9983/inc/tmbslHdmiTx.h
|
|
new file mode 100755
|
|
index 0000000..2fc9b53
|
|
--- /dev/null
|
|
+++ b/drivers/video/hdmi/comps/tmbslTDA9983/inc/tmbslHdmiTx.h
|
|
@@ -0,0 +1,4202 @@
|
|
+/**
|
|
+ * Copyright (C) 2006 Koninklijke Philips Electronics N.V., All Rights Reserved.
|
|
+ * This source code and any compilation or derivative thereof is the proprietary
|
|
+ * information of Koninklijke Philips Electronics N.V. and is confidential in
|
|
+ * nature. Under no circumstances is this software to be exposed to or placed
|
|
+ * under an Open Source License of any type without the expressed written
|
|
+ * permission of Koninklijke Philips Electronics N.V.
|
|
+ *
|
|
+ * \file bsl.h
|
|
+ *
|
|
+ * \version $Revision: 41 $
|
|
+ *
|
|
+ * \date $Date: 17/10/07 14:11 $
|
|
+ *
|
|
+ * \brief BSL driver component API for the TDA998x HDMI Transmitter
|
|
+ *
|
|
+ * \section refs Reference Documents
|
|
+ * HDMI Driver - Outline Architecture.doc,
|
|
+ * HDMI Driver - bsl - SCS.doc
|
|
+ *
|
|
+ * \section info Change Information
|
|
+ *
|
|
+ * \verbatim
|
|
+ *
|
|
+ * $History: bsl.h $
|
|
+ *
|
|
+ * ***************** Version 41 ****************
|
|
+ * User: B.Vereecke Date: 17/10/07 Time: 14:11
|
|
+ * Updated in $/Source/bsl/src
|
|
+ * PR872 : add new formats, 1080p24/25/30
|
|
+ *
|
|
+ * ***************** Version 40 *****************
|
|
+ * User: B.Vereecke Date: 17/07/07 Time: 10:30
|
|
+ * Updated in $/Source/bsl/Inc
|
|
+ * PR217 - Add a new Pattern type in bslTestPattern_t
|
|
+ * it is used for set the bluescreen
|
|
+ *
|
|
+ * ***************** Version 39 *****************
|
|
+ * User: J. Lamotte Date: 13/06/07 Time: 12:00
|
|
+ * Updated in $/Source/bsl/Inc
|
|
+ * PR397 - Merge with PR322
|
|
+ * add 9981 API definitions for 9983
|
|
+ * (return NOT_SUPPORTED)
|
|
+ *
|
|
+ * ***************** Version 38 *****************
|
|
+ * User: G. BURNOUF Date: 08/06/07 Time: 10:40
|
|
+ * Updated in $/Source/bsl/Inc
|
|
+ * PR347 - Add new formatPC
|
|
+ *
|
|
+ * ***************** Version 37 *****************
|
|
+ * User: J/ Lamotte Date: 24/04/07 Time: 10:40
|
|
+ * Updated in $/Source/bsl/Inc
|
|
+ * PR50 - Change comment for bslSetAudioPortConfig
|
|
+ * and bslSetVideoPortConfig functions (TDA9981)
|
|
+ *
|
|
+ * ***************** Version 36 *****************
|
|
+ * User: Burnouf Date: 16/04/07 Time: 11:30
|
|
+ * Updated in $/Source/bsl/Inc
|
|
+ * PR50 - add new API bslRxSenseGetStatus for TDA9981
|
|
+ * - add new API only for debug bslFlagSwInt for TDA9981
|
|
+ * - add new index for the new callback interrupt of TDA9981
|
|
+ *
|
|
+ * ***************** Version 35 *****************
|
|
+ * User: J. Lamotte Date: 16/04/07 Time: 11:30
|
|
+ * Updated in $/Source/bsl/Inc
|
|
+ * PR50 - add video and audio port configuration for TDA9981
|
|
+ * bslSetAudioPortConfig and
|
|
+ * bslSetVideoPortConfig
|
|
+ * - define HDMITX_UNITS_MAX (in bsl_local.h before)
|
|
+ *
|
|
+ * ***************** Version 34 *****************
|
|
+ * User: J. Lamotte Date: 25/04/07 Time: 14:40
|
|
+ * Updated in $/Source/bsl/Inc
|
|
+ * PR273 - add PLL configuration before soft reset
|
|
+ * in function bslInit (2 more parameters)
|
|
+ *
|
|
+ * ***************** Version 33 *****************
|
|
+ * User: C. Logiou Date: 08/03/07 Time: 16:52
|
|
+ * Updated in $/Source/bsl/Inc
|
|
+ * PR214 - add new input format repeated 480i/576i
|
|
+ *
|
|
+ * ***************** Version 32 *****************
|
|
+ * User: burnouf Date: 06/02/07 Time: 16:52
|
|
+ * Updated in $/Source/bsl/Inc
|
|
+ * PR49 - add PC Formats
|
|
+ *
|
|
+ * ***************** Version 31 *****************
|
|
+ * User: burnouf Date: 08/01/07 Time: 15:33
|
|
+ * Updated in $/Source/bsl/Inc
|
|
+ * PR72 - add function bslHwGetCapabilities
|
|
+ *
|
|
+ * ***************** Version 30 *****************
|
|
+ * User: Djw Date: 17/11/06 Time: 18:48
|
|
+ * Updated in $/Source/bsl/Inc
|
|
+ * PNF72 - Corrections to doxygen info for
|
|
+ * bslAudioOutSetChanStatus
|
|
+ *
|
|
+ * ***************** Version 28 *****************
|
|
+ * User: Mayhew Date: 10/11/06 Time: 10:35
|
|
+ * Updated in $/Source/bsl/Inc
|
|
+ * PNF68 Add note to bslHdcpConfigure for disabling authentication
|
|
+ * checking
|
|
+ *
|
|
+ * ***************** Version 27 *****************
|
|
+ * User: Mayhew Date: 10/11/06 Time: 10:03
|
|
+ * Updated in $/Source/bsl/Inc
|
|
+ * PNF68 HdcpCheck params thisCheck and maxChecks replaced by
|
|
+ * uTimeSinceLastCallMs, and Check_t values reordered
|
|
+ * PNF68 Params uCheckIntervalMs and uChecksToDo added to
|
|
+ * bslHdcpConfigure
|
|
+ * PNF68 bslHwHandleTimer prototype removed
|
|
+ *
|
|
+ * ***************** Version 26 *****************
|
|
+ * User: Djw Date: 9/11/06 Time: 18:05
|
|
+ * Updated in $/Source/bsl/Inc
|
|
+ * PNF69 Add bslAudioOutSetChanStatus and
|
|
+ * bslAudioOutSetChanStatusMapping
|
|
+ *
|
|
+ * ***************** Version 25 *****************
|
|
+ * User: Mayhew Date: 6/11/06 Time: 17:46
|
|
+ * Updated in $/Source/bsl/Inc
|
|
+ * PNF68 Add bslHwHandleTimer
|
|
+ *
|
|
+ * ***************** Version 23 *****************
|
|
+ * User: Djw Date: 25/10/06 Time: 13:41
|
|
+ * Updated in $/Source/bsl/Inc
|
|
+ * PNF58 Added vinMode parameter to bslVideoInSetSyncAuto
|
|
+ *
|
|
+ * ***************** Version 21 *****************
|
|
+ * User: Mayhew Date: 13/10/06 Time: 11:01
|
|
+ * Updated in $/Source/bsl/Inc
|
|
+ * PNF37 Move arguments from bslVideoInSetConfig,
|
|
+ * bslVideoOutSetSync and bslVideoOutSetFine (deleted)
|
|
+ * to new APIs bslVideoInSetSyncAuto/Manual
|
|
+ *
|
|
+ * ***************** Version 19 *****************
|
|
+ * User: Mayhew Date: 15/09/06 Time: 15:54
|
|
+ * Updated in $/Source/bsl/Inc
|
|
+ * PNF22 Add HdcpCheck API
|
|
+ * PNF23 Add GetOtp API
|
|
+ *
|
|
+ * ***************** Version 17 *****************
|
|
+ * User: Mayhew Date: 4/09/06 Time: 10:03
|
|
+ * Updated in $/Source/bsl/Inc
|
|
+ * PNF20: Add HDMITX_HDCP_OPTION_FORCE_VSLOW_DDC
|
|
+ *
|
|
+ * ***************** Version 15 *****************
|
|
+ * User: Djw Date: 23/08/06 Time: 18:18
|
|
+ * Updated in $/Source/bsl/Inc
|
|
+ * Updated comments for bslctsRef_t enum.
|
|
+ *
|
|
+ * ***************** Version 14 *****************
|
|
+ * User: Djw Date: 21/08/06 Time: 14:02
|
|
+ * Updated in $/Source/bsl/Inc
|
|
+ * Correction to bslTmdsOut_t enum.
|
|
+ *
|
|
+ * ***************** Version 13 *****************
|
|
+ * User: Mayhew Date: 10/07/06 Time: 12:31
|
|
+ * Updated in $/Source/bsl/Inc
|
|
+ * Fix Doxygen comment warnings
|
|
+ *
|
|
+ * ***************** Version 11 *****************
|
|
+ * User: Mayhew Date: 30/06/06 Time: 12:40
|
|
+ * Updated in $/Source/bsl/Inc
|
|
+ * HDMITX_EDID_SINK_ type replaced with HDMITX_SINK_ type for clarity
|
|
+ *
|
|
+ * ***************** Version 9 *****************
|
|
+ * User: Djw Date: 16/06/06 Time: 12:05
|
|
+ * Updated in $/Source/bsl/Inc
|
|
+ * Added flag to Init to support use of alternate i2c address for EDID.
|
|
+ *
|
|
+ * ***************** Version 7 *****************
|
|
+ * User: Mayhew Date: 5/06/06 Time: 14:28
|
|
+ * Updated in $/Source/bsl/Inc
|
|
+ * Add bslHdcpGetT0FailState, bslSysTimerWait. Move error
|
|
+ * codes from _local.h.
|
|
+ *
|
|
+ * ***************** Version 5 *****************
|
|
+ * User: Djw Date: 24/05/06 Time: 11:15
|
|
+ * Updated in $/Source/bsl/Inc
|
|
+ * Added Infoframe packet APIs
|
|
+ *
|
|
+ * ***************** Version 4 *****************
|
|
+ * User: Mayhew Date: 15/05/06 Time: 15:56
|
|
+ * Updated in $/Source/bsl/Inc
|
|
+ * Correct the order of values in bslVoutDbits_t. Add mask to
|
|
+ * bslHdcpOptions_t.
|
|
+ *
|
|
+ * ***************** Version 3 *****************
|
|
+ * User: Mayhew Date: 10/05/06 Time: 16:58
|
|
+ * Updated in $/Source/bsl/Inc
|
|
+ * Added HDCP APIs, ScalerGetMode and HwStartup
|
|
+ *
|
|
+ * ***************** Version 2 *****************
|
|
+ * User: Mayhew Date: 11/04/06 Time: 14:20
|
|
+ * Updated in $/Source/bsl/Inc
|
|
+ * Add HDMITX_UPSAMPLE_AUTO
|
|
+ *
|
|
+ * ***************** Version 1 *****************
|
|
+ * User: Mayhew Date: 4/04/06 Time: 16:27
|
|
+ * Created in $/Source/bsl/Inc
|
|
+ * Driver API phase 2
|
|
+ *
|
|
+ * \endverbatim
|
|
+ *
|
|
+ * */
|
|
+
|
|
+#ifndef BSLHDMITX_H
|
|
+#define BSLHDMITX_H
|
|
+
|
|
+/*============================================================================*/
|
|
+/* COMPILER COMMAND LINE BUILD OPTIONS */
|
|
+/* */
|
|
+/* #define PC Build 8051 Build */
|
|
+/* CONST_DAT const code */
|
|
+/* RAM_DAT (blank) xdata */
|
|
+/* FUNC_PTR (blank) code */
|
|
+/*============================================================================*/
|
|
+
|
|
+/*============================================================================*/
|
|
+/* INCLUDE FILES */
|
|
+/*============================================================================*/
|
|
+#include "tmNxCompId.h"
|
|
+
|
|
+/*============================================================================*/
|
|
+/* MACRO DEFINITIONS */
|
|
+/*============================================================================*/
|
|
+
|
|
+/**
|
|
+ * The maximum number of supported HDMI Transmitter units
|
|
+ * */
|
|
+#define HDMITX_UNITS_MAX 2
|
|
+
|
|
+/** \name Errors
|
|
+ * The group of error codes returned by all API and internal functions
|
|
+ * */
|
|
+/*@{*/
|
|
+/** The base offset for all error codes.
|
|
+ * This needs defining as non-zero if this component is integrated with others
|
|
+ * and all component error ranges are to be kept separate.
|
|
+ * */
|
|
+#define ERR_HDMI_BASE 0x00
|
|
+
|
|
+/** Define the OK code if not defined already */
|
|
+#ifndef TM_OK
|
|
+#define TM_OK 0
|
|
+#endif
|
|
+
|
|
+/** SW interface compatibility error */
|
|
+#define ERR_HDMI_COMPATIBILITY (ERR_HDMI_BASE + 0x001U)
|
|
+
|
|
+/** SW major version error */
|
|
+#define ERR_HDMI_MAJOR_VERSION (ERR_HDMI_BASE + 0x002U)
|
|
+
|
|
+/** SW component version error */
|
|
+#define ERR_HDMI_COMP_VERSION (ERR_HDMI_BASE + 0x003U)
|
|
+
|
|
+/** Invalid device unit number */
|
|
+#define ERR_HDMI_BAD_UNIT_NUMBER (ERR_HDMI_BASE + 0x005U)
|
|
+
|
|
+/** Invalid input parameter other than unit number */
|
|
+#define ERR_HDMI_BAD_PARAMETER (ERR_HDMI_BASE + 0x009U)
|
|
+
|
|
+/** Inconsistent input parameters */
|
|
+#define ERR_HDMI_INCONSISTENT_PARAMS (ERR_HDMI_BASE + 0x010U)
|
|
+
|
|
+/** Component is not initialized */
|
|
+#define ERR_HDMI_NOT_INITIALIZED (ERR_HDMI_BASE + 0x011U)
|
|
+
|
|
+/** Command not supported for current device */
|
|
+#define ERR_HDMI_NOT_SUPPORTED (ERR_HDMI_BASE + 0x013U)
|
|
+
|
|
+/** Initialization failed */
|
|
+#define ERR_HDMI_INIT_FAILED (ERR_HDMI_BASE + 0x014U)
|
|
+
|
|
+/** Component is busy and cannot do a new operation */
|
|
+#define ERR_HDMI_BUSY (ERR_HDMI_BASE + 0x015U)
|
|
+
|
|
+/** I2C read error */
|
|
+#define ERR_HDMI_I2C_READ (ERR_HDMI_BASE + 0x017U)
|
|
+
|
|
+/** I2C write error */
|
|
+#define ERR_HDMI_I2C_WRITE (ERR_HDMI_BASE + 0x018U)
|
|
+
|
|
+/** Assertion failure */
|
|
+#define ERR_HDMI_ASSERTION (ERR_HDMI_BASE + 0x049U)
|
|
+
|
|
+/** Bad EDID block checksum */
|
|
+#define ERR_HDMI_INVALID_STATE (ERR_HDMI_BASE + 0x066U)
|
|
+#define ERR_HDMI_INVALID_CHECKSUM ERR_HDMI_INVALID_STATE
|
|
+
|
|
+/** No connection to HPD pin */
|
|
+#define ERR_HDMI_NULL_CONNECTION (ERR_HDMI_BASE + 0x067U)
|
|
+
|
|
+/** Not allowed in DVI mode */
|
|
+#define ERR_HDMI_OPERATION_NOT_PERMITTED (ERR_HDMI_BASE + 0x068U)
|
|
+
|
|
+/* Maximum error code defined */
|
|
+#define ERR_HDMI_MAX ERR_HDMI_OPERATION_NOT_PERMITTED
|
|
+
|
|
+/*@}*/
|
|
+
|
|
+/** size descriptor block of monitor descriptor */
|
|
+#define EDID_MONITOR_DESCRIPTOR_SIZE 13
|
|
+
|
|
+#define NUMBER_DTD_STORED 10
|
|
+
|
|
+/*============================================================================*/
|
|
+/* ENUM OR TYPE DEFINITIONS */
|
|
+/*============================================================================*/
|
|
+
|
|
+/** Sink category */
|
|
+typedef enum {
|
|
+ HDMITX_SINK_CAT_NOT_REPEATER = 0, /**< Not repeater */
|
|
+ HDMITX_SINK_CAT_REPEATER = 1, /**< repeater */
|
|
+ HDMITX_SINK_CAT_INVALID = 3 /**< Invalid */
|
|
+} bsl_sink_category_t;
|
|
+
|
|
+/*============================================================================*/
|
|
+/**
|
|
+ * basic display parameters structure
|
|
+ * */
|
|
+typedef struct _bsl_edid_bdparam_t {
|
|
+ /**< Video Input Definition */
|
|
+ u8 u_video_input_def;
|
|
+ /**< Max. Horizontal Image Size in cm */
|
|
+ u8 u_max_horizontal_size;
|
|
+ /**< Max. Vertical Image Size in cm */
|
|
+ u8 u_max_vertical_size;
|
|
+ /**< Gamma */
|
|
+ u8 u_gamma;
|
|
+ /**< Feature support */
|
|
+ u8 u_feature_support;
|
|
+} bsl_edid_bdparam_t;
|
|
+
|
|
+/*============================================================================*/
|
|
+/**
|
|
+ * First monitor descriptor structure
|
|
+ * */
|
|
+typedef struct _bsl_edid_first_md_t {
|
|
+ /**< true when parameters of struct are available */
|
|
+ bool b_desc_record;
|
|
+ /**< Monitor Name */
|
|
+ u8 u_monitor_name[EDID_MONITOR_DESCRIPTOR_SIZE];
|
|
+} bsl_edid_first_md_t;
|
|
+
|
|
+/*============================================================================*/
|
|
+/**
|
|
+ * Second monitor descriptor structure
|
|
+ * */
|
|
+typedef struct _bsl_edid_second_md_t {
|
|
+ /**< true when parameters of struct are available */
|
|
+ bool b_desc_record;
|
|
+ /**< Min vertical rate in Hz */
|
|
+ u8 u_min_vertical_rate;
|
|
+ /**< Max vertical rate in Hz */
|
|
+ u8 u_max_vertical_rate;
|
|
+ /**< Min horizontal rate in Hz */
|
|
+ u8 u_min_horizontal_rate;
|
|
+ /**< Max horizontal rate in Hz */
|
|
+ u8 u_max_horizontal_rate;
|
|
+ /**< Max suuported pixel clock rate in MHz */
|
|
+ u8 u_max_supported_pixel_clk;
|
|
+} bsl_edid_second_md_t;
|
|
+
|
|
+/*============================================================================*/
|
|
+/**
|
|
+ * Other monitor descriptor structure
|
|
+ * */
|
|
+typedef struct _bsl_edid_other_md_t {
|
|
+ /**< true when parameters of struct are available */
|
|
+ bool b_desc_record;
|
|
+ /**< Other monitor Descriptor */
|
|
+ u8 u_other_descriptor[EDID_MONITOR_DESCRIPTOR_SIZE];
|
|
+} bsl_edid_other_md_t;
|
|
+
|
|
+/**
|
|
+ * \brief System function pointer type, to call user I2C read/write functions
|
|
+ * \param slaveAddr The I2C slave address
|
|
+ * \param firstRegister The first device register address to read or write
|
|
+ * \param lenData Length of data to read or write (i.e. no. of registers)
|
|
+ * \param pData Pointer to data to write, or to buffer to receive data
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_HDMI_I2C_WRITE: failed when writing
|
|
+ * - ERR_HDMI_I2C_READ: failed when reading
|
|
+ * */
|
|
+typedef struct _bsl_sys_args_t {
|
|
+ u8 slave_addr;
|
|
+ u8 first_register;
|
|
+ u8 len_data;
|
|
+ u8 *p_data;
|
|
+} bsl_sys_args_t;
|
|
+typedef error_code_t (FUNC_PTR *pbsl_sys_func_t)
|
|
+(bsl_sys_args_t *p_sys_args);
|
|
+
|
|
+/**
|
|
+ * \brief System function pointer type, to call user I2C EDID read function
|
|
+ * \param segPtrAddr The EDID segment pointer address 0 to 7Fh
|
|
+ * \param segPtr The EDID segment pointer 0 to 7Fh
|
|
+ * \param dataRegAddr The EDID data register address 0 to 7Fh
|
|
+ * \param wordOffset The first word offset 0 to FFh to read
|
|
+ * \param lenData Length of data to read (i.e. number of registers),
|
|
+ * 1 to max starting at wordOffset
|
|
+ * \param pData Pointer to buffer to receive lenData data bytes
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_HDMI_I2C_WRITE: failed when writing
|
|
+ * - ERR_HDMI_I2C_READ: failed when reading
|
|
+ * */
|
|
+typedef struct _bsl_sys_args_edid_t {
|
|
+ u8 seg_ptr_addr;
|
|
+ u8 seg_ptr;
|
|
+ u8 data_reg_addr;
|
|
+ u8 word_offset;
|
|
+ u8 len_data;
|
|
+ u8 *p_data;
|
|
+} bsl_sys_args_edid_t;
|
|
+typedef error_code_t (FUNC_PTR *pbsl_sys_func_edid_t)
|
|
+(bsl_sys_args_edid_t *p_sys_args);
|
|
+
|
|
+/*============================================================================*/
|
|
+/*
|
|
+ * Timer function pointer type, to call an application timer
|
|
+ * Parameter ms: Delay in milliseconds required
|
|
+ * */
|
|
+typedef void(FUNC_PTR *pbsl_sys_func_timer_t)(u16 ms);
|
|
+
|
|
+/*============================================================================*/
|
|
+/*
|
|
+ * Callback function pointer type, to call a user interrupt handler
|
|
+ * Parameter txUnit: The transmitter unit that interrupted, 0 to max
|
|
+ * */
|
|
+typedef void(FUNC_PTR *pbsl_callback_t)(unit_select_t tx_unit);
|
|
+
|
|
+/*============================================================================*/
|
|
+/**
|
|
+ * EIA/CEA-861B video format type
|
|
+ * */
|
|
+typedef enum {
|
|
+ /**< Not a valid format... */
|
|
+ HDMITX_VFMT_NULL = 0,
|
|
+ /**< ...or no change required */
|
|
+ HDMITX_VFMT_NO_CHANGE = 0,
|
|
+ /**< Lowest valid format */
|
|
+ HDMITX_VFMT_MIN = 1,
|
|
+ /**< Lowest valid TV format */
|
|
+ HDMITX_VFMT_TV_MIN = 1,
|
|
+ /**< Format 01 640 x 480p 60Hz */
|
|
+ hdmitx_vfmt_01_640x480p_60hz = 1,
|
|
+ /**< Format 02 720 x 480p 60Hz */
|
|
+ hdmitx_vfmt_02_720x480p_60hz = 2,
|
|
+ /**< Format 03 720 x 480p 60Hz */
|
|
+ hdmitx_vfmt_03_720x480p_60hz = 3,
|
|
+ /**< Format 04 1280 x 720p 60Hz */
|
|
+ hdmitx_vfmt_04_1280x720p_60hz = 4,
|
|
+ /**< Format 05 1920 x 1080i 60Hz */
|
|
+ hdmitx_vfmt_05_1920x1080i_60hz = 5,
|
|
+ /**< Format 06 720 x 480i 60Hz */
|
|
+ hdmitx_vfmt_06_720x480i_60hz = 6,
|
|
+ /**< Format 07 720 x 480i 60Hz */
|
|
+ hdmitx_vfmt_07_720x480i_60hz = 7,
|
|
+ /**< Format 08 720 x 240p 60Hz */
|
|
+ hdmitx_vfmt_08_720x240p_60hz = 8,
|
|
+ /**< Format 09 720 x 240p 60Hz */
|
|
+ hdmitx_vfmt_09_720x240p_60hz = 9,
|
|
+ /**< Format 10 720 x 480i 60Hz */
|
|
+ hdmitx_vfmt_10_720x480i_60hz = 10,
|
|
+ /**< Format 11 720 x 480i 60Hz */
|
|
+ hdmitx_vfmt_11_720x480i_60hz = 11,
|
|
+ /**< Format 12 720 x 240p 60Hz */
|
|
+ hdmitx_vfmt_12_720x240p_60hz = 12,
|
|
+ /**< Format 13 720 x 240p 60Hz */
|
|
+ hdmitx_vfmt_13_720x240p_60hz = 13,
|
|
+ /**< Format 14 1440 x 480p 60Hz */
|
|
+ hdmitx_vfmt_14_1440x480p_60hz = 14,
|
|
+ /**< Format 15 1440 x 480p 60Hz */
|
|
+ hdmitx_vfmt_15_1440x480p_60hz = 15,
|
|
+ /**< Format 16 1920 x 1080p 60Hz */
|
|
+ hdmitx_vfmt_16_1920x1080p_60hz = 16,
|
|
+ /**< Format 17 720 x 576p 50Hz */
|
|
+ hdmitx_vfmt_17_720x576p_50hz = 17,
|
|
+ /**< Format 18 720 x 576p 50Hz */
|
|
+ hdmitx_vfmt_18_720x576p_50hz = 18,
|
|
+ /**< Format 19 1280 x 720p 50Hz */
|
|
+ hdmitx_vfmt_19_1280x720p_50hz = 19,
|
|
+ /**< Format 20 1920 x 1080i 50Hz */
|
|
+ hdmitx_vfmt_20_1920x1080i_50hz = 20,
|
|
+ /**< Format 21 720 x 576i 50Hz */
|
|
+ hdmitx_vfmt_21_720x576i_50hz = 21,
|
|
+ /**< Format 22 720 x 576i 50Hz */
|
|
+ hdmitx_vfmt_22_720x576i_50hz = 22,
|
|
+ /**< Format 23 720 x 288p 50Hz */
|
|
+ hdmitx_vfmt_23_720x288p_50hz = 23,
|
|
+ /**< Format 24 720 x 288p 50Hz */
|
|
+ hdmitx_vfmt_24_720x288p_50hz = 24,
|
|
+ /**< Format 25 720 x 576i 50Hz */
|
|
+ hdmitx_vfmt_25_720x576i_50hz = 25,
|
|
+ /**< Format 26 720 x 576i 50Hz */
|
|
+ hdmitx_vfmt_26_720x576i_50hz = 26,
|
|
+ /**< Format 27 720 x 288p 50Hz */
|
|
+ hdmitx_vfmt_27_720x288p_50hz = 27,
|
|
+ /**< Format 28 720 x 288p 50Hz */
|
|
+ hdmitx_vfmt_28_720x288p_50hz = 28,
|
|
+ /**< Format 29 1440 x 576p 50Hz */
|
|
+ hdmitx_vfmt_29_1440x576p_50hz = 29,
|
|
+ /**< Format 30 1440 x 576p 50Hz */
|
|
+ hdmitx_vfmt_30_1440x576p_50hz = 30,
|
|
+ /**< Format 31 1920 x 1080p 50Hz */
|
|
+ hdmitx_vfmt_31_1920x1080p_50hz = 31,
|
|
+ /**< Format 32 1920 x 1080p 24Hz */
|
|
+ hdmitx_vfmt_32_1920x1080p_24hz = 32,
|
|
+ /**< Format 33 1920 x 1080p 25Hz */
|
|
+ hdmitx_vfmt_33_1920x1080p_25hz = 33,
|
|
+ /**< Format 34 1920 x 1080p 30Hz */
|
|
+ hdmitx_vfmt_34_1920x1080p_30hz = 34,
|
|
+ /**< Highest valid TV format */
|
|
+ HDMITX_VFMT_TV_MAX = 34,
|
|
+ /**< Lowest TV format without prefetched table */
|
|
+ HDMITX_VFMT_TV_NO_REG_MIN = 32,
|
|
+ /**< Number of TV formats & null */
|
|
+ HDMITX_VFMT_TV_NUM = 35,
|
|
+ /**< Lowest valid PC format */
|
|
+ HDMITX_VFMT_PC_MIN = 128,
|
|
+ /**< PC format 128 */
|
|
+ hdmitx_vfmt_pc_640x480p_60hz = 128,
|
|
+ /**< PC format 129 */
|
|
+ hdmitx_vfmt_pc_800x600p_60hz = 129,
|
|
+ /**< PC format 130 */
|
|
+ hdmitx_vfmt_pc_1152x960p_60hz = 130,
|
|
+ /**< PC format 131 */
|
|
+ hdmitx_vfmt_pc_1024x768p_60hz = 131,
|
|
+ /**< PC format 132 */
|
|
+ hdmitx_vfmt_pc_1280x768p_60hz = 132,
|
|
+ /**< PC format 133 */
|
|
+ hdmitx_vfmt_pc_1280x1024p_60hz = 133,
|
|
+ /**< PC format 134 */
|
|
+ hdmitx_vfmt_pc_1360x768p_60hz = 134,
|
|
+ /**< PC format 135 */
|
|
+ hdmitx_vfmt_pc_1400x1050p_60hz = 135,
|
|
+ /**< PC format 136 */
|
|
+ hdmitx_vfmt_pc_1600x1200p_60hz = 136,
|
|
+ /**< PC format 137 */
|
|
+ hdmitx_vfmt_pc_1024x768p_70hz = 137,
|
|
+ /**< PC format 138 */
|
|
+ hdmitx_vfmt_pc_640x480p_72hz = 138,
|
|
+ /**< PC format 139 */
|
|
+ hdmitx_vfmt_pc_800x600p_72hz = 139,
|
|
+ /**< PC format 140 */
|
|
+ hdmitx_vfmt_pc_640x480p_75hz = 140,
|
|
+ /**< PC format 141 */
|
|
+ hdmitx_vfmt_pc_1024x768p_75hz = 141,
|
|
+ /**< PC format 142 */
|
|
+ hdmitx_vfmt_pc_800x600p_75hz = 142,
|
|
+ /**< PC format 143 */
|
|
+ hdmitx_vfmt_pc_1024x864p_75hz = 143,
|
|
+ /**< PC format 144 */
|
|
+ hdmitx_vfmt_pc_1280x1024p_75hz = 144,
|
|
+ /**< PC format 145 */
|
|
+ hdmitx_vfmt_pc_640x350p_85hz = 145,
|
|
+ /**< PC format 146 */
|
|
+ hdmitx_vfmt_pc_640x400p_85hz = 146,
|
|
+ /**< PC format 147 */
|
|
+ hdmitx_vfmt_pc_720x400p_85hz = 147,
|
|
+ /**< PC format 148 */
|
|
+ hdmitx_vfmt_pc_640x480p_85hz = 148,
|
|
+ /**< PC format 149 */
|
|
+ hdmitx_vfmt_pc_800x600p_85hz = 149,
|
|
+ /**< PC format 150 */
|
|
+ hdmitx_vfmt_pc_1024x768p_85hz = 150,
|
|
+ /**< PC format 151 */
|
|
+ hdmitx_vfmt_pc_1152x864p_85hz = 151,
|
|
+ /**< PC format 152 */
|
|
+ hdmitx_vfmt_pc_1280x960p_85hz = 152,
|
|
+ /**< PC format 153 */
|
|
+ hdmitx_vfmt_pc_1280x1024p_85hz = 153,
|
|
+ /**< PC format 154 */
|
|
+ hdmitx_vfmt_pc_1024x768i_87hz = 154,
|
|
+ /**< Highest valid PC format */
|
|
+ HDMITX_VFMT_PC_MAX = 154,
|
|
+ /**< Number of PC formats */
|
|
+ HDMITX_VFMT_PC_NUM = (1 + 154 - 128)
|
|
+} bsl_vid_fmt_t;
|
|
+
|
|
+/*============================================================================*/
|
|
+/* EXTERN DATA DEFINITIONS */
|
|
+/*============================================================================*/
|
|
+
|
|
+typedef enum {
|
|
+ BSLHDMITX_UNKNOWN = 0x00, /**< IC/IP is not recognized */
|
|
+ BSLHDMITX_TDA9984, /**< IC is a TDA9984 */
|
|
+ BSLHDMITX_TDA9989, /**< IC is a TDA9989 */
|
|
+ BSLHDMITX_LIPP4200, /**< IP is a LIPP4200 */
|
|
+ BSLHDMITX_TDA9981, /**< IC is a TDA9981 */
|
|
+ BSLHDMITX_TDA9983 /**< IC is a TDA9983 */
|
|
+} bsl_version_t;
|
|
+
|
|
+/*============================================================================*/
|
|
+/* EXTERN FUNCTION PROTOTYPES */
|
|
+/*============================================================================*/
|
|
+
|
|
+/*============================================================================*/
|
|
+/**
|
|
+ * \brief Reset the Clock Time Stamp generator in HDMI mode only
|
|
+ *
|
|
+ * \param[in] txUnit Transmitter unit number
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - Else a problem has been detected:
|
|
+ * - ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number
|
|
+ * - ERR_HDMI_NOT_INITIALIZED: transmitter not initialized
|
|
+ * - ERR_HDMI_I2C_WRITE: failed when writing the I2C bus
|
|
+ * - ERR_HDMI_OPERATION_NOT_PERMITTED: in DVI mode
|
|
+ * */
|
|
+error_code_t
|
|
+bsl_audio_in_reset_cts
|
|
+(
|
|
+ unit_select_t tx_unit
|
|
+);
|
|
+
|
|
+/*============================================================================*/
|
|
+/**
|
|
+ * bslAudioInSetConfig() parameter types
|
|
+ * */
|
|
+/** Audio input formats */
|
|
+typedef enum {
|
|
+ HDMITX_AFMT_SPDIF = 0, /**< SPDIF */
|
|
+ HDMITX_AFMT_I2S = 1, /**< I2S */
|
|
+ HDMITX_AFMT_OBA = 2, /**< One bit audio */
|
|
+ HDMITX_AFMT_DSD = 3, /**< DSD */
|
|
+ HDMITX_AFMT_INVALID = 4 /**< Invalid format*/
|
|
+} bsla_fmt_t;
|
|
+
|
|
+/** DSD clock polarities */
|
|
+typedef enum {
|
|
+ HDMITX_CLKPOLDSD_ACLK = 0, /**< Same as ACLK */
|
|
+ HDMITX_CLKPOLDSD_NACLK = 1, /**< Not ACLK, i.e. inverted */
|
|
+ HDMITX_CLKPOLDSD_NO_CHANGE = 2, /**< No change */
|
|
+ HDMITX_CLKPOLDSD_INVALID = 3 /**< Invalid */
|
|
+} bsl_clk_pol_dsd_t;
|
|
+
|
|
+/** DSD data swap values */
|
|
+typedef enum {
|
|
+ HDMITX_SWAPDSD_OFF = 0, /**< No swap */
|
|
+ HDMITX_SWAPDSD_ON = 1, /**< Swap */
|
|
+ HDMITX_SWAPDSD_NO_CHANGE = 2, /**< No change */
|
|
+ HDMITX_SWAPDSD_INVALID = 3 /**< Invalid */
|
|
+} bsl_swap_dsd_t;
|
|
+
|
|
+/** I2S and DSD channel allocation values */
|
|
+enum _bsl_chan {
|
|
+ HDMITX_CHAN_MIN = 0,
|
|
+ HDMITX_CHAN_MAX = 31,
|
|
+ HDMITX_CHAN_NO_CHANGE = 32,
|
|
+ HDMITX_CHAN_INVALID = 33
|
|
+};
|
|
+
|
|
+/** Audio layout values */
|
|
+enum _bsl_layout {
|
|
+ HDMITX_LAYOUT_MIN = 0,
|
|
+ HDMITX_LAYOUT_MAX = 1,
|
|
+ HDMITX_LAYOUT_NO_CHANGE = 2,
|
|
+ HDMITX_LAYOUT_INVALID = 3
|
|
+};
|
|
+
|
|
+/** Audio FIFO read latency values */
|
|
+enum _bsllatency_rd {
|
|
+ HDMITX_LATENCY_MIN = 0x000,
|
|
+ HDMITX_LATENCY_MAX = 0x0FF,
|
|
+ HDMITX_LATENCY_NO_CHANGE = 0x100,
|
|
+ HDMITX_LATENCY_INVALID = 0x101
|
|
+};
|
|
+
|
|
+/**
|
|
+ * \brief Set audio input configuration in HDMI mode only
|
|
+ *
|
|
+ * \param[in] txUnit Transmitter unit number
|
|
+ * \param[in] aFmt Audio input format
|
|
+ * \param[in] chanI2s I2S channel allocation
|
|
+ * \param[in] chanDsd DSD channel allocation
|
|
+ * \param[in] clkPolDsd DSD clock polarity
|
|
+ * \param[in] swapDsd DSD data swap
|
|
+ * \param[in] layout Sample layout
|
|
+ * \param[in] latency_rd Audio FIFO read latency
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - Else a problem has been detected:
|
|
+ * - ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number
|
|
+ * - ERR_HDMI_BAD_PARAMETER: a parameter was out of range
|
|
+ * - ERR_HDMI_NOT_INITIALIZED: transmitter not initialized
|
|
+ * - ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus
|
|
+ * - ERR_HDMI_OPERATION_NOT_PERMITTED: in DVI mode
|
|
+ * */
|
|
+error_code_t
|
|
+bsl_audio_in_set_config
|
|
+(
|
|
+ unit_select_t tx_unit,
|
|
+ bsla_fmt_t a_fmt,
|
|
+ u8 chan_i2s,
|
|
+ u8 chan_dsd,
|
|
+ bsl_clk_pol_dsd_t clk_pol_dsd,
|
|
+ bsl_swap_dsd_t swap_dsd,
|
|
+ u8 layout,
|
|
+ u16 latency_rd
|
|
+);
|
|
+
|
|
+/*============================================================================*/
|
|
+/**
|
|
+ * bslAudioInSetCts() parameter types
|
|
+ * */
|
|
+/** Clock Time Stamp reference source */
|
|
+typedef enum {
|
|
+ HDMITX_CTSREF_ACLK = 0, /**< Clock input pin for I2S */
|
|
+ HDMITX_CTSREF_MCLK = 1, /**< Clock input pin for EXTREF */
|
|
+ HDMITX_CTSREF_FS64SPDIF = 2, /**< 64xsample rate, for SPDIF */
|
|
+ HDMITX_CTSREF_INVALID = 3 /**< Invalid value */
|
|
+} bslcts_ref_t;
|
|
+
|
|
+/** Audio sample rate kHz indexes */
|
|
+typedef enum {
|
|
+ hdmitx_afs_32k = 0, /**< 32kHz */
|
|
+ hdmitx_afs_44_1k = 1, /**< 44.1kHz */
|
|
+ HDMITX_AFS_48K = 2, /**< 48kHz */
|
|
+ HDMITX_AFS_88_2K = 3, /**< 88.2kHz */
|
|
+ HDMITX_AFS_96K = 4, /**< 96kHz */
|
|
+ HDMITX_AFS_176_4K = 5, /**< 176.4kHz */
|
|
+ HDMITX_AFS_192K = 6, /**< 192kHz */
|
|
+ HDMITX_AFS_NOT_INDICATED = 7, /**< Not Indicated (Channel Status) */
|
|
+ HDMITX_AFS_INVALID = 7, /**< Invalid */
|
|
+ HDMITX_AFS_NUM = 7 /**< # rates */
|
|
+} bslafs_t;
|
|
+
|
|
+/** Vertical output frequencies */
|
|
+typedef enum {
|
|
+ hdmitx_vfreq_24hz = 0, /**< 24Hz */
|
|
+ hdmitx_vfreq_25hz = 1, /**< 25Hz */
|
|
+ hdmitx_vfreq_30hz = 2, /**< 30Hz */
|
|
+ hdmitx_vfreq_50hz = 3, /**< 50Hz 0 */
|
|
+ hdmitx_vfreq_59hz = 4, /**< 59.94Hz 1 */
|
|
+ hdmitx_vfreq_60hz = 5, /**< 60Hz 2 */
|
|
+#ifndef FORMAT_PC
|
|
+ HDMITX_VFREQ_INVALID = 6, /**< Invalid */
|
|
+ HDMITX_VFREQ_NUM = 6 /**< No. of values */
|
|
+#else /* FORMAT_PC */
|
|
+ hdmitx_vfreq_70hz = 6, /**< 70Hz */
|
|
+ hdmitx_vfreq_72hz = 7, /**< 72Hz */
|
|
+ hdmitx_vfreq_75hz = 8, /**< 75Hz */
|
|
+ hdmitx_vfreq_85hz = 9, /**< 85Hz */
|
|
+ hdmitx_vfreq_87hz = 10, /**< 87Hz */
|
|
+ HDMITX_VFREQ_INVALID = 11, /**< Invalid */
|
|
+ HDMITX_VFREQ_NUM = 11 /**< No. of values */
|
|
+#endif /* FORMAT_PC */
|
|
+} bsl_vfreq_t;
|
|
+
|
|
+/** Clock Time Stamp predivider - scales N */
|
|
+typedef enum {
|
|
+ HDMITX_CTSK1 = 0, /**< k=1 */
|
|
+ HDMITX_CTSK2 = 1, /**< k=2 */
|
|
+ HDMITX_CTSK3 = 2, /**< k=3 */
|
|
+ HDMITX_CTSK4 = 3, /**< k=4 */
|
|
+ HDMITX_CTSK8 = 4, /**< k=8 */
|
|
+ HDMITX_CTSK_USE_CTSX = 5, /**< Calculate from ctsX factor */
|
|
+ HDMITX_CTSK_INVALID = 6 /**< Invalid */
|
|
+} bslcts_k_t;
|
|
+
|
|
+/** Clock Time Stamp postdivider measured time stamp */
|
|
+typedef enum {
|
|
+ HDMITX_CTSMTS = 0, /**< =mts */
|
|
+ HDMITX_CTSMTS2 = 1, /**< =mts%2 */
|
|
+ HDMITX_CTSMTS4 = 2, /**< =mts%4 */
|
|
+ HDMITX_CTSMTS8 = 3, /**< =mts%8 */
|
|
+ HDMITX_CTSMTS_USE_CTSX = 4, /**< Calculate from ctsX factor */
|
|
+ HDMITX_CTSMTS_INVALID = 5 /**< Invalid */
|
|
+} bslcts_m_t;
|
|
+
|
|
+/** Cycle Time Stamp values */
|
|
+enum _bsl_cts {
|
|
+ HDMITX_CTS_AUTO = 0,
|
|
+ HDMITX_CTS_MIN = 0x000001
|
|
+};
|
|
+
|
|
+/** Cycle Time Stamp X factors */
|
|
+enum _bsl_cts_x {
|
|
+ HDMITX_CTSX_16 = 0,
|
|
+ HDMITX_CTSX_32 = 1,
|
|
+ HDMITX_CTSX_48 = 2,
|
|
+ HDMITX_CTSX_64 = 3,
|
|
+ HDMITX_CTSX_128 = 4,
|
|
+ HDMITX_CTSX_NUM = 5,
|
|
+ /**< CTX value unused when K and Mts used */
|
|
+ HDMITX_CTSX_UNUSED = 5,
|
|
+ HDMITX_CTSX_INVALID = 6
|
|
+};
|
|
+
|
|
+/**
|
|
+ * \brief Set the Clock Time Stamp generator in HDMI mode only
|
|
+ *
|
|
+ * \param[in] txUnit Transmitter unit number
|
|
+ * \param[in] ctsRef Clock Time Stamp reference source
|
|
+ * \param[in] afs Audio input sample frequency
|
|
+ * \param[in] voutFmt Video output format
|
|
+ * \param[in] voutFreq Vertical output frequency
|
|
+ * \param[in] uCts Manual Cycle Time Stamp
|
|
+ * \param[in] uCtsX Clock Time Stamp factor x
|
|
+ * \param[in] ctsK Clock Time Stamp predivider k
|
|
+ * \param[in] ctsM Clock Time Stamp postdivider m
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - Else a problem has been detected:
|
|
+ * - ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number
|
|
+ * - ERR_HDMI_BAD_PARAMETER: a parameter was out of range
|
|
+ * - ERR_HDMI_NOT_INITIALIZED: transmitter not initialized
|
|
+ * - ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus
|
|
+ * - ERR_HDMI_OPERATION_NOT_PERMITTED: in DVI mode
|
|
+ * */
|
|
+error_code_t
|
|
+bsl_audio_in_set_cts
|
|
+(
|
|
+ unit_select_t tx_unit,
|
|
+ bslcts_ref_t cts_ref,
|
|
+ bslafs_t afs,
|
|
+ bsl_vid_fmt_t vout_fmt,
|
|
+ bsl_vfreq_t vout_freq,
|
|
+ u32 u_cts,
|
|
+ u16 u_cts_x,
|
|
+ bslcts_k_t cts_k,
|
|
+ bslcts_m_t cts_m
|
|
+);
|
|
+
|
|
+/*============================================================================*/
|
|
+/**
|
|
+ * bslAudioOutSetChanStatus() parameter types
|
|
+ * */
|
|
+/** BYTE 0: Channel Status Format information */
|
|
+typedef enum {
|
|
+ /**< PCM 2 channels without pre-emphasis */
|
|
+ HDMITX_CSFI_PCM_2CHAN_NO_PRE = 0,
|
|
+ /**< PCM 2 channels with 50us/15us pre-emphasis */
|
|
+ HDMITX_CSFI_PCM_2CHAN_PRE = 1,
|
|
+ /**< PCM Reserved for 2 channels with pre-emphasis */
|
|
+ HDMITX_CSFI_PCM_2CHAN_PRE_RSVD1 = 2,
|
|
+ /**< PCM Reserved for 2 channels with pre-emphasis */
|
|
+ HDMITX_CSFI_PCM_2CHAN_PRE_RSVD2 = 3,
|
|
+ /**< Non-PCM Default state */
|
|
+ HDMITX_CSFI_NOTPCM_DEFAULT = 4,
|
|
+ /**< Invalid value */
|
|
+ HDMITX_CSFI_INVALID = 5
|
|
+} bsl_csformat_info_t;
|
|
+
|
|
+/** BYTE 0: Channel Status Copyright assertion */
|
|
+typedef enum {
|
|
+ HDMITX_CSCOPYRIGHT_PROTECTED = 0, /**< Copyright protected */
|
|
+ HDMITX_CSCOPYRIGHT_UNPROTECTED = 1, /**< Not copyright protected */
|
|
+ HDMITX_CSCOPYRIGHT_INVALID = 2 /**< Invalid value */
|
|
+} bsl_cscopyright_t;
|
|
+
|
|
+/** BYTE 3: Channel Status Clock Accuracy */
|
|
+typedef enum {
|
|
+ HDMITX_CSCLK_LEVEL_II = 0, /**< Level II */
|
|
+ HDMITX_CSCLK_LEVEL_I = 1, /**< Level I */
|
|
+ HDMITX_CSCLK_LEVEL_III = 2, /**< Level III */
|
|
+ HDMITX_CSCLK_NOT_MATCHED = 3, /**< Not matched to sample freq. */
|
|
+ HDMITX_CSCLK_INVALID = 4 /**< Invalid */
|
|
+} bsl_csclk_acc_t;
|
|
+
|
|
+/** BYTE 4: Channel Status Maximum sample word length */
|
|
+typedef enum {
|
|
+ HDMITX_CSMAX_LENGTH_20 = 0, /**< Max word length is 20 bits */
|
|
+ HDMITX_CSMAX_LENGTH_24 = 1, /**< Max word length is 24 bits */
|
|
+ HDMITX_CSMAX_INVALID = 2 /**< Invalid value */
|
|
+} bsl_csmax_word_length_t;
|
|
+
|
|
+/** BYTE 4: Channel Status Sample word length */
|
|
+typedef enum {
|
|
+ /**< Word length is not indicated */
|
|
+ HDMITX_CSWORD_DEFAULT = 0,
|
|
+ /**< Sample length is 20 bits out of max 24 possible */
|
|
+ HDMITX_CSWORD_20_OF_24 = 1,
|
|
+ /**< Sample length is 16 bits out of max 20 possible */
|
|
+ HDMITX_CSWORD_16_OF_20 = 1,
|
|
+ /**< Sample length is 22 bits out of max 24 possible */
|
|
+ HDMITX_CSWORD_22_OF_24 = 2,
|
|
+ /**< Sample length is 18 bits out of max 20 possible */
|
|
+ HDMITX_CSWORD_18_OF_20 = 2,
|
|
+ /**< Reserved - shall not be used */
|
|
+ HDMITX_CSWORD_RESVD = 3,
|
|
+ /**< Sample length is 23 bits out of max 24 possible */
|
|
+ HDMITX_CSWORD_23_OF_24 = 4,
|
|
+ /**< Sample length is 19 bits out of max 20 possible */
|
|
+ HDMITX_CSWORD_19_OF_20 = 4,
|
|
+ /**< Sample length is 24 bits out of max 24 possible */
|
|
+ HDMITX_CSWORD_24_OF_24 = 5,
|
|
+ /**< Sample length is 20 bits out of max 20 possible */
|
|
+ HDMITX_CSWORD_20_OF_20 = 5,
|
|
+ /**< Sample length is 21 bits out of max 24 possible */
|
|
+ HDMITX_CSWORD_21_OF_24 = 6,
|
|
+ /**< Sample length is 17 bits out of max 20 possible */
|
|
+ HDMITX_CSWORD_17_OF_20 = 6,
|
|
+ HDMITX_CSWORD_INVALID = 7 /**< Invalid */
|
|
+} bsl_csword_length_t;
|
|
+
|
|
+/** BYTE 4: Channel Status Original sample frequency */
|
|
+typedef enum {
|
|
+ HDMITX_CSOFREQ_NOT_INDICATED = 0, /**< Not Indicated */
|
|
+ hdmitx_csofreq_192k = 1, /**< 192kHz */
|
|
+ hdmitx_csofreq_12k = 2, /**< 12kHz */
|
|
+ hdmitx_csofreq_176_4k = 3, /**< 176.4kHz */
|
|
+ HDMITX_CSOFREQ_RSVD1 = 4, /**< Reserved */
|
|
+ hdmitx_csofreq_96k = 5, /**< 96kHz */
|
|
+ hdmitx_csofreq_8k = 6, /**< 8kHz */
|
|
+ hdmitx_csofreq_88_2k = 7, /**< 88.2kHz */
|
|
+ hdmitx_csofreq_16k = 8, /**< 16kHz */
|
|
+ hdmitx_csofreq_24k = 9, /**< 24kHz */
|
|
+ hdmitx_csofreq_11_025k = 10, /**< 11.025kHz */
|
|
+ hdmitx_csofreq_22_05k = 11, /**< 22.05kHz */
|
|
+ hdmitx_csofreq_32k = 12, /**< 32kHz */
|
|
+ hdmitx_csofreq_48k = 13, /**< 48kHz */
|
|
+ HDMITX_CSOFREQ_RSVD2 = 14, /**< Reserved */
|
|
+ hdmitx_csofreq_44_1k = 15, /**< 44.1kHz */
|
|
+ HDMITX_CSAFS_INVALID = 16 /**< Invalid value */
|
|
+} bsl_csorig_afs_t;
|
|
+
|
|
+/**
|
|
+ * \brief Set the Channel Status Bytes 0,1,3 & 4
|
|
+ *
|
|
+ * \param[in] txUnit Transmitter unit number
|
|
+ * \param[in] copyright Byte 0 Copyright bit (bit2)
|
|
+ * \param[in] formatInfo Byte 0 Audio sample format (bit1) and additional info (bit345)
|
|
+ * \param[in] categoryCode Byte 1 Category code (bits8-15)
|
|
+ * \param[in] sampleFreq Byte 3 Sample Frequency (bits24-27)
|
|
+ * \param[in] clockAccuracy Byte 3 Clock Accuracy (bits38-31)
|
|
+ * \param[in] maxWordLength Byte 4 Maximum word length (bit32)
|
|
+ * \param[in] wordLength Byte 4 Word length (bits33-35)
|
|
+ * \param[in] origSampleFreq Byte 4 Original Sample Frequency (bits36-39)
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - Else a problem has been detected:
|
|
+ * - ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number
|
|
+ * - ERR_HDMI_BAD_PARAMETER: a parameter was out of range
|
|
+ * - ERR_HDMI_NOT_INITIALIZED: transmitter not initialized
|
|
+ * - ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus
|
|
+ * - ERR_HDMI_OPERATION_NOT_PERMITTED: in DVI mode
|
|
+ *
|
|
+ * \note The consumer use bit (bit0) and Mode bits (bits6-7) are forced to zero.
|
|
+ * Use bslAudioOutSetChanStatusMapping to set CS Byte 2.
|
|
+ *
|
|
+ * */
|
|
+error_code_t
|
|
+bsl_audio_out_set_chan_status
|
|
+(
|
|
+ unit_select_t tx_unit,
|
|
+ bsl_csformat_info_t format_info,
|
|
+ bsl_cscopyright_t copyright,
|
|
+ u8 category_code,
|
|
+ bslafs_t sample_freq,
|
|
+ bsl_csclk_acc_t clock_accuracy,
|
|
+ bsl_csmax_word_length_t max_word_length,
|
|
+ bsl_csword_length_t word_length,
|
|
+ bsl_csorig_afs_t orig_sample_freq
|
|
+);
|
|
+
|
|
+/*============================================================================*/
|
|
+/**
|
|
+ * bslAudioOutSetChanStatusMapping() parameter types
|
|
+ * */
|
|
+/** Channel Status source/channel number limits */
|
|
+enum _bsl_chan_status_chan_limits {
|
|
+ HDMITX_CS_CHANNELS_MAX = 0x0F,
|
|
+ HDMITX_CS_SOURCES_MAX = 0x0F
|
|
+};
|
|
+
|
|
+/**
|
|
+ * \brief Set the Channel Status Byte2 for Audio Port 0
|
|
+ *
|
|
+ * \param[in] txUnit Transmitter unit number
|
|
+ * \param[in] sourceLeft L Source Number: 0 don't take into account, 1-15
|
|
+ * \param[in] channelLeft L Channel Number: 0 don't take into account, 1-15
|
|
+ * \param[in] sourceRight R Source Number: 0 don't take into account, 1-15
|
|
+ * \param[in] channelRight R Channel Number: 0 don't take into account, 1-15
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - Else a problem has been detected:
|
|
+ * - ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number
|
|
+ * - ERR_HDMI_BAD_PARAMETER: a parameter was out of range
|
|
+ * - ERR_HDMI_NOT_INITIALIZED: transmitter not initialized
|
|
+ * - ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus
|
|
+ * - ERR_HDMI_OPERATION_NOT_PERMITTED: in DVI mode
|
|
+ *
|
|
+ * \note Use bslAudioOutSetChanStatus to set all other CS bytes
|
|
+ * This function only sets the mapping for Audio Port 0.
|
|
+ *
|
|
+ * */
|
|
+error_code_t
|
|
+bsl_audio_out_set_chan_status_mapping
|
|
+(
|
|
+ unit_select_t tx_unit,
|
|
+ u8 source_left,
|
|
+ u8 channel_left,
|
|
+ u8 source_right,
|
|
+ u8 channel_right
|
|
+);
|
|
+
|
|
+/*============================================================================*/
|
|
+/**
|
|
+ * bslAudioOutSetMute() parameter type
|
|
+ * */
|
|
+typedef enum {
|
|
+ HDMITX_AMUTE_OFF = 0, /**< Mute off */
|
|
+ HDMITX_AMUTE_ON = 1, /**< Mute on */
|
|
+ HDMITX_AMUTE_INVALID = 2 /**< Invalid */
|
|
+} bsla_mute_t;
|
|
+
|
|
+/**
|
|
+ * \brief Mute or un-mute the audio output by controlling the audio FIFO,
|
|
+ * in HDMI mode only
|
|
+ *
|
|
+ * \param[in] txUnit Transmitter unit number
|
|
+ * \param[in] aMute Audio mute: On, Off
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - Else a problem has been detected:
|
|
+ * - ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number
|
|
+ * - ERR_HDMI_BAD_PARAMETER: a parameter was out of range
|
|
+ * - ERR_HDMI_NOT_INITIALIZED: transmitter not initialized
|
|
+ * - ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus
|
|
+ * - ERR_HDMI_OPERATION_NOT_PERMITTED: in DVI mode
|
|
+ *
|
|
+ * \note bslPktSetGeneralCntrl must be used to control the audio
|
|
+ * mute in outgoing data island packets
|
|
+ *
|
|
+ * */
|
|
+error_code_t
|
|
+bsl_audio_out_set_mute
|
|
+(
|
|
+ unit_select_t tx_unit,
|
|
+ bsla_mute_t a_mute
|
|
+);
|
|
+
|
|
+/*============================================================================*/
|
|
+/**
|
|
+ * \brief Disable an HDMI Transmitter output and destroy its driver
|
|
+ * instance
|
|
+ *
|
|
+ * \param[in] txUnit Transmitter unit number
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - Else a problem has been detected:
|
|
+ * - ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number
|
|
+ * - ERR_HDMI_NOT_INITIALIZED: the unit is not initialized
|
|
+ * - ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus
|
|
+ * */
|
|
+error_code_t
|
|
+bsl_deinit
|
|
+(
|
|
+ unit_select_t tx_unit
|
|
+);
|
|
+
|
|
+/*============================================================================*/
|
|
+/**
|
|
+ * \brief The bslEdidGetAudioCapabilities() parameter type
|
|
+ * */
|
|
+typedef struct _bsl_edid_sad_t {
|
|
+ u8 mode_chans; /* Bits[6:3]: EIA/CEA861 mode; Bits[2:0]: channels */
|
|
+ u8 freqs; /* Bits for each supported frequency */
|
|
+ u8 byte3; /* EIA/CEA861B p83: data depending on audio mode */
|
|
+} bsl_edid_sad_t;
|
|
+
|
|
+/** Number of 3 byte Short Audio Descriptors stored in pEdidAFmts */
|
|
+#define HDMI_TX_SAD_MAX_CNT 10
|
|
+
|
|
+/**
|
|
+ * \brief Get supported audio format(s) from previously read EDID
|
|
+ *
|
|
+ * \param[in] txUnit Transmitter unit number
|
|
+ * \param[out] pEdidAFmts Pointer to the array of structures to receive the
|
|
+ * supported Short Audio Descriptors
|
|
+ * \param[in] aFmtLength Number of SADs supported in buffer pEdidAFmts,
|
|
+ * up to HDMI_TX_SAD_MAX_CNT
|
|
+ * \param[out] pAFmtsAvail Pointer to receive the number of SADs available
|
|
+ * \param[out] pAudioFlags Pointer to the byte to receive the Audio Capability
|
|
+ * Flags
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - Else a problem has been detected:
|
|
+ * - ERR_HDMI_BAD_PARAMETER: a parameter was out of range
|
|
+ * - ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number
|
|
+ * - ERR_HDMI_I2C_READ: failed when reading the I2C bus
|
|
+ * - ERR_HDMI_INVALID_STATE: EDID checksum failure
|
|
+ * - ERR_HDMI_NOT_INITIALIZED: transmitter not initialized
|
|
+ * - ERR_HDMI_NULL_CONNECTION: HPD pin is inactive
|
|
+ *
|
|
+ * \note \verbatim
|
|
+ * Supported Short Audio Descriptors array:
|
|
+ * EdidAFmts[0].ModeChans SAD 1 - Mode byte
|
|
+ * EdidAFmts[0].Freqs SAD 1 - Frequencies byte
|
|
+ * EdidAFmts[0].Byte3 SAD 1 - Byte 3
|
|
+ * ...
|
|
+ * EdidAFmts[n-1].ModeChans SAD n - Mode byte
|
|
+ * EdidAFmts[n-1].Freqs SAD n - Frequencies byte
|
|
+ * EdidAFmts[n-1].Byte3 SAD n - Byte 3
|
|
+ * (Where n is the smaller of aFmtLength and pAFmtAvail)
|
|
+ * \endverbatim
|
|
+ * */
|
|
+error_code_t
|
|
+bsl_edid_get_audio_capabilities
|
|
+(
|
|
+ unit_select_t tx_unit,
|
|
+ bsl_edid_sad_t *p_edid_afmts,
|
|
+ uint a_fmt_length,
|
|
+ uint *p_afmts_avail,
|
|
+ u8 *p_audio_flags
|
|
+);
|
|
+
|
|
+/*============================================================================*/
|
|
+/**
|
|
+ * \brief Get the EDID block count
|
|
+ *
|
|
+ * \param[in] txUnit Transmitter unit number
|
|
+ * \param[out] puEdidBlockCount Pointer to data byte in which to return the
|
|
+ * block count
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - Else a problem has been detected:
|
|
+ * - ERR_HDMI_BAD_PARAMETER: a parameter was out of range
|
|
+ * - ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number
|
|
+ * - ERR_HDMI_I2C_READ: failed when reading the I2C bus
|
|
+ * - ERR_HDMI_INVALID_STATE: EDID checksum failure
|
|
+ * - ERR_HDMI_NOT_INITIALIZED: transmitter not initialized
|
|
+ * - ERR_HDMI_NULL_CONNECTION: HPD pin is inactive
|
|
+ * */
|
|
+error_code_t
|
|
+bsl_edid_get_block_count
|
|
+(
|
|
+ unit_select_t tx_unit,
|
|
+ u8 *pu_edid_block_count
|
|
+);
|
|
+
|
|
+/*============================================================================*/
|
|
+/**
|
|
+ * bslEdidGetBlockData() parameter types
|
|
+ * */
|
|
+/** An enum to represent the current EDID status */
|
|
+enum _bsl_edid_sta_t {
|
|
+ HDMITX_EDID_READ = 0,
|
|
+ HDMITX_EDID_READ_INCOMPLETE = 1,
|
|
+ HDMITX_EDID_ERROR = 2,
|
|
+ HDMITX_EDID_ERROR_INCOMPLETE = 3,
|
|
+ HDMITX_EDID_NOT_READ = 4};
|
|
+
|
|
+/**
|
|
+ * \brief Get raw EDID blocks from the sink device via DDC
|
|
+ *
|
|
+ * \param[in] txUnit Transmitter unit number
|
|
+ * \param[out] pRawEdid Pointer to a buffer supplied by the caller to accept
|
|
+ * the raw EDID data
|
|
+ * \param[in] numBlocks Number of blocks to read
|
|
+ * \param[in] lenRawEdid Length in bytes of the supplied buffer
|
|
+ * \param[out] pEdidStatus Pointer to status value E_EDID_READ or E_EDID_ERROR
|
|
+ * valid only when the return value is 0
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - Else a problem has been detected:
|
|
+ * - ERR_HDMI_BAD_PARAMETER: a parameter was out of range
|
|
+ * - ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number
|
|
+ * - ERR_HDMI_I2C_READ: failed when reading the I2C bus
|
|
+ * - ERR_HDMI_INVALID_STATE: EDID checksum failure
|
|
+ * - ERR_HDMI_NOT_INITIALIZED: transmitter not initialized
|
|
+ * - ERR_HDMI_NULL_CONNECTION: HPD pin is inactive
|
|
+ *
|
|
+ * \note NA
|
|
+ *
|
|
+ * \sa bslEdidGetVideoPreferred,
|
|
+ * bslEdidGetVideoCapabilities
|
|
+ * */
|
|
+error_code_t
|
|
+bsl_edid_get_block_data
|
|
+(
|
|
+ unit_select_t tx_unit,
|
|
+ u8 *p_raw_edid,
|
|
+ int num_blocks,
|
|
+ int len_raw_edid,
|
|
+ u8 *p_edid_status
|
|
+);
|
|
+
|
|
+/*============================================================================*/
|
|
+/**
|
|
+ * bslEdidGetSinkType() parameter types
|
|
+ * */
|
|
+/** Sink device type */
|
|
+typedef enum {
|
|
+ HDMITX_SINK_DVI = 0, /**< DVI */
|
|
+ HDMITX_SINK_HDMI = 1, /**< HDMI */
|
|
+ HDMITX_SINK_EDID = 2, /**< As currently defined in EDID */
|
|
+ HDMITX_SINK_INVALID = 3 /**< Invalid */
|
|
+} bsl_sink_type_t;
|
|
+
|
|
+/**
|
|
+ * \brief Get Sink Type by analysis of EDID content
|
|
+ *
|
|
+ * \param[in] txUnit Transmitter unit number
|
|
+ * \param[out] pSinkType Pointer to returned Sink Type: DVI or HDMI
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - Else a problem has been detected:
|
|
+ * - ERR_HDMI_BAD_PARAMETER: a parameter was out of range
|
|
+ * - ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number
|
|
+ * - ERR_HDMI_I2C_READ: failed when reading the I2C bus
|
|
+ * - ERR_HDMI_INVALID_STATE: EDID checksum failure
|
|
+ * - ERR_HDMI_NOT_INITIALIZED: transmitter not initialized
|
|
+ * - ERR_HDMI_NULL_CONNECTION: HPD pin is inactive
|
|
+ *
|
|
+ * \sa bslEdidGetBlockData
|
|
+ * */
|
|
+error_code_t
|
|
+bsl_edid_get_sink_type
|
|
+(
|
|
+ unit_select_t tx_unit,
|
|
+ bsl_sink_type_t *p_sink_type
|
|
+);
|
|
+
|
|
+/*============================================================================*/
|
|
+/**
|
|
+ * \brief Get Source Physical Address by analysis of EDID content
|
|
+ *
|
|
+ * \param[in] txUnit Transmitter unit number
|
|
+ * \param[out] pSourceAddress Pointer to returned Source Physical Address (ABCDh)
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - Else a problem has been detected:
|
|
+ * - ERR_HDMI_BAD_PARAMETER: a parameter was out of range
|
|
+ * - ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number
|
|
+ * - ERR_HDMI_I2C_READ: failed when reading the I2C bus
|
|
+ * - ERR_HDMI_INVALID_STATE: EDID checksum failure
|
|
+ * - ERR_HDMI_NOT_INITIALIZED: transmitter not initialized
|
|
+ * - ERR_HDMI_NULL_CONNECTION: HPD pin is inactive
|
|
+ *
|
|
+ * \sa bslEdidGetBlockData
|
|
+ * */
|
|
+error_code_t
|
|
+bsl_edid_get_source_address
|
|
+(
|
|
+ unit_select_t tx_unit,
|
|
+ u16 *p_source_address
|
|
+);
|
|
+
|
|
+/*============================================================================*/
|
|
+/**
|
|
+ * bslEdidGetVideoCapabilities() parameter types
|
|
+ * */
|
|
+/** Number of 1 byte Short Video Descriptors stored in pEdidVFmts */
|
|
+#define HDMI_TX_SVD_MAX_CNT 30
|
|
+
|
|
+/** Flag set in Short Video Descriptor to indicate native format */
|
|
+#define HDMI_TX_SVD_NATIVE_MASK 0x80
|
|
+#define HDMI_TX_SVD_NATIVE_NOT 0x7F
|
|
+
|
|
+/** Video capability flags */
|
|
+enum _bsl_vid_cap_t {
|
|
+ HDMITX_VIDCAP_UNDERSCAN = 0x80, /**< Underscan supported */
|
|
+ HDMITX_VIDCAP_YUV444 = 0x40, /**< YCbCr 4:4:4 supported */
|
|
+ HDMITX_VIDCAP_YUV422 = 0x20, /**< YCbCr 4:2:2 supported */
|
|
+ HDMITX_VIDCAP_UNUSED = 0x1F /**< Unused flags */
|
|
+};
|
|
+
|
|
+/**
|
|
+ * \brief Get supported video format(s) from previously read EDID
|
|
+ *
|
|
+ * \param[in] txUnit Transmitter unit number
|
|
+ * \param[out] pEdidVFmts Pointer to the array to receive the supported Short
|
|
+ * Video Descriptors
|
|
+ * \param[in] vFmtLength Number of SVDs supported in buffer pEdidVFmts,
|
|
+ * up to HDMI_TX_SVD_MAX_CNT
|
|
+ * \param[out] pVFmtsAvail Pointer to receive the number of SVDs available
|
|
+ * \param[out] pVidFlags Ptr to the byte to receive Video Capability Flags
|
|
+ * b7: underscan supported
|
|
+ * b6: YCbCr 4:4:4 supported
|
|
+ * b5: YCbCr 4:2:2 supported
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - Else a problem has been detected:
|
|
+ * - ERR_HDMI_BAD_PARAMETER: a parameter was out of range
|
|
+ * - ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number
|
|
+ * - ERR_HDMI_I2C_READ: failed when reading the I2C bus
|
|
+ * - ERR_HDMI_INVALID_STATE: EDID checksum failure
|
|
+ * - ERR_HDMI_NOT_INITIALIZED: transmitter not initialized
|
|
+ * - ERR_HDMI_NULL_CONNECTION: HPD pin is inactive
|
|
+ *
|
|
+ * \note \verbatim
|
|
+ * Supported Short Video Descriptors array:
|
|
+ * (HDMI_TX_SVD_NATIVE_MASK bit set to indicate native format)
|
|
+ * EdidVFmts[0] EIA/CEA Short Video Descriptor 1, or 0
|
|
+ * ...
|
|
+ * EdidVFmts[n-1] EIA/CEA Short Video Descriptor 32, or 0
|
|
+ * (Where n is the smaller of vFmtLength and pVFmtAvail)
|
|
+ * \endverbatim
|
|
+ * \sa bslEdidGetBlockData
|
|
+ * */
|
|
+error_code_t
|
|
+bsl_edid_get_video_capabilities
|
|
+(
|
|
+ unit_select_t tx_unit,
|
|
+ u8 *p_edid_vfmts,
|
|
+ uint v_fmt_length,
|
|
+ uint *p_vfmts_avail,
|
|
+ u8 *p_vid_flags
|
|
+);
|
|
+
|
|
+/*============================================================================*/
|
|
+/**
|
|
+ * \brief The bslEdidGetVideoPreferred() parameter type
|
|
+ * */
|
|
+typedef struct _bsl_edid_dtd_t {
|
|
+ u16 u_pixel_clock; /**< Pixel Clock/10,000 */
|
|
+ u16 u_hactive_pixels; /**< Horizontal Active Pixels */
|
|
+ u16 u_hblank_pixels; /**< Horizontal Blanking Pixels */
|
|
+ u16 u_vactive_lines; /**< Vertical Active Lines */
|
|
+ u16 u_vblank_lines; /**< Vertical Blanking Lines */
|
|
+ u16 u_hsync_offset; /**< Horizontal Sync Offset */
|
|
+ u16 u_hsync_width; /**< Horiz. Sync Pulse Width */
|
|
+ u16 u_vsync_offset; /**< Vertical Sync Offset */
|
|
+ u16 u_vsync_width; /**< Vertical Sync Pulse Width */
|
|
+ u16 u_himage_size; /**< Horizontal Image Size */
|
|
+ u16 u_vimage_size; /**< Vertical Image Size */
|
|
+ u16 u_hborder_pixels; /**< Horizontal Border */
|
|
+ u16 u_vborder_pixels; /**< Vertical Border */
|
|
+ u8 flags; /**< Interlace/sync info */
|
|
+} bsl_edid_dtd_t;
|
|
+
|
|
+/**
|
|
+ * \brief Get preferred video format from previously read EDID
|
|
+ *
|
|
+ * \param[in] txUnit Transmitter unit number
|
|
+ * \param[out] pEdidDTD Pointer to the structure to receive the Detailed
|
|
+ * Timing Descriptor parameters of the preferred video
|
|
+ * format
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - Else a problem has been detected:
|
|
+ * - ERR_HDMI_BAD_PARAMETER: a parameter was out of range
|
|
+ * - ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number
|
|
+ * - ERR_HDMI_I2C_READ: failed when reading the I2C bus
|
|
+ * - ERR_HDMI_INVALID_STATE: EDID checksum failure
|
|
+ * - ERR_HDMI_NOT_INITIALIZED: transmitter not initialized
|
|
+ * - ERR_HDMI_NULL_CONNECTION: HPD pin is inactive
|
|
+ *
|
|
+ * \note \verbatim
|
|
+ * Detailed Timing Descriptor parameters output structure:
|
|
+ * u16 uPixelClock Pixel Clock (MHz/10,000)
|
|
+ * u16 uHActivePixels Horizontal Active Pixels
|
|
+ * u16 uHBlankPixels Horizontal Blanking Pixels
|
|
+ * u16 uVActiveLines Vertical Active Lines
|
|
+ * u16 uVBlankLines Vertical Blanking Lines
|
|
+ * u16 uHSyncOffset Horizontal Sync Offset (Pixels)
|
|
+ * u16 uHSyncWidth Horizontal Sync Pulse Width (Pixels)
|
|
+ * u16 uVSyncOffset Vertical Sync Offset (Lines)
|
|
+ * u16 uVSyncWidth Vertical Sync Pulse Width (Lines)
|
|
+ * u16 uHImageSize Horizontal Image Size (mm)
|
|
+ * u16 uVImageSize Vertical Image Size (mm)
|
|
+ * u16 uHBorderPixels Horizontal Border (Pixels)
|
|
+ * u16 uVborderPixels Vertical Border (Pixels)
|
|
+ * u8 Flags Interlace/sync info
|
|
+ * \endverbatim
|
|
+ * \sa bslEdidGetBlockData
|
|
+ * */
|
|
+error_code_t
|
|
+bsl_edid_get_video_preferred
|
|
+(
|
|
+ unit_select_t tx_unit,
|
|
+ bsl_edid_dtd_t *p_edid_dtd
|
|
+);
|
|
+
|
|
+/**
|
|
+ * \brief Get detailed timing descriptor from previously read EDID
|
|
+ *
|
|
+ * \param[in] txUnit Transmitter unit number
|
|
+ * \param[out] pEdidDTD Pointer to the array to receive the Detailed timing descriptor
|
|
+ *
|
|
+ * \param[in] nb_size Number of DTD supported in buffer pEdidDTD
|
|
+ *
|
|
+ * \param[out] pDTDAvail Pointer to receive the number of DTD available
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - Else a problem has been detected:
|
|
+ * - ERR_HDMI_BAD_PARAMETER: a parameter was out of range
|
|
+ * - ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number
|
|
+ * - ERR_HDMI_INVALID_STATE: EDID not read
|
|
+ * - ERR_HDMI_NOT_INITIALIZED: transmitter not initialized
|
|
+ * */
|
|
+error_code_t
|
|
+bsl_edid_get_detailed_timing_descriptors
|
|
+(
|
|
+ unit_select_t tx_unit,
|
|
+ bsl_edid_dtd_t *p_edid_dtd,
|
|
+ u8 nb_size,
|
|
+ u8 *p_dtda_vail
|
|
+);
|
|
+
|
|
+/*============================================================================*/
|
|
+/**
|
|
+ * bslHdcpCheck() parameter type
|
|
+ * */
|
|
+/** HDCP check result */
|
|
+typedef enum {
|
|
+ HDMITX_HDCP_CHECK_NOT_STARTED = 0, /**< Check not started */
|
|
+ HDMITX_HDCP_CHECK_IN_PROGRESS = 1, /**< No failures, more to do */
|
|
+ HDMITX_HDCP_CHECK_PASS = 2, /**< Final check has passed */
|
|
+ /**< First check failure code */
|
|
+ HDMITX_HDCP_CHECK_FAIL_FIRST = 3,
|
|
+ /**< Driver not AUTHENTICATED */
|
|
+ HDMITX_HDCP_CHECK_FAIL_DRIVER_STATE = 3,
|
|
+ HDMITX_HDCP_CHECK_FAIL_DEVICE_T0 = 4, /**< A T0 interrupt occurred */
|
|
+ HDMITX_HDCP_CHECK_FAIL_DEVICE_RI = 5, /**< Device RI changed */
|
|
+ HDMITX_HDCP_CHECK_FAIL_DEVICE_FSM = 6, /**< Device FSM not 10h */
|
|
+ HDMITX_HDCP_CHECK_NUM = 7 /**< Number of check results */
|
|
+} bsl_hdcp_check_t;
|
|
+
|
|
+/**
|
|
+ * \brief Check the result of an HDCP encryption attempt, called at
|
|
+ * intervals (set by uTimeSinceLastCallMs) after bslHdcpRun
|
|
+ *
|
|
+ * \param[in] txUnit Transmitter unit number
|
|
+ * \param[in] uTimeSinceLastCallMs Time in ms since this was last called
|
|
+ * \param[out] pResult The outcome of the check
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - Else a problem has been detected:
|
|
+ * - ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number
|
|
+ * - ERR_HDMI_BAD_PARAMETER: a parameter was out of range
|
|
+ * - ERR_HDMI_NOT_INITIALIZED: transmitter not initialized
|
|
+ * - ERR_HDMI_I2C_READ: failed when reading the I2C bus
|
|
+ * - ERR_HDMI_I2C_WRITE: failed when writing the I2C bus
|
|
+ * - ERR_HDMI_NOT_SUPPORTED: device does not support HDCP
|
|
+ * */
|
|
+error_code_t
|
|
+bsl_hdcp_check
|
|
+(
|
|
+ unit_select_t tx_unit,
|
|
+ u16 u_time_since_last_call_ms,
|
|
+ bsl_hdcp_check_t *p_result
|
|
+);
|
|
+
|
|
+/*============================================================================*/
|
|
+/**
|
|
+ * bslHdcpConfigure() parameter type
|
|
+ * */
|
|
+/** HDCP DDC slave addresses */
|
|
+enum _bsl_hdcp_slave_address {
|
|
+ HDMITX_HDCP_SLAVE_PRIMARY = 0x74,
|
|
+ HDMITX_HDCP_SLAVE_SECONDARY = 0x76
|
|
+};
|
|
+
|
|
+/** HDCP transmitter modes */
|
|
+typedef enum {
|
|
+ HDMITX_HDCP_TXMODE_NOT_SET = 0,
|
|
+ HDMITX_HDCP_TXMODE_REPEATER = 1,
|
|
+ HDMITX_HDCP_TXMODE_TOP_LEVEL = 2,
|
|
+ HDMITX_HDCP_TXMODE_MAX = 2
|
|
+} bsl_hdcp_tx_mode_t;
|
|
+
|
|
+/** HDCP option flags */
|
|
+typedef enum {
|
|
+ /* Not set: obey PJ result */
|
|
+ HDMITX_HDCP_OPTION_FORCE_PJ_IGNORED = 0x01,
|
|
+ /* Not set: obey BCAPS setting */
|
|
+ HDMITX_HDCP_OPTION_FORCE_SLOW_DDC = 0x02,
|
|
+ /* Not set: obey BCAPS setting */
|
|
+ HDMITX_HDCP_OPTION_FORCE_NO_1_1 = 0x04,
|
|
+ /* Not set: obey BCAPS setting */
|
|
+ HDMITX_HDCP_OPTION_FORCE_REPEATER = 0x08,
|
|
+ /* Not set: obey BCAPS setting */
|
|
+ HDMITX_HDCP_OPTION_FORCE_NO_REPEATER = 0x10,
|
|
+ /* Not set: obey V=V' result */
|
|
+ HDMITX_HDCP_OPTION_FORCE_V_EQU_VBAR = 0x20,
|
|
+ HDMITX_HDCP_OPTION_FORCE_VSLOW_DDC = 0x40,/* Set: 50kHz DDC */
|
|
+ HDMITX_HDCP_OPTION_DEFAULT = 0x00,/* All the above Not Set vals */
|
|
+ /* Only these bits are allowed */
|
|
+ HDMITX_HDCP_OPTION_MASK = 0x7F,
|
|
+ /* These bits are not allowed */
|
|
+ HDMITX_HDCP_OPTION_MASK_BAD = 0x80
|
|
+} bsl_hdcp_options_t;
|
|
+
|
|
+/**
|
|
+ * \brief Configure various HDCP parameters
|
|
+ *
|
|
+ * \param[in] txUnit Transmitter unit number
|
|
+ * \param[in] slaveAddress DDC I2C slave address
|
|
+ * \param[in] txMode Mode of our transmitter device
|
|
+ * \param[in] options Options flags to control behaviour of HDCP
|
|
+ * \param[in] uCheckIntervalMs HDCP check interval in milliseconds
|
|
+ * \param[in] uChecksToDo Number of HDCP checks to do after HDCP starts
|
|
+ * A value of 2 or more is valid for checking
|
|
+ * May be set to 0 to disabling checking
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - Else a problem has been detected:
|
|
+ * - ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number
|
|
+ * - ERR_HDMI_BAD_PARAMETER: a parameter was out of range
|
|
+ * - ERR_HDMI_NOT_INITIALIZED: transmitter not initialized
|
|
+ * - ERR_HDMI_I2C_READ: failed when reading the I2C bus
|
|
+ * - ERR_HDMI_I2C_WRITE: failed when writing the I2C bus
|
|
+ * - ERR_HDMI_NOT_SUPPORTED: device does not support HDCP
|
|
+ *
|
|
+ * \note Must be called before all other HDCP APIs
|
|
+ * */
|
|
+error_code_t
|
|
+bsl_hdcp_configure
|
|
+(
|
|
+ unit_select_t tx_unit,
|
|
+ u8 slave_address,
|
|
+ bsl_hdcp_tx_mode_t tx_mode,
|
|
+ bsl_hdcp_options_t options,
|
|
+ u16 u_check_interval_ms,
|
|
+ u8 u_checks_to_do
|
|
+);
|
|
+
|
|
+/*============================================================================*/
|
|
+/**
|
|
+ * bslHdcpDownloadKeys() parameter type
|
|
+ * */
|
|
+/** HDCP decryption mode */
|
|
+typedef enum {
|
|
+ HDMITX_HDCP_DECRYPT_DISABLE = 0,
|
|
+ HDMITX_HDCP_DECRYPT_ENABLE = 1,
|
|
+ HDMITX_HDCP_DECRYPT_MAX = 1
|
|
+} bsl_decrypt_t;
|
|
+
|
|
+/**
|
|
+ * \brief Download keys and AKSV data from OTP memory to the device
|
|
+ *
|
|
+ * \param[in] txUnit Transmitter unit number
|
|
+ * \param[in] seed Seed value
|
|
+ * \param[in] keyDecryption State of key decryption 0 to 1 (disabled, enabled)
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - Else a problem has been detected:
|
|
+ * - ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number
|
|
+ * - ERR_HDMI_BAD_PARAMETER: a parameter was out of range
|
|
+ * - ERR_HDMI_NOT_INITIALIZED: transmitter not initialized
|
|
+ * - ERR_HDMI_I2C_READ: failed when reading the I2C bus
|
|
+ * - ERR_HDMI_I2C_WRITE: failed when writing the I2C bus
|
|
+ * - ERR_HDMI_NOT_SUPPORTED: device does not support HDCP
|
|
+ * */
|
|
+error_code_t
|
|
+bsl_hdcp_download_keys
|
|
+(
|
|
+ unit_select_t tx_unit,
|
|
+ u16 seed,
|
|
+ bsl_decrypt_t key_decryption
|
|
+);
|
|
+
|
|
+/*============================================================================*/
|
|
+/**
|
|
+ * \brief Switch HDCP encryption on or off without disturbing Infoframes
|
|
+ * (Not normally used)
|
|
+ *
|
|
+ * \param[in] txUnit Transmitter unit number
|
|
+ * \param[in] bOn Encryption state: 1=on, 0=off
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - Else a problem has been detected:
|
|
+ * - ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number
|
|
+ * - ERR_HDMI_BAD_PARAMETER: a parameter was out of range
|
|
+ * - ERR_HDMI_NOT_INITIALIZED: transmitter not initialized
|
|
+ * - ERR_HDMI_I2C_WRITE: failed when writing the I2C bus
|
|
+ * - ERR_HDMI_NOT_SUPPORTED: device does not support HDCP
|
|
+ * */
|
|
+error_code_t
|
|
+bsl_hdcp_encryption_on
|
|
+(
|
|
+ unit_select_t tx_unit,
|
|
+ bool b_on
|
|
+);
|
|
+
|
|
+/*============================================================================*/
|
|
+/**
|
|
+ * \brief Get HDCP OTP registers
|
|
+ *
|
|
+ * \param[in] txUnit Transmitter unit number
|
|
+ * \param[in] otpAddress OTP start address 0-FF
|
|
+ * \param[out] pOtpData Ptr to a three-byte array to hold the data read:
|
|
+ * [0] = OTP_DATA_MSB
|
|
+ * [1] = OTP_DATA_ISB
|
|
+ * [2] = OTP_DATA_LSB
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - Else a problem has been detected:
|
|
+ * - ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number
|
|
+ * - ERR_HDMI_BAD_PARAMETER: a parameter was out of range
|
|
+ * - ERR_HDMI_NOT_INITIALIZED: transmitter not initialized
|
|
+ * - ERR_HDMI_I2C_WRITE: failed when writing the I2C bus
|
|
+ * - ERR_HDMI_NOT_SUPPORTED: device does not support HDCP
|
|
+ * */
|
|
+error_code_t
|
|
+bsl_hdcp_get_otp
|
|
+(
|
|
+ unit_select_t tx_unit,
|
|
+ u8 otp_address,
|
|
+ u8 *p_otp_data
|
|
+);
|
|
+
|
|
+/*============================================================================*/
|
|
+/**
|
|
+ * \brief Return the failure state that caused the last T0 interrupt
|
|
+ *
|
|
+ * \param[in] txUnit Transmitter unit number
|
|
+ * \param[out] pFailState Ptr to the unit's last T0 fail state
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - Else a problem has been detected:
|
|
+ * - ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number
|
|
+ * - ERR_HDMI_BAD_PARAMETER: a parameter was out of range
|
|
+ * - ERR_HDMI_NOT_INITIALIZED: transmitter not initialized
|
|
+ * - ERR_HDMI_NOT_SUPPORTED: device does not support HDCP
|
|
+ * */
|
|
+error_code_t
|
|
+bsl_hdcp_get_t0fail_state
|
|
+(
|
|
+ unit_select_t tx_unit,
|
|
+ u8 *p_fail_state
|
|
+);
|
|
+
|
|
+/*============================================================================*/
|
|
+/**
|
|
+ * \brief Handle BCAPS interrupt
|
|
+ *
|
|
+ * \param[in] txUnit Transmitter unit number
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - Else a problem has been detected:
|
|
+ * - ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number
|
|
+ * - ERR_HDMI_NOT_INITIALIZED: transmitter not initialized
|
|
+ * - ERR_HDMI_I2C_READ: failed when reading the I2C bus
|
|
+ * - ERR_HDMI_I2C_WRITE: failed when writing the I2C bus
|
|
+ *
|
|
+ * \note The user BCAPS interrupt handler (registered with
|
|
+ * bslInit) calls this API before calling
|
|
+ * bslHdcpHandleBKSV
|
|
+ * */
|
|
+error_code_t
|
|
+bsl_hdcp_handle_bcaps
|
|
+(
|
|
+ unit_select_t tx_unit
|
|
+);
|
|
+
|
|
+/*============================================================================*/
|
|
+/**
|
|
+ * \brief Read BKSV registers
|
|
+ *
|
|
+ * \param[in] txUnit Transmitter unit number
|
|
+ * \param[out] pBksv Pointer to 5-byte BKSV array returned to caller
|
|
+ * (1st byte is MSB)
|
|
+ * \param[out] pbCheckRequired Pointer to a result variable to tell the caller
|
|
+ * whether to check for BKSV in a revocation list:
|
|
+ * 0 or 1 (check not required, check required)
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - Else a problem has been detected:
|
|
+ * - ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number
|
|
+ * - ERR_HDMI_BAD_PARAMETER: a parameter was out of range
|
|
+ * - ERR_HDMI_NOT_INITIALIZED: transmitter not initialized
|
|
+ * - ERR_HDMI_I2C_READ: failed when reading the I2C bus
|
|
+ * - ERR_HDMI_I2C_WRITE: failed when writing the I2C bus
|
|
+ *
|
|
+ * \note The user BCAPS interrupt handler (registered with
|
|
+ * bslInit) calls this API after calling
|
|
+ * bslHdcpHandleBCAPS
|
|
+ * */
|
|
+error_code_t
|
|
+bsl_hdcp_handle_bksv
|
|
+(
|
|
+ unit_select_t tx_unit,
|
|
+ u8 *p_bksv,
|
|
+ bool *pb_check_required
|
|
+);
|
|
+
|
|
+/*============================================================================*/
|
|
+/**
|
|
+ * \brief Declare BKSV result to be secure or not secure
|
|
+ *
|
|
+ * \param[in] txUnit Transmitter unit number
|
|
+ * \param[in] bSecure Result of user's check of BKSV against a
|
|
+ * revocation list:
|
|
+ * 0 (not secure: BKSV found in revocation list)
|
|
+ * 1 (secure: BKSV not found in revocation list)
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - Else a problem has been detected:
|
|
+ * - ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number
|
|
+ * - ERR_HDMI_BAD_PARAMETER: a parameter was out of range
|
|
+ * - ERR_HDMI_NOT_INITIALIZED: transmitter not initialized
|
|
+ * - ERR_HDMI_I2C_WRITE: failed when writing the I2C bus
|
|
+ *
|
|
+ * \note The user BCAPS interrupt handler (registered with
|
|
+ * bslInit) calls this API after calling
|
|
+ * bslHdcpHandleBKSV
|
|
+ * */
|
|
+error_code_t
|
|
+bsl_hdcp_handle_bksvresult
|
|
+(
|
|
+ unit_select_t tx_unit,
|
|
+ bool b_secure
|
|
+);
|
|
+
|
|
+/*============================================================================*/
|
|
+/**
|
|
+ * bslHdcpHandleBSTATUS() parameter type
|
|
+ * */
|
|
+/** BSTATUS bit fields */
|
|
+enum _bsl_hdcp_handle_bstatus {
|
|
+ HDMITX_HDCP_BSTATUS_HDMI_MODE = 0x1000,
|
|
+ HDMITX_HDCP_BSTATUS_MAX_CASCADE_EXCEEDED = 0x0800,
|
|
+ HDMITX_HDCP_BSTATUS_CASCADE_DEPTH = 0x0700,
|
|
+ HDMITX_HDCP_BSTATUS_MAX_DEVS_EXCEEDED = 0x0080,
|
|
+ HDMITX_HDCP_BSTATUS_DEVICE_COUNT = 0x007F
|
|
+};
|
|
+
|
|
+/**
|
|
+ * \brief Handle BSTATUS interrupt
|
|
+ *
|
|
+ * \param[in] txUnit Transmitter unit number
|
|
+ * \param[out] pBstatus Pointer to 16-bit BSTATUS value returned to caller
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - Else a problem has been detected:
|
|
+ * - ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number
|
|
+ * - ERR_HDMI_BAD_PARAMETER: a parameter was out of range
|
|
+ * - ERR_HDMI_NOT_INITIALIZED: transmitter not initialized
|
|
+ * - ERR_HDMI_I2C_READ: failed when reading the I2C bus
|
|
+ * - ERR_HDMI_I2C_WRITE: failed when writing the I2C bus
|
|
+ *
|
|
+ * \note Called by user's BSTATUS interrupt handler registered with
|
|
+ * bslInit
|
|
+ * */
|
|
+error_code_t
|
|
+bsl_hdcp_handle_bstatus
|
|
+(
|
|
+ unit_select_t tx_unit,
|
|
+ u16 *p_bstatus
|
|
+);
|
|
+
|
|
+/*============================================================================*/
|
|
+/**
|
|
+ * \brief Handle ENCRYPT interrupt
|
|
+ *
|
|
+ * \param[in] txUnit Transmitter unit number
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - Else a problem has been detected:
|
|
+ * - ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number
|
|
+ * - ERR_HDMI_NOT_INITIALIZED: transmitter not initialized
|
|
+ * - ERR_HDMI_I2C_READ: failed when reading the I2C bus
|
|
+ * - ERR_HDMI_I2C_WRITE: failed when writing the I2C bus
|
|
+ *
|
|
+ * \note Called by user's ENCRYPT interrupt handler registered with
|
|
+ * bslInit
|
|
+ * */
|
|
+error_code_t
|
|
+bsl_hdcp_handle_encrypt
|
|
+(
|
|
+ unit_select_t tx_unit
|
|
+);
|
|
+
|
|
+/*============================================================================*/
|
|
+/**
|
|
+ * \brief Handle PJ interrupt
|
|
+ *
|
|
+ * \param[in] txUnit Transmitter unit number
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - Else a problem has been detected:
|
|
+ * - ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number
|
|
+ * - ERR_HDMI_NOT_INITIALIZED: transmitter not initialized
|
|
+ * - ERR_HDMI_I2C_READ: failed when reading the I2C bus
|
|
+ * - ERR_HDMI_I2C_WRITE: failed when writing the I2C bus
|
|
+ *
|
|
+ * \note Called by user's PJ interrupt handler registered with
|
|
+ * bslInit
|
|
+ * */
|
|
+error_code_t
|
|
+bsl_hdcp_handle_pj
|
|
+(
|
|
+ unit_select_t tx_unit
|
|
+);
|
|
+
|
|
+/*============================================================================*/
|
|
+/**
|
|
+ * bslHdcpHandleSHA_1() parameter types
|
|
+ * */
|
|
+
|
|
+/** KSV list sizes */
|
|
+enum _bsl_hdcp_handle_sha_1 {
|
|
+ HDMITX_KSV_LIST_MAX_DEVICES = 128,
|
|
+ HDMITX_KSV_BYTES_PER_DEVICE = 5
|
|
+};
|
|
+
|
|
+/**
|
|
+ * \brief Handle SHA-1 interrupt
|
|
+ *
|
|
+ * \param[in] txUnit Transmitter unit number
|
|
+ * \param[in] maxKsvDevices Maximum number of 5-byte devices that will fit
|
|
+ * in *pKsvList: 0 to 128 devices
|
|
+ * If 0, no KSV read is done and it is treated as
|
|
+ * secure
|
|
+ * \param[out] pKsvList Pointer to KSV list array supplied by caller:
|
|
+ * Sets of 5-byte KSVs, 1 per device, 1st byte is
|
|
+ * LSB of 1st device
|
|
+ * May be null if maxKsvDevices is 0
|
|
+ * \param[out] pnKsvDevices Pointer to number of KSV devices copied to
|
|
+ *p_ksv_list: 0 to 128
|
|
+ * If 0, no KSV check is needed and it is treated
|
|
+ * as secure
|
|
+ * May be null if maxKsvDevices is 0
|
|
+ *
|
|
+ * \param[out] pDepth Connection tree depth
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - Else a problem has been detected:
|
|
+ * - ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number
|
|
+ * - ERR_HDMI_BAD_PARAMETER: a parameter was out of range
|
|
+ * - ERR_HDMI_NOT_INITIALIZED: transmitter not initialized
|
|
+ * - ERR_HDMI_INCONSISTENT_PARAMS: two parameters disagree
|
|
+ * - ERR_HDMI_I2C_READ: failed when reading the I2C bus
|
|
+ * - ERR_HDMI_I2C_WRITE: failed when writing the I2C bus
|
|
+ *
|
|
+ * \note Called by user's SHA-1 interrupt handler registered with
|
|
+ * bslInit
|
|
+ * */
|
|
+error_code_t
|
|
+bsl_hdcp_handle_sha_1
|
|
+(
|
|
+ unit_select_t tx_unit,
|
|
+ u8 max_ksv_devices,
|
|
+ u8 *p_ksv_list,
|
|
+ u8 *pn_ksv_devices,
|
|
+ /* Connection tree depth returned with KSV list */
|
|
+ u8 *p_depth
|
|
+);
|
|
+
|
|
+/*============================================================================*/
|
|
+/**
|
|
+ * \brief Declare KSV list result to be secure or not secure
|
|
+ *
|
|
+ * \param[in] txUnit Transmitter unit number
|
|
+ * \param[in] bSecure Result of user's check of KSV list against a
|
|
+ * revocation list:
|
|
+ * 0 (not secure: one or more KSVs are in r.list)
|
|
+ * 1 (secure: no KSV found in revocation list)
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - Else a problem has been detected:
|
|
+ * - ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number
|
|
+ * - ERR_HDMI_BAD_PARAMETER: a parameter was out of range
|
|
+ * - ERR_HDMI_NOT_INITIALIZED: transmitter not initialized
|
|
+ * - ERR_HDMI_I2C_WRITE: failed when writing the I2C bus
|
|
+ *
|
|
+ * \note The user SHA_1 interrupt handler (registered with
|
|
+ * bslInit) calls this API after calling
|
|
+ * bslHdcpHandleSHA_1
|
|
+ * */
|
|
+error_code_t
|
|
+bsl_hdcp_handle_sha_1result
|
|
+(
|
|
+ unit_select_t tx_unit,
|
|
+ bool b_secure
|
|
+);
|
|
+
|
|
+/*============================================================================*/
|
|
+/**
|
|
+ * \brief Handle T0 interrupt
|
|
+ *
|
|
+ * \param[in] txUnit Transmitter unit number
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - Else a problem has been detected:
|
|
+ * - ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number
|
|
+ * - ERR_HDMI_NOT_INITIALIZED: transmitter not initialized
|
|
+ * - ERR_HDMI_I2C_WRITE: failed when writing the I2C bus
|
|
+ *
|
|
+ * \note Called by user's T0 interrupt handler registered with
|
|
+ * bslInit
|
|
+ * */
|
|
+error_code_t
|
|
+bsl_hdcp_handle_t0
|
|
+(
|
|
+ unit_select_t tx_unit
|
|
+);
|
|
+
|
|
+/*============================================================================*/
|
|
+/**
|
|
+ * \brief Prepare for HDCP operation
|
|
+ *
|
|
+ * \param[in] txUnit Transmitter unit number
|
|
+ * \param[in] voutFmt Video output format
|
|
+ * \param[in] voutFreq Vertical output frequency
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - Else a problem has been detected:
|
|
+ * - ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number
|
|
+ * - ERR_HDMI_BAD_PARAMETER: a parameter was out of range
|
|
+ * - ERR_HDMI_NOT_INITIALIZED: transmitter not initialized
|
|
+ * - ERR_HDMI_I2C_WRITE: failed when writing the I2C bus
|
|
+ * - ERR_HDMI_NOT_SUPPORTED: device does not support HDCP
|
|
+ *
|
|
+ * \note Must be called before bslHdcpRun
|
|
+ * */
|
|
+error_code_t
|
|
+bsl_hdcp_init
|
|
+(
|
|
+ unit_select_t tx_unit,
|
|
+ bsl_vid_fmt_t vout_fmt,
|
|
+ bsl_vfreq_t vout_freq
|
|
+);
|
|
+
|
|
+/*============================================================================*/
|
|
+/**
|
|
+ * \brief Start HDCP operation
|
|
+ *
|
|
+ * \param[in] txUnit Transmitter unit number
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - Else a problem has been detected:
|
|
+ * - ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number
|
|
+ * - ERR_HDMI_BAD_PARAMETER: a parameter was out of range
|
|
+ * - ERR_HDMI_NOT_INITIALIZED: transmitter not initialized
|
|
+ * - ERR_HDMI_I2C_WRITE: failed when writing the I2C bus
|
|
+ * - ERR_HDMI_NOT_SUPPORTED: device does not support HDCP
|
|
+ *
|
|
+ * \note Must be called after bslHdcpInit
|
|
+ * */
|
|
+error_code_t
|
|
+bsl_hdcp_run
|
|
+(
|
|
+ unit_select_t tx_unit
|
|
+);
|
|
+
|
|
+/*============================================================================*/
|
|
+/**
|
|
+ * \brief Stop HDCP operation, and cease encrypting the output
|
|
+ *
|
|
+ * \param[in] txUnit Transmitter unit number
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - Else a problem has been detected:
|
|
+ * - ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number
|
|
+ * - ERR_HDMI_BAD_PARAMETER: a parameter was out of range
|
|
+ * - ERR_HDMI_NOT_INITIALIZED: transmitter not initialized
|
|
+ * - ERR_HDMI_I2C_WRITE: failed when writing the I2C bus
|
|
+ * - ERR_HDMI_NOT_SUPPORTED: device does not support HDCP
|
|
+ *
|
|
+ * \note This will trigger an Encrypt interrupt
|
|
+ * */
|
|
+error_code_t
|
|
+bsl_hdcp_stop
|
|
+(
|
|
+ unit_select_t tx_unit
|
|
+);
|
|
+
|
|
+/*============================================================================*/
|
|
+/**
|
|
+ * bslHotPlugGetStatus() parameter type
|
|
+ * */
|
|
+typedef enum {
|
|
+ HDMITX_HOTPLUG_INACTIVE = 0, /**< Hotplug inactive */
|
|
+ HDMITX_HOTPLUG_ACTIVE = 1, /**< Hotplug active */
|
|
+ HDMITX_HOTPLUG_INVALID = 2 /**< Invalid Hotplug */
|
|
+} bsl_hot_plug_t;
|
|
+
|
|
+/**
|
|
+ * \brief Get the hot plug input status last read by bslInit
|
|
+ * or bslHwHandleInterrupt
|
|
+ *
|
|
+ * \param[in] txUnit Transmitter unit number
|
|
+ * \param[out] pHotPlugStatus Pointer to returned Hot Plug Detect status
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - Else a problem has been detected:
|
|
+ * - ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number
|
|
+ * - ERR_HDMI_BAD_PARAMETER: a parameter was out of range
|
|
+ * - ERR_HDMI_NOT_INITIALIZED: transmitter not initialized
|
|
+ * */
|
|
+error_code_t
|
|
+bsl_hot_plug_get_status
|
|
+(
|
|
+ unit_select_t tx_unit,
|
|
+ bsl_hot_plug_t *p_hot_plug_status
|
|
+);
|
|
+
|
|
+/*============================================================================*/
|
|
+/**
|
|
+ * bslRxSenseGetStatus() parameter type
|
|
+ * */
|
|
+typedef enum {
|
|
+ HDMITX_RX_SENSE_INACTIVE = 0, /**< RxSense inactive */
|
|
+ HDMITX_RX_SENSE_ACTIVE = 1, /**< RxSense active */
|
|
+ HDMITX_RX_SENSE_INVALID = 2 /**< Invalid RxSense */
|
|
+} bsl_rx_sense_t;
|
|
+
|
|
+/**
|
|
+ * \brief Get the rx sense input status last read by bslInit
|
|
+ * or bslHwHandleInterrupt
|
|
+ *
|
|
+ * \param[in] txUnit Transmitter unit number
|
|
+ * \param[out] pRxSenseStatus Pointer to returned Rx Sense Detect status
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - Else a problem has been detected:
|
|
+ * - ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number
|
|
+ * - ERR_HDMI_BAD_PARAMETER: a parameter was out of range
|
|
+ * - ERR_HDMI_NOT_INITIALIZED: transmitter not initialized
|
|
+ * */
|
|
+error_code_t
|
|
+bsl_rx_sense_get_status
|
|
+(
|
|
+ unit_select_t tx_unit,
|
|
+ bsl_rx_sense_t *p_rx_sense_status
|
|
+);
|
|
+
|
|
+/*============================================================================*/
|
|
+/**
|
|
+ * \brief Get one or more hardware I2C register values
|
|
+ *
|
|
+ * \param[in] txUnit Transmitter unit number
|
|
+ * \param[in] regPage The device register's page: 00h, 01h, 02h, 11h, 12h
|
|
+ * \param[in] regAddr The starting register address on the page: 0 to FFh
|
|
+ * \param[out] pRegBuf Pointer to buffer to receive the register data
|
|
+ * \param[in] nRegs Number of contiguous registers to read: 1 to 254
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - Else a problem has been detected:
|
|
+ * - ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number
|
|
+ * - ERR_HDMI_BAD_PARAMETER: a parameter was out of range
|
|
+ * - ERR_HDMI_NOT_INITIALIZED: transmitter not initialized
|
|
+ * - ERR_HDMI_I2C_READ: failed when reading the I2C bus
|
|
+ * - ERR_HDMI_I2C_WRITE: failed when writing the I2C bus
|
|
+ * */
|
|
+error_code_t
|
|
+bsl_hw_get_registers
|
|
+(
|
|
+ unit_select_t tx_unit,
|
|
+ int reg_page,
|
|
+ int reg_addr,
|
|
+ u8 *p_reg_buf,
|
|
+ int n_regs
|
|
+);
|
|
+
|
|
+/*============================================================================*/
|
|
+/**
|
|
+ * \brief Get the transmitter device version read at initialization
|
|
+ *
|
|
+ * \param[in] txUnit Transmitter unit number
|
|
+ * \param[out] puDeviceVersion Pointer to returned hardware version
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - Else a problem has been detected:
|
|
+ * - ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number
|
|
+ * - ERR_HDMI_BAD_PARAMETER: a parameter was out of range
|
|
+ * - ERR_HDMI_NOT_INITIALIZED: transmitter not initialized
|
|
+ * */
|
|
+error_code_t
|
|
+bsl_hw_get_version
|
|
+(
|
|
+ unit_select_t tx_unit,
|
|
+ u8 *pu_device_version
|
|
+);
|
|
+
|
|
+/*============================================================================*/
|
|
+/**
|
|
+ * bslHwGetCapabilities() parameter type
|
|
+ * */
|
|
+typedef enum {
|
|
+ bsl_hw_none = 0, /**< None feature */
|
|
+ bsl_hw_hdcp = 1, /**< HDCP feature */
|
|
+ bsl_hw_scaler = 2, /**< Scaler feature */
|
|
+ bsl_hw_hdcpscaler = 3, /**< HDCP & Scaler feature */
|
|
+ bsl_hw_all = 3 /**< All feature */
|
|
+} bsl_hw_feature_t;
|
|
+
|
|
+/**
|
|
+ * \brief Get the transmitter device feature read at initialization
|
|
+ *
|
|
+ * \param[in] txUnit Transmitter unit number
|
|
+ * \param[out] pDeviceFeature Pointer to returned hardware feature
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - Else a problem has been detected:
|
|
+ * - ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number
|
|
+ * - ERR_HDMI_BAD_PARAMETER: a parameter was out of range
|
|
+ * - ERR_HDMI_NOT_INITIALIZED: transmitter not initialized
|
|
+ * */
|
|
+error_code_t
|
|
+bsl_hw_get_capabilities
|
|
+(
|
|
+ unit_select_t tx_unit,
|
|
+ bsl_hw_feature_t *p_device_capabilities
|
|
+);
|
|
+
|
|
+/*============================================================================*/
|
|
+/**
|
|
+ * \brief Handle all hardware interrupts from a transmitter unit
|
|
+ *
|
|
+ * \param[in] txUnit Transmitter unit number
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - Else a problem has been detected:
|
|
+ * - ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number
|
|
+ * - ERR_HDMI_BAD_PARAMETER: a parameter was out of range
|
|
+ * - ERR_HDMI_NOT_INITIALIZED: transmitter not initialized
|
|
+ * - ERR_HDMI_I2C_READ: failed when reading the I2C bus
|
|
+ * \note This function must be called at task level not interrupt level,
|
|
+ * as I2C access is required
|
|
+ * */
|
|
+error_code_t
|
|
+bsl_hw_handle_interrupt
|
|
+(
|
|
+ unit_select_t tx_unit
|
|
+);
|
|
+
|
|
+/*============================================================================*/
|
|
+/**
|
|
+ * \brief Set one or more hardware I2C registers
|
|
+ *
|
|
+ * \param[in] txUnit Transmitter unit number
|
|
+ * \param[in] regPage The device register's page: 00h, 01h, 02h, 11h, 12h
|
|
+ * \param[in] regAddr The starting register address on the page: 0 to FFh
|
|
+ * \param[in] pRegBuf Ptr to buffer from which to write the register data
|
|
+ * \param[in] nRegs Number of contiguous registers to write: 0 to 254.
|
|
+ * The page register (255) may not be written - it is
|
|
+ * written to automatically here. If nRegs is 0, the
|
|
+ * page register is the only register written.
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - Else a problem has been detected:
|
|
+ * - ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number
|
|
+ * - ERR_HDMI_BAD_PARAMETER: a parameter was out of range
|
|
+ * - ERR_HDMI_NOT_INITIALIZED: transmitter not initialized
|
|
+ * - ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus
|
|
+ * */
|
|
+error_code_t
|
|
+bsl_hw_set_registers
|
|
+(
|
|
+ unit_select_t tx_unit,
|
|
+ int reg_page,
|
|
+ int reg_addr,
|
|
+ u8 *p_reg_buf,
|
|
+ int n_regs
|
|
+);
|
|
+
|
|
+/*============================================================================*/
|
|
+/**
|
|
+ * \brief Handle hardware startup by resetting Device Instance Data
|
|
+ * */
|
|
+void
|
|
+bsl_hw_startup
|
|
+(
|
|
+ void
|
|
+);
|
|
+
|
|
+/*============================================================================*/
|
|
+/**
|
|
+ * bslInit() parameter types
|
|
+ * */
|
|
+/**
|
|
+ * Supported range of I2C slave addresses
|
|
+ * */
|
|
+enum _bsl_slave_address {
|
|
+ HDMITX_SLAVE_ADDRESS_MIN = 1,
|
|
+ HDMITX_SLAVE_ADDRESS_MAX = 127
|
|
+};
|
|
+
|
|
+/**
|
|
+ * Indexes into the funcCallback[] array of interrupt callback function pointers
|
|
+ * */
|
|
+enum _bsl_callback_int {
|
|
+ HDMITX_CALLBACK_INT_ENCRYPT = 0, /**< HDCP encryption switched off */
|
|
+ HDMITX_CALLBACK_INT_HPD = 1, /**< Transition on HPD input */
|
|
+ HDMITX_CALLBACK_INT_T0 = 2, /**< HDCP state machine in state T0 */
|
|
+ HDMITX_CALLBACK_INT_BCAPS = 3, /**< BCAPS available */
|
|
+ HDMITX_CALLBACK_INT_BSTATUS = 4, /**< BSTATUS available */
|
|
+ HDMITX_CALLBACK_INT_SHA_1 = 5, /**< sha-1(ksv,bstatus,m0)=V' */
|
|
+ HDMITX_CALLBACK_INT_PJ = 6, /**< pj=pj' check fails */
|
|
+#ifndef TMFL_TDA9981_SUPPORT
|
|
+ HDMITX_CALLBACK_INT_UNUSED7 = 7, /**< Unused interrupt */
|
|
+ HDMITX_CALLBACK_INT_NUM = 8 /**< Number of callbacks */
|
|
+#else /* TMFL_TDA9981_SUPPORT */
|
|
+ HDMITX_CALLBACK_INT_R0 = 7, /**< R0 interrupt */
|
|
+ HDMITX_CALLBACK_INT_SW_INT = 8, /**< SW DEBUG interrupt */
|
|
+#ifdef TMFL_RX_SENSE_ON
|
|
+ HDMITX_CALLBACK_INT_RX_SENSE = 9, /**< RX SENSE interrupt */
|
|
+ HDMITX_CALLBACK_INT_NUM = 10 /**< Number of callbacks */
|
|
+#else /* TMFL_RX_SENSE_ON */
|
|
+ HDMITX_CALLBACK_INT_NUM = 9 /**< Number of callbacks */
|
|
+#endif /* TMFL_RX_SENSE_ON */
|
|
+#endif /* TMFL_TDA9981_SUPPORT */
|
|
+};
|
|
+
|
|
+/** Pixel rate */
|
|
+typedef enum {
|
|
+ HDMITX_PIXRATE_DOUBLE = 0, /**< Double pixel rate */
|
|
+ HDMITX_PIXRATE_SINGLE = 1, /**< Single pixel rate */
|
|
+ /**< Single pixel repeated */
|
|
+ HDMITX_PIXRATE_SINGLE_REPEATED = 2,
|
|
+ HDMITX_PIXRATE_NO_CHANGE = 3, /**< No Change */
|
|
+ HDMITX_PIXRATE_INVALID = 4 /**< Invalid */
|
|
+} bsl_pix_rate_t;
|
|
+
|
|
+/**
|
|
+ * \brief The bslInit() parameter structure
|
|
+ * */
|
|
+typedef struct _bsl_callback_list_t {
|
|
+ /** Interrupt callback function pointers (each ptr if null = not used) */
|
|
+ pbsl_callback_t func_callback[HDMITX_CALLBACK_INT_NUM];
|
|
+
|
|
+} bsl_callback_list_t;
|
|
+
|
|
+/**
|
|
+ * \brief Create an instance of an HDMI Transmitter: initialize the
|
|
+ * driver, reset the transmitter device and get the current
|
|
+ * Hot Plug state
|
|
+ *
|
|
+ * \param[in] txUnit Transmitter unit number
|
|
+ * \param[in] uHwAddress Device I2C slave address
|
|
+ * \param[in] sysFuncWrite System function to write I2C
|
|
+ * \param[in] sysFuncRead System function to read I2C
|
|
+ * \param[in] sysFuncEdidRead System function to read EDID blocks via I2C
|
|
+ * \param[in] sysFuncTimer System function to run a timer
|
|
+ * \param[in] funcIntCallbacks Pointer to interrupt callback function list
|
|
+ * The list pointer is null for no callbacks;
|
|
+ * each pointer in the list may also be null.
|
|
+ * \param[in] bEdidAltAddr Use alternative i2c address for EDID data
|
|
+ * register between Driver and TDA9983/2:
|
|
+ * 0 - use default address (A0)
|
|
+ * 1 - use alternative address (A2)
|
|
+ * \param[in] vinFmt EIA/CEA Video input format: 1 to 31, 0 = No Change
|
|
+ * \param[in] pixRate Single data (repeated or not) or double data rate
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - Else a problem has been detected:
|
|
+ * - ERR_HDMI_BAD_UNIT_NUMBER: the unit number is wrong or
|
|
+ * the transmitter instance is already initialised
|
|
+ * - ERR_HDMI_BAD_PARAMETER: a parameter is invalid or out
|
|
+ * of range
|
|
+ * - ERR_HDMI_INIT_FAILED: the unit instance is already
|
|
+ * initialised
|
|
+ * - ERR_HDMI_COMPATIBILITY: the driver is not compatiable
|
|
+ * with the internal device version code
|
|
+ * - ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus
|
|
+ * - ERR_HDMI_I2C_READ: failed when reading the I2C bus
|
|
+ * */
|
|
+error_code_t
|
|
+bsl_init
|
|
+(
|
|
+ unit_select_t tx_unit,
|
|
+ u8 u_hw_address,
|
|
+ pbsl_sys_func_t sys_func_write,
|
|
+ pbsl_sys_func_t sys_func_read,
|
|
+ pbsl_sys_func_edid_t sys_func_edid_read,
|
|
+ pbsl_sys_func_timer_t sys_func_timer,
|
|
+ bsl_callback_list_t *func_int_callbacks,
|
|
+ bool b_edid_alt_addr,
|
|
+ bsl_vid_fmt_t vin_fmt,
|
|
+ bsl_pix_rate_t pix_rate
|
|
+);
|
|
+
|
|
+/*============================================================================*/
|
|
+/**
|
|
+ * bslMatrixSetCoeffs() parameter type
|
|
+ * */
|
|
+/** Parameter structure array size */
|
|
+enum _bsl_mat_coeff {
|
|
+ HDMITX_MAT_COEFF_NUM = 9
|
|
+};
|
|
+
|
|
+/** \brief The bslMatrixSetCoeffs() parameter structure */
|
|
+typedef struct _bsl_mat_coeff_t {
|
|
+ /** Array of coefficients (values -1024 to +1023) */
|
|
+ s16 coeff[HDMITX_MAT_COEFF_NUM];
|
|
+} bsl_mat_coeff_t;
|
|
+
|
|
+/**
|
|
+ * \brief Set colour space converter matrix coefficients
|
|
+ *
|
|
+ * \param[in] txUnit Transmitter unit number
|
|
+ * \param[in] pMatCoeff Pointer to Matrix Coefficient structure
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - Else a problem has been detected:
|
|
+ * - ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number
|
|
+ * - ERR_HDMI_BAD_PARAMETER: a parameter was out of range
|
|
+ * - ERR_HDMI_NOT_INITIALIZED: transmitter not initialized
|
|
+ * - ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus
|
|
+ *
|
|
+ * \note Matrix Coefficient parameter structure:
|
|
+ * s16 Coeff[9]: Array of coefficients (values -1024 to +1023)
|
|
+ * */
|
|
+error_code_t
|
|
+bsl_matrix_set_coeffs
|
|
+(
|
|
+ unit_select_t tx_unit,
|
|
+ bsl_mat_coeff_t *p_mat_coeff
|
|
+);
|
|
+
|
|
+/*============================================================================*/
|
|
+/**
|
|
+ * bslMatrixSetConversion() parameter type
|
|
+ * */
|
|
+/** Video input mode */
|
|
+typedef enum {
|
|
+ HDMITX_VINMODE_CCIR656 = 0, /**< ccir656 */
|
|
+ HDMITX_VINMODE_RGB444 = 1, /**< RGB444 */
|
|
+ HDMITX_VINMODE_YUV444 = 2, /**< YUV444 */
|
|
+ HDMITX_VINMODE_YUV422 = 3, /**< YUV422 */
|
|
+ HDMITX_VINMODE_NO_CHANGE = 4, /**< No change */
|
|
+ HDMITX_VINMODE_INVALID = 5 /**< Invalid */
|
|
+} bsl_vin_mode_t;
|
|
+
|
|
+/** Video output mode */
|
|
+typedef enum {
|
|
+ HDMITX_VOUTMODE_RGB444 = 0, /**< RGB444 */
|
|
+ HDMITX_VOUTMODE_YUV422 = 1, /**< YUV422 */
|
|
+ HDMITX_VOUTMODE_YUV444 = 2, /**< YUV444 */
|
|
+ HDMITX_VOUTMODE_NO_CHANGE = 3, /**< No change */
|
|
+ HDMITX_VOUTMODE_INVALID = 4 /**< Invalid */
|
|
+} bsl_vout_mode_t;
|
|
+
|
|
+/**
|
|
+ * \brief Enum defining possible quantization range
|
|
+ * */
|
|
+typedef enum {
|
|
+ HDMITX_VQR_DEFAULT = 0, /* Follow HDMI spec. */
|
|
+ HDMITX_RGB_FULL = 1, /* Force RGB FULL , DVI only */
|
|
+ HDMITX_RGB_LIMITED = 2 /* Force RGB LIMITED , DVI only */
|
|
+} bsl_vqr_t;
|
|
+
|
|
+/**
|
|
+ * \brief Set colour space conversion using preset values
|
|
+ *
|
|
+ * \param[in] txUnit Transmitter unit number
|
|
+ * \param[in] vinFmt Input video format
|
|
+ * \param[in] vinMode Input video mode
|
|
+ * \param[in] voutFmt Output video format
|
|
+ * \param[in] voutMode Output video mode
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - Else a problem has been detected:
|
|
+ * - ERR_HDMI_BAD_PARAMETER: a parameter was out of range
|
|
+ * - ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number
|
|
+ * - ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus
|
|
+ * - ERR_HDMI_NOT_INITIALIZED: transmitter not initialized
|
|
+ * */
|
|
+error_code_t
|
|
+bsl_matrix_set_conversion
|
|
+(
|
|
+ unit_select_t tx_unit,
|
|
+ bsl_vid_fmt_t vin_fmt,
|
|
+ bsl_vin_mode_t vin_mode,
|
|
+ bsl_vid_fmt_t vout_fmt,
|
|
+ bsl_vout_mode_t vout_mode,
|
|
+ bsl_vqr_t dvi_vqr
|
|
+);
|
|
+
|
|
+/*============================================================================*/
|
|
+/**
|
|
+ * bslMatrixSetInputOffset() parameter type
|
|
+ * */
|
|
+/** Parameter structure array size */
|
|
+enum _bsl_mat_offset {
|
|
+ HDMITX_MAT_OFFSET_NUM = 3
|
|
+};
|
|
+
|
|
+/** \brief The bslMatrixSetInputOffset() parameter structure */
|
|
+typedef struct _bsl_mat_offset_t {
|
|
+ /** Offset array (values -1024 to +1023) */
|
|
+ s16 offset[HDMITX_MAT_OFFSET_NUM];
|
|
+} bsl_mat_offset_t;
|
|
+
|
|
+/** Matrix numeric limits */
|
|
+enum _bsl_mat_limits {
|
|
+ HDMITX_MAT_OFFSET_MIN = -1024,
|
|
+ HDMITX_MAT_OFFSET_MAX = 1023
|
|
+};
|
|
+
|
|
+/**
|
|
+ * \brief Set colour space converter matrix offset at input
|
|
+ *
|
|
+ * \param[in] txUnit Transmitter unit number
|
|
+ * \param[in] pMatOffset Pointer to Matrix Offset structure
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - Else a problem has been detected:
|
|
+ * - ERR_HDMI_BAD_PARAMETER: a parameter was out of range
|
|
+ * - ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number
|
|
+ * - ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus
|
|
+ * - ERR_HDMI_NOT_INITIALIZED: transmitter not initialized
|
|
+ *
|
|
+ * \note Matrix Offset structure parameter structure:
|
|
+ * s16 Offset[3]: Offset array (values -1024 to +1023)
|
|
+ * */
|
|
+error_code_t
|
|
+bsl_matrix_set_input_offset
|
|
+(
|
|
+ unit_select_t tx_unit,
|
|
+ bsl_mat_offset_t *p_mat_offset
|
|
+);
|
|
+
|
|
+/*============================================================================*/
|
|
+/**
|
|
+ * bslMatrixSetMode() parameter types
|
|
+ * */
|
|
+/** Matrix control values */
|
|
+typedef enum {
|
|
+ HDMITX_MCNTRL_ON = 0, /**< Matrix on */
|
|
+ HDMITX_MCNTRL_OFF = 1, /**< Matrix off */
|
|
+ HDMITX_MCNTRL_NO_CHANGE = 2, /**< Matrix unchanged */
|
|
+ HDMITX_MCNTRL_MAX = 2, /**< Max value */
|
|
+ HDMITX_MCNTRL_INVALID = 3 /**< Invalid */
|
|
+} bslm_cntrl_t;
|
|
+
|
|
+/** Matrix scale values */
|
|
+typedef enum {
|
|
+ HDMITX_MSCALE_256 = 0, /**< Factor 1/256 */
|
|
+ HDMITX_MSCALE_512 = 1, /**< Factor 1/512 */
|
|
+ HDMITX_MSCALE_1024 = 2, /**< Factor 1/1024 */
|
|
+ HDMITX_MSCALE_NO_CHANGE = 3, /**< Factor unchanged */
|
|
+ HDMITX_MSCALE_MAX = 3, /**< Max value */
|
|
+ HDMITX_MSCALE_INVALID = 4 /**< Invalid value */
|
|
+} bslm_scale_t;
|
|
+
|
|
+/**
|
|
+ * \brief Set colour space converter matrix mode
|
|
+ *
|
|
+ * \param[in] txUnit Transmitter unit number
|
|
+ * \param[in] mControl Matrix Control: On, Off, No change
|
|
+ * \param[in] mScale Matrix Scale Factor: 1/256, 1/512, 1/1024, No change
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - Else a problem has been detected:
|
|
+ * - ERR_HDMI_BAD_PARAMETER: a parameter was out of range
|
|
+ * - ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number
|
|
+ * - ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus
|
|
+ * - ERR_HDMI_NOT_INITIALIZED: transmitter not initialized
|
|
+ *
|
|
+ * \note NA
|
|
+ *
|
|
+ * \sa NA
|
|
+ * */
|
|
+error_code_t
|
|
+bsl_matrix_set_mode
|
|
+(
|
|
+ unit_select_t tx_unit,
|
|
+ bslm_cntrl_t m_control,
|
|
+ bslm_scale_t m_scale
|
|
+);
|
|
+
|
|
+/*============================================================================*/
|
|
+/**
|
|
+ * \brief Set colour space converter matrix offset at output
|
|
+ *
|
|
+ * \param[in] txUnit Transmitter unit number
|
|
+ * \param[in] pMatOffset Pointer to Matrix Offset structure
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - Else a problem has been detected:
|
|
+ * - ERR_HDMI_BAD_PARAMETER: a parameter was out of range
|
|
+ * - ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number
|
|
+ * - ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus
|
|
+ * - ERR_HDMI_NOT_INITIALIZED: transmitter not initialized
|
|
+ *
|
|
+ * \note Matrix Offset parameter structure:
|
|
+ * nt16 Offset[3]: Offset array (values -1024 to +1023)
|
|
+ * */
|
|
+error_code_t
|
|
+bsl_matrix_set_output_offset
|
|
+(
|
|
+ unit_select_t tx_unit,
|
|
+ bsl_mat_offset_t *p_mat_offset
|
|
+);
|
|
+
|
|
+/*============================================================================*/
|
|
+/**
|
|
+ * \brief Enable audio clock recovery packet insertion
|
|
+ *
|
|
+ * \param[in] txUnit Transmitter unit number
|
|
+ * \param[in] bEnable Enable or disable packet insertion
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - Else a problem has been detected:
|
|
+ * - ERR_HDMI_BAD_PARAMETER: a parameter was out of range
|
|
+ * - ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number
|
|
+ * - ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus
|
|
+ * - ERR_HDMI_NOT_INITIALIZED: transmitter not initialized
|
|
+ * - ERR_HDMI_OPERATION_NOT_PERMITTED: when in DVI mode
|
|
+ *
|
|
+ * \note bslAudioInSetCts sets CTS and N values
|
|
+ * */
|
|
+error_code_t
|
|
+bsl_pkt_set_aclk_recovery
|
|
+(
|
|
+ unit_select_t tx_unit,
|
|
+ bool b_enable
|
|
+);
|
|
+
|
|
+/*============================================================================*/
|
|
+/**
|
|
+ * Data Island Packet structure
|
|
+ * */
|
|
+/** Parameter structure array sizes */
|
|
+enum _bsl_pkt {
|
|
+ HDMITX_PKT_DATA_BYTE_CNT = 28
|
|
+};
|
|
+
|
|
+/** \brief The parameter structure for bslPkt*() APIs */
|
|
+typedef struct _bsl_pkt_t {
|
|
+ u8 data_byte[HDMITX_PKT_DATA_BYTE_CNT]; /**< Packet Data */
|
|
+} bsl_pkt_t;
|
|
+
|
|
+/**
|
|
+ * \brief Set audio content protection packet & enable/disable packet
|
|
+ * insertion
|
|
+ *
|
|
+ * \param[in] txUnit Transmitter unit number
|
|
+ * \param[in] pPkt Pointer to Data Island Packet structure
|
|
+ * \param[in] byteCnt Packet buffer byte count
|
|
+ * \param[in] uAcpType Content protection type
|
|
+ * \param[in] bEnable Enable or disable packet insertion
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - Else a problem has been detected:
|
|
+ * - ERR_HDMI_BAD_PARAMETER: a parameter was out of range
|
|
+ * - ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number
|
|
+ * - ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus
|
|
+ * - ERR_HDMI_INCONSISTENT_PARAMS: pointer suppied with byte count of zero
|
|
+ * - ERR_HDMI_NOT_INITIALIZED: transmitter not initialized
|
|
+ * - ERR_HDMI_NOT_SUPPORTED: not possible with this device
|
|
+ * - ERR_HDMI_OPERATION_NOT_PERMITTED: not allowed in DVI mode
|
|
+ *
|
|
+ * \note Data Island Packet parameter structure:
|
|
+ * u8 dataByte[28] Packet Data
|
|
+ *
|
|
+ * \sa NA
|
|
+ * */
|
|
+error_code_t
|
|
+bsl_pkt_set_acp
|
|
+(
|
|
+ unit_select_t tx_unit,
|
|
+ bsl_pkt_t *p_pkt,
|
|
+ uint byte_cnt,
|
|
+ u8 u_acp_type,
|
|
+ bool b_enable
|
|
+);
|
|
+
|
|
+/*============================================================================*/
|
|
+/**
|
|
+ * \brief The Audio Infoframe Parameter structure
|
|
+ * */
|
|
+typedef struct _bsl_pkt_aif_t {
|
|
+ u8 coding_type; /**< Coding Type 0 to 0Fh */
|
|
+ u8 channel_count; /**< Channel Count 0 to 07h */
|
|
+ u8 sample_freq; /**< Sample Frequency 0 to 07h */
|
|
+ u8 sample_size; /**< Sample Size 0 to 03h */
|
|
+ u8 channel_alloc; /**< Channel Allocation 0 to FFh */
|
|
+ bool down_mix_inhibit; /**< Downmix inhibit flag 0/1 */
|
|
+ u8 level_shift; /**< Level Shift 0 to 0Fh */
|
|
+} bsl_pkt_aif_t;
|
|
+
|
|
+/**
|
|
+ * \brief Set audio info frame packet & enable/disable packet insertion
|
|
+ *
|
|
+ * \param[in] txUnit Transmitter unit number
|
|
+ * \param[in] pPkt Pointer to Audio Infoframe structure
|
|
+ * \param[in] bEnable Enable or disable packet insertion
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - Else a problem has been detected:
|
|
+ * - ERR_HDMI_BAD_PARAMETER: a parameter was out of range
|
|
+ * - ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number
|
|
+ * - ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus
|
|
+ * - ERR_HDMI_NOT_INITIALIZED: transmitter not initialized
|
|
+ * - ERR_HDMI_OPERATION_NOT_PERMITTED: not allowed in DVI mode
|
|
+ *
|
|
+ * \note Audio Infoframe structure:
|
|
+ * u8 CodingType
|
|
+ * u8 ChannelCount
|
|
+ * u8 SampleFreq
|
|
+ * u8 SampleSize
|
|
+ * u8 ChannelAlloc
|
|
+ * bool DownMixInhibit
|
|
+ * u8 LevelShift
|
|
+ * */
|
|
+error_code_t
|
|
+bsl_pkt_set_audio_infoframe
|
|
+(
|
|
+ unit_select_t tx_unit,
|
|
+ bsl_pkt_aif_t *p_pkt,
|
|
+ bool b_enable
|
|
+);
|
|
+
|
|
+/*============================================================================*/
|
|
+/**
|
|
+ * \brief Set contents of general control packet & enable/disable
|
|
+ * packet insertion
|
|
+ *
|
|
+ * \param[in] txUnit Transmitter unit number
|
|
+ * \param[in] paMute Pointer to Audio Mute; if NULL, no change to packet
|
|
+ * contents is made
|
|
+ * \param[in] bEnable Enable or disable packet insertion
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - Else a problem has been detected:
|
|
+ * - ERR_HDMI_BAD_PARAMETER: a parameter was out of range
|
|
+ * - ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number
|
|
+ * - ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus
|
|
+ * - ERR_HDMI_NOT_INITIALIZED: transmitter not initialized
|
|
+ * - ERR_HDMI_OPERATION_NOT_PERMITTED: not allowed in DVI mode
|
|
+ *
|
|
+ * \note bslAudioOutSetMute must be used to mute the audio output
|
|
+ * */
|
|
+error_code_t
|
|
+bsl_pkt_set_general_cntrl
|
|
+(
|
|
+ unit_select_t tx_unit,
|
|
+ bsla_mute_t *pa_mute,
|
|
+ bool b_enable
|
|
+);
|
|
+
|
|
+/*============================================================================*/
|
|
+/**
|
|
+ * \brief Set ISRC1 packet & enable/disable packet insertion
|
|
+ *
|
|
+ * \param[in] txUnit Transmitter unit number
|
|
+ * \param[in] pPkt Pointer to Data Island Packet structure
|
|
+ * \param[in] byteCnt Packet buffer byte count
|
|
+ * \param[in] bIsrcCont ISRC continuation flag
|
|
+ * \param[in] bIsrcValid ISRC valid flag
|
|
+ * \param[in] uIsrcStatus ISRC Status
|
|
+ * \param[in] bEnable Enable or disable packet insertion
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - Else a problem has been detected:
|
|
+ * - ERR_HDMI_BAD_PARAMETER: a parameter was out of range
|
|
+ * - ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number
|
|
+ * - ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus
|
|
+ * - ERR_HDMI_INCONSISTENT_PARAMS: pointer suppied with byte count of zero
|
|
+ * - ERR_HDMI_NOT_INITIALIZED: transmitter not initialized
|
|
+ * - ERR_HDMI_NOT_SUPPORTED: not possible with this device
|
|
+ * - ERR_HDMI_OPERATION_NOT_PERMITTED: not allowed in DVI mode
|
|
+ *
|
|
+ * \note Data Island Packet parameter structure:
|
|
+ * u8 dataByte[28] Packet Data
|
|
+ *
|
|
+ * \sa NA
|
|
+ * */
|
|
+error_code_t
|
|
+bsl_pkt_set_isrc1
|
|
+(
|
|
+ unit_select_t tx_unit,
|
|
+ bsl_pkt_t *p_pkt,
|
|
+ uint byte_cnt,
|
|
+ bool b_isrc_cont,
|
|
+ bool b_isrc_valid,
|
|
+ u8 u_isrc_status,
|
|
+ bool b_enable
|
|
+);
|
|
+
|
|
+/*============================================================================*/
|
|
+/**
|
|
+ * \brief Set ISRC2 packet & enable/disable packet insertion
|
|
+ *
|
|
+ * \param[in] txUnit Transmitter unit number
|
|
+ * \param[in] pPkt Pointer to Data Island Packet structure
|
|
+ * \param[in] byteCnt Packet buffer byte count
|
|
+ * \param[in] bEnable Enable or disable packet insertion
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - Else a problem has been detected:
|
|
+ * - ERR_HDMI_BAD_PARAMETER: a parameter was out of range
|
|
+ * - ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number
|
|
+ * - ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus
|
|
+ * - ERR_HDMI_INCONSISTENT_PARAMS: pointer suppied with byte count of zero
|
|
+ * - ERR_HDMI_NOT_INITIALIZED: transmitter not initialized
|
|
+ * - ERR_HDMI_NOT_SUPPORTED: not possible with this device
|
|
+ * - ERR_HDMI_OPERATION_NOT_PERMITTED: not allowed in DVI mode
|
|
+ *
|
|
+ * \note Data Island Packet parameter structure:
|
|
+ * u8 dataByte[28] Packet Data
|
|
+ *
|
|
+ * \sa NA
|
|
+ * */
|
|
+error_code_t
|
|
+bsl_pkt_set_isrc2
|
|
+(
|
|
+ unit_select_t tx_unit,
|
|
+ bsl_pkt_t *p_pkt,
|
|
+ uint byte_cnt,
|
|
+ bool b_enable
|
|
+);
|
|
+
|
|
+/*============================================================================*/
|
|
+/**
|
|
+ * bslPktSetMpegInfoframe() parameter types
|
|
+ * */
|
|
+/** MPEG frame types */
|
|
+typedef enum {
|
|
+ HDMITX_MPEG_FRAME_UNKNOWN = 0, /**< Unknown */
|
|
+ HDMITX_MPEG_FRAME_I = 1, /**< i-frame */
|
|
+ HDMITX_MPEG_FRAME_B = 2, /**< b-frame */
|
|
+ HDMITX_MPEG_FRAME_P = 3, /**< p-frame */
|
|
+ HDMITX_MPEG_FRAME_INVALID = 4 /**< Invalid */
|
|
+} bsl_mpeg_frame_t;
|
|
+
|
|
+/** \brief The MPEG Infoframe Parameter structure */
|
|
+typedef struct _bsl_pkt_mpeg_t {
|
|
+ u32 bit_rate; /**< MPEG bit rate in Hz */
|
|
+ bsl_mpeg_frame_t frame_type; /**< MPEG frame type */
|
|
+ /**< 0: new field, 1:repeated field */
|
|
+ bool b_field_repeat;
|
|
+} bsl_pkt_mpeg_t;
|
|
+
|
|
+/**
|
|
+ * \brief Set MPEG infoframe packet & enable/disable packet insertion
|
|
+ *
|
|
+ * \param[in] txUnit Transmitter unit number
|
|
+ * \param[in] pPkt Pointer to MPEG Infoframe structure
|
|
+ * \param[in] bEnable Enable or disable packet insertion
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - Else a problem has been detected:
|
|
+ * - ERR_HDMI_BAD_PARAMETER: a parameter was out of range
|
|
+ * - ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number
|
|
+ * - ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus
|
|
+ * - ERR_HDMI_NOT_INITIALIZED: transmitter not initialized
|
|
+ * - ERR_HDMI_NOT_SUPPORTED: not possible with this device
|
|
+ * - ERR_HDMI_OPERATION_NOT_PERMITTED: not allowed in DVI mode
|
|
+ *
|
|
+ * \note MPEG Infoframe structure:
|
|
+ * u32 bitRate
|
|
+ * bslMpegFrame_t frameType
|
|
+ * bool bFieldRepeat
|
|
+ *
|
|
+ * \sa NA
|
|
+ * */
|
|
+error_code_t
|
|
+bsl_pkt_set_mpeg_infoframe
|
|
+(
|
|
+ unit_select_t tx_unit,
|
|
+ bsl_pkt_mpeg_t *p_pkt,
|
|
+ bool b_enable
|
|
+);
|
|
+
|
|
+/*============================================================================*/
|
|
+/**
|
|
+ * \brief Enable NULL packet insertion
|
|
+ *
|
|
+ * \param[in] txUnit Transmitter unit number
|
|
+ * \param[in] bEnable Enable or disable packet insertion
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - Else a problem has been detected:
|
|
+ * - ERR_HDMI_BAD_PARAMETER: a parameter was out of range
|
|
+ * - ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number
|
|
+ * - ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus
|
|
+ * - ERR_HDMI_NOT_INITIALIZED: transmitter not initialized
|
|
+ * - ERR_HDMI_OPERATION_NOT_PERMITTED: not allowed in DVI mode
|
|
+ * */
|
|
+error_code_t
|
|
+bsl_pkt_set_null_insert
|
|
+(
|
|
+ unit_select_t tx_unit,
|
|
+ bool b_enable
|
|
+);
|
|
+
|
|
+/*============================================================================*/
|
|
+/**
|
|
+ * \brief Set single NULL packet insertion (flag auto-resets after
|
|
+ * transmission)
|
|
+ *
|
|
+ * \param[in] txUnit Transmitter unit number
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - Else a problem has been detected:
|
|
+ * - ERR_HDMI_BAD_PARAMETER: a parameter was out of range
|
|
+ * - ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number
|
|
+ * - ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus
|
|
+ * - ERR_HDMI_NOT_INITIALIZED: transmitter not initialized
|
|
+ * - ERR_HDMI_OPERATION_NOT_PERMITTED: not allowed in DVI mode
|
|
+ *
|
|
+ * \note Operation resets after single transmission
|
|
+ * */
|
|
+error_code_t
|
|
+bsl_pkt_set_null_single
|
|
+(
|
|
+ unit_select_t tx_unit
|
|
+);
|
|
+
|
|
+/*============================================================================*/
|
|
+/**
|
|
+ * Source Product Description Infoframe Parameter types
|
|
+ * */
|
|
+/** SDI frame types */
|
|
+typedef enum {
|
|
+ HDMITX_SPD_INFO_UNKNOWN = 0,
|
|
+ HDMITX_SPD_INFO_DIGITAL_STB = 1,
|
|
+ HDMITX_SPD_INFO_DVD = 2,
|
|
+ HDMITX_SPD_INFO_DVHS = 3,
|
|
+ HDMITX_SPD_INFO_HDD_VIDEO = 4,
|
|
+ HDMITX_SPD_INFO_DVC = 5,
|
|
+ HDMITX_SPD_INFO_DSC = 6,
|
|
+ HDMITX_SPD_INFO_VIDEO_CD = 7,
|
|
+ HDMITX_SPD_INFO_GAME = 8,
|
|
+ HDMITX_SPD_INFO_PC = 9,
|
|
+ HDMITX_SPD_INFO_INVALID = 10
|
|
+} bsl_source_dev_t;
|
|
+
|
|
+#define HDMI_TX_SPD_VENDOR_SIZE 8
|
|
+#define HDMI_TX_SPD_DESCR_SIZE 16
|
|
+#define HDMI_TX_SPD_LENGTH 25
|
|
+
|
|
+/** \brief The Source Product Description Infoframe Parameter structure */
|
|
+typedef struct _bsl_pkt_spd_t {
|
|
+ /**< Vendor name */
|
|
+ u8 vendor_name[HDMI_TX_SPD_VENDOR_SIZE];
|
|
+ /**< Product Description */
|
|
+ u8 prod_descr[HDMI_TX_SPD_DESCR_SIZE];
|
|
+ /**< Source Device Info */
|
|
+ bsl_source_dev_t source_dev_info;
|
|
+} bsl_pkt_spd_t;
|
|
+
|
|
+/**
|
|
+ * \brief Set audio info frame packet & enable/disable packet insertion
|
|
+ *
|
|
+ * \param[in] txUnit Transmitter unit number
|
|
+ * \param[in] pPkt Pointer to Audio Infoframe structure
|
|
+ * \param[in] bEnable Enable or disable packet insertion
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - Else a problem has been detected:
|
|
+ * - ERR_HDMI_BAD_PARAMETER: a parameter was out of range
|
|
+ * - ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number
|
|
+ * - ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus
|
|
+ * - ERR_HDMI_NOT_INITIALIZED: transmitter not initialized
|
|
+ * - ERR_HDMI_NOT_SUPPORTED: not possible with this device
|
|
+ * - ERR_HDMI_OPERATION_NOT_PERMITTED: not allowed in DVI mode
|
|
+ *
|
|
+ * \note Audio Infoframe structure:
|
|
+ * u8 VendorName[8]
|
|
+ * u8 ProdDescr[16]
|
|
+ * bslSourceDev_t SourceDevInfo
|
|
+ * */
|
|
+error_code_t
|
|
+bsl_pkt_set_spd_infoframe
|
|
+(
|
|
+ unit_select_t tx_unit,
|
|
+ bsl_pkt_spd_t *p_pkt,
|
|
+ bool b_enable
|
|
+);
|
|
+
|
|
+/*============================================================================*/
|
|
+/**
|
|
+ * \brief The Video Infoframe Parameter structure
|
|
+ * */
|
|
+typedef struct _bsl_pkt_vif_t {
|
|
+ u8 colour; /**< 0 to 03h */
|
|
+ bool active_info; /**< 0/1 */
|
|
+ u8 bar_info; /**< 0 to 03h */
|
|
+ u8 scan_info; /**< 0 to 03h */
|
|
+ u8 colorimetry; /**< 0 to 03h */
|
|
+ u8 picture_aspect_ratio; /**< 0 to 03h */
|
|
+ u8 active_format_ratio; /**< 0 to 0Fh */
|
|
+ u8 scaling; /**< 0 to 03h */
|
|
+ u8 vid_format; /**< 0 to 7Fh */
|
|
+ u8 pixel_repeat; /**< 0 to 0Fh */
|
|
+ u16 end_top_bar_line;
|
|
+ u16 start_bottom_bar_line;
|
|
+ u16 end_left_bar_pixel;
|
|
+ u16 start_right_bar_pixel;
|
|
+} bsl_pkt_vif_t;
|
|
+
|
|
+/**
|
|
+ * \brief Set video infoframe packet & enable/disable packet insertion
|
|
+ *
|
|
+ * \param[in] txUnit Transmitter unit number
|
|
+ * \param[in] pPkt Pointer to Video Infoframe structure
|
|
+ * \param[in] bEnable Enable or disable packet insertion
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - Else a problem has been detected:
|
|
+ * - ERR_HDMI_BAD_PARAMETER: a parameter was out of range
|
|
+ * - ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number
|
|
+ * - ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus
|
|
+ * - ERR_HDMI_NOT_INITIALIZED: transmitter not initialized
|
|
+ * - ERR_HDMI_OPERATION_NOT_PERMITTED: not allowed in DVI mode
|
|
+ *
|
|
+ * \note Video Infoframe structure:
|
|
+ * u8 Colour
|
|
+ * bool ActiveInfo
|
|
+ * u8 BarInfo
|
|
+ * u8 ScanInfo
|
|
+ * u8 Colorimetry
|
|
+ * u8 PictureAspectRatio
|
|
+ * u8 ActiveFormatRatio
|
|
+ * u8 Scaling
|
|
+ * u8 VidFormat
|
|
+ * u8 PixelRepeat
|
|
+ * u16 EndTopBarLine
|
|
+ * u16 StartBottomBarLine
|
|
+ * u16 EndLeftBarPixel
|
|
+ * u16 StartRightBarPixel (incorrectly named in [HDMI1.2])
|
|
+ * */
|
|
+error_code_t
|
|
+bsl_pkt_set_video_infoframe
|
|
+(
|
|
+ unit_select_t tx_unit,
|
|
+ bsl_pkt_vif_t *p_pkt,
|
|
+ bool b_enable
|
|
+);
|
|
+
|
|
+/*============================================================================*/
|
|
+/**
|
|
+ * \brief Set Vendor Specific Infoframe packet & enable/disable packet insertion
|
|
+ *
|
|
+ * \param[in] txUnit Transmitter unit number
|
|
+ * \param[in] pPkt Pointer to Data Island Packet structure
|
|
+ * \param[in] byteCnt Packet buffer byte count
|
|
+ * \param[in] uVersion Version number for packet header
|
|
+ * \param[in] bEnable Enable or disable packet insertion
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - Else a problem has been detected:
|
|
+ * - ERR_HDMI_BAD_PARAMETER: a parameter was out of range
|
|
+ * - ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number
|
|
+ * - ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus
|
|
+ * - ERR_HDMI_INCONSISTENT_PARAMS: pointer suppied with byte count of zero
|
|
+ * - ERR_HDMI_NOT_INITIALIZED: transmitter not initialized
|
|
+ * - ERR_HDMI_NOT_SUPPORTED: not possible with this device
|
|
+ * - ERR_HDMI_OPERATION_NOT_PERMITTED: not allowed in DVI mode
|
|
+ *
|
|
+ * \note Data Island Packet parameter structure:
|
|
+ * u8 dataByte[28] Packet Data (only use 27 bytes max)
|
|
+ *
|
|
+ * \sa NA
|
|
+ * */
|
|
+error_code_t
|
|
+bsl_pkt_set_vs_infoframe
|
|
+(
|
|
+ unit_select_t tx_unit,
|
|
+ bsl_pkt_t *p_pkt,
|
|
+ uint byte_cnt,
|
|
+ u8 u_version,
|
|
+ bool b_enable
|
|
+);
|
|
+
|
|
+/*============================================================================*/
|
|
+/**
|
|
+ * \brief Get the power state of the transmitter
|
|
+ *
|
|
+ * \param[in] txUnit Transmitter unit number
|
|
+ * \param[out] pePowerState Pointer to the power state of the device now
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - Else a problem has been detected:
|
|
+ * - ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number
|
|
+ * - ERR_HDMI_BAD_PARAMETER: a parameter was out of range
|
|
+ * - ERR_HDMI_NOT_INITIALIZED: transmitter not initialized
|
|
+ *
|
|
+ * \note Power states:
|
|
+ * - tmPowerOn
|
|
+ * - tmPowerStandby
|
|
+ * */
|
|
+error_code_t
|
|
+bsl_power_get_state
|
|
+(
|
|
+ unit_select_t tx_unit,
|
|
+ p_power_state_t pe_power_state
|
|
+);
|
|
+
|
|
+/*============================================================================*/
|
|
+/**
|
|
+ * \brief Set the power state of the transmitter
|
|
+ *
|
|
+ * \param[in] txUnit Transmitter unit number
|
|
+ * \param[in] ePowerState Power state to set
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - Else a problem has been detected:
|
|
+ * - ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number
|
|
+ * - ERR_HDMI_BAD_PARAMETER: a parameter was out of range
|
|
+ * - ERR_HDMI_NOT_INITIALIZED: transmitter not initialized
|
|
+ * - ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus
|
|
+ *
|
|
+ * \note Power states (Off and Suspend are treated the same as Standby):
|
|
+ * - tmPowerOn
|
|
+ * - tmPowerStandby
|
|
+ * - tmPowerSuspend
|
|
+ * - tmPowerOff
|
|
+ * */
|
|
+error_code_t
|
|
+bsl_power_set_state
|
|
+(
|
|
+ unit_select_t tx_unit,
|
|
+ power_state_t e_power_state
|
|
+);
|
|
+
|
|
+/*============================================================================*/
|
|
+/**
|
|
+ * \brief Reset the HDMI transmitter
|
|
+ *
|
|
+ * \param[in] txUnit Transmitter unit number
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - Else a problem has been detected:
|
|
+ * - ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number
|
|
+ * - ERR_HDMI_BAD_PARAMETER: a parameter was out of range
|
|
+ * - ERR_HDMI_NOT_INITIALIZED: transmitter not initialized
|
|
+ * - ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus
|
|
+ *
|
|
+ * \note NA
|
|
+ *
|
|
+ * \sa bslInit
|
|
+ * */
|
|
+error_code_t
|
|
+bsl_reset
|
|
+(
|
|
+ unit_select_t tx_unit
|
|
+);
|
|
+
|
|
+/*============================================================================*/
|
|
+/**
|
|
+ * \brief The bslScalerGet() parameter type
|
|
+ * */
|
|
+typedef struct _bsl_scaler_diag_t {
|
|
+ u16 max_buffill_p; /**< Filling primary video buffer */
|
|
+ u16 max_buffill_d; /**< Filling video deinterlaced buffer */
|
|
+ u8 max_fifofill_pi; /**< Filling primary video input FIFO */
|
|
+ u8 min_fifofill_po1; /**< Filling primary video output FIFO #1 */
|
|
+ u8 min_fifofill_po2; /**< Filling primary video output FIFO #2 */
|
|
+ u8 min_fifofill_po3; /**< Filling primary video output FIFO #3 */
|
|
+ u8 min_fifofill_po4; /**< Filling primary video output FIFO #4 */
|
|
+ u8 max_fifofill_di; /**< Filling deinterlaced video input FIFO */
|
|
+ u8 max_fifofill_do; /**< Filling deinterlaced video output FIFO */
|
|
+} bsl_scaler_diag_t;
|
|
+
|
|
+/**
|
|
+ * \brief Get diagnostic counters from the scaler
|
|
+ *
|
|
+ * \param[in] txUnit Transmitter unit number
|
|
+ * \param[out] pScalerDiag Pointer to structure to receive scaler diagnostic
|
|
+ * registers
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - Else a problem has been detected:
|
|
+ * - ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number
|
|
+ * - ERR_HDMI_BAD_PARAMETER: a parameter was out of range
|
|
+ * - ERR_HDMI_NOT_INITIALIZED: transmitter not initialized
|
|
+ * - ERR_HDMI_I2C_READ: failed when reading the I2C bus
|
|
+ *
|
|
+ * \note scaler diagnostic registers structure:
|
|
+ * u16 maxBuffill_p Filling primary video buffer
|
|
+ * u16 maxBuffill_d Filling video deinterlaced buffer
|
|
+ * u8 maxFifofill_pi Filling primary video input FIFO
|
|
+ * u8 minFifofill_po1 Filling primary video output FIFO #1
|
|
+ * u8 minFifofill_po2 Filling primary video output FIFO #2
|
|
+ * u8 minFifofill_po3 Filling primary video output FIFO #3
|
|
+ * u8 minFifofill_po4 Filling primary video output FIFO #4
|
|
+ * u8 maxFifofill_di Filling deinterlaced video input FIFO
|
|
+ * u8 maxFifofill_do Filling deinterlaced video output FIFO
|
|
+ * */
|
|
+error_code_t
|
|
+bsl_scaler_get
|
|
+(
|
|
+ unit_select_t tx_unit,
|
|
+ bsl_scaler_diag_t *p_scaler_diag
|
|
+);
|
|
+
|
|
+/*============================================================================*/
|
|
+/**
|
|
+ * bslScalerGetMode() parameter types
|
|
+ * */
|
|
+/** Scaler modes */
|
|
+typedef enum {
|
|
+ HDMITX_SCAMODE_OFF = 0, /**< Off */
|
|
+ HDMITX_SCAMODE_ON = 1, /**< On */
|
|
+ HDMITX_SCAMODE_AUTO = 2, /**< Auto */
|
|
+ HDMITX_SCAMODE_NO_CHANGE = 3, /**< No change */
|
|
+ HDMITX_SCAMODE_INVALID = 4 /**< Invalid */
|
|
+} bsl_sca_mode_t;
|
|
+
|
|
+/**
|
|
+ * \brief Get the current scaler mode
|
|
+ *
|
|
+ * \param[in] txUnit Transmitter unit number
|
|
+ * \param[out] pScalerMode Pointer to variable to receive scaler mode
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - Else a problem has been detected:
|
|
+ * - ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number
|
|
+ * - ERR_HDMI_BAD_PARAMETER: a parameter was out of range
|
|
+ * - ERR_HDMI_NOT_INITIALIZED: transmitter not initialized
|
|
+ * */
|
|
+error_code_t
|
|
+bsl_scaler_get_mode
|
|
+(
|
|
+ unit_select_t tx_unit,
|
|
+ bsl_sca_mode_t *p_scaler_mode
|
|
+);
|
|
+
|
|
+/*============================================================================*/
|
|
+/**
|
|
+ * \brief Enable or disable scaler input frame
|
|
+ *
|
|
+ * \param[in] txUnit Transmitter unit number
|
|
+ * \param[in] bDisable Enable or disable scaler input
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - Else a problem has been detected:
|
|
+ * - ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number
|
|
+ * - ERR_HDMI_BAD_PARAMETER: a parameter was out of range
|
|
+ * - ERR_HDMI_NOT_INITIALIZED: transmitter not initialized
|
|
+ * - ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus
|
|
+ * */
|
|
+error_code_t
|
|
+bsl_scaler_in_disable
|
|
+(
|
|
+ unit_select_t tx_unit,
|
|
+ bool b_disable
|
|
+);
|
|
+
|
|
+/*============================================================================*/
|
|
+/**
|
|
+ * bslScalerSetCoeffs() parameter types
|
|
+ * */
|
|
+/** Scaler lookup table selection */
|
|
+typedef enum {
|
|
+ HDMITX_SCALUT_DEFAULT_TAB1 = 0, /**< Use default table 1 */
|
|
+ HDMITX_SCALUT_DEFAULT_TAB2 = 1, /**< Use default table 2 */
|
|
+ HDMITX_SCALUT_USE_VSLUT = 2, /**< Use vsLut parameter */
|
|
+ HDMITX_SCALUT_INVALID = 3 /**< Invalid value */
|
|
+} bsl_sca_lut_t;
|
|
+
|
|
+/** Scaler control parameter structure array size */
|
|
+enum _bslvs_lut {
|
|
+ HDMITX_VSLUT_COEFF_NUM = 45
|
|
+};
|
|
+
|
|
+/**
|
|
+ * \brief Set the active coefficient lookup table for the vertical scaler
|
|
+ *
|
|
+ * \param[in] txUnit Transmitter unit number
|
|
+ * \param[in] lutSel Coefficient lookup table selection
|
|
+ * \param[in] pVsLut Table of HDMITX_VSLUT_COEFF_NUM coefficient values
|
|
+ * (may be null if lutSel not HDMITX_SCALUT_USE_VSLUT)
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - Else a problem has been detected:
|
|
+ * - ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number
|
|
+ * - ERR_HDMI_BAD_PARAMETER: a parameter was out of range
|
|
+ * - ERR_HDMI_INCONSISTENT_PARAMS: two parameters disagree
|
|
+ * - ERR_HDMI_NOT_INITIALIZED: transmitter not initialized
|
|
+ * - ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus
|
|
+ * */
|
|
+error_code_t
|
|
+bsl_scaler_set_coeffs
|
|
+(
|
|
+ unit_select_t tx_unit,
|
|
+ bsl_sca_lut_t lut_sel,
|
|
+ u8 *p_vs_lut
|
|
+);
|
|
+
|
|
+/*============================================================================*/
|
|
+/**
|
|
+ * bslScalerSetFieldOrder() parameter types
|
|
+ * */
|
|
+/** IntExt values */
|
|
+typedef enum {
|
|
+ HDMITX_INTEXT_INTERNAL = 0, /**< Internal */
|
|
+ HDMITX_INTEXT_EXTERNAL = 1, /**< External */
|
|
+ HDMITX_INTEXT_NO_CHANGE = 2, /**< No change */
|
|
+ HDMITX_INTEXT_INVALID = 3 /**< Invalid */
|
|
+} bsl_int_ext_t;
|
|
+
|
|
+/** TopSel values */
|
|
+typedef enum {
|
|
+ HDMITX_TOPSEL_INTERNAL = 0, /**< Internal */
|
|
+ HDMITX_TOPSEL_VRF = 1, /**< VRF */
|
|
+ HDMITX_TOPSEL_NO_CHANGE = 2, /**< No change */
|
|
+ HDMITX_TOPSEL_INVALID = 3 /**< Invalid */
|
|
+} bsl_top_sel_t;
|
|
+
|
|
+/** TopTgl values */
|
|
+typedef enum {
|
|
+ HDMITX_TOPTGL_NO_ACTION = 0, /**< NO action */
|
|
+ HDMITX_TOPTGL_TOGGLE = 1, /**< Toggle */
|
|
+ HDMITX_TOPTGL_NO_CHANGE = 2, /**< No change */
|
|
+ HDMITX_TOPTGL_INVALID = 3 /**< Invalid */
|
|
+} bsl_top_tgl_t;
|
|
+
|
|
+/**
|
|
+ * \brief Set scaler field positions
|
|
+ *
|
|
+ * \param[in] txUnit Transmitter unit number
|
|
+ * \param[in] topExt Internal, External, No Change
|
|
+ * \param[in] deExt Internal, External, No Change
|
|
+ * \param[in] topSel Internal, VRF, No Change
|
|
+ * \param[in] topTgl No Action, Toggle, No Change
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - Else a problem has been detected:
|
|
+ * - ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number
|
|
+ * - ERR_HDMI_BAD_PARAMETER: a parameter was out of range
|
|
+ * - ERR_HDMI_NOT_INITIALIZED: transmitter not initialized
|
|
+ * - ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus
|
|
+ * */
|
|
+error_code_t
|
|
+bsl_scaler_set_field_order
|
|
+(
|
|
+ unit_select_t tx_unit,
|
|
+ bsl_int_ext_t top_ext,
|
|
+ bsl_int_ext_t de_ext,
|
|
+ bsl_top_sel_t top_sel,
|
|
+ bsl_top_tgl_t top_tgl
|
|
+);
|
|
+
|
|
+/*============================================================================*/
|
|
+/**
|
|
+ * bslScalerSetFine() parameter types
|
|
+ * */
|
|
+/** Reference pixel values */
|
|
+enum _bsl_scaler_fine_pixel_limits {
|
|
+ HDMITX_SCALER_FINE_PIXEL_MIN = 0x0000,
|
|
+ HDMITX_SCALER_FINE_PIXEL_MAX = 0x1FFF,
|
|
+ HDMITX_SCALER_FINE_PIXEL_NO_CHANGE = 0x2000,
|
|
+ HDMITX_SCALER_FINE_PIXEL_INVALID = 0x2001
|
|
+};
|
|
+
|
|
+/** Reference line values */
|
|
+enum _bsl_scaler_fine_line_limits {
|
|
+ HDMITX_SCALER_FINE_LINE_MIN = 0x0000,
|
|
+ HDMITX_SCALER_FINE_LINE_MAX = 0x07FF,
|
|
+ HDMITX_SCALER_FINE_LINE_NO_CHANGE = 0x0800,
|
|
+ HDMITX_SCALER_FINE_LINE_INVALID = 0x0801
|
|
+};
|
|
+
|
|
+/**
|
|
+ * \brief Set scaler fine adjustment options
|
|
+ *
|
|
+ * \param[in] txUnit Transmitter unit number
|
|
+ * \param[in] uRefPix Ref. pixel preset 0 to 1FFFh (2000h = No Change)
|
|
+ * \param[in] uRefLine Ref. line preset 0 to 7FFh (800h = No Change)
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - Else a problem has been detected:
|
|
+ * - ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number
|
|
+ * - ERR_HDMI_BAD_PARAMETER: a parameter was out of range
|
|
+ * - ERR_HDMI_NOT_INITIALIZED: transmitter not initialized
|
|
+ * - ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus
|
|
+ * */
|
|
+error_code_t
|
|
+bsl_scaler_set_fine
|
|
+(
|
|
+ unit_select_t tx_unit,
|
|
+ u16 u_ref_pix,
|
|
+ u16 u_ref_line
|
|
+);
|
|
+
|
|
+/*============================================================================*/
|
|
+/**
|
|
+ * bslScalerSetSync() parameter types
|
|
+ * */
|
|
+/** Video sync method */
|
|
+typedef enum {
|
|
+ HDMITX_VSMETH_V_H = 0, /**< V and H */
|
|
+ HDMITX_VSMETH_V_XDE = 1, /**< V and X-DE */
|
|
+ HDMITX_VSMETH_NO_CHANGE = 2, /**< No change */
|
|
+ HDMITX_VSMETH_INVALID = 3 /**< Invalid */
|
|
+} bsl_vs_meth_t;
|
|
+
|
|
+/** Line/pixel counters sync */
|
|
+typedef enum {
|
|
+ HDMITX_VSONCE_EACH_FRAME = 0, /**< Sync on each frame */
|
|
+ HDMITX_VSONCE_ONCE = 1, /**< Sync once only */
|
|
+ HDMITX_VSONCE_NO_CHANGE = 2, /**< No change */
|
|
+ HDMITX_VSONCE_INVALID = 3 /**< Invalid */
|
|
+} bsl_vs_once_t;
|
|
+
|
|
+/**
|
|
+ * \brief Set scaler synchronization options
|
|
+ *
|
|
+ * \param[in] txUnit Transmitter unit number
|
|
+ * \param[in] method Sync. combination method
|
|
+ * \param[in] once Line/pixel counters sync once or each frame
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - Else a problem has been detected:
|
|
+ * - ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number
|
|
+ * - ERR_HDMI_BAD_PARAMETER: a parameter was out of range
|
|
+ * - ERR_HDMI_NOT_INITIALIZED: transmitter not initialized
|
|
+ * - ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus
|
|
+ * */
|
|
+error_code_t
|
|
+bsl_scaler_set_sync
|
|
+(
|
|
+ unit_select_t tx_unit,
|
|
+ bsl_vs_meth_t method,
|
|
+ bsl_vs_once_t once
|
|
+);
|
|
+
|
|
+/*============================================================================*/
|
|
+/**
|
|
+ * \brief Get the driver software version and compatibility numbers
|
|
+ *
|
|
+ * \param[out] pSWVersion Pointer to the software version structure returned
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - Else a problem has been detected:
|
|
+ * - ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number
|
|
+ * - ERR_HDMI_BAD_PARAMETER: a parameter was out of range
|
|
+ * - ERR_HDMI_NOT_INITIALIZED: transmitter not initialized
|
|
+ * */
|
|
+error_code_t
|
|
+bsl_sw_get_version
|
|
+(
|
|
+ p_swversion_t p_swversion
|
|
+);
|
|
+
|
|
+/*============================================================================*/
|
|
+/**
|
|
+ * \brief Get the driver software version and compatibility numbers
|
|
+ *
|
|
+ * \param[in] txUnit Transmitter unit number
|
|
+ * \param[in] waitMs Period in milliseconds to wait
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - Else a problem has been detected:
|
|
+ * - ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number
|
|
+ * - ERR_HDMI_NOT_INITIALIZED: transmitter not initialized
|
|
+ * */
|
|
+error_code_t
|
|
+bsl_sys_timer_wait
|
|
+(
|
|
+ unit_select_t tx_unit,
|
|
+ u16 wait_ms
|
|
+);
|
|
+
|
|
+/*============================================================================*/
|
|
+/**
|
|
+ * bslTmdsSetOutputs() parameter types
|
|
+ * */
|
|
+/** TMDS output mode */
|
|
+typedef enum {
|
|
+ HDMITX_TMDSOUT_NORMAL = 0, /**< Normal outputs */
|
|
+ HDMITX_TMDSOUT_NORMAL1 = 1, /**< Normal outputs, same as 0 */
|
|
+ HDMITX_TMDSOUT_FORCED0 = 2, /**< Forced 0 outputs */
|
|
+ HDMITX_TMDSOUT_FORCED1 = 3, /**< Forced 1 outputs */
|
|
+ HDMITX_TMDSOUT_INVALID = 4 /**< Invalid */
|
|
+} bsl_tmds_out_t;
|
|
+
|
|
+/**
|
|
+ * \brief Set the TMDS outputs to normal active operation or to a forced
|
|
+ * state
|
|
+ *
|
|
+ * \param[in] txUnit Transmitter unit number
|
|
+ * \param[in] tmdsOut TMDS output mode
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - Else a problem has been detected:
|
|
+ * - ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number
|
|
+ * - ERR_HDMI_BAD_PARAMETER: a parameter was out of range
|
|
+ * - ERR_HDMI_NOT_INITIALIZED: transmitter not initialized
|
|
+ * */
|
|
+error_code_t
|
|
+bsl_tmds_set_outputs
|
|
+(
|
|
+ unit_select_t tx_unit,
|
|
+ bsl_tmds_out_t tmds_out
|
|
+);
|
|
+
|
|
+/*============================================================================*/
|
|
+/**
|
|
+ * bslTmdsSetSerializer() parameter types
|
|
+ * */
|
|
+/** Serializer phase limits */
|
|
+enum _bsl_tmds_phase {
|
|
+ HDMITX_TMDSPHASE_MIN = 0,
|
|
+ HDMITX_TMDSPHASE_MAX = 15,
|
|
+ HDMITX_TMDSPHASE_INVALID = 16
|
|
+};
|
|
+
|
|
+/**
|
|
+ * \brief Fine-tune the TMDS serializer
|
|
+ *
|
|
+ * \param[in] txUnit Transmitter unit number
|
|
+ * \param[in] uPhase2 Serializer phase 2
|
|
+ * \param[in] uPhase3 Serializer phase 3
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - Else a problem has been detected:
|
|
+ * - ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number
|
|
+ * - ERR_HDMI_BAD_PARAMETER: a parameter was out of range
|
|
+ * - ERR_HDMI_NOT_INITIALIZED: transmitter not initialized
|
|
+ * */
|
|
+error_code_t
|
|
+bsl_tmds_set_serializer
|
|
+(
|
|
+ unit_select_t tx_unit,
|
|
+ u8 u_phase2,
|
|
+ u8 u_phase3
|
|
+);
|
|
+
|
|
+/*============================================================================*/
|
|
+/**
|
|
+ * bslTestSetPattern() parameter types
|
|
+ * */
|
|
+/** Test pattern types */
|
|
+typedef enum {
|
|
+ HDMITX_PATTERN_OFF = 0, /**< Insert test pattern */
|
|
+ HDMITX_PATTERN_CBAR4 = 1, /**< Insert 4-bar colour bar */
|
|
+ HDMITX_PATTERN_CBAR8 = 2, /**< Insert 8-bar colour bar */
|
|
+ HDMITX_PATTERN_BLUE = 3, /**< Insert Blue screen */
|
|
+ HDMITX_PATTERN_INVALID = 4 /**< Invalid pattern */
|
|
+} bsl_test_pattern_t;
|
|
+
|
|
+/*
|
|
+ * \brief Set a colour bar test pattern
|
|
+ *
|
|
+ * \param[in] txUnit Transmitter unit number
|
|
+ * \param[in] pattern Test pattern
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - Else a problem has been detected:
|
|
+ * - ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number
|
|
+ * - ERR_HDMI_BAD_PARAMETER: a parameter was out of range
|
|
+ * - ERR_HDMI_NOT_INITIALIZED: transmitter not initialized
|
|
+ * - ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus
|
|
+ * */
|
|
+error_code_t
|
|
+bsl_test_set_pattern
|
|
+(
|
|
+ unit_select_t tx_unit,
|
|
+ bsl_test_pattern_t pattern
|
|
+);
|
|
+
|
|
+/*============================================================================*/
|
|
+/**
|
|
+ * bslTestSetMode() parameter types
|
|
+ * */
|
|
+/** Test modes */
|
|
+typedef enum {
|
|
+ HDMITX_TESTMODE_PAT = 0,/**< Insert test pattern */
|
|
+ HDMITX_TESTMODE_656 = 1,/**< Inject CCIR-656 video via audio port */
|
|
+ HDMITX_TESTMODE_SERPHOE = 2,/**< Activate srl_tst_ph2_o & srl_tst_ph3_o */
|
|
+ HDMITX_TESTMODE_NOSC = 3,/**< Input nosc predivider = PLL-ref input */
|
|
+ HDMITX_TESTMODE_HVP = 4,/**< Test high voltage protection cells */
|
|
+ HDMITX_TESTMODE_PWD = 5,/**< Test PLLs in sleep mode */
|
|
+ HDMITX_TESTMODE_DIVOE = 6,/**< Enable scaler PLL divider test output */
|
|
+ HDMITX_TESTMODE_INVALID = 7 /**< Invalid test */
|
|
+} bsl_test_mode_t;
|
|
+
|
|
+/** Test states */
|
|
+typedef enum {
|
|
+ HDMITX_TESTSTATE_OFF = 0, /**< Disable the selected test */
|
|
+ HDMITX_TESTSTATE_ON = 1, /**< Enable the selected test */
|
|
+ HDMITX_TESTSTATE_INVALID = 2 /**< Invalid value */
|
|
+} bsl_test_state_t;
|
|
+
|
|
+/**
|
|
+ * \brief Set or clear one or more simultaneous test modes
|
|
+ *
|
|
+ * \param[in] txUnit Transmitter unit number
|
|
+ * \param[in] testMode Mode: tst_pat, tst_656, tst_serphoe, tst_nosc,
|
|
+ * tst_hvp, tst_pwd, tst_divoe
|
|
+ * \param[in] testState State: 1=On, 0=Off
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - Else a problem has been detected:
|
|
+ * - ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number
|
|
+ * - ERR_HDMI_BAD_PARAMETER: a parameter was out of range
|
|
+ * - ERR_HDMI_NOT_INITIALIZED: transmitter not initialized
|
|
+ * - ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus
|
|
+ * */
|
|
+error_code_t
|
|
+bsl_test_set_mode
|
|
+(
|
|
+ unit_select_t tx_unit,
|
|
+ bsl_test_mode_t test_mode,
|
|
+ bsl_test_state_t test_state
|
|
+);
|
|
+
|
|
+/*============================================================================*/
|
|
+/**
|
|
+ * bslVideoInSetBlanking() parameter types
|
|
+ * */
|
|
+/** Blankit Source */
|
|
+typedef enum {
|
|
+ HDMITX_BLNKSRC_NOT_DE = 0, /**< Source=Not DE */
|
|
+ HDMITX_BLNKSRC_VS_HS = 1, /**< Source=VS And HS */
|
|
+ HDMITX_BLNKSRC_VS_NOT_HS = 2, /**< Source=VS And Not HS */
|
|
+ HDMITX_BLNKSRC_VS_HEMB_VEMB = 3, /**< Source=Hemb And Vemb */
|
|
+ HDMITX_BLNKSRC_NO_CHANGE = 4, /**< No change */
|
|
+ HDMITX_BLNKSRC_INVALID = 5 /**< Invalid */
|
|
+} bsl_blnk_src_t;
|
|
+
|
|
+/** Blanking Codes */
|
|
+typedef enum {
|
|
+ HDMITX_BLNKCODE_ALL_0 = 0, /**< Code=All Zero */
|
|
+ HDMITX_BLNKCODE_RGB444 = 1, /**< Code=RGB444 */
|
|
+ HDMITX_BLNKCODE_YUV444 = 2, /**< Code=YUV444 */
|
|
+ HDMITX_BLNKCODE_YUV422 = 3, /**< Code=YUV422 */
|
|
+ HDMITX_BLNKCODE_NO_CHANGE = 4, /**< No change */
|
|
+ HDMITX_BLNKCODE_INVALID = 5 /**< Invalid */
|
|
+} bsl_blnk_code_t;
|
|
+
|
|
+/**
|
|
+ * \brief Enable blanking between active data
|
|
+ *
|
|
+ * \param[in] txUnit Transmitter unit number
|
|
+ * \param[in] blankitSource Blankit Source: Not DE, VS And HS,
|
|
+ * VS And Not HS, Hemb And Vemb, No Change
|
|
+ * \param[in] blankingCodes Blanking Codes: All Zero, RGB444, YUV444,
|
|
+ * YUV422, No Change
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - Else a problem has been detected:
|
|
+ * - ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number
|
|
+ * - ERR_HDMI_BAD_PARAMETER: a parameter was out of range
|
|
+ * - ERR_HDMI_NOT_INITIALIZED: transmitter not initialized
|
|
+ * - ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus
|
|
+ *
|
|
+ * \note NA
|
|
+ *
|
|
+ * \sa NA
|
|
+ * */
|
|
+error_code_t
|
|
+bsl_video_in_set_blanking
|
|
+(
|
|
+ unit_select_t tx_unit,
|
|
+ bsl_blnk_src_t blankit_source,
|
|
+ bsl_blnk_code_t blanking_codes
|
|
+);
|
|
+
|
|
+/*============================================================================*/
|
|
+/**
|
|
+ * bslVideoInSetConfig() parameter types
|
|
+ * */
|
|
+/** Sample edge */
|
|
+typedef enum {
|
|
+ HDMITX_PIXEDGE_CLK_POS = 0, /**< Pixel Clock Positive Edge */
|
|
+ HDMITX_PIXEDGE_CLK_NEG = 1, /**< Pixel Clock Negative Edge */
|
|
+ HDMITX_PIXEDGE_NO_CHANGE = 2, /**< No Change */
|
|
+ HDMITX_PIXEDGE_INVALID = 3 /**< Invalid */
|
|
+} bsl_pix_edge_t;
|
|
+
|
|
+/** Upsample modes */
|
|
+typedef enum {
|
|
+ HDMITX_UPSAMPLE_BYPASS = 0, /**< Bypass */
|
|
+ HDMITX_UPSAMPLE_COPY = 1, /**< Copy */
|
|
+ HDMITX_UPSAMPLE_INTERPOLATE = 2, /**< Interpolate */
|
|
+ /**< Auto: driver chooses best value */
|
|
+ HDMITX_UPSAMPLE_AUTO = 3,
|
|
+ HDMITX_UPSAMPLE_NO_CHANGE = 4, /**< No Change */
|
|
+ HDMITX_UPSAMPLE_INVALID = 5 /**< Invalid */
|
|
+} bsl_upsample_mode_t;
|
|
+
|
|
+/**
|
|
+ * \brief Configure video input options and control the upsampler
|
|
+ *
|
|
+ * \param[in] txUnit Transmitter unit number
|
|
+ * \param[in] vinMode Video input mode
|
|
+ * \param[in] sampleEdge Sample edge:
|
|
+ * Pixel Clock Positive Edge,
|
|
+ * Pixel Clock Negative Edge, No Change
|
|
+ * \param[in] pixRate Single data or double data rate
|
|
+ * \param[in] upsampleMode Upsample mode
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - Else a problem has been detected:
|
|
+ * - ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number
|
|
+ * - ERR_HDMI_BAD_PARAMETER: a parameter was out of range
|
|
+ * - ERR_HDMI_NOT_INITIALIZED: transmitter not initialized
|
|
+ * - ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus
|
|
+ * */
|
|
+error_code_t
|
|
+bsl_video_in_set_config
|
|
+(
|
|
+ unit_select_t tx_unit,
|
|
+ bsl_vin_mode_t vin_mode,
|
|
+ bsl_pix_edge_t sample_edge,
|
|
+ bsl_pix_rate_t pix_rate,
|
|
+ bsl_upsample_mode_t upsample_mode
|
|
+);
|
|
+
|
|
+/*============================================================================*/
|
|
+/**
|
|
+ * bslVideoInSetFine() parameter types
|
|
+ * */
|
|
+/** Subpacket count */
|
|
+typedef enum {
|
|
+ HDMITX_PIXSUBPKT_FIX_0 = 0, /**< Fix At 0 */
|
|
+ HDMITX_PIXSUBPKT_FIX_1 = 1, /**< Fix At 1 */
|
|
+ HDMITX_PIXSUBPKT_FIX_2 = 2, /**< Fix At 2 */
|
|
+ HDMITX_PIXSUBPKT_FIX_3 = 3, /**< Fix At 3 */
|
|
+ HDMITX_PIXSUBPKT_SYNC_FIRST = 4, /**< First Sync value */
|
|
+ HDMITX_PIXSUBPKT_SYNC_HEMB = 4, /**< Sync By Hemb */
|
|
+ HDMITX_PIXSUBPKT_SYNC_DE = 5, /**< Sync By Rising Edge DE */
|
|
+ HDMITX_PIXSUBPKT_SYNC_HS = 6, /**< Sync By Rising Edge HS */
|
|
+ HDMITX_PIXSUBPKT_NO_CHANGE = 7, /**< No Change */
|
|
+ HDMITX_PIXSUBPKT_INVALID = 8, /**< Invalid */
|
|
+ HDMITX_PIXSUBPKT_SYNC_FIXED = 3 /**< Not used as a parameter value,
|
|
+ * but used internally when
|
|
+ * Fix at 0/1/2/3 values are set */
|
|
+} bsl_pix_subpkt_t;
|
|
+
|
|
+/** Toggling */
|
|
+typedef enum {
|
|
+ HDMITX_PIXTOGL_NO_ACTION = 0, /**< No Action */
|
|
+ HDMITX_PIXTOGL_ENABLE = 1, /**< Toggle */
|
|
+ HDMITX_PIXTOGL_NO_CHANGE = 2, /**< No Change */
|
|
+ HDMITX_PIXTOGL_INVALID = 3 /**< Invalid */
|
|
+} bsl_pix_togl_t;
|
|
+
|
|
+/**
|
|
+ * \brief Set fine image position
|
|
+ *
|
|
+ * \param[in] txUnit Transmitter unit number
|
|
+ * \param[in] subpacketCount Subpacket Count fixed values and sync options
|
|
+ * \param[in] toggleClk1 Toggle clock 1 phase w.r.t. clock 2
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - Else a problem has been detected:
|
|
+ * - ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number
|
|
+ * - ERR_HDMI_BAD_PARAMETER: a parameter was out of range
|
|
+ * - ERR_HDMI_NOT_INITIALIZED: transmitter not initialized
|
|
+ * - ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus
|
|
+ *
|
|
+ * \note NA
|
|
+ *
|
|
+ * \sa NA
|
|
+ * */
|
|
+error_code_t
|
|
+bsl_video_in_set_fine
|
|
+(
|
|
+ unit_select_t tx_unit,
|
|
+ bsl_pix_subpkt_t subpacket_count,
|
|
+ bsl_pix_togl_t toggle_clk1
|
|
+);
|
|
+
|
|
+/*============================================================================*/
|
|
+/**
|
|
+ * bslVideoInSetMapping() parameter types
|
|
+ * */
|
|
+/** Video input port parameter structure array size and limits */
|
|
+enum _bsl_vin_port_map {
|
|
+ HDMITX_VIN_PORT_MAP_TABLE_LEN = 6,
|
|
+
|
|
+ HDMITX_VIN_PORT_SWAP_NO_CHANGE = 6,
|
|
+ HDMITX_VIN_PORT_SWAP_INVALID = 7,
|
|
+
|
|
+ HDMITX_VIN_PORT_MIRROR_NO_CHANGE = 2,
|
|
+ HDMITX_VIN_PORT_MIRROR_INVALID = 3
|
|
+};
|
|
+
|
|
+/**
|
|
+ * \brief Set video input port swapping and mirroring
|
|
+ *
|
|
+ * \param[in] txUnit Transmitter unit number
|
|
+ * \param[in] pSwapTable Pointer to 6-byte port swap table
|
|
+ * \param[in] pMirrorTable Pointer to 6-byte port mirror table
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - Else a problem has been detected:
|
|
+ * - ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number
|
|
+ * - ERR_HDMI_BAD_PARAMETER: a parameter was out of range
|
|
+ * - ERR_HDMI_NOT_INITIALIZED: transmitter not initialized
|
|
+ * - ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus
|
|
+ *
|
|
+ * \note u8 pSwapTable[6]
|
|
+ *
|
|
+ * Each table position 0 to 5 represents a group of 4 port bits:
|
|
+ * [0]=23:20, [1]=16:19, [2]=15:12, [3]=11:8, [4]=4:7, [5]=0:3
|
|
+ * Table position values are 0 to 6, denoting the group of 4 port
|
|
+ * bits to swap to: 0=23:20, 1=16:19, 2=15:12, 3=11:8, 4=4:7, 5=0:3.
|
|
+ * For example, to swap port bits 15:12 to bits 4:7: pSwapTable[2]=4
|
|
+ *
|
|
+ * u8 pMirrorTable[6]
|
|
+ *
|
|
+ * Each table position 0 to 5 represents a group of 4 port bits:
|
|
+ * [0]=23:20, [1]=16:19, [2]=15:12, [3]=11:8, [4]=4:7, [5]=0:3.
|
|
+ * Cell values are 0 to 2 (Not Mirrored, Mirrored, No Change).
|
|
+ * For example, to mirror port bits 11:8 to bits 8:11:
|
|
+ * pMirrorTable[3]=1.
|
|
+ * */
|
|
+error_code_t
|
|
+bsl_video_in_set_mapping
|
|
+(
|
|
+ unit_select_t tx_unit,
|
|
+ u8 *p_swap_table,
|
|
+ u8 *p_mirror_table
|
|
+);
|
|
+
|
|
+/*============================================================================*/
|
|
+
|
|
+#define HDMITX_ENABLE_VP_TABLE_LEN 3
|
|
+#define HDMITX_GROUND_VP_TABLE_LEN 3
|
|
+
|
|
+/**
|
|
+ * \brief Set video input port (enable, ground)
|
|
+ *
|
|
+ * \param[in] txUnit Transmitter unit number
|
|
+ * \param[in] pEnaVideoPortTable Pointer to 3-byte video port enable table
|
|
+ * \param[in] pGndVideoPortTable Pointer to 3-byte video port ground table
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - Else a problem has been detected:
|
|
+ * - ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number
|
|
+ * - ERR_HDMI_BAD_PARAMETER: a parameter was out of range
|
|
+ * - ERR_HDMI_NOT_INITIALIZED: transmitter not initialized
|
|
+ * - ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus
|
|
+ *
|
|
+ * \note u8 pEnaVideoPortTable[3]
|
|
+ *
|
|
+ * Each table position 0 to 2 represents a group of 8 port bits:
|
|
+ * [0]=7:0, [1]=15:8, [2]=23:16
|
|
+ * bitn = '1' means enable port n
|
|
+ * bitn = '0' means disable port n
|
|
+ * For example, to enable port 0 to 7 only : pEnaVideoPortTable[0]= 0xFF
|
|
+ * pEnaVideoPortTable[1]= 0x00, pEnaVideoPortTable[2]= 0x00
|
|
+ *
|
|
+ * u8 pGndVideoPortTable[3]
|
|
+ *
|
|
+ * Each table position 0 to 2 represents a group of 8 port bits:
|
|
+ * [0]=7:0, [1]=15:8, [2]=23:16
|
|
+ * bitn = '1' means pulldown port n
|
|
+ * bitn = '0' means not pulldown port n
|
|
+ * For example, to pulldown port 8 to 15 only : pEnaVideoPortTable[0]= 0x00
|
|
+ * pEnaVideoPortTable[1]= 0xFF, pEnaVideoPortTable[2]= 0x00
|
|
+ * */
|
|
+error_code_t
|
|
+bsl_set_video_port_config
|
|
+(
|
|
+ unit_select_t tx_unit,
|
|
+ u8 *p_ena_video_port_table,
|
|
+ u8 *p_gnd_video_port_table
|
|
+);
|
|
+
|
|
+/*============================================================================*/
|
|
+/**
|
|
+ * \brief Set audio input port (enable, ground)
|
|
+ *
|
|
+ * \param[in] txUnit Transmitter unit number
|
|
+ * \param[in] pEnaAudioPortTable Pointer to 1-byte audio port enable configuration
|
|
+ * \param[in] pGndAudioPortTable Pointer to 1-byte audio port ground configuration
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - Else a problem has been detected:
|
|
+ * - ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number
|
|
+ * - ERR_HDMI_BAD_PARAMETER: a parameter was out of range
|
|
+ * - ERR_HDMI_NOT_INITIALIZED: transmitter not initialized
|
|
+ * - ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus
|
|
+ *
|
|
+ * \note u8 pEnaAudioPortTable[1]
|
|
+ * bitn = '1' means enable port n
|
|
+ * bitn = '0' means disable port n
|
|
+ * For example, to enable all audio port (0:7) : pEnaAudioPortTable[0]= 0xFF
|
|
+ *
|
|
+ * u8 pGndAudioPortTable[1]
|
|
+ * bitn = '1' means pulldown port n
|
|
+ * bitn = '0' means not pulldown port n
|
|
+ * For example, to pulldown audio port (0:7) : pEnaAudioPortTable[0]= 0xFF
|
|
+ * */
|
|
+error_code_t
|
|
+bsl_set_audio_port_config
|
|
+(
|
|
+ unit_select_t tx_unit,
|
|
+ u8 *p_ena_audio_port_table,
|
|
+ u8 *p_gnd_audio_port_table
|
|
+);
|
|
+
|
|
+/*============================================================================*/
|
|
+/**
|
|
+ * bslVideoInSetSyncAuto() parameter types
|
|
+ * */
|
|
+/** Sync source - was Embedded sync HDMITX_PIXEMBSYNC_ */
|
|
+typedef enum {
|
|
+ HDMITX_SYNCSRC_EMBEDDED = 0, /**< Embedded sync */
|
|
+ HDMITX_SYNCSRC_EXT_VREF = 1, /**< External sync Vref, Href, Fref */
|
|
+ HDMITX_SYNCSRC_EXT_VS = 2, /**< External sync Vs, Hs */
|
|
+ HDMITX_SYNCSRC_NO_CHANGE = 3, /**< No Change */
|
|
+ HDMITX_SYNCSRC_INVALID = 4 /**< Invalid */
|
|
+} bsl_sync_source_t;
|
|
+
|
|
+/**
|
|
+ * \brief Configure video input sync automatically
|
|
+ *
|
|
+ * \param[in] txUnit Transmitter unit number
|
|
+ * \param[in] syncSource Sync Source:
|
|
+ * Embedded, External Vref, External Vs
|
|
+ * No Change
|
|
+ * \param[in] vinFmt EIA/CEA Video input format: 1 to 31, 0 = No Change
|
|
+ * \param[in] vinMode Input video mode
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - Else a problem has been detected:
|
|
+ * - ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number
|
|
+ * - ERR_HDMI_BAD_PARAMETER: a parameter was out of range
|
|
+ * - ERR_HDMI_NOT_INITIALIZED: transmitter not initialized
|
|
+ * - ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus
|
|
+ * */
|
|
+error_code_t
|
|
+bsl_video_in_set_sync_auto
|
|
+(
|
|
+ unit_select_t tx_unit,
|
|
+ bsl_sync_source_t sync_source,
|
|
+ bsl_vid_fmt_t vin_fmt,
|
|
+ bsl_vin_mode_t vin_mode
|
|
+
|
|
+);
|
|
+
|
|
+/*============================================================================*/
|
|
+/**
|
|
+ * bslVideoInSetSyncManual() parameter types
|
|
+ * */
|
|
+/** Video output frame pixel values */
|
|
+enum _bsl_vout_fine_pixel_limits {
|
|
+ HDMITX_VOUT_FINE_PIXEL_MIN = 0x0000,
|
|
+ HDMITX_VOUT_FINE_PIXEL_MAX = 0x1FFF,
|
|
+ HDMITX_VOUT_FINE_PIXEL_NO_CHANGE = 0x2000,
|
|
+ HDMITX_VOUT_FINE_PIXEL_INVALID = 0x2001
|
|
+};
|
|
+
|
|
+/** Video output frame line values */
|
|
+enum _bsl_vout_fine_line_limits {
|
|
+ HDMITX_VOUT_FINE_LINE_MIN = 0x0000,
|
|
+ HDMITX_VOUT_FINE_LINE_MAX = 0x07FF,
|
|
+ HDMITX_VOUT_FINE_LINE_NO_CHANGE = 0x0800,
|
|
+ HDMITX_VOUT_FINE_LINE_INVALID = 0x0801
|
|
+};
|
|
+/**
|
|
+ * \brief Configure video input sync with manual parameters
|
|
+ *
|
|
+ * \param[in] txUnit Transmitter unit number
|
|
+ * \param[in] syncSource Sync Source:
|
|
+ * Embedded, External Vref, External Vs
|
|
+ * No Change
|
|
+ * \param[in] syncMethod Sync method: V And H, V And X-DE, No Change
|
|
+ * \param[in] toggleV VS Toggle:
|
|
+ * No Action, Toggle VS/Vref, No Change
|
|
+ * \param[in] toggleH HS Toggle:
|
|
+ * No Action, Toggle HS/Href, No Change
|
|
+ * \param[in] toggleX DE/FREF Toggle:
|
|
+ * No Action, Toggle DE/Fref, No Change
|
|
+ * \param[in] uRefPix Ref. pixel preset 0 to 1FFFh (2000h = No Change)
|
|
+ * \param[in] uRefLine Ref. line preset 0 to 7FFh (800h = No Change)
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - Else a problem has been detected:
|
|
+ * - ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number
|
|
+ * - ERR_HDMI_BAD_PARAMETER: a parameter was out of range
|
|
+ * - ERR_HDMI_NOT_INITIALIZED: transmitter not initialized
|
|
+ * - ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus
|
|
+ * */
|
|
+error_code_t
|
|
+bsl_video_in_set_sync_manual
|
|
+(
|
|
+ unit_select_t tx_unit,
|
|
+ bsl_sync_source_t sync_source,
|
|
+ bsl_vs_meth_t sync_method,
|
|
+ bsl_pix_togl_t toggle_v,
|
|
+ bsl_pix_togl_t toggle_h,
|
|
+ bsl_pix_togl_t toggle_x,
|
|
+ u16 u_ref_pix,
|
|
+ u16 u_ref_line
|
|
+);
|
|
+
|
|
+/*============================================================================*/
|
|
+/**
|
|
+ * \brief Enable or disable output video frame
|
|
+ *
|
|
+ * \param[in] txUnit Transmitter unit number
|
|
+ * \param[in] bDisable Enable or disable scaler input
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - Else a problem has been detected:
|
|
+ * - ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number
|
|
+ * - ERR_HDMI_BAD_PARAMETER: a parameter was out of range
|
|
+ * - ERR_HDMI_NOT_INITIALIZED: transmitter not initialized
|
|
+ * - ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus
|
|
+ * */
|
|
+error_code_t
|
|
+bsl_video_out_disable
|
|
+(
|
|
+ unit_select_t tx_unit,
|
|
+ bool b_disable
|
|
+);
|
|
+
|
|
+/*============================================================================*/
|
|
+/**
|
|
+ * bslVideoOutSetConfig() parameter types
|
|
+ * */
|
|
+/** Prefilter */
|
|
+typedef enum {
|
|
+ HDMITX_VOUT_PREFIL_OFF = 0, /**< Off */
|
|
+ HDMITX_VOUT_PREFIL_121 = 1, /**< 121 */
|
|
+ HDMITX_VOUT_PREFIL_109 = 2, /**< 109 */
|
|
+ HDMITX_VOUT_PREFIL_CCIR601 = 3, /**< CCIR601 */
|
|
+ HDMITX_VOUT_PREFIL_NO_CHANGE = 4, /**< No Change */
|
|
+ HDMITX_VOUT_PREFIL_INVALID = 5 /**< Invalid */
|
|
+} bsl_vout_prefil_t;
|
|
+
|
|
+/** YUV blanking */
|
|
+typedef enum {
|
|
+ HDMITX_VOUT_YUV_BLNK_16 = 0, /**< 16 */
|
|
+ HDMITX_VOUT_YUV_BLNK_0 = 1, /**< 0 */
|
|
+ HDMITX_VOUT_YUV_BLNK_NO_CHANGE = 2, /**< No Change */
|
|
+ HDMITX_VOUT_YUV_BLNK_INVALID = 3 /**< Invalid */
|
|
+} bsl_vout_yuv_blnk_t;
|
|
+
|
|
+/** Video quantization range */
|
|
+typedef enum {
|
|
+ HDMITX_VOUT_QRANGE_FS = 0, /**< Full Scale */
|
|
+ HDMITX_VOUT_QRANGE_RGB_YUV = 1, /**< RGB Or YUV */
|
|
+ HDMITX_VOUT_QRANGE_YUV = 2, /**< YUV */
|
|
+ HDMITX_VOUT_QRANGE_NO_CHANGE = 3, /**< No Change */
|
|
+ HDMITX_VOUT_QRANGE_INVALID = 4 /**< Invalid */
|
|
+} bsl_vout_qrange_t;
|
|
+
|
|
+/**
|
|
+ * \brief Configure sink type, configure video output colour and
|
|
+ * quantization, control the downsampler, and force RGB output
|
|
+ * and mute audio in DVI mode
|
|
+ *
|
|
+ * \param[in] txUnit Transmitter unit number:
|
|
+ * \param[in] sinkType Sink device type: DVI or HDMI or copy from EDID
|
|
+ * \param[in] voutMode Video output mode
|
|
+ * \param[in] preFilter Prefilter: Off, 121, 109, CCIR601, No Change
|
|
+ * \param[in] yuvBlank YUV blanking: 16, 0, No Change
|
|
+ * \param[in] quantization Video quantization range:
|
|
+ * Full Scale, RGB Or YUV, YUV, No Change
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - Else a problem has been detected:
|
|
+ * - ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number
|
|
+ * - ERR_HDMI_BAD_PARAMETER: a parameter was out of range
|
|
+ * - ERR_HDMI_NOT_INITIALIZED: transmitter not initialized
|
|
+ * - ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus
|
|
+ * */
|
|
+error_code_t
|
|
+bsl_video_out_set_config
|
|
+(
|
|
+ unit_select_t tx_unit,
|
|
+ bsl_sink_type_t sink_type,
|
|
+ bsl_vout_mode_t vout_mode,
|
|
+ bsl_vout_prefil_t pre_filter,
|
|
+ bsl_vout_yuv_blnk_t yuv_blank,
|
|
+ bsl_vout_qrange_t quantization
|
|
+);
|
|
+
|
|
+/*============================================================================*/
|
|
+/**
|
|
+ * bslVideoOutSetSync() parameter types
|
|
+ * */
|
|
+/** Video sync source */
|
|
+typedef enum {
|
|
+ HDMITX_VSSRC_INTERNAL = 0, /**< Internal */
|
|
+ HDMITX_VSSRC_EXTERNAL = 1, /**< External */
|
|
+ HDMITX_VSSRC_NO_CHANGE = 2, /**< No change */
|
|
+ HDMITX_VSSRC_INVALID = 3 /**< Invalid */
|
|
+} bsl_vs_src_t;
|
|
+
|
|
+/** Video sync toggle */
|
|
+typedef enum {
|
|
+ HDMITX_VSTGL_TABLE = 0, /**< Vs/Hs polarity from table */
|
|
+ HDMITX_VSTGL_UNUSED_1 = 1, /**< Unused */
|
|
+ HDMITX_VSTGL_UNUSED_2 = 2, /**< Unused */
|
|
+ HDMITX_VSTGL_UNUSED_3 = 3, /**< Unused */
|
|
+ HDMITX_VSTGL_NO_ACTION = 4, /**< No toggle */
|
|
+ HDMITX_VSTGL_HS = 5, /**< Toggle Hs */
|
|
+ HDMITX_VSTGL_VS = 6, /**< Toggle Vs */
|
|
+ HDMITX_VSTGL_HS_VS = 7, /**< Toggle Hs & Vs */
|
|
+ HDMITX_VSTGL_NO_CHANGE = 8, /**< No change */
|
|
+ HDMITX_VSTGL_INVALID = 9 /**< Invalid */
|
|
+} bsl_vs_tgl_t;
|
|
+
|
|
+/**
|
|
+ * \brief Set video synchronization
|
|
+ *
|
|
+ * \param[in] txUnit Transmitter unit number
|
|
+ * \param[in] srcH Horizontal sync source: Internal, Exter'l, No Change
|
|
+ * \param[in] srcV Vertical sync source: Internal, Exter'l, No Change
|
|
+ * \param[in] srcX X sync source: Internal, Exter'l, No Change
|
|
+ * \param[in] toggle Sync toggle: Hs, Vs, Off, No Change
|
|
+ * \param[in] once Line/pixel counters sync once or each frame
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - Else a problem has been detected:
|
|
+ * - ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number
|
|
+ * - ERR_HDMI_BAD_PARAMETER: a parameter was out of range
|
|
+ * - ERR_HDMI_NOT_INITIALIZED: transmitter not initialized
|
|
+ * - ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus
|
|
+ * */
|
|
+error_code_t
|
|
+bsl_video_out_set_sync
|
|
+(
|
|
+ unit_select_t tx_unit,
|
|
+ bsl_vs_src_t src_h,
|
|
+ bsl_vs_src_t src_v,
|
|
+ bsl_vs_src_t src_x,
|
|
+ bsl_vs_tgl_t toggle,
|
|
+ bsl_vs_once_t once
|
|
+);
|
|
+
|
|
+/*============================================================================*/
|
|
+/**
|
|
+ * bslVideoSetInOut() parameter types
|
|
+ * */
|
|
+/** Pixel repetition values */
|
|
+enum _bsl_pix_repeat {
|
|
+ HDMITX_PIXREP_NONE = 0, /**< No repetition */
|
|
+ HDMITX_PIXREP_MIN = 0, /**< 1 repetition */
|
|
+ HDMITX_PIXREP_MAX = 9, /**< 10 repetitions */
|
|
+ /**< Default repetitions for output format */
|
|
+ HDMITX_PIXREP_DEFAULT = 10,
|
|
+ HDMITX_PIXREP_NO_CHANGE = 11, /**< No change */
|
|
+ HDMITX_PIXREP_INVALID = 12 /**< Invalid */
|
|
+};
|
|
+
|
|
+/** Matrix modes */
|
|
+typedef enum {
|
|
+ HDMITX_MATMODE_OFF = 0, /**< Off */
|
|
+ HDMITX_MATMODE_AUTO = 1, /**< Auto */
|
|
+ HDMITX_MATMODE_NO_CHANGE = 2, /**< No change */
|
|
+ HDMITX_MATMODE_INVALID = 3 /**< Invalid */
|
|
+} bsl_mat_mode_t;
|
|
+
|
|
+/** Datapath bitwidth */
|
|
+typedef enum {
|
|
+ HDMITX_VOUT_DBITS_12 = 0, /**< 12 bits */
|
|
+ HDMITX_VOUT_DBITS_8 = 1, /**< 8 bits */
|
|
+ HDMITX_VOUT_DBITS_10 = 2, /**< 10 bits */
|
|
+ HDMITX_VOUT_DBITS_NO_CHANGE = 3, /**< No change */
|
|
+ HDMITX_VOUT_DBITS_INVALID = 4 /**< Invalid */
|
|
+} bsl_vout_dbits_t;
|
|
+
|
|
+/**
|
|
+ * \brief Set main video input and output parameters
|
|
+ *
|
|
+ * \param[in] txUnit Transmitter unit number
|
|
+ * \param[in] vinFmt EIA/CEA Video input format: 1 to 31, 0 = No Change
|
|
+ * \param[in] scaMode Scaler mode: Off, On, Auto, No Change
|
|
+ * \param[in] voutFmt EIA/CEA Video output format: 1 to 31, 0 = No Change
|
|
+ * \param[in] uPixelRepeat Pixel repetition factor: 0 to 9, 10 = default,
|
|
+ * 11 = no change
|
|
+ * \param[in] matMode Matrix mode: 0 = off, 1 = auto
|
|
+ * \param[in] datapathBits Datapath bitwidth: 0 to 3 (8, 10, 12, No Change)
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - Else a problem has been detected:
|
|
+ * - ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number
|
|
+ * - ERR_HDMI_BAD_PARAMETER: a parameter was out of range
|
|
+ * - ERR_HDMI_NOT_INITIALIZED: transmitter not initialized
|
|
+ * - ERR_HDMI_INCONSISTENT_PARAMS: params are inconsistent
|
|
+ * - ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus
|
|
+ * */
|
|
+error_code_t
|
|
+bsl_video_set_in_out
|
|
+(
|
|
+ unit_select_t tx_unit,
|
|
+ bsl_vid_fmt_t vin_fmt,
|
|
+ bsl_sca_mode_t sca_mode,
|
|
+ bsl_vid_fmt_t vout_fmt,
|
|
+ u8 u_pixel_repeat,
|
|
+ bsl_mat_mode_t mat_mode,
|
|
+ bsl_vout_dbits_t datapath_bits,
|
|
+ bsl_vqr_t dvi_vqr
|
|
+);
|
|
+
|
|
+/**
|
|
+ * \brief Use only for debug to flag the software debug interrupt
|
|
+ *
|
|
+ * \param[in] txUnit Transmitter unit number
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - Else a problem has been detected:
|
|
+ * - ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number
|
|
+ * - ERR_HDMI_NOT_INITIALIZED: transmitter not initialized
|
|
+ * - ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus
|
|
+ * */
|
|
+error_code_t
|
|
+bsl_flag_sw_int
|
|
+(
|
|
+ unit_select_t tx_unit
|
|
+)
|
|
+;
|
|
+
|
|
+/**
|
|
+ * \brief Return the category of equipement connected
|
|
+ *
|
|
+ * \param txUnit Transmitter unit number
|
|
+ * \param category return category type
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_HDMI_BAD_UNIT_NUMBER: the unit number is wrong or
|
|
+ * the receiver instance is not initialised
|
|
+ * - ERR_HDMI_INCONSISTENT_PARAMS: params are inconsistent
|
|
+ * - ERR_HDMI_OPERATION_NOT_PERMITTED hdcp not started
|
|
+ *
|
|
+ * */
|
|
+error_code_t
|
|
+bsl_hdcp_get_sink_category
|
|
+(
|
|
+ unit_select_t tx_unit,
|
|
+ bsl_sink_category_t *category
|
|
+);
|
|
+
|
|
+#endif /* BSLHDMITX_H */
|
|
+/*============================================================================*/
|
|
+/* END OF FILE */
|
|
+/*============================================================================*/
|
|
+
|
|
diff --git a/drivers/video/hdmi/comps/tmbslTDA9983/inc/tmbslHdmiTx_app.h b/drivers/video/hdmi/comps/tmbslTDA9983/inc/tmbslHdmiTx_app.h
|
|
new file mode 100755
|
|
index 0000000..660e0ac
|
|
--- /dev/null
|
|
+++ b/drivers/video/hdmi/comps/tmbslTDA9983/inc/tmbslHdmiTx_app.h
|
|
@@ -0,0 +1,551 @@
|
|
+/**
|
|
+ * Copyright (C) 2006 Koninklijke Philips Electronics N.V., All Rights Reserved.
|
|
+ * This source code and any compilation or derivative thereof is the proprietary
|
|
+ * information of Koninklijke Philips Electronics N.V. and is confidential in
|
|
+ * nature. Under no circumstances is this software to be exposed to or placed
|
|
+ * under an Open Source License of any type without the expressed written
|
|
+ * permission of Koninklijke Philips Electronics N.V.
|
|
+ *
|
|
+ * \file bsl_app.h
|
|
+ *
|
|
+ * \version $Revision: 23 $
|
|
+ *
|
|
+ * \date $Date: 10/10/07 11:11 $
|
|
+ *
|
|
+ * \brief Application-level API for BSL driver component for the
|
|
+ * TDA998x HDMI Transmitter
|
|
+ *
|
|
+ * \section refs Reference Documents
|
|
+ * HDMI Driver - Outline Architecture.doc,
|
|
+ * HDMI Driver - bsl - SCS.doc
|
|
+ *
|
|
+ * \section info Change Information
|
|
+ *
|
|
+ * \verbatim
|
|
+ *
|
|
+ * $History: bsl_app.h $
|
|
+ *
|
|
+ ****************** version 23 ****************
|
|
+ * User: G. Burnouf Date: 18/02/08
|
|
+ * Updated in $/Source/bsl/Inc
|
|
+ * PR1355 : Set audio channel allocation
|
|
+ *
|
|
+ * **************** Version 22 ****************
|
|
+ * User: B.Vereecke Date: 10/10/07 Time: 11:11
|
|
+ * Updated in $/Source/bsl/Inc
|
|
+ * PR815 : Update bluescreen infoframes
|
|
+ * According to the output mode
|
|
+ *
|
|
+ * * ************** Version 21 *****************
|
|
+ * User: B.Vereecke Date: 30/08/07 Time: 14:45
|
|
+ * Updated in $/Source/bsl/Inc
|
|
+ * PR4 - add new appHdmiTx_ReadEdidAtPowerOn()
|
|
+ * function, calling result after resuming
|
|
+ * from power_down is an EDID reading.
|
|
+ *
|
|
+ * * ************** Version 20 *****************
|
|
+ * User: B.Vereecke Date: 20/07/07 Time: 17:30
|
|
+ * Updated in $/Source/bsl/Inc
|
|
+ * PR502 - Add new appHdmiTx_setAudio() function
|
|
+ * for change Audio parameters without update
|
|
+ * video input/output
|
|
+ *
|
|
+ ***************** version 19 ******************
|
|
+ * User: B.Vereecke Date: 19/07/07 Time: 10:30
|
|
+ * Updated in $/Source/bsl/Inc
|
|
+ * PR511 - add new PixelEdge argument in
|
|
+ * appHdmiTx_setInputOutput
|
|
+ *
|
|
+ * ***************** Version 18 ******************
|
|
+ * User: B.Vereecke Date: 17/07/07 Time: 10:30
|
|
+ * Updated in $/Source/bsl/Inc
|
|
+ * PR217 - Add Pattern type parameter to
|
|
+ * appHdmiTx_test_pattern_on API in order
|
|
+ * to add blue pattern functionality
|
|
+ *
|
|
+ * ***************** Version 17 ******************
|
|
+ * User: J. Lamotte Date: 29/06/07 Time: 15:50
|
|
+ * Updated in $/Source/bsl/Inc
|
|
+ * PR210 - Add video output format parameter to
|
|
+ * appHdmiTx_test_pattern_on API in order
|
|
+ * to update AVI info frame for color bar.
|
|
+ *
|
|
+ * ***************** Version 16 *****************
|
|
+ * User: Mayhew Date: 27/10/06 Time: 12:34
|
|
+ * Updated in $/Source/bsl/Inc
|
|
+ * PNF59 Test pattern API split into _on and _off APIs
|
|
+ * PNF59 appHdmiTx_handleBCAPS has new pbBksvSecure parameter
|
|
+ *
|
|
+ * ***************** Version 14 *****************
|
|
+ * User: Mayhew Date: 13/10/06 Time: 11:02
|
|
+ * Updated in $/Source/bsl/Inc
|
|
+ * PNF37 appHdmiTx_setInputOutput syncIn arg. is now syncSource
|
|
+ *
|
|
+ * ***************** Version 12 *****************
|
|
+ * User: Mayhew Date: 15/09/06 Time: 15:56
|
|
+ * Updated in $/Source/bsl/Inc
|
|
+ * PNF19 Add i2sQualifier arg to setInputOutput
|
|
+ * PNF25 Add pEdidVidFlags arg to handleHPD
|
|
+ *
|
|
+ * ***************** Version 11 *****************
|
|
+ * User: Mayhew Date: 10/07/06 Time: 12:33
|
|
+ * Updated in $/Source/bsl/Inc
|
|
+ * Add pbVerified parameter to _setInputOutput. Fix Doxygen comment
|
|
+ * warnings.
|
|
+ *
|
|
+ * ***************** Version 9 *****************
|
|
+ * User: Mayhew Date: 30/06/06 Time: 12:42
|
|
+ * Updated in $/Source/bsl/Inc
|
|
+ * Add audioFmt parameter to appHdmiTx_setInputOutput
|
|
+ *
|
|
+ * ***************** Version 7 *****************
|
|
+ * User: Mayhew Date: 5/06/06 Time: 14:38
|
|
+ * Updated in $/Source/bsl/Inc
|
|
+ * Rename syncSrc to syncIn. Remove 2nd param from handleBCAPS. Add
|
|
+ * pVidFmtNew param to appHdmiTx_nextEdidVidFmt.
|
|
+ *
|
|
+ * ***************** Version 5 *****************
|
|
+ * User: Mayhew Date: 22/05/06 Time: 15:55
|
|
+ * Updated in $/Source/bsl/Inc
|
|
+ * Add pixRate to appHdmiTx_setInputOutput. Add appHdmiTx_nextEdidVidFmt.
|
|
+ *
|
|
+ * ***************** Version 3 *****************
|
|
+ * User: Mayhew Date: 19/05/06 Time: 11:29
|
|
+ * Updated in $/Source/bsl/Inc
|
|
+ * Add options parameter to appHdmiTx_Hdcp_On
|
|
+ *
|
|
+ * ***************** Version 2 *****************
|
|
+ * User: Mayhew Date: 10/05/06 Time: 17:01
|
|
+ * Updated in $/Source/bsl/Inc
|
|
+ * New APIs for HDCP and parameterised format setting
|
|
+ *
|
|
+ * ***************** Version 1 *****************
|
|
+ * User: Mayhew Date: 4/04/06 Time: 16:27
|
|
+ * Created in $/Source/bsl/Inc
|
|
+ * Driver demo app API phase 2
|
|
+ *
|
|
+ * \endverbatim
|
|
+ *
|
|
+ * */
|
|
+
|
|
+#ifndef BSLHDMITX_APP_H
|
|
+#define BSLHDMITX_APP_H
|
|
+
|
|
+/*============================================================================*/
|
|
+/* INCLUDE FILES */
|
|
+/*============================================================================*/
|
|
+
|
|
+/*============================================================================*/
|
|
+/* MACRO DEFINITIONS */
|
|
+/*============================================================================*/
|
|
+
|
|
+/*============================================================================*/
|
|
+/* ENUM OR TYPE DEFINITIONS */
|
|
+/*============================================================================*/
|
|
+
|
|
+/*============================================================================*/
|
|
+/* EXTERN DATA DEFINITIONS */
|
|
+/*============================================================================*/
|
|
+
|
|
+/*============================================================================*/
|
|
+/* EXTERN FUNCTION PROTOTYPES */
|
|
+/*============================================================================*/
|
|
+
|
|
+/*============================================================================*/
|
|
+/**
|
|
+ * \brief Initialise demo application
|
|
+ * */
|
|
+void
|
|
+app_hdmi_tx_init(void);
|
|
+
|
|
+/*============================================================================*/
|
|
+/**
|
|
+ * \brief Set colourbar test pattern on with RGB infoframe
|
|
+ *
|
|
+ * \param[in] txUnit Transmitter unit number
|
|
+ * \param[in] voutFmt Video output format
|
|
+ * \param[in] pattern type of pattern
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - Else a problem has been detected
|
|
+ * */
|
|
+error_code_t
|
|
+app_hdmi_tx_test_pattern_on
|
|
+(
|
|
+ unit_select_t tx_unit,
|
|
+ bsl_vid_fmt_t vout_fmt,
|
|
+ bsl_vout_mode_t vout_mode,
|
|
+ bsl_test_pattern_t pattern
|
|
+);
|
|
+
|
|
+/*============================================================================*/
|
|
+/**
|
|
+ * \brief Set colourbar test pattern off with previous infoframe
|
|
+ *
|
|
+ * \param[in] txUnit Transmitter unit number
|
|
+ * \param[in] voutFmt Video output format
|
|
+ * \param[in] voutMode Video output mode
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - Else a problem has been detected
|
|
+ * */
|
|
+error_code_t
|
|
+app_hdmi_tx_test_pattern_off
|
|
+(
|
|
+ unit_select_t tx_unit,
|
|
+ bsl_vid_fmt_t vout_fmt,
|
|
+ bsl_vout_mode_t vout_mode
|
|
+);
|
|
+
|
|
+/*============================================================================*/
|
|
+/**
|
|
+ * \brief Set input and output formats, modes, sync source, sink type
|
|
+ * and audio rate
|
|
+ *
|
|
+ * \param[in] txUnit Transmitter unit number
|
|
+ * \param[in] vinFmt Video input format
|
|
+ * \param[in] vinMode Video input mode
|
|
+ * \param[in] voutFmt Video output format
|
|
+ * \param[in] voutMode Video output mode
|
|
+ * \param[in] syncSource Video input sync source
|
|
+ * \param[in] sinkType Downstream receiver sink type
|
|
+ * \param[in] audioFmt Audio format
|
|
+ * \param[in] audioRate Audio sample rate
|
|
+ * \param[in] i2sQualifier Audio I2S qualifier: 8=channels; 16,32=bits
|
|
+ * \param[in] pixRate Pixel rate
|
|
+ * \param[in] pixelEdge Pixel edge
|
|
+ * \param[out] pbVerified Pointer to flag set when the requested combination
|
|
+ * of formats and modes has previously been verified
|
|
+ * during testing
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - Else a problem has been detected
|
|
+ * */
|
|
+error_code_t
|
|
+app_hdmi_tx_set_input_output
|
|
+(
|
|
+ unit_select_t tx_unit,
|
|
+ bsl_vid_fmt_t vin_fmt,
|
|
+ bsl_vin_mode_t vin_mode,
|
|
+ bsl_vid_fmt_t vout_fmt,
|
|
+ bsl_vout_mode_t vout_mode,
|
|
+ bsl_sync_source_t sync_source,
|
|
+ bsl_sink_type_t sink_type,
|
|
+ bsla_fmt_t audio_fmt,
|
|
+ bslafs_t audio_rate,
|
|
+ u8 i2s_qualifier,
|
|
+ bsl_pix_rate_t pix_rate,
|
|
+ bsl_pix_edge_t pixel_edge,
|
|
+ /* Returns true if requested combination
|
|
+ * bool *pb_verified
|
|
+ * has been verified */
|
|
+);
|
|
+
|
|
+/*============================================================================*/
|
|
+/**
|
|
+ * \brief Set audio format and audio rate
|
|
+ *
|
|
+ * \param[in] txUnit Transmitter unit number
|
|
+ *
|
|
+ * \param[in] sinkType Downstream receiver sink type
|
|
+ * \param[in] audioFmt Audio format
|
|
+ * \param[in] audioRate Audio sample rate
|
|
+ * \param[in] i2sQualifier Audio I2S qualifier: 8=channels; 16,32=bits
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - Else a problem has been detected
|
|
+ * */
|
|
+error_code_t
|
|
+app_hdmi_tx_set_audio
|
|
+(
|
|
+ unit_select_t tx_unit,
|
|
+ bsl_vid_fmt_t vout_fmt,
|
|
+ bsl_sink_type_t sink_type,
|
|
+ bsla_fmt_t audio_fmt,
|
|
+ bslafs_t audio_rate,
|
|
+ u8 i2s_qualifier
|
|
+);
|
|
+
|
|
+/*============================================================================*/
|
|
+/**
|
|
+ * \brief Set audio channel allocation
|
|
+ *
|
|
+ * \param[in] ChannelAllocation audio channel allocation
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - void
|
|
+ * */
|
|
+void
|
|
+app_hdmi_tx_set_audio_channel_allocation
|
|
+(
|
|
+ u8 channel_allocation
|
|
+);
|
|
+
|
|
+/*============================================================================*/
|
|
+/**
|
|
+ * \brief Switch on HDCP
|
|
+ *
|
|
+ * \param[in] txUnit Transmitter unit number
|
|
+ * \param[in] voutFmt Current CEA output format
|
|
+ * \param[in] options HDCP options (HDMITX_HDCP_OPTION_FORCE_ values)
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - Else a problem has been detected
|
|
+ * */
|
|
+error_code_t
|
|
+app_hdmi_tx_hdcp_on
|
|
+(
|
|
+ unit_select_t tx_unit,
|
|
+ bsl_vid_fmt_t vout_fmt,
|
|
+ bsl_hdcp_options_t options
|
|
+);
|
|
+
|
|
+/*============================================================================*/
|
|
+/**
|
|
+ * \brief Switch off HDCP
|
|
+ *
|
|
+ * \param[in] txUnit Transmitter unit number
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - Else a problem has been detected
|
|
+ * */
|
|
+error_code_t
|
|
+app_hdmi_tx_hdcp_off
|
|
+(
|
|
+ unit_select_t tx_unit
|
|
+);
|
|
+
|
|
+/*============================================================================*/
|
|
+/**
|
|
+ * \brief Handle HDCP BCAPS interrupt as a callback
|
|
+ *
|
|
+ * \param[in] txUnit Transmitter unit number
|
|
+ * \param[out] pbBksvSecure BKSV check result
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - Else a problem has been detected
|
|
+ * */
|
|
+error_code_t
|
|
+app_hdmi_tx_handle_bcaps
|
|
+(
|
|
+ unit_select_t tx_unit,
|
|
+ bool *pb_bksv_secure
|
|
+);
|
|
+
|
|
+/*============================================================================*/
|
|
+/**
|
|
+ * \brief Handle HDCP BSTATUS interrupt as a callback
|
|
+ *
|
|
+ * \param[in] txUnit Transmitter unit number
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - Else a problem has been detected
|
|
+ * */
|
|
+error_code_t
|
|
+app_hdmi_tx_handle_bstatus
|
|
+(
|
|
+ unit_select_t tx_unit
|
|
+);
|
|
+
|
|
+/*============================================================================*/
|
|
+/**
|
|
+ * \brief Handle HDCP ENCRYPT interrupt as a callback
|
|
+ *
|
|
+ * \param[in] txUnit Transmitter unit number
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - Else a problem has been detected
|
|
+ * */
|
|
+error_code_t
|
|
+app_hdmi_tx_handle_encrypt
|
|
+(
|
|
+ unit_select_t tx_unit
|
|
+);
|
|
+
|
|
+/*============================================================================*/
|
|
+/**
|
|
+ * \brief Handle HDCP PJ interrupt as a callback
|
|
+ *
|
|
+ * \param[in] txUnit Transmitter unit number
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - Else a problem has been detected
|
|
+ * */
|
|
+error_code_t
|
|
+app_hdmi_tx_handle_pj
|
|
+(
|
|
+ unit_select_t tx_unit
|
|
+);
|
|
+
|
|
+/*============================================================================*/
|
|
+/**
|
|
+ * \brief Handle HDCP SHA_1 interrupt as a callback
|
|
+ *
|
|
+ * \param[in] txUnit Transmitter unit number
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - Else a problem has been detected
|
|
+ * */
|
|
+error_code_t
|
|
+app_hdmi_tx_handle_sha_1
|
|
+(
|
|
+ unit_select_t tx_unit
|
|
+);
|
|
+
|
|
+/*============================================================================*/
|
|
+/**
|
|
+ * \brief Handle HDCP T0 interrupt as a callback
|
|
+ *
|
|
+ * \param[in] txUnit Transmitter unit number
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - Else a problem has been detected
|
|
+ * */
|
|
+error_code_t
|
|
+app_hdmi_tx_handle_t0
|
|
+(
|
|
+ unit_select_t tx_unit
|
|
+);
|
|
+
|
|
+/*============================================================================*/
|
|
+/**
|
|
+ * \brief Handle Hot Plug Detect interrupt as a callback
|
|
+ *
|
|
+ * \param[in] txUnit Transmitter unit number
|
|
+ * \param[out] pHotPlugStatus Pointer to hot plug status
|
|
+ * \param[out] pEdidStatus Copy of pDis->EdidStatus
|
|
+ * \param[out] pEdidVidFlags Ptr to video capability flags
|
|
+ * See enum _bslVidCap_t
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - Else a problem has been detected
|
|
+ * */
|
|
+error_code_t
|
|
+app_hdmi_tx_handle_hpd
|
|
+(
|
|
+ unit_select_t tx_unit,
|
|
+ bsl_hot_plug_t *p_hot_plug_status,
|
|
+ u8 *p_edid_status,
|
|
+ u8 *p_edid_vid_flags
|
|
+);
|
|
+
|
|
+/*============================================================================*/
|
|
+/**
|
|
+ * \brief Get the pointer to the KSV list used by the App unit
|
|
+ *
|
|
+ * \param[in] ppKsvList Pointer to pointer to KSV list
|
|
+ * \param[in] pKsvDevices Pointer to device count 0 to 128
|
|
+ *
|
|
+ * \return None
|
|
+ * */
|
|
+void
|
|
+app_hdmi_tx_get_ksv_list
|
|
+(
|
|
+ u8 **pp_ksv_list,
|
|
+ u8 *p_ksv_devices
|
|
+);
|
|
+
|
|
+/*============================================================================*/
|
|
+/**
|
|
+ * \brief Get the pointer to the BKSV used by the App unit
|
|
+ *
|
|
+ * \param[in] ppBksv Pointer to pointer to BKSV
|
|
+ *
|
|
+ * \return None
|
|
+ * */
|
|
+void
|
|
+app_hdmi_tx_get_bksv
|
|
+(
|
|
+ u8 **pp_bksv
|
|
+);
|
|
+
|
|
+/*============================================================================*/
|
|
+/**
|
|
+ * \brief Check a video format against the Short Video
|
|
+ * Descriptors last read from EDID
|
|
+ *
|
|
+ * \param[in] vidFmt Video format to check
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - true: vidFmt is in SVD list
|
|
+ * - false: not in list
|
|
+ * */
|
|
+bool
|
|
+app_hdmi_tx_check_vid_fmt
|
|
+(
|
|
+ bsl_vid_fmt_t vid_fmt
|
|
+);
|
|
+
|
|
+/*============================================================================*/
|
|
+/**
|
|
+ * \brief Find the next video format in the Short Video Descriptors list
|
|
+ * last read from the EDID
|
|
+ *
|
|
+ * \param[in] vidFmtOld Video format whose successor must be found
|
|
+ * \param[in] *pVidFmtNew Ptr to a variable to receive the next higher
|
|
+ * video format or the first format in SVD list
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - true: a format was found
|
|
+ * - false: no format was found because the list was empty
|
|
+ * */
|
|
+bool
|
|
+app_hdmi_tx_next_edid_vid_fmt
|
|
+(
|
|
+ bsl_vid_fmt_t vid_fmt_old,
|
|
+ bsl_vid_fmt_t *p_vid_fmt_new
|
|
+);
|
|
+
|
|
+/*============================================================================*/
|
|
+/**
|
|
+ * \brief Read Edid after PowerOn
|
|
+ *
|
|
+ * \param[in] txUnit Transmitter unit number
|
|
+ * \param[out] pEdidStatus Copy of pDis->EdidStatus
|
|
+ * \param[out] pEdidVidFlags Ptr to video capability flags
|
|
+ * See enum _bslVidCap_t
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - Else a problem has been detected
|
|
+ * */
|
|
+error_code_t
|
|
+app_hdmi_tx_read_edid_at_power_on
|
|
+(
|
|
+ unit_select_t tx_unit,
|
|
+ u8 *p_edid_status,
|
|
+ u8 *p_edid_vid_flags
|
|
+);
|
|
+
|
|
+/*============================================================================*/
|
|
+/**
|
|
+ * \brief set revocation list
|
|
+ *
|
|
+ * \param[in] listPtr pointer on revocation list
|
|
+ * \param[in] Length number of bksv in revocation list
|
|
+ * */
|
|
+error_code_t
|
|
+app_hdmi_tx_set_hdcprevocation_list
|
|
+(
|
|
+ void *list_ptr,
|
|
+ u32 length
|
|
+);
|
|
+
|
|
+#endif /* BSLHDMITX_APP_H */
|
|
+/*============================================================================*/
|
|
+/* END OF FILE */
|
|
+/*============================================================================*/
|
|
+
|
|
diff --git a/drivers/video/hdmi/comps/tmbslTDA9983/src/tmbslHdmiTx_1.c b/drivers/video/hdmi/comps/tmbslTDA9983/src/tmbslHdmiTx_1.c
|
|
new file mode 100755
|
|
index 0000000..fe78bd4
|
|
--- /dev/null
|
|
+++ b/drivers/video/hdmi/comps/tmbslTDA9983/src/tmbslHdmiTx_1.c
|
|
@@ -0,0 +1,5520 @@
|
|
+/**
|
|
+ * Copyright (C) 2006 Koninklijke Philips Electronics N.V., All Rights Reserved.
|
|
+ * This source code and any compilation or derivative thereof is the proprietary
|
|
+ * information of Koninklijke Philips Electronics N.V. and is confidential in
|
|
+ * nature. Under no circumstances is this software to be exposed to or placed
|
|
+ * under an Open Source License of any type without the expressed written
|
|
+ * permission of Koninklijke Philips Electronics N.V.
|
|
+ *
|
|
+ * \file bsl_1.c
|
|
+ *
|
|
+ * \version $Revision: 85 $
|
|
+ *
|
|
+ * \date $Date: 21/01/08 $
|
|
+ *
|
|
+ * \brief BSL driver component for the TDA998x HDMI Transmitter
|
|
+ *
|
|
+ * \section refs Reference Documents
|
|
+ * HDMI Driver - Outline Architecture.doc
|
|
+ * HDMI Driver - bsl - SCS.doc
|
|
+ *
|
|
+ * */
|
|
+
|
|
+/*============================================================================*/
|
|
+/* FILE CONFIGURATION */
|
|
+/*============================================================================*/
|
|
+
|
|
+#include <linux/kernel.h>
|
|
+
|
|
+/* Defining this symbol on the compiler command line excludes some API checks */
|
|
+/* #define NO_RETIF_BADPARAM */
|
|
+
|
|
+/* Defining this symbol on the compiler command line excludes some API checks */
|
|
+/* #define NO_RETIF_REG_FAIL */
|
|
+
|
|
+/* Defining this symbol on the compiler command line excludes unused code */
|
|
+/* #define DEMO_BUILD */
|
|
+
|
|
+/* Defining this symbol on the compiler command line adapts code for testing */
|
|
+/* #define UNIT_TEST */
|
|
+
|
|
+/*============================================================================*/
|
|
+/* STANDARD INCLUDE FILES */
|
|
+/*============================================================================*/
|
|
+
|
|
+/*============================================================================*/
|
|
+/* PROJECT INCLUDE FILES */
|
|
+/*============================================================================*/
|
|
+#include "tmbslHdmiTx.h"
|
|
+#include "tmbslHdmiTx_local.h"
|
|
+
|
|
+/*============================================================================*/
|
|
+/* MACRO DEFINITIONS */
|
|
+/*============================================================================*/
|
|
+
|
|
+/*============================================================================*/
|
|
+/* TYPE DEFINITIONS */
|
|
+/*============================================================================*/
|
|
+
|
|
+#define SSD_UNUSED_VALUE 0xF0
|
|
+
|
|
+#ifdef FORMAT_PC
|
|
+#define DEPTH_COLOR_PC 1 /* PC_FORMAT only 8 bits available */
|
|
+#endif /* FORMAT_PC */
|
|
+
|
|
+/*============================================================================*/
|
|
+/* PUBLIC VARIABLE DEFINITIONS */
|
|
+/*============================================================================*/
|
|
+
|
|
+/*============================================================================*/
|
|
+/* STATIC CONSTANT DECLARATIONS */
|
|
+/*============================================================================*/
|
|
+
|
|
+/** Preset default values for an object instance */
|
|
+static CONST_DAT hdmi_txobject_t k_hdmi_tx_instance_default
|
|
+= {
|
|
+ ST_UNINITIALIZED, /* state */
|
|
+ 0, /* nIgnoredEvents */
|
|
+ unit0, /* txUnit */
|
|
+ 0, /* uHwAddress */
|
|
+ (pbsl_sys_func_t)0, /* sysFuncWrite */
|
|
+ (pbsl_sys_func_t)0, /* sysFuncRead */
|
|
+ (pbsl_sys_func_edid_t)0, /* sysFuncEdidRead */
|
|
+ (pbsl_sys_func_timer_t)0, /* sysFuncTimer */
|
|
+ { /* funcIntCallbacks[] */
|
|
+ (pbsl_callback_t)0
|
|
+ },
|
|
+ { /* uSupportedVersions[] */
|
|
+ E_DEV_VERSION_N4, /* <=== Applies to N5 also */
|
|
+ E_DEV_VERSION_LIST_END
|
|
+ },
|
|
+ E_DEV_VERSION_LIST_END, /* uDeviceVersion */
|
|
+ E_DEV_VERSION_LIST_END, /* uDeviceFeatures */
|
|
+ power_on, /* ePowerState */
|
|
+ false, /* EdidAlternateAddr */
|
|
+ HDMITX_SINK_DVI, /* sinkType */
|
|
+ HDMITX_SINK_DVI, /* EdidSinkType */
|
|
+ false, /* EdidSinkAi */
|
|
+ 0, /* EdidCeaFlags */
|
|
+ HDMITX_EDID_NOT_READ, /* EdidStatus */
|
|
+ 0, /* NbDTDStored */
|
|
+ { /* EdidDTD: */
|
|
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, /* 1 */
|
|
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, /*2 */
|
|
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, /*3 */
|
|
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, /*4 */
|
|
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, /*5 */
|
|
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, /*6 */
|
|
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, /*7 */
|
|
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, /*8 */
|
|
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, /*9 */
|
|
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} /*10*/
|
|
+ },
|
|
+ { /* EdidMonitorDescriptor */
|
|
+ false, /* bDescRecord */
|
|
+ /* uMonitorName[EDID_MONITOR_DESCRIPTOR_SIZE] */
|
|
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
|
|
+ },
|
|
+ {
|
|
+ false, /* bDescRecord */
|
|
+ /* uMinVerticalRate */
|
|
+ 0,
|
|
+ /* uMaxVerticalRate */
|
|
+ 0,
|
|
+ /* uMinHorizontalRate */
|
|
+ 0,
|
|
+ /* uMaxHorizontalRate */
|
|
+ 0,
|
|
+ /* uMaxSupportedPixelClk */
|
|
+ 0
|
|
+ },
|
|
+ {
|
|
+ false, /* bDescRecord */
|
|
+ /* uOtherDescriptor[EDID_MONITOR_DESCRIPTOR_SIZE] */
|
|
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
|
|
+ },
|
|
+ { /* EdidVFmts[] */
|
|
+ HDMITX_VFMT_NULL
|
|
+ },
|
|
+ 0, /* EdidSvdCnt */
|
|
+ { /* EdidAFmts[]. */
|
|
+ {0, 0, 0} /* {ModeChans, Freqs, Byte3} */
|
|
+ },
|
|
+ 0, /* EdidSadCnt */
|
|
+ {
|
|
+ 0 /* EdidBlock[ ] */
|
|
+ },
|
|
+ 0, /* EdidBlockCnt */
|
|
+ 0, /* EdidSourceAddress */
|
|
+ { /* EDIDBasicDisplayParam */
|
|
+ 0, /* uVideoInputDef */
|
|
+ 0, /* uMaxHorizontalSize */
|
|
+ 0, /* uMaxVerticalSize */
|
|
+ 0, /* uGamma */
|
|
+ 0, /* uFeatureSupport */
|
|
+ },
|
|
+ HDMITX_VFMT_NULL, /* vinFmt */
|
|
+ HDMITX_VFMT_NULL, /* voutFmt */
|
|
+ HDMITX_PIXRATE_DOUBLE, /* pixRate */
|
|
+ HDMITX_VINMODE_RGB444, /* vinMode */
|
|
+ HDMITX_VOUTMODE_RGB444, /* voutMode */
|
|
+ HDMITX_VFREQ_INVALID, /* voutFreq */
|
|
+ HDMITX_SCAMODE_OFF, /* scaMode */
|
|
+ HDMITX_UPSAMPLE_AUTO, /* upsampleMode */
|
|
+ HDMITX_PIXREP_MIN, /* pixelRepeatCount */
|
|
+ HDMITX_HOTPLUG_INVALID, /* hotPlugStatus */
|
|
+#ifdef TMFL_TDA9981_SUPPORT
|
|
+#ifdef TMFL_RX_SENSE_ON
|
|
+ HDMITX_RX_SENSE_INVALID, /* rxSenseStatus */
|
|
+#endif /* TMFL_RX_SENSE_ON */
|
|
+#endif /* TMFL_TDA9981_SUPPORT */
|
|
+ E_PAGE_INVALID, /* curRegPage */
|
|
+ {
|
|
+ /* These match power-up defaults. shadowReg[]: */
|
|
+ 0x00, /* E_SP00_MAIN_CNTRL0 */
|
|
+ 0x00, /* E_SP00_INT_FLAGS_0 */
|
|
+ 0x00, /* E_SP00_INT_FLAGS_1 */
|
|
+#ifdef TMFL_TDA9981_SUPPORT
|
|
+ 0x00, /* E_SP00_INT_FLAGS_2 */
|
|
+#endif /* TMFL_TDA9981_SUPPORT */
|
|
+ 0x01, /* E_SP00_VIP_CNTRL_0 */
|
|
+ 0x24, /* E_SP00_VIP_CNTRL_1 */
|
|
+ 0x56, /* E_SP00_VIP_CNTRL_2 */
|
|
+ 0x17, /* E_SP00_VIP_CNTRL_3 */
|
|
+ 0x01, /* E_SP00_VIP_CNTRL_4 */
|
|
+ 0x00, /* E_SP00_VIP_CNTRL_5 */
|
|
+ 0x05, /* E_SP00_MAT_CONTRL */
|
|
+ 0x00, /* E_SP00_TBG_CNTRL_0 */
|
|
+ 0x00, /* E_SP00_TBG_CNTRL_1 */
|
|
+ 0x00, /* E_SP00_HVF_CNTRL_0 */
|
|
+ 0x00, /* E_SP00_HVF_CNTRL_1 */
|
|
+ 0x00, /* E_SP00_TIMER_H */
|
|
+ 0x00, /* E_SP00_DEBUG_PROBE */
|
|
+ 0x00 /* E_SP00_AIP_CLKSEL */
|
|
+#ifndef TMFL_TDA9981_SUPPORT
|
|
+ , 0x00 /* E_SP01_SC_VIDFORMAT*/
|
|
+ , 0x00 /* E_SP01_SC_CNTRL */
|
|
+ , 0x00 /* E_SP01_TBG_CNTRL_0 */
|
|
+#endif /* TMFL_TDA9981_SUPPORT */
|
|
+ },
|
|
+ false, /* Init prevBluescreen to false */
|
|
+ false, /* Init prevPattern to false */
|
|
+ false /* bInitialized */
|
|
+};
|
|
+
|
|
+/**
|
|
+ * Lookup table to convert from EIA/CEA TV video formats used in the EDID and
|
|
+ * in API parameters to pixel clock frequencies, according to SCS Table
|
|
+ * "HDMI Pixel Clock Frequencies per EIA/CEA-861B Video Output Format".
|
|
+ * The other index is the veritical frame frequency.
|
|
+ * */
|
|
+
|
|
+static CONST_DAT u8 k_vfmt_to_pix_clk_tv[HDMITX_VFMT_TV_NUM][HDMITX_VFREQ_NUM] = {
|
|
+ /* HDMITX_VFREQ_24Hz HDMITX_VFREQ_25Hz HDMITX_VFREQ_30Hz HDMITX_VFREQ_50Hz HDMITX_VFREQ_59Hz HDMITX_VFREQ_60Hz */
|
|
+ /* HDMITX_VFMT_NULL */
|
|
+ {E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID},
|
|
+ /* HDMITX_VFMT_01_640x480p_60Hz */
|
|
+ {E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_25175, E_PIXCLK_25200},
|
|
+ /* HDMITX_VFMT_02_720x480p_60Hz */
|
|
+ {E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_27000, E_PIXCLK_27027},
|
|
+ /* HDMITX_VFMT_03_720x480p_60Hz */
|
|
+ {E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_27000, E_PIXCLK_27027},
|
|
+ /* HDMITX_VFMT_04_1280x720p_60Hz */
|
|
+ {E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_74175, E_PIXCLK_74250},
|
|
+ /* HDMITX_VFMT_05_1920x1080i_60Hz */
|
|
+ {E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_74175, E_PIXCLK_74250},
|
|
+ /* HDMITX_VFMT_06_720x480i_60Hz */
|
|
+ {E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_27000, E_PIXCLK_27027},
|
|
+ /* HDMITX_VFMT_07_720x480i_60Hz */
|
|
+ {E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_27000, E_PIXCLK_27027},
|
|
+ /* HDMITX_VFMT_08_720x240p_60Hz */
|
|
+ {E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_27000, E_PIXCLK_27027},
|
|
+ /* HDMITX_VFMT_09_720x240p_60Hz */
|
|
+ {E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_27000, E_PIXCLK_27027},
|
|
+ /* HDMITX_VFMT_10_720x480i_60Hz */
|
|
+ {E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_54000, E_PIXCLK_54054},
|
|
+ /* HDMITX_VFMT_11_720x480i_60Hz */
|
|
+ {E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_54000, E_PIXCLK_54054},
|
|
+ /* HDMITX_VFMT_12_720x240p_60Hz */
|
|
+ {E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_54000, E_PIXCLK_54054},
|
|
+ /* HDMITX_VFMT_13_720x240p_60Hz */
|
|
+ {E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_54000, E_PIXCLK_54054},
|
|
+ /* HDMITX_VFMT_14_1440x480p_60Hz */
|
|
+ {E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_54000, E_PIXCLK_54054},
|
|
+ /* HDMITX_VFMT_15_1440x480p_60Hz */
|
|
+ {E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_54000, E_PIXCLK_54054},
|
|
+ /* HDMITX_VFMT_16_1920x1080p_60Hz */
|
|
+ {E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_148350, E_PIXCLK_148500},
|
|
+ /* HDMITX_VFMT_17_720x576p_50Hz */
|
|
+ {E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_27000, E_PIXCLK_INVALID, E_PIXCLK_INVALID},
|
|
+ /* HDMITX_VFMT_18_720x576p_50Hz */
|
|
+ {E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_27000, E_PIXCLK_INVALID, E_PIXCLK_INVALID},
|
|
+ /* HDMITX_VFMT_19_1280x720p_50Hz */
|
|
+ {E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_74250, E_PIXCLK_INVALID, E_PIXCLK_INVALID},
|
|
+ /* HDMITX_VFMT_20_1920x1080i_50Hz */
|
|
+ {E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_74250, E_PIXCLK_INVALID, E_PIXCLK_INVALID},
|
|
+ /* HDMITX_VFMT_21_720x576i_50Hz */
|
|
+ {E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_27000, E_PIXCLK_INVALID, E_PIXCLK_INVALID},
|
|
+ /* HDMITX_VFMT_22_720x576i_50Hz */
|
|
+ {E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_27000, E_PIXCLK_INVALID, E_PIXCLK_INVALID},
|
|
+ /* HDMITX_VFMT_23_720x288p_50Hz */
|
|
+ {E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_27000, E_PIXCLK_INVALID, E_PIXCLK_INVALID},
|
|
+ /* HDMITX_VFMT_24_720x288p_50Hz */
|
|
+ {E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_27000, E_PIXCLK_INVALID, E_PIXCLK_INVALID},
|
|
+ /* HDMITX_VFMT_25_720x576i_50Hz */
|
|
+ {E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_54000, E_PIXCLK_INVALID, E_PIXCLK_INVALID},
|
|
+ /* HDMITX_VFMT_26_720x576i_50Hz */
|
|
+ {E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_54000, E_PIXCLK_INVALID, E_PIXCLK_INVALID},
|
|
+ /* HDMITX_VFMT_27_720x288p_50Hz */
|
|
+ {E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_54000, E_PIXCLK_INVALID, E_PIXCLK_INVALID},
|
|
+ /* HDMITX_VFMT_28_720x288p_50Hz */
|
|
+ {E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_54000, E_PIXCLK_INVALID, E_PIXCLK_INVALID},
|
|
+ /* HDMITX_VFMT_29_1440x576p_50Hz */
|
|
+ {E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_54000, E_PIXCLK_INVALID, E_PIXCLK_INVALID},
|
|
+ /* HDMITX_VFMT_30_1440x576p_50Hz */
|
|
+ {E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_54000, E_PIXCLK_INVALID, E_PIXCLK_INVALID},
|
|
+ /* HDMITX_VFMT_31_1920x1080p_50Hz */
|
|
+ {E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_148500, E_PIXCLK_INVALID, E_PIXCLK_INVALID},
|
|
+ /* HDMITX_VFMT_32_1920x1080p_24Hz */
|
|
+ {E_PIXCLK_74250, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID},
|
|
+ /* HDMITX_VFMT_33_1920x1080p_25Hz */
|
|
+ {E_PIXCLK_INVALID, E_PIXCLK_74250, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID},
|
|
+ /* HDMITX_VFMT_34_1920x1080p_30Hz */
|
|
+ {E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_74250, E_PIXCLK_INVALID, E_PIXCLK_INVALID, E_PIXCLK_INVALID}
|
|
+};
|
|
+
|
|
+/**
|
|
+ * Lookup table to convert PC formats used in API parameters to pixel clock
|
|
+ * frequencies.
|
|
+ * The other index is the veritical frame frequency.
|
|
+ * */
|
|
+#ifdef FORMAT_PC
|
|
+static CONST_DAT u8 k_vfmt_to_pix_clk_pc[HDMITX_VFMT_PC_NUM+1] = {
|
|
+ /* HDMITX_VFREQ_60Hz HDMITX_VFREQ_70Hz HDMITX_VFREQ_72Hz HDMITX_VFREQ_75Hz HDMITX_VFREQ_85Hz HDMITX_VFREQ_87Hz*/
|
|
+ E_PIXCLK_INVALID, /* HDMITX_VFMT_NULL */
|
|
+ E_PIXCLK_25175 , /* HDMITX_VFMT_PC_640x480p_60Hz */
|
|
+ E_PIXCLK_40000 , /* HDMITX_VFMT_PC_800x600p_60Hz */
|
|
+ E_PIXCLK_INVALID, /* HDMITX_VFMT_PC_1152x960p_60Hz */
|
|
+ E_PIXCLK_65000 , /* HDMITX_VFMT_PC_1024x768p_60Hz */
|
|
+ E_PIXCLK_79500 , /* HDMITX_VFMT_PC_1280x768p_60Hz */
|
|
+ E_PIXCLK_108000 , /* HDMITX_VFMT_PC_1280x1024p_60Hz */
|
|
+ E_PIXCLK_85500 , /* HDMITX_VFMT_PC_1360x768p_60Hz */
|
|
+ E_PIXCLK_121750 , /* HDMITX_VFMT_PC_1400x1050p_60Hz */
|
|
+ E_PIXCLK_162000 , /* HDMITX_VFMT_PC_1600x1200p_60Hz */
|
|
+ E_PIXCLK_75000 , /* HDMITX_VFMT_PC_1024x768p_70Hz */
|
|
+ E_PIXCLK_31500 , /* HDMITX_VFMT_PC_640x480p_72Hz */
|
|
+ E_PIXCLK_50000 , /* HDMITX_VFMT_PC_800x600p_72Hz */
|
|
+ E_PIXCLK_31500 , /* HDMITX_VFMT_PC_640x480p_75Hz */
|
|
+ E_PIXCLK_78750 , /* HDMITX_VFMT_PC_1024x768p_75Hz */
|
|
+ E_PIXCLK_49500 , /* HDMITX_VFMT_PC_800x600p_75Hz */
|
|
+ E_PIXCLK_INVALID, /* HDMITX_VFMT_PC_1024x864p_75Hz */
|
|
+ E_PIXCLK_135000 , /* HDMITX_VFMT_PC_1280x1024p_75Hz */
|
|
+ E_PIXCLK_INVALID, /* HDMITX_VFMT_PC_640x350p_85Hz */
|
|
+ E_PIXCLK_INVALID, /* HDMITX_VFMT_PC_640x400p_85Hz */
|
|
+ E_PIXCLK_INVALID, /* HDMITX_VFMT_PC_720x400p_85Hz */
|
|
+ E_PIXCLK_36000 , /* HDMITX_VFMT_PC_640x480p_85Hz */
|
|
+ E_PIXCLK_56250 , /* HDMITX_VFMT_PC_800x600p_85Hz */
|
|
+ E_PIXCLK_INVALID, /* HDMITX_VFMT_PC_1024x768p_85Hz */
|
|
+ E_PIXCLK_INVALID, /* HDMITX_VFMT_PC_1152x864p_85Hz */
|
|
+ E_PIXCLK_INVALID, /* HDMITX_VFMT_PC_1280x960p_85Hz */
|
|
+ E_PIXCLK_INVALID, /* HDMITX_VFMT_PC_1280x1024p_85Hz */
|
|
+ E_PIXCLK_INVALID /* HDMITX_VFMT_PC_1024x768i_87Hz */
|
|
+};
|
|
+#endif /* FORMAT_PC */
|
|
+
|
|
+/**
|
|
+ * Lookup table to convert from EIA/CEA TV video formats used in the EDID and in
|
|
+ * API parameters to the format used in the E_REG_P00_VIDFORMAT_W register
|
|
+ * */
|
|
+
|
|
+#ifndef FORMAT_PC
|
|
+static CONST_DAT u8 k_vfmt_to_regvfmt_tv[HDMITX_VFMT_TV_NUM] =
|
|
+#else /* FORMAT_PC */
|
|
+static CONST_DAT u8 k_vfmt_to_regvfmt_tv[HDMITX_VFMT_TV_NUM + HDMITX_VFMT_PC_NUM] =
|
|
+#endif /* FORMAT_PC */
|
|
+{
|
|
+ E_REGVFMT_INVALID, /* HDMITX_VFMT_NULL */
|
|
+ e_regvfmt_640x480p_60hz, /* HDMITX_VFMT_01_640x480p_60Hz */
|
|
+ e_regvfmt_720x480p_60hz, /* HDMITX_VFMT_02_720x480p_60Hz */
|
|
+ e_regvfmt_720x480p_60hz, /* HDMITX_VFMT_03_720x480p_60Hz */
|
|
+ e_regvfmt_1280x720p_60hz, /* HDMITX_VFMT_04_1280x720p_60Hz */
|
|
+ e_regvfmt_1920x1080i_60hz, /* HDMITX_VFMT_05_1920x1080i_60Hz */
|
|
+ e_regvfmt_720x480i_60hz, /* HDMITX_VFMT_06_720x480i_60Hz */
|
|
+ e_regvfmt_720x480i_60hz, /* HDMITX_VFMT_07_720x480i_60Hz */
|
|
+ e_regvfmt_720x240p_60hz, /* HDMITX_VFMT_08_720x240p_60Hz */
|
|
+ e_regvfmt_720x240p_60hz, /* HDMITX_VFMT_09_720x240p_60Hz */
|
|
+ E_REGVFMT_INVALID, /* HDMITX_VFMT_10_720x480i_60Hz */
|
|
+ E_REGVFMT_INVALID, /* HDMITX_VFMT_11_720x480i_60Hz */
|
|
+ E_REGVFMT_INVALID, /* HDMITX_VFMT_12_720x240p_60Hz */
|
|
+ E_REGVFMT_INVALID, /* HDMITX_VFMT_13_720x240p_60Hz */
|
|
+ E_REGVFMT_INVALID, /* HDMITX_VFMT_14_1440x480p_60Hz */
|
|
+ E_REGVFMT_INVALID, /* HDMITX_VFMT_15_1440x480p_60Hz */
|
|
+ e_regvfmt_1920x1080p_60hz, /* HDMITX_VFMT_16_1920x1080p_60Hz */
|
|
+ e_regvfmt_720x576p_50hz, /* HDMITX_VFMT_17_720x576p_50Hz */
|
|
+ e_regvfmt_720x576p_50hz, /* HDMITX_VFMT_18_720x576p_50Hz */
|
|
+ e_regvfmt_1280x720p_50hz, /* HDMITX_VFMT_19_1280x720p_50Hz */
|
|
+ e_regvfmt_1920x1080i_50hz, /* HDMITX_VFMT_20_1920x1080i_50Hz */
|
|
+ e_regvfmt_720x576i_50hz, /* HDMITX_VFMT_21_720x576i_50Hz */
|
|
+ e_regvfmt_720x576i_50hz, /* HDMITX_VFMT_22_720x576i_50Hz */
|
|
+ e_regvfmt_720x288p_50hz, /* HDMITX_VFMT_23_720x288p_50Hz */
|
|
+ e_regvfmt_720x288p_50hz, /* HDMITX_VFMT_24_720x288p_50Hz */
|
|
+ E_REGVFMT_INVALID, /* HDMITX_VFMT_25_720x576i_50Hz */
|
|
+ E_REGVFMT_INVALID, /* HDMITX_VFMT_26_720x576i_50Hz */
|
|
+ E_REGVFMT_INVALID, /* HDMITX_VFMT_27_720x288p_50Hz */
|
|
+ E_REGVFMT_INVALID, /* HDMITX_VFMT_28_720x288p_50Hz */
|
|
+ E_REGVFMT_INVALID, /* HDMITX_VFMT_29_1440x576p_50Hz */
|
|
+ E_REGVFMT_INVALID, /* HDMITX_VFMT_30_1440x576p_50Hz */
|
|
+ e_regvfmt_1920x1080p_50hz, /* HDMITX_VFMT_31_1920x1080p_50Hz */
|
|
+ e_regvfmt_1920x1080p_24hz, /* HDMITX_VFMT_32_1920x1080p_24Hz */
|
|
+ e_regvfmt_1920x1080p_25hz, /* HDMITX_VFMT_33_1920x1080p_25Hz */
|
|
+ e_regvfmt_1920x1080p_30hz /* HDMITX_VFMT_34_1920x1080p_30Hz */
|
|
+#ifdef FORMAT_PC
|
|
+ , e_regvfmt_640x480p_60hz, /* HDMITX_VFMT_PC_640x480p_60Hz */
|
|
+ e_regvfmt_800x600p_60hz, /* HDMITX_VFMT_PC_800x600p_60Hz */
|
|
+ E_REGVFMT_INVALID, /* HDMITX_VFMT_PC_1152x960p_60Hz */
|
|
+ e_regvfmt_1024x768p_60hz, /* HDMITX_VFMT_PC_1024x768p_60Hz */
|
|
+ e_regvfmt_1280x768p_60hz, /* HDMITX_VFMT_PC_1280x768p_60Hz */
|
|
+ e_regvfmt_1280x1024p_60hz, /* HDMITX_VFMT_PC_1280x1024p_60Hz */
|
|
+ e_regvfmt_1360x768p_60hz, /* HDMITX_VFMT_PC_1360x768p_60Hz */
|
|
+ e_regvfmt_1400x1050p_60hz, /* HDMITX_VFMT_PC_1400x1050p_60Hz */
|
|
+ e_regvfmt_1600x1200p_60hz, /* HDMITX_VFMT_PC_1600x1200p_60Hz */
|
|
+ e_regvfmt_1024x768p_70hz, /* HDMITX_VFMT_PC_1024x768p_70Hz */
|
|
+ e_regvfmt_640x480p_72hz, /* HDMITX_VFMT_PC_640x480p_72Hz */
|
|
+ e_regvfmt_800x600p_72hz, /* HDMITX_VFMT_PC_800x600p_72Hz */
|
|
+ e_regvfmt_640x480p_75hz, /* HDMITX_VFMT_PC_640x480p_75Hz */
|
|
+ e_regvfmt_1024x768p_75hz, /* HDMITX_VFMT_PC_1024x768p_75Hz */
|
|
+ e_regvfmt_800x600p_75hz, /* HDMITX_VFMT_PC_800x600p_75Hz */
|
|
+ E_REGVFMT_INVALID, /* HDMITX_VFMT_PC_1024x864p_75Hz */
|
|
+ e_regvfmt_1280x1024p_75hz, /* HDMITX_VFMT_PC_1280x1024p_75Hz */
|
|
+ E_REGVFMT_INVALID, /* HDMITX_VFMT_PC_640x350p_85Hz */
|
|
+ E_REGVFMT_INVALID, /* HDMITX_VFMT_PC_640x400p_85Hz */
|
|
+ E_REGVFMT_INVALID, /* HDMITX_VFMT_PC_720x400p_85Hz */
|
|
+ e_regvfmt_640x480p_85hz, /* HDMITX_VFMT_PC_640x480p_85Hz */
|
|
+ e_regvfmt_800x600p_85hz, /* HDMITX_VFMT_PC_800x600p_85Hz */
|
|
+ E_REGVFMT_INVALID, /* HDMITX_VFMT_PC_1024x768p_85Hz */
|
|
+ E_REGVFMT_INVALID, /* HDMITX_VFMT_PC_1152x864p_85Hz */
|
|
+ E_REGVFMT_INVALID, /* HDMITX_VFMT_PC_1280x960p_85Hz */
|
|
+ E_REGVFMT_INVALID, /* HDMITX_VFMT_PC_1280x1024p_85Hz */
|
|
+ E_REGVFMT_INVALID, /* HDMITX_VFMT_PC_1024x768i_87Hz */
|
|
+#endif /* FORMAT PC */
|
|
+
|
|
+};
|
|
+
|
|
+/**
|
|
+ * Lookup table to convert from EIA/CEA TV video formats used in API
|
|
+ * parameters to the vid_format_i and vid_format_o values used in the
|
|
+ * E_REG_P01_SC_VIDFORMAT_W register
|
|
+ * */
|
|
+#define SCIO(scin,scout) (((scin)<<4)|(scout))
|
|
+#define SCIO2SCIN(scio) (u8)(((scio)>>4)&0xF)
|
|
+#define SCIO2SCOUT(scio) (u8)((scio)&0xF)
|
|
+
|
|
+static CONST_DAT u8 k_vfmt_to_regvfmt_scio_tv[HDMITX_VFMT_TV_NUM] = {
|
|
+ /* HDMITX_VFMT_NULL */
|
|
+ SCIO(E_REGVFMT_SCIN_INVALID, E_REGVFMT_SCOUT_INVALID),
|
|
+ /* HDMITX_VFMT_01_640x480p_60Hz */
|
|
+ SCIO(e_regvfmt_scin_480p_60hz, e_regvfmt_scout_480p_60hz),
|
|
+ /* HDMITX_VFMT_02_720x480p_60Hz */
|
|
+ SCIO(e_regvfmt_scin_480p_60hz, e_regvfmt_scout_480p_60hz),
|
|
+ /* HDMITX_VFMT_03_720x480p_60Hz */
|
|
+ SCIO(e_regvfmt_scin_480p_60hz, e_regvfmt_scout_480p_60hz),
|
|
+ /* HDMITX_VFMT_04_1280x720p_60Hz */
|
|
+ SCIO(E_REGVFMT_SCIN_INVALID, e_regvfmt_scout_720p_50hz_60hz),
|
|
+ /* HDMITX_VFMT_05_1920x1080i_60Hz */
|
|
+ SCIO(E_REGVFMT_SCIN_INVALID, e_regvfmt_scout_1080i_50hz_60hz),
|
|
+ /* HDMITX_VFMT_06_720x480i_60Hz */
|
|
+ SCIO(e_regvfmt_scin_480i_60hz, E_REGVFMT_SCOUT_INVALID),
|
|
+ /* HDMITX_VFMT_07_720x480i_60Hz */
|
|
+ SCIO(e_regvfmt_scin_480i_60hz, E_REGVFMT_SCOUT_INVALID),
|
|
+ /* HDMITX_VFMT_08_720x240p_60Hz */
|
|
+ SCIO(E_REGVFMT_SCIN_INVALID, E_REGVFMT_SCOUT_INVALID),
|
|
+ /* HDMITX_VFMT_09_720x240p_60Hz */
|
|
+ SCIO(E_REGVFMT_SCIN_INVALID, E_REGVFMT_SCOUT_INVALID),
|
|
+ /* HDMITX_VFMT_10_720x480i_60Hz */
|
|
+ SCIO(e_regvfmt_scin_480i_60hz, E_REGVFMT_SCOUT_INVALID),
|
|
+ /* HDMITX_VFMT_11_720x480i_60Hz */
|
|
+ SCIO(e_regvfmt_scin_480i_60hz, E_REGVFMT_SCOUT_INVALID),
|
|
+ /* HDMITX_VFMT_12_720x240p_60Hz */
|
|
+ SCIO(E_REGVFMT_SCIN_INVALID, E_REGVFMT_SCOUT_INVALID),
|
|
+ /* HDMITX_VFMT_13_720x240p_60Hz */
|
|
+ SCIO(E_REGVFMT_SCIN_INVALID, E_REGVFMT_SCOUT_INVALID),
|
|
+ /* HDMITX_VFMT_14_1440x480p_60Hz */
|
|
+ SCIO(e_regvfmt_scin_480p_60hz, E_REGVFMT_SCOUT_INVALID),
|
|
+ /* HDMITX_VFMT_15_1440x480p_60Hz */
|
|
+ SCIO(e_regvfmt_scin_480p_60hz, E_REGVFMT_SCOUT_INVALID),
|
|
+ /* HDMITX_VFMT_16_1920x1080p_60Hz */
|
|
+ SCIO(E_REGVFMT_SCIN_INVALID, E_REGVFMT_SCOUT_INVALID),
|
|
+ /* HDMITX_VFMT_17_720x576p_50Hz */
|
|
+ SCIO(e_regvfmt_scin_576p_50hz, e_regvfmt_scout_576ip_50hz),
|
|
+ /* HDMITX_VFMT_18_720x576p_50Hz */
|
|
+ SCIO(e_regvfmt_scin_576p_50hz, e_regvfmt_scout_576ip_50hz),
|
|
+ /* HDMITX_VFMT_19_1280x720p_50Hz */
|
|
+ SCIO(E_REGVFMT_SCIN_INVALID, e_regvfmt_scout_720p_50hz_60hz),
|
|
+ /* HDMITX_VFMT_20_1920x1080i_50Hz */
|
|
+ SCIO(E_REGVFMT_SCIN_INVALID, e_regvfmt_scout_1080i_50hz_60hz),
|
|
+ /* HDMITX_VFMT_21_720x576i_50Hz */
|
|
+ SCIO(e_regvfmt_scin_576i_50hz, e_regvfmt_scout_576ip_50hz),
|
|
+ /* HDMITX_VFMT_22_720x576i_50Hz */
|
|
+ SCIO(e_regvfmt_scin_576i_50hz, e_regvfmt_scout_576ip_50hz),
|
|
+ /* HDMITX_VFMT_23_720x288p_50Hz */
|
|
+ SCIO(E_REGVFMT_SCIN_INVALID, E_REGVFMT_SCOUT_INVALID),
|
|
+ /* HDMITX_VFMT_24_720x288p_50Hz */
|
|
+ SCIO(E_REGVFMT_SCIN_INVALID, E_REGVFMT_SCOUT_INVALID),
|
|
+ /* HDMITX_VFMT_25_720x576i_50Hz */
|
|
+ SCIO(e_regvfmt_scin_576i_50hz, E_REGVFMT_SCOUT_INVALID),
|
|
+ /* HDMITX_VFMT_26_720x576i_50Hz */
|
|
+ SCIO(e_regvfmt_scin_576i_50hz, E_REGVFMT_SCOUT_INVALID),
|
|
+ /* HDMITX_VFMT_27_720x288p_50Hz */
|
|
+ SCIO(E_REGVFMT_SCIN_INVALID, E_REGVFMT_SCOUT_INVALID),
|
|
+ /* HDMITX_VFMT_28_720x288p_50Hz */
|
|
+ SCIO(E_REGVFMT_SCIN_INVALID, E_REGVFMT_SCOUT_INVALID),
|
|
+ /* HDMITX_VFMT_29_1440x576p_50Hz */
|
|
+ SCIO(e_regvfmt_scin_576p_50hz, E_REGVFMT_SCOUT_INVALID),
|
|
+ /* HDMITX_VFMT_30_1440x576p_50Hz */
|
|
+ SCIO(e_regvfmt_scin_576p_50hz, E_REGVFMT_SCOUT_INVALID),
|
|
+ /* HDMITX_VFMT_31_1920x1080p_50Hz */
|
|
+ SCIO(E_REGVFMT_SCIN_INVALID, E_REGVFMT_SCOUT_INVALID),
|
|
+ /* HDMITX_VFMT_32_1920x1080p_24Hz */
|
|
+ SCIO(E_REGVFMT_SCIN_INVALID, E_REGVFMT_SCOUT_INVALID),
|
|
+ /* HDMITX_VFMT_33_1920x1080p_25Hz */
|
|
+ SCIO(E_REGVFMT_SCIN_INVALID, E_REGVFMT_SCOUT_INVALID),
|
|
+ /* HDMITX_VFMT_34_1920x1080p_30Hz */
|
|
+ SCIO(E_REGVFMT_SCIN_INVALID, E_REGVFMT_SCOUT_INVALID)
|
|
+};
|
|
+
|
|
+/**
|
|
+ * Macro to pack output format flags as bits in a u16 for the following table
|
|
+ * */
|
|
+#define PKOPF(p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,p13,p14,p15,p16,p17) \
|
|
+ ((p1)|((p2)<<1)|((p3)<<2)|((p4)<<3)|((p5)<<4)|((p6)<<5)|((p7)<<6)|((p8)<<7)| \
|
|
+ ((p9)<<8)|((p10)<<9)|((p11)<<10)|((p12)<<11)|((p13)<<12)|((p14)<<13)|((p15)<<14)|((p16)<<15)|((p17)<<16))
|
|
+
|
|
+/* Macro to test for input and output format = '1' in following table */
|
|
+#define CAN_FMTS_SCALE(fin,fout) (kCanSclInToOut[(fin)]&(1<<(fout)))
|
|
+
|
|
+/**
|
|
+ * Lookup table to determine if an input format can be scaled to an
|
|
+ * output format, including scaler off conditions (in=out)
|
|
+ * Indexed by [input format][output format]
|
|
+ * */
|
|
+static CONST_DAT u16 k_can_scl_in_to_out[E_REGVFMT_INVALID+1] = {
|
|
+ /* -----OUTPUT FORMATS------ */
|
|
+ /* E_REGVFMT_640x480p_60Hz */
|
|
+ /* E_REGVFMT_720x480p_60Hz */
|
|
+ /* E_REGVFMT_1280x720p_60Hz */
|
|
+ /* E_REGVFMT_1920x1080i_60Hz */
|
|
+ /* E_REGVFMT_720x480i_60Hz */
|
|
+ /* E_REGVFMT_720x240p_60Hz */
|
|
+ /* E_REGVFMT_1920x1080p_60Hz */
|
|
+ /* E_REGVFMT_720x576p_50Hz */
|
|
+ /* E_REGVFMT_1280x720p_50Hz */
|
|
+ /* E_REGVFMT_1920x1080i_50Hz */
|
|
+ /* E_REGVFMT_720x576i_50Hz */
|
|
+ /* E_REGVFMT_720x288p_50Hz */
|
|
+ /* E_REGVFMT_1920x1080p_50Hz */
|
|
+ /* E_REGVFMT_1920x1080p_24Hz */
|
|
+ /* E_REGVFMT_1920x1080p_25Hz */
|
|
+ /* E_REGVFMT_1920x1080p_30Hz */
|
|
+ /* E_REGVFMT_INVALID */
|
|
+ /* ------INPUT FORMATS------ */
|
|
+ /* E_REGVFMT_640x480p_60Hz */
|
|
+ PKOPF(1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
|
|
+ /* E_REGVFMT_720x480p_60Hz */
|
|
+ PKOPF(0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
|
|
+ /* E_REGVFMT_1280x720p_60Hz */
|
|
+ PKOPF(0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
|
|
+ /* E_REGVFMT_1920x1080i_60Hz */
|
|
+ PKOPF(0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
|
|
+ /* E_REGVFMT_720x480i_60Hz */
|
|
+ PKOPF(0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
|
|
+ /* E_REGVFMT_720x240p_60Hz */
|
|
+ PKOPF(0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
|
|
+ /* E_REGVFMT_1920x1080p_60Hz */
|
|
+ PKOPF(0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
|
|
+ /* E_REGVFMT_720x576p_50Hz */
|
|
+ PKOPF(0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0),
|
|
+ /* E_REGVFMT_1280x720p_50Hz */
|
|
+ PKOPF(0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0),
|
|
+ /* E_REGVFMT_1920x1080i_50Hz */
|
|
+ PKOPF(0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0),
|
|
+ /* E_REGVFMT_720x576i_50Hz */
|
|
+ PKOPF(0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0),
|
|
+ /* E_REGVFMT_720x288p_50Hz */
|
|
+ PKOPF(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0),
|
|
+ /* E_REGVFMT_1920x1080p_50Hz */
|
|
+ PKOPF(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0),
|
|
+ /* E_REGVFMT_1920x1080p_24Hz */
|
|
+ PKOPF(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0),
|
|
+ /* E_REGVFMT_1920x1080p_25Hz */
|
|
+ PKOPF(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0),
|
|
+ /* E_REGVFMT_1920x1080p_30Hz */
|
|
+ PKOPF(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0),
|
|
+ /* E_REGVFMT_INVALID */
|
|
+ PKOPF(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
|
|
+};
|
|
+
|
|
+/**
|
|
+ * Lookup tables to convert scaler input and output modes
|
|
+ * to PLL scaling values
|
|
+ * */
|
|
+static CONST_DAT u16 k_scl_mode_to_scg_n[E_REGVFMT_SCIN_NUM][E_REGVFMT_SCOUT_NUM] = {
|
|
+ /* E_REGVFMT_SCOUT_480p_60Hz */
|
|
+ /* E_REGVFMT_SCOUT_576ip_50Hz */
|
|
+ /* E_REGVFMT_SCOUT_720p_50Hz_60Hz */
|
|
+ /* E_REGVFMT_SCOUT_1080i_50Hz_60Hz */
|
|
+ { 20, 0, 500, 500}, /* E_REGVFMT_SCIN_480i_60Hz */
|
|
+ { 0, 20, 88, 88}, /* E_REGVFMT_SCIN_576i_50Hz */
|
|
+ { 0, 0, 250, 250}, /* E_REGVFMT_SCIN_480p_60Hz */
|
|
+ { 0, 0, 44, 44}, /* E_REGVFMT_SCIN_576p_50Hz */
|
|
+};
|
|
+static CONST_DAT u16 k_scl_mode_to_scg_r[E_REGVFMT_SCIN_NUM][E_REGVFMT_SCOUT_NUM] = {
|
|
+ /* E_REGVFMT_SCOUT_480p_60Hz */
|
|
+ /* E_REGVFMT_SCOUT_576ip_50Hz */
|
|
+ /* E_REGVFMT_SCOUT_720p_50Hz_60Hz */
|
|
+ /* E_REGVFMT_SCOUT_1080i_50Hz_60Hz */
|
|
+ { 10, 0, 91, 91}, /* E_REGVFMT_SCIN_480i_60Hz */
|
|
+ { 0, 10, 16, 16}, /* E_REGVFMT_SCIN_576i_50Hz */
|
|
+ { 0, 0, 91, 91}, /* E_REGVFMT_SCIN_480p_60Hz */
|
|
+ { 0, 0, 16, 16}, /* E_REGVFMT_SCIN_576p_50Hz */
|
|
+};
|
|
+
|
|
+/**
|
|
+ * Lookup tables to hide the scaler issue on side effect
|
|
+ * by adding blanking pixel on right and left side of the screen
|
|
+ * */
|
|
+static CONST_DAT u8 k_scl_add_blk_pix[E_REGVFMT_SCIN_NUM][E_REGVFMT_SCOUT_NUM] = {
|
|
+ /* E_REGVFMT_SCOUT_480p_60Hz */
|
|
+ /* E_REGVFMT_SCOUT_576ip_50Hz */
|
|
+ /* E_REGVFMT_SCOUT_720p_50Hz_60Hz */
|
|
+ /* E_REGVFMT_SCOUT_1080i_50Hz_60Hz */
|
|
+ { 0, 0, 4, 8}, /* E_REGVFMT_SCIN_480i_60Hz */
|
|
+ { 0, 0, 4, 8}, /* E_REGVFMT_SCIN_576i_50Hz */
|
|
+ { 0, 0, 4, 8}, /* E_REGVFMT_SCIN_480p_60Hz */
|
|
+ { 0, 0, 4, 8}, /* E_REGVFMT_SCIN_576p_50Hz */
|
|
+};
|
|
+static CONST_DAT u8 k_scl_clear_blk_pix[] = {
|
|
+ 0, /* HDMITX_VOUTMODE_RGB444 */
|
|
+ 1, /* HDMITX_VOUTMODE_YUV422 */
|
|
+ 1, /* HDMITX_VOUTMODE_YUV444 */
|
|
+ 0, /* HDMITX_VOUTMODE_NO_CHANGE */
|
|
+ 0 /* HDMITX_VOUTMODE_INVALID */
|
|
+};
|
|
+
|
|
+/**
|
|
+ * Lookup table to convert from video format codes used in the
|
|
+ * E_REG_P00_VIDFORMAT_W register to corresponding VS_PIX_STRT_2
|
|
+ * register values, to correct the output window for interlaced
|
|
+ * output formats, with or without the scaler.
|
|
+ *
|
|
+ * The correction is VS_PIX_STRT_2=VS_PIX_STRT_2+VS_PIX_STRT_1.
|
|
+ * The same value is also applied to VS_PIX_END_2.
|
|
+ * */
|
|
+static CONST_DAT u16 k_regvfmt_to_vs2[E_REGVFMT_NUM] = {
|
|
+ 0, /* E_REGVFMT_640x480p_60Hz */
|
|
+ 0, /* E_REGVFMT_720x480p_60Hz */
|
|
+ 0, /* E_REGVFMT_1280x720p_60Hz */
|
|
+ 1100 + 88, /* E_REGVFMT_1920x1080i_60Hz */
|
|
+ 429 + 19, /* E_REGVFMT_720x480i_60Hz */
|
|
+ 0, /* E_REGVFMT_720x240p_60Hz */
|
|
+ 0, /* E_REGVFMT_1920x1080p_60Hz */
|
|
+ 0, /* E_REGVFMT_720x576p_50Hz */
|
|
+ 0, /* E_REGVFMT_1280x720p_50Hz */
|
|
+ 1320 + 528, /* E_REGVFMT_1920x1080i_50Hz */
|
|
+ 432 + 12, /* E_REGVFMT_720x576i_50Hz */
|
|
+ 0, /* E_REGVFMT_720x288p_50Hz */
|
|
+ 0, /* E_REGVFMT_1920x1080p_50Hz */
|
|
+ 0, /* E_REGVFMT_1920x1080p_24Hz */
|
|
+ 0, /* E_REGVFMT_1920x1080p_25Hz */
|
|
+ 0 /* E_REGVFMT_1920x1080p_30Hz */
|
|
+#ifdef FORMAT_PC
|
|
+ , 0, /* E_REGVFMT_640x480p_72Hz */
|
|
+ 0, /* E_REGVFMT_640x480p_75Hz */
|
|
+ 0, /* E_REGVFMT_640x480p_85Hz */
|
|
+ 0, /* E_REGVFMT_800x600p_60Hz */
|
|
+ 0, /* E_REGVFMT_800x600p_72Hz */
|
|
+ 0, /* E_REGVFMT_800x600p_75Hz */
|
|
+ 0, /* E_REGVFMT_800x600p_85Hz */
|
|
+ 0, /* E_REGVFMT_1024x768p_60Hz */
|
|
+ 0, /* E_REGVFMT_1024x768p_70Hz */
|
|
+ 0, /* E_REGVFMT_1024x768p_75Hz */
|
|
+ 0, /* E_REGVFMT_1280x768p_60Hz */
|
|
+ 0, /* E_REGVFMT_1280x1024p_60Hz */
|
|
+ 0, /* E_REGVFMT_1280x1024p_75Hz */
|
|
+ 0, /* E_REGVFMT_1360x768p_60Hz */
|
|
+ 0, /* E_REGVFMT_1400x1050p_60Hz */
|
|
+ 0, /* E_REGVFMT_1600x1200p_60Hz */
|
|
+#endif /* FORMAT_PC */
|
|
+};
|
|
+
|
|
+/**
|
|
+ * Lookup table to convert from video format codes used in the
|
|
+ * E_REG_P00_VIDFORMAT_W register to corresponding
|
|
+ * pixel repetition values in the PLL_SERIAL_2 register.
|
|
+ * 0=no repetition (pixel sent once)
|
|
+ * 1=one repetition (pixel sent twice) etc
|
|
+ * */
|
|
+static CONST_DAT u8 k_regvfmt_to_pix_rep[E_REGVFMT_NUM] = {
|
|
+ 0, /* E_REGVFMT_640x480p_60Hz */
|
|
+ 0, /* E_REGVFMT_720x480p_60Hz */
|
|
+ 0, /* E_REGVFMT_1280x720p_60Hz */
|
|
+ 0, /* E_REGVFMT_1920x1080i_60Hz */
|
|
+ 1, /* E_REGVFMT_720x480i_60Hz */
|
|
+ 1, /* E_REGVFMT_720x240p_60Hz */
|
|
+ 0, /* E_REGVFMT_1920x1080p_60Hz */
|
|
+ 0, /* E_REGVFMT_720x576p_50Hz */
|
|
+ 0, /* E_REGVFMT_1280x720p_50Hz */
|
|
+ 0, /* E_REGVFMT_1920x1080i_50Hz */
|
|
+ 1, /* E_REGVFMT_720x576i_50Hz */
|
|
+ 1, /* E_REGVFMT_720x288p_50Hz */
|
|
+ 0, /* E_REGVFMT_1920x1080p_50Hz */
|
|
+ 0, /* E_REGVFMT_1920x1080p_24Hz */
|
|
+ 0, /* E_REGVFMT_1920x1080p_25Hz */
|
|
+ 0 /* E_REGVFMT_1920x1080p_30Hz */
|
|
+#ifdef FORMAT_PC
|
|
+ , 0, /* E_REGVFMT_640x480p_72Hz */
|
|
+ 0, /* E_REGVFMT_640x480p_75Hz */
|
|
+ 0, /* E_REGVFMT_640x480p_85Hz */
|
|
+ 0, /* E_REGVFMT_800x600p_60Hz */
|
|
+ 0, /* E_REGVFMT_800x600p_72Hz */
|
|
+ 0, /* E_REGVFMT_800x600p_75Hz */
|
|
+ 0, /* E_REGVFMT_800x600p_85Hz */
|
|
+ 0, /* E_REGVFMT_1024x768p_60Hz */
|
|
+ 0, /* E_REGVFMT_1024x768p_70Hz */
|
|
+ 0, /* E_REGVFMT_1024x768p_75Hz */
|
|
+ 0, /* E_REGVFMT_1280x768p_60Hz */
|
|
+ 0, /* E_REGVFMT_1280x1024p_60Hz */
|
|
+ 0, /* E_REGVFMT_1280x1024p_75Hz */
|
|
+ 0, /* E_REGVFMT_1360x768p_60Hz */
|
|
+ 0, /* E_REGVFMT_1400x1050p_60Hz */
|
|
+ 0, /* E_REGVFMT_1600x1200p_60Hz */
|
|
+#endif /* FORMAT_PC */
|
|
+
|
|
+};
|
|
+
|
|
+/**
|
|
+ * Lookup table to convert from video format codes used in the
|
|
+ * E_REG_P00_VIDFORMAT_W register to corresponding
|
|
+ * trios of 2-bit values in the srl_nosc, scg_nosc and de_nosc
|
|
+ * PLL control registers
|
|
+ * */
|
|
+#define SSD(srl,scg,de) (((srl)<<4)|((scg)<<2)|(de))
|
|
+#define SSD2SRL(ssd) (u8)(((ssd)>>4)&3)
|
|
+#define SSD2SCG(ssd) (u8)(((ssd)>>2)&3)
|
|
+#define SSD2DE(ssd) (u8)((ssd)&3)
|
|
+
|
|
+static CONST_DAT struct {
|
|
+ u8 sca_off_ccir_off_dbl_edge_off[E_REGVFMT_NUM_TV];
|
|
+
|
|
+ u8 sca_off_ccir_on_dbl_edge_off[E_REGVFMT_NUM_TV];
|
|
+
|
|
+ u8 sca_off_ccir_on_dbl_edge_on[E_REGVFMT_NUM_TV];
|
|
+
|
|
+ u8 sca_on_ccir_off_dbl_edge_off_interlace[E_REGVFMT_NUM_TV];
|
|
+
|
|
+ u8 sca_on_ccir_on_dbl_edge_off_interlace[E_REGVFMT_NUM_TV];
|
|
+
|
|
+ u8 sca_on_ccir_on_dbl_edge_on_interlace[E_REGVFMT_NUM_TV];
|
|
+
|
|
+ u8 sca_on_ccir_off_dbl_edge_off_progressif[E_REGVFMT_NUM_TV];
|
|
+
|
|
+ u8 sca_on_ccir_on_dbl_edge_off_progressif[E_REGVFMT_NUM_TV];
|
|
+
|
|
+ u8 sca_on_ccir_on_dbl_edge_on_progressif[E_REGVFMT_NUM_TV];
|
|
+
|
|
+#ifdef FORMAT_PC
|
|
+ u8 settings_format_pc[E_REGVFMT_NUM_PC];
|
|
+#endif /* FORMAT_PC */
|
|
+
|
|
+} k_regvfmt_to_pll_ssd = {
|
|
+
|
|
+ { /*ScaOffCCIROffDblEdgeOff*/
|
|
+ /* SRL,SCG,DE */
|
|
+ SSD(2, 2, 2), /* E_REGVFMT_640x480p_60Hz */
|
|
+ SSD(2, 2, 2), /* E_REGVFMT_720x480p_60Hz */
|
|
+ SSD(1, 1, 1), /* E_REGVFMT_1280x720p_60Hz */
|
|
+ SSD(1, 1, 1), /* E_REGVFMT_1920x1080i_60Hz */
|
|
+ SSD(3, 3, 3), /* E_REGVFMT_720x480i_60Hz */
|
|
+ /* E_REGVFMT_720x240p_60Hz / * \todo Need nosc PLL value */
|
|
+ SSD(0xF, 0, 0),
|
|
+ SSD(0, 0, 0), /* E_REGVFMT_1920x1080p_60Hz */
|
|
+ SSD(2, 2, 2), /* E_REGVFMT_720x576p_50Hz */
|
|
+ SSD(1, 1, 1), /* E_REGVFMT_1280x720p_50Hz */
|
|
+ SSD(1, 1, 1), /* E_REGVFMT_1920x1080i_50Hz */
|
|
+ SSD(3, 3, 3), /* E_REGVFMT_720x576i_50Hz */
|
|
+ /* E_REGVFMT_720x288p_50Hz / * \todo Need nosc PLL value */
|
|
+ SSD(0xF, 0, 0),
|
|
+ SSD(0, 0, 0), /* E_REGVFMT_1920x1080p_50Hz */
|
|
+ SSD(1, 1, 1), /* E_REGVFMT_1920x1080p_24Hz */
|
|
+ SSD(1, 1, 1), /* E_REGVFMT_1920x1080p_25Hz */
|
|
+ SSD(1, 1, 1) /* E_REGVFMT_1920x1080p_30Hz */
|
|
+ },
|
|
+
|
|
+ { /*ScaOffCCIROnDblEdgeOff*/
|
|
+ /* SRL,SCG,DE */
|
|
+ SSD(0xF, 0, 0), /* E_REGVFMT_640x480p_60Hz */
|
|
+ SSD(2, 1, 1), /* E_REGVFMT_720x480p_60Hz */
|
|
+ SSD(0xF, 0, 0), /* E_REGVFMT_1280x720p_60Hz */
|
|
+ SSD(0xF, 0, 0), /* E_REGVFMT_1920x1080i_60Hz */
|
|
+ SSD(2, 2, 2), /* E_REGVFMT_720x480i_60Hz */
|
|
+ /* E_REGVFMT_720x240p_60Hz / * \todo Need nosc PLL value */
|
|
+ SSD(0xF, 0, 0),
|
|
+ SSD(0xF, 0, 0), /* E_REGVFMT_1920x1080p_60Hz */
|
|
+ SSD(2, 1, 1), /* E_REGVFMT_720x576p_50Hz */
|
|
+ SSD(0xF, 0, 0), /* E_REGVFMT_1280x720p_50Hz */
|
|
+ SSD(0xF, 0, 0), /* E_REGVFMT_1920x1080i_50Hz */
|
|
+ SSD(2, 2, 2), /* E_REGVFMT_720x576i_50Hz */
|
|
+ /* E_REGVFMT_720x288p_50Hz / * \todo Need nosc PLL value */
|
|
+ SSD(0xF, 0, 0),
|
|
+ SSD(0xF, 0, 0), /* E_REGVFMT_1920x1080p_50Hz */
|
|
+ SSD(0xF, 0, 0), /* E_REGVFMT_1920x1080p_24Hz */
|
|
+ SSD(0xF, 0, 0), /* E_REGVFMT_1920x1080p_25Hz */
|
|
+ SSD(0xF, 0, 0) /* E_REGVFMT_1920x1080p_30Hz */
|
|
+ },
|
|
+
|
|
+ { /*ScaOffCcirONDblEdgeOn*/
|
|
+ /* SRL,SCG,DE */
|
|
+ SSD(0xF, 0, 0), /* E_REGVFMT_640x480p_60Hz */
|
|
+ SSD(2, 1, 1), /* E_REGVFMT_720x480p_60Hz */
|
|
+ SSD(0xF, 0, 0), /* E_REGVFMT_1280x720p_60Hz */
|
|
+ SSD(0xF, 0, 0), /* E_REGVFMT_1920x1080i_60Hz */
|
|
+ SSD(2, 2, 2), /* E_REGVFMT_720x480i_60Hz */
|
|
+ /* E_REGVFMT_720x240p_60Hz / * \todo Need nosc PLL value */
|
|
+ SSD(0xF, 0, 0),
|
|
+ SSD(0xF, 0, 0), /* E_REGVFMT_1920x1080p_60Hz */
|
|
+ SSD(2, 1, 1), /* E_REGVFMT_720x576p_50Hz */
|
|
+ SSD(0xF, 0, 0), /* E_REGVFMT_1280x720p_50Hz */
|
|
+ SSD(0xF, 0, 0), /* E_REGVFMT_1920x1080i_50Hz */
|
|
+ SSD(2, 2, 2), /* E_REGVFMT_720x576i_50Hz */
|
|
+ /* E_REGVFMT_720x288p_50Hz / * \todo Need nosc PLL value */
|
|
+ SSD(0xF, 0, 0),
|
|
+ SSD(0xF, 0, 0), /* E_REGVFMT_1920x1080p_50Hz */
|
|
+ SSD(0xF, 0, 0), /* E_REGVFMT_1920x1080p_24Hz */
|
|
+ SSD(0xF, 0, 0), /* E_REGVFMT_1920x1080p_25Hz */
|
|
+ SSD(0xF, 0, 0) /* E_REGVFMT_1920x1080p_30Hz */
|
|
+ },
|
|
+
|
|
+ { /* ScaOnCcirOffDblEdgeOffInterlace */
|
|
+ /* SRL,SCG,DE */
|
|
+ SSD(0xF, 0, 0), /* E_REGVFMT_640x480p_60Hz */
|
|
+ SSD(2, 2, 3), /* E_REGVFMT_720x480p_60Hz */
|
|
+ SSD(1, 1, 3), /* E_REGVFMT_1280x720p_60Hz */
|
|
+ SSD(1, 1, 3), /* E_REGVFMT_1920x1080i_60Hz */
|
|
+ SSD(0xF, 0, 0), /* E_REGVFMT_720x480i_60Hz */
|
|
+ /* E_REGVFMT_720x240p_60Hz / * \todo Need nosc PLL value */
|
|
+ SSD(0xF, 0, 0),
|
|
+ SSD(0xF, 0, 0), /* E_REGVFMT_1920x1080p_60Hz */
|
|
+ SSD(2, 2, 3), /* E_REGVFMT_720x576p_50Hz */
|
|
+ SSD(1, 1, 3), /* E_REGVFMT_1280x720p_50Hz */
|
|
+ SSD(1, 1, 3), /* E_REGVFMT_1920x1080i_50Hz */
|
|
+ SSD(0xF, 0, 0), /* E_REGVFMT_720x576i_50Hz */
|
|
+ /* E_REGVFMT_720x288p_50Hz / * \todo Need nosc PLL value */
|
|
+ SSD(0xF, 0, 0),
|
|
+ SSD(0xF, 0, 0), /* E_REGVFMT_1920x1080p_50Hz */
|
|
+ SSD(1, 1, 3), /* E_REGVFMT_1920x1080p_24Hz */
|
|
+ SSD(1, 1, 3), /* E_REGVFMT_1920x1080p_25Hz */
|
|
+ SSD(1, 1, 3) /* E_REGVFMT_1920x1080p_30Hz */
|
|
+ },
|
|
+
|
|
+ { /* ScaOnCcirONDblEdgeOffInterlace */
|
|
+ /* SRL,SCG,DE */
|
|
+ SSD(0xF, 0, 0), /* E_REGVFMT_640x480p_60Hz */
|
|
+ SSD(2, 1, 2), /* E_REGVFMT_720x480p_60Hz */
|
|
+ SSD(1, 0, 2), /* E_REGVFMT_1280x720p_60Hz */
|
|
+ SSD(1, 0, 2), /* E_REGVFMT_1920x1080i_60Hz */
|
|
+ SSD(0xF, 0, 0), /* E_REGVFMT_720x480i_60Hz */
|
|
+ /* E_REGVFMT_720x240p_60Hz / * \todo Need nosc PLL value */
|
|
+ SSD(0xF, 0, 0),
|
|
+ SSD(0xF, 0, 0), /* E_REGVFMT_1920x1080p_60Hz */
|
|
+ SSD(2, 1, 2), /* E_REGVFMT_720x576p_50Hz */
|
|
+ SSD(1, 0, 2), /* E_REGVFMT_1280x720p_50Hz */
|
|
+ SSD(1, 0, 2), /* E_REGVFMT_1920x1080i_50Hz */
|
|
+ SSD(0xF, 0, 0), /* E_REGVFMT_720x576i_50Hz */
|
|
+ /* E_REGVFMT_720x288p_50Hz / * \todo Need nosc PLL value */
|
|
+ SSD(0xF, 0, 0),
|
|
+ SSD(0xF, 0, 0), /* E_REGVFMT_1920x1080p_50Hz */
|
|
+ SSD(1, 0, 2), /* E_REGVFMT_1920x1080p_24Hz */
|
|
+ SSD(1, 0, 2), /* E_REGVFMT_1920x1080p_25Hz */
|
|
+ SSD(1, 0, 2) /* E_REGVFMT_1920x1080p_30Hz */
|
|
+ },
|
|
+
|
|
+ { /* ScaOnCcirONDblEdgeOnInterlace */
|
|
+ /* SRL,SCG,DE */
|
|
+ SSD(0xF, 0, 0), /* E_REGVFMT_640x480p_60Hz */
|
|
+ SSD(2, 1, 2), /* E_REGVFMT_720x480p_60Hz */
|
|
+ SSD(1, 0, 2), /* E_REGVFMT_1280x720p_60Hz */
|
|
+ SSD(1, 0, 2), /* E_REGVFMT_1920x1080i_60Hz */
|
|
+ SSD(0xF, 0, 0), /* E_REGVFMT_720x480i_60Hz */
|
|
+ /* E_REGVFMT_720x240p_60Hz / * \todo Need nosc PLL value */
|
|
+ SSD(0xF, 0, 0),
|
|
+ SSD(0xF, 0, 0), /* E_REGVFMT_1920x1080p_60Hz */
|
|
+ SSD(2, 1, 2), /* E_REGVFMT_720x576p_50Hz */
|
|
+ SSD(1, 0, 2), /* E_REGVFMT_1280x720p_50Hz */
|
|
+ SSD(1, 0, 2), /* E_REGVFMT_1920x1080i_50Hz */
|
|
+ SSD(0xF, 0, 0), /* E_REGVFMT_720x576i_50Hz */
|
|
+ /* E_REGVFMT_720x288p_50Hz / * \todo Need nosc PLL value */
|
|
+ SSD(0xF, 0, 0),
|
|
+ SSD(0xF, 0, 0), /* E_REGVFMT_1920x1080p_50Hz */
|
|
+ SSD(1, 0, 2), /* E_REGVFMT_1920x1080p_24Hz */
|
|
+ SSD(1, 0, 2), /* E_REGVFMT_1920x1080p_25Hz */
|
|
+ SSD(1, 0, 2) /* E_REGVFMT_1920x1080p_30Hz */
|
|
+ },
|
|
+
|
|
+ { /* ScaOnCcirOffDblEdgeOffProgressif */
|
|
+ /* SRL,SCG,DE */
|
|
+ SSD(0xF, 0, 0), /* E_REGVFMT_640x480p_60Hz */
|
|
+ SSD(0xF, 0, 0), /* E_REGVFMT_720x480p_60Hz */
|
|
+ SSD(1, 1, 2), /* E_REGVFMT_1280x720p_60Hz */
|
|
+ SSD(1, 1, 2), /* E_REGVFMT_1920x1080i_60Hz */
|
|
+ SSD(0xF, 0, 0), /* E_REGVFMT_720x480i_60Hz */
|
|
+ /* E_REGVFMT_720x240p_60Hz / * \todo Need nosc PLL value */
|
|
+ SSD(0xF, 0, 0),
|
|
+ SSD(0xF, 0, 0), /* E_REGVFMT_1920x1080p_60Hz */
|
|
+ SSD(0xF, 0, 0), /* E_REGVFMT_720x576p_50Hz */
|
|
+ SSD(1, 1, 2), /* E_REGVFMT_1280x720p_50Hz */
|
|
+ SSD(1, 1, 2), /* E_REGVFMT_1920x1080i_50Hz */
|
|
+ SSD(0xF, 0, 0), /* E_REGVFMT_720x576i_50Hz */
|
|
+ /* E_REGVFMT_720x288p_50Hz / * \todo Need nosc PLL value */
|
|
+ SSD(0xF, 0, 0),
|
|
+ SSD(0xF, 0, 0), /* E_REGVFMT_1920x1080p_50Hz */
|
|
+ SSD(1, 1, 2), /* E_REGVFMT_1920x1080p_24Hz */
|
|
+ SSD(1, 1, 2), /* E_REGVFMT_1920x1080p_25Hz */
|
|
+ SSD(1, 1, 2) /* E_REGVFMT_1920x1080p_30Hz */
|
|
+ },
|
|
+
|
|
+ { /* ScaOnCcirOnDblEdgeOffProgressif */
|
|
+ /* SRL,SCG,DE */
|
|
+ SSD(0xF, 0, 0), /* E_REGVFMT_640x480p_60Hz */
|
|
+ SSD(0xF, 0, 0), /* E_REGVFMT_720x480p_60Hz */
|
|
+ SSD(1, 0, 1), /* E_REGVFMT_1280x720p_60Hz */
|
|
+ SSD(1, 0, 1), /* E_REGVFMT_1920x1080i_60Hz */
|
|
+ SSD(0xF, 0, 0), /* E_REGVFMT_720x480i_60Hz */
|
|
+ /* E_REGVFMT_720x240p_60Hz / * \todo Need nosc PLL value */
|
|
+ SSD(0xF, 0, 0),
|
|
+ SSD(0xF, 0, 0), /* E_REGVFMT_1920x1080p_60Hz */
|
|
+ SSD(0xF, 0, 0), /* E_REGVFMT_720x576p_50Hz */
|
|
+ SSD(1, 0, 1), /* E_REGVFMT_1280x720p_50Hz */
|
|
+ SSD(1, 0, 1), /* E_REGVFMT_1920x1080i_50Hz */
|
|
+ SSD(0xF, 0, 0), /* E_REGVFMT_720x576i_50Hz */
|
|
+ /* E_REGVFMT_720x288p_50Hz / * \todo Need nosc PLL value */
|
|
+ SSD(0xF, 0, 0),
|
|
+ SSD(0xF, 0, 0), /* E_REGVFMT_1920x1080p_50Hz */
|
|
+ SSD(1, 0, 1), /* E_REGVFMT_1920x1080p_24Hz */
|
|
+ SSD(1, 0, 1), /* E_REGVFMT_1920x1080p_25Hz */
|
|
+ SSD(1, 0, 1) /* E_REGVFMT_1920x1080p_30Hz */
|
|
+ },
|
|
+
|
|
+ { /* ScaOnCcirONDblEdgeOnProgressif */
|
|
+ /* SRL,SCG,DE */
|
|
+ SSD(0xF, 0, 0), /* E_REGVFMT_640x480p_60Hz */
|
|
+ SSD(0xF, 0, 0), /* E_REGVFMT_720x480p_60Hz */
|
|
+ SSD(1, 0, 1), /* E_REGVFMT_1280x720p_60Hz */
|
|
+ SSD(1, 0, 1), /* E_REGVFMT_1920x1080i_60Hz */
|
|
+ SSD(0xF, 0, 0), /* E_REGVFMT_720x480i_60Hz */
|
|
+ /* E_REGVFMT_720x240p_60Hz / * \todo Need nosc PLL value */
|
|
+ SSD(0xF, 0, 0),
|
|
+ SSD(0xF, 0, 0), /* E_REGVFMT_1920x1080p_60Hz */
|
|
+ SSD(0xF, 0, 0), /* E_REGVFMT_720x576p_50Hz */
|
|
+ SSD(1, 0, 1), /* E_REGVFMT_1280x720p_50Hz */
|
|
+ SSD(1, 0, 1), /* E_REGVFMT_1920x1080i_50Hz */
|
|
+ SSD(0xF, 0, 0), /* E_REGVFMT_720x576i_50Hz */
|
|
+ /* E_REGVFMT_720x288p_50Hz / * \todo Need nosc PLL value */
|
|
+ SSD(0xF, 0, 0),
|
|
+ SSD(0xF, 0, 0), /* E_REGVFMT_1920x1080p_50Hz */
|
|
+ SSD(1, 0, 1), /* E_REGVFMT_1920x1080p_24Hz */
|
|
+ SSD(1, 0, 1), /* E_REGVFMT_1920x1080p_25Hz */
|
|
+ SSD(1, 0, 1) /* E_REGVFMT_1920x1080p_30Hz */
|
|
+ }
|
|
+
|
|
+#ifdef FORMAT_PC
|
|
+ , {
|
|
+ /* SRL,SCG,DE */
|
|
+ SSD(2, 0, 0), /* E_REGVFMT_640x480p_72Hz */
|
|
+ SSD(2, 0, 0), /* E_REGVFMT_640x480p_75Hz */
|
|
+ SSD(2, 0, 0), /* E_REGVFMT_640x480p_85Hz */
|
|
+ SSD(1, 0, 0), /* E_REGVFMT_800x600p_60Hz */
|
|
+ SSD(1, 0, 0), /* E_REGVFMT_800x600p_72Hz */
|
|
+ SSD(1, 0, 0), /* E_REGVFMT_800x600p_75Hz */
|
|
+ SSD(1, 0, 0), /* E_REGVFMT_800x600p_85Hz */
|
|
+ SSD(1, 0, 0), /* E_REGVFMT_1024x768p_60Hz */
|
|
+ SSD(1, 0, 0), /* E_REGVFMT_1024x768p_70Hz */
|
|
+ SSD(1, 0, 0), /* E_REGVFMT_1024x768p_75Hz */
|
|
+ SSD(0, 0, 0), /* E_REGVFMT_1280x768p_60Hz */
|
|
+ SSD(0, 0, 0), /* E_REGVFMT_1280x1024p_60Hz */
|
|
+ SSD(0, 0, 0), /* E_REGVFMT_1280x1024p_75Hz */
|
|
+ SSD(0, 0, 0), /* E_REGVFMT_1360x768p_60Hz */
|
|
+ SSD(0, 0, 0), /* E_REGVFMT_1400x1050p_60Hz */
|
|
+ SSD(0, 0, 0) /* E_REGVFMT_1600x1200p_60Hz */
|
|
+ }
|
|
+#endif /* FORMAT_PC */
|
|
+
|
|
+};
|
|
+
|
|
+/**
|
|
+ * Lookup table to convert from video format codes used in the
|
|
+ * E_REG_P00_VIDFORMAT_W register to corresponding
|
|
+ * V_toggle values for Vs external sync.
|
|
+ * 0=no toggle
|
|
+ * 1=toggle
|
|
+ * */
|
|
+static CONST_DAT u8 k_regvfmt_to_vtoggle[E_REGVFMT_NUM] = {
|
|
+ 1, /* E_REGVFMT_640x480p_60Hz */
|
|
+ 1, /* E_REGVFMT_720x480p_60Hz */
|
|
+ 0, /* E_REGVFMT_1280x720p_60Hz */
|
|
+ 0, /* E_REGVFMT_1920x1080i_60Hz */
|
|
+ 1, /* E_REGVFMT_720x480i_60Hz */
|
|
+ 1, /* E_REGVFMT_720x240p_60Hz */
|
|
+ 0, /* E_REGVFMT_1920x1080p_60Hz */
|
|
+ 1, /* E_REGVFMT_720x576p_50Hz */
|
|
+ 0, /* E_REGVFMT_1280x720p_50Hz */
|
|
+ 0, /* E_REGVFMT_1920x1080i_50Hz */
|
|
+ 1, /* E_REGVFMT_720x576i_50Hz */
|
|
+ 1, /* E_REGVFMT_720x288p_50Hz */
|
|
+ 0, /* E_REGVFMT_1920x1080p_50Hz */
|
|
+ 0, /* E_REGVFMT_1920x1080p_24Hz */
|
|
+ 0, /* E_REGVFMT_1920x1080p_25Hz */
|
|
+ 0 /* E_REGVFMT_1920x1080p_30Hz */
|
|
+#ifdef FORMAT_PC
|
|
+ , 1, /* E_REGVFMT_640x480p_72Hz */
|
|
+ 1, /* E_REGVFMT_640x480p_75Hz */
|
|
+ 1, /* E_REGVFMT_640x480p_85Hz */
|
|
+ 0, /* E_REGVFMT_800x600p_60Hz */
|
|
+ 0, /* E_REGVFMT_800x600p_72Hz */
|
|
+ 0, /* E_REGVFMT_800x600p_75Hz */
|
|
+ 0, /* E_REGVFMT_800x600p_85Hz */
|
|
+ 1, /* E_REGVFMT_1024x768p_60Hz */
|
|
+ 1, /* E_REGVFMT_1024x768p_70Hz */
|
|
+ 0, /* E_REGVFMT_1024x768p_75Hz */
|
|
+ 0, /* E_REGVFMT_1280x768p_60Hz */
|
|
+ 0, /* E_REGVFMT_1280x1024p_60Hz */
|
|
+ 0, /* E_REGVFMT_1280x1024p_75Hz */
|
|
+ 0, /* E_REGVFMT_1360x768p_60Hz */
|
|
+ 0, /* E_REGVFMT_1400x1050p_60Hz */
|
|
+ 0, /* E_REGVFMT_1600x1200p_60Hz */
|
|
+#endif /* FORMAT_PC */
|
|
+};
|
|
+
|
|
+/**
|
|
+ * Lookup table to convert from video format codes used in the
|
|
+ * E_REG_P00_VIDFORMAT_W register to corresponding
|
|
+ * H_toggle values for Vs external sync.
|
|
+ * 0=no toggle
|
|
+ * 1=toggle
|
|
+ * */
|
|
+static CONST_DAT u8 k_regvfmt_to_htoggle[E_REGVFMT_NUM] = {
|
|
+ 1, /* E_REGVFMT_640x480p_60Hz */
|
|
+ 1, /* E_REGVFMT_720x480p_60Hz */
|
|
+ 0, /* E_REGVFMT_1280x720p_60Hz */
|
|
+ 0, /* E_REGVFMT_1920x1080i_60Hz */
|
|
+ 1, /* E_REGVFMT_720x480i_60Hz */
|
|
+ 1, /* E_REGVFMT_720x240p_60Hz */
|
|
+ 0, /* E_REGVFMT_1920x1080p_60Hz */
|
|
+ 1, /* E_REGVFMT_720x576p_50Hz */
|
|
+ 0, /* E_REGVFMT_1280x720p_50Hz */
|
|
+ 0, /* E_REGVFMT_1920x1080i_50Hz */
|
|
+ 1, /* E_REGVFMT_720x576i_50Hz */
|
|
+ 1, /* E_REGVFMT_720x288p_50Hz */
|
|
+ 0, /* E_REGVFMT_1920x1080p_50Hz */
|
|
+ 0, /* E_REGVFMT_1920x1080p_24Hz */
|
|
+ 0, /* E_REGVFMT_1920x1080p_25Hz */
|
|
+ 0 /* E_REGVFMT_1920x1080p_30Hz */
|
|
+#ifdef FORMAT_PC
|
|
+ , 1, /* E_REGVFMT_640x480p_72Hz */
|
|
+ 1, /* E_REGVFMT_640x480p_75Hz */
|
|
+ 1, /* E_REGVFMT_640x480p_85Hz */
|
|
+ 0, /* E_REGVFMT_800x600p_60Hz */
|
|
+ 0, /* E_REGVFMT_800x600p_72Hz */
|
|
+ 0, /* E_REGVFMT_800x600p_75Hz */
|
|
+ 0, /* E_REGVFMT_800x600p_85Hz */
|
|
+ 1, /* E_REGVFMT_1024x768p_60Hz */
|
|
+ 1, /* E_REGVFMT_1024x768p_70Hz */
|
|
+ 0, /* E_REGVFMT_1024x768p_75Hz */
|
|
+ 1, /* E_REGVFMT_1280x768p_60Hz */
|
|
+ 0, /* E_REGVFMT_1280x1024p_60Hz */
|
|
+ 0, /* E_REGVFMT_1280x1024p_75Hz */
|
|
+ 0, /* E_REGVFMT_1360x768p_60Hz */
|
|
+ 1, /* E_REGVFMT_1400x1050p_60Hz */
|
|
+ 0, /* E_REGVFMT_1600x1200p_60Hz */
|
|
+#endif /* FORMAT_PC */
|
|
+};
|
|
+
|
|
+/**
|
|
+ * Lokup table to convert from video format codes used in the
|
|
+ * E_REG_P00_VIDFORMAT_W register to RefPix and RefLine values
|
|
+ * according to sync source
|
|
+ * */
|
|
+static CONST_DAT struct {
|
|
+ u16 ref_pix_vs_sync; /* Output values for Vs/Hs input sync */
|
|
+ u16 ref_line_vs_sync;
|
|
+ /* Output values for all other input sync sources */
|
|
+ u16 ref_pix_other_sync;
|
|
+ u16 ref_line_other_sync;
|
|
+} k_vid_fmt_to_refpix_refline[E_REGVFMT_NUM] = {
|
|
+ /* PixVs LineVs PixOther LineOther vinFmt */
|
|
+ {17, 2, 161, 36}, /* E_REGVFMT_640x480p_60Hz */
|
|
+ {17, 8, 139, 43}, /* E_REGVFMT_720x480p_60Hz */
|
|
+ {111, 2, 371, 26}, /* E_REGVFMT_1280x720p_60Hz */
|
|
+ {89, 2, 281, 21}, /* E_REGVFMT_1920x1080i_60Hz */
|
|
+ {20, 5, 139, 22}, /* E_REGVFMT_720x480i_60Hz */
|
|
+ {20, 5, 139, 22}, /* E_REGVFMT_720x240p_60Hz */
|
|
+ {89, 2, 281, 42}, /* E_REGVFMT_1920x1080p_60Hz */
|
|
+ {13, 2, 145, 45}, /* E_REGVFMT_720x576p_50Hz */
|
|
+ {441, 2, 701, 26}, /* E_REGVFMT_1280x720p_50Hz */
|
|
+ {529, 2, 721, 21}, /* E_REGVFMT_1920x1080i_50Hz */
|
|
+ {13, 2, 145, 23}, /* E_REGVFMT_720x576i_50Hz */
|
|
+ {13, 2, 145, 23}, /* E_REGVFMT_720x288p_50Hz */
|
|
+ {529, 2, 721, 42}, /* E_REGVFMT_1920x1080p_50Hz */
|
|
+ {639, 2, 831, 42}, /* E_REGVFMT_1920x1080p_24Hz */
|
|
+ {529, 2, 721, 42}, /* E_REGVFMT_1920x1080p_25Hz */
|
|
+ {89, 2, 281, 42} /* E_REGVFMT_1920x1080p_30Hz */
|
|
+#ifdef FORMAT_PC
|
|
+ , {25, 2, 195, 32}, /* E_REGVFMT_640x480p_72Hz */
|
|
+ {17, 2, 203, 20}, /* E_REGVFMT_640x480p_75Hz */
|
|
+ {57, 2, 195, 29}, /* E_REGVFMT_640x480p_85Hz */
|
|
+ {41, 2, 259, 28}, /* E_REGVFMT_800x600p_60Hz */
|
|
+ {57, 2, 243, 30}, /* E_REGVFMT_800x600p_72Hz */
|
|
+ {17, 2, 259, 25}, /* E_REGVFMT_800x600p_75Hz */
|
|
+ {33, 2, 251, 31}, /* E_REGVFMT_800x600p_85Hz */
|
|
+ {25, 2, 323, 36}, /* E_REGVFMT_1024x768p_60Hz */
|
|
+ {25, 2, 307, 36}, /* E_REGVFMT_1024x768p_70Hz */
|
|
+ {17, 2, 291, 32}, /* E_REGVFMT_1024x768p_75Hz */
|
|
+ {65, 2, 387, 28}, /* E_REGVFMT_1280x768p_60Hz */
|
|
+ {49, 2, 501, 42}, /* E_REGVFMT_1280x1024p_60Hz */
|
|
+ {17, 2, 411, 42}, /* E_REGVFMT_1280x1024p_75Hz */
|
|
+ {65, 2, 435, 25}, /* E_REGVFMT_1360x768p_60Hz */
|
|
+ {89, 2, 467, 37}, /* E_REGVFMT_1400x1050p_60Hz */
|
|
+ {65, 2, 563, 50} /* E_REGVFMT_1600x1200p_60Hz */
|
|
+#endif/* FORMAT_PC */
|
|
+};
|
|
+
|
|
+static CONST_DAT hdmi_tx_vid_reg_t k_vid_fmt_format_param[E_REGVFMT_NUM_TV_NO_REG] = {
|
|
+ /* NPIX NLINE VsLineStart VsPixStart VsLineEnd VsPixEnd HsStart HsEnd vWinStart vWinEnd DeStart DeEnd */
|
|
+ /* E_REGVFMT_1920x1080p_24Hz */
|
|
+ {2750, 1125, 1, 638, 6, 638, 638, 682, 41, 1121, 830, 2750},
|
|
+ /* E_REGVFMT_1920x1080p_25Hz */
|
|
+ {2640, 1125, 1, 528, 6, 528, 528, 572, 41, 1121, 720, 2640},
|
|
+ /* E_REGVFMT_1920x1080p_30Hz */
|
|
+ {2200, 1125, 1, 88, 6, 88, 88, 132, 41, 1121, 280, 2200},
|
|
+
|
|
+};
|
|
+
|
|
+#ifdef FORMAT_PC
|
|
+static CONST_DAT hdmi_tx_vid_reg_t k_vid_fmt_to_pcformat_param[E_REGVFMT_NUM_PC] = {
|
|
+ /* NPIX NLINE VsLineStart VsPixStart VsLineEnd VsPixEnd HsStart HsEnd vWinStart vWinEnd DeStart DeEnd */
|
|
+ /* E_REGVFMT_640x480p_72Hz */
|
|
+ {832, 520, 1, 24, 4, 24, 24, 64, 31, 511, 192, 832},
|
|
+ /* E_REGVFMT_640x480p_75Hz */
|
|
+ {840, 500, 1, 16, 4, 16, 16, 80, 19, 499, 200, 840},
|
|
+ /* E_REGVFMT_640x480p_85Hz */
|
|
+ {832, 509, 1, 56, 4, 56, 56, 112, 28, 508, 192, 832},
|
|
+ /* E_REGVFMT_800x600p_60Hz */
|
|
+ {1056, 628, 1, 40, 5, 40, 40, 168, 27, 627, 256, 1056},
|
|
+ /* E_REGVFMT_800x600p_72Hz */
|
|
+ {1040, 666, 1, 56, 7, 56, 56, 176, 29, 619, 240, 1040},
|
|
+ /* E_REGVFMT_800x600p_75Hz */
|
|
+ {1056, 625, 1, 16, 4, 16, 16, 96, 24, 624, 256, 1056},
|
|
+ /* E_REGVFMT_800x600p_85Hz */
|
|
+ {1048, 631, 1, 32, 4, 32, 32, 96, 30, 630, 248, 1048},
|
|
+ /* E_REGVFMT_1024x768p_60Hz */
|
|
+ {1344, 806, 1, 24, 7, 24, 24, 160, 35, 803, 320, 1344},
|
|
+ /* E_REGVFMT_1024x768p_70Hz */
|
|
+ {1328, 806, 1, 24, 7, 24, 24, 160, 35, 803, 304, 1328},
|
|
+ /* E_REGVFMT_1024x768p_75Hz */
|
|
+ {1312, 800, 1, 16, 4, 16, 16, 112, 31, 799, 288, 1312},
|
|
+ /* E_REGVFMT_1280x768p_60Hz */
|
|
+ {1664, 798, 1, 64, 8, 64, 64, 192, 27, 795, 384, 1664},
|
|
+ /* E_REGVFMT_1280x1024p_60Hz */
|
|
+ {1688, 1066, 1, 48, 4, 48, 48, 160, 41, 1065, 408, 1688},
|
|
+ /* E_REGVFMT_1280x1024p_75Hz */
|
|
+ {1688, 1066, 1, 16, 4, 16, 16, 160, 41, 1065, 408, 1688},
|
|
+ /* E_REGVFMT_1360x768p_60Hz */
|
|
+ {1792, 795, 1, 64, 7, 64, 64, 176, 24, 792, 432, 1792},
|
|
+ /* E_REGVFMT_1400x1050p_60Hz */
|
|
+ {1864, 1089, 1, 88, 5, 88, 88, 232, 36, 1086, 464, 1864},
|
|
+ /* E_REGVFMT_1600x1200p_60Hz */
|
|
+ {2160, 1250, 1, 64, 4, 64, 64, 256, 49, 1249, 560, 2160}
|
|
+};
|
|
+#endif/* FORMAT_PC */
|
|
+
|
|
+/**
|
|
+ * lookup table for each pixel clock frequency's CTS value in k_hz
|
|
+ * according to SCS table "audio clock recovery CTS values"
|
|
+ * */
|
|
+static CONST_DAT u32 k_pix_clk_to_acr_cts[E_PIXCLK_NUM][HDMITX_AFS_NUM] = {
|
|
+ /* HDMITX_AFS_32k _AFS_48K _AFS_96K _AFS_192K */
|
|
+ /* _AFS_44_1k _AFS_88_2K _AFS_176_4K */
|
|
+ /* E_PIXCLK_25175 */
|
|
+ { 28125, 31250, 28125, 31250, 28125, 31250, 28125},
|
|
+ /* E_PIXCLK_25200 */
|
|
+ { 25200, 28000, 25200, 28000, 25200, 28000, 25200},
|
|
+ /* E_PIXCLK_27000 */
|
|
+ { 27000, 30000, 27000, 30000, 27000, 30000, 27000},
|
|
+ /* E_PIXCLK_27027 */
|
|
+ { 27027, 30030, 27027, 30030, 27027, 30030, 27027},
|
|
+ /* E_PIXCLK_54000 */
|
|
+ { 54000, 60000, 54000, 60000, 54000, 60000, 54000},
|
|
+ /* E_PIXCLK_54054 */
|
|
+ { 54054, 60060, 54054, 60060, 54054, 60060, 54054},
|
|
+ /* E_PIXCLK_74175 */
|
|
+ {210937, 234375, 140625, 234375, 140625, 234375, 140625},
|
|
+ /* E_PIXCLK_74250 */
|
|
+ { 74250, 82500, 74250, 82500, 74250, 82500, 74250},
|
|
+ /* E_PIXCLK_148350*/
|
|
+ {421875, 234375, 140625, 234375, 140625, 234375, 140625},
|
|
+ /* E_PIXCLK_148500*/
|
|
+ {148500, 165000, 148500, 165000, 148500, 165000, 148500}
|
|
+#ifdef FORMAT_PC
|
|
+ /* E_PIXCLK_31500 */
|
|
+ , { 31500, 35000, 31500, 35000, 31500, 35000, 31500},
|
|
+ /* E_PIXCLK_36000 */
|
|
+ { 36000, 40000, 36000, 40000, 36000, 40000, 36000},
|
|
+ /* E_PIXCLK_40000 */
|
|
+ { 40000, 44444, 40000, 44444, 40000, 44444, 40000},
|
|
+ /* E_PIXCLK_49500 */
|
|
+ { 49500, 55000, 49500, 55000, 49500, 55000, 49500},
|
|
+ /* E_PIXCLK_50000 */
|
|
+ { 50000, 55556, 50000, 55556, 50000, 55556, 50000},
|
|
+ /* E_PIXCLK_56250 */
|
|
+ { 56250, 62500, 56250, 62500, 56250, 62500, 56250},
|
|
+ /* E_PIXCLK_65000 */
|
|
+ { 65000, 72222, 65000, 72222, 65000, 72222, 65000},
|
|
+ /* E_PIXCLK_75000 */
|
|
+ { 75000, 83333, 75000, 83333, 75000, 83333, 75000},
|
|
+ /* E_PIXCLK_78750 */
|
|
+ { 78750, 87500, 78750, 87500, 78750, 87500, 78750},
|
|
+ /* E_PIXCLK_135000 */
|
|
+ {135000, 150000, 135000, 150000, 135000, 150000, 135000},
|
|
+ /* E_PIXCLK_162000*/
|
|
+ {162000, 180000, 162000, 180000, 162000, 180000, 162000}
|
|
+#endif /* FORMAT_PC */
|
|
+};
|
|
+
|
|
+/**
|
|
+ * Lookup table for each pixel clock frequency's Audio Clock Regeneration N,
|
|
+ * according to SCS Table "Audio Clock Recovery N Values"
|
|
+ * */
|
|
+
|
|
+static CONST_DAT u32 k_pix_clk_to_acr_n[E_PIXCLK_NUM][HDMITX_AFS_NUM] = {
|
|
+ /* HDMITX_AFS_32k _AFS_48K _AFS_96K _AFS_192K */
|
|
+ /* _AFS_44_1k _AFS_88_2K _AFS_176_4K */
|
|
+ /* E_PIXCLK_25175 */
|
|
+ { 4576, 7007, 6864, 14014, 13728, 28028, 27456},
|
|
+ /* E_PIXCLK_25200 */
|
|
+ { 4096, 6272, 6144, 12544, 12288, 25088, 24576},
|
|
+ /* E_PIXCLK_27000 */
|
|
+ { 4096, 6272, 6144, 12544, 12288, 25088, 24576},
|
|
+ /* E_PIXCLK_27027 */
|
|
+ { 4096, 6272, 6144, 12544, 12288, 25088, 24576},
|
|
+ /* E_PIXCLK_54000 */
|
|
+ { 4096, 6272, 6144, 12544, 12288, 25088, 24576},
|
|
+ /* E_PIXCLK_54054 */
|
|
+ { 4096, 6272, 6144, 12544, 12288, 25088, 24576},
|
|
+ /* E_PIXCLK_74175 */
|
|
+ {11648, 17836, 11648, 35672, 23296, 71344, 46592},
|
|
+ /* E_PIXCLK_74250 */
|
|
+ { 4096, 6272, 6144, 12544, 12288, 25088, 24576},
|
|
+ /* E_PIXCLK_148350*/
|
|
+ {11648, 8918, 5824, 17836, 11648, 35672, 23296},
|
|
+ /* E_PIXCLK_148500*/
|
|
+ { 4096, 6272, 6144, 12544, 12288, 25088, 24576}
|
|
+#ifdef FORMAT_PC
|
|
+ /* E_PIXCLK_31500 */
|
|
+ , { 4096, 6272, 6144, 12544, 12288, 25088, 24576},
|
|
+ { 4096, 6272, 6144, 12544, 12288, 25088, 24576}, /* E_PIXCLK_36000 */
|
|
+ { 4096, 6272, 6144, 12544, 12288, 25088, 24576}, /* E_PIXCLK_40000 */
|
|
+ { 4096, 6272, 6144, 12544, 12288, 25088, 24576}, /* E_PIXCLK_49500 */
|
|
+ { 4096, 6272, 6144, 12544, 12288, 25088, 24576}, /* E_PIXCLK_50000 */
|
|
+ { 4096, 6272, 6144, 12544, 12288, 25088, 24576}, /* E_PIXCLK_56250 */
|
|
+ { 4096, 6272, 6144, 12544, 12288, 25088, 24576}, /* E_PIXCLK_65000 */
|
|
+ { 4096, 6272, 6144, 12544, 12288, 25088, 24576}, /* E_PIXCLK_75000 */
|
|
+ { 4096, 6272, 6144, 12544, 12288, 25088, 24576}, /* E_PIXCLK_78750 */
|
|
+ { 4096, 6272, 6144, 12544, 12288, 25088, 24576}, /* E_PIXCLK_135000*/
|
|
+ { 4096, 6272, 6144, 12544, 12288, 25088, 24576} /* E_PIXCLK_162000*/
|
|
+#endif /* FORMAT_PC */
|
|
+};
|
|
+
|
|
+/**
|
|
+ * Lookup table for each pixel clock frequency's Audio Divider, according to
|
|
+ * SCS Table "Audio Clock Recovery Divider Values"
|
|
+ * */
|
|
+static CONST_DAT u8 k_pix_clk_to_adiv[E_PIXCLK_NUM][HDMITX_AFS_NUM] = {
|
|
+ /* HDMITX_AFS_32k _AFS_48K _AFS_96K _AFS_192K */
|
|
+ /* _AFS_44_1k _AFS_88_2K _AFS_176_4K */
|
|
+ /* E_PIXCLK_25175 */
|
|
+ {2, 2, 2, 1, 1, 0, 0},
|
|
+ /* E_PIXCLK_25200 */
|
|
+ {2, 2, 2, 1, 1, 0, 0},
|
|
+ /* E_PIXCLK_27000 */
|
|
+ {2, 2, 2, 1, 1, 0, 0},
|
|
+ /* E_PIXCLK_27027 */
|
|
+ {2, 2, 2, 1, 1, 0, 0},
|
|
+ /* E_PIXCLK_54000 */
|
|
+ {3, 3, 3, 2, 2, 1, 1},
|
|
+ /* E_PIXCLK_54054 */
|
|
+ {3, 3, 3, 2, 2, 1, 1},
|
|
+ /* E_PIXCLK_74175 */
|
|
+ {4, 3, 3, 2, 2, 1, 1},
|
|
+ /* E_PIXCLK_74250 */
|
|
+ {4, 3, 3, 2, 2, 1, 1},
|
|
+ /* E_PIXCLK_148350*/
|
|
+ {5, 4, 4, 3, 3, 2, 2},
|
|
+ /* E_PIXCLK_148500*/
|
|
+ {5, 4, 4, 3, 3, 2, 2}
|
|
+#ifdef FORMAT_PC
|
|
+ , {2, 2, 2, 1, 1, 0, 0}, /* E_PIXCLK_31500 */
|
|
+ {3, 2, 2, 1, 1, 0, 0}, /* E_PIXCLK_36000 */
|
|
+ {3, 2, 2, 1, 1, 0, 0}, /* E_PIXCLK_40000 */
|
|
+ {3, 3, 3, 2, 2, 1, 1}, /* E_PIXCLK_49500 */
|
|
+ {3, 3, 3, 2, 2, 1, 1}, /* E_PIXCLK_50000 */
|
|
+ {3, 3, 3, 2, 2, 1, 1}, /* E_PIXCLK_56250 */
|
|
+ {4, 3, 3, 2, 2, 1, 1}, /* E_PIXCLK_65000 */
|
|
+ {4, 3, 3, 2, 2, 1, 1}, /* E_PIXCLK_75000 */
|
|
+ {4, 3, 3, 2, 2, 1, 1}, /* E_PIXCLK_78750 */
|
|
+ {5, 4, 4, 3, 3, 2, 2}, /* E_PIXCLK_135000*/
|
|
+ {5, 4, 4, 3, 3, 2, 2} /* E_PIXCLK_162000*/
|
|
+#endif /* FORMAT_PC */
|
|
+
|
|
+};
|
|
+
|
|
+/**
|
|
+ * Lookup table for converting a sampling frequency into the values
|
|
+ * required in channel status byte 3 according to IEC60958-3
|
|
+ * */
|
|
+static CONST_DAT u8 k_afs_to_csbyte3[HDMITX_AFS_NUM+1] = {
|
|
+ 3, /* HDMITX_AFS_32k */
|
|
+ 0, /* HDMITX_AFS_44_1k */
|
|
+ 2, /* HDMITX_AFS_48k */
|
|
+ 8, /* HDMITX_AFS_88_2k */
|
|
+ 10, /* HDMITX_AFS_96k */
|
|
+ 12, /* HDMITX_AFS_176_4k */
|
|
+ 14, /* HDMITX_AFS_192k */
|
|
+ 1, /* HDMITX_AFS_NOT_INDICATED */
|
|
+};
|
|
+
|
|
+/**
|
|
+ * Lookup table for each pixel clock frequency index's nearest MHz value
|
|
+ * */
|
|
+static CONST_DAT u8 k_pix_clk_to_mhz[E_PIXCLK_NUM] = {
|
|
+ 25, /* E_PIXCLK_25175 */
|
|
+ 25, /* E_PIXCLK_25200 */
|
|
+ 27, /* E_PIXCLK_27000 */
|
|
+ 27, /* E_PIXCLK_27027 */
|
|
+ 54, /* E_PIXCLK_54000 */
|
|
+ 54, /* E_PIXCLK_54054 */
|
|
+ 74, /* E_PIXCLK_74175 */
|
|
+ 74, /* E_PIXCLK_74250 */
|
|
+ 148, /* E_PIXCLK_148350*/
|
|
+ 148 /* E_PIXCLK_148500*/
|
|
+#ifdef FORMAT_PC
|
|
+ , 31, /* E_PIXCLK_31500 */
|
|
+ 36, /* E_PIXCLK_36000 */
|
|
+ 40, /* E_PIXCLK_40000 */
|
|
+ 49, /* E_PIXCLK_49500 */
|
|
+ 50, /* E_PIXCLK_50000 */
|
|
+ 56, /* E_PIXCLK_56250 */
|
|
+ 65, /* E_PIXCLK_65000 */
|
|
+ 75, /* E_PIXCLK_75000 */
|
|
+ 79, /* E_PIXCLK_78750 */
|
|
+ 79, /* E_PIXCLK_79500 */
|
|
+ 85, /* E_PIXCLK_85500 */
|
|
+ 108, /* E_PIXCLK_108000 */
|
|
+ 122, /* E_PIXCLK_121750 */
|
|
+ 135, /* E_PIXCLK_135000 */
|
|
+ 162 /* E_PIXCLK_162000 */
|
|
+#endif /* FORMAT_PC */
|
|
+};
|
|
+
|
|
+/**
|
|
+ * Lookup table for each CTS X factor's k and m register values
|
|
+ * */
|
|
+static CONST_DAT u8 k_cts_xto_mk[HDMITX_CTSX_NUM][2] = {
|
|
+ /* Register values Actual values */
|
|
+ /* m k m, k */
|
|
+ {3, 0}, /* 8, 1 */
|
|
+ {3, 1}, /* 8, 2 */
|
|
+ {3, 2}, /* 8, 3 */
|
|
+ {3, 3}, /* 8, 4 */
|
|
+ {0, 0} /* 1, 1 */
|
|
+};
|
|
+
|
|
+/**
|
|
+ * Table of shadow registers, as packed Shad/Page/Addr codes.
|
|
+ * This allows shadow index values to be searched for using register page
|
|
+ * and address values.
|
|
+ * */
|
|
+static CONST_DAT u16 k_shadow_reg[E_SNUM] = {
|
|
+ /* Shadow Index Packed Shad/Page/Addr */
|
|
+ E_REG_P00_MAIN_CNTRL0_W , /* E_SP00_MAIN_CNTRL0 */
|
|
+ E_REG_P00_INT_FLAGS_0_RW, /* E_SP00_INT_FLAGS_0 */
|
|
+ E_REG_P00_INT_FLAGS_1_RW, /* E_SP00_INT_FLAGS_1 */
|
|
+#ifdef TMFL_TDA9981_SUPPORT
|
|
+ E_REG_P00_INT_FLAGS_2_RW, /* E_SP00_INT_FLAGS_2 */
|
|
+#endif /* TMFL_TDA9981_SUPPORT */
|
|
+ E_REG_P00_VIP_CNTRL_0_W , /* E_SP00_VIP_CNTRL_0 */
|
|
+ E_REG_P00_VIP_CNTRL_1_W , /* E_SP00_VIP_CNTRL_1 */
|
|
+ E_REG_P00_VIP_CNTRL_2_W , /* E_SP00_VIP_CNTRL_2 */
|
|
+ E_REG_P00_VIP_CNTRL_3_W , /* E_SP00_VIP_CNTRL_3 */
|
|
+ E_REG_P00_VIP_CNTRL_4_W , /* E_SP00_VIP_CNTRL_4 */
|
|
+ E_REG_P00_VIP_CNTRL_5_W , /* E_SP00_VIP_CNTRL_5 */
|
|
+ E_REG_P00_MAT_CONTRL_W , /* E_SP00_MAT_CONTRL */
|
|
+ E_REG_P00_TBG_CNTRL_0_W , /* E_SP00_TBG_CNTRL_0 */
|
|
+ E_REG_P00_TBG_CNTRL_1_W , /* E_SP00_TBG_CNTRL_1 */
|
|
+ E_REG_P00_HVF_CNTRL_0_W , /* E_SP00_HVF_CNTRL_0 */
|
|
+ E_REG_P00_HVF_CNTRL_1_W , /* E_SP00_HVF_CNTRL_1 */
|
|
+ E_REG_P00_TIMER_H_W , /* E_SP00_TIMER_H */
|
|
+ E_REG_P00_DEBUG_PROBE_W , /* E_SP00_DEBUG_PROBE */
|
|
+ E_REG_P00_AIP_CLKSEL_W /* E_SP00_AIP_CLKSEL */
|
|
+#ifndef TMFL_TDA9981_SUPPORT
|
|
+ , E_REG_P01_SC_VIDFORMAT_W /* E_SP01_SC_VIDFORMAT */
|
|
+ , E_REG_P01_SC_CNTRL_W /* E_SP01_SC_CNTRL */
|
|
+ , E_REG_P01_TBG_CNTRL_0_W /* E_SP01_TBG_CNTRL_0 */
|
|
+#endif /* TMFL_TDA9981_SUPPORT */
|
|
+};
|
|
+
|
|
+/**
|
|
+ * Lookup table of input port control registers and their swap and mirror masks
|
|
+ * */
|
|
+static CONST_DAT struct _bsl_reg_vip {
|
|
+ u16 reg;
|
|
+ u8 mask_swap;
|
|
+ u8 mask_mirror;
|
|
+} k_reg_vip[HDMITX_VIN_PORT_MAP_TABLE_LEN] = {
|
|
+ {
|
|
+ E_REG_P00_VIP_CNTRL_0_W,
|
|
+ e_maskreg_p00_vip_cntrl_0_swap_a,
|
|
+ e_maskreg_p00_vip_cntrl_0_mirr_a
|
|
+ }, /* Port group 0 */
|
|
+ {
|
|
+ E_REG_P00_VIP_CNTRL_0_W,
|
|
+ e_maskreg_p00_vip_cntrl_0_swap_b,
|
|
+ e_maskreg_p00_vip_cntrl_0_mirr_b
|
|
+ }, /* Port group 1 */
|
|
+ {
|
|
+ E_REG_P00_VIP_CNTRL_2_W,
|
|
+ e_maskreg_p00_vip_cntrl_1_swap_c,
|
|
+ e_maskreg_p00_vip_cntrl_1_mirr_c
|
|
+ }, /* Port group 2 */
|
|
+ {
|
|
+ E_REG_P00_VIP_CNTRL_2_W,
|
|
+ e_maskreg_p00_vip_cntrl_1_swap_d,
|
|
+ e_maskreg_p00_vip_cntrl_1_mirr_d
|
|
+ }, /* Port group 3 */
|
|
+ {
|
|
+ E_REG_P00_VIP_CNTRL_1_W,
|
|
+ e_maskreg_p00_vip_cntrl_2_swap_e,
|
|
+ e_maskreg_p00_vip_cntrl_2_mirr_e
|
|
+ }, /* Port group 4 */
|
|
+ {
|
|
+ E_REG_P00_VIP_CNTRL_1_W,
|
|
+ e_maskreg_p00_vip_cntrl_2_swap_f,
|
|
+ e_maskreg_p00_vip_cntrl_2_mirr_f
|
|
+ } /* Port group 5 */
|
|
+};
|
|
+
|
|
+/**
|
|
+ * Table of registers to switch scaler off
|
|
+ * */
|
|
+static CONST_DAT hdmi_tx_reg_mask_val_t k_scaler_off[] = {
|
|
+ /* Scaler is bypassed */
|
|
+ {E_REG_P00_MAIN_CNTRL0_W, e_maskreg_p00_main_cntrl0_scaler, 0},
|
|
+ /* Bypass PLL scaling */
|
|
+ {E_REG_P02_PLL_SCG2_RW, e_maskreg_p02_pll_scg2_bypass_scg, 1},
|
|
+ /* Disable scaler clock */
|
|
+ {E_REG_P02_SEL_CLK_RW, e_maskreg_p02_sel_clk_ena_sc_clk, 0},
|
|
+ /* PLL loop open (standby) */
|
|
+ {E_REG_P02_PLL_SCG1_RW, e_maskreg_p02_pll_scg1_scg_fdn, 1},
|
|
+ {0, 0, 0}
|
|
+};
|
|
+
|
|
+/**
|
|
+ * Table of registers to switch scaler on
|
|
+ * */
|
|
+static CONST_DAT hdmi_tx_reg_mask_val_t k_scaler_on[] = {
|
|
+ /* Scaler is on */
|
|
+ {E_REG_P00_MAIN_CNTRL0_W, e_maskreg_p00_main_cntrl0_scaler, 1},
|
|
+ /* Don't bypass PLL scaling */
|
|
+ {E_REG_P02_PLL_SCG2_RW, e_maskreg_p02_pll_scg2_bypass_scg, 0},
|
|
+ /* Enable scaler clock */
|
|
+ {E_REG_P02_SEL_CLK_RW, e_maskreg_p02_sel_clk_ena_sc_clk, 1},
|
|
+ /* PLL loop active */
|
|
+ {E_REG_P02_PLL_SCG1_RW, e_maskreg_p02_pll_scg1_scg_fdn, 0},
|
|
+ {0, 0, 0}
|
|
+};
|
|
+
|
|
+/**
|
|
+ * Table of registers to switch to low power (standby)
|
|
+ * */
|
|
+static CONST_DAT hdmi_tx_reg_mask_val_t k_power_off[] = {
|
|
+ {E_REG_P02_TEST2_RW, e_maskreg_p02_test2_pwd1v8, 1},
|
|
+ {E_REG_P02_PLL_SCG1_RW, e_maskreg_p02_pll_scg1_scg_fdn, 1},
|
|
+ {E_REG_P02_PLL_SERIAL_1_RW, e_maskreg_p02_pll_serial_1_srl_fdn, 1},
|
|
+ {E_REG_P02_PLL_DE_RW, e_maskreg_p02_pll_de_pllde_fdn, 1},
|
|
+ {E_REG_P02_BUFFER_OUT_RW, e_maskreg_p02_buffer_out_srl_force, 2},
|
|
+ {E_REG_P02_SEL_CLK_RW, e_maskreg_p02_sel_clk_ena_sc_clk, 0},
|
|
+#ifdef TMFL_TDA9981_SUPPORT
|
|
+ {E_REG_P00_CCLK_ON_RW, e_maskreg_p00_cclk_on_cclk_on, 0},
|
|
+#endif /* TMFL_TDA9981_SUPPORT */
|
|
+ {0, 0, 0}
|
|
+};
|
|
+
|
|
+/**
|
|
+ * Table of registers to switch to normal power (resume)
|
|
+ * */
|
|
+static CONST_DAT hdmi_tx_reg_mask_val_t k_power_on[] = {
|
|
+ {E_REG_P02_TEST2_RW, e_maskreg_p02_test2_pwd1v8, 0},
|
|
+ {E_REG_P02_PLL_SERIAL_1_RW, e_maskreg_p02_pll_serial_1_srl_fdn, 0},
|
|
+ {E_REG_P02_PLL_DE_RW, e_maskreg_p02_pll_de_pllde_fdn, 0},
|
|
+ {E_REG_P02_PLL_SCG1_RW, e_maskreg_p02_pll_scg1_scg_fdn, 0},
|
|
+ {E_REG_P02_SEL_CLK_RW, e_maskreg_p02_sel_clk_ena_sc_clk, 1},
|
|
+ {E_REG_P02_BUFFER_OUT_RW, e_maskreg_p02_buffer_out_srl_force, 0},
|
|
+ {E_REG_P00_TBG_CNTRL_0_W, e_maskreg_p00_tbg_cntrl_0_sync_once, 0},
|
|
+#ifdef TMFL_TDA9981_SUPPORT
|
|
+ {E_REG_P00_CCLK_ON_RW, e_maskreg_p00_cclk_on_cclk_on, 1},
|
|
+#endif /* TMFL_TDA9981_SUPPORT */
|
|
+ {0, 0, 0}
|
|
+};
|
|
+
|
|
+/**
|
|
+ * Table of registers to switch HDMI HDCP mode off for DVI
|
|
+ * */
|
|
+static CONST_DAT hdmi_tx_reg_mask_val_t k_vout_hdcp_off[] = {
|
|
+ {E_REG_P00_TBG_CNTRL_1_W, e_maskreg_p00_tbg_cntrl_1_dwin_dis, 1},
|
|
+ {E_REG_P12_HDCP_TX33_RW, e_maskreg_p12_hdcp_tx_33_hdmi, 0},
|
|
+ {E_REG_P12_HDCP_TX33_RW, e_maskreg_p12_hdcp_tx_33_eess, 0},
|
|
+ {E_REG_P12_HDCP_TX33_RW, e_maskreg_p12_hdcp_tx_33_ctl_sel, 0},
|
|
+ {0, 0, 0}
|
|
+};
|
|
+
|
|
+/**
|
|
+ * Table of registers to switch HDMI HDCP mode on for HDMI
|
|
+ * */
|
|
+static CONST_DAT hdmi_tx_reg_mask_val_t k_vout_hdcp_on[] = {
|
|
+ {E_REG_P00_TBG_CNTRL_1_W, e_maskreg_p00_tbg_cntrl_1_dwin_dis, 0},
|
|
+ {E_REG_P11_ENC_CNTRL_RW, e_maskreg_p11_enc_cntrl_ctl_code, 1},
|
|
+ {E_REG_P12_HDCP_TX33_RW, e_maskreg_p12_hdcp_tx_33_hdmi, 1},
|
|
+ {E_REG_P12_HDCP_TX33_RW, e_maskreg_p12_hdcp_tx_33_eess, 1},
|
|
+ {E_REG_P12_HDCP_TX33_RW, e_maskreg_p12_hdcp_tx_33_ctl_sel, 1},
|
|
+ {0, 0, 0}
|
|
+};
|
|
+
|
|
+/**
|
|
+ * Table of registers to reset and release the CTS generator
|
|
+ * */
|
|
+static CONST_DAT hdmi_tx_reg_mask_val_t k_reset_cts_generator[] = {
|
|
+ {E_REG_P11_AIP_CNTRL_0_RW, e_maskreg_p11_aip_cntrl_0_rst_cts, 1},
|
|
+ {E_REG_P11_AIP_CNTRL_0_RW, e_maskreg_p11_aip_cntrl_0_rst_cts, 0},
|
|
+ {0, 0, 0}
|
|
+};
|
|
+
|
|
+/**
|
|
+ * Table of registers to set 5s watchdog timer
|
|
+ * */
|
|
+static CONST_DAT hdmi_tx_reg_mask_val_t k_set5sec_watchdog[] = {
|
|
+ /* Watchdog timer reference = CCLK divide by 32 / 100 = 10 kHz */
|
|
+ /* PNF57 {E_REG_P00_NDIV_PF_W, E_MASKREG_ALL, 100}, */
|
|
+ /* CCLK divide by 32 = 1MHz */
|
|
+ {E_REG_P00_TIMER_H_W, e_maskreg_p00_timer_h_wd_clksel, 1},
|
|
+ /* Set 5s watchdog (registers set to 100,000) */
|
|
+ {E_REG_P00_TIMER_H_W, e_maskreg_p00_timer_h_tim_h, 0x02},
|
|
+ {E_REG_P00_TIMER_M_W, E_MASKREG_ALL, 0xb0},
|
|
+ {E_REG_P00_TIMER_L_W, E_MASKREG_ALL, 0x00},
|
|
+ {0, 0, 0}
|
|
+};
|
|
+
|
|
+/**
|
|
+ * Table of registers to set 120ms watchdog timer based on HDMI clock
|
|
+ * */
|
|
+static CONST_DAT hdmi_tx_reg_mask_val_t k_set120ms_watchdog[] = {
|
|
+ /* Set HDMI clock as watchdog */
|
|
+ {E_REG_P00_TIMER_H_W, e_maskreg_p00_timer_h_wd_clksel, 0},
|
|
+ /* Set 120ms watchdog (registers set to 120,000us) */
|
|
+ {E_REG_P00_TIMER_H_W, e_maskreg_p00_timer_h_tim_h, 0x01},
|
|
+ {E_REG_P00_TIMER_M_W, E_MASKREG_ALL, 0xD4},
|
|
+ {E_REG_P00_TIMER_L_W, E_MASKREG_ALL, 0xC0},
|
|
+ {0, 0, 0}
|
|
+};
|
|
+
|
|
+/**
|
|
+ * Table of registers to set 1s watchdog timer based on HDMI clock use for phase3
|
|
+ * */
|
|
+static CONST_DAT hdmi_tx_reg_mask_val_t k_set1s_watchdog[] = {
|
|
+ /* PNF57 Set HDMI clock as watchdog */
|
|
+ {E_REG_P00_TIMER_H_W, e_maskreg_p00_timer_h_wd_clksel, 0},
|
|
+ /* Set 600ms watchdog for link check */
|
|
+ {E_REG_P00_TIMER_H_W, e_maskreg_p00_timer_h_tim_h, 0x00},
|
|
+ {E_REG_P00_TIMER_M_W, E_MASKREG_ALL, 0x75},
|
|
+ {E_REG_P00_TIMER_L_W, E_MASKREG_ALL, 0x30},
|
|
+ {0, 0, 0}
|
|
+};
|
|
+
|
|
+/**
|
|
+ * Table of registers to bypass colour processing (up/down sampler & matrix)
|
|
+ * */
|
|
+static CONST_DAT hdmi_tx_reg_mask_val_t k_bypass_colour_proc[] = {
|
|
+ /* Bypass upsampler for RGB colourbars */
|
|
+ {E_REG_P00_HVF_CNTRL_0_W, e_maskreg_p00_hvf_cntrl_0_intpol, 0},
|
|
+ /* Bypass matrix for RGB colourbars */
|
|
+ {E_REG_P00_MAT_CONTRL_W, e_maskreg_p00_mat_contrl_mat_bp, 1},
|
|
+ /* Bypass downsampler for RGB colourbars */
|
|
+ {E_REG_P00_HVF_CNTRL_1_W, e_maskreg_p00_hvf_cntrl_1_for, 0},
|
|
+ {0, 0, 0}
|
|
+};
|
|
+
|
|
+/**
|
|
+ * Table of registers to configure video input mode CCIR656
|
|
+ * */
|
|
+static CONST_DAT hdmi_tx_reg_mask_val_t k_vin_mode_ccir656[] = {
|
|
+ {E_REG_P00_VIP_CNTRL_4_W, e_maskreg_p00_vip_cntrl_4_ccir656, 1},
|
|
+ {E_REG_P00_HVF_CNTRL_1_W, e_maskreg_p00_hvf_cntrl_1_semi_planar, 1},
|
|
+ {E_REG_P02_SEL_CLK_RW, e_maskreg_p02_sel_clk_sel_clk1, 1},
|
|
+ {E_REG_P02_PLL_SERIAL_3_RW, e_maskreg_p02_pll_serial_3_srl_ccir, 1},
|
|
+ {0, 0, 0}
|
|
+};
|
|
+
|
|
+/**
|
|
+ * Table of registers to configure video input mode RGB444 or YUV444
|
|
+ * */
|
|
+static CONST_DAT hdmi_tx_reg_mask_val_t k_vin_mode444[] = {
|
|
+ {E_REG_P00_VIP_CNTRL_4_W, e_maskreg_p00_vip_cntrl_4_ccir656, 0},
|
|
+ {E_REG_P00_HVF_CNTRL_1_W, e_maskreg_p00_hvf_cntrl_1_semi_planar, 0},
|
|
+ {E_REG_P02_SEL_CLK_RW, e_maskreg_p02_sel_clk_sel_clk1, 0},
|
|
+ {E_REG_P02_PLL_SERIAL_3_RW, e_maskreg_p02_pll_serial_3_srl_ccir, 0},
|
|
+ {E_REG_P02_SEL_CLK_RW, e_maskreg_p02_sel_clk_sel_vrf_clk, 0},
|
|
+ {0, 0, 0}
|
|
+};
|
|
+
|
|
+/**
|
|
+ * Table of registers to configure video input mode YUV422
|
|
+ * */
|
|
+static CONST_DAT hdmi_tx_reg_mask_val_t k_vin_mode_yuv422[] = {
|
|
+ {E_REG_P00_VIP_CNTRL_4_W, e_maskreg_p00_vip_cntrl_4_ccir656, 0},
|
|
+ {E_REG_P00_HVF_CNTRL_1_W, e_maskreg_p00_hvf_cntrl_1_semi_planar, 1},
|
|
+ {E_REG_P02_SEL_CLK_RW, e_maskreg_p02_sel_clk_sel_clk1, 0},
|
|
+ {E_REG_P02_PLL_SERIAL_3_RW, e_maskreg_p02_pll_serial_3_srl_ccir, 0},
|
|
+ {E_REG_P02_SEL_CLK_RW, e_maskreg_p02_sel_clk_sel_vrf_clk, 0},
|
|
+ {0, 0, 0}
|
|
+};
|
|
+
|
|
+/**
|
|
+ * Table of PLL settings registers to configure for all video input format (vinFmt)
|
|
+ * */
|
|
+static CONST_DAT hdmi_tx_reg_mask_val_t k_common_pll_cfg[] = {
|
|
+ {E_REG_P02_PLL_SERIAL_1_RW, E_MASKREG_ALL, 0x00},
|
|
+ {E_REG_P02_PLL_SERIAL_2_RW, E_MASKREG_ALL, 0x01},
|
|
+ {E_REG_P02_PLL_SERIAL_3_RW, E_MASKREG_ALL, 0x01},
|
|
+ {E_REG_P02_SERIALIZER_RW, E_MASKREG_ALL, 0x00},
|
|
+ {E_REG_P02_BUFFER_OUT_RW, E_MASKREG_ALL, 0x00},
|
|
+ {E_REG_P02_CCIR_DIV_RW, E_MASKREG_ALL, 0x00},
|
|
+ {E_REG_P02_PLL_SCG1_RW, E_MASKREG_ALL, 0x00},
|
|
+ {E_REG_P02_AUDIO_DIV_RW, E_MASKREG_ALL, 0x03},
|
|
+ {E_REG_P02_TEST2_RW, E_MASKREG_ALL, 0x00},
|
|
+ {E_REG_P02_SEL_CLK_RW, E_MASKREG_ALL, 0x09},
|
|
+ {0, 0, 0}
|
|
+};
|
|
+
|
|
+/**
|
|
+ * Table of PLL settings registers to configure for 480i and 576i vinFmt
|
|
+ * */
|
|
+static CONST_DAT hdmi_tx_reg_mask_val_t k_vfmt480i576i_pll_cfg[] = {
|
|
+ {E_REG_P02_PLL_SCGN1_RW, E_MASKREG_ALL, 0x14},
|
|
+ {E_REG_P02_PLL_SCGN2_RW, E_MASKREG_ALL, 0x00},
|
|
+ {E_REG_P02_PLL_SCGR1_RW, E_MASKREG_ALL, 0x0A},
|
|
+ {E_REG_P02_PLL_SCGR2_RW, E_MASKREG_ALL, 0x00},
|
|
+ {0, 0, 0}
|
|
+};
|
|
+
|
|
+/**
|
|
+ * Table of PLL settings registers to configure for other vinFmt than 480i and 576i
|
|
+ * */
|
|
+static CONST_DAT hdmi_tx_reg_mask_val_t k_vfmt_other_pll_cfg[] = {
|
|
+ {E_REG_P02_PLL_SCGN1_RW, E_MASKREG_ALL, 0xFA},
|
|
+ {E_REG_P02_PLL_SCGN2_RW, E_MASKREG_ALL, 0x00},
|
|
+ {E_REG_P02_PLL_SCGR1_RW, E_MASKREG_ALL, 0x5B},
|
|
+ {E_REG_P02_PLL_SCGR2_RW, E_MASKREG_ALL, 0x00},
|
|
+ {0, 0, 0}
|
|
+};
|
|
+
|
|
+/**
|
|
+ * Table of PLL settings registers to configure for single mode pixel rate,
|
|
+ * vinFmt 480i or 576i only
|
|
+ * */
|
|
+static CONST_DAT hdmi_tx_reg_mask_val_t k_single_prate_vfmt480i576i_pll_cfg[] = {
|
|
+ {E_REG_P02_PLL_SCG2_RW, E_MASKREG_ALL, 0x11},
|
|
+ {E_REG_P02_PLL_DE_RW, E_MASKREG_ALL, 0xA1},
|
|
+ {0, 0, 0}
|
|
+};
|
|
+
|
|
+/**
|
|
+ * Table of PLL settings registers to configure for single repeated mode pixel rate,
|
|
+ * vinFmt 480i or 576i only
|
|
+ * */
|
|
+static CONST_DAT hdmi_tx_reg_mask_val_t k_srepeated_prate_vfmt480i576i_pll_cfg[] = {
|
|
+ {E_REG_P02_PLL_SCG2_RW, E_MASKREG_ALL, 0x01},
|
|
+ {E_REG_P02_PLL_DE_RW, E_MASKREG_ALL, 0xA1},
|
|
+ {E_REG_P02_CCIR_DIV_RW, E_MASKREG_ALL, 0x01},
|
|
+ {0, 0, 0}
|
|
+};
|
|
+
|
|
+/**
|
|
+ * Table of PLL settings registers to configure single mode pixel rate,
|
|
+ * vinFmt other than 480i or 576i
|
|
+ * */
|
|
+static CONST_DAT hdmi_tx_reg_mask_val_t k_single_prate_vfmt_other_pll_cfg[] = {
|
|
+ {E_REG_P02_PLL_SCG2_RW, E_MASKREG_ALL, 0x10},
|
|
+ {E_REG_P02_PLL_DE_RW, E_MASKREG_ALL, 0x91},
|
|
+ {0, 0, 0}
|
|
+};
|
|
+
|
|
+/**
|
|
+ * Table of PLL settings registers to configure double mode pixel rate,
|
|
+ * vinFmt other than 480i or 576i
|
|
+ * */
|
|
+static CONST_DAT hdmi_tx_reg_mask_val_t k_double_prate_vfmt_other_pll_cfg[] = {
|
|
+ {E_REG_P02_PLL_SCG2_RW, E_MASKREG_ALL, 0x00},
|
|
+ {E_REG_P02_PLL_DE_RW, E_MASKREG_ALL, 0x10},
|
|
+ {0, 0, 0}
|
|
+};
|
|
+
|
|
+/**
|
|
+ * Blue filter Lookup table for colour space conversion.
|
|
+ * Each array consists of 31 register values from MAT_CONTROL through
|
|
+ * to MAT_OO3_LSB
|
|
+ * */
|
|
+static CONST_DAT u8 matrix_coeff_blue_screen[][MATRIX_PRESET_SIZE] = {
|
|
+ {
|
|
+ 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0
|
|
+ }, /* blue screen for RGB output color space */
|
|
+
|
|
+ {
|
|
+ 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
+ 0x0, 0x0, 0x0, 0x1, 0x0, 0x3, 0x0
|
|
+ }, /* blue screen for YCbCr422 output color space */
|
|
+
|
|
+ {
|
|
+ 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
+ 0x0, 0x0, 0x0, 0x1, 0x0, 0x3, 0x0
|
|
+ }, /* blue screen for YCbCr444 output color space */
|
|
+};
|
|
+
|
|
+/*============================================================================*/
|
|
+/* STATIC VARIABLE DECLARATIONS */
|
|
+/*============================================================================*/
|
|
+
|
|
+/* Flag per device used to ignore 1st Encrypt interrupt after HdcpInit */
|
|
+static RAM_DAT bool g_ignore_encrypt[HDMITX_UNITS_MAX];
|
|
+
|
|
+/* Register values per device to restore colour processing after test pattern */
|
|
+static RAM_DAT u8 g_mat_contrl[HDMITX_UNITS_MAX];
|
|
+static RAM_DAT u8 g_hvf_cntrl0[HDMITX_UNITS_MAX];
|
|
+static RAM_DAT u8 g_hvf_cntrl1[HDMITX_UNITS_MAX];
|
|
+
|
|
+/*============================================================================*/
|
|
+/* STATIC FUNCTION DECLARATIONS */
|
|
+/*============================================================================*/
|
|
+static error_code_t set_de_vs(hdmi_txobject_t *p_dis,
|
|
+ bsl_vid_fmt_t vout_fmt);
|
|
+static error_code_t set_pixel_repeat(hdmi_txobject_t *p_dis,
|
|
+ bsl_vid_fmt_t vout_fmt,
|
|
+ u8 u_pixel_repeat);
|
|
+static error_code_t set_sampling(hdmi_txobject_t *p_dis);
|
|
+static error_code_t set_scaler_format(hdmi_txobject_t *p_dis,
|
|
+ bsl_vid_fmt_t vin_fmt,
|
|
+ bsl_vid_fmt_t vout_fmt,
|
|
+ u8 pixel_repeat);
|
|
+
|
|
+/*============================================================================*/
|
|
+/* PUBLIC FUNCTION DEFINITIONS */
|
|
+/*============================================================================*/
|
|
+
|
|
+/*============================================================================*/
|
|
+/* bslAudioInResetCts */
|
|
+/*============================================================================*/
|
|
+#ifndef DEMO_BUILD
|
|
+error_code_t
|
|
+bsl_audio_in_reset_cts
|
|
+(
|
|
+ unit_select_t tx_unit
|
|
+)
|
|
+{
|
|
+ hdmi_txobject_t *p_dis; /* Pointer to Device Instance Structure */
|
|
+ error_code_t err; /* Error code */
|
|
+
|
|
+ /* Check unit parameter and point to its object */
|
|
+ err = check_unit_set_dis(tx_unit, &p_dis);
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+ /* Return if sink is not an HDMI device */
|
|
+ RETIF(p_dis->sink_type != HDMITX_SINK_HDMI,
|
|
+ ERR_HDMI_OPERATION_NOT_PERMITTED)
|
|
+
|
|
+ /* Reset and release the CTS generator */
|
|
+ err = set_hw_register_field_table(p_dis, &k_reset_cts_generator[0]);
|
|
+ return err;
|
|
+}
|
|
+#endif /* DEMO_BUILD */
|
|
+
|
|
+/*============================================================================*/
|
|
+/* bslAudioInSetConfig */
|
|
+/*============================================================================*/
|
|
+error_code_t
|
|
+bsl_audio_in_set_config
|
|
+(
|
|
+ unit_select_t tx_unit,
|
|
+ bsla_fmt_t a_fmt,
|
|
+ u8 chan_i2s,
|
|
+ u8 chan_dsd,
|
|
+ bsl_clk_pol_dsd_t clk_pol_dsd,
|
|
+ bsl_swap_dsd_t swap_dsd,
|
|
+ u8 layout,
|
|
+ u16 u_latency_rd
|
|
+)
|
|
+{
|
|
+ hdmi_txobject_t *p_dis; /* Pointer to Device Instance Structure */
|
|
+ error_code_t err; /* Error code */
|
|
+
|
|
+ /* Check unit parameter and point to its object */
|
|
+ err = check_unit_set_dis(tx_unit, &p_dis);
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+ /* Return if sink is not an HDMI device */
|
|
+ RETIF(p_dis->sink_type != HDMITX_SINK_HDMI,
|
|
+ ERR_HDMI_OPERATION_NOT_PERMITTED)
|
|
+
|
|
+ /* Check remaining parameters */
|
|
+ RETIF_BADPARAM(a_fmt >= HDMITX_AFMT_INVALID)
|
|
+ RETIF_BADPARAM(chan_i2s >= HDMITX_CHAN_INVALID)
|
|
+ RETIF_BADPARAM(chan_dsd >= HDMITX_CHAN_INVALID)
|
|
+ RETIF_BADPARAM(clk_pol_dsd >= HDMITX_CLKPOLDSD_INVALID)
|
|
+ RETIF_BADPARAM(swap_dsd >= HDMITX_SWAPDSD_INVALID)
|
|
+ RETIF_BADPARAM(layout >= HDMITX_LAYOUT_INVALID)
|
|
+ RETIF_BADPARAM(u_latency_rd >= HDMITX_LATENCY_INVALID)
|
|
+
|
|
+ /* Fold OBA onto DSD */
|
|
+ if(a_fmt == HDMITX_AFMT_OBA) {
|
|
+ a_fmt = HDMITX_AFMT_DSD;
|
|
+ }
|
|
+
|
|
+ /* Set the audio input processor format to aFmt. */
|
|
+ err = set_hw_register_field(p_dis,
|
|
+ E_REG_P00_AIP_CLKSEL_W,
|
|
+ e_maskreg_p00_aip_clksel_sel_aip,
|
|
+ (u8)a_fmt);
|
|
+ RETIF_REG_FAIL(err)
|
|
+
|
|
+ /* Select the audio format */
|
|
+ if(a_fmt == HDMITX_AFMT_I2S) {
|
|
+ if(chan_i2s != HDMITX_CHAN_NO_CHANGE) {
|
|
+ err = set_hw_register(p_dis, E_REG_P11_CA_I2S_RW, chan_i2s);
|
|
+ RETIF_REG_FAIL(err)
|
|
+ }
|
|
+ } else if(a_fmt == HDMITX_AFMT_DSD) {
|
|
+ if(chan_dsd != HDMITX_CHAN_NO_CHANGE) {
|
|
+ err = set_hw_register(p_dis, E_REG_P11_CA_DSD_RW, chan_dsd);
|
|
+ RETIF_REG_FAIL(err)
|
|
+ }
|
|
+ if(clk_pol_dsd != HDMITX_CLKPOLDSD_NO_CHANGE) {
|
|
+ err = set_hw_register_field(p_dis,
|
|
+ E_REG_P00_AIP_CLKSEL_W,
|
|
+ e_maskreg_p00_aip_clksel_sel_pol_clk,
|
|
+ (u8)clk_pol_dsd);
|
|
+ RETIF_REG_FAIL(err)
|
|
+ }
|
|
+ if(swap_dsd != HDMITX_SWAPDSD_NO_CHANGE) {
|
|
+ err = set_hw_register_field(p_dis,
|
|
+ E_REG_P11_AIP_CNTRL_0_RW,
|
|
+ e_maskreg_p11_aip_cntrl_0_swap,
|
|
+ (u8)swap_dsd);
|
|
+ RETIF_REG_FAIL(err)
|
|
+ }
|
|
+ }
|
|
+
|
|
+ /* Set layout and latency */
|
|
+ if(layout != HDMITX_LAYOUT_NO_CHANGE) {
|
|
+ err = set_hw_register_field(p_dis,
|
|
+ E_REG_P11_AIP_CNTRL_0_RW,
|
|
+ e_maskreg_p11_aip_cntrl_0_layout,
|
|
+ layout);
|
|
+ RETIF_REG_FAIL(err)
|
|
+ }
|
|
+ if(u_latency_rd != HDMITX_LATENCY_NO_CHANGE) {
|
|
+ err = set_hw_register(p_dis, E_REG_P11_LATENCY_RD_RW, (u8)u_latency_rd);
|
|
+ RETIF_REG_FAIL(err)
|
|
+ }
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+/*============================================================================*/
|
|
+/* bslAudioInSetCts */
|
|
+/*============================================================================*/
|
|
+error_code_t
|
|
+bsl_audio_in_set_cts
|
|
+(
|
|
+ unit_select_t tx_unit,
|
|
+ bslcts_ref_t cts_ref,
|
|
+ bslafs_t afs,
|
|
+ bsl_vid_fmt_t vout_fmt,
|
|
+ bsl_vfreq_t vout_freq,
|
|
+ u32 u_cts,
|
|
+ u16 u_cts_x,
|
|
+ bslcts_k_t cts_k,
|
|
+ bslcts_m_t cts_m
|
|
+)
|
|
+{
|
|
+ hdmi_txobject_t *p_dis; /* Pointer to Device Instance Structure */
|
|
+ error_code_t err; /* Error code */
|
|
+ u8 reg_val; /* Register value */
|
|
+ u8 pix_clk; /* Pixel clock index */
|
|
+ u32 acr_n; /* Audio clock recovery N */
|
|
+
|
|
+ /* Check unit parameter and point to its object */
|
|
+ err = check_unit_set_dis(tx_unit, &p_dis);
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+ /* Return if sink is not an HDMI device */
|
|
+ RETIF(p_dis->sink_type != HDMITX_SINK_HDMI,
|
|
+ ERR_HDMI_OPERATION_NOT_PERMITTED)
|
|
+
|
|
+ /* Check remaining parameters */
|
|
+ RETIF_BADPARAM(cts_ref >= HDMITX_CTSREF_INVALID)
|
|
+ RETIF_BADPARAM(afs >= HDMITX_AFS_INVALID)
|
|
+
|
|
+#ifdef FORMAT_PC
|
|
+ RETIF_BADPARAM(vout_fmt < HDMITX_VFMT_TV_MIN)
|
|
+ RETIF_BADPARAM((vout_fmt > HDMITX_VFMT_TV_MAX) && (vout_fmt < HDMITX_VFMT_PC_MIN))
|
|
+ RETIF_BADPARAM(vout_fmt > HDMITX_VFMT_PC_MAX)
|
|
+#else /* FORMAT_PC */
|
|
+ /*FORMAT TV only*/
|
|
+ RETIF_BADPARAM(vout_fmt < HDMITX_VFMT_TV_MIN)
|
|
+ RETIF_BADPARAM(vout_fmt > HDMITX_VFMT_TV_MAX)
|
|
+#endif /* FORMAT_PC */
|
|
+
|
|
+ RETIF_BADPARAM(vout_freq >= HDMITX_VFREQ_INVALID)
|
|
+ RETIF_BADPARAM(u_cts_x >= HDMITX_CTSX_INVALID)
|
|
+ RETIF_BADPARAM(cts_k >= HDMITX_CTSK_INVALID)
|
|
+ RETIF_BADPARAM(cts_m >= HDMITX_CTSMTS_INVALID)
|
|
+
|
|
+ if((vout_fmt >= HDMITX_VFMT_TV_MIN) && (vout_fmt <= HDMITX_VFMT_TV_MAX)) {
|
|
+ if(vout_freq == hdmitx_vfreq_50hz) {
|
|
+ RETIF(((vout_fmt < hdmitx_vfmt_17_720x576p_50hz) || (vout_fmt > hdmitx_vfmt_31_1920x1080p_50hz)),
|
|
+ ERR_HDMI_INCONSISTENT_PARAMS)
|
|
+ } else if(vout_freq == hdmitx_vfreq_24hz) {
|
|
+ RETIF(vout_fmt != hdmitx_vfmt_32_1920x1080p_24hz,
|
|
+ ERR_HDMI_INCONSISTENT_PARAMS)
|
|
+ } else if(vout_freq == hdmitx_vfreq_25hz) {
|
|
+ RETIF(vout_fmt != hdmitx_vfmt_33_1920x1080p_25hz,
|
|
+ ERR_HDMI_INCONSISTENT_PARAMS)
|
|
+ } else if(vout_freq == hdmitx_vfreq_30hz) {
|
|
+ RETIF(vout_fmt != hdmitx_vfmt_34_1920x1080p_30hz,
|
|
+ ERR_HDMI_INCONSISTENT_PARAMS)
|
|
+ } else {
|
|
+ RETIF(vout_fmt >= hdmitx_vfmt_17_720x576p_50hz,
|
|
+ ERR_HDMI_INCONSISTENT_PARAMS)
|
|
+ }
|
|
+
|
|
+ }
|
|
+
|
|
+#ifdef FORMAT_PC
|
|
+ if((vout_fmt >= HDMITX_VFMT_PC_MIN) && (vout_fmt <= HDMITX_VFMT_PC_MAX)) {
|
|
+ if(vout_freq == hdmitx_vfreq_60hz) {
|
|
+ RETIF(vout_fmt > hdmitx_vfmt_pc_1600x1200p_60hz,
|
|
+ ERR_HDMI_INCONSISTENT_PARAMS)
|
|
+ } else if(vout_freq == hdmitx_vfreq_70hz) {
|
|
+ RETIF(vout_fmt != hdmitx_vfmt_pc_1024x768p_70hz,
|
|
+ ERR_HDMI_INCONSISTENT_PARAMS)
|
|
+ } else if(vout_freq == hdmitx_vfreq_72hz) {
|
|
+ RETIF(((vout_fmt < hdmitx_vfmt_pc_640x480p_72hz) ||
|
|
+ (vout_fmt > hdmitx_vfmt_pc_800x600p_72hz)),
|
|
+ ERR_HDMI_INCONSISTENT_PARAMS)
|
|
+ } else if(vout_freq == hdmitx_vfreq_75hz) {
|
|
+ RETIF(((vout_fmt < hdmitx_vfmt_pc_640x480p_75hz) ||
|
|
+ (vout_fmt > hdmitx_vfmt_pc_1280x1024p_75hz)),
|
|
+ ERR_HDMI_INCONSISTENT_PARAMS)
|
|
+ } else if(vout_freq == hdmitx_vfreq_85hz) {
|
|
+ RETIF(((vout_fmt < hdmitx_vfmt_pc_640x350p_85hz) ||
|
|
+ (vout_fmt > hdmitx_vfmt_pc_1280x1024p_85hz)),
|
|
+ ERR_HDMI_INCONSISTENT_PARAMS)
|
|
+ } else {
|
|
+ RETIF(vout_fmt != hdmitx_vfmt_pc_1024x768i_87hz,
|
|
+ ERR_HDMI_INCONSISTENT_PARAMS)
|
|
+ }
|
|
+ }
|
|
+#endif /* FORMAT_PC */
|
|
+
|
|
+ /* Check for auto or manual CTS */
|
|
+ if(u_cts == HDMITX_CTS_AUTO) {
|
|
+ /* Auto */
|
|
+ err = set_hw_register_field(p_dis,
|
|
+ E_REG_P11_AIP_CNTRL_0_RW,
|
|
+ e_maskreg_p11_aip_cntrl_0_acr_man,
|
|
+ 0);
|
|
+ RETIF_REG_FAIL(err)
|
|
+ } else {
|
|
+ /* Manual */
|
|
+ err = set_hw_register_field(p_dis,
|
|
+ E_REG_P11_AIP_CNTRL_0_RW,
|
|
+ e_maskreg_p11_aip_cntrl_0_acr_man,
|
|
+ 1);
|
|
+ RETIF_REG_FAIL(err)
|
|
+ }
|
|
+
|
|
+ /* Derive M and K from X? */
|
|
+ if((cts_m == HDMITX_CTSMTS_USE_CTSX) || (cts_k == HDMITX_CTSK_USE_CTSX)) {
|
|
+ RETIF_BADPARAM(u_cts_x == HDMITX_CTSX_UNUSED)
|
|
+ cts_m = (bslcts_m_t)k_cts_xto_mk[u_cts_x][0];
|
|
+ cts_k = (bslcts_k_t)k_cts_xto_mk[u_cts_x][1];
|
|
+ }
|
|
+
|
|
+ /* Set the Post-divider measured timestamp factor */
|
|
+ reg_val = (u8)cts_m;
|
|
+ err = set_hw_register_field(p_dis,
|
|
+ E_REG_P11_CTS_N_RW,
|
|
+ e_maskreg_p11_cts_n_m_sel,
|
|
+ reg_val);
|
|
+ RETIF_REG_FAIL(err)
|
|
+
|
|
+ /* Set the Pre-divider scale */
|
|
+ reg_val = (u8)cts_k;
|
|
+ err = set_hw_register_field(p_dis,
|
|
+ E_REG_P11_CTS_N_RW,
|
|
+ e_maskreg_p11_cts_n_k_sel,
|
|
+ reg_val);
|
|
+ RETIF_REG_FAIL(err)
|
|
+
|
|
+ /* Use voutFmt and voutFreq to index into a lookup table to get
|
|
+ * the current pixel clock value. */
|
|
+
|
|
+#ifdef FORMAT_PC
|
|
+ if((vout_fmt >= HDMITX_VFMT_PC_MIN) && (vout_fmt <= HDMITX_VFMT_PC_MAX)) {
|
|
+ pix_clk = k_vfmt_to_pix_clk_pc[(vout_fmt - HDMITX_VFMT_PC_MIN + 1)];
|
|
+ } else {
|
|
+#endif /* FORMAT_PC */
|
|
+ pix_clk = k_vfmt_to_pix_clk_tv[vout_fmt][vout_freq];
|
|
+#ifdef FORMAT_PC
|
|
+ }
|
|
+#endif /* FORMAT_PC */
|
|
+
|
|
+ if(pix_clk != E_PIXCLK_INVALID) {
|
|
+ /* Set the Audio Clock Recovery N multiplier based on the audio sample
|
|
+ * frequency afs and current pixel clock. */
|
|
+ acr_n = k_pix_clk_to_acr_n[pix_clk][afs];
|
|
+
|
|
+ /* Set ACR N multiplier [19 to 16] */
|
|
+ reg_val = (u8)(acr_n >> 16);
|
|
+ err = set_hw_register(p_dis, E_REG_P11_ACR_N_2_RW, reg_val);
|
|
+ RETIF_REG_FAIL(err)
|
|
+ /* Set ACR N multiplier [15 to 8] */
|
|
+ reg_val = (u8)(acr_n >> 8);
|
|
+ err = set_hw_register(p_dis, E_REG_P11_ACR_N_1_RW, reg_val);
|
|
+ RETIF_REG_FAIL(err)
|
|
+ /* Set ACR N multiplier [7 to 0] */
|
|
+ reg_val = (u8)acr_n;
|
|
+ err = set_hw_register(p_dis, E_REG_P11_ACR_N_0_RW, reg_val);
|
|
+ RETIF_REG_FAIL(err)
|
|
+
|
|
+ /* Set the CDC Audio Divider register based on the audio sample frequency
|
|
+ * afs and current pixel clock. */
|
|
+ reg_val = k_pix_clk_to_adiv[pix_clk][afs];
|
|
+ err = set_hw_register(p_dis, E_REG_P02_AUDIO_DIV_RW, reg_val);
|
|
+ RETIF_REG_FAIL(err)
|
|
+
|
|
+ /* If auto CTS, get CTS value based on the audio sample
|
|
+ * frequency afs and current pixel clock. */
|
|
+ if(u_cts == HDMITX_CTS_AUTO) {
|
|
+ u_cts = k_pix_clk_to_acr_cts[pix_clk][afs];
|
|
+ }
|
|
+ }
|
|
+
|
|
+ /* Set manual or pixel clock CTS */
|
|
+ if(u_cts != HDMITX_CTS_AUTO) {
|
|
+ /* Set manual ACR CTS [19 to 16 */
|
|
+ reg_val = (u8)(u_cts >> 16);
|
|
+ err = set_hw_register(p_dis, E_REG_P11_ACR_CTS_2_RW, reg_val);
|
|
+ RETIF_REG_FAIL(err)
|
|
+ /* Set manual ACR CTS [15 to 8] */
|
|
+ reg_val = (u8)(u_cts >> 8);
|
|
+ err = set_hw_register(p_dis, E_REG_P11_ACR_CTS_1_RW, reg_val);
|
|
+ RETIF_REG_FAIL(err)
|
|
+ /* Set manual ACR CTS [7 to 0] */
|
|
+ reg_val = (u8)u_cts;
|
|
+ err = set_hw_register(p_dis, E_REG_P11_ACR_CTS_0_RW, reg_val);
|
|
+ RETIF_REG_FAIL(err)
|
|
+ }
|
|
+
|
|
+ /* Set the CTS clock reference register according to ctsRef */
|
|
+ reg_val = (u8)cts_ref;
|
|
+ err = set_hw_register_field(p_dis,
|
|
+ E_REG_P00_AIP_CLKSEL_W,
|
|
+ e_maskreg_p00_aip_clksel_sel_fs,
|
|
+ reg_val);
|
|
+ RETIF_REG_FAIL(err)
|
|
+
|
|
+ /* Reset and release the CTS generator */
|
|
+ err = set_hw_register_field_table(p_dis, &k_reset_cts_generator[0]);
|
|
+ return err;
|
|
+}
|
|
+
|
|
+/*============================================================================*/
|
|
+/* bslAudioOutSetChanStatus */
|
|
+/*============================================================================*/
|
|
+error_code_t
|
|
+bsl_audio_out_set_chan_status
|
|
+(
|
|
+ unit_select_t tx_unit,
|
|
+ bsl_csformat_info_t format_info,
|
|
+ bsl_cscopyright_t copyright,
|
|
+ u8 category_code,
|
|
+ bslafs_t sample_freq,
|
|
+ bsl_csclk_acc_t clock_accuracy,
|
|
+ bsl_csmax_word_length_t max_word_length,
|
|
+ bsl_csword_length_t word_length,
|
|
+ bsl_csorig_afs_t orig_sample_freq
|
|
+)
|
|
+{
|
|
+ hdmi_txobject_t *p_dis; /* Pointer to Device Instance Structure */
|
|
+ error_code_t err; /* Error code */
|
|
+ u8 buf[4]; /* Buffer to hold channel status data */
|
|
+
|
|
+ /* Check unit parameter and point to its object */
|
|
+ err = check_unit_set_dis(tx_unit, &p_dis);
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+ /* Return if sink is not an HDMI device */
|
|
+ RETIF(p_dis->sink_type != HDMITX_SINK_HDMI,
|
|
+ ERR_HDMI_OPERATION_NOT_PERMITTED)
|
|
+
|
|
+ /* Check remaining parameters */
|
|
+ RETIF_BADPARAM(format_info >= HDMITX_CSFI_INVALID)
|
|
+ RETIF_BADPARAM(copyright >= HDMITX_CSCOPYRIGHT_INVALID)
|
|
+ RETIF_BADPARAM(sample_freq > HDMITX_AFS_NOT_INDICATED)
|
|
+ RETIF_BADPARAM(clock_accuracy >= HDMITX_CSCLK_INVALID)
|
|
+ RETIF_BADPARAM(max_word_length >= HDMITX_CSMAX_INVALID)
|
|
+ RETIF_BADPARAM(word_length >= HDMITX_CSWORD_INVALID)
|
|
+ RETIF_BADPARAM(word_length == HDMITX_CSWORD_RESVD)
|
|
+ RETIF_BADPARAM(orig_sample_freq >= HDMITX_CSAFS_INVALID)
|
|
+
|
|
+ /* Prepare Byte 0 */
|
|
+ if(format_info == HDMITX_CSFI_NOTPCM_DEFAULT) {
|
|
+ buf[0] = ((u8)copyright << 2) | 2; /* Set NOT_PCM bit2 */
|
|
+ } else {
|
|
+ buf[0] = ((u8)format_info << 3) | ((u8)copyright << 2);
|
|
+ }
|
|
+
|
|
+ /* Prepare Byte 1 */
|
|
+ buf[1] = category_code;
|
|
+
|
|
+ /* Prepare Byte 3 - note Byte 2 not in sequence in TDA9983 register map */
|
|
+ buf[2] = ((u8)clock_accuracy << 4) | k_afs_to_csbyte3[sample_freq];
|
|
+
|
|
+ /* Prepare Byte 4 */
|
|
+ buf[3] = ((u8)orig_sample_freq << 4) | ((u8)word_length << 1) |
|
|
+ (u8)max_word_length;
|
|
+
|
|
+ /* Write 4 Channel Status bytes */
|
|
+ err = set_hw_registers(p_dis, E_REG_P11_CH_STAT_B_0_RW, &buf[0], 4);
|
|
+ return err;
|
|
+}
|
|
+
|
|
+/*============================================================================*/
|
|
+/* bslAudioOutSetChanStatusMapping */
|
|
+/*============================================================================*/
|
|
+#ifndef DEMO_BUILD
|
|
+error_code_t
|
|
+bsl_audio_out_set_chan_status_mapping
|
|
+(
|
|
+ unit_select_t tx_unit,
|
|
+ u8 source_left,
|
|
+ u8 channel_left,
|
|
+ u8 source_right,
|
|
+ u8 channel_right
|
|
+)
|
|
+{
|
|
+ hdmi_txobject_t *p_dis; /* Pointer to Device Instance Structure */
|
|
+ error_code_t err; /* Error code */
|
|
+ u8 buf[2]; /* Buffer to hold channel status data */
|
|
+
|
|
+ /* Check unit parameter and point to its object */
|
|
+ err = check_unit_set_dis(tx_unit, &p_dis);
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+ /* Return if sink is not an HDMI device */
|
|
+ RETIF(p_dis->sink_type != HDMITX_SINK_HDMI,
|
|
+ ERR_HDMI_OPERATION_NOT_PERMITTED)
|
|
+
|
|
+ /* Check remaining parameters */
|
|
+ RETIF_BADPARAM(source_left > HDMITX_CS_SOURCES_MAX)
|
|
+ RETIF_BADPARAM(channel_left > HDMITX_CS_CHANNELS_MAX)
|
|
+ RETIF_BADPARAM(source_right > HDMITX_CS_SOURCES_MAX)
|
|
+ RETIF_BADPARAM(channel_right > HDMITX_CS_CHANNELS_MAX)
|
|
+
|
|
+ /* Prepare Left byte */
|
|
+ buf[0] = ((u8)channel_left << 4) | (u8)source_left;
|
|
+
|
|
+ /* Prepare Right byte */
|
|
+ buf[1] = ((u8)channel_right << 4) | (u8)source_right;
|
|
+
|
|
+ /* Write 2 Channel Status bytes */
|
|
+ err = set_hw_registers(p_dis, e_reg_p11_ch_stat_b_2_ap0_l_rw, &buf[0], 2);
|
|
+ return err;
|
|
+}
|
|
+#endif /* DEMO_BUILD */
|
|
+
|
|
+/*============================================================================*/
|
|
+/* bslAudioOutSetMute */
|
|
+/*============================================================================*/
|
|
+error_code_t
|
|
+bsl_audio_out_set_mute
|
|
+(
|
|
+ unit_select_t tx_unit,
|
|
+ bsla_mute_t a_mute
|
|
+)
|
|
+{
|
|
+ hdmi_txobject_t *p_dis; /* Pointer to Device Instance Structure */
|
|
+ error_code_t err; /* Error code */
|
|
+
|
|
+ /* Check unit parameter and point to its object */
|
|
+ err = check_unit_set_dis(tx_unit, &p_dis);
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+ /* Return if sink is not an HDMI device */
|
|
+ RETIF(p_dis->sink_type != HDMITX_SINK_HDMI,
|
|
+ ERR_HDMI_OPERATION_NOT_PERMITTED)
|
|
+
|
|
+ /* Check remaining parameters */
|
|
+ RETIF_BADPARAM(a_mute >= HDMITX_AMUTE_INVALID)
|
|
+
|
|
+ /* Reset the audio FIFO to mute audio */
|
|
+ err = set_hw_register_field(p_dis,
|
|
+ E_REG_P11_AIP_CNTRL_0_RW,
|
|
+ e_maskreg_p11_aip_cntrl_0_rst_fifo,
|
|
+ (u8)a_mute);
|
|
+ return err;
|
|
+}
|
|
+
|
|
+/*============================================================================*/
|
|
+/* bslDeinit */
|
|
+/*============================================================================*/
|
|
+error_code_t
|
|
+bsl_deinit
|
|
+(
|
|
+ unit_select_t tx_unit
|
|
+)
|
|
+{
|
|
+ hdmi_txobject_t *p_dis; /* Pointer to Device Instance Structure */
|
|
+ error_code_t err; /* Error code */
|
|
+
|
|
+ /* Check unit parameter and point to its object */
|
|
+ err = check_unit_set_dis(tx_unit, &p_dis);
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+ /* Hold the device in reset to disable it */
|
|
+ (void)set_hw_register_field(p_dis, E_REG_P00_MAIN_CNTRL0_W,
|
|
+ e_maskreg_p00_main_cntrl0_sr, 1);
|
|
+
|
|
+ /* Clear the Initialized flag to destroy the device instance */
|
|
+ p_dis->b_initialized = false;
|
|
+
|
|
+ set_state(p_dis, EV_DEINIT);
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+/*============================================================================*/
|
|
+/* bslHotPlugGetStatus */
|
|
+/*============================================================================*/
|
|
+error_code_t
|
|
+bsl_hot_plug_get_status
|
|
+(
|
|
+ unit_select_t tx_unit,
|
|
+ bsl_hot_plug_t *p_hot_plug_status
|
|
+)
|
|
+{
|
|
+ hdmi_txobject_t *p_dis; /* Pointer to Device Instance Structure */
|
|
+ error_code_t err; /* Error code */
|
|
+
|
|
+ /* Check unit parameter and point to its object */
|
|
+ err = check_unit_set_dis(tx_unit, &p_dis);
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+ /* Check remaining parameters */
|
|
+ RETIF_BADPARAM(p_hot_plug_status == (bsl_hot_plug_t *)0)
|
|
+
|
|
+ /* Read the hot plug status flag register last read at interrupt */
|
|
+ *p_hot_plug_status = p_dis->hot_plug_status;
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+/*============================================================================*/
|
|
+/* bslRxSenseGetStatus */
|
|
+/*============================================================================*/
|
|
+error_code_t
|
|
+bsl_rx_sense_get_status
|
|
+(
|
|
+ unit_select_t tx_unit,
|
|
+ bsl_rx_sense_t *p_rx_sense_status
|
|
+)
|
|
+{
|
|
+ hdmi_txobject_t *p_dis; /* Pointer to Device Instance Structure */
|
|
+ error_code_t err; /* Error code */
|
|
+
|
|
+ /* Check unit parameter and point to its object */
|
|
+ err = check_unit_set_dis(tx_unit, &p_dis);
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+ /* Check remaining parameters */
|
|
+ RETIF_BADPARAM(p_rx_sense_status == (bsl_rx_sense_t *)0)
|
|
+
|
|
+#if defined (TMFL_TDA9981_SUPPORT) && defined(TMFL_RX_SENSE_ON)
|
|
+ /* Read the Rx sense status flag register last read at interrupt */
|
|
+ *p_rx_sense_status = p_dis->rx_sense_status;
|
|
+ return 0;
|
|
+#else /* TMFL_TDA9981_SUPPORT && TMFL_RX_SENSE_ON */
|
|
+ (void)*p_rx_sense_status; /* else not referenced */
|
|
+ return ERR_HDMI_NOT_SUPPORTED;
|
|
+#endif /* TMFL_TDA9981_SUPPORT && TMFL_RX_SENSE_ON */
|
|
+}
|
|
+
|
|
+/*============================================================================*/
|
|
+/* bslHwGetRegisters */
|
|
+/*============================================================================*/
|
|
+error_code_t
|
|
+bsl_hw_get_registers
|
|
+(
|
|
+ unit_select_t tx_unit,
|
|
+ int reg_page,
|
|
+ int reg_addr,
|
|
+ u8 *p_reg_buf,
|
|
+ int n_regs
|
|
+)
|
|
+{
|
|
+ /* Pointer to Device Instance Structure */
|
|
+ hdmi_txobject_t *p_dis;
|
|
+ error_code_t err; /* Error code */
|
|
+ int i; /* Loop index */
|
|
+ u8 new_reg_page; /* The register's new page number */
|
|
+ u8 reg_shad; /* Index to the register's shadow copy */
|
|
+ u16 reg_shad_page_addr;/* Packed shadowindex/page/address */
|
|
+ bsl_sys_args_t sys_args; /* Arguments passed to system function */
|
|
+
|
|
+ /* Check unit parameter and point to its object */
|
|
+ err = check_unit_set_dis(tx_unit, &p_dis);
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+ /* Check remaining parameters */
|
|
+ RETIF_BADPARAM((reg_page < k_page_index_to_page[E_PAGE_00])
|
|
+ || ((reg_page > k_page_index_to_page[E_PAGE_02])
|
|
+ && (reg_page < k_page_index_to_page[E_PAGE_11]))
|
|
+ || (reg_page > k_page_index_to_page[E_PAGE_12]))
|
|
+ RETIF_BADPARAM((reg_addr < E_REG_MIN_ADR) || (reg_addr >= E_REG_CURPAGE_ADR_W))
|
|
+ RETIF_BADPARAM(p_reg_buf == (p_uint8)0)
|
|
+ RETIF_BADPARAM((n_regs < 1) || ((n_regs + reg_addr) > E_REG_CURPAGE_ADR_W))
|
|
+
|
|
+ /* Set page register if required */
|
|
+ new_reg_page = (u8)reg_page;
|
|
+ if(p_dis->cur_reg_page != new_reg_page) {
|
|
+ /* All non-OK results are errors */
|
|
+ sys_args.slave_addr = p_dis->u_hw_address;
|
|
+ sys_args.first_register = E_REG_CURPAGE_ADR_W;
|
|
+ sys_args.len_data = 1;
|
|
+ sys_args.p_data = &new_reg_page;
|
|
+ err = p_dis->sys_func_write(&sys_args);
|
|
+ RETIF(err != 0, ERR_HDMI_I2C_WRITE)
|
|
+ p_dis->cur_reg_page = new_reg_page;
|
|
+ }
|
|
+
|
|
+ /* Read each register in the range. nRegs must start at 1 or more */
|
|
+ for(; n_regs > 0; p_reg_buf++, reg_addr++, n_regs--) {
|
|
+ /* Find shadow register index.
|
|
+ * This loop is not very efficient, but it is assumed that this API
|
|
+ * will not be used often. The alternative is to use a huge sparse
|
|
+ * array indexed by page and address and containing the shadow index.
|
|
+ * */
|
|
+ reg_shad = E_SNONE;
|
|
+ for(i = 0; i < E_SNUM; i++) {
|
|
+ /* Check lookup table for match with page and address */
|
|
+ reg_shad_page_addr = k_shadow_reg[i];
|
|
+ if((SPA2PAGE(reg_shad_page_addr) == new_reg_page)
|
|
+ && (SPA2ADDR(reg_shad_page_addr) == reg_addr)) {
|
|
+ /* Found page and address - look up the shadow index */
|
|
+ reg_shad = SPA2SHAD(reg_shad_page_addr);
|
|
+ break;
|
|
+ }
|
|
+ }
|
|
+ /* Read the shadow register if available, as device registers that
|
|
+ * are shadowed cannot be read directly */
|
|
+ if(reg_shad != E_SNONE) {
|
|
+ *p_reg_buf = p_dis->shadow_reg[reg_shad];
|
|
+ } else {
|
|
+ /* Read the device register - all non-OK results are errors.
|
|
+ * Note that some non-shadowed registers are also write-only and
|
|
+ * cannot be read. */
|
|
+ sys_args.slave_addr = p_dis->u_hw_address;
|
|
+ sys_args.first_register = (u8)reg_addr;
|
|
+ sys_args.len_data = 1;
|
|
+ sys_args.p_data = p_reg_buf;
|
|
+ err = p_dis->sys_func_read(&sys_args);
|
|
+ RETIF(err != 0, ERR_HDMI_I2C_READ)
|
|
+ }
|
|
+ }
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+/*============================================================================*/
|
|
+/* bslHwGetVersion */
|
|
+/*============================================================================*/
|
|
+#ifndef DEMO_BUILD
|
|
+error_code_t
|
|
+bsl_hw_get_version
|
|
+(
|
|
+ unit_select_t tx_unit,
|
|
+ p_uint8 p_hw_version
|
|
+)
|
|
+{
|
|
+ hdmi_txobject_t *p_dis; /* Pointer to Device Instance Structure */
|
|
+ error_code_t err; /* Error code */
|
|
+
|
|
+ /* Check unit parameter and point to its object */
|
|
+ err = check_unit_set_dis(tx_unit, &p_dis);
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+ /* Check remaining parameters */
|
|
+ RETIF_BADPARAM(p_hw_version == (p_uint8)0)
|
|
+
|
|
+#ifdef TMFL_TDA9981_SUPPORT
|
|
+
|
|
+ *p_hw_version = (u8) BSLHDMITX_TDA9981;
|
|
+
|
|
+#else
|
|
+
|
|
+ *p_hw_version = (u8) BSLHDMITX_TDA9983;
|
|
+
|
|
+#endif /* TMFL_TDA9981_SUPPORT */
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+#endif /* DEMO_BUILD */
|
|
+
|
|
+/*============================================================================*/
|
|
+/* bslHwGetCapabilities */
|
|
+/*============================================================================*/
|
|
+error_code_t
|
|
+bsl_hw_get_capabilities
|
|
+(
|
|
+ unit_select_t tx_unit,
|
|
+ bsl_hw_feature_t *p_device_capabilities
|
|
+)
|
|
+
|
|
+{
|
|
+ hdmi_txobject_t *p_dis; /* Pointer to Device Instance Structure */
|
|
+ error_code_t err; /* Error code */
|
|
+
|
|
+ /* Check unit parameter and point to its object */
|
|
+ err = check_unit_set_dis(tx_unit, &p_dis);
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+ /* Check remaining parameters */
|
|
+ RETIF_BADPARAM(p_device_capabilities == (bsl_hw_feature_t *)0)
|
|
+
|
|
+ *p_device_capabilities = bsl_hw_none;
|
|
+
|
|
+ if((p_dis->u_device_features & e_maskreg_p00_version_not_h) == 0) {
|
|
+ *p_device_capabilities = (bsl_hw_feature_t)(*p_device_capabilities + bsl_hw_hdcp);
|
|
+ }
|
|
+
|
|
+ if((p_dis->u_device_features & e_maskreg_p00_version_not_s) == 0) {
|
|
+ *p_device_capabilities = (bsl_hw_feature_t)(*p_device_capabilities + bsl_hw_scaler);
|
|
+ }
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+/*============================================================================*/
|
|
+/* bslHwHandleInterrupt */
|
|
+/* RETIF_REG_FAIL NOT USED HERE AS ALL ERRORS SHOULD BE TRAPPED IN ALL BUILDS */
|
|
+/*============================================================================*/
|
|
+error_code_t
|
|
+bsl_hw_handle_interrupt
|
|
+(
|
|
+ unit_select_t tx_unit
|
|
+)
|
|
+{
|
|
+ /* Pointer to Device Instance Structure */
|
|
+ hdmi_txobject_t *p_dis;
|
|
+ error_code_t err; /* Error code */
|
|
+ u8 reg_val; /* Register value */
|
|
+#ifdef TMFL_TDA9981_SUPPORT
|
|
+ u16 f_interrupt_status; /* Interrupt flags */
|
|
+ u16 f_interrupt_mask; /* Mask to test each interrupt bit */
|
|
+#ifdef TMFL_RX_SENSE_ON
|
|
+ bsl_rx_sense_t new_rxs_fil; /* Latest copy of rx_sense */
|
|
+#endif /* TMFL_RX_SENSE_ON */
|
|
+#else /* TMFL_TDA9981_SUPPORT */
|
|
+ u8 f_interrupt_status; /* Interrupt flags */
|
|
+ u8 f_interrupt_mask; /* Mask to test each interrupt bit */
|
|
+#endif /* TMFL_TDA9981_SUPPORT */
|
|
+ int i; /* Loop counter */
|
|
+ bsl_hot_plug_t new_hpd_in; /* Latest copy of hpd input */
|
|
+
|
|
+ /* Check unit parameter and point to its object */
|
|
+ err = check_unit_set_dis(tx_unit, &p_dis);
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+ f_interrupt_status = 0;
|
|
+
|
|
+ /* Read the main interrupt flags register to determine the source(s)
|
|
+ * of the interrupt. (The device resets these register flags after they
|
|
+ * have been read.)
|
|
+ * */
|
|
+#ifdef TMFL_TDA9981_SUPPORT
|
|
+ err = get_hw_register(p_dis, E_REG_P00_INT_FLAGS_0_RW, ®_val);
|
|
+ RETIF(err != 0, err)
|
|
+ f_interrupt_status = reg_val;
|
|
+
|
|
+#else /* TMFL_TDA9981_SUPPORT */
|
|
+ err = get_hw_register(p_dis, E_REG_P00_INT_FLAGS_0_RW, &f_interrupt_status);
|
|
+ RETIF(err != 0, err)
|
|
+#endif /* TMFL_TDA9981_SUPPORT */
|
|
+
|
|
+ /* Read Hot Plug input status to unit object
|
|
+ * DJW do this after reading INT flags so we get the actual
|
|
+ * level that caused the interrupt */
|
|
+ err = get_hw_register(p_dis, E_REG_P00_INT_FLAGS_1_RW, ®_val);
|
|
+ RETIF(err != 0, err)
|
|
+ new_hpd_in = (reg_val & e_maskreg_p00_int_flags_1_hpd_in) ?
|
|
+ HDMITX_HOTPLUG_ACTIVE : HDMITX_HOTPLUG_INACTIVE;
|
|
+
|
|
+#ifdef TMFL_TDA9981_SUPPORT
|
|
+ /* Read the software interrupt flag */
|
|
+ if((reg_val & e_maskreg_p00_int_flags_1_sw_int) != 0) {
|
|
+ f_interrupt_status = f_interrupt_status | (1 << HDMITX_CALLBACK_INT_SW_INT);
|
|
+ }
|
|
+
|
|
+#ifdef TMFL_RX_SENSE_ON
|
|
+ /* Read INT_FLAGS_2 interrupt flag register.
|
|
+ *(the device resets these register flags after they
|
|
+ * have been read.) */
|
|
+ err = get_hw_register(p_dis, E_REG_P00_INT_FLAGS_2_RW, ®_val);
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+ /* Has the rx_sense interrupt occurs */
|
|
+ if((reg_val & e_maskreg_p00_int_flags_2_rx_sense) != 0) {
|
|
+ f_interrupt_status = f_interrupt_status | (1 << HDMITX_CALLBACK_INT_RX_SENSE);
|
|
+ }
|
|
+#endif /* TMFL_RX_SENSE_ON */
|
|
+#endif /* TMFL_TDA9981_SUPPORT */
|
|
+
|
|
+ /* Has the hpd input changed? (Ignore the HPD interrupt status flag in
|
|
+ * fInterruptStatus as this may have latched a connect/disconnect glitch) */
|
|
+ if(new_hpd_in != p_dis->hot_plug_status) {
|
|
+ /* Yes: save new HPD level */
|
|
+ p_dis->hot_plug_status = new_hpd_in;
|
|
+
|
|
+ /* Reset EDID status */
|
|
+ p_dis->edid_status = HDMITX_EDID_NOT_READ;
|
|
+
|
|
+#ifdef TMFL_TDA9981_SUPPORT
|
|
+ /* Set HPD flag to 1 although it certainly already done just a security */
|
|
+ f_interrupt_status |= e_maskreg_p00_int_flags_0_hpd;
|
|
+ /* Reset all simultaneous HDCP interrupts on hot plug,
|
|
+ * preserving only the high-priority hpd interrupt rx_sense and sw interrupt for debug*/
|
|
+ f_interrupt_status &= e_maskreg_p00_int_flags_0_hpd |
|
|
+#ifdef TMFL_RX_SENSE_ON
|
|
+ (1 << HDMITX_CALLBACK_INT_RX_SENSE) |
|
|
+#endif /* TMFL_RX_SENSE_ON */
|
|
+ (1 << HDMITX_CALLBACK_INT_SW_INT);
|
|
+#else
|
|
+ /* Reset all simultaneous HDCP interrupts on hot plug/unplug,
|
|
+ * preserving only the high-priority hpd interrupt */
|
|
+ f_interrupt_status = e_maskreg_p00_int_flags_0_hpd;
|
|
+#endif /* TMFL_TDA9981_SUPPORT */
|
|
+
|
|
+ if(p_dis->hot_plug_status == HDMITX_HOTPLUG_ACTIVE) {
|
|
+ set_state(p_dis, EV_PLUGGEDIN);
|
|
+ } else {
|
|
+ set_state(p_dis, EV_UNPLUGGED);
|
|
+ }
|
|
+ } else {
|
|
+ /* Clear HPD status if level has not changed */
|
|
+ f_interrupt_status &= ~e_maskreg_p00_int_flags_0_hpd;
|
|
+ }
|
|
+
|
|
+#ifdef TMFL_TDA9981_SUPPORT
|
|
+#ifdef TMFL_RX_SENSE_ON
|
|
+
|
|
+ /* Read INT_FLAGS_3 interrupt flag register. */
|
|
+ err = get_hw_register(p_dis, E_REG_P00_INT_FLAGS_3_R, ®_val);
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+ /* Read RXS_FIL status to know the actual
|
|
+ * level that caused the interrupt */
|
|
+ new_rxs_fil = (reg_val & e_maskreg_p00_int_flags_3_rxs_fil) ?
|
|
+ HDMITX_RX_SENSE_ACTIVE : HDMITX_RX_SENSE_INACTIVE;
|
|
+
|
|
+ /* Has the Rxs Fil changed? (Ignore the RxSense interrupt status flag in
|
|
+ * fInterruptStatus as this may have latched a on/off glitch) */
|
|
+ if(new_rxs_fil != p_dis->rx_sense_status) {
|
|
+ /* Yes: save new rxSense level */
|
|
+ p_dis->rx_sense_status = new_rxs_fil;
|
|
+
|
|
+ /* Set RX_Sense flag to 1 although it certainly already done just a security */
|
|
+ f_interrupt_status |= (1 << HDMITX_CALLBACK_INT_RX_SENSE);
|
|
+
|
|
+ f_interrupt_status &= e_maskreg_p00_int_flags_0_hpd |
|
|
+ (1 << HDMITX_CALLBACK_INT_RX_SENSE) |
|
|
+ (1 << HDMITX_CALLBACK_INT_SW_INT);
|
|
+
|
|
+ if(p_dis->rx_sense_status == HDMITX_RX_SENSE_ACTIVE) {
|
|
+ set_state(p_dis, EV_SINKON);
|
|
+ } else {
|
|
+ set_state(p_dis, EV_SINKOFF);
|
|
+ }
|
|
+ } else {
|
|
+ /* Clear RX_sense IT if level has not changed */
|
|
+ f_interrupt_status &= ~(1 << HDMITX_CALLBACK_INT_RX_SENSE);
|
|
+ }
|
|
+#endif /* TMFL_RX_SENSE_ON */
|
|
+#endif /* TMFL_TDA9981_SUPPORT */
|
|
+
|
|
+ /* Ignore other simultaneous HDCP interrupts if T0 interrupt,
|
|
+ * preserving any hpd interrupt */
|
|
+ if(f_interrupt_status & e_maskreg_p00_int_flags_0_t0) {
|
|
+ f_interrupt_status &=
|
|
+ (
|
|
+ e_maskreg_p00_int_flags_0_hpd |
|
|
+ e_maskreg_p00_int_flags_0_t0
|
|
+#ifdef TMFL_TDA9981_SUPPORT
|
|
+#ifdef TMFL_RX_SENSE_ON
|
|
+ | (1 << HDMITX_CALLBACK_INT_RX_SENSE)
|
|
+#endif /* TMFL_RX_SENSE_ON */
|
|
+ | (1 << HDMITX_CALLBACK_INT_SW_INT)
|
|
+#endif /* TMFL_TDA9981_SUPPORT */
|
|
+ );
|
|
+ }
|
|
+
|
|
+ /* For each interrupt flag that is set, check the corresponding registered
|
|
+ * callback function pointer in the Device Instance Structure
|
|
+ * funcIntCallbacks array.
|
|
+ * */
|
|
+ f_interrupt_mask = 1;
|
|
+ for(i = 0; i < HDMITX_CALLBACK_INT_NUM; i++) {
|
|
+ if(f_interrupt_status & f_interrupt_mask) {
|
|
+ /* IF a registered callback pointer is non-null THEN call it. */
|
|
+ if(p_dis->func_int_callbacks[i] != (pbsl_callback_t)0) {
|
|
+ p_dis->func_int_callbacks[i](tx_unit);
|
|
+ }
|
|
+ }
|
|
+ f_interrupt_mask <<= 1;
|
|
+ }
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+/*============================================================================*/
|
|
+/* bslFlagSwInt */
|
|
+/* Use only for debug to flag the software debug interrupt */
|
|
+/*============================================================================*/
|
|
+error_code_t
|
|
+bsl_flag_sw_int
|
|
+(
|
|
+ unit_select_t tx_unit
|
|
+)
|
|
+{
|
|
+ hdmi_txobject_t *p_dis; /* Pointer to Device Instance Structure */
|
|
+ error_code_t err; /* Error code */
|
|
+
|
|
+ /* Check unit parameter and point to its object */
|
|
+ err = check_unit_set_dis(tx_unit, &p_dis);
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+#ifdef TMFL_TDA9981_SUPPORT
|
|
+ err = set_hw_register(p_dis, E_REG_P00_SW_INT_W,
|
|
+ e_maskreg_p00_sw_int_sw_int);
|
|
+
|
|
+ return err;
|
|
+#else /* TMFL_TDA9981_SUPPORT */
|
|
+ return ERR_HDMI_NOT_SUPPORTED;
|
|
+#endif /* TMFL_TDA9981_SUPPORT */
|
|
+}
|
|
+
|
|
+/*============================================================================*/
|
|
+/* bslHwSetRegisters */
|
|
+/*============================================================================*/
|
|
+#ifndef DEMO_BUILD
|
|
+error_code_t
|
|
+bsl_hw_set_registers
|
|
+(
|
|
+ unit_select_t tx_unit,
|
|
+ int reg_page,
|
|
+ int reg_addr,
|
|
+ u8 *p_reg_buf,
|
|
+ int n_regs
|
|
+)
|
|
+{
|
|
+ /* Pointer to Device Instance Structure */
|
|
+ hdmi_txobject_t *p_dis;
|
|
+ error_code_t err; /* Error code */
|
|
+ int i; /* Loop index */
|
|
+ u8 new_reg_page; /* The register's new page number */
|
|
+ u8 reg_shad; /* Index to the register's shadow copy */
|
|
+ u16 reg_shad_page_addr;/* Packed shadowindex/page/address */
|
|
+ bsl_sys_args_t sys_args; /* Arguments passed to system function */
|
|
+
|
|
+ /* Check unit parameter and point to its object */
|
|
+ err = check_unit_set_dis(tx_unit, &p_dis);
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+ /* Check remaining parameters */
|
|
+ RETIF_BADPARAM((reg_page < k_page_index_to_page[E_PAGE_00])
|
|
+ || ((reg_page > k_page_index_to_page[E_PAGE_02])
|
|
+ && (reg_page < k_page_index_to_page[E_PAGE_11]))
|
|
+ || (reg_page > k_page_index_to_page[E_PAGE_12]))
|
|
+ RETIF_BADPARAM((reg_addr < E_REG_MIN_ADR) || (reg_addr >= E_REG_CURPAGE_ADR_W))
|
|
+ RETIF_BADPARAM(p_reg_buf == (p_uint8)0)
|
|
+ RETIF_BADPARAM((n_regs < 0) || ((n_regs + reg_addr) > E_REG_CURPAGE_ADR_W))
|
|
+
|
|
+ /* Set page register if required */
|
|
+ new_reg_page = (u8)reg_page;
|
|
+ if(p_dis->cur_reg_page != new_reg_page) {
|
|
+ /* All non-OK results are errors */
|
|
+ sys_args.slave_addr = p_dis->u_hw_address;
|
|
+ sys_args.first_register = E_REG_CURPAGE_ADR_W;
|
|
+ sys_args.len_data = 1;
|
|
+ sys_args.p_data = &new_reg_page;
|
|
+ err = p_dis->sys_func_write(&sys_args);
|
|
+ RETIF(err != 0, ERR_HDMI_I2C_WRITE)
|
|
+ p_dis->cur_reg_page = new_reg_page;
|
|
+ }
|
|
+
|
|
+ /* Write each register in the range. nRegs = 0 is ok, to allow only
|
|
+ * the page register to be written if required (above)
|
|
+ * */
|
|
+ for(; n_regs > 0; p_reg_buf++, reg_addr++, n_regs--) {
|
|
+ /* Find shadow register index.
|
|
+ * This loop is not very efficient, but it is assumed that this API
|
|
+ * will not be used often. The alternative is to use a huge sparse
|
|
+ * array indexed by page and address and containing the shadow index.
|
|
+ * */
|
|
+ for(i = 0; i < E_SNUM; i++) {
|
|
+ /* Check lookup table for match with page and address */
|
|
+ reg_shad_page_addr = k_shadow_reg[i];
|
|
+ if((SPA2PAGE(reg_shad_page_addr) == new_reg_page)
|
|
+ && (SPA2ADDR(reg_shad_page_addr) == reg_addr)) {
|
|
+ /* Found index - write the shadow register */
|
|
+ reg_shad = SPA2SHAD(reg_shad_page_addr);
|
|
+ p_dis->shadow_reg[reg_shad] = *p_reg_buf;
|
|
+ break;
|
|
+ }
|
|
+ }
|
|
+ /* Write the device register - all non-OK results are errors */
|
|
+ sys_args.slave_addr = p_dis->u_hw_address;
|
|
+ sys_args.first_register = (u8)reg_addr;
|
|
+ sys_args.len_data = 1;
|
|
+ sys_args.p_data = p_reg_buf;
|
|
+ err = p_dis->sys_func_write(&sys_args);
|
|
+ RETIF(err != 0, ERR_HDMI_I2C_WRITE)
|
|
+ }
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+#endif /* DEMO_BUILD */
|
|
+
|
|
+/*============================================================================*/
|
|
+/* bslHwStartup */
|
|
+/*============================================================================*/
|
|
+void
|
|
+bsl_hw_startup
|
|
+(
|
|
+ void
|
|
+)
|
|
+{
|
|
+ /* Reset device instance data for when compiler doesn't do it */
|
|
+ lmemset(&g_hdmi_tx_instance, 0, sizeof(g_hdmi_tx_instance));
|
|
+}
|
|
+
|
|
+/*============================================================================*/
|
|
+/* bslInit */
|
|
+/* RETIF_REG_FAIL NOT USED HERE AS ALL ERRORS SHOULD BE TRAPPED IN ALL BUILDS */
|
|
+/*============================================================================*/
|
|
+error_code_t
|
|
+bsl_init
|
|
+(
|
|
+ unit_select_t tx_unit,
|
|
+ u8 u_hw_address,
|
|
+ pbsl_sys_func_t sys_func_write,
|
|
+ pbsl_sys_func_t sys_func_read,
|
|
+ pbsl_sys_func_edid_t sys_func_edid_read,
|
|
+ pbsl_sys_func_timer_t sys_func_timer,
|
|
+ bsl_callback_list_t *func_int_callbacks,
|
|
+ bool b_edid_alt_addr,
|
|
+ bsl_vid_fmt_t vin_fmt,
|
|
+ bsl_pix_rate_t pix_rate
|
|
+)
|
|
+{
|
|
+ hdmi_txobject_t *p_dis; /* Pointer to Device Instance Structure */
|
|
+ error_code_t err; /* Error code */
|
|
+ int i; /* Loop index */
|
|
+ bool b_found; /* T=found, F=not found */
|
|
+ u8 reg_val; /* Value read from register */
|
|
+
|
|
+ /* Check unit parameter and point to its object */
|
|
+ RETIF(tx_unit < unit0, ERR_HDMI_BAD_UNIT_NUMBER)
|
|
+ RETIF(tx_unit >= HDMITX_UNITS_MAX, ERR_HDMI_BAD_UNIT_NUMBER)
|
|
+ p_dis = &g_hdmi_tx_instance[tx_unit];
|
|
+
|
|
+ /* IF the bInitialized flag is set THEN return (only Init does this) */
|
|
+ RETIF(p_dis->b_initialized, ERR_HDMI_INIT_FAILED)
|
|
+
|
|
+ /* Check remaining parameters */
|
|
+ RETIF_BADPARAM(u_hw_address < HDMITX_SLAVE_ADDRESS_MIN)
|
|
+ RETIF_BADPARAM(u_hw_address > HDMITX_SLAVE_ADDRESS_MAX)
|
|
+ RETIF_BADPARAM(sys_func_write == (pbsl_sys_func_t)0)
|
|
+ RETIF_BADPARAM(sys_func_read == (pbsl_sys_func_t)0)
|
|
+ RETIF_BADPARAM(sys_func_edid_read == (pbsl_sys_func_edid_t)0)
|
|
+ RETIF_BADPARAM(sys_func_timer == (pbsl_sys_func_timer_t)0)
|
|
+ RETIF_BADPARAM((b_edid_alt_addr != true) && (b_edid_alt_addr != false))
|
|
+#ifdef FORMAT_PC
|
|
+ RETIF_BADPARAM(vin_fmt < HDMITX_VFMT_TV_MIN)
|
|
+ RETIF_BADPARAM((vin_fmt > HDMITX_VFMT_TV_MAX) && (vin_fmt < HDMITX_VFMT_PC_MIN))
|
|
+ RETIF_BADPARAM(vin_fmt > HDMITX_VFMT_PC_MAX)
|
|
+#else /* FORMAT_PC */
|
|
+ /* FORMAT TV only */
|
|
+ RETIF_BADPARAM(vin_fmt < HDMITX_VFMT_TV_MIN)
|
|
+ RETIF_BADPARAM(vin_fmt > HDMITX_VFMT_TV_MAX)
|
|
+#endif /* FORMAT_PC */
|
|
+ RETIF_BADPARAM(pix_rate >= HDMITX_PIXRATE_INVALID)
|
|
+
|
|
+ /* Set all Device Instance Structure members to default values */
|
|
+ lmemcpy(p_dis, &k_hdmi_tx_instance_default, sizeof(*p_dis));
|
|
+
|
|
+ /* Copy txUnit, uHwAddress, sysFuncWrite and sysFuncRead values to
|
|
+ * the defaulted Device Instance Structure BEFORE FIRST DEVICE ACCESS.
|
|
+ * */
|
|
+ p_dis->tx_unit = tx_unit;
|
|
+#ifdef UNIT_TEST
|
|
+ /* Unit test build can't support 127 device sets of dummy registers, so use
|
|
+ * smaller range instead, indexed by unit number not I2C address */
|
|
+ p_dis->u_hw_address = (u8)tx_unit;
|
|
+#else
|
|
+ /* Store actual I2C address */
|
|
+ p_dis->u_hw_address = u_hw_address;
|
|
+#endif
|
|
+ p_dis->sys_func_write = sys_func_write;
|
|
+ p_dis->sys_func_read = sys_func_read;
|
|
+ p_dis->sys_func_edid_read = sys_func_edid_read;
|
|
+ p_dis->sys_func_timer = sys_func_timer;
|
|
+
|
|
+ /* Reset Hdcp interrupt flag */
|
|
+ g_ignore_encrypt[tx_unit] = false;
|
|
+
|
|
+ /* Ensure that DDC is not connected to I2C at start */
|
|
+ err = set_hw_register(p_dis, E_REG_P00_GHOST_ADDR_W, 0x01);
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+ /* Read the device version register to uDeviceVersion in the
|
|
+ * Device Instance Structure
|
|
+ * */
|
|
+ err = get_hw_register(p_dis, E_REG_P00_VERSION_R, &p_dis->u_device_version);
|
|
+ RETIF(err != 0, err)
|
|
+ /* Copy N4 features bits to DIS */
|
|
+ p_dis->u_device_features = p_dis->u_device_version &
|
|
+ (e_maskreg_p00_version_not_h | e_maskreg_p00_version_not_s);
|
|
+ /* Mask off N4 features bits in version */
|
|
+ p_dis->u_device_version &= (u8)~p_dis->u_device_features;
|
|
+
|
|
+#ifdef TMFL_TDA9981_SUPPORT
|
|
+ /* If version reads zero, test not_s to '1' for TDA9981 */
|
|
+ if(p_dis->u_device_version == E_DEV_VERSION_N4) {
|
|
+ if((p_dis->u_device_features & e_maskreg_p00_version_not_s) !=
|
|
+ e_maskreg_p00_version_not_s) {
|
|
+ p_dis->u_device_version = E_DEV_VERSION_LIST_END;
|
|
+ }
|
|
+ }
|
|
+#endif /* TMFL_TDA9981_SUPPORT */
|
|
+
|
|
+ /* Quit if version reads zero */
|
|
+ RETIF(p_dis->u_device_version == E_DEV_VERSION_LIST_END,
|
|
+ ERR_HDMI_COMPATIBILITY)
|
|
+
|
|
+ /* Search for the device version in the Supported Version
|
|
+ * List in the Device Instance Structure.
|
|
+ * */
|
|
+ for(i = 0, b_found = false; i < E_DEV_VERSION_LIST_NUM; i++) {
|
|
+ if(p_dis->u_device_version == p_dis->u_supported_versions[i]) {
|
|
+ b_found = true;
|
|
+ }
|
|
+ }
|
|
+
|
|
+ /* IF the device version is not found in the Supported Version List THEN
|
|
+ * this driver component is not compatible with the device.
|
|
+ * */
|
|
+ RETIF(!b_found, ERR_HDMI_COMPATIBILITY);
|
|
+
|
|
+ /* If version is N4 then detect N5 device (both have same version) */
|
|
+ if(p_dis->u_device_version == E_DEV_VERSION_N4) {
|
|
+ /* Read N5-specific registers to detect N5 */
|
|
+ err = get_hw_register(p_dis, E_REG_P00_DWIN_RE_DE_W, ®_val);
|
|
+ RETIF(err != 0, err)
|
|
+ if(reg_val == 0x11) {
|
|
+ /* Default value for N5 */
|
|
+ err = get_hw_register(p_dis, E_REG_P00_DWIN_FE_DE_W, ®_val);
|
|
+ RETIF(err != 0, err)
|
|
+ if(reg_val == 0x7A) {
|
|
+ /* Both N5 registers have correct default value for N5,
|
|
+ * so set the N5 'feature' flag */
|
|
+ p_dis->u_device_features |= E_MASKREG_P00_FEATURE_N5;
|
|
+ }
|
|
+ }
|
|
+ }
|
|
+
|
|
+ /* IF the funcIntCallbacks array pointer is defined
|
|
+ * THEN for each funcIntCallbacks pointer that is not null:
|
|
+ * - Copy the pointer to the Device Instance Structure
|
|
+ * funcIntCallbacks array.
|
|
+ * */
|
|
+ for(i = 0; i < HDMITX_CALLBACK_INT_NUM; i++) {
|
|
+ if((func_int_callbacks != (bsl_callback_list_t *)0)
|
|
+ && (func_int_callbacks->func_callback[i] != (pbsl_callback_t)0)) {
|
|
+ p_dis->func_int_callbacks[i] = func_int_callbacks->func_callback[i];
|
|
+ } else {
|
|
+ p_dis->func_int_callbacks[i] = (pbsl_callback_t)0;
|
|
+ }
|
|
+ }
|
|
+
|
|
+ /* Set the EDID alternate address flag if needed*/
|
|
+ p_dis->b_edid_alternate_addr = b_edid_alt_addr;
|
|
+
|
|
+ /* Set the bInitialized flag to enable other APIs */
|
|
+ p_dis->b_initialized = true;
|
|
+
|
|
+ /* Set the PLL before resetting the device */
|
|
+ /* PLL registers common configuration */
|
|
+ err = set_hw_register_field_table(p_dis, &k_common_pll_cfg[0]);
|
|
+ RETIF_REG_FAIL(err)
|
|
+
|
|
+ switch(vin_fmt) {
|
|
+ /* 480i or 576i video input format */
|
|
+ case hdmitx_vfmt_06_720x480i_60hz:
|
|
+ case hdmitx_vfmt_07_720x480i_60hz:
|
|
+ case hdmitx_vfmt_21_720x576i_50hz:
|
|
+ case hdmitx_vfmt_22_720x576i_50hz:
|
|
+ err = set_hw_register_field_table(p_dis, &k_vfmt480i576i_pll_cfg[0]);
|
|
+ RETIF_REG_FAIL(err)
|
|
+
|
|
+ switch(pix_rate) {
|
|
+ case HDMITX_PIXRATE_SINGLE:
|
|
+ /* Single edge mode, vinFmt 480i or 576i */
|
|
+ err = set_hw_register_field_table(p_dis, &k_single_prate_vfmt480i576i_pll_cfg[0]);
|
|
+ RETIF_REG_FAIL(err)
|
|
+ break;
|
|
+ case HDMITX_PIXRATE_SINGLE_REPEATED:
|
|
+ /* Single repeated edge mode, vinFmt 480i or 576i */
|
|
+ err = set_hw_register_field_table(p_dis, &k_srepeated_prate_vfmt480i576i_pll_cfg[0]);
|
|
+ RETIF_REG_FAIL(err)
|
|
+ break;
|
|
+ default:
|
|
+ /* Double edge mode doesn't exist for vinFmt 480i or 576i */
|
|
+ return(ERR_HDMI_INCONSISTENT_PARAMS);
|
|
+ break;
|
|
+ }
|
|
+
|
|
+ break;
|
|
+
|
|
+ /* Others video input format */
|
|
+ default:
|
|
+ err = set_hw_register_field_table(p_dis, &k_vfmt_other_pll_cfg[0]);
|
|
+ RETIF_REG_FAIL(err)
|
|
+
|
|
+ switch(pix_rate) {
|
|
+ case HDMITX_PIXRATE_SINGLE:
|
|
+ /* Single edge mode, vinFmt other than 480i or 576i */
|
|
+ err = set_hw_register_field_table(p_dis, &k_single_prate_vfmt_other_pll_cfg[0]);
|
|
+ RETIF_REG_FAIL(err)
|
|
+ break;
|
|
+ case HDMITX_PIXRATE_DOUBLE:
|
|
+ /* Double edge mode, vinFmt other than 480i or 576i */
|
|
+ err = set_hw_register_field_table(p_dis, &k_double_prate_vfmt_other_pll_cfg[0]);
|
|
+ RETIF_REG_FAIL(err)
|
|
+ break;
|
|
+ default:
|
|
+ /* Single repeated edge mode doesn't exist for other vinFmt */
|
|
+ return(ERR_HDMI_INCONSISTENT_PARAMS);
|
|
+ break;
|
|
+ }
|
|
+
|
|
+ break;
|
|
+ }
|
|
+
|
|
+ /* Reset the device */
|
|
+ err = bsl_reset(tx_unit);
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+ /* The DIS hotplug status is HDMITX_HOTPLUG_INVALID, so call the main
|
|
+ * interrupt handler to read the current Hot Plug status and run any
|
|
+ * registered HPD callback before interrupts are enabled below */
|
|
+ err = bsl_hw_handle_interrupt(tx_unit);
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+#ifdef TMFL_TDA9981_SUPPORT
|
|
+ /* enable sw _interrupt for debug */
|
|
+ err = set_hw_register(p_dis, E_REG_P00_INT_FLAGS_1_RW,
|
|
+ e_maskreg_p00_int_flags_1_sw_int);
|
|
+
|
|
+#ifdef TMFL_RX_SENSE_ON
|
|
+ /* enable sw _interrupt for debug */
|
|
+ err = set_hw_register(p_dis, E_REG_P00_INT_FLAGS_2_RW,
|
|
+ e_maskreg_p00_int_flags_2_rx_sense);
|
|
+#endif /* TMFL_RX_SENSE_ON */
|
|
+#endif /* TMFL_TDA9981_SUPPORT */
|
|
+
|
|
+ /* Enable only the Hot Plug detect interrupt */
|
|
+ err = set_hw_register(p_dis, E_REG_P00_INT_FLAGS_0_RW,
|
|
+ e_maskreg_p00_int_flags_0_hpd);
|
|
+ return err;
|
|
+}
|
|
+
|
|
+/*============================================================================*/
|
|
+/* bslPowerGetState */
|
|
+/*============================================================================*/
|
|
+#ifndef DEMO_BUILD
|
|
+error_code_t
|
|
+bsl_power_get_state
|
|
+(
|
|
+ unit_select_t tx_unit,
|
|
+ p_power_state_t pe_power_state
|
|
+)
|
|
+{
|
|
+ hdmi_txobject_t *p_dis; /* Pointer to Device Instance Structure */
|
|
+ error_code_t err; /* Error code */
|
|
+
|
|
+ /* Check unit parameter and point to its object */
|
|
+ err = check_unit_set_dis(tx_unit, &p_dis);
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+ /* Check remaining parameters */
|
|
+ RETIF_BADPARAM(pe_power_state == (p_power_state_t)0)
|
|
+
|
|
+ /* Read the device power status and set the pePowerState
|
|
+ * return parameter
|
|
+ * */
|
|
+ *pe_power_state = p_dis->e_power_state;
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+#endif /* DEMO_BUILD */
|
|
+
|
|
+/*============================================================================*/
|
|
+/* bslPowerSetState */
|
|
+/*============================================================================*/
|
|
+error_code_t
|
|
+bsl_power_set_state
|
|
+(
|
|
+ unit_select_t tx_unit,
|
|
+ power_state_t e_power_state
|
|
+)
|
|
+{
|
|
+ hdmi_txobject_t *p_dis; /* Pointer to Device Instance Structure */
|
|
+ error_code_t err; /* Error code */
|
|
+
|
|
+ /* Check unit parameter and point to its object */
|
|
+ err = check_unit_set_dis(tx_unit, &p_dis);
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+ /* Check remaining parameters */
|
|
+ RETIF_BADPARAM(e_power_state > power_off)
|
|
+
|
|
+ /* Treat Off and Suspend the same as Standby */
|
|
+ if((e_power_state == power_off) || (e_power_state == power_suspend)) {
|
|
+ e_power_state = power_standby;
|
|
+ }
|
|
+
|
|
+ /* Set the device power control register to the requested ePowerState
|
|
+ * state
|
|
+ * */
|
|
+ if(e_power_state == power_on) {
|
|
+ /** Set power On state control registers */
|
|
+ err = set_hw_register_field_table(p_dis, &k_power_on[0]);
|
|
+ RETIF_REG_FAIL(err)
|
|
+
|
|
+ if(p_dis->e_power_state == power_standby) {
|
|
+ if(p_dis->hot_plug_status == HDMITX_HOTPLUG_ACTIVE) {
|
|
+ set_state(p_dis, EV_RESUME_PLUGGEDIN);
|
|
+ } else {
|
|
+ set_state(p_dis, EV_RESUME_UNPLUGGED);
|
|
+ }
|
|
+ }
|
|
+ } else {
|
|
+ /** Set power standby state control registers */
|
|
+ err = set_hw_register_field_table(p_dis, &k_power_off[0]);
|
|
+ RETIF_REG_FAIL(err)
|
|
+
|
|
+ set_state(p_dis, EV_STANDBY);
|
|
+ }
|
|
+
|
|
+ /* Save the ePowerState value in the Device Instance Structure */
|
|
+ p_dis->e_power_state = e_power_state;
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+/*============================================================================*/
|
|
+/* bslReset */
|
|
+/*============================================================================*/
|
|
+error_code_t
|
|
+bsl_reset
|
|
+(
|
|
+ unit_select_t tx_unit
|
|
+)
|
|
+{
|
|
+ hdmi_txobject_t *p_dis; /* Pointer to Device Instance Structure */
|
|
+ error_code_t err; /* Error code */
|
|
+
|
|
+ /* Check unit parameter and point to its object */
|
|
+ err = check_unit_set_dis(tx_unit, &p_dis);
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+ /* Write to the transmitter to do a soft reset. Don't abort after any
|
|
+ * error here, to ensure full reset.
|
|
+ * */
|
|
+ (void)set_hw_register_field(p_dis, E_REG_P00_MAIN_CNTRL0_W,
|
|
+ e_maskreg_p00_main_cntrl0_sr, 1);
|
|
+ p_dis->sys_func_timer(50); /* ms */
|
|
+ (void)set_hw_register_field(p_dis, E_REG_P00_MAIN_CNTRL0_W,
|
|
+ e_maskreg_p00_main_cntrl0_sr, 0);
|
|
+
|
|
+ /* Clear any colourbars */
|
|
+ (void)set_hw_register_field(p_dis, E_REG_P00_HVF_CNTRL_0_W,
|
|
+ e_maskreg_p00_hvf_cntrl_0_sm, 0);
|
|
+
|
|
+ /* Transmitter is now inactive so treat as if sink has been unplugged */
|
|
+ set_state(p_dis, EV_UNPLUGGED);
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+/*============================================================================*/
|
|
+/* bslScalerGet */
|
|
+/*============================================================================*/
|
|
+#ifndef DEMO_BUILD
|
|
+error_code_t
|
|
+bsl_scaler_get
|
|
+(
|
|
+ unit_select_t tx_unit,
|
|
+ bsl_scaler_diag_t *p_scaler_diag
|
|
+)
|
|
+{
|
|
+ hdmi_txobject_t *p_dis; /* Pointer to Device Instance Structure */
|
|
+ error_code_t err; /* Error code */
|
|
+ u8 reg_val; /* Register value */
|
|
+
|
|
+ /* Check unit parameter and point to its object */
|
|
+ err = check_unit_set_dis(tx_unit, &p_dis);
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+#ifdef TMFL_TDA9981_SUPPORT
|
|
+ (void)p_scaler_diag; /* else not referenced */
|
|
+ (void)reg_val; /* else is declared but not used */
|
|
+ return ERR_HDMI_NOT_SUPPORTED;
|
|
+#else
|
|
+ /* Check if this device has a Scaler */
|
|
+ RETIF(p_dis->u_device_features & e_maskreg_p00_version_not_s,
|
|
+ ERR_HDMI_NOT_SUPPORTED)
|
|
+
|
|
+ /* Check remaining parameters */
|
|
+ RETIF_BADPARAM(p_scaler_diag == (bsl_scaler_diag_t *)0)
|
|
+
|
|
+ /* Read from dummy register to update MAX_BUFFILL_P registers */
|
|
+ err = get_hw_register(p_dis, E_REG_P01_SC_SAMPLE_BUFFILL_R, ®_val);
|
|
+ RETIF_REG_FAIL(err)
|
|
+
|
|
+ /* Read the 16-bit MAX_BUFFILL_P register pair and copy to pScalerDiag */
|
|
+ err = get_hw_register(p_dis, E_REG_P01_SC_MAX_BUFFILL_P_0_R, ®_val);
|
|
+ RETIF_REG_FAIL(err)
|
|
+ p_scaler_diag->max_buffill_p = reg_val;
|
|
+ err = get_hw_register(p_dis, E_REG_P01_SC_MAX_BUFFILL_P_1_R, ®_val);
|
|
+ RETIF_REG_FAIL(err)
|
|
+ p_scaler_diag->max_buffill_p |= ((u16)reg_val << 8);
|
|
+
|
|
+ /* Read the 16-bit MAX_BUFFILL_D register pair and copy to pScalerDiag */
|
|
+ err = get_hw_register(p_dis, E_REG_P01_SC_MAX_BUFFILL_D_0_R, ®_val);
|
|
+ RETIF_REG_FAIL(err)
|
|
+ p_scaler_diag->max_buffill_d = reg_val;
|
|
+ err = get_hw_register(p_dis, E_REG_P01_SC_MAX_BUFFILL_D_1_R, ®_val);
|
|
+ RETIF_REG_FAIL(err)
|
|
+ p_scaler_diag->max_buffill_d |= ((u16)reg_val << 8);
|
|
+
|
|
+ /* Read from dummy register to update MAX_FIFOFILL registers */
|
|
+ err = get_hw_register(p_dis, E_REG_P01_SC_SAMPLE_FIFOFILL_R, ®_val);
|
|
+ RETIF_REG_FAIL(err)
|
|
+
|
|
+ /* Read the 8-bit FIFOFILL registers directly to pScalerDiag */
|
|
+ err = get_hw_registers(p_dis, E_REG_P01_SC_MAX_FIFOFILL_PI_R,
|
|
+ &p_scaler_diag->max_fifofill_pi, 7);
|
|
+ return err;
|
|
+#endif /* TMFL_TDA9981_SUPPORT */
|
|
+}
|
|
+#endif /* DEMO_BUILD */
|
|
+
|
|
+/*============================================================================*/
|
|
+/* bslScalerGetMode */
|
|
+/*============================================================================*/
|
|
+error_code_t
|
|
+bsl_scaler_get_mode
|
|
+(
|
|
+ unit_select_t tx_unit,
|
|
+ bsl_sca_mode_t *p_scaler_mode
|
|
+)
|
|
+{
|
|
+ hdmi_txobject_t *p_dis; /* Pointer to Device Instance Structure */
|
|
+ error_code_t err; /* Error code */
|
|
+
|
|
+ /* Check unit parameter and point to TX unit object */
|
|
+ err = check_unit_set_dis(tx_unit, &p_dis);
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+#ifdef TMFL_TDA9981_SUPPORT
|
|
+ (void)p_scaler_mode; /* else is declared but not used */
|
|
+ return ERR_HDMI_NOT_SUPPORTED;
|
|
+#else
|
|
+ /* Check if this device has a Scaler */
|
|
+ RETIF(p_dis->u_device_features & e_maskreg_p00_version_not_s,
|
|
+ ERR_HDMI_NOT_SUPPORTED)
|
|
+
|
|
+ /* Check parameters */
|
|
+ RETIF_BADPARAM(p_scaler_mode == NULL)
|
|
+
|
|
+ /* Set output parameter */
|
|
+ *p_scaler_mode = p_dis->sca_mode;
|
|
+ return 0;
|
|
+#endif /* TMFL_TDA9981_SUPPORT */
|
|
+}
|
|
+
|
|
+/*============================================================================*/
|
|
+/* bslScalerInDisable */
|
|
+/*============================================================================*/
|
|
+error_code_t
|
|
+bsl_scaler_in_disable
|
|
+(
|
|
+ unit_select_t tx_unit,
|
|
+ bool b_disable
|
|
+)
|
|
+{
|
|
+ hdmi_txobject_t *p_dis; /* Pointer to Device Instance Structure */
|
|
+ error_code_t err; /* Error code */
|
|
+
|
|
+ /* Check unit parameter and point to TX unit object */
|
|
+ err = check_unit_set_dis(tx_unit, &p_dis);
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+#ifdef TMFL_TDA9981_SUPPORT
|
|
+ (void)b_disable; /* else is declared but not used */
|
|
+ return ERR_HDMI_NOT_SUPPORTED;
|
|
+#else
|
|
+ /* Check if this device has a Scaler */
|
|
+ RETIF(p_dis->u_device_features & e_maskreg_p00_version_not_s,
|
|
+ ERR_HDMI_NOT_SUPPORTED)
|
|
+
|
|
+ /* Check parameters */
|
|
+ RETIF_BADPARAM(b_disable > true)
|
|
+
|
|
+ /* Set or clear frame_dis in the scaler Timebase Control 0 register
|
|
+ * according to bDisable
|
|
+ * */
|
|
+ err = set_hw_register_field(p_dis,
|
|
+ E_REG_P01_TBG_CNTRL_0_W,
|
|
+ e_maskreg_p01_tbg_cntrl_0_frame_dis,
|
|
+ (u8)b_disable);
|
|
+ return err;
|
|
+#endif /* TMFL_TDA9981_SUPPORT */
|
|
+}
|
|
+
|
|
+/*============================================================================*/
|
|
+/* bslScalerSetCoeffs */
|
|
+/*============================================================================*/
|
|
+#ifndef DEMO_BUILD
|
|
+error_code_t
|
|
+bsl_scaler_set_coeffs
|
|
+(
|
|
+ unit_select_t tx_unit,
|
|
+ bsl_sca_lut_t lut_sel,
|
|
+ u8 *p_vs_lut
|
|
+)
|
|
+{
|
|
+ hdmi_txobject_t *p_dis; /* Pointer to Device Instance Structure */
|
|
+ error_code_t err; /* Error code */
|
|
+
|
|
+ /* Check unit parameter and point to TX unit object */
|
|
+ err = check_unit_set_dis(tx_unit, &p_dis);
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+#ifdef TMFL_TDA9981_SUPPORT
|
|
+ (void)lut_sel; /* else not referenced */
|
|
+ (void)p_vs_lut; /* else not referenced */
|
|
+ return ERR_HDMI_NOT_SUPPORTED;
|
|
+#else
|
|
+ /* Check if this device has a Scaler */
|
|
+ RETIF(p_dis->u_device_features & e_maskreg_p00_version_not_s,
|
|
+ ERR_HDMI_NOT_SUPPORTED)
|
|
+
|
|
+ /* Check parameters */
|
|
+ RETIF_BADPARAM(lut_sel >= HDMITX_SCALUT_INVALID)
|
|
+
|
|
+ if(lut_sel == HDMITX_SCALUT_USE_VSLUT) {
|
|
+ /* Table pointer must be valid here */
|
|
+ RETIF(p_vs_lut == NULL, ERR_HDMI_INCONSISTENT_PARAMS)
|
|
+
|
|
+ /* Set LUT coefficient table */
|
|
+ err = set_hw_registers(p_dis,
|
|
+ E_REG_P01_SC_VS_LUT_0_W,
|
|
+ p_vs_lut,
|
|
+ HDMITX_VSLUT_COEFF_NUM);
|
|
+ RETIF_REG_FAIL(err)
|
|
+ } else {
|
|
+ err = set_hw_register_field(p_dis,
|
|
+ E_REG_P01_SC_VIDFORMAT_W,
|
|
+ e_maskreg_p01_sc_vidformat_lut_sel,
|
|
+ (u8)lut_sel);
|
|
+ RETIF_REG_FAIL(err)
|
|
+ }
|
|
+ return 0;
|
|
+#endif /* TMFL_TDA9981_SUPPORT */
|
|
+}
|
|
+#endif /* DEMO_BUILD */
|
|
+
|
|
+/*============================================================================*/
|
|
+/* bslScalerSetFieldOrder */
|
|
+/*============================================================================*/
|
|
+error_code_t
|
|
+bsl_scaler_set_field_order
|
|
+(
|
|
+ unit_select_t tx_unit,
|
|
+ bsl_int_ext_t top_ext,
|
|
+ bsl_int_ext_t de_ext,
|
|
+ bsl_top_sel_t top_sel,
|
|
+ bsl_top_tgl_t top_tgl
|
|
+)
|
|
+{
|
|
+ hdmi_txobject_t *p_dis; /* Pointer to Device Instance Structure */
|
|
+ error_code_t err; /* Error code */
|
|
+
|
|
+ /* Check unit parameter and point to TX unit object */
|
|
+ err = check_unit_set_dis(tx_unit, &p_dis);
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+#ifdef TMFL_TDA9981_SUPPORT
|
|
+ (void)top_ext; /* else is declared but not used */
|
|
+ (void)de_ext; /* else is declared but not used */
|
|
+ (void)top_sel; /* else is declared but not used */
|
|
+ (void)top_tgl; /* else is declared but not used */
|
|
+ return ERR_HDMI_NOT_SUPPORTED;
|
|
+#else
|
|
+ /* Check if this device has a Scaler */
|
|
+ RETIF(p_dis->u_device_features & e_maskreg_p00_version_not_s,
|
|
+ ERR_HDMI_NOT_SUPPORTED)
|
|
+
|
|
+ /* Check parameters */
|
|
+ RETIF_BADPARAM(top_ext > HDMITX_INTEXT_NO_CHANGE)
|
|
+ RETIF_BADPARAM(de_ext > HDMITX_INTEXT_NO_CHANGE)
|
|
+ RETIF_BADPARAM(top_sel > HDMITX_TOPSEL_NO_CHANGE)
|
|
+ RETIF_BADPARAM(top_tgl > HDMITX_TOPTGL_NO_CHANGE)
|
|
+
|
|
+ /* Set each optional parameter */
|
|
+ if(top_ext != HDMITX_INTEXT_NO_CHANGE) {
|
|
+ err = set_hw_register_field(p_dis,
|
|
+ E_REG_P01_TBG_CNTRL_0_W,
|
|
+ e_maskreg_p01_tbg_cntrl_0_top_ext,
|
|
+ (u8)top_ext);
|
|
+ RETIF_REG_FAIL(err)
|
|
+ }
|
|
+ if(de_ext != HDMITX_INTEXT_NO_CHANGE) {
|
|
+ err = set_hw_register_field(p_dis,
|
|
+ E_REG_P01_TBG_CNTRL_0_W,
|
|
+ e_maskreg_p01_tbg_cntrl_0_de_ext,
|
|
+ (u8)de_ext);
|
|
+ RETIF_REG_FAIL(err)
|
|
+ }
|
|
+ if(top_sel != HDMITX_TOPSEL_NO_CHANGE) {
|
|
+ err = set_hw_register_field(p_dis,
|
|
+ E_REG_P01_TBG_CNTRL_0_W,
|
|
+ e_maskreg_p01_tbg_cntrl_0_top_sel,
|
|
+ (u8)top_sel);
|
|
+ RETIF_REG_FAIL(err)
|
|
+ }
|
|
+ if(top_tgl != HDMITX_TOPTGL_NO_CHANGE) {
|
|
+ err = set_hw_register_field(p_dis,
|
|
+ E_REG_P01_TBG_CNTRL_0_W,
|
|
+ e_maskreg_p01_tbg_cntrl_0_top_tgl,
|
|
+ (u8)top_tgl);
|
|
+ RETIF_REG_FAIL(err)
|
|
+ }
|
|
+ return 0;
|
|
+#endif /* TMFL_TDA9981_SUPPORT */
|
|
+}
|
|
+
|
|
+/*============================================================================*/
|
|
+/* bslScalerSetFine */
|
|
+/*============================================================================*/
|
|
+error_code_t
|
|
+bsl_scaler_set_fine
|
|
+(
|
|
+ unit_select_t tx_unit,
|
|
+ u16 u_ref_pix,
|
|
+ u16 u_ref_line
|
|
+)
|
|
+{
|
|
+ hdmi_txobject_t *p_dis; /* Pointer to Device Instance Structure */
|
|
+ error_code_t err; /* Error code */
|
|
+
|
|
+ /* Check unit parameter and point to TX unit object */
|
|
+ err = check_unit_set_dis(tx_unit, &p_dis);
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+#ifdef TMFL_TDA9981_SUPPORT
|
|
+ (void)u_ref_pix; /* else is declared but not used */
|
|
+ (void)u_ref_line; /* else is declared but not used */
|
|
+ return ERR_HDMI_NOT_SUPPORTED;
|
|
+#else
|
|
+ /* Check if this device has a Scaler */
|
|
+ RETIF(p_dis->u_device_features & e_maskreg_p00_version_not_s,
|
|
+ ERR_HDMI_NOT_SUPPORTED)
|
|
+
|
|
+ /* Check parameters */
|
|
+ RETIF_BADPARAM(u_ref_pix >= HDMITX_SCALER_FINE_PIXEL_INVALID)
|
|
+ RETIF_BADPARAM(u_ref_line >= HDMITX_SCALER_FINE_LINE_INVALID)
|
|
+
|
|
+ if(u_ref_pix < HDMITX_SCALER_FINE_PIXEL_NO_CHANGE) {
|
|
+ err = set_hw_register_msb_lsb(p_dis, E_REG_P01_REFPIX_MSB_W, u_ref_pix);
|
|
+ RETIF_REG_FAIL(err)
|
|
+ }
|
|
+ if(u_ref_line < HDMITX_SCALER_FINE_LINE_NO_CHANGE) {
|
|
+ err = set_hw_register_msb_lsb(p_dis, E_REG_P01_REFLINE_MSB_W, u_ref_line);
|
|
+ RETIF_REG_FAIL(err)
|
|
+ }
|
|
+ return 0;
|
|
+#endif /* TMFL_TDA9981_SUPPORT */
|
|
+}
|
|
+
|
|
+/*============================================================================*/
|
|
+/* bslScalerSetSync */
|
|
+/*============================================================================*/
|
|
+error_code_t
|
|
+bsl_scaler_set_sync
|
|
+(
|
|
+ unit_select_t tx_unit,
|
|
+ bsl_vs_meth_t method,
|
|
+ bsl_vs_once_t once
|
|
+)
|
|
+{
|
|
+ hdmi_txobject_t *p_dis; /* Pointer to Device Instance Structure */
|
|
+ error_code_t err; /* Error code */
|
|
+
|
|
+ /* Check unit parameter and point to TX unit object */
|
|
+ err = check_unit_set_dis(tx_unit, &p_dis);
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+#ifdef TMFL_TDA9981_SUPPORT
|
|
+ (void)method; /* else is declared but not used */
|
|
+ (void)once; /* else is declared but not used */
|
|
+ return ERR_HDMI_NOT_SUPPORTED;
|
|
+#else
|
|
+ /* Check if this device has a Scaler */
|
|
+ RETIF(p_dis->u_device_features & e_maskreg_p00_version_not_s,
|
|
+ ERR_HDMI_NOT_SUPPORTED)
|
|
+
|
|
+ /* Check parameters */
|
|
+ RETIF_BADPARAM(method >= HDMITX_VSMETH_INVALID)
|
|
+ RETIF_BADPARAM(once >= HDMITX_VSONCE_INVALID)
|
|
+
|
|
+ /* Set each optional parameter */
|
|
+ if(method != HDMITX_VSMETH_NO_CHANGE) {
|
|
+ err = set_hw_register_field(p_dis,
|
|
+ E_REG_P01_TBG_CNTRL_0_W,
|
|
+ e_maskreg_p01_tbg_cntrl_0_sync_mthd,
|
|
+ (u8)method);
|
|
+ RETIF_REG_FAIL(err)
|
|
+ }
|
|
+ if(once != HDMITX_VSONCE_NO_CHANGE) {
|
|
+ /* Must be last register set */
|
|
+ err = set_hw_register_field(p_dis,
|
|
+ E_REG_P01_TBG_CNTRL_0_W,
|
|
+ e_maskreg_p01_tbg_cntrl_0_sync_once,
|
|
+ (u8)once);
|
|
+ RETIF_REG_FAIL(err)
|
|
+ if(once == HDMITX_VSONCE_ONCE) {
|
|
+ /* Toggle output Sync Once flag for settings to take effect */
|
|
+ err = set_hw_register_field(p_dis,
|
|
+ E_REG_P01_TBG_CNTRL_0_W,
|
|
+ e_maskreg_p01_tbg_cntrl_0_sync_once,
|
|
+ (u8)HDMITX_VSONCE_EACH_FRAME);
|
|
+ RETIF_REG_FAIL(err)
|
|
+ err = set_hw_register_field(p_dis,
|
|
+ E_REG_P01_TBG_CNTRL_0_W,
|
|
+ e_maskreg_p01_tbg_cntrl_0_sync_once,
|
|
+ (u8)HDMITX_VSONCE_ONCE);
|
|
+ RETIF_REG_FAIL(err)
|
|
+ }
|
|
+ }
|
|
+ return 0;
|
|
+#endif /* TMFL_TDA9981_SUPPORT */
|
|
+}
|
|
+
|
|
+/*============================================================================*/
|
|
+/* bslSwGetVersion */
|
|
+/*============================================================================*/
|
|
+error_code_t
|
|
+bsl_sw_get_version
|
|
+(
|
|
+ p_swversion_t p_swversion
|
|
+)
|
|
+{
|
|
+ /* Check parameters */
|
|
+ RETIF_BADPARAM(p_swversion == (p_swversion_t)0)
|
|
+
|
|
+ /* Get the version details of the component. */
|
|
+ p_swversion->compatibility_nr = HDMITX_BSL_COMP_NUM;
|
|
+ p_swversion->major_version_nr = HDMITX_BSL_MAJOR_VER;
|
|
+ p_swversion->minor_version_nr = HDMITX_BSL_MINOR_VER;
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+/*============================================================================*/
|
|
+/* bslSysTimerWait */
|
|
+/*============================================================================*/
|
|
+error_code_t
|
|
+bsl_sys_timer_wait
|
|
+(
|
|
+ unit_select_t tx_unit,
|
|
+ u16 wait_ms
|
|
+)
|
|
+{
|
|
+ hdmi_txobject_t *p_dis; /* Pointer to Device Instance Structure */
|
|
+ error_code_t err; /* Error code */
|
|
+
|
|
+ /* Check unit parameter and point to TX unit object */
|
|
+ err = check_unit_set_dis(tx_unit, &p_dis);
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+ /* Return if this device timer is not set up */
|
|
+ RETIF(!p_dis->sys_func_timer, ERR_HDMI_NOT_INITIALIZED)
|
|
+
|
|
+ /* Wait for the requested time */
|
|
+ p_dis->sys_func_timer(wait_ms);
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+/*============================================================================*/
|
|
+/* bslTmdsSetOutputs */
|
|
+/*============================================================================*/
|
|
+error_code_t
|
|
+bsl_tmds_set_outputs
|
|
+(
|
|
+ unit_select_t tx_unit,
|
|
+ bsl_tmds_out_t tmds_out
|
|
+)
|
|
+{
|
|
+ hdmi_txobject_t *p_dis; /* Pointer to Device Instance Structure */
|
|
+ error_code_t err; /* Error code */
|
|
+
|
|
+ /* Check unit parameter and point to TX unit object */
|
|
+ err = check_unit_set_dis(tx_unit, &p_dis);
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+ /* Check parameters */
|
|
+ RETIF_BADPARAM(tmds_out >= HDMITX_TMDSOUT_INVALID)
|
|
+
|
|
+ /* Set the TMDS output mode */
|
|
+ err = set_hw_register_field(p_dis,
|
|
+ E_REG_P02_BUFFER_OUT_RW,
|
|
+ e_maskreg_p02_buffer_out_srl_force,
|
|
+ (u8)tmds_out);
|
|
+ return err;
|
|
+}
|
|
+
|
|
+/*============================================================================*/
|
|
+/* bslTmdsSetSerializer */
|
|
+/*============================================================================*/
|
|
+error_code_t
|
|
+bsl_tmds_set_serializer
|
|
+(
|
|
+ unit_select_t tx_unit,
|
|
+ u8 u_phase2,
|
|
+ u8 u_phase3
|
|
+)
|
|
+{
|
|
+ hdmi_txobject_t *p_dis; /* Pointer to Device Instance Structure */
|
|
+ error_code_t err; /* Error code */
|
|
+
|
|
+ /* Check unit parameter and point to TX unit object */
|
|
+ err = check_unit_set_dis(tx_unit, &p_dis);
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+ /* Check parameters */
|
|
+ RETIF_BADPARAM(u_phase2 >= HDMITX_TMDSPHASE_INVALID)
|
|
+ RETIF_BADPARAM(u_phase3 >= HDMITX_TMDSPHASE_INVALID)
|
|
+
|
|
+ /* Set the serializer phase 2 & 3 counts */
|
|
+ err = set_hw_register_field(p_dis,
|
|
+ E_REG_P02_SERIALIZER_RW,
|
|
+ e_maskreg_p02_serializer_srl_phase2,
|
|
+ u_phase2);
|
|
+ RETIF_REG_FAIL(err)
|
|
+ err = set_hw_register_field(p_dis,
|
|
+ E_REG_P02_SERIALIZER_RW,
|
|
+ e_maskreg_p02_serializer_srl_phase3,
|
|
+ u_phase3);
|
|
+ return err;
|
|
+}
|
|
+
|
|
+/*============================================================================*/
|
|
+/* bslTestSetPattern */
|
|
+/*============================================================================*/
|
|
+error_code_t
|
|
+bsl_test_set_pattern
|
|
+(
|
|
+ unit_select_t tx_unit,
|
|
+ bsl_test_pattern_t pattern
|
|
+)
|
|
+{
|
|
+ /* Pointer to Device Instance Structure */
|
|
+ hdmi_txobject_t *p_dis;
|
|
+ error_code_t err; /* Error code */
|
|
+ u8 service_mode; /* Register value */
|
|
+ u8 bars8; /* Register value */
|
|
+ u8 buf[MATRIX_PRESET_SIZE]; /* Temp buffer */
|
|
+ u8 i; /* Loop index */
|
|
+ u8 hbl_off; /* FB: define hbl offset*/
|
|
+ u8 sc_in_fmt = 0; /* Scaler input format */
|
|
+ u8 sc_out_fmt = 0; /* Scaler output format */
|
|
+
|
|
+ /* Check unit parameter and point to TX unit object */
|
|
+ err = check_unit_set_dis(tx_unit, &p_dis);
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+ /* Check pattern parameters */
|
|
+ switch(pattern) {
|
|
+ case HDMITX_PATTERN_CBAR4:
|
|
+ service_mode = 1;
|
|
+ bars8 = 0;
|
|
+ break;
|
|
+ case HDMITX_PATTERN_BLUE:
|
|
+ case HDMITX_PATTERN_CBAR8:
|
|
+ service_mode = 1;
|
|
+ bars8 = 1;
|
|
+ break;
|
|
+ case HDMITX_PATTERN_OFF:
|
|
+ service_mode = 0;
|
|
+ bars8 = 0;
|
|
+ break;
|
|
+ default:
|
|
+ return ERR_HDMI_BAD_PARAMETER;
|
|
+ }
|
|
+
|
|
+ if(service_mode) {
|
|
+ /* if pattern is on, register is already saved */
|
|
+ if(!p_dis->prev_pattern) {
|
|
+ /* The kBypassColourProc registers are saved in bslTDA9984VideoSetInOut API */
|
|
+ /* Bypass up/down sampler and matrix for RGB colourbars */
|
|
+ set_hw_register_field_table(p_dis, &k_bypass_colour_proc[0]);
|
|
+
|
|
+ /* disable scaler blanking if necessary */
|
|
+ if(p_dis->sca_mode == HDMITX_SCAMODE_ON) {
|
|
+ /* remove blanking */
|
|
+ err = set_hw_register(p_dis, E_REG_P00_HBL_OFFSET_START_W, 0);
|
|
+ RETIF_REG_FAIL(err)
|
|
+ }
|
|
+ }
|
|
+ if(pattern == HDMITX_PATTERN_BLUE) { /* blue screen pattern */
|
|
+
|
|
+ /* To create blue screen, we use the internal color bar 8 on which we apply a matrix to change it to blue */
|
|
+ /* Set the first block byte separately, as it is shadowed and can't
|
|
+ * be set by setHwRegisters */
|
|
+
|
|
+ /* Set the first block byte separately, as it is shadowed and can't
|
|
+ * be set by setHwRegisters */
|
|
+ err = set_hw_register(p_dis,
|
|
+ E_REG_P00_MAT_CONTRL_W,
|
|
+ matrix_coeff_blue_screen[p_dis->vout_mode][0]);
|
|
+ RETIF_REG_FAIL(err)
|
|
+
|
|
+ for(i = 0; i < MATRIX_PRESET_SIZE; i++) {
|
|
+ buf[i] = matrix_coeff_blue_screen[p_dis->vout_mode][i];
|
|
+ }
|
|
+
|
|
+ /* Set the rest of the block */
|
|
+ err = set_hw_registers(p_dis,
|
|
+ E_REG_P00_MAT_OI1_MSB_W,
|
|
+ &buf[1],
|
|
+ MATRIX_PRESET_SIZE - 1);
|
|
+ RETIF_REG_FAIL(err)
|
|
+
|
|
+ if(p_dis->vout_mode == HDMITX_VOUTMODE_YUV422) {
|
|
+ /* pattern is 444 -> convert to 422 */
|
|
+ err = set_hw_register_field(p_dis,
|
|
+ E_REG_P00_HVF_CNTRL_1_W,
|
|
+ e_maskreg_p00_hvf_cntrl_1_for,
|
|
+ 1);
|
|
+ }
|
|
+
|
|
+ p_dis->prev_bluescreen = true;
|
|
+ } else { /* colour bars patterns */
|
|
+ /* Set number of colour bars */
|
|
+ err = set_hw_register_field(p_dis,
|
|
+ E_REG_P00_HVF_CNTRL_0_W,
|
|
+ e_maskreg_p00_hvf_cntrl_0_rwb,
|
|
+ bars8);
|
|
+ RETIF_REG_FAIL(err)
|
|
+
|
|
+ /* Bypass up/down sampler and matrix for RGB colourbars */
|
|
+ set_hw_register_field_table(p_dis, &k_bypass_colour_proc[0]);
|
|
+ }
|
|
+ p_dis->prev_pattern = true;
|
|
+ } else { /* serviceMode == 0 */
|
|
+ if(p_dis->prev_bluescreen) {
|
|
+ /* Restore the previous Matrix when pattern goes off */
|
|
+ err = bsl_matrix_set_conversion(tx_unit, p_dis->vin_fmt, p_dis->vin_mode, p_dis->vout_fmt, p_dis->vout_mode, p_dis->dvi_vqr);
|
|
+ RETIF_REG_FAIL(err)
|
|
+
|
|
+ /* Restore the correct output sampler mode */
|
|
+ err = set_sampling(p_dis);
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+ p_dis->prev_bluescreen = false;
|
|
+ }
|
|
+
|
|
+ /* Restore kBypassColourProc registers when pattern goes off */
|
|
+ set_hw_register(p_dis, E_REG_P00_MAT_CONTRL_W, g_mat_contrl[tx_unit]);
|
|
+ set_hw_register(p_dis, E_REG_P00_HVF_CNTRL_0_W, g_hvf_cntrl0[tx_unit]);
|
|
+ set_hw_register(p_dis, E_REG_P00_HVF_CNTRL_1_W, g_hvf_cntrl1[tx_unit]);
|
|
+ p_dis->prev_pattern = false;
|
|
+
|
|
+ /* restore scaler blanking if necessary */
|
|
+ if(p_dis->sca_mode == HDMITX_SCAMODE_ON) {
|
|
+ /* Look up scaler register formats from table */
|
|
+ sc_in_fmt = SCIO2SCIN(k_vfmt_to_regvfmt_scio_tv[p_dis->vin_fmt]);
|
|
+ sc_out_fmt = SCIO2SCOUT(k_vfmt_to_regvfmt_scio_tv[p_dis->vout_fmt]);
|
|
+
|
|
+ /* Look-up blanking re-insertion */
|
|
+ hbl_off = k_scl_add_blk_pix[sc_in_fmt][sc_out_fmt];
|
|
+ err = set_hw_register(p_dis, E_REG_P00_HBL_OFFSET_START_W, hbl_off);
|
|
+ RETIF_REG_FAIL(err)
|
|
+ /* clean green lines for none RGB output */
|
|
+ err = set_hw_register_field(p_dis,
|
|
+ E_REG_P00_HVF_CNTRL_1_W,
|
|
+ e_maskreg_p00_hvf_cntrl_1_yuvblk,
|
|
+ k_scl_clear_blk_pix[p_dis->vout_mode]);
|
|
+ RETIF_REG_FAIL(err)
|
|
+ }
|
|
+ }
|
|
+
|
|
+ /* Set Service Mode on or off */
|
|
+ err = set_hw_register_field(p_dis,
|
|
+ E_REG_P00_HVF_CNTRL_0_W,
|
|
+ e_maskreg_p00_hvf_cntrl_0_sm,
|
|
+ service_mode);
|
|
+
|
|
+ return err;
|
|
+}
|
|
+
|
|
+/*============================================================================*/
|
|
+/* bslTestSetMode */
|
|
+/*============================================================================*/
|
|
+#ifndef DEMO_BUILD
|
|
+error_code_t
|
|
+bsl_test_set_mode
|
|
+(
|
|
+ unit_select_t tx_unit,
|
|
+ bsl_test_mode_t test_mode,
|
|
+ bsl_test_state_t test_state
|
|
+)
|
|
+{
|
|
+ hdmi_txobject_t *p_dis; /* Pointer to Device Instance Structure */
|
|
+ error_code_t err; /* Error code */
|
|
+ /* Register used to activate a test */
|
|
+ u16 test_reg = E_REG_P00_VIP_CNTRL_4_W;
|
|
+ /* Register bitfield mask used */
|
|
+ u8 test_mask = e_maskreg_p00_vip_cntrl_4_tst_pat;
|
|
+
|
|
+ /* Check unit parameter and point to TX unit object */
|
|
+ err = check_unit_set_dis(tx_unit, &p_dis);
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+ /* Check parameters */
|
|
+ RETIF_BADPARAM(test_mode >= HDMITX_TESTMODE_INVALID)
|
|
+ RETIF_BADPARAM(test_state >= HDMITX_TESTSTATE_INVALID)
|
|
+
|
|
+ /* Set the mode selected by testMode to the state indicated by testState */
|
|
+ switch(test_mode) {
|
|
+ case HDMITX_TESTMODE_PAT:
|
|
+ test_reg = E_REG_P00_VIP_CNTRL_4_W;
|
|
+ test_mask = e_maskreg_p00_vip_cntrl_4_tst_pat;
|
|
+ break;
|
|
+ case HDMITX_TESTMODE_656:
|
|
+ test_reg = E_REG_P00_VIP_CNTRL_4_W;
|
|
+ test_mask = e_maskreg_p00_vip_cntrl_4_tst_656;
|
|
+ break;
|
|
+ case HDMITX_TESTMODE_SERPHOE:
|
|
+ test_reg = E_REG_P02_TEST1_RW;
|
|
+ test_mask = e_maskreg_p02_test1_tstserphoe;
|
|
+ break;
|
|
+ case HDMITX_TESTMODE_NOSC:
|
|
+ test_reg = E_REG_P02_TEST1_RW;
|
|
+ test_mask = e_maskreg_p02_test1_tst_nosc;
|
|
+ break;
|
|
+ case HDMITX_TESTMODE_HVP:
|
|
+ test_reg = E_REG_P02_TEST1_RW;
|
|
+ test_mask = e_maskreg_p02_test1_tst_hvp;
|
|
+ break;
|
|
+ case HDMITX_TESTMODE_PWD:
|
|
+ test_reg = E_REG_P02_TEST2_RW;
|
|
+ test_mask = e_maskreg_p02_test2_pwd1v8;
|
|
+ break;
|
|
+ case HDMITX_TESTMODE_DIVOE:
|
|
+ test_reg = E_REG_P02_TEST2_RW;
|
|
+ test_mask = e_maskreg_p02_test2_divtestoe;
|
|
+ break;
|
|
+ case HDMITX_TESTMODE_INVALID:
|
|
+ break;
|
|
+ }
|
|
+ err = set_hw_register_field(p_dis, test_reg, test_mask, (u8)test_state);
|
|
+ return err;
|
|
+}
|
|
+#endif /* DEMO_BUILD */
|
|
+
|
|
+/*============================================================================*/
|
|
+/* bslVideoInSetBlanking */
|
|
+/*============================================================================*/
|
|
+error_code_t
|
|
+bsl_video_in_set_blanking
|
|
+(
|
|
+ unit_select_t tx_unit,
|
|
+ bsl_blnk_src_t blankit_source,
|
|
+ bsl_blnk_code_t blanking_codes
|
|
+)
|
|
+{
|
|
+ hdmi_txobject_t *p_dis; /* Pointer to Device Instance Structure */
|
|
+ error_code_t err; /* Error code */
|
|
+
|
|
+ /* Check unit parameter and point to TX unit object */
|
|
+ err = check_unit_set_dis(tx_unit, &p_dis);
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+ /* Check parameters */
|
|
+ RETIF_BADPARAM(blankit_source >= HDMITX_BLNKSRC_INVALID)
|
|
+ RETIF_BADPARAM(blanking_codes >= HDMITX_BLNKCODE_INVALID)
|
|
+
|
|
+ /* For each parameter that is not No Change, set its register */
|
|
+ if(blankit_source != HDMITX_BLNKSRC_NO_CHANGE) {
|
|
+ err = set_hw_register_field(p_dis,
|
|
+ E_REG_P00_VIP_CNTRL_4_W,
|
|
+ e_maskreg_p00_vip_cntrl_4_blankit,
|
|
+ (u8)blankit_source);
|
|
+ RETIF_REG_FAIL(err)
|
|
+ }
|
|
+ if(blanking_codes != HDMITX_BLNKCODE_NO_CHANGE) {
|
|
+ err = set_hw_register_field(p_dis,
|
|
+ E_REG_P00_VIP_CNTRL_4_W,
|
|
+ e_maskreg_p00_vip_cntrl_4_blc,
|
|
+ (u8)blanking_codes);
|
|
+ RETIF_REG_FAIL(err)
|
|
+ }
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+/*============================================================================*/
|
|
+/* bslVideoInSetConfig */
|
|
+/*============================================================================*/
|
|
+error_code_t
|
|
+bsl_video_in_set_config
|
|
+(
|
|
+ unit_select_t tx_unit,
|
|
+ bsl_vin_mode_t vin_mode,
|
|
+ bsl_pix_edge_t sample_edge,
|
|
+ bsl_pix_rate_t pix_rate,
|
|
+ bsl_upsample_mode_t upsample_mode
|
|
+)
|
|
+{
|
|
+ hdmi_txobject_t *p_dis; /* Pointer to Device Instance Structure */
|
|
+ error_code_t err; /* Error code */
|
|
+
|
|
+ /* Check unit parameter and point to TX unit object */
|
|
+ err = check_unit_set_dis(tx_unit, &p_dis);
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+ /* Check parameters */
|
|
+ RETIF_BADPARAM(vin_mode >= HDMITX_VINMODE_INVALID)
|
|
+ RETIF_BADPARAM(sample_edge >= HDMITX_PIXEDGE_INVALID)
|
|
+ RETIF_BADPARAM(pix_rate >= HDMITX_PIXRATE_INVALID)
|
|
+ RETIF_BADPARAM(upsample_mode >= HDMITX_UPSAMPLE_INVALID)
|
|
+
|
|
+ if(vin_mode != HDMITX_VINMODE_NO_CHANGE) {
|
|
+ switch(vin_mode) {
|
|
+ case HDMITX_VINMODE_CCIR656:
|
|
+ err = set_hw_register_field_table(p_dis, &k_vin_mode_ccir656[0]);
|
|
+ RETIF_REG_FAIL(err)
|
|
+ break;
|
|
+ case HDMITX_VINMODE_YUV422:
|
|
+ err = set_hw_register_field_table(p_dis, &k_vin_mode_yuv422[0]);
|
|
+ RETIF_REG_FAIL(err)
|
|
+ break;
|
|
+ case HDMITX_VINMODE_RGB444:
|
|
+ case HDMITX_VINMODE_YUV444:
|
|
+ default:
|
|
+ err = set_hw_register_field_table(p_dis, &k_vin_mode444[0]);
|
|
+ RETIF_REG_FAIL(err)
|
|
+ break;
|
|
+ }
|
|
+ err = set_hw_register_field(p_dis,
|
|
+ E_REG_P02_CCIR_DIV_RW,
|
|
+ e_maskreg_p02_ccir_div_refdiv2,
|
|
+ 0);
|
|
+ RETIF_REG_FAIL(err)
|
|
+ p_dis->vin_mode = vin_mode;
|
|
+ }
|
|
+ if(sample_edge != HDMITX_PIXEDGE_NO_CHANGE) {
|
|
+ err = set_hw_register_field(p_dis,
|
|
+ E_REG_P00_VIP_CNTRL_3_W,
|
|
+ e_maskreg_p00_vip_cntrl_3_edge,
|
|
+ (u8)sample_edge);
|
|
+ RETIF_REG_FAIL(err)
|
|
+ }
|
|
+ if(pix_rate != HDMITX_PIXRATE_NO_CHANGE) {
|
|
+ p_dis->pix_rate = pix_rate;
|
|
+
|
|
+ if(pix_rate == HDMITX_PIXRATE_SINGLE_REPEATED) {
|
|
+
|
|
+ err = set_hw_register_field(p_dis,
|
|
+ E_REG_P02_CCIR_DIV_RW,
|
|
+ e_maskreg_p02_ccir_div_refdiv2,
|
|
+ 1);
|
|
+ RETIF_REG_FAIL(err)
|
|
+
|
|
+ err = set_hw_register_field(p_dis,
|
|
+ E_REG_P02_PLL_SCG2_RW,
|
|
+ e_maskreg_p02_pll_scg2_selpllclkin,
|
|
+ 0);
|
|
+ RETIF_REG_FAIL(err)
|
|
+
|
|
+ err = set_hw_register_field(p_dis,
|
|
+ E_REG_P02_PLL_DE_RW,
|
|
+ e_maskreg_p02_pll_de_pllde_fdn,
|
|
+ 1);
|
|
+ RETIF_REG_FAIL(err)
|
|
+
|
|
+ err = set_hw_register_field(p_dis,
|
|
+ E_REG_P02_PLL_DE_RW,
|
|
+ e_maskreg_p02_pll_de_bypass_pllde,
|
|
+ 1);
|
|
+ RETIF_REG_FAIL(err)
|
|
+ } else {
|
|
+
|
|
+ err = set_hw_register_field(p_dis,
|
|
+ E_REG_P02_PLL_SCG2_RW,
|
|
+ e_maskreg_p02_pll_scg2_selpllclkin,
|
|
+ (u8)pix_rate);
|
|
+ RETIF_REG_FAIL(err)
|
|
+ err = set_hw_register_field(p_dis,
|
|
+ E_REG_P02_PLL_DE_RW,
|
|
+ e_maskreg_p02_pll_de_bypass_pllde,
|
|
+ (u8)pix_rate);
|
|
+ RETIF_REG_FAIL(err)
|
|
+ err = set_hw_register_field(p_dis,
|
|
+ E_REG_P02_PLL_DE_RW,
|
|
+ e_maskreg_p02_pll_de_pllde_fdn,
|
|
+ (u8)pix_rate);
|
|
+ RETIF_REG_FAIL(err)
|
|
+ }
|
|
+ }
|
|
+ if(upsample_mode != HDMITX_UPSAMPLE_NO_CHANGE) {
|
|
+ p_dis->upsample_mode = upsample_mode;
|
|
+ }
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+/*============================================================================*/
|
|
+/* bslVideoInSetFine */
|
|
+/*============================================================================*/
|
|
+error_code_t
|
|
+bsl_video_in_set_fine
|
|
+(
|
|
+ unit_select_t tx_unit,
|
|
+ bsl_pix_subpkt_t subpacket_count,
|
|
+ bsl_pix_togl_t toggle_clk1
|
|
+)
|
|
+{
|
|
+ hdmi_txobject_t *p_dis; /* Pointer to Device Instance Structure */
|
|
+ error_code_t err; /* Error code */
|
|
+
|
|
+ /* Check unit parameter and point to TX unit object */
|
|
+ err = check_unit_set_dis(tx_unit, &p_dis);
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+ /* Check parameters */
|
|
+ RETIF_BADPARAM(subpacket_count >= HDMITX_PIXSUBPKT_INVALID)
|
|
+ RETIF_BADPARAM(toggle_clk1 >= HDMITX_PIXTOGL_INVALID)
|
|
+
|
|
+ /* IF subpacketCount is Fix at 0/1/2/3 THEN set subpacket count register
|
|
+ * to 0/1/2/3 and set subpacket sync register to 3
|
|
+ * */
|
|
+ if(subpacket_count <= HDMITX_PIXSUBPKT_FIX_3) {
|
|
+ err = set_hw_register_field(p_dis,
|
|
+ E_REG_P00_VIP_CNTRL_5_W,
|
|
+ e_maskreg_p00_vip_cntrl_5_sp_cnt,
|
|
+ (u8)subpacket_count);
|
|
+ RETIF_REG_FAIL(err)
|
|
+ err = set_hw_register_field(p_dis,
|
|
+ E_REG_P00_VIP_CNTRL_3_W,
|
|
+ e_maskreg_p00_vip_cntrl_3_sp_sync,
|
|
+ HDMITX_PIXSUBPKT_SYNC_FIXED);
|
|
+ RETIF_REG_FAIL(err)
|
|
+ }
|
|
+ /* ELSE IF subpacketCount is Sync by Hemb/ Sync by Rising Edge DE/
|
|
+ * Sync by Rising Edge HS THEN set the unused subpacket count to zero and
|
|
+ * set subpacket sync register to 0/1/2
|
|
+ * */
|
|
+ else if(subpacket_count != HDMITX_PIXSUBPKT_NO_CHANGE) {
|
|
+ err = set_hw_register_field(p_dis,
|
|
+ E_REG_P00_VIP_CNTRL_5_W,
|
|
+ e_maskreg_p00_vip_cntrl_5_sp_cnt,
|
|
+ HDMITX_PIXSUBPKT_FIX_0);
|
|
+ RETIF_REG_FAIL(err)
|
|
+
|
|
+ err = set_hw_register_field(p_dis,
|
|
+ E_REG_P00_VIP_CNTRL_3_W,
|
|
+ e_maskreg_p00_vip_cntrl_3_sp_sync,
|
|
+ (u8)(subpacket_count - HDMITX_PIXSUBPKT_SYNC_FIRST));
|
|
+ RETIF_REG_FAIL(err)
|
|
+ }
|
|
+
|
|
+ /* IF toggleClk1 is not No Change THEN set ckcase bitfield */
|
|
+ if(toggle_clk1 != HDMITX_PIXTOGL_NO_CHANGE) {
|
|
+ err = set_hw_register_field(p_dis,
|
|
+ E_REG_P00_VIP_CNTRL_5_W,
|
|
+ e_maskreg_p00_vip_cntrl_5_ckcase,
|
|
+ (u8)toggle_clk1);
|
|
+ RETIF_REG_FAIL(err)
|
|
+ }
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+/*============================================================================*/
|
|
+/* bslVideoInSetMapping */
|
|
+/*============================================================================*/
|
|
+error_code_t
|
|
+bsl_video_in_set_mapping
|
|
+(
|
|
+ unit_select_t tx_unit,
|
|
+ u8 *p_swap_table,
|
|
+ u8 *p_mirror_table
|
|
+)
|
|
+{
|
|
+ hdmi_txobject_t *p_dis; /* Pointer to Device Instance Structure */
|
|
+ error_code_t err; /* Error code */
|
|
+ int i; /* Loop counter */
|
|
+
|
|
+ /* Check unit parameter and point to TX unit object */
|
|
+ err = check_unit_set_dis(tx_unit, &p_dis);
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+ /* Check parameters */
|
|
+ RETIF_BADPARAM(p_swap_table == NULL)
|
|
+ RETIF_BADPARAM(p_mirror_table == NULL)
|
|
+ for(i = 0; i < HDMITX_VIN_PORT_MAP_TABLE_LEN; i++) {
|
|
+ RETIF_BADPARAM(p_swap_table[i] >= HDMITX_VIN_PORT_SWAP_INVALID)
|
|
+ RETIF_BADPARAM(p_mirror_table[i] >= HDMITX_VIN_PORT_MIRROR_INVALID)
|
|
+ }
|
|
+
|
|
+ /* IF pswapTable[n] is not No Change THEN set the port swap registers from
|
|
+ * pswapTable[n]
|
|
+ * */
|
|
+ for(i = 0; i < HDMITX_VIN_PORT_MAP_TABLE_LEN; i++) {
|
|
+ if(p_swap_table[0] < HDMITX_VIN_PORT_SWAP_NO_CHANGE) {
|
|
+ err = set_hw_register_field(p_dis,
|
|
+ k_reg_vip[i].reg,
|
|
+ k_reg_vip[i].mask_swap,
|
|
+ p_swap_table[i]);
|
|
+ RETIF_REG_FAIL(err)
|
|
+ }
|
|
+ }
|
|
+
|
|
+ /* IF pMirrorTable[n] is not No Change THEN set the port mirror registers
|
|
+ * from pMirrorTable[n]
|
|
+ * */
|
|
+ for(i = 0; i < HDMITX_VIN_PORT_MAP_TABLE_LEN; i++) {
|
|
+ if(p_mirror_table[0] < HDMITX_VIN_PORT_MIRROR_NO_CHANGE) {
|
|
+ err = set_hw_register_field(p_dis,
|
|
+ k_reg_vip[i].reg,
|
|
+ k_reg_vip[i].mask_mirror,
|
|
+ p_mirror_table[i]);
|
|
+ RETIF_REG_FAIL(err)
|
|
+ }
|
|
+ }
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+/*============================================================================*/
|
|
+/* bslSetVideoPortConfig */
|
|
+/*============================================================================*/
|
|
+error_code_t
|
|
+bsl_set_video_port_config
|
|
+(
|
|
+ unit_select_t tx_unit,
|
|
+ u8 *p_ena_video_port_table,
|
|
+ u8 *p_gnd_video_port_table
|
|
+)
|
|
+{
|
|
+ hdmi_txobject_t *p_dis; /* Pointer to Device Instance Structure */
|
|
+ error_code_t err; /* Error code */
|
|
+
|
|
+ /* Check unit parameter and point to TX unit object */
|
|
+ err = check_unit_set_dis(tx_unit, &p_dis);
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+ /* Check parameters */
|
|
+ RETIF_BADPARAM(p_ena_video_port_table == NULL)
|
|
+ RETIF_BADPARAM(p_gnd_video_port_table == NULL)
|
|
+
|
|
+#ifdef TMFL_TDA9981_SUPPORT
|
|
+ err = set_hw_register(p_dis,
|
|
+ E_REG_P00_ENA_VP_0_RW,
|
|
+ p_ena_video_port_table[0]);
|
|
+ RETIF_REG_FAIL(err)
|
|
+
|
|
+ err = set_hw_register(p_dis,
|
|
+ E_REG_P00_ENA_VP_1_RW,
|
|
+ p_ena_video_port_table[1]);
|
|
+ RETIF_REG_FAIL(err)
|
|
+
|
|
+ err = set_hw_register(p_dis,
|
|
+ E_REG_P00_ENA_VP_2_RW,
|
|
+ p_ena_video_port_table[2]);
|
|
+ RETIF_REG_FAIL(err)
|
|
+
|
|
+ err = set_hw_register(p_dis,
|
|
+ E_REG_P00_GND_VP_0_RW,
|
|
+ p_gnd_video_port_table[0]);
|
|
+ RETIF_REG_FAIL(err)
|
|
+
|
|
+ err = set_hw_register(p_dis,
|
|
+ E_REG_P00_GND_VP_1_RW,
|
|
+ p_gnd_video_port_table[1]);
|
|
+ RETIF_REG_FAIL(err)
|
|
+
|
|
+ err = set_hw_register(p_dis,
|
|
+ E_REG_P00_GND_VP_2_RW,
|
|
+ p_gnd_video_port_table[2]);
|
|
+ RETIF_REG_FAIL(err)
|
|
+
|
|
+ return 0;
|
|
+#else /* TMFL_TDA9981_SUPPORT */
|
|
+ (void)p_ena_video_port_table;
|
|
+ (void)p_gnd_video_port_table;
|
|
+ return ERR_HDMI_NOT_SUPPORTED;
|
|
+#endif /* TMFL_TDA9981_SUPPORT */
|
|
+}
|
|
+
|
|
+/*============================================================================*/
|
|
+/* bslSetAudioPortConfig */
|
|
+/*============================================================================*/
|
|
+error_code_t
|
|
+bsl_set_audio_port_config
|
|
+(
|
|
+ unit_select_t tx_unit,
|
|
+ u8 *p_ena_audio_port_table,
|
|
+ u8 *p_gnd_audio_port_table
|
|
+)
|
|
+{
|
|
+ hdmi_txobject_t *p_dis; /* Pointer to Device Instance Structure */
|
|
+ error_code_t err; /* Error code */
|
|
+
|
|
+ /* Check unit parameter and point to TX unit object */
|
|
+ err = check_unit_set_dis(tx_unit, &p_dis);
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+ /* Check parameters */
|
|
+ RETIF_BADPARAM(p_ena_audio_port_table == NULL)
|
|
+ RETIF_BADPARAM(p_gnd_audio_port_table == NULL)
|
|
+
|
|
+#ifdef TMFL_TDA9981_SUPPORT
|
|
+ err = set_hw_register(p_dis,
|
|
+ E_REG_P00_ENA_AP_RW,
|
|
+ p_ena_audio_port_table[0]);
|
|
+ RETIF_REG_FAIL(err)
|
|
+
|
|
+ err = set_hw_register(p_dis,
|
|
+ E_REG_P00_GND_AP_RW,
|
|
+ p_gnd_audio_port_table[0]);
|
|
+ RETIF_REG_FAIL(err)
|
|
+
|
|
+ return 0;
|
|
+#else /* TMFL_TDA9981_SUPPORT */
|
|
+ (void)p_ena_audio_port_table;
|
|
+ (void)p_gnd_audio_port_table;
|
|
+ return ERR_HDMI_NOT_SUPPORTED;
|
|
+#endif /* TMFL_TDA9981_SUPPORT */
|
|
+}
|
|
+
|
|
+/*============================================================================*/
|
|
+/* bslVideoInSetSyncAuto */
|
|
+/*============================================================================*/
|
|
+error_code_t
|
|
+bsl_video_in_set_sync_auto
|
|
+(
|
|
+ unit_select_t tx_unit,
|
|
+ bsl_sync_source_t sync_source,
|
|
+ bsl_vid_fmt_t vin_fmt,
|
|
+ bsl_vin_mode_t vin_mode
|
|
+)
|
|
+{
|
|
+ hdmi_txobject_t *p_dis; /* Pointer to Device Instance Structure */
|
|
+ error_code_t err; /* Error code */
|
|
+ u8 reg_vin_fmt; /* Video i/p fmt value used for comparison */
|
|
+ u8 embedded; /* Register value */
|
|
+ u8 sync_method; /* Sync method */
|
|
+ u8 toggle_v; /* V toggle */
|
|
+ u8 toggle_h; /* H toggle */
|
|
+ u8 toggle_x; /* X toggle */
|
|
+ u16 u_ref_pix; /* Output refpix */
|
|
+ u16 u_ref_line; /* Output refline */
|
|
+ bsl_vid_fmt_t vin_fmt_index; /* Index in tab kVfmtToRegvfmt_TV*/
|
|
+ u8 reg_vin_fmt_no_reg;
|
|
+ u8 reg_val;
|
|
+#ifdef FORMAT_PC
|
|
+ u8 reg_vin_fmt_pc;
|
|
+#endif /* FORMAT_PC */
|
|
+
|
|
+ /* Check unit parameter and point to TX unit object */
|
|
+ err = check_unit_set_dis(tx_unit, &p_dis);
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+ /* Check parameters - syncSource must be specified */
|
|
+ RETIF_BADPARAM(sync_source >= HDMITX_SYNCSRC_NO_CHANGE)
|
|
+
|
|
+#ifdef FORMAT_PC
|
|
+ RETIF_BADPARAM(vin_fmt < HDMITX_VFMT_TV_MIN)
|
|
+ RETIF_BADPARAM((vin_fmt > HDMITX_VFMT_TV_MAX) && (vin_fmt < HDMITX_VFMT_PC_MIN))
|
|
+ RETIF_BADPARAM(vin_fmt > HDMITX_VFMT_PC_MAX)
|
|
+#else /* FORMAT_PC */
|
|
+ /*FORMAT TV only*/
|
|
+ RETIF_BADPARAM(vin_fmt < HDMITX_VFMT_TV_MIN)
|
|
+ RETIF_BADPARAM(vin_fmt > HDMITX_VFMT_TV_MAX)
|
|
+#endif /* FORMAT_PC */
|
|
+
|
|
+ vin_fmt_index = vin_fmt;
|
|
+#ifdef FORMAT_PC
|
|
+ if(vin_fmt_index > HDMITX_VFMT_PC_MIN) {
|
|
+ vin_fmt_index = (bsl_vid_fmt_t)(vin_fmt_index - HDMITX_VFMT_PC_MIN + HDMITX_VFMT_TV_MAX + 1);
|
|
+ }
|
|
+#endif /* FORMAT_PC */
|
|
+
|
|
+ /* Look up the VIDFORMAT register format from the register format table */
|
|
+ reg_vin_fmt = k_vfmt_to_regvfmt_tv[vin_fmt_index];
|
|
+ /* Quit if the input format does not map to the register format */
|
|
+ RETIF_BADPARAM(reg_vin_fmt == E_REGVFMT_INVALID)
|
|
+
|
|
+ /* Select values according to sync source */
|
|
+ embedded = 0;
|
|
+ switch(sync_source) {
|
|
+ case HDMITX_SYNCSRC_EXT_VS:
|
|
+ sync_method = 0;
|
|
+ toggle_v = k_regvfmt_to_vtoggle[reg_vin_fmt];
|
|
+ toggle_h = k_regvfmt_to_htoggle[reg_vin_fmt];
|
|
+ toggle_x = 0;
|
|
+ u_ref_pix = k_vid_fmt_to_refpix_refline[reg_vin_fmt].ref_pix_vs_sync;
|
|
+ u_ref_line = k_vid_fmt_to_refpix_refline[reg_vin_fmt].ref_line_vs_sync;
|
|
+ break;
|
|
+ case HDMITX_SYNCSRC_EMBEDDED:
|
|
+ embedded++;
|
|
+ /* fall thru */
|
|
+ case HDMITX_SYNCSRC_EXT_VREF:
|
|
+ default:
|
|
+ sync_method = 1;
|
|
+ toggle_v = 1;
|
|
+ toggle_h = 1;
|
|
+ toggle_x = 1;
|
|
+ u_ref_pix = k_vid_fmt_to_refpix_refline[reg_vin_fmt].ref_pix_other_sync;
|
|
+ u_ref_line = k_vid_fmt_to_refpix_refline[reg_vin_fmt].ref_line_other_sync;
|
|
+ break;
|
|
+ }
|
|
+ /* Table has +1 added to refpix values which are not needed in
|
|
+ * RGB444, YUV444 and YUV422 modes, but +2 is required in those cases */
|
|
+ if(vin_mode != HDMITX_VINMODE_CCIR656) {
|
|
+ u_ref_pix = u_ref_pix + 2;
|
|
+ }
|
|
+
|
|
+ /* Set embedded sync */
|
|
+ err = set_hw_register_field(p_dis,
|
|
+ E_REG_P00_VIP_CNTRL_3_W,
|
|
+ e_maskreg_p00_vip_cntrl_3_emb,
|
|
+ embedded);
|
|
+ RETIF_REG_FAIL(err)
|
|
+
|
|
+ /* Set sync method */
|
|
+ err = set_hw_register_field(p_dis,
|
|
+ E_REG_P00_TBG_CNTRL_0_W,
|
|
+ e_maskreg_p00_tbg_cntrl_0_sync_mthd,
|
|
+ sync_method);
|
|
+ RETIF_REG_FAIL(err)
|
|
+
|
|
+ /* Set VH toggle */
|
|
+ err = set_hw_register_field(p_dis,
|
|
+ E_REG_P00_VIP_CNTRL_3_W,
|
|
+ e_maskreg_p00_vip_cntrl_3_v_tgl,
|
|
+ toggle_v);
|
|
+ RETIF_REG_FAIL(err)
|
|
+ err = set_hw_register_field(p_dis,
|
|
+ E_REG_P00_VIP_CNTRL_3_W,
|
|
+ e_maskreg_p00_vip_cntrl_3_h_tgl,
|
|
+ toggle_h);
|
|
+ RETIF_REG_FAIL(err)
|
|
+
|
|
+ /* Set X toggle */
|
|
+ err = set_hw_register_field(p_dis,
|
|
+ E_REG_P00_VIP_CNTRL_3_W,
|
|
+ e_maskreg_p00_vip_cntrl_3_x_tgl,
|
|
+ toggle_x);
|
|
+ RETIF_REG_FAIL(err)
|
|
+
|
|
+ if((vin_fmt >= HDMITX_VFMT_TV_NO_REG_MIN)
|
|
+ && (vin_fmt < HDMITX_VFMT_PC_MIN)) {
|
|
+ RETIF_BADPARAM(reg_vin_fmt > E_REGVFMT_NUM_TV)
|
|
+
|
|
+ /* Check parameters */
|
|
+ reg_vin_fmt_no_reg = (u8)(reg_vin_fmt - E_REGVFMT_FIRST_TV_NO_REG);
|
|
+
|
|
+ reg_val = (u8)k_vid_fmt_format_param[reg_vin_fmt_no_reg].n_pix;
|
|
+ err = set_hw_register(p_dis, E_REG_P00_NPIX_LSB_W, reg_val);
|
|
+ RETIF_REG_FAIL(err);
|
|
+
|
|
+ reg_val = (u8)(k_vid_fmt_format_param[reg_vin_fmt_no_reg].n_pix >> 8);
|
|
+ err = set_hw_register(p_dis, E_REG_P00_NPIX_MSB_W, reg_val);
|
|
+ RETIF_REG_FAIL(err);
|
|
+
|
|
+ reg_val = (u8)k_vid_fmt_format_param[reg_vin_fmt_no_reg].n_line;
|
|
+ err = set_hw_register(p_dis, E_REG_P00_NLINE_LSB_W, reg_val);
|
|
+ RETIF_REG_FAIL(err);
|
|
+
|
|
+ reg_val = (u8)(k_vid_fmt_format_param[reg_vin_fmt_no_reg].n_line >> 8);
|
|
+ err = set_hw_register(p_dis, E_REG_P00_NLINE_MSB_W, reg_val);
|
|
+ RETIF_REG_FAIL(err);
|
|
+
|
|
+ reg_val = (u8)k_vid_fmt_format_param[reg_vin_fmt_no_reg].vs_line_start;
|
|
+ err = set_hw_register(p_dis, E_REG_P00_VS_LINE_STRT_1_LSB_W, reg_val);
|
|
+ RETIF_REG_FAIL(err);
|
|
+
|
|
+ reg_val = (u8)k_vid_fmt_format_param[reg_vin_fmt_no_reg].vs_pix_start;
|
|
+ err = set_hw_register(p_dis, E_REG_P00_VS_PIX_STRT_1_LSB_W, reg_val);
|
|
+ RETIF_REG_FAIL(err);
|
|
+
|
|
+ reg_val = (u8)(k_vid_fmt_format_param[reg_vin_fmt_no_reg].vs_pix_start >> 8);
|
|
+ err = set_hw_register(p_dis, E_REG_P00_VS_PIX_STRT_1_MSB_W, reg_val);
|
|
+ RETIF_REG_FAIL(err);
|
|
+
|
|
+ reg_val = (u8)k_vid_fmt_format_param[reg_vin_fmt_no_reg].vs_line_end;
|
|
+ err = set_hw_register(p_dis, E_REG_P00_VS_LINE_END_1_LSB_W, reg_val);
|
|
+ RETIF_REG_FAIL(err);
|
|
+
|
|
+ reg_val = (u8)k_vid_fmt_format_param[reg_vin_fmt_no_reg].vs_pix_end;
|
|
+ err = set_hw_register(p_dis, E_REG_P00_VS_PIX_END_1_LSB_W, reg_val);
|
|
+ RETIF_REG_FAIL(err);
|
|
+
|
|
+ reg_val = (u8)(k_vid_fmt_format_param[reg_vin_fmt_no_reg].vs_pix_end >> 8);
|
|
+ err = set_hw_register(p_dis, E_REG_P00_VS_PIX_END_1_MSB_W, reg_val);
|
|
+ RETIF_REG_FAIL(err);
|
|
+
|
|
+ reg_val = (u8)k_vid_fmt_format_param[reg_vin_fmt_no_reg].hs_start;
|
|
+ err = set_hw_register(p_dis, E_REG_P00_HS_PIX_START_LSB_W, reg_val);
|
|
+ RETIF_REG_FAIL(err);
|
|
+
|
|
+ reg_val = (u8)(k_vid_fmt_format_param[reg_vin_fmt_no_reg].hs_start >> 8);
|
|
+ err = set_hw_register(p_dis, E_REG_P00_HS_PIX_START_MSB_W, reg_val);
|
|
+ RETIF_REG_FAIL(err);
|
|
+
|
|
+ reg_val = (u8)k_vid_fmt_format_param[reg_vin_fmt_no_reg].hs_end;
|
|
+ err = set_hw_register(p_dis, E_REG_P00_HS_PIX_STOP_LSB_W, reg_val);
|
|
+ RETIF_REG_FAIL(err);
|
|
+
|
|
+ reg_val = (u8)(k_vid_fmt_format_param[reg_vin_fmt_no_reg].hs_end >> 8);
|
|
+ err = set_hw_register(p_dis, E_REG_P00_HS_PIX_STOP_MSB_W, reg_val);
|
|
+ RETIF_REG_FAIL(err);
|
|
+
|
|
+ reg_val = (u8)k_vid_fmt_format_param[reg_vin_fmt_no_reg].v_win_start;
|
|
+ err = set_hw_register(p_dis, E_REG_P00_VWIN_START_1_LSB_W, reg_val);
|
|
+ RETIF_REG_FAIL(err);
|
|
+
|
|
+ reg_val = (u8)k_vid_fmt_format_param[reg_vin_fmt_no_reg].v_win_end;
|
|
+ err = set_hw_register(p_dis, E_REG_P00_VWIN_END_1_LSB_W, reg_val);
|
|
+ RETIF_REG_FAIL(err);
|
|
+
|
|
+ reg_val = (u8)(k_vid_fmt_format_param[reg_vin_fmt_no_reg].v_win_end >> 8);
|
|
+ err = set_hw_register(p_dis, E_REG_P00_VWIN_END_1_MSB_W, reg_val);
|
|
+ RETIF_REG_FAIL(err);
|
|
+
|
|
+ reg_val = (u8)k_vid_fmt_format_param[reg_vin_fmt_no_reg].de_start;
|
|
+ err = set_hw_register(p_dis, E_REG_P00_DE_START_LSB_W, reg_val);
|
|
+ RETIF_REG_FAIL(err);
|
|
+
|
|
+ reg_val = (u8)(k_vid_fmt_format_param[reg_vin_fmt_no_reg].de_start >> 8);
|
|
+ err = set_hw_register(p_dis, E_REG_P00_DE_START_MSB_W, reg_val);
|
|
+ RETIF_REG_FAIL(err);
|
|
+
|
|
+ reg_val = (u8)k_vid_fmt_format_param[reg_vin_fmt_no_reg].de_end;
|
|
+ err = set_hw_register(p_dis, E_REG_P00_DE_STOP_LSB_W, reg_val);
|
|
+ RETIF_REG_FAIL(err);
|
|
+
|
|
+ reg_val = (u8)(k_vid_fmt_format_param[reg_vin_fmt_no_reg].de_end >> 8);
|
|
+ err = set_hw_register(p_dis, E_REG_P00_DE_STOP_MSB_W, reg_val);
|
|
+ RETIF_REG_FAIL(err);
|
|
+ }
|
|
+
|
|
+#ifdef FORMAT_PC
|
|
+
|
|
+ if(vin_fmt > HDMITX_VFMT_PC_MIN) {
|
|
+
|
|
+ /* Check parameters */
|
|
+ RETIF_BADPARAM(reg_vin_fmt < E_REGVFMT_NUM_TV)
|
|
+
|
|
+ reg_vin_fmt_pc = (u8)(reg_vin_fmt - E_REGVFMT_FIRST_PC_FORMAT);
|
|
+
|
|
+ reg_val = (u8)k_vid_fmt_to_pcformat_param[reg_vin_fmt_pc].n_pix;
|
|
+ err = set_hw_register(p_dis, E_REG_P00_NPIX_LSB_W, reg_val);
|
|
+ RETIF_REG_FAIL(err);
|
|
+
|
|
+ reg_val = (u8)(k_vid_fmt_to_pcformat_param[reg_vin_fmt_pc].n_pix >> 8);
|
|
+ err = set_hw_register(p_dis, E_REG_P00_NPIX_MSB_W, reg_val);
|
|
+ RETIF_REG_FAIL(err);
|
|
+
|
|
+ reg_val = (u8)k_vid_fmt_to_pcformat_param[reg_vin_fmt_pc].n_line;
|
|
+ err = set_hw_register(p_dis, E_REG_P00_NLINE_LSB_W, reg_val);
|
|
+ RETIF_REG_FAIL(err);
|
|
+
|
|
+ reg_val = (u8)(k_vid_fmt_to_pcformat_param[reg_vin_fmt_pc].n_line >> 8);
|
|
+ err = set_hw_register(p_dis, E_REG_P00_NLINE_MSB_W, reg_val);
|
|
+ RETIF_REG_FAIL(err);
|
|
+
|
|
+ reg_val = (u8)k_vid_fmt_to_pcformat_param[reg_vin_fmt_pc].vs_line_start;
|
|
+ err = set_hw_register(p_dis, E_REG_P00_VS_LINE_STRT_1_LSB_W, reg_val);
|
|
+ RETIF_REG_FAIL(err);
|
|
+
|
|
+ reg_val = (u8)k_vid_fmt_to_pcformat_param[reg_vin_fmt_pc].vs_pix_start;
|
|
+ err = set_hw_register(p_dis, E_REG_P00_VS_PIX_STRT_1_LSB_W, reg_val);
|
|
+ RETIF_REG_FAIL(err);
|
|
+
|
|
+ reg_val = (u8)k_vid_fmt_to_pcformat_param[reg_vin_fmt_pc].vs_line_end;
|
|
+ err = set_hw_register(p_dis, E_REG_P00_VS_LINE_END_1_LSB_W, reg_val);
|
|
+ RETIF_REG_FAIL(err);
|
|
+
|
|
+ reg_val = (u8)k_vid_fmt_to_pcformat_param[reg_vin_fmt_pc].vs_pix_end;
|
|
+ err = set_hw_register(p_dis, E_REG_P00_VS_PIX_END_1_LSB_W, reg_val);
|
|
+ RETIF_REG_FAIL(err);
|
|
+
|
|
+ reg_val = (u8)k_vid_fmt_to_pcformat_param[reg_vin_fmt_pc].hs_start;
|
|
+ err = set_hw_register(p_dis, E_REG_P00_HS_PIX_START_LSB_W, reg_val);
|
|
+ RETIF_REG_FAIL(err);
|
|
+
|
|
+ reg_val = (u8)k_vid_fmt_to_pcformat_param[reg_vin_fmt_pc].hs_end;
|
|
+ err = set_hw_register(p_dis, E_REG_P00_HS_PIX_STOP_LSB_W, reg_val);
|
|
+ RETIF_REG_FAIL(err);
|
|
+
|
|
+ reg_val = (u8)(k_vid_fmt_to_pcformat_param[reg_vin_fmt_pc].hs_end >> 8);
|
|
+ err = set_hw_register(p_dis, E_REG_P00_HS_PIX_STOP_MSB_W, reg_val);
|
|
+ RETIF_REG_FAIL(err);
|
|
+
|
|
+ reg_val = (u8)k_vid_fmt_to_pcformat_param[reg_vin_fmt_pc].v_win_start;
|
|
+ err = set_hw_register(p_dis, E_REG_P00_VWIN_START_1_LSB_W, reg_val);
|
|
+ RETIF_REG_FAIL(err);
|
|
+
|
|
+ reg_val = (u8)k_vid_fmt_to_pcformat_param[reg_vin_fmt_pc].v_win_end;
|
|
+ err = set_hw_register(p_dis, E_REG_P00_VWIN_END_1_LSB_W, reg_val);
|
|
+ RETIF_REG_FAIL(err);
|
|
+
|
|
+ reg_val = (u8)(k_vid_fmt_to_pcformat_param[reg_vin_fmt_pc].v_win_end >> 8);
|
|
+ err = set_hw_register(p_dis, E_REG_P00_VWIN_END_1_MSB_W, reg_val);
|
|
+ RETIF_REG_FAIL(err);
|
|
+
|
|
+ reg_val = (u8)k_vid_fmt_to_pcformat_param[reg_vin_fmt_pc].de_start;
|
|
+ err = set_hw_register(p_dis, E_REG_P00_DE_START_LSB_W, reg_val);
|
|
+ RETIF_REG_FAIL(err);
|
|
+
|
|
+ reg_val = (u8)(k_vid_fmt_to_pcformat_param[reg_vin_fmt_pc].de_start >> 8);
|
|
+ err = set_hw_register(p_dis, E_REG_P00_DE_START_MSB_W, reg_val);
|
|
+ RETIF_REG_FAIL(err);
|
|
+
|
|
+ reg_val = (u8)k_vid_fmt_to_pcformat_param[reg_vin_fmt_pc].de_end;
|
|
+ err = set_hw_register(p_dis, E_REG_P00_DE_STOP_LSB_W, reg_val);
|
|
+ RETIF_REG_FAIL(err);
|
|
+
|
|
+ reg_val = (u8)(k_vid_fmt_to_pcformat_param[reg_vin_fmt_pc].de_end >> 8);
|
|
+ err = set_hw_register(p_dis, E_REG_P00_DE_STOP_MSB_W, reg_val);
|
|
+ RETIF_REG_FAIL(err);
|
|
+
|
|
+ reg_val = DEPTH_COLOR_PC;
|
|
+ err = set_hw_register_field(p_dis,
|
|
+ E_REG_P00_HVF_CNTRL_1_W,
|
|
+ e_maskreg_p00_hvf_cntrl_1_pad,
|
|
+ reg_val);
|
|
+
|
|
+ RETIF_REG_FAIL(err);
|
|
+ }
|
|
+#endif /* FORMAT_PC */
|
|
+
|
|
+ /* Set refpix, refline */
|
|
+ /* tweak for gplugD */
|
|
+ u_ref_pix = 0x99;
|
|
+ u_ref_line = 0x07;
|
|
+ err = set_hw_register_msb_lsb(p_dis, E_REG_P00_REFPIX_MSB_W, u_ref_pix);
|
|
+ RETIF_REG_FAIL(err)
|
|
+ err = set_hw_register_msb_lsb(p_dis, E_REG_P00_REFLINE_MSB_W, u_ref_line);
|
|
+ return err;
|
|
+}
|
|
+
|
|
+/*============================================================================*/
|
|
+/* bslVideoInSetSyncManual */
|
|
+/*============================================================================*/
|
|
+
|
|
+error_code_t
|
|
+bsl_video_in_set_sync_manual
|
|
+(
|
|
+ unit_select_t tx_unit,
|
|
+ bsl_sync_source_t sync_source,
|
|
+ bsl_vs_meth_t sync_method,
|
|
+ bsl_pix_togl_t toggle_v,
|
|
+ bsl_pix_togl_t toggle_h,
|
|
+ bsl_pix_togl_t toggle_x,
|
|
+ u16 u_ref_pix,
|
|
+ u16 u_ref_line
|
|
+)
|
|
+{
|
|
+ hdmi_txobject_t *p_dis; /* Pointer to Device Instance Structure */
|
|
+ error_code_t err; /* Error code */
|
|
+ u8 embedded; /* Register value */
|
|
+
|
|
+ /* Check unit parameter and point to TX unit object */
|
|
+ err = check_unit_set_dis(tx_unit, &p_dis);
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+ /* Check parameters */
|
|
+ RETIF_BADPARAM(sync_source >= HDMITX_SYNCSRC_INVALID)
|
|
+ RETIF_BADPARAM(sync_method >= HDMITX_VSMETH_INVALID)
|
|
+ RETIF_BADPARAM(toggle_v >= HDMITX_PIXTOGL_INVALID)
|
|
+ RETIF_BADPARAM(toggle_h >= HDMITX_PIXTOGL_INVALID)
|
|
+ RETIF_BADPARAM(toggle_x >= HDMITX_PIXTOGL_INVALID)
|
|
+ RETIF_BADPARAM(u_ref_pix >= HDMITX_VOUT_FINE_PIXEL_INVALID)
|
|
+ RETIF_BADPARAM(u_ref_line >= HDMITX_VOUT_FINE_LINE_INVALID)
|
|
+
|
|
+ if(sync_source != HDMITX_SYNCSRC_NO_CHANGE) {
|
|
+ if(sync_source == HDMITX_SYNCSRC_EMBEDDED) {
|
|
+ embedded = 1;
|
|
+ } else {
|
|
+ embedded = 0;
|
|
+ }
|
|
+ err = set_hw_register_field(p_dis,
|
|
+ E_REG_P00_VIP_CNTRL_3_W,
|
|
+ e_maskreg_p00_vip_cntrl_3_emb,
|
|
+ embedded);
|
|
+ RETIF_REG_FAIL(err)
|
|
+ }
|
|
+ if(sync_method != HDMITX_VSMETH_NO_CHANGE) {
|
|
+ err = set_hw_register_field(p_dis,
|
|
+ E_REG_P00_TBG_CNTRL_0_W,
|
|
+ e_maskreg_p00_tbg_cntrl_0_sync_mthd,
|
|
+ (u8)sync_method);
|
|
+ RETIF_REG_FAIL(err)
|
|
+ }
|
|
+ if(toggle_v != HDMITX_PIXTOGL_NO_CHANGE) {
|
|
+ err = set_hw_register_field(p_dis,
|
|
+ E_REG_P00_VIP_CNTRL_3_W,
|
|
+ e_maskreg_p00_vip_cntrl_3_v_tgl,
|
|
+ (u8)toggle_v);
|
|
+ RETIF_REG_FAIL(err)
|
|
+ }
|
|
+ if(toggle_h != HDMITX_PIXTOGL_NO_CHANGE) {
|
|
+ err = set_hw_register_field(p_dis,
|
|
+ E_REG_P00_VIP_CNTRL_3_W,
|
|
+ e_maskreg_p00_vip_cntrl_3_h_tgl,
|
|
+ (u8)toggle_h);
|
|
+ RETIF_REG_FAIL(err)
|
|
+ }
|
|
+ if(toggle_x != HDMITX_PIXTOGL_NO_CHANGE) {
|
|
+ err = set_hw_register_field(p_dis,
|
|
+ E_REG_P00_VIP_CNTRL_3_W,
|
|
+ e_maskreg_p00_vip_cntrl_3_x_tgl,
|
|
+ (u8)toggle_x);
|
|
+ RETIF_REG_FAIL(err)
|
|
+ }
|
|
+ if(u_ref_pix < HDMITX_VOUT_FINE_PIXEL_NO_CHANGE) {
|
|
+ err = set_hw_register_msb_lsb(p_dis, E_REG_P00_REFPIX_MSB_W, u_ref_pix);
|
|
+ RETIF_REG_FAIL(err)
|
|
+ }
|
|
+ if(u_ref_line < HDMITX_VOUT_FINE_LINE_NO_CHANGE) {
|
|
+ err = set_hw_register_msb_lsb(p_dis, E_REG_P00_REFLINE_MSB_W, u_ref_line);
|
|
+ RETIF_REG_FAIL(err)
|
|
+ }
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+/*============================================================================*/
|
|
+/* bslVideoOutDisable */
|
|
+/*============================================================================*/
|
|
+#ifndef DEMO_BUILD
|
|
+error_code_t
|
|
+bsl_video_out_disable
|
|
+(
|
|
+ unit_select_t tx_unit,
|
|
+ bool b_disable
|
|
+)
|
|
+{
|
|
+ hdmi_txobject_t *p_dis; /* Pointer to Device Instance Structure */
|
|
+ error_code_t err; /* Error code */
|
|
+
|
|
+ /* Check unit parameter and point to TX unit object */
|
|
+ err = check_unit_set_dis(tx_unit, &p_dis);
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+ /* Check parameters */
|
|
+ RETIF_BADPARAM(b_disable > true)
|
|
+
|
|
+ /* Set or clear frame_dis in the scaler Timebase Control 0 register
|
|
+ * according to bDisable
|
|
+ * */
|
|
+ err = set_hw_register_field(p_dis,
|
|
+ E_REG_P00_TBG_CNTRL_0_W,
|
|
+ e_maskreg_p00_tbg_cntrl_0_frame_dis,
|
|
+ (u8)b_disable);
|
|
+ if(b_disable) {
|
|
+ set_state(p_dis, EV_OUTDISABLE);
|
|
+ }
|
|
+ return err;
|
|
+}
|
|
+#endif /* DEMO_BUILD */
|
|
+
|
|
+/*============================================================================*/
|
|
+/* bslVideoOutSetConfig */
|
|
+/*============================================================================*/
|
|
+error_code_t
|
|
+bsl_video_out_set_config
|
|
+(
|
|
+ unit_select_t tx_unit,
|
|
+ bsl_sink_type_t sink_type,
|
|
+ bsl_vout_mode_t vout_mode,
|
|
+ bsl_vout_prefil_t pre_filter,
|
|
+ bsl_vout_yuv_blnk_t yuv_blank,
|
|
+ bsl_vout_qrange_t quantization
|
|
+)
|
|
+{
|
|
+ hdmi_txobject_t *p_dis; /* Pointer to Device Instance Structure */
|
|
+ error_code_t err; /* Error code */
|
|
+ u8 reg_val; /* Register value */
|
|
+
|
|
+ /* Check unit parameter and point to TX unit object */
|
|
+ err = check_unit_set_dis(tx_unit, &p_dis);
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+ /* Check parameters */
|
|
+ RETIF_BADPARAM(sink_type >= HDMITX_SINK_INVALID)
|
|
+ RETIF_BADPARAM(vout_mode >= HDMITX_VOUTMODE_INVALID)
|
|
+ RETIF_BADPARAM(pre_filter >= HDMITX_VOUT_PREFIL_INVALID)
|
|
+ RETIF_BADPARAM(yuv_blank >= HDMITX_VOUT_YUV_BLNK_INVALID)
|
|
+ RETIF_BADPARAM(quantization >= HDMITX_VOUT_QRANGE_INVALID)
|
|
+
|
|
+ (void)DUMMY_ACCESS(quantization);
|
|
+
|
|
+ if(sink_type == HDMITX_SINK_EDID) {
|
|
+ if(p_dis->edid_status == HDMITX_EDID_NOT_READ) {
|
|
+ /* EDID has not been read so assume simplest sink */
|
|
+ p_dis->sink_type = HDMITX_SINK_DVI;
|
|
+ } else {
|
|
+ /* EDID has been read so set sink to the type that was read */
|
|
+ p_dis->sink_type = p_dis->edid_sink_type;
|
|
+ }
|
|
+ } else {
|
|
+ /* Set demanded sink type */
|
|
+ p_dis->sink_type = sink_type;
|
|
+ }
|
|
+
|
|
+ /* Is DVI sink required? */
|
|
+ if(p_dis->sink_type == HDMITX_SINK_DVI) {
|
|
+ /* Mute the audio FIFO */
|
|
+ err = set_hw_register_field(p_dis,
|
|
+ E_REG_P11_AIP_CNTRL_0_RW,
|
|
+ e_maskreg_p11_aip_cntrl_0_rst_fifo,
|
|
+ 1);
|
|
+ RETIF_REG_FAIL(err)
|
|
+
|
|
+ /* Force RGB mode for DVI sink */
|
|
+ vout_mode = HDMITX_VOUTMODE_RGB444;
|
|
+
|
|
+ /* Set HDMI HDCP mode off for DVI */
|
|
+ err = set_hw_register_field_table(p_dis, &k_vout_hdcp_off[0]);
|
|
+ RETIF_REG_FAIL(err)
|
|
+
|
|
+ reg_val = 0;
|
|
+ err = set_hw_register_field(p_dis,
|
|
+ E_REG_P11_ENC_CNTRL_RW,
|
|
+ e_maskreg_p11_enc_cntrl_ctl_code,
|
|
+ reg_val);
|
|
+ RETIF_REG_FAIL(err)
|
|
+ } else {
|
|
+ /* Unmute the audio FIFO */
|
|
+ err = set_hw_register_field(p_dis,
|
|
+ E_REG_P11_AIP_CNTRL_0_RW,
|
|
+ e_maskreg_p11_aip_cntrl_0_rst_fifo,
|
|
+ 0);
|
|
+ RETIF_REG_FAIL(err)
|
|
+
|
|
+ /* Set HDMI HDCP mode on for HDMI */
|
|
+ /* Also sets E_MASKREG_P11_ENC_CNTRL_ctl_code */
|
|
+ err = set_hw_register_field_table(p_dis, &k_vout_hdcp_on[0]);
|
|
+ RETIF_REG_FAIL(err)
|
|
+ }
|
|
+
|
|
+ /* For each parameter that is not No Change, set its register */
|
|
+ if(vout_mode != HDMITX_VOUTMODE_NO_CHANGE) {
|
|
+ /* Save the output mode for later use by the matrix & downsampler */
|
|
+ p_dis->vout_mode = vout_mode;
|
|
+ }
|
|
+ if(pre_filter < HDMITX_VOUT_PREFIL_NO_CHANGE) {
|
|
+ err = set_hw_register_field(p_dis,
|
|
+ E_REG_P00_HVF_CNTRL_0_W,
|
|
+ e_maskreg_p00_hvf_cntrl_0_prefil,
|
|
+ (u8)pre_filter);
|
|
+ RETIF_REG_FAIL(err)
|
|
+ }
|
|
+ if(yuv_blank < HDMITX_VOUT_YUV_BLNK_NO_CHANGE) {
|
|
+ err = set_hw_register_field(p_dis,
|
|
+ E_REG_P00_HVF_CNTRL_1_W,
|
|
+ e_maskreg_p00_hvf_cntrl_1_yuvblk,
|
|
+ (u8)yuv_blank);
|
|
+ RETIF_REG_FAIL(err)
|
|
+ }
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+/*============================================================================*/
|
|
+/* bslVideoOutSetSync */
|
|
+/*============================================================================*/
|
|
+error_code_t
|
|
+bsl_video_out_set_sync
|
|
+(
|
|
+ unit_select_t tx_unit,
|
|
+ bsl_vs_src_t src_h,
|
|
+ bsl_vs_src_t src_v,
|
|
+ bsl_vs_src_t src_x,
|
|
+ bsl_vs_tgl_t toggle,
|
|
+ bsl_vs_once_t once
|
|
+)
|
|
+{
|
|
+ hdmi_txobject_t *p_dis; /* Pointer to Device Instance Structure */
|
|
+ error_code_t err; /* Error code */
|
|
+
|
|
+ /* Check unit parameter and point to TX unit object */
|
|
+ err = check_unit_set_dis(tx_unit, &p_dis);
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+ /* Check parameters */
|
|
+ RETIF_BADPARAM(src_h >= HDMITX_VSSRC_INVALID)
|
|
+ RETIF_BADPARAM(src_v >= HDMITX_VSSRC_INVALID)
|
|
+ RETIF_BADPARAM(src_x >= HDMITX_VSSRC_INVALID)
|
|
+ RETIF_BADPARAM(toggle >= HDMITX_VSTGL_INVALID)
|
|
+ RETIF_BADPARAM(once >= HDMITX_VSONCE_INVALID)
|
|
+
|
|
+ /* For each parameter that is not No Change, set its register */
|
|
+ if(src_h != HDMITX_VSSRC_NO_CHANGE) {
|
|
+ err = set_hw_register_field(p_dis,
|
|
+ E_REG_P00_TBG_CNTRL_1_W,
|
|
+ e_maskreg_p00_tbg_cntrl_1_vhx_ext_hs,
|
|
+ (u8)src_h);
|
|
+ RETIF_REG_FAIL(err)
|
|
+ }
|
|
+ if(src_v != HDMITX_VSSRC_NO_CHANGE) {
|
|
+ err = set_hw_register_field(p_dis,
|
|
+ E_REG_P00_TBG_CNTRL_1_W,
|
|
+ e_maskreg_p00_tbg_cntrl_1_vhx_ext_vs,
|
|
+ (u8)src_v);
|
|
+ RETIF_REG_FAIL(err)
|
|
+ }
|
|
+ if(src_x != HDMITX_VSSRC_NO_CHANGE) {
|
|
+ err = set_hw_register_field(p_dis,
|
|
+ E_REG_P00_TBG_CNTRL_1_W,
|
|
+ e_maskreg_p00_tbg_cntrl_1_vhx_ext_de,
|
|
+ (u8)src_x);
|
|
+ RETIF_REG_FAIL(err)
|
|
+ }
|
|
+ if(toggle != HDMITX_VSTGL_NO_CHANGE) {
|
|
+ err = set_hw_register_field(p_dis,
|
|
+ E_REG_P00_TBG_CNTRL_1_W,
|
|
+ e_maskreg_p00_tbg_cntrl_1_vh_tgl,
|
|
+ (u8)toggle);
|
|
+ RETIF_REG_FAIL(err)
|
|
+ }
|
|
+ if(once != HDMITX_VSONCE_NO_CHANGE) {
|
|
+ /* Must be last register set */
|
|
+ err = set_hw_register_field(p_dis,
|
|
+ E_REG_P00_TBG_CNTRL_0_W,
|
|
+ e_maskreg_p00_tbg_cntrl_0_sync_once,
|
|
+ (u8)once);
|
|
+ RETIF_REG_FAIL(err)
|
|
+ }
|
|
+
|
|
+ /* Toggle TMDS serialiser force flags - stability fix */
|
|
+ err = set_hw_register_field(p_dis,
|
|
+ E_REG_P02_BUFFER_OUT_RW,
|
|
+ e_maskreg_p02_buffer_out_srl_force,
|
|
+ (u8)HDMITX_TMDSOUT_FORCED0);
|
|
+ RETIF_REG_FAIL(err)
|
|
+ err = set_hw_register_field(p_dis,
|
|
+ E_REG_P02_BUFFER_OUT_RW,
|
|
+ e_maskreg_p02_buffer_out_srl_force,
|
|
+ (u8)HDMITX_TMDSOUT_NORMAL);
|
|
+ RETIF_REG_FAIL(err)
|
|
+
|
|
+ if(once == HDMITX_VSONCE_ONCE) {
|
|
+ /* Toggle output Sync Once flag for settings to take effect */
|
|
+ err = set_hw_register_field(p_dis,
|
|
+ E_REG_P00_TBG_CNTRL_0_W,
|
|
+ e_maskreg_p00_tbg_cntrl_0_sync_once,
|
|
+ (u8)HDMITX_VSONCE_EACH_FRAME);
|
|
+ RETIF_REG_FAIL(err)
|
|
+ err = set_hw_register_field(p_dis,
|
|
+ E_REG_P00_TBG_CNTRL_0_W,
|
|
+ e_maskreg_p00_tbg_cntrl_0_sync_once,
|
|
+ (u8)HDMITX_VSONCE_ONCE);
|
|
+ RETIF_REG_FAIL(err)
|
|
+ }
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+/*============================================================================*/
|
|
+/* bslVideoSetInOut */
|
|
+/*============================================================================*/
|
|
+error_code_t
|
|
+bsl_video_set_in_out
|
|
+(
|
|
+ unit_select_t tx_unit,
|
|
+ bsl_vid_fmt_t vin_fmt,
|
|
+ bsl_sca_mode_t sca_mode_request,
|
|
+ bsl_vid_fmt_t vout_fmt,
|
|
+ u8 u_pixel_repeat,
|
|
+ bsl_mat_mode_t mat_mode,
|
|
+ bsl_vout_dbits_t datapath_bits,
|
|
+ bsl_vqr_t dvi_vqr
|
|
+)
|
|
+{
|
|
+ /* Pointer to Device Instance Structure */
|
|
+ hdmi_txobject_t *p_dis;
|
|
+ error_code_t err; /* Error code */
|
|
+ bsl_vid_fmt_t sca_in_fmt; /* Scaler input format */
|
|
+ bsl_vid_fmt_t sca_out_fmt; /* Scaler output format */
|
|
+ bsl_sca_mode_t sca_mode; /* Scaler mode */
|
|
+
|
|
+ /* Check unit parameter and point to TX unit object */
|
|
+ err = check_unit_set_dis(tx_unit, &p_dis);
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+ /* Check parameters */
|
|
+#ifdef FORMAT_PC
|
|
+ RETIF_BADPARAM(vin_fmt < HDMITX_VFMT_TV_MIN)
|
|
+ RETIF_BADPARAM(vout_fmt < HDMITX_VFMT_TV_MIN)
|
|
+ RETIF_BADPARAM((vin_fmt > HDMITX_VFMT_TV_MAX) && (vin_fmt < HDMITX_VFMT_PC_MIN))
|
|
+ RETIF_BADPARAM((vout_fmt > HDMITX_VFMT_TV_MAX) && (vout_fmt < HDMITX_VFMT_PC_MIN))
|
|
+ RETIF_BADPARAM(vin_fmt > HDMITX_VFMT_PC_MAX)
|
|
+ RETIF_BADPARAM(vout_fmt > HDMITX_VFMT_PC_MAX)
|
|
+#else /* FORMAT_PC */
|
|
+ /*FORMAT TV only*/
|
|
+ RETIF_BADPARAM(vin_fmt < HDMITX_VFMT_TV_MIN)
|
|
+ RETIF_BADPARAM(vout_fmt < HDMITX_VFMT_TV_MIN)
|
|
+ RETIF_BADPARAM(vin_fmt > HDMITX_VFMT_TV_MAX)
|
|
+ RETIF_BADPARAM(vout_fmt > HDMITX_VFMT_TV_MAX)
|
|
+#endif /* FORMAT_PC */
|
|
+
|
|
+ RETIF_BADPARAM(sca_mode_request >= HDMITX_SCAMODE_INVALID)
|
|
+ RETIF_BADPARAM(u_pixel_repeat >= HDMITX_PIXREP_INVALID)
|
|
+ RETIF_BADPARAM(mat_mode >= HDMITX_MATMODE_INVALID)
|
|
+ RETIF_BADPARAM(datapath_bits >= HDMITX_VOUT_DBITS_INVALID)
|
|
+
|
|
+ sca_mode = sca_mode_request;
|
|
+
|
|
+#ifdef TMFL_TDA9981_SUPPORT
|
|
+ sca_mode = HDMITX_SCAMODE_OFF;
|
|
+#else /* TMFL_TDA9981_SUPPORT */
|
|
+ if(vout_fmt >= HDMITX_VFMT_TV_NO_REG_MIN) {
|
|
+ /* Disable Scaler mode for PC_FORMAT and for 24/25/30Hz formats */
|
|
+ sca_mode = HDMITX_SCAMODE_OFF;
|
|
+ }
|
|
+#endif /* TMFL_TDA9981_SUPPORT */
|
|
+
|
|
+ /* Get current input format if it must not change */
|
|
+ if(vin_fmt == HDMITX_VFMT_NO_CHANGE) {
|
|
+ RETIF(p_dis->vin_fmt == HDMITX_VFMT_NULL,
|
|
+ ERR_HDMI_INCONSISTENT_PARAMS)
|
|
+ vin_fmt = p_dis->vin_fmt;
|
|
+ } else {
|
|
+ p_dis->vin_fmt = vin_fmt;
|
|
+ }
|
|
+
|
|
+ /* Get current output format if it must not change */
|
|
+ if(vout_fmt == HDMITX_VFMT_NO_CHANGE) {
|
|
+ RETIF(p_dis->vout_fmt == HDMITX_VFMT_NULL,
|
|
+ ERR_HDMI_INCONSISTENT_PARAMS)
|
|
+ vout_fmt = p_dis->vout_fmt;
|
|
+ } else {
|
|
+ p_dis->vout_fmt = vout_fmt;
|
|
+ }
|
|
+ /* Force RGB mode for VGA output format */
|
|
+ if(vout_fmt == HDMITX_VFMT_TV_MIN) {
|
|
+ p_dis->vout_mode = HDMITX_VOUTMODE_RGB444;
|
|
+ }
|
|
+
|
|
+ if(p_dis->vout_mode == HDMITX_VOUTMODE_RGB444) {
|
|
+ if((p_dis->vout_fmt >= hdmitx_vfmt_02_720x480p_60hz) && (p_dis->vout_fmt <= HDMITX_VFMT_TV_MAX)) {
|
|
+ err = set_hw_register_field(p_dis,
|
|
+ E_REG_P00_HVF_CNTRL_1_W,
|
|
+ e_maskreg_p00_hvf_cntrl_1_vqr,
|
|
+ (u8) HDMITX_VOUT_QRANGE_RGB_YUV);
|
|
+ RETIF_REG_FAIL(err)
|
|
+ } else { /*Format PC or VGA*/
|
|
+ err = set_hw_register_field(p_dis,
|
|
+ E_REG_P00_HVF_CNTRL_1_W,
|
|
+ e_maskreg_p00_hvf_cntrl_1_vqr,
|
|
+ (u8) HDMITX_VOUT_QRANGE_FS);
|
|
+ RETIF_REG_FAIL(err)
|
|
+ }
|
|
+ } else {
|
|
+ err = set_hw_register_field(p_dis,
|
|
+ E_REG_P00_HVF_CNTRL_1_W,
|
|
+ e_maskreg_p00_hvf_cntrl_1_vqr,
|
|
+ (u8) HDMITX_VOUT_QRANGE_YUV);
|
|
+ RETIF_REG_FAIL(err)
|
|
+ }
|
|
+
|
|
+ /* If scaler mode is auto then set mode based on input and output format */
|
|
+ if(sca_mode != HDMITX_SCAMODE_NO_CHANGE) {
|
|
+ if(sca_mode == HDMITX_SCAMODE_AUTO) {
|
|
+ /* If both formats map to the same device output format then
|
|
+ * the scaler can be switched off */
|
|
+ if(k_vfmt_to_regvfmt_tv[vout_fmt] == k_vfmt_to_regvfmt_tv[vin_fmt]) {
|
|
+ sca_mode = HDMITX_SCAMODE_OFF;
|
|
+ } else {
|
|
+ sca_mode = HDMITX_SCAMODE_ON;
|
|
+ }
|
|
+ }
|
|
+ sca_in_fmt = vin_fmt;
|
|
+ if(sca_mode == HDMITX_SCAMODE_ON) {
|
|
+ sca_out_fmt = vout_fmt;
|
|
+ } else {
|
|
+ sca_out_fmt = vin_fmt;
|
|
+ }
|
|
+ err = set_scaler_format(p_dis, sca_in_fmt, sca_out_fmt, u_pixel_repeat);
|
|
+ RETIF(err != 0, err)
|
|
+ } else {
|
|
+ /* Set pixel repetition - sets pixelRepeatCount, used by setScalerFormat */
|
|
+ err = set_pixel_repeat(p_dis, vout_fmt, u_pixel_repeat);
|
|
+ RETIF(err != 0, err)
|
|
+ }
|
|
+
|
|
+ /* Set VS and optional DE */
|
|
+ err = set_de_vs(p_dis, vout_fmt);
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+ /* If matrix mode is auto then set mode based on input and output format */
|
|
+ if(mat_mode != HDMITX_MATMODE_NO_CHANGE) {
|
|
+ if(mat_mode == HDMITX_MATMODE_AUTO) {
|
|
+ err = bsl_matrix_set_conversion(tx_unit, vin_fmt,
|
|
+ p_dis->vin_mode, vout_fmt, p_dis->vout_mode, p_dis->dvi_vqr);
|
|
+ } else {
|
|
+ err = bsl_matrix_set_mode(tx_unit, HDMITX_MCNTRL_OFF,
|
|
+ HDMITX_MSCALE_NO_CHANGE);
|
|
+ }
|
|
+ RETIF(err != 0, err)
|
|
+ }
|
|
+
|
|
+ /* Set upsampler and downsampler */
|
|
+ err = set_sampling(p_dis);
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+ /* Set colour component bit depth */
|
|
+ if(datapath_bits != HDMITX_VOUT_DBITS_NO_CHANGE) {
|
|
+ err = set_hw_register_field(p_dis,
|
|
+ E_REG_P00_HVF_CNTRL_1_W,
|
|
+ e_maskreg_p00_hvf_cntrl_1_pad,
|
|
+ (u8)datapath_bits);
|
|
+ RETIF_REG_FAIL(err)
|
|
+ }
|
|
+
|
|
+ /* Save kBypassColourProc registers before pattern goes on */
|
|
+ get_hw_register(p_dis, E_REG_P00_MAT_CONTRL_W, &g_mat_contrl[tx_unit]);
|
|
+ get_hw_register(p_dis, E_REG_P00_HVF_CNTRL_0_W, &g_hvf_cntrl0[tx_unit]);
|
|
+ get_hw_register(p_dis, E_REG_P00_HVF_CNTRL_1_W, &g_hvf_cntrl1[tx_unit]);
|
|
+
|
|
+ set_state(p_dis, EV_SETINOUT);
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+/*============================================================================*/
|
|
+/* STATIC FUNCTION DEFINTIONS */
|
|
+/*============================================================================*/
|
|
+
|
|
+/*============================================================================*/
|
|
+/* setDeVs */
|
|
+/*============================================================================*/
|
|
+static error_code_t
|
|
+set_de_vs
|
|
+(
|
|
+ hdmi_txobject_t *p_dis,
|
|
+ bsl_vid_fmt_t vout_fmt
|
|
+)
|
|
+{
|
|
+ error_code_t err; /* Error code */
|
|
+ u16 vs_pix_strt2; /* VS pixel number for start pulse in field 2 */
|
|
+ u8 reg_vfmt; /* Video format value used for register */
|
|
+ bsl_vid_fmt_t vout_fmt_index; /* Index in tab kVfmtToRegvfmt_TV*/
|
|
+
|
|
+ /* Parameters already checked by caller */
|
|
+
|
|
+ /* IF voutFmt = No Change THEN return 0 */
|
|
+ RETIF(vout_fmt == HDMITX_VFMT_NO_CHANGE, 0)
|
|
+
|
|
+ vout_fmt_index = vout_fmt;
|
|
+#ifdef FORMAT_PC
|
|
+ if(vout_fmt_index > HDMITX_VFMT_PC_MIN) {
|
|
+ vout_fmt_index = (bsl_vid_fmt_t)(vout_fmt_index - HDMITX_VFMT_PC_MIN + HDMITX_VFMT_TV_MAX + 1);
|
|
+ }
|
|
+#endif /* FORMAT_PC */
|
|
+
|
|
+ /* Quit if the output format does not map to the register format */
|
|
+ reg_vfmt = k_vfmt_to_regvfmt_tv[vout_fmt_index];
|
|
+ RETIF_BADPARAM(reg_vfmt == E_REGVFMT_INVALID)
|
|
+
|
|
+ /* DE_START & DE_STOP no longer set because N2 device no longer supported */
|
|
+
|
|
+ /* Adjust VS_PIX_STRT_2 and VS_PIX_END_2 for interlaced output formats */
|
|
+ vs_pix_strt2 = k_regvfmt_to_vs2[reg_vfmt];
|
|
+ err = set_hw_register_msb_lsb(p_dis, E_REG_P00_VS_PIX_STRT_2_MSB_W, vs_pix_strt2);
|
|
+ RETIF_REG_FAIL(err)
|
|
+ err = set_hw_register_msb_lsb(p_dis, E_REG_P00_VS_PIX_END_2_MSB_W, vs_pix_strt2);
|
|
+
|
|
+ return err;
|
|
+}
|
|
+
|
|
+/*============================================================================*/
|
|
+/* setPixelRepeat */
|
|
+/*============================================================================*/
|
|
+static error_code_t
|
|
+set_pixel_repeat
|
|
+(
|
|
+ hdmi_txobject_t *p_dis,
|
|
+ bsl_vid_fmt_t vout_fmt,
|
|
+ u8 u_pixel_repeat
|
|
+)
|
|
+{
|
|
+ error_code_t err = 0; /* Error code */
|
|
+ u8 reg_vfmt; /* Video format value used for register */
|
|
+ u8 ssd; /* Packed srl, scg and de */
|
|
+ bsl_vid_fmt_t vout_fmt_index; /* Index in tab kVfmtToRegvfmt_TV*/
|
|
+ /* Pointer on a tab of kRegvfmtToPllSsd*/
|
|
+ u8 *tab_setting_pll_ssd = NULL;
|
|
+ /* true if TV_FORMAT with internal chip confiration found (default) */
|
|
+ bool b_is_tv_format;
|
|
+
|
|
+ b_is_tv_format = true;
|
|
+
|
|
+ /* IF voutFmt = No Change THEN return 0 */
|
|
+ RETIF(vout_fmt == HDMITX_VFMT_NO_CHANGE, 0)
|
|
+
|
|
+ vout_fmt_index = vout_fmt;
|
|
+#ifdef FORMAT_PC
|
|
+ if(vout_fmt_index > HDMITX_VFMT_PC_MIN) {
|
|
+ vout_fmt_index = (bsl_vid_fmt_t)(vout_fmt_index - HDMITX_VFMT_PC_MIN + HDMITX_VFMT_TV_MAX + 1);
|
|
+ b_is_tv_format = false; /* PC_FORMAT found */
|
|
+ }
|
|
+#endif /* FORMAT_PC */
|
|
+
|
|
+ /* Quit if the output format does not map to the register format */
|
|
+ reg_vfmt = k_vfmt_to_regvfmt_tv[vout_fmt_index];
|
|
+ RETIF_BADPARAM(reg_vfmt == E_REGVFMT_INVALID)
|
|
+
|
|
+#ifdef FORMAT_PC
|
|
+ if(b_is_tv_format) {
|
|
+#endif /* FORMAT_PC */
|
|
+ switch(p_dis->sca_mode) {
|
|
+ case HDMITX_SCAMODE_OFF:
|
|
+
|
|
+ switch(p_dis->vin_mode) {
|
|
+ case HDMITX_VINMODE_RGB444:
|
|
+ case HDMITX_VINMODE_YUV444:
|
|
+ case HDMITX_VINMODE_YUV422:
|
|
+
|
|
+ switch(p_dis->pix_rate) {
|
|
+ case HDMITX_PIXRATE_SINGLE:
|
|
+ case HDMITX_PIXRATE_SINGLE_REPEATED:
|
|
+ tab_setting_pll_ssd = (u8 *)k_regvfmt_to_pll_ssd.sca_off_ccir_off_dbl_edge_off;
|
|
+ break;
|
|
+
|
|
+ case HDMITX_PIXRATE_DOUBLE:
|
|
+ return ERR_HDMI_INCONSISTENT_PARAMS;
|
|
+ break;
|
|
+
|
|
+ default:
|
|
+ return ERR_HDMI_BAD_PARAMETER;
|
|
+ }
|
|
+
|
|
+ break;
|
|
+
|
|
+ case HDMITX_VINMODE_CCIR656:
|
|
+
|
|
+ switch(p_dis->pix_rate) {
|
|
+ case HDMITX_PIXRATE_SINGLE:
|
|
+ case HDMITX_PIXRATE_SINGLE_REPEATED:
|
|
+ tab_setting_pll_ssd = (u8 *)k_regvfmt_to_pll_ssd.sca_off_ccir_on_dbl_edge_off;
|
|
+ break;
|
|
+
|
|
+ case HDMITX_PIXRATE_DOUBLE:
|
|
+ tab_setting_pll_ssd = (u8 *)k_regvfmt_to_pll_ssd.sca_off_ccir_on_dbl_edge_on;
|
|
+ break;
|
|
+
|
|
+ default:
|
|
+ return ERR_HDMI_BAD_PARAMETER;
|
|
+ }
|
|
+
|
|
+ break;
|
|
+
|
|
+ default:
|
|
+ return ERR_HDMI_BAD_PARAMETER;
|
|
+ }
|
|
+
|
|
+ break;
|
|
+ case HDMITX_SCAMODE_ON:
|
|
+
|
|
+ switch(p_dis->vin_mode) {
|
|
+ case HDMITX_VINMODE_RGB444:
|
|
+ case HDMITX_VINMODE_YUV444:
|
|
+ case HDMITX_VINMODE_YUV422:
|
|
+
|
|
+ switch(p_dis->pix_rate) {
|
|
+ case HDMITX_PIXRATE_SINGLE:
|
|
+ case HDMITX_PIXRATE_SINGLE_REPEATED:
|
|
+ switch(p_dis->vin_fmt) {
|
|
+ case hdmitx_vfmt_06_720x480i_60hz:
|
|
+ case hdmitx_vfmt_07_720x480i_60hz:
|
|
+ case hdmitx_vfmt_10_720x480i_60hz:
|
|
+ case hdmitx_vfmt_11_720x480i_60hz:
|
|
+ case hdmitx_vfmt_21_720x576i_50hz:
|
|
+ case hdmitx_vfmt_22_720x576i_50hz:
|
|
+ case hdmitx_vfmt_25_720x576i_50hz:
|
|
+ case hdmitx_vfmt_26_720x576i_50hz:
|
|
+ tab_setting_pll_ssd = (u8 *)k_regvfmt_to_pll_ssd.sca_on_ccir_off_dbl_edge_off_interlace;
|
|
+ break;
|
|
+
|
|
+ case hdmitx_vfmt_02_720x480p_60hz:
|
|
+ case hdmitx_vfmt_03_720x480p_60hz:
|
|
+ case hdmitx_vfmt_17_720x576p_50hz:
|
|
+ case hdmitx_vfmt_18_720x576p_50hz:
|
|
+ tab_setting_pll_ssd = (u8 *)k_regvfmt_to_pll_ssd.sca_on_ccir_off_dbl_edge_off_progressif;
|
|
+ break;
|
|
+ default:
|
|
+ return ERR_HDMI_BAD_PARAMETER;
|
|
+ }
|
|
+
|
|
+ break;
|
|
+ case HDMITX_PIXRATE_DOUBLE:
|
|
+ break;
|
|
+ default:
|
|
+ return ERR_HDMI_BAD_PARAMETER;
|
|
+ }
|
|
+
|
|
+ break;
|
|
+
|
|
+ case HDMITX_VINMODE_CCIR656:
|
|
+
|
|
+ switch(p_dis->pix_rate) {
|
|
+ case HDMITX_PIXRATE_SINGLE:
|
|
+ case HDMITX_PIXRATE_SINGLE_REPEATED:
|
|
+ switch(p_dis->vin_fmt) {
|
|
+ case hdmitx_vfmt_06_720x480i_60hz:
|
|
+ case hdmitx_vfmt_07_720x480i_60hz:
|
|
+ case hdmitx_vfmt_10_720x480i_60hz:
|
|
+ case hdmitx_vfmt_11_720x480i_60hz:
|
|
+ case hdmitx_vfmt_21_720x576i_50hz:
|
|
+ case hdmitx_vfmt_22_720x576i_50hz:
|
|
+ case hdmitx_vfmt_25_720x576i_50hz:
|
|
+ case hdmitx_vfmt_26_720x576i_50hz:
|
|
+ tab_setting_pll_ssd = (u8 *)k_regvfmt_to_pll_ssd.sca_on_ccir_on_dbl_edge_off_interlace;
|
|
+ break;
|
|
+
|
|
+ case hdmitx_vfmt_02_720x480p_60hz:
|
|
+ case hdmitx_vfmt_03_720x480p_60hz:
|
|
+ case hdmitx_vfmt_17_720x576p_50hz:
|
|
+ case hdmitx_vfmt_18_720x576p_50hz:
|
|
+ tab_setting_pll_ssd = (u8 *)k_regvfmt_to_pll_ssd.sca_on_ccir_on_dbl_edge_off_progressif;
|
|
+ break;
|
|
+
|
|
+ default:
|
|
+ return ERR_HDMI_BAD_PARAMETER;
|
|
+ }
|
|
+
|
|
+ break;
|
|
+
|
|
+ case HDMITX_PIXRATE_DOUBLE:
|
|
+
|
|
+ switch(p_dis->vin_fmt) {
|
|
+ case hdmitx_vfmt_06_720x480i_60hz:
|
|
+ case hdmitx_vfmt_07_720x480i_60hz:
|
|
+ case hdmitx_vfmt_10_720x480i_60hz:
|
|
+ case hdmitx_vfmt_11_720x480i_60hz:
|
|
+ case hdmitx_vfmt_21_720x576i_50hz:
|
|
+ case hdmitx_vfmt_22_720x576i_50hz:
|
|
+ case hdmitx_vfmt_25_720x576i_50hz:
|
|
+ case hdmitx_vfmt_26_720x576i_50hz:
|
|
+ tab_setting_pll_ssd = (u8 *)k_regvfmt_to_pll_ssd.sca_on_ccir_on_dbl_edge_on_interlace;
|
|
+ break;
|
|
+
|
|
+ case hdmitx_vfmt_02_720x480p_60hz:
|
|
+ case hdmitx_vfmt_03_720x480p_60hz:
|
|
+ case hdmitx_vfmt_17_720x576p_50hz:
|
|
+ case hdmitx_vfmt_18_720x576p_50hz:
|
|
+ tab_setting_pll_ssd = (u8 *)k_regvfmt_to_pll_ssd.sca_on_ccir_on_dbl_edge_on_progressif;
|
|
+ break;
|
|
+
|
|
+ default:
|
|
+ return ERR_HDMI_BAD_PARAMETER;
|
|
+ }
|
|
+
|
|
+ break;
|
|
+
|
|
+ default:
|
|
+ return ERR_HDMI_BAD_PARAMETER;
|
|
+ }
|
|
+
|
|
+ break;
|
|
+
|
|
+ default:
|
|
+ return ERR_HDMI_BAD_PARAMETER;
|
|
+ }
|
|
+
|
|
+ break;
|
|
+
|
|
+ default:
|
|
+ return ERR_HDMI_BAD_PARAMETER;
|
|
+ }
|
|
+
|
|
+ /* Check parameters */
|
|
+ RETIF_BADPARAM(reg_vfmt >= E_REGVFMT_NUM_TV)
|
|
+
|
|
+ /* Table pointer must be valid here */
|
|
+ if(tab_setting_pll_ssd) {
|
|
+ /* Set PLLs based on output format */
|
|
+ ssd = tab_setting_pll_ssd[reg_vfmt];
|
|
+ } else {
|
|
+ return ERR_HDMI_ASSERTION;
|
|
+ }
|
|
+
|
|
+#ifdef FORMAT_PC
|
|
+ } else {
|
|
+ tab_setting_pll_ssd = (u8 *)k_regvfmt_to_pll_ssd.settings_format_pc;
|
|
+
|
|
+ /* Check parameters */
|
|
+ RETIF_BADPARAM(reg_vfmt < E_REGVFMT_NUM_TV)
|
|
+
|
|
+ ssd = tab_setting_pll_ssd[reg_vfmt - E_REGVFMT_NUM_TV];
|
|
+ }
|
|
+
|
|
+#endif /* FORMAT_PC */
|
|
+
|
|
+ if(ssd < SSD_UNUSED_VALUE) {
|
|
+
|
|
+ err = set_hw_register_field(p_dis, E_REG_P02_PLL_SERIAL_2_RW,
|
|
+ e_maskreg_p02_pll_serial_2_srl_nosc,
|
|
+ SSD2SRL(ssd));
|
|
+ RETIF_REG_FAIL(err)
|
|
+ err = set_hw_register_field(p_dis, E_REG_P02_PLL_SCG2_RW,
|
|
+ e_maskreg_p02_pll_scg2_scg_nosc,
|
|
+ SSD2SCG(ssd));
|
|
+ RETIF_REG_FAIL(err)
|
|
+ err = set_hw_register_field(p_dis, E_REG_P02_PLL_DE_RW,
|
|
+ e_maskreg_p02_pll_de_pllde_nosc,
|
|
+ SSD2DE(ssd));
|
|
+ }
|
|
+
|
|
+ /* Set pixel repetition */
|
|
+ if(u_pixel_repeat != HDMITX_PIXREP_NO_CHANGE) {
|
|
+ if(u_pixel_repeat == HDMITX_PIXREP_DEFAULT) {
|
|
+ /* Look up default pixel repeat value for this output format */
|
|
+ u_pixel_repeat = k_regvfmt_to_pix_rep[reg_vfmt];
|
|
+ }
|
|
+
|
|
+ /* Update current pixel repetition count */
|
|
+ p_dis->pixel_repeat_count = u_pixel_repeat;
|
|
+
|
|
+ err = set_hw_register_field(p_dis,
|
|
+ E_REG_P02_PLL_SERIAL_2_RW,
|
|
+ e_maskreg_p02_pll_serial_2_srl_pr,
|
|
+ u_pixel_repeat);
|
|
+ RETIF_REG_FAIL(err)
|
|
+ /* Set pixel repetition count for Repetitor module */
|
|
+ err = set_hw_register(p_dis, E_REG_P00_RPT_CNTRL_W, u_pixel_repeat);
|
|
+ }
|
|
+ return err;
|
|
+}
|
|
+
|
|
+/*============================================================================*/
|
|
+/* setSampling */
|
|
+/*============================================================================*/
|
|
+static error_code_t
|
|
+set_sampling
|
|
+(
|
|
+ hdmi_txobject_t *p_dis
|
|
+)
|
|
+{
|
|
+ error_code_t err; /* Error code */
|
|
+ u8 up_sample; /* 1 if upsampler must be enabled */
|
|
+ u8 down_sample; /* 1 if downsampler must be enabled */
|
|
+ u8 matrix_bypass; /*>0 if matrix has been bypassed */
|
|
+
|
|
+ if((p_dis->vin_mode == HDMITX_VINMODE_YUV422)
|
|
+ || (p_dis->vin_mode == HDMITX_VINMODE_CCIR656)) {
|
|
+ if(p_dis->vout_mode == HDMITX_VOUTMODE_YUV422) {
|
|
+ /* Input 422/656, output 422 */
|
|
+ err = get_hw_register(p_dis, E_REG_P00_MAT_CONTRL_W, &matrix_bypass);
|
|
+ RETIF_REG_FAIL(err)
|
|
+ matrix_bypass &= e_maskreg_p00_mat_contrl_mat_bp;
|
|
+ /* Has matrix been bypassed? */
|
|
+ if(matrix_bypass > 0) {
|
|
+ up_sample = 0;
|
|
+ down_sample = 0;
|
|
+ } else {
|
|
+ up_sample = 1;
|
|
+ down_sample = 1;
|
|
+ }
|
|
+ } else {
|
|
+ /* Input 422/656, output not 422 */
|
|
+ up_sample = 1;
|
|
+ down_sample = 0;
|
|
+ }
|
|
+ } else {
|
|
+ if(p_dis->vout_mode == HDMITX_VOUTMODE_YUV422) {
|
|
+ /* Input not 422/656, output 422 */
|
|
+ up_sample = 0;
|
|
+ down_sample = 1;
|
|
+ } else {
|
|
+ /* Input not 422/656, output not 422 */
|
|
+ up_sample = 0;
|
|
+ down_sample = 0;
|
|
+ }
|
|
+ }
|
|
+
|
|
+ /* Check upsample mode saved by bslVideoInSetConfig */
|
|
+ if(p_dis->upsample_mode != HDMITX_UPSAMPLE_AUTO) {
|
|
+ /* Saved upsample mode overrides local one */
|
|
+ up_sample = p_dis->upsample_mode;
|
|
+ }
|
|
+
|
|
+ /* Set upsampler */
|
|
+ err = set_hw_register_field(p_dis,
|
|
+ E_REG_P00_HVF_CNTRL_0_W,
|
|
+ e_maskreg_p00_hvf_cntrl_0_intpol,
|
|
+ up_sample);
|
|
+ RETIF_REG_FAIL(err)
|
|
+
|
|
+ /* Set downsampler */
|
|
+ err = set_hw_register_field(p_dis,
|
|
+ E_REG_P00_HVF_CNTRL_1_W,
|
|
+ e_maskreg_p00_hvf_cntrl_1_for,
|
|
+ down_sample);
|
|
+ return err;
|
|
+}
|
|
+
|
|
+/*============================================================================*/
|
|
+/* setScalerFormat */
|
|
+/*============================================================================*/
|
|
+static error_code_t
|
|
+set_scaler_format
|
|
+(
|
|
+ hdmi_txobject_t *p_dis,
|
|
+ bsl_vid_fmt_t vin_fmt,
|
|
+ bsl_vid_fmt_t vout_fmt,
|
|
+ u8 pixel_repeat
|
|
+)
|
|
+{
|
|
+ error_code_t err; /* Error code */
|
|
+ u8 reg_vout_fmt; /* Video o/p format value used for register */
|
|
+ u8 reg_vin_fmt; /* Video i/p format value used for comparison */
|
|
+ u8 reg_val; /* Register value */
|
|
+#ifndef TMFL_TDA9981_SUPPORT
|
|
+ u8 sc_in_fmt = 0; /* Scaler input format */
|
|
+ u8 sc_out_fmt = 0; /* Scaler output format */
|
|
+ u16 pll_scg_n; /* PLL scaling values */
|
|
+ u16 pll_scg_r;
|
|
+ u8 hbl_off; /* FB: define hbl offset*/
|
|
+
|
|
+#endif /* TMFL_TDA9981_SUPPORT */
|
|
+
|
|
+#ifdef FORMAT_PC
|
|
+ RETIF_BADPARAM(vin_fmt > HDMITX_VFMT_PC_MAX)
|
|
+ RETIF_BADPARAM(vout_fmt > HDMITX_VFMT_PC_MAX)
|
|
+#else
|
|
+ RETIF_BADPARAM(vin_fmt > HDMITX_VFMT_TV_MAX)
|
|
+ RETIF_BADPARAM(vout_fmt > HDMITX_VFMT_TV_MAX)
|
|
+#endif
|
|
+
|
|
+ /* Look up the VIDFORMAT register formats from the register format table */
|
|
+ reg_vin_fmt = k_vfmt_to_regvfmt_tv[vin_fmt];
|
|
+ reg_vout_fmt = k_vfmt_to_regvfmt_tv[vout_fmt];
|
|
+ /* Quit if the output format does not map to the register format */
|
|
+ RETIF_BADPARAM(reg_vout_fmt == E_REGVFMT_INVALID)
|
|
+
|
|
+ if((vin_fmt > HDMITX_VFMT_TV_MAX)
|
|
+ || (vout_fmt > HDMITX_VFMT_TV_MAX)
|
|
+ || (reg_vin_fmt == reg_vout_fmt)) {
|
|
+ /* Disable scaler for PC formats or if same input and output formats */
|
|
+ err = set_hw_register_field_table(p_dis, &k_scaler_off[0]);
|
|
+ RETIF_REG_FAIL(err)
|
|
+
|
|
+#ifndef TMFL_TDA9981_SUPPORT
|
|
+ if(p_dis->sca_mode == HDMITX_SCAMODE_ON) {
|
|
+ /* remove blanking */
|
|
+ err = set_hw_register(p_dis, E_REG_P00_HBL_OFFSET_START_W, 0);
|
|
+ RETIF_REG_FAIL(err)
|
|
+ }
|
|
+#endif /* TMFL_TDA9981_SUPPORT */
|
|
+
|
|
+ p_dis->sca_mode = HDMITX_SCAMODE_OFF;
|
|
+ } else {
|
|
+#ifdef TMFL_TDA9981_SUPPORT
|
|
+ return ERR_HDMI_NOT_SUPPORTED;
|
|
+#else
|
|
+ /* Need to scale: quit if no scaler */
|
|
+ RETIF(p_dis->u_device_features & e_maskreg_p00_version_not_s,
|
|
+ ERR_HDMI_NOT_SUPPORTED)
|
|
+
|
|
+ /* Look up scaler register formats from table */
|
|
+ sc_in_fmt = SCIO2SCIN(k_vfmt_to_regvfmt_scio_tv[vin_fmt]);
|
|
+ sc_out_fmt = SCIO2SCOUT(k_vfmt_to_regvfmt_scio_tv[vout_fmt]);
|
|
+
|
|
+ /* Do these formats individually support scaling? */
|
|
+ RETIF(sc_in_fmt == E_REGVFMT_SCIN_INVALID,
|
|
+ ERR_HDMI_INCONSISTENT_PARAMS)
|
|
+ RETIF(sc_out_fmt == E_REGVFMT_SCOUT_INVALID,
|
|
+ ERR_HDMI_INCONSISTENT_PARAMS)
|
|
+
|
|
+ /* Can the i/p register format be scaled to the o/p register format? */
|
|
+ RETIF(CAN_FMTS_SCALE(reg_vin_fmt, reg_vout_fmt) == 0,
|
|
+ ERR_HDMI_INCONSISTENT_PARAMS)
|
|
+
|
|
+ /* Scaling is possible: Enable scaler */
|
|
+ err = set_hw_register_field_table(p_dis, &k_scaler_on[0]);
|
|
+ RETIF_REG_FAIL(err)
|
|
+
|
|
+ /* Set scaler input format */
|
|
+ err = set_hw_register(p_dis, E_REG_P01_VIDFORMAT_W, sc_in_fmt);
|
|
+ RETIF_REG_FAIL(err)
|
|
+ err = set_hw_register_field(p_dis,
|
|
+ E_REG_P01_SC_VIDFORMAT_W,
|
|
+ e_maskreg_p01_sc_vidformat_vid_format_i,
|
|
+ sc_in_fmt);
|
|
+ RETIF_REG_FAIL(err)
|
|
+
|
|
+ /* Set scaler output format */
|
|
+ err = set_hw_register_field(p_dis,
|
|
+ E_REG_P01_SC_VIDFORMAT_W,
|
|
+ e_maskreg_p01_sc_vidformat_vid_format_o,
|
|
+ sc_out_fmt);
|
|
+ RETIF_REG_FAIL(err)
|
|
+
|
|
+ p_dis->sca_mode = HDMITX_SCAMODE_ON;
|
|
+
|
|
+ /* Look up PLL scaling */
|
|
+ pll_scg_n = k_scl_mode_to_scg_n[sc_in_fmt][sc_out_fmt];
|
|
+
|
|
+ /* Set bits [10 to 8] */
|
|
+ reg_val = (u8)(pll_scg_n >> 8) & 7;
|
|
+ err = set_hw_register(p_dis, E_REG_P02_PLL_SCGN2_RW, reg_val);
|
|
+ RETIF_REG_FAIL(err)
|
|
+ /* Set bits [7 to 0] */
|
|
+ reg_val = (u8)pll_scg_n;
|
|
+ err = set_hw_register(p_dis, E_REG_P02_PLL_SCGN1_RW, reg_val);
|
|
+ RETIF_REG_FAIL(err)
|
|
+
|
|
+ /* Look up PLL scaling */
|
|
+ pll_scg_r = k_scl_mode_to_scg_r[sc_in_fmt][sc_out_fmt];
|
|
+
|
|
+ /* Set bit [8] */
|
|
+ reg_val = (u8)(pll_scg_r >> 8) & 1;
|
|
+ err = set_hw_register(p_dis, E_REG_P02_PLL_SCGR2_RW, reg_val);
|
|
+ RETIF_REG_FAIL(err)
|
|
+ /* Set bits [7 to 0] */
|
|
+ reg_val = (u8)pll_scg_r;
|
|
+ err = set_hw_register(p_dis, E_REG_P02_PLL_SCGR1_RW, reg_val);
|
|
+ RETIF_REG_FAIL(err)
|
|
+
|
|
+ /* Look-up blanking insertion */
|
|
+ hbl_off = k_scl_add_blk_pix[sc_in_fmt][sc_out_fmt];
|
|
+ err = set_hw_register(p_dis, E_REG_P00_HBL_OFFSET_START_W, hbl_off);
|
|
+ RETIF_REG_FAIL(err)
|
|
+ /* clean green lines for none RGB output */
|
|
+ err = set_hw_register_field(p_dis,
|
|
+ E_REG_P00_HVF_CNTRL_1_W,
|
|
+ e_maskreg_p00_hvf_cntrl_1_yuvblk,
|
|
+ k_scl_clear_blk_pix[p_dis->vout_mode]);
|
|
+ RETIF_REG_FAIL(err)
|
|
+#endif /* TMFL_TDA9981_SUPPORT */
|
|
+ }
|
|
+
|
|
+ /* PR 207 call function setPixelRepeat before wite in E_REG_P00_VIDFORMAT_W*/
|
|
+ /* Set pixel repetition - sets pixelRepeatCount, used by setScalerFormat */
|
|
+ err = set_pixel_repeat(p_dis, p_dis->vout_fmt, pixel_repeat);
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+ /* Set scaler clock */
|
|
+ reg_val = 0;
|
|
+ if((p_dis->pixel_repeat_count > HDMITX_PIXREP_MIN) &&
|
|
+ (p_dis->pixel_repeat_count <= HDMITX_PIXREP_MAX)) {
|
|
+ reg_val = 2;
|
|
+ } else if(p_dis->vin_mode == HDMITX_VINMODE_CCIR656) {
|
|
+ reg_val = (u8)((p_dis->sca_mode == HDMITX_SCAMODE_ON) ? 0 : 1);
|
|
+ }
|
|
+ err = set_hw_register_field(p_dis,
|
|
+ E_REG_P02_SEL_CLK_RW,
|
|
+ e_maskreg_p02_sel_clk_sel_vrf_clk,
|
|
+ reg_val);
|
|
+ RETIF_REG_FAIL(err)
|
|
+
|
|
+ /* Set format register for the selected output format voutFmt */
|
|
+ /* MUST BE AFTER SCALER CLOCK or sometimes the 9983 won't take the value */
|
|
+ err = set_hw_register(p_dis, E_REG_P00_VIDFORMAT_W, reg_vout_fmt);
|
|
+ RETIF_REG_FAIL(err)
|
|
+
|
|
+ /** \todo Evaluation of customer fix for 576i -> 720 p issue *************/
|
|
+
|
|
+#ifndef TMFL_TDA9981_SUPPORT
|
|
+ if(p_dis->sca_mode == HDMITX_SCAMODE_ON) {
|
|
+ /* Set scaler input format again */
|
|
+ /* MUST BE AFTER SCALER CLOCK or sometimes the 9983 won't take value */
|
|
+ err = set_hw_register(p_dis, E_REG_P01_VIDFORMAT_W, sc_in_fmt);
|
|
+ RETIF_REG_FAIL(err)
|
|
+ err = set_hw_register_field(p_dis,
|
|
+ E_REG_P01_SC_VIDFORMAT_W,
|
|
+ e_maskreg_p01_sc_vidformat_vid_format_i,
|
|
+ sc_in_fmt);
|
|
+ RETIF_REG_FAIL(err)
|
|
+
|
|
+ /* Set scaler output format again */
|
|
+ /* MUST BE AFTER SCALER CLOCK or sometimes the 9983 won't take value */
|
|
+ err = set_hw_register_field(p_dis,
|
|
+ E_REG_P01_SC_VIDFORMAT_W,
|
|
+ e_maskreg_p01_sc_vidformat_vid_format_o,
|
|
+ sc_out_fmt);
|
|
+ RETIF_REG_FAIL(err)
|
|
+ }
|
|
+#endif /* TMFL_TDA9981_SUPPORT */
|
|
+ return err;
|
|
+}
|
|
+
|
|
+/*============================================================================*/
|
|
+/* END OF FILE */
|
|
+/*============================================================================*/
|
|
diff --git a/drivers/video/hdmi/comps/tmbslTDA9983/src/tmbslHdmiTx_2.c b/drivers/video/hdmi/comps/tmbslTDA9983/src/tmbslHdmiTx_2.c
|
|
new file mode 100755
|
|
index 0000000..f07b9ae
|
|
--- /dev/null
|
|
+++ b/drivers/video/hdmi/comps/tmbslTDA9983/src/tmbslHdmiTx_2.c
|
|
@@ -0,0 +1,2404 @@
|
|
+/**
|
|
+ * Copyright (C) 2006 Koninklijke Philips Electronics N.V., All Rights Reserved.
|
|
+ * This source code and any compilation or derivative thereof is the proprietary
|
|
+ * information of Koninklijke Philips Electronics N.V. and is confidential in
|
|
+ * nature. Under no circumstances is this software to be exposed to or placed
|
|
+ * under an Open Source License of any type without the expressed written
|
|
+ * permission of Koninklijke Philips Electronics N.V.
|
|
+ *
|
|
+ * \file bsl_2.c
|
|
+ *
|
|
+ * \version $Revision: 29 $
|
|
+ *
|
|
+ * \date $Date: 29/10/07 14:11 $
|
|
+ *
|
|
+ * \brief BSL driver component for the TDA9983 HDMI Transmitter
|
|
+ *
|
|
+ * \section refs Reference Documents
|
|
+ * HDMI Driver - Outline Architecture.doc
|
|
+ * HDMI Driver - bsl - SCS.doc
|
|
+ *
|
|
+ * \section info Change Information
|
|
+ *
|
|
+ * \verbatim
|
|
+ * $History: bsl_2.c $
|
|
+ *
|
|
+ * ******************* Version 29 *****************
|
|
+ * User: B.Vereecke Date: 29/10/07 Time: 14:11
|
|
+ * Updated in $/Source/bsl/src
|
|
+ * PR852 : remove external library dependancy
|
|
+ *
|
|
+ * * ***************** Version 28 *****************
|
|
+ * User: B.Vereecke Date: 17/10/07 Time: 14:11
|
|
+ * Updated in $/Source/bsl/src
|
|
+ * PR872 : add new formats, 1080p24/25/30
|
|
+ *
|
|
+ * * ***************** Version 27 *****************
|
|
+ * User: J. Lamotte Date: 01/06/07 Time: 12:00
|
|
+ * Updated in $/Source/bsl/src
|
|
+ * PR359 (PR176) : Modify SetHwRegisters call in
|
|
+ * bslMatrixSetConversion API
|
|
+ *
|
|
+ * * ***************** Version 26 *****************
|
|
+ * User: J. Lamotte Date: 14/05/07 Time: 10:30
|
|
+ * Updated in $/Source/bsl/src
|
|
+ * PR322 (PR176) : Remove 3 DLL compilation warnings
|
|
+ * (calculateCheckusm, getEdidBlock,
|
|
+ * bslpktSetVsInfoframe)
|
|
+ *
|
|
+ * * ***************** Version 25 *****************
|
|
+ * User: Burnouf Date: 18/04/07 Time: 13:25
|
|
+ * Updated in $/Source/bsl/src
|
|
+ * PR50 : Send event EV_SINKON for TDA9981
|
|
+ *
|
|
+ * ***************** Version 24 *****************
|
|
+ * User: Burnouf Date: 29/11/06 Time: 17:06
|
|
+ * Updated in $/Source/bsl/Src
|
|
+ * PNF79 and PR11 allow driver to go in state connected if EDID checksum
|
|
+ * is bad
|
|
+ *
|
|
+ * ***************** Version 23 *****************
|
|
+ * User: Mayhew Date: 23/11/06 Time: 15:06
|
|
+ * Updated in $/Source/bsl/Src
|
|
+ * PNF78 Ensure that DDC is disconnected from I2C after bad EDID read
|
|
+ *
|
|
+ * ***************** Version 21 *****************
|
|
+ * User: Mayhew Date: 10/11/06 Time: 10:11
|
|
+ * Updated in $/Source/bsl/Src
|
|
+ * PNF68 RETIF_REG_FAIL macro replaces RETIF checks after register set/get
|
|
+ * calls, and compiled out to save code space
|
|
+ *
|
|
+ * ***************** Version 19 *****************
|
|
+ * User: Mayhew Date: 2/11/06 Time: 16:54
|
|
+ * Updated in $/Source/bsl/Src
|
|
+ * Remove N3 support
|
|
+ *
|
|
+ * ***************** Version 17 *****************
|
|
+ * User: Mayhew Date: 21/09/06 Time: 15:49
|
|
+ * Updated in $/Source/bsl/Src
|
|
+ * Cut code size in demo by using RETIF_BADPARAM
|
|
+ *
|
|
+ * ***************** Version 15 *****************
|
|
+ * User: Djw Date: 22/08/06 Time: 9:56
|
|
+ * Updated in $/Source/bsl/Src
|
|
+ * Updated file configuration info.
|
|
+ *
|
|
+ * ***************** Version 14 *****************
|
|
+ * User: Mayhew Date: 10/07/06 Time: 13:09
|
|
+ * Updated in $/Source/bsl/Src
|
|
+ * Fix file header comment
|
|
+ *
|
|
+ * ***************** Version 12 *****************
|
|
+ * User: Mayhew Date: 30/06/06 Time: 13:26
|
|
+ * Updated in $/Source/bsl/Src
|
|
+ * EdidSinkType replaced by SinkType. Set full colourspace for VGA format
|
|
+ * 1 as well as for PC formats.
|
|
+ *
|
|
+ * ***************** Version 10 *****************
|
|
+ * User: Djw Date: 16/06/06 Time: 12:04
|
|
+ * Updated in $/Source/bsl/Src
|
|
+ * Added use of alternate i2c address for EDID. More conditional
|
|
+ * compilation for demoboard build.
|
|
+ *
|
|
+ * ***************** Version 8 *****************
|
|
+ * User: Mayhew Date: 5/06/06 Time: 16:39
|
|
+ * Updated in $/Source/bsl/Src
|
|
+ * Save code space by replacing API unit checks with checkUnitSetDis.
|
|
+ *
|
|
+ * ***************** Version 7 *****************
|
|
+ * User: Djw Date: 24/05/06 Time: 15:30
|
|
+ * Updated in $/Source/bsl/Src
|
|
+ * Minor change to force EDID reads of block 0 or 1 to occur without
|
|
+ * segment pointer - thus keeping compatibility with older EDIDs.
|
|
+ *
|
|
+ * ***************** Version 5 *****************
|
|
+ * User: Djw Date: 24/05/06 Time: 11:19
|
|
+ * Updated in $/Source/bsl/Src
|
|
+ * Added conditional compilation for demoboard build. Added N4 EDID
|
|
+ * capability with Seg Ptr writing. Added all InfoFrames with N4 version
|
|
+ * checking; InfoFrames use page 10h on N4.
|
|
+ *
|
|
+ * ***************** Version 4 *****************
|
|
+ * User: Mayhew Date: 10/05/06 Time: 17:08
|
|
+ * Updated in $/Source/bsl/Src
|
|
+ * Rename local E_ enums to public HDMITX_ enums
|
|
+ *
|
|
+ * ***************** Version 3 *****************
|
|
+ * User: Djw Date: 20/04/06 Time: 18:03
|
|
+ * Updated in $/Source/bsl/Src
|
|
+ * Fixed logic problem with EDID block parsing on block 1 upwards
|
|
+ * (checksum test). Added workaround for EDID ghost register problem on
|
|
+ * n3 device.
|
|
+ *
|
|
+ * ***************** Version 2 *****************
|
|
+ * User: Mayhew Date: 11/04/06 Time: 14:09
|
|
+ * Updated in $/Source/bsl/Src
|
|
+ * Fixed Bad Parameter error in MatrixSetConversion and fixed wrong block
|
|
+ * version in video infoframe.
|
|
+ *
|
|
+ * ***************** Version 1 *****************
|
|
+ * User: Mayhew Date: 4/04/06 Time: 16:28
|
|
+ * Created in $/Source/bsl/Src
|
|
+ * Driver phase 2
|
|
+ * \endverbatim
|
|
+ *
|
|
+ * */
|
|
+
|
|
+/*============================================================================*/
|
|
+/* FILE CONFIGURATION */
|
|
+/*============================================================================*/
|
|
+
|
|
+/* Defining this symbol on the compiler command line excludes some API checks */
|
|
+/* #define NO_RETIF_BADPARAM */
|
|
+
|
|
+/* Defining this symbol on the compiler command line excludes some API checks */
|
|
+/* #define NO_RETIF_REG_FAIL */
|
|
+
|
|
+/* Defining this symbol on the compiler command line excludes unused code */
|
|
+/* #define DEMO_BUILD */
|
|
+
|
|
+/*============================================================================*/
|
|
+/* STANDARD INCLUDE FILES */
|
|
+/*============================================================================*/
|
|
+
|
|
+/*============================================================================*/
|
|
+/* PROJECT INCLUDE FILES */
|
|
+/*============================================================================*/
|
|
+#include "tmbslHdmiTx.h"
|
|
+#include "tmbslHdmiTx_local.h"
|
|
+
|
|
+/*============================================================================*/
|
|
+/* MACRO DEFINITIONS */
|
|
+/*============================================================================*/
|
|
+#define EDID_NUMBER_MAX_DTD_BLK_1 6
|
|
+/** EDID block 0 parse start point */
|
|
+#define EDID_BLK0_BASE_DTD 0x36
|
|
+
|
|
+#define EDID_BLK1_OFFSET_BASE_DTD 2
|
|
+
|
|
+/** EDID block 0 extension block count */
|
|
+#define EDID_BLK0_EXT_CNT 0x7E
|
|
+
|
|
+/** EDID extension block parse start point */
|
|
+#define EDID_BLK_EXT_BASE 0x04
|
|
+
|
|
+/** CEA extension block type */
|
|
+#define EDID_CEA_EXTENSION 0x02
|
|
+
|
|
+/** CEA Block Map */
|
|
+#define EDID_BLOCK_MAP 0xF0
|
|
+
|
|
+/** NB Max of descriptor DTD or monitor in block 0 */
|
|
+#define EDID_NB_MAX_DESCRIP_BLK_IN_BLK_0 4
|
|
+
|
|
+#define EDID_MONITOR_NAME_DESC_DATA_TYPE 252
|
|
+
|
|
+#define EDID_MONITOR_RANGE_DESC_DATA_TYPE 253
|
|
+
|
|
+/*============================================================================*/
|
|
+/* TYPE DEFINITIONS */
|
|
+/*============================================================================*/
|
|
+
|
|
+/*============================================================================*/
|
|
+/* PUBLIC VARIABLE DEFINITIONS */
|
|
+/*============================================================================*/
|
|
+
|
|
+/*============================================================================*/
|
|
+/* STATIC VARIABLE DECLARATIONS */
|
|
+/*============================================================================*/
|
|
+
|
|
+/**
|
|
+ * Lookup table for colour space conversion matrix register sets.
|
|
+ * Each array consists of 31 register values from MAT_CONTROL through
|
|
+ * to MAT_OO3_LSB
|
|
+ * */
|
|
+static CONST_DAT u8 k_matrix_preset[MATRIX_PRESET_QTY][MATRIX_PRESET_SIZE] = {
|
|
+ {
|
|
+ 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x6F, 0x0, 0x0, 0x0,
|
|
+ 0x0, 0x0, 0x0, 0x3, 0x6F, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3,
|
|
+ 0x6F, 0x0, 0x40, 0x0, 0x40, 0x0, 0x40
|
|
+ }, /* RGB Full to RGB Limited */
|
|
+
|
|
+ {
|
|
+ 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x4, 0x1, 0x7, 0x0,
|
|
+ 0x64, 0x6, 0x88, 0x1, 0xC2, 0x7, 0xB7, 0x6, 0xD6, 0x7, 0x68, 0x1,
|
|
+ 0xC2, 0x0, 0x40, 0x2, 0x0, 0x2, 0x0
|
|
+ }, /* RGB Full to BT601 */
|
|
+
|
|
+ {
|
|
+ 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x75, 0x0, 0xBB, 0x0,
|
|
+ 0x3F, 0x6, 0x68, 0x1, 0xC2, 0x7, 0xD7, 0x6, 0xA6, 0x7, 0x99, 0x1,
|
|
+ 0xC2, 0x0, 0x40, 0x2, 0x0, 0x2, 0x0
|
|
+ }, /* RGB Full to BT709 */
|
|
+
|
|
+ {
|
|
+ 0x1, 0x7, 0xC0, 0x7, 0xC0, 0x7, 0xC0, 0x2, 0x54, 0x0, 0x0, 0x0,
|
|
+ 0x0, 0x0, 0x0, 0x2, 0x54, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2,
|
|
+ 0x54, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
|
|
+ }, /* RGB Limited to RGB Full */
|
|
+
|
|
+ {
|
|
+ 0x2, 0x7, 0xC0, 0x7, 0xC0, 0x7, 0xC0, 0x2, 0x59, 0x1, 0x32, 0x0,
|
|
+ 0x75, 0x6, 0x4A, 0x2, 0x0C, 0x7, 0xAB, 0x6, 0xA5, 0x7, 0x4F, 0x2,
|
|
+ 0x0C, 0x0, 0x40, 0x2, 0x0, 0x2, 0x0
|
|
+ }, /* RGB Limited to BT601 */
|
|
+
|
|
+ {
|
|
+ 0x2, 0x7, 0xC0, 0x7, 0xC0, 0x7, 0xC0, 0x2, 0xDC, 0x0, 0xDA, 0x0,
|
|
+ 0x4A, 0x6, 0x24, 0x2, 0x0C, 0x7, 0xD0, 0x6, 0x6C, 0x7, 0x88, 0x2,
|
|
+ 0x0C, 0x0, 0x40, 0x2, 0x0, 0x2, 0x0
|
|
+ }, /* RGB Limited to BT709 */
|
|
+
|
|
+ {
|
|
+ 0x0, 0x7, 0xC0, 0x6, 0x0, 0x6, 0x0, 0x1, 0x2A, 0x7, 0x30, 0x7,
|
|
+ 0x9C, 0x1, 0x2A, 0x1, 0x99, 0x0, 0x0, 0x1, 0x2A, 0x0, 0x0, 0x2,
|
|
+ 0x5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
|
|
+ }, /* BT601 to RGB Full */
|
|
+
|
|
+ {
|
|
+ 0x1, 0x7, 0xC0, 0x6, 0x0, 0x6, 0x0, 0x2, 0x0, 0x6, 0x9A, 0x7,
|
|
+ 0x54, 0x2, 0x0, 0x2, 0xBE, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x3,
|
|
+ 0x77, 0x0, 0x40, 0x0, 0x40, 0x0, 0x40
|
|
+ }, /* BT601 to RGB Limited */
|
|
+
|
|
+ {
|
|
+ 0x1, 0x7, 0xC0, 0x6, 0x0, 0x6, 0x0, 0x2, 0x0, 0x7, 0x96, 0x7,
|
|
+ 0xC5, 0x0, 0x0, 0x2, 0x0D, 0x0, 0x26, 0x0, 0x0, 0x0, 0x3B, 0x2,
|
|
+ 0x0A, 0x0, 0x40, 0x2, 0x0, 0x2, 0x0
|
|
+ }, /* BT601 to BT709 */
|
|
+
|
|
+ {
|
|
+ 0x0, 0x7, 0xC0, 0x6, 0x0, 0x6, 0x0, 0x1, 0x2A, 0x7, 0x77, 0x7,
|
|
+ 0xC9, 0x1, 0x2A, 0x1, 0xCB, 0x0, 0x0, 0x1, 0x2A, 0x0, 0x0, 0x2,
|
|
+ 0x1D, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
|
|
+ }, /* BT709 to RGB Full */
|
|
+
|
|
+ {
|
|
+ 0x1, 0x7, 0xC0, 0x6, 0x0, 0x6, 0x0, 0x2, 0x0, 0x7, 0x16, 0x7,
|
|
+ 0xA2, 0x2, 0x0, 0x3, 0x14, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x3,
|
|
+ 0xA1, 0x0, 0x40, 0x0, 0x40, 0x0, 0x40
|
|
+ }, /* BT709 to RGB Limited */
|
|
+
|
|
+ {
|
|
+ 0x1, 0x7, 0xC0, 0x6, 0x0, 0x6, 0x0, 0x2, 0x0, 0x0, 0x62, 0x0,
|
|
+ 0x33, 0x0, 0x0, 0x1, 0xF7, 0x7, 0xDB, 0x0, 0x0, 0x7, 0xC7, 0x1,
|
|
+ 0xFB, 0x0, 0x40, 0x2, 0x0, 0x2, 0x0
|
|
+ } /* BT709 to BT601 */
|
|
+};
|
|
+
|
|
+/**
|
|
+ * This table gives us the index into the kMatrixPreset array, based
|
|
+ * on the input and output colourspaces.
|
|
+ * The co-ordinates into this array are bslColourspace_t enums.
|
|
+ * The value of -1 is returned for matching input/output colourspaces.
|
|
+ * */
|
|
+static CONST_DAT int k_matrix_index[HDMITX_CS_NUM][HDMITX_CS_NUM] = {
|
|
+ { -1, E_MATRIX_RGBF_2_RGBL, E_MATRIX_RGBF_2_BT601, E_MATRIX_RGBF_2_BT709},
|
|
+ {E_MATRIX_RGBL_2_RGBF, -1, E_MATRIX_RGBL_2_BT601, E_MATRIX_RGBL_2_BT709},
|
|
+ {E_MATRIX_BT601_2_RGBF, E_MATRIX_BT601_2_RGBL, -1, E_MATRIX_BT601_2_BT709},
|
|
+ {E_MATRIX_BT709_2_RGBF, E_MATRIX_BT709_2_RGBL, E_MATRIX_BT709_2_BT601, -1}
|
|
+};
|
|
+
|
|
+/*============================================================================*/
|
|
+/* STATIC FUNCTION DECLARATIONS */
|
|
+/*============================================================================*/
|
|
+static u8 calculate_checksum(u8 *p_data, int num_bytes);
|
|
+static error_code_t get_edid_block(hdmi_txobject_t *p_dis,
|
|
+ int block_number);
|
|
+static error_code_t parse_edid_block(hdmi_txobject_t *p_dis,
|
|
+ int block_number);
|
|
+
|
|
+static bool store_dtd_block(hdmi_txobject_t *p_dis,
|
|
+ u8 block_ptr);
|
|
+
|
|
+static bool store_monitor_descriptor(hdmi_txobject_t *p_dis,
|
|
+ u8 block_ptr);
|
|
+
|
|
+/*============================================================================*/
|
|
+/* PUBLIC FUNCTION DEFINITIONS */
|
|
+/*============================================================================*/
|
|
+
|
|
+/*============================================================================*/
|
|
+/* bslEdidGetAudioCapabilities */
|
|
+/*============================================================================*/
|
|
+#ifndef DEMO_BUILD
|
|
+error_code_t
|
|
+bsl_edid_get_audio_capabilities
|
|
+(
|
|
+ unit_select_t tx_unit,
|
|
+ bsl_edid_sad_t *p_edid_afmts,
|
|
+ uint a_fmt_length,
|
|
+ uint *p_afmts_avail,
|
|
+ u8 *p_audio_flags
|
|
+)
|
|
+{
|
|
+ /* Pointer to Device Instance Structure */
|
|
+ hdmi_txobject_t *p_dis;
|
|
+ error_code_t err; /* Error code */
|
|
+ uint i; /* Loop index */
|
|
+ u8 edid_result;
|
|
+
|
|
+ /* Check unit parameter and point to TX unit object */
|
|
+ err = check_unit_set_dis(tx_unit, &p_dis);
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+ /* Check remaining parameter(s) */
|
|
+ RETIF_BADPARAM(p_edid_afmts == NULL)
|
|
+ RETIF_BADPARAM(a_fmt_length < 1)
|
|
+ RETIF_BADPARAM(p_afmts_avail == NULL)
|
|
+ RETIF_BADPARAM(p_audio_flags == NULL)
|
|
+
|
|
+ /* IF the EdidStatus value is not valid in the Device Instance Structure
|
|
+ * THEN call bslEdidGetBlockData.
|
|
+ * */
|
|
+ if(p_dis->edid_status == HDMITX_EDID_NOT_READ) {
|
|
+ err = bsl_edid_get_block_data(tx_unit, NULL, 0, 0, &edid_result);
|
|
+ /* IF the result is not 0 THEN return it. */
|
|
+ RETIF(err != 0, err)
|
|
+ }
|
|
+
|
|
+ /* Copy the Device Instance Structure EdidAFmts descriptors to
|
|
+ * pEdidAFmts until we run out or no more space in structure.
|
|
+ * */
|
|
+ if(p_dis->edid_sad_cnt > 0) {
|
|
+ for(i = 0; (i < (uint)p_dis->edid_sad_cnt) && (i < a_fmt_length); i++) {
|
|
+ p_edid_afmts[i].mode_chans = p_dis->edid_afmts[i].mode_chans;
|
|
+ p_edid_afmts[i].freqs = p_dis->edid_afmts[i].freqs;
|
|
+ p_edid_afmts[i].byte3 = p_dis->edid_afmts[i].byte3;
|
|
+ }
|
|
+ } else {
|
|
+ /* No pEdidAFmts to copy so set a zero format to be safe */
|
|
+ p_edid_afmts[0].mode_chans = 0;
|
|
+ p_edid_afmts[0].freqs = 0;
|
|
+ p_edid_afmts[0].byte3 = 0;
|
|
+ }
|
|
+
|
|
+ /* Fill Audio Flags parameter */
|
|
+ *p_audio_flags = ((p_dis->edid_cea_flags & 0x40) << 1); /* Basic audio */
|
|
+ if(p_dis->edid_sink_ai == true) {
|
|
+ /* Mask in AI support */
|
|
+ *p_audio_flags += 0x40;
|
|
+ }
|
|
+
|
|
+ /* Fill number of SADs available parameter */
|
|
+ *p_afmts_avail = p_dis->edid_sad_cnt;
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+#endif /* DEMO_BUILD */
|
|
+
|
|
+/*============================================================================*/
|
|
+/* bslEdidGetBlockCount */
|
|
+/*============================================================================*/
|
|
+error_code_t
|
|
+bsl_edid_get_block_count
|
|
+(
|
|
+ unit_select_t tx_unit,
|
|
+ u8 *pu_edid_block_count
|
|
+)
|
|
+{
|
|
+ /* Pointer to Device Instance Structure */
|
|
+ hdmi_txobject_t *p_dis;
|
|
+ error_code_t err; /* Error code */
|
|
+ u8 edid_result;
|
|
+
|
|
+ /* Check unit parameter and point to TX unit object */
|
|
+ err = check_unit_set_dis(tx_unit, &p_dis);
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+ /* Check remaining parameter(s) */
|
|
+ RETIF_BADPARAM(pu_edid_block_count == NULL)
|
|
+
|
|
+ /* IF the EdidStatus value is not valid in the Device Instance Structure
|
|
+ * THEN call bslEdidGetBlockData.
|
|
+ * */
|
|
+ if(p_dis->edid_status == HDMITX_EDID_NOT_READ) {
|
|
+ err = bsl_edid_get_block_data(tx_unit, NULL, 0, 0, &edid_result);
|
|
+ /* IF the result is not 0 THEN return it. */
|
|
+ RETIF(err != 0, err)
|
|
+ }
|
|
+
|
|
+ *pu_edid_block_count = p_dis->edid_block_cnt;
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+/*============================================================================*/
|
|
+/* bslEdidGetBlockData */
|
|
+/*============================================================================*/
|
|
+error_code_t
|
|
+bsl_edid_get_block_data
|
|
+(
|
|
+ unit_select_t tx_unit,
|
|
+ u8 *p_raw_edid,
|
|
+ int num_blocks, /* Only relevant if pRawEdid valid */
|
|
+ int len_raw_edid, /* Only relevant if pRawEdid valid */
|
|
+ u8 *p_edid_status
|
|
+)
|
|
+{
|
|
+ /* Pointer to Device Instance Structure */
|
|
+ hdmi_txobject_t *p_dis;
|
|
+ error_code_t err; /* Error code */
|
|
+ int i; /* Loop index */
|
|
+ u8 ext_block_cnt; /* Count of extension blocks */
|
|
+
|
|
+ /* Check unit parameter and point to TX unit object */
|
|
+ err = check_unit_set_dis(tx_unit, &p_dis);
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+ /* Check remaining parameter(s)
|
|
+ * We do allow a null pRawEdid pointer, in which case buffer length is
|
|
+ * irrelevant. If pRawEdid pointer is valid, there is no point in
|
|
+ * continuing if insufficient space for at least one block.
|
|
+ * */
|
|
+ RETIF_BADPARAM((p_raw_edid != NULL) && (len_raw_edid < EDID_BLOCK_SIZE))
|
|
+ /* Sensible value of numBlocks? */
|
|
+ RETIF((p_raw_edid != NULL) && ((num_blocks < 1) || (num_blocks > 255)),
|
|
+ ERR_HDMI_INCONSISTENT_PARAMS)
|
|
+ /* Enough space for the data requested? */
|
|
+ RETIF((p_raw_edid != NULL) && (len_raw_edid < (num_blocks * EDID_BLOCK_SIZE)),
|
|
+ ERR_HDMI_INCONSISTENT_PARAMS)
|
|
+ RETIF_BADPARAM(p_edid_status == NULL)
|
|
+
|
|
+ /* Reset the EdidStatus in the Device Instance Structure */
|
|
+ p_dis->edid_status = HDMITX_EDID_NOT_READ;
|
|
+
|
|
+ /* Reset stored parameters from EDID in the Device Instance Structure */
|
|
+ p_dis->edid_sink_type = HDMITX_SINK_DVI;
|
|
+ p_dis->edid_sink_ai = false;
|
|
+ p_dis->edid_cea_flags = 0;
|
|
+ p_dis->edid_svd_cnt = 0;
|
|
+ p_dis->edid_sad_cnt = 0;
|
|
+ p_dis->edid_source_address = 0; /* 0.0.0.0 */
|
|
+ p_dis->nb_dtdstored = 0;
|
|
+ p_dis->edid_first_monitor_descriptor.b_desc_record = false;
|
|
+ p_dis->edid_second_monitor_descriptor.b_desc_record = false;
|
|
+ p_dis->edid_other_monitor_descriptor.b_desc_record = false;
|
|
+
|
|
+ /* Read the HPD pin via the hpd_in flag in the first interrupt status
|
|
+ * register and return a ERR_HDMI_NULL_CONNECTION error if it is
|
|
+ * not set.
|
|
+ * We must use the flag in the Device Instance Structure to avoid
|
|
+ * clearing pending interrupt flags.
|
|
+ * */
|
|
+ RETIF(p_dis->hot_plug_status != HDMITX_HOTPLUG_ACTIVE,
|
|
+ ERR_HDMI_NULL_CONNECTION)
|
|
+
|
|
+ /* Get the first EDID block into Device Instance workspace */
|
|
+ err = get_edid_block(p_dis, 0);
|
|
+ /* PR11 : On i2c error or bad checksum in block 0 */
|
|
+ /* allow driver to go in state CONNECTED */
|
|
+
|
|
+ if(err != 0) {
|
|
+ set_state(p_dis, EV_GETBLOCKDATA);
|
|
+#ifdef TMFL_TDA9981_SUPPORT
|
|
+#ifdef TMFL_RX_SENSE_ON
|
|
+ if(p_dis->rx_sense_status == HDMITX_RX_SENSE_ACTIVE) {
|
|
+ set_state(p_dis, EV_SINKON);
|
|
+ }
|
|
+#endif /* TMFL_RX_SENSE_ON */
|
|
+#endif /* TMFL_TDA9981_SUPPORT */
|
|
+ return err;
|
|
+ }
|
|
+
|
|
+ /* Indicate that status OK so far */
|
|
+ p_dis->edid_status = HDMITX_EDID_READ;
|
|
+
|
|
+ /* If pointer present, copy block from workspace. We know from the
|
|
+ * paramenter checking on entry that at least one block is required
|
|
+ * and we have the space for it.
|
|
+ * */
|
|
+ if(p_raw_edid != NULL) {
|
|
+ lmemcpy(p_raw_edid, p_dis->edid_block, EDID_BLOCK_SIZE);
|
|
+ }
|
|
+
|
|
+ /* Could check block 0 header (0x00,6 x 0xFF,0x00) here but not
|
|
+ * certain to be future proof [CEA861C A.2.3]
|
|
+ * */
|
|
+
|
|
+ /* Read block count from penultimate byte of block and store in DIS */
|
|
+ ext_block_cnt = p_dis->edid_block[EDID_BLK0_EXT_CNT];
|
|
+ /* (For N3, used to have to limit extBlockCnt to one block) */
|
|
+ /* Total = Block 0 + extensions */
|
|
+ p_dis->edid_block_cnt = ext_block_cnt + 1;
|
|
+
|
|
+ /* Parse block 0 */
|
|
+ parse_edid_block(p_dis, 0);
|
|
+
|
|
+ /* If extension blocks are present, process them */
|
|
+ if(ext_block_cnt > 0) {
|
|
+ for(i = 0; i < ext_block_cnt; i++) {
|
|
+ /* read block */
|
|
+ err = get_edid_block(p_dis, i + 1);
|
|
+ /* On this occasion, we also accept INVALID_STATE which means
|
|
+ * there was a checksum error
|
|
+ * */
|
|
+ if((err != 0) && (err != ERR_HDMI_INVALID_STATE)) {
|
|
+ /* PR11 : allow driver to go in state CONNECTED */
|
|
+ set_state(p_dis, EV_GETBLOCKDATA);
|
|
+#ifdef TMFL_TDA9981_SUPPORT
|
|
+#ifdef TMFL_RX_SENSE_ON
|
|
+ if(p_dis->rx_sense_status == HDMITX_RX_SENSE_ACTIVE) {
|
|
+ set_state(p_dis, EV_SINKON);
|
|
+ }
|
|
+#endif /* TMFL_RX_SENSE_ON */
|
|
+#endif /* TMFL_TDA9981_SUPPORT */
|
|
+ return err;
|
|
+ }
|
|
+
|
|
+ /* If pointer was supplied, copy block from DIS to buffer */
|
|
+ if(p_raw_edid != NULL) {
|
|
+ /* Check if we've copied as many as requested yet? */
|
|
+ if((i + 2) <= num_blocks) {
|
|
+ lmemcpy(p_raw_edid + ((i + 1) * EDID_BLOCK_SIZE),
|
|
+ p_dis->edid_block,
|
|
+ EDID_BLOCK_SIZE);
|
|
+ if(err == ERR_HDMI_INVALID_STATE) {
|
|
+ /* Note checksum error in EdidStatus */
|
|
+ p_dis->edid_status = HDMITX_EDID_ERROR;
|
|
+ }
|
|
+ } else { /* Fewer blocks requested than EDID contains, warn */
|
|
+ if(p_dis->edid_status == HDMITX_EDID_ERROR) {
|
|
+ p_dis->edid_status = HDMITX_EDID_ERROR_INCOMPLETE;
|
|
+ }
|
|
+ }
|
|
+ }
|
|
+ /* If the checksum was OK, we can parse the block */
|
|
+ if(err == 0) {
|
|
+ parse_edid_block(p_dis, i + 1);
|
|
+ }
|
|
+ }
|
|
+ }
|
|
+
|
|
+ /* Copy return value from EdidStatus */
|
|
+ *p_edid_status = p_dis->edid_status;
|
|
+
|
|
+ /* Filter out buffer status from the EdidStatus value in the
|
|
+ * Device Instance Structure
|
|
+ * */
|
|
+ if((p_dis->edid_status == HDMITX_EDID_ERROR) ||
|
|
+ (p_dis->edid_status == HDMITX_EDID_ERROR_INCOMPLETE)) {
|
|
+ p_dis->edid_status = HDMITX_EDID_ERROR;
|
|
+ }
|
|
+
|
|
+ set_state(p_dis, EV_GETBLOCKDATA);
|
|
+
|
|
+#ifdef TMFL_TDA9981_SUPPORT
|
|
+#ifdef TMFL_RX_SENSE_ON
|
|
+ if(p_dis->rx_sense_status == HDMITX_RX_SENSE_ACTIVE) {
|
|
+ set_state(p_dis, EV_SINKON);
|
|
+ }
|
|
+#endif /* TMFL_RX_SENSE_ON */
|
|
+#endif /* TMFL_TDA9981_SUPPORT */
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+/*============================================================================*/
|
|
+/* bslEdidGetSinkType */
|
|
+/*============================================================================*/
|
|
+error_code_t
|
|
+bsl_edid_get_sink_type
|
|
+(
|
|
+ unit_select_t tx_unit,
|
|
+ bsl_sink_type_t *p_sink_type
|
|
+)
|
|
+{
|
|
+ /* Pointer to Device Instance Structure */
|
|
+ hdmi_txobject_t *p_dis;
|
|
+ error_code_t err; /* Error code */
|
|
+ u8 edid_result;
|
|
+
|
|
+ /* Check unit parameter and point to TX unit object */
|
|
+ err = check_unit_set_dis(tx_unit, &p_dis);
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+ /* Check remaining parameter(s) */
|
|
+ RETIF_BADPARAM(p_sink_type == NULL)
|
|
+
|
|
+ /* IF the EdidStatus value is not valid in the Device Instance Structure
|
|
+ * THEN call bslEdidGetBlockData.
|
|
+ * */
|
|
+ if(p_dis->edid_status == HDMITX_EDID_NOT_READ) {
|
|
+ err = bsl_edid_get_block_data(tx_unit, NULL, 0, 0, &edid_result);
|
|
+ /* IF the result is not 0 THEN return it. */
|
|
+ RETIF(err != 0, err)
|
|
+ }
|
|
+
|
|
+ *p_sink_type = p_dis->edid_sink_type;
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+/*============================================================================*/
|
|
+/* bslEdidGetSourceAddress */
|
|
+/*============================================================================*/
|
|
+#ifndef DEMO_BUILD
|
|
+error_code_t
|
|
+bsl_edid_get_source_address
|
|
+(
|
|
+ unit_select_t tx_unit,
|
|
+ u16 *p_source_address
|
|
+)
|
|
+{
|
|
+ /* Pointer to Device Instance Structure */
|
|
+ hdmi_txobject_t *p_dis;
|
|
+ error_code_t err; /* Error code */
|
|
+ u8 edid_result;
|
|
+
|
|
+ /* Check unit parameter and point to TX unit object */
|
|
+ err = check_unit_set_dis(tx_unit, &p_dis);
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+ /* Check remaining parameter(s) */
|
|
+ RETIF_BADPARAM(p_source_address == NULL)
|
|
+
|
|
+ /* IF the EdidStatus value is not valid in the Device Instance Structure
|
|
+ * THEN call bslEdidGetBlockData.
|
|
+ * */
|
|
+ if(p_dis->edid_status == HDMITX_EDID_NOT_READ) {
|
|
+ err = bsl_edid_get_block_data(tx_unit, NULL, 0, 0, &edid_result);
|
|
+ /* IF the result is not 0 THEN return it. */
|
|
+ RETIF(err != 0, err)
|
|
+ }
|
|
+
|
|
+ *p_source_address = p_dis->edid_source_address;
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+#endif /* DEMO_BUILD */
|
|
+
|
|
+/*============================================================================*/
|
|
+/* bslEdidGetVideoCapabilities */
|
|
+/*============================================================================*/
|
|
+error_code_t
|
|
+bsl_edid_get_video_capabilities
|
|
+(
|
|
+ unit_select_t tx_unit,
|
|
+ u8 *p_edid_vfmts,
|
|
+ uint v_fmt_length,
|
|
+ uint *p_vfmts_avail,
|
|
+ u8 *p_vid_flags
|
|
+)
|
|
+{
|
|
+ /* Pointer to Device Instance Structure */
|
|
+ hdmi_txobject_t *p_dis;
|
|
+ error_code_t err; /* Error code */
|
|
+ uint i; /* Loop index */
|
|
+ u8 edid_result;
|
|
+
|
|
+ /* Check unit parameter and point to TX unit object */
|
|
+ err = check_unit_set_dis(tx_unit, &p_dis);
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+ /* Check remaining parameter(s) */
|
|
+ RETIF_BADPARAM(p_edid_vfmts == NULL)
|
|
+ RETIF_BADPARAM(v_fmt_length < 1)
|
|
+ RETIF_BADPARAM(p_vfmts_avail == NULL)
|
|
+ RETIF_BADPARAM(p_vid_flags == NULL)
|
|
+
|
|
+ /* IF the EdidStatus value is not valid in the Device Instance Structure
|
|
+ * THEN call bslEdidGetBlockData.
|
|
+ * */
|
|
+ if(p_dis->edid_status == HDMITX_EDID_NOT_READ) {
|
|
+ err = bsl_edid_get_block_data(tx_unit, NULL, 0, 0, &edid_result);
|
|
+ /* IF the result is not 0 THEN return it. */
|
|
+ RETIF(err != 0, err)
|
|
+ }
|
|
+
|
|
+ /* Copy the Device Instance Structure EdidVFmts descriptors to
|
|
+ * pEdidVFmts until we run out or no more space in structure.
|
|
+ * */
|
|
+ if(p_dis->edid_svd_cnt > 0) {
|
|
+ for(i = 0; (i < (uint)p_dis->edid_svd_cnt) && (i < v_fmt_length); i++) {
|
|
+ p_edid_vfmts[i] = p_dis->edid_vfmts[i];
|
|
+ }
|
|
+ } else {
|
|
+ /* No pEdidVFmts to copy so set a zero format to be safe */
|
|
+ p_edid_vfmts[0] = HDMITX_VFMT_NULL;
|
|
+ }
|
|
+
|
|
+ /* Fill Video Flags parameter */
|
|
+ *p_vid_flags = ((p_dis->edid_cea_flags & 0x80) | /* Underscan */
|
|
+ /* YUV444, YUV422 */
|
|
+ ((p_dis->edid_cea_flags & 0x30) << 1));
|
|
+
|
|
+ /* Fill number of SVDs available parameter */
|
|
+ *p_vfmts_avail = p_dis->edid_svd_cnt;
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+/*============================================================================*/
|
|
+/* bslEdidGetVideoPreferred */
|
|
+/*============================================================================*/
|
|
+#ifndef DEMO_BUILD
|
|
+error_code_t
|
|
+bsl_edid_get_video_preferred
|
|
+(
|
|
+ unit_select_t tx_unit,
|
|
+ bsl_edid_dtd_t *p_edid_dtd
|
|
+)
|
|
+{
|
|
+ /* Pointer to Device Instance Structure */
|
|
+ hdmi_txobject_t *p_dis;
|
|
+ error_code_t err; /* Error code */
|
|
+ u8 edid_result;
|
|
+
|
|
+ /* Check unit parameter and point to TX unit object */
|
|
+ err = check_unit_set_dis(tx_unit, &p_dis);
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+ /* Check remaining parameter(s) */
|
|
+ RETIF_BADPARAM(p_edid_dtd == NULL)
|
|
+
|
|
+ /* IF the EdidStatus value is not valid in the Device Instance Structure
|
|
+ * THEN call bslEdidGetBlockData.
|
|
+ * */
|
|
+ if(p_dis->edid_status == HDMITX_EDID_NOT_READ) {
|
|
+ err = bsl_edid_get_block_data(tx_unit, NULL, 0, 0, &edid_result);
|
|
+ /* IF the result is not 0 THEN return it. */
|
|
+ RETIF(err != 0, err)
|
|
+ }
|
|
+
|
|
+ /* Populate the Detailed Timing Descriptor structure pEdidDTD from
|
|
+ * EdidDtd in the Device Instance Structure.
|
|
+ * */
|
|
+ lmemcpy(p_edid_dtd, &p_dis->edid_dtd, sizeof(*p_edid_dtd));
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+#endif /* DEMO_BUILD */
|
|
+
|
|
+#ifndef DEMO_BUILD
|
|
+error_code_t
|
|
+bsl_edid_get_detailed_timing_descriptors
|
|
+(
|
|
+ unit_select_t tx_unit,
|
|
+ bsl_edid_dtd_t *p_edid_dtd,
|
|
+ u8 nb_size,
|
|
+ u8 *p_dtda_vail
|
|
+)
|
|
+{
|
|
+
|
|
+ /* Pointer to Device Instance Structure */
|
|
+ hdmi_txobject_t *p_dis;
|
|
+ error_code_t err; /* Error code */
|
|
+
|
|
+ /* Check unit parameter and point to TX unit object */
|
|
+ err = check_unit_set_dis(tx_unit, &p_dis);
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+ /* Check remaining parameter(s) */
|
|
+ RETIF_BADPARAM(p_edid_dtd == NULL)
|
|
+ RETIF_BADPARAM(p_dtda_vail == NULL)
|
|
+ RETIF_BADPARAM(nb_size == 0)
|
|
+
|
|
+ if((p_dis->edid_status == HDMITX_EDID_READ) ||
|
|
+ (p_dis->edid_status == HDMITX_EDID_ERROR) ||
|
|
+ (p_dis->edid_status == HDMITX_EDID_ERROR_INCOMPLETE)) {
|
|
+ /* allow if edid are read or if there are a chk error on an other block than block 0 */
|
|
+ if(nb_size > p_dis->nb_dtdstored) {
|
|
+ *p_dtda_vail = p_dis->nb_dtdstored;
|
|
+ } else {
|
|
+ *p_dtda_vail = nb_size;
|
|
+ }
|
|
+
|
|
+ lmemcpy(p_edid_dtd, p_dis->edid_dtd, sizeof(bsl_edid_dtd_t) *(*p_dtda_vail));
|
|
+ } else {
|
|
+ /* Not allowed if EdidStatus value is not valid */
|
|
+ err = ERR_HDMI_INVALID_STATE;
|
|
+ }
|
|
+
|
|
+ return 0;
|
|
+
|
|
+}
|
|
+#endif /* DEMO_BUILD */
|
|
+
|
|
+/*============================================================================*/
|
|
+/* bslMatrixSetCoeffs */
|
|
+/*============================================================================*/
|
|
+#ifndef DEMO_BUILD
|
|
+error_code_t
|
|
+bsl_matrix_set_coeffs
|
|
+(
|
|
+ unit_select_t tx_unit,
|
|
+ bsl_mat_coeff_t *p_mat_coeff
|
|
+)
|
|
+{
|
|
+ hdmi_txobject_t *p_dis; /* Pointer to Device Instance Structure */
|
|
+ error_code_t err; /* Error code */
|
|
+ int i; /* Loop index */
|
|
+ u8 buf[HDMITX_MAT_COEFF_NUM * 2]; /* Temp buffer */
|
|
+
|
|
+ /* Check unit parameter and point to TX unit object */
|
|
+ err = check_unit_set_dis(tx_unit, &p_dis);
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+ /* Check remaining parameter(s) */
|
|
+ RETIF_BADPARAM(p_mat_coeff == (bsl_mat_coeff_t *)0)
|
|
+ for(i = 0; i < HDMITX_MAT_COEFF_NUM; i++) {
|
|
+ RETIF_BADPARAM((p_mat_coeff->coeff[i] < HDMITX_MAT_OFFSET_MIN) ||
|
|
+ (p_mat_coeff->coeff[i] > HDMITX_MAT_OFFSET_MAX))
|
|
+ }
|
|
+
|
|
+ /* Convert signed 11 bit values from Coeff array to pairs of MSB-LSB
|
|
+ * register values, and write to register pairs
|
|
+ * */
|
|
+ for(i = 0; i < HDMITX_MAT_COEFF_NUM; i++) {
|
|
+ /* Mask & copy MSB */
|
|
+ buf[i*2] = (u8)(((u16)p_mat_coeff->coeff[i] & 0x0700) >> 8);
|
|
+ /* Copy LSB */
|
|
+ buf[(i*2)+1] = (u8)((u16)p_mat_coeff->coeff[i] & 0x00FF);
|
|
+ }
|
|
+ err = set_hw_registers(p_dis,
|
|
+ E_REG_P00_MAT_P11_MSB_W,
|
|
+ &buf[0],
|
|
+ HDMITX_MAT_COEFF_NUM * 2);
|
|
+ return err;
|
|
+}
|
|
+#endif /* DEMO_BUILD */
|
|
+
|
|
+/*============================================================================*/
|
|
+/* bslMatrixSetConversion */
|
|
+/*============================================================================*/
|
|
+error_code_t
|
|
+bsl_matrix_set_conversion
|
|
+(
|
|
+ unit_select_t tx_unit,
|
|
+ bsl_vid_fmt_t vin_fmt,
|
|
+ bsl_vin_mode_t vin_mode,
|
|
+ bsl_vid_fmt_t vout_fmt,
|
|
+ bsl_vout_mode_t vout_mode,
|
|
+ bsl_vqr_t dvi_vqr
|
|
+)
|
|
+{
|
|
+ /* Ptr to Device Instance Structure */
|
|
+ hdmi_txobject_t *p_dis;
|
|
+ error_code_t err; /* Error code */
|
|
+ bsl_colourspace_t cspace_in; /* Input colourspaces */
|
|
+ bsl_colourspace_t cspace_out; /* Output colourspaces */
|
|
+ /* Index into matrix preset array */
|
|
+ int matrix_index;
|
|
+ u8 buf[MATRIX_PRESET_SIZE]; /* Temp buffer */
|
|
+ u8 i; /* Loop index */
|
|
+
|
|
+ /* Check unit parameter and point to TX unit object */
|
|
+ err = check_unit_set_dis(tx_unit, &p_dis);
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+ /* Check remaining parameter(s) */
|
|
+ RETIF_BADPARAM(((vin_fmt < HDMITX_VFMT_TV_MIN) || (vin_fmt > HDMITX_VFMT_PC_MAX))
|
|
+ || ((vin_fmt > HDMITX_VFMT_TV_MAX) && (vin_fmt < HDMITX_VFMT_PC_MIN)))
|
|
+ /* NB: NO_CHANGE is not valid for this function, so limit to actual values*/
|
|
+ RETIF_BADPARAM(vin_mode >= HDMITX_VINMODE_NO_CHANGE)
|
|
+ RETIF_BADPARAM(((vout_fmt < HDMITX_VFMT_TV_MIN) || (vout_fmt > HDMITX_VFMT_PC_MAX))
|
|
+ || ((vout_fmt > HDMITX_VFMT_TV_MAX) && (vout_fmt < HDMITX_VFMT_PC_MIN)))
|
|
+ /* NB: NO_CHANGE is not valid for this function, so limit to actual values*/
|
|
+ RETIF_BADPARAM(vout_mode >= HDMITX_VOUTMODE_NO_CHANGE)
|
|
+
|
|
+ /* Since vinMode and voutMode are different types, we don't use a local
|
|
+ * function to do this and use inline code twice */
|
|
+
|
|
+ /* Calculate input colour space */
|
|
+ if((vin_fmt == HDMITX_VFMT_TV_MIN) || (vin_fmt >= HDMITX_VFMT_PC_MIN)) {
|
|
+ /* Catch the VGA or PC formats */
|
|
+ cspace_in = HDMITX_CS_RGB_FULL;
|
|
+ } else {
|
|
+ switch(vin_fmt) {
|
|
+ /* Catch the HD modes */
|
|
+ case hdmitx_vfmt_04_1280x720p_60hz:
|
|
+ case hdmitx_vfmt_05_1920x1080i_60hz:
|
|
+ case hdmitx_vfmt_16_1920x1080p_60hz:
|
|
+ case hdmitx_vfmt_19_1280x720p_50hz:
|
|
+ case hdmitx_vfmt_20_1920x1080i_50hz:
|
|
+ case hdmitx_vfmt_31_1920x1080p_50hz:
|
|
+ case hdmitx_vfmt_32_1920x1080p_24hz:
|
|
+ case hdmitx_vfmt_33_1920x1080p_25hz:
|
|
+ case hdmitx_vfmt_34_1920x1080p_30hz:
|
|
+ if(vin_mode == HDMITX_VINMODE_RGB444) { /* RGB */
|
|
+ cspace_in = HDMITX_CS_RGB_LIMITED;
|
|
+ /* CCIR656, YUV444, YU422 */
|
|
+ } else {
|
|
+ cspace_in = HDMITX_CS_YUV_ITU_BT709;
|
|
+ }
|
|
+ break;
|
|
+ default: /* Now all the SD modes */
|
|
+ if(vin_mode == HDMITX_VINMODE_RGB444) { /* we're RGB */
|
|
+ cspace_in = HDMITX_CS_RGB_LIMITED;
|
|
+ /* CCIR656, YUV444, YU422 */
|
|
+ } else {
|
|
+ cspace_in = HDMITX_CS_YUV_ITU_BT601;
|
|
+ }
|
|
+ break;
|
|
+ }
|
|
+ }
|
|
+
|
|
+ /* Calculate output colour space */
|
|
+ if((vout_fmt == HDMITX_VFMT_TV_MIN) || (vout_fmt >= HDMITX_VFMT_PC_MIN)) {
|
|
+ /* Catch the VGA or PC formats */
|
|
+ cspace_out = HDMITX_CS_RGB_FULL;
|
|
+ } else {
|
|
+ switch(vout_fmt) {
|
|
+ /* Catch the HD modes */
|
|
+ case hdmitx_vfmt_04_1280x720p_60hz:
|
|
+ case hdmitx_vfmt_05_1920x1080i_60hz:
|
|
+ case hdmitx_vfmt_16_1920x1080p_60hz:
|
|
+ case hdmitx_vfmt_19_1280x720p_50hz:
|
|
+ case hdmitx_vfmt_20_1920x1080i_50hz:
|
|
+ case hdmitx_vfmt_31_1920x1080p_50hz:
|
|
+ case hdmitx_vfmt_32_1920x1080p_24hz:
|
|
+ case hdmitx_vfmt_33_1920x1080p_25hz:
|
|
+ case hdmitx_vfmt_34_1920x1080p_30hz:
|
|
+ if(vout_mode == HDMITX_VOUTMODE_RGB444) { /* RGB */
|
|
+ cspace_out = HDMITX_CS_RGB_LIMITED;
|
|
+ } else { /* YUV444 or YUV422 */
|
|
+ cspace_out = HDMITX_CS_YUV_ITU_BT709;
|
|
+ }
|
|
+ break;
|
|
+ default: /* Now all the SD modes */
|
|
+ if(vout_mode == HDMITX_VOUTMODE_RGB444) { /* RGB */
|
|
+ cspace_out = HDMITX_CS_RGB_LIMITED;
|
|
+ } else { /* YUV444 or YUV422 */
|
|
+ cspace_out = HDMITX_CS_YUV_ITU_BT601;
|
|
+ }
|
|
+ break;
|
|
+ }
|
|
+ }
|
|
+
|
|
+ if(p_dis->sink_type == HDMITX_SINK_DVI) {
|
|
+
|
|
+ switch(dvi_vqr) {
|
|
+ case HDMITX_VQR_DEFAULT :
|
|
+ /* do nothing */
|
|
+ break;
|
|
+
|
|
+ case HDMITX_RGB_FULL :
|
|
+ cspace_out = HDMITX_CS_RGB_FULL;
|
|
+ break;
|
|
+
|
|
+ case HDMITX_RGB_LIMITED :
|
|
+ cspace_out = HDMITX_CS_RGB_LIMITED;
|
|
+ break;
|
|
+ }
|
|
+
|
|
+ }
|
|
+
|
|
+ if(cspace_in == cspace_out) {
|
|
+ /* Switch off colour matrix by setting bypass flag */
|
|
+ err = set_hw_register_field(p_dis,
|
|
+ E_REG_P00_MAT_CONTRL_W,
|
|
+ e_maskreg_p00_mat_contrl_mat_bp,
|
|
+ 1);
|
|
+ } else {
|
|
+ /* Load appropriate values into matrix - we have preset blocks of
|
|
+ * 31 register vales in a table, just need to work out which set to use
|
|
+ * */
|
|
+ matrix_index = k_matrix_index[cspace_in][cspace_out];
|
|
+
|
|
+ /* Set the first block byte separately, as it is shadowed and can't
|
|
+ * be set by setHwRegisters */
|
|
+ err = set_hw_register(p_dis,
|
|
+ E_REG_P00_MAT_CONTRL_W,
|
|
+ k_matrix_preset[matrix_index][0]);
|
|
+ RETIF_REG_FAIL(err)
|
|
+
|
|
+ for(i = 0; i < MATRIX_PRESET_SIZE; i++) {
|
|
+ buf[i] = k_matrix_preset[matrix_index][i];
|
|
+ }
|
|
+
|
|
+ /* Set the rest of the block */
|
|
+ err = set_hw_registers(p_dis,
|
|
+ E_REG_P00_MAT_OI1_MSB_W,
|
|
+ &buf[1],
|
|
+ MATRIX_PRESET_SIZE - 1);
|
|
+ }
|
|
+ return err;
|
|
+}
|
|
+
|
|
+/*============================================================================*/
|
|
+/* bslMatrixSetInputOffset */
|
|
+/*============================================================================*/
|
|
+#ifndef DEMO_BUILD
|
|
+error_code_t
|
|
+bsl_matrix_set_input_offset
|
|
+(
|
|
+ unit_select_t tx_unit,
|
|
+ bsl_mat_offset_t *p_mat_offset
|
|
+)
|
|
+{
|
|
+ hdmi_txobject_t *p_dis; /* Pointer to Device Instance Structure */
|
|
+ error_code_t err; /* Error code */
|
|
+ int i; /* Loop index */
|
|
+ u8 buf[HDMITX_MAT_OFFSET_NUM * 2]; /* Temp buffer */
|
|
+
|
|
+ /* Check unit parameter and point to TX unit object */
|
|
+ err = check_unit_set_dis(tx_unit, &p_dis);
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+ /* Check remaining parameter(s) */
|
|
+ RETIF_BADPARAM(p_mat_offset == (bsl_mat_offset_t *)0)
|
|
+ for(i = 0; i < HDMITX_MAT_OFFSET_NUM; i++) {
|
|
+ RETIF_BADPARAM((p_mat_offset->offset[i] < HDMITX_MAT_OFFSET_MIN) ||
|
|
+ (p_mat_offset->offset[i] > HDMITX_MAT_OFFSET_MAX))
|
|
+ }
|
|
+
|
|
+ /* Convert signed 11 bit values from Offset array to pairs of MSB-LSB
|
|
+ * register values, and write to register pairs
|
|
+ * */
|
|
+ for(i = 0; i < HDMITX_MAT_OFFSET_NUM; i++) {
|
|
+ /* Mask & copy MSB */
|
|
+ buf[i*2] = (u8)(((u16)p_mat_offset->offset[i] & 0x0700) >> 8);
|
|
+ /* Copy LSB */
|
|
+ buf[(i*2)+1] = (u8)((u16)p_mat_offset->offset[i] & 0x00FF);
|
|
+ }
|
|
+ err = set_hw_registers(p_dis,
|
|
+ E_REG_P00_MAT_OI1_MSB_W,
|
|
+ &buf[0],
|
|
+ HDMITX_MAT_OFFSET_NUM * 2);
|
|
+ return err;
|
|
+}
|
|
+#endif /* DEMO_BUILD */
|
|
+
|
|
+/*============================================================================*/
|
|
+/* bslMatrixSetMode */
|
|
+/*============================================================================*/
|
|
+error_code_t
|
|
+bsl_matrix_set_mode
|
|
+(
|
|
+ unit_select_t tx_unit,
|
|
+ bslm_cntrl_t m_control,
|
|
+ bslm_scale_t m_scale
|
|
+)
|
|
+{
|
|
+ hdmi_txobject_t *p_dis; /* Pointer to Device Instance Structure */
|
|
+ error_code_t err; /* Error code */
|
|
+
|
|
+ /* Check unit parameter and point to TX unit object */
|
|
+ err = check_unit_set_dis(tx_unit, &p_dis);
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+ /* Check remaining parameter(s) */
|
|
+ RETIF_BADPARAM((m_control > HDMITX_MCNTRL_MAX) ||
|
|
+ (m_scale > HDMITX_MSCALE_MAX))
|
|
+
|
|
+ /* For each value that is not NoChange, update the appropriate register */
|
|
+ if(m_control != HDMITX_MCNTRL_NO_CHANGE) {
|
|
+ err = set_hw_register_field(p_dis,
|
|
+ E_REG_P00_MAT_CONTRL_W,
|
|
+ e_maskreg_p00_mat_contrl_mat_bp,
|
|
+ (u8)m_control);
|
|
+ RETIF_REG_FAIL(err)
|
|
+ }
|
|
+
|
|
+ if(m_scale != HDMITX_MSCALE_NO_CHANGE) {
|
|
+ err = set_hw_register_field(p_dis,
|
|
+ E_REG_P00_MAT_CONTRL_W,
|
|
+ e_maskreg_p00_mat_contrl_mat_sc,
|
|
+ (u8)m_scale);
|
|
+ RETIF_REG_FAIL(err)
|
|
+ }
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+/*============================================================================*/
|
|
+/* bslMatrixSetOutputOffset */
|
|
+/*============================================================================*/
|
|
+#ifndef DEMO_BUILD
|
|
+error_code_t
|
|
+bsl_matrix_set_output_offset
|
|
+(
|
|
+ unit_select_t tx_unit,
|
|
+ bsl_mat_offset_t *p_mat_offset
|
|
+)
|
|
+{
|
|
+ hdmi_txobject_t *p_dis; /* Pointer to Device Instance Structure */
|
|
+ error_code_t err; /* Error code */
|
|
+ int i; /* Loop index */
|
|
+ u8 buf[HDMITX_MAT_OFFSET_NUM * 2]; /* Temp buffer */
|
|
+
|
|
+ /* Check unit parameter and point to TX unit object */
|
|
+ err = check_unit_set_dis(tx_unit, &p_dis);
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+ /* Check remaining parameter(s) */
|
|
+ RETIF_BADPARAM(p_mat_offset == (bsl_mat_offset_t *)0)
|
|
+ for(i = 0; i < HDMITX_MAT_OFFSET_NUM; i++) {
|
|
+ RETIF_BADPARAM((p_mat_offset->offset[i] < HDMITX_MAT_OFFSET_MIN) ||
|
|
+ (p_mat_offset->offset[i] > HDMITX_MAT_OFFSET_MAX))
|
|
+ }
|
|
+
|
|
+ /* Convert signed 11 bit values from Offset array to pairs of MSB-LSB
|
|
+ * register values, and write to register pairs
|
|
+ * */
|
|
+ for(i = 0; i < HDMITX_MAT_OFFSET_NUM; i++) {
|
|
+ /* Mask & copy MSB */
|
|
+ buf[i*2] = (u8)(((u16)p_mat_offset->offset[i] & 0x0700) >> 8);
|
|
+ /* Copy LSB */
|
|
+ buf[(i*2)+1] = (u8)((u16)p_mat_offset->offset[i] & 0x00FF);
|
|
+ }
|
|
+ err = set_hw_registers(p_dis,
|
|
+ E_REG_P00_MAT_OO1_MSB_W,
|
|
+ &buf[0],
|
|
+ HDMITX_MAT_OFFSET_NUM * 2);
|
|
+ return err;
|
|
+}
|
|
+#endif /* DEMO_BUILD */
|
|
+
|
|
+/*============================================================================*/
|
|
+/* bslPktSetAclkRecovery */
|
|
+/*============================================================================*/
|
|
+#ifndef DEMO_BUILD
|
|
+error_code_t
|
|
+bsl_pkt_set_aclk_recovery
|
|
+(
|
|
+ unit_select_t tx_unit,
|
|
+ bool b_enable
|
|
+)
|
|
+{
|
|
+ hdmi_txobject_t *p_dis; /* Pointer to Device Instance Structure */
|
|
+ error_code_t err; /* Error code */
|
|
+
|
|
+ /* Check unit parameter and point to TX unit object */
|
|
+ err = check_unit_set_dis(tx_unit, &p_dis);
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+ /* Return ERR_HDMI_OPERATION_NOT_PERMITTED error if the
|
|
+ * sinkType is not HDMI
|
|
+ * */
|
|
+ RETIF(p_dis->sink_type != HDMITX_SINK_HDMI,
|
|
+ ERR_HDMI_OPERATION_NOT_PERMITTED)
|
|
+
|
|
+ /* Check remaining parameter(s) */
|
|
+ RETIF_BADPARAM((b_enable != true) && (b_enable != false))
|
|
+
|
|
+ /* Write the ACR packet insertion flag */
|
|
+ err = set_hw_register_field(p_dis,
|
|
+ E_REG_P11_DIP_FLAGS_RW,
|
|
+ e_maskreg_p11_dip_flags_acr,
|
|
+ (u8)b_enable);
|
|
+ return err;
|
|
+}
|
|
+
|
|
+/*============================================================================*/
|
|
+/* bslPktSetAcp */
|
|
+/*============================================================================*/
|
|
+error_code_t
|
|
+bsl_pkt_set_acp
|
|
+(
|
|
+ unit_select_t tx_unit,
|
|
+ bsl_pkt_t *p_pkt,
|
|
+ uint byte_cnt,
|
|
+ u8 u_acp_type,
|
|
+ bool b_enable
|
|
+)
|
|
+{
|
|
+ hdmi_txobject_t *p_dis; /* Pointer to Device Instance Structure */
|
|
+ error_code_t err; /* Error code */
|
|
+ u8 buf[3]; /* Temp buffer to hold header bytes */
|
|
+
|
|
+ /* Check unit parameter and point to TX unit object */
|
|
+ err = check_unit_set_dis(tx_unit, &p_dis);
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+ /* Return ERR_HDMI_OPERATION_NOT_PERMITTED error if the
|
|
+ * sinkType is not HDMI
|
|
+ * */
|
|
+ RETIF(p_dis->sink_type != HDMITX_SINK_HDMI,
|
|
+ ERR_HDMI_OPERATION_NOT_PERMITTED)
|
|
+
|
|
+ /* Only supported for device N4 or later */
|
|
+
|
|
+ /* Check remaining parameter(s) - NULL pointer allowed */
|
|
+ RETIF_BADPARAM((b_enable != true) && (b_enable != false))
|
|
+
|
|
+ if(p_pkt != NULL) {
|
|
+ /* Pointer to structure provided so check parameters */
|
|
+ RETIF_BADPARAM(byte_cnt > HDMITX_PKT_DATA_BYTE_CNT)
|
|
+ RETIF(byte_cnt == 0, ERR_HDMI_INCONSISTENT_PARAMS)
|
|
+
|
|
+ /* Data to change, start by clearing ACP packet insertion flag */
|
|
+ err = set_hw_register_field(p_dis,
|
|
+ E_REG_P11_DIP_FLAGS_RW,
|
|
+ e_maskreg_p11_dip_flags_acp,
|
|
+ 0x00);
|
|
+ RETIF_REG_FAIL(err)
|
|
+
|
|
+ /* Prepare ACP header */
|
|
+ buf[0] = 0x04; /* ACP packet */
|
|
+ buf[1] = u_acp_type;
|
|
+ buf[2] = 0; /* Reserved [HDMI 1.2] */
|
|
+
|
|
+ /* Write 3 header bytes to registers */
|
|
+ err = set_hw_registers(p_dis,
|
|
+ E_REG_P11_ACP_HB0_RW,
|
|
+ &buf[0],
|
|
+ 3);
|
|
+ RETIF_REG_FAIL(err)
|
|
+
|
|
+ /* Write "byteCnt" bytes of data to registers */
|
|
+ err = set_hw_registers(p_dis,
|
|
+ E_REG_P11_ACP_PB0_RW,
|
|
+ &p_pkt->data_byte[0],
|
|
+ (u16)byte_cnt);
|
|
+ RETIF_REG_FAIL(err)
|
|
+ }
|
|
+
|
|
+ /* Write the ACP packet insertion flag */
|
|
+ err = set_hw_register_field(p_dis,
|
|
+ E_REG_P11_DIP_FLAGS_RW,
|
|
+ e_maskreg_p11_dip_flags_acp,
|
|
+ (u8)b_enable);
|
|
+ return err;
|
|
+}
|
|
+#endif /* DEMO_BUILD */
|
|
+
|
|
+/*============================================================================*/
|
|
+/* bslPktSetAudioInfoframe */
|
|
+/*============================================================================*/
|
|
+error_code_t
|
|
+bsl_pkt_set_audio_infoframe
|
|
+(
|
|
+ unit_select_t tx_unit,
|
|
+ bsl_pkt_aif_t *p_pkt,
|
|
+ bool b_enable
|
|
+)
|
|
+{
|
|
+ hdmi_txobject_t *p_dis; /* Pointer to Device Instance Structure */
|
|
+ error_code_t err; /* Error code */
|
|
+ u8 buf[9]; /* Temp buffer to hold header/packet bytes */
|
|
+ u16 buf_reg; /* Base register used for writing InfoFrame*/
|
|
+ u16 flag_reg;/* Flag register to be used */
|
|
+ u8 flag_mask;/* Mask used for writing flag register */
|
|
+
|
|
+ /* Check unit parameter and point to TX unit object */
|
|
+ err = check_unit_set_dis(tx_unit, &p_dis);
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+ /* Return ERR_HDMI_OPERATION_NOT_PERMITTED error if the
|
|
+ * sinkType is not HDMI
|
|
+ * */
|
|
+ RETIF(p_dis->sink_type != HDMITX_SINK_HDMI,
|
|
+ ERR_HDMI_OPERATION_NOT_PERMITTED)
|
|
+
|
|
+ /* Check remaining parameter(s) - NULL pointer allowed */
|
|
+ RETIF_BADPARAM((b_enable != true) && (b_enable != false))
|
|
+ if(p_pkt != NULL) {
|
|
+ /* Pointer to structure provided so check parameters */
|
|
+ RETIF_BADPARAM(p_pkt->coding_type > 0x0F)
|
|
+ RETIF_BADPARAM(p_pkt->channel_count > 0x07)
|
|
+ RETIF_BADPARAM(p_pkt->sample_freq > 0x07)
|
|
+ RETIF_BADPARAM(p_pkt->sample_size > 0x03)
|
|
+ /* No need to check ChannelAlloc - all values are allowed */
|
|
+ RETIF_BADPARAM((p_pkt->down_mix_inhibit != true) &&
|
|
+ (p_pkt->down_mix_inhibit != false))
|
|
+ RETIF_BADPARAM(p_pkt->level_shift > 0x0F)
|
|
+ }
|
|
+
|
|
+ /* Only supported for device N4 or later */
|
|
+
|
|
+ /* We're using n4 or later, use IF4 buffer for Audio InfoFrame */
|
|
+ buf_reg = E_REG_P10_IF4_HB0_RW;
|
|
+ flag_reg = E_REG_P11_DIP_IF_FLAGS_RW;
|
|
+ flag_mask = e_maskreg_p11_dip_if_flags_if4;
|
|
+
|
|
+ if(p_pkt != NULL) {
|
|
+ /* Data to change, start by clearing AIF packet insertion flag */
|
|
+ err = set_hw_register_field(p_dis,
|
|
+ flag_reg,
|
|
+ flag_mask,
|
|
+ 0x00);
|
|
+ RETIF_REG_FAIL(err)
|
|
+
|
|
+ /* Prepare AIF header */
|
|
+ buf[0] = 0x84; /* Audio InfoFrame */
|
|
+ buf[1] = 0x01; /* Version 1 [HDMI 1.2] */
|
|
+ buf[2] = 0x0A; /* Length [HDMI 1.2] */
|
|
+
|
|
+ /* Prepare AIF packet (byte numbers offset by 3) */
|
|
+ buf[0+3] = 0; /* Preset checksum to zero so calculation works! */
|
|
+ buf[1+3] = ((p_pkt->coding_type & 0x0F) << 4) |
|
|
+ (p_pkt->channel_count & 0x07); /* CT3-0, CC2-0 */
|
|
+ buf[2+3] = ((p_pkt->sample_freq & 0x07) << 2) |
|
|
+ (p_pkt->sample_size & 0x03); /* SF2-0, SS1-0 */
|
|
+ buf[3+3] = 0; /* [HDMI 1.2] */
|
|
+ buf[4+3] = p_pkt->channel_alloc; /* CA7-0 */
|
|
+ buf[5+3] = ((p_pkt->level_shift & 0x0F) << 3); /* LS3-0 */
|
|
+ if(p_pkt->down_mix_inhibit == true) {
|
|
+ buf[5+3] += 0x80; /* DMI bit */
|
|
+ }
|
|
+
|
|
+ /* Calculate checksum - this is worked out on "Length" bytes of the
|
|
+ * packet, the checksum (which we've preset to zero), and the three
|
|
+ * header bytes. We exclude bytes PB6 to PB10 (which we
|
|
+ * are not writing) since they are zero.
|
|
+ * */
|
|
+ buf[0+3] = calculate_checksum(&buf[0], 0x0A + 1 + 3 - 5);
|
|
+
|
|
+ /* Write header and packet bytes in one operation */
|
|
+ err = set_hw_registers(p_dis,
|
|
+ buf_reg,
|
|
+ &buf[0],
|
|
+ 9);
|
|
+ RETIF_REG_FAIL(err)
|
|
+ }
|
|
+
|
|
+ /* Write AIF packet insertion flag */
|
|
+ err = set_hw_register_field(p_dis,
|
|
+ flag_reg,
|
|
+ flag_mask,
|
|
+ (u8)b_enable);
|
|
+ return err;
|
|
+}
|
|
+
|
|
+/*============================================================================*/
|
|
+/* bslPktSetGeneralCntrl */
|
|
+/*============================================================================*/
|
|
+#ifndef DEMO_BUILD
|
|
+error_code_t
|
|
+bsl_pkt_set_general_cntrl
|
|
+(
|
|
+ unit_select_t tx_unit,
|
|
+ bsla_mute_t *pa_mute,
|
|
+ bool b_enable
|
|
+)
|
|
+{
|
|
+ hdmi_txobject_t *p_dis; /* Pointer to Device Instance Structure */
|
|
+ error_code_t err; /* Error code */
|
|
+
|
|
+ /* Check unit parameter and point to TX unit object */
|
|
+ err = check_unit_set_dis(tx_unit, &p_dis);
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+ /* Return ERR_HDMI_OPERATION_NOT_PERMITTED error if the
|
|
+ * sinkType is not HDMI
|
|
+ * */
|
|
+ RETIF(p_dis->sink_type != HDMITX_SINK_HDMI,
|
|
+ ERR_HDMI_OPERATION_NOT_PERMITTED)
|
|
+
|
|
+ /* Check remaining parameter(s) - NULL pointer allowed */
|
|
+ RETIF_BADPARAM((b_enable != true) && (b_enable != false))
|
|
+
|
|
+ if(pa_mute != NULL) {
|
|
+ RETIF_BADPARAM((*pa_mute != HDMITX_AMUTE_OFF) && (*pa_mute != HDMITX_AMUTE_ON))
|
|
+
|
|
+ if(*pa_mute == HDMITX_AMUTE_ON) {
|
|
+ err = set_hw_register(p_dis, E_REG_P11_GC_AVMUTE_RW, 0x02);
|
|
+ RETIF_REG_FAIL(err)
|
|
+ } else {
|
|
+ err = set_hw_register(p_dis, E_REG_P11_GC_AVMUTE_RW, 0x01);
|
|
+ RETIF_REG_FAIL(err)
|
|
+ }
|
|
+ }
|
|
+
|
|
+ /* Set or clear GC packet insertion flag */
|
|
+ err = set_hw_register_field(p_dis,
|
|
+ E_REG_P11_DIP_FLAGS_RW,
|
|
+ e_maskreg_p11_dip_flags_gc,
|
|
+ (u8)b_enable);
|
|
+ return err;
|
|
+}
|
|
+
|
|
+/*============================================================================*/
|
|
+/* bslPktSetIsrc1 */
|
|
+/*============================================================================*/
|
|
+error_code_t
|
|
+bsl_pkt_set_isrc1
|
|
+(
|
|
+ unit_select_t tx_unit,
|
|
+ bsl_pkt_t *p_pkt,
|
|
+ uint byte_cnt,
|
|
+ bool b_isrc_cont,
|
|
+ bool b_isrc_valid,
|
|
+ u8 u_isrc_status,
|
|
+ bool b_enable
|
|
+)
|
|
+{
|
|
+ hdmi_txobject_t *p_dis; /* Pointer to Device Instance Structure */
|
|
+ error_code_t err; /* Error code */
|
|
+ u8 buf[3]; /* Temp buffer to hold header bytes */
|
|
+
|
|
+ /* Check unit parameter and point to TX unit object */
|
|
+ err = check_unit_set_dis(tx_unit, &p_dis);
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+ /* Return ERR_HDMI_OPERATION_NOT_PERMITTED error if the
|
|
+ * sinkType is not HDMI
|
|
+ * */
|
|
+ RETIF(p_dis->sink_type != HDMITX_SINK_HDMI,
|
|
+ ERR_HDMI_OPERATION_NOT_PERMITTED)
|
|
+
|
|
+ /* Only supported for device N4 or later */
|
|
+
|
|
+ /* Check remaining parameter(s) - NULL pointer allowed */
|
|
+ RETIF_BADPARAM((b_enable != true) && (b_enable != false))
|
|
+
|
|
+ if(p_pkt != NULL) {
|
|
+ /* Pointer to structure provided so check parameters */
|
|
+ RETIF_BADPARAM((b_isrc_cont != true) && (b_isrc_cont != false))
|
|
+ RETIF_BADPARAM((b_isrc_valid != true) && (b_isrc_valid != false))
|
|
+ RETIF_BADPARAM(u_isrc_status > 7) /* 3 bits */
|
|
+ RETIF_BADPARAM(byte_cnt > HDMITX_PKT_DATA_BYTE_CNT)
|
|
+ RETIF(byte_cnt == 0, ERR_HDMI_INCONSISTENT_PARAMS)
|
|
+
|
|
+ /* Data to change, start by clearing ISRC1 packet insertion flag */
|
|
+ err = set_hw_register_field(p_dis,
|
|
+ E_REG_P11_DIP_FLAGS_RW,
|
|
+ e_maskreg_p11_dip_flags_isrc1,
|
|
+ 0x00);
|
|
+ RETIF_REG_FAIL(err)
|
|
+
|
|
+ /* Prepare ISRC1 header */
|
|
+ buf[0] = 0x05; /* ISRC1 packet */
|
|
+ buf[1] = (u_isrc_status & 0x07);
|
|
+ if(b_isrc_valid == true) {
|
|
+ buf[1] += 0x40;
|
|
+ }
|
|
+ if(b_isrc_cont == true) {
|
|
+ buf[1] += 0x80;
|
|
+ }
|
|
+ buf[2] = 0; /* Reserved [HDMI 1.2] */
|
|
+
|
|
+ /* Write 3 header bytes to registers */
|
|
+ err = set_hw_registers(p_dis,
|
|
+ E_REG_P11_ISRC1_HB0_RW,
|
|
+ &buf[0],
|
|
+ 3);
|
|
+ RETIF_REG_FAIL(err)
|
|
+
|
|
+ /* Write "byteCnt" bytes of data to registers */
|
|
+ err = set_hw_registers(p_dis,
|
|
+ E_REG_P11_ISRC1_PB0_RW,
|
|
+ &p_pkt->data_byte[0],
|
|
+ (u16)byte_cnt);
|
|
+ RETIF_REG_FAIL(err)
|
|
+ }
|
|
+
|
|
+ /* Write the ISRC1 packet insertion flag */
|
|
+ err = set_hw_register_field(p_dis,
|
|
+ E_REG_P11_DIP_FLAGS_RW,
|
|
+ e_maskreg_p11_dip_flags_isrc1,
|
|
+ (u8)b_enable);
|
|
+ return err;
|
|
+}
|
|
+
|
|
+/*============================================================================*/
|
|
+/* bslPktSetIsrc2 */
|
|
+/*============================================================================*/
|
|
+error_code_t
|
|
+bsl_pkt_set_isrc2
|
|
+(
|
|
+ unit_select_t tx_unit,
|
|
+ bsl_pkt_t *p_pkt,
|
|
+ uint byte_cnt,
|
|
+ bool b_enable
|
|
+)
|
|
+{
|
|
+ hdmi_txobject_t *p_dis; /* Pointer to Device Instance Structure */
|
|
+ error_code_t err; /* Error code */
|
|
+ u8 buf[3]; /* Temp buffer to hold header bytes */
|
|
+
|
|
+ /* Check unit parameter and point to TX unit object */
|
|
+ err = check_unit_set_dis(tx_unit, &p_dis);
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+ /* Return ERR_HDMI_OPERATION_NOT_PERMITTED error if the
|
|
+ * sinkType is not HDMI
|
|
+ * */
|
|
+ RETIF(p_dis->sink_type != HDMITX_SINK_HDMI,
|
|
+ ERR_HDMI_OPERATION_NOT_PERMITTED)
|
|
+
|
|
+ /* Only supported for device N4 or later */
|
|
+
|
|
+ /* Check remaining parameter(s) - NULL pointer allowed */
|
|
+ RETIF_BADPARAM((b_enable != true) && (b_enable != false))
|
|
+
|
|
+ if(p_pkt != NULL) {
|
|
+ /* Pointer to structure provided so check parameters */
|
|
+ RETIF_BADPARAM(byte_cnt > HDMITX_PKT_DATA_BYTE_CNT)
|
|
+ RETIF(byte_cnt == 0, ERR_HDMI_INCONSISTENT_PARAMS)
|
|
+
|
|
+ /* Data to change, start by clearing ISRC2 packet insertion flag */
|
|
+ err = set_hw_register_field(p_dis,
|
|
+ E_REG_P11_DIP_FLAGS_RW,
|
|
+ e_maskreg_p11_dip_flags_isrc2,
|
|
+ 0x00);
|
|
+ RETIF_REG_FAIL(err)
|
|
+
|
|
+ /* Prepare ISRC2 header */
|
|
+ buf[0] = 0x06; /* ISRC2 packet */
|
|
+ buf[1] = 0; /* Reserved [HDMI 1.2] */
|
|
+ buf[2] = 0; /* Reserved [HDMI 1.2] */
|
|
+
|
|
+ /* Write 3 header bytes to registers */
|
|
+ err = set_hw_registers(p_dis,
|
|
+ E_REG_P11_ISRC2_HB0_RW,
|
|
+ &buf[0],
|
|
+ 3);
|
|
+ RETIF_REG_FAIL(err)
|
|
+
|
|
+ /* Write "byteCnt" bytes of data to registers */
|
|
+ err = set_hw_registers(p_dis,
|
|
+ E_REG_P11_ISRC2_PB0_RW,
|
|
+ &p_pkt->data_byte[0],
|
|
+ (u16)byte_cnt);
|
|
+ RETIF_REG_FAIL(err)
|
|
+ }
|
|
+
|
|
+ /* Write the ISRC2 packet insertion flag */
|
|
+ err = set_hw_register_field(p_dis,
|
|
+ E_REG_P11_DIP_FLAGS_RW,
|
|
+ e_maskreg_p11_dip_flags_isrc2,
|
|
+ (u8)b_enable);
|
|
+ return err;
|
|
+}
|
|
+
|
|
+/*============================================================================*/
|
|
+/* bslPktSetMpegInfoframe */
|
|
+/*============================================================================*/
|
|
+error_code_t
|
|
+bsl_pkt_set_mpeg_infoframe
|
|
+(
|
|
+ unit_select_t tx_unit,
|
|
+ bsl_pkt_mpeg_t *p_pkt,
|
|
+ bool b_enable
|
|
+)
|
|
+{
|
|
+ hdmi_txobject_t *p_dis; /* Pointer to Device Instance Structure */
|
|
+ error_code_t err; /* Error code */
|
|
+ u8 buf[9]; /* Temp buffer to hold packet */
|
|
+
|
|
+ /* Check unit parameter and point to TX unit object */
|
|
+ err = check_unit_set_dis(tx_unit, &p_dis);
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+ /* Return ERR_HDMI_OPERATION_NOT_PERMITTED error if the
|
|
+ * sinkType is not HDMI
|
|
+ * */
|
|
+ RETIF(p_dis->sink_type != HDMITX_SINK_HDMI,
|
|
+ ERR_HDMI_OPERATION_NOT_PERMITTED)
|
|
+
|
|
+ /* Only supported for device N4 or later */
|
|
+
|
|
+ /* Check remaining parameter(s) */
|
|
+ RETIF_BADPARAM((b_enable != true) && (b_enable != false))
|
|
+
|
|
+ if(p_pkt != NULL) {
|
|
+ /* Pointer to structure provided so check parameters */
|
|
+ RETIF_BADPARAM((p_pkt->b_field_repeat != true) && (p_pkt->b_field_repeat != false))
|
|
+ RETIF_BADPARAM(p_pkt->frame_type >= HDMITX_MPEG_FRAME_INVALID)
|
|
+
|
|
+ /* Data to change, start by clearing MPEG packet insertion flag */
|
|
+ err = set_hw_register_field(p_dis,
|
|
+ E_REG_P11_DIP_IF_FLAGS_RW,
|
|
+ e_maskreg_p11_dip_if_flags_if5,
|
|
+ 0x00);
|
|
+ RETIF_REG_FAIL(err)
|
|
+
|
|
+ /* Prepare MPEG header */
|
|
+ buf[0] = 0x85; /* MPEG Source InfoFrame */
|
|
+ buf[1] = 0x01; /* Version 1 [HDMI 1.2] */
|
|
+ buf[2] = 0x0A; /* Length [HDMI 1.2] */
|
|
+
|
|
+ /* Prepare MPEG packet (byte numbers offset by 3) */
|
|
+ buf[0+3] = 0; /* Preset checksum to zero so calculation works! */
|
|
+ buf[1+3] = (u8)(p_pkt->bit_rate & 0x000000FF);
|
|
+ buf[2+3] = (u8)((p_pkt->bit_rate & 0x0000FF00) >> 8);
|
|
+ buf[3+3] = (u8)((p_pkt->bit_rate & 0x00FF0000) >> 16);
|
|
+ buf[4+3] = (u8)((p_pkt->bit_rate & 0xFF000000) >> 24);
|
|
+ buf[5+3] = p_pkt->frame_type; /* MF1-0 */
|
|
+ if(p_pkt->b_field_repeat == true) {
|
|
+ buf[5+3] += 0x10; /* FR0 bit */
|
|
+ }
|
|
+
|
|
+ /* Calculate checksum - this is worked out on "Length" bytes of the
|
|
+ * packet, the checksum (which we've preset to zero), and the three
|
|
+ * header bytes. We exclude bytes PB6 to PB10 (which we
|
|
+ * are not writing) since they are zero.
|
|
+ * */
|
|
+ buf[0+3] = calculate_checksum(&buf[0], 0x0A + 1 + 3 - 5);
|
|
+
|
|
+ /* Write header and packet bytes in one operation */
|
|
+ err = set_hw_registers(p_dis,
|
|
+ E_REG_P10_IF5_HB0_RW,
|
|
+ &buf[0],
|
|
+ 9);
|
|
+ RETIF_REG_FAIL(err)
|
|
+ }
|
|
+
|
|
+ /* Write the MPEG packet insertion flag */
|
|
+ err = set_hw_register_field(p_dis,
|
|
+ E_REG_P11_DIP_IF_FLAGS_RW,
|
|
+ e_maskreg_p11_dip_if_flags_if5,
|
|
+ (u8)b_enable);
|
|
+ return err;
|
|
+}
|
|
+
|
|
+/*============================================================================*/
|
|
+/* bslPktSetNullInsert */
|
|
+/*============================================================================*/
|
|
+error_code_t
|
|
+bsl_pkt_set_null_insert
|
|
+(
|
|
+ unit_select_t tx_unit,
|
|
+ bool b_enable
|
|
+)
|
|
+{
|
|
+ hdmi_txobject_t *p_dis; /* Pointer to Device Instance Structure */
|
|
+ error_code_t err; /* Error code */
|
|
+
|
|
+ /* Check unit parameter and point to TX unit object */
|
|
+ err = check_unit_set_dis(tx_unit, &p_dis);
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+ /* Return ERR_HDMI_OPERATION_NOT_PERMITTED error if the
|
|
+ * sinkType is not HDMI
|
|
+ * */
|
|
+ RETIF(p_dis->sink_type != HDMITX_SINK_HDMI,
|
|
+ ERR_HDMI_OPERATION_NOT_PERMITTED)
|
|
+
|
|
+ /* Check remaining parameter(s) */
|
|
+ RETIF_BADPARAM((b_enable != true) && (b_enable != false))
|
|
+
|
|
+ /* Set or clear FORCE_NULL packet insertion flag */
|
|
+ err = set_hw_register_field(p_dis,
|
|
+ E_REG_P11_DIP_FLAGS_RW,
|
|
+ e_maskreg_p11_dip_flags_force_null,
|
|
+ (u8)b_enable);
|
|
+ return err;
|
|
+}
|
|
+
|
|
+/*============================================================================*/
|
|
+/* bslPktSetNullSingle */
|
|
+/*============================================================================*/
|
|
+error_code_t
|
|
+bsl_pkt_set_null_single
|
|
+(
|
|
+ unit_select_t tx_unit
|
|
+)
|
|
+{
|
|
+ hdmi_txobject_t *p_dis; /* Pointer to Device Instance Structure */
|
|
+ error_code_t err; /* Error code */
|
|
+
|
|
+ /* Check unit parameter and point to TX unit object */
|
|
+ err = check_unit_set_dis(tx_unit, &p_dis);
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+ /* Return ERR_HDMI_OPERATION_NOT_PERMITTED error if the
|
|
+ * sinkType is not HDMI
|
|
+ * */
|
|
+ RETIF(p_dis->sink_type != HDMITX_SINK_HDMI,
|
|
+ ERR_HDMI_OPERATION_NOT_PERMITTED)
|
|
+
|
|
+ /* Set NULL packet insertion flag */
|
|
+ err = set_hw_register_field(p_dis,
|
|
+ E_REG_P11_DIP_FLAGS_RW,
|
|
+ e_maskreg_p11_dip_flags_null,
|
|
+ 0x01);
|
|
+ return err;
|
|
+}
|
|
+
|
|
+/*============================================================================*/
|
|
+/* bslPktSetSpdInfoframe */
|
|
+/*============================================================================*/
|
|
+error_code_t
|
|
+bsl_pkt_set_spd_infoframe
|
|
+(
|
|
+ unit_select_t tx_unit,
|
|
+ bsl_pkt_spd_t *p_pkt,
|
|
+ bool b_enable
|
|
+)
|
|
+{
|
|
+ hdmi_txobject_t *p_dis; /* Pointer to Device Instance Structure */
|
|
+ error_code_t err; /* Error code */
|
|
+ u8 buf[29];/* Temp buffer to hold packet */
|
|
+
|
|
+ /* Check unit parameter and point to TX unit object */
|
|
+ err = check_unit_set_dis(tx_unit, &p_dis);
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+ /* Return ERR_HDMI_OPERATION_NOT_PERMITTED error if the
|
|
+ * sinkType is not HDMI
|
|
+ * */
|
|
+ RETIF(p_dis->sink_type != HDMITX_SINK_HDMI,
|
|
+ ERR_HDMI_OPERATION_NOT_PERMITTED)
|
|
+
|
|
+ /* Only supported for device N4 or later */
|
|
+
|
|
+ /* Check remaining parameter(s) */
|
|
+ RETIF_BADPARAM((b_enable != true) && (b_enable != false))
|
|
+
|
|
+ if(p_pkt != NULL) {
|
|
+ /* Pointer to structure provided so check parameters */
|
|
+ RETIF_BADPARAM(p_pkt->source_dev_info >= HDMITX_SPD_INFO_INVALID)
|
|
+
|
|
+ /* Data to change, start by clearing SPD packet insertion flag */
|
|
+ err = set_hw_register_field(p_dis,
|
|
+ E_REG_P11_DIP_IF_FLAGS_RW,
|
|
+ e_maskreg_p11_dip_if_flags_if3,
|
|
+ 0x00);
|
|
+ RETIF_REG_FAIL(err)
|
|
+
|
|
+ /* Prepare SPD header */
|
|
+ buf[0] = 0x83; /* Source. Product Descriptor InfoFrame */
|
|
+ buf[1] = 0x01; /* Version 1 [CEA 861B] */
|
|
+ buf[2] = 0x19; /* Length [HDMI 1.2] */
|
|
+
|
|
+ /* Prepare SPD packet (byte numbers offset by 3) */
|
|
+ buf[0+3] = 0; /* Preset checksum to zero so calculation works! */
|
|
+ lmemcpy(&buf[1+3], &p_pkt->vendor_name[0], HDMI_TX_SPD_VENDOR_SIZE);
|
|
+ lmemcpy(&buf[1+3+HDMI_TX_SPD_VENDOR_SIZE], &p_pkt->prod_descr[0],
|
|
+ HDMI_TX_SPD_DESCR_SIZE);
|
|
+
|
|
+ buf[HDMI_TX_SPD_LENGTH+3] = p_pkt->source_dev_info;
|
|
+
|
|
+ /* Calculate checksum - this is worked out on "Length" bytes of the
|
|
+ * packet, the checksum (which we've preset to zero), and the three
|
|
+ * header bytes.
|
|
+ * */
|
|
+ buf[0+3] = calculate_checksum(&buf[0], HDMI_TX_SPD_LENGTH + 1 + 3);
|
|
+
|
|
+ /* Write header and packet bytes in one operation */
|
|
+ err = set_hw_registers(p_dis,
|
|
+ E_REG_P10_IF3_HB0_RW,
|
|
+ &buf[0],
|
|
+ 29);
|
|
+ RETIF_REG_FAIL(err)
|
|
+ }
|
|
+
|
|
+ /* Write the SPD packet insertion flag */
|
|
+ err = set_hw_register_field(p_dis,
|
|
+ E_REG_P11_DIP_IF_FLAGS_RW,
|
|
+ e_maskreg_p11_dip_if_flags_if3,
|
|
+ (u8)b_enable);
|
|
+ return err;
|
|
+}
|
|
+#endif /* DEMO_BUILD */
|
|
+
|
|
+/*============================================================================*/
|
|
+/* bslPktSetVideoInfoframe */
|
|
+/*============================================================================*/
|
|
+error_code_t
|
|
+bsl_pkt_set_video_infoframe
|
|
+(
|
|
+ unit_select_t tx_unit,
|
|
+ bsl_pkt_vif_t *p_pkt,
|
|
+ bool b_enable
|
|
+)
|
|
+{
|
|
+ hdmi_txobject_t *p_dis; /* Pointer to Device Instance Structure */
|
|
+ error_code_t err; /* Error code */
|
|
+ u8 buf[17];/* Temp buffer to hold header/packet bytes */
|
|
+ u16 buf_reg; /* Base register used for writing InfoFrame*/
|
|
+ u16 flag_reg;/* Flag register to be used */
|
|
+ u8 flag_mask;/* Mask used for writing flag register */
|
|
+
|
|
+ /* Check unit parameter and point to TX unit object */
|
|
+ err = check_unit_set_dis(tx_unit, &p_dis);
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+ /* Return ERR_HDMI_OPERATION_NOT_PERMITTED error if the
|
|
+ * sinkType is not HDMI
|
|
+ * */
|
|
+ RETIF(p_dis->sink_type != HDMITX_SINK_HDMI,
|
|
+ ERR_HDMI_OPERATION_NOT_PERMITTED)
|
|
+
|
|
+ /* Check remaining parameter(s) - NULL pointer allowed */
|
|
+ RETIF_BADPARAM((b_enable != true) && (b_enable != false))
|
|
+ if(p_pkt != NULL) {
|
|
+ /* Pointer to structure provided so check parameters */
|
|
+ RETIF_BADPARAM(p_pkt->colour > 0x03)
|
|
+ RETIF_BADPARAM((p_pkt->active_info != true) && (p_pkt->active_info != false))
|
|
+ RETIF_BADPARAM(p_pkt->bar_info > 0x03)
|
|
+ RETIF_BADPARAM(p_pkt->scan_info > 0x03)
|
|
+ RETIF_BADPARAM(p_pkt->colorimetry > 0x03)
|
|
+ RETIF_BADPARAM(p_pkt->picture_aspect_ratio > 0x03)
|
|
+ RETIF_BADPARAM(p_pkt->active_format_ratio > 0x0F)
|
|
+ RETIF_BADPARAM(p_pkt->scaling > 0x03)
|
|
+ RETIF_BADPARAM(p_pkt->vid_format > 0x7F)
|
|
+ RETIF_BADPARAM(p_pkt->pixel_repeat > 0x0F)
|
|
+ }
|
|
+
|
|
+ /* Only supported for device N4 or later */
|
|
+
|
|
+ /* We're using n4 or later, use IF2 buffer for Video InfoFrame */
|
|
+ buf_reg = E_REG_P10_IF2_HB0_RW;
|
|
+ flag_reg = E_REG_P11_DIP_IF_FLAGS_RW;
|
|
+ flag_mask = e_maskreg_p11_dip_if_flags_if2;
|
|
+
|
|
+ if(p_pkt != NULL) {
|
|
+ /* Data to change, start by clearing VIF packet insertion flag */
|
|
+ err = set_hw_register_field(p_dis,
|
|
+ flag_reg,
|
|
+ flag_mask,
|
|
+ 0x00);
|
|
+ RETIF_REG_FAIL(err)
|
|
+
|
|
+ /* Prepare VIF header */
|
|
+ buf[0] = 0x82; /* Video InfoFrame */
|
|
+ buf[1] = 0x02; /* Version 2 [HDMI 1.2] */
|
|
+ buf[2] = 0x0D; /* Length [HDMI 1.2] */
|
|
+
|
|
+ /* Prepare VIF packet (byte numbers offset by 3) */
|
|
+ buf[0+3] = 0; /* Preset checksum to zero so calculation works! */
|
|
+ buf[1+3] = ((p_pkt->colour & 0x03) << 5) | /* Y1-0, B1-0,S1-0 */
|
|
+ ((p_pkt->bar_info & 0x03) << 2) |
|
|
+ (p_pkt->scan_info & 0x03);
|
|
+ if(p_pkt->active_info == true) {
|
|
+ buf[1+3] += 0x10; /* AI bit */
|
|
+ }
|
|
+ buf[2+3] = ((p_pkt->colorimetry & 0x03) << 6) | /* C1-0, M1-0, R3-0 */
|
|
+ ((p_pkt->picture_aspect_ratio & 0x03) << 4) |
|
|
+ (p_pkt->active_format_ratio & 0x0F);
|
|
+ /* SC1-0 / [HDMI 1.2] */
|
|
+ buf[3+3] = (p_pkt->scaling & 0x03);
|
|
+ buf[4+3] = (p_pkt->vid_format & 0x7F); /* VIC6-0 */
|
|
+ buf[5+3] = (p_pkt->pixel_repeat & 0x0F); /* PR3-0 */
|
|
+ buf[6+3] = (u8)(p_pkt->end_top_bar_line & 0x00FF);
|
|
+ buf[7+3] = (u8)((p_pkt->end_top_bar_line & 0xFF00) >> 8);
|
|
+ buf[8+3] = (u8)(p_pkt->start_bottom_bar_line & 0x00FF);
|
|
+ buf[9+3] = (u8)((p_pkt->start_bottom_bar_line & 0xFF00) >> 8);
|
|
+ buf[10+3] = (u8)(p_pkt->end_left_bar_pixel & 0x00FF);
|
|
+ buf[11+3] = (u8)((p_pkt->end_left_bar_pixel & 0xFF00) >> 8);
|
|
+ buf[12+3] = (u8)(p_pkt->start_right_bar_pixel & 0x00FF);
|
|
+ buf[13+3] = (u8)((p_pkt->start_right_bar_pixel & 0xFF00) >> 8);
|
|
+
|
|
+ /* Calculate checksum - this is worked out on "Length" bytes of the
|
|
+ * packet, the checksum (which we've preset to zero), and the three
|
|
+ * header bytes.
|
|
+ * */
|
|
+ buf[0+3] = calculate_checksum(&buf[0], 0x0D + 1 + 3);
|
|
+
|
|
+ /* Write header and packet bytes in one operation */
|
|
+ err = set_hw_registers(p_dis,
|
|
+ buf_reg,
|
|
+ &buf[0],
|
|
+ 17);
|
|
+ RETIF_REG_FAIL(err)
|
|
+ }
|
|
+
|
|
+ /* Write VIF packet insertion flag */
|
|
+ err = set_hw_register_field(p_dis,
|
|
+ flag_reg,
|
|
+ flag_mask,
|
|
+ (u8)b_enable);
|
|
+ return err;
|
|
+}
|
|
+
|
|
+/*============================================================================*/
|
|
+/* bslPktSetVsInfoframe */
|
|
+/*============================================================================*/
|
|
+#ifndef DEMO_BUILD
|
|
+error_code_t
|
|
+bsl_pkt_set_vs_infoframe
|
|
+(
|
|
+ unit_select_t tx_unit,
|
|
+ bsl_pkt_t *p_pkt,
|
|
+ uint byte_cnt,
|
|
+ u8 u_version,
|
|
+ bool b_enable
|
|
+)
|
|
+{
|
|
+ hdmi_txobject_t *p_dis; /* Pointer to Device Instance Structure */
|
|
+ error_code_t err; /* Error code */
|
|
+ u8 buf[31];/* Temp buffer to hold packet */
|
|
+
|
|
+ /* Check unit parameter and point to TX unit object */
|
|
+ err = check_unit_set_dis(tx_unit, &p_dis);
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+ /* Return ERR_HDMI_OPERATION_NOT_PERMITTED error if the
|
|
+ * sinkType is not HDMI
|
|
+ * */
|
|
+ RETIF(p_dis->sink_type != HDMITX_SINK_HDMI,
|
|
+ ERR_HDMI_OPERATION_NOT_PERMITTED)
|
|
+
|
|
+ /* Only supported for device N4 or later */
|
|
+
|
|
+ /* Check remaining parameter(s) - NULL pointer allowed */
|
|
+ RETIF_BADPARAM((b_enable != true) && (b_enable != false))
|
|
+
|
|
+ if(p_pkt != NULL) {
|
|
+ /* Pointer to structure provided so check parameters */
|
|
+ /* InfoFrame needs a checksum, so 1 usable byte less than full pkt */
|
|
+ RETIF_BADPARAM(byte_cnt > (HDMITX_PKT_DATA_BYTE_CNT - 1))
|
|
+ RETIF(byte_cnt == 0, ERR_HDMI_INCONSISTENT_PARAMS)
|
|
+
|
|
+ /* Data to change, start by clearing VS_IF packet insertion flag */
|
|
+ err = set_hw_register_field(p_dis,
|
|
+ E_REG_P11_DIP_IF_FLAGS_RW,
|
|
+ e_maskreg_p11_dip_if_flags_if1,
|
|
+ 0x00);
|
|
+ RETIF_REG_FAIL(err)
|
|
+
|
|
+ /* Prepare VS_IF header */
|
|
+ /* Clear buffer as user may vary length used */
|
|
+ lmemset(&buf[0], 0, 31);
|
|
+ buf[0] = 0x81; /* Vendor Specific InfoFrame */
|
|
+ buf[1] = u_version; /* Vendor defined version */
|
|
+ buf[2] = (u8)byte_cnt; /* Length [HDMI 1.2] */
|
|
+
|
|
+ /* Prepare VS_IF packet (byte numbers offset by 3) */
|
|
+ buf[0+3] = 0; /* Preset checksum to zero so calculation works! */
|
|
+ lmemcpy(&buf[1+3], &p_pkt->data_byte[0], byte_cnt);
|
|
+
|
|
+ /* Calculate checksum - this is worked out on "Length" bytes of the
|
|
+ * packet, the checksum (which we've preset to zero), and the three
|
|
+ * header bytes.
|
|
+ * */
|
|
+ buf[0+3] = calculate_checksum(&buf[0], byte_cnt + 1 + 3);
|
|
+
|
|
+ /* Write header and packet bytes in one operation - write entire
|
|
+ * buffer even though we may not be using it all so that zeros
|
|
+ * are placed in the unused registers. */
|
|
+ err = set_hw_registers(p_dis,
|
|
+ E_REG_P10_IF1_HB0_RW,
|
|
+ &buf[0],
|
|
+ 31);
|
|
+ RETIF_REG_FAIL(err)
|
|
+ }
|
|
+
|
|
+ /* Write the VS_IF packet insertion flag */
|
|
+ err = set_hw_register_field(p_dis,
|
|
+ E_REG_P11_DIP_IF_FLAGS_RW,
|
|
+ e_maskreg_p11_dip_if_flags_if1,
|
|
+ (u8)b_enable);
|
|
+ return err;
|
|
+}
|
|
+#endif /* DEMO_BUILD */
|
|
+
|
|
+/*============================================================================*/
|
|
+/* STATIC FUNCTION DEFINTIONS */
|
|
+/*============================================================================*/
|
|
+
|
|
+/*============================================================================*/
|
|
+/* calculateChecksum - returns the byte needed to yield a checksum of zero */
|
|
+/*============================================================================*/
|
|
+static u8
|
|
+calculate_checksum
|
|
+(
|
|
+ u8 *p_data, /* Pointer to checksum data */
|
|
+ int num_bytes /* Number of bytes over which to calculate */
|
|
+)
|
|
+{
|
|
+ u8 checksum = 0; /* Working checksum calculation */
|
|
+ u8 result = 0; /* Value to be returned */
|
|
+ int i;
|
|
+
|
|
+ if((p_data != NULL) && (num_bytes > 0)) {
|
|
+ for(i = 0; i < num_bytes; i++) {
|
|
+ checksum = checksum + (*(p_data + i));
|
|
+ }
|
|
+ result = (255 - checksum) + 1;
|
|
+ }
|
|
+ return result; /* returns 0 in the case of null ptr or 0 bytes */
|
|
+}
|
|
+
|
|
+/*============================================================================*/
|
|
+/* getEdidBlock - reads an entire edid block */
|
|
+/*============================================================================*/
|
|
+static error_code_t
|
|
+get_edid_block
|
|
+(
|
|
+ hdmi_txobject_t *p_dis, /* Device instance strucure to use */
|
|
+ int block_number /* Block number to read */
|
|
+)
|
|
+{
|
|
+ error_code_t err; /* Error code */
|
|
+ int i; /* Loop index */
|
|
+ u8 chksum; /* Checksum value */
|
|
+ u8 segptr; /* Segment ptr value */
|
|
+ u8 offset; /* Word offset value */
|
|
+ bsl_sys_args_edid_t sys_args; /* Arguments passed to system function */
|
|
+
|
|
+ /* Check block number is valid [CEA861C A.2.1] */
|
|
+ RETIF_BADPARAM(block_number >= 255)
|
|
+
|
|
+ /* Enable the EDID ghost device to allow I2C write-through */
|
|
+ /* Write the segment pointer address into the ghost regsiter */
|
|
+ /* (For N3, we did't use the segptr and did't support alternate addr) */
|
|
+ /* Load both Ghost registers - we load whole register so no shadowing
|
|
+ * to give control of lsbs */
|
|
+
|
|
+ if(p_dis->b_edid_alternate_addr == true) {
|
|
+ /* Use alternate address and set a0_zero bit (lsb) in GHOST_XADDR */
|
|
+ err = set_hw_register(p_dis, E_REG_P00_GHOST_XADDR_W,
|
|
+ DDC_SGMT_PTR_ADDRESS + 1);
|
|
+ RETIF_REG_FAIL(err)
|
|
+ err = set_hw_register(p_dis, E_REG_P00_GHOST_ADDR_W,
|
|
+ DDC_EDID_ADDRESS_ALT);
|
|
+ RETIF_REG_FAIL(err)
|
|
+ } else {
|
|
+ /* Use normal address and don't set a0_zero bit */
|
|
+ err = set_hw_register(p_dis, E_REG_P00_GHOST_XADDR_W,
|
|
+ DDC_SGMT_PTR_ADDRESS);
|
|
+ RETIF_REG_FAIL(err)
|
|
+ err = set_hw_register(p_dis, E_REG_P00_GHOST_ADDR_W,
|
|
+ DDC_EDID_ADDRESS);
|
|
+ RETIF_REG_FAIL(err)
|
|
+ }
|
|
+
|
|
+ /* Calculate which segment of the EDID we need (2 blocks per segment) */
|
|
+ segptr = (u8)block_number / 2;
|
|
+ /* For even blocks we need an offset of 0, odd blocks we need 128 */
|
|
+ offset = (((u8)block_number & 1) == 1) ? 128 : 0;
|
|
+
|
|
+ /* If we're reading blocks 0 or 1, we don't use segptr, as sink may not
|
|
+ * support it. We also never use for n3 or earlier, as it is not
|
|
+ * supported.
|
|
+ * */
|
|
+ if(block_number < 2) {
|
|
+ /* NULL SegPtrAddress used to indicate seg ptr should be skipped */
|
|
+ sys_args.seg_ptr_addr = 0;
|
|
+ } else {
|
|
+ sys_args.seg_ptr_addr = DDC_SGMT_PTR_ADDRESS;
|
|
+ }
|
|
+
|
|
+ if(p_dis->b_edid_alternate_addr == true) {
|
|
+ /* Use alternate address */
|
|
+ sys_args.data_reg_addr = DDC_EDID_ADDRESS_ALT;
|
|
+ } else {
|
|
+ /* Use default address */
|
|
+ sys_args.data_reg_addr = DDC_EDID_ADDRESS;
|
|
+ }
|
|
+
|
|
+ /* Read EDID block: THIS CAN FAIL IF DDC CONNECTION IS BROKEN */
|
|
+ sys_args.seg_ptr = segptr;
|
|
+ sys_args.word_offset = offset;
|
|
+ sys_args.len_data = EDID_BLOCK_SIZE;
|
|
+ sys_args.p_data = p_dis->edid_block;
|
|
+ err = p_dis->sys_func_edid_read(&sys_args);
|
|
+
|
|
+ /* Do not quit yet on I2C error: must always set GHOST_ADDR here */
|
|
+ set_hw_register(p_dis, E_REG_P00_GHOST_ADDR_W, 0x01);
|
|
+
|
|
+ /* Ignore last error, but return the more important EDID Read error */
|
|
+ RETIF(err != 0, ERR_HDMI_I2C_READ)
|
|
+
|
|
+ /* Add up all the values of the EDID block bytes, including the
|
|
+ * checksum byte
|
|
+ * */
|
|
+ chksum = 0;
|
|
+ for(i = 0; i < EDID_BLOCK_SIZE; i++) {
|
|
+ chksum = chksum + p_dis->edid_block[i];
|
|
+ }
|
|
+
|
|
+ /* IF the EDID block does not yield a checksum of zero
|
|
+ * THEN return a ERR_HDMI_INVALID_STATE error.
|
|
+ * */
|
|
+ return (chksum == 0) ? 0 : ERR_HDMI_INVALID_STATE;
|
|
+}
|
|
+
|
|
+/*============================================================================*/
|
|
+/* parseEdidBlock */
|
|
+/*============================================================================*/
|
|
+static error_code_t
|
|
+parse_edid_block
|
|
+(
|
|
+ /* Device instance strucure holding block */
|
|
+ hdmi_txobject_t *p_dis,
|
|
+ int block_number /* Block number */
|
|
+)
|
|
+{
|
|
+ u8 i; /* Loop index */
|
|
+ u8 block_ptr, end_ptr; /* Parsing pointers */
|
|
+ u8 block_type, block_length;
|
|
+ bool dtd_found;
|
|
+ u8 nb_blk_read;
|
|
+
|
|
+ /* Check block number is valid [CEA861C A.2.1] */
|
|
+ RETIF_BADPARAM(block_number >= 255)
|
|
+
|
|
+ nb_blk_read = 0;
|
|
+ dtd_found = true;
|
|
+ block_ptr = 0;
|
|
+
|
|
+ if(block_number == 0) {
|
|
+ p_dis->edidbasic_display_param.u_video_input_def = p_dis->edid_block[0x14];
|
|
+ p_dis->edidbasic_display_param.u_max_horizontal_size = p_dis->edid_block[0x15];
|
|
+ p_dis->edidbasic_display_param.u_max_vertical_size = p_dis->edid_block[0x16];
|
|
+ p_dis->edidbasic_display_param.u_gamma = p_dis->edid_block[0x17];
|
|
+ p_dis->edidbasic_display_param.u_feature_support = p_dis->edid_block[0x18];
|
|
+
|
|
+ /* Block 0 - contains DTDs but no video data block (SVDs) */
|
|
+ /* search 2 possible DTD blocks in block 0 */
|
|
+ for(i = 0; (i < 2) && (dtd_found); i++) {
|
|
+ block_ptr = (u8)(EDID_BLK0_BASE_DTD + (i * EDID_DTD_BLK_SIZE));
|
|
+ if((block_ptr + EDID_DTD_BLK_SIZE - 1) < EDID_BLOCK_SIZE) {
|
|
+ dtd_found = store_dtd_block(p_dis, block_ptr);
|
|
+ if(dtd_found) {
|
|
+ nb_blk_read++;
|
|
+ }
|
|
+ }
|
|
+ }
|
|
+
|
|
+ dtd_found = true;
|
|
+
|
|
+ /* Parse monitor descriptor */
|
|
+ for(i = nb_blk_read; (i < EDID_NB_MAX_DESCRIP_BLK_IN_BLK_0) && (dtd_found); i++) {
|
|
+ block_ptr = (u8)(EDID_BLK0_BASE_DTD + (i * EDID_DTD_BLK_SIZE));
|
|
+ if((block_ptr + EDID_DTD_BLK_SIZE - 1) < EDID_BLOCK_SIZE) {
|
|
+#ifndef DEMO_BUILD
|
|
+ dtd_found = store_monitor_descriptor(p_dis, block_ptr);
|
|
+#endif /* DEMO_BUILD */
|
|
+ }
|
|
+ }
|
|
+ } else if(block_number >= 1) {
|
|
+ switch(p_dis->edid_block[0]) {
|
|
+ /* CEA EXTENSION */
|
|
+ case EDID_CEA_EXTENSION:
|
|
+ /* Read CEA flag bits here - lockout when read once??? */
|
|
+ p_dis->edid_cea_flags = p_dis->edid_block[3];
|
|
+
|
|
+ /* data block start always fixed */
|
|
+ block_ptr = EDID_BLK_EXT_BASE;
|
|
+ /* byte after end of data blocks */
|
|
+ end_ptr = p_dis->edid_block[2];
|
|
+ if(end_ptr >= (EDID_BLK_EXT_BASE + 2))
|
|
+ /* Only try reading if data blocks take up 2 bytes or more, since
|
|
+ * a video data block must be at least 2 bytes
|
|
+ * */
|
|
+ {
|
|
+ while(block_ptr < end_ptr) {
|
|
+ block_type = (u8)((p_dis->edid_block[block_ptr] & 0xE0) >> 5);
|
|
+ block_length = (p_dis->edid_block[block_ptr] & 0x1F);
|
|
+
|
|
+ switch((int)block_type) {
|
|
+ case E_CEA_VIDEO_BLOCK: /* We have a video data block */
|
|
+ for(i = 1; i <= block_length; i++) {
|
|
+ /* If space, store non-zero SVDs */
|
|
+ if((p_dis->edid_block[block_ptr + i] != 0) &&
|
|
+ (p_dis->edid_svd_cnt < HDMI_TX_SVD_MAX_CNT)) {
|
|
+ p_dis->edid_vfmts[p_dis->edid_svd_cnt] =
|
|
+ p_dis->edid_block[block_ptr + i];
|
|
+ p_dis->edid_svd_cnt++;
|
|
+ }
|
|
+ }
|
|
+ break;
|
|
+ case E_CEA_AUDIO_BLOCK: /* We have an audio data block */
|
|
+ for(i = 1; (i + 2) <= block_length; i += 3) {
|
|
+ /* Must loop in steps of 3 (SAD size) */
|
|
+ /* If space, store non-zero SADs */
|
|
+ if(((p_dis->edid_block[block_ptr + i] & 0x78) != 0) &&
|
|
+ (p_dis->edid_sad_cnt < HDMI_TX_SAD_MAX_CNT)) {
|
|
+ p_dis->edid_afmts[p_dis->edid_sad_cnt].mode_chans =
|
|
+ p_dis->edid_block[block_ptr + i];
|
|
+ p_dis->edid_afmts[p_dis->edid_sad_cnt].freqs =
|
|
+ p_dis->edid_block[block_ptr + i + 1];
|
|
+ p_dis->edid_afmts[p_dis->edid_sad_cnt].byte3 =
|
|
+ p_dis->edid_block[block_ptr + i + 2];
|
|
+ p_dis->edid_sad_cnt++;
|
|
+ }
|
|
+ }
|
|
+ break;
|
|
+ case E_CEA_VSDB: /* We have a VSDB */
|
|
+ /* 5 bytes expected, but this is EDID land so double check*/
|
|
+ if(block_length >= 5) {
|
|
+ if((p_dis->edid_block[block_ptr + 1] == 0x03) &&
|
|
+ (p_dis->edid_block[block_ptr + 2] == 0x0C) &&
|
|
+ (p_dis->edid_block[block_ptr + 3] == 0x00)) {
|
|
+ p_dis->edid_sink_type = HDMITX_SINK_HDMI;
|
|
+ p_dis->edid_source_address =
|
|
+ ((u16)p_dis->edid_block[block_ptr + 4] << 8) +
|
|
+ p_dis->edid_block[block_ptr + 5];
|
|
+ } else {
|
|
+ p_dis->edid_sink_type = HDMITX_SINK_DVI;
|
|
+ }
|
|
+ }
|
|
+ /* Space for byte with AI flag */
|
|
+ if(block_length >= 6) {
|
|
+ /* Mask AI bit */
|
|
+ if((p_dis->edid_block[block_ptr + 6] & 0x80) == 0x80) {
|
|
+ p_dis->edid_sink_ai = true;
|
|
+ }
|
|
+ }
|
|
+ break;
|
|
+ default:
|
|
+ break;
|
|
+ }
|
|
+ block_ptr += (block_length + 1); /* Point to next block */
|
|
+ }
|
|
+ }
|
|
+ dtd_found = true;
|
|
+
|
|
+ /* search possible DTD blocks in block 1 */
|
|
+ for(i = 0; (i < EDID_NUMBER_MAX_DTD_BLK_1) && (dtd_found); i++) {
|
|
+ block_ptr = ((u8)p_dis->edid_block[EDID_BLK1_OFFSET_BASE_DTD]) + ((u8)(i * EDID_DTD_BLK_SIZE));
|
|
+ if((block_ptr + EDID_DTD_BLK_SIZE - 1) < EDID_BLOCK_SIZE) {
|
|
+ dtd_found = store_dtd_block(p_dis, block_ptr);
|
|
+
|
|
+ }
|
|
+ }
|
|
+
|
|
+ break;
|
|
+
|
|
+ case EDID_BLOCK_MAP:
|
|
+ /* BLOCK MAP */
|
|
+ /* Nothing special to do */
|
|
+ break;
|
|
+
|
|
+ }
|
|
+
|
|
+ }
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+/*============================================================================*/
|
|
+/* storeDtdBlock */
|
|
+/*============================================================================*/
|
|
+
|
|
+static bool
|
|
+store_dtd_block
|
|
+(
|
|
+ /* Device instance strucure holding block */
|
|
+ hdmi_txobject_t *p_dis,
|
|
+ u8 block_ptr
|
|
+)
|
|
+{
|
|
+
|
|
+ bool dtd_found = false;
|
|
+
|
|
+#ifndef DEMO_BUILD
|
|
+
|
|
+ /* First, select blocks that are DTDs [CEA861C A.2.10] */
|
|
+ if(((p_dis->edid_block[block_ptr+0] != 0) ||
|
|
+ (p_dis->edid_block[block_ptr+1] != 0) ||
|
|
+ (p_dis->edid_block[block_ptr+2] != 0) ||
|
|
+ (p_dis->edid_block[block_ptr+4] != 0))
|
|
+ &&
|
|
+ (p_dis->nb_dtdstored < NUMBER_DTD_STORED)) {
|
|
+ /* Store the first DTD we find, others will be skipped */
|
|
+ p_dis->edid_dtd[p_dis->nb_dtdstored].u_pixel_clock =
|
|
+ ((u16)p_dis->edid_block[block_ptr+1] << 8) |
|
|
+ (u16)p_dis->edid_block[block_ptr+0];
|
|
+
|
|
+ p_dis->edid_dtd[p_dis->nb_dtdstored].u_hactive_pixels =
|
|
+ (((u16)p_dis->edid_block[block_ptr+4] & 0x00F0) << 4) |
|
|
+ (u16)p_dis->edid_block[block_ptr+2];
|
|
+
|
|
+ p_dis->edid_dtd[p_dis->nb_dtdstored].u_hblank_pixels =
|
|
+ (((u16)p_dis->edid_block[block_ptr+4] & 0x000F) << 8) |
|
|
+ (u16)p_dis->edid_block[block_ptr+3];
|
|
+
|
|
+ p_dis->edid_dtd[p_dis->nb_dtdstored].u_vactive_lines =
|
|
+ (((u16)p_dis->edid_block[block_ptr+7] & 0x00F0) << 4) |
|
|
+ (u16)p_dis->edid_block[block_ptr+5];
|
|
+
|
|
+ p_dis->edid_dtd[p_dis->nb_dtdstored].u_vblank_lines =
|
|
+ (((u16)p_dis->edid_block[block_ptr+7] & 0x000F) << 8) |
|
|
+ (u16)p_dis->edid_block[block_ptr+6];
|
|
+
|
|
+ p_dis->edid_dtd[p_dis->nb_dtdstored].u_hsync_offset =
|
|
+ (((u16)p_dis->edid_block[block_ptr+11] & 0x00C0) << 2) |
|
|
+ (u16)p_dis->edid_block[block_ptr+8];
|
|
+
|
|
+ p_dis->edid_dtd[p_dis->nb_dtdstored].u_hsync_width =
|
|
+ (((u16)p_dis->edid_block[block_ptr+11] & 0x0030) << 4) |
|
|
+ (u16)p_dis->edid_block[block_ptr+9];
|
|
+
|
|
+ p_dis->edid_dtd[p_dis->nb_dtdstored].u_vsync_offset =
|
|
+ (((u16)p_dis->edid_block[block_ptr+11] & 0x000C) << 2) |
|
|
+ (((u16)p_dis->edid_block[block_ptr+10] & 0x00F0) >> 4);
|
|
+
|
|
+ p_dis->edid_dtd[p_dis->nb_dtdstored].u_vsync_width =
|
|
+ (((u16)p_dis->edid_block[block_ptr+11] & 0x0003) << 4) |
|
|
+ ((u16)p_dis->edid_block[block_ptr+10] & 0x000F);
|
|
+
|
|
+ p_dis->edid_dtd[p_dis->nb_dtdstored].u_himage_size =
|
|
+ (((u16)p_dis->edid_block[block_ptr+14] & 0x00F0) << 4) |
|
|
+ (u16)p_dis->edid_block[block_ptr+12];
|
|
+
|
|
+ p_dis->edid_dtd[p_dis->nb_dtdstored].u_vimage_size =
|
|
+ (((u16)p_dis->edid_block[block_ptr+14] & 0x000F) << 8) |
|
|
+ (u16)p_dis->edid_block[block_ptr+13];
|
|
+
|
|
+ p_dis->edid_dtd[p_dis->nb_dtdstored].u_hborder_pixels =
|
|
+ (u16)p_dis->edid_block[block_ptr+15];
|
|
+
|
|
+ p_dis->edid_dtd[p_dis->nb_dtdstored].u_vborder_pixels =
|
|
+ (u16)p_dis->edid_block[block_ptr+16];
|
|
+
|
|
+ p_dis->edid_dtd[p_dis->nb_dtdstored].flags = p_dis->edid_block[block_ptr+17];
|
|
+
|
|
+ p_dis->nb_dtdstored++;
|
|
+
|
|
+ dtd_found = true; /* Stop any more DTDs being parsed */
|
|
+ }
|
|
+#endif /* DEMO_BUILD */
|
|
+
|
|
+ return (dtd_found);
|
|
+}
|
|
+
|
|
+/*============================================================================*/
|
|
+/* storeMonitorDescriptor */
|
|
+/*============================================================================*/
|
|
+#ifndef DEMO_BUILD
|
|
+static bool
|
|
+store_monitor_descriptor
|
|
+(
|
|
+ /* Device instance strucure holding block */
|
|
+ hdmi_txobject_t *p_dis,
|
|
+ u8 block_ptr
|
|
+)
|
|
+{
|
|
+
|
|
+ bool dtd_found = false;
|
|
+
|
|
+ /* First, select blocks that are DTDs [CEA861C A.2.10] */
|
|
+ if((p_dis->edid_block[block_ptr+0] == 0) &&
|
|
+ (p_dis->edid_block[block_ptr+1] == 0) &&
|
|
+ (p_dis->edid_block[block_ptr+2] == 0)
|
|
+ ) {
|
|
+ if(p_dis->edid_block[block_ptr+3] == EDID_MONITOR_NAME_DESC_DATA_TYPE) {
|
|
+ if(p_dis->edid_first_monitor_descriptor.b_desc_record == false) {
|
|
+ p_dis->edid_first_monitor_descriptor.b_desc_record = true;
|
|
+ lmemcpy(&(p_dis->edid_first_monitor_descriptor.u_monitor_name) ,
|
|
+ &(p_dis->edid_block[block_ptr+5]), EDID_MONITOR_DESCRIPTOR_SIZE);
|
|
+ dtd_found = true;
|
|
+ } else if((p_dis->edid_other_monitor_descriptor.b_desc_record == false)) {
|
|
+ p_dis->edid_other_monitor_descriptor.b_desc_record = true;
|
|
+ lmemcpy(&(p_dis->edid_other_monitor_descriptor.u_other_descriptor) ,
|
|
+ &(p_dis->edid_block[block_ptr+5]), EDID_MONITOR_DESCRIPTOR_SIZE);
|
|
+ dtd_found = true;
|
|
+ }
|
|
+ } else if(p_dis->edid_block[block_ptr+3] == EDID_MONITOR_RANGE_DESC_DATA_TYPE) {
|
|
+ if(p_dis->edid_second_monitor_descriptor.b_desc_record == false) {
|
|
+ p_dis->edid_second_monitor_descriptor.b_desc_record = true;
|
|
+ p_dis->edid_second_monitor_descriptor.u_min_vertical_rate = p_dis->edid_block[block_ptr+5];
|
|
+ p_dis->edid_second_monitor_descriptor.u_max_vertical_rate = p_dis->edid_block[block_ptr+6];
|
|
+ p_dis->edid_second_monitor_descriptor.u_min_horizontal_rate = p_dis->edid_block[block_ptr+7];
|
|
+ p_dis->edid_second_monitor_descriptor.u_max_horizontal_rate = p_dis->edid_block[block_ptr+8];
|
|
+ p_dis->edid_second_monitor_descriptor.u_max_supported_pixel_clk = p_dis->edid_block[block_ptr+9];
|
|
+ dtd_found = true;
|
|
+ }
|
|
+ }
|
|
+ }
|
|
+
|
|
+ return (dtd_found);
|
|
+
|
|
+}
|
|
+#endif /* DEMO_BUILD */
|
|
+
|
|
+/*============================================================================*/
|
|
+/* bslDebugWriteFakeRegPage */
|
|
+/*============================================================================*/
|
|
+#ifndef DEMO_BUILD
|
|
+error_code_t bsl_debug_write_fake_reg_page(unit_select_t tx_unit)
|
|
+{
|
|
+ /* Pointer to Device Instance Structure */
|
|
+ hdmi_txobject_t *p_dis;
|
|
+ error_code_t err; /* Error code */
|
|
+
|
|
+ err = check_unit_set_dis(tx_unit, &p_dis);
|
|
+
|
|
+ p_dis->cur_reg_page = 0x20;
|
|
+
|
|
+ return err;
|
|
+}
|
|
+#endif /* DEMO_BUILD */
|
|
+
|
|
+/*============================================================================*/
|
|
+/* END OF FILE */
|
|
+/*============================================================================*/
|
|
diff --git a/drivers/video/hdmi/comps/tmbslTDA9983/src/tmbslHdmiTx_local.c b/drivers/video/hdmi/comps/tmbslTDA9983/src/tmbslHdmiTx_local.c
|
|
new file mode 100755
|
|
index 0000000..dd47777
|
|
--- /dev/null
|
|
+++ b/drivers/video/hdmi/comps/tmbslTDA9983/src/tmbslHdmiTx_local.c
|
|
@@ -0,0 +1,898 @@
|
|
+/**
|
|
+ * Copyright (C) 2006 Koninklijke Philips Electronics N.V., All Rights Reserved.
|
|
+ * This source code and any compilation or derivative thereof is the proprietary
|
|
+ * information of Koninklijke Philips Electronics N.V. and is confidential in
|
|
+ * nature. Under no circumstances is this software to be exposed to or placed
|
|
+ * under an Open Source License of any type without the expressed written
|
|
+ * permission of Koninklijke Philips Electronics N.V.
|
|
+ *
|
|
+ * \file bsl_local.c
|
|
+ *
|
|
+ * \version $Revision: 15 $
|
|
+ *
|
|
+ * \date $Date: 29/10/07 14:11 $
|
|
+ *
|
|
+ * \brief BSL driver component for the TDA998x HDMI Transmitter
|
|
+ *
|
|
+ * \section refs Reference Documents
|
|
+ * HDMI Driver - Outline Architecture.doc
|
|
+ * HDMI Driver - bsl - SCS.doc
|
|
+ *
|
|
+ * \section info Change Information
|
|
+ *
|
|
+ * \verbatim
|
|
+ * $History: bsl_local.c $
|
|
+ *
|
|
+ * ***************** Version 15 *****************
|
|
+ * User: B.Vereecke Date: 29/10/07 Time: 14:11
|
|
+ * Updated in $/Source/bsl/src
|
|
+ * PR852 : remove external library dependancy
|
|
+ *
|
|
+ * ***************** Version 14 *****************
|
|
+ * User: B.Vereecke Date: 08/08/07 Time: 15:40
|
|
+ * Updated in $/Source/bsl/Src
|
|
+ * PR 563 : Unused shadow value for register
|
|
+ * E_REG_P00_INT_FLAGS_2_RW
|
|
+ *
|
|
+ * ***************** Version 13 *****************
|
|
+ * User: Burnouf Date: 18/04/07 Time: 15:50
|
|
+ * Updated in $/Source/bsl/Src
|
|
+ * PR 50 : Manage state ST_AWAIT_RX_SENSE for TDA9981
|
|
+ *
|
|
+ * ***************** Version 12 *****************
|
|
+ * User: Mayhew Date: 21/09/06 Time: 15:50
|
|
+ * Updated in $/Source/bsl/Src
|
|
+ * Cut code size in demo by using RETIF_BADPARAM
|
|
+ *
|
|
+ * ***************** Version 10 *****************
|
|
+ * User: Mayhew Date: 15/09/06 Time: 16:08
|
|
+ * Updated in $/Source/bsl/Src
|
|
+ * Reduce code size in setState by using local copies of DIS
|
|
+ *
|
|
+ * ***************** Version 8 *****************
|
|
+ * User: Mayhew Date: 30/06/06 Time: 13:23
|
|
+ * Updated in $/Source/bsl/Src
|
|
+ * EV_HDCP_BKSV_SECURE renamed to EV_HDCP_BKSV_REPEAT
|
|
+ *
|
|
+ * ***************** Version 6 *****************
|
|
+ * User: Mayhew Date: 6/06/06 Time: 13:40
|
|
+ * Updated in $/Source/bsl/Src
|
|
+ * Add checkUnitSetDis to reduce code size in most APIs
|
|
+ *
|
|
+ * ***************** Version 4 *****************
|
|
+ * User: Djw Date: 24/05/06 Time: 11:20
|
|
+ * Updated in $/Source/bsl/Src
|
|
+ * Added E_PAGE_10 for new Infoframe registers in N4.
|
|
+ *
|
|
+ * ***************** Version 3 *****************
|
|
+ * User: Mayhew Date: 10/05/06 Time: 17:09
|
|
+ * Updated in $/Source/bsl/Src
|
|
+ * Add HDCP state handling
|
|
+ *
|
|
+ * ***************** Version 2 *****************
|
|
+ * User: Djw Date: 20/04/06 Time: 17:32
|
|
+ * Updated in $/Source/bsl/Src
|
|
+ * Modification to prevent reading of shadow copies of interrupt flag
|
|
+ * registers.
|
|
+ *
|
|
+ * ***************** Version 1 *****************
|
|
+ * User: Mayhew Date: 4/04/06 Time: 16:30
|
|
+ * Created in $/Source/bsl/Src
|
|
+ * Driver local code & data phase 2
|
|
+ * \endverbatim
|
|
+ *
|
|
+ * */
|
|
+
|
|
+/*============================================================================*/
|
|
+/* FILE CONFIGURATION */
|
|
+/*============================================================================*/
|
|
+
|
|
+/* Defining this symbol on the compiler command line excludes some API checks */
|
|
+/* #define NO_RETIF_BADPARAM */
|
|
+
|
|
+/*============================================================================*/
|
|
+/* STANDARD INCLUDE FILES */
|
|
+/*============================================================================*/
|
|
+
|
|
+/*============================================================================*/
|
|
+/* PROJECT INCLUDE FILES */
|
|
+/*============================================================================*/
|
|
+#include "tmbslHdmiTx.h"
|
|
+#include "tmbslHdmiTx_local.h"
|
|
+
|
|
+/*============================================================================*/
|
|
+/* MACRO DEFINITIONS */
|
|
+/*============================================================================*/
|
|
+
|
|
+/*============================================================================*/
|
|
+/* TYPE DEFINITIONS */
|
|
+/*============================================================================*/
|
|
+
|
|
+/*============================================================================*/
|
|
+/* PUBLIC VARIABLE DEFINITIONS */
|
|
+/*============================================================================*/
|
|
+
|
|
+/** The array of object instances for all concurrently supported HDMI
|
|
+ * Transmitter units
|
|
+ * */
|
|
+RAM_DAT hdmi_txobject_t g_hdmi_tx_instance[HDMITX_UNITS_MAX];
|
|
+
|
|
+/**
|
|
+ * Lookup table to map register page index to actual page number
|
|
+ * */
|
|
+CONST_DAT u8 k_page_index_to_page[E_PAGE_NUM] = {
|
|
+ 0x00, /* E_PAGE_00 */
|
|
+ 0x01, /* E_PAGE_01 */
|
|
+ 0x02, /* E_PAGE_02 */
|
|
+ 0x10, /* E_PAGE_10 */
|
|
+ 0x11, /* E_PAGE_11 */
|
|
+ 0x12 /* E_PAGE_12 */
|
|
+};
|
|
+
|
|
+/*============================================================================*/
|
|
+/* STATIC VARIABLE DECLARATIONS */
|
|
+/*============================================================================*/
|
|
+
|
|
+/**
|
|
+ * Lookup table to map an 8-bit mask to a number of left shifts
|
|
+ * needed to shift a value starting at bit 0 onto the mask.
|
|
+ * Indexed by mask 0-255. For example, mask 0x00 and 0x01 need
|
|
+ * no shift, mask 0x02 needs one shift, mask 0x03 needs no shift,
|
|
+ * mask 0x04 needs 2 shifts, etc.
|
|
+ * Rows were formatted by "HDMI Driver - Register List.xls" and pasted here
|
|
+ * */
|
|
+static CONST_DAT u8 k_mask_to_shift[256] = {
|
|
+ /* Mask index: */
|
|
+ /*x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF */
|
|
+ 0, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* 0x */
|
|
+ 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* 1x */
|
|
+ 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* 2x */
|
|
+ 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* 3x */
|
|
+ 6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* 4x */
|
|
+ 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* 5x */
|
|
+ 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* 6x */
|
|
+ 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* 7x */
|
|
+ 7, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* 8x */
|
|
+ 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* 9x */
|
|
+ 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* Ax */
|
|
+ 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* Bx */
|
|
+ 6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* Cx */
|
|
+ 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* Dx */
|
|
+ 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* Ex */
|
|
+ 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0 /* Fx */
|
|
+};
|
|
+
|
|
+/*============================================================================*/
|
|
+/* STATIC FUNCTION DECLARATIONS */
|
|
+/*============================================================================*/
|
|
+
|
|
+/*============================================================================*/
|
|
+/* PUBLIC FUNCTION DEFINITIONS */
|
|
+/*============================================================================*/
|
|
+
|
|
+/*============================================================================*/
|
|
+/* checkUnitSetDis */
|
|
+/*============================================================================*/
|
|
+error_code_t
|
|
+check_unit_set_dis
|
|
+(
|
|
+ unit_select_t tx_unit,
|
|
+ hdmi_txobject_t **pp_dis
|
|
+)
|
|
+{
|
|
+ /* Return error if unit numbr is out of range */
|
|
+ RETIF(tx_unit < unit0, ERR_HDMI_BAD_UNIT_NUMBER)
|
|
+ RETIF(tx_unit >= HDMITX_UNITS_MAX, ERR_HDMI_BAD_UNIT_NUMBER)
|
|
+
|
|
+ /* Point to unit's Device Instance Structure */
|
|
+ *pp_dis = &g_hdmi_tx_instance[tx_unit];
|
|
+
|
|
+ /* Return if this device instance is not initialised */
|
|
+ RETIF(!(*pp_dis)->b_initialized, ERR_HDMI_NOT_INITIALIZED)
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+/*============================================================================*/
|
|
+/* getHwRegisters */
|
|
+/*============================================================================*/
|
|
+error_code_t
|
|
+get_hw_registers
|
|
+(
|
|
+ hdmi_txobject_t *p_dis,
|
|
+ u16 reg_shad_page_addr,
|
|
+ u8 *p_data,
|
|
+ u16 len_data
|
|
+)
|
|
+{
|
|
+ error_code_t err; /* Error code */
|
|
+ u8 reg_shad; /* The index to the register's shadow copy */
|
|
+ u8 reg_page; /* The index to the register's page */
|
|
+ u8 reg_addr; /* The register's address on the page */
|
|
+ u8 new_reg_page; /* The register's new page number */
|
|
+ bsl_sys_args_t sys_args; /* Arguments passed to system function */
|
|
+
|
|
+ /* Unpack 1st register's shadow index, page index and address */
|
|
+ reg_shad = SPA2SHAD(reg_shad_page_addr);
|
|
+ reg_page = SPA2PAGE(reg_shad_page_addr);
|
|
+ reg_addr = SPA2ADDR(reg_shad_page_addr);
|
|
+ new_reg_page = k_page_index_to_page[reg_page];
|
|
+
|
|
+ /* Check length does not overflow page */
|
|
+ RETIF_BADPARAM((reg_addr + len_data) > E_REG_CURPAGE_ADR_W)
|
|
+
|
|
+ /* Check 1st reg does not have a shadow - whole range assumed likewise */
|
|
+ RETIF_BADPARAM(reg_shad != E_SNONE)
|
|
+
|
|
+ /* Set page register if required */
|
|
+ if(p_dis->cur_reg_page != new_reg_page) {
|
|
+ /* All non-OK results are errors */
|
|
+ sys_args.slave_addr = p_dis->u_hw_address;
|
|
+ sys_args.first_register = E_REG_CURPAGE_ADR_W;
|
|
+ sys_args.len_data = 1;
|
|
+ sys_args.p_data = &new_reg_page;
|
|
+ err = p_dis->sys_func_write(&sys_args);
|
|
+ RETIF(err != 0, ERR_HDMI_I2C_WRITE)
|
|
+ p_dis->cur_reg_page = new_reg_page;
|
|
+ }
|
|
+
|
|
+ /* Get I2C register range - all non-OK results are errors */
|
|
+ sys_args.slave_addr = p_dis->u_hw_address;
|
|
+ sys_args.first_register = reg_addr;
|
|
+ sys_args.len_data = (u8)len_data;
|
|
+ sys_args.p_data = p_data;
|
|
+ err = p_dis->sys_func_read(&sys_args);
|
|
+ return (err == 0) ? 0 : ERR_HDMI_I2C_READ;
|
|
+}
|
|
+
|
|
+/*============================================================================*/
|
|
+/* getHwRegister */
|
|
+/*============================================================================*/
|
|
+error_code_t
|
|
+get_hw_register
|
|
+(
|
|
+ hdmi_txobject_t *p_dis,
|
|
+ u16 reg_shad_page_addr,
|
|
+ u8 *p_reg_value
|
|
+)
|
|
+{
|
|
+ error_code_t err; /* Error code */
|
|
+ u8 reg_shad; /* The index to the register's shadow copy */
|
|
+ u8 reg_page; /* The index to the register's page */
|
|
+ u8 reg_addr; /* The register's address on the page */
|
|
+ u8 new_reg_page; /* The register's new page number */
|
|
+ bsl_sys_args_t sys_args; /* Arguments passed to system function */
|
|
+
|
|
+ /* Unpack register shadow index, page index and address */
|
|
+ reg_shad = SPA2SHAD(reg_shad_page_addr);
|
|
+ reg_page = SPA2PAGE(reg_shad_page_addr);
|
|
+ reg_addr = SPA2ADDR(reg_shad_page_addr);
|
|
+ new_reg_page = k_page_index_to_page[reg_page];
|
|
+
|
|
+ /* Set page register if required */
|
|
+ if(p_dis->cur_reg_page != new_reg_page) {
|
|
+ /* All non-OK results are errors */
|
|
+ sys_args.slave_addr = p_dis->u_hw_address;
|
|
+ sys_args.first_register = E_REG_CURPAGE_ADR_W;
|
|
+ sys_args.len_data = 1;
|
|
+ sys_args.p_data = &new_reg_page;
|
|
+ err = p_dis->sys_func_write(&sys_args);
|
|
+ RETIF(err != 0, ERR_HDMI_I2C_WRITE)
|
|
+ p_dis->cur_reg_page = new_reg_page;
|
|
+ }
|
|
+
|
|
+ if((reg_shad != E_SNONE)
|
|
+ && (reg_shad_page_addr != E_REG_P00_INT_FLAGS_0_RW)
|
|
+ && (reg_shad_page_addr != E_REG_P00_INT_FLAGS_1_RW)
|
|
+#ifdef TMFL_TDA9981_SUPPORT
|
|
+ && (reg_shad_page_addr != E_REG_P00_INT_FLAGS_2_RW)
|
|
+#endif /* TMFL_TDA9981_SUPPORT */
|
|
+ ) {
|
|
+ /* Get shadow copy - shadowed registers can't be read */
|
|
+ /* Don't read shadow copy of interrupt status flags! */
|
|
+ *p_reg_value = p_dis->shadow_reg[reg_shad];
|
|
+ return 0;
|
|
+ } else {
|
|
+ /* Get I2C register - all non-OK results are errors */
|
|
+ sys_args.slave_addr = p_dis->u_hw_address;
|
|
+ sys_args.first_register = reg_addr;
|
|
+ sys_args.len_data = 1;
|
|
+ sys_args.p_data = p_reg_value;
|
|
+ err = p_dis->sys_func_read(&sys_args);
|
|
+ return (err == 0) ? 0 : ERR_HDMI_I2C_READ;
|
|
+ }
|
|
+}
|
|
+
|
|
+/*============================================================================*/
|
|
+/* setHwRegisters */
|
|
+/*============================================================================*/
|
|
+error_code_t
|
|
+set_hw_registers
|
|
+(
|
|
+ hdmi_txobject_t *p_dis,
|
|
+ u16 reg_shad_page_addr,
|
|
+ u8 *p_data,
|
|
+ u16 len_data
|
|
+)
|
|
+{
|
|
+ error_code_t err; /* Error code */
|
|
+ u8 reg_shad; /* The index to the register's shadow copy */
|
|
+ u8 reg_page; /* The index to the register's page */
|
|
+ u8 reg_addr; /* The register's address on the page */
|
|
+ u8 new_reg_page; /* The register's new page number */
|
|
+ bsl_sys_args_t sys_args; /* Arguments passed to system function */
|
|
+
|
|
+ /* Unpack 1st register's shadow index, page index and address */
|
|
+ reg_shad = SPA2SHAD(reg_shad_page_addr);
|
|
+ reg_page = SPA2PAGE(reg_shad_page_addr);
|
|
+ reg_addr = SPA2ADDR(reg_shad_page_addr);
|
|
+ new_reg_page = k_page_index_to_page[reg_page];
|
|
+
|
|
+ /* Check length does not overflow page */
|
|
+ RETIF_BADPARAM((reg_addr + len_data) > E_REG_CURPAGE_ADR_W)
|
|
+
|
|
+ /* Check 1st reg does not have a shadow - whole range assumed likewise */
|
|
+ RETIF_BADPARAM(reg_shad != E_SNONE)
|
|
+
|
|
+ /* Set page register if required - whole range is on same page */
|
|
+ if(p_dis->cur_reg_page != new_reg_page) {
|
|
+ /* All non-OK results are errors */
|
|
+ sys_args.slave_addr = p_dis->u_hw_address;
|
|
+ sys_args.first_register = E_REG_CURPAGE_ADR_W;
|
|
+ sys_args.len_data = 1;
|
|
+ sys_args.p_data = &new_reg_page;
|
|
+ err = p_dis->sys_func_write(&sys_args);
|
|
+ RETIF(err != 0, ERR_HDMI_I2C_WRITE)
|
|
+ p_dis->cur_reg_page = new_reg_page;
|
|
+ }
|
|
+
|
|
+ /* Write to I2C register range - all non-OK results are errors */
|
|
+ sys_args.slave_addr = p_dis->u_hw_address;
|
|
+ sys_args.first_register = reg_addr;
|
|
+ sys_args.len_data = (u8)len_data;
|
|
+ sys_args.p_data = p_data;
|
|
+ err = p_dis->sys_func_write(&sys_args);
|
|
+ return (err == 0) ? 0 : ERR_HDMI_I2C_WRITE;
|
|
+}
|
|
+
|
|
+/*============================================================================*/
|
|
+/* setHwRegisterMsbLsb */
|
|
+/*============================================================================*/
|
|
+error_code_t
|
|
+set_hw_register_msb_lsb
|
|
+(
|
|
+ hdmi_txobject_t *p_dis,
|
|
+ u16 reg_shad_page_addr,
|
|
+ u16 reg_word
|
|
+)
|
|
+{
|
|
+ error_code_t err; /* Error code */
|
|
+ u8 reg_page; /* The index to the register's page */
|
|
+ u8 reg_addr; /* The register's address on the page */
|
|
+ u8 new_reg_page; /* The register's new page number */
|
|
+ u8 msb_lsb[2]; /* The bytes from regWord */
|
|
+ bsl_sys_args_t sys_args; /* Arguments passed to system function */
|
|
+
|
|
+ /* Unpack register shadow index, page index and address */
|
|
+ reg_page = SPA2PAGE(reg_shad_page_addr);
|
|
+ reg_addr = SPA2ADDR(reg_shad_page_addr);
|
|
+ new_reg_page = k_page_index_to_page[reg_page];
|
|
+
|
|
+ /* Unpack regWord bytes, MSB first */
|
|
+ msb_lsb[0] = (u8)(reg_word >> 8);
|
|
+ msb_lsb[1] = (u8)(reg_word & 0xFF);
|
|
+
|
|
+ /* Set page register if required */
|
|
+ if(p_dis->cur_reg_page != new_reg_page) {
|
|
+ /* All non-OK results are errors */
|
|
+ sys_args.slave_addr = p_dis->u_hw_address;
|
|
+ sys_args.first_register = E_REG_CURPAGE_ADR_W;
|
|
+ sys_args.len_data = 1;
|
|
+ sys_args.p_data = &new_reg_page;
|
|
+ err = p_dis->sys_func_write(&sys_args);
|
|
+ RETIF(err != 0, ERR_HDMI_I2C_WRITE)
|
|
+ p_dis->cur_reg_page = new_reg_page;
|
|
+ }
|
|
+
|
|
+ /* No word registers are shadowed */
|
|
+
|
|
+ /* Write to I2C - all non-OK results are errors */
|
|
+ sys_args.slave_addr = p_dis->u_hw_address;
|
|
+ sys_args.first_register = reg_addr;
|
|
+ sys_args.len_data = 2;
|
|
+ sys_args.p_data = &msb_lsb[0];
|
|
+ err = p_dis->sys_func_write(&sys_args);
|
|
+ return (err == 0) ? 0 : ERR_HDMI_I2C_WRITE;
|
|
+}
|
|
+
|
|
+/*============================================================================*/
|
|
+/* setHwRegister */
|
|
+/*============================================================================*/
|
|
+error_code_t
|
|
+set_hw_register
|
|
+(
|
|
+ hdmi_txobject_t *p_dis,
|
|
+ u16 reg_shad_page_addr,
|
|
+ u8 reg_value
|
|
+)
|
|
+{
|
|
+ error_code_t err; /* Error code */
|
|
+ u8 reg_shad; /* The index to the register's shadow copy */
|
|
+ u8 reg_page; /* The index to the register's page */
|
|
+ u8 reg_addr; /* The register's address on the page */
|
|
+ u8 new_reg_page; /* The register's new page number */
|
|
+ bsl_sys_args_t sys_args; /* Arguments passed to system function */
|
|
+
|
|
+ /* Unpack register shadow index, page index and address */
|
|
+ reg_shad = SPA2SHAD(reg_shad_page_addr);
|
|
+ reg_page = SPA2PAGE(reg_shad_page_addr);
|
|
+ reg_addr = SPA2ADDR(reg_shad_page_addr);
|
|
+ new_reg_page = k_page_index_to_page[reg_page];
|
|
+
|
|
+ /* Set page register if required */
|
|
+ if(p_dis->cur_reg_page != new_reg_page) {
|
|
+ /* All non-OK results are errors */
|
|
+ sys_args.slave_addr = p_dis->u_hw_address;
|
|
+ sys_args.first_register = E_REG_CURPAGE_ADR_W;
|
|
+ sys_args.len_data = 1;
|
|
+ sys_args.p_data = &new_reg_page;
|
|
+ err = p_dis->sys_func_write(&sys_args);
|
|
+ RETIF(err != 0, ERR_HDMI_I2C_WRITE)
|
|
+ p_dis->cur_reg_page = new_reg_page;
|
|
+ }
|
|
+
|
|
+ /* Set shadow copy */
|
|
+ if(reg_shad != E_SNONE) {
|
|
+ p_dis->shadow_reg[reg_shad] = reg_value;
|
|
+ }
|
|
+
|
|
+ /* Write to I2C - all non-OK results are errors */
|
|
+ sys_args.slave_addr = p_dis->u_hw_address;
|
|
+ sys_args.first_register = reg_addr;
|
|
+ sys_args.len_data = 1;
|
|
+ sys_args.p_data = ®_value;
|
|
+ err = p_dis->sys_func_write(&sys_args);
|
|
+ return (err == 0) ? 0 : ERR_HDMI_I2C_WRITE;
|
|
+}
|
|
+
|
|
+/*============================================================================*/
|
|
+/* setHwRegisterField */
|
|
+/*============================================================================*/
|
|
+error_code_t
|
|
+set_hw_register_field
|
|
+(
|
|
+ hdmi_txobject_t *p_dis,
|
|
+ u16 reg_shad_page_addr,
|
|
+ u8 field_mask,
|
|
+ u8 field_value
|
|
+)
|
|
+{
|
|
+ error_code_t err; /* Error code */
|
|
+ u8 reg_shad; /* The index to the register's shadow copy */
|
|
+ u8 reg_page; /* The index to the register's page */
|
|
+ u8 reg_addr; /* The register's address on the page */
|
|
+ u8 new_reg_page; /* The register's new page number */
|
|
+ u8 reg_value; /* The register's current value */
|
|
+ bsl_sys_args_t sys_args; /* Arguments passed to system function */
|
|
+
|
|
+ /* Unpack register shadow index, page index and address */
|
|
+ reg_shad = SPA2SHAD(reg_shad_page_addr);
|
|
+ reg_page = SPA2PAGE(reg_shad_page_addr);
|
|
+ reg_addr = SPA2ADDR(reg_shad_page_addr);
|
|
+ new_reg_page = k_page_index_to_page[reg_page];
|
|
+
|
|
+ /* Set page register if required */
|
|
+ if(p_dis->cur_reg_page != new_reg_page) {
|
|
+ /* All non-OK results are errors */
|
|
+ sys_args.slave_addr = p_dis->u_hw_address;
|
|
+ sys_args.first_register = E_REG_CURPAGE_ADR_W;
|
|
+ sys_args.len_data = 1;
|
|
+ sys_args.p_data = &new_reg_page;
|
|
+ err = p_dis->sys_func_write(&sys_args);
|
|
+ RETIF(err != 0, ERR_HDMI_I2C_WRITE)
|
|
+ p_dis->cur_reg_page = new_reg_page;
|
|
+ }
|
|
+
|
|
+ if(reg_shad != E_SNONE) {
|
|
+ /* Get shadow copy */
|
|
+ reg_value = p_dis->shadow_reg[reg_shad];
|
|
+ } else {
|
|
+ /* Read I2C register value.
|
|
+ * All bitfield registers are either shadowed or can be read.
|
|
+ * */
|
|
+ sys_args.slave_addr = p_dis->u_hw_address;
|
|
+ sys_args.first_register = reg_addr;
|
|
+ sys_args.len_data = 1;
|
|
+ sys_args.p_data = ®_value;
|
|
+ err = p_dis->sys_func_read(&sys_args);
|
|
+ RETIF(err != 0, ERR_HDMI_I2C_READ)
|
|
+ }
|
|
+
|
|
+ /* Reset register bits that are set in the mask */
|
|
+ reg_value = reg_value & (u8)(~field_mask);
|
|
+
|
|
+ /* Shift the field value left to align its bits with the mask */
|
|
+ field_value <<= k_mask_to_shift[field_mask];
|
|
+
|
|
+ /* Reset shifted field bits that are not set in the mask */
|
|
+ field_value &= field_mask;
|
|
+
|
|
+ /* Set the shifted bitfield */
|
|
+ reg_value |= field_value;
|
|
+
|
|
+ /* Set shadow copy */
|
|
+ if(reg_shad != E_SNONE) {
|
|
+ p_dis->shadow_reg[reg_shad] = reg_value;
|
|
+ }
|
|
+
|
|
+ /* Write to I2C - all non-OK results are errors */
|
|
+ sys_args.slave_addr = p_dis->u_hw_address;
|
|
+ sys_args.first_register = reg_addr;
|
|
+ sys_args.len_data = 1;
|
|
+ sys_args.p_data = ®_value;
|
|
+ err = p_dis->sys_func_write(&sys_args);
|
|
+ return (err == 0) ? 0 : ERR_HDMI_I2C_WRITE;
|
|
+}
|
|
+
|
|
+/*============================================================================*/
|
|
+/* setHwRegisterFieldTable */
|
|
+/*============================================================================*/
|
|
+error_code_t
|
|
+set_hw_register_field_table
|
|
+(
|
|
+ hdmi_txobject_t *p_dis,
|
|
+ const hdmi_tx_reg_mask_val_t *p_table
|
|
+)
|
|
+{
|
|
+ error_code_t err; /* Error code */
|
|
+ int i; /* Table index */
|
|
+
|
|
+ /* Set register, mask and value from table until terminator is reached */
|
|
+ for(i = 0; p_table[i].reg > 0; i++) {
|
|
+ err = set_hw_register_field(p_dis, p_table[i].reg, p_table[i].mask, p_table[i].val);
|
|
+ RETIF(err != 0, err)
|
|
+ }
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+/*============================================================================*/
|
|
+/* setState */
|
|
+/*============================================================================*/
|
|
+error_code_t
|
|
+set_state
|
|
+(
|
|
+ hdmi_txobject_t *p_dis,
|
|
+ bsl_event_t event
|
|
+)
|
|
+{
|
|
+ bsl_state_t state = p_dis->state;
|
|
+ u8 n_ignored_events = p_dis->n_ignored_events;
|
|
+
|
|
+ switch(state) {
|
|
+ case ST_UNINITIALIZED:
|
|
+ switch(event) {
|
|
+ case EV_UNPLUGGED:
|
|
+ state = ST_DISCONNECTED;
|
|
+ break;
|
|
+ case EV_PLUGGEDIN:
|
|
+ state = ST_AWAIT_EDID;
|
|
+ break;
|
|
+ default:
|
|
+ n_ignored_events++;
|
|
+ break;
|
|
+ }
|
|
+ break;
|
|
+ case ST_DISCONNECTED:
|
|
+ switch(event) {
|
|
+ case EV_DEINIT:
|
|
+ state = ST_UNINITIALIZED;
|
|
+ break;
|
|
+ case EV_PLUGGEDIN:
|
|
+ state = ST_AWAIT_EDID;
|
|
+ break;
|
|
+ case EV_STANDBY:
|
|
+ state = ST_STANDBY;
|
|
+ break;
|
|
+ default:
|
|
+ n_ignored_events++;
|
|
+ break;
|
|
+ }
|
|
+ break;
|
|
+ case ST_AWAIT_EDID:
|
|
+ switch(event) {
|
|
+ case EV_DEINIT:
|
|
+ state = ST_UNINITIALIZED;
|
|
+ break;
|
|
+ case EV_UNPLUGGED:
|
|
+ state = ST_DISCONNECTED;
|
|
+ break;
|
|
+ case EV_STANDBY:
|
|
+ state = ST_STANDBY;
|
|
+ break;
|
|
+#if defined (TMFL_TDA9981_SUPPORT) && defined(TMFL_RX_SENSE_ON)
|
|
+ case EV_GETBLOCKDATA:
|
|
+ state = ST_AWAIT_RX_SENSE;
|
|
+ break;
|
|
+#else /* TMFL_TDA9981_SUPPORT & TMFL_RX_SENSE_ON */
|
|
+ case EV_GETBLOCKDATA:
|
|
+ state = ST_SINK_CONNECTED;
|
|
+ break;
|
|
+#endif /* TMFL_TDA9981_SUPPORT & TMFL_RX_SENSE_ON */
|
|
+ default:
|
|
+ n_ignored_events++;
|
|
+ break;
|
|
+ }
|
|
+ break;
|
|
+#if defined (TMFL_TDA9981_SUPPORT) && defined(TMFL_RX_SENSE_ON)
|
|
+ case ST_AWAIT_RX_SENSE:
|
|
+ switch(event) {
|
|
+ case EV_DEINIT:
|
|
+ state = ST_UNINITIALIZED;
|
|
+ break;
|
|
+ case EV_UNPLUGGED:
|
|
+ state = ST_DISCONNECTED;
|
|
+ break;
|
|
+ case EV_STANDBY:
|
|
+ state = ST_STANDBY;
|
|
+ break;
|
|
+ case EV_SINKON:
|
|
+ state = ST_SINK_CONNECTED;
|
|
+ break;
|
|
+ default:
|
|
+ n_ignored_events++;
|
|
+ break;
|
|
+ }
|
|
+ break;
|
|
+#endif /* TMFL_TDA9981_SUPPORT & TMFL_RX_SENSE_ON */
|
|
+ case ST_SINK_CONNECTED:
|
|
+ switch(event) {
|
|
+ case EV_DEINIT:
|
|
+ state = ST_UNINITIALIZED;
|
|
+ break;
|
|
+ case EV_UNPLUGGED:
|
|
+ state = ST_DISCONNECTED;
|
|
+ break;
|
|
+ case EV_STANDBY:
|
|
+ state = ST_STANDBY;
|
|
+ break;
|
|
+ case EV_SETINOUT:
|
|
+ state = ST_VIDEO_NO_HDCP;
|
|
+ break;
|
|
+#if defined (TMFL_TDA9981_SUPPORT) && defined(TMFL_RX_SENSE_ON)
|
|
+ case EV_SINKOFF:
|
|
+ state = ST_AWAIT_RX_SENSE;
|
|
+ break;
|
|
+#endif /* TMFL_TDA9981_SUPPORT & TMFL_RX_SENSE_ON */
|
|
+ default:
|
|
+ n_ignored_events++;
|
|
+ break;
|
|
+ }
|
|
+ break;
|
|
+ case ST_VIDEO_NO_HDCP:
|
|
+ switch(event) {
|
|
+ case EV_DEINIT:
|
|
+ state = ST_UNINITIALIZED;
|
|
+ break;
|
|
+ case EV_UNPLUGGED:
|
|
+ state = ST_DISCONNECTED;
|
|
+ break;
|
|
+ case EV_STANDBY:
|
|
+ state = ST_STANDBY;
|
|
+ break;
|
|
+ case EV_OUTDISABLE:
|
|
+ state = ST_SINK_CONNECTED;
|
|
+ break;
|
|
+ case EV_HDCP_RUN:
|
|
+ state = ST_HDCP_WAIT_RX;
|
|
+ break;
|
|
+#if defined (TMFL_TDA9981_SUPPORT) && defined(TMFL_RX_SENSE_ON)
|
|
+ case EV_SINKOFF:
|
|
+ state = ST_AWAIT_RX_SENSE;
|
|
+ break;
|
|
+#endif /* TMFL_TDA9981_SUPPORT & TMFL_RX_SENSE_ON */
|
|
+ default:
|
|
+ n_ignored_events++;
|
|
+ break;
|
|
+ }
|
|
+ break;
|
|
+ case ST_HDCP_WAIT_RX:
|
|
+ switch(event) {
|
|
+ case EV_DEINIT:
|
|
+ state = ST_UNINITIALIZED;
|
|
+ break;
|
|
+ case EV_UNPLUGGED:
|
|
+ state = ST_DISCONNECTED;
|
|
+ break;
|
|
+ case EV_STANDBY:
|
|
+ state = ST_STANDBY;
|
|
+ break;
|
|
+ case EV_HDCP_BKSV_NREPEAT:
|
|
+ state = ST_HDCP_AUTHENTICATED;
|
|
+ break;
|
|
+ case EV_HDCP_BKSV_REPEAT:
|
|
+ state = ST_HDCP_WAIT_BSTATUS;
|
|
+ break;
|
|
+ case EV_HDCP_BKSV_NSECURE:
|
|
+ state = ST_HDCP_WAIT_RX;
|
|
+ break;
|
|
+ case EV_HDCP_T0:
|
|
+ state = ST_HDCP_WAIT_RX;
|
|
+ break;
|
|
+ case EV_HDCP_STOP:
|
|
+ state = ST_VIDEO_NO_HDCP;
|
|
+ break;
|
|
+#if defined (TMFL_TDA9981_SUPPORT) && defined(TMFL_RX_SENSE_ON)
|
|
+ case EV_SINKOFF:
|
|
+ state = ST_AWAIT_RX_SENSE;
|
|
+ break;
|
|
+#endif /* TMFL_TDA9981_SUPPORT & TMFL_RX_SENSE_ON */
|
|
+ default:
|
|
+ n_ignored_events++;
|
|
+ break;
|
|
+ }
|
|
+ break;
|
|
+ case ST_HDCP_WAIT_BSTATUS:
|
|
+ switch(event) {
|
|
+ case EV_DEINIT:
|
|
+ state = ST_UNINITIALIZED;
|
|
+ break;
|
|
+ case EV_UNPLUGGED:
|
|
+ state = ST_DISCONNECTED;
|
|
+ break;
|
|
+ case EV_STANDBY:
|
|
+ state = ST_STANDBY;
|
|
+ break;
|
|
+ case EV_HDCP_BSTATUS_GOOD:
|
|
+ state = ST_HDCP_WAIT_SHA_1;
|
|
+ break;
|
|
+ case EV_HDCP_T0:
|
|
+ state = ST_HDCP_WAIT_RX;
|
|
+ break;
|
|
+ case EV_HDCP_STOP:
|
|
+ state = ST_VIDEO_NO_HDCP;
|
|
+ break;
|
|
+#if defined (TMFL_TDA9981_SUPPORT) && defined(TMFL_RX_SENSE_ON)
|
|
+ case EV_SINKOFF:
|
|
+ state = ST_AWAIT_RX_SENSE;
|
|
+ break;
|
|
+#endif /* TMFL_TDA9981_SUPPORT & TMFL_RX_SENSE_ON */
|
|
+ default:
|
|
+ n_ignored_events++;
|
|
+ break;
|
|
+ }
|
|
+ break;
|
|
+ case ST_HDCP_WAIT_SHA_1:
|
|
+ switch(event) {
|
|
+ case EV_DEINIT:
|
|
+ state = ST_UNINITIALIZED;
|
|
+ break;
|
|
+ case EV_UNPLUGGED:
|
|
+ state = ST_DISCONNECTED;
|
|
+ break;
|
|
+ case EV_STANDBY:
|
|
+ state = ST_STANDBY;
|
|
+ break;
|
|
+ case EV_HDCP_KSV_SECURE:
|
|
+ state = ST_HDCP_AUTHENTICATED;
|
|
+ break;
|
|
+ case EV_HDCP_T0:
|
|
+ state = ST_HDCP_WAIT_RX;
|
|
+ break;
|
|
+ case EV_HDCP_STOP:
|
|
+ state = ST_VIDEO_NO_HDCP;
|
|
+ break;
|
|
+#if defined (TMFL_TDA9981_SUPPORT) && defined(TMFL_RX_SENSE_ON)
|
|
+ case EV_SINKOFF:
|
|
+ state = ST_AWAIT_RX_SENSE;
|
|
+ break;
|
|
+#endif /* TMFL_TDA9981_SUPPORT & TMFL_RX_SENSE_ON */
|
|
+ default:
|
|
+ n_ignored_events++;
|
|
+ break;
|
|
+ }
|
|
+ break;
|
|
+ case ST_HDCP_AUTHENTICATED:
|
|
+ switch(event) {
|
|
+ case EV_DEINIT:
|
|
+ state = ST_UNINITIALIZED;
|
|
+ break;
|
|
+ case EV_UNPLUGGED:
|
|
+ state = ST_DISCONNECTED;
|
|
+ break;
|
|
+ case EV_STANDBY:
|
|
+ state = ST_STANDBY;
|
|
+ break;
|
|
+ case EV_HDCP_T0:
|
|
+ state = ST_HDCP_WAIT_RX;
|
|
+ break;
|
|
+ case EV_HDCP_STOP:
|
|
+ state = ST_VIDEO_NO_HDCP;
|
|
+ break;
|
|
+#if defined (TMFL_TDA9981_SUPPORT) && defined(TMFL_RX_SENSE_ON)
|
|
+ case EV_SINKOFF:
|
|
+ state = ST_AWAIT_RX_SENSE;
|
|
+ break;
|
|
+#endif /* TMFL_TDA9981_SUPPORT & TMFL_RX_SENSE_ON */
|
|
+ default:
|
|
+ n_ignored_events++;
|
|
+ break;
|
|
+ }
|
|
+ break;
|
|
+ case ST_STANDBY:
|
|
+ switch(event) {
|
|
+ case EV_DEINIT:
|
|
+ state = ST_UNINITIALIZED;
|
|
+ break;
|
|
+ case EV_RESUME_UNPLUGGED:
|
|
+ state = ST_DISCONNECTED;
|
|
+ break;
|
|
+ case EV_RESUME_PLUGGEDIN:
|
|
+ state = ST_AWAIT_EDID;
|
|
+ break;
|
|
+ default:
|
|
+ n_ignored_events++;
|
|
+ break;
|
|
+ }
|
|
+ break;
|
|
+ case ST_INVALID:
|
|
+ n_ignored_events++;
|
|
+ break;
|
|
+ }
|
|
+ p_dis->state = state;
|
|
+ p_dis->n_ignored_events = n_ignored_events;
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+/*============================================================================*/
|
|
+/* lmemcpy */
|
|
+/*============================================================================*/
|
|
+error_code_t
|
|
+lmemcpy
|
|
+(
|
|
+ void *p_table1,
|
|
+ const void *p_table2,
|
|
+ uint size
|
|
+)
|
|
+{
|
|
+ char *ptr_source = (char *) p_table1;
|
|
+ char *end_source = (char *)p_table1 + size;
|
|
+ char *ptr_dest = (char *)p_table2;
|
|
+
|
|
+ RETIF_BADPARAM(p_table1 == NULL)
|
|
+ RETIF_BADPARAM(p_table2 == NULL)
|
|
+
|
|
+ while(end_source > ptr_source) {
|
|
+ *(ptr_source++) = *(ptr_dest++);
|
|
+ }
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+/*============================================================================*/
|
|
+/* lmemset */
|
|
+/*============================================================================*/
|
|
+error_code_t
|
|
+lmemset
|
|
+(
|
|
+ void *p_table1,
|
|
+ const u8 value,
|
|
+ uint size
|
|
+)
|
|
+{
|
|
+ char *ptr_source = (char *) p_table1;
|
|
+ char *end_source = (char *)p_table1 + size;
|
|
+
|
|
+ RETIF_BADPARAM(p_table1 == NULL)
|
|
+
|
|
+ while(end_source > ptr_source) {
|
|
+ *(ptr_source++) = value;
|
|
+ }
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+/*============================================================================*/
|
|
+/* STATIC FUNCTION DEFINTIONS */
|
|
+/*============================================================================*/
|
|
+
|
|
+/*============================================================================*/
|
|
+/* END OF FILE */
|
|
+/*============================================================================*/
|
|
diff --git a/drivers/video/hdmi/comps/tmbslTDA9983/src/tmbslHdmiTx_local.h b/drivers/video/hdmi/comps/tmbslTDA9983/src/tmbslHdmiTx_local.h
|
|
new file mode 100755
|
|
index 0000000..0ea2553
|
|
--- /dev/null
|
|
+++ b/drivers/video/hdmi/comps/tmbslTDA9983/src/tmbslHdmiTx_local.h
|
|
@@ -0,0 +1,1967 @@
|
|
+/**
|
|
+ * Copyright (C) 2006 Koninklijke Philips Electronics N.V., All Rights Reserved.
|
|
+ * This source code and any compilation or derivative thereof is the proprietary
|
|
+ * information of Koninklijke Philips Electronics N.V. and is confidential in
|
|
+ * nature. Under no circumstances is this software to be exposed to or placed
|
|
+ * under an Open Source License of any type without the expressed written
|
|
+ * permission of Koninklijke Philips Electronics N.V.
|
|
+ *
|
|
+ * \file bsl_local.h
|
|
+ *
|
|
+ * \version $Revision: 66 $
|
|
+ *
|
|
+ * \date $Date: 29/10/07 14:11 $
|
|
+ *
|
|
+ * \brief BSL driver component local definitions for the TDA998x
|
|
+ * HDMI Transmitter.
|
|
+ *
|
|
+ * \section refs Reference Documents
|
|
+ * HDMI Driver - Outline Architecture.doc,
|
|
+ * HDMI Driver - bsl - SCS.doc
|
|
+ *
|
|
+ * \section info Change Information
|
|
+ *
|
|
+ * \verbatim
|
|
+ * $History: bsl_local.h $
|
|
+ *
|
|
+ * ***************** Version 66 ****************
|
|
+ * User: B.Vereecke Date: 29/10/07 Time: 14:11
|
|
+ * Updated in $/Source/bsl/src
|
|
+ * PR852 : remove external library dependancy
|
|
+ *
|
|
+ * ***************** Version 65 ****************
|
|
+ * User: B.Vereecke Date: 17/10/07 Time: 14:11
|
|
+ * Updated in $/Source/bsl/src
|
|
+ * PR872 : add new formats, 1080p24/25/30
|
|
+ *
|
|
+ * ***************** Version 64 *****************
|
|
+ * User: B.Vereecke Date: 11/09/07 Time: 15:15
|
|
+ * Updated in $/Source/bsl/Src
|
|
+ * PR679: Update version to 3.9
|
|
+ *
|
|
+ * ***************** Version 63 *****************
|
|
+ * User: B.Vereecke Date: 07/09/07 Time: 16:23
|
|
+ * Updated in $/Source/bsl/Src
|
|
+ * PR670 : Add PC Format : 1280x1024@75Hz
|
|
+ *
|
|
+ * ***************** Version 62 *****************
|
|
+ * User: B.Vereecke Date: 27/07/07 Time: 11:23
|
|
+ * Updated in $/Source/bsl/Src
|
|
+ * PR536 : Update version to 2.69
|
|
+ *
|
|
+ * ***************** Version 61 *****************
|
|
+ * User: B.Vereecke Date: 17/07/07 Time: 10:30
|
|
+ * Updated in $/Source/bsl/Src
|
|
+ * PR 217 : Add a new flag in tmHdmiTxobject_t
|
|
+ *
|
|
+ * ***************** Version 60 *****************
|
|
+ * User: J. Lamotte Date: 26/06/07 Time: 11:37
|
|
+ * Updated in $/Source/bsl/Src
|
|
+ * PR 459 : Update version to 3.7
|
|
+ *
|
|
+ * ***************** Version 59 *****************
|
|
+ * User: J. Lamotte Date: 13/06/07 Time: 17:00
|
|
+ * Updated in $/Source/bsl/Src
|
|
+ * PR 401 : Update version to 3.6
|
|
+ *
|
|
+ * ***************** Version 58 *****************
|
|
+ * User: J. Lamotte Date: 13/06/07 Time: 12:00
|
|
+ * Updated in $/Source/bsl/Src
|
|
+ * PR 397 : Merge with PR 391 (ST_CONNECTED rename
|
|
+ * to ST_SINK_CONNECTED)
|
|
+ *
|
|
+ * ***************** Version 57 *****************
|
|
+ * User: Burnouf Date: 08/06/07 Time: 15:50
|
|
+ * Updated in $/Source/bsl/Src
|
|
+ * PR 347 : Add new PC formats
|
|
+ *
|
|
+ * ***************** Version 56 *****************
|
|
+ * User: J. Lamotte Date: 24/05/07 Time: 14:45
|
|
+ * Updated in $/Source/bsl/Src
|
|
+ * PR 50 : Update version to 3.5
|
|
+ *
|
|
+ * ***************** Version 55 *****************
|
|
+ * User: J. Lamotte Date: 03/05/07 Time: 13:55
|
|
+ * Updated in $/Source/bsl/Src
|
|
+ * PR 50 : Update E_DEV_VERSION_N4 and E_DEV_VERSION_LIST_END
|
|
+ * in _eDevVersion enum for TDA9981 chip detection
|
|
+ *
|
|
+ * ***************** Version 54 *****************
|
|
+ * User: Burnouf Date: 18/04/07 Time: 15:50
|
|
+ * Updated in $/Source/bsl/Src
|
|
+ * PR 50 : Add new state ST_AWAIT_RX_SENSE and
|
|
+ * add new events EV_SINKON and EV_SINKOFF for TDA9981
|
|
+ *
|
|
+ * ***************** Version 53 *****************
|
|
+ * User: J. Lamotte Date: 17/04/07 Time: 13:00
|
|
+ * Updated in $/Source/bsl/src
|
|
+ * PR50 - disable scaler for TDA9981
|
|
+ * - undefined page 1 register for TDA9981
|
|
+ * Driver 3.2
|
|
+ *
|
|
+ * ***************** Version 52 *****************
|
|
+ * User: J. Lamotte Date: 16/04/07 Time: 11:30
|
|
+ * Updated in $/Source/bsl/src
|
|
+ * PR50 - move define of HDMITX_UNITS_MAX in
|
|
+ * tmblsHdmiTx.h
|
|
+ * Driver 3.2
|
|
+ *
|
|
+ * ***************** Version 51 *****************
|
|
+ * User: J. Lamotte Date: 25/04/07 Time: 14:50
|
|
+ * Updated in $/Source/bsl/src
|
|
+ * PR273 - add PLL configuration before soft reset
|
|
+ * in function bslInit
|
|
+ * Driver 3.4
|
|
+ *
|
|
+ * ***************** Version 50 *****************
|
|
+ * User: J. Lamotte Date: 13/04/07 Time: 17:30
|
|
+ * Updated in $/Source/bsl/src
|
|
+ * PR50 - add registers for TDA9981
|
|
+ * Driver 3.2
|
|
+ *
|
|
+ * ***************** Version 49 *****************
|
|
+ * User: C. Logiou Date: 08/03/07 Time: 16:52
|
|
+ * Updated in $/Source/bsl/src
|
|
+ * PR214 - add new input format repeated 480i/576i
|
|
+ * Driver 3.2
|
|
+ *
|
|
+ * ***************** Version 48 *****************
|
|
+ * User: Burnouf Date: 01/03/07 Time: 16:15
|
|
+ * Updated in $/Source/bsl/Src
|
|
+ * PR207
|
|
+ * Driver 3.1
|
|
+ *
|
|
+ * ***************** Version 48 *****************
|
|
+ * User: Burnouf Date: 06/02/07 Time: 16:15
|
|
+ * Updated in $/Source/bsl/Src
|
|
+ * PR49 : add PC Formats
|
|
+ * Driver 3.0
|
|
+ *
|
|
+ * ***************** Version 47 *****************
|
|
+ * User: Burnouf Date: 29/01/07 Time: 16:15
|
|
+ * Updated in $/Source/bsl/Src
|
|
+ * Driver 2.9
|
|
+ *
|
|
+ * ***************** Version 46 *****************
|
|
+ * User: Burnouf Date: 08/01/07 Time: 16:15
|
|
+ * Updated in $/Source/bsl/Src
|
|
+ * Driver 2.8
|
|
+ *
|
|
+ * ***************** Version 45 *****************
|
|
+ * User: Burnouf Date: 14/12/06 Time: 10:03
|
|
+ * Updated in $/Source/bsl/Src
|
|
+ * Driver 2.7
|
|
+ *
|
|
+ * ***************** Version 44 *****************
|
|
+ * User: Burnouf Date: 11/12/06 Time: 11:08
|
|
+ * Updated in $/Source/bsl/Src
|
|
+ * Driver 2.6
|
|
+ *
|
|
+ * ***************** Version 43 *****************
|
|
+ * User: Burnouf Date: 07/12/06 Time: 14:20
|
|
+ * Updated in $/Source/bsl/Src
|
|
+ * Driver 2.5
|
|
+ *
|
|
+ * ***************** Version 42 *****************
|
|
+ * User: Burnouf Date: 29/11/06 Time: 17:07
|
|
+ * Updated in $/Source/bsl/Src
|
|
+ * Driver 2.4
|
|
+ *
|
|
+ * ***************** Version 41 *****************
|
|
+ * User: Mayhew Date: 23/11/06 Time: 15:07
|
|
+ * Updated in $/Source/bsl/Src
|
|
+ * Driver 2.3
|
|
+ *
|
|
+ * ***************** Version 39 *****************
|
|
+ * User: Djw Date: 22/11/06 Time: 11:37
|
|
+ * Updated in $/Source/bsl/Src
|
|
+ * PNF74 Changes to serial clock divider values in setPixelRepeat
|
|
+ *
|
|
+ * ***************** Version 37 *****************
|
|
+ * User: Mayhew Date: 10/11/06 Time: 10:14
|
|
+ * Updated in $/Source/bsl/Src
|
|
+ * PNF68 RETIF_REG_FAIL macro added, controlled by compiler command line
|
|
+ * symbol NO_RETIF_REG_FAIL
|
|
+ * PNF68 DIS members funcScheduled, uFuncScheduledMs replaced by HdcpFunc*
|
|
+ * and HdcpCheck* members
|
|
+ *
|
|
+ * ***************** Version 36 *****************
|
|
+ * User: Mayhew Date: 6/11/06 Time: 17:49
|
|
+ * Updated in $/Source/bsl/Src
|
|
+ * PNF68 Add funcScheduled and uFuncScheduledMs to DIS
|
|
+ *
|
|
+ * ***************** Version 34 *****************
|
|
+ * User: Mayhew Date: 2/11/06 Time: 17:05
|
|
+ * Updated in $/Source/bsl/Src
|
|
+ * Version 2.1
|
|
+ *
|
|
+ * ***************** Version 32 *****************
|
|
+ * User: Mayhew Date: 31/10/06 Time: 16:23
|
|
+ * Updated in $/Source/bsl/Src
|
|
+ * Version 2.0
|
|
+ *
|
|
+ * ***************** Version 30 *****************
|
|
+ * User: Mayhew Date: 27/10/06 Time: 12:33
|
|
+ * Updated in $/Source/bsl/Src
|
|
+ * Version 1.9
|
|
+ *
|
|
+ * ***************** Version 28 *****************
|
|
+ * User: Mayhew Date: 23/10/06 Time: 16:41
|
|
+ * Updated in $/Source/bsl/Src
|
|
+ * Driver version 1.8
|
|
+ *
|
|
+ * ***************** Version 26 *****************
|
|
+ * User: Mayhew Date: 13/10/06 Time: 11:19
|
|
+ * Updated in $/Source/bsl/Src
|
|
+ * Version 1.7. PNF40 Rename P11_CH_STAT registers correctly
|
|
+ *
|
|
+ * ***************** Version 24 *****************
|
|
+ * User: Mayhew Date: 21/09/06 Time: 15:50
|
|
+ * Updated in $/Source/bsl/Src
|
|
+ * Version 1.6. Cut code size in demo by using RETIF_BADPARAM.
|
|
+ *
|
|
+ * ***************** Version 22 *****************
|
|
+ * User: Mayhew Date: 15/09/06 Time: 16:10
|
|
+ * Updated in $/Source/bsl/Src
|
|
+ * PNF22 Add HdcpRi & HdcpFsmState to DIS
|
|
+ * Version 1.5. Fix QAC warning.
|
|
+ *
|
|
+ * ***************** Version 20 *****************
|
|
+ * User: Mayhew Date: 7/09/06 Time: 9:43
|
|
+ * Updated in $/Source/bsl/Src
|
|
+ * Minor version now 4
|
|
+ *
|
|
+ * ***************** Version 18 *****************
|
|
+ * User: Djw Date: 24/08/06 Time: 12:12
|
|
+ * Updated in $/Source/bsl/Src
|
|
+ * PNF8 Use TX33 register in NO_HDCP build.
|
|
+ * PNF14 Add DIS.pixelRepeatCount.
|
|
+ *
|
|
+ * ***************** Version 17 *****************
|
|
+ * User: Djw Date: 22/08/06 Time: 9:58
|
|
+ * Updated in $/Source/bsl/Src
|
|
+ * NO_HDCP modifications
|
|
+ *
|
|
+ * ***************** Version 16 *****************
|
|
+ * User: Mayhew Date: 10/07/06 Time: 13:18
|
|
+ * Updated in $/Source/bsl/Src
|
|
+ * Minor version now 2. Add #define BCAPS_REPEATER.
|
|
+ * Add N5 registers and feature flag. Fix Doxygen warnings.
|
|
+ *
|
|
+ * ***************** Version 14 *****************
|
|
+ * User: Mayhew Date: 30/06/06 Time: 12:55
|
|
+ * Updated in $/Source/bsl/Src
|
|
+ * Minor version now 1. BKSV_SECURE event renamed to BKSV_REPEAT.
|
|
+ * HDCP_BCAPS register is now shadowed and has new _repeater bit.
|
|
+ * Add N4 CH_STAT registers. EdidSinkType replaced by SinkType.
|
|
+ * Add DIS.HdcpAksv.
|
|
+ *
|
|
+ * ***************** Version 12 *****************
|
|
+ * User: Djw Date: 16/06/06 Time: 12:04
|
|
+ * Updated in $/Source/bsl/Src
|
|
+ * Added flag to DIS to support use of alternate i2c address for EDID.
|
|
+ *
|
|
+ * ***************** Version 10 *****************
|
|
+ * User: Mayhew Date: 6/06/06 Time: 13:41
|
|
+ * Updated in $/Source/bsl/Src
|
|
+ * Add checkUnitSetDis. Remove erroneous NOT_SUPPORTED definition.
|
|
+ *
|
|
+ * ***************** Version 9 *****************
|
|
+ * User: Mayhew Date: 5/06/06 Time: 15:06
|
|
+ * Updated in $/Source/bsl/Src
|
|
+ * Move error code definitions to bsl.h, replace with #if checks
|
|
+ * Add DIS.HdcpT0FailState.
|
|
+ *
|
|
+ * ***************** Version 7 *****************
|
|
+ * User: Djw Date: 24/05/06 Time: 11:23
|
|
+ * Updated in $/Source/bsl/Src
|
|
+ * Added new registers for N4 (page 10h Infoframes). Added 2nd Ghost
|
|
+ * register. Reset names for ISRC1 and ACP packet registers for N4
|
|
+ * compatibility.
|
|
+ *
|
|
+ * ***************** Version 5 *****************
|
|
+ * User: Mayhew Date: 22/05/06 Time: 15:58
|
|
+ * Updated in $/Source/bsl/Src
|
|
+ * Add DIS.uDeviceFeatures. Add N4 to version list. Add version register
|
|
+ * masks for N4.
|
|
+ *
|
|
+ * ***************** Version 4 *****************
|
|
+ * User: Mayhew Date: 10/05/06 Time: 17:10
|
|
+ * Updated in $/Source/bsl/Src
|
|
+ * Add HDCP state handling and DIS members, move EDID status enum to .h
|
|
+ *
|
|
+ * ***************** Version 3 *****************
|
|
+ * User: Djw Date: 20/04/06 Time: 17:31
|
|
+ * Updated in $/Source/bsl/Src
|
|
+ * Minor comment correction for EDID DTD in DIS.
|
|
+ *
|
|
+ * ***************** Version 2 *****************
|
|
+ * User: Mayhew Date: 11/04/06 Time: 14:19
|
|
+ * Updated in $/Source/bsl/Src
|
|
+ * Add upsampleMode to Device Instance Structure
|
|
+ *
|
|
+ * ***************** Version 1 *****************
|
|
+ * User: Mayhew Date: 4/04/06 Time: 16:30
|
|
+ * Created in $/Source/bsl/Src
|
|
+ * Driver local API phase 2
|
|
+ *
|
|
+ * \endverbatim
|
|
+ *
|
|
+ * */
|
|
+
|
|
+#ifndef BSLHDMITX_LOCAL_H
|
|
+#define BSLHDMITX_LOCAL_H
|
|
+
|
|
+/*============================================================================*/
|
|
+/* INCLUDE FILES */
|
|
+/*============================================================================*/
|
|
+
|
|
+/*============================================================================*/
|
|
+/* MACRO DEFINITIONS */
|
|
+/*============================================================================*/
|
|
+/* for remove warning */
|
|
+#define DUMMY_ACCESS(x) x
|
|
+
|
|
+/* Defining this symbol here enables the BCAPS Repeater mod for N4 onwards */
|
|
+#ifndef BCAPS_REPEATER
|
|
+#define BCAPS_REPEATER
|
|
+#endif
|
|
+
|
|
+/** \name Versions
|
|
+ * A group of macros to set the software component number and version
|
|
+ * */
|
|
+/*@{*/
|
|
+/** Compatibility number */
|
|
+#define HDMITX_BSL_COMP_NUM 1
|
|
+
|
|
+/** Major software version 1 to 255 */
|
|
+#define HDMITX_BSL_MAJOR_VER 4
|
|
+
|
|
+/** Minor software version 0 to 9 */
|
|
+#define HDMITX_BSL_MINOR_VER 18
|
|
+/*@}*/
|
|
+
|
|
+/** \name ErrorChecks
|
|
+ * A group of checks ensuring that public error codes match DVP standard errors
|
|
+ * */
|
|
+/*@{*/
|
|
+/** SW interface compatibility error */
|
|
+#if ERR_HDMI_COMPATIBILITY != \
|
|
+(ERR_HDMI_BASE + ERR_COMPATIBILITY)
|
|
+#error
|
|
+#endif
|
|
+
|
|
+/** SW major version error */
|
|
+#if ERR_HDMI_MAJOR_VERSION != \
|
|
+(ERR_HDMI_BASE + ERR_MAJOR_VERSION)
|
|
+#error
|
|
+#endif
|
|
+
|
|
+/** SW component version error */
|
|
+#if ERR_HDMI_COMP_VERSION != \
|
|
+(ERR_HDMI_BASE + ERR_COMP_VERSION)
|
|
+#error
|
|
+#endif
|
|
+
|
|
+/** Invalid device unit number */
|
|
+#if ERR_HDMI_BAD_UNIT_NUMBER != \
|
|
+(ERR_HDMI_BASE + ERR_BAD_UNIT_NUMBER)
|
|
+#error
|
|
+#endif
|
|
+
|
|
+/** Invalid input parameter other than unit number */
|
|
+#if ERR_HDMI_BAD_PARAMETER != \
|
|
+(ERR_HDMI_BASE + ERR_BAD_PARAMETER)
|
|
+#error
|
|
+#endif
|
|
+
|
|
+/** Inconsistent input parameters */
|
|
+#if ERR_HDMI_INCONSISTENT_PARAMS != \
|
|
+(ERR_HDMI_BASE + ERR_INCONSISTENT_PARAMS)
|
|
+#error
|
|
+#endif
|
|
+
|
|
+/** Component is not initialized */
|
|
+#if ERR_HDMI_NOT_INITIALIZED != \
|
|
+(ERR_HDMI_BASE + ERR_NOT_INITIALIZED)
|
|
+#error
|
|
+#endif
|
|
+
|
|
+/** Command not supported for current device */
|
|
+#if ERR_HDMI_NOT_SUPPORTED != \
|
|
+(ERR_HDMI_BASE + ERR_NOT_SUPPORTED)
|
|
+#error
|
|
+#endif
|
|
+
|
|
+/** Initialization failed */
|
|
+#if ERR_HDMI_INIT_FAILED != \
|
|
+(ERR_HDMI_BASE + ERR_INIT_FAILED)
|
|
+#error
|
|
+#endif
|
|
+
|
|
+/** Component is busy and cannot do a new operation */
|
|
+#if ERR_HDMI_BUSY != \
|
|
+(ERR_HDMI_BASE + ERR_BUSY)
|
|
+#error
|
|
+#endif
|
|
+
|
|
+/** I2C read error */
|
|
+#if ERR_HDMI_I2C_READ != \
|
|
+(ERR_HDMI_BASE + ERR_READ)
|
|
+#error
|
|
+#endif
|
|
+
|
|
+/** I2C write error */
|
|
+#if ERR_HDMI_I2C_WRITE != \
|
|
+(ERR_HDMI_BASE + ERR_WRITE)
|
|
+#error
|
|
+#endif
|
|
+
|
|
+/** Assertion failure */
|
|
+#if ERR_HDMI_ASSERTION != \
|
|
+(ERR_HDMI_BASE + ERR_ASSERTION)
|
|
+#error
|
|
+#endif
|
|
+
|
|
+/** Bad EDID block checksum */
|
|
+#if ERR_HDMI_INVALID_CHECKSUM != \
|
|
+(ERR_HDMI_BASE + ERR_INVALID_STATE)
|
|
+#error
|
|
+#endif
|
|
+
|
|
+/** No connection to HPD pin */
|
|
+#if ERR_HDMI_NULL_CONNECTION != \
|
|
+(ERR_HDMI_BASE + ERR_NULL_CONNECTION)
|
|
+#error
|
|
+#endif
|
|
+
|
|
+/** Not allowed in DVI mode */
|
|
+#if ERR_HDMI_OPERATION_NOT_PERMITTED != \
|
|
+(ERR_HDMI_BASE + ERR_OPERATION_NOT_PERMITTED)
|
|
+#error
|
|
+#endif
|
|
+/*@}*/
|
|
+
|
|
+/**
|
|
+ * A macro to check a condition and if true return a result
|
|
+ * */
|
|
+#define RETIF(cond, rslt) if ((cond)){return (rslt);}
|
|
+
|
|
+/**
|
|
+ * A macro to check a condition and if true return
|
|
+ * ERR_HDMI_BAD_PARAMETER.
|
|
+ * To save code space, it can be compiled out by defining NO_RETIF_BADPARAM on
|
|
+ * the compiler command line.
|
|
+ * */
|
|
+#ifdef NO_RETIF_BADPARAM
|
|
+#define RETIF_BADPARAM(cond)
|
|
+#else
|
|
+#define RETIF_BADPARAM(cond) if ((cond)){return ERR_HDMI_BAD_PARAMETER;}
|
|
+#endif
|
|
+
|
|
+/**
|
|
+ * A macro to check the result of a register API and if not 0 to return it.
|
|
+ * To save code space, it can be compiled out by defining NO_RETIF_REG_FAIL on
|
|
+ * the compiler command line.
|
|
+ * */
|
|
+#ifdef NO_RETIF_REG_FAIL
|
|
+#define RETIF_REG_FAIL(result)
|
|
+#else
|
|
+#define RETIF_REG_FAIL(result) if ((result) != TM_OK){return (result);}
|
|
+#endif
|
|
+
|
|
+/*============================================================================*/
|
|
+/* ENUM OR TYPE DEFINITIONS */
|
|
+/*============================================================================*/
|
|
+
|
|
+/**
|
|
+ * Driver events and states used for diagnosis
|
|
+ * */
|
|
+typedef enum _bsl_event {
|
|
+ EV_DEINIT = 0,
|
|
+ EV_UNPLUGGED = 1,
|
|
+ EV_PLUGGEDIN = 2,
|
|
+ EV_STANDBY = 3,
|
|
+ EV_RESUME_UNPLUGGED = 4,
|
|
+ EV_RESUME_PLUGGEDIN = 5,
|
|
+ EV_GETBLOCKDATA = 6,
|
|
+ EV_SETINOUT = 7,
|
|
+ EV_OUTDISABLE = 8,
|
|
+ EV_HDCP_RUN = 9,
|
|
+ EV_HDCP_BKSV_NREPEAT = 10,
|
|
+ EV_HDCP_BKSV_NSECURE = 11,
|
|
+ EV_HDCP_BKSV_REPEAT = 12,
|
|
+ EV_HDCP_BSTATUS_GOOD = 13,
|
|
+ EV_HDCP_KSV_SECURE = 14,
|
|
+ EV_HDCP_T0 = 15,
|
|
+ EV_HDCP_STOP = 16,
|
|
+#if defined (TMFL_TDA9981_SUPPORT) && defined(TMFL_RX_SENSE_ON)
|
|
+ EV_SINKON = 17,
|
|
+ EV_SINKOFF = 18,
|
|
+ EV_INVALID = 19
|
|
+#else /* TMFL_TDA9981_SUPPORT && TMFL_RX_SENSE_ON */
|
|
+ EV_INVALID = 17
|
|
+#endif /* TMFL_TDA9981_SUPPORT && TMFL_RX_SENSE_ON */
|
|
+} bsl_event_t;
|
|
+
|
|
+typedef enum _bsl_state {
|
|
+ ST_UNINITIALIZED = 0,
|
|
+ ST_DISCONNECTED = 1,
|
|
+ ST_AWAIT_EDID = 2,
|
|
+ ST_SINK_CONNECTED = 3,
|
|
+ ST_VIDEO_NO_HDCP = 4,
|
|
+ ST_STANDBY = 5,
|
|
+ ST_HDCP_WAIT_RX = 6,
|
|
+ ST_HDCP_WAIT_BSTATUS = 7,
|
|
+ ST_HDCP_WAIT_SHA_1 = 8,
|
|
+ ST_HDCP_AUTHENTICATED = 9,
|
|
+#if defined (TMFL_TDA9981_SUPPORT) && defined(TMFL_RX_SENSE_ON)
|
|
+ ST_AWAIT_RX_SENSE = 10,
|
|
+ ST_INVALID = 11,
|
|
+ ST_NUM = 11
|
|
+#else /* TMFL_TDA9981_SUPPORT && TMFL_RX_SENSE_ON */
|
|
+ ST_INVALID = 10,
|
|
+ ST_NUM = 10
|
|
+#endif /* TMFL_TDA9981_SUPPORT && TMFL_RX_SENSE_ON */
|
|
+} bsl_state_t;
|
|
+
|
|
+/**
|
|
+ * An enum to index into the Device Instance Data shadowReg array
|
|
+ * */
|
|
+enum _e_shad {
|
|
+#ifdef TMFL_TDA9981_SUPPORT
|
|
+ E_SP00_MAIN_CNTRL0 = 0,
|
|
+ E_SP00_INT_FLAGS_0 = 1,
|
|
+ E_SP00_INT_FLAGS_1 = 2,
|
|
+ E_SP00_INT_FLAGS_2 = 3,
|
|
+ E_SP00_VIP_CNTRL_0 = 4,
|
|
+ E_SP00_VIP_CNTRL_1 = 5,
|
|
+ E_SP00_VIP_CNTRL_2 = 6,
|
|
+ E_SP00_VIP_CNTRL_3 = 7,
|
|
+ E_SP00_VIP_CNTRL_4 = 8,
|
|
+ E_SP00_VIP_CNTRL_5 = 9,
|
|
+ E_SP00_MAT_CONTRL = 10,
|
|
+ E_SP00_TBG_CNTRL_0 = 11,
|
|
+ E_SP00_TBG_CNTRL_1 = 12,
|
|
+ E_SP00_HVF_CNTRL_0 = 13,
|
|
+ E_SP00_HVF_CNTRL_1 = 14,
|
|
+ E_SP00_TIMER_H = 15,
|
|
+ E_SP00_DEBUG_PROBE = 16,
|
|
+ E_SP00_AIP_CLKSEL = 17,
|
|
+ E_SNUM = 18, /* Number of shadow registers */
|
|
+ E_SNONE = 18 /* Index value indicating no shadow register */
|
|
+#else
|
|
+ E_SP00_MAIN_CNTRL0 = 0,
|
|
+ E_SP00_INT_FLAGS_0 = 1,
|
|
+ E_SP00_INT_FLAGS_1 = 2,
|
|
+ E_SP00_VIP_CNTRL_0 = 3,
|
|
+ E_SP00_VIP_CNTRL_1 = 4,
|
|
+ E_SP00_VIP_CNTRL_2 = 5,
|
|
+ E_SP00_VIP_CNTRL_3 = 6,
|
|
+ E_SP00_VIP_CNTRL_4 = 7,
|
|
+ E_SP00_VIP_CNTRL_5 = 8,
|
|
+ E_SP00_MAT_CONTRL = 9,
|
|
+ E_SP00_TBG_CNTRL_0 = 10,
|
|
+ E_SP00_TBG_CNTRL_1 = 11,
|
|
+ E_SP00_HVF_CNTRL_0 = 12,
|
|
+ E_SP00_HVF_CNTRL_1 = 13,
|
|
+ E_SP00_TIMER_H = 14,
|
|
+ E_SP00_DEBUG_PROBE = 15,
|
|
+ E_SP00_AIP_CLKSEL = 16,
|
|
+ E_SP01_SC_VIDFORMAT = 17,
|
|
+ E_SP01_SC_CNTRL = 18,
|
|
+ E_SP01_TBG_CNTRL_0 = 19,
|
|
+ E_SNUM = 20, /* Number of shadow registers */
|
|
+ E_SNONE = 20 /* Index value indicating no shadow register */
|
|
+#endif /* TMFL_TDA9981_SUPPORT */
|
|
+};
|
|
+
|
|
+/**
|
|
+ * Page list
|
|
+ * These are indexes to the allowed register page numbers
|
|
+ * */
|
|
+enum _e_page {
|
|
+ E_PAGE_00 = 0,
|
|
+ E_PAGE_01 = 1,
|
|
+ E_PAGE_02 = 2,
|
|
+ E_PAGE_10 = 3, /* New for N4 */
|
|
+ E_PAGE_11 = 4,
|
|
+ E_PAGE_12 = 5,
|
|
+ E_PAGE_NUM = 6, /* Number of pages */
|
|
+ E_PAGE_INVALID = 6 /* Index value indicating invalid page */
|
|
+};
|
|
+
|
|
+/**
|
|
+ * Macros to initialize and access the following register list enum _eReg
|
|
+ * */
|
|
+/* Pack shadow index s, page index p and register address a into u16 */
|
|
+#define SPA(s,p,a) (u16)(((s)<<11)|((p)<<8)|(a))
|
|
+/* Unpacks shadow index s from u16 */
|
|
+#define SPA2SHAD(spa) (u8)((spa)>>11)
|
|
+/* Unpacks page index p from u16 */
|
|
+#define SPA2PAGE(spa) (u8)(((spa)>>8)&0x0007)
|
|
+/* Unpacks register address a from u16 */
|
|
+#define SPA2ADDR(spa) (u8)((spa)&0x00FF)
|
|
+
|
|
+/**
|
|
+ * Register list
|
|
+ *
|
|
+ * Each register symbol has these fields: E_REG_page_register_access
|
|
+ *
|
|
+ * The symbols have a 16-bit value as follows, including an index to
|
|
+ * the Device Instance Data shadowReg[] array:
|
|
+ *
|
|
+ * +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
|
|
+ * |15 |14 |13 |12 |11 |10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
|
|
+ * +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
|
|
+ * | Shadow Index |Page Index | Register Address |
|
|
+ * +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
|
|
+ *
|
|
+ * */
|
|
+enum _e_reg {
|
|
+ /*************************************************************************/
|
|
+ /** Rows formatted in "HDMI Driver - Register List.xls" and pasted here **/
|
|
+ /*************************************************************************/
|
|
+ E_REG_MIN_ADR = 0x00, /* First register on all pages */
|
|
+ E_REG_CURPAGE_ADR_W = 0xFF, /* Address register on all pages */
|
|
+
|
|
+ E_REG_P00_VERSION_R = SPA(E_SNONE , E_PAGE_00, 0x00),
|
|
+ E_REG_P00_MAIN_CNTRL0_W = SPA(E_SP00_MAIN_CNTRL0 , E_PAGE_00, 0x01),
|
|
+#ifdef TMFL_TDA9981_SUPPORT
|
|
+ E_REG_P00_SR_REG_W = SPA(E_SNONE , E_PAGE_00, 0x0A),
|
|
+ E_REG_P00_DDC_DISABLE_RW = SPA(E_SNONE , E_PAGE_00, 0x0B),
|
|
+ E_REG_P00_CCLK_ON_RW = SPA(E_SNONE , E_PAGE_00, 0x0C),
|
|
+#endif /* TMFL_TDA9981_SUPPORT */
|
|
+ E_REG_P00_INT_FLAGS_0_RW = SPA(E_SP00_INT_FLAGS_0 , E_PAGE_00, 0x0F),
|
|
+ E_REG_P00_INT_FLAGS_1_RW = SPA(E_SP00_INT_FLAGS_1 , E_PAGE_00, 0x10),
|
|
+#ifdef TMFL_TDA9981_SUPPORT
|
|
+ E_REG_P00_INT_FLAGS_2_RW = SPA(E_SP00_INT_FLAGS_2 , E_PAGE_00, 0x11),
|
|
+ E_REG_P00_INT_FLAGS_3_R = SPA(E_SNONE , E_PAGE_00, 0x12),
|
|
+ E_REG_P00_SW_INT_W = SPA(E_SNONE , E_PAGE_00, 0x15),
|
|
+ E_REG_P00_ENA_VP_0_RW = SPA(E_SNONE , E_PAGE_00, 0x18),
|
|
+ E_REG_P00_ENA_VP_1_RW = SPA(E_SNONE , E_PAGE_00, 0x19),
|
|
+ E_REG_P00_ENA_VP_2_RW = SPA(E_SNONE , E_PAGE_00, 0x1A),
|
|
+ E_REG_P00_GND_VP_0_RW = SPA(E_SNONE , E_PAGE_00, 0x1B),
|
|
+ E_REG_P00_GND_VP_1_RW = SPA(E_SNONE , E_PAGE_00, 0x1C),
|
|
+ E_REG_P00_GND_VP_2_RW = SPA(E_SNONE , E_PAGE_00, 0x1D),
|
|
+ E_REG_P00_ENA_AP_RW = SPA(E_SNONE , E_PAGE_00, 0x1E),
|
|
+ E_REG_P00_GND_AP_RW = SPA(E_SNONE , E_PAGE_00, 0x1F),
|
|
+#endif /* TMFL_TDA9981_SUPPORT */
|
|
+ E_REG_P00_VIP_CNTRL_0_W = SPA(E_SP00_VIP_CNTRL_0 , E_PAGE_00, 0x20),
|
|
+ E_REG_P00_VIP_CNTRL_1_W = SPA(E_SP00_VIP_CNTRL_1 , E_PAGE_00, 0x21),
|
|
+ E_REG_P00_VIP_CNTRL_2_W = SPA(E_SP00_VIP_CNTRL_2 , E_PAGE_00, 0x22),
|
|
+ E_REG_P00_VIP_CNTRL_3_W = SPA(E_SP00_VIP_CNTRL_3 , E_PAGE_00, 0x23),
|
|
+ E_REG_P00_VIP_CNTRL_4_W = SPA(E_SP00_VIP_CNTRL_4 , E_PAGE_00, 0x24),
|
|
+ E_REG_P00_VIP_CNTRL_5_W = SPA(E_SP00_VIP_CNTRL_5 , E_PAGE_00, 0x25),
|
|
+ E_REG_P00_MAT_CONTRL_W = SPA(E_SP00_MAT_CONTRL , E_PAGE_00, 0x80),
|
|
+ E_REG_P00_MAT_OI1_MSB_W = SPA(E_SNONE , E_PAGE_00, 0x81),
|
|
+ E_REG_P00_MAT_OI1_LSB_W = SPA(E_SNONE , E_PAGE_00, 0x82),
|
|
+ E_REG_P00_MAT_OI2_MSB_W = SPA(E_SNONE , E_PAGE_00, 0x83),
|
|
+ E_REG_P00_MAT_OI2_LSB_W = SPA(E_SNONE , E_PAGE_00, 0x84),
|
|
+ E_REG_P00_MAT_OI3_MSB_W = SPA(E_SNONE , E_PAGE_00, 0x85),
|
|
+ E_REG_P00_MAT_OI3_LSB_W = SPA(E_SNONE , E_PAGE_00, 0x86),
|
|
+ E_REG_P00_MAT_P11_MSB_W = SPA(E_SNONE , E_PAGE_00, 0x87),
|
|
+ E_REG_P00_MAT_P11_LSB_W = SPA(E_SNONE , E_PAGE_00, 0x88),
|
|
+ E_REG_P00_MAT_P12_MSB_W = SPA(E_SNONE , E_PAGE_00, 0x89),
|
|
+ E_REG_P00_MAT_P12_LSB_W = SPA(E_SNONE , E_PAGE_00, 0x8A),
|
|
+ E_REG_P00_MAT_P13_MSB_W = SPA(E_SNONE , E_PAGE_00, 0x8B),
|
|
+ E_REG_P00_MAT_P13_LSB_W = SPA(E_SNONE , E_PAGE_00, 0x8C),
|
|
+ E_REG_P00_MAT_P21_MSB_W = SPA(E_SNONE , E_PAGE_00, 0x8D),
|
|
+ E_REG_P00_MAT_P21_LSB_W = SPA(E_SNONE , E_PAGE_00, 0x8E),
|
|
+ E_REG_P00_MAT_P22_MSB_W = SPA(E_SNONE , E_PAGE_00, 0x8F),
|
|
+ E_REG_P00_MAT_P22_LSB_W = SPA(E_SNONE , E_PAGE_00, 0x90),
|
|
+ E_REG_P00_MAT_P23_MSB_W = SPA(E_SNONE , E_PAGE_00, 0x91),
|
|
+ E_REG_P00_MAT_P23_LSB_W = SPA(E_SNONE , E_PAGE_00, 0x92),
|
|
+ E_REG_P00_MAT_P31_MSB_W = SPA(E_SNONE , E_PAGE_00, 0x93),
|
|
+ E_REG_P00_MAT_P31_LSB_W = SPA(E_SNONE , E_PAGE_00, 0x94),
|
|
+ E_REG_P00_MAT_P32_MSB_W = SPA(E_SNONE , E_PAGE_00, 0x95),
|
|
+ E_REG_P00_MAT_P32_LSB_W = SPA(E_SNONE , E_PAGE_00, 0x96),
|
|
+ E_REG_P00_MAT_P33_MSB_W = SPA(E_SNONE , E_PAGE_00, 0x97),
|
|
+ E_REG_P00_MAT_P33_LSB_W = SPA(E_SNONE , E_PAGE_00, 0x98),
|
|
+ E_REG_P00_MAT_OO1_MSB_W = SPA(E_SNONE , E_PAGE_00, 0x99),
|
|
+ E_REG_P00_MAT_OO1_LSB_W = SPA(E_SNONE , E_PAGE_00, 0x9A),
|
|
+ E_REG_P00_MAT_OO2_MSB_W = SPA(E_SNONE , E_PAGE_00, 0x9B),
|
|
+ E_REG_P00_MAT_OO2_LSB_W = SPA(E_SNONE , E_PAGE_00, 0x9C),
|
|
+ E_REG_P00_MAT_OO3_MSB_W = SPA(E_SNONE , E_PAGE_00, 0x9D),
|
|
+ E_REG_P00_MAT_OO3_LSB_W = SPA(E_SNONE , E_PAGE_00, 0x9E),
|
|
+ E_REG_P00_VIDFORMAT_W = SPA(E_SNONE , E_PAGE_00, 0xA0),
|
|
+ E_REG_P00_REFPIX_MSB_W = SPA(E_SNONE , E_PAGE_00, 0xA1),
|
|
+ E_REG_P00_REFPIX_LSB_W = SPA(E_SNONE , E_PAGE_00, 0xA2),
|
|
+ E_REG_P00_REFLINE_MSB_W = SPA(E_SNONE , E_PAGE_00, 0xA3),
|
|
+ E_REG_P00_REFLINE_LSB_W = SPA(E_SNONE , E_PAGE_00, 0xA4),
|
|
+ E_REG_P00_NPIX_MSB_W = SPA(E_SNONE , E_PAGE_00, 0xA5),
|
|
+ E_REG_P00_NPIX_LSB_W = SPA(E_SNONE , E_PAGE_00, 0xA6),
|
|
+ E_REG_P00_NLINE_MSB_W = SPA(E_SNONE , E_PAGE_00, 0xA7),
|
|
+ E_REG_P00_NLINE_LSB_W = SPA(E_SNONE , E_PAGE_00, 0xA8),
|
|
+ E_REG_P00_VS_LINE_STRT_1_MSB_W = SPA(E_SNONE , E_PAGE_00, 0xA9),
|
|
+ E_REG_P00_VS_LINE_STRT_1_LSB_W = SPA(E_SNONE , E_PAGE_00, 0xAA),
|
|
+ E_REG_P00_VS_PIX_STRT_1_MSB_W = SPA(E_SNONE , E_PAGE_00, 0xAB),
|
|
+ E_REG_P00_VS_PIX_STRT_1_LSB_W = SPA(E_SNONE , E_PAGE_00, 0xAC),
|
|
+ E_REG_P00_VS_LINE_END_1_MSB_W = SPA(E_SNONE , E_PAGE_00, 0xAD),
|
|
+ E_REG_P00_VS_LINE_END_1_LSB_W = SPA(E_SNONE , E_PAGE_00, 0xAE),
|
|
+ E_REG_P00_VS_PIX_END_1_MSB_W = SPA(E_SNONE , E_PAGE_00, 0xAF),
|
|
+ E_REG_P00_VS_PIX_END_1_LSB_W = SPA(E_SNONE , E_PAGE_00, 0xB0),
|
|
+ E_REG_P00_VS_LINE_STRT_2_MSB_W = SPA(E_SNONE , E_PAGE_00, 0xB1),
|
|
+ E_REG_P00_VS_LINE_STRT_2_LSB_W = SPA(E_SNONE , E_PAGE_00, 0xB2),
|
|
+ E_REG_P00_VS_PIX_STRT_2_MSB_W = SPA(E_SNONE , E_PAGE_00, 0xB3),
|
|
+ E_REG_P00_VS_PIX_STRT_2_LSB_W = SPA(E_SNONE , E_PAGE_00, 0xB4),
|
|
+ E_REG_P00_VS_LINE_END_2_MSB_W = SPA(E_SNONE , E_PAGE_00, 0xB5),
|
|
+ E_REG_P00_VS_LINE_END_2_LSB_W = SPA(E_SNONE , E_PAGE_00, 0xB6),
|
|
+ E_REG_P00_VS_PIX_END_2_MSB_W = SPA(E_SNONE , E_PAGE_00, 0xB7),
|
|
+ E_REG_P00_VS_PIX_END_2_LSB_W = SPA(E_SNONE , E_PAGE_00, 0xB8),
|
|
+ E_REG_P00_HS_PIX_START_MSB_W = SPA(E_SNONE , E_PAGE_00, 0xB9),
|
|
+ E_REG_P00_HS_PIX_START_LSB_W = SPA(E_SNONE , E_PAGE_00, 0xBA),
|
|
+ E_REG_P00_HS_PIX_STOP_MSB_W = SPA(E_SNONE , E_PAGE_00, 0xBB),
|
|
+ E_REG_P00_HS_PIX_STOP_LSB_W = SPA(E_SNONE , E_PAGE_00, 0xBC),
|
|
+ E_REG_P00_VWIN_START_1_MSB_W = SPA(E_SNONE , E_PAGE_00, 0xBD),
|
|
+ E_REG_P00_VWIN_START_1_LSB_W = SPA(E_SNONE , E_PAGE_00, 0xBE),
|
|
+ E_REG_P00_VWIN_END_1_MSB_W = SPA(E_SNONE , E_PAGE_00, 0xBF),
|
|
+ E_REG_P00_VWIN_END_1_LSB_W = SPA(E_SNONE , E_PAGE_00, 0xC0),
|
|
+ E_REG_P00_VWIN_START_2_MSB_W = SPA(E_SNONE , E_PAGE_00, 0xC1),
|
|
+ E_REG_P00_VWIN_START_2_LSB_W = SPA(E_SNONE , E_PAGE_00, 0xC2),
|
|
+ E_REG_P00_VWIN_END_2_MSB_W = SPA(E_SNONE , E_PAGE_00, 0xC3),
|
|
+ E_REG_P00_VWIN_END_2_LSB_W = SPA(E_SNONE , E_PAGE_00, 0xC4),
|
|
+ E_REG_P00_DE_START_MSB_W = SPA(E_SNONE , E_PAGE_00, 0xC5),
|
|
+ E_REG_P00_DE_START_LSB_W = SPA(E_SNONE , E_PAGE_00, 0xC6),
|
|
+ E_REG_P00_DE_STOP_MSB_W = SPA(E_SNONE , E_PAGE_00, 0xC7),
|
|
+ E_REG_P00_DE_STOP_LSB_W = SPA(E_SNONE , E_PAGE_00, 0xC8),
|
|
+ E_REG_P00_COLBAR_WIDTH_W = SPA(E_SNONE , E_PAGE_00, 0xC9),
|
|
+ E_REG_P00_TBG_CNTRL_0_W = SPA(E_SP00_TBG_CNTRL_0 , E_PAGE_00, 0xCA),
|
|
+ E_REG_P00_TBG_CNTRL_1_W = SPA(E_SP00_TBG_CNTRL_1 , E_PAGE_00, 0xCB),
|
|
+ E_REG_P00_VBL_OFFSET_START_W = SPA(E_SNONE , E_PAGE_00, 0xCC),
|
|
+ E_REG_P00_VBL_OFFSET_END_W = SPA(E_SNONE , E_PAGE_00, 0xCD),
|
|
+ E_REG_P00_HBL_OFFSET_START_W = SPA(E_SNONE , E_PAGE_00, 0xCE),
|
|
+ E_REG_P00_HBL_OFFSET_END_W = SPA(E_SNONE , E_PAGE_00, 0xCF),
|
|
+ E_REG_P00_DWIN_RE_DE_W = SPA(E_SNONE , E_PAGE_00, 0xD0),
|
|
+ E_REG_P00_DWIN_FE_DE_W = SPA(E_SNONE , E_PAGE_00, 0xD1),
|
|
+ E_REG_P00_HVF_CNTRL_0_W = SPA(E_SP00_HVF_CNTRL_0 , E_PAGE_00, 0xE4),
|
|
+ E_REG_P00_HVF_CNTRL_1_W = SPA(E_SP00_HVF_CNTRL_1 , E_PAGE_00, 0xE5),
|
|
+ E_REG_P00_TIMER_H_W = SPA(E_SP00_TIMER_H , E_PAGE_00, 0xE8),
|
|
+ E_REG_P00_TIMER_M_W = SPA(E_SNONE , E_PAGE_00, 0xE9),
|
|
+ E_REG_P00_TIMER_L_W = SPA(E_SNONE , E_PAGE_00, 0xEA),
|
|
+#ifdef TMFL_TDA9981_SUPPORT
|
|
+ E_REG_P00_TIMER_2SEC_W = SPA(E_SNONE , E_PAGE_00, 0xEB),
|
|
+ E_REG_P00_TIMER_5SEC_W = SPA(E_SNONE , E_PAGE_00, 0xEC),
|
|
+#endif /* TMFL_TDA9981_SUPPORT */
|
|
+ E_REG_P00_NDIV_IM_W = SPA(E_SNONE , E_PAGE_00, 0xEE),
|
|
+ E_REG_P00_NDIV_PF_W = SPA(E_SNONE , E_PAGE_00, 0xEF),
|
|
+ E_REG_P00_RPT_CNTRL_W = SPA(E_SNONE , E_PAGE_00, 0xF0),
|
|
+ E_REG_P00_LEAD_OFF_W = SPA(E_SNONE , E_PAGE_00, 0xF1),
|
|
+ E_REG_P00_TRAIL_OFF_W = SPA(E_SNONE , E_PAGE_00, 0xF2),
|
|
+ E_REG_P00_DEBUG_PROBE_W = SPA(E_SP00_DEBUG_PROBE , E_PAGE_00, 0xF8),
|
|
+ E_REG_P00_GHOST_XADDR_W = SPA(E_SNONE , E_PAGE_00, 0xF9),
|
|
+ E_REG_P00_AIP_CLKSEL_W = SPA(E_SP00_AIP_CLKSEL , E_PAGE_00, 0xFD),
|
|
+ E_REG_P00_GHOST_ADDR_W = SPA(E_SNONE , E_PAGE_00, 0xFE),
|
|
+#ifndef TMFL_TDA9981_SUPPORT
|
|
+ E_REG_P01_SC_VIDFORMAT_W = SPA(E_SP01_SC_VIDFORMAT, E_PAGE_01, 0x00),
|
|
+ E_REG_P01_SC_CNTRL_W = SPA(E_SP01_SC_CNTRL , E_PAGE_01, 0x01),
|
|
+ E_REG_P01_SC_DELTA_PHASE_V_W = SPA(E_SNONE , E_PAGE_01, 0x02),
|
|
+ E_REG_P01_SC_DELTA_PHASE_H_W = SPA(E_SNONE , E_PAGE_01, 0x03),
|
|
+ E_REG_P01_SC_START_PHASE_H_W = SPA(E_SNONE , E_PAGE_01, 0x04),
|
|
+ E_REG_P01_SC_NPIX_IN_LSB_W = SPA(E_SNONE , E_PAGE_01, 0x05),
|
|
+ E_REG_P01_SC_NPIX_IN_MSB_W = SPA(E_SNONE , E_PAGE_01, 0x06),
|
|
+ E_REG_P01_SC_NPIX_OUT_LSB_W = SPA(E_SNONE , E_PAGE_01, 0x07),
|
|
+ E_REG_P01_SC_NPIX_OUT_MSB_W = SPA(E_SNONE , E_PAGE_01, 0x08),
|
|
+ E_REG_P01_SC_NLINE_IN_LSB_W = SPA(E_SNONE , E_PAGE_01, 0x09),
|
|
+ E_REG_P01_SC_NLINE_IN_MSB_W = SPA(E_SNONE , E_PAGE_01, 0x0A),
|
|
+ E_REG_P01_SC_NLINE_OUT_LSB_W = SPA(E_SNONE , E_PAGE_01, 0x0B),
|
|
+ E_REG_P01_SC_NLINE_OUT_MSB_W = SPA(E_SNONE , E_PAGE_01, 0x0C),
|
|
+ E_REG_P01_SC_NLINE_SKIP_W = SPA(E_SNONE , E_PAGE_01, 0x0D),
|
|
+ E_REG_P01_SC_SAMPLE_BUFFILL_R = SPA(E_SNONE , E_PAGE_01, 0x0E),
|
|
+ E_REG_P01_SC_MAX_BUFFILL_P_0_R = SPA(E_SNONE , E_PAGE_01, 0x0F),
|
|
+ E_REG_P01_SC_MAX_BUFFILL_P_1_R = SPA(E_SNONE , E_PAGE_01, 0x10),
|
|
+ E_REG_P01_SC_MAX_BUFFILL_D_0_R = SPA(E_SNONE , E_PAGE_01, 0x11),
|
|
+ E_REG_P01_SC_MAX_BUFFILL_D_1_R = SPA(E_SNONE , E_PAGE_01, 0x12),
|
|
+ E_REG_P01_SC_SAMPLE_FIFOFILL_R = SPA(E_SNONE , E_PAGE_01, 0x13),
|
|
+ E_REG_P01_SC_MAX_FIFOFILL_PI_R = SPA(E_SNONE , E_PAGE_01, 0x14),
|
|
+ E_REG_P01_SC_MIN_FIFOFILL_PO1_R = SPA(E_SNONE , E_PAGE_01, 0x15),
|
|
+ E_REG_P01_SC_MIN_FIFOFILL_PO2_R = SPA(E_SNONE , E_PAGE_01, 0x16),
|
|
+ E_REG_P01_SC_MIN_FIFOFILL_PO3_R = SPA(E_SNONE , E_PAGE_01, 0x17),
|
|
+ E_REG_P01_SC_MIN_FIFOFILL_PO4_R = SPA(E_SNONE , E_PAGE_01, 0x18),
|
|
+ E_REG_P01_SC_MAX_FIFOFILL_DI_R = SPA(E_SNONE , E_PAGE_01, 0x19),
|
|
+ E_REG_P01_SC_MAX_FIFOFILL_DO_R = SPA(E_SNONE , E_PAGE_01, 0x1A),
|
|
+ E_REG_P01_SC_VS_LUT_0_W = SPA(E_SNONE , E_PAGE_01, 0x1B),
|
|
+ E_REG_P01_SC_VS_LUT_1_W = SPA(E_SNONE , E_PAGE_01, 0x1C),
|
|
+ E_REG_P01_SC_VS_LUT_2_W = SPA(E_SNONE , E_PAGE_01, 0x1D),
|
|
+ E_REG_P01_SC_VS_LUT_3_W = SPA(E_SNONE , E_PAGE_01, 0x1E),
|
|
+ E_REG_P01_SC_VS_LUT_4_W = SPA(E_SNONE , E_PAGE_01, 0x1F),
|
|
+ E_REG_P01_SC_VS_LUT_5_W = SPA(E_SNONE , E_PAGE_01, 0x20),
|
|
+ E_REG_P01_SC_VS_LUT_6_W = SPA(E_SNONE , E_PAGE_01, 0x21),
|
|
+ E_REG_P01_SC_VS_LUT_7_W = SPA(E_SNONE , E_PAGE_01, 0x22),
|
|
+ E_REG_P01_SC_VS_LUT_8_W = SPA(E_SNONE , E_PAGE_01, 0x23),
|
|
+ E_REG_P01_SC_VS_LUT_9_W = SPA(E_SNONE , E_PAGE_01, 0x24),
|
|
+ E_REG_P01_SC_VS_LUT_10_W = SPA(E_SNONE , E_PAGE_01, 0x25),
|
|
+ E_REG_P01_SC_VS_LUT_11_W = SPA(E_SNONE , E_PAGE_01, 0x26),
|
|
+ E_REG_P01_SC_VS_LUT_12_W = SPA(E_SNONE , E_PAGE_01, 0x27),
|
|
+ E_REG_P01_SC_VS_LUT_13_W = SPA(E_SNONE , E_PAGE_01, 0x28),
|
|
+ E_REG_P01_SC_VS_LUT_14_W = SPA(E_SNONE , E_PAGE_01, 0x29),
|
|
+ E_REG_P01_SC_VS_LUT_15_W = SPA(E_SNONE , E_PAGE_01, 0x2A),
|
|
+ E_REG_P01_SC_VS_LUT_16_W = SPA(E_SNONE , E_PAGE_01, 0x2B),
|
|
+ E_REG_P01_SC_VS_LUT_17_W = SPA(E_SNONE , E_PAGE_01, 0x2C),
|
|
+ E_REG_P01_SC_VS_LUT_18_W = SPA(E_SNONE , E_PAGE_01, 0x2D),
|
|
+ E_REG_P01_SC_VS_LUT_19_W = SPA(E_SNONE , E_PAGE_01, 0x2E),
|
|
+ E_REG_P01_SC_VS_LUT_20_W = SPA(E_SNONE , E_PAGE_01, 0x2F),
|
|
+ E_REG_P01_SC_VS_LUT_21_W = SPA(E_SNONE , E_PAGE_01, 0x30),
|
|
+ E_REG_P01_SC_VS_LUT_22_W = SPA(E_SNONE , E_PAGE_01, 0x31),
|
|
+ E_REG_P01_SC_VS_LUT_23_W = SPA(E_SNONE , E_PAGE_01, 0x32),
|
|
+ E_REG_P01_SC_VS_LUT_24_W = SPA(E_SNONE , E_PAGE_01, 0x33),
|
|
+ E_REG_P01_SC_VS_LUT_25_W = SPA(E_SNONE , E_PAGE_01, 0x34),
|
|
+ E_REG_P01_SC_VS_LUT_26_W = SPA(E_SNONE , E_PAGE_01, 0x35),
|
|
+ E_REG_P01_SC_VS_LUT_27_W = SPA(E_SNONE , E_PAGE_01, 0x36),
|
|
+ E_REG_P01_SC_VS_LUT_28_W = SPA(E_SNONE , E_PAGE_01, 0x37),
|
|
+ E_REG_P01_SC_VS_LUT_29_W = SPA(E_SNONE , E_PAGE_01, 0x38),
|
|
+ E_REG_P01_SC_VS_LUT_30_W = SPA(E_SNONE , E_PAGE_01, 0x39),
|
|
+ E_REG_P01_SC_VS_LUT_31_W = SPA(E_SNONE , E_PAGE_01, 0x3A),
|
|
+ E_REG_P01_SC_VS_LUT_32_W = SPA(E_SNONE , E_PAGE_01, 0x3B),
|
|
+ E_REG_P01_SC_VS_LUT_33_W = SPA(E_SNONE , E_PAGE_01, 0x3C),
|
|
+ E_REG_P01_SC_VS_LUT_34_W = SPA(E_SNONE , E_PAGE_01, 0x3D),
|
|
+ E_REG_P01_SC_VS_LUT_35_W = SPA(E_SNONE , E_PAGE_01, 0x3E),
|
|
+ E_REG_P01_SC_VS_LUT_36_W = SPA(E_SNONE , E_PAGE_01, 0x3F),
|
|
+ E_REG_P01_SC_VS_LUT_37_W = SPA(E_SNONE , E_PAGE_01, 0x40),
|
|
+ E_REG_P01_SC_VS_LUT_38_W = SPA(E_SNONE , E_PAGE_01, 0x41),
|
|
+ E_REG_P01_SC_VS_LUT_39_W = SPA(E_SNONE , E_PAGE_01, 0x42),
|
|
+ E_REG_P01_SC_VS_LUT_40_W = SPA(E_SNONE , E_PAGE_01, 0x43),
|
|
+ E_REG_P01_SC_VS_LUT_41_W = SPA(E_SNONE , E_PAGE_01, 0x44),
|
|
+ E_REG_P01_SC_VS_LUT_42_W = SPA(E_SNONE , E_PAGE_01, 0x45),
|
|
+ E_REG_P01_SC_VS_LUT_43_W = SPA(E_SNONE , E_PAGE_01, 0x46),
|
|
+ E_REG_P01_SC_VS_LUT_44_W = SPA(E_SNONE , E_PAGE_01, 0x47),
|
|
+ E_REG_P01_VIDFORMAT_W = SPA(E_SNONE , E_PAGE_01, 0xA0),
|
|
+ E_REG_P01_REFPIX_MSB_W = SPA(E_SNONE , E_PAGE_01, 0xA1),
|
|
+ E_REG_P01_REFPIX_LSB_W = SPA(E_SNONE , E_PAGE_01, 0xA2),
|
|
+ E_REG_P01_REFLINE_MSB_W = SPA(E_SNONE , E_PAGE_01, 0xA3),
|
|
+ E_REG_P01_REFLINE_LSB_W = SPA(E_SNONE , E_PAGE_01, 0xA4),
|
|
+ E_REG_P01_NPIX_MSB_W = SPA(E_SNONE , E_PAGE_01, 0xA5),
|
|
+ E_REG_P01_NPIX_LSB_W = SPA(E_SNONE , E_PAGE_01, 0xA6),
|
|
+ E_REG_P01_NLINE_MSB_W = SPA(E_SNONE , E_PAGE_01, 0xA7),
|
|
+ E_REG_P01_NLINE_LSB_W = SPA(E_SNONE , E_PAGE_01, 0xA8),
|
|
+ E_REG_P01_VWIN_START_1_MSB_W = SPA(E_SNONE , E_PAGE_01, 0xBD),
|
|
+ E_REG_P01_VWIN_START_1_LSB_W = SPA(E_SNONE , E_PAGE_01, 0xBE),
|
|
+ E_REG_P01_VWIN_END_1_MSB_W = SPA(E_SNONE , E_PAGE_01, 0xBF),
|
|
+ E_REG_P01_VWIN_END_1_LSB_W = SPA(E_SNONE , E_PAGE_01, 0xC0),
|
|
+ E_REG_P01_VWIN_START_2_MSB_W = SPA(E_SNONE , E_PAGE_01, 0xC1),
|
|
+ E_REG_P01_VWIN_START_2_LSB_W = SPA(E_SNONE , E_PAGE_01, 0xC2),
|
|
+ E_REG_P01_VWIN_END_2_MSB_W = SPA(E_SNONE , E_PAGE_01, 0xC3),
|
|
+ E_REG_P01_VWIN_END_2_LSB_W = SPA(E_SNONE , E_PAGE_01, 0xC4),
|
|
+ E_REG_P01_DE_START_MSB_W = SPA(E_SNONE , E_PAGE_01, 0xC5),
|
|
+ E_REG_P01_DE_START_LSB_W = SPA(E_SNONE , E_PAGE_01, 0xC6),
|
|
+ E_REG_P01_DE_STOP_MSB_W = SPA(E_SNONE , E_PAGE_01, 0xC7),
|
|
+ E_REG_P01_DE_STOP_LSB_W = SPA(E_SNONE , E_PAGE_01, 0xC8),
|
|
+ E_REG_P01_TBG_CNTRL_0_W = SPA(E_SP01_TBG_CNTRL_0 , E_PAGE_01, 0xCA),
|
|
+#endif /* TMFL_TDA9981_SUPPORT */
|
|
+ E_REG_P02_PLL_SERIAL_1_RW = SPA(E_SNONE , E_PAGE_02, 0x00),
|
|
+ E_REG_P02_PLL_SERIAL_2_RW = SPA(E_SNONE , E_PAGE_02, 0x01),
|
|
+ E_REG_P02_PLL_SERIAL_3_RW = SPA(E_SNONE , E_PAGE_02, 0x02),
|
|
+ E_REG_P02_SERIALIZER_RW = SPA(E_SNONE , E_PAGE_02, 0x03),
|
|
+ E_REG_P02_BUFFER_OUT_RW = SPA(E_SNONE , E_PAGE_02, 0x04),
|
|
+ E_REG_P02_PLL_SCG1_RW = SPA(E_SNONE , E_PAGE_02, 0x05),
|
|
+ E_REG_P02_PLL_SCG2_RW = SPA(E_SNONE , E_PAGE_02, 0x06),
|
|
+ E_REG_P02_PLL_SCGN1_RW = SPA(E_SNONE , E_PAGE_02, 0x07),
|
|
+ E_REG_P02_PLL_SCGN2_RW = SPA(E_SNONE , E_PAGE_02, 0x08),
|
|
+ E_REG_P02_PLL_SCGR1_RW = SPA(E_SNONE , E_PAGE_02, 0x09),
|
|
+ E_REG_P02_PLL_SCGR2_RW = SPA(E_SNONE , E_PAGE_02, 0x0A),
|
|
+ E_REG_P02_PLL_DE_RW = SPA(E_SNONE , E_PAGE_02, 0x0B),
|
|
+ E_REG_P02_CCIR_DIV_RW = SPA(E_SNONE , E_PAGE_02, 0x0C),
|
|
+ E_REG_P02_VAI_PLL_R = SPA(E_SNONE , E_PAGE_02, 0x0D),
|
|
+ E_REG_P02_AUDIO_DIV_RW = SPA(E_SNONE , E_PAGE_02, 0x0E),
|
|
+ E_REG_P02_TEST1_RW = SPA(E_SNONE , E_PAGE_02, 0x0F),
|
|
+ E_REG_P02_TEST2_RW = SPA(E_SNONE , E_PAGE_02, 0x10),
|
|
+ E_REG_P02_SEL_CLK_RW = SPA(E_SNONE , E_PAGE_02, 0x11),
|
|
+ E_REG_P10_IF1_HB0_RW = SPA(E_SNONE , E_PAGE_10, 0x20),
|
|
+ E_REG_P10_IF1_HB1_RW = SPA(E_SNONE , E_PAGE_10, 0x21),
|
|
+ E_REG_P10_IF1_HB2_RW = SPA(E_SNONE , E_PAGE_10, 0x22),
|
|
+ E_REG_P10_IF1_PB0_RW = SPA(E_SNONE , E_PAGE_10, 0x23),
|
|
+ E_REG_P10_IF1_PB1_RW = SPA(E_SNONE , E_PAGE_10, 0x24),
|
|
+ E_REG_P10_IF1_PB2_RW = SPA(E_SNONE , E_PAGE_10, 0x25),
|
|
+ E_REG_P10_IF1_PB3_RW = SPA(E_SNONE , E_PAGE_10, 0x26),
|
|
+ E_REG_P10_IF1_PB4_RW = SPA(E_SNONE , E_PAGE_10, 0x27),
|
|
+ E_REG_P10_IF1_PB5_RW = SPA(E_SNONE , E_PAGE_10, 0x28),
|
|
+ E_REG_P10_IF1_PB6_RW = SPA(E_SNONE , E_PAGE_10, 0x29),
|
|
+ E_REG_P10_IF1_PB7_RW = SPA(E_SNONE , E_PAGE_10, 0x2A),
|
|
+ E_REG_P10_IF1_PB8_RW = SPA(E_SNONE , E_PAGE_10, 0x2B),
|
|
+ E_REG_P10_IF1_PB9_RW = SPA(E_SNONE , E_PAGE_10, 0x2C),
|
|
+ E_REG_P10_IF1_PB10_RW = SPA(E_SNONE , E_PAGE_10, 0x2D),
|
|
+ E_REG_P10_IF1_PB11_RW = SPA(E_SNONE , E_PAGE_10, 0x2E),
|
|
+ E_REG_P10_IF1_PB12_RW = SPA(E_SNONE , E_PAGE_10, 0x2F),
|
|
+ E_REG_P10_IF1_PB13_RW = SPA(E_SNONE , E_PAGE_10, 0x30),
|
|
+ E_REG_P10_IF1_PB14_RW = SPA(E_SNONE , E_PAGE_10, 0x31),
|
|
+ E_REG_P10_IF1_PB15_RW = SPA(E_SNONE , E_PAGE_10, 0x32),
|
|
+ E_REG_P10_IF1_PB16_RW = SPA(E_SNONE , E_PAGE_10, 0x33),
|
|
+ E_REG_P10_IF1_PB17_RW = SPA(E_SNONE , E_PAGE_10, 0x34),
|
|
+ E_REG_P10_IF1_PB18_RW = SPA(E_SNONE , E_PAGE_10, 0x35),
|
|
+ E_REG_P10_IF1_PB19_RW = SPA(E_SNONE , E_PAGE_10, 0x36),
|
|
+ E_REG_P10_IF1_PB20_RW = SPA(E_SNONE , E_PAGE_10, 0x37),
|
|
+ E_REG_P10_IF1_PB21_RW = SPA(E_SNONE , E_PAGE_10, 0x38),
|
|
+ E_REG_P10_IF1_PB22_RW = SPA(E_SNONE , E_PAGE_10, 0x39),
|
|
+ E_REG_P10_IF1_PB23_RW = SPA(E_SNONE , E_PAGE_10, 0x3A),
|
|
+ E_REG_P10_IF1_PB24_RW = SPA(E_SNONE , E_PAGE_10, 0x3B),
|
|
+ E_REG_P10_IF1_PB25_RW = SPA(E_SNONE , E_PAGE_10, 0x3C),
|
|
+ E_REG_P10_IF1_PB26_RW = SPA(E_SNONE , E_PAGE_10, 0x3D),
|
|
+ E_REG_P10_IF1_PB27_RW = SPA(E_SNONE , E_PAGE_10, 0x3E),
|
|
+ E_REG_P10_IF2_HB0_RW = SPA(E_SNONE , E_PAGE_10, 0x40),
|
|
+ E_REG_P10_IF2_HB1_RW = SPA(E_SNONE , E_PAGE_10, 0x41),
|
|
+ E_REG_P10_IF2_HB2_RW = SPA(E_SNONE , E_PAGE_10, 0x42),
|
|
+ E_REG_P10_IF2_PB0_RW = SPA(E_SNONE , E_PAGE_10, 0x43),
|
|
+ E_REG_P10_IF2_PB1_RW = SPA(E_SNONE , E_PAGE_10, 0x44),
|
|
+ E_REG_P10_IF2_PB2_RW = SPA(E_SNONE , E_PAGE_10, 0x45),
|
|
+ E_REG_P10_IF2_PB3_RW = SPA(E_SNONE , E_PAGE_10, 0x46),
|
|
+ E_REG_P10_IF2_PB4_RW = SPA(E_SNONE , E_PAGE_10, 0x47),
|
|
+ E_REG_P10_IF2_PB5_RW = SPA(E_SNONE , E_PAGE_10, 0x48),
|
|
+ E_REG_P10_IF2_PB6_RW = SPA(E_SNONE , E_PAGE_10, 0x49),
|
|
+ E_REG_P10_IF2_PB7_RW = SPA(E_SNONE , E_PAGE_10, 0x4A),
|
|
+ E_REG_P10_IF2_PB8_RW = SPA(E_SNONE , E_PAGE_10, 0x4B),
|
|
+ E_REG_P10_IF2_PB9_RW = SPA(E_SNONE , E_PAGE_10, 0x4C),
|
|
+ E_REG_P10_IF2_PB10_RW = SPA(E_SNONE , E_PAGE_10, 0x4D),
|
|
+ E_REG_P10_IF2_PB11_RW = SPA(E_SNONE , E_PAGE_10, 0x4E),
|
|
+ E_REG_P10_IF2_PB12_RW = SPA(E_SNONE , E_PAGE_10, 0x4F),
|
|
+ E_REG_P10_IF2_PB13_RW = SPA(E_SNONE , E_PAGE_10, 0x50),
|
|
+ E_REG_P10_IF2_PB14_RW = SPA(E_SNONE , E_PAGE_10, 0x51),
|
|
+ E_REG_P10_IF2_PB15_RW = SPA(E_SNONE , E_PAGE_10, 0x52),
|
|
+ E_REG_P10_IF2_PB16_RW = SPA(E_SNONE , E_PAGE_10, 0x53),
|
|
+ E_REG_P10_IF2_PB17_RW = SPA(E_SNONE , E_PAGE_10, 0x54),
|
|
+ E_REG_P10_IF2_PB18_RW = SPA(E_SNONE , E_PAGE_10, 0x55),
|
|
+ E_REG_P10_IF2_PB19_RW = SPA(E_SNONE , E_PAGE_10, 0x56),
|
|
+ E_REG_P10_IF2_PB20_RW = SPA(E_SNONE , E_PAGE_10, 0x57),
|
|
+ E_REG_P10_IF2_PB21_RW = SPA(E_SNONE , E_PAGE_10, 0x58),
|
|
+ E_REG_P10_IF2_PB22_RW = SPA(E_SNONE , E_PAGE_10, 0x59),
|
|
+ E_REG_P10_IF2_PB23_RW = SPA(E_SNONE , E_PAGE_10, 0x5A),
|
|
+ E_REG_P10_IF2_PB24_RW = SPA(E_SNONE , E_PAGE_10, 0x5B),
|
|
+ E_REG_P10_IF2_PB25_RW = SPA(E_SNONE , E_PAGE_10, 0x5C),
|
|
+ E_REG_P10_IF2_PB26_RW = SPA(E_SNONE , E_PAGE_10, 0x5D),
|
|
+ E_REG_P10_IF2_PB27_RW = SPA(E_SNONE , E_PAGE_10, 0x5E),
|
|
+ E_REG_P10_IF3_HB0_RW = SPA(E_SNONE , E_PAGE_10, 0x60),
|
|
+ E_REG_P10_IF3_HB1_RW = SPA(E_SNONE , E_PAGE_10, 0x61),
|
|
+ E_REG_P10_IF3_HB2_RW = SPA(E_SNONE , E_PAGE_10, 0x62),
|
|
+ E_REG_P10_IF3_PB0_RW = SPA(E_SNONE , E_PAGE_10, 0x63),
|
|
+ E_REG_P10_IF3_PB1_RW = SPA(E_SNONE , E_PAGE_10, 0x64),
|
|
+ E_REG_P10_IF3_PB2_RW = SPA(E_SNONE , E_PAGE_10, 0x65),
|
|
+ E_REG_P10_IF3_PB3_RW = SPA(E_SNONE , E_PAGE_10, 0x66),
|
|
+ E_REG_P10_IF3_PB4_RW = SPA(E_SNONE , E_PAGE_10, 0x67),
|
|
+ E_REG_P10_IF3_PB5_RW = SPA(E_SNONE , E_PAGE_10, 0x68),
|
|
+ E_REG_P10_IF3_PB6_RW = SPA(E_SNONE , E_PAGE_10, 0x69),
|
|
+ E_REG_P10_IF3_PB7_RW = SPA(E_SNONE , E_PAGE_10, 0x6A),
|
|
+ E_REG_P10_IF3_PB8_RW = SPA(E_SNONE , E_PAGE_10, 0x6B),
|
|
+ E_REG_P10_IF3_PB9_RW = SPA(E_SNONE , E_PAGE_10, 0x6C),
|
|
+ E_REG_P10_IF3_PB10_RW = SPA(E_SNONE , E_PAGE_10, 0x6D),
|
|
+ E_REG_P10_IF3_PB11_RW = SPA(E_SNONE , E_PAGE_10, 0x6E),
|
|
+ E_REG_P10_IF3_PB12_RW = SPA(E_SNONE , E_PAGE_10, 0x6F),
|
|
+ E_REG_P10_IF3_PB13_RW = SPA(E_SNONE , E_PAGE_10, 0x70),
|
|
+ E_REG_P10_IF3_PB14_RW = SPA(E_SNONE , E_PAGE_10, 0x71),
|
|
+ E_REG_P10_IF3_PB15_RW = SPA(E_SNONE , E_PAGE_10, 0x72),
|
|
+ E_REG_P10_IF3_PB16_RW = SPA(E_SNONE , E_PAGE_10, 0x73),
|
|
+ E_REG_P10_IF3_PB17_RW = SPA(E_SNONE , E_PAGE_10, 0x74),
|
|
+ E_REG_P10_IF3_PB18_RW = SPA(E_SNONE , E_PAGE_10, 0x75),
|
|
+ E_REG_P10_IF3_PB19_RW = SPA(E_SNONE , E_PAGE_10, 0x76),
|
|
+ E_REG_P10_IF3_PB20_RW = SPA(E_SNONE , E_PAGE_10, 0x77),
|
|
+ E_REG_P10_IF3_PB21_RW = SPA(E_SNONE , E_PAGE_10, 0x78),
|
|
+ E_REG_P10_IF3_PB22_RW = SPA(E_SNONE , E_PAGE_10, 0x79),
|
|
+ E_REG_P10_IF3_PB23_RW = SPA(E_SNONE , E_PAGE_10, 0x7A),
|
|
+ E_REG_P10_IF3_PB24_RW = SPA(E_SNONE , E_PAGE_10, 0x7B),
|
|
+ E_REG_P10_IF3_PB25_RW = SPA(E_SNONE , E_PAGE_10, 0x7C),
|
|
+ E_REG_P10_IF3_PB26_RW = SPA(E_SNONE , E_PAGE_10, 0x7D),
|
|
+ E_REG_P10_IF3_PB27_RW = SPA(E_SNONE , E_PAGE_10, 0x7E),
|
|
+ E_REG_P10_IF4_HB0_RW = SPA(E_SNONE , E_PAGE_10, 0x80),
|
|
+ E_REG_P10_IF4_HB1_RW = SPA(E_SNONE , E_PAGE_10, 0x81),
|
|
+ E_REG_P10_IF4_HB2_RW = SPA(E_SNONE , E_PAGE_10, 0x82),
|
|
+ E_REG_P10_IF4_PB0_RW = SPA(E_SNONE , E_PAGE_10, 0x83),
|
|
+ E_REG_P10_IF4_PB1_RW = SPA(E_SNONE , E_PAGE_10, 0x84),
|
|
+ E_REG_P10_IF4_PB2_RW = SPA(E_SNONE , E_PAGE_10, 0x85),
|
|
+ E_REG_P10_IF4_PB3_RW = SPA(E_SNONE , E_PAGE_10, 0x86),
|
|
+ E_REG_P10_IF4_PB4_RW = SPA(E_SNONE , E_PAGE_10, 0x87),
|
|
+ E_REG_P10_IF4_PB5_RW = SPA(E_SNONE , E_PAGE_10, 0x88),
|
|
+ E_REG_P10_IF4_PB6_RW = SPA(E_SNONE , E_PAGE_10, 0x89),
|
|
+ E_REG_P10_IF4_PB7_RW = SPA(E_SNONE , E_PAGE_10, 0x8A),
|
|
+ E_REG_P10_IF4_PB8_RW = SPA(E_SNONE , E_PAGE_10, 0x8B),
|
|
+ E_REG_P10_IF4_PB9_RW = SPA(E_SNONE , E_PAGE_10, 0x8C),
|
|
+ E_REG_P10_IF4_PB10_RW = SPA(E_SNONE , E_PAGE_10, 0x8D),
|
|
+ E_REG_P10_IF4_PB11_RW = SPA(E_SNONE , E_PAGE_10, 0x8E),
|
|
+ E_REG_P10_IF4_PB12_RW = SPA(E_SNONE , E_PAGE_10, 0x8F),
|
|
+ E_REG_P10_IF4_PB13_RW = SPA(E_SNONE , E_PAGE_10, 0x90),
|
|
+ E_REG_P10_IF4_PB14_RW = SPA(E_SNONE , E_PAGE_10, 0x91),
|
|
+ E_REG_P10_IF4_PB15_RW = SPA(E_SNONE , E_PAGE_10, 0x92),
|
|
+ E_REG_P10_IF4_PB16_RW = SPA(E_SNONE , E_PAGE_10, 0x93),
|
|
+ E_REG_P10_IF4_PB17_RW = SPA(E_SNONE , E_PAGE_10, 0x94),
|
|
+ E_REG_P10_IF4_PB18_RW = SPA(E_SNONE , E_PAGE_10, 0x95),
|
|
+ E_REG_P10_IF4_PB19_RW = SPA(E_SNONE , E_PAGE_10, 0x96),
|
|
+ E_REG_P10_IF4_PB20_RW = SPA(E_SNONE , E_PAGE_10, 0x97),
|
|
+ E_REG_P10_IF4_PB21_RW = SPA(E_SNONE , E_PAGE_10, 0x98),
|
|
+ E_REG_P10_IF4_PB22_RW = SPA(E_SNONE , E_PAGE_10, 0x99),
|
|
+ E_REG_P10_IF4_PB23_RW = SPA(E_SNONE , E_PAGE_10, 0x9A),
|
|
+ E_REG_P10_IF4_PB24_RW = SPA(E_SNONE , E_PAGE_10, 0x9B),
|
|
+ E_REG_P10_IF4_PB25_RW = SPA(E_SNONE , E_PAGE_10, 0x9C),
|
|
+ E_REG_P10_IF4_PB26_RW = SPA(E_SNONE , E_PAGE_10, 0x9D),
|
|
+ E_REG_P10_IF4_PB27_RW = SPA(E_SNONE , E_PAGE_10, 0x9E),
|
|
+ E_REG_P10_IF5_HB0_RW = SPA(E_SNONE , E_PAGE_10, 0xA0),
|
|
+ E_REG_P10_IF5_HB1_RW = SPA(E_SNONE , E_PAGE_10, 0xA1),
|
|
+ E_REG_P10_IF5_HB2_RW = SPA(E_SNONE , E_PAGE_10, 0xA2),
|
|
+ E_REG_P10_IF5_PB0_RW = SPA(E_SNONE , E_PAGE_10, 0xA3),
|
|
+ E_REG_P10_IF5_PB1_RW = SPA(E_SNONE , E_PAGE_10, 0xA4),
|
|
+ E_REG_P10_IF5_PB2_RW = SPA(E_SNONE , E_PAGE_10, 0xA5),
|
|
+ E_REG_P10_IF5_PB3_RW = SPA(E_SNONE , E_PAGE_10, 0xA6),
|
|
+ E_REG_P10_IF5_PB4_RW = SPA(E_SNONE , E_PAGE_10, 0xA7),
|
|
+ E_REG_P10_IF5_PB5_RW = SPA(E_SNONE , E_PAGE_10, 0xA8),
|
|
+ E_REG_P10_IF5_PB6_RW = SPA(E_SNONE , E_PAGE_10, 0xA9),
|
|
+ E_REG_P10_IF5_PB7_RW = SPA(E_SNONE , E_PAGE_10, 0xAA),
|
|
+ E_REG_P10_IF5_PB8_RW = SPA(E_SNONE , E_PAGE_10, 0xAB),
|
|
+ E_REG_P10_IF5_PB9_RW = SPA(E_SNONE , E_PAGE_10, 0xAC),
|
|
+ E_REG_P10_IF5_PB10_RW = SPA(E_SNONE , E_PAGE_10, 0xAD),
|
|
+ E_REG_P10_IF5_PB11_RW = SPA(E_SNONE , E_PAGE_10, 0xAE),
|
|
+ E_REG_P10_IF5_PB12_RW = SPA(E_SNONE , E_PAGE_10, 0xAF),
|
|
+ E_REG_P10_IF5_PB13_RW = SPA(E_SNONE , E_PAGE_10, 0xB0),
|
|
+ E_REG_P10_IF5_PB14_RW = SPA(E_SNONE , E_PAGE_10, 0xB1),
|
|
+ E_REG_P10_IF5_PB15_RW = SPA(E_SNONE , E_PAGE_10, 0xB2),
|
|
+ E_REG_P10_IF5_PB16_RW = SPA(E_SNONE , E_PAGE_10, 0xB3),
|
|
+ E_REG_P10_IF5_PB17_RW = SPA(E_SNONE , E_PAGE_10, 0xB4),
|
|
+ E_REG_P10_IF5_PB18_RW = SPA(E_SNONE , E_PAGE_10, 0xB5),
|
|
+ E_REG_P10_IF5_PB19_RW = SPA(E_SNONE , E_PAGE_10, 0xB6),
|
|
+ E_REG_P10_IF5_PB20_RW = SPA(E_SNONE , E_PAGE_10, 0xB7),
|
|
+ E_REG_P10_IF5_PB21_RW = SPA(E_SNONE , E_PAGE_10, 0xB8),
|
|
+ E_REG_P10_IF5_PB22_RW = SPA(E_SNONE , E_PAGE_10, 0xB9),
|
|
+ E_REG_P10_IF5_PB23_RW = SPA(E_SNONE , E_PAGE_10, 0xBA),
|
|
+ E_REG_P10_IF5_PB24_RW = SPA(E_SNONE , E_PAGE_10, 0xBB),
|
|
+ E_REG_P10_IF5_PB25_RW = SPA(E_SNONE , E_PAGE_10, 0xBC),
|
|
+ E_REG_P10_IF5_PB26_RW = SPA(E_SNONE , E_PAGE_10, 0xBD),
|
|
+ E_REG_P10_IF5_PB27_RW = SPA(E_SNONE , E_PAGE_10, 0xBE),
|
|
+ E_REG_P11_AIP_CNTRL_0_RW = SPA(E_SNONE , E_PAGE_11, 0x00),
|
|
+ E_REG_P11_CA_I2S_RW = SPA(E_SNONE , E_PAGE_11, 0x01),
|
|
+ E_REG_P11_CA_DSD_RW = SPA(E_SNONE , E_PAGE_11, 0x02),
|
|
+ E_REG_P11_OBA_PH_RW = SPA(E_SNONE , E_PAGE_11, 0x03),
|
|
+ E_REG_P11_LATENCY_RD_RW = SPA(E_SNONE , E_PAGE_11, 0x04),
|
|
+ E_REG_P11_ACR_CTS_0_RW = SPA(E_SNONE , E_PAGE_11, 0x05),
|
|
+ E_REG_P11_ACR_CTS_1_RW = SPA(E_SNONE , E_PAGE_11, 0x06),
|
|
+ E_REG_P11_ACR_CTS_2_RW = SPA(E_SNONE , E_PAGE_11, 0x07),
|
|
+ E_REG_P11_ACR_N_0_RW = SPA(E_SNONE , E_PAGE_11, 0x08),
|
|
+ E_REG_P11_ACR_N_1_RW = SPA(E_SNONE , E_PAGE_11, 0x09),
|
|
+ E_REG_P11_ACR_N_2_RW = SPA(E_SNONE , E_PAGE_11, 0x0A),
|
|
+ E_REG_P11_GC_AVMUTE_RW = SPA(E_SNONE , E_PAGE_11, 0x0B),
|
|
+ E_REG_P11_CTS_N_RW = SPA(E_SNONE , E_PAGE_11, 0x0C),
|
|
+ E_REG_P11_ENC_CNTRL_RW = SPA(E_SNONE , E_PAGE_11, 0x0D),
|
|
+ E_REG_P11_DIP_FLAGS_RW = SPA(E_SNONE , E_PAGE_11, 0x0E),
|
|
+ E_REG_P11_DIP_IF_FLAGS_RW = SPA(E_SNONE , E_PAGE_11, 0x0F),
|
|
+ E_REG_P11_CH_STAT_B_0_RW = SPA(E_SNONE , E_PAGE_11, 0x14),
|
|
+ E_REG_P11_CH_STAT_B_1_RW = SPA(E_SNONE , E_PAGE_11, 0x15),
|
|
+ E_REG_P11_CH_STAT_B_3_RW = SPA(E_SNONE , E_PAGE_11, 0x16),
|
|
+ E_REG_P11_CH_STAT_B_4_RW = SPA(E_SNONE , E_PAGE_11, 0x17),
|
|
+ e_reg_p11_ch_stat_b_2_ap0_l_rw = SPA(E_SNONE , E_PAGE_11, 0x18),
|
|
+ e_reg_p11_ch_stat_b_2_ap0_r_rw = SPA(E_SNONE , E_PAGE_11, 0x19),
|
|
+ e_reg_p11_ch_stat_b_2_ap1_l_rw = SPA(E_SNONE , E_PAGE_11, 0x1A),
|
|
+ e_reg_p11_ch_stat_b_2_ap1_r_rw = SPA(E_SNONE , E_PAGE_11, 0x1B),
|
|
+ e_reg_p11_ch_stat_b_2_ap2_l_rw = SPA(E_SNONE , E_PAGE_11, 0x1C),
|
|
+ e_reg_p11_ch_stat_b_2_ap2_r_rw = SPA(E_SNONE , E_PAGE_11, 0x1D),
|
|
+ e_reg_p11_ch_stat_b_2_ap3_l_rw = SPA(E_SNONE , E_PAGE_11, 0x1E),
|
|
+ e_reg_p11_ch_stat_b_2_ap3_r_rw = SPA(E_SNONE , E_PAGE_11, 0x1F),
|
|
+ /* 20-3E: n3 uses this area for VideoInfoFrame */
|
|
+ E_REG_P11_ISRC1_HB0_RW = SPA(E_SNONE , E_PAGE_11, 0x20),
|
|
+ E_REG_P11_ISRC1_HB1_RW = SPA(E_SNONE , E_PAGE_11, 0x21),
|
|
+ E_REG_P11_ISRC1_HB2_RW = SPA(E_SNONE , E_PAGE_11, 0x22),
|
|
+ E_REG_P11_ISRC1_PB0_RW = SPA(E_SNONE , E_PAGE_11, 0x23),
|
|
+ E_REG_P11_ISRC1_PB1_RW = SPA(E_SNONE , E_PAGE_11, 0x24),
|
|
+ E_REG_P11_ISRC1_PB2_RW = SPA(E_SNONE , E_PAGE_11, 0x25),
|
|
+ E_REG_P11_ISRC1_PB3_RW = SPA(E_SNONE , E_PAGE_11, 0x26),
|
|
+ E_REG_P11_ISRC1_PB4_RW = SPA(E_SNONE , E_PAGE_11, 0x27),
|
|
+ E_REG_P11_ISRC1_PB5_RW = SPA(E_SNONE , E_PAGE_11, 0x28),
|
|
+ E_REG_P11_ISRC1_PB6_RW = SPA(E_SNONE , E_PAGE_11, 0x29),
|
|
+ E_REG_P11_ISRC1_PB7_RW = SPA(E_SNONE , E_PAGE_11, 0x2A),
|
|
+ E_REG_P11_ISRC1_PB8_RW = SPA(E_SNONE , E_PAGE_11, 0x2B),
|
|
+ E_REG_P11_ISRC1_PB9_RW = SPA(E_SNONE , E_PAGE_11, 0x2C),
|
|
+ E_REG_P11_ISRC1_PB10_RW = SPA(E_SNONE , E_PAGE_11, 0x2D),
|
|
+ E_REG_P11_ISRC1_PB11_RW = SPA(E_SNONE , E_PAGE_11, 0x2E),
|
|
+ E_REG_P11_ISRC1_PB12_RW = SPA(E_SNONE , E_PAGE_11, 0x2F),
|
|
+ E_REG_P11_ISRC1_PB13_RW = SPA(E_SNONE , E_PAGE_11, 0x30),
|
|
+ E_REG_P11_ISRC1_PB14_RW = SPA(E_SNONE , E_PAGE_11, 0x31),
|
|
+ E_REG_P11_ISRC1_PB15_RW = SPA(E_SNONE , E_PAGE_11, 0x32),
|
|
+ E_REG_P11_ISRC1_PB16_RW = SPA(E_SNONE , E_PAGE_11, 0x33),
|
|
+ E_REG_P11_ISRC1_PB17_RW = SPA(E_SNONE , E_PAGE_11, 0x34),
|
|
+ E_REG_P11_ISRC1_PB18_RW = SPA(E_SNONE , E_PAGE_11, 0x35),
|
|
+ E_REG_P11_ISRC1_PB19_RW = SPA(E_SNONE , E_PAGE_11, 0x36),
|
|
+ E_REG_P11_ISRC1_PB20_RW = SPA(E_SNONE , E_PAGE_11, 0x37),
|
|
+ E_REG_P11_ISRC1_PB21_RW = SPA(E_SNONE , E_PAGE_11, 0x38),
|
|
+ E_REG_P11_ISRC1_PB22_RW = SPA(E_SNONE , E_PAGE_11, 0x39),
|
|
+ E_REG_P11_ISRC1_PB23_RW = SPA(E_SNONE , E_PAGE_11, 0x3A),
|
|
+ E_REG_P11_ISRC1_PB24_RW = SPA(E_SNONE , E_PAGE_11, 0x3B),
|
|
+ E_REG_P11_ISRC1_PB25_RW = SPA(E_SNONE , E_PAGE_11, 0x3C),
|
|
+ E_REG_P11_ISRC1_PB26_RW = SPA(E_SNONE , E_PAGE_11, 0x3D),
|
|
+ E_REG_P11_ISRC1_PB27_RW = SPA(E_SNONE , E_PAGE_11, 0x3E),
|
|
+ E_REG_P11_ISRC2_HB0_RW = SPA(E_SNONE , E_PAGE_11, 0x40),
|
|
+ E_REG_P11_ISRC2_HB1_RW = SPA(E_SNONE , E_PAGE_11, 0x41),
|
|
+ E_REG_P11_ISRC2_HB2_RW = SPA(E_SNONE , E_PAGE_11, 0x42),
|
|
+ E_REG_P11_ISRC2_PB0_RW = SPA(E_SNONE , E_PAGE_11, 0x43),
|
|
+ E_REG_P11_ISRC2_PB1_RW = SPA(E_SNONE , E_PAGE_11, 0x44),
|
|
+ E_REG_P11_ISRC2_PB2_RW = SPA(E_SNONE , E_PAGE_11, 0x45),
|
|
+ E_REG_P11_ISRC2_PB3_RW = SPA(E_SNONE , E_PAGE_11, 0x46),
|
|
+ E_REG_P11_ISRC2_PB4_RW = SPA(E_SNONE , E_PAGE_11, 0x47),
|
|
+ E_REG_P11_ISRC2_PB5_RW = SPA(E_SNONE , E_PAGE_11, 0x48),
|
|
+ E_REG_P11_ISRC2_PB6_RW = SPA(E_SNONE , E_PAGE_11, 0x49),
|
|
+ E_REG_P11_ISRC2_PB7_RW = SPA(E_SNONE , E_PAGE_11, 0x4A),
|
|
+ E_REG_P11_ISRC2_PB8_RW = SPA(E_SNONE , E_PAGE_11, 0x4B),
|
|
+ E_REG_P11_ISRC2_PB9_RW = SPA(E_SNONE , E_PAGE_11, 0x4C),
|
|
+ E_REG_P11_ISRC2_PB10_RW = SPA(E_SNONE , E_PAGE_11, 0x4D),
|
|
+ E_REG_P11_ISRC2_PB11_RW = SPA(E_SNONE , E_PAGE_11, 0x4E),
|
|
+ E_REG_P11_ISRC2_PB12_RW = SPA(E_SNONE , E_PAGE_11, 0x4F),
|
|
+ E_REG_P11_ISRC2_PB13_RW = SPA(E_SNONE , E_PAGE_11, 0x50),
|
|
+ E_REG_P11_ISRC2_PB14_RW = SPA(E_SNONE , E_PAGE_11, 0x51),
|
|
+ E_REG_P11_ISRC2_PB15_RW = SPA(E_SNONE , E_PAGE_11, 0x52),
|
|
+ E_REG_P11_ISRC2_PB16_RW = SPA(E_SNONE , E_PAGE_11, 0x53),
|
|
+ E_REG_P11_ISRC2_PB17_RW = SPA(E_SNONE , E_PAGE_11, 0x54),
|
|
+ E_REG_P11_ISRC2_PB18_RW = SPA(E_SNONE , E_PAGE_11, 0x55),
|
|
+ E_REG_P11_ISRC2_PB19_RW = SPA(E_SNONE , E_PAGE_11, 0x56),
|
|
+ E_REG_P11_ISRC2_PB20_RW = SPA(E_SNONE , E_PAGE_11, 0x57),
|
|
+ E_REG_P11_ISRC2_PB21_RW = SPA(E_SNONE , E_PAGE_11, 0x58),
|
|
+ E_REG_P11_ISRC2_PB22_RW = SPA(E_SNONE , E_PAGE_11, 0x59),
|
|
+ E_REG_P11_ISRC2_PB23_RW = SPA(E_SNONE , E_PAGE_11, 0x5A),
|
|
+ E_REG_P11_ISRC2_PB24_RW = SPA(E_SNONE , E_PAGE_11, 0x5B),
|
|
+ E_REG_P11_ISRC2_PB25_RW = SPA(E_SNONE , E_PAGE_11, 0x5C),
|
|
+ E_REG_P11_ISRC2_PB26_RW = SPA(E_SNONE , E_PAGE_11, 0x5D),
|
|
+ E_REG_P11_ISRC2_PB27_RW = SPA(E_SNONE , E_PAGE_11, 0x5E),
|
|
+ /* 60-7E: n3 uses this area for AudioInfoFrame */
|
|
+ E_REG_P11_ACP_HB0_RW = SPA(E_SNONE , E_PAGE_11, 0x60),
|
|
+ E_REG_P11_ACP_HB1_RW = SPA(E_SNONE , E_PAGE_11, 0x61),
|
|
+ E_REG_P11_ACP_HB2_RW = SPA(E_SNONE , E_PAGE_11, 0x62),
|
|
+ E_REG_P11_ACP_PB0_RW = SPA(E_SNONE , E_PAGE_11, 0x63),
|
|
+ E_REG_P11_ACP_PB1_RW = SPA(E_SNONE , E_PAGE_11, 0x64),
|
|
+ E_REG_P11_ACP_PB2_RW = SPA(E_SNONE , E_PAGE_11, 0x65),
|
|
+ E_REG_P11_ACP_PB3_RW = SPA(E_SNONE , E_PAGE_11, 0x66),
|
|
+ E_REG_P11_ACP_PB4_RW = SPA(E_SNONE , E_PAGE_11, 0x67),
|
|
+ E_REG_P11_ACP_PB5_RW = SPA(E_SNONE , E_PAGE_11, 0x68),
|
|
+ E_REG_P11_ACP_PB6_RW = SPA(E_SNONE , E_PAGE_11, 0x69),
|
|
+ E_REG_P11_ACP_PB7_RW = SPA(E_SNONE , E_PAGE_11, 0x6A),
|
|
+ E_REG_P11_ACP_PB8_RW = SPA(E_SNONE , E_PAGE_11, 0x6B),
|
|
+ E_REG_P11_ACP_PB9_RW = SPA(E_SNONE , E_PAGE_11, 0x6C),
|
|
+ E_REG_P11_ACP_PB10_RW = SPA(E_SNONE , E_PAGE_11, 0x6D),
|
|
+ E_REG_P11_ACP_PB11_RW = SPA(E_SNONE , E_PAGE_11, 0x6E),
|
|
+ E_REG_P11_ACP_PB12_RW = SPA(E_SNONE , E_PAGE_11, 0x6F),
|
|
+ E_REG_P11_ACP_PB13_RW = SPA(E_SNONE , E_PAGE_11, 0x70),
|
|
+ E_REG_P11_ACP_PB14_RW = SPA(E_SNONE , E_PAGE_11, 0x71),
|
|
+ E_REG_P11_ACP_PB15_RW = SPA(E_SNONE , E_PAGE_11, 0x72),
|
|
+ E_REG_P11_ACP_PB16_RW = SPA(E_SNONE , E_PAGE_11, 0x73),
|
|
+ E_REG_P11_ACP_PB17_RW = SPA(E_SNONE , E_PAGE_11, 0x74),
|
|
+ E_REG_P11_ACP_PB18_RW = SPA(E_SNONE , E_PAGE_11, 0x75),
|
|
+ E_REG_P11_ACP_PB19_RW = SPA(E_SNONE , E_PAGE_11, 0x76),
|
|
+ E_REG_P11_ACP_PB20_RW = SPA(E_SNONE , E_PAGE_11, 0x77),
|
|
+ E_REG_P11_ACP_PB21_RW = SPA(E_SNONE , E_PAGE_11, 0x78),
|
|
+ E_REG_P11_ACP_PB22_RW = SPA(E_SNONE , E_PAGE_11, 0x79),
|
|
+ E_REG_P11_ACP_PB23_RW = SPA(E_SNONE , E_PAGE_11, 0x7A),
|
|
+ E_REG_P11_ACP_PB24_RW = SPA(E_SNONE , E_PAGE_11, 0x7B),
|
|
+ E_REG_P11_ACP_PB25_RW = SPA(E_SNONE , E_PAGE_11, 0x7C),
|
|
+ E_REG_P11_ACP_PB26_RW = SPA(E_SNONE , E_PAGE_11, 0x7D),
|
|
+ /* 80-9E: deleted according to tda9983n3_i2c_GSmodifications_2.xls 27/3/2006 */
|
|
+ E_REG_P11_ACP_PB27_RW = SPA(E_SNONE , E_PAGE_11, 0x7E),
|
|
+ E_REG_P12_OTP_ADDRESS_W = SPA(E_SNONE , E_PAGE_12, 0x30),
|
|
+ E_REG_P12_OTP_DATA_MSB_RW = SPA(E_SNONE , E_PAGE_12, 0x31),
|
|
+ E_REG_P12_OTP_DATA_ISB_RW = SPA(E_SNONE , E_PAGE_12, 0x32),
|
|
+ E_REG_P12_OTP_DATA_LSB_RW = SPA(E_SNONE , E_PAGE_12, 0x33),
|
|
+ E_REG_P12_OTP_CNTRL_W = SPA(E_SNONE , E_PAGE_12, 0x34),
|
|
+ E_REG_P12_OTP_STATUS_R = SPA(E_SNONE , E_PAGE_12, 0x35),
|
|
+ E_REG_P12_VPP_TIMER_W = SPA(E_SNONE , E_PAGE_12, 0x36),
|
|
+ E_REG_P12_WRITE_TIMER_W = SPA(E_SNONE , E_PAGE_12, 0x37),
|
|
+ E_REG_P12_DISCHARGE_TIMER_W = SPA(E_SNONE , E_PAGE_12, 0x38),
|
|
+ E_REG_P12_READ_TIMER_W = SPA(E_SNONE , E_PAGE_12, 0x39),
|
|
+ E_REG_P12_HDCP_TX33_RW = SPA(E_SNONE , E_PAGE_12, 0xB8)
|
|
+};
|
|
+#undef SPR
|
|
+
|
|
+/**
|
|
+ * Register bitfield masks, with a macro to allow binary initializers.
|
|
+ * Enum names are derived directly from TDA998x register and bitfield names.
|
|
+ * */
|
|
+#define BINARY(d7,d6,d5,d4,d3,d2,d1,d0) \
|
|
+ (((d7)<<7)|((d6)<<6)|((d5)<<5)|((d4)<<4)|((d3)<<3)|((d2)<<2)|((d1)<<1)|(d0))
|
|
+
|
|
+enum _e_mask_reg {
|
|
+ E_MASKREG_NONE = BINARY(0, 0, 0, 0, 0, 0, 0, 0),
|
|
+ E_MASKREG_ALL = BINARY(1, 1, 1, 1, 1, 1, 1, 1),
|
|
+
|
|
+ /* N4 features flags read from version register:
|
|
+ * not_h = no HDCP support
|
|
+ * not_s = no scaler support
|
|
+ *
|
|
+ * N5 = a flag that is not a register bit, but is derived by the
|
|
+ * driver from the new N5 registers DWIN_RE_DE and DWIN_FE_DE,
|
|
+ * because the N5 device still uses the N4 version register value.
|
|
+ * This bit position would clash with version register, so is not
|
|
+ * present in the driver's copy (uDeviceVersion) of the version
|
|
+ * register, but only in the driver's features byte (uDeviceFeatures).
|
|
+ * */
|
|
+ e_maskreg_p00_version_not_h = BINARY(0, 0, 1, 0, 0, 0, 0, 0),
|
|
+ e_maskreg_p00_version_not_s = BINARY(0, 0, 0, 1, 0, 0, 0, 0),
|
|
+ E_MASKREG_P00_FEATURE_N5 = BINARY(0, 0, 0, 0, 0, 0, 0, 1),
|
|
+
|
|
+ e_maskreg_p00_main_cntrl0_scaler = BINARY(1, 0, 0, 0, 0, 0, 0, 0),
|
|
+ e_maskreg_p00_main_cntrl0_cehs = BINARY(0, 0, 0, 1, 0, 0, 0, 0),
|
|
+ e_maskreg_p00_main_cntrl0_cecs = BINARY(0, 0, 0, 0, 1, 0, 0, 0),
|
|
+ e_maskreg_p00_main_cntrl0_dehs = BINARY(0, 0, 0, 0, 0, 1, 0, 0),
|
|
+ e_maskreg_p00_main_cntrl0_decs = BINARY(0, 0, 0, 0, 0, 0, 1, 0),
|
|
+ e_maskreg_p00_main_cntrl0_sr = BINARY(0, 0, 0, 0, 0, 0, 0, 1),
|
|
+
|
|
+#ifdef TMFL_TDA9981_SUPPORT
|
|
+ e_maskreg_p00_sr_reg_sr_i2c_ms = BINARY(0, 0, 0, 0, 0, 0, 1, 0),
|
|
+ e_maskreg_p00_sr_reg_sr_audio = BINARY(0, 0, 0, 0, 0, 0, 0, 1),
|
|
+
|
|
+ e_maskreg_p00_ddc_disable_ddc_dis = BINARY(0, 0, 0, 0, 0, 0, 0, 1),
|
|
+
|
|
+ e_maskreg_p00_cclk_on_cclk_on = BINARY(0, 0, 0, 0, 0, 0, 0, 1),
|
|
+
|
|
+ e_maskreg_p00_int_flags_0_r0 = BINARY(1, 0, 0, 0, 0, 0, 0, 0),
|
|
+#endif /* TMFL_TDA9981_SUPPORT */
|
|
+ e_maskreg_p00_int_flags_0_pj = BINARY(0, 1, 0, 0, 0, 0, 0, 0),
|
|
+ e_maskreg_p00_int_flags_0_sha_1 = BINARY(0, 0, 1, 0, 0, 0, 0, 0),
|
|
+ e_maskreg_p00_int_flags_0_bstatus = BINARY(0, 0, 0, 1, 0, 0, 0, 0),
|
|
+ e_maskreg_p00_int_flags_0_bcaps = BINARY(0, 0, 0, 0, 1, 0, 0, 0),
|
|
+ e_maskreg_p00_int_flags_0_t0 = BINARY(0, 0, 0, 0, 0, 1, 0, 0),
|
|
+ e_maskreg_p00_int_flags_0_hpd = BINARY(0, 0, 0, 0, 0, 0, 1, 0),
|
|
+ e_maskreg_p00_int_flags_0_encrypt = BINARY(0, 0, 0, 0, 0, 0, 0, 1),
|
|
+
|
|
+ e_maskreg_p00_int_flags_1_hpd_in = BINARY(1, 0, 0, 0, 0, 0, 0, 0),
|
|
+#ifdef TMFL_TDA9981_SUPPORT
|
|
+ e_maskreg_p00_int_flags_1_sw_int = BINARY(0, 1, 0, 0, 0, 0, 0, 0),
|
|
+#endif /* TMFL_TDA9981_SUPPORT */
|
|
+ e_maskreg_p00_int_flags_1_sc_deil = BINARY(0, 0, 1, 0, 0, 0, 0, 0),
|
|
+ e_maskreg_p00_int_flags_1_sc_vid = BINARY(0, 0, 0, 1, 0, 0, 0, 0),
|
|
+ e_maskreg_p00_int_flags_1_sc_out = BINARY(0, 0, 0, 0, 1, 0, 0, 0),
|
|
+ e_maskreg_p00_int_flags_1_sc_in = BINARY(0, 0, 0, 0, 0, 1, 0, 0),
|
|
+ e_maskreg_p00_int_flags_1_otp = BINARY(0, 0, 0, 0, 0, 0, 1, 0),
|
|
+ e_maskreg_p00_int_flags_1_vs_rpt = BINARY(0, 0, 0, 0, 0, 0, 0, 1),
|
|
+#ifdef TMFL_TDA9981_SUPPORT
|
|
+ e_maskreg_p00_int_flags_2_rx_sense = BINARY(0, 0, 0, 0, 0, 0, 0, 1),
|
|
+
|
|
+ e_maskreg_p00_int_flags_3_rxs_fil = BINARY(0, 0, 0, 0, 0, 0, 0, 1),
|
|
+
|
|
+ e_maskreg_p00_sw_int_sw_int = BINARY(0, 0, 0, 0, 0, 0, 0, 1),
|
|
+
|
|
+ e_maskreg_p00_ena_vp_0_ena_vp7 = BINARY(1, 0, 0, 0, 0, 0, 0, 0),
|
|
+ e_maskreg_p00_ena_vp_0_ena_vp6 = BINARY(0, 1, 0, 0, 0, 0, 0, 0),
|
|
+ e_maskreg_p00_ena_vp_0_ena_vp5 = BINARY(0, 0, 1, 0, 0, 0, 0, 0),
|
|
+ e_maskreg_p00_ena_vp_0_ena_vp4 = BINARY(0, 0, 0, 1, 0, 0, 0, 0),
|
|
+ e_maskreg_p00_ena_vp_0_ena_vp3 = BINARY(0, 0, 0, 0, 1, 0, 0, 0),
|
|
+ e_maskreg_p00_ena_vp_0_ena_vp2 = BINARY(0, 0, 0, 0, 0, 1, 0, 0),
|
|
+ e_maskreg_p00_ena_vp_0_ena_vp1 = BINARY(0, 0, 0, 0, 0, 0, 1, 0),
|
|
+ e_maskreg_p00_ena_vp_0_ena_vp0 = BINARY(0, 0, 0, 0, 0, 0, 0, 1),
|
|
+
|
|
+ e_maskreg_p00_ena_vp_1_ena_vp15 = BINARY(1, 0, 0, 0, 0, 0, 0, 0),
|
|
+ e_maskreg_p00_ena_vp_1_ena_vp14 = BINARY(0, 1, 0, 0, 0, 0, 0, 0),
|
|
+ e_maskreg_p00_ena_vp_1_ena_vp13 = BINARY(0, 0, 1, 0, 0, 0, 0, 0),
|
|
+ e_maskreg_p00_ena_vp_1_ena_vp12 = BINARY(0, 0, 0, 1, 0, 0, 0, 0),
|
|
+ e_maskreg_p00_ena_vp_1_ena_vp11 = BINARY(0, 0, 0, 0, 1, 0, 0, 0),
|
|
+ e_maskreg_p00_ena_vp_1_ena_vp10 = BINARY(0, 0, 0, 0, 0, 1, 0, 0),
|
|
+ e_maskreg_p00_ena_vp_1_ena_vp9 = BINARY(0, 0, 0, 0, 0, 0, 1, 0),
|
|
+ e_maskreg_p00_ena_vp_1_ena_vp8 = BINARY(0, 0, 0, 0, 0, 0, 0, 1),
|
|
+
|
|
+ e_maskreg_p00_ena_vp_2_ena_vp23 = BINARY(1, 0, 0, 0, 0, 0, 0, 0),
|
|
+ e_maskreg_p00_ena_vp_2_ena_vp22 = BINARY(0, 1, 0, 0, 0, 0, 0, 0),
|
|
+ e_maskreg_p00_ena_vp_2_ena_vp21 = BINARY(0, 0, 1, 0, 0, 0, 0, 0),
|
|
+ e_maskreg_p00_ena_vp_2_ena_vp20 = BINARY(0, 0, 0, 1, 0, 0, 0, 0),
|
|
+ e_maskreg_p00_ena_vp_2_ena_vp19 = BINARY(0, 0, 0, 0, 1, 0, 0, 0),
|
|
+ e_maskreg_p00_ena_vp_2_ena_vp18 = BINARY(0, 0, 0, 0, 0, 1, 0, 0),
|
|
+ e_maskreg_p00_ena_vp_2_ena_vp17 = BINARY(0, 0, 0, 0, 0, 0, 1, 0),
|
|
+ e_maskreg_p00_ena_vp_2_ena_vp16 = BINARY(0, 0, 0, 0, 0, 0, 0, 1),
|
|
+
|
|
+ e_maskreg_p00_gnd_vp_0_ena_vp7 = BINARY(1, 0, 0, 0, 0, 0, 0, 0),
|
|
+ e_maskreg_p00_gnd_vp_0_ena_vp6 = BINARY(0, 1, 0, 0, 0, 0, 0, 0),
|
|
+ e_maskreg_p00_gnd_vp_0_ena_vp5 = BINARY(0, 0, 1, 0, 0, 0, 0, 0),
|
|
+ e_maskreg_p00_gnd_vp_0_ena_vp4 = BINARY(0, 0, 0, 1, 0, 0, 0, 0),
|
|
+ e_maskreg_p00_gnd_vp_0_ena_vp3 = BINARY(0, 0, 0, 0, 1, 0, 0, 0),
|
|
+ e_maskreg_p00_gnd_vp_0_ena_vp2 = BINARY(0, 0, 0, 0, 0, 1, 0, 0),
|
|
+ e_maskreg_p00_gnd_vp_0_ena_vp1 = BINARY(0, 0, 0, 0, 0, 0, 1, 0),
|
|
+ e_maskreg_p00_gnd_vp_0_ena_vp0 = BINARY(0, 0, 0, 0, 0, 0, 0, 1),
|
|
+
|
|
+ e_maskreg_p00_gnd_vp_1_ena_vp15 = BINARY(1, 0, 0, 0, 0, 0, 0, 0),
|
|
+ e_maskreg_p00_gnd_vp_1_ena_vp14 = BINARY(0, 1, 0, 0, 0, 0, 0, 0),
|
|
+ e_maskreg_p00_gnd_vp_1_ena_vp13 = BINARY(0, 0, 1, 0, 0, 0, 0, 0),
|
|
+ e_maskreg_p00_gnd_vp_1_ena_vp12 = BINARY(0, 0, 0, 1, 0, 0, 0, 0),
|
|
+ e_maskreg_p00_gnd_vp_1_ena_vp11 = BINARY(0, 0, 0, 0, 1, 0, 0, 0),
|
|
+ e_maskreg_p00_gnd_vp_1_ena_vp10 = BINARY(0, 0, 0, 0, 0, 1, 0, 0),
|
|
+ e_maskreg_p00_gnd_vp_1_ena_vp9 = BINARY(0, 0, 0, 0, 0, 0, 1, 0),
|
|
+ e_maskreg_p00_gnd_vp_1_ena_vp8 = BINARY(0, 0, 0, 0, 0, 0, 0, 1),
|
|
+
|
|
+ e_maskreg_p00_gnd_vp_2_ena_vp23 = BINARY(1, 0, 0, 0, 0, 0, 0, 0),
|
|
+ e_maskreg_p00_gnd_vp_2_ena_vp22 = BINARY(0, 1, 0, 0, 0, 0, 0, 0),
|
|
+ e_maskreg_p00_gnd_vp_2_ena_vp21 = BINARY(0, 0, 1, 0, 0, 0, 0, 0),
|
|
+ e_maskreg_p00_gnd_vp_2_ena_vp20 = BINARY(0, 0, 0, 1, 0, 0, 0, 0),
|
|
+ e_maskreg_p00_gnd_vp_2_ena_vp19 = BINARY(0, 0, 0, 0, 1, 0, 0, 0),
|
|
+ e_maskreg_p00_gnd_vp_2_ena_vp18 = BINARY(0, 0, 0, 0, 0, 1, 0, 0),
|
|
+ e_maskreg_p00_gnd_vp_2_ena_vp17 = BINARY(0, 0, 0, 0, 0, 0, 1, 0),
|
|
+ e_maskreg_p00_gnd_vp_2_ena_vp16 = BINARY(0, 0, 0, 0, 0, 0, 0, 1),
|
|
+
|
|
+ e_maskreg_p00_ena_ap_ena_ap7 = BINARY(1, 0, 0, 0, 0, 0, 0, 0),
|
|
+ e_maskreg_p00_ena_ap_ena_ap6 = BINARY(0, 1, 0, 0, 0, 0, 0, 0),
|
|
+ e_maskreg_p00_ena_ap_ena_ap5 = BINARY(0, 0, 1, 0, 0, 0, 0, 0),
|
|
+ e_maskreg_p00_ena_ap_ena_ap4 = BINARY(0, 0, 0, 1, 0, 0, 0, 0),
|
|
+ e_maskreg_p00_ena_ap_ena_ap3 = BINARY(0, 0, 0, 0, 1, 0, 0, 0),
|
|
+ e_maskreg_p00_ena_ap_ena_ap2 = BINARY(0, 0, 0, 0, 0, 1, 0, 0),
|
|
+ e_maskreg_p00_ena_ap_ena_ap1 = BINARY(0, 0, 0, 0, 0, 0, 1, 0),
|
|
+ e_maskreg_p00_ena_ap_ena_ap0 = BINARY(0, 0, 0, 0, 0, 0, 0, 1),
|
|
+
|
|
+ e_maskreg_p00_gnd_ap_gnd_ap7 = BINARY(1, 0, 0, 0, 0, 0, 0, 0),
|
|
+ e_maskreg_p00_gnd_ap_gnd_ap6 = BINARY(0, 1, 0, 0, 0, 0, 0, 0),
|
|
+ e_maskreg_p00_gnd_ap_gnd_ap5 = BINARY(0, 0, 1, 0, 0, 0, 0, 0),
|
|
+ e_maskreg_p00_gnd_ap_gnd_ap4 = BINARY(0, 0, 0, 1, 0, 0, 0, 0),
|
|
+ e_maskreg_p00_gnd_ap_gnd_ap3 = BINARY(0, 0, 0, 0, 1, 0, 0, 0),
|
|
+ e_maskreg_p00_gnd_ap_gnd_ap2 = BINARY(0, 0, 0, 0, 0, 1, 0, 0),
|
|
+ e_maskreg_p00_gnd_ap_gnd_ap1 = BINARY(0, 0, 0, 0, 0, 0, 1, 0),
|
|
+ e_maskreg_p00_gnd_ap_gnd_ap0 = BINARY(0, 0, 0, 0, 0, 0, 0, 1),
|
|
+#endif /* TMFL_TDA9981_SUPPORT */
|
|
+
|
|
+ e_maskreg_p00_vip_cntrl_0_mirr_a = BINARY(1, 0, 0, 0, 0, 0, 0, 0),
|
|
+ e_maskreg_p00_vip_cntrl_0_swap_a = BINARY(0, 1, 1, 1, 0, 0, 0, 0),
|
|
+ e_maskreg_p00_vip_cntrl_0_mirr_b = BINARY(0, 0, 0, 0, 1, 0, 0, 0),
|
|
+ e_maskreg_p00_vip_cntrl_0_swap_b = BINARY(0, 0, 0, 0, 0, 1, 1, 1),
|
|
+
|
|
+ e_maskreg_p00_vip_cntrl_1_mirr_c = BINARY(1, 0, 0, 0, 0, 0, 0, 0),
|
|
+ e_maskreg_p00_vip_cntrl_1_swap_c = BINARY(0, 1, 1, 1, 0, 0, 0, 0),
|
|
+ e_maskreg_p00_vip_cntrl_1_mirr_d = BINARY(0, 0, 0, 0, 1, 0, 0, 0),
|
|
+ e_maskreg_p00_vip_cntrl_1_swap_d = BINARY(0, 0, 0, 0, 0, 1, 1, 1),
|
|
+
|
|
+ e_maskreg_p00_vip_cntrl_2_mirr_e = BINARY(1, 0, 0, 0, 0, 0, 0, 0),
|
|
+ e_maskreg_p00_vip_cntrl_2_swap_e = BINARY(0, 1, 1, 1, 0, 0, 0, 0),
|
|
+ e_maskreg_p00_vip_cntrl_2_mirr_f = BINARY(0, 0, 0, 0, 1, 0, 0, 0),
|
|
+ e_maskreg_p00_vip_cntrl_2_swap_f = BINARY(0, 0, 0, 0, 0, 1, 1, 1),
|
|
+
|
|
+ e_maskreg_p00_vip_cntrl_3_edge = BINARY(1, 0, 0, 0, 0, 0, 0, 0),
|
|
+ e_maskreg_p00_vip_cntrl_3_sp_sync = BINARY(0, 0, 1, 1, 0, 0, 0, 0),
|
|
+ e_maskreg_p00_vip_cntrl_3_emb = BINARY(0, 0, 0, 0, 1, 0, 0, 0),
|
|
+ e_maskreg_p00_vip_cntrl_3_v_tgl = BINARY(0, 0, 0, 0, 0, 1, 0, 0),
|
|
+ e_maskreg_p00_vip_cntrl_3_h_tgl = BINARY(0, 0, 0, 0, 0, 0, 1, 0),
|
|
+ e_maskreg_p00_vip_cntrl_3_x_tgl = BINARY(0, 0, 0, 0, 0, 0, 0, 1),
|
|
+
|
|
+ e_maskreg_p00_vip_cntrl_4_tst_pat = BINARY(1, 0, 0, 0, 0, 0, 0, 0),
|
|
+ e_maskreg_p00_vip_cntrl_4_tst_656 = BINARY(0, 1, 0, 0, 0, 0, 0, 0),
|
|
+ e_maskreg_p00_vip_cntrl_4_ccir656 = BINARY(0, 0, 0, 1, 0, 0, 0, 0),
|
|
+ e_maskreg_p00_vip_cntrl_4_blankit = BINARY(0, 0, 0, 0, 1, 1, 0, 0),
|
|
+ e_maskreg_p00_vip_cntrl_4_blc = BINARY(0, 0, 0, 0, 0, 0, 1, 1),
|
|
+
|
|
+ e_maskreg_p00_vip_cntrl_5_sp_cnt = BINARY(0, 0, 0, 0, 0, 1, 1, 0),
|
|
+ e_maskreg_p00_vip_cntrl_5_ckcase = BINARY(0, 0, 0, 0, 0, 0, 0, 1),
|
|
+
|
|
+ e_maskreg_p00_mat_contrl_mat_bp = BINARY(0, 0, 0, 0, 0, 1, 0, 0),
|
|
+ e_maskreg_p00_mat_contrl_mat_sc = BINARY(0, 0, 0, 0, 0, 0, 1, 1),
|
|
+
|
|
+ e_maskreg_p00_vidformat_vidformat = BINARY(0, 0, 0, 1, 1, 1, 1, 1),
|
|
+
|
|
+ e_maskreg_p00_tbg_cntrl_0_sync_once = BINARY(1, 0, 0, 0, 0, 0, 0, 0),
|
|
+ e_maskreg_p00_tbg_cntrl_0_sync_mthd = BINARY(0, 1, 0, 0, 0, 0, 0, 0),
|
|
+ e_maskreg_p00_tbg_cntrl_0_frame_dis = BINARY(0, 0, 1, 0, 0, 0, 0, 0),
|
|
+
|
|
+ e_maskreg_p00_tbg_cntrl_1_dwin_dis = BINARY(0, 1, 0, 0, 0, 0, 0, 0),
|
|
+ e_maskreg_p00_tbg_cntrl_1_vhx_ext = BINARY(0, 0, 1, 1, 1, 0, 0, 0),
|
|
+ e_maskreg_p00_tbg_cntrl_1_vhx_ext_vs = BINARY(0, 0, 1, 0, 0, 0, 0, 0),
|
|
+ e_maskreg_p00_tbg_cntrl_1_vhx_ext_hs = BINARY(0, 0, 0, 1, 0, 0, 0, 0),
|
|
+ e_maskreg_p00_tbg_cntrl_1_vhx_ext_de = BINARY(0, 0, 0, 0, 1, 0, 0, 0),
|
|
+ e_maskreg_p00_tbg_cntrl_1_vh_tgl = BINARY(0, 0, 0, 0, 0, 1, 1, 1),
|
|
+ e_maskreg_p00_tbg_cntrl_1_vh_tgl_2 = BINARY(0, 0, 0, 0, 0, 1, 0, 0),
|
|
+ e_maskreg_p00_tbg_cntrl_1_vh_tgl_1 = BINARY(0, 0, 0, 0, 0, 0, 1, 0),
|
|
+ e_maskreg_p00_tbg_cntrl_1_vh_tgl_0 = BINARY(0, 0, 0, 0, 0, 0, 0, 1),
|
|
+
|
|
+ e_maskreg_p00_hvf_cntrl_0_sm = BINARY(1, 0, 0, 0, 0, 0, 0, 0),
|
|
+ e_maskreg_p00_hvf_cntrl_0_rwb = BINARY(0, 1, 0, 0, 0, 0, 0, 0),
|
|
+ e_maskreg_p00_hvf_cntrl_0_prefil = BINARY(0, 0, 0, 0, 1, 1, 0, 0),
|
|
+ e_maskreg_p00_hvf_cntrl_0_intpol = BINARY(0, 0, 0, 0, 0, 0, 1, 1),
|
|
+
|
|
+ e_maskreg_p00_hvf_cntrl_1_semi_planar = BINARY(0, 1, 0, 0, 0, 0, 0, 0),
|
|
+ e_maskreg_p00_hvf_cntrl_1_pad = BINARY(0, 0, 1, 1, 0, 0, 0, 0),
|
|
+ e_maskreg_p00_hvf_cntrl_1_vqr = BINARY(0, 0, 0, 0, 1, 1, 0, 0),
|
|
+ e_maskreg_p00_hvf_cntrl_1_yuvblk = BINARY(0, 0, 0, 0, 0, 0, 1, 0),
|
|
+ e_maskreg_p00_hvf_cntrl_1_for = BINARY(0, 0, 0, 0, 0, 0, 0, 1),
|
|
+
|
|
+ e_maskreg_p00_timer_h_im_clksel = BINARY(1, 0, 0, 0, 0, 0, 0, 0),
|
|
+ e_maskreg_p00_timer_h_wd_clksel = BINARY(0, 1, 0, 0, 0, 0, 0, 0),
|
|
+ e_maskreg_p00_timer_h_tim_h = BINARY(0, 0, 0, 0, 0, 0, 1, 1),
|
|
+
|
|
+ e_maskreg_p00_debug_probe_bypass = BINARY(0, 0, 0, 0, 1, 0, 0, 0),
|
|
+ e_maskreg_p00_debug_probe_vid_de = BINARY(0, 0, 0, 0, 0, 1, 0, 0),
|
|
+ e_maskreg_p00_debug_probe_di_de = BINARY(0, 0, 0, 0, 0, 0, 1, 0),
|
|
+ e_maskreg_p00_debug_probe_woo_en = BINARY(0, 0, 0, 0, 0, 0, 0, 1),
|
|
+
|
|
+ e_maskreg_p00_aip_clksel_sel_aip_shift = 3,
|
|
+ e_maskreg_p00_aip_clksel_sel_aip = BINARY(0, 0, 0, 1, 1, 0, 0, 0),
|
|
+ e_maskreg_p00_aip_clksel_sel_pol_clk = BINARY(0, 0, 0, 0, 0, 1, 0, 0),
|
|
+ e_maskreg_p00_aip_clksel_sel_fs = BINARY(0, 0, 0, 0, 0, 0, 1, 1),
|
|
+#ifndef TMFL_TDA9981_SUPPORT
|
|
+ e_maskreg_p01_sc_vidformat_lut_sel = BINARY(1, 1, 0, 0, 0, 0, 0, 0),
|
|
+ e_maskreg_p01_sc_vidformat_vid_format_o = BINARY(0, 0, 1, 1, 1, 0, 0, 0),
|
|
+ e_maskreg_p01_sc_vidformat_vid_format_i = BINARY(0, 0, 0, 0, 0, 1, 1, 1),
|
|
+
|
|
+ e_maskreg_p01_sc_cntrl_il_out_on = BINARY(0, 0, 0, 0, 1, 0, 0, 0),
|
|
+ e_maskreg_p01_sc_cntrl_phases_v = BINARY(0, 0, 0, 0, 0, 1, 0, 0),
|
|
+ e_maskreg_p01_sc_cntrl_vs_on = BINARY(0, 0, 0, 0, 0, 0, 1, 0),
|
|
+ e_maskreg_p01_sc_cntrl_deil_on = BINARY(0, 0, 0, 0, 0, 0, 0, 1),
|
|
+
|
|
+ e_maskreg_p01_vidformat_vidformat = BINARY(0, 0, 0, 0, 0, 1, 1, 1),
|
|
+
|
|
+ e_maskreg_p01_tbg_cntrl_0_sync_once = BINARY(1, 0, 0, 0, 0, 0, 0, 0),
|
|
+ e_maskreg_p01_tbg_cntrl_0_sync_mthd = BINARY(0, 1, 0, 0, 0, 0, 0, 0),
|
|
+ e_maskreg_p01_tbg_cntrl_0_frame_dis = BINARY(0, 0, 1, 0, 0, 0, 0, 0),
|
|
+ e_maskreg_p01_tbg_cntrl_0_top_ext = BINARY(0, 0, 0, 0, 1, 0, 0, 0),
|
|
+ e_maskreg_p01_tbg_cntrl_0_de_ext = BINARY(0, 0, 0, 0, 0, 1, 0, 0),
|
|
+ e_maskreg_p01_tbg_cntrl_0_top_sel = BINARY(0, 0, 0, 0, 0, 0, 1, 0),
|
|
+ e_maskreg_p01_tbg_cntrl_0_top_tgl = BINARY(0, 0, 0, 0, 0, 0, 0, 1),
|
|
+#endif /* TMFL_TDA9981_SUPPORT */
|
|
+ e_maskreg_p02_pll_serial_1_srl_man_ip = BINARY(0, 1, 0, 0, 0, 0, 0, 0),
|
|
+ e_maskreg_p02_pll_serial_1_srl_reg_ip = BINARY(0, 0, 1, 1, 1, 0, 0, 0),
|
|
+ e_maskreg_p02_pll_serial_1_srl_iz = BINARY(0, 0, 0, 0, 0, 1, 1, 0),
|
|
+ e_maskreg_p02_pll_serial_1_srl_fdn = BINARY(0, 0, 0, 0, 0, 0, 0, 1),
|
|
+
|
|
+ e_maskreg_p02_pll_serial_2_srl_pr = BINARY(1, 1, 1, 1, 0, 0, 0, 0),
|
|
+ e_maskreg_p02_pll_serial_2_srl_nosc = BINARY(0, 0, 0, 0, 0, 0, 1, 1),
|
|
+
|
|
+ e_maskreg_p02_pll_serial_3_srl_pxin_sel = BINARY(0, 0, 0, 1, 0, 0, 0, 0),
|
|
+ e_maskreg_p02_pll_serial_3_srl_de = BINARY(0, 0, 0, 0, 0, 0, 1, 0),
|
|
+ e_maskreg_p02_pll_serial_3_srl_ccir = BINARY(0, 0, 0, 0, 0, 0, 0, 1),
|
|
+
|
|
+ e_maskreg_p02_serializer_srl_phase3 = BINARY(1, 1, 1, 1, 0, 0, 0, 0),
|
|
+ e_maskreg_p02_serializer_srl_phase2 = BINARY(0, 0, 0, 0, 1, 1, 1, 1),
|
|
+
|
|
+ e_maskreg_p02_buffer_out_srl_force = BINARY(0, 0, 0, 0, 1, 1, 0, 0),
|
|
+ e_maskreg_p02_buffer_out_srl_clk = BINARY(0, 0, 0, 0, 0, 0, 1, 1),
|
|
+
|
|
+ e_maskreg_p02_pll_scg1_scg_fdn = BINARY(0, 0, 0, 0, 0, 0, 0, 1),
|
|
+
|
|
+ e_maskreg_p02_pll_scg2_bypass_scg = BINARY(1, 0, 0, 0, 0, 0, 0, 0),
|
|
+ e_maskreg_p02_pll_scg2_selpllclkin = BINARY(0, 0, 0, 1, 0, 0, 0, 0),
|
|
+ e_maskreg_p02_pll_scg2_scg_nosc = BINARY(0, 0, 0, 0, 0, 0, 1, 1),
|
|
+
|
|
+ e_maskreg_p02_pll_de_bypass_pllde = BINARY(1, 0, 0, 0, 0, 0, 0, 0),
|
|
+ e_maskreg_p02_pll_de_pllde_nosc = BINARY(0, 0, 1, 1, 0, 0, 0, 0),
|
|
+ e_maskreg_p02_pll_de_pllde_iz = BINARY(0, 0, 0, 0, 0, 1, 1, 0),
|
|
+ e_maskreg_p02_pll_de_pllde_fdn = BINARY(0, 0, 0, 0, 0, 0, 0, 1),
|
|
+
|
|
+ e_maskreg_p02_ccir_div_refdiv2 = BINARY(0, 0, 0, 0, 0, 0, 0, 1),
|
|
+
|
|
+ e_maskreg_p02_vai_pll_pllde_hvp = BINARY(0, 1, 0, 0, 0, 0, 0, 0),
|
|
+ e_maskreg_p02_vai_pll_pllscg_hvp = BINARY(0, 0, 1, 0, 0, 0, 0, 0),
|
|
+ e_maskreg_p02_vai_pll_pllsrl_hvp = BINARY(0, 0, 0, 1, 0, 0, 0, 0),
|
|
+ e_maskreg_p02_vai_pll_pllde_lock = BINARY(0, 0, 0, 0, 0, 1, 0, 0),
|
|
+ e_maskreg_p02_vai_pll_pllscg_lock = BINARY(0, 0, 0, 0, 0, 0, 1, 0),
|
|
+ e_maskreg_p02_vai_pll_pllsrl_lock = BINARY(0, 0, 0, 0, 0, 0, 0, 1),
|
|
+
|
|
+ e_maskreg_p02_audio_div_audio_div = BINARY(0, 0, 0, 0, 0, 1, 1, 1),
|
|
+
|
|
+ e_maskreg_p02_test1_tstserphoe = BINARY(0, 0, 0, 1, 0, 0, 0, 0),
|
|
+ e_maskreg_p02_test1_tst_nosc = BINARY(0, 0, 0, 0, 0, 0, 1, 0),
|
|
+ e_maskreg_p02_test1_tst_hvp = BINARY(0, 0, 0, 0, 0, 0, 0, 1),
|
|
+
|
|
+ e_maskreg_p02_test2_pwd1v8 = BINARY(0, 0, 0, 0, 0, 0, 1, 0),
|
|
+ e_maskreg_p02_test2_divtestoe = BINARY(0, 0, 0, 0, 0, 0, 0, 1),
|
|
+
|
|
+ e_maskreg_p02_sel_clk_ena_sc_clk = BINARY(0, 0, 0, 0, 1, 0, 0, 0),
|
|
+ e_maskreg_p02_sel_clk_sel_vrf_clk = BINARY(0, 0, 0, 0, 0, 1, 1, 0),
|
|
+ e_maskreg_p02_sel_clk_sel_clk1 = BINARY(0, 0, 0, 0, 0, 0, 0, 1),
|
|
+
|
|
+ e_maskreg_p11_aip_cntrl_0_rst_cts = BINARY(0, 1, 0, 0, 0, 0, 0, 0),
|
|
+ e_maskreg_p11_aip_cntrl_0_acr_man = BINARY(0, 0, 1, 0, 0, 0, 0, 0),
|
|
+ e_maskreg_p11_aip_cntrl_0_layout = BINARY(0, 0, 0, 0, 0, 1, 0, 0),
|
|
+ e_maskreg_p11_aip_cntrl_0_swap = BINARY(0, 0, 0, 0, 0, 0, 1, 0),
|
|
+ e_maskreg_p11_aip_cntrl_0_rst_fifo = BINARY(0, 0, 0, 0, 0, 0, 0, 1),
|
|
+
|
|
+ e_maskreg_p11_gc_avmute_set_mute = BINARY(0, 0, 0, 0, 0, 0, 1, 0),
|
|
+ e_maskreg_p11_gc_avmute_clr_mute = BINARY(0, 0, 0, 0, 0, 0, 0, 1),
|
|
+ e_maskreg_p11_gc_avmute_setclr_mute = BINARY(0, 0, 0, 0, 0, 0, 1, 1),
|
|
+
|
|
+ e_maskreg_p11_cts_n_m_sel = BINARY(0, 0, 1, 1, 0, 0, 0, 0),
|
|
+ e_maskreg_p11_cts_n_k_sel = BINARY(0, 0, 0, 0, 0, 1, 1, 1),
|
|
+
|
|
+ e_maskreg_p11_enc_cntrl_ctl_code = BINARY(0, 0, 0, 0, 1, 1, 0, 0),
|
|
+ e_maskreg_p11_enc_cntrl_rst_sel = BINARY(0, 0, 0, 0, 0, 0, 1, 0),
|
|
+ e_maskreg_p11_enc_cntrl_rst_enc = BINARY(0, 0, 0, 0, 0, 0, 0, 1),
|
|
+ e_maskreg_p11_dip_flags_force_null = BINARY(1, 0, 0, 0, 0, 0, 0, 0),
|
|
+ e_maskreg_p11_dip_flags_null = BINARY(0, 1, 0, 0, 0, 0, 0, 0),
|
|
+ e_maskreg_p11_dip_flags_acp = BINARY(0, 0, 0, 1, 0, 0, 0, 0),
|
|
+ e_maskreg_p11_dip_flags_isrc2 = BINARY(0, 0, 0, 0, 1, 0, 0, 0),
|
|
+ e_maskreg_p11_dip_flags_isrc1 = BINARY(0, 0, 0, 0, 0, 1, 0, 0),
|
|
+ e_maskreg_p11_dip_flags_gc = BINARY(0, 0, 0, 0, 0, 0, 1, 0),
|
|
+ e_maskreg_p11_dip_flags_acr = BINARY(0, 0, 0, 0, 0, 0, 0, 1),
|
|
+
|
|
+ e_maskreg_p11_dip_if_flags_if5 = BINARY(0, 0, 1, 0, 0, 0, 0, 0),
|
|
+ e_maskreg_p11_dip_if_flags_if4 = BINARY(0, 0, 0, 1, 0, 0, 0, 0),
|
|
+ e_maskreg_p11_dip_if_flags_if3 = BINARY(0, 0, 0, 0, 1, 0, 0, 0),
|
|
+ e_maskreg_p11_dip_if_flags_if2 = BINARY(0, 0, 0, 0, 0, 1, 0, 0),
|
|
+ e_maskreg_p11_dip_if_flags_if1 = BINARY(0, 0, 0, 0, 0, 0, 1, 0),
|
|
+
|
|
+ e_maskreg_p12_otp_cntrl_start_rd = BINARY(0, 0, 0, 0, 1, 0, 0, 0),
|
|
+ e_maskreg_p12_otp_cntrl_start_dl = BINARY(0, 0, 0, 0, 0, 1, 0, 0),
|
|
+ e_maskreg_p12_otp_cntrl_bch_act = BINARY(0, 0, 0, 0, 0, 0, 1, 0),
|
|
+ e_maskreg_p12_otp_cntrl_start_pc = BINARY(0, 0, 0, 0, 0, 0, 0, 1),
|
|
+
|
|
+ e_maskreg_p12_otp_status_rd_d_status = BINARY(1, 1, 0, 0, 0, 0, 0, 0),
|
|
+ e_maskreg_p12_otp_status_rd_c_status = BINARY(0, 0, 1, 1, 0, 0, 0, 0),
|
|
+ e_maskreg_p12_otp_status_rd_b_status = BINARY(0, 0, 0, 0, 1, 1, 0, 0),
|
|
+ e_maskreg_p12_otp_status_rd_a_status = BINARY(0, 0, 0, 0, 0, 0, 1, 1),
|
|
+
|
|
+ e_maskreg_p12_hdcp_tx_33_ac_not = BINARY(0, 0, 1, 0, 0, 0, 0, 0),
|
|
+ e_maskreg_p12_hdcp_tx_33_ctl_sel = BINARY(0, 0, 0, 1, 0, 0, 0, 0),
|
|
+ e_maskreg_p12_hdcp_tx_33_sys_req = BINARY(0, 0, 0, 0, 1, 0, 0, 0),
|
|
+ e_maskreg_p12_hdcp_tx_33_eess = BINARY(0, 0, 0, 0, 0, 1, 0, 0),
|
|
+ e_maskreg_p12_hdcp_tx_33_hdmi = BINARY(0, 0, 0, 0, 0, 0, 1, 0),
|
|
+ e_maskreg_p12_hdcp_tx_33_avmute = BINARY(0, 0, 0, 0, 0, 0, 0, 1)
|
|
+};
|
|
+#undef BINARY
|
|
+
|
|
+/**
|
|
+ * An enum for the video formats used in the E_REG_P00_VIDFORMAT_W register
|
|
+ * */
|
|
+enum _e_reg_vfmt {
|
|
+ e_regvfmt_640x480p_60hz = 0,
|
|
+ e_regvfmt_720x480p_60hz ,
|
|
+ e_regvfmt_1280x720p_60hz ,
|
|
+ e_regvfmt_1920x1080i_60hz ,
|
|
+ e_regvfmt_720x480i_60hz ,
|
|
+ e_regvfmt_720x240p_60hz ,
|
|
+ e_regvfmt_1920x1080p_60hz ,
|
|
+ e_regvfmt_720x576p_50hz ,
|
|
+ e_regvfmt_1280x720p_50hz ,
|
|
+ e_regvfmt_1920x1080i_50hz ,
|
|
+ e_regvfmt_720x576i_50hz ,
|
|
+ e_regvfmt_720x288p_50hz ,
|
|
+ e_regvfmt_1920x1080p_50hz ,
|
|
+ e_regvfmt_1920x1080p_24hz ,
|
|
+ e_regvfmt_1920x1080p_25hz ,
|
|
+ e_regvfmt_1920x1080p_30hz ,
|
|
+#ifdef FORMAT_PC
|
|
+ e_regvfmt_640x480p_72hz ,
|
|
+ e_regvfmt_640x480p_75hz ,
|
|
+ e_regvfmt_640x480p_85hz ,
|
|
+ e_regvfmt_800x600p_60hz ,
|
|
+ e_regvfmt_800x600p_72hz ,
|
|
+ e_regvfmt_800x600p_75hz ,
|
|
+ e_regvfmt_800x600p_85hz ,
|
|
+ e_regvfmt_1024x768p_60hz ,
|
|
+ e_regvfmt_1024x768p_70hz ,
|
|
+ e_regvfmt_1024x768p_75hz ,
|
|
+ e_regvfmt_1280x768p_60hz ,
|
|
+ e_regvfmt_1280x1024p_60hz ,
|
|
+ e_regvfmt_1280x1024p_75hz ,
|
|
+ e_regvfmt_1360x768p_60hz ,
|
|
+ e_regvfmt_1400x1050p_60hz ,
|
|
+ e_regvfmt_1600x1200p_60hz ,
|
|
+#endif /*FORMAT_PC*/
|
|
+
|
|
+ E_REGVFMT_INVALID ,
|
|
+ E_REGVFMT_NUM_TV = e_regvfmt_1920x1080p_30hz + 1,
|
|
+ E_REGVFMT_NUM_TV_NO_REG = E_REGVFMT_NUM_TV - e_regvfmt_1920x1080p_24hz,
|
|
+ E_REGVFMT_FIRST_TV_NO_REG = e_regvfmt_1920x1080p_24hz,
|
|
+ E_REGVFMT_NUM = E_REGVFMT_INVALID
|
|
+
|
|
+#ifdef FORMAT_PC
|
|
+ , E_REGVFMT_FIRST_PC_FORMAT = e_regvfmt_640x480p_72hz,
|
|
+ E_REGVFMT_NUM_PC = e_regvfmt_1600x1200p_60hz - E_REGVFMT_NUM_TV + 1
|
|
+
|
|
+#endif
|
|
+
|
|
+};
|
|
+
|
|
+/**
|
|
+ * An enum for the video input formats used in the E_REG_P01_SC_VIDFORMAT_W
|
|
+ * register
|
|
+ * */
|
|
+enum _e_reg_vfmt_sc_in {
|
|
+ e_regvfmt_scin_480i_60hz = 0,
|
|
+ e_regvfmt_scin_576i_50hz = 1,
|
|
+ e_regvfmt_scin_480p_60hz = 2,
|
|
+ e_regvfmt_scin_576p_50hz = 3,
|
|
+ E_REGVFMT_SCIN_MAX = 3,
|
|
+ E_REGVFMT_SCIN_NUM = 4,
|
|
+ E_REGVFMT_SCIN_INVALID = 4
|
|
+};
|
|
+
|
|
+/**
|
|
+ * An enum for the video output formats used in the E_REG_P01_SC_VIDFORMAT_W
|
|
+ * register
|
|
+ * */
|
|
+enum _e_reg_vfmt_sc_out {
|
|
+ e_regvfmt_scout_480p_60hz = 0,
|
|
+ e_regvfmt_scout_576ip_50hz = 1,
|
|
+ e_regvfmt_scout_720p_50hz_60hz = 2,
|
|
+ e_regvfmt_scout_1080i_50hz_60hz = 3,
|
|
+ E_REGVFMT_SCOUT_MAX = 3,
|
|
+ E_REGVFMT_SCOUT_NUM = 4,
|
|
+ E_REGVFMT_SCOUT_INVALID = 4
|
|
+};
|
|
+
|
|
+/**
|
|
+ * An enum to list all supported pixel clock frequencies in kHz
|
|
+ * */
|
|
+enum _e_pix_clk {
|
|
+ E_PIXCLK_25175 = 0,
|
|
+ E_PIXCLK_25200 = 1,
|
|
+ E_PIXCLK_27000 = 2,
|
|
+ E_PIXCLK_27027 = 3,
|
|
+ E_PIXCLK_54000 = 4,
|
|
+ E_PIXCLK_54054 = 5,
|
|
+ E_PIXCLK_74175 = 6,
|
|
+ E_PIXCLK_74250 = 7,
|
|
+ E_PIXCLK_148350 = 8,
|
|
+ E_PIXCLK_148500 = 9,
|
|
+#ifndef FORMAT_PC
|
|
+ E_PIXCLK_MAX = 9,
|
|
+ E_PIXCLK_INVALID = 10,
|
|
+ E_PIXCLK_NUM = 10
|
|
+#else /* FORMAT_PC */
|
|
+ E_PIXCLK_31500 = 10,
|
|
+ E_PIXCLK_36000 = 11,
|
|
+ E_PIXCLK_40000 = 12,
|
|
+ E_PIXCLK_49500 = 13,
|
|
+ E_PIXCLK_50000 = 14,
|
|
+ E_PIXCLK_56250 = 15,
|
|
+ E_PIXCLK_65000 = 16,
|
|
+ E_PIXCLK_75000 = 17,
|
|
+ E_PIXCLK_78750 = 18,
|
|
+ E_PIXCLK_79500 = 19,
|
|
+ E_PIXCLK_85500 = 20,
|
|
+ E_PIXCLK_108000 = 21,
|
|
+ E_PIXCLK_121750 = 22,
|
|
+ E_PIXCLK_135000 = 23,
|
|
+ E_PIXCLK_162000 = 24,
|
|
+ E_PIXCLK_MAX = 24,
|
|
+ E_PIXCLK_INVALID = 25,
|
|
+ E_PIXCLK_NUM = 25
|
|
+#endif /* FORMAT_PC */
|
|
+};
|
|
+
|
|
+/**
|
|
+ * An enum to list all device version codes supported by this driver.
|
|
+ * The values form a list, with non-zero version codes first in any order.
|
|
+ * The E_DEV_VERSION_END_LIST must be the last value in the list.
|
|
+ * */
|
|
+enum _e_dev_version {
|
|
+ E_DEV_VERSION_N2 = 0x40,
|
|
+ E_DEV_VERSION_N3 = 0x41,
|
|
+#ifdef TMFL_TDA9981_SUPPORT
|
|
+ E_DEV_VERSION_N4 = 0x00,
|
|
+ E_DEV_VERSION_LIST_END = 0xCF,
|
|
+#else /* TMFL_TDA9981_SUPPORT */
|
|
+ E_DEV_VERSION_N4 = 0x42,
|
|
+ E_DEV_VERSION_LIST_END = 0x00,
|
|
+#endif /* TMFL_TDA9981_SUPPORT */
|
|
+ E_DEV_VERSION_LIST_NUM = 4 /**< Number of items in list */
|
|
+};
|
|
+
|
|
+/**
|
|
+ * An enum to list all CEA Data Block Tag Codes we may find in EDID.
|
|
+ * */
|
|
+enum _e_cea_block_tags {
|
|
+ E_CEA_RESERVED_0 = 0x00,
|
|
+ E_CEA_AUDIO_BLOCK = 0x01,
|
|
+ E_CEA_VIDEO_BLOCK = 0x02,
|
|
+ E_CEA_VSDB = 0x03,
|
|
+ E_CEA_SPEAKER_ALLOC = 0x04,
|
|
+ E_CEA_VESA_DTC = 0x05,
|
|
+ E_CEA_RESERVED_6 = 0x06,
|
|
+ E_CEA_EXTENDED = 0x07
|
|
+};
|
|
+
|
|
+/** A typedef for colourspace values */
|
|
+typedef enum {
|
|
+ HDMITX_CS_RGB_FULL = 0, /**< RGB Full (PC) */
|
|
+ HDMITX_CS_RGB_LIMITED = 1, /**< RGB Limited (TV) */
|
|
+ HDMITX_CS_YUV_ITU_BT601 = 2, /**< YUV ITUBT601 (SDTV) */
|
|
+ HDMITX_CS_YUV_ITU_BT709 = 3, /**< YUV ITUBT709 (HDTV) */
|
|
+ HDMITX_CS_NUM = 4 /**< Number Cspaces we support */
|
|
+} bsl_colourspace_t;
|
|
+
|
|
+/** Matrix register block size */
|
|
+#define MATRIX_PRESET_SIZE 31
|
|
+
|
|
+/** Matrix register block size */
|
|
+#define MATRIX_PRESET_QTY 12
|
|
+
|
|
+/** The enum that vectors us into the MatrixPreset table */
|
|
+enum _e_matrix_preset_index {
|
|
+ E_MATRIX_RGBF_2_RGBL = 0,
|
|
+ E_MATRIX_RGBF_2_BT601 = 1,
|
|
+ E_MATRIX_RGBF_2_BT709 = 2,
|
|
+ E_MATRIX_RGBL_2_RGBF = 3,
|
|
+ E_MATRIX_RGBL_2_BT601 = 4,
|
|
+ E_MATRIX_RGBL_2_BT709 = 5,
|
|
+ E_MATRIX_BT601_2_RGBF = 6,
|
|
+ E_MATRIX_BT601_2_RGBL = 7,
|
|
+ E_MATRIX_BT601_2_BT709 = 8,
|
|
+ E_MATRIX_BT709_2_RGBF = 9,
|
|
+ E_MATRIX_BT709_2_RGBL = 10,
|
|
+ E_MATRIX_BT709_2_BT601 = 11
|
|
+};
|
|
+
|
|
+/** EDID block size */
|
|
+#define EDID_BLOCK_SIZE 128
|
|
+
|
|
+/** number of detailed timing descriptor stored in BSL */
|
|
+#define NUMBER_DTD_STORED 10
|
|
+
|
|
+/** EDID DTD block descriptor size */
|
|
+#define EDID_DTD_BLK_SIZE 0x12
|
|
+
|
|
+/** EDID i2c address */
|
|
+#define DDC_EDID_ADDRESS 0xA0
|
|
+
|
|
+/** EDID alternate i2c address */
|
|
+#define DDC_EDID_ADDRESS_ALT 0xA2
|
|
+
|
|
+/** EDID Segment Pointer address */
|
|
+#define DDC_SGMT_PTR_ADDRESS 0x60
|
|
+
|
|
+/** EDID block 0 parse start point */
|
|
+#define EDID_BLK0_BASE 0x36
|
|
+
|
|
+/** EDID block 0 descriptor size */
|
|
+#define EDID_BLK0_SIZE 0x12
|
|
+
|
|
+/** EDID block 0 extension block count */
|
|
+#define EDID_BLK0_EXT_CNT 0x7E
|
|
+
|
|
+/** EDID extension block parse start point */
|
|
+#define EDID_BLK_EXT_BASE 0x04
|
|
+
|
|
+/** CEA extension block type */
|
|
+#define EDID_CEA_EXTENSION 0x02
|
|
+
|
|
+/**
|
|
+ * \brief A structure type to form arrays that hold a series of registers and
|
|
+ * values
|
|
+ * */
|
|
+typedef struct _tm_hdmi_tx_reg_val_t {
|
|
+ u16 reg;
|
|
+ u8 val;
|
|
+} hdmi_tx_reg_val_t;
|
|
+
|
|
+/**
|
|
+ * \brief A structure type to form arrays that hold a series of registers,
|
|
+ * bitfield masks and bitfield values
|
|
+ * */
|
|
+typedef struct _tm_hdmi_tx_reg_mask_val_t {
|
|
+ u16 reg;
|
|
+ u8 mask;
|
|
+ u8 val;
|
|
+} hdmi_tx_reg_mask_val_t;
|
|
+
|
|
+/**
|
|
+ * \brief A function pointer type to call a function and return a result
|
|
+ * */
|
|
+typedef error_code_t (FUNC_PTR *p_hdmi_tx_func_t)(unit_select_t tx_unit);
|
|
+
|
|
+/**
|
|
+ * \brief The structure of a TM998x object, one per device unit
|
|
+ ****************************************************************************
|
|
+ ** copy changes to k_test_dis_names tab in "HDMI driver - register list.xls" **
|
|
+ ****************************************************************************
|
|
+ * */
|
|
+typedef struct _tm_hdmi_txobject_t {
|
|
+ /** Component State */
|
|
+ bsl_state_t state;
|
|
+
|
|
+ /** Count of events ignored by setState() */
|
|
+ u8 n_ignored_events;
|
|
+
|
|
+ /** Device unit number */
|
|
+ unit_select_t tx_unit;
|
|
+
|
|
+ /** Device I2C slave address */
|
|
+ u8 u_hw_address;
|
|
+
|
|
+ /** System function to write to the I2C driver */
|
|
+ pbsl_sys_func_t sys_func_write;
|
|
+
|
|
+ /** System function to read from the I2C driver */
|
|
+ pbsl_sys_func_t sys_func_read;
|
|
+
|
|
+ /** System function to read EDID blocks via the I2C driver */
|
|
+ pbsl_sys_func_edid_t sys_func_edid_read;
|
|
+
|
|
+ /** System function to run a timer */
|
|
+ pbsl_sys_func_timer_t sys_func_timer;
|
|
+
|
|
+ /** Array of registered interrupt handler callback functions */
|
|
+ pbsl_callback_t func_int_callbacks[HDMITX_CALLBACK_INT_NUM];
|
|
+
|
|
+ /** Device version(s) supported by this component */
|
|
+ u8 u_supported_versions[E_DEV_VERSION_LIST_NUM];
|
|
+
|
|
+ /** Device version read from register, with features flags masked out */
|
|
+ u8 u_device_version;
|
|
+
|
|
+ /** Device features flags read from version register */
|
|
+ u8 u_device_features;
|
|
+
|
|
+ /** The device's power state */
|
|
+ power_state_t e_power_state;
|
|
+
|
|
+ /*=== E D I D ===*/
|
|
+
|
|
+ /** EDID Use alternative i2c address flag */
|
|
+ bool b_edid_alternate_addr;
|
|
+
|
|
+ /** The sink type set by the user (may or may not match EdidSinkType) */
|
|
+ bsl_sink_type_t sink_type;
|
|
+
|
|
+ /** EDID Sink Type for receiver */
|
|
+ bsl_sink_type_t edid_sink_type;
|
|
+
|
|
+ /** EDID AI_Support from HDMI VSDB */
|
|
+ bool edid_sink_ai;
|
|
+
|
|
+ /** EDID CEA flags from extension block */
|
|
+ u8 edid_cea_flags;
|
|
+
|
|
+ /** EDID Read Status */
|
|
+ u8 edid_status;
|
|
+
|
|
+ /** NB DTD stored in EdidDTD */
|
|
+ u8 nb_dtdstored;
|
|
+
|
|
+ /** EDID Detailed Timing Descriptor */
|
|
+ bsl_edid_dtd_t edid_dtd[NUMBER_DTD_STORED];
|
|
+
|
|
+ /** EDID First Moniteur descriptor */
|
|
+ bsl_edid_first_md_t edid_first_monitor_descriptor;
|
|
+
|
|
+ /** EDID Second Moniteur descriptor */
|
|
+ bsl_edid_second_md_t edid_second_monitor_descriptor;
|
|
+
|
|
+ /** EDID Other Moniteur descriptor */
|
|
+ bsl_edid_other_md_t edid_other_monitor_descriptor;
|
|
+
|
|
+ /** EDID supported Short Video Descriptors */
|
|
+ u8 edid_vfmts[HDMI_TX_SVD_MAX_CNT];
|
|
+
|
|
+ /** Counter for supported short video descriptors */
|
|
+ u8 edid_svd_cnt;
|
|
+
|
|
+ /** EDID supported Short Audio Descriptors */
|
|
+ bsl_edid_sad_t edid_afmts[HDMI_TX_SAD_MAX_CNT];
|
|
+
|
|
+ /** Counter for supported short audio descriptors */
|
|
+ u8 edid_sad_cnt;
|
|
+
|
|
+ /** EDID block workspace */
|
|
+ u8 edid_block[EDID_BLOCK_SIZE];
|
|
+
|
|
+ /** EDID Block Count */
|
|
+ u8 edid_block_cnt;
|
|
+
|
|
+ /** CEC Source Address read from EDID as "A.B.C.D" nibbles */
|
|
+ u16 edid_source_address;
|
|
+
|
|
+ /** EDID Basic Display Parameters */
|
|
+ bsl_edid_bdparam_t edidbasic_display_param;
|
|
+
|
|
+ /*=== V I D E O ===*/
|
|
+
|
|
+ /** Current EIA/CEA video input format */
|
|
+ bsl_vid_fmt_t vin_fmt;
|
|
+
|
|
+ /** Current EIA/CEA video output format */
|
|
+ bsl_vid_fmt_t vout_fmt;
|
|
+
|
|
+ /** Current pix Rate*/
|
|
+ bsl_pix_rate_t pix_rate;
|
|
+
|
|
+ /** Video input mode */
|
|
+ bsl_vin_mode_t vin_mode;
|
|
+
|
|
+ /** Video output mode */
|
|
+ bsl_vout_mode_t vout_mode;
|
|
+
|
|
+ /** Vertical output frequency */
|
|
+ bsl_vfreq_t vout_freq;
|
|
+
|
|
+ /** Current scaler mode */
|
|
+ bsl_sca_mode_t sca_mode;
|
|
+
|
|
+ /** Current upsampler mode */
|
|
+ bsl_upsample_mode_t upsample_mode;
|
|
+
|
|
+ /** Current pixel repetition count */
|
|
+ u8 pixel_repeat_count;
|
|
+
|
|
+ /** Status of hot plug detect pin last read at interrupt */
|
|
+ bsl_hot_plug_t hot_plug_status;
|
|
+
|
|
+#ifdef TMFL_TDA9981_SUPPORT
|
|
+#ifdef TMFL_RX_SENSE_ON
|
|
+ /** Status of rx sense detect pin last read at interrupt */
|
|
+ bsl_rx_sense_t rx_sense_status;
|
|
+#endif /* TMFL_RX_SENSE_ON */
|
|
+#endif /* TMFL_TDA9981_SUPPORT */
|
|
+
|
|
+ /** Current register page */
|
|
+ u8 cur_reg_page;
|
|
+
|
|
+ /** Shadow copies of write-only registers with bitfields */
|
|
+ u8 shadow_reg[E_SNUM];
|
|
+
|
|
+ /** true: Blue screen is the previous test pattern ; false: is not */
|
|
+ bool prev_bluescreen;
|
|
+
|
|
+ /** true: last screen is test pattern ; false: is not */
|
|
+ bool prev_pattern;
|
|
+
|
|
+ /** true: Unit has been initialized; false: not initialized */
|
|
+ bool b_initialized;
|
|
+
|
|
+ bsl_vqr_t dvi_vqr;
|
|
+
|
|
+} hdmi_txobject_t;
|
|
+
|
|
+/**
|
|
+ * \The structure of registers for video format ,
|
|
+ * used by PC_formats and chip_unknown formats
|
|
+ * */
|
|
+
|
|
+typedef struct _tm_hdmi_tx_vid_reg_t {
|
|
+ u16 n_pix;
|
|
+ u16 n_line;
|
|
+ u8 vs_line_start;
|
|
+ u16 vs_pix_start;
|
|
+ u8 vs_line_end;
|
|
+ u16 vs_pix_end;
|
|
+ u16 hs_start;
|
|
+ u16 hs_end;
|
|
+ u8 v_win_start;
|
|
+ u16 v_win_end;
|
|
+ u16 de_start;
|
|
+ u16 de_end;
|
|
+} hdmi_tx_vid_reg_t;
|
|
+
|
|
+/*============================================================================*/
|
|
+/* EXTERN DATA DEFINITION */
|
|
+/*============================================================================*/
|
|
+
|
|
+extern RAM_DAT hdmi_txobject_t g_hdmi_tx_instance[HDMITX_UNITS_MAX];
|
|
+extern CONST_DAT u8 k_page_index_to_page[E_PAGE_NUM];
|
|
+
|
|
+/*============================================================================*/
|
|
+/* EXTERN FUNCTION PROTOTYPES */
|
|
+/*============================================================================*/
|
|
+
|
|
+error_code_t check_unit_set_dis(unit_select_t tx_unit,
|
|
+ hdmi_txobject_t **pp_dis);
|
|
+error_code_t get_hw_registers(hdmi_txobject_t *p_dis,
|
|
+ u16 reg_shad_page_addr,
|
|
+ u8 *p_data, u16 len_data);
|
|
+error_code_t get_hw_register(hdmi_txobject_t *p_dis,
|
|
+ u16 reg_shad_page_addr,
|
|
+ u8 *p_reg_value);
|
|
+error_code_t set_hw_registers(hdmi_txobject_t *p_dis,
|
|
+ u16 reg_shad_page_addr,
|
|
+ u8 *p_data, u16 len_data);
|
|
+error_code_t set_hw_register_msb_lsb(hdmi_txobject_t *p_dis,
|
|
+ u16 reg_shad_page_addr,
|
|
+ u16 reg_word);
|
|
+error_code_t set_hw_register(hdmi_txobject_t *p_dis,
|
|
+ u16 reg_shad_page_addr,
|
|
+ u8 reg_value);
|
|
+error_code_t set_hw_register_field(hdmi_txobject_t *p_dis,
|
|
+ u16 reg_shad_page_addr,
|
|
+ u8 field_mask, u8 field_value);
|
|
+error_code_t set_hw_register_field_table(hdmi_txobject_t *p_dis,
|
|
+ const hdmi_tx_reg_mask_val_t *p_table);
|
|
+
|
|
+error_code_t set_state(hdmi_txobject_t *p_dis, bsl_event_t event);
|
|
+
|
|
+error_code_t lmemcpy(void *p_table1,
|
|
+ const void *p_table2,
|
|
+ uint size);
|
|
+error_code_t lmemset(void *p_table1,
|
|
+ const u8 value,
|
|
+ uint size);
|
|
+
|
|
+#endif /* BSLHDMITX_LOCAL_H */
|
|
+/*============================================================================*/
|
|
+/* END OF FILE */
|
|
+/*============================================================================*/
|
|
diff --git a/drivers/video/hdmi/comps/tmdlHdmiCEC/cfg/tmdlHdmiCEC_IW.c b/drivers/video/hdmi/comps/tmdlHdmiCEC/cfg/tmdlHdmiCEC_IW.c
|
|
new file mode 100755
|
|
index 0000000..e7666c2
|
|
--- /dev/null
|
|
+++ b/drivers/video/hdmi/comps/tmdlHdmiCEC/cfg/tmdlHdmiCEC_IW.c
|
|
@@ -0,0 +1,1062 @@
|
|
+/*
|
|
+ * Copyright (C) 2007 NXP N.V., All Rights Reserved.
|
|
+ * This source code and any compilation or derivative thereof is the proprietary
|
|
+ * information of NXP N.V. and is confidential in nature. Under no circumstances
|
|
+ * is this software to be exposed to or placed under an Open Source License of
|
|
+ * any type without the expressed written permission of NXP N.V.
|
|
+ *
|
|
+ * \file dlHdmiCEC_IW.c
|
|
+ *
|
|
+ * \version $Revision: 1 $
|
|
+ *
|
|
+ * \date $Date: 06/02/07 8:32 $
|
|
+ *
|
|
+ * \brief devlib driver component API for the CEC Messages
|
|
+ *
|
|
+ * \section refs Reference Documents
|
|
+ *
|
|
+ *
|
|
+ * \section info Change Information
|
|
+ *
|
|
+ * \verbatim
|
|
+ *
|
|
+ * $History: dlHdmiCEC_IW.c $
|
|
+ *
|
|
+ * \endverbatim
|
|
+ *
|
|
+ * */
|
|
+
|
|
+/*============================================================================*/
|
|
+/* INCLUDE FILES */
|
|
+/*============================================================================*/
|
|
+
|
|
+#ifdef TMFL_OS_WINDOWS
|
|
+#define _WIN32_WINNT 0x0500
|
|
+#include "windows.h"
|
|
+#else
|
|
+#include "RTL.h"
|
|
+#endif
|
|
+
|
|
+#include "tmNxTypes.h"
|
|
+#include "tmNxCompId.h"
|
|
+#include "tmdlHdmiCEC_Types.h"
|
|
+#include "tmdlHdmiCEC_cfg.h"
|
|
+#include "tmdlHdmiCEC_IW.h"
|
|
+
|
|
+/*============================================================================*/
|
|
+/* DEFINES */
|
|
+/*============================================================================*/
|
|
+
|
|
+/* maximum number of tasks that can be handled by the wrapper */
|
|
+#define MAX_TASKS 4
|
|
+/* maximum number of message queues that can be handled by the wrapper */
|
|
+#define MAX_QUEUES 4
|
|
+/* maximum number of message queues that can be handled by the wrapper */
|
|
+#define MAX_SEMA 4
|
|
+
|
|
+/*============================================================================*/
|
|
+/* MACRO */
|
|
+/*============================================================================*/
|
|
+
|
|
+/* macro for quick error handling */
|
|
+#define RETIF(cond, rslt) if ((cond)){return (rslt);}
|
|
+
|
|
+/*============================================================================*/
|
|
+/* TYPE DEFINITIONS */
|
|
+/*============================================================================*/
|
|
+
|
|
+#ifdef TMFL_OS_WINDOWS
|
|
+/* structure describing each task handled by the wrapper */
|
|
+typedef struct {
|
|
+ bool created;
|
|
+ bool started;
|
|
+ u8 priority;
|
|
+ u16 stack_size;
|
|
+ DWORD thread_id;
|
|
+ HANDLE thread_handle;
|
|
+ LPTHREAD_START_ROUTINE associated_thread;
|
|
+ tx_iwfunc_ptr_t associated_task;
|
|
+} iw_tcb_t;
|
|
+
|
|
+/* structure describing each message queue handled by the wrapper */
|
|
+typedef struct {
|
|
+ bool created;
|
|
+ HANDLE access_semaphore;
|
|
+ HANDLE count_semaphore;
|
|
+ u16 queue_fullness;
|
|
+ u16 queue_size;
|
|
+ u16 write_pointer;
|
|
+ u16 read_pointer;
|
|
+ u8 *queue;
|
|
+} iw_queue_t;
|
|
+
|
|
+/*============================================================================*/
|
|
+/* FUNCTION PROTOTYPES */
|
|
+/*============================================================================*/
|
|
+
|
|
+DWORD WINAPI thread_proc0(LPVOID lp_parameter);
|
|
+DWORD WINAPI thread_proc1(LPVOID lp_parameter);
|
|
+DWORD WINAPI thread_proc2(LPVOID lp_parameter);
|
|
+DWORD WINAPI thread_proc3(LPVOID lp_parameter);
|
|
+
|
|
+/*============================================================================*/
|
|
+/* VARIABLES */
|
|
+/*============================================================================*/
|
|
+
|
|
+/* table storing all tasks descriptions */
|
|
+iw_tcb_t task_table[MAX_TASKS] = {
|
|
+ {false, false, 0, 0, 0, NULL, thread_proc0},
|
|
+ {false, false, 0, 0, 0, NULL, thread_proc1},
|
|
+ {false, false, 0, 0, 0, NULL, thread_proc2},
|
|
+ {false, false, 0, 0, 0, NULL, thread_proc3}
|
|
+};
|
|
+
|
|
+/* table storing all message queues descriptions */
|
|
+iw_queue_t queue_table[MAX_QUEUES] = {
|
|
+ {false, 0, 0, 0, 0, 0, 0, NULL},
|
|
+ {false, 0, 0, 0, 0, 0, 0, NULL},
|
|
+ {false, 0, 0, 0, 0, 0, 0, NULL},
|
|
+ {false, 0, 0, 0, 0, 0, 0, NULL}
|
|
+};
|
|
+
|
|
+/*============================================================================*/
|
|
+/* FUNCTION */
|
|
+/*============================================================================*/
|
|
+
|
|
+/**
|
|
+ * \brief This function creates a task and allocates all the necessary resources. Note that creating a task do not start it automatically, an explicit call to IWTaskStart must be made.
|
|
+ *
|
|
+ * \param pFunc Pointer to the function that will be executed in the task context.
|
|
+ * \param Priority Priority of the task. The minimum priority is 0, the maximum is 255.
|
|
+ * \param StackSize Size of the stack to allocate for this task.
|
|
+ * \param pHandle Pointer to the handle buffer.
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_NO_RESOURCES: the resource is not available
|
|
+ * - ERR_DLHDMICEC_INCONSISTENT_PARAMS: an input parameter is
|
|
+ * inconsistent
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+error_code_t tx_iwtask_create
|
|
+(
|
|
+ tx_iwfunc_ptr_t p_func,
|
|
+ u8 priority,
|
|
+ u16 stack_size,
|
|
+ tx_iwtask_handle_t *p_handle
|
|
+)
|
|
+{
|
|
+ u32 i;
|
|
+
|
|
+ /* check that input pointer is not NULL */
|
|
+ RETIF(p_func == NULL, ERR_DLHDMICEC_INCONSISTENT_PARAMS)
|
|
+
|
|
+ /* check that input pointer is not NULL */
|
|
+ RETIF(p_handle == NULL, ERR_DLHDMICEC_INCONSISTENT_PARAMS)
|
|
+
|
|
+ /* search for available task slot */
|
|
+ for(i = 0; i < MAX_TASKS; i++) {
|
|
+ if(task_table[i].created == false)
|
|
+ break;
|
|
+
|
|
+ }
|
|
+ RETIF(i >= MAX_TASKS, ERR_DLHDMICEC_NO_RESOURCES)
|
|
+
|
|
+ /* store task parameters into the dedicated structure */
|
|
+ task_table[i].priority = priority;
|
|
+ task_table[i].stack_size = stack_size;
|
|
+ task_table[i].associated_task = p_func;
|
|
+ task_table[i].created = true;
|
|
+
|
|
+ *p_handle = (tx_iwtask_handle_t)i;
|
|
+
|
|
+ return(0);
|
|
+}
|
|
+
|
|
+/*============================================================================*/
|
|
+
|
|
+/**
|
|
+ * \brief This function destroys an existing task and frees resources used by it.
|
|
+ *
|
|
+ * \param Handle Handle of the task to be destroyed, as returned by IWTaskCreate.
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ * - ERR_DLHDMICEC_BAD_HANDLE: the handle number is wrong
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+error_code_t tx_iwtask_destroy
|
|
+(
|
|
+ tx_iwtask_handle_t handle
|
|
+)
|
|
+{
|
|
+ /* check if handle number is in range */
|
|
+ RETIF((handle < 0) || (handle >= MAX_TASKS), ERR_DLHDMICEC_BAD_HANDLE)
|
|
+
|
|
+ /* check if handle corresponding to task is created */
|
|
+ RETIF(task_table[handle].created == false, ERR_DLHDMICEC_RESOURCE_NOT_OWNED)
|
|
+
|
|
+ if(task_table[handle].started == true) {
|
|
+ terminate_thread(task_table[handle].thread_handle, 0);
|
|
+ task_table[handle].started = false;
|
|
+ }
|
|
+ task_table[handle].created = false;
|
|
+ close_handle(task_table[handle].thread_handle);
|
|
+
|
|
+ return(0);
|
|
+}
|
|
+
|
|
+/*============================================================================*/
|
|
+
|
|
+/**
|
|
+ * \brief This function start an existing task.
|
|
+ *
|
|
+ * \param Handle Handle of the task to be started.
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_ALREADY_STARTED: the function is already started
|
|
+ * - ERR_DLHDMICEC_NOT_STARTED: the function is not started
|
|
+ * - ERR_DLHDMICEC_BAD_HANDLE: the handle number is wrong
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+error_code_t tx_iwtask_start(tx_iwtask_handle_t handle)
|
|
+{
|
|
+ HANDLE thread_handle;
|
|
+
|
|
+ /* check if handle number is in range */
|
|
+ RETIF((handle < 0) || (handle >= MAX_TASKS), ERR_DLHDMICEC_BAD_HANDLE)
|
|
+
|
|
+ /* check if task is already started */
|
|
+ RETIF(task_table[handle].started == true, ERR_DLHDMICEC_ALREADY_STARTED)
|
|
+
|
|
+ /* start thread associated to the task */
|
|
+ thread_handle = create_thread(NULL,
|
|
+ (SIZE_T)task_table[handle].stack_size,
|
|
+ task_table[handle].associated_thread,
|
|
+ NULL,
|
|
+ 0,
|
|
+ &(task_table[handle].thread_id));
|
|
+
|
|
+ /* check return code for errors */
|
|
+ RETIF(!thread_handle, ERR_DLHDMICEC_NOT_STARTED)
|
|
+
|
|
+ /* update task status */
|
|
+ task_table[handle].thread_handle = thread_handle;
|
|
+ task_table[handle].started = true;
|
|
+
|
|
+ return(0);
|
|
+}
|
|
+
|
|
+/*============================================================================*/
|
|
+
|
|
+/**
|
|
+ * \brief This function blocks the current task for the specified amount time. This is a passive wait.
|
|
+ *
|
|
+ * \param Duration Duration of the task blocking in milliseconds.
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_NO_RESOURCES: the resource is not available
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+error_code_t tx_iwwait(u16 duration)
|
|
+{
|
|
+ HANDLE timer_handle;
|
|
+ LARGE_INTEGER time;
|
|
+
|
|
+ timer_handle = create_waitable_timer(NULL, true, NULL);
|
|
+ RETIF(timer_handle == NULL, ERR_DLHDMICEC_NO_RESOURCES)
|
|
+
|
|
+ time.quad_part = -10000 * (long)duration;
|
|
+ set_waitable_timer(timer_handle, &time, 0, NULL, NULL, false);
|
|
+ wait_for_single_object(timer_handle, INFINITE);
|
|
+
|
|
+ return(0);
|
|
+}
|
|
+
|
|
+/*============================================================================*/
|
|
+
|
|
+/**
|
|
+ * \brief This function creates a message queue.
|
|
+ *
|
|
+ * \param QueueSize Maximum number of messages in the message queue.
|
|
+ * \param pHandle Pointer to the handle buffer.
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_INCONSISTENT_PARAMS: an input parameter is
|
|
+ * inconsistent
|
|
+ * - ERR_DLHDMICEC_NO_RESOURCES: the resource is not available
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+error_code_t tx_iwqueue_create(u8 queue_size, tx_iwqueue_handle_t *p_handle)
|
|
+{
|
|
+ u32 i;
|
|
+
|
|
+ /* check that input pointer is not NULL */
|
|
+ RETIF(p_handle == NULL, ERR_DLHDMICEC_INCONSISTENT_PARAMS)
|
|
+
|
|
+ /* search for available queue slot */
|
|
+ for(i = 0; i < MAX_QUEUES; i++) {
|
|
+ if(queue_table[i].created == false)
|
|
+ break;
|
|
+
|
|
+ }
|
|
+
|
|
+ RETIF(i >= MAX_QUEUES, ERR_DLHDMICEC_NO_RESOURCES)
|
|
+
|
|
+ /* allocate memory for the queue */
|
|
+ queue_table[i].queue = (u8 *)global_alloc(GMEM_FIXED, queue_size);
|
|
+ RETIF(queue_table[i].queue == NULL, ERR_DLHDMICEC_NO_RESOURCES)
|
|
+
|
|
+ /* allocate semaphores for the queue */
|
|
+ queue_table[i].count_semaphore = create_semaphore(NULL, 0, queue_size, NULL);
|
|
+ RETIF(queue_table[i].count_semaphore == NULL, ERR_DLHDMICEC_NO_RESOURCES)
|
|
+
|
|
+ queue_table[i].access_semaphore = create_semaphore(NULL, 1, 1, NULL);
|
|
+ RETIF(queue_table[i].access_semaphore == NULL, ERR_DLHDMICEC_NO_RESOURCES)
|
|
+
|
|
+ /* update status of the queue table */
|
|
+ queue_table[i].created = true;
|
|
+ queue_table[i].queue_size = queue_size;
|
|
+ *p_handle = (tx_iwqueue_handle_t)i;
|
|
+
|
|
+ return(0);
|
|
+}
|
|
+
|
|
+/*============================================================================*/
|
|
+
|
|
+/**
|
|
+ * \brief This function destroys an existing message queue.
|
|
+ *
|
|
+ * \param Handle Handle of the queue to be destroyed.
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_HANDLE: the handle number is wrong
|
|
+ * - ERR_DLHDMICEC_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+error_code_t tx_iwqueue_destroy(tx_iwqueue_handle_t handle)
|
|
+{
|
|
+ RETIF(handle > MAX_QUEUES, ERR_DLHDMICEC_BAD_HANDLE)
|
|
+
|
|
+ RETIF(queue_table[handle].created == false, ERR_DLHDMICEC_RESOURCE_NOT_OWNED)
|
|
+
|
|
+ global_free((LPVOID)queue_table[handle].queue);
|
|
+ close_handle(queue_table[handle].count_semaphore);
|
|
+ close_handle(queue_table[handle].access_semaphore);
|
|
+ queue_table[handle].created = false;
|
|
+
|
|
+ return(0);
|
|
+}
|
|
+
|
|
+/*============================================================================*/
|
|
+
|
|
+/**
|
|
+ * \brief This function sends a message into the specified message queue.
|
|
+ *
|
|
+ * \param Handle Handle of the queue that will receive the message.
|
|
+ * \param Message Message to be sent.
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_HANDLE: the handle number is wrong
|
|
+ * - ERR_DLHDMICEC_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ * - ERR_DLHDMICEC_FULL: the queue is full
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+error_code_t tx_iwqueue_send(tx_iwqueue_handle_t handle, u8 message)
|
|
+{
|
|
+ error_code_t error_code = 0;
|
|
+
|
|
+ /* check that handle is correct */
|
|
+ RETIF(handle > MAX_QUEUES, ERR_DLHDMICEC_BAD_HANDLE)
|
|
+
|
|
+ RETIF(queue_table[handle].created != true, ERR_DLHDMICEC_RESOURCE_NOT_OWNED)
|
|
+
|
|
+ /* ask for exclusive access to this queue */
|
|
+ wait_for_single_object(queue_table[handle].access_semaphore, INFINITE);
|
|
+
|
|
+ if(queue_table[handle].queue_fullness < (queue_table[handle].queue_size - 1)) {
|
|
+ queue_table[handle].queue[queue_table[handle].write_pointer] = message;
|
|
+ queue_table[handle].queue_fullness++;
|
|
+ queue_table[handle].write_pointer++;
|
|
+ if(queue_table[handle].write_pointer == queue_table[handle].queue_size) {
|
|
+ queue_table[handle].write_pointer = 0;
|
|
+ }
|
|
+ release_semaphore(queue_table[handle].count_semaphore, 1, NULL);
|
|
+ } else {
|
|
+ error_code = ERR_DLHDMICEC_FULL;
|
|
+ }
|
|
+
|
|
+ /* release access to this queue */
|
|
+ release_semaphore(queue_table[handle].access_semaphore, 1, NULL);
|
|
+
|
|
+ return(0);
|
|
+}
|
|
+/*============================================================================*/
|
|
+
|
|
+/**
|
|
+ * \brief This function reads a message from the specified message queue.
|
|
+ *
|
|
+ * \param Handle Handle of the queue from which to read the message.
|
|
+ * \param pMessage Pointer to the message buffer.
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_HANDLE: the handle number is wrong
|
|
+ * - ERR_DLHDMICEC_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ * - ERR_DLHDMICEC_INCONSISTENT_PARAMS: an input parameter is
|
|
+ * inconsistent
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+error_code_t tx_iwqueue_receive(tx_iwqueue_handle_t handle, u8 *p_message)
|
|
+{
|
|
+ /* check that handle is correct */
|
|
+ RETIF(handle > MAX_QUEUES, ERR_DLHDMICEC_BAD_HANDLE)
|
|
+
|
|
+ RETIF(queue_table[handle].created != true, ERR_DLHDMICEC_RESOURCE_NOT_OWNED)
|
|
+
|
|
+ /* check that input pointer is not NULL */
|
|
+ RETIF(p_message == NULL, ERR_DLHDMICEC_INCONSISTENT_PARAMS)
|
|
+
|
|
+ /* ask for a new message by acquiring the counting semaphore */
|
|
+ wait_for_single_object(queue_table[handle].count_semaphore, INFINITE);
|
|
+
|
|
+ /* if we reach this point, this means that we got a message */
|
|
+ /* ask for exclusive access to this queue */
|
|
+ wait_for_single_object(queue_table[handle].access_semaphore, INFINITE);
|
|
+
|
|
+ *p_message = queue_table[handle].queue[queue_table[handle].read_pointer];
|
|
+ queue_table[handle].queue_fullness--;
|
|
+ queue_table[handle].read_pointer++;
|
|
+ if(queue_table[handle].read_pointer == queue_table[handle].queue_size) {
|
|
+ queue_table[handle].read_pointer = 0;
|
|
+ }
|
|
+
|
|
+ /* release access to this queue */
|
|
+ release_semaphore(queue_table[handle].access_semaphore, 1, NULL);
|
|
+
|
|
+ return(0);
|
|
+}
|
|
+
|
|
+/*============================================================================*/
|
|
+
|
|
+/**
|
|
+ * \brief This function creates a semaphore.
|
|
+ *
|
|
+ * \param pHandle Pointer to the handle buffer.
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_NO_RESOURCES: the resource is not available
|
|
+ * - ERR_DLHDMICEC_INCONSISTENT_PARAMS: an input parameter is
|
|
+ * inconsistent
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+error_code_t tx_iwsemaphore_create(tx_iwsem_handle_t *p_handle)
|
|
+{
|
|
+ /* check that input pointer is not NULL */
|
|
+ RETIF(p_handle == NULL, ERR_DLHDMICEC_INCONSISTENT_PARAMS)
|
|
+
|
|
+ *p_handle = (tx_iwsem_handle_t)create_semaphore(NULL, 1, 1, NULL);
|
|
+
|
|
+ RETIF((*p_handle) == NULL, ERR_DLHDMICEC_NO_RESOURCES)
|
|
+
|
|
+ return(0);
|
|
+}
|
|
+
|
|
+/*============================================================================*/
|
|
+
|
|
+/**
|
|
+ * \brief This function destroys an existing semaphore.
|
|
+ *
|
|
+ * \param Handle Handle of the semaphore to be destroyed.
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_HANDLE: the handle number is wrong
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+error_code_t tx_iwsemaphore_destroy(tx_iwsem_handle_t handle)
|
|
+{
|
|
+ RETIF(close_handle(handle) == false, ERR_DLHDMICEC_BAD_HANDLE)
|
|
+
|
|
+ return(0);
|
|
+}
|
|
+
|
|
+/*============================================================================*/
|
|
+
|
|
+/**
|
|
+ * \brief This function acquires the specified semaphore.
|
|
+ *
|
|
+ * \param Handle Handle of the semaphore to be acquired.
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_HANDLE: the handle number is wrong
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+error_code_t tx_iwsemaphore_p(tx_iwsem_handle_t handle)
|
|
+{
|
|
+ RETIF(wait_for_single_object(handle, INFINITE) != WAIT_OBJECT_0, ERR_DLHDMICEC_BAD_HANDLE)
|
|
+
|
|
+ return(0);
|
|
+}
|
|
+
|
|
+/*============================================================================*/
|
|
+
|
|
+/**
|
|
+ * \brief This function releases the specified semaphore.
|
|
+ *
|
|
+ * \param Handle Handle of the semaphore to be released.
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_HANDLE: the handle number is wrong
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+error_code_t tx_iwsemaphore_v(tx_iwsem_handle_t handle)
|
|
+{
|
|
+ RETIF(release_semaphore(handle, 1, NULL) == 0, ERR_DLHDMICEC_BAD_HANDLE)
|
|
+
|
|
+ return(0);
|
|
+}
|
|
+
|
|
+/******************************************************************************
|
|
+ * \brief This function disables the interrupts for a specific device.
|
|
+ *
|
|
+ * \param
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+void tx_iwdisable_interrupts(dl_hdmi_iwdevice_interrupt_t device)
|
|
+{
|
|
+ device;
|
|
+}
|
|
+
|
|
+/******************************************************************************
|
|
+ * \brief This function enables the interrupts for a specific device.
|
|
+ *
|
|
+ * \param
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+void tx_iwenable_interrupts(dl_hdmi_iwdevice_interrupt_t device)
|
|
+{
|
|
+ device;
|
|
+}
|
|
+
|
|
+DWORD WINAPI thread_proc0(LPVOID lp_parameter)
|
|
+{
|
|
+ /* dummy reference to avoid compilation warning C4100 */
|
|
+ lp_parameter;
|
|
+
|
|
+ /* call the registered task */
|
|
+ task_table[0].associated_task();
|
|
+ /* if we reach this point, the task is terminated, so update its status */
|
|
+ task_table[0].started = false;
|
|
+
|
|
+ return(0);
|
|
+}
|
|
+
|
|
+DWORD WINAPI thread_proc1(LPVOID lp_parameter)
|
|
+{
|
|
+ /* dummy reference to avoid compilation warning C4100 */
|
|
+ lp_parameter;
|
|
+
|
|
+ /* call the registered task */
|
|
+ task_table[1].associated_task();
|
|
+ /* if we reach this point, the task is terminated, so update its status */
|
|
+ task_table[1].started = false;
|
|
+
|
|
+ return(0);
|
|
+}
|
|
+
|
|
+DWORD WINAPI thread_proc2(LPVOID lp_parameter)
|
|
+{
|
|
+ /* dummy reference to avoid compilation warning C4100 */
|
|
+ lp_parameter;
|
|
+
|
|
+ /* call the registered task */
|
|
+ task_table[2].associated_task();
|
|
+ /* if we reach this point, the task is terminated, so update its status */
|
|
+ task_table[2].started = false;
|
|
+
|
|
+ return(0);
|
|
+}
|
|
+
|
|
+DWORD WINAPI thread_proc3(LPVOID lp_parameter)
|
|
+{
|
|
+ /* dummy reference to avoid compilation warning C4100 */
|
|
+ lp_parameter;
|
|
+
|
|
+ /* call the registered task */
|
|
+ task_table[3].associated_task();
|
|
+ /* if we reach this point, the task is terminated, so update its status */
|
|
+ task_table[3].started = false;
|
|
+
|
|
+ return(0);
|
|
+}
|
|
+#else
|
|
+
|
|
+/*============================================================================*/
|
|
+/* TYPE DEFINITIONS */
|
|
+/*============================================================================*/
|
|
+
|
|
+/* structure describing each task handled by the wrapper */
|
|
+typedef struct {
|
|
+ bool created;
|
|
+ bool started;
|
|
+ u8 priority;
|
|
+ u16 stack_size;
|
|
+ uint thread_handle;
|
|
+ tx_iwfunc_ptr_t associated_task;
|
|
+} iw_tcb_t;
|
|
+
|
|
+/* structure describing each message queue handled by the wrapper */
|
|
+#define Queue_default_Size 128
|
|
+
|
|
+os_mbx_declare(mbox0, queue_default_size);
|
|
+os_mbx_declare(mbox1, queue_default_size);
|
|
+os_mbx_declare(mbox2, queue_default_size);
|
|
+os_mbx_declare(mbox3, queue_default_size);
|
|
+
|
|
+_declare_box(mpool0, sizeof(u8), queue_default_size);
|
|
+_declare_box(mpool1, sizeof(u8), queue_default_size);
|
|
+_declare_box(mpool2, sizeof(u8), queue_default_size);
|
|
+_declare_box(mpool3, sizeof(u8), queue_default_size);
|
|
+
|
|
+typedef struct {
|
|
+ bool created;
|
|
+ u16 queue_size;
|
|
+ void *mbox;
|
|
+ void *mpool;
|
|
+} iw_queue_t;
|
|
+
|
|
+/* structure describing each task handled by the wrapper */
|
|
+typedef struct {
|
|
+ bool created;
|
|
+ OS_SEM handle;
|
|
+} iw_sem_t;
|
|
+/*============================================================================*/
|
|
+/* FUNCTION PROTOTYPES */
|
|
+/*============================================================================*/
|
|
+
|
|
+/*============================================================================*/
|
|
+/* VARIABLES */
|
|
+/*============================================================================*/
|
|
+
|
|
+/* table storing all tasks descriptions */
|
|
+iw_tcb_t task_table[MAX_TASKS] = {
|
|
+ {false, false, 0, 0, 0, NULL},
|
|
+ {false, false, 0, 0, 0, NULL},
|
|
+ {false, false, 0, 0, 0, NULL},
|
|
+ {false, false, 0, 0, 0, NULL}
|
|
+};
|
|
+
|
|
+/* table storing all message queues descriptions */
|
|
+iw_queue_t queue_table[MAX_QUEUES] = {
|
|
+ {false, 0, mbox0, mpool0},
|
|
+ {false, 0, mbox1, mpool1},
|
|
+ {false, 0, mbox2, mpool2},
|
|
+ {false, 0, mbox3, mpool3}
|
|
+};
|
|
+
|
|
+/* table storing all message queues descriptions */
|
|
+iw_sem_t sem_table[MAX_SEMA] = {
|
|
+ {false, 0},
|
|
+ {false, 0},
|
|
+ {false, 0},
|
|
+ {false, 0},
|
|
+};
|
|
+/*============================================================================*/
|
|
+/* FUNCTION */
|
|
+/*============================================================================*/
|
|
+
|
|
+/**
|
|
+ * \brief This function creates a task and allocates all the necessary resources. Note that creating a task do not start it automatically, an explicit call to IWTaskStart must be made.
|
|
+ * Parameters:
|
|
+ *
|
|
+ * \param pSWVersion Pointer to the version structure
|
|
+ * \param pFunc Pointer to the function that will be executed in the task context.
|
|
+ * \param Priority Priority of the task. The minimum priority is 0, the maximum is 255.
|
|
+ * \param StackSize Size of the stack to allocate for this task.
|
|
+ * \param pHandle Pointer to the handle buffer.
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0 If call is successful.
|
|
+ * - NOK If call failed.
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+error_code_t tx_iwtask_create(tx_iwfunc_ptr_t p_func,
|
|
+ u8 priority,
|
|
+ u16 stack_size,
|
|
+ tx_iwtask_handle_t *p_handle)
|
|
+{
|
|
+ u32 i;
|
|
+
|
|
+ /* search for available task slot */
|
|
+ for(i = 0; i < MAX_TASKS; i++) {
|
|
+ if(task_table[i].created == false)
|
|
+ break;
|
|
+
|
|
+ }
|
|
+ if(i >= MAX_TASKS) return(ERR_NO_RESOURCES);
|
|
+
|
|
+ /* store task parameters into the dedicated structure */
|
|
+ task_table[i].priority = priority;
|
|
+ task_table[i].stack_size = stack_size;
|
|
+ task_table[i].associated_task = p_func;
|
|
+ task_table[i].created = true;
|
|
+
|
|
+ *p_handle = (tx_iwtask_handle_t)i;
|
|
+
|
|
+ return(0);
|
|
+}
|
|
+
|
|
+/*============================================================================*/
|
|
+
|
|
+/**
|
|
+ * \brief This function destroys an existing task and frees resources used by it.
|
|
+ *
|
|
+ * \param Handle Handle of the task to be destroyed, as returned by TxIWTaskCreate.
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0 If call is successful.
|
|
+ * - ~0 If call failed.
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+error_code_t tx_iwtask_destroy(tx_iwtask_handle_t handle)
|
|
+{
|
|
+ if(task_table[handle].started == true) {
|
|
+ if(os_tsk_delete(task_table[handle].thread_handle) == OS_R_OK) {
|
|
+ task_table[handle].started = false;
|
|
+ } else {
|
|
+ return ~0;
|
|
+ }
|
|
+ }
|
|
+ task_table[handle].created = false;
|
|
+
|
|
+ return(0);
|
|
+}
|
|
+
|
|
+/*============================================================================*/
|
|
+
|
|
+/**
|
|
+ * \brief This function start an existing task.
|
|
+ *
|
|
+ * \param Handle Handle of the task to be started.
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0 If call is successful.
|
|
+ * - ~0 If call failed.
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+error_code_t tx_iwtask_start(tx_iwtask_handle_t handle)
|
|
+{
|
|
+ uint thread_handle;
|
|
+
|
|
+ /* check if task is already started */
|
|
+ if(task_table[handle].started == true)
|
|
+ return(ERR_ALREADY_STARTED);
|
|
+
|
|
+ /* start thread associated to the task */
|
|
+ thread_handle = os_tsk_create(task_table[handle].associated_task,
|
|
+ task_table[handle].priority);
|
|
+
|
|
+ /* check return code for errors */
|
|
+ if(!thread_handle) {
|
|
+ return(ERR_NOT_STARTED);
|
|
+ }
|
|
+
|
|
+ /* update task status */
|
|
+ task_table[handle].thread_handle = thread_handle;
|
|
+ task_table[handle].started = true;
|
|
+
|
|
+ return(0);
|
|
+}
|
|
+
|
|
+/*============================================================================*/
|
|
+
|
|
+/**
|
|
+ * \brief This function blocks the current task for the specified amount time. This is a passive wait.
|
|
+ *
|
|
+ * \param Duration Duration of the task blocking in milliseconds.
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0 If call is successful.
|
|
+ * - ~0 If call failed.
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+error_code_t tx_iwwait(u16 duration)
|
|
+{
|
|
+ /*TODO perform conversion with Tick system in order to consider ms */
|
|
+ os_dly_wait(duration / 10);
|
|
+
|
|
+ return(0);
|
|
+}
|
|
+
|
|
+/*============================================================================*/
|
|
+
|
|
+/**
|
|
+ * \brief This function creates a message queue.
|
|
+ *
|
|
+ * \param QueueSize Maximum number of messages in the message queue.
|
|
+ * \param pHandle Pointer to the handle buffer.
|
|
+ * \return The call result:
|
|
+ * - 0 If call is successful.
|
|
+ * - ~0 If call failed.
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+error_code_t tx_iwqueue_create(u8 queue_size, tx_iwqueue_handle_t *p_handle)
|
|
+{
|
|
+ u8 i;
|
|
+
|
|
+ if(queue_size > queue_default_size) return ERR_BAD_PARAMETER;
|
|
+
|
|
+ /* search for available queue slot */
|
|
+ for(i = 0; i < MAX_QUEUES; i++) {
|
|
+ if(queue_table[i].created == false)
|
|
+ break;
|
|
+
|
|
+ }
|
|
+ if(i >= MAX_QUEUES) return(ERR_NO_RESOURCES);
|
|
+
|
|
+ *p_handle = i;
|
|
+
|
|
+ /* Initialisation of queue object */
|
|
+ /*TODO check if we can reuse deleted queue */
|
|
+ _init_box(queue_table[i].mpool, sizeof(queue_table[i].mpool), sizeof(u8));
|
|
+ os_mbx_init(queue_table[i].mbox, sizeof(queue_table[i].mbox));
|
|
+
|
|
+ /* update status of the queue table */
|
|
+ queue_table[i].created = true;
|
|
+ queue_table[i].queue_size = queue_size;
|
|
+
|
|
+ return(0);
|
|
+}
|
|
+
|
|
+/*============================================================================*/
|
|
+
|
|
+/**
|
|
+ * \brief This function destroys an existing message queue.
|
|
+ *
|
|
+ * \param Handle Handle of the queue to be destroyed.
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0 If call is successful.
|
|
+ * - ~0 If call failed.
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+error_code_t tx_iwqueue_destroy(tx_iwqueue_handle_t handle)
|
|
+{
|
|
+ void *msg;
|
|
+
|
|
+ RETIF(handle > MAX_QUEUES, ERR_BAD_HANDLE);
|
|
+ RETIF(queue_table[handle].created == false, ERR_BAD_HANDLE);
|
|
+
|
|
+ while(os_mbx_check(queue_table[handle].mbox) != queue_table[handle].queue_size) {
|
|
+ RETIF(os_mbx_wait(queue_table[handle].mbox, &msg, 10) == OS_R_TMO, ERR_TIMEOUT);
|
|
+ }
|
|
+
|
|
+ queue_table[handle].created = false;
|
|
+
|
|
+ return(0);
|
|
+}
|
|
+
|
|
+/*============================================================================*/
|
|
+
|
|
+/**
|
|
+ * \brief This function sends a message into the specified message queue.
|
|
+ *
|
|
+ * \param Handle Handle of the queue that will receive the message.
|
|
+ * Message Message to be sent.
|
|
+ * \return The call result:
|
|
+ * - 0 If call is successful.
|
|
+ * - ~0 If call failed.
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+error_code_t tx_iwqueue_send(tx_iwqueue_handle_t handle, u8 message)
|
|
+{
|
|
+ u8 *msg;
|
|
+
|
|
+ /* check that handle is correct */
|
|
+ RETIF(handle > MAX_QUEUES, ERR_BAD_HANDLE);
|
|
+ RETIF(queue_table[handle].created != true, ERR_BAD_HANDLE);
|
|
+
|
|
+ msg = _alloc_box(queue_table[handle].mpool);
|
|
+ msg = (u8 *) message;
|
|
+
|
|
+ if(os_mbx_check(queue_table[handle].mbox) != 0) {
|
|
+ RETIF(os_mbx_send(queue_table[handle].mbox, msg, 0xffff) == OS_R_TMO, ERR_TIMEOUT);
|
|
+ } else {
|
|
+ return ERR_FULL;
|
|
+ }
|
|
+
|
|
+ return(0);
|
|
+}
|
|
+/*============================================================================*/
|
|
+
|
|
+/**
|
|
+ * \brief This function reads a message from the specified message queue.
|
|
+ *
|
|
+ * \param Handle Handle of the queue from which to read the message.
|
|
+ * pMessage Pointer to the message buffer.
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0 If call is successful.
|
|
+ * - ~0 If call failed.
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+error_code_t tx_iwqueue_receive(tx_iwqueue_handle_t handle, u8 *p_message)
|
|
+{
|
|
+ u8 *msg;
|
|
+ /* check that handle is correct */
|
|
+ RETIF(handle > MAX_QUEUES, ERR_BAD_HANDLE);
|
|
+ RETIF(queue_table[handle].created != true, ERR_BAD_HANDLE);
|
|
+
|
|
+ /* if we reach this point, this means that we got a message */
|
|
+ /* ask for exclusive access to this queue */
|
|
+ RETIF(os_mbx_wait(queue_table[handle].mbox , (void **) &msg, 0xffff) == OS_R_TMO, ERR_TIMEOUT);
|
|
+ *p_message = (uint) msg;
|
|
+ _free_box(queue_table[handle].mpool, msg);
|
|
+
|
|
+ return(0);
|
|
+}
|
|
+
|
|
+/*============================================================================*/
|
|
+
|
|
+/**
|
|
+ * \brief This function creates a semaphore.
|
|
+ *
|
|
+ * \param pHandle Pointer to the handle buffer.
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0 If call is successful.
|
|
+ * - ~0 If call failed.
|
|
+ ******************************************************************************/
|
|
+error_code_t tx_iwsemaphore_create(tx_iwsem_handle_t *p_handle)
|
|
+{
|
|
+ u8 i;
|
|
+
|
|
+ /* search for available queue slot */
|
|
+ for(i = 0; i < MAX_SEMA; i++) {
|
|
+ if(sem_table[i].created == false)
|
|
+ break;
|
|
+
|
|
+ }
|
|
+ if(i >= MAX_SEMA) return(ERR_NO_RESOURCES);
|
|
+
|
|
+ os_sem_init(sem_table[i].handle, 1);
|
|
+
|
|
+ *p_handle = (tx_iwsem_handle_t) i;
|
|
+
|
|
+ sem_table[i].created = true;
|
|
+
|
|
+ return(0);
|
|
+}
|
|
+
|
|
+/*============================================================================*/
|
|
+
|
|
+/**
|
|
+ * \brief This function destroys an existing semaphore.
|
|
+ *
|
|
+ * \param Handle Handle of the semaphore to be destroyed.
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0 If call is successful.
|
|
+ * - ~0 If call failed.
|
|
+ ******************************************************************************/
|
|
+error_code_t tx_iwsemaphore_destroy(tx_iwsem_handle_t handle)
|
|
+{
|
|
+ /*TODO check if we can reuse */
|
|
+
|
|
+ return(0);
|
|
+}
|
|
+
|
|
+/*============================================================================*/
|
|
+
|
|
+/**
|
|
+ * \brief This function acquires the specified semaphore.
|
|
+ *
|
|
+ * \param Handle Handle of the semaphore to be acquired.
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0 If call is successful.
|
|
+ * - ~0 If call failed.
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+error_code_t tx_iwsemaphore_p(tx_iwsem_handle_t handle)
|
|
+{
|
|
+ if(sem_table[handle].created == false) return ERR_BAD_HANDLE;
|
|
+
|
|
+ RETIF(os_sem_wait(sem_table[handle].handle, 0xffff) == OS_R_TMO, ERR_TIMEOUT);
|
|
+
|
|
+ return(0);
|
|
+}
|
|
+
|
|
+/*============================================================================*/
|
|
+
|
|
+/**
|
|
+ * \brief This function releases the specified semaphore.
|
|
+ *
|
|
+ * \param Handle Handle of the semaphore to be released.
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0 If call is successful.
|
|
+ * - ~0 If call failed.
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+error_code_t tx_iwsemaphore_v(tx_iwsem_handle_t handle)
|
|
+{
|
|
+ if(sem_table[handle].created == false) return ERR_BAD_HANDLE;
|
|
+
|
|
+ RETIF(os_sem_send(sem_table[handle].handle) == OS_R_NOK, ERR_BAD_HANDLE);
|
|
+
|
|
+ return(0);
|
|
+}
|
|
+
|
|
+/******************************************************************************
|
|
+ * \brief This function disables the interrupts for a specific device.
|
|
+ *
|
|
+ * \param
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+void tx_iwdisable_interrupts(dl_hdmi_iwdevice_interrupt_t device)
|
|
+{
|
|
+}
|
|
+
|
|
+/******************************************************************************
|
|
+ * \brief This function enables the interrupts for a specific device.
|
|
+ *
|
|
+ * \param
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+void tx_iwenable_interrupts(dl_hdmi_iwdevice_interrupt_t device)
|
|
+{
|
|
+}
|
|
+
|
|
+#endif
|
|
+
|
|
+/*============================================================================*/
|
|
+/* END OF FILE */
|
|
+/*============================================================================*/
|
|
+
|
|
diff --git a/drivers/video/hdmi/comps/tmdlHdmiCEC/cfg/tmdlHdmiCEC_IW.h b/drivers/video/hdmi/comps/tmdlHdmiCEC/cfg/tmdlHdmiCEC_IW.h
|
|
new file mode 100755
|
|
index 0000000..27942c4
|
|
--- /dev/null
|
|
+++ b/drivers/video/hdmi/comps/tmdlHdmiCEC/cfg/tmdlHdmiCEC_IW.h
|
|
@@ -0,0 +1,297 @@
|
|
+/**
|
|
+ * Copyright (C) 2007 NXP N.V., All Rights Reserved.
|
|
+ * This source code and any compilation or derivative thereof is the proprietary
|
|
+ * information of NXP N.V. and is confidential in nature. Under no circumstances
|
|
+ * is this software to be exposed to or placed under an Open Source License of
|
|
+ * any type without the expressed written permission of NXP N.V.
|
|
+ *
|
|
+ * \file dlHdmiCEC_IW.h
|
|
+ *
|
|
+ * \version $Revision: 1 $
|
|
+ *
|
|
+ * \date $Date: $
|
|
+ *
|
|
+ * \brief devlib driver component API for the CEC messages
|
|
+ *
|
|
+ * \section refs Reference Documents
|
|
+ *
|
|
+ * \section info Change Information
|
|
+ *
|
|
+ * \verbatim
|
|
+ *
|
|
+ * $History: dlHdmiCEC_IW.h $
|
|
+ *
|
|
+ * \endverbatim
|
|
+ *
|
|
+ * */
|
|
+
|
|
+#ifndef DLHDMICEC_IW_H
|
|
+#define DLHDMICEC_IW_H
|
|
+
|
|
+/*============================================================================*/
|
|
+/* INCLUDE FILES */
|
|
+/*============================================================================*/
|
|
+
|
|
+#ifdef __LINUX_ARM_ARCH__
|
|
+#include <linux/kernel.h>
|
|
+#else
|
|
+#ifdef TMFL_OS_WINDOWS
|
|
+#define _WIN32_WINNT 0x0500
|
|
+#include "windows.h"
|
|
+#else
|
|
+#include "RTL.h"
|
|
+#endif
|
|
+#endif
|
|
+
|
|
+#include "tmNxTypes.h"
|
|
+#include "tmdlHdmiCEC_Types.h"
|
|
+
|
|
+/*============================================================================*/
|
|
+/* TYPE DEFINITIONS */
|
|
+/*============================================================================*/
|
|
+typedef void (*tx_iwfunc_ptr_t)(void);
|
|
+typedef u8 tx_iwtask_handle_t;
|
|
+typedef u8 tx_iwqueue_handle_t;
|
|
+#ifdef TMFL_OS_WINDOWS
|
|
+typedef HANDLE tx_iwsem_handle_t;
|
|
+#else
|
|
+typedef u8 tx_iwsem_handle_t;
|
|
+#endif
|
|
+
|
|
+/**
|
|
+ * \brief Enum listing all available devices for enable/disable interrupts
|
|
+ * */
|
|
+typedef enum {
|
|
+ DL_HDMI_IW_RX_1,
|
|
+ DL_HDMI_IW_RX_2,
|
|
+ DL_HDMI_IW_TX_1,
|
|
+ DL_HDMI_IW_TX_2,
|
|
+ DL_HDMI_IW_CEC_1,
|
|
+ DL_HDMI_IW_CEC_2
|
|
+} dl_hdmi_iwdevice_interrupt_t;
|
|
+
|
|
+/*============================================================================*/
|
|
+/* EXTERN FUNCTION PROTOTYPES */
|
|
+/*============================================================================*/
|
|
+
|
|
+/**
|
|
+ * \brief This function creates a task and allocates all the necessary
|
|
+ * resources. Note that creating a task do not start it automatically,
|
|
+ * an explicit call to IWTaskStart must be made.
|
|
+ *
|
|
+ * \param pFunc Pointer to the function that will be executed in the task context.
|
|
+ * \param Priority Priority of the task. The minimum priority is 0, the maximum is 255.
|
|
+ * \param StackSize Size of the stack to allocate for this task.
|
|
+ * \param pHandle Pointer to the handle buffer.
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMIRX_NO_RESOURCES: the resource is not available
|
|
+ * - ERR_DLHDMIRX_INCONSISTENT_PARAMS: an input parameter is
|
|
+ * inconsistent
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+error_code_t tx_iwtask_create(tx_iwfunc_ptr_t p_func, u8 priority, u16 stack_size, tx_iwtask_handle_t *p_handle);
|
|
+
|
|
+/*============================================================================*/
|
|
+
|
|
+/**
|
|
+ * \brief This function destroys an existing task and frees resources used by it.
|
|
+ *
|
|
+ * \param Handle Handle of the task to be destroyed, as returned by IWTaskCreate.
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMIRX_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ * - ERR_DLHDMIRX_BAD_HANDLE: the handle number is wrong
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+error_code_t tx_iwtask_destroy(tx_iwtask_handle_t handle);
|
|
+
|
|
+/*============================================================================*/
|
|
+
|
|
+/**
|
|
+ * \brief This function start an existing task.
|
|
+ *
|
|
+ * \param Handle Handle of the task to be started.
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMIRX_ALREADY_STARTED: the function is already started
|
|
+ * - ERR_DLHDMIRX_NOT_STARTED: the function is not started
|
|
+ * - ERR_DLHDMIRX_BAD_HANDLE: the handle number is wrong
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+error_code_t tx_iwtask_start(tx_iwtask_handle_t handle);
|
|
+
|
|
+/*============================================================================*/
|
|
+
|
|
+/**
|
|
+ * \brief This function blocks the current task for the specified amount time. This is a passive wait.
|
|
+ *
|
|
+ * \param Duration Duration of the task blocking in milliseconds.
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMIRX_NO_RESOURCES: the resource is not available
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+error_code_t tx_iwwait(u16 duration);
|
|
+
|
|
+/*============================================================================*/
|
|
+
|
|
+/**
|
|
+ * \brief This function creates a message queue.
|
|
+ *
|
|
+ * \param QueueSize Maximum number of messages in the message queue.
|
|
+ * \param pHandle Pointer to the handle buffer.
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMIRX_INCONSISTENT_PARAMS: an input parameter is
|
|
+ * inconsistent
|
|
+ * - ERR_DLHDMIRX_NO_RESOURCES: the resource is not available
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+error_code_t tx_iwqueue_create(u8 queue_size, tx_iwqueue_handle_t *p_handle);
|
|
+
|
|
+/*============================================================================*/
|
|
+
|
|
+/**
|
|
+ * \brief This function destroys an existing message queue.
|
|
+ *
|
|
+ * \param Handle Handle of the queue to be destroyed.
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMIRX_BAD_HANDLE: the handle number is wrong
|
|
+ * - ERR_DLHDMIRX_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+error_code_t tx_iwqueue_destroy(tx_iwqueue_handle_t handle);
|
|
+
|
|
+/*============================================================================*/
|
|
+
|
|
+/**
|
|
+ * \brief This function sends a message into the specified message queue.
|
|
+ *
|
|
+ * \param Handle Handle of the queue that will receive the message.
|
|
+ * \param Message Message to be sent.
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMIRX_BAD_HANDLE: the handle number is wrong
|
|
+ * - ERR_DLHDMIRX_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ * - ERR_DLHDMIRX_FULL: the queue is full
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+error_code_t tx_iwqueue_send(tx_iwqueue_handle_t handle, u8 message);
|
|
+
|
|
+/*============================================================================*/
|
|
+
|
|
+/**
|
|
+ * \brief This function reads a message from the specified message queue.
|
|
+ *
|
|
+ * \param Handle Handle of the queue from which to read the message.
|
|
+ * \param pMessage Pointer to the message buffer.
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMIRX_BAD_HANDLE: the handle number is wrong
|
|
+ * - ERR_DLHDMIRX_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ * - ERR_DLHDMIRX_INCONSISTENT_PARAMS: an input parameter is
|
|
+ * inconsistent
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+error_code_t tx_iwqueue_receive(tx_iwqueue_handle_t handle, u8 *p_message);
|
|
+
|
|
+/*============================================================================*/
|
|
+
|
|
+/**
|
|
+ * \brief This function creates a semaphore.
|
|
+ *
|
|
+ * \param pHandle Pointer to the handle buffer.
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMIRX_NO_RESOURCES: the resource is not available
|
|
+ * - ERR_DLHDMIRX_INCONSISTENT_PARAMS: an input parameter is
|
|
+ * inconsistent
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+error_code_t tx_iwsemaphore_create(tx_iwsem_handle_t *p_handle);
|
|
+
|
|
+/*============================================================================*/
|
|
+
|
|
+/**
|
|
+ * \brief This function destroys an existing semaphore.
|
|
+ *
|
|
+ * \param Handle Handle of the semaphore to be destroyed.
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMIRX_BAD_HANDLE: the handle number is wrong
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+error_code_t tx_iwsemaphore_destroy(tx_iwsem_handle_t handle);
|
|
+
|
|
+/*============================================================================*/
|
|
+
|
|
+/**
|
|
+ * \brief This function acquires the specified semaphore.
|
|
+ *
|
|
+ * \param Handle Handle of the semaphore to be acquired.
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMIRX_BAD_HANDLE: the handle number is wrong
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+error_code_t tx_iwsemaphore_p(tx_iwsem_handle_t handle);
|
|
+
|
|
+/*============================================================================*/
|
|
+
|
|
+/**
|
|
+ * \brief This function releases the specified semaphore.
|
|
+ *
|
|
+ * \param Handle Handle of the semaphore to be released.
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMIRX_BAD_HANDLE: the handle number is wrong
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+error_code_t tx_iwsemaphore_v(tx_iwsem_handle_t handle);
|
|
+
|
|
+/******************************************************************************
|
|
+ * \brief This function disables the interrupts for a specific device.
|
|
+ *
|
|
+ * \param
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+void tx_iwdisable_interrupts(dl_hdmi_iwdevice_interrupt_t device);
|
|
+
|
|
+/******************************************************************************
|
|
+ * \brief This function enables the interrupts for a specific device.
|
|
+ *
|
|
+ * \param
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+void tx_iwenable_interrupts(dl_hdmi_iwdevice_interrupt_t device);
|
|
+
|
|
+#endif /* DLHDMICEC_IW_H */
|
|
+
|
|
+/*============================================================================*/
|
|
+/* END OF FILE */
|
|
+/*============================================================================*/
|
|
+
|
|
diff --git a/drivers/video/hdmi/comps/tmdlHdmiCEC/cfg/tmdlHdmiCEC_Linux.c b/drivers/video/hdmi/comps/tmdlHdmiCEC/cfg/tmdlHdmiCEC_Linux.c
|
|
new file mode 100755
|
|
index 0000000..4916379
|
|
--- /dev/null
|
|
+++ b/drivers/video/hdmi/comps/tmdlHdmiCEC/cfg/tmdlHdmiCEC_Linux.c
|
|
@@ -0,0 +1,423 @@
|
|
+/*============================================================================*/
|
|
+/* INCLUDE FILES */
|
|
+/*============================================================================*/
|
|
+#include <linux/kernel.h>
|
|
+#include <linux/errno.h>
|
|
+#include <linux/string.h>
|
|
+#include <linux/types.h>
|
|
+#include <linux/i2c.h>
|
|
+#include <linux/delay.h>
|
|
+
|
|
+#include "tmdlHdmiCEC_IW.h"
|
|
+#include "tmNxTypes.h"
|
|
+#include "tmdlHdmiCEC.h"
|
|
+#include "tmdlHdmiCEC_cfg.h"
|
|
+
|
|
+struct i2c_client *get_this_i2c_client(void);
|
|
+unsigned char my_i2c_data[255];
|
|
+
|
|
+/*============================================================================*/
|
|
+/* MACROS */
|
|
+/*============================================================================*/
|
|
+#define RETIF(cond, rslt) if ((cond)){return (rslt);}
|
|
+#define I2C_M_WR 0
|
|
+
|
|
+/*============================================================================*/
|
|
+/* FUNCTIONS DECLARATIONS */
|
|
+/*============================================================================*/
|
|
+
|
|
+error_code_t i2c_read_function(dl_hdmi_cec_sys_args_t *p_sys_args);
|
|
+error_code_t i2c_write_function(dl_hdmi_cec_sys_args_t *p_sys_args);
|
|
+
|
|
+/*============================================================================*/
|
|
+/* CONSTANTS DECLARATIONS */
|
|
+/*============================================================================*/
|
|
+
|
|
+#define COMMAND_TASK_PRIORITY_0 250
|
|
+#define COMMAND_TASK_STACKSIZE_0 128
|
|
+#define COMMAND_TASK_QUEUESIZE_0 8
|
|
+
|
|
+/* I2C adress of the unit */
|
|
+#ifdef TMFL_TDA9996
|
|
+#define UNIT_I2C_ADDRESS_0 0x60 /* I2C Address of TDA9950 */
|
|
+#else
|
|
+#define UNIT_I2C_ADDRESS_0 0x34 /* I2C Address of TDA9950 */
|
|
+#endif
|
|
+
|
|
+/*============================================================================*/
|
|
+/* VARIABLES DECLARATIONS */
|
|
+/*============================================================================*/
|
|
+
|
|
+dl_hdmi_cec_capabilities_t ceccapabilities_list = {DL_HDMICEC_DEVICE_UNKNOWN, cec_version_1_3a};
|
|
+
|
|
+dl_hdmi_cec_driver_config_table_t cecdriver_config_table[MAX_UNITS] = {
|
|
+ {
|
|
+ COMMAND_TASK_PRIORITY_0,
|
|
+ COMMAND_TASK_STACKSIZE_0,
|
|
+ COMMAND_TASK_QUEUESIZE_0,
|
|
+ UNIT_I2C_ADDRESS_0,
|
|
+ i2c_read_function,
|
|
+ i2c_write_function,
|
|
+ &ceccapabilities_list
|
|
+ }
|
|
+};
|
|
+
|
|
+int blockwrite_reg(struct i2c_client *client,
|
|
+ u8 reg, u16 alength, u8 *val, u16 *out_len)
|
|
+{
|
|
+ int err = 0, i, initiator, receiver;
|
|
+ struct i2c_msg msg[1];
|
|
+
|
|
+ if(!client->adapter) {
|
|
+ dev_err(&client->dev, "<%s> ERROR: no HDMI device\n", __func__);
|
|
+ return -ENODEV;
|
|
+ }
|
|
+
|
|
+ msg->addr = client->addr;
|
|
+ msg->flags = I2C_M_WR;
|
|
+ msg->len = alength + 1;
|
|
+ msg->buf = my_i2c_data;
|
|
+
|
|
+ msg->buf[0] = reg;
|
|
+ for(i = 0; i < alength; i++) {
|
|
+ msg->buf[i+1] = val[i];
|
|
+ /* printk(KERN_INFO "buf[%d]=%d val[%d]=%d\n",i+1,msg->buf[i+1],i,val[i]); */
|
|
+ }
|
|
+
|
|
+ err = i2c_transfer(client->adapter, msg, 1);
|
|
+ udelay(50);
|
|
+
|
|
+ if(reg == 7) {
|
|
+ /* CEC message */
|
|
+ extern char *cec_opcode(int op);
|
|
+ initiator = (msg->buf[3] >> 4) & 0x0f;
|
|
+ receiver = msg->buf[3] & 0x0f;
|
|
+ /* printk(KERN_INFO "reg:%d alength:%d \n",reg, alength); */
|
|
+ if(alength == 3) {
|
|
+ printk(KERN_INFO "hdmicec:polling:[%x--->%x] \n", initiator, receiver);
|
|
+ } else {
|
|
+ printk(KERN_INFO "hdmicec:tx:[%x--->%x] %s %02x%02x%02x%02x\n", \
|
|
+ initiator, receiver, cec_opcode(msg->buf[4]), msg->buf[4], msg->buf[5], msg->buf[6], msg->buf[7]);
|
|
+ }
|
|
+ }
|
|
+ /* dev_dbg(&client->dev, "<%s> i2c Block write at 0x%x, " */
|
|
+ /* "*val=%d flags=%d byte[%d] err=%d\n", */
|
|
+ /* __func__, data[0], data[1], msg->flags, i, err); */
|
|
+ return (err < 0 ? err : 0);
|
|
+
|
|
+#if 0
|
|
+ int err = 0, i;
|
|
+ struct i2c_msg msg[1];
|
|
+ u8 data[2];
|
|
+
|
|
+ if(!client->adapter) {
|
|
+ dev_err(&client->dev, "<%s> ERROR: no HDMI device\n", __func__);
|
|
+ return -ENODEV;
|
|
+ }
|
|
+
|
|
+ msg->addr = client->addr;
|
|
+ msg->flags = I2C_M_WR;
|
|
+ msg->len = 2;
|
|
+ msg->buf = data;
|
|
+
|
|
+ /* high byte goes out first */
|
|
+ data[0] = reg >> 8;
|
|
+
|
|
+ for(i = 0; i < alength - 1; i++) {
|
|
+ data[1] = val[i];
|
|
+ err = i2c_transfer(client->adapter, msg, 1);
|
|
+ udelay(50);
|
|
+ dev_dbg(&client->dev, "<%s> i2c block write at 0x%x, "
|
|
+ "*val=%d flags=%d byte[%d] err=%d\n",
|
|
+ __func__, data[0], data[1], msg->flags, i, err);
|
|
+ if(err < 0)
|
|
+ break;
|
|
+ }
|
|
+ /* set the number of bytes written*/
|
|
+ *out_len = i;
|
|
+
|
|
+ if(err < 0) {
|
|
+ dev_err(&client->dev, "<%s> ERROR: i2c block write at 0x%x, "
|
|
+ "*val=%d flags=%d bytes written=%d "
|
|
+ "err=%d\n",
|
|
+ __func__, data[0], data[1], msg->flags, i, err);
|
|
+ return err;
|
|
+ }
|
|
+ return 0;
|
|
+#endif
|
|
+}
|
|
+
|
|
+int blockread_reg(struct i2c_client *client, u16 data_length,
|
|
+ u8 reg, u16 alength, u8 *val, u16 *out_len)
|
|
+{
|
|
+ int err = 0;
|
|
+ struct i2c_msg msg[1];
|
|
+ u8 data[2];
|
|
+
|
|
+ if(!client->adapter) {
|
|
+ dev_err(&client->dev, "<%s> ERROR: no HDMI device\n", __func__);
|
|
+ return -ENODEV;
|
|
+ }
|
|
+
|
|
+ msg->addr = client->addr;
|
|
+ msg->flags = I2C_M_WR;
|
|
+ msg->len = 1;
|
|
+ msg->buf = data;
|
|
+ data[0] = reg; /* High byte goes out first */
|
|
+ err = i2c_transfer(client->adapter, msg, 1);
|
|
+ if(err < 0) goto BLOCK_READ_OUPS;
|
|
+
|
|
+ msg->flags = I2C_M_RD;
|
|
+ msg->len = alength;
|
|
+ msg->buf = val;
|
|
+ err = i2c_transfer(client->adapter, msg, 1);
|
|
+ if(err < 0) goto BLOCK_READ_OUPS;
|
|
+
|
|
+ /* printk(KERN_INFO "DBG blockread_reg addr:%x len:%d buf:%02x%02x%02x%02x\n",msg->addr,msg->len,\ */
|
|
+ /* msg->buf[0],msg->buf[1],msg->buf[2],msg->buf[3]); */
|
|
+
|
|
+ return 0;
|
|
+
|
|
+BLOCK_READ_OUPS:
|
|
+ /* printk(KERN_INFO "DBG blockread_reg addr:%x len:%d ERROR\n",msg->addr,msg->len); */
|
|
+ dev_err(&client->dev, "<%s> ERROR: i2c read at 0x%x, "
|
|
+ "*val=%d flags=%d bytes err=%d\n",
|
|
+ __func__, reg, *val, msg->flags, err);
|
|
+ return err;
|
|
+
|
|
+#if 0
|
|
+ int err = 0, i;
|
|
+ struct i2c_msg msg[1];
|
|
+ u8 data[2];
|
|
+
|
|
+ if(!client->adapter) {
|
|
+ dev_err(&client->dev, "<%s> ERROR: no HDMI device\n", __func__);
|
|
+ return -ENODEV;
|
|
+ }
|
|
+
|
|
+ msg->addr = client->addr;
|
|
+ msg->flags = I2C_M_WR;
|
|
+ msg->len = 1;
|
|
+ msg->buf = data;
|
|
+
|
|
+ /* High byte goes out first */
|
|
+ data[0] = reg;
|
|
+
|
|
+ for(i = 0; i < alength; i++) {
|
|
+ err = i2c_transfer(client->adapter, msg, 1);
|
|
+ dev_dbg(&client->dev, "<%s> i2c block read1 at 0x%x, "
|
|
+ "*val=%d flags=%d err=%d\n",
|
|
+ __func__, data[0], data[1], msg->flags, err);
|
|
+ if(err >= 0) {
|
|
+ mdelay(3);
|
|
+ msg->flags = I2C_M_RD;
|
|
+ msg->len = data_length;
|
|
+ err = i2c_transfer(client->adapter, msg, 1);
|
|
+ } else
|
|
+ break;
|
|
+ if(err >= 0) {
|
|
+ val[i] = 0;
|
|
+ /* High byte comes first */
|
|
+ if(data_length == 1)
|
|
+ val[i] = data[0];
|
|
+ else if(data_length == 2)
|
|
+ val[i] = data[1] + (data[0] << 8);
|
|
+ dev_dbg(&client->dev, "<%s> i2c block read2 at 0x%x, "
|
|
+ "*val=%d flags=%d byte=%d "
|
|
+ "err=%d\n",
|
|
+ __func__, reg, val[i], msg->flags, i, err);
|
|
+ } else
|
|
+ break;
|
|
+ }
|
|
+ *out_len = i;
|
|
+ dev_info(&client->dev, "<%s> i2c block read at 0x%x, bytes read = %d\n",
|
|
+ __func__, reg, *out_len);
|
|
+
|
|
+ if(err < 0) {
|
|
+ dev_err(&client->dev, "<%s> ERROR: i2c read at 0x%x, "
|
|
+ "*val=%d flags=%d bytes read=%d err=%d\n",
|
|
+ __func__, reg, *val, msg->flags, i, err);
|
|
+ return err;
|
|
+ }
|
|
+ return 0;
|
|
+#endif
|
|
+}
|
|
+
|
|
+int write_reg(struct i2c_client *client, u8 reg, u8 val)
|
|
+{
|
|
+ int err = 0;
|
|
+ struct i2c_msg msg[1];
|
|
+ u8 data[2];
|
|
+ int retries = 0;
|
|
+
|
|
+ if(!client->adapter) {
|
|
+ dev_err(&client->dev, "<%s> ERROR: no HDMI device\n", __func__);
|
|
+ return -ENODEV;
|
|
+ }
|
|
+
|
|
+retry:
|
|
+ msg->addr = client->addr;
|
|
+ msg->flags = I2C_M_WR;
|
|
+ msg->len = 2;
|
|
+ msg->buf = data;
|
|
+
|
|
+ data[0] = reg;
|
|
+ data[1] = val;
|
|
+
|
|
+ err = i2c_transfer(client->adapter, msg, 1);
|
|
+ dev_dbg(&client->dev, "<%s> i2c write at=%x "
|
|
+ "val=%x flags=%d err=%d\n",
|
|
+ __func__, data[0], data[1], msg->flags, err);
|
|
+ udelay(50);
|
|
+
|
|
+ /* printk(KERN_INFO "DBG write_reg addr:%x reg:%d data:%x %s\n",msg->addr,reg,val,(err<0?"ERROR":"")); */
|
|
+ if(err >= 0)
|
|
+ return 0;
|
|
+
|
|
+ dev_err(&client->dev, "<%s> ERROR: i2c write at=%x "
|
|
+ "val=%x flags=%d err=%d\n",
|
|
+ __func__, data[0], data[1], msg->flags, err);
|
|
+ if(retries <= 5) {
|
|
+ dev_info(&client->dev, "retrying I2C... %d\n", retries);
|
|
+ retries++;
|
|
+ set_current_state(TASK_UNINTERRUPTIBLE);
|
|
+ schedule_timeout(msecs_to_jiffies(20));
|
|
+ goto retry;
|
|
+ }
|
|
+
|
|
+ return err;
|
|
+}
|
|
+
|
|
+int read_reg(struct i2c_client *client, u16 data_length, u8 reg, u8 *val)
|
|
+{
|
|
+ int err = 0;
|
|
+ struct i2c_msg msg[1];
|
|
+ u8 data[2];
|
|
+
|
|
+ if(!client->adapter) {
|
|
+ dev_err(&client->dev, "<%s> ERROR: no HDMI device\n", __func__);
|
|
+ return -ENODEV;
|
|
+ }
|
|
+
|
|
+ msg->addr = client->addr;
|
|
+ msg->flags = I2C_M_WR;
|
|
+ msg->len = 1;
|
|
+ msg->buf = data;
|
|
+
|
|
+ data[0] = reg;
|
|
+ err = i2c_transfer(client->adapter, msg, 1);
|
|
+ dev_dbg(&client->dev, "<%s> i2c read1 reg=%x val=%d "
|
|
+ "flags=%d err=%d\n",
|
|
+ __func__, reg, data[1], msg->flags, err);
|
|
+
|
|
+ if(err >= 0) {
|
|
+ mdelay(3);
|
|
+ msg->flags = I2C_M_RD;
|
|
+ msg->len = data_length;
|
|
+ err = i2c_transfer(client->adapter, msg, 1);
|
|
+ }
|
|
+
|
|
+ if(err >= 0) {
|
|
+ *val = 0;
|
|
+ if(data_length == 1)
|
|
+ *val = data[0];
|
|
+ else if(data_length == 2)
|
|
+ *val = data[1] + (data[0] << 8);
|
|
+ dev_dbg(&client->dev, "<%s> i2c read2 at 0x%x, *val=%d "
|
|
+ "flags=%d err=%d\n",
|
|
+ __func__, reg, *val, msg->flags, err);
|
|
+ return 0;
|
|
+ }
|
|
+
|
|
+ dev_err(&client->dev, "<%s> ERROR: i2c read at 0x%x, "
|
|
+ "*val=%d flags=%d err=%d\n",
|
|
+ __func__, reg, *val, msg->flags, err);
|
|
+ return err;
|
|
+}
|
|
+
|
|
+error_code_t i2c_read_function(dl_hdmi_cec_sys_args_t *p_sys_args)
|
|
+{
|
|
+ error_code_t err = 0;
|
|
+ u16 out_lenght = 0;
|
|
+ struct i2c_client *client = get_this_i2c_client();
|
|
+ u32 client_main_addr = client->addr;
|
|
+
|
|
+ /* DevLib needs address control, so let it be */
|
|
+ client->addr = p_sys_args->slave_addr;
|
|
+
|
|
+ if(p_sys_args->len_data == 1) {
|
|
+ /* single byte */
|
|
+ err = read_reg(get_this_i2c_client(), 1, p_sys_args->first_register, p_sys_args->p_data);
|
|
+ } else {
|
|
+ /* block */
|
|
+ err = blockread_reg(get_this_i2c_client(), 1, \
|
|
+ p_sys_args->first_register, \
|
|
+ p_sys_args->len_data, \
|
|
+ p_sys_args->p_data, &out_lenght);
|
|
+ }
|
|
+
|
|
+ /* restore default client address */
|
|
+ client->addr = client_main_addr;
|
|
+
|
|
+ return err;
|
|
+}
|
|
+
|
|
+error_code_t i2c_write_function(dl_hdmi_cec_sys_args_t *p_sys_args)
|
|
+{
|
|
+
|
|
+ error_code_t err = 0;
|
|
+ u16 out_lenght = 0;
|
|
+ struct i2c_client *client = get_this_i2c_client();
|
|
+ u32 client_main_addr = client->addr;
|
|
+
|
|
+ /* DevLib needs address control, so let it be */
|
|
+ client->addr = p_sys_args->slave_addr;
|
|
+
|
|
+ if(p_sys_args->len_data == 1) {
|
|
+ /* single byte */
|
|
+ err = write_reg(get_this_i2c_client(), p_sys_args->first_register, *p_sys_args->p_data);
|
|
+ } else {
|
|
+ /* block */
|
|
+ err = blockwrite_reg(get_this_i2c_client(), \
|
|
+ p_sys_args->first_register, \
|
|
+ p_sys_args->len_data, \
|
|
+ p_sys_args->p_data, &out_lenght);
|
|
+ }
|
|
+
|
|
+ /* restore default client address */
|
|
+ client->addr = client_main_addr;
|
|
+
|
|
+ return err;
|
|
+
|
|
+}
|
|
+
|
|
+error_code_t tx_iwwait
|
|
+(
|
|
+ u16 duration
|
|
+)
|
|
+{
|
|
+
|
|
+ mdelay((unsigned long)duration);
|
|
+
|
|
+ return(0);
|
|
+}
|
|
+
|
|
+error_code_t dl_hdmi_cec_cfg_get_config
|
|
+(
|
|
+ unit_select_t unit,
|
|
+ dl_hdmi_cec_driver_config_table_t *p_config
|
|
+)
|
|
+{
|
|
+ /* check if unit number is in range */
|
|
+ RETIF((unit < 0) || (unit >= MAX_UNITS), ERR_DLHDMICEC_BAD_UNIT_NUMBER)
|
|
+
|
|
+ /* check if pointer is NULL */
|
|
+ RETIF(p_config == NULL, ERR_DLHDMICEC_INCONSISTENT_PARAMS)
|
|
+
|
|
+ *p_config = cecdriver_config_table[unit];
|
|
+
|
|
+ return(0);
|
|
+};
|
|
+/*============================================================================*/
|
|
+/* END OF FILE */
|
|
+/*============================================================================*/
|
|
diff --git a/drivers/video/hdmi/comps/tmdlHdmiCEC/cfg/tmdlHdmiCEC_cfg.c b/drivers/video/hdmi/comps/tmdlHdmiCEC/cfg/tmdlHdmiCEC_cfg.c
|
|
new file mode 100755
|
|
index 0000000..7aee692
|
|
--- /dev/null
|
|
+++ b/drivers/video/hdmi/comps/tmdlHdmiCEC/cfg/tmdlHdmiCEC_cfg.c
|
|
@@ -0,0 +1,298 @@
|
|
+/**
|
|
+ * Copyright (C) 2006 NXP N.V., All Rights Reserved.
|
|
+ * This source code and any compilation or derivative thereof is the proprietary
|
|
+ * information of NXP N.V. and is confidential in nature. Under no circumstances
|
|
+ * is this software to be exposed to or placed under an Open Source License of
|
|
+ * any type without the expressed written permission of NXP N.V.
|
|
+ *
|
|
+ * \file dlHdmiCEC_cfg.c
|
|
+ *
|
|
+ * \version Revision: 1
|
|
+ *
|
|
+ * \date Date:
|
|
+ *
|
|
+ * \brief devlib driver component API for the CEC message
|
|
+ *
|
|
+ * \section refs Reference Documents
|
|
+ *
|
|
+ *
|
|
+ * \section info Change Information
|
|
+ *
|
|
+ * \verbatim
|
|
+ *
|
|
+ * History: dlHdmiCEC_cfg.c
|
|
+ *
|
|
+ *
|
|
+ * \endverbatim
|
|
+ *
|
|
+ * */
|
|
+
|
|
+/*============================================================================*/
|
|
+/* INCLUDE FILES */
|
|
+/*============================================================================*/
|
|
+#include "tmdlHdmiCEC_IW.h"
|
|
+#include "tmNxTypes.h"
|
|
+#include "tmdlHdmiCEC.h"
|
|
+#include "tmdlHdmiCEC_cfg.h"
|
|
+
|
|
+#ifdef TMFL_OS_WINDOWS /* OS Windows */
|
|
+#include "infra_i2c.h"
|
|
+#else /* OS ARM7 */
|
|
+#include "I2C.h"
|
|
+#include <LPC21xx.H>
|
|
+#endif /* endif TMFL_OS_WINDOWS */
|
|
+
|
|
+/******************************************************************************
|
|
+ ******************************************************************************
|
|
+ * THIS PART CAN BE MODIFIED BY CUSTOMER *
|
|
+ ******************************************************************************
|
|
+ *****************************************************************************/
|
|
+/*============================================================================*/
|
|
+/* INTERNAL PROTOTYPE */
|
|
+/*============================================================================*/
|
|
+
|
|
+#ifdef TMFL_OS_WINDOWS /* OS Windows */
|
|
+error_code_t windows_i2c_read_function(bsl_sys_args_t *p_sys_args);
|
|
+error_code_t windows_i2c_write_function(bsl_sys_args_t *p_sys_args);
|
|
+#else /* OS ARM7 */
|
|
+error_code_t rtx_i2c_read_function(dl_hdmi_cec_sys_args_t *p_sys_args);
|
|
+error_code_t rtx_i2c_write_function(dl_hdmi_cec_sys_args_t *p_sys_args);
|
|
+#endif /* endif TMFL_OS_WINDOWS */
|
|
+
|
|
+/*============================================================================*/
|
|
+/* MACRO */
|
|
+/*============================================================================*/
|
|
+
|
|
+/* macro for quick error handling */
|
|
+#define RETIF(cond, rslt) if ((cond)){return (rslt);}
|
|
+
|
|
+/*============================================================================*/
|
|
+/* TYPES DECLARATIONS */
|
|
+/*============================================================================*/
|
|
+
|
|
+/*============================================================================*/
|
|
+/* CONSTANTS DECLARATIONS */
|
|
+/*============================================================================*/
|
|
+
|
|
+/* Configuration for unit 0 *************************** */
|
|
+#ifdef TMFL_OS_WINDOWS /* OS Windows */
|
|
+#define COMMAND_TASK_PRIORITY_0 THREAD_PRIORITY_HIGHEST
|
|
+#else /* OS ARM7 */
|
|
+#define COMMAND_TASK_PRIORITY_0 250
|
|
+#endif /* endif TMFL_OS_WINDOWS */
|
|
+/* stack size of the command tasks */
|
|
+#define COMMAND_TASK_STACKSIZE_0 128
|
|
+/* size of the message queues for command tasks */
|
|
+#define COMMAND_TASK_QUEUESIZE_0 8
|
|
+/* I2C adress of the unit */
|
|
+#ifdef TMFL_TDA9996
|
|
+#define UNIT_I2C_ADDRESS_0 0x60 /* I2C Address of TDA9950 */
|
|
+#else
|
|
+#define UNIT_I2C_ADDRESS_0 0x34 /* I2C Address of TDA9950 */
|
|
+#endif
|
|
+
|
|
+/* Configuration for unit 1 *************************** */
|
|
+/* priority of the command tasks */
|
|
+#ifdef TMFL_OS_WINDOWS /* OS Windows */
|
|
+#define COMMAND_TASK_PRIORITY_1 THREAD_PRIORITY_HIGHEST
|
|
+#else /* OS ARM7 */
|
|
+#define COMMAND_TASK_PRIORITY_1 250
|
|
+#endif /* endif TMFL_OS_WINDOWS */
|
|
+/* stack size of the command tasks */
|
|
+#define COMMAND_TASK_STACKSIZE_1 128
|
|
+/* size of the message queues for command tasks */
|
|
+#define COMMAND_TASK_QUEUESIZE_1 8
|
|
+/* I2C adress of the unit */
|
|
+#ifdef TMFL_TDA9996
|
|
+#define UNIT_I2C_ADDRESS_1 0x60 /* I2C Address of TDA9950 */
|
|
+#else
|
|
+#define UNIT_I2C_ADDRESS_1 0x34 /* I2C Address of TDA9950 */
|
|
+#endif
|
|
+
|
|
+/*============================================================================*/
|
|
+/* DEFINES DECLARATIONS */
|
|
+/*============================================================================*/
|
|
+
|
|
+/*============================================================================*/
|
|
+/* VARIABLES DECLARATIONS */
|
|
+/*============================================================================*/
|
|
+
|
|
+/**
|
|
+ * \brief List of the capabilities to be enabled by the device library
|
|
+ * */
|
|
+dl_hdmi_cec_capabilities_t ceccapabilities_list = {DL_HDMICEC_DEVICE_UNKNOWN, cec_version_1_3a};
|
|
+
|
|
+/**
|
|
+ * \brief Configuration Tables. This table can be modified by the customer
|
|
+ * to choose its prefered configuration
|
|
+ * */
|
|
+
|
|
+#ifdef TMFL_OS_WINDOWS
|
|
+dl_hdmi_cec_driver_config_table_t cecdriver_config_table[MAX_UNITS] = {
|
|
+ {
|
|
+ COMMAND_TASK_PRIORITY_0,
|
|
+ COMMAND_TASK_STACKSIZE_0,
|
|
+ COMMAND_TASK_QUEUESIZE_0,
|
|
+ UNIT_I2C_ADDRESS_0,
|
|
+ windows_i2c_read_function,
|
|
+ windows_i2c_write_function,
|
|
+ &ceccapabilities_list
|
|
+ }
|
|
+};
|
|
+#else
|
|
+dl_hdmi_cec_driver_config_table_t cecdriver_config_table[MAX_UNITS] = {
|
|
+ {
|
|
+ COMMAND_TASK_PRIORITY_0,
|
|
+ COMMAND_TASK_STACKSIZE_0,
|
|
+ COMMAND_TASK_QUEUESIZE_0,
|
|
+ UNIT_I2C_ADDRESS_0,
|
|
+ rtx_i2c_read_function,
|
|
+ rtx_i2c_write_function,
|
|
+ &ceccapabilities_list
|
|
+ }
|
|
+};
|
|
+#endif
|
|
+
|
|
+#ifdef TMFL_OS_WINDOWS
|
|
+/*============================================================================*/
|
|
+/* FUNCTIONS */
|
|
+/*============================================================================*/
|
|
+
|
|
+/**
|
|
+ * \brief Write to BSL driver through I2C bus
|
|
+ *
|
|
+ * \param pSysArgs Pointer to the I2C read structure
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+error_code_t
|
|
+windows_i2c_read_function
|
|
+(
|
|
+ dl_hdmi_cec_sys_args_t *p_sys_args
|
|
+)
|
|
+{
|
|
+ error_code_t err;
|
|
+
|
|
+#ifdef TMFL_TDA9996
|
|
+ err = i2c_read(reg_tda_9996, (bsl_hdmi_sys_args_t *) p_sys_args);
|
|
+#else
|
|
+ err = i2c_read(reg_tda_9950, (bsl_hdmi_sys_args_t *) p_sys_args);
|
|
+#endif
|
|
+
|
|
+ return err;
|
|
+}
|
|
+/**
|
|
+ * \brief Write to BSL driver through I2C bus
|
|
+ *
|
|
+ * \param pSysArgs Pointer to the I2C write structure
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+error_code_t
|
|
+windows_i2c_write_function
|
|
+(
|
|
+ dl_hdmi_cec_sys_args_t *p_sys_args
|
|
+)
|
|
+{
|
|
+ error_code_t err;
|
|
+
|
|
+#ifdef TMFL_TDA9996
|
|
+ err = i2c_write(reg_tda_9996, (bsl_hdmi_sys_args_t *) p_sys_args);
|
|
+#else
|
|
+ err = i2c_write(reg_tda_9950, (bsl_hdmi_sys_args_t *) p_sys_args);
|
|
+#endif
|
|
+
|
|
+ return err;
|
|
+}
|
|
+#else
|
|
+
|
|
+/*============================================================================*/
|
|
+
|
|
+/**
|
|
+ * \brief Write to BSL driver through I2C bus
|
|
+ *
|
|
+ * \param pSysArgs Pointer to the I2C read structure
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+error_code_t
|
|
+rtx_i2c_read_function
|
|
+(
|
|
+ dl_hdmi_cec_sys_args_t *p_sys_args
|
|
+)
|
|
+{
|
|
+ error_code_t err;
|
|
+
|
|
+ err = i2c_read(reg_tda_9950, (bsl_hdmi_sys_args_t *) p_sys_args);
|
|
+
|
|
+ return err;
|
|
+}
|
|
+/**
|
|
+ * \brief Write to BSL driver through I2C bus
|
|
+ *
|
|
+ * \param pSysArgs Pointer to the I2C write structure
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+error_code_t
|
|
+rtx_i2c_write_function
|
|
+(
|
|
+ dl_hdmi_cec_sys_args_t *p_sys_args
|
|
+)
|
|
+{
|
|
+ error_code_t err;
|
|
+
|
|
+ err = i2c_write(reg_tda_9950, (bsl_hdmi_sys_args_t *) p_sys_args);
|
|
+
|
|
+ return err;
|
|
+}
|
|
+
|
|
+#endif
|
|
+
|
|
+/******************************************************************************
|
|
+ ******************************************************************************
|
|
+ * THIS PART MUST NOT BE MODIFIED BY CUSTOMER *
|
|
+ ******************************************************************************
|
|
+ *****************************************************************************/
|
|
+
|
|
+/**
|
|
+ * \brief This function allows to the main driver to retrieve its
|
|
+ * configuration parameters.
|
|
+ *
|
|
+ * \param pConfig Pointer to the config structure
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_UNIT_NUMBER: the unit number is wrong or
|
|
+ * the receiver instance is not initialised
|
|
+ * - ERR_DLHDMICEC_INCONSISTENT_PARAMS: an input parameter is
|
|
+ * inconsistent
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+error_code_t dl_hdmi_cec_cfg_get_config
|
|
+(
|
|
+ unit_select_t unit,
|
|
+ dl_hdmi_cec_driver_config_table_t *p_config
|
|
+)
|
|
+{
|
|
+ /* check if unit number is in range */
|
|
+ RETIF((unit < 0) || (unit >= MAX_UNITS), ERR_DLHDMICEC_BAD_UNIT_NUMBER)
|
|
+
|
|
+ /* check if pointer is NULL */
|
|
+ RETIF(p_config == NULL, ERR_DLHDMICEC_INCONSISTENT_PARAMS)
|
|
+
|
|
+ *p_config = cecdriver_config_table[unit];
|
|
+
|
|
+ return(0);
|
|
+};
|
|
+/*============================================================================*/
|
|
+/* END OF FILE */
|
|
+/*============================================================================*/
|
|
diff --git a/drivers/video/hdmi/comps/tmdlHdmiCEC/cfg/tmdlHdmiCEC_cfg.h b/drivers/video/hdmi/comps/tmdlHdmiCEC/cfg/tmdlHdmiCEC_cfg.h
|
|
new file mode 100755
|
|
index 0000000..56cdbb6
|
|
--- /dev/null
|
|
+++ b/drivers/video/hdmi/comps/tmdlHdmiCEC/cfg/tmdlHdmiCEC_cfg.h
|
|
@@ -0,0 +1,94 @@
|
|
+/**
|
|
+ * Copyright (C) 2006 NXP N.V., All Rights Reserved.
|
|
+ * This source code and any compilation or derivative thereof is the proprietary
|
|
+ * information of NXP N.V. and is confidential in nature. Under no circumstances
|
|
+ * is this software to be exposed to or placed under an Open Source License of
|
|
+ * any type without the expressed written permission of NXP N.V.
|
|
+ *
|
|
+ * \file dlHdmiCEC_cfg.h
|
|
+ *
|
|
+ * \version $Revision: 1 $
|
|
+ *
|
|
+ * \date $Date: $
|
|
+ *
|
|
+ * \brief devlib driver component API for the CEC messages
|
|
+ *
|
|
+ * \section refs Reference Documents
|
|
+ *
|
|
+ * \section info Change Information
|
|
+ *
|
|
+ * \verbatim
|
|
+ *
|
|
+ * $History: dlHdmiCEC_cfg.h
|
|
+ *
|
|
+ *
|
|
+ * \endverbatim
|
|
+ *
|
|
+ * */
|
|
+/******************************************************************************
|
|
+ ******************************************************************************
|
|
+ * THIS FILE MUST NOT BE MODIFIED BY CUSTOMER *
|
|
+ ******************************************************************************
|
|
+ *****************************************************************************/
|
|
+
|
|
+#ifndef DLHDMICEC_CFG_H
|
|
+#define DLHDMICEC_CFG_H
|
|
+
|
|
+#include "tmNxTypes.h"
|
|
+#include "tmdlHdmiCEC_Types.h"
|
|
+#include "tmdlHdmiCEC_Functions.h"
|
|
+
|
|
+/* Number of HW units supported by SW driver */
|
|
+#define MAX_UNITS 1
|
|
+
|
|
+#ifndef TMFL_CEC_AVAILABLE
|
|
+typedef struct _bsl_sys_args_t {
|
|
+ u8 slave_addr;
|
|
+ u8 first_register;
|
|
+ u8 len_data;
|
|
+ u8 *p_data;
|
|
+} bsl_sys_args_t;
|
|
+#endif
|
|
+
|
|
+/*============================================================================*/
|
|
+/* TYPES DECLARATIONS */
|
|
+/*============================================================================*/
|
|
+typedef struct {
|
|
+ u8 command_task_priority;
|
|
+ u8 command_task_stack_size;
|
|
+ u8 command_task_queue_size;
|
|
+ u8 i2c_address;
|
|
+ ptmdl_hdmi_cec_sys_func_t i2c_read_function;
|
|
+ ptmdl_hdmi_cec_sys_func_t i2c_write_function;
|
|
+ dl_hdmi_cec_capabilities_t *p_capabilities_list;
|
|
+} dl_hdmi_cec_driver_config_table_t;
|
|
+
|
|
+/*============================================================================*/
|
|
+/* FUNCTIONS DECLARATIONS */
|
|
+/*============================================================================*/
|
|
+
|
|
+/**
|
|
+ * \brief This function allows to the main driver to retrieve its
|
|
+ * configuration parameters.
|
|
+ *
|
|
+ * \param pConfig Pointer to the config structure
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_UNIT_NUMBER: the unit number is wrong or
|
|
+ * the receiver instance is not initialised
|
|
+ * - ERR_DLHDMICEC_INCONSISTENT_PARAMS: an input parameter is
|
|
+ * inconsistent
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+error_code_t dl_hdmi_cec_cfg_get_config
|
|
+(
|
|
+ unit_select_t unit,
|
|
+ dl_hdmi_cec_driver_config_table_t *p_config
|
|
+);
|
|
+
|
|
+#endif /* DLHDMICEC_CFG_H */
|
|
+
|
|
+/*============================================================================*/
|
|
+/* END OF FILE */
|
|
+/*============================================================================*/
|
|
diff --git a/drivers/video/hdmi/comps/tmdlHdmiCEC/cfg/tmdlHdmiCecCfg.def b/drivers/video/hdmi/comps/tmdlHdmiCEC/cfg/tmdlHdmiCecCfg.def
|
|
new file mode 100755
|
|
index 0000000..2c0cd60
|
|
--- /dev/null
|
|
+++ b/drivers/video/hdmi/comps/tmdlHdmiCEC/cfg/tmdlHdmiCecCfg.def
|
|
@@ -0,0 +1,16 @@
|
|
+LIBRARY tmdlHdmiCecCfg
|
|
+EXPORTS tmdlHdmiCecCfgGetConfig @1
|
|
+tmdlHdmiTxIWTaskCreate
|
|
+tmdlHdmiTxIWTaskDestroy
|
|
+tmdlHdmiTxIWTaskStart
|
|
+tmdlHdmiTxIWWait
|
|
+tmdlHdmiTxIWQueueCreate
|
|
+tmdlHdmiTxIWQueueDestroy
|
|
+tmdlHdmiTxIWQueueSend
|
|
+tmdlHdmiTxIWQueueReceive
|
|
+tmdlHdmiTxIWSemaphoreCreate
|
|
+tmdlHdmiTxIWSemaphoreDestroy
|
|
+tmdlHdmiTxIWSemaphoreP
|
|
+tmdlHdmiTxIWSemaphoreV
|
|
+tmdlHdmiTxIWDisableInterrupts
|
|
+tmdlHdmiTxIWEnableInterrupts
|
|
diff --git a/drivers/video/hdmi/comps/tmdlHdmiCEC/inc/tmdlHdmiCEC.h b/drivers/video/hdmi/comps/tmdlHdmiCEC/inc/tmdlHdmiCEC.h
|
|
new file mode 100755
|
|
index 0000000..0a54a48
|
|
--- /dev/null
|
|
+++ b/drivers/video/hdmi/comps/tmdlHdmiCEC/inc/tmdlHdmiCEC.h
|
|
@@ -0,0 +1,46 @@
|
|
+/*============================================================================= */
|
|
+/* Copyright (C) 2007 NXP N.V., All Rights Reserved. */
|
|
+/* This source code and any compilation or derivative thereof is the proprietary */
|
|
+/* information of NXP N.V. and is confidential in nature. Under no circumstances */
|
|
+/* is this software to be exposed to or placed under an Open Source License of */
|
|
+/* any type without the expressed written permission of NXP N.V. */
|
|
+/*============================================================================= */
|
|
+/*!
|
|
+ * \file dlHdmiCEC.h
|
|
+ *
|
|
+ * \version 1.0
|
|
+ *
|
|
+ * \date 04/07/2007
|
|
+ *
|
|
+ * \brief This provides interfaces description of CEC messages.
|
|
+ *
|
|
+ * \section refs Reference Documents
|
|
+ * TDA998X Driver - tx - SCS.doc
|
|
+ * \note None.
|
|
+ *
|
|
+ * HISTORY :
|
|
+ * \verbatim
|
|
+ * Date Modified by CRPRNr TASKNr Maintenance description
|
|
+ * -------------|-----------|-------|-------|-----------------------------------
|
|
+ * 04/07/2007 | F.G | | | Creation.
|
|
+ * -------------|-----------|-------|-------|-----------------------------------
|
|
+ * \endverbatim
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+
|
|
+#ifndef DLHDMICEC_H
|
|
+#define DLHDMICEC_H
|
|
+
|
|
+/*============================================================================*/
|
|
+/* INCLUDE FILES */
|
|
+/*============================================================================*/
|
|
+#include "tmNxCompId.h"
|
|
+#include "tmdlHdmiCEC_Types.h"
|
|
+#include "tmdlHdmiCEC_Functions.h"
|
|
+
|
|
+#endif /* DLHDMICEC_H */
|
|
+
|
|
+/*============================================================================*/
|
|
+/* END OF FILE */
|
|
+/*============================================================================*/
|
|
+
|
|
diff --git a/drivers/video/hdmi/comps/tmdlHdmiCEC/inc/tmdlHdmiCEC_Functions.h b/drivers/video/hdmi/comps/tmdlHdmiCEC/inc/tmdlHdmiCEC_Functions.h
|
|
new file mode 100755
|
|
index 0000000..7e9ecb9
|
|
--- /dev/null
|
|
+++ b/drivers/video/hdmi/comps/tmdlHdmiCEC/inc/tmdlHdmiCEC_Functions.h
|
|
@@ -0,0 +1,3147 @@
|
|
+/*============================================================================= */
|
|
+/* Copyright (C) 2007 NXP N.V., All Rights Reserved. */
|
|
+/* This source code and any compilation or derivative thereof is the proprietary */
|
|
+/* information of NXP N.V. and is confidential in nature. Under no circumstances */
|
|
+/* is this software to be exposed to or placed under an Open Source License of */
|
|
+/* any type without the expressed written permission of NXP N.V. */
|
|
+/*============================================================================= */
|
|
+/*!
|
|
+ * \file dlHdmiCEC_Functions.h
|
|
+ *
|
|
+ * \version 1.0
|
|
+ *
|
|
+ * \date 04/07/2007
|
|
+ *
|
|
+ * \brief This provides interfaces description of CEC messages.
|
|
+ *
|
|
+ * \section refs Reference Documents
|
|
+ * TDA998X Driver - dlHdmiCec - SCS.doc
|
|
+ * \note None.
|
|
+ *
|
|
+ * HISTORY :
|
|
+ * \verbatim
|
|
+ * Date Modified by CRPRNr TASKNr Maintenance description
|
|
+ * -------------|-----------|-------|-------|-----------------------------------
|
|
+ * 04/07/2007 | F.G | | | Creation.
|
|
+ * -------------|-----------|-------|-------|-----------------------------------
|
|
+ * \endverbatim
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+
|
|
+#ifndef DLHDMICEC_FUNCTIONS_H
|
|
+#define DLHDMICEC_FUNCTIONS_H
|
|
+
|
|
+/*============================================================================*/
|
|
+/* INCLUDE FILES */
|
|
+/*============================================================================*/
|
|
+
|
|
+#include "tmNxTypes.h"
|
|
+
|
|
+/*============================================================================*/
|
|
+/* PUBLIC FUNCTION DECLARATION */
|
|
+/*============================================================================*/
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \brief This message is reserved for testing purposes
|
|
+ *
|
|
+ * \param tmInstance_t Instance \n
|
|
+ * Instance identifier. \n
|
|
+ *
|
|
+ * \param u8 ReceiverLogicalAddress\n
|
|
+ * Address of message receiver. \n
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ *
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_abort_message
|
|
+(
|
|
+ instance_t instance,
|
|
+ u8 receiver_logical_address
|
|
+);
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \brief This message is used by a new source to indicate that it has started
|
|
+ * to transmit a stream OR used in reponse to a <Request Active Source>
|
|
+ *
|
|
+ * \param tmInstance_t Instance \n
|
|
+ * Instance identifier. \n
|
|
+ *
|
|
+ * \param u16 PhysicalAddress \n
|
|
+ * Physical address of the device.\n
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_BAD_PARAMETER: a parameter is invalid or out
|
|
+ * of range
|
|
+ * - ERR_DLHDMICEC_INCONSISTENT_PARAMS: an input parameter is
|
|
+ * inconsistent
|
|
+ *
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_active_source
|
|
+(
|
|
+ instance_t instance,
|
|
+ u16 physical_address
|
|
+);
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \brief This message is used to indicate the supported CEC version in response
|
|
+ * to a <Get CEC Version>
|
|
+ *
|
|
+ * \param tmInstance_t Instance \n
|
|
+ * Instance identifier. \n
|
|
+ *
|
|
+ * \param u8 ReceiverLogicalAddress\n
|
|
+ * Address of message receiver. \n
|
|
+ *
|
|
+ * \param dlHdmiCECVersion_t CECVersion \n
|
|
+ * Supported CEC Version.\n
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_BAD_PARAMETER: a parameter is invalid or out
|
|
+ * of range
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_version
|
|
+(
|
|
+ instance_t instance,
|
|
+ u8 receiver_logical_address,
|
|
+ dl_hdmi_cecversion_t cecversion
|
|
+);
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \brief This message is used to clear an Analogue timer block of a device
|
|
+ *
|
|
+ * \param tmInstance_t Instance \n
|
|
+ * Instance identifier. \n
|
|
+ *
|
|
+ * \param u8 ReceiverLogicalAddress \n
|
|
+ * Address of message receiver. \n
|
|
+ *
|
|
+ * \param u8 DayOfMonth \n
|
|
+ * Day of the month.\n
|
|
+ *
|
|
+ * \param u8 MonthOfYear \n
|
|
+ * Month of the year.\n
|
|
+ *
|
|
+ * \param u16 StartTime \n
|
|
+ * Start time for a timer based recording.\n
|
|
+ *
|
|
+ * \param u16 Duration \n
|
|
+ * Pointer to the structure dlHdmiCECDuration_t in BCD format.\n
|
|
+ *
|
|
+ * \param u8 Recording Sequence \n
|
|
+ * Indicates if recording is repeated and, if so, on which day
|
|
+ * For repeated recording the recording sequence value is the
|
|
+ * bitwise OR of the days when recordings are required
|
|
+ * Shall be set to 0x00 when recording is not repeated.\n
|
|
+ *
|
|
+ * \param dlHdmiCECAnalogueBroadcastType_t AnalogueBroadcastType \n
|
|
+ * "Cable,Sattellite,Terrestrial".\n
|
|
+ *
|
|
+ * \param u16 AnalogueFrequency \n
|
|
+ * Specify frequency used by analogue tuner (0x0000<=N<=0xFFFF).\n
|
|
+ *
|
|
+ * \param dlHdmiCECBroadcastSystem_t BroadcastSystem \n
|
|
+ * Specify information about the colour system, the sound carrier and
|
|
+ * the IF-frequency.\n
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_BAD_PARAMETER: a parameter is invalid or out
|
|
+ * of range
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_clear_analogue_timer
|
|
+(
|
|
+ instance_t instance,
|
|
+ u8 receiver_logical_address,
|
|
+ u8 day_of_month,
|
|
+ u8 month_of_year,
|
|
+ u16 start_time,
|
|
+ dl_hdmi_cecduration_t *p_duration,
|
|
+ u8 recording_sequence,
|
|
+ dl_hdmi_cecanalogue_broadcast_type_t analogue_broadcast_type,
|
|
+ u16 analogue_frequency,
|
|
+ dl_hdmi_cecbroadcast_system_t broadcast_system
|
|
+);
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \brief This message is used to clear a digital timer block of a device
|
|
+ *
|
|
+ * \param tmInstance_t Instance \n
|
|
+ * Instance identifier. \n
|
|
+ *
|
|
+ * \param u8 ReceiverLogicalAddress \n
|
|
+ * Address of message receiver. \n
|
|
+ *
|
|
+ * \param u8 DayOfMonth \n
|
|
+ * Day of the month.\n
|
|
+ *
|
|
+ * \param u8 MonthOfYear \n
|
|
+ * Month of the year.\n
|
|
+ *
|
|
+ * \param u16 StartTime \n
|
|
+ * Start time for a timer based recording.\n
|
|
+ *
|
|
+ * \param u16 Duration \n
|
|
+ * Pointer to the structure dlHdmiCECDuration_t in BCD format.\n
|
|
+ *
|
|
+ * \param u8 Recording Sequence \n
|
|
+ * Indicates if recording is repeated and, if so, on which day
|
|
+ * For repeated recording the recording sequence value is the
|
|
+ * bitwise OR of the days when recordings are required
|
|
+ * Shall be set to 0x00 when recording is not repeated.\n
|
|
+ *
|
|
+ * \param dlHdmiCECDigitalServiceIdentification_t *pServiceIdentification \n
|
|
+ * Pointer to the structure Digital Service Identification
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_BAD_PARAMETER: a parameter is invalid or out
|
|
+ * of range
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_clear_digital_timer
|
|
+(
|
|
+ instance_t instance,
|
|
+ u8 receiver_logical_address,
|
|
+ u8 day_of_month,
|
|
+ u8 month_of_year,
|
|
+ u16 start_time,
|
|
+ dl_hdmi_cecduration_t *p_duration,
|
|
+ u8 recording_sequence,
|
|
+ dl_hdmi_cecdigital_service_identification_t *p_service_identification
|
|
+);
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \brief This message is used to clear a digital timer block of a device
|
|
+ *
|
|
+ * \param tmInstance_t Instance \n
|
|
+ * Instance identifier. \n
|
|
+ *
|
|
+ * \param u8 ReceiverLogicalAddress \n
|
|
+ * Address of message receiver. \n
|
|
+ *
|
|
+ * \param u8 DayOfMonth \n
|
|
+ * Day of the month.\n
|
|
+ *
|
|
+ * \param u8 MonthOfYear \n
|
|
+ * Month of the year.\n
|
|
+ *
|
|
+ * \param u16 StartTime \n
|
|
+ * Start time for a timer based recording.\n
|
|
+ *
|
|
+ * \param u16 Duration \n
|
|
+ * Pointer to the structure dlHdmiCECDuration_t in BCD format.\n
|
|
+ *
|
|
+ * \param u8 Recording Sequence \n
|
|
+ * Indicates if recording is repeated and, if so, on which day
|
|
+ * For repeated recording the recording sequence value is the
|
|
+ * bitwise OR of the days when recordings are required
|
|
+ * Shall be set to 0x00 when recording is not repeated.\n
|
|
+ *
|
|
+ * \param dlHdmiCECExternalPlug_t ExternalPlug \n
|
|
+ * indicates external plug number (1 to 255 )on the recording device.\n
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_BAD_PARAMETER: a parameter is invalid or out
|
|
+ * of range
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_clear_external_timer_with_external_plug
|
|
+(
|
|
+ instance_t instance,
|
|
+ u8 receiver_logical_address,
|
|
+ u8 day_of_month,
|
|
+ u8 month_of_year,
|
|
+ u16 start_time,
|
|
+ dl_hdmi_cecduration_t *p_duration,
|
|
+ u8 recording_sequence,
|
|
+ dl_hdmi_cecexternal_plug_t external_plug
|
|
+);
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \brief This message is used to clear a digital timer block of a device
|
|
+ *
|
|
+ * \param tmInstance_t Instance \n
|
|
+ * Instance identifier. \n
|
|
+ *
|
|
+ * \param u8 ReceiverLogicalAddress \n
|
|
+ * Address of message receiver. \n
|
|
+ *
|
|
+ * \param u8 DayOfMonth \n
|
|
+ * Day of the month.\n
|
|
+ *
|
|
+ * \param u8 MonthOfYear \n
|
|
+ * Month of the year.\n
|
|
+ *
|
|
+ * \param u16 StartTime \n
|
|
+ * Start time for a timer based recording.\n
|
|
+ *
|
|
+ * \param u16 Duration \n
|
|
+ * Pointer to the structure dlHdmiCECDuration_t in BCD format.\n
|
|
+ *
|
|
+ * \param u8 Recording Sequence \n
|
|
+ * Indicates if recording is repeated and, if so, on which day
|
|
+ * For repeated recording the recording sequence value is the
|
|
+ * bitwise OR of the days when recordings are required
|
|
+ * Shall be set to 0x00 when recording is not repeated.\n
|
|
+ *
|
|
+ * \param dlHdmiCECExternalPhysicalAddress_t PhysicalAddress \n
|
|
+ * Defines the path between the TV an a device-thus giving it a physical
|
|
+ * address within the cluster.\n
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_BAD_PARAMETER: a parameter is invalid or out
|
|
+ * of range
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_clear_external_timer_with_physical_address
|
|
+(
|
|
+ instance_t instance,
|
|
+ u8 receiver_logical_address,
|
|
+ u8 day_of_month,
|
|
+ u8 month_of_year,
|
|
+ u16 start_time,
|
|
+ dl_hdmi_cecduration_t *p_duration,
|
|
+ u8 recording_sequence,
|
|
+ dl_hdmi_cecexternal_physical_address_t external_physical_address
|
|
+);
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \brief This message is used to conrol a device's media functions
|
|
+ *
|
|
+ * \param tmInstance_t Instance \n
|
|
+ * Instance identifier. \n
|
|
+ *
|
|
+ * \param dlHdmiCECDecControlMode_t DeckControlMode \n
|
|
+ * Used in message <Deck Control>\n
|
|
+ *
|
|
+ * \note The "Skip Forward / Wind" and "Skip Reverse / Rewind" values are
|
|
+ * used for example in a DVD as next xhapter and previous chapter and
|
|
+ * in a VCR as wind and rewind. \n
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_BAD_PARAMETER: a parameter is invalid or out
|
|
+ * of range
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_deck_control
|
|
+(
|
|
+ instance_t instance,
|
|
+ u8 receiver_logical_address,
|
|
+ dl_hdmi_cecdec_control_mode_t deck_control_mode
|
|
+);
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \brief This message is used to provide a deck's status to the initiator
|
|
+ * of the <Give Deck Status> message
|
|
+ *
|
|
+ * \param tmInstance_t Instance \n
|
|
+ * Instance identifier. \n
|
|
+ *
|
|
+ * \param dlHdmiCECDecInfo_t DeckInfo \n
|
|
+ * Information on the device's current status \n
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_BAD_PARAMETER: a parameter is invalid or out
|
|
+ * of range
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_deck_status
|
|
+(
|
|
+ instance_t instance,
|
|
+ u8 receiver_logical_address,
|
|
+ dl_hdmi_cecdec_info_t deck_info
|
|
+);
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \brief This message report the vendor ID of this device
|
|
+ *
|
|
+ * \param tmInstance_t Instance \n
|
|
+ * Instance identifier. \n
|
|
+ *
|
|
+ * \param u32 VendorID \n
|
|
+ * Indentifier for a specific Vendor \n
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_BAD_PARAMETER: a parameter is invalid or out
|
|
+ * of range
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_device_vendor_id
|
|
+(
|
|
+ instance_t instance,
|
|
+ u32 vendor_id
|
|
+);
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \brief This message is used as a reponse to indicate that the device does
|
|
+ * not support the requested message type, or that it cannot execute it
|
|
+ * at the present time.
|
|
+ *
|
|
+ * \param tmInstance_t Instance \n
|
|
+ * Instance identifier. \n
|
|
+ *
|
|
+ * \param dlHdmiCECFeatureOpcode_t FeatureOpcode \n
|
|
+ * Opcode of the aborted message. \n
|
|
+ *
|
|
+ * \param dlHdmiCECAbortReason_t AbortReason \n
|
|
+ * The reason why message cannot respond. \n
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_BAD_PARAMETER: a parameter is invalid or out
|
|
+ * of range
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_feature_abort
|
|
+(
|
|
+ instance_t instance,
|
|
+ u8 receiver_logical_address,
|
|
+ dl_hdmi_cecfeature_opcode_t feature_opcode,
|
|
+ dl_hdmi_cecabort_reason_t abort_reason
|
|
+);
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \brief This message is used by a device to enquire which version of CEC
|
|
+ * the target supports
|
|
+ *
|
|
+ * \param tmInstance_t Instance \n
|
|
+ * Instance identifier. \n
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ *
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_get_cec_version
|
|
+(
|
|
+ instance_t instance,
|
|
+ u8 receiver_logical_address
|
|
+);
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \brief This message is sent by a device capable of character generation
|
|
+ * (for OSD and Menus) to a TV in order to discover the currently selected
|
|
+ * Menu Language. Also used by a TV during installation to dicover the
|
|
+ * currently set menu language of other devices.
|
|
+ *
|
|
+ * \param tmInstance_t Instance \n
|
|
+ * Instance identifier. \n
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ *
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_get_menu_language
|
|
+(
|
|
+ instance_t instance,
|
|
+ u8 receiver_logical_address
|
|
+);
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \brief This message is requests an amplifier to send its volume and mute status
|
|
+ *
|
|
+ * \param tmInstance_t Instance \n
|
|
+ * Instance identifier. \n
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ *
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_give_audio_status
|
|
+(
|
|
+ instance_t instance,
|
|
+ u8 receiver_logical_address
|
|
+);
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \brief This message is used to request the status of a device regardless
|
|
+ * of whether or not it is the current active source.
|
|
+ *
|
|
+ * \param tmInstance_t Instance \n
|
|
+ * Instance identifier. \n
|
|
+ *
|
|
+ * \param dlHdmiCECStatusRequest_t StatusRequest \n
|
|
+ * Allows the initiator to request the status once or on all future state
|
|
+ * change. Or to cancel a previous <Give Deck Status > ["On"] request. \n
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ *
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_give_deck_status
|
|
+(
|
|
+ instance_t instance,
|
|
+ u8 receiver_logical_address,
|
|
+ dl_hdmi_cecstatus_request_t status_request
|
|
+);
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \brief This message is used to determine the current power status of a
|
|
+ * target device
|
|
+ *
|
|
+ * \param tmInstance_t Instance \n
|
|
+ * Instance identifier. \n
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ *
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_give_device_power_status
|
|
+(
|
|
+ instance_t instance,
|
|
+ u8 receiver_logical_address
|
|
+);
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \brief This message is request the vendor ID from a device
|
|
+ *
|
|
+ * \param tmInstance_t Instance \n
|
|
+ * Instance identifier. \n
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ *
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_give_device_vendor_id
|
|
+(
|
|
+ instance_t instance,
|
|
+ u8 receiver_logical_address
|
|
+);
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \brief This message is used to request preferred OSD name of a device
|
|
+ * for use in menus associated with that device
|
|
+ *
|
|
+ * \param tmInstance_t Instance \n
|
|
+ * Instance identifier. \n
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ *
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_give_osd_name
|
|
+(
|
|
+ instance_t instance,
|
|
+ u8 receiver_logical_address
|
|
+);
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \brief This message is a request to a device to return its physical Address
|
|
+ *
|
|
+ * \param tmInstance_t Instance \n
|
|
+ * Instance identifier. \n
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ *
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_give_physical_address
|
|
+(
|
|
+ instance_t instance,
|
|
+ u8 receiver_logical_address
|
|
+);
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \brief This message request the status of the system audio mode
|
|
+ *
|
|
+ * \param tmInstance_t Instance \n
|
|
+ * Instance identifier. \n
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ *
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_give_system_audio_mode_status
|
|
+(
|
|
+ instance_t instance,
|
|
+ u8 receiver_logical_address
|
|
+);
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \brief This message is used to request the status of a tuner device
|
|
+ *
|
|
+ * \param tmInstance_t Instance \n
|
|
+ * Instance identifier. \n
|
|
+ *
|
|
+ * \param dlHdmiCECStatusRequest_t StatusRequest \n
|
|
+ * Allows the initiator to request the status once or on all future state
|
|
+ * change. Or to cancel a previous <Give Tuner Device Status > ["On"] request. \n
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ *
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_give_tuner_device_status
|
|
+(
|
|
+ instance_t instance,
|
|
+ u8 receiver_logical_address,
|
|
+ dl_hdmi_cecstatus_request_t status_request
|
|
+);
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \brief This message sent by a source device to the TV whenever it enters
|
|
+ * the active state
|
|
+ *
|
|
+ * \param tmInstance_t Instance \n
|
|
+ * Instance identifier. \n
|
|
+ *
|
|
+ * \param u8 ReceiverLogicalAddress \n
|
|
+ * Address of message receivers. \n
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ *
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_image_view_on
|
|
+(
|
|
+ instance_t instance,
|
|
+ u8 receiver_logical_address
|
|
+);
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \brief This message is used by the currently active source to inform the
|
|
+ * TV that it has no video to be presented to the user, or is going
|
|
+ * into standby as the result of a lcoal user command on the device.
|
|
+ *
|
|
+ * \param tmInstance_t Instance \n
|
|
+ * Instance identifier. \n
|
|
+ *
|
|
+ * \param u8 ReceiverLogicalAddress, \n
|
|
+ * Address of message receiver. \n
|
|
+ *
|
|
+ * \param dlHdmiCECExternalPhysicalAddress_t PhysicalAddress \n
|
|
+ * Physical Address of the device. \n
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ *
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_inactive_source
|
|
+(
|
|
+ instance_t instance,
|
|
+ u8 receiver_logical_address,
|
|
+ dl_hdmi_cecexternal_physical_address_t physical_address
|
|
+);
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \brief This message request from the TV for a device to show/remove a
|
|
+ * menu or to query if a device is currently showing a menu
|
|
+ *
|
|
+ * \param tmInstance_t Instance \n
|
|
+ * Instance identifier. \n
|
|
+ *
|
|
+ * \param dlHdmiCECMenuRequestType_t MenuRequestType \n
|
|
+ * Indicates if the menu request is to activate or deactivate the
|
|
+ * devices menu or simply query the devices menu status. \n
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ *
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_menu_request
|
|
+(
|
|
+ instance_t instance,
|
|
+ u8 receiver_logical_address,
|
|
+ dl_hdmi_cecmenu_request_type_t menu_request_type
|
|
+);
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \brief This message is used to indicate to the TV that the device is
|
|
+ * showing/has removed a menu and requets the remote control keys to
|
|
+ * be passed though
|
|
+ *
|
|
+ * \param tmInstance_t Instance \n
|
|
+ * Instance identifier. \n
|
|
+ *
|
|
+ * \param dlHdmiCECMenuState_t MenuState \n
|
|
+ * Indicates if the device is in the 'Device Menu Active' state or
|
|
+ * 'Device Menu Inactive' state. \n
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ *
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_menu_status
|
|
+(
|
|
+ instance_t instance,
|
|
+ u8 receiver_logical_address,
|
|
+ dl_hdmi_cecmenu_state_t menu_state
|
|
+);
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \brief This message is used to control the playback behaviour of a source
|
|
+ * device
|
|
+ *
|
|
+ * \param tmInstance_t Instance \n
|
|
+ * Instance identifier. \n
|
|
+ *
|
|
+ * \param dlHdmiCECPlayMode_t PlayMode \n
|
|
+ * In which mode to play media. \n
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ *
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_play
|
|
+(
|
|
+ instance_t instance,
|
|
+ u8 receiver_logical_address,
|
|
+ dl_hdmi_cecplay_mode_t play_mode
|
|
+);
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \brief This message is used by any device for device discovery - similar to
|
|
+ * ping in other protocols
|
|
+ *
|
|
+ * \param tmInstance_t Instance \n
|
|
+ * Instance identifier. \n
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ *
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_polling_message
|
|
+(
|
|
+ instance_t instance,
|
|
+ u8 receiver_logical_address
|
|
+);
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \brief This message request a device to stop a recording
|
|
+ *
|
|
+ * \param tmInstance_t Instance \n
|
|
+ * Instance identifier. \n
|
|
+ *
|
|
+ * \param u8 ReceiverLogicalAddress \n
|
|
+ * Address of message receiver. \n
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ *
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_record_off
|
|
+(
|
|
+ instance_t instance,
|
|
+ u8 receiver_logical_address
|
|
+);
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \brief This message attempt to record analogue source
|
|
+ *
|
|
+ * \param tmInstance_t Instance \n
|
|
+ * Instance identifier. \n
|
|
+ *
|
|
+ * \param u8 ReceiverLogicalAddress \n
|
|
+ * Address of message receiver. \n
|
|
+ *
|
|
+ * \param dlHdmiCECAnalogueBroadcastType_t AnalogueBroadcastType \n
|
|
+ * "Cable,Sattellite,Terrestrial".\n
|
|
+ *
|
|
+ * \param u16 AnalogueFrequency \n
|
|
+ * Specify frequency used by analogue tuner (0x0000<=N<=0xFFFF).\n
|
|
+ *
|
|
+ * \param dlHdmiCECBroadcastSystem_t BroadcastSystem \n
|
|
+ * Specify information about the colour system, the sound carrier and
|
|
+ * the IF-frequency.\n
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ * - ERR_DLHDMICEC_BAD_PARAMETER: a parameter is invalid or out
|
|
+ * of range
|
|
+ *
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_record_on_analogue_service
|
|
+(
|
|
+ instance_t instance,
|
|
+ u8 receiver_logical_address,
|
|
+ dl_hdmi_cecanalogue_broadcast_type_t analogue_broadcast_type,
|
|
+ u16 analogue_frequency,
|
|
+ dl_hdmi_cecbroadcast_system_t broadcast_system
|
|
+);
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \brief This message attempt to record digital source
|
|
+ *
|
|
+ * \param tmInstance_t Instance \n
|
|
+ * Instance identifier. \n
|
|
+ *
|
|
+ * \param u8 ReceiverLogicalAddress \n
|
|
+ * Address of message receiver. \n
|
|
+ *
|
|
+ * \param dlHdmiCECDigitalServiceIdentification_t *pServiceIdentification \n
|
|
+ * Pointer to the structure Digital Service Identification
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ * - ERR_DLHDMICEC_BAD_PARAMETER: a parameter is invalid or out
|
|
+ * of range
|
|
+ *
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_record_on_digital_service
|
|
+(
|
|
+ instance_t instance,
|
|
+ u8 receiver_logical_address,
|
|
+ dl_hdmi_cecdigital_service_identification_t *p_service_identification
|
|
+);
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \brief This message attempt to record an external physical address source
|
|
+ *
|
|
+ * \param tmInstance_t Instance \n
|
|
+ * Instance identifier. \n
|
|
+ *
|
|
+ * \param u8 ReceiverLogicalAddress \n
|
|
+ * Address of message receiver. \n
|
|
+ *
|
|
+ * \param dlHdmiCECExternalPhysicalAddress_t PhysicalAddress \n
|
|
+ * Defines the path between the TV an a device-thus giving it a physical
|
|
+ * address within the cluster.\n
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ * - ERR_DLHDMICEC_BAD_PARAMETER: a parameter is invalid or out
|
|
+ * of range
|
|
+ *
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_record_on_external_physical_address
|
|
+(
|
|
+ instance_t instance,
|
|
+ u8 receiver_logical_address,
|
|
+ dl_hdmi_cecexternal_physical_address_t external_physical_address
|
|
+);
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \brief This message attempt to record an external plug source
|
|
+ *
|
|
+ * \param tmInstance_t Instance \n
|
|
+ * Instance identifier. \n
|
|
+ *
|
|
+ * \param u8 ReceiverLogicalAddress \n
|
|
+ * Address of message receiver. \n
|
|
+ *
|
|
+ * \param dlHdmiCECExternalPlug_t ExternalPlug \n
|
|
+ * indicates external plug number (1 to 255 )on the recording device.\n
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ * - ERR_DLHDMICEC_BAD_PARAMETER: a parameter is invalid or out
|
|
+ * of range
|
|
+ *
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_record_on_external_plug
|
|
+(
|
|
+ instance_t instance,
|
|
+ u8 receiver_logical_address,
|
|
+ dl_hdmi_cecexternal_plug_t external_plug
|
|
+);
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \brief This message attempt to record an external plug source
|
|
+ *
|
|
+ * \param tmInstance_t Instance \n
|
|
+ * Instance identifier. \n
|
|
+ *
|
|
+ * \param u8 ReceiverLogicalAddress \n
|
|
+ * Address of message receiver. \n
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ * - ERR_DLHDMICEC_BAD_PARAMETER: a parameter is invalid or out
|
|
+ * of range
|
|
+ *
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_record_on_own_source
|
|
+(
|
|
+ instance_t instance,
|
|
+ u8 receiver_logical_address
|
|
+);
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \brief This message is used by a recording device to inform the initiator
|
|
+ * of the message <Record On> about its status.
|
|
+ *
|
|
+ * \param tmInstance_t Instance \n
|
|
+ * Instance identifier. \n
|
|
+ *
|
|
+ * \param u8 ReceiverLogicalAddress \n
|
|
+ * Address of message receiver. \n
|
|
+ *
|
|
+ * \param dlHdmiCECRecordStatusInfo_t RecordStatusInfo \n
|
|
+ * The recording status of the device.\n
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ * - ERR_DLHDMICEC_BAD_PARAMETER: a parameter is invalid or out
|
|
+ * of range
|
|
+ *
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_record_status
|
|
+(
|
|
+ instance_t instance,
|
|
+ u8 receiver_logical_address,
|
|
+ dl_hdmi_cecrecord_status_info_t record_status_info
|
|
+);
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \brief This message request by the recording device to record the presently
|
|
+ * displayed source.
|
|
+ *
|
|
+ * \param tmInstance_t Instance \n
|
|
+ * Instance identifier. \n
|
|
+ *
|
|
+ * \param u8 ReceiverLogicalAddress \n
|
|
+ * Address of message receiver. \n
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ *
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_record_tv_screen
|
|
+(
|
|
+ instance_t instance,
|
|
+ u8 receiver_logical_address
|
|
+);
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \brief This message report an amplifier's volume and mute.
|
|
+ *
|
|
+ * \param tmInstance_t Instance \n
|
|
+ * Instance identifier. \n
|
|
+ *
|
|
+ * \param dlHdmiCECAudioStatus_t AudioStatus \n
|
|
+ * Volume and mute status. \n
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ * - ERR_DLHDMICEC_BAD_PARAMETER: a parameter is invalid or out
|
|
+ * of range
|
|
+ *
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_report_audio_status
|
|
+(
|
|
+ instance_t instance,
|
|
+ u8 receiver_logical_address,
|
|
+ ptmdl_hdmi_cecaudio_status_t p_audio_status
|
|
+);
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \fn tmErrorCode_t dlHdmiCecReportShortAudioDescriptor( )
|
|
+ * \brief This message Report Audio Capability.
|
|
+ *
|
|
+ * \param tmInstance_t Instance \n
|
|
+ * Instance identifier. \n
|
|
+ *
|
|
+ * \param u8 ReceiverLogicalAddress \n
|
|
+ * Address of message receiver. \n
|
|
+ *
|
|
+ * \param u32 ShortAudioDecriptor \n
|
|
+ * Audio Descriptor. \n
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ * - ERR_DLHDMICEC_BAD_PARAMETER: a parameter is invalid or out
|
|
+ * of range
|
|
+ *
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_report_short_audio_descriptor
|
|
+(
|
|
+ instance_t instance,
|
|
+ u8 receiver_logical_address,
|
|
+ u32 short_audio_decriptor
|
|
+);
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \fn tmErrorCode_t dlHdmiCecRequestShortAudioDescriptor( )
|
|
+ * \brief This message Request Audio Capability.
|
|
+ *
|
|
+ * \param tmInstance_t Instance \n
|
|
+ * Instance identifier. \n
|
|
+ *
|
|
+ * \param u8 ReceiverLogicalAddress \n
|
|
+ * Address of message receiver. \n
|
|
+ *
|
|
+ * \param u8 AudioFormatID \n
|
|
+ *
|
|
+ * \param u8 AudioFormatCode \n
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ * - ERR_DLHDMICEC_BAD_PARAMETER: a parameter is invalid or out
|
|
+ * of range
|
|
+ *
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_request_short_audio_descriptor
|
|
+(
|
|
+ instance_t instance,
|
|
+ u8 receiver_logical_address,
|
|
+ u8 audio_format_id,
|
|
+ u8 audio_format_code
|
|
+
|
|
+);
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \fn tmErrorCode_t dlHdmiCecIniateARC( )
|
|
+ * \brief This message Used by an ARC RX device to activate the
|
|
+ * ARC functionality in an ARC TX device
|
|
+ *
|
|
+ * \param tmInstance_t Instance \n
|
|
+ * Instance identifier. \n
|
|
+ *
|
|
+ * \param u8 ReceiverLogicalAddress \n
|
|
+ * Address of message receiver. \n
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ * - ERR_DLHDMICEC_BAD_PARAMETER: a parameter is invalid or out
|
|
+ * of range
|
|
+ *
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_iniate_arc
|
|
+(
|
|
+ instance_t instance,
|
|
+ u8 receiver_logical_address
|
|
+);
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \fn tmErrorCode_t dlHdmiCecReportArcInitiated( )
|
|
+ * \brief This message Used by an ARC TX device to indicate that
|
|
+ * its ARC functionality has been activated
|
|
+ *
|
|
+ * \param tmInstance_t Instance \n
|
|
+ * Instance identifier. \n
|
|
+ *
|
|
+ * \param u8 ReceiverLogicalAddress \n
|
|
+ * Address of message receiver. \n
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ * - ERR_DLHDMICEC_BAD_PARAMETER: a parameter is invalid or out
|
|
+ * of range
|
|
+ *
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_report_arc_initiated
|
|
+(
|
|
+ instance_t instance,
|
|
+ u8 receiver_logical_address
|
|
+);
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \fn tmErrorCode_t dlHdmiCecReportArcTerminated( )
|
|
+ * \brief This message Used by an ARC TX device to indicate that its ARC functionality
|
|
+ * has been deactivated.
|
|
+ *
|
|
+ * \param tmInstance_t Instance \n
|
|
+ * Instance identifier. \n
|
|
+ *
|
|
+ * \param u8 ReceiverLogicalAddress \n
|
|
+ * Address of message receiver. \n
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ * - ERR_DLHDMICEC_BAD_PARAMETER: a parameter is invalid or out
|
|
+ * of range
|
|
+ *
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_report_arc_terminated
|
|
+(
|
|
+ instance_t instance,
|
|
+ u8 receiver_logical_address
|
|
+);
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \fn tmErrorCode_t dlHdmiCecRequestArcInitiation( )
|
|
+ * \brief This message Used by an ARC TX device to request an ARC RX device to
|
|
+ * activate the ARC functionality in the ARC TX device.
|
|
+ *
|
|
+ * \param tmInstance_t Instance \n
|
|
+ * Instance identifier. \n
|
|
+ *
|
|
+ * \param u8 ReceiverLogicalAddress \n
|
|
+ * Address of message receiver. \n
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ * - ERR_DLHDMICEC_BAD_PARAMETER: a parameter is invalid or out
|
|
+ * of range
|
|
+ *
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_request_arc_initiation
|
|
+(
|
|
+ instance_t instance,
|
|
+ u8 receiver_logical_address
|
|
+);
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \fn tmErrorCode_t dlHdmiCecRequestArcTerminiation( )
|
|
+ * \brief Used by an ARC TX device to request an ARC RX device to deactivate
|
|
+ * the ARC functionality in the ARC TX device.
|
|
+ *
|
|
+ * \param tmInstance_t Instance \n
|
|
+ * Instance identifier. \n
|
|
+ *
|
|
+ * \param u8 ReceiverLogicalAddress \n
|
|
+ * Address of message receiver. \n
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ * - ERR_DLHDMICEC_BAD_PARAMETER: a parameter is invalid or out
|
|
+ * of range
|
|
+ *
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_request_arc_terminiation
|
|
+(
|
|
+ instance_t instance,
|
|
+ u8 receiver_logical_address
|
|
+);
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \fn tmErrorCode_t dlHdmiCecTerminateARC( )
|
|
+ * \brief Used by an ARC TX device to request an ARC RX device to deactivate
|
|
+ * the ARC functionality in the ARC TX device.
|
|
+ *
|
|
+ * \param tmInstance_t Instance \n
|
|
+ * Instance identifier. \n
|
|
+ *
|
|
+ * \param u8 ReceiverLogicalAddress \n
|
|
+ * Address of message receiver. \n
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ * - ERR_DLHDMICEC_BAD_PARAMETER: a parameter is invalid or out
|
|
+ * of range
|
|
+ *
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_terminate_arc
|
|
+(
|
|
+ instance_t instance,
|
|
+ u8 receiver_logical_address
|
|
+);
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \brief This message is used to inform all other devices of the mapping
|
|
+ * between physical and logical address of the initiator.
|
|
+ *
|
|
+ * \param tmInstance_t Instance \n
|
|
+ * Instance identifier. \n
|
|
+ *
|
|
+ * \param u16 PhysicalAddress \n
|
|
+ * Device physical address within the cluster. \n
|
|
+ *
|
|
+ * \param dlHdmiCECDeviceType_t DeviceType \n
|
|
+ * Type of the device (TV, Playback, tuner,...). \n
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ * - ERR_DLHDMICEC_BAD_PARAMETER: a parameter is invalid or out
|
|
+ * of range
|
|
+ *
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_report_physical_address
|
|
+(
|
|
+ instance_t instance,
|
|
+ u16 physical_address,
|
|
+ dl_hdmi_cecdevice_type_t device_type
|
|
+);
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \brief This message is used to inform a requesting device of the current
|
|
+ * power status.
|
|
+ *
|
|
+ * \param tmInstance_t Instance \n
|
|
+ * Instance identifier. \n
|
|
+ *
|
|
+ * \param dlHdmiCECPowerStatus_t PowerStatus \n
|
|
+ * Current power status. \n
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ * - ERR_DLHDMICEC_BAD_PARAMETER: a parameter is invalid or out
|
|
+ * of range
|
|
+ *
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_report_power_status
|
|
+(
|
|
+ instance_t instance,
|
|
+ u8 receiver_logical_address,
|
|
+ dl_hdmi_cecpower_status_t power_status
|
|
+);
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \brief This message is used by a new device to discover the status of
|
|
+ * the system.
|
|
+ *
|
|
+ * \param tmInstance_t Instance \n
|
|
+ * Instance identifier. \n
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ *
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_request_active_source
|
|
+(
|
|
+ instance_t instance
|
|
+);
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \brief This message is sent by a CEC switch when it is manually switched to
|
|
+ * inform all other devices on the network that the active route below
|
|
+ * the switch has changed.
|
|
+ *
|
|
+ * \param tmInstance_t Instance \n
|
|
+ * Instance identifier. \n
|
|
+ *
|
|
+ * \param u16 OriginalAddress \n
|
|
+ * Previous address that the switch was switched to. \n
|
|
+ *
|
|
+ * \param u16 NewAddress \n
|
|
+ * The new address it has been moved to. \n
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ * - ERR_DLHDMICEC_BAD_PARAMETER: a parameter is invalid or out
|
|
+ * of range
|
|
+ *
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_routing_change
|
|
+(
|
|
+ instance_t instance,
|
|
+ u16 original_address,
|
|
+ u16 new_address
|
|
+);
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \brief This message is sent by a CEC switch to indicate the active route
|
|
+ * below the switch.
|
|
+ *
|
|
+ * \param tmInstance_t Instance \n
|
|
+ * Instance identifier. \n
|
|
+ *
|
|
+ * \param u16 PhysicalAddress \n
|
|
+ * The current active route to the sink in the CEC switch. \n
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ * - ERR_DLHDMICEC_BAD_PARAMETER: a parameter is invalid or out
|
|
+ * of range
|
|
+ *
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_routing_information
|
|
+(
|
|
+ instance_t instance,
|
|
+ u16 physical_address
|
|
+);
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \brief This message select directly an analogue TV Service.
|
|
+ *
|
|
+ * \param tmInstance_t Instance \n
|
|
+ * Instance identifier. \n
|
|
+ *
|
|
+ * \param dlHdmiCECAnalogueBroadcastType_t AnalogueBroadcastType \n
|
|
+ * "Cable,Sattellite,Terrestrial".\n
|
|
+ *
|
|
+ * \param u16 AnalogueFrequency \n
|
|
+ * Specify frequency used by analogue tuner (0x0000<=N<=0xFFFF).\n
|
|
+ *
|
|
+ * \param dlHdmiCECBroadcastSystem_t BroadcastSystem \n
|
|
+ * Specify information about the colour system, the sound carrier and
|
|
+ * the IF-frequency.\n
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ * - ERR_DLHDMICEC_BAD_PARAMETER: a parameter is invalid or out
|
|
+ * of range
|
|
+ *
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_select_analogue_service
|
|
+(
|
|
+ instance_t instance,
|
|
+ u8 receiver_logical_address,
|
|
+ dl_hdmi_cecanalogue_broadcast_type_t analogue_broadcast_type,
|
|
+ u16 analogue_frequency,
|
|
+ dl_hdmi_cecbroadcast_system_t broadcast_system
|
|
+);
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \brief This message select directly a digital TV, Radio or Data Broadcast
|
|
+ * Service.
|
|
+ *
|
|
+ * \param tmInstance_t Instance \n
|
|
+ * Instance identifier. \n
|
|
+ *
|
|
+ * \param dlHdmiCECDigitalServiceIdentification_t *pServiceIdentification \n
|
|
+ * Pointer to the structure Digital Service Identification
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ * - ERR_DLHDMICEC_BAD_PARAMETER: a parameter is invalid or out
|
|
+ * of range
|
|
+ *
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_select_digital_service
|
|
+(
|
|
+ instance_t instance,
|
|
+ u8 receiver_logical_address,
|
|
+ ptmdl_hdmi_cecdigital_service_identification_t p_service_identification
|
|
+);
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \brief This message is used to set asingle timer block on an analogue
|
|
+ * recording device.
|
|
+ *
|
|
+ * \param tmInstance_t Instance \n
|
|
+ * Instance identifier. \n
|
|
+ *
|
|
+ * \param u8 ReceiverLogicalAddress \n
|
|
+ * Address of message receiver. \n
|
|
+ *
|
|
+ * \param u8 DayOfMonth \n
|
|
+ * Day of the month.\n
|
|
+ *
|
|
+ * \param u8 MonthOfYear \n
|
|
+ * Month of the year.\n
|
|
+ *
|
|
+ * \param u16 StartTime \n
|
|
+ * Start time for a timer based recording.\n
|
|
+ *
|
|
+ * \param u16 Duration \n
|
|
+ * Pointer to the structure dlHdmiCECDuration_t in BCD format.\n
|
|
+ *
|
|
+ * \param u8 Recording Sequence \n
|
|
+ * Indicates if recording is repeated and, if so, on which day
|
|
+ * For repeated recording the recording sequence value is the
|
|
+ * bitwise OR of the days when recordings are required
|
|
+ * Shall be set to 0x00 when recording is not repeated.\n
|
|
+ *
|
|
+ * \param dlHdmiCECAnalogueBroadcastType_t AnalogueBroadcastType \n
|
|
+ * "Cable,Sattellite,Terrestrial".\n
|
|
+ *
|
|
+ * \param u16 AnalogueFrequency \n
|
|
+ * Specify frequency used by analogue tuner (0x0000<=N<=0xFFFF).\n
|
|
+ *
|
|
+ * \param dlHdmiCECBroadcastSystem_t BroadcastSystem \n
|
|
+ * Specify information about the colour system, the sound carrier and
|
|
+ * the IF-frequency.\n
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_BAD_PARAMETER: a parameter is invalid or out
|
|
+ * of range
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_set_analogue_timer
|
|
+(
|
|
+ instance_t instance,
|
|
+ u8 receiver_logical_address,
|
|
+ u8 day_of_month,
|
|
+ u8 month_of_year,
|
|
+ u16 start_time,
|
|
+ dl_hdmi_cecduration_t *p_duration,
|
|
+ u8 recording_sequence,
|
|
+ dl_hdmi_cecanalogue_broadcast_type_t analogue_broadcast_type,
|
|
+ u16 analogue_frequency,
|
|
+ dl_hdmi_cecbroadcast_system_t broadcast_system
|
|
+);
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \brief This message is used to control audio rate from Source device.
|
|
+ *
|
|
+ * \param tmInstance_t Instance \n
|
|
+ * Instance identifier. \n
|
|
+ *
|
|
+ * \param dlHdmiCECAudioRate_t AudioRate \n
|
|
+ * The audio rate requested. \n
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ * - ERR_DLHDMICEC_BAD_PARAMETER: a parameter is invalid or out
|
|
+ * of range
|
|
+ *
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_set_audio_rate
|
|
+(
|
|
+ instance_t instance,
|
|
+ u8 receiver_logical_address,
|
|
+ dl_hdmi_cecaudio_rate_t audio_rate
|
|
+);
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \brief This message is used to set a digital timer block on a digital
|
|
+ * recording device
|
|
+ *
|
|
+ * \param tmInstance_t Instance \n
|
|
+ * Instance identifier. \n
|
|
+ *
|
|
+ * \param u8 ReceiverLogicalAddress \n
|
|
+ * Address of message receiver. \n
|
|
+ *
|
|
+ * \param u8 DayOfMonth \n
|
|
+ * Day of the month.\n
|
|
+ *
|
|
+ * \param u8 MonthOfYear \n
|
|
+ * Month of the year.\n
|
|
+ *
|
|
+ * \param u16 StartTime \n
|
|
+ * Start time for a timer based recording.\n
|
|
+ *
|
|
+ * \param u16 Duration \n
|
|
+ * Pointer to the structure dlHdmiCECDuration_t in BCD format.\n
|
|
+ *
|
|
+ * \param u8 Recording Sequence \n
|
|
+ * Indicates if recording is repeated and, if so, on which day
|
|
+ * For repeated recording the recording sequence value is the
|
|
+ * bitwise OR of the days when recordings are required
|
|
+ * Shall be set to 0x00 when recording is not repeated.\n
|
|
+ *
|
|
+ * \param dlHdmiCECDigitalServiceIdentification_t *pServiceIdentification \n
|
|
+ * Pointer to the structure Digital Service Identification
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_BAD_PARAMETER: a parameter is invalid or out
|
|
+ * of range
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_set_digital_timer
|
|
+(
|
|
+ instance_t instance,
|
|
+ u8 receiver_logical_address,
|
|
+ u8 day_of_month,
|
|
+ u8 month_of_year,
|
|
+ u16 start_time,
|
|
+ dl_hdmi_cecduration_t *p_duration,
|
|
+ u8 recording_sequence,
|
|
+ dl_hdmi_cecdigital_service_identification_t *p_service_identification
|
|
+);
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \brief This message is used to set a single timer block to record from an
|
|
+ * external device
|
|
+ *
|
|
+ * \param tmInstance_t Instance \n
|
|
+ * Instance identifier. \n
|
|
+ *
|
|
+ * \param u8 DayOfMonth \n
|
|
+ * Day of the month.\n
|
|
+ *
|
|
+ * \param u8 MonthOfYear \n
|
|
+ * Month of the year.\n
|
|
+ *
|
|
+ * \param u16 StartTime \n
|
|
+ * Start time for a timer based recording.\n
|
|
+ *
|
|
+ * \param u16 Duration \n
|
|
+ * Pointer to the structure dlHdmiCECDuration_t in BCD format.\n
|
|
+ *
|
|
+ * \param u8 Recording Sequence \n
|
|
+ * Indicates if recording is repeated and, if so, on which day
|
|
+ * For repeated recording the recording sequence value is the
|
|
+ * bitwise OR of the days when recordings are required
|
|
+ * Shall be set to 0x00 when recording is not repeated.\n
|
|
+ *
|
|
+ * \param dlHdmiCECExternalPlug_t ExternalPlug \n
|
|
+ * indicates external plug number (1 to 255 )on the recording device.\n
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_BAD_PARAMETER: a parameter is invalid or out
|
|
+ * of range
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_set_external_timer_with_external_plug
|
|
+(
|
|
+ instance_t instance,
|
|
+ u8 receiver_logical_address,
|
|
+ u8 day_of_month,
|
|
+ u8 month_of_year,
|
|
+ u16 start_time,
|
|
+ dl_hdmi_cecduration_t *p_duration,
|
|
+ u8 recording_sequence,
|
|
+ dl_hdmi_cecexternal_plug_t external_plug
|
|
+);
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \brief This message is used to set a single timer block to record from an
|
|
+ * external device
|
|
+ *
|
|
+ * \param tmInstance_t Instance \n
|
|
+ * Instance identifier. \n
|
|
+ *
|
|
+ * \param u8 DayOfMonth \n
|
|
+ * Day of the month.\n
|
|
+ *
|
|
+ * \param u8 MonthOfYear \n
|
|
+ * Month of the year.\n
|
|
+ *
|
|
+ * \param u16 StartTime \n
|
|
+ * Start time for a timer based recording.\n
|
|
+ *
|
|
+ * \param u16 Duration \n
|
|
+ * Pointer to the structure dlHdmiCECDuration_t in BCD format.\n
|
|
+ *
|
|
+ * \param u8 Recording Sequence \n
|
|
+ * Indicates if recording is repeated and, if so, on which day
|
|
+ * For repeated recording the recording sequence value is the
|
|
+ * bitwise OR of the days when recordings are required
|
|
+ * Shall be set to 0x00 when recording is not repeated.\n
|
|
+ *
|
|
+ * \param dlHdmiCECExternalPhysicalAddress_t PhysicalAddress \n
|
|
+ * Defines the path between the TV an a device-thus giving it a physical
|
|
+ * address within the cluster.\n
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_BAD_PARAMETER: a parameter is invalid or out
|
|
+ * of range
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_set_external_timer_with_physical_address
|
|
+(
|
|
+ instance_t instance,
|
|
+ u8 receiver_logical_address,
|
|
+ u8 day_of_month,
|
|
+ u8 month_of_year,
|
|
+ u16 start_time,
|
|
+ dl_hdmi_cecduration_t *p_duration,
|
|
+ u8 recording_sequence,
|
|
+ dl_hdmi_cecexternal_physical_address_t external_physical_address
|
|
+);
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \brief This message is used by a TV or another device to indicate the menu
|
|
+ * Language.
|
|
+ *
|
|
+ * \param tmInstance_t Instance \n
|
|
+ * Instance identifier. \n
|
|
+ *
|
|
+ * \param const char *pLanguage \n
|
|
+ * Pointer on the user's menu language choice. \n
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ * - ERR_DLHDMICEC_BAD_PARAMETER: a parameter is invalid or out
|
|
+ * of range
|
|
+ *
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_set_menu_language
|
|
+(
|
|
+ instance_t instance,
|
|
+ const char *p_language
|
|
+);
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \brief This message is used to set the preferred OSD name of a device
|
|
+ * for use in manus associated with that device.
|
|
+ *
|
|
+ * \param tmInstance_t Instance \n
|
|
+ * Instance identifier. \n
|
|
+ *
|
|
+ * \param const char *pOsdName \n
|
|
+ * Pointer on the preferred name of the device. \n
|
|
+ *
|
|
+ * \param u8 OsdNameLength \n
|
|
+ * Length of Osd Name String. \n
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ * - ERR_DLHDMICEC_BAD_PARAMETER: a parameter is invalid or out
|
|
+ * of range
|
|
+ *
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_set_osd_name
|
|
+(
|
|
+ instance_t instance,
|
|
+ u8 receiver_logical_address,
|
|
+ const char *p_osd_name,
|
|
+ u8 osd_name_length
|
|
+);
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \brief This message is used to send a test message to output on a TV.
|
|
+ *
|
|
+ * \param tmInstance_t Instance \n
|
|
+ * Instance identifier. \n
|
|
+ *
|
|
+ * \param dlHdmiCECDisplayControl_t DisplayControl \n
|
|
+ * Display timing. \n
|
|
+ *
|
|
+ * \param const char *pOsdString \n
|
|
+ * Pointer on the Text to display. \n
|
|
+ *
|
|
+ * \param u8 OsdStringLength \n
|
|
+ * Length of Osd String. \n
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ * - ERR_DLHDMICEC_BAD_PARAMETER: a parameter is invalid or out
|
|
+ * of range
|
|
+ *
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_set_osd_string
|
|
+(
|
|
+ instance_t instance,
|
|
+ u8 receiver_logical_address,
|
|
+ dl_hdmi_cecdisplay_control_t display_control,
|
|
+ const char *p_osd_string,
|
|
+ u8 osd_string_length
|
|
+);
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \brief This message is used by a TV to request a streaming path from
|
|
+ * the specified physical address.
|
|
+ *
|
|
+ * \param tmInstance_t Instance \n
|
|
+ * Instance identifier. \n
|
|
+ *
|
|
+ * \param u16 PhysicalAddress \n
|
|
+ * Physical address of the device.\n
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ * - ERR_DLHDMICEC_BAD_PARAMETER: a parameter is invalid or out
|
|
+ * of range
|
|
+ *
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_set_stream_path
|
|
+(
|
|
+ instance_t instance,
|
|
+ u16 physical_address
|
|
+);
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \brief This message turn the system audio Mode ON or OFF.
|
|
+ *
|
|
+ * \param tmInstance_t Instance \n
|
|
+ * Instance identifier. \n
|
|
+ *
|
|
+ * \param dlHdmiCECSystemAudioStatus_t SystemAudioStatus \n
|
|
+ * Specifies if the system audio mode is ON or OFF.\n
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ * - ERR_DLHDMICEC_BAD_PARAMETER: a parameter is invalid or out
|
|
+ * of range
|
|
+ *
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_set_system_audio_mode
|
|
+(
|
|
+ instance_t instance,
|
|
+ u8 receiver_logical_address,
|
|
+ dl_hdmi_cecsystem_audio_status_t system_audio_status
|
|
+);
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \brief This message is used to set the name of a program associated
|
|
+ * with a timer block.Sent directly after sending a
|
|
+ * <Set analogue Timer> or <Set Digital Timer> message. The name
|
|
+ * is then associated with that timer block.
|
|
+ *
|
|
+ * \param tmInstance_t Instance \n
|
|
+ * Instance identifier. \n
|
|
+ *
|
|
+ * \param u8 ReceiverLogicalAddress \n
|
|
+ * Address of message receiver. \n
|
|
+ *
|
|
+ * \param const char *pProgramTitleString \n
|
|
+ * Pointer on the program title. \n
|
|
+ *
|
|
+ * \param u8 ProgramTitleLength \n
|
|
+ * Length of Program Title String. \n
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ * - ERR_DLHDMICEC_BAD_PARAMETER: a parameter is invalid or out
|
|
+ * of range
|
|
+ *
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_set_timer_program_title
|
|
+(
|
|
+ instance_t instance,
|
|
+ u8 receiver_logical_address,
|
|
+ const char *p_program_title_string,
|
|
+ u8 program_title_length
|
|
+);
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \brief This message switches one or all devices into standby mode.Can be
|
|
+ * be used as a broadcast message o be addressed to a specific device.
|
|
+ *
|
|
+ * \param tmInstance_t Instance \n
|
|
+ * Instance identifier. \n
|
|
+ *
|
|
+ * \param u8 ReceiverLogicalAddress \n
|
|
+ * Address of message receiver. \n
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ * - ERR_DLHDMICEC_BAD_PARAMETER: a parameter is invalid or out
|
|
+ * of range
|
|
+ *
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_standby
|
|
+(
|
|
+ instance_t instance,
|
|
+ u8 receiver_logical_address
|
|
+);
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \brief A device implementing System Audio Control and which has volume
|
|
+ * control RC button(eg TV or STB) request to use System Audio Mode
|
|
+ * to the amplifier.
|
|
+ *
|
|
+ * \param tmInstance_t Instance \n
|
|
+ * Instance identifier. \n
|
|
+ *
|
|
+ * \param u16 PhysicalAddress \n
|
|
+ * Physical address of the device.\n
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ * - ERR_DLHDMICEC_BAD_PARAMETER: a parameter is invalid or out
|
|
+ * of range
|
|
+ *
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_system_audio_mode_request
|
|
+(
|
|
+ instance_t instance,
|
|
+ u8 receiver_logical_address,
|
|
+ u16 physical_address
|
|
+);
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \brief Reports the current status of the System Audio Mode.
|
|
+ *
|
|
+ * \param tmInstance_t Instance \n
|
|
+ * Instance identifier. \n
|
|
+ *
|
|
+ * \param dlHdmiCECSystemAudioStatus_t SystemAudioStatus \n
|
|
+ * Current system audio mode.\n
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ * - ERR_DLHDMICEC_BAD_PARAMETER: a parameter is invalid or out
|
|
+ * of range
|
|
+ *
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_system_audio_mode_status
|
|
+(
|
|
+ instance_t instance,
|
|
+ u8 receiver_logical_address,
|
|
+ dl_hdmi_cecsystem_audio_status_t system_audio_status
|
|
+);
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \brief This message as <Image View On>, but should also remove any text,
|
|
+ * menus and PIP windows from the TV's display
|
|
+ *
|
|
+ * \param tmInstance_t Instance \n
|
|
+ * Instance identifier. \n
|
|
+ *
|
|
+ * \param u8 ReceiverLogicalAddress \n
|
|
+ * Address of message receiver. \n
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ *
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_text_view_on
|
|
+(
|
|
+ instance_t instance,
|
|
+ u8 receiver_logical_address
|
|
+);
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \brief This message is used to give the status of a <Cleared Analogue Timer>,
|
|
+ * <Clear Digital Timer> or <Clear External Timer> message.
|
|
+ *
|
|
+ * \param tmInstance_t Instance \n
|
|
+ * Instance identifier. \n
|
|
+ *
|
|
+ * \param dlHdmiCECTimerClearedStatusData_t TimerClearedStatusData \n
|
|
+ * Indicates if the timer was cleared successfully. \n
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ *
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_timer_cleared_status
|
|
+(
|
|
+ instance_t instance,
|
|
+ u8 receiver_logical_address,
|
|
+ dl_hdmi_cectimer_cleared_status_data_t timer_cleared_status_data
|
|
+);
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \brief This message is used to send timer status to the initiator of a
|
|
+ * <Set Timer> message.
|
|
+ *
|
|
+ * \param tmInstance_t Instance \n
|
|
+ * Instance identifier. \n
|
|
+ *
|
|
+ * \param dlHdmiCECTimerStatusData_t *pTimerStatusData \n
|
|
+ * Pointer on the Timer status. \n
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ *
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_timer_status
|
|
+(
|
|
+ instance_t instance,
|
|
+ u8 receiver_logical_address,
|
|
+ dl_hdmi_cectimer_status_data_t *p_timer_status_data
|
|
+);
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \brief This message is used by a tuner device to provide its status to the
|
|
+ * initiator of the <Give Tuner Device Status> message.
|
|
+ *
|
|
+ * \param tmInstance_t Instance \n
|
|
+ * Instance identifier. \n
|
|
+ *
|
|
+ * \param dlHdmiCECRecordingFlag_t RecordingFlag \n
|
|
+ * Indicates if the tuner is being used as a source of a recording. \n
|
|
+ *
|
|
+ * \param dlHdmiCECTunerDisplayInfo_t TunerDisplayInfo \n
|
|
+ * Indicates if the the device is currently deplaying its tuner or not. \n
|
|
+ *
|
|
+ * \param dlHdmiCECAnalogueBroadcastType_t AnalogueBroadcastType \n
|
|
+ * "Cable,Sattellite,Terrestrial".\n
|
|
+ *
|
|
+ * \param u16 AnalogueFrequency \n
|
|
+ * Specify frequency used by analogue tuner (0x0000<=N<=0xFFFF).\n
|
|
+ *
|
|
+ * \param dlHdmiCECBroadcastSystem_t BroadcastSystem \n
|
|
+ * Specify information about the colour system, the sound carrier and
|
|
+ * the IF-frequency.\n
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ *
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_tuner_device_status_analogue
|
|
+(
|
|
+ instance_t instance,
|
|
+ u8 receiver_logical_address,
|
|
+ dl_hdmi_cecrecording_flag_t recording_flag,
|
|
+ dl_hdmi_cectuner_display_info_t tuner_display_info,
|
|
+ dl_hdmi_cecanalogue_broadcast_type_t analogue_broadcast_type,
|
|
+ u16 analogue_frequency,
|
|
+ dl_hdmi_cecbroadcast_system_t broadcast_system
|
|
+);
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \brief This message is used by a tuner device to provide its status to the
|
|
+ * initiator of the <Give Tuner Device Status> message.
|
|
+ *
|
|
+ * \param tmInstance_t Instance \n
|
|
+ * Instance identifier. \n
|
|
+ *
|
|
+ * \param dlHdmiCECRecordingFlag_t RecordingFlag \n
|
|
+ * Indicates if the tuner is being used as a source of a recording. \n
|
|
+ *
|
|
+ * \param dlHdmiCECTunerDisplayInfo_t TunerDisplayInfo \n
|
|
+ * Indicates if the the device is currently deplaying its tuner or not. \n
|
|
+ *
|
|
+ * \param dlHdmiCECDigitalServiceIdentification_t *pServiceIdentification \n
|
|
+ * Pointer to the structure Digital Service Identification
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ *
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_tuner_device_status_digital
|
|
+(
|
|
+ instance_t instance,
|
|
+ u8 receiver_logical_address,
|
|
+ dl_hdmi_cecrecording_flag_t recording_flag,
|
|
+ dl_hdmi_cectuner_display_info_t tuner_display_info,
|
|
+ ptmdl_hdmi_cecdigital_service_identification_t p_service_identification
|
|
+);
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \brief This message is used to tune to next lowest service in a tuner's
|
|
+ * service list.Can be used for PIP.
|
|
+ *
|
|
+ * \param tmInstance_t Instance \n
|
|
+ * Instance identifier. \n
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ *
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_tuner_step_decrement
|
|
+(
|
|
+ instance_t instance,
|
|
+ u8 receiver_logical_address
|
|
+);
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \brief This message is used to tune to next highest service in a tuner's
|
|
+ * service list.Can be used for PIP.
|
|
+ *
|
|
+ * \param tmInstance_t Instance \n
|
|
+ * Instance identifier. \n
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ *
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_tuner_step_increment
|
|
+(
|
|
+ instance_t instance,
|
|
+ u8 receiver_logical_address
|
|
+);
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \brief This message is used to indicate that the user pressed a remote button
|
|
+ * or switched from one remote control button to another.
|
|
+ *
|
|
+ * \param tmInstance_t Instance \n
|
|
+ * Instance identifier. \n
|
|
+ *
|
|
+ * \param dlHdmiCECUserRemoteControlCommand_t UICommand \n
|
|
+ * Relevant UI command issued by user. \n
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ *
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_user_control_pressed
|
|
+(
|
|
+ instance_t instance,
|
|
+ u8 receiver_logical_address,
|
|
+ dl_hdmi_cecuser_remote_control_command_t uicommand
|
|
+);
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \brief This message is used to indicate that the user pressed a remote button
|
|
+ * or switched from one remote control button to another.
|
|
+ *
|
|
+ * \param tmInstance_t Instance \n
|
|
+ * Instance identifier. \n
|
|
+ *
|
|
+ * \param dlHdmiCECPlayMode_t PlayMode \n
|
|
+ * In which mode to play media. \n
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ *
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_user_control_pressed_play
|
|
+(
|
|
+ instance_t instance,
|
|
+ u8 receiver_logical_address,
|
|
+ dl_hdmi_cecplay_mode_t play_mode
|
|
+);
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \brief This message is used to indicate that the user pressed a remote button
|
|
+ * or switched from one remote control button to another.
|
|
+ *
|
|
+ * \param tmInstance_t Instance \n
|
|
+ * Instance identifier. \n
|
|
+ *
|
|
+ * \param u8 SelectAudioInput \n
|
|
+ * Number of the Audio Input (Audio input number between 1 and 255). \n
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ *
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_user_control_pressed_select_audio_input
|
|
+(
|
|
+ instance_t instance,
|
|
+ u8 receiver_logical_address,
|
|
+ u8 select_audio_input
|
|
+);
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \brief This message is used to indicate that the user pressed a remote button
|
|
+ * or switched from one remote control button to another.
|
|
+ *
|
|
+ * \param tmInstance_t Instance \n
|
|
+ * Instance identifier. \n
|
|
+ *
|
|
+ * \param u8 SelectAVInput \n
|
|
+ * Number of the A/V Input (A/V input number between 1 and 255). \n
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ *
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_user_control_pressed_select_avinput
|
|
+(
|
|
+ instance_t instance,
|
|
+ u8 receiver_logical_address,
|
|
+ u8 select_avinput
|
|
+);
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \brief This message is used to indicate that the user pressed a remote button
|
|
+ * or switched from one remote control button to another.
|
|
+ *
|
|
+ * \param tmInstance_t Instance \n
|
|
+ * Instance identifier. \n
|
|
+ *
|
|
+ * \param u8 SelectMedia \n
|
|
+ * Number of Media (Media number between 1 and 255). \n
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ *
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_user_control_pressed_select_media
|
|
+(
|
|
+ instance_t instance,
|
|
+ u8 receiver_logical_address,
|
|
+ u8 select_media
|
|
+);
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \brief This message is used to indicate that the user pressed a remote button
|
|
+ * or switched from one remote control button to another.
|
|
+ *
|
|
+ * \param tmInstance_t Instance \n
|
|
+ * Instance identifier. \n
|
|
+ *
|
|
+ * \param dlHdmiCECChannelIdentifier_t *pChannelIdentifier \n
|
|
+ * Pointer to the structure of Major and Minor Channel number
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ *
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_user_control_pressed_tune
|
|
+(
|
|
+ instance_t instance,
|
|
+ u8 receiver_logical_address,
|
|
+ dl_hdmi_cecchannel_identifier_t *p_channel_identifier
|
|
+);
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \brief This message is used to indicate that the user released a remote button
|
|
+ * The last one indicated by the <User Control Pressed> Message.
|
|
+ *
|
|
+ * \param tmInstance_t Instance \n
|
|
+ * Instance identifier. \n
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ *
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_user_control_released
|
|
+(
|
|
+ instance_t instance,
|
|
+ u8 receiver_logical_address
|
|
+);
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \brief This message is allows vendor specific commands to be sent between
|
|
+ * two devices.
|
|
+ *
|
|
+ * \param tmInstance_t Instance \n
|
|
+ * Instance identifier. \n
|
|
+ *
|
|
+ * \param u8 *pVendorSpecificData \n
|
|
+ * Pointer to the Vendor Specific datas
|
|
+ *
|
|
+ * \param u8 VendorSpecificDataLength \n
|
|
+ * Length of VendorSpecificData. \n
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ *
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_vendor_command
|
|
+(
|
|
+ instance_t instance,
|
|
+ u8 receiver_logical_address,
|
|
+ u8 *p_vendor_specific_data,
|
|
+ u8 vendor_specific_data_length
|
|
+);
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \brief This message is allows vendor specific commands to be sent between
|
|
+ * two devices or broadcast.
|
|
+ *
|
|
+ * \param tmInstance_t Instance \n
|
|
+ * Instance identifier. \n
|
|
+ *
|
|
+ * \param u32 VendorID \n
|
|
+ * Indentifier for a specific Vendor \n
|
|
+ *
|
|
+ * \param u8 *pVendorSpecificData \n
|
|
+ * Pointer to the Vendor Specific datas
|
|
+ *
|
|
+ * \param u8 VendorSpecificDataLength \n
|
|
+ * Length of VendorSpecificData. \n
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ *
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_vendor_command_with_id
|
|
+(
|
|
+ instance_t instance,
|
|
+ u8 receiver_logical_address,
|
|
+ u32 vendor_id,
|
|
+ u8 *p_vendor_specific_data,
|
|
+ u8 vendor_specific_data_length
|
|
+);
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \brief This message indicates that a remote control button has been depressed.
|
|
+ *
|
|
+ * \param tmInstance_t Instance \n
|
|
+ * Instance identifier. \n
|
|
+ *
|
|
+ * \param u8 *pVendorSpecificRcCode \n
|
|
+ * Pointer to the Vendor Specific remote control code.
|
|
+ * its recommended t keep this to a minimum size.
|
|
+ * The maximum length shall not exceed 14 data blocks to avoid saturating bus
|
|
+ *
|
|
+ * \param u8 VendorSpecificRcCodeLength \n
|
|
+ * Length of VendorSpecificRcCode. \n
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ *
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_vendor_remote_button_down
|
|
+(
|
|
+ instance_t instance,
|
|
+ u8 receiver_logical_address,
|
|
+ u8 *p_vendor_specific_rc_code,
|
|
+ u8 vendor_specific_rc_code_length
|
|
+);
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \brief This message indicates that a remote control button (the last button
|
|
+ * pressed indicated by the <Vendor remote button down > message) has
|
|
+ * been released.
|
|
+ *
|
|
+ * \param tmInstance_t Instance \n
|
|
+ * Instance identifier. \n
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ *
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_vendor_remote_button_up
|
|
+(
|
|
+ instance_t instance,
|
|
+ u8 receiver_logical_address
|
|
+);
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \brief Get the software version of the driver.
|
|
+ * This function is synchronous.
|
|
+ * This function is ISR friendly.
|
|
+ *
|
|
+ * \param pSWVersion Pointer to the version structure
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_INCONSISTENT_PARAMS: an input parameter is
|
|
+ * inconsistent
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_get_swversion
|
|
+(
|
|
+ swversion_t *p_swversion
|
|
+);
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \brief Get the number of available CEC devices in the system.
|
|
+ * A unit directly represents a physical device.
|
|
+ * This function is synchronous.
|
|
+ * This function is ISR friendly.
|
|
+ *
|
|
+ * \param pUnitCount Pointer to the number of available units.
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_INCONSISTENT_PARAMS: an input parameter is
|
|
+ * inconsistent
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_get_number_of_units
|
|
+(
|
|
+ u32 *p_unit_count
|
|
+);
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \brief Get the capabilities of unit 0. Capabilities are stored into a
|
|
+ * dedicated structure.
|
|
+ * This function is synchronous.
|
|
+ * This function is not ISR friendly.
|
|
+ *
|
|
+ * \param pCapabilities Pointer to the capabilities structure.
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_UNIT_NUMBER: the unit number is wrong or
|
|
+ * the receiver instance is not initialised
|
|
+ * - ERR_DLHDMICEC_INCONSISTENT_PARAMS: an input parameter is
|
|
+ * inconsistent
|
|
+ * - ERR_DLHDMICEC_BAD_PARAMETER: a parameter is invalid or out
|
|
+ * of range
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_get_capabilities
|
|
+(
|
|
+ dl_hdmi_cec_capabilities_t *p_capabilities
|
|
+);
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \brief Get the capabilities of a specific unit. Capabilities are stored
|
|
+ * into a dedicated structure
|
|
+ * This function is synchronous.
|
|
+ * This function is not ISR friendly.
|
|
+ *
|
|
+ * \param unit Unit to be probed.
|
|
+ * \param pCapabilities Pointer to the capabilities structure.
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_UNIT_NUMBER: the unit number is wrong or
|
|
+ * the receiver instance is not initialised
|
|
+ * - ERR_DLHDMICEC_INCONSISTENT_PARAMS: an input parameter is
|
|
+ * inconsistent
|
|
+ * - ERR_DLHDMICEC_BAD_PARAMETER: a parameter is invalid or out
|
|
+ * of range
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_get_capabilities_m
|
|
+(
|
|
+ unit_select_t unit,
|
|
+ dl_hdmi_cec_capabilities_t *p_capabilities
|
|
+);
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \brief Open unit 0 of CEC driver and provides the instance number to
|
|
+ * the caller. Note that one unit of CEC represents one physical
|
|
+ * CEC device and that only one instance per unit can be opened.
|
|
+ * This function is synchronous.
|
|
+ * This function is not ISR friendly.
|
|
+ *
|
|
+ * \param pInstance Pointer to the variable that will receive the instance
|
|
+ * identifier.
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_UNIT_NUMBER: the unit number is wrong or
|
|
+ * the receiver instance is not initialised
|
|
+ * - ERR_DLHDMICEC_BAD_PARAMETER: a parameter is invalid or out
|
|
+ * of range
|
|
+ * - ERR_DLHDMICEC_RESOURCE_OWNED: the resource is already in use
|
|
+ * - ERR_DLHDMICEC_INIT_FAILED: the unit instance is already
|
|
+ * initialised or something wrong happened at lower level.
|
|
+ * - ERR_DLHDMICEC_INCONSISTENT_PARAMS: an input parameter is
|
|
+ * inconsistent
|
|
+ * - ERR_DLHDMICEC_NO_RESOURCES: the resource is not available
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_open
|
|
+(
|
|
+ instance_t *p_instance
|
|
+);
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \brief Open a specific unit of CEC driver and provides the instance
|
|
+ * number to the caller. Note that one unit of CEC represents one
|
|
+ * physical CEC device and that only one instance per unit can be
|
|
+ * opened.
|
|
+ * This function is synchronous.
|
|
+ * This function is not ISR friendly.
|
|
+ *
|
|
+ * \param pInstance Pointer to the structure that will receive the instance
|
|
+ * identifier.
|
|
+ * \param unit Unit number to be opened.
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_UNIT_NUMBER: the unit number is wrong or
|
|
+ * the receiver instance is not initialised
|
|
+ * - ERR_DLHDMICEC_BAD_PARAMETER: a parameter is invalid or out
|
|
+ * of range
|
|
+ * - ERR_DLHDMICEC_RESOURCE_OWNED: the resource is already in use
|
|
+ * - ERR_DLHDMICEC_INIT_FAILED: the unit instance is already
|
|
+ * initialised or something wrong happened at lower level.
|
|
+ * - ERR_DLHDMICEC_INCONSISTENT_PARAMS: an input parameter is
|
|
+ * inconsistent
|
|
+ * - ERR_DLHDMICEC_NO_RESOURCES: the resource is not available
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_open_m
|
|
+(
|
|
+ instance_t *p_instance,
|
|
+ unit_select_t unit
|
|
+);
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \brief Close an instance of CEC driver.
|
|
+ * This function is synchronous.
|
|
+ * This function is not ISR friendly.
|
|
+ *
|
|
+ * \param instance Instance identifier.
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_close
|
|
+(
|
|
+ instance_t instance
|
|
+);
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \brief Set the power state of an instance of the CEC device. ON
|
|
+ * state corresponds to a fully supplied, up and running device. Other
|
|
+ * modes correspond to the powerdown state of the device.
|
|
+ * This function is synchronous.
|
|
+ * This function is not ISR friendly.
|
|
+ *
|
|
+ * \param instance Instance identifier.
|
|
+ * \param powerState Power state to set.
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_BAD_PARAMETER: a parameter is invalid or out
|
|
+ * of range
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_set_power_state
|
|
+(
|
|
+ instance_t instance,
|
|
+ power_state_t power_state
|
|
+);
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \brief Get the power state of an instance of the CEC device. ON
|
|
+ * state corresponds to a fully supplied, up and running device. Other
|
|
+ * modes correspond to the powerdown state of the device.
|
|
+ * This function is synchronous.
|
|
+ * This function is not ISR friendly.
|
|
+ *
|
|
+ * \param instance Instance identifier.
|
|
+ * \param pPowerState Pointer to the power state.
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_BAD_PARAMETER: a parameter is invalid or out
|
|
+ * of range
|
|
+ * - ERR_DLHDMICEC_INCONSISTENT_PARAMS: an input parameter is
|
|
+ * inconsistent
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_get_power_state
|
|
+(
|
|
+ instance_t instance,
|
|
+ power_state_t *p_power_state
|
|
+);
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \brief Set the configuration of instance attributes. This function is
|
|
+ * required by DVP architecture rules but actually does nothing in this
|
|
+ * driver
|
|
+ * This function is synchronous.
|
|
+ * This function is ISR friendly.
|
|
+ *
|
|
+ * \param instance Instance identifier.
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_BAD_PARAMETER: a parameter is invalid or out
|
|
+ * of range
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_instance_config
|
|
+(
|
|
+ instance_t instance
|
|
+);
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \brief Setup the instance with its configuration parameters. This function
|
|
+ * allows basic instance configuration like Logical Address or device
|
|
+ * state.
|
|
+ * This function is synchronous.
|
|
+ * This function is not ISR friendly.
|
|
+ *
|
|
+ * \param instance Instance identifier.
|
|
+ * \param pSetupInfo Pointer to the structure containing all setup parameters
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_PARAMETER: a parameter is invalid or out
|
|
+ * of range
|
|
+ * - ERR_DLHDMICEC_INCONSISTENT_PARAMS: an input parameter is
|
|
+ * inconsistent
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_instance_setup
|
|
+(
|
|
+ instance_t instance,
|
|
+ ptmdl_hdmi_cec_instance_setup_t p_setup_info
|
|
+);
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \brief Get instance setup parameters.
|
|
+ *
|
|
+ * \param instance Instance identifier.
|
|
+ * \param pSetupInfo Pointer to the structure that will receive setup
|
|
+ * parameters
|
|
+ * This function is synchronous.
|
|
+ * This function is not ISR friendly.
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_INCONSISTENT_PARAMS: an input parameter is
|
|
+ * inconsistent
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_get_instance_setup
|
|
+(
|
|
+ instance_t instance,
|
|
+ ptmdl_hdmi_cec_instance_setup_t p_setup_info
|
|
+);
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \brief Make device library handle an incoming interrupt. This function is
|
|
+ * used by application to tell the device library that the hardware
|
|
+ * sent an interrupt. It can also be used to poll the interrupt status
|
|
+ * of the device if the interrupt line is not physically connected to
|
|
+ * the CPU.
|
|
+ * This function is synchronous.
|
|
+ * This function is ISR friendly.
|
|
+ *
|
|
+ * \param instance Instance identifier.
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_BAD_HANDLE: the handle number is wrong
|
|
+ * - ERR_DLHDMICEC_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ * - ERR_DLHDMICEC_FULL: the queue is full
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_handle_interrupt
|
|
+(
|
|
+ instance_t instance
|
|
+);
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \brief Register event callbacks. Only one callback is registered through
|
|
+ * this API. This callback will received the type of event that
|
|
+ * occured throug a dedicated parameter and will be called as many
|
|
+ * times as there is pending events.
|
|
+ * This function is synchronous.
|
|
+ * This function is ISR friendly.
|
|
+ *
|
|
+ * \param instance Instance identifier.
|
|
+ * \param pCallback Pointer to the callback function that will handle events
|
|
+ * from the devlib.
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ * - ERR_DLHDMICEC_INVALID_STATE: the state is invalid for
|
|
+ * the function
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_register_callbacks
|
|
+(
|
|
+ instance_t instance,
|
|
+ ptmdl_hdmi_cec_callback_func_t pk_callback
|
|
+);
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \fn tmErrorCode_t dlHdmiCecSetLogicalAddress( )
|
|
+ * \brief Set Device Logical Address
|
|
+ *
|
|
+ * \param instance Instance identifier.
|
|
+ * \param LogicalAddress Logical Address value.
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ *
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_set_logical_address
|
|
+(
|
|
+ instance_t instance,
|
|
+ dl_hdmi_ceclogical_address_t logical_address
|
|
+);
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \fn tmErrorCode_t dlHdmiCecSetRetry( )
|
|
+ * \brief Change the number of retransmission
|
|
+ *
|
|
+ * \param instance Instance identifier.
|
|
+ * \param NbRetry Number of retry.
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ *
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_set_retry
|
|
+(
|
|
+ instance_t instance,
|
|
+ u8 nb_retry
|
|
+);
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \fn tmErrorCode_t getCecLastMessage( )
|
|
+ * \brief Return the Addresses and the Opcode of the last CEC
|
|
+ * transmitted message
|
|
+ *
|
|
+ * \param pSaveMessage Pointer to the CEC Save Message
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ *
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t get_cec_last_message
|
|
+(
|
|
+ dl_hdmi_cec_save_message_t *p_save_message
|
|
+);
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \brief This function allows enabling a specific event of devlib.
|
|
+ * This function is synchronous.
|
|
+ * This function is not ISR friendly.
|
|
+ *
|
|
+ * \param instance Instance identifier.
|
|
+ * \param event Event to enable
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_BAD_PARAMETER: a parameter is invalid or out
|
|
+ * of range
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_enable_event
|
|
+(
|
|
+ instance_t instance,
|
|
+ dl_hdmi_cec_event_t event
|
|
+);
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \brief This function allows disabling a specific event of devlib.
|
|
+ * This function is synchronous.
|
|
+ * This function is not ISR friendly.
|
|
+ *
|
|
+ * \param instance Instance identifier.
|
|
+ * \param event Event to disable
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_BAD_PARAMETER: a parameter is invalid or out
|
|
+ * of range
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_disable_event
|
|
+(
|
|
+ instance_t instance,
|
|
+ dl_hdmi_cec_event_t event
|
|
+);
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \brief This function enables calibration depending on CEC clock source
|
|
+ * This function is synchronous.
|
|
+ * This function is not ISR friendly.
|
|
+ *
|
|
+ * \param instance Instance identifier.
|
|
+ * \param cecClockSource CEC clock source
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_BAD_PARAMETER: a parameter is invalid or out
|
|
+ * of range
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_enable_calibration
|
|
+(
|
|
+ instance_t instance,
|
|
+ dl_hdmi_cec_clock_source_t cec_clock_source
|
|
+);
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \brief This function disable calibration depending on CEC clock source
|
|
+ * This function is synchronous.
|
|
+ * This function is not ISR friendly.
|
|
+ *
|
|
+ * \param instance Instance identifier.
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_disable_calibration(
|
|
+ instance_t instance
|
|
+);
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \brief This function allow to send a generic CEC message
|
|
+ * This function has to be used when CEC messages are construct in
|
|
+ * the middleware
|
|
+ *
|
|
+ * \param instance Instance identifier.
|
|
+ *
|
|
+ * \param *pData Pointer to the CEC data buffer
|
|
+ *
|
|
+ * \param lenData Lenght of I2C data buffer
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_send_message(
|
|
+
|
|
+ instance_t instance,
|
|
+ u8 *p_data,
|
|
+ u16 len_data
|
|
+);
|
|
+
|
|
+unsigned char dl_hdmi_cec_get_register(instance_t instance, u32 offset);
|
|
+error_code_t dl_hdmi_cec_set_register(instance_t instance, u32 offset, u32 value);
|
|
+
|
|
+#endif /* DLHDMICEC_FUNCTIONS_H */
|
|
+
|
|
+/*============================================================================*/
|
|
+/* END OF FILE */
|
|
+/*============================================================================*/
|
|
+
|
|
diff --git a/drivers/video/hdmi/comps/tmdlHdmiCEC/inc/tmdlHdmiCEC_Types.h b/drivers/video/hdmi/comps/tmdlHdmiCEC/inc/tmdlHdmiCEC_Types.h
|
|
new file mode 100755
|
|
index 0000000..d9b99b7
|
|
--- /dev/null
|
|
+++ b/drivers/video/hdmi/comps/tmdlHdmiCEC/inc/tmdlHdmiCEC_Types.h
|
|
@@ -0,0 +1,1114 @@
|
|
+/*============================================================================= */
|
|
+/* Copyright (C) 2007 NXP N.V., All Rights Reserved. */
|
|
+/* This source code and any compilation or derivative thereof is the proprietary */
|
|
+/* information of NXP N.V. and is confidential in nature. Under no circumstances */
|
|
+/* is this software to be exposed to or placed under an Open Source License of */
|
|
+/* any type without the expressed written permission of NXP N.V. */
|
|
+/*============================================================================= */
|
|
+/*!
|
|
+ * \file dlHdmiCEC_Types.h
|
|
+ *
|
|
+ * \version 1.0
|
|
+ *
|
|
+ * \date 04/07/2007
|
|
+ *
|
|
+ * \brief This provides interfaces description of CEC messages.
|
|
+ *
|
|
+ * \section refs Reference Documents
|
|
+ * TDA998X Driver - tx - SCS.doc
|
|
+ * \note None.
|
|
+ *
|
|
+ * HISTORY :
|
|
+ * \verbatim
|
|
+ * Date Modified by CRPRNr TASKNr Maintenance description
|
|
+ * -------------|-----------|-------|-------|-----------------------------------
|
|
+ * 04/07/2007 | F.G | | | Creation.
|
|
+ * -------------|-----------|-------|-------|-----------------------------------
|
|
+ * \endverbatim
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+
|
|
+#ifndef DLHDMICEC_TYPES_H
|
|
+#define DLHDMICEC_TYPES_H
|
|
+
|
|
+/*============================================================================*/
|
|
+/* INCLUDE FILES */
|
|
+/*============================================================================*/
|
|
+
|
|
+#include "tmNxTypes.h"
|
|
+
|
|
+/*============================================================================*/
|
|
+/* MACRO DEFINITIONS */
|
|
+/*============================================================================*/
|
|
+
|
|
+/*============================================================================*/
|
|
+/* DEFINES */
|
|
+/*============================================================================*/
|
|
+
|
|
+/**< Error Codes */
|
|
+#define ERR_DLHDMICEC_BASE 0x100
|
|
+#define ERR_DLHDMICEC_COMPATIBILITY (ERR_DLHDMICEC_BASE + ERR_COMPATIBILITY) /**< SW Interface compatibility */
|
|
+#define ERR_DLHDMICEC_MAJOR_VERSION (ERR_DLHDMICEC_BASE + ERR_MAJOR_VERSION) /**< SW Major Version error */
|
|
+#define ERR_DLHDMICEC_COMP_VERSION (ERR_DLHDMICEC_BASE + ERR_COMP_VERSION) /**< SW component version error */
|
|
+#define ERR_DLHDMICEC_BAD_UNIT_NUMBER (ERR_DLHDMICEC_BASE + ERR_BAD_UNIT_NUMBER) /**< Invalid device unit number */
|
|
+#define ERR_DLHDMICEC_BAD_INSTANCE (ERR_DLHDMICEC_BASE + ERR_BAD_INSTANCE) /**< Bad input instance value */
|
|
+#define ERR_DLHDMICEC_BAD_HANDLE (ERR_DLHDMICEC_BASE + ERR_BAD_HANDLE) /**< Bad input handle */
|
|
+#define ERR_DLHDMICEC_BAD_PARAMETER (ERR_DLHDMICEC_BASE + ERR_BAD_PARAMETER) /**< Invalid input parameter */
|
|
+#define ERR_DLHDMICEC_NO_RESOURCES (ERR_DLHDMICEC_BASE + ERR_NO_RESOURCES) /**< Resource is not available */
|
|
+#define ERR_DLHDMICEC_RESOURCE_OWNED (ERR_DLHDMICEC_BASE + ERR_RESOURCE_OWNED) /**< Resource is already in use */
|
|
+#define ERR_DLHDMICEC_RESOURCE_NOT_OWNED (ERR_DLHDMICEC_BASE + ERR_RESOURCE_NOT_OWNED) /**< Caller does not own resource */
|
|
+#define ERR_DLHDMICEC_INCONSISTENT_PARAMS (ERR_DLHDMICEC_BASE + ERR_INCONSISTENT_PARAMS) /**< Inconsistent input params */
|
|
+#define ERR_DLHDMICEC_NOT_INITIALIZED (ERR_DLHDMICEC_BASE + ERR_NOT_INITIALIZED) /**< Component is not initialized */
|
|
+#define ERR_DLHDMICEC_NOT_SUPPORTED (ERR_DLHDMICEC_BASE + ERR_NOT_SUPPORTED) /**< Function is not supported */
|
|
+#define ERR_DLHDMICEC_INIT_FAILED (ERR_DLHDMICEC_BASE + ERR_INIT_FAILED) /**< Initialization failed */
|
|
+#define ERR_DLHDMICEC_BUSY (ERR_DLHDMICEC_BASE + ERR_BUSY) /**< Component is busy */
|
|
+#define ERR_DLHDMICEC_I2C_READ (ERR_DLHDMICEC_BASE + ERR_READ) /**< Read error */
|
|
+#define ERR_DLHDMICEC_I2C_WRITE (ERR_DLHDMICEC_BASE + ERR_WRITE) /**< Write error */
|
|
+#define ERR_DLHDMICEC_FULL (ERR_DLHDMICEC_BASE + ERR_FULL) /**< Queue is full */
|
|
+#define ERR_DLHDMICEC_NOT_STARTED (ERR_DLHDMICEC_BASE + ERR_NOT_STARTED) /**< Function is not started */
|
|
+#define ERR_DLHDMICEC_ALREADY_STARTED (ERR_DLHDMICEC_BASE + ERR_ALREADY_STARTED) /**< Function is already started */
|
|
+#define ERR_DLHDMICEC_ASSERTION (ERR_DLHDMICEC_BASE + ERR_ASSERTION) /**< Assertion failure */
|
|
+#define ERR_DLHDMICEC_INVALID_STATE (ERR_DLHDMICEC_BASE + ERR_INVALID_STATE) /**< Invalid state for function */
|
|
+#define ERR_DLHDMICEC_OPERATION_NOT_PERMITTED (ERR_DLHDMICEC_BASE + ERR_OPERATION_NOT_PERMITTED) /**< corresponds to posix EPERM */
|
|
+
|
|
+/*============================================================================*/
|
|
+/* ENUM OR TYPE DEFINITIONS */
|
|
+/*============================================================================*/
|
|
+
|
|
+/*!
|
|
+ * \enum dlHdmiCECAbortReason_t
|
|
+ * \brief This enum indicates the reason for a <Feature Abort> response
|
|
+ * */
|
|
+typedef enum {
|
|
+ CEC_ABORT_UNKNOWN_OPCODE = 0, /*!< Unrecognized opcode */
|
|
+ CEC_ABORT_INCORRECT_MODE = 1, /*!< Not in correct mode to respond */
|
|
+ CEC_ABORT_NO_SOURCE = 2, /*!< cannot provide source */
|
|
+ CEC_ABORT_INVALID_OPERAND = 3, /*!< Invalid operand */
|
|
+ CEC_ABORT_REFUSED = 4, /*!< Refused */
|
|
+ CEC_ABORT_UNABLE_TO_DETERMINE = 5 /*!< Unable to Determine */
|
|
+} dl_hdmi_cecabort_reason_t;
|
|
+
|
|
+/*!
|
|
+ * \enum dlHdmiCECAnalogueBroadcastType_t
|
|
+ * \brief This enum indicates the analogue broadcast type
|
|
+ * */
|
|
+typedef enum {
|
|
+ CEC_BROADCAST_TYPE_CABLE = 0x00, /*!< Cable */
|
|
+ CEC_BROADCAST_TYPE_SATELLITE = 0x01, /*!< Satellite*/
|
|
+ CEC_BROADCAST_TYPE_TERRESTRIAL = 0x02 /*!< Terrestrial */
|
|
+} dl_hdmi_cecanalogue_broadcast_type_t;
|
|
+
|
|
+/*!
|
|
+ * \enum _tmdlHdmiCECAnalogueFrequency
|
|
+ * \brief This enum specify the min and max frequency used by an analogue tuner
|
|
+ * */
|
|
+enum _tmdl_hdmi_cecanalogue_frequency {
|
|
+ CEC_ANALOG_FREQ_MIN = 0x0000, /*!< Min frequency used by analogue tuner */
|
|
+ CEC_ANALOG_FREQ_MAX = 0xFFFF /*!< Max frequency used by analogue tuner */
|
|
+};
|
|
+
|
|
+/*!
|
|
+ * \enum _tmdlHdmiCECAsciiDigit
|
|
+ * \brief This enum represent the min and max of a printable digit character
|
|
+ * */
|
|
+enum _tmdl_hdmi_cecascii_digit {
|
|
+ CEC_ASCII_DIGIT_MIN = 0x30, /*!< Min of a printable digit character */
|
|
+ CEC_ASCII_DIGIT_MAX = 0x39 /*!< Max of a printable digit character */
|
|
+};
|
|
+
|
|
+/*!
|
|
+ * \enum _tmdlHdmiCECAscii
|
|
+ * \brief This enum represent the min and max of a printable character
|
|
+ * */
|
|
+enum _tmbs_hdmi_cecascii {
|
|
+ CEC_ASCII_CHARACTER_MIN = 0x20, /*!< Min of a printable character */
|
|
+ CEC_ASCII_CHARACTER_MAX = 0x7E /*!< Max of a printable character */
|
|
+};
|
|
+
|
|
+/*!
|
|
+ * \enum _tmdlHdmiCECAudioFormatCode
|
|
+ * \brief This enum represent the min and max of a Audio Format Code is defined
|
|
+ * in CEA-861-D for CEA Short Audio Descriptor
|
|
+ * */
|
|
+enum _tmdl_hdmi_cecaudio_format_code {
|
|
+ CEC_AUDIO_FORMAT_CODE_MIN = 0x01, /*!< Min of a Audio Format Code */
|
|
+ CEC_AUDIO_FORMAT_CODE_MAX = 0x0F /*!< Max of a Audio Format Code */
|
|
+};
|
|
+
|
|
+/*!
|
|
+ * \enum dlHdmiCECAudioRate_t
|
|
+ * \brief This enum indicates the audio range control
|
|
+ * */
|
|
+typedef enum {
|
|
+ CEC_AUDIO_RATE_OFF = 0, /*!< Rate Control off */
|
|
+ /*!< Standard rate : 100% rate */
|
|
+ CEC_AUDIO_RATE_WIDE_RANGE_STANDARD_RATE = 1,
|
|
+ /*!< Fast rate : Max 101% rate */
|
|
+ CEC_AUDIO_RATE_WIDE_RANGE_FAST_RATE = 2,
|
|
+ /*!< Sloaw rate : 99% rate */
|
|
+ CEC_AUDIO_RATE_WIDE_RANGE_SLOW_RATE = 3,
|
|
+ /*!< Standard rate : 100% rate */
|
|
+ CEC_AUDIO_RATE_NARROW_RANGE_STANDARD_RATE = 4,
|
|
+ /*!< Fast rate : Max 101% rate */
|
|
+ CEC_AUDIO_RATE_NARROW_RANGE_FAST_RATE = 5,
|
|
+ /*!< Sloaw rate : 99% rate */
|
|
+ CEC_AUDIO_RATE_NARROW_RANGE_SLOW_RATE = 6
|
|
+} dl_hdmi_cecaudio_rate_t;
|
|
+
|
|
+/*!
|
|
+ * \enum dlHdmiCECAudioMute_t
|
|
+ * \brief This enum indicates the audio current audio mute status
|
|
+ * */
|
|
+typedef enum {
|
|
+ CEC_AUDIO_MUTE_OFF = 0, /*!< Audio Mute off */
|
|
+ CEC_AUDIO_MUTE_ON = 1 /*!< Audio Mute on */
|
|
+} dl_hdmi_cecaudio_mute_t;
|
|
+
|
|
+/*!
|
|
+ * \struct dlHdmiCECAudioStatus_t
|
|
+ * \brief This union indicates the current audio status of a device
|
|
+ * */
|
|
+typedef struct _tmdl_hdmi_cecaudio_status_t {
|
|
+ dl_hdmi_cecaudio_mute_t audio_mute_status ; /*!< Audio Mute Status */
|
|
+ u8 audio_volume_status ; /*!< Audio Volume Status */
|
|
+} dl_hdmi_cecaudio_status_t, *ptmdl_hdmi_cecaudio_status_t;
|
|
+
|
|
+/*!
|
|
+ * \enum dlHdmiCECBoolean_t
|
|
+ * \brief This enum indicates a Flag
|
|
+ * */
|
|
+typedef enum {
|
|
+ CEC_FALSE = 0, /*!< false */
|
|
+ CEC_TRUE = 1, /*!< true */
|
|
+} dl_hdmi_cecboolean_t;
|
|
+
|
|
+/*!
|
|
+ * \enum dlHdmiCECBroadcastSystem_t
|
|
+ * \brief This enum indicates information about the color system, the sound carrier and IF-frequency
|
|
+ * */
|
|
+typedef enum {
|
|
+ /*!< Sound / Sound Modulation / Video Modulation / Vertical Frequency / Color sub-carier */
|
|
+ /*!< 5.5MHZ / FM NEG 50HZ 4.43 MHZ */
|
|
+ CEC_BROADCAST_SYSTEM_PAL_BG = 0,
|
|
+ /*!< 6.5MHZ / AM POS 50HZ Fob 4.25MHz,For 4.406Mhz */
|
|
+ CEC_BROADCAST_SYSTEM_PAL_SECAM_L = 1,
|
|
+ /*!< 4.5MHZ / FM NEG 60HZ 3.5756 MHZ */
|
|
+ CEC_BROADCAST_SYSTEM_PAL_M = 2,
|
|
+ /*!< 4.5MHZ / FM NEG 60HZ 3.5795 MHZ */
|
|
+ CEC_BROADCAST_SYSTEM_NTSC_M = 3,
|
|
+ /*!< 6.0MHZ / FM NEG 50HZ 4.43 MHZ */
|
|
+ CEC_BROADCAST_SYSTEM_PAL_I = 4,
|
|
+ /*!< 6.5MHZ / FM NEG 50HZ Fob 4.25MHz,For 4.406Mhz */
|
|
+ CEC_BROADCAST_SYSTEM_SECAM_DK = 5,
|
|
+ /*!< 5.5MHZ / FM NEG 50HZ Fob 4.25MHz,For 4.406Mhz */
|
|
+ CEC_BROADCAST_SYSTEM_SECAM_BG = 6,
|
|
+ /*!< 6.5MHZ / AM POS 50HZ Fob 4.25MHz,For 4.406Mhz */
|
|
+ CEC_BROADCAST_SYSTEM_SECAM_L = 7,
|
|
+ /*!< 5.5MHZ / FM NEG 50HZ 4.43MHZ */
|
|
+ CEC_BROADCAST_SYSTEM_PAL_DK = 8,
|
|
+ CEC_BROADCAST_SYSTEM_FUTURE_USE = 9, /*!< Future Use */
|
|
+ CEC_BROADCAST_SYSTEM_OTHER_SYSTEM = 31 /*!< Other System */
|
|
+} dl_hdmi_cecbroadcast_system_t;
|
|
+
|
|
+/*!
|
|
+ * \enum dlHdmiCECVersion_t
|
|
+ * \brief This enum indicates the supported CEC version
|
|
+ * */
|
|
+typedef enum {
|
|
+ cec_version_reserved = 0x00, /*!< CEC Reserved */
|
|
+ cec_version_reserved1 = 0x01, /*!< CEC Reserved */
|
|
+ cec_version_reserved2 = 0x02, /*!< CEC Reserved */
|
|
+ cec_version_reserved3 = 0x03, /*!< CEC Reserved */
|
|
+ cec_version_1_3a = 0x04, /*!< CEC Version 1.3a */
|
|
+ CEC_VERSION_1_4 = 0x05 /*!< CEC Version 1.4 */
|
|
+} dl_hdmi_cecversion_t;
|
|
+
|
|
+/*!
|
|
+ * \enum dlHdmiCECChanNumFormat_t
|
|
+ * \brief This enum indicates the Channel Format
|
|
+ * */
|
|
+typedef enum {
|
|
+ CEC_FIRST_CHAN_NUMBER = 0x01, /*!< 1-part channel number */
|
|
+ CEC_SECOND_CHAN_NUMBER = 0x02 /*!< 2-part channel number */
|
|
+} dl_hdmi_cecchan_num_format_t;
|
|
+
|
|
+/*!
|
|
+ * \struct dlHdmiCECChannelIdentifier_t
|
|
+ * \brief This struct indicates a 1-part Logical or Virtual Channel Number or
|
|
+ * a 2-part Major and Minor channel combination
|
|
+ * */
|
|
+typedef struct {
|
|
+ dl_hdmi_cecchan_num_format_t chan_num_format ; /*!< Channel Format */
|
|
+ /*!< Major Channel Number (if channel is 2-part) */
|
|
+ u16 major_chan_number ;
|
|
+ /*!< 1-part Channel Number ,or a Minor Channel Number (if channel is 2-part) */
|
|
+ u16 minor_chan_number ;
|
|
+} dl_hdmi_cecchannel_identifier_t ;
|
|
+
|
|
+/*!
|
|
+ * \enum dlHdmiCECDayOfMonth_t
|
|
+ * \brief This enum indicates the day of the month
|
|
+ * */
|
|
+typedef enum {
|
|
+ CEC_FIRST_DAY_OF_MONTH = 1, /*!< First day of the month */
|
|
+ CEC_LAST_DAY_OF_MONTH = 31 /*!< Last day of the month */
|
|
+} dl_hdmi_cecday_of_month_t;
|
|
+
|
|
+/*!
|
|
+ * \enum dlHdmiCECDecControlMode_t
|
|
+ * \brief This enum indicates command used for opcode <Deck Control>
|
|
+ * */
|
|
+typedef enum {
|
|
+ CEC_DECK_CONTROL_WIND = 1, /*!< Skip Forward / Wind */
|
|
+ CEC_DECK_CONTROL_REWIND = 2, /*!< Skip Reverse / Rewind */
|
|
+ CEC_DECK_CONTROL_STOP = 3, /*!< Stop */
|
|
+ CEC_DECK_CONTROL_EJECT = 4 /*!< Eject */
|
|
+} dl_hdmi_cecdec_control_mode_t;
|
|
+
|
|
+/*!
|
|
+ * \enum dlHdmiCECDecInfo_t
|
|
+ * \brief This enum indicates the current status of a tape or disk deck
|
|
+ * */
|
|
+typedef enum {
|
|
+ CEC_DECK_INFO_PLAY = 0x11, /*!< Play */
|
|
+ CEC_DECK_INFO_RECORD = 0x12, /*!< Record */
|
|
+ CEC_DECK_INFO_PLAY_REVERSE = 0x13, /*!< Play Reverse */
|
|
+ CEC_DECK_INFO_STILL = 0x14, /*!< Still */
|
|
+ CEC_DECK_INFO_SLOW = 0x15, /*!< Slow */
|
|
+ CEC_DECK_INFO_SLOW_REVERSE = 0x16, /*!< Slow Reverse */
|
|
+ CEC_DECK_INFO_FAST_FORWARD = 0x17, /*!< Fast Forward */
|
|
+ CEC_DECK_INFO_FAST_REVERSE = 0x18, /*!< Fast Reverse */
|
|
+ CEC_DECK_INFO_NO_MEDIA = 0x19, /*!< No Media */
|
|
+ CEC_DECK_INFO_STOP = 0x1A, /*!< Stop */
|
|
+ CEC_DECK_INFO_WIND = 0x1B, /*!< Skip Forward / Wind */
|
|
+ CEC_DECK_INFO_REWIND = 0x1C, /*!< Skip Reverse / Rewind */
|
|
+ CEC_DECK_INFO_ID_SEARCH_FORWARD = 0x1D, /*!< Index Search Forward */
|
|
+ CEC_DECK_INFO_ID_SEARCH_REVERSE = 0x1E, /*!< Index Search Forward */
|
|
+ CEC_DECK_INFO_OTHER_STATUS = 0x1F /*!< Other Status */
|
|
+} dl_hdmi_cecdec_info_t;
|
|
+
|
|
+/*!
|
|
+ * \enum dlHdmiCECDeviceType_t
|
|
+ * \brief This enum indicates the device type
|
|
+ * */
|
|
+typedef enum {
|
|
+ CEC_DEVICE_TYPE_TV = 0, /*!< TV */
|
|
+ CEC_DEVICE_TYPE_REC_DEVICE = 1, /*!< Recording Device */
|
|
+ CEC_DEVICE_TYPE_RESERVED = 2, /*!< Reserved */
|
|
+ CEC_DEVICE_TYPE_TUNER = 3, /*!< Tuner */
|
|
+ CEC_DEVICE_TYPE_PLAYBACK_DEVICE = 4, /*!< PlayBack Device */
|
|
+ CEC_DEVICE_TYPE_AUDIO_DEVICE = 5, /*!< Audio System */
|
|
+ CEC_DEVICE_TYPE_PURE_CEC_SWITCTH = 6, /*!< Pure CEC Switch */
|
|
+ CEC_DEVICE_TYPE_VIDEO_PROCESSOR = 7 /*!< Video Processor */
|
|
+} dl_hdmi_cecdevice_type_t;
|
|
+
|
|
+/*!
|
|
+ * \enum dlHdmiCECServiceIdentMethod_t
|
|
+ * \brief This enum indicates a Service Indentification Method
|
|
+ * */
|
|
+typedef enum {
|
|
+ CEC_SERVICE_DIGITAL = 0, /*!< Service identified by digital IDs */
|
|
+ CEC_SERVICE_CHANNEL = 1 /*!< Service identified by channel */
|
|
+} dl_hdmi_cecservice_ident_method_t;
|
|
+
|
|
+/*!
|
|
+ * \enum dlHdmiCECDigitalBroadcastSystem_t
|
|
+ * \brief This enum indicates the Digital Broadcast System of required service
|
|
+ * */
|
|
+typedef enum {
|
|
+ CEC_DIGITAL_BROADCAST_SYSTEM_ARIB_GENERIC = 0x01, /*!< ARIB generic */
|
|
+ CEC_DIGITAL_BROADCAST_SYSTEM_ATSC_GENERIC = 0x02, /*!< ATSC generic */
|
|
+ CEC_DIGITAL_BROADCAST_SYSTEM_DVB_GENERIC = 0x03, /*!< DVB generic */
|
|
+ CEC_DIGITAL_BROADCAST_SYSTEM_ARIB_BS = 0x08, /*!< ARIB-BS */
|
|
+ CEC_DIGITAL_BROADCAST_SYSTEM_ARIB_CS = 0x09, /*!< ARIB-CS */
|
|
+ CEC_DIGITAL_BROADCAST_SYSTEM_ARIB_T = 0x0A, /*!< ARIB-T */
|
|
+ CEC_DIGITAL_BROADCAST_SYSTEM_CABLE = 0x10, /*!< Cable */
|
|
+ CEC_DIGITAL_BROADCAST_SYSTEM_SATELLITE = 0x11, /*!< Satellite */
|
|
+ CEC_DIGITAL_BROADCAST_SYSTEM_TERRESTRIAL = 0x12, /*!< Terrestrial */
|
|
+ CEC_DIGITAL_BROADCAST_SYSTEM_DVB_C = 0x18, /*!< DVB-C */
|
|
+ CEC_DIGITAL_BROADCAST_SYSTEM_DVB_S = 0x19, /*!< DVB-S */
|
|
+ CEC_DIGITAL_BROADCAST_SYSTEM_DVB_S2 = 0x1A, /*!< DVB-S2 */
|
|
+ CEC_DIGITAL_BROADCAST_SYSTEM_DVB_T = 0x1B /*!< DVB-T */
|
|
+} dl_hdmi_cecdigital_broadcast_system_t;
|
|
+
|
|
+/*!
|
|
+ * \struct dlHdmiCECAribData_t
|
|
+ * \brief This struct indicates the ARIB Data
|
|
+ * */
|
|
+typedef struct {
|
|
+ /*!< Tansport_stream_id of the transport stream carrying the required service */
|
|
+ u16 transport_stream_id ;
|
|
+ /*!< Service_ID of the required service */
|
|
+ u16 service_id ;
|
|
+ /*!< Original_network_ID of the network carrying the transport stream for the required service */
|
|
+ u16 original_network_id ;
|
|
+} dl_hdmi_cecarib_data_t ;
|
|
+
|
|
+/*!
|
|
+ * \struct dlHdmiCECAtscData_t
|
|
+ * \brief This struct indicates the ATSC Data
|
|
+ * */
|
|
+typedef struct {
|
|
+ /*!< Tansport_stream_id of the transport stream carrying the required service */
|
|
+ u16 transport_stream_id ;
|
|
+ /*!< Program Number of the required service */
|
|
+ u16 program_number ;
|
|
+ /*!< Reserved */
|
|
+ u16 reserved ;
|
|
+} dl_hdmi_cecatsc_data_t ;
|
|
+
|
|
+/*!
|
|
+ * \struct dlHdmiCECDvbData_t
|
|
+ * \brief This struct indicates the DVB Data
|
|
+ * */
|
|
+typedef struct {
|
|
+ /*!< Tansport_stream_id of the transport stream carrying the required service */
|
|
+ u16 transport_stream_id ;
|
|
+ /*!< Service_ID of the required service */
|
|
+ u16 service_id ;
|
|
+ /*!< Original_network_ID of the network carrying the transport stream for the required service */
|
|
+ u16 original_network_id ;
|
|
+} dl_hdmi_cecdvb_data_t ;
|
|
+
|
|
+/*!
|
|
+ * \struct dlHdmiCECChannelData_t
|
|
+ * \brief This struct indicates the Channel Data
|
|
+ * */
|
|
+typedef struct {
|
|
+ /*!< Logical or virtual channel number of a service */
|
|
+ dl_hdmi_cecchannel_identifier_t channel_identifier ;
|
|
+ /*!< Reserved */
|
|
+ u16 reserved ;
|
|
+} dl_hdmi_cecchannel_data_t ;
|
|
+
|
|
+/*!
|
|
+ * \struct dlHdmiCECDigitalServiceIdentification_t
|
|
+ * \brief This struct indicates the Digital Broadcast System
|
|
+ * and the parameters to identify a specific service
|
|
+ * */
|
|
+typedef struct _tmdl_hdmi_cecdigital_service_identification_t {
|
|
+ /*!< See dlHdmiCECServiceIdentMethod_t */
|
|
+ dl_hdmi_cecservice_ident_method_t service_identification_method ;
|
|
+ /*!< See dlHdmiCECDigitalBroadcastSystem_t */
|
|
+ dl_hdmi_cecdigital_broadcast_system_t digital_broadcast_system ;
|
|
+ /*!< dlHdmiCECAribData_t or dlHdmiCECAtscData_t or dlHdmiCECDvbData_t or dlHdmiCECChannelData_t */
|
|
+ void *p_service_identification ;
|
|
+} dl_hdmi_cecdigital_service_identification_t, *ptmdl_hdmi_cecdigital_service_identification_t;
|
|
+
|
|
+/*!
|
|
+ * \enum dlHdmiCECDisplayControl_t
|
|
+ * \brief This enum indicates the display mode for an on screen display message
|
|
+ * */
|
|
+typedef enum {
|
|
+ /*!< Display for default time */
|
|
+ CEC_DISPLAY_CONTROL_DEFAULT_TIME = 0 ,
|
|
+ /*!< Display until cleared */
|
|
+ CEC_DISPLAY_CONTROL_UNTIL_CLEARED = 64 ,
|
|
+ /*!< Clear previous message */
|
|
+ CEC_DISPLAY_CONTROL_CLEAR_PREVIOUS_MESSAGE = 128,
|
|
+ /*!< Clear previous message */
|
|
+ CEC_DISPLAY_CONTROL_RESERVED = 192
|
|
+} dl_hdmi_cecdisplay_control_t;
|
|
+
|
|
+/*!
|
|
+ * \struct dlHdmiCECDuration_t
|
|
+ * \brief This struct indicates a duration in BCD format
|
|
+ * */
|
|
+typedef struct {
|
|
+ u8 hours ; /*!< Duration hours in bcd format between 0 and 99 */
|
|
+ u8 minute ; /*!< Duration minute in bcd format between 0 and 59 */
|
|
+} dl_hdmi_cecduration_t ;
|
|
+
|
|
+/*!
|
|
+ * \brief This typedef indicates physical adress of device that is to be used as the source of a recording
|
|
+ * */
|
|
+typedef u16 dl_hdmi_cecexternal_physical_address_t ;
|
|
+
|
|
+/*!
|
|
+ * \brief This typedef indicates external plug number (1 to 255 )on the recording device
|
|
+ * */
|
|
+typedef u8 dl_hdmi_cecexternal_plug_t;
|
|
+
|
|
+/*!
|
|
+ * \enum dlHdmiCECExternalSourceSpecifier_t
|
|
+ * \brief This enum indicates External source specifier
|
|
+ * */
|
|
+typedef enum {
|
|
+ CEC_EXTERNAL_PLUG = 4 , /*!< Display for default time */
|
|
+ CEC_EXTERNAL_PHYSICAL_ADDRESS = 5 /*!< Display until cleared */
|
|
+} dl_hdmi_cecexternal_source_specifier_t;
|
|
+
|
|
+/*!
|
|
+ * \brief This typedef indicates External Source is specified bey exeternal plug number on the recording device
|
|
+ * or by the External physical Adress of the required source
|
|
+ * */
|
|
+typedef u8 external_source_specifier;
|
|
+
|
|
+/*!
|
|
+ * \enum dlHdmiCECFeatureOpcode_t
|
|
+ * \brief This enum defines command to be performed
|
|
+ * */
|
|
+typedef enum {
|
|
+ CEC_OPCODE_FEATURE_ABORT = 0x00, /*!< */
|
|
+ CEC_OPCODE_IMAGE_VIEW_ON = 0x04, /*!< */
|
|
+ CEC_OPCODE_TUNER_STEP_INCREMENT = 0x05, /*!< */
|
|
+ CEC_OPCODE_TUNER_STEP_DECREMENT = 0x06, /*!< */
|
|
+ CEC_OPCODE_TUNER_DEVICE_STATUS = 0x07, /*!< */
|
|
+ CEC_OPCODE_GIVE_TUNER_DEVICE_STATUS = 0x08, /*!< */
|
|
+ CEC_OPCODE_RECORD_ON = 0x09, /*!< */
|
|
+ CEC_OPCODE_RECORD_STATUS = 0x0A, /*!< */
|
|
+ CEC_OPCODE_RECORD_OFF = 0x0B, /*!< */
|
|
+ CEC_OPCODE_TEXT_VIEW_ON = 0x0D, /*!< */
|
|
+ CEC_OPCODE_RECORD_TV_SCREEN = 0x0F, /*!< */
|
|
+ CEC_OPCODE_GIVE_DECK_STATUS = 0x1A, /*!< */
|
|
+ CEC_OPCODE_DECK_STATUS = 0x1B, /*!< */
|
|
+ CEC_OPCODE_SET_MENU_LANGUAGE = 0x32, /*!< */
|
|
+ CEC_OPCODE_CLEAR_ANALOGUE_TIMER = 0x33, /*!< */
|
|
+ CEC_OPCODE_SET_ANALOGUE_TIMER = 0x34, /*!< */
|
|
+ CEC_OPCODE_TIMER_STATUS = 0x35, /*!< */
|
|
+ CEC_OPCODE_STANDBY = 0x36, /*!< */
|
|
+ CEC_OPCODE_PLAY = 0x41, /*!< */
|
|
+ CEC_OPCODE_DESCK_CONTROL = 0x42, /*!< */
|
|
+ CEC_OPCODE_TIMER_CLEARED_STATUS = 0x43, /*!< */
|
|
+ CEC_OPCODE_USER_CONTROL_PRESSED = 0x44, /*!< */
|
|
+ CEC_OPCODE_USER_CONTROL_RELEASED = 0x45, /*!< */
|
|
+ CEC_OPCODE_GIVE_OSD_NAME = 0x46, /*!< */
|
|
+ CEC_OPCODE_SET_OSD_NAME = 0x47, /*!< */
|
|
+ CEC_OPCODE_SET_OSD_STRING = 0x64, /*!< */
|
|
+ CEC_OPCODE_SET_TIMER_PROGRAM_TITLE = 0x67, /*!< */
|
|
+ CEC_OPCODE_SYSTEM_AUDIO_MODE_REQUEST = 0x70, /*!< */
|
|
+ CEC_OPCODE_GIVE_AUDIO_STATUS = 0x71, /*!< */
|
|
+ CEC_OPCODE_SET_SYSTEM_AUDIO_MODE = 0x72, /*!< */
|
|
+ CEC_OPCODE_REPORT_AUDIO_STATUS = 0x7A, /*!< */
|
|
+ CEC_OPCODE_GIVE_SYSTEM_AUDIO_MODE_STATUS = 0x7D, /*!< */
|
|
+ CEC_OPCODE_SYSTEM_AUDIO_MODE_STATUS = 0x7E, /*!< */
|
|
+ CEC_OPCODE_ROUTING_CHANGE = 0x80, /*!< */
|
|
+ CEC_OPCODE_ROUTING_INFORMATION = 0x81, /*!< */
|
|
+ CEC_OPCODE_ACTIVE_SOURCE = 0x82, /*!< */
|
|
+ CEC_OPCODE_GIVE_PHYSICAL_ADDRESS = 0x83, /*!< */
|
|
+ CEC_OPCODE_REPORT_PHYSICAL_ADDRESS = 0x84, /*!< */
|
|
+ CEC_OPCODE_REQUEST_ACTIVE_SOURCE = 0x85, /*!< */
|
|
+ CEC_OPCODE_SET_STREAM_PATH = 0x86, /*!< */
|
|
+ CEC_OPCODE_DEVICE_VENDOR_ID = 0x87, /*!< */
|
|
+ CEC_OPCODE_VENDOR_COMMAND = 0x89, /*!< */
|
|
+ CEC_OPCODE_VENDOR_REMOTE_BUTTON_DOWN = 0x8A, /*!< */
|
|
+ CEC_OPCODE_VENDOR_REMOTE_BUTTON_UP = 0x8B, /*!< */
|
|
+ CEC_OPCODE_GIVE_DEVICE_VENDOR_ID = 0x8C, /*!< */
|
|
+ CEC_OPCODE_MENU_REQUEST = 0x8D, /*!< */
|
|
+ CEC_OPCODE_MENU_STATUS = 0x8E, /*!< */
|
|
+ CEC_OPCODE_GIVE_DEVICE_POWER_STATUS = 0x8F, /*!< */
|
|
+ CEC_OPCODE_REPORT_POWER_STATUS = 0x90, /*!< */
|
|
+ CEC_OPCODE_GET_MENU_LANGUAGE = 0x91, /*!< */
|
|
+ CEC_OPCODE_SET_ANALOGUE_SERVICE = 0x92, /*!< */
|
|
+ CEC_OPCODE_SET_DIGITAL_SERVICE = 0x93, /*!< */
|
|
+ CEC_OPCODE_SET_DIGITAL_TIMER = 0x97, /*!< */
|
|
+ CEC_OPCODE_CLEAR_DIGITAL_TIMER = 0x99, /*!< */
|
|
+ CEC_OPCODE_SET_AUDIO_RATE = 0x9A, /*!< */
|
|
+ CEC_OPCODE_INACTIVE_SOURCE = 0x9D, /*!< */
|
|
+ CEC_OPCODE_CEC_VERSION = 0x9E, /*!< */
|
|
+ CEC_OPCODE_GET_CEC_VERSION = 0x9F, /*!< */
|
|
+ CEC_OPCODE_VENDOR_COMMAND_WITH_ID = 0xA0, /*!< */
|
|
+ CEC_OPCODE_CLEAR_EXTERNAL_TIMER = 0xA1, /*!< */
|
|
+ CEC_OPCODE_SET_EXTERNAL_TIMER = 0xA2, /*!< */
|
|
+ CEC_OPCODE_REPORT_SHORT_AUDIO_DESCRIPTOR = 0xA3, /*!< */
|
|
+ CEC_OPCODE_REQUEST_SHORT_AUDIO_DESCRIPTOR = 0xA4, /*!< */
|
|
+ CEC_OPCODE_INITATE_ARC = 0xC0, /*!< */
|
|
+ CEC_OPCODE_REPORT_ARC_INITIATED = 0xC1, /*!< */
|
|
+ CEC_OPCODE_REPORT_ARC_TERMINATED = 0xC2, /*!< */
|
|
+ CEC_OPCODE_REPORT_ARC_INITIATION = 0xC3, /*!< */
|
|
+ CEC_OPCODE_REPORT_ARC_TERMINATION = 0xC4, /*!< */
|
|
+ CEC_OPCODE_TERMINATE_ARC = 0xC5, /*!< */
|
|
+ /*!< This message is reserved for testing*/
|
|
+ CEC_OPCODE_ABORT_MESSAGE = 0xFF
|
|
+} dl_hdmi_cecfeature_opcode_t;
|
|
+
|
|
+/*!
|
|
+ * \enum dlHdmiCECMenuRequestType_t
|
|
+ * \brief This enum specifies wether to activate or desactivate a devices menu or
|
|
+ * simply query its current menu status
|
|
+ * */
|
|
+typedef enum {
|
|
+ CEC_MENU_TYPE_ACTIVATE = 0 , /*!< Activate */
|
|
+ CEC_MENU_TYPE_DEACTIVATE = 1 , /*!< Deactivate */
|
|
+ CEC_MENU_TYPE_QUERY = 2 /*!< Query */
|
|
+} dl_hdmi_cecmenu_request_type_t;
|
|
+
|
|
+/*!
|
|
+ * \enum dlHdmiCECMenuState_t
|
|
+ * \brief This enum pecifies state of the device menu
|
|
+ * */
|
|
+typedef enum {
|
|
+ CEC_MENU_STATE_ACTIVATE = 0 , /*!< Activate */
|
|
+ CEC_MENU_STATE_DEACTIVATE = 1 /*!< Deactivate */
|
|
+} dl_hdmi_cecmenu_state_t;
|
|
+
|
|
+/*!
|
|
+ * \enum dlHdmiCECPlayMode_t
|
|
+ * \brief This enum indicates in which mode to play media
|
|
+ * */
|
|
+typedef enum {
|
|
+ CEC_MODE_PLAY_FORWARD = 0x24 ,
|
|
+ CEC_MODE_PLAY_REVERSE = 0x20 ,
|
|
+ CEC_MODE_FAST_FORWARD_MIN_SPEED = 0x05 ,
|
|
+ CEC_MODE_FAST_FORWARD_MEDIUM_SPEED = 0x06 ,
|
|
+ CEC_MODE_FAST_FORWARD_MAX_SPEED = 0x07 ,
|
|
+ CEC_MODE_FAST_REVERSE_MIN_SPEED = 0x09 ,
|
|
+ CEC_MODE_FAST_REVERSE_MEDIUM_SPEED = 0x0A ,
|
|
+ CEC_MODE_FAST_REVERSE_MAX_SPEED = 0x0B ,
|
|
+ CEC_MODE_SLOW_FORWARD_MIN_SPEED = 0x15 ,
|
|
+ CEC_MODE_SLOW_FORWARD_MEDIUM_SPEED = 0x16 ,
|
|
+ CEC_MODE_SLOW_FORWARD_MAX_SPEED = 0x17 ,
|
|
+ CEC_MODE_SLOW_REVERSE_MIN_SPEED = 0x19 ,
|
|
+ CEC_MODE_SLOW_REVERSE_MEDIUM_SPEED = 0x1A ,
|
|
+ CEC_MODE_SLOW_REVERSE_MAX_SPEED = 0x1B
|
|
+} dl_hdmi_cecplay_mode_t;
|
|
+
|
|
+/*!
|
|
+ * \enum dlHdmiCECPowerStatus_t
|
|
+ * \brief This enum indicates the current power status of a device
|
|
+ * */
|
|
+typedef enum {
|
|
+ /*!< On */
|
|
+ CEC_POWER_STATUS_ON = 0x00 ,
|
|
+ /*!< Standby */
|
|
+ CEC_POWER_STATUS_STANDBY = 0x01 ,
|
|
+ /*!< In Transition Standby to On */
|
|
+ CEC_POWER_STATUS_TRANSITION_STANDBY_TO_ON = 0x02 ,
|
|
+ /*!< In Transition On to StandBy */
|
|
+ CEC_POWER_STATUS_TRANSITION_ON_TO_STANDBY = 0x03
|
|
+} dl_hdmi_cecpower_status_t;
|
|
+
|
|
+/*!
|
|
+ * \enum dlHdmiCECRecordSourceType_t
|
|
+ * \brief This enum allows the record source to be specified for a recording
|
|
+ * */
|
|
+typedef enum {
|
|
+ /*!< Own Source */
|
|
+ CEC_RECORD_SOURCE_OWN_SOURCE = 1 ,
|
|
+ /*!< Digital Service */
|
|
+ CEC_RECORD_SOURCE_DIGITAL_SERVICE = 2 ,
|
|
+ /*!< Analogue Service */
|
|
+ CEC_RECORD_SOURCE_ANALOGUE_SERVICE = 3 ,
|
|
+ /*!< External Plug */
|
|
+ CEC_RECORD_SOURCE_EXTERNAL_PLUG = 4 ,
|
|
+ /*!< External Physical Address */
|
|
+ CEC_RECORD_SOURCE_EXTERNAL_PHYSICAL_ADDRESS = 5
|
|
+} dl_hdmi_cecrecord_source_type_t;
|
|
+
|
|
+/*!
|
|
+ * \enum dlHdmiCECRecordStatusInfo_t
|
|
+ * \brief This enum indicates the status of a recording
|
|
+ * */
|
|
+typedef enum {
|
|
+ /*!< */
|
|
+ CEC_RECORD_STATUS_INFO_RECORDING_CURRENTLY_SELECTED_SOURCE = 1 ,
|
|
+ /*!< */
|
|
+ CEC_RECORD_STATUS_INFO_RECORDING_DIGITAL_SERVICE = 2 ,
|
|
+ /*!< */
|
|
+ CEC_RECORD_STATUS_INFO_RECORDING_ANALOGUE_SERVCICE = 3 ,
|
|
+ /*!< */
|
|
+ CEC_RECORD_STATUS_INFO_RECORDING_EXTERNAL_INPUT = 4 ,
|
|
+ /*!< */
|
|
+ CEC_RECORD_STATUS_INFO_NO_REC_UNABLE_TO_RECORD_DIGITAL_SERVICE = 5 ,
|
|
+ /*!< */
|
|
+ CEC_RECORD_STATUS_INFO_NO_REC_UNABLE_TO_RECORD_ANALOGUE_SERVICE = 6 ,
|
|
+ /*!< */
|
|
+ CEC_RECORD_STATUS_INFO_NO_REC_UNABLE_TO_SELECT_REQUIRED_SERVICE = 7 ,
|
|
+ /*!< */
|
|
+ CEC_RECORD_STATUS_INFO_NO_REC_INVALID_EXTERNAL_PLUG_NUMBER = 9 ,
|
|
+ /*!< */
|
|
+ CEC_RECORD_STATUS_INFO_NO_REC_INVALID_EXTERNAL_PHYSICAL_ADDRESS = 10 ,
|
|
+ /*!< */
|
|
+ CEC_RECORD_STATUS_INFO_NO_REC_CA_SYSTEM_NOT_SUPPORTED = 11 ,
|
|
+ /*!< */
|
|
+ CEC_RECORD_STATUS_INFO_NO_REC_NO_OR_INSUFFICIENT_CA_ENTITLEMENTS = 12 ,
|
|
+ /*!< */
|
|
+ CEC_RECORD_STATUS_INFO_NO_REC_NOT_ALLOWED_TO_COPY_SOURCE = 13 ,
|
|
+ /*!< */
|
|
+ CEC_RECORD_STATUS_INFO_NO_REC_NO_FURTHER_COPY_ALLOWED = 14 ,
|
|
+ /*!< */
|
|
+ CEC_RECORD_STATUS_INFO_NO_REC_NO_MEDIA = 16 ,
|
|
+ /*!< */
|
|
+ CEC_RECORD_STATUS_INFO_NO_REC_PLAYING = 17 ,
|
|
+ /*!< */
|
|
+ CEC_RECORD_STATUS_INFO_NO_REC_ALREADY_RECORDING = 18 ,
|
|
+ /*!< */
|
|
+ CEC_RECORD_STATUS_INFO_NO_REC_MEDIA_PROTECTED = 19 ,
|
|
+ /*!< */
|
|
+ CEC_RECORD_STATUS_INFO_NO_REC_NO_SOURCE_SIGNAL = 20 ,
|
|
+ /*!< */
|
|
+ CEC_RECORD_STATUS_INFO_NO_REC_MEDIA_PROBLEM = 21 ,
|
|
+ /*!< */
|
|
+ CEC_RECORD_STATUS_INFO_NO_REC_NOT_ENOUGH_SPACE_AVAILABLE = 22 ,
|
|
+ /*!< */
|
|
+ CEC_RECORD_STATUS_INFO_NO_REC_PARENTAL_LOCK_ON = 23 ,
|
|
+ /*!< */
|
|
+ CEC_RECORD_STATUS_INFO_RECORDING_TERMINATED_NORMALLY = 26 ,
|
|
+ /*!< */
|
|
+ CEC_RECORD_STATUS_INFO_RECORDING_HAS_ALREADY_TERMINATED = 27 ,
|
|
+ /*!< */
|
|
+ CEC_RECORD_STATUS_INFO_NO_RECORDING_OTHER_REASON = 31
|
|
+} dl_hdmi_cecrecord_status_info_t;
|
|
+
|
|
+/*!
|
|
+ * \enum dlHdmiCECRecordingSequence_t
|
|
+ * \brief This enum indicates the status of a recording
|
|
+ * */
|
|
+typedef enum {
|
|
+ CEC_RECORDING_SEQUENCE_ONCE_ONLY = 0 , /*!< */
|
|
+ CEC_RECORDING_SEQUENCE_SYNDAY = 1 , /*!< */
|
|
+ CEC_RECORDING_SEQUENCE_MONDAY = 2 , /*!< */
|
|
+ CEC_RECORDING_SEQUENCE_TUESDAY = 4 , /*!< */
|
|
+ CEC_RECORDING_SEQUENCE_WEDNESDAY = 8 , /*!< */
|
|
+ CEC_RECORDING_SEQUENCE_THURSDAY = 16, /*!< */
|
|
+ CEC_RECORDING_SEQUENCE_FRIDAY = 32, /*!< */
|
|
+ CEC_RECORDING_SEQUENCE_SATURDAY = 64 /*!< */
|
|
+} dl_hdmi_cecrecording_sequence_t;
|
|
+
|
|
+/*!
|
|
+ * \enum dlHdmiCECStatusRequest_t
|
|
+ * \brief This enum contains the status request mode which can be report once or
|
|
+ * on all future state changes or reporting off.
|
|
+ * */
|
|
+typedef enum {
|
|
+ CEC_STATUS_REQUEST_ON = 1 , /*!< Status Request ON */
|
|
+ CEC_STATUS_REQUEST_OFF = 2 , /*!< Status Request OFF */
|
|
+ CEC_STATUS_REQUEST_ONCE = 3 /*!< Status Request ONCE */
|
|
+} dl_hdmi_cecstatus_request_t;
|
|
+
|
|
+/*!
|
|
+ * \enum dlHdmiCECSystemAudioStatus_t
|
|
+ * \brief This enum indicates if the system audio Mode is On or Off
|
|
+ * */
|
|
+typedef enum {
|
|
+ CEC_SYSTEM_AUDIO_STATUS_OFF = 0 , /*!< Status Request OFF */
|
|
+ CEC_SYSTEM_AUDIO_STATUS_ON = 1 /*!< Status Request ON */
|
|
+} dl_hdmi_cecsystem_audio_status_t;
|
|
+
|
|
+/*!
|
|
+ * \enum dlHdmiCECTimerClearedStatusData_t
|
|
+ * \brief This enum indicates status in <Timer Cleared Status> message
|
|
+ * */
|
|
+typedef enum {
|
|
+ CEC_TIMER_STATUS_TIMER_NOT_CLEARED_RECORDING = 0, /*!< */
|
|
+ CEC_TIMER_STATUS_TIMER_NOT_CLEARED_NO_MATCHING = 1, /*!< */
|
|
+ CEC_TIMER_STATUS_TIMER_NOT_CLEARED_NO_INFO_AVAILABLE = 2, /*!< */
|
|
+ CEC_TIMER_STATUS_TIMER_NOT_TIMER_CLEARED = 128 /*!< */
|
|
+} dl_hdmi_cectimer_cleared_status_data_t;
|
|
+
|
|
+/*!
|
|
+ * \enum dlHdmiCECTimerOverlapWarning_t
|
|
+ * \brief This enum indicates if there is another timer block already set which
|
|
+ * overlaps with this new recording request
|
|
+ * */
|
|
+typedef enum {
|
|
+ CEC_TIMER_OVERLAP_WARNING_NO_OVERLAP = 0, /*!< No Overlap */
|
|
+ /*!< Timer blocks overlap */
|
|
+ CEC_TIMER_OVERLAP_WARNING_TIMER_BLOCKS_OVERLAP = 1
|
|
+} dl_hdmi_cectimer_overlap_warning_t;
|
|
+
|
|
+/*!
|
|
+ * \enum dlHdmiCECMediaInfo_t
|
|
+ * \brief This enum indicates if removable media is present and its write protect state
|
|
+ * */
|
|
+typedef enum {
|
|
+ /*!< Media present and not protected */
|
|
+ CEC_MEDIA_INFO_MEDIA_PRESENT_AND_NOT_PROTECTED = 0,
|
|
+ /*!< Media present but protected */
|
|
+ CEC_MEDIA_INFO_MEDIA_PRESENT_BUT_PROTECTED = 1,
|
|
+ /*!< Media not present */
|
|
+ CEC_MEDIA_INFO_MEDIA_NOT_PRESENT = 2,
|
|
+ /*!< Future use */
|
|
+ CEC_MEDIA_INFO_FUTURE_USE = 3
|
|
+} dl_hdmi_cecmedia_info_t;
|
|
+
|
|
+/*!
|
|
+ * \enum dlHdmiCECProgrammedIndicator_t
|
|
+ * \brief This enum indicates a selector for [Timer Programmed Info]
|
|
+ * */
|
|
+typedef enum {
|
|
+ CEC_PROGRAM_INDICATOR_NOT_PROGRAMMED = 0, /*!< */
|
|
+ CEC_PROGRAM_INDICATOR_PROGRAMMED = 1 /*!< */
|
|
+} dl_hdmi_cecprogrammed_indicator_t;
|
|
+
|
|
+/*!
|
|
+ * \enum dlHdmiCECProgrammedInfo_t
|
|
+ * \brief This enum indicates any non-fatal issues with the programming request
|
|
+ * */
|
|
+typedef enum {
|
|
+ CEC_PROGRAM_INFO_ENOUGHT_SPACE_AVAILABLE_FOR_RECORDING = 8, /*!< */
|
|
+ CEC_PROGRAM_INFO_NOT_ENOUGHT_SPACE_AVAILABLE_FOR_RECORDING = 9, /*!< */
|
|
+ CEC_PROGRAM_INFO_NO_MEDIA_INFO_AVAILABLE = 10,/*!< */
|
|
+ CEC_PROGRAM_INFO_MAY_NOT_BE_ENOUGH_SPACE_AVAILABLE = 11 /*!< */
|
|
+} dl_hdmi_cecprogrammed_info_t;
|
|
+
|
|
+/*!
|
|
+ * \enum dlHdmiCECNotProgrammedErrorInfo_t
|
|
+ * \brief This enum indicates reason for programming failure
|
|
+ * */
|
|
+typedef enum {
|
|
+ CEC_PROGRAM_ERROR_INFO_FUTURE_USE = 0, /*!< */
|
|
+ CEC_PROGRAM_ERROR_INFO_NO_FREE_TIMER_AVAILABLE = 1, /*!< */
|
|
+ CEC_PROGRAM_ERROR_INFO_DATE_OUT_OF_RANGE = 2, /*!< */
|
|
+ CEC_PROGRAM_ERROR_INFO_RECORDING_SEQUENCE_ERROR = 3, /*!< */
|
|
+ CEC_PROGRAM_ERROR_INFO_INVALID_EXTERNAL_PLUG_NUMBER = 4, /*!< */
|
|
+ CEC_PROGRAM_ERROR_INFO_INVALID_EXTERNAL_PHYSICAL_ADDRESS = 5, /*!< */
|
|
+ CEC_PROGRAM_ERROR_INFO_CA_SYSTEM_NOT_SUPPORTED = 6, /*!< */
|
|
+ CEC_PROGRAM_ERROR_INFO_NO_OR_INSUFFICIENT_CA_ENTITLMENTS = 7, /*!< */
|
|
+ /*!< Tuner or recorder does not support HD */
|
|
+ CEC_PROGRAM_ERROR_INFO_DOES_NOT_SUPPORT_RESOLUTION = 8,
|
|
+ CEC_PROGRAM_ERROR_INFO_PARENTAL_LOCK_ON = 9, /*!< */
|
|
+ CEC_PROGRAM_ERROR_INFO_CLOCK_FAILURE = 10, /*!< */
|
|
+ /*!< A timer block with identical details has already been programmed*/
|
|
+ CEC_PROGRAM_ERROR_INFO_DUPLICATE_ALREADY_PROGRAMMED = 14
|
|
+} dl_hdmi_cecnot_programmed_error_info_t;
|
|
+
|
|
+/*!
|
|
+ * \struct dlHdmiCECTimerProgrammedInfo_t
|
|
+ * \brief This struct
|
|
+ * */
|
|
+typedef struct {
|
|
+ /*!< dlHdmiCECProgrammedIndicator_t */
|
|
+ dl_hdmi_cecprogrammed_indicator_t select_program_info ;
|
|
+ /*!< dlHdmiCECProgrammedInfo_t or dlHdmiCECNotProgrammedErrorInfo_t*/
|
|
+ u8 program_info;
|
|
+ /*!< Optional paramter : If [Programmed Info] is "Not enough space available" */
|
|
+ u16 duration_available ;
|
|
+ /*!< If [Not Programmed Info] is "Duplicate : already programmed" */
|
|
+} dl_hdmi_cectimer_programmed_info_t ;
|
|
+
|
|
+/*!
|
|
+ * \struct dlHdmiCECTimerStatusData_t
|
|
+ * \brief This struct is used by recording device to respond to the initiator
|
|
+ * of a <Set Timer> message
|
|
+ * */
|
|
+typedef struct {
|
|
+ /*!< Indicates if there is another timer block already set which overlaps with this bew recording request*/
|
|
+ dl_hdmi_cectimer_overlap_warning_t timer_overlap_warning ;
|
|
+ /*!< Indicate if removable media is present and its write protect state */
|
|
+ dl_hdmi_cecmedia_info_t media_info ;
|
|
+ /*!< Give information about how and if the programming request has been done */
|
|
+ dl_hdmi_cectimer_programmed_info_t timer_programmed_info ;
|
|
+} dl_hdmi_cectimer_status_data_t ;
|
|
+
|
|
+/*!
|
|
+ * \enum dlHdmiCECRecordingFlag_t
|
|
+ * \brief This enum indicates if the tuner is being used as a source of a recording
|
|
+ * */
|
|
+typedef enum {
|
|
+ /*!< Not Being used for recording */
|
|
+ CEC_RECORDING_FLAG_NOT_BEING_USED_FOR_RECORDING = 0,
|
|
+ /*!< Being used for recording */
|
|
+ CEC_RECORDING_FLAG_BEING_USED_FOR_RECORDING = 1
|
|
+} dl_hdmi_cecrecording_flag_t;
|
|
+
|
|
+/*!
|
|
+ * \enum dlHdmiCECTunerDisplayInfo_t
|
|
+ * \brief This enum indicates if the device is currently displaying its tuner or not.
|
|
+ * (it may for example be displaying an external source or media)
|
|
+ * */
|
|
+typedef enum {
|
|
+ /*!< Displaying Digital Tuner */
|
|
+ CEC_TUNER_DISPLAY_MEDIA_DISPLAYING_DIGITAL_TUNER = 0,
|
|
+ /*!< Not Displaying Tuner */
|
|
+ CEC_TUNER_DISPLAY_MEDIA_NOT_DISPLAYING_TUNER = 1,
|
|
+ /*!< Not Displaying Tuner */
|
|
+ CEC_TUNER_DISPLAY_MEDIA_DISPLAYING_ANALOGUE_TUNER = 2
|
|
+} dl_hdmi_cectuner_display_info_t;
|
|
+
|
|
+/*!
|
|
+ * \enum dlHdmiCECUiBroadcastType_t
|
|
+ * \brief This enum indicates type of broadcast
|
|
+ * */
|
|
+typedef enum {
|
|
+ CEC_UI_BROADCAST_TYPE_ALL_AVAILABLE = 0x00 , /*!< */
|
|
+ CEC_UI_BROADCAST_TYPE_DIGITAL_ANALOGUE_TOGGLE = 0x01 , /*!< */
|
|
+ CEC_UI_BROADCAST_TYPE_ANALOGUE = 0x10 , /*!< */
|
|
+ CEC_UI_BROADCAST_TYPE_ANALOGUE_TERRESTRIAL = 0x20 , /*!< */
|
|
+ CEC_UI_BROADCAST_TYPE_ANALOGUE_CABLE = 0x30 , /*!< */
|
|
+ CEC_UI_BROADCAST_TYPE_ANALOGUE_SATELLITE = 0x40 , /*!< */
|
|
+ CEC_UI_BROADCAST_TYPE_DIGITAL = 0x50 , /*!< */
|
|
+ CEC_UI_BROADCAST_TYPE_DIGITAL_TERRESTRIAL = 0x60 , /*!< */
|
|
+ CEC_UI_BROADCAST_TYPE_DIGITAL_CABLE = 0x70 , /*!< */
|
|
+ CEC_UI_BROADCAST_TYPE_DIGITAL_SATELLITE = 0x80 , /*!< */
|
|
+ CEC_UI_BROADCAST_TYPE_DIGITAL_COM_SATELLITE = 0x90 , /*!< */
|
|
+ CEC_UI_BROADCAST_TYPE_DIGITAL_COM_SATELLITE_2 = 0x91 , /*!< */
|
|
+ CEC_UI_BROADCAST_TYPE_IP = 0xA0 /*!< */
|
|
+} dl_hdmi_cecui_broadcast_type_t;
|
|
+
|
|
+/*!
|
|
+ * \enum dlHdmiCECUiSoundPresentationControl_t
|
|
+ * \brief This enum indicates the selected command
|
|
+ * */
|
|
+typedef enum {
|
|
+ /*!< "Sound Mixing Mode (Dual Mono)" */
|
|
+ CEC_UI_PRESENTATION_CONTROL_SOUND_MIX_DUAL_MONO = 0x20 ,
|
|
+ /*!< "Sound Mixing Mode (Karaoke)" */
|
|
+ CEC_UI_PRESENTATION_CONTROL_SOUND_MIX_KARAOKE = 0x30 ,
|
|
+ /*!< "Select Audio Downmix Mode" */
|
|
+ CEC_UI_PRESENTATION_CONTROL_SELECT_AUDIO_DOWNMIX = 0x80 ,
|
|
+ /*!< "Select Audio Reverberation Processing Mode" */
|
|
+ CEC_UI_PRESENTATION_CONTROL_SELECT_AUDIO_REVERBERATION = 0x90 ,
|
|
+ /*!< "Select Audio Equalizer Mode" */
|
|
+ CEC_UI_PRESENTATION_CONTROL_SELECT_AUDIO_EQUALIZER = 0xA0 ,
|
|
+ /*!< "bass step + " */
|
|
+ CEC_UI_PRESENTATION_CONTROL_BASS_STEP_PLUS = 0xB1 ,
|
|
+ /*!< "bass neutral position" */
|
|
+ CEC_UI_PRESENTATION_CONTROL_BASS_NEUTRAL_POSITION = 0xB2 ,
|
|
+ /*!< "bass step - " */
|
|
+ CEC_UI_PRESENTATION_CONTROL_BASS_STEP_MINUS = 0xB3 ,
|
|
+ /*!< "Treble step + " */
|
|
+ CEC_UI_PRESENTATION_CONTROL_TREBLE_STEP_PLUS = 0xC1 ,
|
|
+ /*!< "Treble neutral position" */
|
|
+ CEC_UI_PRESENTATION_CONTROL_TREBLE_NEUTRAL_POSITION = 0xC2 ,
|
|
+ /*!< "Treble step - " */
|
|
+ CEC_UI_PRESENTATION_CONTROL_TREBLE_STEP_MINUS = 0xC3
|
|
+
|
|
+} dl_hdmi_cecui_sound_presentation_control_t;
|
|
+
|
|
+/*!
|
|
+ * \enum dlHdmiCECUserRemoteControlCommand_t
|
|
+ * \brief This enum indicates the remote control button pressed
|
|
+ * */
|
|
+typedef enum {
|
|
+ CEC_REMOTE_BUTTON_SELECT = 0,
|
|
+ CEC_REMOTE_BUTTON_UP = 1,
|
|
+ CEC_REMOTE_BUTTON_DOWN = 2,
|
|
+ CEC_REMOTE_BUTTON_LEFT = 3,
|
|
+ CEC_REMOTE_BUTTON_RIGHT = 4,
|
|
+ CEC_REMOTE_BUTTON_RIGHT_UP = 5,
|
|
+ CEC_REMOTE_BUTTON_RIGHT_DOWN = 6,
|
|
+ CEC_REMOTE_BUTTON_LEFT_UP = 7,
|
|
+ CEC_REMOTE_BUTTON_LEFT_DOWN = 8,
|
|
+ CEC_REMOTE_BUTTON_ROOT_MENU = 9,
|
|
+ CEC_REMOTE_BUTTON_SETUP_MENU = 10,
|
|
+ CEC_REMOTE_BUTTON_CONTENTS_MENU = 11,
|
|
+ CEC_REMOTE_BUTTON_FAVORITE_MENU = 12,
|
|
+ CEC_REMOTE_BUTTON_EXIT = 13,
|
|
+ CEC_REMOTE_BUTTON_MEDIA_TOP_MENU = 16,
|
|
+ CEC_REMOTE_BUTTON_MEDIA_CONTEXT = 17,
|
|
+ CEC_REMOTE_BUTTON_NUMBER_ENTRY_MODE = 29,
|
|
+ CEC_REMOTE_BUTTON_NUMBER_11 = 30,
|
|
+ CEC_REMOTE_BUTTON_NUMBER_12 = 31,
|
|
+ CEC_REMOTE_BUTTON_NUMBER_0_OR_NUMBER_10 = 32,
|
|
+ CEC_REMOTE_BUTTON_NUMBER_1 = 33,
|
|
+ CEC_REMOTE_BUTTON_NUMBER_2 = 34,
|
|
+ CEC_REMOTE_BUTTON_NUMBER_3 = 35,
|
|
+ CEC_REMOTE_BUTTON_NUMBER_4 = 36,
|
|
+ CEC_REMOTE_BUTTON_NUMBER_5 = 37,
|
|
+ CEC_REMOTE_BUTTON_NUMBER_6 = 38,
|
|
+ CEC_REMOTE_BUTTON_NUMBER_7 = 39,
|
|
+ CEC_REMOTE_BUTTON_NUMBER_8 = 40,
|
|
+ CEC_REMOTE_BUTTON_NUMBER_9 = 41,
|
|
+ CEC_REMOTE_BUTTON_DOT = 42,
|
|
+ CEC_REMOTE_BUTTON_ENTER = 43,
|
|
+ CEC_REMOTE_BUTTON_CLEAR = 44,
|
|
+ CEC_REMOTE_BUTTON_NEXT_FAVORITE = 47,
|
|
+ CEC_REMOTE_BUTTON_CHANNEL_UP = 48,
|
|
+ CEC_REMOTE_BUTTON_CHANNEL_DOWN = 49,
|
|
+ CEC_REMOTE_BUTTON_PREVIOUS_CHANNEL = 50,
|
|
+ CEC_REMOTE_BUTTON_SOUND_SELECT = 51,
|
|
+ CEC_REMOTE_BUTTON_INPUT_SELECT = 52,
|
|
+ CEC_REMOTE_BUTTON_DISPLAY_INFORMATION = 53,
|
|
+ CEC_REMOTE_BUTTON_HELP = 54,
|
|
+ CEC_REMOTE_BUTTON_PAGE_UP = 55,
|
|
+ CEC_REMOTE_BUTTON_PAGE_DOWN = 56,
|
|
+ CEC_REMOTE_BUTTON_POWER = 64,
|
|
+ CEC_REMOTE_BUTTON_VOLUME_UP = 65,
|
|
+ CEC_REMOTE_BUTTON_VOLUME_DOWN = 66,
|
|
+ CEC_REMOTE_BUTTON_MUTE = 67,
|
|
+ CEC_REMOTE_BUTTON_PLAY = 68,
|
|
+ CEC_REMOTE_BUTTON_STOP = 69,
|
|
+ CEC_REMOTE_BUTTON_PAUSE = 70,
|
|
+ CEC_REMOTE_BUTTON_RECORD = 71,
|
|
+ CEC_REMOTE_BUTTON_REWIND = 72,
|
|
+ CEC_REMOTE_BUTTON_FAST_FORWARD = 73,
|
|
+ CEC_REMOTE_BUTTON_EJECT = 74,
|
|
+ CEC_REMOTE_BUTTON_FORWARD = 75,
|
|
+ CEC_REMOTE_BUTTON_BACKWARD = 76,
|
|
+ CEC_REMOTE_BUTTON_STOP_RECORD = 77,
|
|
+ CEC_REMOTE_BUTTON_PAUSE_RECORD = 78,
|
|
+ CEC_REMOTE_BUTTON_ANGLE = 80,
|
|
+ CEC_REMOTE_BUTTON_SUB_PICTURE = 81,
|
|
+ CEC_REMOTE_BUTTON_VIDEO_ON_DEMAND = 82,
|
|
+ CEC_REMOTE_BUTTON_ELECTRONIC_PROGRAM_GUIDE = 83,
|
|
+ CEC_REMOTE_BUTTON_TIMER_PROGRAMMING = 84,
|
|
+ CEC_REMOTE_BUTTON_INITIAL_CONFIGURATION = 85,
|
|
+ CEC_REMOTE_BUTTON_SELECT_BROADCAST_TYPE = 86,
|
|
+ CEC_REMOTE_BUTTON_SELECT_SOUND_PRESENTATION = 87,
|
|
+ CEC_REMOTE_BUTTON_PLAY_FUNCTION = 96,
|
|
+ CEC_REMOTE_BUTTON_PAUSE_PLAY_FUNCTION = 97,
|
|
+ CEC_REMOTE_BUTTON_RECORD_FUNCTION = 98,
|
|
+ CEC_REMOTE_BUTTON_PAUSE_RECORD_FUNCTION = 99,
|
|
+ CEC_REMOTE_BUTTON_STOP_FUNCTION = 100,
|
|
+ CEC_REMOTE_BUTTON_MUTE_FUNCTION = 101,
|
|
+ CEC_REMOTE_BUTTON_RESTORE_VOLUME_FUNCTION = 102,
|
|
+ CEC_REMOTE_BUTTON_TUNE_FUNCTION = 103,
|
|
+ CEC_REMOTE_BUTTON_SELECT_MEDIA_FUNCTION = 104,
|
|
+ CEC_REMOTE_BUTTON_SELECT_AV_INPUT_FUNCTION = 105,
|
|
+ CEC_REMOTE_BUTTON_SELECT_AUDIO_INPUT_FUNCTION = 106,
|
|
+ CEC_REMOTE_BUTTON_POWER_TOGGLE_FUNCTION = 107,
|
|
+ CEC_REMOTE_BUTTON_POWER_OFF_FUNCTION = 108,
|
|
+ CEC_REMOTE_BUTTON_POWER_ON_FUNCTION = 109,
|
|
+ CEC_REMOTE_BUTTON_F1_BLUE = 113,
|
|
+ CEC_REMOTE_BUTTON_F2_RED = 114,
|
|
+ CEC_REMOTE_BUTTON_F3_GREEN = 115,
|
|
+ CEC_REMOTE_BUTTON_F4_YELLOW = 116,
|
|
+ CEC_REMOTE_BUTTON_F5 = 117,
|
|
+ CEC_REMOTE_BUTTON_DATA = 118
|
|
+} dl_hdmi_cecuser_remote_control_command_t;
|
|
+
|
|
+/*!
|
|
+ * \enum dlHdmiCECLogicalAddress_t
|
|
+ * \brief This enum indicates the logical address of the a device
|
|
+ * */
|
|
+typedef enum {
|
|
+ /*!< TV */
|
|
+ CEC_LOGICAL_ADDRESS_TV = 0,
|
|
+ /*!< Recording Device 1 */
|
|
+ CEC_LOGICAL_ADDRESS_RECORDING_DEVICE_1 = 1,
|
|
+ /*!< Recording Device 1 */
|
|
+ CEC_LOGICAL_ADDRESS_RECORDING_DEVICE_2 = 2,
|
|
+ /*!< Tuner 1 */
|
|
+ CEC_LOGICAL_ADDRESS_TUNER_1 = 3,
|
|
+ /*!< Playback Device 1 */
|
|
+ CEC_LOGICAL_ADDRESS_PLAYBACK_DEVICE_1 = 4,
|
|
+ /*!< Audio System */
|
|
+ CEC_LOGICAL_ADDRESS_AUDIO_SYSTEM = 5,
|
|
+ /*!< Tuner 2 */
|
|
+ CEC_LOGICAL_ADDRESS_TUNER_2 = 6,
|
|
+ /*!< Tuner 3 */
|
|
+ CEC_LOGICAL_ADDRESS_TUNER_3 = 7,
|
|
+ /*!< Playback Device 2 */
|
|
+ CEC_LOGICAL_ADDRESS_PLAYBACK_DEVICE_2 = 8,
|
|
+ /*!< Recording Device 3 */
|
|
+ CEC_LOGICAL_ADDRESS_RECORDING_DEVICE_3 = 9,
|
|
+ /*!< Tuner 4 */
|
|
+ CEC_LOGICAL_ADDRESS_TUNER_4 = 10,
|
|
+ /*!< Playback Device 3 */
|
|
+ CEC_LOGICAL_ADDRESS_PLAYBACK_DEVICE_3 = 11,
|
|
+ /*!< Reserved */
|
|
+ CEC_LOGICAL_ADDRESS_RESERVED1 = 12,
|
|
+ /*!< Reserved */
|
|
+ CEC_LOGICAL_ADDRESS_RESERVED2 = 13,
|
|
+ /*!< Specific Use */
|
|
+ CEC_LOGICAL_ADDRESS_SPECIFIC_USE = 14,
|
|
+ /*!< Unregistred/Broadcast */
|
|
+ CEC_LOGICAL_ADDRESS_UNREGISTRED_BROADCAST = 15
|
|
+} dl_hdmi_ceclogical_address_t;
|
|
+
|
|
+/*!
|
|
+ * \enum dlHdmiCecEvent_t
|
|
+ * \brief Enum listing all events that can be signalled to application
|
|
+ * */
|
|
+typedef enum {
|
|
+ /**< A message is available on CEC line */
|
|
+ DL_HDMICEC_CALLBACK_MESSAGE_AVAILABLE = 0,
|
|
+ DL_HDMICEC_CALLBACK_STATUS = 1, /**< Status of CEC line */
|
|
+} dl_hdmi_cec_event_t;
|
|
+
|
|
+/*!
|
|
+ * \enum dlHdmiCecEventStatus_t
|
|
+ * \brief Enum listing all available event status
|
|
+ * */
|
|
+typedef enum {
|
|
+ DL_HDMICEC_EVENT_ENABLED, /*!< Event is enabled */
|
|
+ DL_HDMICEC_EVENT_DISABLED /*!< Event is disabled */
|
|
+} dl_hdmi_cec_event_status_t;
|
|
+
|
|
+/**
|
|
+ * \brief System function pointer type, to call user I2C read/write functions
|
|
+ * \param slaveAddr The I2C slave address
|
|
+ * \param firstRegister The first device register address to read or write
|
|
+ * \param lenData Length of data to read or write (i.e. no. of registers)
|
|
+ * \param pData Pointer to data to write, or to buffer to receive data
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_HDMI_I2C_WRITE: failed when writing
|
|
+ * - ERR_HDMI_I2C_READ: failed when reading
|
|
+ * */
|
|
+typedef struct {
|
|
+ u8 slave_addr;
|
|
+ u8 first_register;
|
|
+ u8 len_data;
|
|
+ u8 *p_data;
|
|
+} dl_hdmi_cec_sys_args_t;
|
|
+typedef u32 (*ptmdl_hdmi_cec_sys_func_t)(dl_hdmi_cec_sys_args_t *p_sys_args);
|
|
+
|
|
+/*!
|
|
+ * \brief Timer function pointer type, to call an application timer
|
|
+ * \param Parameter ms: Delay in milliseconds required
|
|
+ * */
|
|
+typedef void(*ptmbsl_hdmi_cec_sys_func_timer_t)(u16 ms);
|
|
+
|
|
+/*!
|
|
+ * \brief Callback function pointer type, used to allow driver to callback
|
|
+ * application when activity status is changing at input.
|
|
+ * \param Event Identifier of the source event.
|
|
+ * */
|
|
+typedef void (*ptmdl_hdmi_cec_callback_func_t)(dl_hdmi_cec_event_t event,
|
|
+ u8 *pdata,
|
|
+ u8 size);
|
|
+
|
|
+/*!
|
|
+ * \brief Enum listing all supported device versions
|
|
+ * */
|
|
+typedef enum {
|
|
+ DL_HDMICEC_DEVICE_UNKNOWN, /*!< HW device is unknown */
|
|
+ DL_HDMICEC_DEVICE_TDA9950, /*!< HW device is a TDA9950 */
|
|
+ DL_HDMICEC_DEVICE_TDA9989, /*!< HW device is a TDA9989 */
|
|
+} dl_hdmi_cec_device_version_t;
|
|
+
|
|
+/*!
|
|
+ * \brief Enum listing possible CEC clock source
|
|
+ * */
|
|
+typedef enum {
|
|
+ DL_HDMICEC_CLOCK_XTAL,
|
|
+ DL_HDMICEC_CLOCK_FRO,
|
|
+ DL_HDMICEC_CLOCK_PCLK
|
|
+} dl_hdmi_cec_clock_source_t;
|
|
+
|
|
+/**
|
|
+ * \brief Structure describing unit capabilities
|
|
+ * */
|
|
+typedef struct {
|
|
+ /*!< HW device version */
|
|
+ dl_hdmi_cec_device_version_t device_version;
|
|
+ /*!< Supported HDMI CEC standard version */
|
|
+ dl_hdmi_cecversion_t hdmi_cec_version;
|
|
+} dl_hdmi_cec_capabilities_t;
|
|
+
|
|
+/*!
|
|
+ * \struct dlHdmiCECInstanceSetup_t
|
|
+ * \brief This struct is used to setup CEC driver by application
|
|
+ * Application setup the device and state of the device.
|
|
+ * */
|
|
+
|
|
+typedef struct _tmdl_hdmi_cec_instance_setup_t {
|
|
+ dl_hdmi_ceclogical_address_t device_logical_address;
|
|
+ dl_hdmi_cec_clock_source_t cec_clock_source;
|
|
+ /* dlHdmiCECDeviceState_t DeviceState; */
|
|
+} dl_hdmi_cec_instance_setup_t, *ptmdl_hdmi_cec_instance_setup_t;
|
|
+
|
|
+/**
|
|
+ * \brief The structure of a CEC Data Register Protocol
|
|
+ * */
|
|
+typedef struct {
|
|
+ u8 address_byte;
|
|
+ /* Indicate if it's a poolling message "1" or a normal CEC message "0" */
|
|
+ bool message_type_polling;
|
|
+ u8 opcode;
|
|
+} dl_hdmi_cec_save_message_t;
|
|
+
|
|
+typedef struct {
|
|
+ u8 frame_byte_count;
|
|
+ u8 address_byte;
|
|
+ u8 data_bytes[15];
|
|
+} dl_hdmi_cec_frame_format_t;
|
|
+
|
|
+#endif /* DLHDMICEC_TYPES_H */
|
|
+
|
|
+/*============================================================================*/
|
|
+/* END OF FILE */
|
|
+/*============================================================================*/
|
|
+
|
|
diff --git a/drivers/video/hdmi/comps/tmdlHdmiCEC/src/tmdlHdmiCEC.c b/drivers/video/hdmi/comps/tmdlHdmiCEC/src/tmdlHdmiCEC.c
|
|
new file mode 100755
|
|
index 0000000..708552b
|
|
--- /dev/null
|
|
+++ b/drivers/video/hdmi/comps/tmdlHdmiCEC/src/tmdlHdmiCEC.c
|
|
@@ -0,0 +1,7969 @@
|
|
+/*============================================================================= */
|
|
+/* Copyright (C) 2007 NXP N.V., All Rights Reserved. */
|
|
+/* This source code and any compilation or derivative thereof is the proprietary */
|
|
+/* information of NXP N.V. and is confidential in nature. Under no circumstances */
|
|
+/* is this software to be exposed to or placed under an Open Source License of */
|
|
+/* any type without the expressed written permission of NXP N.V. */
|
|
+/*============================================================================= */
|
|
+/*!
|
|
+ * \file dlHdmiCEC.c
|
|
+ *
|
|
+ * \version 1.0
|
|
+ *
|
|
+ * \date 24/07/2007
|
|
+ *
|
|
+ * \brief devlib driver component API for the CEC features.
|
|
+ *
|
|
+ * \section refs Reference Documents
|
|
+ * TDA998X Driver - tx - SCS.doc
|
|
+ * \note None.
|
|
+ *
|
|
+ * HISTORY :
|
|
+ * \verbatim
|
|
+ * Date Modified by CRPRNr TASKNr Maintenance description
|
|
+ * -------------|-----------|-------|-------|-----------------------------------
|
|
+ * 24/07/2007 | F.G | | | Creation.
|
|
+ * -------------|-----------|-------|-------|-----------------------------------
|
|
+ * \endverbatim
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+
|
|
+/*============================================================================*/
|
|
+/* FILE CONFIGURATION */
|
|
+/*============================================================================*/
|
|
+
|
|
+/*============================================================================*/
|
|
+/* STANDARD INCLUDE FILES */
|
|
+/*============================================================================*/
|
|
+
|
|
+/*============================================================================*/
|
|
+/* PROJECT INCLUDE FILES */
|
|
+/*============================================================================*/
|
|
+#ifdef __LINUX_ARM_ARCH__
|
|
+#include <linux/kernel.h>
|
|
+#else
|
|
+#include <string.h>
|
|
+#include <stdio.h>
|
|
+#endif
|
|
+#include "tmdlHdmiCEC_IW.h"
|
|
+#include "tmdlHdmiCEC_cfg.h"
|
|
+#include "tmdlHdmiCEC.h"
|
|
+#include "tmdlHdmiCEC_local.h"
|
|
+
|
|
+/*============================================================================*/
|
|
+/* MACRO DEFINITIONS */
|
|
+/*============================================================================*/
|
|
+#ifdef __LINUX_ARM_ARCH__
|
|
+#define DV_DBG_PRINT printk
|
|
+#else
|
|
+#define DV_DBG_PRINT printf
|
|
+#endif
|
|
+
|
|
+/*============================================================================*/
|
|
+/* TYPE DEFINITIONS */
|
|
+/*============================================================================*/
|
|
+
|
|
+/*============================================================================*/
|
|
+/* PUBLIC VARIABLE DEFINITIONS */
|
|
+/*============================================================================*/
|
|
+dl_hdmi_cec_unit_config_t unit_table[MAX_UNITS] = {
|
|
+ {0, CEC_LOGICAL_ADDRESS_UNREGISTRED_BROADCAST, false, DL_HDMICEC_DEVICE_TDA9950, CEC_STATE_NOT_INITIALIZED, 0}
|
|
+};
|
|
+
|
|
+dl_hdmi_cec_driver_config_table_t gtmdl_hdmi_cec_driver_config_table[MAX_UNITS];
|
|
+
|
|
+dl_hdmi_cec_save_message_t gtmdl_hdmi_cec_driver_save_message;
|
|
+
|
|
+/*============================================================================*/
|
|
+/* STATIC CONSTANT DECLARATIONS */
|
|
+/*============================================================================*/
|
|
+
|
|
+/*============================================================================*/
|
|
+/* STATIC VARIABLE DECLARATIONS */
|
|
+/*============================================================================*/
|
|
+
|
|
+/*============================================================================*/
|
|
+/* STATIC FUNCTION DECLARATIONS */
|
|
+/*============================================================================*/
|
|
+
|
|
+/*============================================================================*/
|
|
+/* FUNCTIONS */
|
|
+/*============================================================================*/
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \fn tmErrorCode_t dlHdmiCecGetSWVersion( )
|
|
+ * \brief Get the software version of the driver.
|
|
+ *
|
|
+ * \param pSWVersion Pointer to the version structure
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_INCONSISTENT_PARAMS: an input parameter is
|
|
+ * inconsistent
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_get_swversion
|
|
+(
|
|
+ swversion_t *p_swversion
|
|
+)
|
|
+{
|
|
+ /* check that input pointer is not NULL */
|
|
+ RETIF(p_swversion == NULL, ERR_DLHDMICEC_INCONSISTENT_PARAMS)
|
|
+
|
|
+ /* copy SW version */
|
|
+ p_swversion->compatibility_nr = VERSION_COMPATIBILITY;
|
|
+ p_swversion->major_version_nr = VERSION_MAJOR;
|
|
+ p_swversion->minor_version_nr = VERSION_MINOR;
|
|
+
|
|
+ return(0);
|
|
+}
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \fn tmErrorCode_t dlHdmiCecGetNumberOfUnits( )
|
|
+ * \brief Get the number of available CEC devices in the system.
|
|
+ * A unit directly represents a physical device.
|
|
+ *
|
|
+ * \param pUnitCount Pointer to the number of available units.
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_INCONSISTENT_PARAMS: an input parameter is
|
|
+ * inconsistent
|
|
+ *
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_get_number_of_units
|
|
+(
|
|
+ u32 *p_unit_count
|
|
+)
|
|
+{
|
|
+ /* check that input pointer is not NULL */
|
|
+ RETIF(p_unit_count == NULL, ERR_DLHDMICEC_INCONSISTENT_PARAMS)
|
|
+
|
|
+ /* copy the maximum number of units */
|
|
+ *p_unit_count = MAX_UNITS;
|
|
+
|
|
+ return(0);
|
|
+}
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \fn tmErrorCode_t dlHdmiCecGetInstanceSetup( )
|
|
+ * \brief Get instance setup parameters.
|
|
+ *
|
|
+ * \param instance Instance identifier.
|
|
+ * \param pSetupInfo Pointer to the structure that will receive setup
|
|
+ * parameters
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_INCONSISTENT_PARAMS: an input parameter is
|
|
+ * inconsistent
|
|
+ *
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_get_instance_setup
|
|
+(
|
|
+ instance_t instance,
|
|
+ ptmdl_hdmi_cec_instance_setup_t p_setup_info
|
|
+)
|
|
+{
|
|
+ /* check if instance number is in range */
|
|
+ RETIF((instance < 0) || (instance >= MAX_UNITS), ERR_DLHDMICEC_BAD_INSTANCE)
|
|
+
|
|
+ /* check that input pointer is not NULL */
|
|
+ RETIF(p_setup_info == NULL, ERR_DLHDMICEC_INCONSISTENT_PARAMS)
|
|
+
|
|
+ /* check if unit corresponding to instance is opened */
|
|
+ RETIF(unit_table[instance].opened == false, ERR_DLHDMICEC_RESOURCE_NOT_OWNED)
|
|
+
|
|
+ p_setup_info->device_logical_address = unit_table[instance].device_logical_address;
|
|
+
|
|
+ return(0);
|
|
+}
|
|
+
|
|
+/*========================= ================================================= */
|
|
+/*!
|
|
+ * \fn tmErrorCode_t dlHdmiCecHandleInterrupt( )
|
|
+ * \brief Make device library handle an incoming interrupt. This function is
|
|
+ * used by application to tell the device library that the hardware
|
|
+ * sent an interrupt. It can also be used to poll the interrupt status
|
|
+ * of the device if the interrupt line is not physically connected to
|
|
+ * the CPU.
|
|
+ * This function is synchronous.
|
|
+ * This function is ISR friendly.
|
|
+ *
|
|
+ * \param instance Instance identifier.
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_BAD_HANDLE: the handle number is wrong
|
|
+ * - ERR_DLHDMICEC_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ * - ERR_DLHDMICEC_FULL: the queue is full
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_handle_interrupt
|
|
+(
|
|
+ instance_t instance
|
|
+)
|
|
+{
|
|
+ error_code_t err;
|
|
+ unsigned char i2c_read_buffer[19] ; /* I2C Read data buffer */
|
|
+ /* Pointer to Device Instance Structure */
|
|
+ dl_hdmi_cec_driver_config_table_t *p_dis;
|
|
+ /* Pointer to Cec Object */
|
|
+ dl_hdmi_cec_unit_config_t *p_cec_object;
|
|
+ dl_hdmi_cec_frame_format_t read_frame;
|
|
+ dl_hdmi_cec_save_message_t last_send_message;
|
|
+ int i;
|
|
+
|
|
+ p_dis = >mdl_hdmi_cec_driver_config_table[instance];
|
|
+ p_cec_object = &unit_table[instance];
|
|
+
|
|
+#ifdef TMFL_TDA9989
|
|
+ /*Check if pending CEC interruption */
|
|
+ err = get_cec_hw_registers(p_dis, E_REG_CEC_INT, i2c_read_buffer, 1);
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+ if((i2c_read_buffer[0] & CEC_INT_MASK) == 0x00) {
|
|
+ /*No CEC interruption pending. */
|
|
+ return 0;
|
|
+ }
|
|
+#endif
|
|
+
|
|
+ err = get_cec_hw_registers(p_dis, E_REG_CDR0, i2c_read_buffer, 19);
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+ /*Fill Frame structure with read data*/
|
|
+
|
|
+ /* Case of Receiving CECData.cnf*/
|
|
+ /*Inform Success or reason of failure of CEC message sending*/
|
|
+ if(i2c_read_buffer[1] == 0x01) {
|
|
+ /* Get Infos of last message send */
|
|
+ get_cec_last_message(&last_send_message);
|
|
+
|
|
+ if(last_send_message.message_type_polling) {
|
|
+ read_frame.frame_byte_count = i2c_read_buffer[0];
|
|
+ read_frame.address_byte = last_send_message.address_byte;
|
|
+ read_frame.data_bytes[0] = i2c_read_buffer[2];
|
|
+ } else {
|
|
+ read_frame.frame_byte_count = i2c_read_buffer[0] + 1;
|
|
+ read_frame.address_byte = last_send_message.address_byte;
|
|
+ read_frame.data_bytes[0] = i2c_read_buffer[2];
|
|
+ read_frame.data_bytes[1] = last_send_message.opcode;
|
|
+ }
|
|
+
|
|
+ p_cec_object->message_callback(DL_HDMICEC_CALLBACK_STATUS
|
|
+ , (void *) &read_frame, read_frame.frame_byte_count);
|
|
+ }
|
|
+
|
|
+ /* Case of Receiving CECData.ind*/
|
|
+ /*Give receive data from CEC bus*/
|
|
+ if(i2c_read_buffer[1] == 0x81) {
|
|
+ read_frame.frame_byte_count = i2c_read_buffer[0];
|
|
+ read_frame.address_byte = i2c_read_buffer[2];
|
|
+ for(i = 0; i < 15; i++) {
|
|
+ read_frame.data_bytes[i] = i2c_read_buffer[i+3];
|
|
+ }
|
|
+
|
|
+ p_cec_object->message_callback(DL_HDMICEC_CALLBACK_MESSAGE_AVAILABLE
|
|
+ , (void *) &read_frame, read_frame.frame_byte_count);
|
|
+ }
|
|
+
|
|
+ return(0);
|
|
+
|
|
+}
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \fn tmErrorCode_t dlHdmiCecOpen( )
|
|
+ * \brief Open unit 0 of CEC and provides the instance number to
|
|
+ * the caller. Note that one unit of CEC represents one physical
|
|
+ * CEC device and that only one instance per unit can be opened.
|
|
+ *
|
|
+ * \param pInstance Pointer to the variable that will receive the instance
|
|
+ * identifier.
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_UNIT_NUMBER: the unit number is wrong or
|
|
+ * the receiver instance is not initialised
|
|
+ * - ERR_DLHDMICEC_BAD_PARAMETER: a parameter is invalid or out
|
|
+ * of range
|
|
+ * - ERR_DLHDMICEC_RESOURCE_OWNED: the resource is already in use
|
|
+ * - ERR_DLHDMICEC_INIT_FAILED: the unit instance is already
|
|
+ * initialised or something wrong happened at lower level.
|
|
+ * - ERR_DLHDMICEC_INCONSISTENT_PARAMS: an input parameter is
|
|
+ * inconsistent
|
|
+ * - ERR_DLHDMICEC_NO_RESOURCES: the resource is not available
|
|
+ * - ERR_DLHDMICEC_INVALID_STATE: the state is invalid for
|
|
+ * the function
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_open
|
|
+(
|
|
+ instance_t *p_instance
|
|
+)
|
|
+{
|
|
+ /* directly call OpenM function for unit 0 and return the result */
|
|
+ return(dl_hdmi_cec_open_m(p_instance, (unit_select_t)0));
|
|
+}
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \fn tmErrorCode_t dlHdmiCecOpenM( )
|
|
+ * \brief Open a specific unit of CEC driver and provides the instance
|
|
+ * number to the caller. Note that one unit of CEC represents one
|
|
+ * physical CEC device and that only one instance per unit can be
|
|
+ * opened. This function switches driver's state machine to
|
|
+ * "initialized" state.
|
|
+ *
|
|
+ * \param pInstance Pointer to the structure that will receive the instance
|
|
+ * identifier.
|
|
+ * \param unit Unit number to be opened.
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_UNIT_NUMBER: the unit number is wrong or
|
|
+ * the receiver instance is not initialised
|
|
+ * - ERR_DLHDMICEC_BAD_PARAMETER: a parameter is invalid or out
|
|
+ * of range
|
|
+ * - ERR_DLHDMICEC_RESOURCE_OWNED: the resource is already in use
|
|
+ * - ERR_DLHDMICEC_INIT_FAILED: the unit instance is already
|
|
+ * initialised or something wrong happened at lower level.
|
|
+ * - ERR_DLHDMICEC_INCONSISTENT_PARAMS: an input parameter is
|
|
+ * inconsistent
|
|
+ * - ERR_DLHDMICEC_NO_RESOURCES: the resource is not available
|
|
+ * - ERR_DLHDMICEC_INVALID_STATE: the state is invalid for
|
|
+ * the function
|
|
+ *
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_open_m
|
|
+(
|
|
+ instance_t *p_instance,
|
|
+ unit_select_t unit
|
|
+)
|
|
+{
|
|
+
|
|
+ /* check if unit number is in range */
|
|
+ RETIF((unit < 0) || (unit >= MAX_UNITS), ERR_DLHDMICEC_BAD_UNIT_NUMBER)
|
|
+
|
|
+ /* check if Instance pointer is NULL */
|
|
+ RETIF(p_instance == NULL, ERR_DLHDMICEC_INCONSISTENT_PARAMS)
|
|
+
|
|
+ /* check if unit is already instanciated */
|
|
+ RETIF(unit_table[unit].opened == true, ERR_DLHDMICEC_RESOURCE_OWNED)
|
|
+
|
|
+ /* Ckeck the state */
|
|
+ RETIF(unit_table[unit].state != CEC_STATE_NOT_INITIALIZED, ERR_DLHDMICEC_INVALID_STATE)
|
|
+
|
|
+ /* instanciate unit and return corresponding instance number */
|
|
+ /* Since HW unit are only instanciable once, instance = unit */
|
|
+ unit_table[unit].opened = true;
|
|
+ unit_table[unit].message_callback = NULL;
|
|
+ /* Give a logical Address to Device */
|
|
+ unit_table[unit].device_logical_address = CEC_LOGICAL_ADDRESS_UNREGISTRED_BROADCAST;
|
|
+
|
|
+ /* Recover the configuration of the device library */
|
|
+ RETIF(dl_hdmi_cec_cfg_get_config(unit, >mdl_hdmi_cec_driver_config_table[unit]) != 0, ERR_DLHDMICEC_INIT_FAILED)
|
|
+
|
|
+ *p_instance = (instance_t)unit;
|
|
+
|
|
+ return(0);
|
|
+}
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \fn tmErrorCode_t dlHdmiCecClose( )
|
|
+ * \brief Close an instance of CEC driver.
|
|
+ *
|
|
+ * \param instance Instance identifier.
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ *
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_close
|
|
+(
|
|
+ instance_t instance
|
|
+)
|
|
+{
|
|
+ /* check if instance number is in range */
|
|
+ RETIF((instance < 0) || (instance >= MAX_UNITS), ERR_DLHDMICEC_BAD_INSTANCE)
|
|
+
|
|
+ /* check if unit corresponding to instance is opened */
|
|
+ RETIF(unit_table[instance].opened == false, ERR_DLHDMICEC_RESOURCE_NOT_OWNED)
|
|
+
|
|
+ /* close instance */
|
|
+ unit_table[instance].opened = false;
|
|
+ unit_table[instance].state = CEC_STATE_NOT_INITIALIZED;
|
|
+
|
|
+ return(0);
|
|
+}
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \fn tmErrorCode_t dlHdmiCecInstanceConfig( )
|
|
+ * \brief Set the configuration of instance attributes. This function is
|
|
+ * required by DVP architecture rules but actually does nothing in this
|
|
+ * driver
|
|
+ *
|
|
+ * \param instance Instance identifier.
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_BAD_PARAMETER: a parameter is invalid or out
|
|
+ * of range
|
|
+ *
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_instance_config
|
|
+(
|
|
+ instance_t instance
|
|
+)
|
|
+{
|
|
+ if(instance);
|
|
+
|
|
+ return(0);
|
|
+}
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \fn tmErrorCode_t dlHdmiCecInstanceSetup( )
|
|
+ * \brief Setup the instance with its configuration parameters. This function
|
|
+ * allows basic instance configuration for CEC Stack Processor.
|
|
+ *
|
|
+ * \param instance Instance identifier.
|
|
+ * \param pSetupInfo Pointer to the structure containing all setup parameters
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_PARAMETER: a parameter is invalid or out
|
|
+ * of range
|
|
+ * - ERR_DLHDMICEC_INCONSISTENT_PARAMS: an input parameter is
|
|
+ * inconsistent
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ *
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_instance_setup
|
|
+(
|
|
+ instance_t instance,
|
|
+ dl_hdmi_cec_instance_setup_t *p_setup_info
|
|
+)
|
|
+{
|
|
+ error_code_t err;
|
|
+ /* Pointer to Device Instance Structure */
|
|
+ dl_hdmi_cec_driver_config_table_t *p_dis;
|
|
+#ifdef TMFL_TDA9989
|
|
+ unsigned char i2c_read_buffer[1];
|
|
+#endif
|
|
+
|
|
+ /* check if instance number is in range */
|
|
+ RETIF((instance < 0) || (instance >= MAX_UNITS), ERR_DLHDMICEC_BAD_INSTANCE)
|
|
+
|
|
+ /* check that input pointer is not NULL */
|
|
+ RETIF(p_setup_info == NULL, ERR_DLHDMICEC_INCONSISTENT_PARAMS)
|
|
+
|
|
+ /* check if unit corresponding to instance is opened */
|
|
+ RETIF(unit_table[instance].opened == false, ERR_DLHDMICEC_RESOURCE_NOT_OWNED)
|
|
+
|
|
+ /* Ckeck the state */
|
|
+ RETIF(unit_table[instance].state != CEC_STATE_NOT_INITIALIZED, ERR_DLHDMICEC_INVALID_STATE)
|
|
+
|
|
+ p_dis = >mdl_hdmi_cec_driver_config_table[instance];
|
|
+
|
|
+ /* Wait for 250 ms */
|
|
+ RETIF((err = tx_iwwait(500)) != 0, err)
|
|
+
|
|
+#ifdef TMFL_TDA9989
|
|
+ /* Enable CEC Stack Processor */
|
|
+ err = get_cec_hw_registers(p_dis, E_REG_CDR0, i2c_read_buffer, 1);
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+ err = get_cec_hw_registers(p_dis, E_REG_ENAMODS, i2c_read_buffer, 1);
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+ i2c_read_buffer[0] |= DEFAULT_ENAMODS;
|
|
+
|
|
+ err = set_cec_hw_register(p_dis, E_REG_ENAMODS, i2c_read_buffer[0]);
|
|
+ if(err != 0) {
|
|
+ /*TODO WA still needed? */
|
|
+ err = set_cec_hw_register(p_dis, E_REG_ENAMODS, i2c_read_buffer[0]);
|
|
+ RETIF(err != 0, err)
|
|
+ }
|
|
+
|
|
+ RETIF((err = tx_iwwait(TDA9950_RESET_DELAY_MS)) != 0, err)
|
|
+
|
|
+ /* Select CEC clock source and divider value */
|
|
+
|
|
+ if(p_setup_info->cec_clock_source == DL_HDMICEC_CLOCK_XTAL) {
|
|
+ err = get_cec_hw_registers(p_dis, E_REG_CEC_CLK, i2c_read_buffer, 1);
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+ i2c_read_buffer[0] &= CEC_CLK_SEL;
|
|
+ err = set_cec_hw_register(p_dis, E_REG_CEC_CLK, i2c_read_buffer[0]);
|
|
+ }
|
|
+
|
|
+ RETIF((err = tx_iwwait(TDA9950_RESET_DELAY_MS)) != 0, err)
|
|
+
|
|
+ /*TODO WA to avoid spurious interrupts */
|
|
+ err = get_cec_hw_registers(p_dis, E_REG_CDR0, i2c_read_buffer, 1);
|
|
+ RETIF(err != 0, err)
|
|
+#endif
|
|
+
|
|
+ /* Reset CEC Stack Processor */
|
|
+ err = set_cec_hw_register(p_dis, E_REG_CCR, 0x80);
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+ /* Wait for 250 ms */
|
|
+ RETIF((err = tx_iwwait(TDA9950_RESET_DELAY_MS)) != 0, err)
|
|
+
|
|
+ /* Configure Stack Processor (Retry = 5)*/
|
|
+ err = set_cec_hw_register(p_dis, E_REG_CCONR, 0x05);
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+ unit_table[instance].device_logical_address = p_setup_info->device_logical_address;
|
|
+
|
|
+ /* CEC Control register */
|
|
+ err = set_cec_hw_register_msb_lsb(p_dis, E_REG_ACKH, 0x1 << (unit_table[instance].device_logical_address));
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+ /* CEC Stack Processor enable*/
|
|
+ err = set_cec_hw_register(p_dis, E_REG_CCR, 0x40);
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+ /* switch instance to its new state */
|
|
+ unit_table[instance].state = CEC_STATE_CONFIGURED;
|
|
+
|
|
+ return(0);
|
|
+}
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \fn tmErrorCode_t dlHdmiCecRegisterCallback( )
|
|
+ * \brief Register event callbacks. Three types of callbacks can be
|
|
+ * registered : input activity related callback, data related
|
|
+ * callback (infoframes, packets, etc.) and general information
|
|
+ * callback. A null pointer means that no callback are registered.
|
|
+ *
|
|
+ * \param instance Instance identifier.
|
|
+ * \param MessageCallback Pointer to the callback function that will
|
|
+ * handle message related events.
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ * - ERR_DLHDMICEC_INVALID_STATE: the state is invalid for
|
|
+ * the function
|
|
+ *
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_register_callbacks
|
|
+(
|
|
+ instance_t instance,
|
|
+ ptmdl_hdmi_cec_callback_func_t message_callback
|
|
+)
|
|
+{
|
|
+ /* check if instance number is in range */
|
|
+ RETIF((instance < 0) || (instance >= MAX_UNITS), ERR_DLHDMICEC_BAD_INSTANCE)
|
|
+
|
|
+ /* check if unit corresponding to instance is opened */
|
|
+ RETIF(unit_table[instance].opened == false, ERR_DLHDMICEC_RESOURCE_NOT_OWNED)
|
|
+
|
|
+ /* check if instance state is correct */
|
|
+ /*RETIF(UnitTable[instance].state != STATE_NOT_INITIALIZED, ERR_DLHDMICEC_INVALID_STATE) */
|
|
+
|
|
+ /* store callback pointers */
|
|
+ unit_table[instance].message_callback = message_callback;
|
|
+
|
|
+ return(0);
|
|
+}
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \fn tmErrorCode_t dlHdmiCecSetLogicalAddress( )
|
|
+ * \brief Set Device Logical Address
|
|
+ *
|
|
+ * \param instance Instance identifier.
|
|
+ * \param LogicalAddress Logical address value.
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ *
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_set_logical_address
|
|
+(
|
|
+ instance_t instance,
|
|
+ dl_hdmi_ceclogical_address_t logical_address
|
|
+)
|
|
+{
|
|
+ error_code_t err;
|
|
+ /* Pointer to Device Instance Structure */
|
|
+ dl_hdmi_cec_driver_config_table_t *p_dis;
|
|
+
|
|
+ /* check if instance number is in range */
|
|
+ RETIF((instance < 0) || (instance >= MAX_UNITS), ERR_DLHDMICEC_BAD_INSTANCE)
|
|
+
|
|
+ /* check if unit corresponding to instance is opened */
|
|
+ RETIF(unit_table[instance].opened == false, ERR_DLHDMICEC_RESOURCE_NOT_OWNED)
|
|
+
|
|
+ /* Ckeck the state */
|
|
+ RETIF(unit_table[instance].state != CEC_STATE_CONFIGURED, ERR_DLHDMICEC_INVALID_STATE)
|
|
+
|
|
+ p_dis = >mdl_hdmi_cec_driver_config_table[instance];
|
|
+
|
|
+ unit_table[instance].device_logical_address = logical_address;
|
|
+
|
|
+ err = set_cec_hw_register_msb_lsb(p_dis, E_REG_ACKH, 0x1 << (unit_table[instance].device_logical_address));
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+ return(0);
|
|
+}
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \fn tmErrorCode_t dlHdmiCecSetRetry( )
|
|
+ * \brief Change the number of retransmission
|
|
+ *
|
|
+ * \param instance Instance identifier.
|
|
+ * \param NbRetry Number of retry.
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ *
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_set_retry
|
|
+(
|
|
+ instance_t instance,
|
|
+ u8 nb_retry
|
|
+)
|
|
+{
|
|
+ error_code_t err;
|
|
+ /* Pointer to Device Instance Structure */
|
|
+ dl_hdmi_cec_driver_config_table_t *p_dis;
|
|
+
|
|
+ /* check if instance number is in range */
|
|
+ RETIF((instance < 0) || (instance >= MAX_UNITS), ERR_DLHDMICEC_BAD_INSTANCE)
|
|
+
|
|
+ /* check if unit corresponding to instance is opened */
|
|
+ RETIF(unit_table[instance].opened == false, ERR_DLHDMICEC_RESOURCE_NOT_OWNED)
|
|
+
|
|
+ /* Ckeck the state */
|
|
+ RETIF(unit_table[instance].state != CEC_STATE_CONFIGURED, ERR_DLHDMICEC_INVALID_STATE)
|
|
+
|
|
+ p_dis = >mdl_hdmi_cec_driver_config_table[instance];
|
|
+
|
|
+ /* Configure Retry register */
|
|
+ err = set_cec_hw_register(p_dis, E_REG_CCONR, nb_retry);
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+ return(0);
|
|
+}
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \fn tmErrorCode_t getCecLastMessage( )
|
|
+ * \brief Return the Addresses and the Opcode of the last CEC
|
|
+ * transmitted message
|
|
+ *
|
|
+ * \param pSaveMessage Pointer to the CEC Save Message
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ *
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t get_cec_last_message
|
|
+(
|
|
+ dl_hdmi_cec_save_message_t *p_save_message
|
|
+)
|
|
+{
|
|
+ /* copy Last CEC message datas */
|
|
+ p_save_message->address_byte = gtmdl_hdmi_cec_driver_save_message.address_byte;
|
|
+ p_save_message->message_type_polling = gtmdl_hdmi_cec_driver_save_message.message_type_polling;
|
|
+ p_save_message->opcode = gtmdl_hdmi_cec_driver_save_message.opcode;
|
|
+
|
|
+ return(0);
|
|
+}
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \fn tmErrorCode_t dlHdmiCecImageViewOn( )
|
|
+ * \brief This message sent by a source device to the TV whenever it enters
|
|
+ * the active state
|
|
+ *
|
|
+ * \param tmInstance_t Instance \n
|
|
+ * Instance identifier. \n
|
|
+ *
|
|
+ * \param u8 ReceiverLogicalAddress \n
|
|
+ * Address of message receivers. \n
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ *
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_image_view_on
|
|
+(
|
|
+ instance_t instance,
|
|
+ u8 receiver_logical_address
|
|
+)
|
|
+{
|
|
+ error_code_t err;
|
|
+ unsigned char i2c_buffer[4] ; /* I2C Write data buffer */
|
|
+ /* Pointer to Device Instance Structure */
|
|
+ dl_hdmi_cec_driver_config_table_t *p_dis;
|
|
+
|
|
+ /* check if instance number is in range */
|
|
+ RETIF((instance < 0) || (instance >= MAX_UNITS), ERR_DLHDMICEC_BAD_INSTANCE)
|
|
+
|
|
+ /* check if unit corresponding to instance is opened */
|
|
+ /*RETIF(UnitTable[instance].opened == false, ERR_DLHDMICEC_RESOURCE_NOT_OWNED) */
|
|
+
|
|
+ /* check if instance state is correct */
|
|
+ /*RETIF(UnitTable[instance].state != STATE_NOT_INITIALIZED, ERR_DLHDMICEC_INVALID_STATE) */
|
|
+
|
|
+ p_dis = >mdl_hdmi_cec_driver_config_table[instance];
|
|
+
|
|
+ /*======To do : make a prepare message function with parameter */
|
|
+ /* Image View On command */
|
|
+
|
|
+ i2c_buffer[0] = 0x04; /* Param number */
|
|
+
|
|
+ i2c_buffer[1] = 0x00; /* Request CEC data */
|
|
+
|
|
+ /*Build Initiator and Reciever Logical Address Byte*/
|
|
+ /*Initiator logical Address*/
|
|
+ i2c_buffer[2] = (unsigned char)(unit_table[instance].device_logical_address) & 0x0F;
|
|
+ i2c_buffer[2] = i2c_buffer[2] << 4;
|
|
+ /* Receiver logical Address*/
|
|
+ i2c_buffer[2] |= receiver_logical_address & 0x0F;
|
|
+
|
|
+ i2c_buffer[3] = CEC_OPCODE_IMAGE_VIEW_ON ;
|
|
+
|
|
+ /* CEC Data register */
|
|
+ err = set_cec_hw_registers(p_dis, E_REG_CDR0, i2c_buffer, 4);
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+ /* Save Datas of the CEC message send */
|
|
+ gtmdl_hdmi_cec_driver_save_message.address_byte = i2c_buffer[2];
|
|
+ gtmdl_hdmi_cec_driver_save_message.message_type_polling = 0;
|
|
+ gtmdl_hdmi_cec_driver_save_message.opcode = i2c_buffer[3];
|
|
+
|
|
+ return(0);
|
|
+}
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \fn tmErrorCode_t dlHdmiCecInactiveSource( )
|
|
+ * \brief This message is used by the currently active source to inform the
|
|
+ * TV that it has no video to be presented to the user, or is going
|
|
+ * into standby as the result of a lcoal user command on the device.
|
|
+ *
|
|
+ * \param tmInstance_t Instance \n
|
|
+ * Instance identifier. \n
|
|
+ *
|
|
+ * \param u8 ReceiverLogicalAddress, \n
|
|
+ * Address of message receiver. \n
|
|
+ *
|
|
+ * \param dlHdmiCECExternalPhysicalAddress_t PhysicalAddress \n
|
|
+ * Physical Address of the device. \n
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ *
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_inactive_source
|
|
+(
|
|
+ instance_t instance,
|
|
+ u8 receiver_logical_address,
|
|
+ dl_hdmi_cecexternal_physical_address_t physical_address
|
|
+)
|
|
+{
|
|
+ error_code_t err;
|
|
+ unsigned char i2c_buffer[6] ; /* I2C data buffer */
|
|
+ /* Pointer to Device Instance Structure */
|
|
+ dl_hdmi_cec_driver_config_table_t *p_dis;
|
|
+
|
|
+ /* check if instance number is in range */
|
|
+ RETIF((instance < 0) || (instance >= MAX_UNITS), ERR_DLHDMICEC_BAD_INSTANCE)
|
|
+
|
|
+ /* check if unit corresponding to instance is opened */
|
|
+ RETIF(unit_table[instance].opened == false, ERR_DLHDMICEC_RESOURCE_NOT_OWNED)
|
|
+
|
|
+ /* check if instance state is correct */
|
|
+ /*RETIF(UnitTable[Instance].state != STATE_NOT_INITIALIZED, ERR_DLHDMICEC_INVALID_STATE) */
|
|
+
|
|
+ p_dis = >mdl_hdmi_cec_driver_config_table[instance];
|
|
+ /*======To do : make a prepare message function with parameter */
|
|
+ /* Inactive source command */
|
|
+ i2c_buffer[0] = 0x06;
|
|
+
|
|
+ i2c_buffer[1] = 0x00; /* Request CEC data */
|
|
+
|
|
+ /*Build Initiator and Reciever Logical Address Byte*/
|
|
+ /*Initiator logical Address*/
|
|
+ i2c_buffer[2] = (unsigned char)(unit_table[instance].device_logical_address) & 0x0F;
|
|
+ i2c_buffer[2] = i2c_buffer[2] << 4;
|
|
+ /* Receiver logical Address*/
|
|
+ i2c_buffer[2] |= receiver_logical_address & 0x0F;
|
|
+
|
|
+ i2c_buffer[3] = CEC_OPCODE_INACTIVE_SOURCE ; /* Inactive Source*/
|
|
+ /* MsByte of Physical Address */
|
|
+ i2c_buffer[4] = (unsigned char)(physical_address >> 8);
|
|
+ /* LsByte of Physical Address */
|
|
+ i2c_buffer[5] = (unsigned char)physical_address;
|
|
+
|
|
+ /* CEC Data register */
|
|
+ err = set_cec_hw_registers(p_dis, E_REG_CDR0, i2c_buffer, 6);
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+ /* Save Datas of the CEC message send */
|
|
+ gtmdl_hdmi_cec_driver_save_message.address_byte = i2c_buffer[2];
|
|
+ gtmdl_hdmi_cec_driver_save_message.message_type_polling = 0;
|
|
+ gtmdl_hdmi_cec_driver_save_message.opcode = i2c_buffer[3];
|
|
+
|
|
+ return(0);
|
|
+}
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \fn tmErrorCode_t dlHdmiCecActiveSource()
|
|
+ * \brief This message is used by a new source to indicate that it has started
|
|
+ * to transmit a stream OR used in reponse to a <Request Active Source>
|
|
+ *
|
|
+ * \param tmInstance_t Instance \n
|
|
+ * Instance identifier. \n
|
|
+ *
|
|
+ * \param u16 PhysicalAddress \n
|
|
+ * Physical address of the device.\n
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_BAD_PARAMETER: a parameter is invalid or out
|
|
+ * of range
|
|
+ * - ERR_DLHDMICEC_INCONSISTENT_PARAMS: an input parameter is
|
|
+ * inconsistent
|
|
+ *
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_active_source
|
|
+(
|
|
+ instance_t instance,
|
|
+ u16 physical_address
|
|
+)
|
|
+{
|
|
+ error_code_t err;
|
|
+ unsigned char i2c_buffer[6] ; /* I2C data buffer */
|
|
+ /* Pointer to Device Instance Structure */
|
|
+ dl_hdmi_cec_driver_config_table_t *p_dis;
|
|
+
|
|
+ /* check if instance number is in range */
|
|
+ RETIF((instance < 0) || (instance >= MAX_UNITS), ERR_DLHDMICEC_BAD_INSTANCE)
|
|
+
|
|
+ /* check if unit corresponding to instance is opened */
|
|
+ RETIF(unit_table[instance].opened == false, ERR_DLHDMICEC_RESOURCE_NOT_OWNED)
|
|
+
|
|
+ /* check if instance state is correct */
|
|
+ /*RETIF(UnitTable[Instance].state != STATE_NOT_INITIALIZED, ERR_DLHDMICEC_INVALID_STATE) */
|
|
+
|
|
+ p_dis = >mdl_hdmi_cec_driver_config_table[instance];
|
|
+
|
|
+ /*======To do : make a prepare message function with parameter */
|
|
+ /* Active Source command */
|
|
+ i2c_buffer[0] = 0x06; /* Param number */
|
|
+
|
|
+ i2c_buffer[1] = 0x00; /* Request CEC data */
|
|
+
|
|
+ /*Build Initiator and Reciever Logical Address Byte*/
|
|
+ /*Initiator logical Address*/
|
|
+ i2c_buffer[2] = (unsigned char)(unit_table[instance].device_logical_address) & 0x0F;
|
|
+ i2c_buffer[2] = i2c_buffer[2] << 4;
|
|
+ /* Broadcast*/
|
|
+ i2c_buffer[2] |= 0x0F;
|
|
+
|
|
+ i2c_buffer[3] = CEC_OPCODE_ACTIVE_SOURCE ; /* Active source */
|
|
+ /* MsByte of Physical Address */
|
|
+ i2c_buffer[4] = (unsigned char)(physical_address >> 8);
|
|
+ /* LsByte of Physical Address */
|
|
+ i2c_buffer[5] = (unsigned char)physical_address;
|
|
+
|
|
+ /* CEC Data register */
|
|
+ err = set_cec_hw_registers(p_dis, E_REG_CDR0, i2c_buffer, 6);
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+ /* Save Datas of the CEC message send */
|
|
+ gtmdl_hdmi_cec_driver_save_message.address_byte = i2c_buffer[2];
|
|
+ gtmdl_hdmi_cec_driver_save_message.message_type_polling = 0;
|
|
+ gtmdl_hdmi_cec_driver_save_message.opcode = i2c_buffer[3];
|
|
+
|
|
+ return(0);
|
|
+}
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \fn tmErrorCode_t dlHdmiCecVersion()
|
|
+ * \brief This message is used to indicate the supported CEC version in response
|
|
+ * to a <Get CEC Version>
|
|
+ *
|
|
+ * \param tmInstance_t Instance \n
|
|
+ * Instance identifier. \n
|
|
+ *
|
|
+ * \param u8 ReceiverLogicalAddress\n
|
|
+ * Address of message receiver. \n
|
|
+ *
|
|
+ * \param dlHdmiCECVersion_t CECVersion \n
|
|
+ * Supported CEC Version.\n
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_BAD_PARAMETER: a parameter is invalid or out
|
|
+ * of range
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_version
|
|
+(
|
|
+ instance_t instance,
|
|
+ u8 receiver_logical_address,
|
|
+ dl_hdmi_cecversion_t cecversion
|
|
+)
|
|
+{
|
|
+ error_code_t err;
|
|
+ unsigned char i2c_buffer[5] ; /* I2C data buffer */
|
|
+ /* Pointer to Device Instance Structure */
|
|
+ dl_hdmi_cec_driver_config_table_t *p_dis;
|
|
+
|
|
+ /* check if instance number is in range */
|
|
+ RETIF((instance < 0) || (instance >= MAX_UNITS), ERR_DLHDMICEC_BAD_INSTANCE)
|
|
+
|
|
+ /* check if unit corresponding to instance is opened */
|
|
+ RETIF(unit_table[instance].opened == false, ERR_DLHDMICEC_RESOURCE_NOT_OWNED)
|
|
+
|
|
+ /* check if instance state is correct */
|
|
+ /*RETIF(UnitTable[Instance].state != STATE_NOT_INITIALIZED, ERR_DLHDMICEC_INVALID_STATE) */
|
|
+
|
|
+ p_dis = >mdl_hdmi_cec_driver_config_table[instance];
|
|
+
|
|
+ /*======To do : make a prepare message function with parameter */
|
|
+ /* CEC Version command */
|
|
+ i2c_buffer[0] = 0x05; /* Param number */
|
|
+
|
|
+ i2c_buffer[1] = 0x00; /* Request CEC data */
|
|
+
|
|
+ /*Build Initiator and Reciever Logical Address Byte*/
|
|
+ /*Initiator logical Address*/
|
|
+ i2c_buffer[2] = (unsigned char)(unit_table[instance].device_logical_address) & 0x0F;
|
|
+ i2c_buffer[2] = i2c_buffer[2] << 4;
|
|
+ /* Receiver logical Address*/
|
|
+ i2c_buffer[2] |= receiver_logical_address & 0x0F;
|
|
+
|
|
+ i2c_buffer[3] = CEC_OPCODE_CEC_VERSION ; /* CECVersion*/
|
|
+ i2c_buffer[4] = cecversion;
|
|
+
|
|
+ /* CEC Data register */
|
|
+ err = set_cec_hw_registers(p_dis, E_REG_CDR0, i2c_buffer, 5);
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+ /* Save Datas of the CEC message send */
|
|
+ gtmdl_hdmi_cec_driver_save_message.address_byte = i2c_buffer[2];
|
|
+ gtmdl_hdmi_cec_driver_save_message.message_type_polling = 0;
|
|
+ gtmdl_hdmi_cec_driver_save_message.opcode = i2c_buffer[3];
|
|
+
|
|
+ return(0);
|
|
+}
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \fn tmErrorCode_t dlHdmiCecClearAnalogueTimer( )
|
|
+ * \brief This message is used to clear an Analogue timer block of a device
|
|
+ *
|
|
+ * \param tmInstance_t Instance \n
|
|
+ * Instance identifier. \n
|
|
+ *
|
|
+ * \param u8 ReceiverLogicalAddress \n
|
|
+ * Address of message receiver. \n
|
|
+ *
|
|
+ * \param u8 DayOfMonth \n
|
|
+ * Day of the month.\n
|
|
+ *
|
|
+ * \param u8 MonthOfYear \n
|
|
+ * Month of the year.\n
|
|
+ *
|
|
+ * \param u16 StartTime \n
|
|
+ * Start time for a timer based recording.\n
|
|
+ *
|
|
+ * \param u16 Duration \n
|
|
+ * Pointer to the structure dlHdmiCECDuration_t in BCD format.\n
|
|
+ *
|
|
+ * \param u8 Recording Sequence \n
|
|
+ * Indicates if recording is repeated and, if so, on which day
|
|
+ * For repeated recording the recording sequence value is the
|
|
+ * bitwise OR of the days when recordings are required
|
|
+ * Shall be set to 0x00 when recording is not repeated.\n
|
|
+ *
|
|
+ * \param dlHdmiCECAnalogueBroadcastType_t AnalogueBroadcastType \n
|
|
+ * "Cable,Sattellite,Terrestrial".\n
|
|
+ *
|
|
+ * \param u16 AnalogueFrequency \n
|
|
+ * Specify frequency used by analogue tuner (0x0000<=N<=0xFFFF).\n
|
|
+ *
|
|
+ * \param dlHdmiCECBroadcastSystem_t BroadcastSystem \n
|
|
+ * Specify information about the colour system, the sound carrier and
|
|
+ * the IF-frequency.\n
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_BAD_PARAMETER: a parameter is invalid or out
|
|
+ * of range
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_clear_analogue_timer
|
|
+(
|
|
+ instance_t instance,
|
|
+ u8 receiver_logical_address,
|
|
+ u8 day_of_month,
|
|
+ u8 month_of_year,
|
|
+ u16 start_time,
|
|
+ dl_hdmi_cecduration_t *p_duration,
|
|
+ u8 recording_sequence,
|
|
+ dl_hdmi_cecanalogue_broadcast_type_t analogue_broadcast_type,
|
|
+ u16 analogue_frequency,
|
|
+ dl_hdmi_cecbroadcast_system_t broadcast_system
|
|
+)
|
|
+{
|
|
+ error_code_t err;
|
|
+ unsigned char i2c_buffer[15] ; /* I2C data buffer */
|
|
+ /* Pointer to Device Instance Structure */
|
|
+ dl_hdmi_cec_driver_config_table_t *p_dis;
|
|
+
|
|
+ /* check if instance number is in range */
|
|
+ RETIF((instance < 0) || (instance >= MAX_UNITS), ERR_DLHDMICEC_BAD_INSTANCE)
|
|
+
|
|
+ /* check if unit corresponding to instance is opened */
|
|
+ RETIF(unit_table[instance].opened == false, ERR_DLHDMICEC_RESOURCE_NOT_OWNED)
|
|
+
|
|
+ /* check if instance state is correct */
|
|
+ /*RETIF(UnitTable[Instance].state != STATE_NOT_INITIALIZED, ERR_DLHDMICEC_INVALID_STATE) */
|
|
+
|
|
+ p_dis = >mdl_hdmi_cec_driver_config_table[instance];
|
|
+
|
|
+ /*======To do : make a prepare message function with parameter */
|
|
+ /* Clear Analogue Timer command */
|
|
+ i2c_buffer[0] = 0x0f; /* Param number */
|
|
+
|
|
+ i2c_buffer[1] = 0x00; /* Request CEC data */
|
|
+
|
|
+ /*Build Initiator and Reciever Logical Address Byte*/
|
|
+ /*Initiator logical Address*/
|
|
+ i2c_buffer[2] = (unsigned char)(unit_table[instance].device_logical_address) & 0x0F;
|
|
+ i2c_buffer[2] = i2c_buffer[2] << 4;
|
|
+ /* Receiver logical Address*/
|
|
+ i2c_buffer[2] |= receiver_logical_address & 0x0F;
|
|
+
|
|
+ i2c_buffer[3] = CEC_OPCODE_CLEAR_ANALOGUE_TIMER ;
|
|
+ i2c_buffer[4] = day_of_month; /*Day of Month*/
|
|
+ i2c_buffer[5] = month_of_year; /*Month of Year*/
|
|
+ i2c_buffer[6] = (unsigned char)(start_time >> 8); /*Start Time*/
|
|
+ i2c_buffer[7] = (u8)start_time;
|
|
+ i2c_buffer[8] = p_duration -> hours; /*Duration Hours*/
|
|
+ i2c_buffer[9] = p_duration -> minute; /*Duration minute*/
|
|
+ i2c_buffer[10] = recording_sequence; /*Recording Sequence*/
|
|
+ /*Analogue Broadcast Type*/
|
|
+ i2c_buffer[11] = analogue_broadcast_type;
|
|
+ /*Analogue Frequency*/
|
|
+ i2c_buffer[12] = (unsigned char)(analogue_frequency >> 8);
|
|
+ i2c_buffer[13] = (unsigned char)analogue_frequency;
|
|
+ i2c_buffer[14] = broadcast_system; /*BroadcastSystem*/
|
|
+
|
|
+ /* CEC Data register */
|
|
+ err = set_cec_hw_registers(p_dis, E_REG_CDR0, i2c_buffer, 15);
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+ /* Save Datas of the CEC message send */
|
|
+ gtmdl_hdmi_cec_driver_save_message.address_byte = i2c_buffer[2];
|
|
+ gtmdl_hdmi_cec_driver_save_message.message_type_polling = 0;
|
|
+ gtmdl_hdmi_cec_driver_save_message.opcode = i2c_buffer[3];
|
|
+
|
|
+ return(0);
|
|
+}
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \fn tmErrorCode_t dlHdmiCecClearDigitalTimer( )
|
|
+ * \brief This message is used to clear a digital timer block of a device
|
|
+ *
|
|
+ * \param tmInstance_t Instance \n
|
|
+ * Instance identifier. \n
|
|
+ *
|
|
+ * \param u8 ReceiverLogicalAddress \n
|
|
+ * Address of message receiver. \n
|
|
+ *
|
|
+ * \param u8 DayOfMonth \n
|
|
+ * Day of the month.\n
|
|
+ *
|
|
+ * \param u8 MonthOfYear \n
|
|
+ * Month of the year.\n
|
|
+ *
|
|
+ * \param u16 StartTime \n
|
|
+ * Start time for a timer based recording.\n
|
|
+ *
|
|
+ * \param u16 Duration \n
|
|
+ * Pointer to the structure dlHdmiCECDuration_t in BCD format.\n
|
|
+ *
|
|
+ * \param u8 Recording Sequence \n
|
|
+ * Indicates if recording is repeated and, if so, on which day
|
|
+ * For repeated recording the recording sequence value is the
|
|
+ * bitwise OR of the days when recordings are required
|
|
+ * Shall be set to 0x00 when recording is not repeated.\n
|
|
+ *
|
|
+ * \param dlHdmiCECDigitalServiceIdentification_t *pServiceIdentification \n
|
|
+ * Pointer to the structure Digital Service Identification
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_BAD_PARAMETER: a parameter is invalid or out
|
|
+ * of range
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_clear_digital_timer
|
|
+(
|
|
+ instance_t instance,
|
|
+ u8 receiver_logical_address,
|
|
+ u8 day_of_month,
|
|
+ u8 month_of_year,
|
|
+ u16 start_time,
|
|
+ dl_hdmi_cecduration_t *p_duration,
|
|
+ u8 recording_sequence,
|
|
+ dl_hdmi_cecdigital_service_identification_t *p_service_identification
|
|
+)
|
|
+{
|
|
+ error_code_t err;
|
|
+ unsigned char i2c_buffer[18] ; /* I2C data buffer */
|
|
+ /* Pointer to Device Instance Structure */
|
|
+ dl_hdmi_cec_driver_config_table_t *p_dis;
|
|
+ dl_hdmi_cecarib_data_t *p_arib_pointer;
|
|
+ dl_hdmi_cecatsc_data_t *p_atsc_pointer;
|
|
+ dl_hdmi_cecdvb_data_t *p_dvb_pointer;
|
|
+
|
|
+ unsigned char regval; /* Local variable*/
|
|
+
|
|
+ /* check if instance number is in range */
|
|
+ RETIF((instance < 0) || (instance >= MAX_UNITS), ERR_DLHDMICEC_BAD_INSTANCE)
|
|
+
|
|
+ /* check if unit corresponding to instance is opened */
|
|
+ RETIF(unit_table[instance].opened == false, ERR_DLHDMICEC_RESOURCE_NOT_OWNED)
|
|
+
|
|
+ /* check if instance state is correct */
|
|
+ /*RETIF(UnitTable[Instance].state != STATE_NOT_INITIALIZED, ERR_DLHDMICEC_INVALID_STATE) */
|
|
+
|
|
+ p_dis = >mdl_hdmi_cec_driver_config_table[instance];
|
|
+
|
|
+ /*======To do : make a prepare message function with parameter */
|
|
+ /* Clear Digital Timer command */
|
|
+ i2c_buffer[0] = 0x12; /* Param number */
|
|
+
|
|
+ i2c_buffer[1] = 0x00; /* Request CEC data */
|
|
+
|
|
+ /*Build Initiator and Reciever Logical Address Byte*/
|
|
+ /*Initiator logical Address*/
|
|
+ i2c_buffer[2] = (unsigned char)(unit_table[instance].device_logical_address) & 0x0F;
|
|
+ i2c_buffer[2] = i2c_buffer[2] << 4;
|
|
+ /* Receiver logical Address*/
|
|
+ i2c_buffer[2] |= receiver_logical_address & 0x0F;
|
|
+
|
|
+ i2c_buffer[3] = CEC_OPCODE_CLEAR_DIGITAL_TIMER ;
|
|
+ i2c_buffer[4] = day_of_month; /*Day of Month*/
|
|
+ i2c_buffer[5] = month_of_year; /*Month of Year*/
|
|
+ i2c_buffer[6] = (unsigned char)(start_time >> 8); /*Start Time*/
|
|
+ i2c_buffer[7] = (u8)start_time;
|
|
+ i2c_buffer[8] = p_duration -> hours; /*Duration Hours*/
|
|
+ i2c_buffer[9] = p_duration -> minute; /*Durantion Minute*/
|
|
+ i2c_buffer[10] = recording_sequence; /*Recording Sequence*/
|
|
+
|
|
+ /* Digital service Identification*/
|
|
+ /*Merge Service Method and Digital Broadcast System in the same Byte*/
|
|
+ /*bit 7 is Service Method*/
|
|
+ regval = (unsigned char)(p_service_identification->service_identification_method & 0x01);
|
|
+ regval = regval << 7;
|
|
+ /*bits 6 to 0 are Digital Broadcast*/
|
|
+ regval |= (unsigned char)(p_service_identification->digital_broadcast_system & 0x7F);
|
|
+ i2c_buffer[11] = regval;
|
|
+
|
|
+ /*Case of a ARIB Generic*/
|
|
+ if(p_service_identification->digital_broadcast_system == CEC_DIGITAL_BROADCAST_SYSTEM_ARIB_GENERIC) {
|
|
+ p_arib_pointer = p_service_identification->p_service_identification;
|
|
+
|
|
+ i2c_buffer[12] = (unsigned char)(p_arib_pointer->transport_stream_id >> 8);
|
|
+ i2c_buffer[13] = (unsigned char)p_arib_pointer->transport_stream_id;
|
|
+ i2c_buffer[14] = (unsigned char)(p_arib_pointer->service_id >> 8);
|
|
+ i2c_buffer[15] = (unsigned char)p_arib_pointer->service_id;
|
|
+ i2c_buffer[16] = (unsigned char)(p_arib_pointer->original_network_id >> 8);
|
|
+ i2c_buffer[17] = (unsigned char)p_arib_pointer->original_network_id;
|
|
+
|
|
+ }
|
|
+ /*Case of a ATSC Generic*/
|
|
+ else if(p_service_identification->digital_broadcast_system == CEC_DIGITAL_BROADCAST_SYSTEM_ATSC_GENERIC) {
|
|
+ p_atsc_pointer = p_service_identification->p_service_identification;
|
|
+
|
|
+ i2c_buffer[12] = (unsigned char)(p_atsc_pointer->transport_stream_id >> 8);
|
|
+ i2c_buffer[13] = (unsigned char)p_atsc_pointer->transport_stream_id;
|
|
+ i2c_buffer[14] = (unsigned char)(p_atsc_pointer->program_number >> 8);
|
|
+ i2c_buffer[15] = (unsigned char)p_atsc_pointer->program_number;
|
|
+ i2c_buffer[16] = (unsigned char)(p_atsc_pointer->reserved >> 8);
|
|
+ i2c_buffer[17] = (unsigned char)p_atsc_pointer->reserved;
|
|
+ }
|
|
+ /*Case of a DVB Generic*/
|
|
+ else if(p_service_identification->digital_broadcast_system == CEC_DIGITAL_BROADCAST_SYSTEM_DVB_GENERIC) {
|
|
+ p_dvb_pointer = p_service_identification->p_service_identification;
|
|
+
|
|
+ i2c_buffer[12] = (unsigned char)(p_dvb_pointer->transport_stream_id >> 8);
|
|
+ i2c_buffer[13] = (unsigned char)p_dvb_pointer->transport_stream_id;
|
|
+ i2c_buffer[14] = (unsigned char)(p_dvb_pointer->service_id >> 8);
|
|
+ i2c_buffer[15] = (unsigned char)p_dvb_pointer->service_id;
|
|
+ i2c_buffer[16] = (unsigned char)(p_dvb_pointer->original_network_id >> 8);
|
|
+ i2c_buffer[17] = (unsigned char)p_dvb_pointer->original_network_id;
|
|
+ }
|
|
+ /*other cases, Buffer are empty*/
|
|
+ else {
|
|
+ i2c_buffer[12] = 0xFF;
|
|
+ i2c_buffer[13] = 0xFF;
|
|
+ i2c_buffer[14] = 0xFF;
|
|
+ i2c_buffer[15] = 0xFF;
|
|
+ i2c_buffer[16] = 0xFF;
|
|
+ i2c_buffer[17] = 0xFF;
|
|
+ }
|
|
+
|
|
+ /* CEC Data register */
|
|
+ err = set_cec_hw_registers(p_dis, E_REG_CDR0, i2c_buffer, 18);
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+ /* Save Datas of the CEC message send */
|
|
+ gtmdl_hdmi_cec_driver_save_message.address_byte = i2c_buffer[2];
|
|
+ gtmdl_hdmi_cec_driver_save_message.message_type_polling = 0;
|
|
+ gtmdl_hdmi_cec_driver_save_message.opcode = i2c_buffer[3];
|
|
+
|
|
+ return(0);
|
|
+}
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \fn tmErrorCode_t dlHdmiCecClearExternalTimerWithExternalPlug( )
|
|
+ * \brief This message is used to clear a digital timer block of a device
|
|
+ *
|
|
+ * \param tmInstance_t Instance \n
|
|
+ * Instance identifier. \n
|
|
+ *
|
|
+ * \param u8 ReceiverLogicalAddress \n
|
|
+ * Address of message receiver. \n
|
|
+ *
|
|
+ * \param u8 DayOfMonth \n
|
|
+ * Day of the month.\n
|
|
+ *
|
|
+ * \param u8 MonthOfYear \n
|
|
+ * Month of the year.\n
|
|
+ *
|
|
+ * \param u16 StartTime \n
|
|
+ * Start time for a timer based recording.\n
|
|
+ *
|
|
+ * \param u16 Duration \n
|
|
+ * Pointer to the structure dlHdmiCECDuration_t in BCD format.\n
|
|
+ *
|
|
+ * \param u8 Recording Sequence \n
|
|
+ * Indicates if recording is repeated and, if so, on which day
|
|
+ * For repeated recording the recording sequence value is the
|
|
+ * bitwise OR of the days when recordings are required
|
|
+ * Shall be set to 0x00 when recording is not repeated.\n
|
|
+ *
|
|
+ * \param dlHdmiCECExternalPlug_t ExternalPlug \n
|
|
+ * indicates external plug number (1 to 255 )on the recording device.\n
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_BAD_PARAMETER: a parameter is invalid or out
|
|
+ * of range
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_clear_external_timer_with_external_plug
|
|
+(
|
|
+ instance_t instance,
|
|
+ u8 receiver_logical_address,
|
|
+ u8 day_of_month,
|
|
+ u8 month_of_year,
|
|
+ u16 start_time,
|
|
+ dl_hdmi_cecduration_t *p_duration,
|
|
+ u8 recording_sequence,
|
|
+ dl_hdmi_cecexternal_plug_t external_plug
|
|
+)
|
|
+{
|
|
+ error_code_t err;
|
|
+ unsigned char i2c_buffer[13] ; /* I2C data buffer */
|
|
+ /* Pointer to Device Instance Structure */
|
|
+ dl_hdmi_cec_driver_config_table_t *p_dis;
|
|
+
|
|
+ /* check if instance number is in range */
|
|
+ RETIF((instance < 0) || (instance >= MAX_UNITS), ERR_DLHDMICEC_BAD_INSTANCE)
|
|
+
|
|
+ /* check if unit corresponding to instance is opened */
|
|
+ RETIF(unit_table[instance].opened == false, ERR_DLHDMICEC_RESOURCE_NOT_OWNED)
|
|
+
|
|
+ /* check if instance state is correct */
|
|
+ /* RETIF(UnitTable[Instance].state != STATE_NOT_INITIALIZED, ERR_DLHDMICEC_INVALID_STATE) */
|
|
+
|
|
+ p_dis = >mdl_hdmi_cec_driver_config_table[instance];
|
|
+
|
|
+ /*======To do : make a prepare message function with parameter */
|
|
+ /* Clear External Timer with External Plug Command*/
|
|
+ i2c_buffer[0] = 0x0D; /* Param number */
|
|
+
|
|
+ i2c_buffer[1] = 0x00; /* Request CEC data */
|
|
+
|
|
+ /*Build Initiator and Reciever Logical Address Byte*/
|
|
+ /*Initiator logical Address*/
|
|
+ i2c_buffer[2] = (unsigned char)(unit_table[instance].device_logical_address) & 0x0F;
|
|
+ i2c_buffer[2] = i2c_buffer[2] << 4;
|
|
+ /* Receiver logical Address*/
|
|
+ i2c_buffer[2] |= receiver_logical_address & 0x0F;
|
|
+
|
|
+ i2c_buffer[3] = CEC_OPCODE_CLEAR_EXTERNAL_TIMER ;
|
|
+ i2c_buffer[4] = day_of_month; /*Day of Month*/
|
|
+ i2c_buffer[5] = month_of_year; /*Month of Year*/
|
|
+ i2c_buffer[6] = (unsigned char)(start_time >> 8); /*Start Time*/
|
|
+ i2c_buffer[7] = (unsigned char)start_time;
|
|
+ i2c_buffer[8] = p_duration -> hours; /*Duration Hours*/
|
|
+ i2c_buffer[9] = p_duration -> minute; /*Duration minute*/
|
|
+ i2c_buffer[10] = recording_sequence; /*Recording Sequence*/
|
|
+ /*External Source Specifier = External Plug */
|
|
+ i2c_buffer[11] = CEC_EXTERNAL_PLUG;
|
|
+ i2c_buffer[12] = external_plug; /*External Plug*/
|
|
+
|
|
+ /* CEC Data register */
|
|
+ err = set_cec_hw_registers(p_dis, E_REG_CDR0, i2c_buffer, 13);
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+ /* Save Datas of the CEC message send */
|
|
+ gtmdl_hdmi_cec_driver_save_message.address_byte = i2c_buffer[2];
|
|
+ gtmdl_hdmi_cec_driver_save_message.message_type_polling = 0;
|
|
+ gtmdl_hdmi_cec_driver_save_message.opcode = i2c_buffer[3];
|
|
+
|
|
+ return(0);
|
|
+}
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \fn tmErrorCode_t dlHdmiCecClearExternalTimerWithPhysicalAddress( )
|
|
+ * \brief This message is used to clear a digital timer block of a device
|
|
+ *
|
|
+ * \param tmInstance_t Instance \n
|
|
+ * Instance identifier. \n
|
|
+ *
|
|
+ * \param u8 ReceiverLogicalAddress \n
|
|
+ * Address of message receiver. \n
|
|
+ *
|
|
+ * \param u8 DayOfMonth \n
|
|
+ * Day of the month.\n
|
|
+ *
|
|
+ * \param u8 MonthOfYear \n
|
|
+ * Month of the year.\n
|
|
+ *
|
|
+ * \param u16 StartTime \n
|
|
+ * Start time for a timer based recording.\n
|
|
+ *
|
|
+ * \param u16 Duration \n
|
|
+ * Pointer to the structure dlHdmiCECDuration_t in BCD format.\n
|
|
+ *
|
|
+ * \param u8 Recording Sequence \n
|
|
+ * Indicates if recording is repeated and, if so, on which day
|
|
+ * For repeated recording the recording sequence value is the
|
|
+ * bitwise OR of the days when recordings are required
|
|
+ * Shall be set to 0x00 when recording is not repeated.\n
|
|
+ *
|
|
+ * \param dlHdmiCECExternalPhysicalAddress_t PhysicalAddress \n
|
|
+ * Defines the path between the TV an a device-thus giving it a physical
|
|
+ * address within the cluster.\n
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_BAD_PARAMETER: a parameter is invalid or out
|
|
+ * of range
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_clear_external_timer_with_physical_address
|
|
+(
|
|
+ instance_t instance,
|
|
+ u8 receiver_logical_address,
|
|
+ u8 day_of_month,
|
|
+ u8 month_of_year,
|
|
+ u16 start_time,
|
|
+ dl_hdmi_cecduration_t *p_duration,
|
|
+ u8 recording_sequence,
|
|
+ dl_hdmi_cecexternal_physical_address_t external_physical_address
|
|
+)
|
|
+{
|
|
+ error_code_t err;
|
|
+ unsigned char i2c_buffer[14] ; /* I2C data buffer */
|
|
+ /* Pointer to Device Instance Structure */
|
|
+ dl_hdmi_cec_driver_config_table_t *p_dis;
|
|
+
|
|
+ /* check if instance number is in range */
|
|
+ RETIF((instance < 0) || (instance >= MAX_UNITS), ERR_DLHDMICEC_BAD_INSTANCE)
|
|
+
|
|
+ /* check if unit corresponding to instance is opened */
|
|
+ RETIF(unit_table[instance].opened == false, ERR_DLHDMICEC_RESOURCE_NOT_OWNED)
|
|
+
|
|
+ /* check if instance state is correct */
|
|
+ /*RETIF(UnitTable[Instance].state != STATE_NOT_INITIALIZED, ERR_DLHDMICEC_INVALID_STATE) */
|
|
+
|
|
+ p_dis = >mdl_hdmi_cec_driver_config_table[instance];
|
|
+
|
|
+ /* Clear External Timer with Physical Address Command */
|
|
+ i2c_buffer[0] = 0x0E; /* Param number */
|
|
+
|
|
+ i2c_buffer[1] = 0x00; /* Request CEC data */
|
|
+
|
|
+ /*Build Initiator and Reciever Logical Address Byte*/
|
|
+ /*Initiator logical Address*/
|
|
+ i2c_buffer[2] = (unsigned char)(unit_table[instance].device_logical_address) & 0x0F;
|
|
+ i2c_buffer[2] = i2c_buffer[2] << 4;
|
|
+ /* Receiver logical Address*/
|
|
+ i2c_buffer[2] |= receiver_logical_address & 0x0F;
|
|
+
|
|
+ /*Clear External Timer*/
|
|
+ i2c_buffer[3] = CEC_OPCODE_CLEAR_EXTERNAL_TIMER ;
|
|
+ /*Day of Month*/
|
|
+ i2c_buffer[4] = day_of_month;
|
|
+ /*Month of Year*/
|
|
+ i2c_buffer[5] = month_of_year;
|
|
+ /*Start Time*/
|
|
+ i2c_buffer[6] = (unsigned char)(start_time >> 8);
|
|
+ i2c_buffer[7] = (unsigned char)start_time;
|
|
+ /*Duration Hours*/
|
|
+ i2c_buffer[8] = p_duration -> hours;
|
|
+ /*Duration Minute*/
|
|
+ i2c_buffer[9] = p_duration -> minute;
|
|
+ /*Recording Sequence*/
|
|
+ i2c_buffer[10] = recording_sequence;
|
|
+ /*External Source Specifier = External Address*/
|
|
+ i2c_buffer[11] = CEC_EXTERNAL_PHYSICAL_ADDRESS;
|
|
+ /*External Address*/
|
|
+ i2c_buffer[12] = (unsigned char)(external_physical_address >> 8);
|
|
+ i2c_buffer[13] = (unsigned char)external_physical_address;
|
|
+
|
|
+ /* CEC Data register */
|
|
+ err = set_cec_hw_registers(p_dis, E_REG_CDR0, i2c_buffer, 14);
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+ /* Save Datas of the CEC message send */
|
|
+ gtmdl_hdmi_cec_driver_save_message.address_byte = i2c_buffer[2];
|
|
+ gtmdl_hdmi_cec_driver_save_message.message_type_polling = 0;
|
|
+ gtmdl_hdmi_cec_driver_save_message.opcode = i2c_buffer[3];
|
|
+
|
|
+ return(0);
|
|
+}
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \fn tmErrorCode_t dlHdmiCecTextViewOn( )
|
|
+ * \brief This message as <Image View On>, but should also remove any text,
|
|
+ * menus and PIP windows from the TV's display
|
|
+ *
|
|
+ * \param tmInstance_t Instance \n
|
|
+ * Instance identifier. \n
|
|
+ *
|
|
+ * \param u8 ReceiverLogicalAddress \n
|
|
+ * Address of message receiver. \n
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ *
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_text_view_on
|
|
+(
|
|
+ instance_t instance,
|
|
+ u8 receiver_logical_address
|
|
+)
|
|
+{
|
|
+ error_code_t err;
|
|
+ unsigned char i2c_buffer[4] ; /* I2C data buffer */
|
|
+ /* Pointer to Device Instance Structure */
|
|
+ dl_hdmi_cec_driver_config_table_t *p_dis;
|
|
+
|
|
+ /* check if instance number is in range */
|
|
+ RETIF((instance < 0) || (instance >= MAX_UNITS), ERR_DLHDMICEC_BAD_INSTANCE)
|
|
+
|
|
+ /* check if unit corresponding to Instance is opened */
|
|
+ RETIF(unit_table[instance].opened == false, ERR_DLHDMICEC_RESOURCE_NOT_OWNED)
|
|
+
|
|
+ /* check if Instance state is correct */
|
|
+ /*RETIF(UnitTable[Instance].state != STATE_NOT_INITIALIZED, ERR_DLHDMICEC_INVALID_STATE) */
|
|
+
|
|
+ p_dis = >mdl_hdmi_cec_driver_config_table[instance];
|
|
+
|
|
+ /* Text View On command */
|
|
+ i2c_buffer[0] = 0x04; /* Param number */
|
|
+
|
|
+ i2c_buffer[1] = 0x00; /* Request CEC data */
|
|
+
|
|
+ /*Build Initiator and Reciever Logical Address Byte*/
|
|
+ /*Initiator logical Address*/
|
|
+ i2c_buffer[2] = (unsigned char)(unit_table[instance].device_logical_address) & 0x0F;
|
|
+ i2c_buffer[2] = i2c_buffer[2] << 4;
|
|
+ /* Receiver logical Address*/
|
|
+ i2c_buffer[2] |= receiver_logical_address & 0x0F;
|
|
+
|
|
+ i2c_buffer[3] = CEC_OPCODE_TEXT_VIEW_ON ; /* Text View On */
|
|
+
|
|
+ /* CEC Data register */
|
|
+ err = set_cec_hw_registers(p_dis, E_REG_CDR0, i2c_buffer, 4);
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+ /* Save Datas of the CEC message send */
|
|
+ gtmdl_hdmi_cec_driver_save_message.address_byte = i2c_buffer[2];
|
|
+ gtmdl_hdmi_cec_driver_save_message.message_type_polling = 0;
|
|
+ gtmdl_hdmi_cec_driver_save_message.opcode = i2c_buffer[3];
|
|
+
|
|
+ return(0);
|
|
+}
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \fn tmErrorCode_t dlHdmiCecTimerClearedStatus( )
|
|
+ * \brief This message is used to give the status of a <Cleared Analogue Timer>,
|
|
+ * <Clear Digital Timer> or <Clear External Timer> message.
|
|
+ *
|
|
+ * \param tmInstance_t Instance \n
|
|
+ * Instance identifier. \n
|
|
+ *
|
|
+ * \param dlHdmiCECTimerClearedStatusData_t TimerClearedStatusData \n
|
|
+ * Indicates if the timer was cleared successfully. \n
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ *
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_timer_cleared_status
|
|
+(
|
|
+ instance_t instance,
|
|
+ u8 receiver_logical_address,
|
|
+ dl_hdmi_cectimer_cleared_status_data_t timer_cleared_status_data
|
|
+)
|
|
+{
|
|
+
|
|
+ error_code_t err;
|
|
+ unsigned char i2c_buffer[5] ; /* I2C data buffer */
|
|
+ /* Pointer to Device Instance Structure */
|
|
+ dl_hdmi_cec_driver_config_table_t *p_dis;
|
|
+
|
|
+ /* check if instance number is in range */
|
|
+ RETIF((instance < 0) || (instance >= MAX_UNITS), ERR_DLHDMICEC_BAD_INSTANCE)
|
|
+
|
|
+ /* check if unit corresponding to instance is opened */
|
|
+ RETIF(unit_table[instance].opened == false, ERR_DLHDMICEC_RESOURCE_NOT_OWNED)
|
|
+
|
|
+ /* check if instance state is correct */
|
|
+ /*RETIF(UnitTable[Instance].state != STATE_NOT_INITIALIZED, ERR_DLHDMICEC_INVALID_STATE) */
|
|
+
|
|
+ p_dis = >mdl_hdmi_cec_driver_config_table[instance];
|
|
+
|
|
+ /* Timer Clear Status command */
|
|
+ i2c_buffer[0] = 0x05; /* Param number */
|
|
+
|
|
+ i2c_buffer[1] = 0x00; /* Request CEC data */
|
|
+
|
|
+ /*Build Initiator and Reciever Logical Address Byte*/
|
|
+ /*Initiator logical Address*/
|
|
+ i2c_buffer[2] = (unsigned char)(unit_table[instance].device_logical_address) & 0x0F;
|
|
+ i2c_buffer[2] = i2c_buffer[2] << 4;
|
|
+ /* Receiver logical Address*/
|
|
+ i2c_buffer[2] |= receiver_logical_address & 0x0F;
|
|
+
|
|
+ i2c_buffer[3] = CEC_OPCODE_TIMER_CLEARED_STATUS; /* System Audio Status*/
|
|
+ /* Timer Cleared Status*/
|
|
+ i2c_buffer[4] = timer_cleared_status_data;
|
|
+
|
|
+ /* CEC Data register */
|
|
+ err = set_cec_hw_registers(p_dis, E_REG_CDR0, i2c_buffer, 5);
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+ /* Save Datas of the CEC message send */
|
|
+ gtmdl_hdmi_cec_driver_save_message.address_byte = i2c_buffer[2];
|
|
+ gtmdl_hdmi_cec_driver_save_message.message_type_polling = 0;
|
|
+ gtmdl_hdmi_cec_driver_save_message.opcode = i2c_buffer[3];
|
|
+
|
|
+ return(0);
|
|
+}
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \fn tmErrorCode_t dlHdmiCecTimerStatus( )
|
|
+ * \brief This message is used to send timer status to the initiator of a
|
|
+ * <Set Timer> message.
|
|
+ *
|
|
+ * \param tmInstance_t Instance \n
|
|
+ * Instance identifier. \n
|
|
+ *
|
|
+ * \param dlHdmiCECTimerStatusData_t *pTimerStatusData \n
|
|
+ * Pointer on the Timer status. \n
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ *
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_timer_status
|
|
+(
|
|
+ instance_t instance,
|
|
+ u8 receiver_logical_address,
|
|
+ dl_hdmi_cectimer_status_data_t *p_timer_status_data
|
|
+)
|
|
+{
|
|
+ error_code_t err;
|
|
+ unsigned char i2c_buffer[7] ; /* I2C data buffer */
|
|
+ /* Pointer to Device Instance Structure */
|
|
+ dl_hdmi_cec_driver_config_table_t *p_dis;
|
|
+ dl_hdmi_cectimer_programmed_info_t *p_timer_prog_info;
|
|
+ unsigned char regval;
|
|
+
|
|
+ /* check if instance number is in range */
|
|
+ RETIF((instance < 0) || (instance >= MAX_UNITS), ERR_DLHDMICEC_BAD_INSTANCE)
|
|
+
|
|
+ /* check if unit corresponding to instance is opened */
|
|
+ RETIF(unit_table[instance].opened == false, ERR_DLHDMICEC_RESOURCE_NOT_OWNED)
|
|
+
|
|
+ /* check if instance state is correct */
|
|
+ /*RETIF(UnitTable[Instance].state != STATE_NOT_INITIALIZED, ERR_DLHDMICEC_INVALID_STATE) */
|
|
+
|
|
+ p_dis = >mdl_hdmi_cec_driver_config_table[instance];
|
|
+
|
|
+ /*======To do : make a prepare message function with parameter */
|
|
+ /* Timer Status command */
|
|
+ i2c_buffer[0] = 0x07; /* Param number */
|
|
+
|
|
+ i2c_buffer[1] = 0x00; /* Request CEC data */
|
|
+
|
|
+ /*Build Initiator and Reciever Logical Address Byte*/
|
|
+ /*Initiator logical Address*/
|
|
+ i2c_buffer[2] = (unsigned char)(unit_table[instance].device_logical_address) & 0x0F;
|
|
+ i2c_buffer[2] = i2c_buffer[2] << 4;
|
|
+ /* Receiver logical Address*/
|
|
+ i2c_buffer[2] |= receiver_logical_address & 0x0F;
|
|
+
|
|
+ i2c_buffer[3] = CEC_OPCODE_TIMER_CLEARED_STATUS; /* System Audio Status*/
|
|
+ /* First Byte Building */
|
|
+ /* bit 7 for Timer Overlap Warning */
|
|
+ regval = ((unsigned char)(p_timer_status_data->timer_overlap_warning) & 0x01) << 7 ;
|
|
+ /* bit 6 to 5 for Media Info */
|
|
+ regval |= ((unsigned char)(p_timer_status_data->media_info) & 0x03) << 5;
|
|
+
|
|
+ p_timer_prog_info = &(p_timer_status_data->timer_programmed_info);
|
|
+ /* bit 4 for Timer Programed Indicator */
|
|
+ regval |= ((unsigned char)(p_timer_prog_info->select_program_info) & 0x01) << 4;
|
|
+ /* bit 3 to 0 for Program Information */
|
|
+ regval |= (unsigned char)(p_timer_prog_info->program_info) & 0x0F;
|
|
+ i2c_buffer[4] = regval;
|
|
+
|
|
+ /* 2 Duration Available Bytes Building */
|
|
+ /* Duration Available is only filled in the the both following conditions*/
|
|
+ if((p_timer_prog_info->select_program_info == CEC_PROGRAM_INDICATOR_NOT_PROGRAMMED) && (p_timer_prog_info->program_info == CEC_PROGRAM_ERROR_INFO_DUPLICATE_ALREADY_PROGRAMMED)) {
|
|
+ i2c_buffer[5] = (unsigned char)(p_timer_prog_info->duration_available >> 8);
|
|
+ i2c_buffer[6] = (unsigned char)p_timer_prog_info->duration_available;
|
|
+ } else if((p_timer_prog_info->select_program_info == CEC_PROGRAM_INDICATOR_PROGRAMMED) && (p_timer_prog_info->program_info == CEC_PROGRAM_INFO_NOT_ENOUGHT_SPACE_AVAILABLE_FOR_RECORDING)) {
|
|
+ i2c_buffer[5] = (unsigned char)(p_timer_prog_info->duration_available >> 8);
|
|
+ i2c_buffer[6] = (unsigned char)p_timer_prog_info->duration_available;
|
|
+ }
|
|
+ /*Else, 2 bytes of Duration Available are filled with 0xFF*/
|
|
+ else {
|
|
+ i2c_buffer[5] = 0xFF;
|
|
+ i2c_buffer[6] = 0xFF;
|
|
+ }
|
|
+
|
|
+ /* CEC Data register */
|
|
+ err = set_cec_hw_registers(p_dis, E_REG_CDR0, i2c_buffer, 7);
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+ /* Save Datas of the CEC message send */
|
|
+ gtmdl_hdmi_cec_driver_save_message.address_byte = i2c_buffer[2];
|
|
+ gtmdl_hdmi_cec_driver_save_message.message_type_polling = 0;
|
|
+ gtmdl_hdmi_cec_driver_save_message.opcode = i2c_buffer[3];
|
|
+
|
|
+ return(0);
|
|
+}
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \fn tmErrorCode_t dlHdmiCecTunerDeviceStatusAnalogue( )
|
|
+ * \brief This message is used by a tuner device to provide its status to the
|
|
+ * initiator of the <Give Tuner Device Status> message.
|
|
+ *
|
|
+ * \param tmInstance_t Instance \n
|
|
+ * Instance identifier. \n
|
|
+ *
|
|
+ * \param dlHdmiCECRecordingFlag_t RecordingFlag \n
|
|
+ * Indicates if the tuner is being used as a source of a recording. \n
|
|
+ *
|
|
+ * \param dlHdmiCECTunerDisplayInfo_t TunerDisplayInfo \n
|
|
+ * Indicates if the the device is currently deplaying its tuner or not. \n
|
|
+ *
|
|
+ * \param dlHdmiCECAnalogueBroadcastType_t AnalogueBroadcastType \n
|
|
+ * "Cable,Sattellite,Terrestrial".\n
|
|
+ *
|
|
+ * \param u16 AnalogueFrequency \n
|
|
+ * Specify frequency used by analogue tuner (0x0000<=N<=0xFFFF).\n
|
|
+ *
|
|
+ * \param dlHdmiCECBroadcastSystem_t BroadcastSystem \n
|
|
+ * Specify information about the colour system, the sound carrier and
|
|
+ * the IF-frequency.\n
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ *
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_tuner_device_status_analogue
|
|
+(
|
|
+ instance_t instance,
|
|
+ u8 receiver_logical_address,
|
|
+ dl_hdmi_cecrecording_flag_t recording_flag,
|
|
+ dl_hdmi_cectuner_display_info_t tuner_display_info,
|
|
+ dl_hdmi_cecanalogue_broadcast_type_t analogue_broadcast_type,
|
|
+ u16 analogue_frequency,
|
|
+ dl_hdmi_cecbroadcast_system_t broadcast_system
|
|
+)
|
|
+{
|
|
+ error_code_t err;
|
|
+ unsigned char i2c_buffer[9] ; /* I2C data buffer */
|
|
+ /* Pointer to Device Instance Structure */
|
|
+ dl_hdmi_cec_driver_config_table_t *p_dis;
|
|
+
|
|
+ unsigned char regval; /*Local Variable*/
|
|
+
|
|
+ /* check if instance number is in range */
|
|
+ RETIF((instance < 0) || (instance >= MAX_UNITS), ERR_DLHDMICEC_BAD_INSTANCE)
|
|
+
|
|
+ /* check if unit corresponding to instance is opened */
|
|
+ RETIF(unit_table[instance].opened == false, ERR_DLHDMICEC_RESOURCE_NOT_OWNED)
|
|
+
|
|
+ /* check if instance state is correct */
|
|
+ /*RETIF(UnitTable[Instance].state != STATE_NOT_INITIALIZED, ERR_DLHDMICEC_INVALID_STATE) */
|
|
+
|
|
+ p_dis = >mdl_hdmi_cec_driver_config_table[instance];
|
|
+
|
|
+ /*======To do : make a prepare message function with parameter */
|
|
+ /* Select Aanalogue Service command */
|
|
+ i2c_buffer[0] = 0x09; /* Param number */
|
|
+
|
|
+ i2c_buffer[1] = 0x00; /* Request CEC data */
|
|
+
|
|
+ /*Build Initiator and Reciever Logical Address Byte*/
|
|
+ /*Initiator logical Address*/
|
|
+ i2c_buffer[2] = (unsigned char)(unit_table[instance].device_logical_address) & 0x0F;
|
|
+ i2c_buffer[2] = i2c_buffer[2] << 4;
|
|
+ /* Receiver logical Address*/
|
|
+ i2c_buffer[2] |= receiver_logical_address & 0x0F;
|
|
+
|
|
+ /* Tuner Device Status*/
|
|
+ i2c_buffer[3] = CEC_OPCODE_TUNER_DEVICE_STATUS ;
|
|
+ /* Build First Byte*/
|
|
+ /*bit 7 is Recording Flag */
|
|
+ regval = ((unsigned char)recording_flag & 0X01) << 7;
|
|
+ /*bit 6 to 0 are Tuner display Info*/
|
|
+ regval |= (unsigned char)tuner_display_info & 0X7F;
|
|
+ i2c_buffer[4] = regval;
|
|
+
|
|
+ /*Analogue Broadcast System type*/
|
|
+ i2c_buffer[5] = analogue_broadcast_type;
|
|
+ /*Analogue Frequency*/
|
|
+ i2c_buffer[6] = (unsigned char)(analogue_frequency >> 8);
|
|
+ i2c_buffer[7] = (unsigned char)analogue_frequency;
|
|
+ /*Broadcast System*/
|
|
+ i2c_buffer[8] = broadcast_system;
|
|
+
|
|
+ /* CEC Data register */
|
|
+ err = set_cec_hw_registers(p_dis, E_REG_CDR0, i2c_buffer, 9);
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+ /* Save Datas of the CEC message send */
|
|
+ gtmdl_hdmi_cec_driver_save_message.address_byte = i2c_buffer[2];
|
|
+ gtmdl_hdmi_cec_driver_save_message.message_type_polling = 0;
|
|
+ gtmdl_hdmi_cec_driver_save_message.opcode = i2c_buffer[3];
|
|
+
|
|
+ return(0);
|
|
+}
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \fn tmErrorCode_t dlHdmiCecTunerDeviceStatusDigital( )
|
|
+ * \brief This message is used by a tuner device to provide its status to the
|
|
+ * initiator of the <Give Tuner Device Status> message.
|
|
+ *
|
|
+ * \param tmInstance_t Instance \n
|
|
+ * Instance identifier. \n
|
|
+ *
|
|
+ * \param dlHdmiCECRecordingFlag_t RecordingFlag \n
|
|
+ * Indicates if the tuner is being used as a source of a recording. \n
|
|
+ *
|
|
+ * \param dlHdmiCECTunerDisplayInfo_t TunerDisplayInfo \n
|
|
+ * Indicates if the the device is currently deplaying its tuner or not. \n
|
|
+ *
|
|
+ * \param dlHdmiCECDigitalServiceIdentification_t *pServiceIdentification \n
|
|
+ * Pointer to the structure Digital Service Identification
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ *
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_tuner_device_status_digital
|
|
+(
|
|
+ instance_t instance,
|
|
+ u8 receiver_logical_address,
|
|
+ dl_hdmi_cecrecording_flag_t recording_flag,
|
|
+ dl_hdmi_cectuner_display_info_t tuner_display_info,
|
|
+ ptmdl_hdmi_cecdigital_service_identification_t p_service_identification
|
|
+)
|
|
+{
|
|
+ error_code_t err;
|
|
+ unsigned char i2c_buffer[12] ; /* I2C data buffer */
|
|
+ /* Pointer to Device Instance Structure */
|
|
+ dl_hdmi_cec_driver_config_table_t *p_dis;
|
|
+ dl_hdmi_cecarib_data_t *p_arib_pointer;
|
|
+ dl_hdmi_cecatsc_data_t *p_atsc_pointer;
|
|
+ dl_hdmi_cecdvb_data_t *p_dvb_pointer;
|
|
+
|
|
+ unsigned char regval; /* Local variable*/
|
|
+
|
|
+ /* check if instance number is in range */
|
|
+ RETIF((instance < 0) || (instance >= MAX_UNITS), ERR_DLHDMICEC_BAD_INSTANCE)
|
|
+
|
|
+ /* check if unit corresponding to instance is opened */
|
|
+ RETIF(unit_table[instance].opened == false, ERR_DLHDMICEC_RESOURCE_NOT_OWNED)
|
|
+
|
|
+ /* check if instance state is correct */
|
|
+ /*RETIF(UnitTable[Instance].state != STATE_NOT_INITIALIZED, ERR_DLHDMICEC_INVALID_STATE) */
|
|
+
|
|
+ p_dis = >mdl_hdmi_cec_driver_config_table[instance];
|
|
+
|
|
+ /*======To do : make a prepare message function with parameter */
|
|
+ /* Record On Digital Service command */
|
|
+ i2c_buffer[0] = 0x0C; /* Param number */
|
|
+
|
|
+ i2c_buffer[1] = 0x00; /* Request CEC data */
|
|
+
|
|
+ /*Build Initiator and Reciever Logical Address Byte*/
|
|
+ /*Initiator logical Address*/
|
|
+ i2c_buffer[2] = (unsigned char)(unit_table[instance].device_logical_address) & 0x0F;
|
|
+ i2c_buffer[2] = i2c_buffer[2] << 4;
|
|
+ /* Receiver logical Address*/
|
|
+ i2c_buffer[2] |= receiver_logical_address & 0x0F;
|
|
+
|
|
+ /* Tuner Device Status*/
|
|
+ i2c_buffer[3] = CEC_OPCODE_TUNER_DEVICE_STATUS ;
|
|
+
|
|
+ /* Merge Recording Flag With Tuner Display Info*/
|
|
+ /* bit 7 is Recording Flag*/
|
|
+ regval = ((unsigned char)recording_flag & 0X01) << 7;
|
|
+ /* bit 6 to 0 are Tuner display Info*/
|
|
+ regval |= (unsigned char)tuner_display_info & 0X7F;
|
|
+ i2c_buffer[4] = regval;
|
|
+
|
|
+ /* Digital service Identification*/
|
|
+ /*Merge Service Method and Digital Broadcast System in the same Byte*/
|
|
+ /* bit 7 is Service Method*/
|
|
+ regval = (unsigned char)(p_service_identification->service_identification_method & 0x01) << 7;
|
|
+ /* bits 6 to 0 are Digital Broadcast*/
|
|
+ regval |= (unsigned char)(p_service_identification->digital_broadcast_system & 0x7F);
|
|
+ i2c_buffer[5] = regval;
|
|
+
|
|
+ /*Case of a ARIB Generic*/
|
|
+ if(p_service_identification->digital_broadcast_system == CEC_DIGITAL_BROADCAST_SYSTEM_ARIB_GENERIC) {
|
|
+ p_arib_pointer = p_service_identification->p_service_identification;
|
|
+
|
|
+ i2c_buffer[6] = (unsigned char)(p_arib_pointer->transport_stream_id >> 8);
|
|
+ i2c_buffer[7] = (unsigned char)p_arib_pointer->transport_stream_id;
|
|
+ i2c_buffer[8] = (unsigned char)(p_arib_pointer->service_id >> 8);
|
|
+ i2c_buffer[9] = (unsigned char)p_arib_pointer->service_id;
|
|
+ i2c_buffer[10] = (unsigned char)(p_arib_pointer->original_network_id >> 8);
|
|
+ i2c_buffer[11] = (unsigned char)p_arib_pointer->original_network_id;
|
|
+ }
|
|
+ /*Case of a ATSC Generic*/
|
|
+ else if(p_service_identification->digital_broadcast_system == CEC_DIGITAL_BROADCAST_SYSTEM_ATSC_GENERIC) {
|
|
+ p_atsc_pointer = p_service_identification->p_service_identification;
|
|
+
|
|
+ i2c_buffer[6] = (unsigned char)(p_atsc_pointer->transport_stream_id >> 8);
|
|
+ i2c_buffer[7] = (unsigned char)p_atsc_pointer->transport_stream_id;
|
|
+ i2c_buffer[8] = (unsigned char)(p_atsc_pointer->program_number >> 8);
|
|
+ i2c_buffer[9] = (unsigned char)p_atsc_pointer->program_number;
|
|
+ i2c_buffer[10] = (unsigned char)(p_atsc_pointer->reserved >> 8);
|
|
+ i2c_buffer[11] = (unsigned char)p_atsc_pointer->reserved;
|
|
+ }
|
|
+ /*Case of a DVB Generic*/
|
|
+ else if(p_service_identification->digital_broadcast_system == CEC_DIGITAL_BROADCAST_SYSTEM_DVB_GENERIC) {
|
|
+ p_dvb_pointer = p_service_identification->p_service_identification;
|
|
+
|
|
+ i2c_buffer[6] = (unsigned char)(p_dvb_pointer->transport_stream_id >> 8);
|
|
+ i2c_buffer[7] = (unsigned char)p_dvb_pointer->transport_stream_id;
|
|
+ i2c_buffer[8] = (unsigned char)(p_dvb_pointer->service_id >> 8);
|
|
+ i2c_buffer[9] = (unsigned char)p_dvb_pointer->service_id;
|
|
+ i2c_buffer[10] = (unsigned char)(p_dvb_pointer->original_network_id >> 8);
|
|
+ i2c_buffer[11] = (unsigned char)p_dvb_pointer->original_network_id;
|
|
+ }
|
|
+ /*other cases, Buffer are empty*/
|
|
+ else {
|
|
+ i2c_buffer[6] = 0xFF;
|
|
+ i2c_buffer[7] = 0xFF;
|
|
+ i2c_buffer[8] = 0xFF;
|
|
+ i2c_buffer[9] = 0xFF;
|
|
+ i2c_buffer[10] = 0xFF;
|
|
+ i2c_buffer[11] = 0xFF;
|
|
+ }
|
|
+
|
|
+ /* CEC Data register */
|
|
+ err = set_cec_hw_registers(p_dis, E_REG_CDR0, i2c_buffer, 12);
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+ /* Save Datas of the CEC message send */
|
|
+ gtmdl_hdmi_cec_driver_save_message.address_byte = i2c_buffer[2];
|
|
+ gtmdl_hdmi_cec_driver_save_message.message_type_polling = 0;
|
|
+ gtmdl_hdmi_cec_driver_save_message.opcode = i2c_buffer[3];
|
|
+
|
|
+ return(0);
|
|
+}
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \fn tmErrorCode_t dlHdmiCecRequestActiveSource( )
|
|
+ * \brief This message is used by a new device to discover the status of
|
|
+ * the system.
|
|
+ *
|
|
+ * \param tmInstance_t Instance \n
|
|
+ * Instance identifier. \n
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_Instance: the Instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ *
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_request_active_source
|
|
+(
|
|
+ instance_t instance
|
|
+)
|
|
+{
|
|
+ error_code_t err;
|
|
+ unsigned char i2c_buffer[4] ; /* I2C data buffer */
|
|
+ /* Pointer to Device Instance Structure */
|
|
+ dl_hdmi_cec_driver_config_table_t *p_dis;
|
|
+
|
|
+ /* check if instance number is in range */
|
|
+ RETIF((instance < 0) || (instance >= MAX_UNITS), ERR_DLHDMICEC_BAD_INSTANCE)
|
|
+
|
|
+ /* check if unit corresponding to instance is opened */
|
|
+ RETIF(unit_table[instance].opened == false, ERR_DLHDMICEC_RESOURCE_NOT_OWNED)
|
|
+
|
|
+ /* check if instance state is correct */
|
|
+ /*RETIF(UnitTable[Instance].state != STATE_NOT_INITIALIZED, ERR_DLHDMICEC_INVALID_STATE) */
|
|
+
|
|
+ p_dis = >mdl_hdmi_cec_driver_config_table[instance];
|
|
+
|
|
+ /*======To do : make a prepare message function with parameter */
|
|
+ /* IRequest Active Source command */
|
|
+ i2c_buffer[0] = 0x04; /* Param number */
|
|
+
|
|
+ i2c_buffer[1] = 0x00; /* Request CEC data */
|
|
+
|
|
+ /*Build Initiator and Reciever Logical Address Byte*/
|
|
+ /*Initiator logical Address*/
|
|
+ i2c_buffer[2] = (unsigned char)(unit_table[instance].device_logical_address) & 0x0F;
|
|
+ i2c_buffer[2] = i2c_buffer[2] << 4;
|
|
+ /* Broadcast*/
|
|
+ i2c_buffer[2] |= 0x0F;
|
|
+
|
|
+ /* Request Active Source */
|
|
+ i2c_buffer[3] = CEC_OPCODE_REQUEST_ACTIVE_SOURCE ;
|
|
+
|
|
+ /* CEC Data register */
|
|
+ err = set_cec_hw_registers(p_dis, E_REG_CDR0, i2c_buffer, 4);
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+ /* Save Datas of the CEC message send */
|
|
+ gtmdl_hdmi_cec_driver_save_message.address_byte = i2c_buffer[2];
|
|
+ gtmdl_hdmi_cec_driver_save_message.message_type_polling = 0;
|
|
+ gtmdl_hdmi_cec_driver_save_message.opcode = i2c_buffer[3];
|
|
+
|
|
+ return(0);
|
|
+}
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \fn tmErrorCode_t dlHdmiCecRoutingChange( )
|
|
+ * \brief This message is sent by a CEC switch when it is manually switched to
|
|
+ * inform all other devices on the network that the active route below
|
|
+ * the switch has changed.
|
|
+ *
|
|
+ * \param tmInstance_t Instance \n
|
|
+ * Instance identifier. \n
|
|
+ *
|
|
+ * \param u16 OriginalAddress \n
|
|
+ * Previous address that the switch was switched to. \n
|
|
+ *
|
|
+ * \param u16 NewAddress \n
|
|
+ * The new address it has been moved to. \n
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ * - ERR_DLHDMICEC_BAD_PARAMETER: a parameter is invalid or out
|
|
+ * of range
|
|
+ *
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_routing_change
|
|
+(
|
|
+ instance_t instance,
|
|
+ u16 original_address,
|
|
+ u16 new_address
|
|
+)
|
|
+{
|
|
+ error_code_t err;
|
|
+ unsigned char i2c_buffer[8] ; /* I2C data buffer */
|
|
+ /* Pointer to Device Instance Structure */
|
|
+ dl_hdmi_cec_driver_config_table_t *p_dis;
|
|
+
|
|
+ /* check if instance number is in range */
|
|
+ RETIF((instance < 0) || (instance >= MAX_UNITS), ERR_DLHDMICEC_BAD_INSTANCE)
|
|
+
|
|
+ /* check if unit corresponding to instance is opened */
|
|
+ RETIF(unit_table[instance].opened == false, ERR_DLHDMICEC_RESOURCE_NOT_OWNED)
|
|
+
|
|
+ /* check if instance state is correct */
|
|
+ /*RETIF(UnitTable[Instance].state != STATE_NOT_INITIALIZED, ERR_DLHDMICEC_INVALID_STATE) */
|
|
+
|
|
+ p_dis = >mdl_hdmi_cec_driver_config_table[instance];
|
|
+
|
|
+ /*======To do : make a prepare message function with parameter */
|
|
+ /* Routing Change command */
|
|
+ i2c_buffer[0] = 0x08; /* Param number */
|
|
+
|
|
+ i2c_buffer[1] = 0x00; /* Request CEC data */
|
|
+
|
|
+ /*Build Initiator and Reciever Logical Address Byte*/
|
|
+ /*Initiator logical Address*/
|
|
+ i2c_buffer[2] = (unsigned char)(unit_table[instance].device_logical_address) & 0x0F;
|
|
+ i2c_buffer[2] = i2c_buffer[2] << 4;
|
|
+ /* Broadcast*/
|
|
+ i2c_buffer[2] |= 0x0F;
|
|
+
|
|
+ i2c_buffer[3] = CEC_OPCODE_ROUTING_CHANGE ; /* Routing Change */
|
|
+ /* MsByte of Original Address*/
|
|
+ i2c_buffer[4] = (unsigned char)(original_address >> 8);
|
|
+ /* LsByte of Original Address */
|
|
+ i2c_buffer[5] = (unsigned char)original_address;
|
|
+ /* MsByte of New Address */
|
|
+ i2c_buffer[6] = (unsigned char)(new_address >> 8);
|
|
+ /* LsByte of New Address */
|
|
+ i2c_buffer[7] = (unsigned char)new_address;
|
|
+
|
|
+ /* CEC Data register */
|
|
+ err = set_cec_hw_registers(p_dis, E_REG_CDR0, i2c_buffer, 8);
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+ /* Save Datas of the CEC message send */
|
|
+ gtmdl_hdmi_cec_driver_save_message.address_byte = i2c_buffer[2];
|
|
+ gtmdl_hdmi_cec_driver_save_message.message_type_polling = 0;
|
|
+ gtmdl_hdmi_cec_driver_save_message.opcode = i2c_buffer[3];
|
|
+
|
|
+ return(0);
|
|
+}
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \fn tmErrorCode_t dlHdmiCecRoutingInformation( )
|
|
+ * \brief This message is sent by a CEC switch to indicate the active route
|
|
+ * below the switch.
|
|
+ *
|
|
+ * \param tmInstance_t Instance \n
|
|
+ * Instance identifier. \n
|
|
+ *
|
|
+ * \param u16 PhysicalAddress \n
|
|
+ * The current active route to the sink in the CEC switch. \n
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ * - ERR_DLHDMICEC_BAD_PARAMETER: a parameter is invalid or out
|
|
+ * of range
|
|
+ *
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_routing_information
|
|
+(
|
|
+ instance_t instance,
|
|
+ u16 physical_address
|
|
+)
|
|
+{
|
|
+ error_code_t err;
|
|
+ unsigned char i2c_buffer[6] ; /* I2C data buffer */
|
|
+ /* Pointer to Device Instance Structure */
|
|
+ dl_hdmi_cec_driver_config_table_t *p_dis;
|
|
+
|
|
+ /* check if instance number is in range */
|
|
+ RETIF((instance < 0) || (instance >= MAX_UNITS), ERR_DLHDMICEC_BAD_INSTANCE)
|
|
+
|
|
+ /* check if unit corresponding to instance is opened */
|
|
+ RETIF(unit_table[instance].opened == false, ERR_DLHDMICEC_RESOURCE_NOT_OWNED)
|
|
+
|
|
+ /* check if instance state is correct */
|
|
+ /*RETIF(UnitTable[Instance].state != STATE_NOT_INITIALIZED, ERR_DLHDMICEC_INVALID_STATE) */
|
|
+
|
|
+ p_dis = >mdl_hdmi_cec_driver_config_table[instance];
|
|
+
|
|
+ /*======To do : make a prepare message function with parameter */
|
|
+ /* Routing Information command */
|
|
+ i2c_buffer[0] = 0x06; /* Param number */
|
|
+
|
|
+ i2c_buffer[1] = 0x00; /* Request CEC data */
|
|
+
|
|
+ /*Build Initiator and Reciever Logical Address Byte*/
|
|
+ /*Initiator logical Address*/
|
|
+ i2c_buffer[2] = (unsigned char)(unit_table[instance].device_logical_address) & 0x0F;
|
|
+ i2c_buffer[2] = i2c_buffer[2] << 4;
|
|
+ /* Broadcast*/
|
|
+ i2c_buffer[2] |= 0x0F;
|
|
+
|
|
+ /* Routing Information */
|
|
+ i2c_buffer[3] = CEC_OPCODE_ROUTING_INFORMATION ;
|
|
+ /* MsByte of Physical Address*/
|
|
+ i2c_buffer[4] = (unsigned char)(physical_address >> 8);
|
|
+ /* LsByte of Physical Address */
|
|
+ i2c_buffer[5] = (unsigned char)physical_address;
|
|
+
|
|
+ /* CEC Data register */
|
|
+ err = set_cec_hw_registers(p_dis, E_REG_CDR0, i2c_buffer, 6);
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+ /* Save Datas of the CEC message send */
|
|
+ gtmdl_hdmi_cec_driver_save_message.address_byte = i2c_buffer[2];
|
|
+ gtmdl_hdmi_cec_driver_save_message.message_type_polling = 0;
|
|
+ gtmdl_hdmi_cec_driver_save_message.opcode = i2c_buffer[3];
|
|
+
|
|
+ return(0);
|
|
+}
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \fn tmErrorCode_t dlHdmiCecSelectAnalogueService( )
|
|
+ * \brief This message select directly an analogue TV Service.
|
|
+ *
|
|
+ * \param tmInstance_t Instance \n
|
|
+ * Instance identifier. \n
|
|
+ *
|
|
+ * \param dlHdmiCECAnalogueBroadcastType_t AnalogueBroadcastType \n
|
|
+ * "Cable,Sattellite,Terrestrial".\n
|
|
+ *
|
|
+ * \param u16 AnalogueFrequency \n
|
|
+ * Specify frequency used by analogue tuner (0x0000<=N<=0xFFFF).\n
|
|
+ *
|
|
+ * \param dlHdmiCECBroadcastSystem_t BroadcastSystem \n
|
|
+ * Specify information about the colour system, the sound carrier and
|
|
+ * the IF-frequency.\n
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ * - ERR_DLHDMICEC_BAD_PARAMETER: a parameter is invalid or out
|
|
+ * of range
|
|
+ *
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_select_analogue_service
|
|
+(
|
|
+ instance_t instance,
|
|
+ u8 receiver_logical_address,
|
|
+ dl_hdmi_cecanalogue_broadcast_type_t analogue_broadcast_type,
|
|
+ u16 analogue_frequency,
|
|
+ dl_hdmi_cecbroadcast_system_t broadcast_system
|
|
+)
|
|
+{
|
|
+ error_code_t err;
|
|
+ unsigned char i2c_buffer[8] ; /* I2C data buffer */
|
|
+ /* Pointer to Device Instance Structure */
|
|
+ dl_hdmi_cec_driver_config_table_t *p_dis;
|
|
+
|
|
+ /* check if instance number is in range */
|
|
+ RETIF((instance < 0) || (instance >= MAX_UNITS), ERR_DLHDMICEC_BAD_INSTANCE)
|
|
+
|
|
+ /* check if unit corresponding to instance is opened */
|
|
+ RETIF(unit_table[instance].opened == false, ERR_DLHDMICEC_RESOURCE_NOT_OWNED)
|
|
+
|
|
+ /* check if instance state is correct */
|
|
+ /*RETIF(UnitTable[Instance].state != STATE_NOT_INITIALIZED, ERR_DLHDMICEC_INVALID_STATE) */
|
|
+
|
|
+ p_dis = >mdl_hdmi_cec_driver_config_table[instance];
|
|
+
|
|
+ /*======To do : make a prepare message function with parameter */
|
|
+ /* Select Aanalogue Service command */
|
|
+ i2c_buffer[0] = 0x08; /* Param number */
|
|
+
|
|
+ i2c_buffer[1] = 0x00; /* Request CEC data */
|
|
+
|
|
+ /*Build Initiator and Reciever Logical Address Byte*/
|
|
+ /*Initiator logical Address*/
|
|
+ i2c_buffer[2] = (unsigned char)(unit_table[instance].device_logical_address) & 0x0F;
|
|
+ i2c_buffer[2] = i2c_buffer[2] << 4;
|
|
+ /* Receiver logical Address*/
|
|
+ i2c_buffer[2] |= receiver_logical_address & 0x0F;
|
|
+
|
|
+ /* Select Analogue Service*/
|
|
+ i2c_buffer[3] = CEC_OPCODE_SET_ANALOGUE_SERVICE ;
|
|
+ i2c_buffer[4] = analogue_broadcast_type;
|
|
+ i2c_buffer[5] = (unsigned char)(analogue_frequency >> 8);
|
|
+ i2c_buffer[6] = (unsigned char)analogue_frequency;
|
|
+ i2c_buffer[7] = broadcast_system;
|
|
+
|
|
+ /* CEC Data register */
|
|
+ err = set_cec_hw_registers(p_dis, E_REG_CDR0, i2c_buffer, 8);
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+ /* Save Datas of the CEC message send */
|
|
+ gtmdl_hdmi_cec_driver_save_message.address_byte = i2c_buffer[2];
|
|
+ gtmdl_hdmi_cec_driver_save_message.message_type_polling = 0;
|
|
+ gtmdl_hdmi_cec_driver_save_message.opcode = i2c_buffer[3];
|
|
+
|
|
+ return(0);
|
|
+}
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \fn tmErrorCode_t dlHdmiCecSetStreamPath( )
|
|
+ * \brief This message is used by a TV to request a streaming path from
|
|
+ * the specified physical address.
|
|
+ *
|
|
+ * \param tmInstance_t Instance \n
|
|
+ * Instance identifier. \n
|
|
+ *
|
|
+ * \param u16 PhysicalAddress \n
|
|
+ * Physical address of the device.\n
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ * - ERR_DLHDMICEC_BAD_PARAMETER: a parameter is invalid or out
|
|
+ * of range
|
|
+ *
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_set_stream_path
|
|
+(
|
|
+ instance_t instance,
|
|
+ u16 physical_address
|
|
+)
|
|
+{
|
|
+ error_code_t err;
|
|
+ unsigned char i2c_buffer[6] ; /* I2C data buffer */
|
|
+ /* Pointer to Device Instance Structure */
|
|
+ dl_hdmi_cec_driver_config_table_t *p_dis;
|
|
+
|
|
+ /* check if instance number is in range */
|
|
+ RETIF((instance < 0) || (instance >= MAX_UNITS), ERR_DLHDMICEC_BAD_INSTANCE)
|
|
+
|
|
+ /* check if unit corresponding to instance is opened */
|
|
+ RETIF(unit_table[instance].opened == false, ERR_DLHDMICEC_RESOURCE_NOT_OWNED)
|
|
+
|
|
+ /* check if instance state is correct */
|
|
+ /*RETIF(UnitTable[Instance].state != STATE_NOT_INITIALIZED, ERR_DLHDMICEC_INVALID_STATE) */
|
|
+
|
|
+ p_dis = >mdl_hdmi_cec_driver_config_table[instance];
|
|
+
|
|
+ /*======To do : make a prepare message function with parameter */
|
|
+ /* Set Stream Path command */
|
|
+ i2c_buffer[0] = 0x06; /* Param number */
|
|
+
|
|
+ i2c_buffer[1] = 0x00; /* Request CEC data */
|
|
+
|
|
+ /*Build Initiator and Reciever Logical Address Byte*/
|
|
+ /*Initiator logical Address*/
|
|
+ i2c_buffer[2] = (unsigned char)(unit_table[instance].device_logical_address) & 0x0F;
|
|
+ i2c_buffer[2] = i2c_buffer[2] << 4;
|
|
+ /* Broadcast*/
|
|
+ i2c_buffer[2] |= 0x0F;
|
|
+
|
|
+ /* Set Stream Path */
|
|
+ i2c_buffer[3] = CEC_OPCODE_SET_STREAM_PATH ;
|
|
+ /* MsByte of Physical Address*/
|
|
+ i2c_buffer[4] = (unsigned char)(physical_address >> 8);
|
|
+ /* LsByte of Physical Address */
|
|
+ i2c_buffer[5] = (unsigned char)physical_address;
|
|
+
|
|
+ /* CEC Data register */
|
|
+ err = set_cec_hw_registers(p_dis, E_REG_CDR0, i2c_buffer, 6);
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+ /* Save Datas of the CEC message send */
|
|
+ gtmdl_hdmi_cec_driver_save_message.address_byte = i2c_buffer[2];
|
|
+ gtmdl_hdmi_cec_driver_save_message.message_type_polling = 0;
|
|
+ gtmdl_hdmi_cec_driver_save_message.opcode = i2c_buffer[3];
|
|
+
|
|
+ return(0);
|
|
+}
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \fn tmErrorCode_t dlHdmiCecSetSystemAudioMode( )
|
|
+ * \brief This message turn the system audio Mode ON or OFF.
|
|
+ *
|
|
+ * \param tmInstance_t Instance \n
|
|
+ * Instance identifier. \n
|
|
+ *
|
|
+ * \param dlHdmiCECSystemAudioStatus_t SystemAudioStatus \n
|
|
+ * Specifies if the system audio mode is ON or OFF.\n
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ * - ERR_DLHDMICEC_BAD_PARAMETER: a parameter is invalid or out
|
|
+ * of range
|
|
+ *
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_set_system_audio_mode
|
|
+(
|
|
+ instance_t instance,
|
|
+ u8 receiver_logical_address,
|
|
+ dl_hdmi_cecsystem_audio_status_t system_audio_status
|
|
+)
|
|
+{
|
|
+ error_code_t err;
|
|
+ unsigned char i2c_buffer[5] ; /* I2C data buffer */
|
|
+ /* Pointer to Device Instance Structure */
|
|
+ dl_hdmi_cec_driver_config_table_t *p_dis;
|
|
+
|
|
+ /* check if instance number is in range */
|
|
+ RETIF((instance < 0) || (instance >= MAX_UNITS), ERR_DLHDMICEC_BAD_INSTANCE)
|
|
+
|
|
+ /* check if unit corresponding to instance is opened */
|
|
+ RETIF(unit_table[instance].opened == false, ERR_DLHDMICEC_RESOURCE_NOT_OWNED)
|
|
+
|
|
+ /* check if instance state is correct */
|
|
+ /*RETIF(UnitTable[Instance].state != STATE_NOT_INITIALIZED, ERR_DLHDMICEC_INVALID_STATE) */
|
|
+
|
|
+ p_dis = >mdl_hdmi_cec_driver_config_table[instance];
|
|
+
|
|
+ /*======To do : make a prepare message function with parameter */
|
|
+ /* Set System Audio Mode Command */
|
|
+ i2c_buffer[0] = 0x05; /* Param number */
|
|
+
|
|
+ i2c_buffer[1] = 0x00; /* Request CEC data */
|
|
+
|
|
+ /*Build Initiator and Reciever Logical Address Byte*/
|
|
+ /*Initiator logical Address*/
|
|
+ i2c_buffer[2] = (unsigned char)(unit_table[instance].device_logical_address) & 0x0F;
|
|
+ i2c_buffer[2] = i2c_buffer[2] << 4;
|
|
+ /* Receiver logical Address*/
|
|
+ i2c_buffer[2] |= receiver_logical_address & 0x0F;
|
|
+
|
|
+ /* Set System Audio Mode*/
|
|
+ i2c_buffer[3] = CEC_OPCODE_SET_SYSTEM_AUDIO_MODE ;
|
|
+ /*System Audio Status*/
|
|
+ i2c_buffer[4] = system_audio_status;
|
|
+
|
|
+ /* CEC Data register */
|
|
+ err = set_cec_hw_registers(p_dis, E_REG_CDR0, i2c_buffer, 5);
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+ /* Save Datas of the CEC message send */
|
|
+ gtmdl_hdmi_cec_driver_save_message.address_byte = i2c_buffer[2];
|
|
+ gtmdl_hdmi_cec_driver_save_message.message_type_polling = 0;
|
|
+ gtmdl_hdmi_cec_driver_save_message.opcode = i2c_buffer[3];
|
|
+
|
|
+ return(0);
|
|
+}
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \fn tmErrorCode_t dlHdmiCecSetTimerProgramTitle( )
|
|
+ * \brief This message is used to set the name of a program associated
|
|
+ * with a timer block.Sent directly after sending a
|
|
+ * <Set analogue Timer> or <Set Digital Timer> message. The name
|
|
+ * is then associated with that timer block.
|
|
+ *
|
|
+ * \param tmInstance_t Instance \n
|
|
+ * Instance identifier. \n
|
|
+ *
|
|
+ * \param u8 ReceiverLogicalAddress \n
|
|
+ * Address of message receiver. \n
|
|
+ *
|
|
+ * \param const char *pProgramTitleString \n
|
|
+ * Pointer on the program title. \n
|
|
+ *
|
|
+ * \param u8 ProgramTitleLength \n
|
|
+ * Length of Program Title String. \n
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ * - ERR_DLHDMICEC_BAD_PARAMETER: a parameter is invalid or out
|
|
+ * of range
|
|
+ *
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_set_timer_program_title
|
|
+(
|
|
+ instance_t instance,
|
|
+ u8 receiver_logical_address,
|
|
+ const char *p_program_title_string,
|
|
+ u8 program_title_length
|
|
+)
|
|
+{
|
|
+ error_code_t err;
|
|
+ unsigned char i2c_buffer[19] ; /* I2C data buffer */
|
|
+ /* Pointer to Device Instance Structure */
|
|
+ dl_hdmi_cec_driver_config_table_t *p_dis;
|
|
+ unsigned char loci; /* Local increment variable*/
|
|
+ unsigned char mess_length; /* Local Message length*/
|
|
+
|
|
+ /* check if instance number is in range */
|
|
+ RETIF((instance < 0) || (instance >= MAX_UNITS), ERR_DLHDMICEC_BAD_INSTANCE)
|
|
+
|
|
+ /* check if unit corresponding to instance is opened */
|
|
+ RETIF(unit_table[instance].opened == false, ERR_DLHDMICEC_RESOURCE_NOT_OWNED)
|
|
+
|
|
+ /* check if instance state is correct */
|
|
+ /*RETIF(UnitTable[Instance].state != STATE_NOT_INITIALIZED, ERR_DLHDMICEC_INVALID_STATE) */
|
|
+
|
|
+ p_dis = >mdl_hdmi_cec_driver_config_table[instance];
|
|
+
|
|
+ /* Set Timer Program Title */
|
|
+ /* Calculate Message length*/
|
|
+ mess_length = program_title_length + 4;
|
|
+
|
|
+ i2c_buffer[0] = (unsigned char)mess_length;
|
|
+
|
|
+ /* Request CEC data */
|
|
+ i2c_buffer[1] = 0x00;
|
|
+
|
|
+ /*Build Initiator and Reciever Logical Address Byte*/
|
|
+ /*Initiator logical Address*/
|
|
+ i2c_buffer[2] = (unsigned char)(unit_table[instance].device_logical_address) & 0x0F;
|
|
+ i2c_buffer[2] = i2c_buffer[2] << 4;
|
|
+ /* Receiver logical Address*/
|
|
+ i2c_buffer[2] |= receiver_logical_address & 0x0F;
|
|
+
|
|
+ /* Set Timer Program Title*/
|
|
+ i2c_buffer[3] = CEC_OPCODE_SET_TIMER_PROGRAM_TITLE ;
|
|
+
|
|
+ for(loci = 0; loci <= program_title_length ; loci++) {
|
|
+ /* Fill Table with Program Title characters*/
|
|
+ i2c_buffer[(loci+4)] = p_program_title_string[loci];
|
|
+ }
|
|
+
|
|
+ /* CEC Data register */
|
|
+ err = set_cec_hw_registers(p_dis, E_REG_CDR0, i2c_buffer, (mess_length));
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+ /* Save Datas of the CEC message send */
|
|
+ gtmdl_hdmi_cec_driver_save_message.address_byte = i2c_buffer[2];
|
|
+ gtmdl_hdmi_cec_driver_save_message.message_type_polling = 0;
|
|
+ gtmdl_hdmi_cec_driver_save_message.opcode = i2c_buffer[3];
|
|
+
|
|
+ return(0);
|
|
+}
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \fn tmErrorCode_t dlHdmiCecStandby( )
|
|
+ * \brief This message switches one or all devices into standby mode.Can be
|
|
+ * be used as a broadcast message o be addressed to a specific device.
|
|
+ *
|
|
+ * \param tmInstance_t Instance \n
|
|
+ * Instance identifier. \n
|
|
+ *
|
|
+ * \param u8 ReceiverLogicalAddress \n
|
|
+ * Address of message receiver. \n
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ * - ERR_DLHDMICEC_BAD_PARAMETER: a parameter is invalid or out
|
|
+ * of range
|
|
+ *
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_standby
|
|
+(
|
|
+ instance_t instance,
|
|
+ u8 receiver_logical_address
|
|
+)
|
|
+{
|
|
+ error_code_t err;
|
|
+ unsigned char i2c_buffer[4] ; /* I2C data buffer */
|
|
+ /* Pointer to Device Instance Structure */
|
|
+ dl_hdmi_cec_driver_config_table_t *p_dis;
|
|
+
|
|
+ /* check if instance number is in range */
|
|
+ RETIF((instance < 0) || (instance >= MAX_UNITS), ERR_DLHDMICEC_BAD_INSTANCE)
|
|
+
|
|
+ /* check if unit corresponding to instance is opened */
|
|
+ RETIF(unit_table[instance].opened == false, ERR_DLHDMICEC_RESOURCE_NOT_OWNED)
|
|
+
|
|
+ /* check if instance state is correct */
|
|
+ /*RETIF(UnitTable[Instance].state != STATE_NOT_INITIALIZED, ERR_DLHDMICEC_INVALID_STATE) */
|
|
+
|
|
+ p_dis = >mdl_hdmi_cec_driver_config_table[instance];
|
|
+
|
|
+ /*======To do : make a prepare message function with parameter */
|
|
+ /* Standby command */
|
|
+ i2c_buffer[0] = 0x04; /* Param number */
|
|
+
|
|
+ i2c_buffer[1] = 0x00; /* Request CEC data */
|
|
+
|
|
+ /*Build Initiator and Reciever Logical Address Byte*/
|
|
+ /*Initiator logical Address*/
|
|
+ i2c_buffer[2] = (unsigned char)(unit_table[instance].device_logical_address) & 0x0F;
|
|
+ i2c_buffer[2] = i2c_buffer[2] << 4;
|
|
+ /* Receiver logical Address*/
|
|
+ i2c_buffer[2] |= receiver_logical_address & 0x0F;
|
|
+
|
|
+ i2c_buffer[3] = CEC_OPCODE_STANDBY ; /* Standby */
|
|
+
|
|
+ /* CEC Data register */
|
|
+ err = set_cec_hw_registers(p_dis, E_REG_CDR0, i2c_buffer, 4);
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+ /* Save Datas of the CEC message send */
|
|
+ gtmdl_hdmi_cec_driver_save_message.address_byte = i2c_buffer[2];
|
|
+ gtmdl_hdmi_cec_driver_save_message.message_type_polling = 0;
|
|
+ gtmdl_hdmi_cec_driver_save_message.opcode = i2c_buffer[3];
|
|
+
|
|
+ return(0);
|
|
+}
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \fn tmErrorCode_t dlHdmiCecSystemAudioModeRequest( )
|
|
+ * \brief A device implementing System Audio Control and which has volume
|
|
+ * control RC button(eg TV or STB) request to use System Audio Mode
|
|
+ * to the amplifier.
|
|
+ *
|
|
+ * \param tmInstance_t Instance \n
|
|
+ * Instance identifier. \n
|
|
+ *
|
|
+ * \param u16 PhysicalAddress \n
|
|
+ * Physical address of the device.\n
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ * - ERR_DLHDMICEC_BAD_PARAMETER: a parameter is invalid or out
|
|
+ * of range
|
|
+ *
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_system_audio_mode_request
|
|
+(
|
|
+ instance_t instance,
|
|
+ u8 receiver_logical_address,
|
|
+ u16 physical_address
|
|
+)
|
|
+{
|
|
+ error_code_t err;
|
|
+ unsigned char i2c_buffer[6] ; /* I2C data buffer */
|
|
+ /* Pointer to Device Instance Structure */
|
|
+ dl_hdmi_cec_driver_config_table_t *p_dis;
|
|
+
|
|
+ /* check if instance number is in range */
|
|
+ RETIF((instance < 0) || (instance >= MAX_UNITS), ERR_DLHDMICEC_BAD_INSTANCE)
|
|
+
|
|
+ /* check if unit corresponding to instance is opened */
|
|
+ RETIF(unit_table[instance].opened == false, ERR_DLHDMICEC_RESOURCE_NOT_OWNED)
|
|
+
|
|
+ /* check if instance state is correct */
|
|
+ /*RETIF(UnitTable[Instance].state != STATE_NOT_INITIALIZED, ERR_DLHDMICEC_INVALID_STATE) */
|
|
+
|
|
+ p_dis = >mdl_hdmi_cec_driver_config_table[instance];
|
|
+
|
|
+ /*======To do : make a prepare message function with parameter */
|
|
+ /* System Audio Mode Request command */
|
|
+ i2c_buffer[0] = 0x06; /* Param number */
|
|
+
|
|
+ i2c_buffer[1] = 0x00; /* Request CEC data */
|
|
+
|
|
+ /*Build Initiator and Reciever Logical Address Byte*/
|
|
+ /*Initiator logical Address*/
|
|
+ i2c_buffer[2] = (unsigned char)(unit_table[instance].device_logical_address) & 0x0F;
|
|
+ i2c_buffer[2] = i2c_buffer[2] << 4;
|
|
+ /* Receiver logical Address*/
|
|
+ i2c_buffer[2] |= receiver_logical_address & 0x0F;
|
|
+
|
|
+ /* System Audio Mode Request*/
|
|
+ i2c_buffer[3] = CEC_OPCODE_SYSTEM_AUDIO_MODE_REQUEST ;
|
|
+ /* MsByte of Physical Address */
|
|
+ i2c_buffer[4] = (unsigned char)(physical_address >> 8);
|
|
+ /* LsByte of Physical Address */
|
|
+ i2c_buffer[5] = (unsigned char)physical_address;
|
|
+
|
|
+ /* CEC Data register */
|
|
+ err = set_cec_hw_registers(p_dis, E_REG_CDR0, i2c_buffer, 6);
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+ /* Save Datas of the CEC message send */
|
|
+ gtmdl_hdmi_cec_driver_save_message.address_byte = i2c_buffer[2];
|
|
+ gtmdl_hdmi_cec_driver_save_message.message_type_polling = 0;
|
|
+ gtmdl_hdmi_cec_driver_save_message.opcode = i2c_buffer[3];
|
|
+
|
|
+ return(0);
|
|
+}
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \fn tmErrorCode_t dlHdmiCecSystemAudioModeStatus( )
|
|
+ * \brief Reports the current status of the System Audio Mode.
|
|
+ *
|
|
+ * \param tmInstance_t Instance \n
|
|
+ * Instance identifier. \n
|
|
+ *
|
|
+ * \param dlHdmiCECSystemAudioStatus_t SystemAudioStatus \n
|
|
+ * Current system audio mode.\n
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ * - ERR_DLHDMICEC_BAD_PARAMETER: a parameter is invalid or out
|
|
+ * of range
|
|
+ *
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_system_audio_mode_status
|
|
+(
|
|
+ instance_t instance,
|
|
+ u8 receiver_logical_address,
|
|
+ dl_hdmi_cecsystem_audio_status_t system_audio_status
|
|
+)
|
|
+{
|
|
+ error_code_t err;
|
|
+ unsigned char i2c_buffer[5] ; /* I2C data buffer */
|
|
+ /* Pointer to Device Instance Structure */
|
|
+ dl_hdmi_cec_driver_config_table_t *p_dis;
|
|
+
|
|
+ /* check if instance number is in range */
|
|
+ RETIF((instance < 0) || (instance >= MAX_UNITS), ERR_DLHDMICEC_BAD_INSTANCE)
|
|
+
|
|
+ /* check if unit corresponding to instance is opened */
|
|
+ RETIF(unit_table[instance].opened == false, ERR_DLHDMICEC_RESOURCE_NOT_OWNED)
|
|
+
|
|
+ /* check if instance state is correct */
|
|
+ /*RETIF(UnitTable[Instance].state != STATE_NOT_INITIALIZED, ERR_DLHDMICEC_INVALID_STATE) */
|
|
+
|
|
+ p_dis = >mdl_hdmi_cec_driver_config_table[instance];
|
|
+
|
|
+ /*======To do : make a prepare message function with parameter */
|
|
+ /* System Audio Mode Status command */
|
|
+ i2c_buffer[0] = 0x05; /* Param number */
|
|
+
|
|
+ i2c_buffer[1] = 0x00; /* Request CEC data */
|
|
+
|
|
+ /*Build Initiator and Reciever Logical Address Byte*/
|
|
+ /*Initiator logical Address*/
|
|
+ i2c_buffer[2] = (unsigned char)(unit_table[instance].device_logical_address) & 0x0F;
|
|
+ i2c_buffer[2] = i2c_buffer[2] << 4;
|
|
+ /* Receiver logical Address*/
|
|
+ i2c_buffer[2] |= receiver_logical_address & 0x0F;
|
|
+
|
|
+ /* System Audio Mode Status*/
|
|
+ i2c_buffer[3] = CEC_OPCODE_SYSTEM_AUDIO_MODE_STATUS ;
|
|
+ /* System Audio Status*/
|
|
+ i2c_buffer[4] = system_audio_status;
|
|
+
|
|
+ /* CEC Data register */
|
|
+ err = set_cec_hw_registers(p_dis, E_REG_CDR0, i2c_buffer, 5);
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+ /* Save Datas of the CEC message send */
|
|
+ gtmdl_hdmi_cec_driver_save_message.address_byte = i2c_buffer[2];
|
|
+ gtmdl_hdmi_cec_driver_save_message.message_type_polling = 0;
|
|
+ gtmdl_hdmi_cec_driver_save_message.opcode = i2c_buffer[3];
|
|
+
|
|
+ return(0);
|
|
+}
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \fn tmErrorCode_t dlHdmiCecGiveTunerDeviceStatus( )
|
|
+ * \brief This message is used to request the status of a tuner device
|
|
+ *
|
|
+ * \param tmInstance_t Instance \n
|
|
+ * Instance identifier. \n
|
|
+ *
|
|
+ * \param dlHdmiCECStatusRequest_t StatusRequest \n
|
|
+ * Allows the initiator to request the status once or on all future state
|
|
+ * change. Or to cancel a previous <Give Tuner Device Status > ["On"] request. \n
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ *
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_give_tuner_device_status
|
|
+(
|
|
+ instance_t instance,
|
|
+ u8 receiver_logical_address,
|
|
+ dl_hdmi_cecstatus_request_t status_request
|
|
+)
|
|
+{
|
|
+ error_code_t err;
|
|
+ unsigned char i2c_buffer[5] ; /* I2C data buffer */
|
|
+ /* Pointer to Device Instance Structure */
|
|
+ dl_hdmi_cec_driver_config_table_t *p_dis;
|
|
+
|
|
+ /* check if instance number is in range */
|
|
+ RETIF((instance < 0) || (instance >= MAX_UNITS), ERR_DLHDMICEC_BAD_INSTANCE)
|
|
+
|
|
+ /* check if unit corresponding to instance is opened */
|
|
+ RETIF(unit_table[instance].opened == false, ERR_DLHDMICEC_RESOURCE_NOT_OWNED)
|
|
+
|
|
+ /* check if instance state is correct */
|
|
+ /*RETIF(UnitTable[Instance].state != STATE_NOT_INITIALIZED, ERR_DLHDMICEC_INVALID_STATE) */
|
|
+
|
|
+ p_dis = >mdl_hdmi_cec_driver_config_table[instance];
|
|
+
|
|
+ /*======To do : make a prepare message function with parameter */
|
|
+ /* System Audio Mode Request command */
|
|
+ i2c_buffer[0] = 0x05; /* Param number */
|
|
+
|
|
+ i2c_buffer[1] = 0x00; /* Request CEC data */
|
|
+
|
|
+ /*Build Initiator and Reciever Logical Address Byte*/
|
|
+ /*Initiator logical Address*/
|
|
+ i2c_buffer[2] = (unsigned char)(unit_table[instance].device_logical_address) & 0x0F;
|
|
+ i2c_buffer[2] = i2c_buffer[2] << 4;
|
|
+ /* Receiver logical Address*/
|
|
+ i2c_buffer[2] |= receiver_logical_address & 0x0F;
|
|
+
|
|
+ /* Give Tuner Device Status*/
|
|
+ i2c_buffer[3] = CEC_OPCODE_GIVE_TUNER_DEVICE_STATUS ;
|
|
+ i2c_buffer[4] = (unsigned char)status_request; /* Status Request */
|
|
+
|
|
+ /* CEC Data register */
|
|
+ err = set_cec_hw_registers(p_dis, E_REG_CDR0, i2c_buffer, 5);
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+ /* Save Datas of the CEC message send */
|
|
+ gtmdl_hdmi_cec_driver_save_message.address_byte = i2c_buffer[2];
|
|
+ gtmdl_hdmi_cec_driver_save_message.message_type_polling = 0;
|
|
+ gtmdl_hdmi_cec_driver_save_message.opcode = i2c_buffer[3];
|
|
+
|
|
+ return(0);
|
|
+}
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \fn tmErrorCode_t dlHdmiCecRecordTvScreen( )
|
|
+ * \brief This message request by the recording device to record the presently
|
|
+ * displayed source.
|
|
+ *
|
|
+ * \param tmInstance_t Instance \n
|
|
+ * Instance identifier. \n
|
|
+ *
|
|
+ * \param u8 ReceiverLogicalAddress \n
|
|
+ * Address of message receiver. \n
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ *
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_record_tv_screen
|
|
+(
|
|
+ instance_t instance,
|
|
+ u8 receiver_logical_address
|
|
+)
|
|
+{
|
|
+ error_code_t err;
|
|
+ unsigned char i2c_buffer[4] ; /* I2C data buffer */
|
|
+ /* Pointer to Device Instance Structure */
|
|
+ dl_hdmi_cec_driver_config_table_t *p_dis;
|
|
+
|
|
+ /* check if instance number is in range */
|
|
+ RETIF((instance < 0) || (instance >= MAX_UNITS), ERR_DLHDMICEC_BAD_INSTANCE)
|
|
+
|
|
+ /* check if unit corresponding to instance is opened */
|
|
+ RETIF(unit_table[instance].opened == false, ERR_DLHDMICEC_RESOURCE_NOT_OWNED)
|
|
+
|
|
+ /* check if instance state is correct */
|
|
+ /*RETIF(UnitTable[Instance].state != STATE_NOT_INITIALIZED, ERR_DLHDMICEC_INVALID_STATE) */
|
|
+
|
|
+ p_dis = >mdl_hdmi_cec_driver_config_table[instance];
|
|
+
|
|
+ /*======To do : make a prepare message function with parameter */
|
|
+ /* Record TV Sreen command */
|
|
+ i2c_buffer[0] = 0x04; /* Param number */
|
|
+
|
|
+ i2c_buffer[1] = 0x00; /* Request CEC data */
|
|
+
|
|
+ /*Build Initiator and Reciever Logical Address Byte*/
|
|
+ /*Initiator logical Address*/
|
|
+ i2c_buffer[2] = (unsigned char)(unit_table[instance].device_logical_address) & 0x0F;
|
|
+ i2c_buffer[2] = i2c_buffer[2] << 4;
|
|
+ /* Receiver logical Address*/
|
|
+ i2c_buffer[2] |= receiver_logical_address & 0x0F;
|
|
+
|
|
+ i2c_buffer[3] = CEC_OPCODE_RECORD_TV_SCREEN ; /* Record TV screen */
|
|
+
|
|
+ /* CEC Data register */
|
|
+ err = set_cec_hw_registers(p_dis, E_REG_CDR0, i2c_buffer, 4);
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+ /* Save Datas of the CEC message send */
|
|
+ gtmdl_hdmi_cec_driver_save_message.address_byte = i2c_buffer[2];
|
|
+ gtmdl_hdmi_cec_driver_save_message.message_type_polling = 0;
|
|
+ gtmdl_hdmi_cec_driver_save_message.opcode = i2c_buffer[3];
|
|
+
|
|
+ return(0);
|
|
+}
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \fn tmErrorCode_t dlHdmiCecReportAudioStatus( )
|
|
+ * \brief This message report an amplifier's volume and mute.
|
|
+ *
|
|
+ * \param tmInstance_t Instance \n
|
|
+ * Instance identifier. \n
|
|
+ *
|
|
+ * \param u8 ReceiverLogicalAddress \n
|
|
+ * Address of message receiver. \n
|
|
+ *
|
|
+ * \param dlHdmiCECAudioStatus_t AudioStatus \n
|
|
+ * Volume and mute status. \n
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ * - ERR_DLHDMICEC_BAD_PARAMETER: a parameter is invalid or out
|
|
+ * of range
|
|
+ *
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_report_audio_status
|
|
+(
|
|
+ instance_t instance,
|
|
+ u8 receiver_logical_address,
|
|
+ ptmdl_hdmi_cecaudio_status_t p_audio_status
|
|
+)
|
|
+{
|
|
+ error_code_t err;
|
|
+ unsigned char i2c_buffer[5] ; /* I2C data buffer */
|
|
+ /* Pointer to Device Instance Structure */
|
|
+ dl_hdmi_cec_driver_config_table_t *p_dis;
|
|
+ unsigned char regval; /*Local Variable*/
|
|
+
|
|
+ /* check if instance number is in range */
|
|
+ RETIF((instance < 0) || (instance >= MAX_UNITS), ERR_DLHDMICEC_BAD_INSTANCE)
|
|
+
|
|
+ /* check if unit corresponding to instance is opened */
|
|
+ RETIF(unit_table[instance].opened == false, ERR_DLHDMICEC_RESOURCE_NOT_OWNED)
|
|
+
|
|
+ /* check if instance state is correct */
|
|
+ /*RETIF(UnitTable[Instance].state != STATE_NOT_INITIALIZED, ERR_DLHDMICEC_INVALID_STATE) */
|
|
+
|
|
+ p_dis = >mdl_hdmi_cec_driver_config_table[instance];
|
|
+
|
|
+ /*======To do : make a prepare message function with parameter */
|
|
+ /* Report Audio Status command */
|
|
+ i2c_buffer[0] = 0x05; /* Param number */
|
|
+
|
|
+ i2c_buffer[1] = 0x00; /* Request CEC data */
|
|
+
|
|
+ /*Build Initiator and Reciever Logical Address Byte*/
|
|
+ /*Initiator logical Address*/
|
|
+ i2c_buffer[2] = (unsigned char)(unit_table[instance].device_logical_address) & 0x0F;
|
|
+ i2c_buffer[2] = i2c_buffer[2] << 4;
|
|
+ /* Receiver logical Address*/
|
|
+ i2c_buffer[2] |= receiver_logical_address & 0x0F;
|
|
+
|
|
+ i2c_buffer[3] = CEC_OPCODE_REPORT_AUDIO_STATUS ; /* Report Audio Statust*/
|
|
+ /* bit 7 Mute Status*/
|
|
+ regval = (((unsigned char)p_audio_status -> audio_mute_status) & 0x01) << 7;
|
|
+ /* bit 6 to 0 Volum Status*/
|
|
+ regval |= ((unsigned char)p_audio_status -> audio_volume_status) & 0x7F;
|
|
+ i2c_buffer[4] = regval;
|
|
+
|
|
+ /* CEC Data register */
|
|
+ err = set_cec_hw_registers(p_dis, E_REG_CDR0, i2c_buffer, 5);
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+ /* Save Datas of the CEC message send */
|
|
+ gtmdl_hdmi_cec_driver_save_message.address_byte = i2c_buffer[2];
|
|
+ gtmdl_hdmi_cec_driver_save_message.message_type_polling = 0;
|
|
+ gtmdl_hdmi_cec_driver_save_message.opcode = i2c_buffer[3];
|
|
+
|
|
+ return(0);
|
|
+}
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \fn tmErrorCode_t dlHdmiCecReportShortAudioDescriptor( )
|
|
+ * \brief This message Report Audio Capability.
|
|
+ *
|
|
+ * \param tmInstance_t Instance \n
|
|
+ * Instance identifier. \n
|
|
+ *
|
|
+ * \param u8 ReceiverLogicalAddress \n
|
|
+ * Address of message receiver. \n
|
|
+ *
|
|
+ * \param u32 ShortAudioDecriptor \n
|
|
+ * Audio Descriptor. \n
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ * - ERR_DLHDMICEC_BAD_PARAMETER: a parameter is invalid or out
|
|
+ * of range
|
|
+ *
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_report_short_audio_descriptor
|
|
+(
|
|
+ instance_t instance,
|
|
+ u8 receiver_logical_address,
|
|
+ u32 short_audio_decriptor
|
|
+)
|
|
+{
|
|
+ error_code_t err;
|
|
+ unsigned char i2c_buffer[7] ; /* I2C data buffer */
|
|
+ /* Pointer to Device Instance Structure */
|
|
+ dl_hdmi_cec_driver_config_table_t *p_dis;
|
|
+
|
|
+ /* check if instance number is in range */
|
|
+ RETIF((instance < 0) || (instance >= MAX_UNITS), ERR_DLHDMICEC_BAD_INSTANCE)
|
|
+
|
|
+ /* check if unit corresponding to instance is opened */
|
|
+ RETIF(unit_table[instance].opened == false, ERR_DLHDMICEC_RESOURCE_NOT_OWNED)
|
|
+
|
|
+ p_dis = >mdl_hdmi_cec_driver_config_table[instance];
|
|
+
|
|
+ /* Report Short Audio Decriptor */
|
|
+ i2c_buffer[0] = 0x07; /* Param number */
|
|
+
|
|
+ i2c_buffer[1] = 0x00; /* Request CEC data */
|
|
+
|
|
+ /*Build Initiator and Reciever Logical Address Byte*/
|
|
+ /*Initiator logical Address*/
|
|
+ i2c_buffer[2] = (unsigned char)(unit_table[instance].device_logical_address) & 0x0F;
|
|
+ i2c_buffer[2] = i2c_buffer[2] << 4;
|
|
+ /* Receiver logical Address*/
|
|
+ i2c_buffer[2] |= receiver_logical_address & 0x0F;
|
|
+
|
|
+ /* Report Audio Capability*/
|
|
+ i2c_buffer[3] = CEC_OPCODE_REPORT_SHORT_AUDIO_DESCRIPTOR ;
|
|
+ /* MSByte of ShortAudioDecriptor*/
|
|
+ i2c_buffer[4] = (unsigned char)(short_audio_decriptor >> 16);
|
|
+ i2c_buffer[5] = (unsigned char)(short_audio_decriptor >> 8);
|
|
+ /* LSByte of ShortAudioDecriptor*/
|
|
+ i2c_buffer[6] = (unsigned char)short_audio_decriptor;
|
|
+
|
|
+ /* CEC Data register */
|
|
+ err = set_cec_hw_registers(p_dis, E_REG_CDR0, i2c_buffer, 7);
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+ /* Save Datas of the CEC message send */
|
|
+ gtmdl_hdmi_cec_driver_save_message.address_byte = i2c_buffer[2];
|
|
+ gtmdl_hdmi_cec_driver_save_message.message_type_polling = 0;
|
|
+ gtmdl_hdmi_cec_driver_save_message.opcode = i2c_buffer[3];
|
|
+
|
|
+ return(0);
|
|
+}
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \fn tmErrorCode_t dlHdmiCecRequestShortAudioDescriptor( )
|
|
+ * \brief This message Request Audio Capability.
|
|
+ *
|
|
+ * \param tmInstance_t Instance \n
|
|
+ * Instance identifier. \n
|
|
+ *
|
|
+ * \param u8 ReceiverLogicalAddress \n
|
|
+ * Address of message receiver. \n
|
|
+ *
|
|
+ * \param u8 AudioFormatID \n
|
|
+ *
|
|
+ * \param u8 AudioFormatCode \n
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ * - ERR_DLHDMICEC_BAD_PARAMETER: a parameter is invalid or out
|
|
+ * of range
|
|
+ *
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_request_short_audio_descriptor
|
|
+(
|
|
+ instance_t instance,
|
|
+ u8 receiver_logical_address,
|
|
+ u8 audio_format_id,
|
|
+ u8 audio_format_code
|
|
+
|
|
+)
|
|
+{
|
|
+ error_code_t err;
|
|
+ unsigned char i2c_buffer[5] ; /* I2C data buffer */
|
|
+ /* Pointer to Device Instance Structure */
|
|
+ dl_hdmi_cec_driver_config_table_t *p_dis;
|
|
+ unsigned char regval; /*Local Variable*/
|
|
+
|
|
+ /* check if instance number is in range */
|
|
+ RETIF((instance < 0) || (instance >= MAX_UNITS), ERR_DLHDMICEC_BAD_INSTANCE)
|
|
+
|
|
+ /* check if unit corresponding to instance is opened */
|
|
+ RETIF(unit_table[instance].opened == false, ERR_DLHDMICEC_RESOURCE_NOT_OWNED)
|
|
+
|
|
+ p_dis = >mdl_hdmi_cec_driver_config_table[instance];
|
|
+
|
|
+ /* Report Short Audio Decriptor */
|
|
+ i2c_buffer[0] = 0x05; /* Param number */
|
|
+
|
|
+ i2c_buffer[1] = 0x00; /* Request CEC data */
|
|
+
|
|
+ /*Build Initiator and Reciever Logical Address Byte*/
|
|
+ /*Initiator logical Address*/
|
|
+ i2c_buffer[2] = (unsigned char)(unit_table[instance].device_logical_address) & 0x0F;
|
|
+ i2c_buffer[2] = i2c_buffer[2] << 4;
|
|
+ /* Receiver logical Address*/
|
|
+ i2c_buffer[2] |= receiver_logical_address & 0x0F;
|
|
+
|
|
+ /* Request Audio Capability*/
|
|
+ i2c_buffer[3] = CEC_OPCODE_REQUEST_SHORT_AUDIO_DESCRIPTOR ;
|
|
+ /* bit 3 to 7 AudioFormatCode*/
|
|
+ regval = (((unsigned char)audio_format_code) & 0x3F) << 2;
|
|
+ /* bit 1 to 0 AudioFormatID*/
|
|
+ regval |= ((unsigned char)audio_format_id) & 0x03;
|
|
+ i2c_buffer[4] = regval;
|
|
+
|
|
+ /* CEC Data register */
|
|
+ err = set_cec_hw_registers(p_dis, E_REG_CDR0, i2c_buffer, 7);
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+ /* Save Datas of the CEC message send */
|
|
+ gtmdl_hdmi_cec_driver_save_message.address_byte = i2c_buffer[2];
|
|
+ gtmdl_hdmi_cec_driver_save_message.message_type_polling = 0;
|
|
+ gtmdl_hdmi_cec_driver_save_message.opcode = i2c_buffer[3];
|
|
+
|
|
+ return(0);
|
|
+}
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \fn tmErrorCode_t dlHdmiCecIniateARC( )
|
|
+ * \brief This message Used by an ARC RX device to activate the
|
|
+ * ARC functionality in an ARC TX device
|
|
+ *
|
|
+ * \param tmInstance_t Instance \n
|
|
+ * Instance identifier. \n
|
|
+ *
|
|
+ * \param u8 ReceiverLogicalAddress \n
|
|
+ * Address of message receiver. \n
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ * - ERR_DLHDMICEC_BAD_PARAMETER: a parameter is invalid or out
|
|
+ * of range
|
|
+ *
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_iniate_arc
|
|
+(
|
|
+ instance_t instance,
|
|
+ u8 receiver_logical_address
|
|
+)
|
|
+{
|
|
+ error_code_t err;
|
|
+ unsigned char i2c_buffer[4] ; /* I2C data buffer */
|
|
+ /* Pointer to Device Instance Structure */
|
|
+ dl_hdmi_cec_driver_config_table_t *p_dis;
|
|
+
|
|
+ /* check if instance number is in range */
|
|
+ RETIF((instance < 0) || (instance >= MAX_UNITS), ERR_DLHDMICEC_BAD_INSTANCE)
|
|
+
|
|
+ /* check if unit corresponding to instance is opened */
|
|
+ RETIF(unit_table[instance].opened == false, ERR_DLHDMICEC_RESOURCE_NOT_OWNED)
|
|
+
|
|
+ p_dis = >mdl_hdmi_cec_driver_config_table[instance];
|
|
+
|
|
+ /* Report Short Audio Decriptor */
|
|
+ i2c_buffer[0] = 0x04; /* Param number */
|
|
+
|
|
+ i2c_buffer[1] = 0x00; /* Request CEC data */
|
|
+
|
|
+ /*Build Initiator and Reciever Logical Address Byte*/
|
|
+ /*Initiator logical Address*/
|
|
+ i2c_buffer[2] = (unsigned char)(unit_table[instance].device_logical_address) & 0x0F;
|
|
+ i2c_buffer[2] = i2c_buffer[2] << 4;
|
|
+ /* Receiver logical Address*/
|
|
+ i2c_buffer[2] |= receiver_logical_address & 0x0F;
|
|
+
|
|
+ i2c_buffer[3] = CEC_OPCODE_INITATE_ARC ;
|
|
+
|
|
+ /* CEC Data register */
|
|
+ err = set_cec_hw_registers(p_dis, E_REG_CDR0, i2c_buffer, 4);
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+ /* Save Datas of the CEC message send */
|
|
+ gtmdl_hdmi_cec_driver_save_message.address_byte = i2c_buffer[2];
|
|
+ gtmdl_hdmi_cec_driver_save_message.message_type_polling = 0;
|
|
+ gtmdl_hdmi_cec_driver_save_message.opcode = i2c_buffer[3];
|
|
+
|
|
+ return(0);
|
|
+}
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \fn tmErrorCode_t dlHdmiCecReportArcInitiated( )
|
|
+ * \brief This message Used by an ARC TX device to indicate that
|
|
+ * its ARC functionality has been activated
|
|
+ *
|
|
+ * \param tmInstance_t Instance \n
|
|
+ * Instance identifier. \n
|
|
+ *
|
|
+ * \param u8 ReceiverLogicalAddress \n
|
|
+ * Address of message receiver. \n
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ * - ERR_DLHDMICEC_BAD_PARAMETER: a parameter is invalid or out
|
|
+ * of range
|
|
+ *
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_report_arc_initiated
|
|
+(
|
|
+ instance_t instance,
|
|
+ u8 receiver_logical_address
|
|
+)
|
|
+{
|
|
+ error_code_t err;
|
|
+ unsigned char i2c_buffer[4] ; /* I2C data buffer */
|
|
+ /* Pointer to Device Instance Structure */
|
|
+ dl_hdmi_cec_driver_config_table_t *p_dis;
|
|
+
|
|
+ /* check if instance number is in range */
|
|
+ RETIF((instance < 0) || (instance >= MAX_UNITS), ERR_DLHDMICEC_BAD_INSTANCE)
|
|
+
|
|
+ /* check if unit corresponding to instance is opened */
|
|
+ RETIF(unit_table[instance].opened == false, ERR_DLHDMICEC_RESOURCE_NOT_OWNED)
|
|
+
|
|
+ p_dis = >mdl_hdmi_cec_driver_config_table[instance];
|
|
+
|
|
+ /* Report Short Audio Decriptor */
|
|
+ i2c_buffer[0] = 0x04; /* Param number */
|
|
+
|
|
+ i2c_buffer[1] = 0x00; /* Request CEC data */
|
|
+
|
|
+ /*Build Initiator and Reciever Logical Address Byte*/
|
|
+ /*Initiator logical Address*/
|
|
+ i2c_buffer[2] = (unsigned char)(unit_table[instance].device_logical_address) & 0x0F;
|
|
+ i2c_buffer[2] = i2c_buffer[2] << 4;
|
|
+ /* Receiver logical Address*/
|
|
+ i2c_buffer[2] |= receiver_logical_address & 0x0F;
|
|
+
|
|
+ i2c_buffer[3] = CEC_OPCODE_REPORT_ARC_INITIATED ;
|
|
+
|
|
+ /* CEC Data register */
|
|
+ err = set_cec_hw_registers(p_dis, E_REG_CDR0, i2c_buffer, 4);
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+ /* Save Datas of the CEC message send */
|
|
+ gtmdl_hdmi_cec_driver_save_message.address_byte = i2c_buffer[2];
|
|
+ gtmdl_hdmi_cec_driver_save_message.message_type_polling = 0;
|
|
+ gtmdl_hdmi_cec_driver_save_message.opcode = i2c_buffer[3];
|
|
+
|
|
+ return(0);
|
|
+}
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \fn tmErrorCode_t dlHdmiCecReportArcTerminated( )
|
|
+ * \brief This message Used by an ARC TX device to indicate that its ARC functionality
|
|
+ * has been deactivated.
|
|
+ *
|
|
+ * \param tmInstance_t Instance \n
|
|
+ * Instance identifier. \n
|
|
+ *
|
|
+ * \param u8 ReceiverLogicalAddress \n
|
|
+ * Address of message receiver. \n
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ * - ERR_DLHDMICEC_BAD_PARAMETER: a parameter is invalid or out
|
|
+ * of range
|
|
+ *
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_report_arc_terminated
|
|
+(
|
|
+ instance_t instance,
|
|
+ u8 receiver_logical_address
|
|
+)
|
|
+{
|
|
+ error_code_t err;
|
|
+ unsigned char i2c_buffer[4] ; /* I2C data buffer */
|
|
+ /* Pointer to Device Instance Structure */
|
|
+ dl_hdmi_cec_driver_config_table_t *p_dis;
|
|
+
|
|
+ /* check if instance number is in range */
|
|
+ RETIF((instance < 0) || (instance >= MAX_UNITS), ERR_DLHDMICEC_BAD_INSTANCE)
|
|
+
|
|
+ /* check if unit corresponding to instance is opened */
|
|
+ RETIF(unit_table[instance].opened == false, ERR_DLHDMICEC_RESOURCE_NOT_OWNED)
|
|
+
|
|
+ p_dis = >mdl_hdmi_cec_driver_config_table[instance];
|
|
+
|
|
+ /* Report Short Audio Decriptor */
|
|
+ i2c_buffer[0] = 0x04; /* Param number */
|
|
+
|
|
+ i2c_buffer[1] = 0x00; /* Request CEC data */
|
|
+
|
|
+ /*Build Initiator and Reciever Logical Address Byte*/
|
|
+ /*Initiator logical Address*/
|
|
+ i2c_buffer[2] = (unsigned char)(unit_table[instance].device_logical_address) & 0x0F;
|
|
+ i2c_buffer[2] = i2c_buffer[2] << 4;
|
|
+ /* Receiver logical Address*/
|
|
+ i2c_buffer[2] |= receiver_logical_address & 0x0F;
|
|
+
|
|
+ i2c_buffer[3] = CEC_OPCODE_REPORT_ARC_TERMINATED ;
|
|
+
|
|
+ /* CEC Data register */
|
|
+ err = set_cec_hw_registers(p_dis, E_REG_CDR0, i2c_buffer, 4);
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+ /* Save Datas of the CEC message send */
|
|
+ gtmdl_hdmi_cec_driver_save_message.address_byte = i2c_buffer[2];
|
|
+ gtmdl_hdmi_cec_driver_save_message.message_type_polling = 0;
|
|
+ gtmdl_hdmi_cec_driver_save_message.opcode = i2c_buffer[3];
|
|
+
|
|
+ return(0);
|
|
+}
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \fn tmErrorCode_t dlHdmiCecRequestArcInitiation( )
|
|
+ * \brief This message Used by an ARC TX device to request an ARC RX device to
|
|
+ * activate the ARC functionality in the ARC TX device.
|
|
+ *
|
|
+ * \param tmInstance_t Instance \n
|
|
+ * Instance identifier. \n
|
|
+ *
|
|
+ * \param u8 ReceiverLogicalAddress \n
|
|
+ * Address of message receiver. \n
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ * - ERR_DLHDMICEC_BAD_PARAMETER: a parameter is invalid or out
|
|
+ * of range
|
|
+ *
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_request_arc_initiation
|
|
+(
|
|
+ instance_t instance,
|
|
+ u8 receiver_logical_address
|
|
+)
|
|
+{
|
|
+ error_code_t err;
|
|
+ unsigned char i2c_buffer[4] ; /* I2C data buffer */
|
|
+ /* Pointer to Device Instance Structure */
|
|
+ dl_hdmi_cec_driver_config_table_t *p_dis;
|
|
+
|
|
+ /* check if instance number is in range */
|
|
+ RETIF((instance < 0) || (instance >= MAX_UNITS), ERR_DLHDMICEC_BAD_INSTANCE)
|
|
+
|
|
+ /* check if unit corresponding to instance is opened */
|
|
+ RETIF(unit_table[instance].opened == false, ERR_DLHDMICEC_RESOURCE_NOT_OWNED)
|
|
+
|
|
+ p_dis = >mdl_hdmi_cec_driver_config_table[instance];
|
|
+
|
|
+ /* Report Short Audio Decriptor */
|
|
+ i2c_buffer[0] = 0x04; /* Param number */
|
|
+
|
|
+ i2c_buffer[1] = 0x00; /* Request CEC data */
|
|
+
|
|
+ /*Build Initiator and Reciever Logical Address Byte*/
|
|
+ /*Initiator logical Address*/
|
|
+ i2c_buffer[2] = (unsigned char)(unit_table[instance].device_logical_address) & 0x0F;
|
|
+ i2c_buffer[2] = i2c_buffer[2] << 4;
|
|
+ /* Receiver logical Address*/
|
|
+ i2c_buffer[2] |= receiver_logical_address & 0x0F;
|
|
+
|
|
+ i2c_buffer[3] = CEC_OPCODE_REPORT_ARC_INITIATION ;
|
|
+
|
|
+ /* CEC Data register */
|
|
+ err = set_cec_hw_registers(p_dis, E_REG_CDR0, i2c_buffer, 4);
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+ /* Save Datas of the CEC message send */
|
|
+ gtmdl_hdmi_cec_driver_save_message.address_byte = i2c_buffer[2];
|
|
+ gtmdl_hdmi_cec_driver_save_message.message_type_polling = 0;
|
|
+ gtmdl_hdmi_cec_driver_save_message.opcode = i2c_buffer[3];
|
|
+
|
|
+ return(0);
|
|
+}
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \fn tmErrorCode_t dlHdmiCecRequestArcTerminiation( )
|
|
+ * \brief Used by an ARC TX device to request an ARC RX device to deactivate
|
|
+ * the ARC functionality in the ARC TX device.
|
|
+ *
|
|
+ * \param tmInstance_t Instance \n
|
|
+ * Instance identifier. \n
|
|
+ *
|
|
+ * \param u8 ReceiverLogicalAddress \n
|
|
+ * Address of message receiver. \n
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ * - ERR_DLHDMICEC_BAD_PARAMETER: a parameter is invalid or out
|
|
+ * of range
|
|
+ *
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_request_arc_terminiation
|
|
+(
|
|
+ instance_t instance,
|
|
+ u8 receiver_logical_address
|
|
+)
|
|
+{
|
|
+ error_code_t err;
|
|
+ unsigned char i2c_buffer[4] ; /* I2C data buffer */
|
|
+ /* Pointer to Device Instance Structure */
|
|
+ dl_hdmi_cec_driver_config_table_t *p_dis;
|
|
+
|
|
+ /* check if instance number is in range */
|
|
+ RETIF((instance < 0) || (instance >= MAX_UNITS), ERR_DLHDMICEC_BAD_INSTANCE)
|
|
+
|
|
+ /* check if unit corresponding to instance is opened */
|
|
+ RETIF(unit_table[instance].opened == false, ERR_DLHDMICEC_RESOURCE_NOT_OWNED)
|
|
+
|
|
+ p_dis = >mdl_hdmi_cec_driver_config_table[instance];
|
|
+
|
|
+ /* Report Short Audio Decriptor */
|
|
+ i2c_buffer[0] = 0x04; /* Param number */
|
|
+
|
|
+ i2c_buffer[1] = 0x00; /* Request CEC data */
|
|
+
|
|
+ /*Build Initiator and Reciever Logical Address Byte*/
|
|
+ /*Initiator logical Address*/
|
|
+ i2c_buffer[2] = (unsigned char)(unit_table[instance].device_logical_address) & 0x0F;
|
|
+ i2c_buffer[2] = i2c_buffer[2] << 4;
|
|
+ /* Receiver logical Address*/
|
|
+ i2c_buffer[2] |= receiver_logical_address & 0x0F;
|
|
+
|
|
+ i2c_buffer[3] = CEC_OPCODE_REPORT_ARC_TERMINATION ;
|
|
+
|
|
+ /* CEC Data register */
|
|
+ err = set_cec_hw_registers(p_dis, E_REG_CDR0, i2c_buffer, 4);
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+ /* Save Datas of the CEC message send */
|
|
+ gtmdl_hdmi_cec_driver_save_message.address_byte = i2c_buffer[2];
|
|
+ gtmdl_hdmi_cec_driver_save_message.message_type_polling = 0;
|
|
+ gtmdl_hdmi_cec_driver_save_message.opcode = i2c_buffer[3];
|
|
+
|
|
+ return(0);
|
|
+}
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \fn tmErrorCode_t dlHdmiCecTerminateARC( )
|
|
+ * \brief Used by an ARC TX device to request an ARC RX device to deactivate
|
|
+ * the ARC functionality in the ARC TX device.
|
|
+ *
|
|
+ * \param tmInstance_t Instance \n
|
|
+ * Instance identifier. \n
|
|
+ *
|
|
+ * \param u8 ReceiverLogicalAddress \n
|
|
+ * Address of message receiver. \n
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ * - ERR_DLHDMICEC_BAD_PARAMETER: a parameter is invalid or out
|
|
+ * of range
|
|
+ *
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_terminate_arc
|
|
+(
|
|
+ instance_t instance,
|
|
+ u8 receiver_logical_address
|
|
+)
|
|
+{
|
|
+ error_code_t err;
|
|
+ unsigned char i2c_buffer[4] ; /* I2C data buffer */
|
|
+ /* Pointer to Device Instance Structure */
|
|
+ dl_hdmi_cec_driver_config_table_t *p_dis;
|
|
+
|
|
+ /* check if instance number is in range */
|
|
+ RETIF((instance < 0) || (instance >= MAX_UNITS), ERR_DLHDMICEC_BAD_INSTANCE)
|
|
+
|
|
+ /* check if unit corresponding to instance is opened */
|
|
+ RETIF(unit_table[instance].opened == false, ERR_DLHDMICEC_RESOURCE_NOT_OWNED)
|
|
+
|
|
+ p_dis = >mdl_hdmi_cec_driver_config_table[instance];
|
|
+
|
|
+ /* Report Short Audio Decriptor */
|
|
+ i2c_buffer[0] = 0x04; /* Param number */
|
|
+
|
|
+ i2c_buffer[1] = 0x00; /* Request CEC data */
|
|
+
|
|
+ /*Build Initiator and Reciever Logical Address Byte*/
|
|
+ /*Initiator logical Address*/
|
|
+ i2c_buffer[2] = (unsigned char)(unit_table[instance].device_logical_address) & 0x0F;
|
|
+ i2c_buffer[2] = i2c_buffer[2] << 4;
|
|
+ /* Receiver logical Address*/
|
|
+ i2c_buffer[2] |= receiver_logical_address & 0x0F;
|
|
+
|
|
+ i2c_buffer[3] = CEC_OPCODE_TERMINATE_ARC ;
|
|
+
|
|
+ /* CEC Data register */
|
|
+ err = set_cec_hw_registers(p_dis, E_REG_CDR0, i2c_buffer, 4);
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+ /* Save Datas of the CEC message send */
|
|
+ gtmdl_hdmi_cec_driver_save_message.address_byte = i2c_buffer[2];
|
|
+ gtmdl_hdmi_cec_driver_save_message.message_type_polling = 0;
|
|
+ gtmdl_hdmi_cec_driver_save_message.opcode = i2c_buffer[3];
|
|
+
|
|
+ return(0);
|
|
+}
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \fn tmErrorCode_t dlHdmiCecGivePhysicalAddress( )
|
|
+ * \brief This message is a request to a device to return its physical Address
|
|
+ *
|
|
+ * \param tmInstance_t Instance \n
|
|
+ * Instance identifier. \n
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ *
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_give_physical_address
|
|
+(
|
|
+ instance_t instance,
|
|
+ u8 receiver_logical_address
|
|
+)
|
|
+{
|
|
+ error_code_t err;
|
|
+ unsigned char i2c_buffer[4] ; /* I2C data buffer */
|
|
+ /* Pointer to Device Instance Structure */
|
|
+ dl_hdmi_cec_driver_config_table_t *p_dis;
|
|
+
|
|
+ /* check if instance number is in range */
|
|
+ RETIF((instance < 0) || (instance >= MAX_UNITS), ERR_DLHDMICEC_BAD_INSTANCE)
|
|
+
|
|
+ /* check if unit corresponding to instance is opened */
|
|
+ RETIF(unit_table[instance].opened == false, ERR_DLHDMICEC_RESOURCE_NOT_OWNED)
|
|
+
|
|
+ /* check if instance state is correct */
|
|
+ /*RETIF(UnitTable[Instance].state != STATE_NOT_INITIALIZED, ERR_DLHDMICEC_INVALID_STATE) */
|
|
+
|
|
+ p_dis = >mdl_hdmi_cec_driver_config_table[instance];
|
|
+
|
|
+ /*======To do : make a prepare message function with parameter */
|
|
+ /* Give physical Address command */
|
|
+ i2c_buffer[0] = 0x04; /* Param number */
|
|
+
|
|
+ i2c_buffer[1] = 0x00; /* Request CEC data */
|
|
+
|
|
+ /*Build Initiator and Reciever Logical Address Byte*/
|
|
+ /*Initiator logical Address*/
|
|
+ i2c_buffer[2] = (unsigned char)(unit_table[instance].device_logical_address) & 0x0F;
|
|
+ i2c_buffer[2] = i2c_buffer[2] << 4;
|
|
+ /* Receiver logical Address*/
|
|
+ i2c_buffer[2] |= receiver_logical_address & 0x0F;
|
|
+
|
|
+ /* Give Physical Address */
|
|
+ i2c_buffer[3] = CEC_OPCODE_GIVE_PHYSICAL_ADDRESS ;
|
|
+
|
|
+ /* CEC Data register */
|
|
+ err = set_cec_hw_registers(p_dis, E_REG_CDR0, i2c_buffer, 4);
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+ /* Save Datas of the CEC message send */
|
|
+ gtmdl_hdmi_cec_driver_save_message.address_byte = i2c_buffer[2];
|
|
+ gtmdl_hdmi_cec_driver_save_message.message_type_polling = 0;
|
|
+ gtmdl_hdmi_cec_driver_save_message.opcode = i2c_buffer[3];
|
|
+
|
|
+ return(0);
|
|
+}
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \fn tmErrorCode_t dlHdmiCecGiveSystemAudioModeStatus( )
|
|
+ * \brief This message request the status of the system audio mode
|
|
+ *
|
|
+ * \param tmInstance_t Instance \n
|
|
+ * Instance identifier. \n
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ *
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_give_system_audio_mode_status
|
|
+(
|
|
+ instance_t instance,
|
|
+ u8 receiver_logical_address
|
|
+)
|
|
+{
|
|
+ error_code_t err;
|
|
+ unsigned char i2c_buffer[4] ; /* I2C data buffer */
|
|
+ /* Pointer to Device Instance Structure */
|
|
+ dl_hdmi_cec_driver_config_table_t *p_dis;
|
|
+
|
|
+ /* check if instance number is in range */
|
|
+ RETIF((instance < 0) || (instance >= MAX_UNITS), ERR_DLHDMICEC_BAD_INSTANCE)
|
|
+
|
|
+ /* check if unit corresponding to instance is opened */
|
|
+ RETIF(unit_table[instance].opened == false, ERR_DLHDMICEC_RESOURCE_NOT_OWNED)
|
|
+
|
|
+ /* check if instance state is correct */
|
|
+ /*RETIF(UnitTable[Instance].state != STATE_NOT_INITIALIZED, ERR_DLHDMICEC_INVALID_STATE) */
|
|
+
|
|
+ p_dis = >mdl_hdmi_cec_driver_config_table[instance];
|
|
+
|
|
+ /*======To do : make a prepare message function with parameter */
|
|
+ /* Give System Audio Mode Status command */
|
|
+ i2c_buffer[0] = 0x04; /* Param number */
|
|
+
|
|
+ i2c_buffer[1] = 0x00; /* Request CEC data */
|
|
+
|
|
+ /*Build Initiator and Reciever Logical Address Byte*/
|
|
+ /*Initiator logical Address*/
|
|
+ i2c_buffer[2] = (unsigned char)(unit_table[instance].device_logical_address) & 0x0F;
|
|
+ i2c_buffer[2] = i2c_buffer[2] << 4;
|
|
+ /* Receiver logical Address*/
|
|
+ i2c_buffer[2] |= receiver_logical_address & 0x0F;
|
|
+
|
|
+ /* Give System Audio Mode Status*/
|
|
+ i2c_buffer[3] = CEC_OPCODE_GIVE_SYSTEM_AUDIO_MODE_STATUS ;
|
|
+
|
|
+ /* CEC Data register */
|
|
+ err = set_cec_hw_registers(p_dis, E_REG_CDR0, i2c_buffer, 4);
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+ /* Save Datas of the CEC message send */
|
|
+ gtmdl_hdmi_cec_driver_save_message.address_byte = i2c_buffer[2];
|
|
+ gtmdl_hdmi_cec_driver_save_message.message_type_polling = 0;
|
|
+ gtmdl_hdmi_cec_driver_save_message.opcode = i2c_buffer[3];
|
|
+
|
|
+ return(0);
|
|
+}
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \fn tmErrorCode_t dlHdmiCecGetMenuLanguage( )
|
|
+ * \brief This message is sent by a device capable of character generation
|
|
+ * (for OSD and Menus) to a TV in order to discover the currently selected
|
|
+ * Menu Language. Also used by a TV during installation to dicover the
|
|
+ * currently set menu language of other devices.
|
|
+ *
|
|
+ * \param tmInstance_t Instance \n
|
|
+ * Instance identifier. \n
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ *
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_get_menu_language
|
|
+(
|
|
+ instance_t instance,
|
|
+ u8 receiver_logical_address
|
|
+)
|
|
+{
|
|
+ error_code_t err;
|
|
+ unsigned char i2c_buffer[4] ; /* I2C data buffer */
|
|
+ /* Pointer to Device Instance Structure */
|
|
+ dl_hdmi_cec_driver_config_table_t *p_dis;
|
|
+
|
|
+ /* check if instance number is in range */
|
|
+ RETIF((instance < 0) || (instance >= MAX_UNITS), ERR_DLHDMICEC_BAD_INSTANCE)
|
|
+
|
|
+ /* check if unit corresponding to instance is opened */
|
|
+ RETIF(unit_table[instance].opened == false, ERR_DLHDMICEC_RESOURCE_NOT_OWNED)
|
|
+
|
|
+ /* check if instance state is correct */
|
|
+ /*RETIF(UnitTable[Instance].state != STATE_NOT_INITIALIZED, ERR_DLHDMICEC_INVALID_STATE) */
|
|
+
|
|
+ p_dis = >mdl_hdmi_cec_driver_config_table[instance];
|
|
+
|
|
+ /*======To do : make a prepare message function with parameter */
|
|
+ /* Get Menu Language command */
|
|
+ i2c_buffer[0] = 0x04; /* Param number */
|
|
+
|
|
+ i2c_buffer[1] = 0x00; /* Request CEC data */
|
|
+
|
|
+ /*Build Initiator and Reciever Logical Address Byte*/
|
|
+ /*Initiator logical Address*/
|
|
+ i2c_buffer[2] = (unsigned char)(unit_table[instance].device_logical_address) & 0x0F;
|
|
+ i2c_buffer[2] = i2c_buffer[2] << 4;
|
|
+ /* Receiver logical Address*/
|
|
+ i2c_buffer[2] |= receiver_logical_address & 0x0F;
|
|
+
|
|
+ /* Get Menu Address */
|
|
+ i2c_buffer[3] = CEC_OPCODE_GET_MENU_LANGUAGE ;
|
|
+
|
|
+ /* CEC Data register */
|
|
+ err = set_cec_hw_registers(p_dis, E_REG_CDR0, i2c_buffer, 4);
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+ /* Save Datas of the CEC message send */
|
|
+ gtmdl_hdmi_cec_driver_save_message.address_byte = i2c_buffer[2];
|
|
+ gtmdl_hdmi_cec_driver_save_message.message_type_polling = 0;
|
|
+ gtmdl_hdmi_cec_driver_save_message.opcode = i2c_buffer[3];
|
|
+
|
|
+ return(0);
|
|
+}
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \fn tmErrorCode_t dlHdmiCecGiveAudioStatus( )
|
|
+ * \brief This message is requests an amplifier to send its volume and mute status
|
|
+ *
|
|
+ * \param tmInstance_t Instance \n
|
|
+ * Instance identifier. \n
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ *
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_give_audio_status
|
|
+(
|
|
+ instance_t instance,
|
|
+ u8 receiver_logical_address
|
|
+)
|
|
+{
|
|
+ error_code_t err;
|
|
+ unsigned char i2c_buffer[4] ; /* I2C data buffer */
|
|
+ /* Pointer to Device Instance Structure */
|
|
+ dl_hdmi_cec_driver_config_table_t *p_dis;
|
|
+
|
|
+ /* check if instance number is in range */
|
|
+ RETIF((instance < 0) || (instance >= MAX_UNITS), ERR_DLHDMICEC_BAD_INSTANCE)
|
|
+
|
|
+ /* check if unit corresponding to instance is opened */
|
|
+ RETIF(unit_table[instance].opened == false, ERR_DLHDMICEC_RESOURCE_NOT_OWNED)
|
|
+
|
|
+ /* check if instance state is correct */
|
|
+ /*RETIF(UnitTable[Instance].state != STATE_NOT_INITIALIZED, ERR_DLHDMICEC_INVALID_STATE) */
|
|
+
|
|
+ p_dis = >mdl_hdmi_cec_driver_config_table[instance];
|
|
+
|
|
+ /*======To do : make a prepare message function with parameter */
|
|
+ /* Give Audio Mode Status command */
|
|
+ i2c_buffer[0] = 0x04; /* Param number */
|
|
+
|
|
+ i2c_buffer[1] = 0x00; /* Request CEC data */
|
|
+
|
|
+ /*Build Initiator and Reciever Logical Address Byte*/
|
|
+ /*Initiator logical Address*/
|
|
+ i2c_buffer[2] = (unsigned char)(unit_table[instance].device_logical_address) & 0x0F;
|
|
+ i2c_buffer[2] = i2c_buffer[2] << 4;
|
|
+ /* Receiver logical Address*/
|
|
+ i2c_buffer[2] |= receiver_logical_address & 0x0F;
|
|
+
|
|
+ i2c_buffer[3] = CEC_OPCODE_GIVE_AUDIO_STATUS ; /* Message Abort*/
|
|
+
|
|
+ /* CEC Data register */
|
|
+ err = set_cec_hw_registers(p_dis, E_REG_CDR0, i2c_buffer, 4);
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+ /* Save Datas of the CEC message send */
|
|
+ gtmdl_hdmi_cec_driver_save_message.address_byte = i2c_buffer[2];
|
|
+ gtmdl_hdmi_cec_driver_save_message.message_type_polling = 0;
|
|
+ gtmdl_hdmi_cec_driver_save_message.opcode = i2c_buffer[3];
|
|
+
|
|
+ return(0);
|
|
+}
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \fn tmErrorCode_t dlHdmiCecPollingMessage( )
|
|
+ * \brief This message is used by any device for device discovery - similar to
|
|
+ * ping in other protocols
|
|
+ *
|
|
+ * \param tmInstance_t Instance \n
|
|
+ * Instance identifier. \n
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ *
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_polling_message
|
|
+(
|
|
+ instance_t instance,
|
|
+ u8 receiver_logical_address
|
|
+)
|
|
+{
|
|
+ error_code_t err;
|
|
+ unsigned char i2c_buffer[3] ; /* I2C data buffer */
|
|
+ /* Pointer to Device Instance Structure */
|
|
+ dl_hdmi_cec_driver_config_table_t *p_dis;
|
|
+
|
|
+ /* check if instance number is in range */
|
|
+ RETIF((instance < 0) || (instance >= MAX_UNITS), ERR_DLHDMICEC_BAD_INSTANCE)
|
|
+
|
|
+ /* check if unit corresponding to instance is opened */
|
|
+ RETIF(unit_table[instance].opened == false, ERR_DLHDMICEC_RESOURCE_NOT_OWNED)
|
|
+
|
|
+ /* check if instance state is correct */
|
|
+ /*RETIF(UnitTable[Instance].state != STATE_NOT_INITIALIZED, ERR_DLHDMICEC_INVALID_STATE) */
|
|
+
|
|
+ p_dis = >mdl_hdmi_cec_driver_config_table[instance];
|
|
+
|
|
+ /*======To do : make a prepare message function with parameter */
|
|
+ /* Polling Message command */
|
|
+ i2c_buffer[0] = 0x03; /* Param number */
|
|
+
|
|
+ i2c_buffer[1] = 0x00; /* Request CEC data */
|
|
+
|
|
+ /*Build Initiator and Reciever Logical Address Byte*/
|
|
+ /*Initiator logical Address*/
|
|
+ i2c_buffer[2] = (unsigned char)(unit_table[instance].device_logical_address) & 0x0F;
|
|
+ i2c_buffer[2] = i2c_buffer[2] << 4;
|
|
+ /* Receiver logical Address*/
|
|
+ i2c_buffer[2] |= receiver_logical_address & 0x0F;
|
|
+
|
|
+ /* CEC Data register */
|
|
+ err = set_cec_hw_registers(p_dis, E_REG_CDR0, i2c_buffer, 3);
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+ /* Save Datas of the CEC message send */
|
|
+ gtmdl_hdmi_cec_driver_save_message.address_byte = i2c_buffer[2];
|
|
+ gtmdl_hdmi_cec_driver_save_message.message_type_polling = 1;
|
|
+ gtmdl_hdmi_cec_driver_save_message.opcode = 0;
|
|
+
|
|
+ return(0);
|
|
+}
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \fn tmErrorCode_t dlHdmiCecRecordStatus( )
|
|
+ * \brief This message is used by a recording device to inform the initiator
|
|
+ * of the message <Record On> about its status.
|
|
+ *
|
|
+ * \param tmInstance_t Instance \n
|
|
+ * Instance identifier. \n
|
|
+ *
|
|
+ * \param u8 ReceiverLogicalAddress \n
|
|
+ * Address of message receiver. \n
|
|
+ *
|
|
+ * \param dlHdmiCECRecordStatusInfo_t RecordStatusInfo \n
|
|
+ * The recording status of the device.\n
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ * - ERR_DLHDMICEC_BAD_PARAMETER: a parameter is invalid or out
|
|
+ * of range
|
|
+ *
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_record_status
|
|
+(
|
|
+ instance_t instance,
|
|
+ u8 receiver_logical_address,
|
|
+ dl_hdmi_cecrecord_status_info_t record_status_info
|
|
+)
|
|
+{
|
|
+ error_code_t err;
|
|
+ unsigned char i2c_buffer[5] ; /* I2C data buffer */
|
|
+ /* Pointer to Device Instance Structure */
|
|
+ dl_hdmi_cec_driver_config_table_t *p_dis;
|
|
+
|
|
+ /* check if instance number is in range */
|
|
+ RETIF((instance < 0) || (instance >= MAX_UNITS), ERR_DLHDMICEC_BAD_INSTANCE)
|
|
+
|
|
+ /* check if unit corresponding to instance is opened */
|
|
+ RETIF(unit_table[instance].opened == false, ERR_DLHDMICEC_RESOURCE_NOT_OWNED)
|
|
+
|
|
+ /* check if instance state is correct */
|
|
+ /*RETIF(UnitTable[Instance].state != STATE_NOT_INITIALIZED, ERR_DLHDMICEC_INVALID_STATE) */
|
|
+
|
|
+ p_dis = >mdl_hdmi_cec_driver_config_table[instance];
|
|
+
|
|
+ /*======To do : make a prepare message function with parameter */
|
|
+ /* Record Status command */
|
|
+ i2c_buffer[0] = 0x05; /* Param number */
|
|
+
|
|
+ i2c_buffer[1] = 0x00; /* Request CEC data */
|
|
+
|
|
+ /*Build Initiator and Reciever Logical Address Byte*/
|
|
+ /*Initiator logical Address*/
|
|
+ i2c_buffer[2] = (unsigned char)(unit_table[instance].device_logical_address) & 0x0F;
|
|
+ i2c_buffer[2] = i2c_buffer[2] << 4;
|
|
+ /* Receiver logical Address*/
|
|
+ i2c_buffer[2] |= receiver_logical_address & 0x0F;
|
|
+
|
|
+ i2c_buffer[3] = CEC_OPCODE_RECORD_STATUS ; /* Record Status */
|
|
+ i2c_buffer[4] = record_status_info; /* Record Status */
|
|
+
|
|
+ /* CEC Data register */
|
|
+ err = set_cec_hw_registers(p_dis, E_REG_CDR0, i2c_buffer, 5);
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+ /* Save Datas of the CEC message send */
|
|
+ gtmdl_hdmi_cec_driver_save_message.address_byte = i2c_buffer[2];
|
|
+ gtmdl_hdmi_cec_driver_save_message.message_type_polling = 0;
|
|
+ gtmdl_hdmi_cec_driver_save_message.opcode = i2c_buffer[3];
|
|
+
|
|
+ return(0);
|
|
+}
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \fn tmErrorCode_t dlHdmiCecRecordOff( )
|
|
+ * \brief This message request a device to stop a recording
|
|
+ *
|
|
+ * \param tmInstance_t Instance \n
|
|
+ * Instance identifier. \n
|
|
+ *
|
|
+ * \param u8 ReceiverLogicalAddress \n
|
|
+ * Address of message receiver. \n
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ *
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_record_off
|
|
+(
|
|
+ instance_t instance,
|
|
+ u8 receiver_logical_address
|
|
+)
|
|
+{
|
|
+ error_code_t err;
|
|
+ unsigned char i2c_buffer[4] ; /* I2C data buffer */
|
|
+ /* Pointer to Device Instance Structure */
|
|
+ dl_hdmi_cec_driver_config_table_t *p_dis;
|
|
+
|
|
+ /* check if instance number is in range */
|
|
+ RETIF((instance < 0) || (instance >= MAX_UNITS), ERR_DLHDMICEC_BAD_INSTANCE)
|
|
+
|
|
+ /* check if unit corresponding to instance is opened */
|
|
+ RETIF(unit_table[instance].opened == false, ERR_DLHDMICEC_RESOURCE_NOT_OWNED)
|
|
+
|
|
+ /* check if instance state is correct */
|
|
+ /*RETIF(UnitTable[Instance].state != STATE_NOT_INITIALIZED, ERR_DLHDMICEC_INVALID_STATE) */
|
|
+
|
|
+ p_dis = >mdl_hdmi_cec_driver_config_table[instance];
|
|
+
|
|
+ /*======To do : make a prepare message function with parameter */
|
|
+ /* Record Off command */
|
|
+ i2c_buffer[0] = 0x04; /* Param number */
|
|
+
|
|
+ i2c_buffer[1] = 0x00; /* Request CEC data */
|
|
+
|
|
+ /*Build Initiator and Reciever Logical Address Byte*/
|
|
+ /*Initiator logical Address*/
|
|
+ i2c_buffer[2] = (unsigned char)(unit_table[instance].device_logical_address) & 0x0F;
|
|
+ i2c_buffer[2] = i2c_buffer[2] << 4;
|
|
+ /* Receiver logical Address*/
|
|
+ i2c_buffer[2] |= receiver_logical_address & 0x0F;
|
|
+
|
|
+ i2c_buffer[3] = CEC_OPCODE_RECORD_OFF ; /* Record Off */
|
|
+
|
|
+ /* CEC Data register */
|
|
+ err = set_cec_hw_registers(p_dis, E_REG_CDR0, i2c_buffer, 4);
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+ /* Save Datas of the CEC message send */
|
|
+ gtmdl_hdmi_cec_driver_save_message.address_byte = i2c_buffer[2];
|
|
+ gtmdl_hdmi_cec_driver_save_message.message_type_polling = 0;
|
|
+ gtmdl_hdmi_cec_driver_save_message.opcode = i2c_buffer[3];
|
|
+
|
|
+ return(0);
|
|
+}
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \fn tmErrorCode_t dlHdmiCecRecordOnAnalogueService( )
|
|
+ * \brief This message attempt to record analogue source
|
|
+ *
|
|
+ * \param tmInstance_t Instance \n
|
|
+ * Instance identifier. \n
|
|
+ *
|
|
+ * \param u8 ReceiverLogicalAddress \n
|
|
+ * Address of message receiver. \n
|
|
+ *
|
|
+ * \param dlHdmiCECAnalogueBroadcastType_t AnalogueBroadcastType \n
|
|
+ * "Cable,Sattellite,Terrestrial".\n
|
|
+ *
|
|
+ * \param u16 AnalogueFrequency \n
|
|
+ * Specify frequency used by analogue tuner (0x0000<=N<=0xFFFF).\n
|
|
+ *
|
|
+ * \param dlHdmiCECBroadcastSystem_t BroadcastSystem \n
|
|
+ * Specify information about the colour system, the sound carrier and
|
|
+ * the IF-frequency.\n
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ * - ERR_DLHDMICEC_BAD_PARAMETER: a parameter is invalid or out
|
|
+ * of range
|
|
+ *
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_record_on_analogue_service
|
|
+(
|
|
+ instance_t instance,
|
|
+ u8 receiver_logical_address,
|
|
+ dl_hdmi_cecanalogue_broadcast_type_t analogue_broadcast_type,
|
|
+ u16 analogue_frequency,
|
|
+ dl_hdmi_cecbroadcast_system_t broadcast_system
|
|
+)
|
|
+{
|
|
+ error_code_t err;
|
|
+ unsigned char i2c_buffer[9] ; /* I2C data buffer */
|
|
+ /* Pointer to Device Instance Structure */
|
|
+ dl_hdmi_cec_driver_config_table_t *p_dis;
|
|
+
|
|
+ /* check if instance number is in range */
|
|
+ RETIF((instance < 0) || (instance >= MAX_UNITS), ERR_DLHDMICEC_BAD_INSTANCE)
|
|
+
|
|
+ /* check if unit corresponding to instance is opened */
|
|
+ RETIF(unit_table[instance].opened == false, ERR_DLHDMICEC_RESOURCE_NOT_OWNED)
|
|
+
|
|
+ /* check if instance state is correct */
|
|
+ /*RETIF(UnitTable[Instance].state != STATE_NOT_INITIALIZED, ERR_DLHDMICEC_INVALID_STATE) */
|
|
+
|
|
+ p_dis = >mdl_hdmi_cec_driver_config_table[instance];
|
|
+
|
|
+ /* Record On Analogue Device command */
|
|
+ i2c_buffer[0] = 0x09; /* Param number */
|
|
+
|
|
+ i2c_buffer[1] = 0x00; /* Request CEC data */
|
|
+
|
|
+ /*Build Initiator and Reciever Logical Address Byte*/
|
|
+ /*Initiator logical Address*/
|
|
+ i2c_buffer[2] = (unsigned char)(unit_table[instance].device_logical_address) & 0x0F;
|
|
+ i2c_buffer[2] = i2c_buffer[2] << 4;
|
|
+ /* Receiver logical Address*/
|
|
+ i2c_buffer[2] |= receiver_logical_address & 0x0F;
|
|
+
|
|
+ i2c_buffer[3] = CEC_OPCODE_RECORD_ON ; /*Record On*/
|
|
+
|
|
+ /*RecordSourceType = CEC_RECORD_SOURCE_ANALOGUE_SERVICE*/
|
|
+ i2c_buffer[4] = CEC_RECORD_SOURCE_ANALOGUE_SERVICE;
|
|
+ /*Analogue Brodcast Type*/
|
|
+ i2c_buffer[5] = analogue_broadcast_type;
|
|
+ /*Analogue Frequency*/
|
|
+ i2c_buffer[6] = (unsigned char)(analogue_frequency >> 8);
|
|
+ i2c_buffer[7] = (unsigned char)analogue_frequency;
|
|
+ /*Brodcast System*/
|
|
+ i2c_buffer[8] = broadcast_system;
|
|
+
|
|
+ /* CEC Data register */
|
|
+ err = set_cec_hw_registers(p_dis, E_REG_CDR0, i2c_buffer, 9);
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+ /* Save Datas of the CEC message send */
|
|
+ gtmdl_hdmi_cec_driver_save_message.address_byte = i2c_buffer[2];
|
|
+ gtmdl_hdmi_cec_driver_save_message.message_type_polling = 0;
|
|
+ gtmdl_hdmi_cec_driver_save_message.opcode = i2c_buffer[3];
|
|
+
|
|
+ return(0);
|
|
+}
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \fn tmErrorCode_t dlHdmiCecRecordOnDigitalService( )
|
|
+ * \brief This message attempt to record digital source
|
|
+ *
|
|
+ * \param tmInstance_t Instance \n
|
|
+ * Instance identifier. \n
|
|
+ *
|
|
+ * \param u8 ReceiverLogicalAddress \n
|
|
+ * Address of message receiver. \n
|
|
+ *
|
|
+ * \param dlHdmiCECDigitalServiceIdentification_t *pServiceIdentification \n
|
|
+ * Pointer to the structure Digital Service Identification
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ * - ERR_DLHDMICEC_BAD_PARAMETER: a parameter is invalid or out
|
|
+ * of range
|
|
+ *
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_record_on_digital_service
|
|
+(
|
|
+ instance_t instance,
|
|
+ u8 receiver_logical_address,
|
|
+ dl_hdmi_cecdigital_service_identification_t *p_service_identification
|
|
+)
|
|
+{
|
|
+ error_code_t err;
|
|
+ unsigned char i2c_buffer[12] ; /* I2C data buffer */
|
|
+ /* Pointer to Device Instance Structure */
|
|
+ dl_hdmi_cec_driver_config_table_t *p_dis;
|
|
+ dl_hdmi_cecarib_data_t *p_arib_pointer;
|
|
+ dl_hdmi_cecatsc_data_t *p_atsc_pointer;
|
|
+ dl_hdmi_cecdvb_data_t *p_dvb_pointer;
|
|
+
|
|
+ unsigned char regval; /* Local variable*/
|
|
+
|
|
+ /* check if instance number is in range */
|
|
+ RETIF((instance < 0) || (instance >= MAX_UNITS), ERR_DLHDMICEC_BAD_INSTANCE)
|
|
+
|
|
+ /* check if unit corresponding to instance is opened */
|
|
+ RETIF(unit_table[instance].opened == false, ERR_DLHDMICEC_RESOURCE_NOT_OWNED)
|
|
+
|
|
+ /* check if instance state is correct */
|
|
+ /*RETIF(UnitTable[Instance].state != STATE_NOT_INITIALIZED, ERR_DLHDMICEC_INVALID_STATE) */
|
|
+
|
|
+ p_dis = >mdl_hdmi_cec_driver_config_table[instance];
|
|
+
|
|
+ /*======To do : make a prepare message function with parameter */
|
|
+ /* Record On Digital Service command */
|
|
+ i2c_buffer[0] = 0x0C; /* Param number = 10*/
|
|
+
|
|
+ i2c_buffer[1] = 0x00; /* Request CEC data */
|
|
+
|
|
+ /*Build Initiator and Reciever Logical Address Byte*/
|
|
+ /*Initiator logical Address*/
|
|
+ i2c_buffer[2] = (unsigned char)(unit_table[instance].device_logical_address) & 0x0F;
|
|
+ i2c_buffer[2] = i2c_buffer[2] << 4;
|
|
+ /* Receiver logical Address*/
|
|
+ i2c_buffer[2] |= receiver_logical_address & 0x0F;
|
|
+
|
|
+ /* Record On Digital Service*/
|
|
+ i2c_buffer[3] = CEC_OPCODE_RECORD_ON ;
|
|
+
|
|
+ /* RecordSourceType = CEC_RECORD_SOURCE_DIGITAL_SERVICE */
|
|
+ i2c_buffer[4] = CEC_RECORD_SOURCE_DIGITAL_SERVICE;
|
|
+
|
|
+ /* Digital Service Identification*/
|
|
+ /*Merge Service Method and Digital Broadcast System in the same Byte*/
|
|
+ /*bit 7 is Service Method*/
|
|
+ regval = (unsigned char)(p_service_identification->service_identification_method & 0x01);
|
|
+ regval = regval << 7;
|
|
+ /*bits 6 to 0 are Digital Broadcast*/
|
|
+ regval |= (unsigned char)(p_service_identification->digital_broadcast_system & 0x7F);
|
|
+ i2c_buffer[5] = regval;
|
|
+
|
|
+ /*Case of a ARIB Generic*/
|
|
+ if(p_service_identification->digital_broadcast_system == CEC_DIGITAL_BROADCAST_SYSTEM_ARIB_GENERIC) {
|
|
+ p_arib_pointer = p_service_identification->p_service_identification;
|
|
+
|
|
+ i2c_buffer[6] = (unsigned char)(p_arib_pointer->transport_stream_id >> 8);
|
|
+ i2c_buffer[7] = (unsigned char)p_arib_pointer->transport_stream_id;
|
|
+ i2c_buffer[8] = (unsigned char)(p_arib_pointer->service_id >> 8);
|
|
+ i2c_buffer[9] = (unsigned char)p_arib_pointer->service_id;
|
|
+ i2c_buffer[10] = (unsigned char)(p_arib_pointer->original_network_id >> 8);
|
|
+ i2c_buffer[11] = (unsigned char)p_arib_pointer->original_network_id;
|
|
+ }
|
|
+ /*Case of a ATSC Generic*/
|
|
+ else if(p_service_identification->digital_broadcast_system == CEC_DIGITAL_BROADCAST_SYSTEM_ATSC_GENERIC) {
|
|
+ p_atsc_pointer = p_service_identification->p_service_identification;
|
|
+
|
|
+ i2c_buffer[6] = (unsigned char)(p_atsc_pointer->transport_stream_id >> 8);
|
|
+ i2c_buffer[7] = (unsigned char)p_atsc_pointer->transport_stream_id;
|
|
+ i2c_buffer[8] = (unsigned char)(p_atsc_pointer->program_number >> 8);
|
|
+ i2c_buffer[9] = (unsigned char)p_atsc_pointer->program_number;
|
|
+ i2c_buffer[10] = (unsigned char)(p_atsc_pointer->reserved >> 8);
|
|
+ i2c_buffer[11] = (unsigned char)p_atsc_pointer->reserved;
|
|
+ }
|
|
+ /*Case of a DVB Generic*/
|
|
+ else if(p_service_identification->digital_broadcast_system == CEC_DIGITAL_BROADCAST_SYSTEM_DVB_GENERIC) {
|
|
+ p_dvb_pointer = p_service_identification->p_service_identification;
|
|
+
|
|
+ i2c_buffer[6] = (unsigned char)(p_dvb_pointer->transport_stream_id >> 8);
|
|
+ i2c_buffer[7] = (unsigned char)p_dvb_pointer->transport_stream_id;
|
|
+ i2c_buffer[8] = (unsigned char)(p_dvb_pointer->service_id >> 8);
|
|
+ i2c_buffer[9] = (unsigned char)p_dvb_pointer->service_id;
|
|
+ i2c_buffer[10] = (unsigned char)(p_dvb_pointer->original_network_id >> 8);
|
|
+ i2c_buffer[11] = (unsigned char)p_dvb_pointer->original_network_id;
|
|
+ }
|
|
+ /*other cases, Buffer are empty*/
|
|
+ else {
|
|
+ i2c_buffer[6] = 0xFF;
|
|
+ i2c_buffer[7] = 0xFF;
|
|
+ i2c_buffer[8] = 0xFF;
|
|
+ i2c_buffer[9] = 0xFF;
|
|
+ i2c_buffer[10] = 0xFF;
|
|
+ i2c_buffer[11] = 0xFF;
|
|
+ }
|
|
+
|
|
+ /* CEC Data register */
|
|
+ err = set_cec_hw_registers(p_dis, E_REG_CDR0, i2c_buffer, 12);
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+ /* Save Datas of the CEC message send */
|
|
+ gtmdl_hdmi_cec_driver_save_message.address_byte = i2c_buffer[2];
|
|
+ gtmdl_hdmi_cec_driver_save_message.message_type_polling = 0;
|
|
+ gtmdl_hdmi_cec_driver_save_message.opcode = i2c_buffer[3];
|
|
+
|
|
+ return(0);
|
|
+}
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \fn tmErrorCode_t dlHdmiCecRecordOnExternalPhysicalAddress( )
|
|
+ * \brief This message attempt to record an external physical address source
|
|
+ *
|
|
+ * \param tmInstance_t Instance \n
|
|
+ * Instance identifier. \n
|
|
+ *
|
|
+ * \param u8 ReceiverLogicalAddress \n
|
|
+ * Address of message receiver. \n
|
|
+ *
|
|
+ * \param dlHdmiCECExternalPhysicalAddress_t PhysicalAddress \n
|
|
+ * Defines the path between the TV an a device-thus giving it a physical
|
|
+ * address within the cluster.\n
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ * - ERR_DLHDMICEC_BAD_PARAMETER: a parameter is invalid or out
|
|
+ * of range
|
|
+ *
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_record_on_external_physical_address
|
|
+(
|
|
+ instance_t instance,
|
|
+ u8 receiver_logical_address,
|
|
+ dl_hdmi_cecexternal_physical_address_t external_physical_address
|
|
+)
|
|
+{
|
|
+ error_code_t err;
|
|
+ unsigned char i2c_buffer[7] ; /* I2C data buffer */
|
|
+ /* Pointer to Device Instance Structure */
|
|
+ dl_hdmi_cec_driver_config_table_t *p_dis;
|
|
+
|
|
+ /* check if instance number is in range */
|
|
+ RETIF((instance < 0) || (instance >= MAX_UNITS), ERR_DLHDMICEC_BAD_INSTANCE)
|
|
+
|
|
+ /* check if unit corresponding to instance is opened */
|
|
+ RETIF(unit_table[instance].opened == false, ERR_DLHDMICEC_RESOURCE_NOT_OWNED)
|
|
+
|
|
+ /* check if instance state is correct */
|
|
+ /*RETIF(UnitTable[Instance].state != STATE_NOT_INITIALIZED, ERR_DLHDMICEC_INVALID_STATE) */
|
|
+
|
|
+ p_dis = >mdl_hdmi_cec_driver_config_table[instance];
|
|
+
|
|
+ /*======To do : make a prepare message function with parameter */
|
|
+ /* Record On External Physial Address command */
|
|
+ i2c_buffer[0] = 0x07; /* Param number */
|
|
+
|
|
+ i2c_buffer[1] = 0x00; /* Request CEC data */
|
|
+
|
|
+ /*Build Initiator and Reciever Logical Address Byte*/
|
|
+ /*Initiator logical Address*/
|
|
+ i2c_buffer[2] = (unsigned char)(unit_table[instance].device_logical_address) & 0x0F;
|
|
+ i2c_buffer[2] = i2c_buffer[2] << 4;
|
|
+ /* Receiver logical Address*/
|
|
+ i2c_buffer[2] |= receiver_logical_address & 0x0F;
|
|
+
|
|
+ /*Record On*/
|
|
+ i2c_buffer[3] = CEC_OPCODE_RECORD_ON ;
|
|
+ /*RecordSourceType = CEC_RECORD_SOURCE_EXTERNAL_PHYSICAL_ADDRESS*/
|
|
+ i2c_buffer[4] = CEC_RECORD_SOURCE_EXTERNAL_PHYSICAL_ADDRESS;
|
|
+ /*External Physical Address*/
|
|
+ i2c_buffer[5] = (unsigned char)(external_physical_address >> 8);
|
|
+ i2c_buffer[6] = (unsigned char)external_physical_address;
|
|
+
|
|
+ /* CEC Data register */
|
|
+ err = set_cec_hw_registers(p_dis, E_REG_CDR0, i2c_buffer, 7);
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+ /* Save Datas of the CEC message send */
|
|
+ gtmdl_hdmi_cec_driver_save_message.address_byte = i2c_buffer[2];
|
|
+ gtmdl_hdmi_cec_driver_save_message.message_type_polling = 0;
|
|
+ gtmdl_hdmi_cec_driver_save_message.opcode = i2c_buffer[3];
|
|
+
|
|
+ return(0);
|
|
+}
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \fn tmErrorCode_t dlHdmiCecRecordOnExternalPlug( )
|
|
+ * \brief This message attempt to record an external plug source
|
|
+ *
|
|
+ * \param tmInstance_t Instance \n
|
|
+ * Instance identifier. \n
|
|
+ *
|
|
+ * \param u8 ReceiverLogicalAddress \n
|
|
+ * Address of message receiver. \n
|
|
+ *
|
|
+ * \param dlHdmiCECExternalPlug_t ExternalPlug \n
|
|
+ * indicates external plug number (1 to 255 )on the recording device.\n
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ * - ERR_DLHDMICEC_BAD_PARAMETER: a parameter is invalid or out
|
|
+ * of range
|
|
+ *
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_record_on_external_plug
|
|
+(
|
|
+ instance_t instance,
|
|
+ u8 receiver_logical_address,
|
|
+ dl_hdmi_cecexternal_plug_t external_plug
|
|
+)
|
|
+{
|
|
+ error_code_t err;
|
|
+ unsigned char i2c_buffer[6] ; /* I2C data buffer */
|
|
+ /* Pointer to Device Instance Structure */
|
|
+ dl_hdmi_cec_driver_config_table_t *p_dis;
|
|
+
|
|
+ /* check if instance number is in range */
|
|
+ RETIF((instance < 0) || (instance >= MAX_UNITS), ERR_DLHDMICEC_BAD_INSTANCE)
|
|
+
|
|
+ /* check if unit corresponding to instance is opened */
|
|
+ RETIF(unit_table[instance].opened == false, ERR_DLHDMICEC_RESOURCE_NOT_OWNED)
|
|
+
|
|
+ /* check if instance state is correct */
|
|
+ /*RETIF(UnitTable[Instance].state != STATE_NOT_INITIALIZED, ERR_DLHDMICEC_INVALID_STATE) */
|
|
+
|
|
+ p_dis = >mdl_hdmi_cec_driver_config_table[instance];
|
|
+
|
|
+ /*======To do : make a prepare message function with parameter */
|
|
+ /* Record On External Plug command */
|
|
+ i2c_buffer[0] = 0x06; /* Param number */
|
|
+
|
|
+ i2c_buffer[1] = 0x00; /* Request CEC data */
|
|
+
|
|
+ /*Build Initiator and Reciever Logical Address Byte*/
|
|
+ /*Initiator logical Address*/
|
|
+ i2c_buffer[2] = (unsigned char)(unit_table[instance].device_logical_address) & 0x0F;
|
|
+ i2c_buffer[2] = i2c_buffer[2] << 4;
|
|
+ /* Receiver logical Address*/
|
|
+ i2c_buffer[2] |= receiver_logical_address & 0x0F;
|
|
+
|
|
+ i2c_buffer[3] = CEC_OPCODE_RECORD_ON ; /* Record On*/
|
|
+
|
|
+ /* RecordSourceType = CEC_RECORD_SOURCE_EXTERNAL_PLUG*/
|
|
+ i2c_buffer[4] = CEC_RECORD_SOURCE_EXTERNAL_PLUG;
|
|
+ i2c_buffer[5] = external_plug; /*External Plug*/
|
|
+
|
|
+ /* CEC Data register */
|
|
+ err = set_cec_hw_registers(p_dis, E_REG_CDR0, i2c_buffer, 6);
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+ /* Save Datas of the CEC message send */
|
|
+ gtmdl_hdmi_cec_driver_save_message.address_byte = i2c_buffer[2];
|
|
+ gtmdl_hdmi_cec_driver_save_message.message_type_polling = 0;
|
|
+ gtmdl_hdmi_cec_driver_save_message.opcode = i2c_buffer[3];
|
|
+
|
|
+ return(0);
|
|
+}
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \fn tmErrorCode_t dlHdmiCecRecordOnOwnSource( )
|
|
+ * \brief This message attempt to record an external plug source
|
|
+ *
|
|
+ * \param tmInstance_t Instance \n
|
|
+ * Instance identifier. \n
|
|
+ *
|
|
+ * \param u8 ReceiverLogicalAddress \n
|
|
+ * Address of message receiver. \n
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ * - ERR_DLHDMICEC_BAD_PARAMETER: a parameter is invalid or out
|
|
+ * of range
|
|
+ *
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_record_on_own_source
|
|
+(
|
|
+ instance_t instance,
|
|
+ u8 receiver_logical_address
|
|
+)
|
|
+{
|
|
+ error_code_t err;
|
|
+ unsigned char i2c_buffer[5] ; /* I2C data buffer */
|
|
+ /* Pointer to Device Instance Structure */
|
|
+ dl_hdmi_cec_driver_config_table_t *p_dis;
|
|
+
|
|
+ /* check if instance number is in range */
|
|
+ RETIF((instance < 0) || (instance >= MAX_UNITS), ERR_DLHDMICEC_BAD_INSTANCE)
|
|
+
|
|
+ /* check if unit corresponding to instance is opened */
|
|
+ RETIF(unit_table[instance].opened == false, ERR_DLHDMICEC_RESOURCE_NOT_OWNED)
|
|
+
|
|
+ /* check if instance state is correct */
|
|
+ /*RETIF(UnitTable[Instance].state != STATE_NOT_INITIALIZED, ERR_DLHDMICEC_INVALID_STATE) */
|
|
+
|
|
+ p_dis = >mdl_hdmi_cec_driver_config_table[instance];
|
|
+
|
|
+ /*======To do : make a prepare message function with parameter */
|
|
+ /* Record On Own Source command */
|
|
+ i2c_buffer[0] = 0x05; /* Param number */
|
|
+
|
|
+ i2c_buffer[1] = 0x00; /* Request CEC data */
|
|
+
|
|
+ /*Build Initiator and Reciever Logical Address Byte*/
|
|
+ /*Initiator logical Address*/
|
|
+ i2c_buffer[2] = (unsigned char)(unit_table[instance].device_logical_address) & 0x0F;
|
|
+ i2c_buffer[2] = i2c_buffer[2] << 4;
|
|
+ /* Receiver logical Address*/
|
|
+ i2c_buffer[2] |= receiver_logical_address & 0x0F;
|
|
+
|
|
+ i2c_buffer[3] = CEC_OPCODE_RECORD_ON ; /* Record On*/
|
|
+
|
|
+ /* RecordSourceType = CEC_RECORD_SOURCE_OWN_SOURCE*/
|
|
+ i2c_buffer[4] = CEC_RECORD_SOURCE_OWN_SOURCE;
|
|
+
|
|
+ /* CEC Data register */
|
|
+ err = set_cec_hw_registers(p_dis, E_REG_CDR0, i2c_buffer, 5);
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+ /* Save Datas of the CEC message send */
|
|
+ gtmdl_hdmi_cec_driver_save_message.address_byte = i2c_buffer[2];
|
|
+ gtmdl_hdmi_cec_driver_save_message.message_type_polling = 0;
|
|
+ gtmdl_hdmi_cec_driver_save_message.opcode = i2c_buffer[3];
|
|
+
|
|
+ return(0);
|
|
+}
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \fn tmErrorCode_t dlHdmiCecReportPhysicalAddress( )
|
|
+ * \brief This message is used to inform all other devices of the mapping
|
|
+ * between physical and logical address of the initiator.
|
|
+ *
|
|
+ * \param tmInstance_t Instance \n
|
|
+ * Instance identifier. \n
|
|
+ *
|
|
+ * \param u16 PhysicalAddress \n
|
|
+ * Device physical address within the cluster. \n
|
|
+ *
|
|
+ * \param dlHdmiCECDeviceType_t DeviceType \n
|
|
+ * Type of the device (TV, Playback, tuner,...). \n
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ * - ERR_DLHDMICEC_BAD_PARAMETER: a parameter is invalid or out
|
|
+ * of range
|
|
+ *
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_report_physical_address
|
|
+(
|
|
+ instance_t instance,
|
|
+ u16 physical_address,
|
|
+ dl_hdmi_cecdevice_type_t device_type
|
|
+)
|
|
+{
|
|
+ error_code_t err;
|
|
+ unsigned char i2c_buffer[7] ; /* I2C data buffer */
|
|
+ /* Pointer to Device Instance Structure */
|
|
+ dl_hdmi_cec_driver_config_table_t *p_dis;
|
|
+
|
|
+ /* check if instance number is in range */
|
|
+ RETIF((instance < 0) || (instance >= MAX_UNITS), ERR_DLHDMICEC_BAD_INSTANCE)
|
|
+
|
|
+ /* check if unit corresponding to instance is opened */
|
|
+ RETIF(unit_table[instance].opened == false, ERR_DLHDMICEC_RESOURCE_NOT_OWNED)
|
|
+
|
|
+ /* check if instance state is correct */
|
|
+ /*RETIF(UnitTable[Instance].state != STATE_NOT_INITIALIZED, ERR_DLHDMICEC_INVALID_STATE) */
|
|
+
|
|
+ p_dis = >mdl_hdmi_cec_driver_config_table[instance];
|
|
+
|
|
+ /*======To do : make a prepare message function with parameter */
|
|
+ /* Report Physical Address command */
|
|
+ i2c_buffer[0] = 0x07; /* Param number */
|
|
+
|
|
+ i2c_buffer[1] = 0x00; /* Request CEC data */
|
|
+
|
|
+ /*Build Initiator and Reciever Logical Address Byte*/
|
|
+ /*Initiator logical Address*/
|
|
+ i2c_buffer[2] = (unsigned char)(unit_table[instance].device_logical_address) & 0x0F;
|
|
+ i2c_buffer[2] = i2c_buffer[2] << 4;
|
|
+ /* Broadcast*/
|
|
+ i2c_buffer[2] |= 0x0F;
|
|
+
|
|
+ /* Report Physical Address */
|
|
+ i2c_buffer[3] = CEC_OPCODE_REPORT_PHYSICAL_ADDRESS ;
|
|
+ /* MsByte of Physical Address*/
|
|
+ i2c_buffer[4] = (unsigned char)(physical_address >> 8);
|
|
+ /* LsByte of Physical Address */
|
|
+ i2c_buffer[5] = (unsigned char)physical_address;
|
|
+
|
|
+ i2c_buffer[6] = device_type ; /* Device Type*/
|
|
+
|
|
+ /* CEC Data register */
|
|
+ err = set_cec_hw_registers(p_dis, E_REG_CDR0, i2c_buffer, 7);
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+ /* Save Datas of the CEC message send */
|
|
+ gtmdl_hdmi_cec_driver_save_message.address_byte = i2c_buffer[2];
|
|
+ gtmdl_hdmi_cec_driver_save_message.message_type_polling = 0;
|
|
+ gtmdl_hdmi_cec_driver_save_message.opcode = i2c_buffer[3];
|
|
+
|
|
+ return(0);
|
|
+}
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \fn tmErrorCode_t dlHdmiCecSetMenuLanguage( )
|
|
+ * \brief This message is used by a TV or another device to indicate the menu
|
|
+ * Language.
|
|
+ *
|
|
+ * \param tmInstance_t Instance \n
|
|
+ * Instance identifier. \n
|
|
+ *
|
|
+ * \param const char *pLanguage \n
|
|
+ * Pointer on the user's menu language choice. \n
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ * - ERR_DLHDMICEC_BAD_PARAMETER: a parameter is invalid or out
|
|
+ * of range
|
|
+ *
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_set_menu_language
|
|
+(
|
|
+ instance_t instance,
|
|
+ const char *p_language
|
|
+)
|
|
+{
|
|
+ error_code_t err;
|
|
+ unsigned char i2c_buffer[7] ; /* I2C data buffer */
|
|
+ /* Pointer to Device Instance Structure */
|
|
+ dl_hdmi_cec_driver_config_table_t *p_dis;
|
|
+
|
|
+ /* check if instance number is in range */
|
|
+ RETIF((instance < 0) || (instance >= MAX_UNITS), ERR_DLHDMICEC_BAD_INSTANCE)
|
|
+
|
|
+ /* check if unit corresponding to instance is opened */
|
|
+ RETIF(unit_table[instance].opened == false, ERR_DLHDMICEC_RESOURCE_NOT_OWNED)
|
|
+
|
|
+ /* check if instance state is correct */
|
|
+ /* RETIF(UnitTable[Instance].state != STATE_NOT_INITIALIZED, ERR_DLHDMICEC_INVALID_STATE) */
|
|
+
|
|
+ p_dis = >mdl_hdmi_cec_driver_config_table[instance];
|
|
+
|
|
+ /*======To do : make a prepare message function with parameter */
|
|
+ /* Set Menu Language command */
|
|
+ i2c_buffer[0] = 0x07; /* Param number */
|
|
+
|
|
+ i2c_buffer[1] = 0x00; /* Request CEC data */
|
|
+
|
|
+ /*Build Initiator and Reciever Logical Address Byte*/
|
|
+ /*Initiator logical Address*/
|
|
+ i2c_buffer[2] = (unsigned char)(unit_table[instance].device_logical_address) & 0x0F;
|
|
+ i2c_buffer[2] = i2c_buffer[2] << 4;
|
|
+ /* Broadcast*/
|
|
+ i2c_buffer[2] |= 0x0F;
|
|
+
|
|
+ /* Set Menu Language*/
|
|
+ i2c_buffer[3] = CEC_OPCODE_SET_MENU_LANGUAGE ;
|
|
+ i2c_buffer[4] = p_language[0]; /* First Tocken*/
|
|
+ i2c_buffer[5] = p_language[1];
|
|
+ i2c_buffer[6] = p_language[2]; /* Last Tocken*/
|
|
+
|
|
+ /* CEC Data register */
|
|
+ err = set_cec_hw_registers(p_dis, E_REG_CDR0, i2c_buffer, 7);
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+ /* Save Datas of the CEC message send */
|
|
+ gtmdl_hdmi_cec_driver_save_message.address_byte = i2c_buffer[2];
|
|
+ gtmdl_hdmi_cec_driver_save_message.message_type_polling = 0;
|
|
+ gtmdl_hdmi_cec_driver_save_message.opcode = i2c_buffer[3];
|
|
+
|
|
+ return(0);
|
|
+}
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \fn tmErrorCode_t dlHdmiCecDeckControl()
|
|
+ * \brief This message is used to conrol a device's media functions
|
|
+ *
|
|
+ * \param tmInstance_t Instance \n
|
|
+ * Instance identifier. \n
|
|
+ *
|
|
+ * \param dlHdmiCECDecControlMode_t DeckControlMode \n
|
|
+ * Used in message <Deck Control>\n
|
|
+ *
|
|
+ * \note The "Skip Forward / Wind" and "Skip Reverse / Rewind" values are
|
|
+ * used for example in a DVD as next xhapter and previous chapter and
|
|
+ * in a VCR as wind and rewind. \n
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_BAD_PARAMETER: a parameter is invalid or out
|
|
+ * of range
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_deck_control
|
|
+(
|
|
+ instance_t instance,
|
|
+ u8 receiver_logical_address,
|
|
+ dl_hdmi_cecdec_control_mode_t deck_control_mode
|
|
+)
|
|
+{
|
|
+ error_code_t err;
|
|
+ unsigned char i2c_buffer[5] ; /* I2C data buffer */
|
|
+ /* Pointer to Device Instance Structure */
|
|
+ dl_hdmi_cec_driver_config_table_t *p_dis;
|
|
+
|
|
+ /* check if Instance number is in range */
|
|
+ RETIF((instance < 0) || (instance >= MAX_UNITS), ERR_DLHDMICEC_BAD_INSTANCE)
|
|
+
|
|
+ /* check if unit corresponding to Instance is opened */
|
|
+ RETIF(unit_table[instance].opened == false, ERR_DLHDMICEC_RESOURCE_NOT_OWNED)
|
|
+
|
|
+ /* check if Instance state is correct */
|
|
+ /*RETIF(UnitTable[Instance].state != STATE_NOT_INITIALIZED, ERR_DLHDMICEC_INVALID_STATE) */
|
|
+
|
|
+ p_dis = >mdl_hdmi_cec_driver_config_table[instance];
|
|
+
|
|
+ /*======To do : make a prepare message function with parameter */
|
|
+ /* Deck Control command */
|
|
+ i2c_buffer[0] = 0x05; /* Param number */
|
|
+
|
|
+ i2c_buffer[1] = 0x00; /* Request CEC data */
|
|
+
|
|
+ /*Build Initiator and Reciever Logical Address Byte*/
|
|
+ /*Initiator logical Address*/
|
|
+ i2c_buffer[2] = (unsigned char)(unit_table[instance].device_logical_address) & 0x0F;
|
|
+ i2c_buffer[2] = i2c_buffer[2] << 4;
|
|
+ /* Receiver logical Address*/
|
|
+ i2c_buffer[2] |= receiver_logical_address & 0x0F;
|
|
+
|
|
+ i2c_buffer[3] = CEC_OPCODE_DESCK_CONTROL; /* Deck Control Mode*/
|
|
+ i2c_buffer[4] = deck_control_mode; /* Deck Control Value*/
|
|
+
|
|
+ /* CEC Data register */
|
|
+ err = set_cec_hw_registers(p_dis, E_REG_CDR0, i2c_buffer, 5);
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+ /* Save Datas of the CEC message send */
|
|
+ gtmdl_hdmi_cec_driver_save_message.address_byte = i2c_buffer[2];
|
|
+ gtmdl_hdmi_cec_driver_save_message.message_type_polling = 0;
|
|
+ gtmdl_hdmi_cec_driver_save_message.opcode = i2c_buffer[3];
|
|
+
|
|
+ return(0);
|
|
+}
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \fn tmErrorCode_t dlHdmiCecDeckStatus()
|
|
+ * \brief This message is used to provide a deck's status to the initiator
|
|
+ * of the <Give Deck Status> message
|
|
+ *
|
|
+ * \param tmInstance_t Instance \n
|
|
+ * Instance identifier. \n
|
|
+ *
|
|
+ * \param dlHdmiCECDecInfo_t DeckInfo \n
|
|
+ * Information on the device's current status \n
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_BAD_PARAMETER: a parameter is invalid or out
|
|
+ * of range
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_deck_status
|
|
+(
|
|
+ instance_t instance,
|
|
+ u8 receiver_logical_address,
|
|
+ dl_hdmi_cecdec_info_t deck_info
|
|
+)
|
|
+{
|
|
+ error_code_t err;
|
|
+ unsigned char i2c_buffer[5] ; /* I2C data buffer */
|
|
+ /* Pointer to Device Instance Structure */
|
|
+ dl_hdmi_cec_driver_config_table_t *p_dis;
|
|
+
|
|
+ /* check if instance number is in range */
|
|
+ RETIF((instance < 0) || (instance >= MAX_UNITS), ERR_DLHDMICEC_BAD_INSTANCE)
|
|
+
|
|
+ /* check if unit corresponding to instance is opened */
|
|
+ RETIF(unit_table[instance].opened == false, ERR_DLHDMICEC_RESOURCE_NOT_OWNED)
|
|
+
|
|
+ /* check if instance state is correct */
|
|
+ /*RETIF(UnitTable[Instance].state != STATE_NOT_INITIALIZED, ERR_DLHDMICEC_INVALID_STATE) */
|
|
+
|
|
+ p_dis = >mdl_hdmi_cec_driver_config_table[instance];
|
|
+
|
|
+ /*======To do : make a prepare message function with parameter */
|
|
+ /* Deck Status command */
|
|
+ i2c_buffer[0] = 0x05; /* Param number */
|
|
+
|
|
+ i2c_buffer[1] = 0x00; /* Request CEC data */
|
|
+
|
|
+ /*Build Initiator and Reciever Logical Address Byte*/
|
|
+ /*Initiator logical Address*/
|
|
+ i2c_buffer[2] = (unsigned char)(unit_table[instance].device_logical_address) & 0x0F;
|
|
+ i2c_buffer[2] = i2c_buffer[2] << 4;
|
|
+ /* Receiver logical Address*/
|
|
+ i2c_buffer[2] |= receiver_logical_address & 0x0F;
|
|
+
|
|
+ i2c_buffer[3] = CEC_OPCODE_DECK_STATUS; /* Deck Status*/
|
|
+ i2c_buffer[4] = deck_info; /* Deck Status Mode Information*/
|
|
+
|
|
+ /* CEC Data register */
|
|
+ err = set_cec_hw_registers(p_dis, E_REG_CDR0, i2c_buffer, 5);
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+ /* Save Datas of the CEC message send */
|
|
+ gtmdl_hdmi_cec_driver_save_message.address_byte = i2c_buffer[2];
|
|
+ gtmdl_hdmi_cec_driver_save_message.message_type_polling = 0;
|
|
+ gtmdl_hdmi_cec_driver_save_message.opcode = i2c_buffer[3];
|
|
+
|
|
+ return(0);
|
|
+}
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \fn tmErrorCode_t dlHdmiCecGiveDeckStatus( )
|
|
+ * \brief This message is used to request the status of a device regardless
|
|
+ * of whether or not it is the current active source.
|
|
+ *
|
|
+ * \param tmInstance_t Instance \n
|
|
+ * Instance identifier. \n
|
|
+ *
|
|
+ * \param dlHdmiCECStatusRequest_t StatusRequest \n
|
|
+ * Allows the initiator to request the status once or on all future state
|
|
+ * change. Or to cancel a previous <Give Deck Status > ["On"] request. \n
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ *
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_give_deck_status
|
|
+(
|
|
+ instance_t instance,
|
|
+ u8 receiver_logical_address,
|
|
+ dl_hdmi_cecstatus_request_t status_request
|
|
+)
|
|
+{
|
|
+ error_code_t err;
|
|
+ unsigned char i2c_buffer[5] ; /* I2C data buffer */
|
|
+ /* Pointer to Device Instance Structure */
|
|
+ dl_hdmi_cec_driver_config_table_t *p_dis;
|
|
+
|
|
+ /* check if instance number is in range */
|
|
+ RETIF((instance < 0) || (instance >= MAX_UNITS), ERR_DLHDMICEC_BAD_INSTANCE)
|
|
+
|
|
+ /* check if unit corresponding to instance is opened */
|
|
+ RETIF(unit_table[instance].opened == false, ERR_DLHDMICEC_RESOURCE_NOT_OWNED)
|
|
+
|
|
+ /* check if Instance state is correct */
|
|
+ /*RETIF(UnitTable[Instance].state != STATE_NOT_INITIALIZED, ERR_DLHDMICEC_INVALID_STATE) */
|
|
+
|
|
+ p_dis = >mdl_hdmi_cec_driver_config_table[instance];
|
|
+
|
|
+ /*======To do : make a prepare message function with parameter */
|
|
+ /* Give Deck Status command */
|
|
+ i2c_buffer[0] = 0x05; /* Param number */
|
|
+
|
|
+ i2c_buffer[1] = 0x00; /* Request CEC data */
|
|
+
|
|
+ /*Build Initiator and Reciever Logical Address Byte*/
|
|
+ /*Initiator logical Address*/
|
|
+ i2c_buffer[2] = (unsigned char)(unit_table[instance].device_logical_address) & 0x0F;
|
|
+ i2c_buffer[2] = i2c_buffer[2] << 4;
|
|
+ /* Receiver logical Address*/
|
|
+ i2c_buffer[2] |= receiver_logical_address & 0x0F;
|
|
+
|
|
+ i2c_buffer[3] = CEC_OPCODE_GIVE_DECK_STATUS; /* Give Deck Status*/
|
|
+ i2c_buffer[4] = status_request; /* Deck Status Request Information*/
|
|
+
|
|
+ /* CEC Data register */
|
|
+ err = set_cec_hw_registers(p_dis, E_REG_CDR0, i2c_buffer, 5);
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+ /* Save Datas of the CEC message send */
|
|
+ gtmdl_hdmi_cec_driver_save_message.address_byte = i2c_buffer[2];
|
|
+ gtmdl_hdmi_cec_driver_save_message.message_type_polling = 0;
|
|
+ gtmdl_hdmi_cec_driver_save_message.opcode = i2c_buffer[3];
|
|
+
|
|
+ return(0);
|
|
+}
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \fn tmErrorCode_t dlHdmiCecPlay( )
|
|
+ * \brief This message is used to control the playback behaviour of a source
|
|
+ * device
|
|
+ *
|
|
+ * \param tmInstance_t Instance \n
|
|
+ * Instance identifier. \n
|
|
+ *
|
|
+ * \param dlHdmiCECPlayMode_t PlayMode \n
|
|
+ * In which mode to play media. \n
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ *
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_play
|
|
+(
|
|
+ instance_t instance,
|
|
+ u8 receiver_logical_address,
|
|
+ dl_hdmi_cecplay_mode_t play_mode
|
|
+)
|
|
+{
|
|
+ error_code_t err;
|
|
+ unsigned char i2c_buffer[5] ; /* I2C data buffer */
|
|
+ /* Pointer to Device Instance Structure */
|
|
+ dl_hdmi_cec_driver_config_table_t *p_dis;
|
|
+
|
|
+ /* check if instance number is in range */
|
|
+ RETIF((instance < 0) || (instance >= MAX_UNITS), ERR_DLHDMICEC_BAD_INSTANCE)
|
|
+
|
|
+ /* check if unit corresponding to instance is opened */
|
|
+ RETIF(unit_table[instance].opened == false, ERR_DLHDMICEC_RESOURCE_NOT_OWNED)
|
|
+
|
|
+ /* check if instance state is correct */
|
|
+ /*RETIF(UnitTable[Instance].state != STATE_NOT_INITIALIZED, ERR_DLHDMICEC_INVALID_STATE) */
|
|
+
|
|
+ p_dis = >mdl_hdmi_cec_driver_config_table[instance];
|
|
+
|
|
+ /*======To do : make a prepare message function with parameter */
|
|
+ /* Play command */
|
|
+ i2c_buffer[0] = 0x05; /* Param number */
|
|
+
|
|
+ i2c_buffer[1] = 0x00; /* Request CEC data */
|
|
+
|
|
+ /*Build Initiator and Reciever Logical Address Byte*/
|
|
+ /*Initiator logical Address*/
|
|
+ i2c_buffer[2] = (unsigned char)(unit_table[instance].device_logical_address) & 0x0F;
|
|
+ i2c_buffer[2] = i2c_buffer[2] << 4;
|
|
+ /* Receiver logical Address*/
|
|
+ i2c_buffer[2] |= receiver_logical_address & 0x0F;
|
|
+
|
|
+ i2c_buffer[3] = CEC_OPCODE_PLAY; /* Play*/
|
|
+ /* Play Mode Information Information*/
|
|
+ i2c_buffer[4] = (unsigned char)play_mode;
|
|
+
|
|
+ /* CEC Data register */
|
|
+ err = set_cec_hw_registers(p_dis, E_REG_CDR0, i2c_buffer, 5);
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+ /* Save Datas of the CEC message send */
|
|
+ gtmdl_hdmi_cec_driver_save_message.address_byte = i2c_buffer[2];
|
|
+ gtmdl_hdmi_cec_driver_save_message.message_type_polling = 0;
|
|
+ gtmdl_hdmi_cec_driver_save_message.opcode = i2c_buffer[3];
|
|
+
|
|
+ return(0);
|
|
+}
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \fn tmErrorCode_t dlHdmiCecSelectDigitalService( )
|
|
+ * \brief This message select directly a digital TV, Radio or Data Broadcast
|
|
+ * Service.
|
|
+ *
|
|
+ * \param tmInstance_t Instance \n
|
|
+ * Instance identifier. \n
|
|
+ *
|
|
+ * \param dlHdmiCECDigitalServiceIdentification_t *pServiceIdentification \n
|
|
+ * Pointer to the structure Digital Service Identification
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ * - ERR_DLHDMICEC_BAD_PARAMETER: a parameter is invalid or out
|
|
+ * of range
|
|
+ *
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_select_digital_service
|
|
+(
|
|
+ instance_t instance,
|
|
+ u8 receiver_logical_address,
|
|
+ ptmdl_hdmi_cecdigital_service_identification_t p_service_identification
|
|
+)
|
|
+{
|
|
+ error_code_t err;
|
|
+ unsigned char i2c_buffer[11] ; /* I2C data buffer */
|
|
+ /* Pointer to Device Instance Structure */
|
|
+ dl_hdmi_cec_driver_config_table_t *p_dis;
|
|
+ dl_hdmi_cecarib_data_t *p_arib_pointer;
|
|
+ dl_hdmi_cecatsc_data_t *p_atsc_pointer;
|
|
+ dl_hdmi_cecdvb_data_t *p_dvb_pointer;
|
|
+
|
|
+ unsigned char regval; /*Local Variable*/
|
|
+
|
|
+ /* check if instance number is in range */
|
|
+ RETIF((instance < 0) || (instance >= MAX_UNITS), ERR_DLHDMICEC_BAD_INSTANCE)
|
|
+
|
|
+ /* check if unit corresponding to instance is opened */
|
|
+ RETIF(unit_table[instance].opened == false, ERR_DLHDMICEC_RESOURCE_NOT_OWNED)
|
|
+
|
|
+ /* check if instance state is correct */
|
|
+ /*RETIF(UnitTable[Instance].state != STATE_NOT_INITIALIZED, ERR_DLHDMICEC_INVALID_STATE) */
|
|
+
|
|
+ p_dis = >mdl_hdmi_cec_driver_config_table[instance];
|
|
+
|
|
+ /*======To do : make a prepare message function with parameter */
|
|
+ /* Select Digital Service command */
|
|
+ i2c_buffer[0] = 0x0B; /* Param number = 10*/
|
|
+
|
|
+ i2c_buffer[1] = 0x00; /* Request CEC data */
|
|
+
|
|
+ /*Build Initiator and Reciever Logical Address Byte*/
|
|
+ /*Initiator logical Address*/
|
|
+ i2c_buffer[2] = (unsigned char)(unit_table[instance].device_logical_address) & 0x0F;
|
|
+ i2c_buffer[2] = i2c_buffer[2] << 4;
|
|
+ /* Receiver logical Address*/
|
|
+ i2c_buffer[2] |= receiver_logical_address & 0x0F;
|
|
+
|
|
+ /* Select Digital Service*/
|
|
+ i2c_buffer[3] = CEC_OPCODE_SET_DIGITAL_SERVICE ;
|
|
+
|
|
+ /*Merge Service Method and Digital Broadcast System in the same Byte*/
|
|
+ /* Load the 1 bit of Service Method*/
|
|
+ regval = (unsigned char)(p_service_identification->service_identification_method & 0x01);
|
|
+ regval = regval << 7;
|
|
+ /*Merge with the 7 bits of Digital Broadcast*/
|
|
+ regval |= (unsigned char)(p_service_identification->digital_broadcast_system & 0x7F);
|
|
+ i2c_buffer[4] = regval;
|
|
+
|
|
+ /*Case of a ARIB Generic*/
|
|
+ if(p_service_identification->digital_broadcast_system == CEC_DIGITAL_BROADCAST_SYSTEM_ARIB_GENERIC) {
|
|
+ p_arib_pointer = p_service_identification->p_service_identification;
|
|
+
|
|
+ /* Service Identification */
|
|
+ i2c_buffer[5] = (unsigned char)(p_arib_pointer->transport_stream_id >> 8);
|
|
+ i2c_buffer[6] = (unsigned char)p_arib_pointer->transport_stream_id;
|
|
+ i2c_buffer[7] = (unsigned char)(p_arib_pointer->service_id >> 8);
|
|
+ i2c_buffer[8] = (unsigned char)p_arib_pointer->service_id;
|
|
+ i2c_buffer[9] = (unsigned char)(p_arib_pointer->original_network_id >> 8);
|
|
+ i2c_buffer[10] = (unsigned char)p_arib_pointer->original_network_id;
|
|
+ }
|
|
+ /*Case of a ATSC Generic*/
|
|
+ else if(p_service_identification->digital_broadcast_system == CEC_DIGITAL_BROADCAST_SYSTEM_ATSC_GENERIC) {
|
|
+ p_atsc_pointer = p_service_identification->p_service_identification;
|
|
+
|
|
+ /* Service Identification */
|
|
+ i2c_buffer[5] = (unsigned char)(p_atsc_pointer->transport_stream_id >> 8);
|
|
+ i2c_buffer[6] = (unsigned char)p_atsc_pointer->transport_stream_id;
|
|
+ i2c_buffer[7] = (unsigned char)(p_atsc_pointer->program_number >> 8);
|
|
+ i2c_buffer[8] = (unsigned char)p_atsc_pointer->program_number;
|
|
+ i2c_buffer[9] = (unsigned char)(p_atsc_pointer->reserved >> 8);
|
|
+ i2c_buffer[10] = (unsigned char)p_atsc_pointer->reserved;
|
|
+ }
|
|
+ /*Case of a DVB Generic*/
|
|
+ else if(p_service_identification->digital_broadcast_system == CEC_DIGITAL_BROADCAST_SYSTEM_DVB_GENERIC) {
|
|
+ p_dvb_pointer = p_service_identification->p_service_identification;
|
|
+
|
|
+ /* Service Identification */
|
|
+ i2c_buffer[5] = (unsigned char)(p_dvb_pointer->transport_stream_id >> 8);
|
|
+ i2c_buffer[6] = (unsigned char)p_dvb_pointer->transport_stream_id;
|
|
+ i2c_buffer[7] = (unsigned char)(p_dvb_pointer->service_id >> 8);
|
|
+ i2c_buffer[8] = (unsigned char)p_dvb_pointer->service_id;
|
|
+ i2c_buffer[9] = (unsigned char)(p_dvb_pointer->original_network_id >> 8);
|
|
+ i2c_buffer[10] = (unsigned char)p_dvb_pointer->original_network_id;
|
|
+ }
|
|
+ /*other cases, Buffer are empty*/
|
|
+ else {
|
|
+ i2c_buffer[5] = 0xFF; /* Service Identification */
|
|
+ i2c_buffer[6] = 0xFF;
|
|
+ i2c_buffer[7] = 0xFF;
|
|
+ i2c_buffer[8] = 0xFF;
|
|
+ i2c_buffer[9] = 0xFF;
|
|
+ i2c_buffer[10] = 0xFF;
|
|
+ }
|
|
+ /* CEC Data register */
|
|
+ err = set_cec_hw_registers(p_dis, E_REG_CDR0, i2c_buffer, 11);
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+ /* Save Datas of the CEC message send */
|
|
+ gtmdl_hdmi_cec_driver_save_message.address_byte = i2c_buffer[2];
|
|
+ gtmdl_hdmi_cec_driver_save_message.message_type_polling = 0;
|
|
+ gtmdl_hdmi_cec_driver_save_message.opcode = i2c_buffer[3];
|
|
+
|
|
+ return(0);
|
|
+}
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \fn tmErrorCode_t dlHdmiCecSetAnalogueTimer( )
|
|
+ * \brief This message is used to set asingle timer block on an analogue
|
|
+ * recording device.
|
|
+ *
|
|
+ * \param tmInstance_t Instance \n
|
|
+ * Instance identifier. \n
|
|
+ *
|
|
+ * \param u8 ReceiverLogicalAddress \n
|
|
+ * Address of message receiver. \n
|
|
+ *
|
|
+ * \param u8 DayOfMonth \n
|
|
+ * Day of the month.\n
|
|
+ *
|
|
+ * \param u8 MonthOfYear \n
|
|
+ * Month of the year.\n
|
|
+ *
|
|
+ * \param u16 StartTime \n
|
|
+ * Start time for a timer based recording.\n
|
|
+ *
|
|
+ * \param u16 Duration \n
|
|
+ * Pointer to the structure dlHdmiCECDuration_t in BCD format.\n
|
|
+ *
|
|
+ * \param u8 Recording Sequence \n
|
|
+ * Indicates if recording is repeated and, if so, on which day
|
|
+ * For repeated recording the recording sequence value is the
|
|
+ * bitwise OR of the days when recordings are required
|
|
+ * Shall be set to 0x00 when recording is not repeated.\n
|
|
+ *
|
|
+ * \param dlHdmiCECAnalogueBroadcastType_t AnalogueBroadcastType \n
|
|
+ * "Cable,Sattellite,Terrestrial".\n
|
|
+ *
|
|
+ * \param u16 AnalogueFrequency \n
|
|
+ * Specify frequency used by analogue tuner (0x0000<=N<=0xFFFF).\n
|
|
+ *
|
|
+ * \param dlHdmiCECBroadcastSystem_t BroadcastSystem \n
|
|
+ * Specify information about the colour system, the sound carrier and
|
|
+ * the IF-frequency.\n
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_BAD_PARAMETER: a parameter is invalid or out
|
|
+ * of range
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_set_analogue_timer
|
|
+(
|
|
+ instance_t instance,
|
|
+ u8 receiver_logical_address,
|
|
+ u8 day_of_month,
|
|
+ u8 month_of_year,
|
|
+ u16 start_time,
|
|
+ dl_hdmi_cecduration_t *p_duration,
|
|
+ u8 recording_sequence,
|
|
+ dl_hdmi_cecanalogue_broadcast_type_t analogue_broadcast_type,
|
|
+ u16 analogue_frequency,
|
|
+ dl_hdmi_cecbroadcast_system_t broadcast_system
|
|
+)
|
|
+{
|
|
+ error_code_t err;
|
|
+ unsigned char i2c_buffer[15] ; /* I2C data buffer */
|
|
+ /* Pointer to Device Instance Structure */
|
|
+ dl_hdmi_cec_driver_config_table_t *p_dis;
|
|
+
|
|
+ /* check if instance number is in range */
|
|
+ RETIF((instance < 0) || (instance >= MAX_UNITS), ERR_DLHDMICEC_BAD_INSTANCE)
|
|
+
|
|
+ /* check if unit corresponding to instance is opened */
|
|
+ RETIF(unit_table[instance].opened == false, ERR_DLHDMICEC_RESOURCE_NOT_OWNED)
|
|
+
|
|
+ /* check if instance state is correct */
|
|
+ /*RETIF(UnitTable[Instance].state != STATE_NOT_INITIALIZED, ERR_DLHDMICEC_INVALID_STATE) */
|
|
+
|
|
+ p_dis = >mdl_hdmi_cec_driver_config_table[instance];
|
|
+
|
|
+ /*======To do : make a prepare message function with parameter */
|
|
+ /* Set Analogue Timer command */
|
|
+ i2c_buffer[0] = 0x0F; /* Param number */
|
|
+
|
|
+ i2c_buffer[1] = 0x00; /* Request CEC data */
|
|
+
|
|
+ /*Build Initiator and Reciever Logical Address Byte*/
|
|
+ /*Initiator logical Address*/
|
|
+ i2c_buffer[2] = (unsigned char)(unit_table[instance].device_logical_address) & 0x0F;
|
|
+ i2c_buffer[2] = i2c_buffer[2] << 4;
|
|
+ /* Receiver logical Address*/
|
|
+ i2c_buffer[2] |= receiver_logical_address & 0x0F;
|
|
+
|
|
+ i2c_buffer[3] = CEC_OPCODE_SET_ANALOGUE_TIMER ; /* Message Abort*/
|
|
+ i2c_buffer[4] = day_of_month;
|
|
+ i2c_buffer[5] = month_of_year;
|
|
+ i2c_buffer[6] = (unsigned char)(start_time >> 8);
|
|
+ i2c_buffer[7] = (unsigned char)start_time;
|
|
+ i2c_buffer[8] = p_duration -> hours;
|
|
+ i2c_buffer[9] = p_duration -> minute;
|
|
+ i2c_buffer[10] = recording_sequence;
|
|
+ i2c_buffer[11] = analogue_broadcast_type;
|
|
+ i2c_buffer[12] = (unsigned char)(analogue_frequency >> 8);
|
|
+ i2c_buffer[13] = (unsigned char)analogue_frequency;
|
|
+ i2c_buffer[14] = broadcast_system;
|
|
+
|
|
+ /* CEC Data register */
|
|
+ err = set_cec_hw_registers(p_dis, E_REG_CDR0, i2c_buffer, 15);
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+ /* Save Datas of the CEC message send */
|
|
+ gtmdl_hdmi_cec_driver_save_message.address_byte = i2c_buffer[2];
|
|
+ gtmdl_hdmi_cec_driver_save_message.message_type_polling = 0;
|
|
+ gtmdl_hdmi_cec_driver_save_message.opcode = i2c_buffer[3];
|
|
+
|
|
+ return(0);
|
|
+}
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \fn tmErrorCode_t dlHdmiCecSetAudioRate( )
|
|
+ * \brief This message is used to control audio rate from Source device.
|
|
+ *
|
|
+ * \param tmInstance_t Instance \n
|
|
+ * Instance identifier. \n
|
|
+ *
|
|
+ * \param dlHdmiCECAudioRate_t AudioRate \n
|
|
+ * The audio rate requested. \n
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ * - ERR_DLHDMICEC_BAD_PARAMETER: a parameter is invalid or out
|
|
+ * of range
|
|
+ *
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_set_audio_rate
|
|
+(
|
|
+ instance_t instance,
|
|
+ u8 receiver_logical_address,
|
|
+ dl_hdmi_cecaudio_rate_t audio_rate
|
|
+)
|
|
+{
|
|
+ error_code_t err;
|
|
+ unsigned char i2c_buffer[5] ; /* I2C data buffer */
|
|
+ /* Pointer to Device Instance Structure */
|
|
+ dl_hdmi_cec_driver_config_table_t *p_dis;
|
|
+
|
|
+ /* check if instance number is in range */
|
|
+ RETIF((instance < 0) || (instance >= MAX_UNITS), ERR_DLHDMICEC_BAD_INSTANCE)
|
|
+
|
|
+ /* check if unit corresponding to instance is opened */
|
|
+ RETIF(unit_table[instance].opened == false, ERR_DLHDMICEC_RESOURCE_NOT_OWNED)
|
|
+
|
|
+ /* check if instance state is correct */
|
|
+ /*RETIF(UnitTable[Instance].state != STATE_NOT_INITIALIZED, ERR_DLHDMICEC_INVALID_STATE) */
|
|
+
|
|
+ p_dis = >mdl_hdmi_cec_driver_config_table[instance];
|
|
+
|
|
+ /*======To do : make a prepare message function with parameter */
|
|
+ /* Set Audio Rate command */
|
|
+ i2c_buffer[0] = 0x05; /* Param number */
|
|
+
|
|
+ i2c_buffer[1] = 0x00; /* Request CEC data */
|
|
+
|
|
+ /*Build Initiator and Reciever Logical Address Byte*/
|
|
+ /*Initiator logical Address*/
|
|
+ i2c_buffer[2] = (unsigned char)(unit_table[instance].device_logical_address) & 0x0F;
|
|
+ i2c_buffer[2] = i2c_buffer[2] << 4;
|
|
+ /* Receiver logical Address*/
|
|
+ i2c_buffer[2] |= receiver_logical_address & 0x0F;
|
|
+
|
|
+ i2c_buffer[3] = CEC_OPCODE_SET_AUDIO_RATE ; /* Set Audio Rate */
|
|
+ i2c_buffer[4] = audio_rate;
|
|
+
|
|
+ /* CEC Data register */
|
|
+ err = set_cec_hw_registers(p_dis, E_REG_CDR0, i2c_buffer, 5);
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+ /* Save Datas of the CEC message send */
|
|
+ gtmdl_hdmi_cec_driver_save_message.address_byte = i2c_buffer[2];
|
|
+ gtmdl_hdmi_cec_driver_save_message.message_type_polling = 0;
|
|
+ gtmdl_hdmi_cec_driver_save_message.opcode = i2c_buffer[3];
|
|
+
|
|
+ return(0);
|
|
+}
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \fn tmErrorCode_t dlHdmiCecSetDigitalTimer( )
|
|
+ * \brief This message is used to set a digital timer block on a digital
|
|
+ * recording device
|
|
+ *
|
|
+ * \param tmInstance_t Instance \n
|
|
+ * Instance identifier. \n
|
|
+ *
|
|
+ * \param u8 ReceiverLogicalAddress \n
|
|
+ * Address of message receiver. \n
|
|
+ *
|
|
+ * \param u8 DayOfMonth \n
|
|
+ * Day of the month.\n
|
|
+ *
|
|
+ * \param u8 MonthOfYear \n
|
|
+ * Month of the year.\n
|
|
+ *
|
|
+ * \param u16 StartTime \n
|
|
+ * Start time for a timer based recording.\n
|
|
+ *
|
|
+ * \param u16 Duration \n
|
|
+ * Pointer to the structure dlHdmiCECDuration_t in BCD format.\n
|
|
+ *
|
|
+ * \param u8 Recording Sequence \n
|
|
+ * Indicates if recording is repeated and, if so, on which day
|
|
+ * For repeated recording the recording sequence value is the
|
|
+ * bitwise OR of the days when recordings are required
|
|
+ * Shall be set to 0x00 when recording is not repeated.\n
|
|
+ *
|
|
+ * \param dlHdmiCECDigitalServiceIdentification_t *pServiceIdentification \n
|
|
+ * Pointer to the structure Digital Service Identification
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_BAD_PARAMETER: a parameter is invalid or out
|
|
+ * of range
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_set_digital_timer
|
|
+(
|
|
+ instance_t instance,
|
|
+ u8 receiver_logical_address,
|
|
+ u8 day_of_month,
|
|
+ u8 month_of_year,
|
|
+ u16 start_time,
|
|
+ dl_hdmi_cecduration_t *p_duration,
|
|
+ u8 recording_sequence,
|
|
+ dl_hdmi_cecdigital_service_identification_t *p_service_identification
|
|
+)
|
|
+{
|
|
+ error_code_t err;
|
|
+ unsigned char i2c_buffer[18] ; /* I2C data buffer */
|
|
+ /* Pointer to Device Instance Structure */
|
|
+ dl_hdmi_cec_driver_config_table_t *p_dis;
|
|
+ dl_hdmi_cecarib_data_t *p_arib_pointer;
|
|
+ dl_hdmi_cecatsc_data_t *p_atsc_pointer;
|
|
+ dl_hdmi_cecdvb_data_t *p_dvb_pointer;
|
|
+
|
|
+ unsigned char regval; /* Local variable*/
|
|
+
|
|
+ /* check if instance number is in range */
|
|
+ RETIF((instance < 0) || (instance >= MAX_UNITS), ERR_DLHDMICEC_BAD_INSTANCE)
|
|
+
|
|
+ /* check if unit corresponding to instance is opened */
|
|
+ RETIF(unit_table[instance].opened == false, ERR_DLHDMICEC_RESOURCE_NOT_OWNED)
|
|
+
|
|
+ /* check if instance state is correct */
|
|
+ /*RETIF(UnitTable[Instance].state != STATE_NOT_INITIALIZED, ERR_DLHDMICEC_INVALID_STATE) */
|
|
+
|
|
+ p_dis = >mdl_hdmi_cec_driver_config_table[instance];
|
|
+
|
|
+ /*======To do : make a prepare message function with parameter */
|
|
+ /* Set Digital Timer command */
|
|
+ i2c_buffer[0] = 0x12; /* Param number */
|
|
+
|
|
+ i2c_buffer[1] = 0x00; /* Request CEC data */
|
|
+
|
|
+ /*Build Initiator and Reciever Logical Address Byte*/
|
|
+ /*Initiator logical Address*/
|
|
+ i2c_buffer[2] = (unsigned char)(unit_table[instance].device_logical_address) & 0x0F;
|
|
+ i2c_buffer[2] = i2c_buffer[2] << 4;
|
|
+ /* Receiver logical Address*/
|
|
+ i2c_buffer[2] |= receiver_logical_address & 0x0F;
|
|
+
|
|
+ /* Set Digital Timer*/
|
|
+ i2c_buffer[3] = CEC_OPCODE_SET_DIGITAL_TIMER ;
|
|
+ i2c_buffer[4] = day_of_month; /* Day of Month*/
|
|
+ i2c_buffer[5] = month_of_year; /* Month of Year*/
|
|
+ i2c_buffer[6] = (unsigned char)(start_time >> 8); /* Start Time*/
|
|
+ i2c_buffer[7] = (unsigned char)start_time;
|
|
+ i2c_buffer[8] = p_duration -> hours; /* Duration Hours*/
|
|
+ i2c_buffer[9] = p_duration -> minute; /* Duration Minute*/
|
|
+ /*Recording Sequence*/
|
|
+ i2c_buffer[10] = recording_sequence;
|
|
+
|
|
+ /* Digital service Identification*/
|
|
+ /*Merge Service Method and Digital Broadcast System in the same Byte*/
|
|
+ /*bit 7 is Service Method*/
|
|
+ regval = (unsigned char)(p_service_identification->service_identification_method & 0x01);
|
|
+ regval = regval << 7;
|
|
+ /*bits 6 to 0 are Digital Broadcast*/
|
|
+ regval |= (unsigned char)(p_service_identification->digital_broadcast_system & 0x7F);
|
|
+ i2c_buffer[11] = regval;
|
|
+
|
|
+ /*Case of a ARIB Generic*/
|
|
+ if(p_service_identification->digital_broadcast_system == CEC_DIGITAL_BROADCAST_SYSTEM_ARIB_GENERIC) {
|
|
+ p_arib_pointer = p_service_identification->p_service_identification;
|
|
+
|
|
+ i2c_buffer[12] = (unsigned char)(p_arib_pointer->transport_stream_id >> 8);
|
|
+ i2c_buffer[13] = (unsigned char)p_arib_pointer->transport_stream_id;
|
|
+ i2c_buffer[14] = (unsigned char)(p_arib_pointer->service_id >> 8);
|
|
+ i2c_buffer[15] = (unsigned char)p_arib_pointer->service_id;
|
|
+ i2c_buffer[16] = (unsigned char)(p_arib_pointer->original_network_id >> 8);
|
|
+ i2c_buffer[17] = (unsigned char)p_arib_pointer->original_network_id;
|
|
+ }
|
|
+ /*Case of a ATSC Generic*/
|
|
+ else if(p_service_identification->digital_broadcast_system == CEC_DIGITAL_BROADCAST_SYSTEM_ATSC_GENERIC) {
|
|
+ p_atsc_pointer = p_service_identification->p_service_identification;
|
|
+
|
|
+ i2c_buffer[12] = (unsigned char)(p_atsc_pointer->transport_stream_id >> 8);
|
|
+ i2c_buffer[13] = (unsigned char)p_atsc_pointer->transport_stream_id;
|
|
+ i2c_buffer[14] = (unsigned char)(p_atsc_pointer->program_number >> 8);
|
|
+ i2c_buffer[15] = (unsigned char)p_atsc_pointer->program_number;
|
|
+ i2c_buffer[16] = (unsigned char)(p_atsc_pointer->reserved >> 8);
|
|
+ i2c_buffer[17] = (unsigned char)p_atsc_pointer->reserved;
|
|
+ }
|
|
+ /*Case of a DVB Generic*/
|
|
+ else if(p_service_identification->digital_broadcast_system == CEC_DIGITAL_BROADCAST_SYSTEM_DVB_GENERIC) {
|
|
+ p_dvb_pointer = p_service_identification->p_service_identification;
|
|
+
|
|
+ i2c_buffer[12] = (unsigned char)(p_dvb_pointer->transport_stream_id >> 8);
|
|
+ i2c_buffer[13] = (unsigned char)p_dvb_pointer->transport_stream_id;
|
|
+ i2c_buffer[14] = (unsigned char)(p_dvb_pointer->service_id >> 8);
|
|
+ i2c_buffer[15] = (unsigned char)p_dvb_pointer->service_id;
|
|
+ i2c_buffer[16] = (unsigned char)(p_dvb_pointer->original_network_id >> 8);
|
|
+ i2c_buffer[17] = (unsigned char)p_dvb_pointer->original_network_id;
|
|
+ }
|
|
+ /*other cases, Buffer are empty*/
|
|
+ else {
|
|
+ i2c_buffer[12] = 0xFF;
|
|
+ i2c_buffer[13] = 0xFF;
|
|
+ i2c_buffer[14] = 0xFF;
|
|
+ i2c_buffer[15] = 0xFF;
|
|
+ i2c_buffer[16] = 0xFF;
|
|
+ i2c_buffer[17] = 0xFF;
|
|
+ }
|
|
+
|
|
+ /* CEC Data register */
|
|
+ err = set_cec_hw_registers(p_dis, E_REG_CDR0, i2c_buffer, 18);
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+ /* Save Datas of the CEC message send */
|
|
+ gtmdl_hdmi_cec_driver_save_message.address_byte = i2c_buffer[2];
|
|
+ gtmdl_hdmi_cec_driver_save_message.message_type_polling = 0;
|
|
+ gtmdl_hdmi_cec_driver_save_message.opcode = i2c_buffer[3];
|
|
+
|
|
+ return(0);
|
|
+}
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \fn tmErrorCode_t dlHdmiCecSetExternalTimerWithExternalPlug( )
|
|
+ * \brief This message is used to set a single timer block to record from an
|
|
+ * external device
|
|
+ *
|
|
+ * \param tmInstance_t Instance \n
|
|
+ * Instance identifier. \n
|
|
+ *
|
|
+ * \param u8 DayOfMonth \n
|
|
+ * Day of the month.\n
|
|
+ *
|
|
+ * \param u8 MonthOfYear \n
|
|
+ * Month of the year.\n
|
|
+ *
|
|
+ * \param u16 StartTime \n
|
|
+ * Start time for a timer based recording.\n
|
|
+ *
|
|
+ * \param u16 Duration \n
|
|
+ * Pointer to the structure dlHdmiCECDuration_t in BCD format.\n
|
|
+ *
|
|
+ * \param u8 Recording Sequence \n
|
|
+ * Indicates if recording is repeated and, if so, on which day
|
|
+ * For repeated recording the recording sequence value is the
|
|
+ * bitwise OR of the days when recordings are required
|
|
+ * Shall be set to 0x00 when recording is not repeated.\n
|
|
+ *
|
|
+ * \param dlHdmiCECExternalPlug_t ExternalPlug \n
|
|
+ * indicates external plug number (1 to 255 )on the recording device.\n
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_BAD_PARAMETER: a parameter is invalid or out
|
|
+ * of range
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_set_external_timer_with_external_plug
|
|
+(
|
|
+ instance_t instance,
|
|
+ u8 receiver_logical_address,
|
|
+ u8 day_of_month,
|
|
+ u8 month_of_year,
|
|
+ u16 start_time,
|
|
+ dl_hdmi_cecduration_t *p_duration,
|
|
+ u8 recording_sequence,
|
|
+ dl_hdmi_cecexternal_plug_t external_plug
|
|
+)
|
|
+{
|
|
+ error_code_t err;
|
|
+ unsigned char i2c_buffer[13] ; /* I2C data buffer */
|
|
+ /* Pointer to Device Instance Structure */
|
|
+ dl_hdmi_cec_driver_config_table_t *p_dis;
|
|
+
|
|
+ /* check if instance number is in range */
|
|
+ RETIF((instance < 0) || (instance >= MAX_UNITS), ERR_DLHDMICEC_BAD_INSTANCE)
|
|
+
|
|
+ /* check if unit corresponding to instance is opened */
|
|
+ RETIF(unit_table[instance].opened == false, ERR_DLHDMICEC_RESOURCE_NOT_OWNED)
|
|
+
|
|
+ /* check if instance state is correct */
|
|
+ /*RETIF(UnitTable[Instance].state != STATE_NOT_INITIALIZED, ERR_DLHDMICEC_INVALID_STATE) */
|
|
+
|
|
+ p_dis = >mdl_hdmi_cec_driver_config_table[instance];
|
|
+
|
|
+ /*======To do : make a prepare message function with parameter */
|
|
+ /* Set External Timer With External Plug command */
|
|
+ i2c_buffer[0] = 0x0D; /* Param number */
|
|
+
|
|
+ i2c_buffer[1] = 0x00; /* Request CEC data */
|
|
+
|
|
+ /*Build Initiator and Reciever Logical Address Byte*/
|
|
+ /*Initiator logical Address*/
|
|
+ i2c_buffer[2] = (unsigned char)(unit_table[instance].device_logical_address) & 0x0F;
|
|
+ i2c_buffer[2] = i2c_buffer[2] << 4;
|
|
+ /* Receiver logical Address*/
|
|
+ i2c_buffer[2] |= receiver_logical_address & 0x0F;
|
|
+
|
|
+ i2c_buffer[3] = CEC_OPCODE_SET_EXTERNAL_TIMER ; /*SetDigital Timer*/
|
|
+
|
|
+ i2c_buffer[4] = day_of_month; /*Day of Month*/
|
|
+ i2c_buffer[5] = month_of_year; /*Month of Year*/
|
|
+ i2c_buffer[6] = (unsigned char)(start_time >> 8); /*Start Time*/
|
|
+ i2c_buffer[7] = (unsigned char)start_time;
|
|
+ i2c_buffer[8] = p_duration -> hours; /*Duration Hours*/
|
|
+ i2c_buffer[9] = p_duration -> minute; /*Duration Minute*/
|
|
+ i2c_buffer[10] = recording_sequence; /*Recording Sequence*/
|
|
+ /*External Source Specifier = External Plug */
|
|
+ i2c_buffer[11] = CEC_EXTERNAL_PLUG;
|
|
+ i2c_buffer[12] = external_plug; /*External Plug*/
|
|
+
|
|
+ /* CEC Data register */
|
|
+ err = set_cec_hw_registers(p_dis, E_REG_CDR0, i2c_buffer, 13);
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+ /* Save Datas of the CEC message send */
|
|
+ gtmdl_hdmi_cec_driver_save_message.address_byte = i2c_buffer[2];
|
|
+ gtmdl_hdmi_cec_driver_save_message.message_type_polling = 0;
|
|
+ gtmdl_hdmi_cec_driver_save_message.opcode = i2c_buffer[3];
|
|
+
|
|
+ return(0);
|
|
+}
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \fn tmErrorCode_t dlHdmiCecSetExternalTimerWithPhysicalAddress( )
|
|
+ * \brief This message is used to set a single timer block to record from an
|
|
+ * external device
|
|
+ *
|
|
+ * \param tmInstance_t Instance \n
|
|
+ * Instance identifier. \n
|
|
+ *
|
|
+ * \param u8 DayOfMonth \n
|
|
+ * Day of the month.\n
|
|
+ *
|
|
+ * \param u8 MonthOfYear \n
|
|
+ * Month of the year.\n
|
|
+ *
|
|
+ * \param u16 StartTime \n
|
|
+ * Start time for a timer based recording.\n
|
|
+ *
|
|
+ * \param u16 Duration \n
|
|
+ * Pointer to the structure dlHdmiCECDuration_t in BCD format.\n
|
|
+ *
|
|
+ * \param u8 Recording Sequence \n
|
|
+ * Indicates if recording is repeated and, if so, on which day
|
|
+ * For repeated recording the recording sequence value is the
|
|
+ * bitwise OR of the days when recordings are required
|
|
+ * Shall be set to 0x00 when recording is not repeated.\n
|
|
+ *
|
|
+ * \param dlHdmiCECExternalPhysicalAddress_t PhysicalAddress \n
|
|
+ * Defines the path between the TV an a device-thus giving it a physical
|
|
+ * address within the cluster.\n
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_BAD_PARAMETER: a parameter is invalid or out
|
|
+ * of range
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_set_external_timer_with_physical_address
|
|
+(
|
|
+ instance_t instance,
|
|
+ u8 receiver_logical_address,
|
|
+ u8 day_of_month,
|
|
+ u8 month_of_year,
|
|
+ u16 start_time,
|
|
+ dl_hdmi_cecduration_t *p_duration,
|
|
+ u8 recording_sequence,
|
|
+ dl_hdmi_cecexternal_physical_address_t external_physical_address
|
|
+)
|
|
+{
|
|
+ error_code_t err;
|
|
+ unsigned char i2c_buffer[14] ; /* I2C data buffer */
|
|
+ /* Pointer to Device Instance Structure */
|
|
+ dl_hdmi_cec_driver_config_table_t *p_dis;
|
|
+
|
|
+ /* check if instance number is in range */
|
|
+ RETIF((instance < 0) || (instance >= MAX_UNITS), ERR_DLHDMICEC_BAD_INSTANCE)
|
|
+
|
|
+ /* check if unit corresponding to instance is opened */
|
|
+ RETIF(unit_table[instance].opened == false, ERR_DLHDMICEC_RESOURCE_NOT_OWNED)
|
|
+
|
|
+ /* check if instance state is correct */
|
|
+ /*RETIF(UnitTable[Instance].state != STATE_NOT_INITIALIZED, ERR_DLHDMICEC_INVALID_STATE) */
|
|
+
|
|
+ p_dis = >mdl_hdmi_cec_driver_config_table[instance];
|
|
+
|
|
+ /*======To do : make a prepare message function with parameter */
|
|
+ /* Set external Timer With External Physical Address command */
|
|
+ i2c_buffer[0] = 0x0E; /* Param number */
|
|
+
|
|
+ i2c_buffer[1] = 0x00; /* Request CEC data */
|
|
+
|
|
+ /*Build Initiator and Reciever Logical Address Byte*/
|
|
+ /*Initiator logical Address*/
|
|
+ i2c_buffer[2] = (unsigned char)(unit_table[instance].device_logical_address) & 0x0F;
|
|
+ i2c_buffer[2] = i2c_buffer[2] << 4;
|
|
+ /* Receiver logical Address*/
|
|
+ i2c_buffer[2] |= receiver_logical_address & 0x0F;
|
|
+
|
|
+ i2c_buffer[3] = CEC_OPCODE_SET_EXTERNAL_TIMER ; /* SetDigital Timer*/
|
|
+
|
|
+ i2c_buffer[4] = day_of_month; /* Day of Month*/
|
|
+ i2c_buffer[5] = month_of_year; /* Month of Year*/
|
|
+ i2c_buffer[6] = (unsigned char)(start_time >> 8); /* Start Time*/
|
|
+ i2c_buffer[7] = (unsigned char)start_time;
|
|
+ i2c_buffer[8] = p_duration -> hours; /* Duration Hours*/
|
|
+ i2c_buffer[9] = p_duration -> minute; /* Duration Minute*/
|
|
+ i2c_buffer[10] = recording_sequence; /* Recording Sequence*/
|
|
+ /*External Source Specifier = External Address*/
|
|
+ i2c_buffer[11] = CEC_EXTERNAL_PHYSICAL_ADDRESS;
|
|
+ /*External Address*/
|
|
+ i2c_buffer[12] = (unsigned char)(external_physical_address >> 8);
|
|
+ i2c_buffer[13] = (unsigned char) external_physical_address;
|
|
+
|
|
+ /* CEC Data register */
|
|
+ err = set_cec_hw_registers(p_dis, E_REG_CDR0, i2c_buffer, 14);
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+ /* Save Datas of the CEC message send */
|
|
+ gtmdl_hdmi_cec_driver_save_message.address_byte = i2c_buffer[2];
|
|
+ gtmdl_hdmi_cec_driver_save_message.message_type_polling = 0;
|
|
+ gtmdl_hdmi_cec_driver_save_message.opcode = i2c_buffer[3];
|
|
+
|
|
+ return(0);
|
|
+}
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \fn tmErrorCode_t dlHdmiCecTunerStepDecrement( )
|
|
+ * \brief This message is used to tune to next lowest service in a tuner's
|
|
+ * service list.Can be used for PIP.
|
|
+ *
|
|
+ * \param tmInstance_t Instance \n
|
|
+ * Instance identifier. \n
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ *
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_tuner_step_decrement
|
|
+(
|
|
+ instance_t instance,
|
|
+ u8 receiver_logical_address
|
|
+)
|
|
+{
|
|
+
|
|
+ error_code_t err;
|
|
+ unsigned char i2c_buffer[4] ; /* I2C data buffer */
|
|
+ /* Pointer to Device Instance Structure */
|
|
+ dl_hdmi_cec_driver_config_table_t *p_dis;
|
|
+
|
|
+ /* check if instance number is in range */
|
|
+ RETIF((instance < 0) || (instance >= MAX_UNITS), ERR_DLHDMICEC_BAD_INSTANCE)
|
|
+
|
|
+ /* check if unit corresponding to instance is opened */
|
|
+ RETIF(unit_table[instance].opened == false, ERR_DLHDMICEC_RESOURCE_NOT_OWNED)
|
|
+
|
|
+ /* check if instance state is correct */
|
|
+ /*RETIF(UnitTable[Instance].state != STATE_NOT_INITIALIZED, ERR_DLHDMICEC_INVALID_STATE) */
|
|
+
|
|
+ p_dis = >mdl_hdmi_cec_driver_config_table[instance];
|
|
+
|
|
+ /*======To do : make a prepare message function with parameter */
|
|
+ /* Tuner Step Decrement command */
|
|
+ i2c_buffer[0] = 0x04; /* Param number */
|
|
+
|
|
+ i2c_buffer[1] = 0x00; /* Request CEC data */
|
|
+
|
|
+ /*Build Initiator and Reciever Logical Address Byte*/
|
|
+ /*Initiator logical Address*/
|
|
+ i2c_buffer[2] = (unsigned char)(unit_table[instance].device_logical_address) & 0x0F;
|
|
+ i2c_buffer[2] = i2c_buffer[2] << 4;
|
|
+ /* Receiver logical Address*/
|
|
+ i2c_buffer[2] |= receiver_logical_address & 0x0F;
|
|
+
|
|
+ /* Tuner Step Decrement*/
|
|
+ i2c_buffer[3] = CEC_OPCODE_TUNER_STEP_DECREMENT ;
|
|
+
|
|
+ /* CEC Data register */
|
|
+ err = set_cec_hw_registers(p_dis, E_REG_CDR0, i2c_buffer, 4);
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+ /* Save Datas of the CEC message send */
|
|
+ gtmdl_hdmi_cec_driver_save_message.address_byte = i2c_buffer[2];
|
|
+ gtmdl_hdmi_cec_driver_save_message.message_type_polling = 0;
|
|
+ gtmdl_hdmi_cec_driver_save_message.opcode = i2c_buffer[3];
|
|
+
|
|
+ return(0);
|
|
+}
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \fn tmErrorCode_t dlHdmiCecTunerStepIncrement( )
|
|
+ * \brief This message is used to tune to next highest service in a tuner's
|
|
+ * service list.Can be used for PIP.
|
|
+ *
|
|
+ * \param tmInstance_t Instance \n
|
|
+ * Instance identifier. \n
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ *
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_tuner_step_increment
|
|
+(
|
|
+ instance_t instance,
|
|
+ u8 receiver_logical_address
|
|
+)
|
|
+{
|
|
+ error_code_t err;
|
|
+ unsigned char i2c_buffer[4] ; /* I2C data buffer */
|
|
+ /* Pointer to Device Instance Structure */
|
|
+ dl_hdmi_cec_driver_config_table_t *p_dis;
|
|
+
|
|
+ /* check if instance number is in range */
|
|
+ RETIF((instance < 0) || (instance >= MAX_UNITS), ERR_DLHDMICEC_BAD_INSTANCE)
|
|
+
|
|
+ /* check if unit corresponding to instance is opened */
|
|
+ RETIF(unit_table[instance].opened == false, ERR_DLHDMICEC_RESOURCE_NOT_OWNED)
|
|
+
|
|
+ /* check if instance state is correct */
|
|
+ /*RETIF(UnitTable[Instance].state != STATE_NOT_INITIALIZED, ERR_DLHDMICEC_INVALID_STATE) */
|
|
+
|
|
+ p_dis = >mdl_hdmi_cec_driver_config_table[instance];
|
|
+
|
|
+ /*======To do : make a prepare message function with parameter */
|
|
+ /* Tuner Step Increment command */
|
|
+ i2c_buffer[0] = 0x04; /* Param number */
|
|
+
|
|
+ i2c_buffer[1] = 0x00; /* Request CEC data */
|
|
+
|
|
+ /*Build Initiator and Reciever Logical Address Byte*/
|
|
+ /*Initiator logical Address*/
|
|
+ i2c_buffer[2] = (unsigned char)(unit_table[instance].device_logical_address) & 0x0F;
|
|
+ i2c_buffer[2] = i2c_buffer[2] << 4;
|
|
+ /* Receiver logical Address*/
|
|
+ i2c_buffer[2] |= receiver_logical_address & 0x0F;
|
|
+
|
|
+ /* Tuner Step Increment*/
|
|
+ i2c_buffer[3] = CEC_OPCODE_TUNER_STEP_INCREMENT ;
|
|
+
|
|
+ /* CEC Data register */
|
|
+ err = set_cec_hw_registers(p_dis, E_REG_CDR0, i2c_buffer, 4);
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+ /* Save Datas of the CEC message send */
|
|
+ gtmdl_hdmi_cec_driver_save_message.address_byte = i2c_buffer[2];
|
|
+ gtmdl_hdmi_cec_driver_save_message.message_type_polling = 0;
|
|
+ gtmdl_hdmi_cec_driver_save_message.opcode = i2c_buffer[3];
|
|
+
|
|
+ return(0);
|
|
+}
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \fn tmErrorCode_t dlHdmiCecDeviceVendorID()
|
|
+ * \brief This message report the vendor ID of this device
|
|
+ *
|
|
+ * \param tmInstance_t Instance \n
|
|
+ * Instance identifier. \n
|
|
+ *
|
|
+ * \param u32 VendorID \n
|
|
+ * Indentifier for a specific Vendor \n
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_BAD_PARAMETER: a parameter is invalid or out
|
|
+ * of range
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_device_vendor_id
|
|
+(
|
|
+ instance_t instance,
|
|
+ u32 vendor_id
|
|
+)
|
|
+{
|
|
+ error_code_t err;
|
|
+ unsigned char i2c_buffer[7] ; /* I2C data buffer */
|
|
+ /* Pointer to Device Instance Structure */
|
|
+ dl_hdmi_cec_driver_config_table_t *p_dis;
|
|
+
|
|
+ /* check if instance number is in range */
|
|
+ RETIF((instance < 0) || (instance >= MAX_UNITS), ERR_DLHDMICEC_BAD_INSTANCE)
|
|
+
|
|
+ /* check if unit corresponding to instance is opened */
|
|
+ RETIF(unit_table[instance].opened == false, ERR_DLHDMICEC_RESOURCE_NOT_OWNED)
|
|
+
|
|
+ /* check if instance state is correct */
|
|
+ /*RETIF(UnitTable[Instance].state != STATE_NOT_INITIALIZED, ERR_DLHDMICEC_INVALID_STATE) */
|
|
+
|
|
+ p_dis = >mdl_hdmi_cec_driver_config_table[instance];
|
|
+
|
|
+ /*======To do : make a prepare message function with parameter */
|
|
+ /* Device Vendor ID command */
|
|
+ /* Param number in case of Vendor ID is 32 Bytes*/
|
|
+ i2c_buffer[0] = 0x07;
|
|
+
|
|
+ i2c_buffer[1] = 0x00; /* Request CEC data */
|
|
+
|
|
+ /*Build Initiator and Reciever Logical Address Byte*/
|
|
+ /*Initiator logical Address*/
|
|
+ i2c_buffer[2] = (unsigned char)(unit_table[instance].device_logical_address) & 0x0F;
|
|
+ i2c_buffer[2] = i2c_buffer[2] << 4;
|
|
+ /* Broadcast*/
|
|
+ i2c_buffer[2] |= 0x0F;
|
|
+
|
|
+ /* Device Vendor ID opcode = 0x87*/
|
|
+ i2c_buffer[3] = CEC_OPCODE_DEVICE_VENDOR_ID ;
|
|
+ i2c_buffer[4] = (unsigned char)(vendor_id >> 16); /* MSByte of Vendor ID*/
|
|
+ i2c_buffer[5] = (unsigned char)(vendor_id >> 8);
|
|
+ i2c_buffer[6] = (unsigned char)vendor_id; /* LSByte of Vendor ID*/
|
|
+
|
|
+ /* CEC Data register */
|
|
+ err = set_cec_hw_registers(p_dis, E_REG_CDR0, i2c_buffer, 7);
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+ /* Save Datas of the CEC message send */
|
|
+ gtmdl_hdmi_cec_driver_save_message.address_byte = i2c_buffer[2];
|
|
+ gtmdl_hdmi_cec_driver_save_message.message_type_polling = 0;
|
|
+ gtmdl_hdmi_cec_driver_save_message.opcode = i2c_buffer[3];
|
|
+
|
|
+ return(0);
|
|
+}
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \fn tmErrorCode_t dlHdmiCecGiveDeviceVendorID( )
|
|
+ * \brief This message is request the vendor ID from a device
|
|
+ *
|
|
+ * \param tmInstance_t Instance \n
|
|
+ * Instance identifier. \n
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ *
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_give_device_vendor_id
|
|
+(
|
|
+ instance_t instance,
|
|
+ u8 receiver_logical_address
|
|
+)
|
|
+{
|
|
+ error_code_t err;
|
|
+ unsigned char i2c_buffer[4] ; /* I2C data buffer */
|
|
+ /* Pointer to Device Instance Structure */
|
|
+ dl_hdmi_cec_driver_config_table_t *p_dis;
|
|
+
|
|
+ /* check if instance number is in range */
|
|
+ RETIF((instance < 0) || (instance >= MAX_UNITS), ERR_DLHDMICEC_BAD_INSTANCE)
|
|
+
|
|
+ /* check if unit corresponding to instance is opened */
|
|
+ RETIF(unit_table[instance].opened == false, ERR_DLHDMICEC_RESOURCE_NOT_OWNED)
|
|
+
|
|
+ /* check if instance state is correct */
|
|
+ /*RETIF(UnitTable[Instance].state != STATE_NOT_INITIALIZED, ERR_DLHDMICEC_INVALID_STATE) */
|
|
+
|
|
+ p_dis = >mdl_hdmi_cec_driver_config_table[instance];
|
|
+
|
|
+ /*======To do : make a prepare message function with parameter */
|
|
+ /* Give Device Vendor ID command */
|
|
+ i2c_buffer[0] = 0x04; /* Param number */
|
|
+
|
|
+ i2c_buffer[1] = 0x00; /* Request CEC data */
|
|
+
|
|
+ /*Build Initiator and Reciever Logical Address Byte*/
|
|
+ /*Initiator logical Address*/
|
|
+ i2c_buffer[2] = (unsigned char)(unit_table[instance].device_logical_address) & 0x0F;
|
|
+ i2c_buffer[2] = i2c_buffer[2] << 4;
|
|
+ /* Receiver logical Address*/
|
|
+ i2c_buffer[2] |= receiver_logical_address & 0x0F;
|
|
+
|
|
+ /* Give Device Vendor*/
|
|
+ i2c_buffer[3] = CEC_OPCODE_GIVE_DEVICE_VENDOR_ID ;
|
|
+
|
|
+ /* CEC Data register */
|
|
+ err = set_cec_hw_registers(p_dis, E_REG_CDR0, i2c_buffer, 4);
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+ /* Save Datas of the CEC message send */
|
|
+ gtmdl_hdmi_cec_driver_save_message.address_byte = i2c_buffer[2];
|
|
+ gtmdl_hdmi_cec_driver_save_message.message_type_polling = 0;
|
|
+ gtmdl_hdmi_cec_driver_save_message.opcode = i2c_buffer[3];
|
|
+
|
|
+ return(0);
|
|
+}
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \fn tmErrorCode_t dlHdmiCecVendorCommand( )
|
|
+ * \brief This message is allows vendor specific commands to be sent between
|
|
+ * two devices.
|
|
+ *
|
|
+ * \param tmInstance_t Instance \n
|
|
+ * Instance identifier. \n
|
|
+ *
|
|
+ * \param u8 *pVendorSpecificData \n
|
|
+ * Pointer to the Vendor Specific datas
|
|
+ *
|
|
+ * \param u8 VendorSpecificDataLength \n
|
|
+ * Length of VendorSpecificData. \n
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ *
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_vendor_command
|
|
+(
|
|
+ instance_t instance,
|
|
+ u8 receiver_logical_address,
|
|
+ u8 *p_vendor_specific_data,
|
|
+ u8 vendor_specific_data_length
|
|
+)
|
|
+{
|
|
+ error_code_t err;
|
|
+ unsigned char i2c_buffer[19] ; /* I2C data buffer */
|
|
+ /* Pointer to Device Instance Structure */
|
|
+ dl_hdmi_cec_driver_config_table_t *p_dis;
|
|
+ unsigned char loci; /* Local increment variable*/
|
|
+ unsigned char mess_length; /* Local Message length*/
|
|
+
|
|
+ /* check if instance number is in range */
|
|
+ RETIF((instance < 0) || (instance >= MAX_UNITS), ERR_DLHDMICEC_BAD_INSTANCE)
|
|
+
|
|
+ /* check if unit corresponding to instance is opened */
|
|
+ RETIF(unit_table[instance].opened == false, ERR_DLHDMICEC_RESOURCE_NOT_OWNED)
|
|
+
|
|
+ /* check if instance state is correct */
|
|
+ /*RETIF(UnitTable[Instance].state != STATE_NOT_INITIALIZED, ERR_DLHDMICEC_INVALID_STATE) */
|
|
+
|
|
+ p_dis = >mdl_hdmi_cec_driver_config_table[instance];
|
|
+
|
|
+ /*======To do : make a prepare message function with parameter */
|
|
+ /* Vendor Command command */
|
|
+ /* Calculate Message length*/
|
|
+ mess_length = vendor_specific_data_length + 4;
|
|
+
|
|
+ i2c_buffer[0] = mess_length; /* Param number */
|
|
+
|
|
+ i2c_buffer[1] = 0x00; /* Request CEC data */
|
|
+
|
|
+ /*Build Initiator and Reciever Logical Address Byte*/
|
|
+ /*Initiator logical Address*/
|
|
+ i2c_buffer[2] = (unsigned char)(unit_table[instance].device_logical_address) & 0x0F;
|
|
+ i2c_buffer[2] = i2c_buffer[2] << 4;
|
|
+ /* Receiver logical Address*/
|
|
+ i2c_buffer[2] |= receiver_logical_address & 0x0F;
|
|
+
|
|
+ i2c_buffer[3] = CEC_OPCODE_VENDOR_COMMAND ; /* Vendor Command*/
|
|
+
|
|
+ for(loci = 0; loci <= vendor_specific_data_length ; loci++) {
|
|
+ /* Fill Table with vendorSpecific Data characters*/
|
|
+ i2c_buffer[(loci+7)] = p_vendor_specific_data[loci];
|
|
+ }
|
|
+
|
|
+ /* CEC Data register */
|
|
+ err = set_cec_hw_registers(p_dis, E_REG_CDR0, i2c_buffer, mess_length);
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+ /* Save Datas of the CEC message send */
|
|
+ gtmdl_hdmi_cec_driver_save_message.address_byte = i2c_buffer[2];
|
|
+ gtmdl_hdmi_cec_driver_save_message.message_type_polling = 0;
|
|
+ gtmdl_hdmi_cec_driver_save_message.opcode = i2c_buffer[3];
|
|
+
|
|
+ return(0);
|
|
+}
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \fn tmErrorCode_t dlHdmiCecVendorCommandWithID( )
|
|
+ * \brief This message is allows vendor specific commands to be sent between
|
|
+ * two devices or broadcast.
|
|
+ *
|
|
+ * \param tmInstance_t Instance \n
|
|
+ * Instance identifier. \n
|
|
+ *
|
|
+ * \param u32 VendorID \n
|
|
+ * Indentifier for a specific Vendor \n
|
|
+ *
|
|
+ * \param u8 *pVendorSpecificData \n
|
|
+ * Pointer to the Vendor Specific datas
|
|
+ *
|
|
+ * \param u8 VendorSpecificDataLength \n
|
|
+ * Length of VendorSpecificData. \n
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ *
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_vendor_command_with_id
|
|
+(
|
|
+ instance_t instance,
|
|
+ u8 receiver_logical_address,
|
|
+ u32 vendor_id,
|
|
+ u8 *p_vendor_specific_data,
|
|
+ u8 vendor_specific_data_length
|
|
+)
|
|
+{
|
|
+ error_code_t err;
|
|
+ unsigned char i2c_buffer[19] ; /* I2C data buffer */
|
|
+ /* Pointer to Device Instance Structure */
|
|
+ dl_hdmi_cec_driver_config_table_t *p_dis;
|
|
+ unsigned char loci; /* Local increment variable*/
|
|
+ unsigned char mess_length; /* Local Message length*/
|
|
+
|
|
+ /* check if instance number is in range */
|
|
+ RETIF((instance < 0) || (instance >= MAX_UNITS), ERR_DLHDMICEC_BAD_INSTANCE)
|
|
+
|
|
+ /* check if unit corresponding to instance is opened */
|
|
+ RETIF(unit_table[instance].opened == false, ERR_DLHDMICEC_RESOURCE_NOT_OWNED)
|
|
+
|
|
+ /* check if instance state is correct */
|
|
+ /*RETIF(UnitTable[Instance].state != STATE_NOT_INITIALIZED, ERR_DLHDMICEC_INVALID_STATE) */
|
|
+
|
|
+ p_dis = >mdl_hdmi_cec_driver_config_table[instance];
|
|
+
|
|
+ /*======To do : make a prepare message function with parameter */
|
|
+ /* Vendor Command With ID command */
|
|
+ /* Calculate Message length*/
|
|
+ mess_length = vendor_specific_data_length + 7;
|
|
+
|
|
+ i2c_buffer[0] = mess_length; /* Param number */
|
|
+
|
|
+ i2c_buffer[1] = 0x00; /* Request CEC data */
|
|
+
|
|
+ /*Build Initiator and Reciever Logical Address Byte*/
|
|
+ /*Initiator logical Address*/
|
|
+ i2c_buffer[2] = (unsigned char)(unit_table[instance].device_logical_address) & 0x0F;
|
|
+ i2c_buffer[2] = i2c_buffer[2] << 4;
|
|
+ /* Receiver logical Address*/
|
|
+ i2c_buffer[2] |= receiver_logical_address & 0x0F;
|
|
+
|
|
+ /* Vendor Command*/
|
|
+ i2c_buffer[3] = CEC_OPCODE_VENDOR_COMMAND_WITH_ID ;
|
|
+ i2c_buffer[4] = (unsigned char)(vendor_id >> 16); /* MSByte of Vendor ID*/
|
|
+ i2c_buffer[5] = (unsigned char)(vendor_id >> 8);
|
|
+ i2c_buffer[6] = (unsigned char)vendor_id; /* LSByte of Vendor ID*/
|
|
+
|
|
+ for(loci = 0; loci <= vendor_specific_data_length ; loci++) {
|
|
+ /* Fill Table with vendorSpecific Data characters*/
|
|
+ i2c_buffer[(loci+7)] = p_vendor_specific_data[loci];
|
|
+ }
|
|
+
|
|
+ /* CEC Data register */
|
|
+ err = set_cec_hw_registers(p_dis, E_REG_CDR0, i2c_buffer, mess_length);
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+ /* Save Datas of the CEC message send */
|
|
+ gtmdl_hdmi_cec_driver_save_message.address_byte = i2c_buffer[2];
|
|
+ gtmdl_hdmi_cec_driver_save_message.message_type_polling = 0;
|
|
+ gtmdl_hdmi_cec_driver_save_message.opcode = i2c_buffer[3];
|
|
+
|
|
+ return(0);
|
|
+}
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \fn tmErrorCode_t dlHdmiCecVendorRemoteButtonDown( )
|
|
+ * \brief This message indicates that a remote control button has been depressed.
|
|
+ *
|
|
+ * \param tmInstance_t Instance \n
|
|
+ * Instance identifier. \n
|
|
+ *
|
|
+ * \param u8 *pVendorSpecificRcCode \n
|
|
+ * Pointer to the Vendor Specific remote control code.
|
|
+ * its recommended t keep this to a minimum size.
|
|
+ * The maximum length shall not exceed 14 data blocks to avoid saturating bus
|
|
+ *
|
|
+ * \param u8 VendorSpecificRcCodeLength \n
|
|
+ * Length of VendorSpecificRcCode. \n
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ *
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_vendor_remote_button_down
|
|
+(
|
|
+ instance_t instance,
|
|
+ u8 receiver_logical_address,
|
|
+ u8 *p_vendor_specific_rc_code,
|
|
+ u8 vendor_specific_rc_code_length
|
|
+)
|
|
+{
|
|
+ error_code_t err;
|
|
+ unsigned char i2c_buffer[19] ; /* I2C data buffer */
|
|
+ /* Pointer to Device Instance Structure */
|
|
+ dl_hdmi_cec_driver_config_table_t *p_dis;
|
|
+ unsigned char loci; /* Local increment variable*/
|
|
+ unsigned char mess_length; /* Local Message length*/
|
|
+
|
|
+ /* check if instance number is in range */
|
|
+ RETIF((instance < 0) || (instance >= MAX_UNITS), ERR_DLHDMICEC_BAD_INSTANCE)
|
|
+
|
|
+ /* check if unit corresponding to instance is opened */
|
|
+ RETIF(unit_table[instance].opened == false, ERR_DLHDMICEC_RESOURCE_NOT_OWNED)
|
|
+
|
|
+ /* check if instance state is correct */
|
|
+ /*RETIF(UnitTable[Instance].state != STATE_NOT_INITIALIZED, ERR_DLHDMICEC_INVALID_STATE) */
|
|
+
|
|
+ p_dis = >mdl_hdmi_cec_driver_config_table[instance];
|
|
+
|
|
+ /* Vendor Remote Button Down command */
|
|
+ /* Calculate Message length*/
|
|
+ mess_length = vendor_specific_rc_code_length + 4;
|
|
+
|
|
+ i2c_buffer[0] = mess_length; /* Message Length */
|
|
+
|
|
+ i2c_buffer[1] = 0x00; /* Request CEC data */
|
|
+
|
|
+ /*Build Initiator and Reciever Logical Address Byte*/
|
|
+ /*Initiator logical Address*/
|
|
+ i2c_buffer[2] = (unsigned char)(unit_table[instance].device_logical_address) & 0x0F;
|
|
+ i2c_buffer[2] = i2c_buffer[2] << 4;
|
|
+ /* Receiver logical Address*/
|
|
+ i2c_buffer[2] |= receiver_logical_address & 0x0F;
|
|
+
|
|
+ /* Vendor Remote Button Down Opcode*/
|
|
+ i2c_buffer[3] = CEC_OPCODE_VENDOR_REMOTE_BUTTON_DOWN ;
|
|
+ /*Vendor Specific RC code Parameter*/
|
|
+ for(loci = 0; loci <= vendor_specific_rc_code_length ; loci++) {
|
|
+ /* Fill Table with Vendor Specific RC Code data*/
|
|
+ i2c_buffer[(loci+4)] = p_vendor_specific_rc_code[loci];
|
|
+ }
|
|
+ /*Send message Via I2C*/
|
|
+
|
|
+ err = set_cec_hw_registers(p_dis, E_REG_CDR0, i2c_buffer, mess_length);
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+ /* Save Datas of the CEC message send */
|
|
+ gtmdl_hdmi_cec_driver_save_message.address_byte = i2c_buffer[2];
|
|
+ gtmdl_hdmi_cec_driver_save_message.message_type_polling = 0;
|
|
+ gtmdl_hdmi_cec_driver_save_message.opcode = i2c_buffer[3];
|
|
+
|
|
+ return(0);
|
|
+}
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \fn tmErrorCode_t dlHdmiCecVendorRemoteButtonUp( )
|
|
+ * \brief This message indicates that a remote control button (the last button
|
|
+ * pressed indicated by the <Vendor remote button down > message) has
|
|
+ * been released.
|
|
+ *
|
|
+ * \param tmInstance_t Instance \n
|
|
+ * Instance identifier. \n
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ *
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_vendor_remote_button_up
|
|
+(
|
|
+ instance_t instance,
|
|
+ u8 receiver_logical_address
|
|
+)
|
|
+{
|
|
+ error_code_t err;
|
|
+ unsigned char i2c_buffer[4] ; /* I2C data buffer */
|
|
+ /* Pointer to Device Instance Structure */
|
|
+ dl_hdmi_cec_driver_config_table_t *p_dis;
|
|
+
|
|
+ /* check if instance number is in range */
|
|
+ RETIF((instance < 0) || (instance >= MAX_UNITS), ERR_DLHDMICEC_BAD_INSTANCE)
|
|
+
|
|
+ /* check if unit corresponding to instance is opened */
|
|
+ RETIF(unit_table[instance].opened == false, ERR_DLHDMICEC_RESOURCE_NOT_OWNED)
|
|
+
|
|
+ /* check if instance state is correct */
|
|
+ /*RETIF(UnitTable[Instance].state != STATE_NOT_INITIALIZED, ERR_DLHDMICEC_INVALID_STATE) */
|
|
+
|
|
+ p_dis = >mdl_hdmi_cec_driver_config_table[instance];
|
|
+
|
|
+ /*======To do : make a prepare message function with parameter */
|
|
+ /* Vendor Remote Button Up command */
|
|
+ i2c_buffer[0] = 0x05; /* Param number */
|
|
+
|
|
+ i2c_buffer[1] = 0x00; /* Request CEC data */
|
|
+
|
|
+ /*Build Initiator and Reciever Logical Address Byte*/
|
|
+ /*Initiator logical Address*/
|
|
+ i2c_buffer[2] = (unsigned char)(unit_table[instance].device_logical_address) & 0x0F;
|
|
+ i2c_buffer[2] = i2c_buffer[2] << 4;
|
|
+ /* Receiver logical Address*/
|
|
+ i2c_buffer[2] |= receiver_logical_address & 0x0F;
|
|
+
|
|
+ /* Vendor Remote Button Up*/
|
|
+ i2c_buffer[3] = CEC_OPCODE_VENDOR_REMOTE_BUTTON_UP ;
|
|
+
|
|
+ /* CEC Data register */
|
|
+ err = set_cec_hw_registers(p_dis, E_REG_CDR0, i2c_buffer, 4);
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+ /* Save Datas of the CEC message send */
|
|
+ gtmdl_hdmi_cec_driver_save_message.address_byte = i2c_buffer[2];
|
|
+ gtmdl_hdmi_cec_driver_save_message.message_type_polling = 0;
|
|
+ gtmdl_hdmi_cec_driver_save_message.opcode = i2c_buffer[3];
|
|
+
|
|
+ return(0);
|
|
+}
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \fn tmErrorCode_t dlHdmiCecSetOsdString( )
|
|
+ * \brief This message is used to send a test message to output on a TV.
|
|
+ *
|
|
+ * \param tmInstance_t Instance \n
|
|
+ * Instance identifier. \n
|
|
+ *
|
|
+ * \param dlHdmiCECDisplayControl_t DisplayControl \n
|
|
+ * Display timing. \n
|
|
+ *
|
|
+ * \param const char *pOsdString \n
|
|
+ * Pointer on the Text to display. \n
|
|
+ *
|
|
+ * \param u8 OsdStringLength \n
|
|
+ * Length of Osd String. \n
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ * - ERR_DLHDMICEC_BAD_PARAMETER: a parameter is invalid or out
|
|
+ * of range
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_set_osd_string
|
|
+(
|
|
+ instance_t instance,
|
|
+ u8 receiver_logical_address,
|
|
+ dl_hdmi_cecdisplay_control_t display_control,
|
|
+ const char *p_osd_string,
|
|
+ u8 osd_string_length
|
|
+)
|
|
+{
|
|
+ error_code_t err;
|
|
+ unsigned char i2c_buffer[19] ; /* I2C data buffer */
|
|
+ /* Pointer to Device Instance Structure */
|
|
+ dl_hdmi_cec_driver_config_table_t *p_dis;
|
|
+ unsigned char loci; /* Local increment variable*/
|
|
+ unsigned char mess_length; /* Local Message length*/
|
|
+
|
|
+ /* check if instance number is in range */
|
|
+ RETIF((instance < 0) || (instance >= MAX_UNITS), ERR_DLHDMICEC_BAD_INSTANCE)
|
|
+
|
|
+ /* check if unit corresponding to instance is opened */
|
|
+ RETIF(unit_table[instance].opened == false, ERR_DLHDMICEC_RESOURCE_NOT_OWNED)
|
|
+
|
|
+ /* check if instance state is correct */
|
|
+ /*RETIF(UnitTable[Instance].state != STATE_NOT_INITIALIZED, ERR_DLHDMICEC_INVALID_STATE) */
|
|
+
|
|
+ p_dis = >mdl_hdmi_cec_driver_config_table[instance];
|
|
+
|
|
+ /*======To do : make a prepare message function with parameter */
|
|
+ /* Set OSD String command */
|
|
+
|
|
+ /* Calculate Message length*/
|
|
+ mess_length = osd_string_length + 5;
|
|
+
|
|
+ i2c_buffer[0] = (unsigned char)mess_length;
|
|
+
|
|
+ i2c_buffer[1] = 0x00; /* Request CEC data */
|
|
+
|
|
+ /*Build Initiator and Reciever Logical Address Byte*/
|
|
+ /*Initiator logical Address*/
|
|
+ i2c_buffer[2] = (unsigned char)(unit_table[instance].device_logical_address) & 0x0F;
|
|
+ i2c_buffer[2] = i2c_buffer[2] << 4;
|
|
+ /* Receiver logical Address*/
|
|
+ i2c_buffer[2] |= receiver_logical_address & 0x0F;
|
|
+
|
|
+ i2c_buffer[3] = CEC_OPCODE_SET_OSD_STRING ; /* Set Osd String*/
|
|
+ i2c_buffer[4] = display_control; /*Display Control*/
|
|
+ for(loci = 0; loci <= osd_string_length ; loci++) {
|
|
+ /* Fill Table with OSD Name characters*/
|
|
+ i2c_buffer[(loci+5)] = p_osd_string[loci];
|
|
+ }
|
|
+
|
|
+ /* CEC Data register */
|
|
+ err = set_cec_hw_registers(p_dis, E_REG_CDR0, i2c_buffer, (mess_length));
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+ /* Save Datas of the CEC message send */
|
|
+ gtmdl_hdmi_cec_driver_save_message.address_byte = i2c_buffer[2];
|
|
+ gtmdl_hdmi_cec_driver_save_message.message_type_polling = 0;
|
|
+ gtmdl_hdmi_cec_driver_save_message.opcode = i2c_buffer[3];
|
|
+
|
|
+ return(0);
|
|
+}
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \fn tmErrorCode_t dlHdmiCecGiveOsdName( )
|
|
+ * \brief This message is used to request preferred OSD name of a device
|
|
+ * for use in menus associated with that device
|
|
+ *
|
|
+ * \param tmInstance_t Instance \n
|
|
+ * Instance identifier. \n
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ *
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_give_osd_name
|
|
+(
|
|
+ instance_t instance,
|
|
+ u8 receiver_logical_address
|
|
+)
|
|
+{
|
|
+ error_code_t err;
|
|
+ unsigned char i2c_buffer[4] ; /* I2C data buffer */
|
|
+ /* Pointer to Device Instance Structure */
|
|
+ dl_hdmi_cec_driver_config_table_t *p_dis;
|
|
+
|
|
+ /* check if instance number is in range */
|
|
+ RETIF((instance < 0) || (instance >= MAX_UNITS), ERR_DLHDMICEC_BAD_INSTANCE)
|
|
+
|
|
+ /* check if unit corresponding to instance is opened */
|
|
+ RETIF(unit_table[instance].opened == false, ERR_DLHDMICEC_RESOURCE_NOT_OWNED)
|
|
+
|
|
+ /* check if instance state is correct */
|
|
+ /*RETIF(UnitTable[Instance].state != STATE_NOT_INITIALIZED, ERR_DLHDMICEC_INVALID_STATE) */
|
|
+
|
|
+ p_dis = >mdl_hdmi_cec_driver_config_table[instance];
|
|
+
|
|
+ /*======To do : make a prepare message function with parameter */
|
|
+ /* Give OSD Name command */
|
|
+ i2c_buffer[0] = 0x04; /* Param number */
|
|
+
|
|
+ i2c_buffer[1] = 0x00; /* Request CEC data */
|
|
+
|
|
+ /*Build Initiator and Reciever Logical Address Byte*/
|
|
+ /*Initiator logical Address*/
|
|
+ i2c_buffer[2] = (unsigned char)(unit_table[instance].device_logical_address) & 0x0F;
|
|
+ i2c_buffer[2] = i2c_buffer[2] << 4;
|
|
+ /* Receiver logical Address*/
|
|
+ i2c_buffer[2] |= receiver_logical_address & 0x0F;
|
|
+
|
|
+ i2c_buffer[3] = CEC_OPCODE_GIVE_OSD_NAME ; /* Give OSD Name*/
|
|
+
|
|
+ /* CEC Data register */
|
|
+ err = set_cec_hw_registers(p_dis, E_REG_CDR0, i2c_buffer, 4);
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+ /* Save Datas of the CEC message send */
|
|
+ gtmdl_hdmi_cec_driver_save_message.address_byte = i2c_buffer[2];
|
|
+ gtmdl_hdmi_cec_driver_save_message.message_type_polling = 0;
|
|
+ gtmdl_hdmi_cec_driver_save_message.opcode = i2c_buffer[3];
|
|
+
|
|
+ return(0);
|
|
+}
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \fn tmErrorCode_t dlHdmiCecSetOsdName( )
|
|
+ * \brief This message is used to set the preferred OSD name of a device
|
|
+ * for use in manus associated with that device.
|
|
+ *
|
|
+ * \param tmInstance_t Instance \n
|
|
+ * Instance identifier. \n
|
|
+ *
|
|
+ * \param const char *pOsdName \n
|
|
+ * Pointer on the preferred name of the device. \n
|
|
+ *
|
|
+ * \param u8 OsdNameLength \n
|
|
+ * Length of Osd Name String. \n
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ * - ERR_DLHDMICEC_BAD_PARAMETER: a parameter is invalid or out
|
|
+ * of range
|
|
+ *
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_set_osd_name
|
|
+(
|
|
+ instance_t instance,
|
|
+ u8 receiver_logical_address,
|
|
+ const char *p_osd_name,
|
|
+ u8 osd_name_length
|
|
+)
|
|
+{
|
|
+ error_code_t err;
|
|
+ unsigned char i2c_buffer[19] ; /* I2C data buffer */
|
|
+ /* Pointer to Device Instance Structure */
|
|
+ dl_hdmi_cec_driver_config_table_t *p_dis;
|
|
+ unsigned char loci; /* Local increment variable*/
|
|
+ unsigned char mess_length; /* Local Message length*/
|
|
+
|
|
+ /* check if instance number is in range */
|
|
+ RETIF((instance < 0) || (instance >= MAX_UNITS), ERR_DLHDMICEC_BAD_INSTANCE)
|
|
+
|
|
+ /* check if unit corresponding to instance is opened */
|
|
+ RETIF(unit_table[instance].opened == false, ERR_DLHDMICEC_RESOURCE_NOT_OWNED)
|
|
+
|
|
+ /* check if instance state is correct */
|
|
+ /*RETIF(UnitTable[Instance].state != STATE_NOT_INITIALIZED, ERR_DLHDMICEC_INVALID_STATE) */
|
|
+
|
|
+ p_dis = >mdl_hdmi_cec_driver_config_table[instance];
|
|
+
|
|
+ /*======To do : make a prepare message function with parameter */
|
|
+ /* Set OSD Name command */
|
|
+
|
|
+ /* Calculate Message length*/
|
|
+ mess_length = osd_name_length + 4;
|
|
+
|
|
+ i2c_buffer[0] = (unsigned char)mess_length;
|
|
+
|
|
+ i2c_buffer[1] = 0x00; /* Request CEC data */
|
|
+
|
|
+ /*Build Initiator and Reciever Logical Address Byte*/
|
|
+ /*Initiator logical Address*/
|
|
+ i2c_buffer[2] = (unsigned char)(unit_table[instance].device_logical_address) & 0x0F;
|
|
+ i2c_buffer[2] = i2c_buffer[2] << 4;
|
|
+ /* Receiver logical Address*/
|
|
+ i2c_buffer[2] |= receiver_logical_address & 0x0F;
|
|
+
|
|
+ i2c_buffer[3] = CEC_OPCODE_SET_OSD_NAME ; /* Set Osd Name*/
|
|
+ for(loci = 0; loci <= osd_name_length ; loci++) {
|
|
+ /* Fill Table with OSD Name characters*/
|
|
+ i2c_buffer[(loci+4)] = p_osd_name[loci];
|
|
+ }
|
|
+
|
|
+ /* CEC Data register */
|
|
+ err = set_cec_hw_registers(p_dis, E_REG_CDR0, i2c_buffer, (mess_length));
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+ /* Save Datas of the CEC message send */
|
|
+ gtmdl_hdmi_cec_driver_save_message.address_byte = i2c_buffer[2];
|
|
+ gtmdl_hdmi_cec_driver_save_message.message_type_polling = 0;
|
|
+ gtmdl_hdmi_cec_driver_save_message.opcode = i2c_buffer[3];
|
|
+
|
|
+ return(0);
|
|
+}
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \fn tmErrorCode_t dlHdmiCecMenuRequest( )
|
|
+ * \brief This message request from the TV for a device to show/remove a
|
|
+ * menu or to query if a device is currently showing a menu
|
|
+ *
|
|
+ * \param tmInstance_t Instance \n
|
|
+ * Instance identifier. \n
|
|
+ *
|
|
+ * \param dlHdmiCECMenuRequestType_t MenuRequestType \n
|
|
+ * Indicates if the menu request is to activate or deactivate the
|
|
+ * devices menu or simply query the devices menu status. \n
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ *
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_menu_request
|
|
+(
|
|
+ instance_t instance,
|
|
+ u8 receiver_logical_address,
|
|
+ dl_hdmi_cecmenu_request_type_t menu_request_type
|
|
+)
|
|
+{
|
|
+ error_code_t err;
|
|
+ unsigned char i2c_buffer[5] ; /* I2C data buffer */
|
|
+ /* Pointer to Device Instance Structure */
|
|
+ dl_hdmi_cec_driver_config_table_t *p_dis;
|
|
+
|
|
+ /* check if instance number is in range */
|
|
+ RETIF((instance < 0) || (instance >= MAX_UNITS), ERR_DLHDMICEC_BAD_INSTANCE)
|
|
+
|
|
+ /* check if unit corresponding to instance is opened */
|
|
+ RETIF(unit_table[instance].opened == false, ERR_DLHDMICEC_RESOURCE_NOT_OWNED)
|
|
+
|
|
+ /* check if instance state is correct */
|
|
+ /*RETIF(UnitTable[Instance].state != STATE_NOT_INITIALIZED, ERR_DLHDMICEC_INVALID_STATE) */
|
|
+
|
|
+ p_dis = >mdl_hdmi_cec_driver_config_table[instance];
|
|
+
|
|
+ /*======To do : make a prepare message function with parameter */
|
|
+ /* Menu Request command */
|
|
+ i2c_buffer[0] = 0x05; /* Param number */
|
|
+
|
|
+ i2c_buffer[1] = 0x00; /* Request CEC data */
|
|
+
|
|
+ /*Build Initiator and Reciever Logical Address Byte*/
|
|
+ /*Initiator logical Address*/
|
|
+ i2c_buffer[2] = (unsigned char)(unit_table[instance].device_logical_address) & 0x0F;
|
|
+ i2c_buffer[2] = i2c_buffer[2] << 4;
|
|
+ /* Receiver logical Address*/
|
|
+ i2c_buffer[2] |= receiver_logical_address & 0x0F;
|
|
+
|
|
+ i2c_buffer[3] = CEC_OPCODE_MENU_REQUEST ; /* Menu Request*/
|
|
+ i2c_buffer[4] = menu_request_type; /*Menu Request Type */
|
|
+
|
|
+ /* CEC Data register */
|
|
+ err = set_cec_hw_registers(p_dis, E_REG_CDR0, i2c_buffer, 5);
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+ /* Save Datas of the CEC message send */
|
|
+ gtmdl_hdmi_cec_driver_save_message.address_byte = i2c_buffer[2];
|
|
+ gtmdl_hdmi_cec_driver_save_message.message_type_polling = 0;
|
|
+ gtmdl_hdmi_cec_driver_save_message.opcode = i2c_buffer[3];
|
|
+
|
|
+ return(0);
|
|
+}
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \fn tmErrorCode_t dlHdmiCecMenuStatus( )
|
|
+ * \brief This message is used to indicate to the TV that the device is
|
|
+ * showing/has removed a menu and requets the remote control keys to
|
|
+ * be passed though
|
|
+ *
|
|
+ * \param tmInstance_t Instance \n
|
|
+ * Instance identifier. \n
|
|
+ *
|
|
+ * \param dlHdmiCECMenuState_t MenuState \n
|
|
+ * Indicates if the device is in the 'Device Menu Active' state or
|
|
+ * 'Device Menu Inactive' state. \n
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ *
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_menu_status
|
|
+(
|
|
+ instance_t instance,
|
|
+ u8 receiver_logical_address,
|
|
+ dl_hdmi_cecmenu_state_t menu_state
|
|
+)
|
|
+{
|
|
+ error_code_t err;
|
|
+ unsigned char i2c_buffer[5] ; /* I2C data buffer */
|
|
+ /* Pointer to Device Instance Structure */
|
|
+ dl_hdmi_cec_driver_config_table_t *p_dis;
|
|
+
|
|
+ /* check if instance number is in range */
|
|
+ RETIF((instance < 0) || (instance >= MAX_UNITS), ERR_DLHDMICEC_BAD_INSTANCE)
|
|
+
|
|
+ /* check if unit corresponding to instance is opened */
|
|
+ RETIF(unit_table[instance].opened == false, ERR_DLHDMICEC_RESOURCE_NOT_OWNED)
|
|
+
|
|
+ /* check if instance state is correct */
|
|
+ /*RETIF(UnitTable[Instance].state != STATE_NOT_INITIALIZED, ERR_DLHDMICEC_INVALID_STATE) */
|
|
+
|
|
+ p_dis = >mdl_hdmi_cec_driver_config_table[instance];
|
|
+
|
|
+ /*======To do : make a prepare message function with parameter */
|
|
+ /* Menu Status command */
|
|
+ i2c_buffer[0] = 0x05; /* Param number */
|
|
+
|
|
+ i2c_buffer[1] = 0x00; /* Request CEC data */
|
|
+
|
|
+ /*Build Initiator and Reciever Logical Address Byte*/
|
|
+ /*Initiator logical Address*/
|
|
+ i2c_buffer[2] = (unsigned char)(unit_table[instance].device_logical_address) & 0x0F;
|
|
+ i2c_buffer[2] = i2c_buffer[2] << 4;
|
|
+ /* Receiver logical Address*/
|
|
+ i2c_buffer[2] |= receiver_logical_address & 0x0F;
|
|
+
|
|
+ i2c_buffer[3] = CEC_OPCODE_MENU_STATUS; /* Menu Status*/
|
|
+ i2c_buffer[4] = menu_state; /* Menu State*/
|
|
+
|
|
+ /* CEC Data register */
|
|
+ err = set_cec_hw_registers(p_dis, E_REG_CDR0, i2c_buffer, 5);
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+ /* Save Datas of the CEC message send */
|
|
+ gtmdl_hdmi_cec_driver_save_message.address_byte = i2c_buffer[2];
|
|
+ gtmdl_hdmi_cec_driver_save_message.message_type_polling = 0;
|
|
+ gtmdl_hdmi_cec_driver_save_message.opcode = i2c_buffer[3];
|
|
+
|
|
+ return(0);
|
|
+}
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \fn tmErrorCode_t dlHdmiCecUserControlPressed( )
|
|
+ * \brief This message is used to indicate that the user pressed a remote button
|
|
+ * or switched from one remote control button to another.
|
|
+ *
|
|
+ * \param tmInstance_t Instance \n
|
|
+ * Instance identifier. \n
|
|
+ *
|
|
+ * \param dlHdmiCECUserRemoteControlCommand_t UICommand \n
|
|
+ * Relevant UI command issued by user. \n
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ *
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_user_control_pressed
|
|
+(
|
|
+ instance_t instance,
|
|
+ u8 receiver_logical_address,
|
|
+ dl_hdmi_cecuser_remote_control_command_t uicommand
|
|
+)
|
|
+{
|
|
+ error_code_t err;
|
|
+ unsigned char i2c_buffer[5] ; /* I2C data buffer */
|
|
+ /* Pointer to Device Instance Structure */
|
|
+ dl_hdmi_cec_driver_config_table_t *p_dis;
|
|
+
|
|
+ /* check if instance number is in range */
|
|
+ RETIF((instance < 0) || (instance >= MAX_UNITS), ERR_DLHDMICEC_BAD_INSTANCE)
|
|
+
|
|
+ /* check if unit corresponding to instance is opened */
|
|
+ RETIF(unit_table[instance].opened == false, ERR_DLHDMICEC_RESOURCE_NOT_OWNED)
|
|
+
|
|
+ /* check if instance state is correct */
|
|
+ /*RETIF(UnitTable[Instance].state != STATE_NOT_INITIALIZED, ERR_DLHDMICEC_INVALID_STATE) */
|
|
+
|
|
+ p_dis = >mdl_hdmi_cec_driver_config_table[instance];
|
|
+
|
|
+ /*======To do : make a prepare message function with parameter */
|
|
+ /* User Control Pressed command */
|
|
+ i2c_buffer[0] = 0x05; /* Param number */
|
|
+
|
|
+ i2c_buffer[1] = 0x00; /* Request CEC data */
|
|
+
|
|
+ /*Build Initiator and Reciever Logical Address Byte*/
|
|
+ /*Initiator logical Address*/
|
|
+ i2c_buffer[2] = (unsigned char)(unit_table[instance].device_logical_address) & 0x0F;
|
|
+ i2c_buffer[2] = i2c_buffer[2] << 4;
|
|
+ /* Receiver logical Address*/
|
|
+ i2c_buffer[2] |= receiver_logical_address & 0x0F;
|
|
+
|
|
+ /* User Control pressed*/
|
|
+ i2c_buffer[3] = CEC_OPCODE_USER_CONTROL_PRESSED;
|
|
+ i2c_buffer[4] = uicommand; /* UI Command*/
|
|
+
|
|
+ /* CEC Data register */
|
|
+ err = set_cec_hw_registers(p_dis, E_REG_CDR0, i2c_buffer, 5);
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+ /* Save Datas of the CEC message send */
|
|
+ gtmdl_hdmi_cec_driver_save_message.address_byte = i2c_buffer[2];
|
|
+ gtmdl_hdmi_cec_driver_save_message.message_type_polling = 0;
|
|
+ gtmdl_hdmi_cec_driver_save_message.opcode = i2c_buffer[3];
|
|
+
|
|
+ return(0);
|
|
+}
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \fn tmErrorCode_t dlHdmiCecUserControlPressedPlay( )
|
|
+ * \brief This message is used to indicate that the user pressed a remote button
|
|
+ * or switched from one remote control button to another.
|
|
+ *
|
|
+ * \param tmInstance_t Instance \n
|
|
+ * Instance identifier. \n
|
|
+ *
|
|
+ * \param dlHdmiCECPlayMode_t PlayMode \n
|
|
+ * In which mode to play media. \n
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ *
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_user_control_pressed_play
|
|
+(
|
|
+ instance_t instance,
|
|
+ u8 receiver_logical_address,
|
|
+ dl_hdmi_cecplay_mode_t play_mode
|
|
+)
|
|
+{
|
|
+ error_code_t err;
|
|
+ unsigned char i2c_buffer[6] ; /* I2C data buffer */
|
|
+ /* Pointer to Device Instance Structure */
|
|
+ dl_hdmi_cec_driver_config_table_t *p_dis;
|
|
+
|
|
+ /* check if instance number is in range */
|
|
+ RETIF((instance < 0) || (instance >= MAX_UNITS), ERR_DLHDMICEC_BAD_INSTANCE)
|
|
+
|
|
+ /* check if unit corresponding to instance is opened */
|
|
+ RETIF(unit_table[instance].opened == false, ERR_DLHDMICEC_RESOURCE_NOT_OWNED)
|
|
+
|
|
+ /* check if instance state is correct */
|
|
+ /*RETIF(UnitTable[Instance].state != STATE_NOT_INITIALIZED, ERR_DLHDMICEC_INVALID_STATE) */
|
|
+
|
|
+ p_dis = >mdl_hdmi_cec_driver_config_table[instance];
|
|
+
|
|
+ /*======To do : make a prepare message function with parameter */
|
|
+ /* User Control Presses Play command */
|
|
+ i2c_buffer[0] = 0x06; /* Param number */
|
|
+
|
|
+ i2c_buffer[1] = 0x00; /* Request CEC data */
|
|
+
|
|
+ /*Build Initiator and Reciever Logical Address Byte*/
|
|
+ /*Initiator logical Address*/
|
|
+ i2c_buffer[2] = (unsigned char)(unit_table[instance].device_logical_address) & 0x0F;
|
|
+ i2c_buffer[2] = i2c_buffer[2] << 4;
|
|
+ /* Receiver logical Address*/
|
|
+ i2c_buffer[2] |= receiver_logical_address & 0x0F;
|
|
+
|
|
+ /* User Control Pressed*/
|
|
+ i2c_buffer[3] = CEC_OPCODE_USER_CONTROL_PRESSED;
|
|
+
|
|
+ /* UI Command = CEC_REMOTE_BUTTON_PLAY_FUNCTION */
|
|
+ i2c_buffer[4] = CEC_REMOTE_BUTTON_PLAY_FUNCTION;
|
|
+ i2c_buffer[5] = play_mode; /* Play Mode*/
|
|
+
|
|
+ /* CEC Data register */
|
|
+ err = set_cec_hw_registers(p_dis, E_REG_CDR0, i2c_buffer, 6);
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+ /* Save Datas of the CEC message send */
|
|
+ gtmdl_hdmi_cec_driver_save_message.address_byte = i2c_buffer[2];
|
|
+ gtmdl_hdmi_cec_driver_save_message.message_type_polling = 0;
|
|
+ gtmdl_hdmi_cec_driver_save_message.opcode = i2c_buffer[3];
|
|
+
|
|
+ return(0);
|
|
+}
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \fn tmErrorCode_t dlHdmiCecUserControlPressedSelectAudioInput( )
|
|
+ * \brief This message is used to indicate that the user pressed a remote button
|
|
+ * or switched from one remote control button to another.
|
|
+ *
|
|
+ * \param tmInstance_t Instance \n
|
|
+ * Instance identifier. \n
|
|
+ *
|
|
+ * \param u8 SelectAudioInput \n
|
|
+ * Number of the Audio Input (Audio input number between 1 and 255). \n
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ *
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_user_control_pressed_select_audio_input
|
|
+(
|
|
+ instance_t instance,
|
|
+ u8 receiver_logical_address,
|
|
+ u8 select_audio_input
|
|
+)
|
|
+{
|
|
+ error_code_t err;
|
|
+ unsigned char i2c_buffer[6] ; /* I2C data buffer */
|
|
+ /* Pointer to Device Instance Structure */
|
|
+ dl_hdmi_cec_driver_config_table_t *p_dis;
|
|
+
|
|
+ /* check if instance number is in range */
|
|
+ RETIF((instance < 0) || (instance >= MAX_UNITS), ERR_DLHDMICEC_BAD_INSTANCE)
|
|
+
|
|
+ /* check if unit corresponding to instance is opened */
|
|
+ RETIF(unit_table[instance].opened == false, ERR_DLHDMICEC_RESOURCE_NOT_OWNED)
|
|
+
|
|
+ /* check if instance state is correct */
|
|
+ /*RETIF(UnitTable[Instance].state != STATE_NOT_INITIALIZED, ERR_DLHDMICEC_INVALID_STATE) */
|
|
+
|
|
+ p_dis = >mdl_hdmi_cec_driver_config_table[instance];
|
|
+
|
|
+ /*======To do : make a prepare message function with parameter */
|
|
+ /* User Control Pressed Select Audio Input command */
|
|
+ i2c_buffer[0] = 0x06; /* Param number */
|
|
+
|
|
+ i2c_buffer[1] = 0x00; /* Request CEC data */
|
|
+
|
|
+ /*Build Initiator and Reciever Logical Address Byte*/
|
|
+ /*Initiator logical Address*/
|
|
+ i2c_buffer[2] = (unsigned char)(unit_table[instance].device_logical_address) & 0x0F;
|
|
+ i2c_buffer[2] = i2c_buffer[2] << 4;
|
|
+ /* Receiver logical Address*/
|
|
+ i2c_buffer[2] |= receiver_logical_address & 0x0F;
|
|
+
|
|
+ /* User Control Pressed*/
|
|
+ i2c_buffer[3] = CEC_OPCODE_USER_CONTROL_PRESSED;
|
|
+
|
|
+ /* UI Command = CEC_REMOTE_BUTTON_SELECT_AUDIO_INPUT_FUNCTION*/
|
|
+ i2c_buffer[4] = CEC_REMOTE_BUTTON_SELECT_AUDIO_INPUT_FUNCTION;
|
|
+ /* UI Function Select Audio mode*/
|
|
+ i2c_buffer[5] = select_audio_input;
|
|
+
|
|
+ /* CEC Data register */
|
|
+ err = set_cec_hw_registers(p_dis, E_REG_CDR0, i2c_buffer, 6);
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+ /* Save Datas of the CEC message send */
|
|
+ gtmdl_hdmi_cec_driver_save_message.address_byte = i2c_buffer[2];
|
|
+ gtmdl_hdmi_cec_driver_save_message.message_type_polling = 0;
|
|
+ gtmdl_hdmi_cec_driver_save_message.opcode = i2c_buffer[3];
|
|
+
|
|
+ return(0);
|
|
+}
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \fn tmErrorCode_t dlHdmiCecUserControlPressedSelectAVInput( )
|
|
+ * \brief This message is used to indicate that the user pressed a remote button
|
|
+ * or switched from one remote control button to another.
|
|
+ *
|
|
+ * \param tmInstance_t Instance \n
|
|
+ * Instance identifier. \n
|
|
+ *
|
|
+ * \param u8 SelectAVInput \n
|
|
+ * Number of the A/V Input (A/V input number between 1 and 255). \n
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ *
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_user_control_pressed_select_avinput
|
|
+(
|
|
+ instance_t instance,
|
|
+ u8 receiver_logical_address,
|
|
+ u8 select_avinput
|
|
+)
|
|
+{
|
|
+ error_code_t err;
|
|
+ unsigned char i2c_buffer[6] ; /* I2C data buffer */
|
|
+ /* Pointer to Device Instance Structure */
|
|
+ dl_hdmi_cec_driver_config_table_t *p_dis;
|
|
+
|
|
+ /* check if instance number is in range */
|
|
+ RETIF((instance < 0) || (instance >= MAX_UNITS), ERR_DLHDMICEC_BAD_INSTANCE)
|
|
+
|
|
+ /* check if unit corresponding to instance is opened */
|
|
+ RETIF(unit_table[instance].opened == false, ERR_DLHDMICEC_RESOURCE_NOT_OWNED)
|
|
+
|
|
+ /* check if instance state is correct */
|
|
+ /*RETIF(UnitTable[Instance].state != STATE_NOT_INITIALIZED, ERR_DLHDMICEC_INVALID_STATE) */
|
|
+
|
|
+ p_dis = >mdl_hdmi_cec_driver_config_table[instance];
|
|
+
|
|
+ /*======To do : make a prepare message function with parameter */
|
|
+ /* User Control Pressed Select AV Input command */
|
|
+ i2c_buffer[0] = 0x06; /* Param number */
|
|
+
|
|
+ i2c_buffer[1] = 0x00; /* Request CEC data */
|
|
+
|
|
+ /*Build Initiator and Reciever Logical Address Byte*/
|
|
+ /*Initiator logical Address*/
|
|
+ i2c_buffer[2] = (unsigned char)(unit_table[instance].device_logical_address) & 0x0F;
|
|
+ i2c_buffer[2] = i2c_buffer[2] << 4;
|
|
+ /* Receiver logical Address*/
|
|
+ i2c_buffer[2] |= receiver_logical_address & 0x0F;
|
|
+
|
|
+ /* User Control Pressed*/
|
|
+ i2c_buffer[3] = CEC_OPCODE_USER_CONTROL_PRESSED;
|
|
+
|
|
+ /* UI Command = CEC_REMOTE_BUTTON_SELECT_AV_INPUT_FUNCTION */
|
|
+ i2c_buffer[4] = CEC_REMOTE_BUTTON_SELECT_AV_INPUT_FUNCTION;
|
|
+ /* UI Function Select A/V Input*/
|
|
+ i2c_buffer[5] = select_avinput;
|
|
+
|
|
+ /* CEC Data register */
|
|
+ err = set_cec_hw_registers(p_dis, E_REG_CDR0, i2c_buffer, 6);
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+ /* Save Datas of the CEC message send */
|
|
+ gtmdl_hdmi_cec_driver_save_message.address_byte = i2c_buffer[2];
|
|
+ gtmdl_hdmi_cec_driver_save_message.message_type_polling = 0;
|
|
+ gtmdl_hdmi_cec_driver_save_message.opcode = i2c_buffer[3];
|
|
+
|
|
+ return(0);
|
|
+}
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \fn tmErrorCode_t dlHdmiCecUserControlPressedSelectMedia( )
|
|
+ * \brief This message is used to indicate that the user pressed a remote button
|
|
+ * or switched from one remote control button to another.
|
|
+ *
|
|
+ * \param tmInstance_t Instance \n
|
|
+ * Instance identifier. \n
|
|
+ *
|
|
+ * \param u8 SelectMedia \n
|
|
+ * Number of Media (Media number between 1 and 255). \n
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ *
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_user_control_pressed_select_media
|
|
+(
|
|
+ instance_t instance,
|
|
+ u8 receiver_logical_address,
|
|
+ u8 select_media
|
|
+)
|
|
+{
|
|
+ error_code_t err;
|
|
+ unsigned char i2c_buffer[6] ; /* I2C data buffer */
|
|
+ /* Pointer to Device Instance Structure */
|
|
+ dl_hdmi_cec_driver_config_table_t *p_dis;
|
|
+
|
|
+ /* check if instance number is in range */
|
|
+ RETIF((instance < 0) || (instance >= MAX_UNITS), ERR_DLHDMICEC_BAD_INSTANCE)
|
|
+
|
|
+ /* check if unit corresponding to instance is opened */
|
|
+ RETIF(unit_table[instance].opened == false, ERR_DLHDMICEC_RESOURCE_NOT_OWNED)
|
|
+
|
|
+ /* check if instance state is correct */
|
|
+ /*RETIF(UnitTable[Instance].state != STATE_NOT_INITIALIZED, ERR_DLHDMICEC_INVALID_STATE) */
|
|
+
|
|
+ p_dis = >mdl_hdmi_cec_driver_config_table[instance];
|
|
+
|
|
+ /*======To do : make a prepare message function with parameter */
|
|
+ /* User Control Pressed Select Media command */
|
|
+ i2c_buffer[0] = 0x06; /* Param number */
|
|
+
|
|
+ i2c_buffer[1] = 0x00; /* Request CEC data */
|
|
+
|
|
+ /*Build Initiator and Reciever Logical Address Byte*/
|
|
+ /*Initiator logical Address*/
|
|
+ i2c_buffer[2] = (unsigned char)(unit_table[instance].device_logical_address) & 0x0F;
|
|
+ i2c_buffer[2] = i2c_buffer[2] << 4;
|
|
+ /* Receiver logical Address*/
|
|
+ i2c_buffer[2] |= receiver_logical_address & 0x0F;
|
|
+
|
|
+ /* User Control Pressed*/
|
|
+ i2c_buffer[3] = CEC_OPCODE_USER_CONTROL_PRESSED;
|
|
+
|
|
+ /* UI Command = CEC_REMOTE_BUTTON_SELECT_MEDIA_FUNCTION*/
|
|
+ i2c_buffer[4] = CEC_REMOTE_BUTTON_SELECT_MEDIA_FUNCTION;
|
|
+ /* UI Function Media*/
|
|
+ i2c_buffer[5] = select_media;
|
|
+
|
|
+ /* CEC Data register */
|
|
+ err = set_cec_hw_registers(p_dis, E_REG_CDR0, i2c_buffer, 6);
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+ /* Save Datas of the CEC message send */
|
|
+ gtmdl_hdmi_cec_driver_save_message.address_byte = i2c_buffer[2];
|
|
+ gtmdl_hdmi_cec_driver_save_message.message_type_polling = 0;
|
|
+ gtmdl_hdmi_cec_driver_save_message.opcode = i2c_buffer[3];
|
|
+
|
|
+ return(0);
|
|
+}
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \fn tmErrorCode_t dlHdmiCecUserControlPressedTune( )
|
|
+ * \brief This message is used to indicate that the user pressed a remote button
|
|
+ * or switched from one remote control button to another.
|
|
+ *
|
|
+ * \param tmInstance_t Instance \n
|
|
+ * Instance identifier. \n
|
|
+ *
|
|
+ * \param dlHdmiCECChannelIdentifier_t *pChannelIdentifier \n
|
|
+ * Pointer to the structure of Major and Minor Channel number
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ *
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_user_control_pressed_tune
|
|
+(
|
|
+ instance_t instance,
|
|
+ u8 receiver_logical_address,
|
|
+ dl_hdmi_cecchannel_identifier_t *p_channel_identifier
|
|
+)
|
|
+{
|
|
+ error_code_t err;
|
|
+ unsigned char i2c_buffer[10] ; /* I2C data buffer */
|
|
+ u16 regval16 ; /* Local variable used for conversion*/
|
|
+ /* Pointer to Device Instance Structure */
|
|
+ dl_hdmi_cec_driver_config_table_t *p_dis;
|
|
+
|
|
+ /* check if instance number is in range */
|
|
+ RETIF((instance < 0) || (instance >= MAX_UNITS), ERR_DLHDMICEC_BAD_INSTANCE)
|
|
+
|
|
+ /* check if unit corresponding to instance is opened */
|
|
+ RETIF(unit_table[instance].opened == false, ERR_DLHDMICEC_RESOURCE_NOT_OWNED)
|
|
+
|
|
+ /* check if instance state is correct */
|
|
+ /*RETIF(UnitTable[Instance].state != STATE_NOT_INITIALIZED, ERR_DLHDMICEC_INVALID_STATE) */
|
|
+
|
|
+ p_dis = >mdl_hdmi_cec_driver_config_table[instance];
|
|
+
|
|
+ /*======To do : make a prepare message function with parameter */
|
|
+ /* User Control Pressed Tune command */
|
|
+ i2c_buffer[0] = 0x0A; /* Param number */
|
|
+
|
|
+ i2c_buffer[1] = 0x00; /* Request CEC data */
|
|
+
|
|
+ /*Build Initiator and Reciever Logical Address Byte*/
|
|
+ /*Initiator logical Address*/
|
|
+ i2c_buffer[2] = (unsigned char)(unit_table[instance].device_logical_address) & 0x0F;
|
|
+ i2c_buffer[2] = i2c_buffer[2] << 4;
|
|
+ /* Receiver logical Address*/
|
|
+ i2c_buffer[2] |= receiver_logical_address & 0x0F;
|
|
+
|
|
+ /* User Control Pressed Opcode*/
|
|
+ i2c_buffer[3] = CEC_OPCODE_USER_CONTROL_PRESSED;
|
|
+
|
|
+ /* UI Command = CEC_REMOTE_BUTTON_TUNE_FUNCTION*/
|
|
+ i2c_buffer[4] = CEC_REMOTE_BUTTON_TUNE_FUNCTION;
|
|
+
|
|
+ /* Merge 6 bits of ChanNum with 10 bits of Major channel*/
|
|
+ /* Save the 6 lsbits */
|
|
+ regval16 = (u16)(p_channel_identifier->chan_num_format & 0x003F);
|
|
+ regval16 = regval16 << 10;
|
|
+ regval16 |= (u16)(p_channel_identifier->major_chan_number & 0x03FF);
|
|
+
|
|
+ /* Load the 4 information bytes of Channel ID*/
|
|
+ i2c_buffer[5] = (unsigned char)(regval16 >> 8);
|
|
+ i2c_buffer[6] = (unsigned char)regval16;
|
|
+ i2c_buffer[7] = (unsigned char)(p_channel_identifier->minor_chan_number >> 8);
|
|
+ i2c_buffer[8] = (unsigned char)p_channel_identifier->minor_chan_number;
|
|
+
|
|
+ /* CEC Data register */
|
|
+ err = set_cec_hw_registers(p_dis, E_REG_CDR0, i2c_buffer, 9);
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+ /* Save Datas of the CEC message send */
|
|
+ gtmdl_hdmi_cec_driver_save_message.address_byte = i2c_buffer[2];
|
|
+ gtmdl_hdmi_cec_driver_save_message.message_type_polling = 0;
|
|
+ gtmdl_hdmi_cec_driver_save_message.opcode = i2c_buffer[3];
|
|
+
|
|
+ return(0);
|
|
+}
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \fn tmErrorCode_t dlHdmiCecUserControlReleased( )
|
|
+ * \brief This message is used to indicate that the user released a remote button
|
|
+ * The last one indicated by the <User Control Pressed> Message.
|
|
+ *
|
|
+ * \param tmInstance_t Instance \n
|
|
+ * Instance identifier. \n
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ *
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_user_control_released
|
|
+(
|
|
+ instance_t instance,
|
|
+ u8 receiver_logical_address
|
|
+)
|
|
+{
|
|
+ error_code_t err;
|
|
+ unsigned char i2c_buffer[4] ; /* I2C data buffer */
|
|
+ /* Pointer to Device Instance Structure */
|
|
+ dl_hdmi_cec_driver_config_table_t *p_dis;
|
|
+
|
|
+ /* check if instance number is in range */
|
|
+ RETIF((instance < 0) || (instance >= MAX_UNITS), ERR_DLHDMICEC_BAD_INSTANCE)
|
|
+
|
|
+ /* check if unit corresponding to instance is opened */
|
|
+ RETIF(unit_table[instance].opened == false, ERR_DLHDMICEC_RESOURCE_NOT_OWNED)
|
|
+
|
|
+ /* check if instance state is correct */
|
|
+ /*RETIF(UnitTable[Instance].state != STATE_NOT_INITIALIZED, ERR_DLHDMICEC_INVALID_STATE) */
|
|
+
|
|
+ p_dis = >mdl_hdmi_cec_driver_config_table[instance];
|
|
+
|
|
+ /*======To do : make a prepare message function with parameter */
|
|
+ /* User Control Released command */
|
|
+ i2c_buffer[0] = 0x04; /* Param number */
|
|
+
|
|
+ i2c_buffer[1] = 0x00; /* Request CEC data */
|
|
+
|
|
+ /*Build Initiator and Reciever Logical Address Byte*/
|
|
+ /*Initiator logical Address*/
|
|
+ i2c_buffer[2] = (unsigned char)(unit_table[instance].device_logical_address) & 0x0F;
|
|
+ i2c_buffer[2] = i2c_buffer[2] << 4;
|
|
+ /* Receiver logical Address*/
|
|
+ i2c_buffer[2] |= receiver_logical_address & 0x0F;
|
|
+
|
|
+ /* User Control Released */
|
|
+ i2c_buffer[3] = CEC_OPCODE_USER_CONTROL_RELEASED ;
|
|
+
|
|
+ /* CEC Data register */
|
|
+ err = set_cec_hw_registers(p_dis, E_REG_CDR0, i2c_buffer, 4);
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+ /* Save Datas of the CEC message send */
|
|
+ gtmdl_hdmi_cec_driver_save_message.address_byte = i2c_buffer[2];
|
|
+ gtmdl_hdmi_cec_driver_save_message.message_type_polling = 0;
|
|
+ gtmdl_hdmi_cec_driver_save_message.opcode = i2c_buffer[3];
|
|
+
|
|
+ return(0);
|
|
+}
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \fn tmErrorCode_t dlHdmiCecGiveDevicePowerStatus( )
|
|
+ * \brief This message is used to determine the current power status of a
|
|
+ * target device
|
|
+ *
|
|
+ * \param tmInstance_t Instance \n
|
|
+ * Instance identifier. \n
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ *
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_give_device_power_status
|
|
+(
|
|
+ instance_t instance,
|
|
+ u8 receiver_logical_address
|
|
+)
|
|
+{
|
|
+ error_code_t err;
|
|
+ unsigned char i2c_buffer[4] ; /* I2C data buffer */
|
|
+ /* Pointer to Device Instance Structure */
|
|
+ dl_hdmi_cec_driver_config_table_t *p_dis;
|
|
+
|
|
+ /* check if instance number is in range */
|
|
+ RETIF((instance < 0) || (instance >= MAX_UNITS), ERR_DLHDMICEC_BAD_INSTANCE)
|
|
+
|
|
+ /* check if unit corresponding to instance is opened */
|
|
+ RETIF(unit_table[instance].opened == false, ERR_DLHDMICEC_RESOURCE_NOT_OWNED)
|
|
+
|
|
+ /* check if instance state is correct */
|
|
+ /*RETIF(UnitTable[Instance].state != STATE_NOT_INITIALIZED, ERR_DLHDMICEC_INVALID_STATE) */
|
|
+
|
|
+ p_dis = >mdl_hdmi_cec_driver_config_table[instance];
|
|
+
|
|
+ /*======To do : make a prepare message function with parameter */
|
|
+ /* Give Device power Status Power Status command */
|
|
+ i2c_buffer[0] = 0x04; /* Param number */
|
|
+
|
|
+ i2c_buffer[1] = 0x00; /* Request CEC data */
|
|
+
|
|
+ /*Build Initiator and Reciever Logical Address Byte*/
|
|
+ /*Initiator logical Address*/
|
|
+ i2c_buffer[2] = (unsigned char)(unit_table[instance].device_logical_address) & 0x0F;
|
|
+ i2c_buffer[2] = i2c_buffer[2] << 4;
|
|
+ /* Receiver logical Address*/
|
|
+ i2c_buffer[2] |= receiver_logical_address & 0x0F;
|
|
+
|
|
+ /* Give Device Power Status */
|
|
+ i2c_buffer[3] = CEC_OPCODE_GIVE_DEVICE_POWER_STATUS ;
|
|
+
|
|
+ /* CEC Data register */
|
|
+ err = set_cec_hw_registers(p_dis, E_REG_CDR0, i2c_buffer, 4);
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+ /* Save Datas of the CEC message send */
|
|
+ gtmdl_hdmi_cec_driver_save_message.address_byte = i2c_buffer[2];
|
|
+ gtmdl_hdmi_cec_driver_save_message.message_type_polling = 0;
|
|
+ gtmdl_hdmi_cec_driver_save_message.opcode = i2c_buffer[3];
|
|
+
|
|
+ return(0);
|
|
+}
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \fn tmErrorCode_t dlHdmiCecReportPowerStatus( )
|
|
+ * \brief This message is used to inform a requesting device of the current
|
|
+ * power status.
|
|
+ *
|
|
+ * \param tmInstance_t Instance \n
|
|
+ * Instance identifier. \n
|
|
+ *
|
|
+ * \param dlHdmiCECPowerStatus_t PowerStatus \n
|
|
+ * Current power status. \n
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ * - ERR_DLHDMICEC_BAD_PARAMETER: a parameter is invalid or out
|
|
+ * of range
|
|
+ *
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_report_power_status
|
|
+(
|
|
+ instance_t instance,
|
|
+ u8 receiver_logical_address,
|
|
+ dl_hdmi_cecpower_status_t power_status
|
|
+)
|
|
+{
|
|
+ error_code_t err;
|
|
+ unsigned char i2c_buffer[5] ; /* I2C data buffer */
|
|
+ /* Pointer to Device Instance Structure */
|
|
+ dl_hdmi_cec_driver_config_table_t *p_dis;
|
|
+
|
|
+ /* check if instance number is in range */
|
|
+ RETIF((instance < 0) || (instance >= MAX_UNITS), ERR_DLHDMICEC_BAD_INSTANCE)
|
|
+
|
|
+ /* check if unit corresponding to instance is opened */
|
|
+ RETIF(unit_table[instance].opened == false, ERR_DLHDMICEC_RESOURCE_NOT_OWNED)
|
|
+
|
|
+ /* check if instance state is correct */
|
|
+ /*RETIF(UnitTable[Instance].state != STATE_NOT_INITIALIZED, ERR_DLHDMICEC_INVALID_STATE) */
|
|
+
|
|
+ p_dis = >mdl_hdmi_cec_driver_config_table[instance];
|
|
+
|
|
+ /*======To do : make a prepare message function with parameter */
|
|
+ /* Report Power Status command */
|
|
+ i2c_buffer[0] = 0x05; /* Param number */
|
|
+
|
|
+ i2c_buffer[1] = 0x00; /* Request CEC data */
|
|
+
|
|
+ /*Build Initiator and Reciever Logical Address Byte*/
|
|
+ /*Initiator logical Address*/
|
|
+ i2c_buffer[2] = (unsigned char)(unit_table[instance].device_logical_address) & 0x0F;
|
|
+ i2c_buffer[2] = i2c_buffer[2] << 4;
|
|
+ /* Receiver logical Address*/
|
|
+ i2c_buffer[2] |= receiver_logical_address & 0x0F;
|
|
+
|
|
+ /* Report Power Status*/
|
|
+ i2c_buffer[3] = CEC_OPCODE_REPORT_POWER_STATUS ;
|
|
+ i2c_buffer[4] = power_status; /* Power Status*/
|
|
+
|
|
+ /* CEC Data register */
|
|
+ err = set_cec_hw_registers(p_dis, E_REG_CDR0, i2c_buffer, 5);
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+ /* Save Datas of the CEC message send */
|
|
+ gtmdl_hdmi_cec_driver_save_message.address_byte = i2c_buffer[2];
|
|
+ gtmdl_hdmi_cec_driver_save_message.message_type_polling = 0;
|
|
+ gtmdl_hdmi_cec_driver_save_message.opcode = i2c_buffer[3];
|
|
+
|
|
+ return(0);
|
|
+}
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \fn tmErrorCode_t dlHdmiCecFeatureAbort()
|
|
+ * \brief This message is used as a reponse to indicate that the device does
|
|
+ * not support the requested message type, or that it cannot execute it
|
|
+ * at the present time.
|
|
+ *
|
|
+ * \param tmInstance_t Instance \n
|
|
+ * Instance identifier. \n
|
|
+ *
|
|
+ * \param dlHdmiCECFeatureOpcode_t FeatureOpcode \n
|
|
+ * Opcode of the aborted message. \n
|
|
+ *
|
|
+ * \param dlHdmiCECAbortReason_t AbortReason \n
|
|
+ * The reason why message cannot respond. \n
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_BAD_PARAMETER: a parameter is invalid or out
|
|
+ * of range
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_feature_abort
|
|
+(
|
|
+ instance_t instance,
|
|
+ u8 receiver_logical_address,
|
|
+ dl_hdmi_cecfeature_opcode_t feature_opcode,
|
|
+ dl_hdmi_cecabort_reason_t abort_reason
|
|
+)
|
|
+{
|
|
+ error_code_t err;
|
|
+ unsigned char i2c_buffer[6] ; /* I2C data buffer */
|
|
+ /* Pointer to Device Instance Structure */
|
|
+ dl_hdmi_cec_driver_config_table_t *p_dis;
|
|
+
|
|
+ /* check if instance number is in range */
|
|
+ RETIF((instance < 0) || (instance >= MAX_UNITS), ERR_DLHDMICEC_BAD_INSTANCE)
|
|
+
|
|
+ /* check if unit corresponding to instance is opened */
|
|
+ RETIF(unit_table[instance].opened == false, ERR_DLHDMICEC_RESOURCE_NOT_OWNED)
|
|
+
|
|
+ /* check if instance state is correct */
|
|
+ /*RETIF(UnitTable[Instance].state != STATE_NOT_INITIALIZED, ERR_DLHDMICEC_INVALID_STATE) */
|
|
+
|
|
+ p_dis = >mdl_hdmi_cec_driver_config_table[instance];
|
|
+
|
|
+ /*======To do : make a prepare message function with parameter */
|
|
+ /* Feature Abort command */
|
|
+ i2c_buffer[0] = 0x06; /* Param number */
|
|
+
|
|
+ i2c_buffer[1] = 0x00; /* Request CEC data */
|
|
+
|
|
+ /*Build Initiator and Reciever Logical Address Byte*/
|
|
+ /*Initiator logical Address*/
|
|
+ i2c_buffer[2] = (unsigned char)(unit_table[instance].device_logical_address) & 0x0F;
|
|
+ i2c_buffer[2] = i2c_buffer[2] << 4;
|
|
+ /* Receiver logical Address*/
|
|
+ i2c_buffer[2] |= receiver_logical_address & 0x0F;
|
|
+
|
|
+ i2c_buffer[3] = CEC_OPCODE_FEATURE_ABORT ; /* Feature Abort*/
|
|
+ i2c_buffer[4] = feature_opcode; /* Feature Opcode*/
|
|
+ i2c_buffer[5] = abort_reason; /* Abort Reason*/
|
|
+
|
|
+ /* CEC Data register */
|
|
+ err = set_cec_hw_registers(p_dis, E_REG_CDR0, i2c_buffer, 6);
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+ /* Save Datas of the CEC message send */
|
|
+ gtmdl_hdmi_cec_driver_save_message.address_byte = i2c_buffer[2];
|
|
+ gtmdl_hdmi_cec_driver_save_message.message_type_polling = 0;
|
|
+ gtmdl_hdmi_cec_driver_save_message.opcode = i2c_buffer[3];
|
|
+
|
|
+ return(0);
|
|
+}
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \fn tmErrorCode_t dlHdmiCecGetCecVersion( )
|
|
+ * \brief This message is used by a device to enquire which version of CEC
|
|
+ * the target supports
|
|
+ *
|
|
+ * \param tmInstance_t Instance \n
|
|
+ * Instance identifier. \n
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ *
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_get_cec_version
|
|
+(
|
|
+ instance_t instance,
|
|
+ u8 receiver_logical_address
|
|
+)
|
|
+{
|
|
+ error_code_t err;
|
|
+ unsigned char i2c_buffer[4] ; /* I2C data buffer */
|
|
+ /* Pointer to Device Instance Structure */
|
|
+ dl_hdmi_cec_driver_config_table_t *p_dis;
|
|
+
|
|
+ /* check if instance number is in range */
|
|
+ RETIF((instance < 0) || (instance >= MAX_UNITS), ERR_DLHDMICEC_BAD_INSTANCE)
|
|
+
|
|
+ /* check if unit corresponding to instance is opened */
|
|
+ RETIF(unit_table[instance].opened == false, ERR_DLHDMICEC_RESOURCE_NOT_OWNED)
|
|
+
|
|
+ /* check if instance state is correct */
|
|
+ /*RETIF(UnitTable[Instance].state != STATE_NOT_INITIALIZED, ERR_DLHDMICEC_INVALID_STATE) */
|
|
+
|
|
+ p_dis = >mdl_hdmi_cec_driver_config_table[instance];
|
|
+
|
|
+ /*======To do : make a prepare message function with parameter */
|
|
+ /* Get CEC Version command */
|
|
+ i2c_buffer[0] = 0x04; /* Param number */
|
|
+
|
|
+ i2c_buffer[1] = 0x00; /* Request CEC data */
|
|
+
|
|
+ /*Build Initiator and Reciever Logical Address Byte*/
|
|
+ /*Initiator logical Address*/
|
|
+ i2c_buffer[2] = (unsigned char)(unit_table[instance].device_logical_address) & 0x0F;
|
|
+ i2c_buffer[2] = i2c_buffer[2] << 4;
|
|
+ /* Receiver logical Address*/
|
|
+ i2c_buffer[2] |= receiver_logical_address & 0x0F;
|
|
+
|
|
+ i2c_buffer[3] = CEC_OPCODE_GET_CEC_VERSION ; /* Get CEC Version*/
|
|
+
|
|
+ /* CEC Data register */
|
|
+ err = set_cec_hw_registers(p_dis, E_REG_CDR0, i2c_buffer, 4);
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+ /* Save Datas of the CEC message send */
|
|
+ gtmdl_hdmi_cec_driver_save_message.address_byte = i2c_buffer[2];
|
|
+ gtmdl_hdmi_cec_driver_save_message.message_type_polling = 0;
|
|
+ gtmdl_hdmi_cec_driver_save_message.opcode = i2c_buffer[3];
|
|
+
|
|
+ return(0);
|
|
+}
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \fn tmErrorCode_t dlHdmiCecAbortMessage( )
|
|
+ * \brief This message is reserved for testing purposes
|
|
+ *
|
|
+ * \param tmInstance_t Instance \n
|
|
+ * Instance identifier. \n
|
|
+ *
|
|
+ * \param u8 ReceiverLogicalAddress\n
|
|
+ * Address of message receiver. \n
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ *
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_abort_message
|
|
+(
|
|
+ instance_t instance,
|
|
+ u8 receiver_logical_address
|
|
+)
|
|
+{
|
|
+ error_code_t err;
|
|
+ unsigned char i2c_buffer[4] ; /* I2C data buffer */
|
|
+ /* Pointer to Device Instance Structure */
|
|
+ dl_hdmi_cec_driver_config_table_t *p_dis;
|
|
+
|
|
+ /* check if instance number is in range */
|
|
+ RETIF((instance < 0) || (instance >= MAX_UNITS), ERR_DLHDMICEC_BAD_INSTANCE)
|
|
+
|
|
+ /* check if unit corresponding to instance is opened */
|
|
+ RETIF(unit_table[instance].opened == false, ERR_DLHDMICEC_RESOURCE_NOT_OWNED)
|
|
+
|
|
+ /* check if instance state is correct */
|
|
+ /*RETIF(UnitTable[Instance].state != STATE_NOT_INITIALIZED, ERR_DLHDMICEC_INVALID_STATE) */
|
|
+
|
|
+ p_dis = >mdl_hdmi_cec_driver_config_table[instance];
|
|
+
|
|
+ /*======To do : make a prepare message function with parameter */
|
|
+ /* CEC Abort Message command */
|
|
+ i2c_buffer[0] = 0x04; /* Param number */
|
|
+
|
|
+ i2c_buffer[1] = 0x00; /* Request CEC data */
|
|
+
|
|
+ /*Build Initiator and Reciever Logical Address Byte*/
|
|
+ /*Initiator logical Address*/
|
|
+ i2c_buffer[2] = (unsigned char)(unit_table[instance].device_logical_address) & 0x0F;
|
|
+ i2c_buffer[2] = i2c_buffer[2] << 4;
|
|
+ /* Receiver logical Address*/
|
|
+ i2c_buffer[2] |= receiver_logical_address & 0x0F;
|
|
+
|
|
+ i2c_buffer[3] = CEC_OPCODE_ABORT_MESSAGE ; /* Message Abort*/
|
|
+
|
|
+ /* CEC Data register */
|
|
+ err = set_cec_hw_registers(p_dis, E_REG_CDR0, i2c_buffer, 4);
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+ /* Save Datas of the CEC message send */
|
|
+ gtmdl_hdmi_cec_driver_save_message.address_byte = i2c_buffer[2];
|
|
+ gtmdl_hdmi_cec_driver_save_message.message_type_polling = 0;
|
|
+ gtmdl_hdmi_cec_driver_save_message.opcode = i2c_buffer[3];
|
|
+
|
|
+ return(0);
|
|
+}
|
|
+
|
|
+/*Non Functional function used to provide easy way to access register */
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \fn tmErrorCode_t dlHdmiCecGetRegister( )
|
|
+ * \brief Setup the instance with its configuration parameters. This function
|
|
+ * allows basic instance configuration for CEC Stack Processor.
|
|
+ *
|
|
+ * \param instance Instance identifier.
|
|
+ * \param pSetupInfo Pointer to the structure containing all setup parameters
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_PARAMETER: a parameter is invalid or out
|
|
+ * of range
|
|
+ * - ERR_DLHDMICEC_INCONSISTENT_PARAMS: an input parameter is
|
|
+ * inconsistent
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ *
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+unsigned char dl_hdmi_cec_get_register
|
|
+(
|
|
+ instance_t instance,
|
|
+ u32 offset
|
|
+)
|
|
+{
|
|
+ error_code_t err;
|
|
+ /* Pointer to Device Instance Structure */
|
|
+ dl_hdmi_cec_driver_config_table_t *p_dis;
|
|
+ unsigned char i2c_read_buffer[1];
|
|
+
|
|
+ /* check if instance number is in range */
|
|
+ RETIF((instance < 0) || (instance >= MAX_UNITS), 0xFF)
|
|
+
|
|
+ /* check if unit corresponding to instance is opened */
|
|
+ RETIF(unit_table[instance].opened == false, 0xFF)
|
|
+
|
|
+ /* Ckeck the state */
|
|
+ /*RETIF(UnitTable[instance].state != CEC_STATE_NOT_INITIALIZED, ERR_DLHDMICEC_INVALID_STATE) */
|
|
+
|
|
+ p_dis = >mdl_hdmi_cec_driver_config_table[instance];
|
|
+
|
|
+ err = get_cec_hw_registers(p_dis, (u8) offset, i2c_read_buffer, 1);
|
|
+ RETIF(err != 0, 0xff)
|
|
+
|
|
+ return(i2c_read_buffer[0]);
|
|
+}
|
|
+
|
|
+/*QB 10 Jan ========================================================================== */
|
|
+/*!
|
|
+ * \fn tmErrorCode_t dlHdmiCecSetRegister( )
|
|
+ * \brief Setup the instance with its configuration parameters. This function
|
|
+ * allows basic instance configuration for CEC Stack Processor.
|
|
+ *
|
|
+ * \param instance Instance identifier.
|
|
+ * \param pSetupInfo Pointer to the structure containing all setup parameters
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_PARAMETER: a parameter is invalid or out
|
|
+ * of range
|
|
+ * - ERR_DLHDMICEC_INCONSISTENT_PARAMS: an input parameter is
|
|
+ * inconsistent
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ *
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_set_register
|
|
+(
|
|
+ instance_t instance,
|
|
+ u32 offset,
|
|
+ u32 value
|
|
+)
|
|
+{
|
|
+ error_code_t err;
|
|
+ /* Pointer to Device Instance Structure */
|
|
+ dl_hdmi_cec_driver_config_table_t *p_dis;
|
|
+
|
|
+ /* check if instance number is in range */
|
|
+ RETIF((instance < 0) || (instance >= MAX_UNITS), ERR_DLHDMICEC_BAD_INSTANCE)
|
|
+
|
|
+ /* check if unit corresponding to instance is opened */
|
|
+ RETIF(unit_table[instance].opened == false, ERR_DLHDMICEC_RESOURCE_NOT_OWNED)
|
|
+
|
|
+ /* Ckeck the state */
|
|
+ /*RETIF(UnitTable[instance].state != CEC_STATE_NOT_INITIALIZED, ERR_DLHDMICEC_INVALID_STATE) */
|
|
+
|
|
+ p_dis = >mdl_hdmi_cec_driver_config_table[instance];
|
|
+
|
|
+ err = set_cec_hw_register(p_dis, (u8) offset, (u8)value);
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+ return(0);
|
|
+}
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \brief Set the power state of an instance of the CEC device. ON
|
|
+ * state corresponds to a fully supplied, up and running device. Other
|
|
+ * modes correspond to the powerdown state of the device.
|
|
+ * This function is synchronous.
|
|
+ * This function is not ISR friendly.
|
|
+ *
|
|
+ * \param instance Instance identifier.
|
|
+ * \param powerState Power state to set.
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_BAD_PARAMETER: a parameter is invalid or out
|
|
+ * of range
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_set_power_state
|
|
+(
|
|
+ instance_t instance,
|
|
+ power_state_t power_state
|
|
+)
|
|
+{
|
|
+ error_code_t err = 0;
|
|
+
|
|
+#ifdef TMFL_TDA9989
|
|
+ unsigned char i2c_read_buffer[1];
|
|
+
|
|
+ dl_hdmi_cec_driver_config_table_t *p_dis;
|
|
+
|
|
+ p_dis = >mdl_hdmi_cec_driver_config_table[instance];
|
|
+
|
|
+ /* check if instance number is in range */
|
|
+ RETIF((instance < 0) || (instance >= MAX_UNITS), ERR_DLHDMICEC_BAD_INSTANCE)
|
|
+
|
|
+ if(power_state == power_on) {
|
|
+
|
|
+ err = get_cec_hw_registers(p_dis, E_REG_ENAMODS, i2c_read_buffer, 1);
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+ i2c_read_buffer[0] |= DEFAULT_ENAMODS;
|
|
+
|
|
+ err = set_cec_hw_register(p_dis, E_REG_ENAMODS, i2c_read_buffer[0]);
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+ } else if(power_state == power_standby) {
|
|
+
|
|
+ err = get_cec_hw_registers(p_dis, E_REG_ENAMODS, i2c_read_buffer, 1);
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+ i2c_read_buffer[0] &= ~(DEFAULT_ENAMODS);
|
|
+
|
|
+ err = set_cec_hw_register(p_dis, E_REG_ENAMODS, i2c_read_buffer[0]);
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+ unit_table[instance].state = CEC_STATE_NOT_INITIALIZED;
|
|
+
|
|
+ } else {
|
|
+ return ERR_DLHDMICEC_BAD_PARAMETER;
|
|
+ }
|
|
+
|
|
+#endif /* TMFL_TDA9989 */
|
|
+
|
|
+ return err;
|
|
+}
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \brief Get the power state of an instance of the CEC device. ON
|
|
+ * state corresponds to a fully supplied, up and running device. Other
|
|
+ * modes correspond to the powerdown state of the device.
|
|
+ * This function is synchronous.
|
|
+ * This function is not ISR friendly.
|
|
+ *
|
|
+ * \param instance Instance identifier.
|
|
+ * \param pPowerState Pointer to the power state.
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_BAD_PARAMETER: a parameter is invalid or out
|
|
+ * of range
|
|
+ * - ERR_DLHDMICEC_INCONSISTENT_PARAMS: an input parameter is
|
|
+ * inconsistent
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_get_power_state
|
|
+(
|
|
+ instance_t instance,
|
|
+ power_state_t *p_power_state
|
|
+)
|
|
+{
|
|
+ error_code_t err = 0;
|
|
+
|
|
+#ifdef TMFL_TDA9989
|
|
+
|
|
+ unsigned char i2c_read_buffer[1];
|
|
+
|
|
+ dl_hdmi_cec_driver_config_table_t *p_dis;
|
|
+
|
|
+ p_dis = >mdl_hdmi_cec_driver_config_table[instance];
|
|
+
|
|
+ /* check if instance number is in range */
|
|
+ RETIF((instance < 0) || (instance >= MAX_UNITS), ERR_DLHDMICEC_BAD_INSTANCE)
|
|
+
|
|
+ if(p_power_state == NULL) return ERR_DLHDMICEC_BAD_PARAMETER;
|
|
+
|
|
+ err = get_cec_hw_registers(p_dis, E_REG_ENAMODS, i2c_read_buffer, 1);
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+ if((i2c_read_buffer[0] & DEFAULT_ENAMODS) == DEFAULT_ENAMODS) {
|
|
+ *p_power_state = power_on;
|
|
+ } else {
|
|
+ *p_power_state = power_standby;
|
|
+ }
|
|
+
|
|
+#endif /* TMFL_TDA9989 */
|
|
+
|
|
+ return err;
|
|
+
|
|
+}
|
|
+
|
|
+/*========================================================================== */
|
|
+/*!
|
|
+ * \brief This function allow to send a generic CEC message
|
|
+ * This function has to be used when CEC messages are construct in
|
|
+ * the middleware
|
|
+ *
|
|
+ * \param instance Instance identifier.
|
|
+ *
|
|
+ * \param *pData Pointer to the CEC data buffer
|
|
+ *
|
|
+ * \param lenData Lenght of I2C data buffer
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMICEC_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMICEC_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ * - ERR_DLHDMICEC_INCONSISTENT_PARAMS: an input parameter is
|
|
+ * inconsistent
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_send_message(
|
|
+
|
|
+ instance_t instance,
|
|
+ u8 *p_data,
|
|
+ u16 len_data
|
|
+)
|
|
+{
|
|
+
|
|
+ error_code_t err = 0;
|
|
+
|
|
+#ifdef TMFL_TDA9989
|
|
+
|
|
+ unsigned char i2c_buffer[19] ; /* I2C data buffer */
|
|
+ unsigned char loci; /* Local increment variable*/
|
|
+ unsigned char mess_length; /* Local Message length*/
|
|
+
|
|
+ /* Pointer to Device Instance Structure */
|
|
+ dl_hdmi_cec_driver_config_table_t *p_dis;
|
|
+
|
|
+ /* check if instance number is in range */
|
|
+ RETIF((instance < 0) || (instance >= MAX_UNITS), ERR_DLHDMICEC_BAD_INSTANCE)
|
|
+
|
|
+ /* check if unit corresponding to instance is opened */
|
|
+ RETIF(unit_table[instance].opened == false, ERR_DLHDMICEC_RESOURCE_NOT_OWNED)
|
|
+
|
|
+ /* check if CEC message is not too long */
|
|
+ RETIF((len_data > 16), ERR_DLHDMICEC_INCONSISTENT_PARAMS)
|
|
+
|
|
+ p_dis = >mdl_hdmi_cec_driver_config_table[instance];
|
|
+
|
|
+ /* Calculate Internal Message length*/
|
|
+ /* real data is less ReceiverLogical address */
|
|
+ mess_length = (len_data - 1) + 3;
|
|
+
|
|
+ i2c_buffer[0] = mess_length; /* Param number */
|
|
+
|
|
+ i2c_buffer[1] = 0x00; /* Request CEC data */
|
|
+
|
|
+ /*Build Initiator and Reciever Logical Address Byte*/
|
|
+ /*Initiator logical Address*/
|
|
+ i2c_buffer[2] = (unsigned char)(unit_table[instance].device_logical_address) & 0x0F;
|
|
+ i2c_buffer[2] = i2c_buffer[2] << 4;
|
|
+ i2c_buffer[2] |= p_data[0] & 0x0F;
|
|
+
|
|
+ for(loci = 0; loci <= len_data ; loci++) {
|
|
+ /* Fill Table with Data from middleware, Data begin at position 1*/
|
|
+ i2c_buffer[(loci+3)] = p_data[(loci+1)];
|
|
+ }
|
|
+
|
|
+ /* CEC Data register */
|
|
+ err = set_cec_hw_registers(p_dis, E_REG_CDR0, i2c_buffer, mess_length);
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+ /* Save Datas of the CEC message send */
|
|
+ gtmdl_hdmi_cec_driver_save_message.address_byte = p_data[2];
|
|
+ gtmdl_hdmi_cec_driver_save_message.message_type_polling = 0;
|
|
+ gtmdl_hdmi_cec_driver_save_message.opcode = p_data[3];
|
|
+
|
|
+#endif /* TMFL_TDA9989 */
|
|
+
|
|
+ return err;
|
|
+
|
|
+}
|
|
+
|
|
+/*========================================================================== */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_enable_calibration(instance_t instance, dl_hdmi_cec_clock_source_t cec_clock_source)
|
|
+{
|
|
+ error_code_t err = 0;
|
|
+
|
|
+#ifdef TMFL_TDA9989
|
|
+
|
|
+ unsigned char i2c_read_buffer[1];
|
|
+ dl_hdmi_cec_driver_config_table_t *p_dis;
|
|
+
|
|
+ p_dis = >mdl_hdmi_cec_driver_config_table[instance];
|
|
+
|
|
+ /* check if instance number is in range */
|
|
+ RETIF((instance < 0) || (instance >= MAX_UNITS), ERR_DLHDMICEC_BAD_INSTANCE)
|
|
+
|
|
+ /* CLOCK SOURCE is FRO */
|
|
+ if(cec_clock_source == DL_HDMICEC_CLOCK_FRO) {
|
|
+
|
|
+ /* cf PR1795 set desired frequency to 12 Mhz*/
|
|
+
|
|
+ dl_hdmi_cec_set_register(instance, 0xF3, 0xC0);
|
|
+
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+ dl_hdmi_cec_set_register(instance, 0xF4, 0xD4);
|
|
+
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+ /* set calibration in automatic mode */
|
|
+ err = get_cec_hw_registers(p_dis, E_REG_CEC_DES_FREQ2, i2c_read_buffer, 1);
|
|
+ RETIF(err != 0, err)
|
|
+ i2c_read_buffer[0] &= CEC_AUTOMATIC_CALIBRATION_MSK;
|
|
+ err = set_cec_hw_register(p_dis, E_REG_CEC_DES_FREQ2, i2c_read_buffer[0]);
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+ /* select FRO clock mode, osc_freq shall be also set to one */
|
|
+ i2c_read_buffer[0] = CEC_SELECT_FRO_CLOCK_SOURCE;
|
|
+ err = set_cec_hw_register(p_dis, E_REG_CEC_CLK, i2c_read_buffer[0]);
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+ /* Enable cec_clk AND FRO */
|
|
+ err = get_cec_hw_registers(p_dis, E_REG_ENAMODS, i2c_read_buffer, 1);
|
|
+ RETIF(err != 0, err)
|
|
+ i2c_read_buffer[0] |= CEC_ENABLE_CEC_CLK_MSK;
|
|
+ i2c_read_buffer[0] &= CEC_ENABLE_FRO_MSK;
|
|
+ err = set_cec_hw_register(p_dis, E_REG_ENAMODS, i2c_read_buffer[0]);
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+ /* Enable calibration */
|
|
+ i2c_read_buffer[0] = CEC_ENABLE_CALIBRATION;
|
|
+ err = set_cec_hw_register(p_dis, E_REG_CEC_CAL_XOSC_CTRL1, i2c_read_buffer[0]);
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+ } /* CLOCK SOURCE is FRO */
|
|
+
|
|
+#endif /* TMFL_TDA9989 */
|
|
+
|
|
+ return err;
|
|
+}
|
|
+
|
|
+/*========================================================================== */
|
|
+/*========================================================================== */
|
|
+error_code_t dl_hdmi_cec_disable_calibration(instance_t instance)
|
|
+{
|
|
+ error_code_t err = 0;
|
|
+
|
|
+#ifdef TMFL_TDA9989
|
|
+
|
|
+ unsigned char i2c_read_buffer[1];
|
|
+ dl_hdmi_cec_driver_config_table_t *p_dis;
|
|
+
|
|
+ p_dis = >mdl_hdmi_cec_driver_config_table[instance];
|
|
+
|
|
+ /* check if instance number is in range */
|
|
+ RETIF((instance < 0) || (instance >= MAX_UNITS), ERR_DLHDMICEC_BAD_INSTANCE)
|
|
+
|
|
+ /* Disable calibration */
|
|
+ i2c_read_buffer[0] = CEC_DISABLE_CALIBRATION;
|
|
+ err = set_cec_hw_register(p_dis, E_REG_CEC_CAL_XOSC_CTRL1, i2c_read_buffer[0]);
|
|
+ RETIF(err != 0, err)
|
|
+
|
|
+#endif /* TMFL_TDA9989 */
|
|
+
|
|
+ return err;
|
|
+}
|
|
+
|
|
+/*============================================================================*/
|
|
+/* END OF FILE */
|
|
+/*============================================================================*/
|
|
diff --git a/drivers/video/hdmi/comps/tmdlHdmiCEC/src/tmdlHdmiCEC_local.c b/drivers/video/hdmi/comps/tmdlHdmiCEC/src/tmdlHdmiCEC_local.c
|
|
new file mode 100755
|
|
index 0000000..c71fe68
|
|
--- /dev/null
|
|
+++ b/drivers/video/hdmi/comps/tmdlHdmiCEC/src/tmdlHdmiCEC_local.c
|
|
@@ -0,0 +1,286 @@
|
|
+/**
|
|
+ * Copyright (C) 2006 Koninklijke Philips Electronics N.V., All Rights Reserved.
|
|
+ * This source code and any compilation or derivative thereof is the proprietary
|
|
+ * information of Koninklijke Philips Electronics N.V. and is confidential in
|
|
+ * nature. Under no circumstances is this software to be exposed to or placed
|
|
+ * under an Open Source License of any type without the expressed written
|
|
+ * permission of Koninklijke Philips Electronics N.V.
|
|
+ *
|
|
+ * \file dlHdmiCEC_local.c
|
|
+ *
|
|
+ * \version $Revision: $
|
|
+ *
|
|
+ * \date $Date: $
|
|
+ *
|
|
+ * \brief dev lib driver component for the CEC messages
|
|
+ *
|
|
+ * \section refs Reference Documents
|
|
+ * \section info Change Information
|
|
+ *
|
|
+ * \verbatim
|
|
+ * $History: dlHdmiCEC_local.c $
|
|
+ *
|
|
+ * \endverbatim
|
|
+ *
|
|
+ * */
|
|
+
|
|
+/*============================================================================*/
|
|
+/* FILE CONFIGURATION */
|
|
+/*============================================================================*/
|
|
+
|
|
+/* Defining this symbol on the compiler command line excludes some API checks */
|
|
+/* #define NO_RETIF_BADPARAM */
|
|
+
|
|
+/*============================================================================*/
|
|
+/* STANDARD INCLUDE FILES */
|
|
+/*============================================================================*/
|
|
+
|
|
+/*============================================================================*/
|
|
+/* PROJECT INCLUDE FILES */
|
|
+/*============================================================================*/
|
|
+#ifdef __LINUX_ARM_ARCH__
|
|
+#include <linux/kernel.h>
|
|
+#else
|
|
+#include <string.h>
|
|
+#endif
|
|
+#include "tmdlHdmiCEC.h"
|
|
+#include "tmdlHdmiCEC_local.h"
|
|
+
|
|
+/*============================================================================*/
|
|
+/* MACRO DEFINITIONS */
|
|
+/*============================================================================*/
|
|
+
|
|
+/*============================================================================*/
|
|
+/* TYPE DEFINITIONS */
|
|
+/*============================================================================*/
|
|
+
|
|
+/*============================================================================*/
|
|
+/* PUBLIC VARIABLE DEFINITIONS */
|
|
+/*============================================================================*/
|
|
+
|
|
+/*============================================================================*/
|
|
+/* STATIC VARIABLE DECLARATIONS */
|
|
+/*============================================================================*/
|
|
+
|
|
+/**
|
|
+ * Lookup table to map an 8-bit mask to a number of left shifts
|
|
+ * needed to shift a value starting at bit 0 onto the mask.
|
|
+ * Indexed by mask 0-255. For example, mask 0x00 and 0x01 need
|
|
+ * no shift, mask 0x02 needs one shift, mask 0x03 needs no shift,
|
|
+ * mask 0x04 needs 2 shifts, etc.
|
|
+ * Rows were formatted by "HDMI Driver - Register List.xls" and pasted here
|
|
+ * */
|
|
+static CONST_DAT u8 k_mask_to_shift[256] = {
|
|
+ /* Mask index: */
|
|
+ /*x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF */
|
|
+ 0, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* 0x */
|
|
+ 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* 1x */
|
|
+ 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* 2x */
|
|
+ 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* 3x */
|
|
+ 6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* 4x */
|
|
+ 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* 5x */
|
|
+ 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* 6x */
|
|
+ 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* 7x */
|
|
+ 7, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* 8x */
|
|
+ 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* 9x */
|
|
+ 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* Ax */
|
|
+ 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* Bx */
|
|
+ 6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* Cx */
|
|
+ 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* Dx */
|
|
+ 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* Ex */
|
|
+ 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0 /* Fx */
|
|
+};
|
|
+
|
|
+/*============================================================================*/
|
|
+/* STATIC FUNCTION DECLARATIONS */
|
|
+/*============================================================================*/
|
|
+
|
|
+/*============================================================================*/
|
|
+/* PUBLIC FUNCTION DEFINITIONS */
|
|
+/*============================================================================*/
|
|
+
|
|
+/*============================================================================*/
|
|
+/* getCecHwRegisters */
|
|
+/*============================================================================*/
|
|
+error_code_t
|
|
+get_cec_hw_registers
|
|
+(
|
|
+ dl_hdmi_cec_driver_config_table_t *p_dis,
|
|
+ u8 reg_addr,
|
|
+ u8 *p_data,
|
|
+ u16 len_data
|
|
+)
|
|
+{
|
|
+ error_code_t err; /* Error code */
|
|
+ /* Arguments passed to system function */
|
|
+ dl_hdmi_cec_sys_args_t sys_args;
|
|
+
|
|
+ /* Get I2C register range - all non-OK results are errors */
|
|
+ sys_args.slave_addr = p_dis->i2c_address;
|
|
+ sys_args.first_register = reg_addr;
|
|
+ sys_args.len_data = (u8)len_data;
|
|
+ sys_args.p_data = p_data;
|
|
+ err = p_dis->i2c_read_function(&sys_args);
|
|
+ return (err == 0) ? 0 : ERR_DLHDMICEC_I2C_READ;
|
|
+}
|
|
+
|
|
+/*============================================================================*/
|
|
+/* getCecHwRegister */
|
|
+/*============================================================================*/
|
|
+error_code_t
|
|
+get_cec_hw_register
|
|
+(
|
|
+ dl_hdmi_cec_driver_config_table_t *p_dis,
|
|
+ u8 reg_addr,
|
|
+ u8 *p_reg_value
|
|
+)
|
|
+{
|
|
+ error_code_t err; /* Error code */
|
|
+ /* Arguments passed to system function */
|
|
+ dl_hdmi_cec_sys_args_t sys_args;
|
|
+
|
|
+ /* Get I2C register - all non-OK results are errors */
|
|
+ sys_args.slave_addr = p_dis->i2c_address;
|
|
+ sys_args.first_register = reg_addr;
|
|
+ sys_args.len_data = 1;
|
|
+ sys_args.p_data = p_reg_value;
|
|
+ err = p_dis->i2c_read_function(&sys_args);
|
|
+ return (err == 0) ? 0 : ERR_DLHDMICEC_I2C_READ;
|
|
+
|
|
+}
|
|
+
|
|
+/*============================================================================*/
|
|
+/* setCecHwRegisters */
|
|
+/*============================================================================*/
|
|
+error_code_t
|
|
+set_cec_hw_registers
|
|
+(
|
|
+ dl_hdmi_cec_driver_config_table_t *p_dis,
|
|
+ u8 reg_addr,
|
|
+ u8 *p_data,
|
|
+ u16 len_data
|
|
+)
|
|
+{
|
|
+ error_code_t err; /* Error code */
|
|
+ /* Arguments passed to system function */
|
|
+ dl_hdmi_cec_sys_args_t sys_args;
|
|
+
|
|
+ /* Write to I2C register range - all non-OK results are errors */
|
|
+ sys_args.slave_addr = p_dis->i2c_address;
|
|
+ sys_args.first_register = reg_addr;
|
|
+ sys_args.len_data = (u8)len_data;
|
|
+ sys_args.p_data = p_data;
|
|
+ err = p_dis->i2c_write_function(&sys_args);
|
|
+ return (err == 0) ? 0 : ERR_DLHDMICEC_I2C_WRITE;
|
|
+}
|
|
+
|
|
+/*============================================================================*/
|
|
+/* setCecHwRegisterMsbLsb */
|
|
+/*============================================================================*/
|
|
+error_code_t
|
|
+set_cec_hw_register_msb_lsb
|
|
+(
|
|
+ dl_hdmi_cec_driver_config_table_t *p_dis,
|
|
+ u8 reg_addr,
|
|
+ u16 reg_word
|
|
+)
|
|
+{
|
|
+ error_code_t err; /* Error code */
|
|
+ /* The bytes from regWord */
|
|
+ u8 msb_lsb[2];
|
|
+ /* Arguments passed to system function */
|
|
+ dl_hdmi_cec_sys_args_t sys_args;
|
|
+
|
|
+ /* Unpack regWord bytes, MSB first */
|
|
+ msb_lsb[0] = (u8)(reg_word >> 8);
|
|
+ msb_lsb[1] = (u8)(reg_word & 0xFF);
|
|
+
|
|
+ /* Write to I2C - all non-OK results are errors */
|
|
+ sys_args.slave_addr = p_dis->i2c_address;
|
|
+ sys_args.first_register = reg_addr;
|
|
+ sys_args.len_data = 2;
|
|
+ sys_args.p_data = &msb_lsb[0];
|
|
+ err = p_dis->i2c_write_function(&sys_args);
|
|
+ return (err == 0) ? 0 : ERR_DLHDMICEC_I2C_WRITE;
|
|
+}
|
|
+
|
|
+/*============================================================================*/
|
|
+/* setCecHwRegister */
|
|
+/*============================================================================*/
|
|
+error_code_t
|
|
+set_cec_hw_register
|
|
+(
|
|
+ dl_hdmi_cec_driver_config_table_t *p_dis,
|
|
+ u8 reg_addr,
|
|
+ u8 reg_value
|
|
+)
|
|
+{
|
|
+ error_code_t err; /* Error code */
|
|
+ /* Arguments passed to system function */
|
|
+ dl_hdmi_cec_sys_args_t sys_args;
|
|
+
|
|
+ /* Write to I2C - all non-OK results are errors */
|
|
+ sys_args.slave_addr = p_dis->i2c_address;
|
|
+ sys_args.first_register = reg_addr;
|
|
+ sys_args.len_data = 1;
|
|
+ sys_args.p_data = ®_value;
|
|
+ err = p_dis->i2c_write_function(&sys_args);
|
|
+ return (err == 0) ? 0 : ERR_DLHDMICEC_I2C_WRITE;
|
|
+}
|
|
+
|
|
+/*============================================================================*/
|
|
+/* setCecHwRegisterField */
|
|
+/*============================================================================*/
|
|
+error_code_t
|
|
+set_cec_hw_register_field
|
|
+(
|
|
+ dl_hdmi_cec_driver_config_table_t *p_dis,
|
|
+ u8 reg_addr,
|
|
+ u8 field_mask,
|
|
+ u8 field_value
|
|
+)
|
|
+{
|
|
+ error_code_t err; /* Error code */
|
|
+ /* The register's current value */
|
|
+ u8 reg_value;
|
|
+ /* Arguments passed to system function */
|
|
+ dl_hdmi_cec_sys_args_t sys_args;
|
|
+
|
|
+ /* Read I2C register value.
|
|
+ * All bitfield registers are either shadowed or can be read.
|
|
+ * */
|
|
+ sys_args.slave_addr = p_dis->i2c_address;
|
|
+ sys_args.first_register = reg_addr;
|
|
+ sys_args.len_data = 1;
|
|
+ sys_args.p_data = ®_value;
|
|
+ err = p_dis->i2c_read_function(&sys_args);
|
|
+ RETIF(err != 0, ERR_DLHDMICEC_I2C_READ)
|
|
+
|
|
+ /* Reset register bits that are set in the mask */
|
|
+ reg_value = reg_value & (u8)(~field_mask);
|
|
+
|
|
+ /* Shift the field value left to align its bits with the mask */
|
|
+ field_value <<= k_mask_to_shift[field_mask];
|
|
+
|
|
+ /* Reset shifted field bits that are not set in the mask */
|
|
+ field_value &= field_mask;
|
|
+
|
|
+ /* Set the shifted bitfield */
|
|
+ reg_value |= field_value;
|
|
+
|
|
+ /* Write to I2C - all non-OK results are errors */
|
|
+ sys_args.slave_addr = p_dis->i2c_address;
|
|
+ sys_args.first_register = reg_addr;
|
|
+ sys_args.len_data = 1;
|
|
+ sys_args.p_data = ®_value;
|
|
+ err = p_dis->i2c_write_function(&sys_args);
|
|
+ return (err == 0) ? 0 : ERR_DLHDMICEC_I2C_WRITE;
|
|
+}
|
|
+
|
|
+/*============================================================================*/
|
|
+/* STATIC FUNCTION DEFINTIONS */
|
|
+/*============================================================================*/
|
|
+
|
|
+/*============================================================================*/
|
|
+/* END OF FILE */
|
|
+/*============================================================================*/
|
|
diff --git a/drivers/video/hdmi/comps/tmdlHdmiCEC/src/tmdlHdmiCEC_local.h b/drivers/video/hdmi/comps/tmdlHdmiCEC/src/tmdlHdmiCEC_local.h
|
|
new file mode 100755
|
|
index 0000000..eb16cb6
|
|
--- /dev/null
|
|
+++ b/drivers/video/hdmi/comps/tmdlHdmiCEC/src/tmdlHdmiCEC_local.h
|
|
@@ -0,0 +1,208 @@
|
|
+/*============================================================================= */
|
|
+/* Copyright (C) 2007 NXP N.V., All Rights Reserved. */
|
|
+/* This source code and any compilation or derivative thereof is the proprietary */
|
|
+/* information of NXP N.V. and is confidential in nature. Under no circumstances */
|
|
+/* is this software to be exposed to or placed under an Open Source License of */
|
|
+/* any type without the expressed written permission of NXP N.V. */
|
|
+/*============================================================================= */
|
|
+/*!
|
|
+ * \file dlHdmiCEC_local.h
|
|
+ *
|
|
+ * \version 1.0
|
|
+ *
|
|
+ * \date 24/07/2007
|
|
+ *
|
|
+ * \brief devlib driver component API for the CEC messages.
|
|
+ *
|
|
+ * \section refs Reference Documents
|
|
+ * TDA998X Driver - tx - SCS.doc
|
|
+ * \note None.
|
|
+ *
|
|
+ * HISTORY :
|
|
+ * \verbatim
|
|
+ * Date Modified by CRPRNr TASKNr Maintenance description
|
|
+ * -------------|-----------|-------|-------|-----------------------------------
|
|
+ * 24/07/2007 | F.G | | | Creation.
|
|
+ * -------------|-----------|-------|-------|-----------------------------------
|
|
+ * \endverbatim
|
|
+ * */
|
|
+/*========================================================================== */
|
|
+
|
|
+#ifndef DLHDMICEC_LOCAL_H
|
|
+#define DLHDMICEC_LOCAL_H
|
|
+
|
|
+/*============================================================================*/
|
|
+/* INCLUDE FILES */
|
|
+/*============================================================================*/
|
|
+/*#include "dlHdmiCEC_IW.h" */
|
|
+#include "tmdlHdmiCEC_cfg.h"
|
|
+
|
|
+/*============================================================================*/
|
|
+/* MACRO DEFINITIONS */
|
|
+/*============================================================================*/
|
|
+
|
|
+/* Version of the SW driver */
|
|
+#define VERSION_COMPATIBILITY 0
|
|
+#define VERSION_MAJOR 1
|
|
+#define VERSION_MINOR 4
|
|
+
|
|
+/**
|
|
+ * A macro to check a condition and if true return a result
|
|
+ * */
|
|
+#define RETIF(cond, rslt) if ((cond)){return (rslt);}
|
|
+
|
|
+/**
|
|
+ * A macro to check a condition and if true return
|
|
+ * ERR_HDMI_BAD_PARAMETER.
|
|
+ * To save code space, it can be compiled out by defining NO_RETIF_BADPARAM on
|
|
+ * the compiler command line.
|
|
+ * */
|
|
+#ifdef NO_RETIF_BADPARAM
|
|
+#define RETIF_BADPARAM(cond)
|
|
+#else
|
|
+#define RETIF_BADPARAM(cond) if ((cond)){return ERR_HDMI_BAD_PARAMETER;}
|
|
+#endif
|
|
+
|
|
+/**
|
|
+ * A macro to check the result of a register API and if not 0 to return it.
|
|
+ * To save code space, it can be compiled out by defining NO_RETIF_REG_FAIL on
|
|
+ * the compiler command line.
|
|
+ * */
|
|
+#ifdef NO_RETIF_REG_FAIL
|
|
+#define RETIF_REG_FAIL(result)
|
|
+#else
|
|
+#define RETIF_REG_FAIL(result) if ((result) != TM_OK){return (result);}
|
|
+#endif
|
|
+
|
|
+#define TDA9950_RESET_DELAY_MS 250
|
|
+
|
|
+/*============================================================================*/
|
|
+/* ENUM OR TYPE DEFINITIONS */
|
|
+/*============================================================================*/
|
|
+
|
|
+#ifdef TMFL_TDA9989
|
|
+
|
|
+#define E_REG_ENAMODS 0xFF
|
|
+#define E_REG_CEC_CLK 0xF6
|
|
+#define E_REG_CEC_INT 0xEE
|
|
+#define E_REG_COMBI_INT 0xEC
|
|
+#define DEFAULT_ENAMODS 0x81
|
|
+#define CEC_CLK_SEL 0xE6
|
|
+#define CEC_INT_MASK 0x01
|
|
+
|
|
+#define E_REG_CEC_CAL_XOSC_CTRL1 0xF2
|
|
+#define E_REG_CEC_DES_FREQ2 0xF5
|
|
+
|
|
+#define CEC_AUTOMATIC_CALIBRATION_MSK 0x7F
|
|
+#define CEC_SELECT_FRO_CLOCK_SOURCE 0x11
|
|
+#define CEC_ENABLE_CEC_CLK_MSK 0x80
|
|
+#define CEC_ENABLE_FRO_MSK 0xBF
|
|
+#define CEC_ENABLE_CALIBRATION 0x01
|
|
+#define CEC_DISABLE_CALIBRATION 0x00
|
|
+
|
|
+#endif /* TMFL_TDA9989 */
|
|
+
|
|
+/*!
|
|
+ * \enum CEC Stack Processor Regsiters
|
|
+ * \brief The CSP is controlled via a series of registers
|
|
+ * */
|
|
+
|
|
+enum _e_reg {
|
|
+ E_REG_APR = 0x00, /*!< Address Pointer Regsiter (Write) */
|
|
+ E_REG_CSR = 0x00, /*!< CSP Status Register (Read) */
|
|
+ E_REG_CER = 0x01, /*!< CSP Error Register (Read) */
|
|
+ E_REG_CVR = 0x02, /*!< CSP Version Register(Read) */
|
|
+ E_REG_CCR = 0x03, /*!< CSP Control Register (Read/Write) */
|
|
+ E_REG_ACKH = 0x04, /*!< CEC Address ACK High Register (Read/Write) */
|
|
+ E_REG_ACKL = 0x05, /*!< CEC Address ACK Low Register (Read/Write) */
|
|
+ E_REG_CCONR = 0x06, /*!< CEC Config Register (Read/Write) */
|
|
+ E_REG_CDR0 = 0x07, /*!< CEC Data Register (Read/Write) */
|
|
+ E_REG_CDR1 = 0x08, /*!< CEC Data Register (Read/Write) */
|
|
+ E_REG_CDR2 = 0x09, /*!< CEC Data Register (Read/Write) */
|
|
+ E_REG_CDR3 = 0x0A, /*!< CEC Data Register (Read/Write) */
|
|
+ E_REG_CDR4 = 0x0B, /*!< CEC Data Register (Read/Write) */
|
|
+ E_REG_CDR5 = 0x0C, /*!< CEC Data Register (Read/Write) */
|
|
+ E_REG_CDR6 = 0x0D, /*!< CEC Data Register (Read/Write) */
|
|
+ E_REG_CDR7 = 0x0E, /*!< CEC Data Register (Read/Write) */
|
|
+ E_REG_CDR8 = 0x0F, /*!< CEC Data Register (Read/Write) */
|
|
+ E_REG_CDR9 = 0x10, /*!< CEC Data Register (Read/Write) */
|
|
+ E_REG_CDR10 = 0x11, /*!< CEC Data Register (Read/Write) */
|
|
+ E_REG_CDR11 = 0x12, /*!< CEC Data Register (Read/Write) */
|
|
+ E_REG_CDR12 = 0x13, /*!< CEC Data Register (Read/Write) */
|
|
+ E_REG_CDR13 = 0x14, /*!< CEC Data Register (Read/Write) */
|
|
+ E_REG_CDR14 = 0x15, /*!< CEC Data Register (Read/Write) */
|
|
+ E_REG_CDR15 = 0x16, /*!< CEC Data Register (Read/Write) */
|
|
+ E_REG_CDR16 = 0x17, /*!< CEC Data Register (Read/Write) */
|
|
+ E_REG_CDR17 = 0x18, /*!< CEC Data Register (Read/Write) */
|
|
+ E_REG_CDR18 = 0x19 /*!< CEC Data Register (Read/Write) */
|
|
+};
|
|
+
|
|
+/* possible states of the state driver */
|
|
+typedef enum {
|
|
+ CEC_STATE_NOT_INITIALIZED, /**< Driver is not initialized */
|
|
+ CEC_STATE_UNLOCKED , /**< Driver is not locked */
|
|
+ CEC_STATE_LOCKED, /**< Driver is locked */
|
|
+ CEC_STATE_CONFIGURED /**< Driver is configured */
|
|
+} dl_hdmi_cec_driver_state_t;
|
|
+
|
|
+/**
|
|
+ * \brief The structure of a CEC object, one per device unit
|
|
+ * */
|
|
+typedef struct {
|
|
+ instance_t instance;
|
|
+ dl_hdmi_ceclogical_address_t device_logical_address;
|
|
+ /**< is unit instanciated ? */
|
|
+ bool opened;
|
|
+ /**< Version of the HW device */
|
|
+ dl_hdmi_cec_device_version_t device_version;
|
|
+ /**< Current state of the driver */
|
|
+ dl_hdmi_cec_driver_state_t state;
|
|
+ /**< Message callback */
|
|
+ ptmdl_hdmi_cec_callback_func_t message_callback;
|
|
+} dl_hdmi_cec_unit_config_t;
|
|
+
|
|
+/**
|
|
+ * \brief States of CEC Status
|
|
+ * */
|
|
+#define CEC_MSG_SUCCESS 0x00 /*Message transmisson Succeed*/
|
|
+#define CEC_CSP_OFF_STATE 0x80 /*CSP in Off State*/
|
|
+#define CEC_BAD_REQ_SERVICE 0x81 /*Bad .req service*/
|
|
+#define CEC_MSG_FAIL_UNABLE_TO_ACCESS 0x82 /*Message transmisson failed: Unable to access CEC line*/
|
|
+#define CEC_MSG_FAIL_ARBITRATION_ERROR 0x83 /*Message transmisson failed: Arbitration error*/
|
|
+#define CEC_MSG_FAIL_BIT_TIMMING_ERROR 0x84 /*Message transmisson failed: Bit timming error*/
|
|
+#define CEC_MSG_FAIL_DEST_NOT_ACK 0x85 /*Message transmisson failed: Destination Address not aknowledged*/
|
|
+#define CEC_MSG_FAIL_DATA_NOT_ACK 0x86 /*Message transmisson failed: Databyte not acknowledged*/
|
|
+
|
|
+/*============================================================================*/
|
|
+/* EXTERN DATA DEFINITION */
|
|
+/*============================================================================*/
|
|
+
|
|
+extern dl_hdmi_cec_driver_config_table_t gtmdl_hdmi_cec_driver_config_table[MAX_UNITS];
|
|
+
|
|
+/*============================================================================*/
|
|
+/* EXTERN FUNCTION PROTOTYPES */
|
|
+/*============================================================================*/
|
|
+
|
|
+error_code_t get_cec_hw_registers(dl_hdmi_cec_driver_config_table_t *p_dis,
|
|
+ u8 reg_addr,
|
|
+ u8 *p_data, u16 len_data);
|
|
+error_code_t get_cec_hw_register(dl_hdmi_cec_driver_config_table_t *p_dis,
|
|
+ u8 reg_addr,
|
|
+ u8 *p_reg_value);
|
|
+error_code_t set_cec_hw_registers(dl_hdmi_cec_driver_config_table_t *p_dis,
|
|
+ u8 reg_addr,
|
|
+ u8 *p_data, u16 len_data);
|
|
+error_code_t set_cec_hw_register_msb_lsb(dl_hdmi_cec_driver_config_table_t *p_dis,
|
|
+ u8 reg_addr,
|
|
+ u16 reg_word);
|
|
+error_code_t set_cec_hw_register(dl_hdmi_cec_driver_config_table_t *p_dis,
|
|
+ u8 reg_addr,
|
|
+ u8 reg_value);
|
|
+error_code_t set_cec_hw_register_field(dl_hdmi_cec_driver_config_table_t *p_dis,
|
|
+ u8 reg_addr,
|
|
+ u8 field_mask, u8 field_value);
|
|
+
|
|
+#endif /* DLHDMI_CEC_LOCAL_H */
|
|
+/*============================================================================*/
|
|
+/* END OF FILE */
|
|
+/*============================================================================*/
|
|
diff --git a/drivers/video/hdmi/comps/tmdlTDA9983/cfg/tmdlHdmiTx_IW.c b/drivers/video/hdmi/comps/tmdlTDA9983/cfg/tmdlHdmiTx_IW.c
|
|
new file mode 100755
|
|
index 0000000..fe98e93
|
|
--- /dev/null
|
|
+++ b/drivers/video/hdmi/comps/tmdlTDA9983/cfg/tmdlHdmiTx_IW.c
|
|
@@ -0,0 +1,659 @@
|
|
+/*
|
|
+ * Copyright (C) 2007 NXP N.V., All Rights Reserved.
|
|
+ * This source code and any compilation or derivative thereof is the proprietary
|
|
+ * information of NXP N.V. and is confidential in nature. Under no circumstances
|
|
+ * is this software to be exposed to or placed under an Open Source License of
|
|
+ * any type without the expressed written permission of NXP N.V.
|
|
+ *
|
|
+ * \file tx_IW.c
|
|
+ *
|
|
+ * \version $Revision: 1 $
|
|
+ *
|
|
+ * \date $Date: 07/08/07 16:00 $
|
|
+ *
|
|
+ * \brief devlib driver component API for the TDA998x HDMI Transmitters
|
|
+ *
|
|
+ * \section refs Reference Documents
|
|
+ * TDA998x Driver - FRS.doc,
|
|
+ * TDA998x Driver - tx - SCS.doc
|
|
+ *
|
|
+ * \section info Change Information
|
|
+ *
|
|
+ * \verbatim
|
|
+ *
|
|
+ * $History: tx_IW.c $
|
|
+ *
|
|
+ * ***************** Version 1 *****************
|
|
+ * User: J. Lamotte Date: 07/08/07 Time: 16:00
|
|
+ * Updated in $/Source/tx/inc
|
|
+ * initial version
|
|
+ *
|
|
+ *
|
|
+ * \endverbatim
|
|
+ *
|
|
+ * */
|
|
+
|
|
+/*============================================================================*/
|
|
+/* INCLUDE FILES */
|
|
+/*============================================================================*/
|
|
+
|
|
+#define _WIN32_WINNT 0x0500
|
|
+
|
|
+#ifndef WINDOWS_QMORE
|
|
+#include "windows.h"
|
|
+#endif
|
|
+
|
|
+#include "tmNxTypes.h"
|
|
+#include "tmNxCompId.h"
|
|
+#include "tmdlHdmiTx_Types.h"
|
|
+#include "tmdlHdmiTx_cfg.h"
|
|
+#include "tmdlHdmiTx_IW.h"
|
|
+
|
|
+/*============================================================================*/
|
|
+/* DEFINES */
|
|
+/*============================================================================*/
|
|
+
|
|
+/* maximum number of tasks that can be handled by the wrapper */
|
|
+#define MAX_TASKS 5
|
|
+/* maximum number of message queues that can be handled by the wrapper */
|
|
+#define MAX_QUEUES 5
|
|
+
|
|
+/*============================================================================*/
|
|
+/* MACRO */
|
|
+/*============================================================================*/
|
|
+
|
|
+/* macro for quick error handling */
|
|
+#define RETIF(cond, rslt) if ((cond)){return (rslt);}
|
|
+
|
|
+/*============================================================================*/
|
|
+/* TYPE DEFINITIONS */
|
|
+/*============================================================================*/
|
|
+
|
|
+/* structure describing each task handled by the wrapper */
|
|
+typedef struct {
|
|
+ bool created;
|
|
+ bool started;
|
|
+ u8 priority;
|
|
+ u16 stack_size;
|
|
+ DWORD thread_id;
|
|
+ HANDLE thread_handle;
|
|
+ LPTHREAD_START_ROUTINE associated_thread;
|
|
+ tx_iwfunc_ptr_t associated_task;
|
|
+} iw_tcb_t;
|
|
+
|
|
+/* structure describing each message queue handled by the wrapper */
|
|
+typedef struct {
|
|
+ bool created;
|
|
+ HANDLE access_semaphore;
|
|
+ HANDLE count_semaphore;
|
|
+ u16 queue_fullness;
|
|
+ u16 queue_size;
|
|
+ u16 write_pointer;
|
|
+ u16 read_pointer;
|
|
+ u8 *queue;
|
|
+} iw_queue_t;
|
|
+
|
|
+/*============================================================================*/
|
|
+/* FUNCTION PROTOTYPES */
|
|
+/*============================================================================*/
|
|
+
|
|
+DWORD WINAPI thread_proc0(LPVOID lp_parameter);
|
|
+DWORD WINAPI thread_proc1(LPVOID lp_parameter);
|
|
+DWORD WINAPI thread_proc2(LPVOID lp_parameter);
|
|
+DWORD WINAPI thread_proc3(LPVOID lp_parameter);
|
|
+DWORD WINAPI thread_proc4(LPVOID lp_parameter);
|
|
+
|
|
+/*============================================================================*/
|
|
+/* VARIABLES */
|
|
+/*============================================================================*/
|
|
+
|
|
+/* table storing all tasks descriptions */
|
|
+iw_tcb_t task_table[MAX_TASKS] = {
|
|
+ {false, false, 0, 0, 0, NULL, thread_proc0},
|
|
+ {false, false, 0, 0, 0, NULL, thread_proc1},
|
|
+ {false, false, 0, 0, 0, NULL, thread_proc2},
|
|
+ {false, false, 0, 0, 0, NULL, thread_proc3},
|
|
+ {false, false, 0, 0, 0, NULL, thread_proc4}
|
|
+};
|
|
+
|
|
+/* table storing all message queues descriptions */
|
|
+iw_queue_t queue_table[MAX_QUEUES] = {
|
|
+ {false, 0, 0, 0, 0, 0, 0, NULL},
|
|
+ {false, 0, 0, 0, 0, 0, 0, NULL},
|
|
+ {false, 0, 0, 0, 0, 0, 0, NULL},
|
|
+ {false, 0, 0, 0, 0, 0, 0, NULL},
|
|
+ {false, 0, 0, 0, 0, 0, 0, NULL}
|
|
+};
|
|
+
|
|
+/*============================================================================*/
|
|
+/* FUNCTION */
|
|
+/*============================================================================*/
|
|
+
|
|
+/******************************************************************************
|
|
+ * \brief This function creates a task and allocates all the necessary resources.
|
|
+ * Note that creating a task do not start it automatically,
|
|
+ * an explicit call to txIWTaskStart must be made.
|
|
+ *
|
|
+ * \param pFunc Pointer to the function that will be executed in the task context.
|
|
+ * \param Priority Priority of the task. The minimum priority is 0, the maximum is 255.
|
|
+ * \param StackSize Size of the stack to allocate for this task.
|
|
+ * \param pHandle Pointer to the handle buffer.
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMITX_NO_RESOURCES: the resource is not available
|
|
+ * - ERR_DLHDMITX_INCONSISTENT_PARAMS: an input parameter is
|
|
+ * inconsistent
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+error_code_t tx_iwtask_create
|
|
+(
|
|
+ tx_iwfunc_ptr_t p_func,
|
|
+ u8 priority,
|
|
+ u16 stack_size,
|
|
+ tx_iwtask_handle_t *p_handle
|
|
+)
|
|
+{
|
|
+ u32 i;
|
|
+
|
|
+ /* check that input pointer is not NULL */
|
|
+ RETIF(p_func == NULL, ERR_DLHDMITX_INCONSISTENT_PARAMS)
|
|
+
|
|
+ /* check that input pointer is not NULL */
|
|
+ RETIF(p_handle == NULL, ERR_DLHDMITX_INCONSISTENT_PARAMS)
|
|
+
|
|
+ /* search for available task slot */
|
|
+ for(i = 0; i < MAX_TASKS; i++) {
|
|
+ if(task_table[i].created == false)
|
|
+ break;
|
|
+
|
|
+ }
|
|
+ RETIF(i >= MAX_TASKS, ERR_DLHDMITX_NO_RESOURCES)
|
|
+
|
|
+ /* store task parameters into the dedicated structure */
|
|
+ task_table[i].priority = priority;
|
|
+ task_table[i].stack_size = stack_size;
|
|
+ task_table[i].associated_task = p_func;
|
|
+ task_table[i].created = true;
|
|
+
|
|
+ *p_handle = (tx_iwtask_handle_t)i;
|
|
+
|
|
+ return(0);
|
|
+}
|
|
+
|
|
+/******************************************************************************
|
|
+ * \brief This function destroys an existing task and frees resources used by it.
|
|
+ *
|
|
+ * \param Handle Handle of the task to be destroyed, as returned by
|
|
+ * txIWTaskCreate.
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMITX_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ * - ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+error_code_t tx_iwtask_destroy
|
|
+(
|
|
+ tx_iwtask_handle_t handle
|
|
+)
|
|
+{
|
|
+ /* check if handle number is in range */
|
|
+ RETIF((handle < 0) || (handle >= MAX_TASKS), ERR_DLHDMITX_BAD_HANDLE)
|
|
+
|
|
+ /* check if handle corresponding to task is created */
|
|
+ RETIF(task_table[handle].created == false, ERR_DLHDMITX_RESOURCE_NOT_OWNED)
|
|
+
|
|
+ if(task_table[handle].started == true) {
|
|
+ terminate_thread(task_table[handle].thread_handle, 0);
|
|
+ task_table[handle].started = false;
|
|
+ }
|
|
+ task_table[handle].created = false;
|
|
+ close_handle(task_table[handle].thread_handle);
|
|
+
|
|
+ return(0);
|
|
+}
|
|
+
|
|
+/******************************************************************************
|
|
+ * \brief This function start an existing task.
|
|
+ *
|
|
+ * \param Handle Handle of the task to be started.
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMITX_ALREADY_STARTED: the function is already started
|
|
+ * - ERR_DLHDMITX_NOT_STARTED: the function is not started
|
|
+ * - ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+error_code_t tx_iwtask_start
|
|
+(
|
|
+ tx_iwtask_handle_t handle
|
|
+)
|
|
+{
|
|
+ HANDLE thread_handle;
|
|
+
|
|
+ /* check if handle number is in range */
|
|
+ RETIF((handle < 0) || (handle >= MAX_TASKS), ERR_DLHDMITX_BAD_HANDLE)
|
|
+
|
|
+ /* check if task is already started */
|
|
+ RETIF(task_table[handle].started == true, ERR_DLHDMITX_ALREADY_STARTED)
|
|
+
|
|
+ /* start thread associated to the task */
|
|
+ thread_handle = create_thread(NULL,
|
|
+ (SIZE_T)task_table[handle].stack_size,
|
|
+ task_table[handle].associated_thread,
|
|
+ NULL,
|
|
+ 0,
|
|
+ &(task_table[handle].thread_id));
|
|
+
|
|
+ /* check return code for errors */
|
|
+ RETIF(!thread_handle, ERR_DLHDMITX_NOT_STARTED)
|
|
+
|
|
+ /* set the priority task */
|
|
+ set_thread_priority(thread_handle, (int)task_table[handle].priority);
|
|
+
|
|
+ /* update task status */
|
|
+ task_table[handle].thread_handle = thread_handle;
|
|
+ task_table[handle].started = true;
|
|
+
|
|
+ return(0);
|
|
+}
|
|
+
|
|
+/******************************************************************************
|
|
+ * \brief This function blocks the current task for the specified amount time.
|
|
+ * This is a passive wait.
|
|
+ *
|
|
+ * \param Duration Duration of the task blocking in milliseconds.
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMITX_NO_RESOURCES: the resource is not available
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+error_code_t tx_iwwait
|
|
+(
|
|
+ u16 duration
|
|
+)
|
|
+{
|
|
+ HANDLE timer_handle;
|
|
+ LARGE_INTEGER time;
|
|
+
|
|
+ timer_handle = create_waitable_timer(NULL, true, NULL);
|
|
+ RETIF(timer_handle == NULL, ERR_DLHDMITX_NO_RESOURCES)
|
|
+
|
|
+ time.quad_part = -10000 * (long)duration;
|
|
+ set_waitable_timer(timer_handle, &time, 0, NULL, NULL, false);
|
|
+ wait_for_single_object(timer_handle, INFINITE);
|
|
+
|
|
+ close_handle(timer_handle);
|
|
+
|
|
+ return(0);
|
|
+}
|
|
+
|
|
+/******************************************************************************
|
|
+ * \brief This function creates a message queue.
|
|
+ *
|
|
+ * \param QueueSize Maximum number of messages in the message queue.
|
|
+ * \param pHandle Pointer to the handle buffer.
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMITX_INCONSISTENT_PARAMS: an input parameter is
|
|
+ * inconsistent
|
|
+ * - ERR_DLHDMITX_NO_RESOURCES: the resource is not available
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+error_code_t tx_iwqueue_create
|
|
+(
|
|
+ u8 queue_size,
|
|
+ tx_iwqueue_handle_t *p_handle
|
|
+)
|
|
+{
|
|
+ u32 i;
|
|
+
|
|
+ /* check that input pointer is not NULL */
|
|
+ RETIF(p_handle == NULL, ERR_DLHDMITX_INCONSISTENT_PARAMS)
|
|
+
|
|
+ /* search for available queue slot */
|
|
+ for(i = 0; i < MAX_QUEUES; i++) {
|
|
+ if(queue_table[i].created == false)
|
|
+ break;
|
|
+
|
|
+ }
|
|
+
|
|
+ RETIF(i >= MAX_QUEUES, ERR_DLHDMITX_NO_RESOURCES)
|
|
+
|
|
+ /* allocate memory for the queue */
|
|
+ queue_table[i].queue = (u8 *)global_alloc(GMEM_FIXED, queue_size);
|
|
+ RETIF(queue_table[i].queue == NULL, ERR_DLHDMITX_NO_RESOURCES)
|
|
+
|
|
+ /* allocate semaphores for the queue */
|
|
+ queue_table[i].count_semaphore = create_semaphore(NULL, 0, queue_size, NULL);
|
|
+ RETIF(queue_table[i].count_semaphore == NULL, ERR_DLHDMITX_NO_RESOURCES)
|
|
+
|
|
+ queue_table[i].access_semaphore = create_semaphore(NULL, 1, 1, NULL);
|
|
+ RETIF(queue_table[i].access_semaphore == NULL, ERR_DLHDMITX_NO_RESOURCES)
|
|
+
|
|
+ /* update status of the queue table */
|
|
+ queue_table[i].created = true;
|
|
+ queue_table[i].queue_size = queue_size;
|
|
+ *p_handle = (tx_iwqueue_handle_t)i;
|
|
+
|
|
+ return(0);
|
|
+}
|
|
+
|
|
+/******************************************************************************
|
|
+ * \brief This function destroys an existing message queue.
|
|
+ *
|
|
+ * \param Handle Handle of the queue to be destroyed.
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong
|
|
+ * - ERR_DLHDMITX_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+error_code_t tx_iwqueue_destroy
|
|
+(
|
|
+ tx_iwqueue_handle_t handle
|
|
+)
|
|
+{
|
|
+ RETIF(handle > MAX_QUEUES, ERR_DLHDMITX_BAD_HANDLE)
|
|
+
|
|
+ RETIF(queue_table[handle].created == false, ERR_DLHDMITX_RESOURCE_NOT_OWNED)
|
|
+
|
|
+ global_free((LPVOID)queue_table[handle].queue);
|
|
+ close_handle(queue_table[handle].count_semaphore);
|
|
+ close_handle(queue_table[handle].access_semaphore);
|
|
+ queue_table[handle].created = false;
|
|
+
|
|
+ return(0);
|
|
+}
|
|
+
|
|
+/******************************************************************************
|
|
+ * \brief This function sends a message into the specified message queue.
|
|
+ *
|
|
+ * \param Handle Handle of the queue that will receive the message.
|
|
+ * \param Message Message to be sent.
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong
|
|
+ * - ERR_DLHDMITX_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ * - ERR_DLHDMITX_FULL: the queue is full
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+error_code_t tx_iwqueue_send
|
|
+(
|
|
+ tx_iwqueue_handle_t handle,
|
|
+ u8 message
|
|
+)
|
|
+{
|
|
+ error_code_t error_code = 0;
|
|
+
|
|
+ /* check that handle is correct */
|
|
+ RETIF(handle > MAX_QUEUES, ERR_DLHDMITX_BAD_HANDLE)
|
|
+
|
|
+ RETIF(queue_table[handle].created != true, ERR_DLHDMITX_RESOURCE_NOT_OWNED)
|
|
+
|
|
+ /* ask for exclusive access to this queue */
|
|
+ wait_for_single_object(queue_table[handle].access_semaphore, INFINITE);
|
|
+
|
|
+ if(queue_table[handle].queue_fullness < (queue_table[handle].queue_size - 1)) {
|
|
+ queue_table[handle].queue[queue_table[handle].write_pointer] = message;
|
|
+ queue_table[handle].queue_fullness++;
|
|
+ queue_table[handle].write_pointer++;
|
|
+ if(queue_table[handle].write_pointer == queue_table[handle].queue_size) {
|
|
+ queue_table[handle].write_pointer = 0;
|
|
+ }
|
|
+ release_semaphore(queue_table[handle].count_semaphore, 1, NULL);
|
|
+ } else {
|
|
+ error_code = ERR_DLHDMITX_FULL;
|
|
+ }
|
|
+
|
|
+ /* release access to this queue */
|
|
+ release_semaphore(queue_table[handle].access_semaphore, 1, NULL);
|
|
+
|
|
+ return(0);
|
|
+}
|
|
+
|
|
+/******************************************************************************
|
|
+ * \brief This function reads a message from the specified message queue.
|
|
+ *
|
|
+ * \param Handle Handle of the queue from which to read the message.
|
|
+ * \param pMessage Pointer to the message buffer.
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong
|
|
+ * - ERR_DLHDMITX_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ * - ERR_DLHDMITX_INCONSISTENT_PARAMS: an input parameter is
|
|
+ * inconsistent
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+error_code_t tx_iwqueue_receive
|
|
+(
|
|
+ tx_iwqueue_handle_t handle, u8 *p_message
|
|
+)
|
|
+{
|
|
+ /* check that handle is correct */
|
|
+ RETIF(handle > MAX_QUEUES, ERR_DLHDMITX_BAD_HANDLE)
|
|
+
|
|
+ RETIF(queue_table[handle].created != true, ERR_DLHDMITX_RESOURCE_NOT_OWNED)
|
|
+
|
|
+ /* check that input pointer is not NULL */
|
|
+ RETIF(p_message == NULL, ERR_DLHDMITX_INCONSISTENT_PARAMS)
|
|
+
|
|
+ /* ask for a new message by acquiring the counting semaphore */
|
|
+ wait_for_single_object(queue_table[handle].count_semaphore, INFINITE);
|
|
+
|
|
+ /* if we reach this point, this means that we got a message */
|
|
+ /* ask for exclusive access to this queue */
|
|
+ wait_for_single_object(queue_table[handle].access_semaphore, INFINITE);
|
|
+
|
|
+ *p_message = queue_table[handle].queue[queue_table[handle].read_pointer];
|
|
+ queue_table[handle].queue_fullness--;
|
|
+ queue_table[handle].read_pointer++;
|
|
+ if(queue_table[handle].read_pointer == queue_table[handle].queue_size) {
|
|
+ queue_table[handle].read_pointer = 0;
|
|
+ }
|
|
+
|
|
+ /* release access to this queue */
|
|
+ release_semaphore(queue_table[handle].access_semaphore, 1, NULL);
|
|
+
|
|
+ return(0);
|
|
+}
|
|
+
|
|
+/******************************************************************************
|
|
+ * \brief This function creates a semaphore.
|
|
+ *
|
|
+ * \param pHandle Pointer to the handle buffer.
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMITX_NO_RESOURCES: the resource is not available
|
|
+ * - ERR_DLHDMITX_INCONSISTENT_PARAMS: an input parameter is
|
|
+ * inconsistent
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+error_code_t tx_iwsemaphore_create
|
|
+(
|
|
+ tx_iwsem_handle_t *p_handle
|
|
+)
|
|
+{
|
|
+ /* check that input pointer is not NULL */
|
|
+ RETIF(p_handle == NULL, ERR_DLHDMITX_INCONSISTENT_PARAMS)
|
|
+
|
|
+ *p_handle = (tx_iwsem_handle_t)create_semaphore(NULL, 1, 1, NULL);
|
|
+
|
|
+ RETIF((*p_handle) == NULL, ERR_DLHDMITX_NO_RESOURCES)
|
|
+
|
|
+ return(0);
|
|
+}
|
|
+
|
|
+/******************************************************************************
|
|
+ * \brief This function destroys an existing semaphore.
|
|
+ *
|
|
+ * \param Handle Handle of the semaphore to be destroyed.
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+error_code_t tx_iwsemaphore_destroy
|
|
+(
|
|
+ tx_iwsem_handle_t handle
|
|
+)
|
|
+{
|
|
+ RETIF(close_handle(handle) == false, ERR_DLHDMITX_BAD_HANDLE)
|
|
+
|
|
+ return(0);
|
|
+}
|
|
+
|
|
+/******************************************************************************
|
|
+ * \brief This function acquires the specified semaphore.
|
|
+ *
|
|
+ * \param Handle Handle of the semaphore to be acquired.
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+error_code_t tx_iwsemaphore_p
|
|
+(
|
|
+ tx_iwsem_handle_t handle
|
|
+)
|
|
+{
|
|
+ RETIF(wait_for_single_object(handle, INFINITE) != WAIT_OBJECT_0, ERR_DLHDMITX_BAD_HANDLE)
|
|
+
|
|
+ return(0);
|
|
+}
|
|
+
|
|
+/******************************************************************************
|
|
+ * \brief This function releases the specified semaphore.
|
|
+ *
|
|
+ * \param Handle Handle of the semaphore to be released.
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+error_code_t tx_iwsemaphore_v
|
|
+(
|
|
+ tx_iwsem_handle_t handle
|
|
+)
|
|
+{
|
|
+ RETIF(release_semaphore(handle, 1, NULL) == 0, ERR_DLHDMITX_BAD_HANDLE)
|
|
+
|
|
+ return(0);
|
|
+}
|
|
+
|
|
+/******************************************************************************
|
|
+ * \brief This function disables the interrupts for a specific device.
|
|
+ *
|
|
+ * \param
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+void tx_iwdisable_interrupts(dl_hdmi_iwdevice_interrupt_t device)
|
|
+{
|
|
+ device;
|
|
+}
|
|
+
|
|
+/******************************************************************************
|
|
+ * \brief This function enables the interrupts for a specific device.
|
|
+ *
|
|
+ * \param
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+void tx_iwenable_interrupts(dl_hdmi_iwdevice_interrupt_t device)
|
|
+{
|
|
+ device;
|
|
+}
|
|
+
|
|
+/******************************************************************************/
|
|
+DWORD WINAPI thread_proc0(LPVOID lp_parameter)
|
|
+{
|
|
+ /* dummy reference to avoid compilation warning C4100 */
|
|
+ lp_parameter;
|
|
+
|
|
+ /* call the registered task */
|
|
+ task_table[0].associated_task();
|
|
+ /* if we reach this point, the task is terminated, so update its status */
|
|
+ task_table[0].started = false;
|
|
+
|
|
+ return(0);
|
|
+}
|
|
+
|
|
+/******************************************************************************/
|
|
+DWORD WINAPI thread_proc1(LPVOID lp_parameter)
|
|
+{
|
|
+ /* dummy reference to avoid compilation warning C4100 */
|
|
+ lp_parameter;
|
|
+
|
|
+ /* call the registered task */
|
|
+ task_table[1].associated_task();
|
|
+ /* if we reach this point, the task is terminated, so update its status */
|
|
+ task_table[1].started = false;
|
|
+
|
|
+ return(0);
|
|
+}
|
|
+
|
|
+/******************************************************************************/
|
|
+DWORD WINAPI thread_proc2(LPVOID lp_parameter)
|
|
+{
|
|
+ /* dummy reference to avoid compilation warning C4100 */
|
|
+ lp_parameter;
|
|
+
|
|
+ /* call the registered task */
|
|
+ task_table[2].associated_task();
|
|
+ /* if we reach this point, the task is terminated, so update its status */
|
|
+ task_table[2].started = false;
|
|
+
|
|
+ return(0);
|
|
+}
|
|
+
|
|
+/******************************************************************************/
|
|
+DWORD WINAPI thread_proc3(LPVOID lp_parameter)
|
|
+{
|
|
+ /* dummy reference to avoid compilation warning C4100 */
|
|
+ lp_parameter;
|
|
+
|
|
+ /* call the registered task */
|
|
+ task_table[3].associated_task();
|
|
+ /* if we reach this point, the task is terminated, so update its status */
|
|
+ task_table[3].started = false;
|
|
+
|
|
+ return(0);
|
|
+}
|
|
+
|
|
+DWORD WINAPI thread_proc4(LPVOID lp_parameter)
|
|
+{
|
|
+ /* dummy reference to avoid compilation warning C4100 */
|
|
+ lp_parameter;
|
|
+
|
|
+ /* call the registered task */
|
|
+ task_table[4].associated_task();
|
|
+ /* if we reach this point, the task is terminated, so update its status */
|
|
+ task_table[4].started = false;
|
|
+
|
|
+ return(0);
|
|
+}
|
|
+
|
|
+/*============================================================================*/
|
|
+/* END OF FILE */
|
|
+/*============================================================================*/
|
|
+
|
|
diff --git a/drivers/video/hdmi/comps/tmdlTDA9983/cfg/tmdlHdmiTx_IW.h b/drivers/video/hdmi/comps/tmdlTDA9983/cfg/tmdlHdmiTx_IW.h
|
|
new file mode 100755
|
|
index 0000000..30c1d52
|
|
--- /dev/null
|
|
+++ b/drivers/video/hdmi/comps/tmdlTDA9983/cfg/tmdlHdmiTx_IW.h
|
|
@@ -0,0 +1,281 @@
|
|
+/**
|
|
+ * Copyright (C) 2007 NXP N.V., All Rights Reserved.
|
|
+ * This source code and any compilation or derivative thereof is the proprietary
|
|
+ * information of NXP N.V. and is confidential in nature. Under no circumstances
|
|
+ * is this software to be exposed to or placed under an Open Source License of
|
|
+ * any type without the expressed written permission of NXP N.V.
|
|
+ *
|
|
+ * \file tx_IW.h
|
|
+ *
|
|
+ * \version $Revision: 1 $
|
|
+ *
|
|
+ * \date $Date: 07/08/07 16:00 $
|
|
+ *
|
|
+ * \brief devlib driver component API for the TDA998x HDMI Transmitters
|
|
+ *
|
|
+ * \section refs Reference Documents
|
|
+ * TDA998x Driver - FRS.doc,
|
|
+ * TDA998x Driver - tx - SCS.doc
|
|
+ *
|
|
+ * \section info Change Information
|
|
+ *
|
|
+ * \verbatim
|
|
+ *
|
|
+ * $History: tx_IW.h $
|
|
+ *
|
|
+ * ***************** Version 1 *****************
|
|
+ * User: J. Lamotte Date: 07/08/07 Time: 16:00
|
|
+ * Updated in $/Source/tx/inc
|
|
+ * initial version
|
|
+ *
|
|
+ *
|
|
+ * \endverbatim
|
|
+ *
|
|
+ * */
|
|
+
|
|
+#ifndef DLHDMITX_IW_H
|
|
+#define DLHDMITX_IW_H
|
|
+
|
|
+/*============================================================================*/
|
|
+/* INCLUDE FILES */
|
|
+/*============================================================================*/
|
|
+
|
|
+#ifdef TMFL_OS_WINDOWS
|
|
+#define _WIN32_WINNT 0x0500
|
|
+#include "windows.h"
|
|
+#endif
|
|
+
|
|
+#include "tmNxTypes.h"
|
|
+#include "tmdlHdmiTx_Types.h"
|
|
+
|
|
+/*============================================================================*/
|
|
+/* TYPE DEFINITIONS */
|
|
+/*============================================================================*/
|
|
+typedef void (*tx_iwfunc_ptr_t)(void);
|
|
+typedef u8 tx_iwtask_handle_t;
|
|
+typedef u8 tx_iwqueue_handle_t;
|
|
+#ifdef __LINUX_ARM_ARCH__ /* AL */
|
|
+typedef unsigned long tx_iwsem_handle_t;
|
|
+#else
|
|
+#ifdef TMFL_OS_WINDOWS
|
|
+typedef HANDLE tx_iwsem_handle_t;
|
|
+#else
|
|
+typedef u8 tx_iwsem_handle_t;
|
|
+#endif
|
|
+#endif
|
|
+
|
|
+/**
|
|
+ * \brief Enum listing all available devices for enable/disable interrupts
|
|
+ * */
|
|
+typedef enum {
|
|
+ DL_HDMI_IW_RX_1,
|
|
+ DL_HDMI_IW_RX_2,
|
|
+ DL_HDMI_IW_TX_1,
|
|
+ DL_HDMI_IW_TX_2,
|
|
+ DL_HDMI_IW_CEC_1,
|
|
+ DL_HDMI_IW_CEC_2
|
|
+} dl_hdmi_iwdevice_interrupt_t;
|
|
+
|
|
+/*============================================================================*/
|
|
+/* EXTERN FUNCTION PROTOTYPES */
|
|
+/*============================================================================*/
|
|
+
|
|
+/******************************************************************************
|
|
+ * \brief This function creates a task and allocates all the necessary
|
|
+ * resources. Note that creating a task do not start it automatically,
|
|
+ * an explicit call to txIWTaskStart must be made.
|
|
+ *
|
|
+ * \param pFunc Pointer to the function that will be executed in the task context.
|
|
+ * \param Priority Priority of the task. The minimum priority is 0, the maximum is 255.
|
|
+ * \param StackSize Size of the stack to allocate for this task.
|
|
+ * \param pHandle Pointer to the handle buffer.
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMITX_NO_RESOURCES: the resource is not available
|
|
+ * - ERR_DLHDMITX_INCONSISTENT_PARAMS: an input parameter is
|
|
+ * inconsistent
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+error_code_t tx_iwtask_create(tx_iwfunc_ptr_t p_func, u8 priority, u16 stack_size, tx_iwtask_handle_t *p_handle);
|
|
+
|
|
+/******************************************************************************
|
|
+ * \brief This function destroys an existing task and frees resources used by it.
|
|
+ *
|
|
+ * \param Handle Handle of the task to be destroyed, as returned by txIWTaskCreate.
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMITX_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ * - ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+error_code_t tx_iwtask_destroy(tx_iwtask_handle_t handle);
|
|
+
|
|
+/******************************************************************************
|
|
+ * \brief This function start an existing task.
|
|
+ *
|
|
+ * \param Handle Handle of the task to be started.
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMITX_ALREADY_STARTED: the function is already started
|
|
+ * - ERR_DLHDMITX_NOT_STARTED: the function is not started
|
|
+ * - ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+error_code_t tx_iwtask_start(tx_iwtask_handle_t handle);
|
|
+
|
|
+/******************************************************************************
|
|
+ * \brief This function blocks the current task for the specified amount time. This is a passive wait.
|
|
+ *
|
|
+ * \param Duration Duration of the task blocking in milliseconds.
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMITX_NO_RESOURCES: the resource is not available
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+error_code_t tx_iwwait(u16 duration);
|
|
+
|
|
+/******************************************************************************
|
|
+ * \brief This function creates a message queue.
|
|
+ *
|
|
+ * \param QueueSize Maximum number of messages in the message queue.
|
|
+ * \param pHandle Pointer to the handle buffer.
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMITX_INCONSISTENT_PARAMS: an input parameter is
|
|
+ * inconsistent
|
|
+ * - ERR_DLHDMITX_NO_RESOURCES: the resource is not available
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+error_code_t tx_iwqueue_create(u8 queue_size, tx_iwqueue_handle_t *p_handle);
|
|
+
|
|
+/******************************************************************************
|
|
+ * \brief This function destroys an existing message queue.
|
|
+ *
|
|
+ * \param Handle Handle of the queue to be destroyed.
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong
|
|
+ * - ERR_DLHDMITX_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+error_code_t tx_iwqueue_destroy(tx_iwqueue_handle_t handle);
|
|
+
|
|
+/******************************************************************************
|
|
+ * \brief This function sends a message into the specified message queue.
|
|
+ *
|
|
+ * \param Handle Handle of the queue that will receive the message.
|
|
+ * \param Message Message to be sent.
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong
|
|
+ * - ERR_DLHDMITX_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ * - ERR_DLHDMITX_FULL: the queue is full
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+error_code_t tx_iwqueue_send(tx_iwqueue_handle_t handle, u8 message);
|
|
+
|
|
+/******************************************************************************
|
|
+ * \brief This function reads a message from the specified message queue.
|
|
+ *
|
|
+ * \param Handle Handle of the queue from which to read the message.
|
|
+ * \param pMessage Pointer to the message buffer.
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong
|
|
+ * - ERR_DLHDMITX_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ * - ERR_DLHDMITX_INCONSISTENT_PARAMS: an input parameter is
|
|
+ * inconsistent
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+error_code_t tx_iwqueue_receive(tx_iwqueue_handle_t handle, u8 *p_message);
|
|
+
|
|
+/******************************************************************************
|
|
+ * \brief This function creates a semaphore.
|
|
+ *
|
|
+ * \param pHandle Pointer to the handle buffer.
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMITX_NO_RESOURCES: the resource is not available
|
|
+ * - ERR_DLHDMITX_INCONSISTENT_PARAMS: an input parameter is
|
|
+ * inconsistent
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+error_code_t tx_iwsemaphore_create(tx_iwsem_handle_t *p_handle);
|
|
+
|
|
+/******************************************************************************
|
|
+ * \brief This function destroys an existing semaphore.
|
|
+ *
|
|
+ * \param Handle Handle of the semaphore to be destroyed.
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+error_code_t tx_iwsemaphore_destroy(tx_iwsem_handle_t handle);
|
|
+
|
|
+/******************************************************************************
|
|
+ * \brief This function acquires the specified semaphore.
|
|
+ *
|
|
+ * \param Handle Handle of the semaphore to be acquired.
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+error_code_t tx_iwsemaphore_p(tx_iwsem_handle_t handle);
|
|
+
|
|
+/******************************************************************************
|
|
+ * \brief This function releases the specified semaphore.
|
|
+ *
|
|
+ * \param Handle Handle of the semaphore to be released.
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+error_code_t tx_iwsemaphore_v(tx_iwsem_handle_t handle);
|
|
+
|
|
+/******************************************************************************
|
|
+ * \brief This function disables the interrupts for a specific device.
|
|
+ *
|
|
+ * \param
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+void tx_iwdisable_interrupts(dl_hdmi_iwdevice_interrupt_t device);
|
|
+
|
|
+/******************************************************************************
|
|
+ * \brief This function enables the interrupts for a specific device.
|
|
+ *
|
|
+ * \param
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+void tx_iwenable_interrupts(dl_hdmi_iwdevice_interrupt_t device);
|
|
+
|
|
+#endif /* DLHDMITX_IW_H */
|
|
+
|
|
+/*============================================================================*/
|
|
+/* END OF FILE */
|
|
+/*============================================================================*/
|
|
+
|
|
diff --git a/drivers/video/hdmi/comps/tmdlTDA9983/cfg/tmdlHdmiTx_Linux.c b/drivers/video/hdmi/comps/tmdlTDA9983/cfg/tmdlHdmiTx_Linux.c
|
|
new file mode 100755
|
|
index 0000000..271a61d
|
|
--- /dev/null
|
|
+++ b/drivers/video/hdmi/comps/tmdlTDA9983/cfg/tmdlHdmiTx_Linux.c
|
|
@@ -0,0 +1,924 @@
|
|
+/**
|
|
+ * Copyright (C) 2006 NXP N.V., All Rights Reserved.
|
|
+ * This source code and any compilation or derivative thereof is the proprietary
|
|
+ * information of NXP N.V. and is confidential in nature. Under no circumstances
|
|
+ * is this software to be exposed to or placed under an Open Source License of
|
|
+ * any type without the expressed written permission of NXP N.V.
|
|
+ *
|
|
+ * \file tx_cfg.c
|
|
+ *
|
|
+ * \version Revision: 1
|
|
+ *
|
|
+ * \date Date: 08/08/07 11:00
|
|
+ *
|
|
+ * \brief devlib driver component API for the TDA998x HDMI Transmitters
|
|
+ *
|
|
+ * \section refs Reference Documents
|
|
+ * HDMI Tx Driver - FRS.doc,
|
|
+ *
|
|
+ * \section info Change Information
|
|
+ *
|
|
+ * \verbatim
|
|
+ *
|
|
+ * History: tx_cfg.c
|
|
+ *
|
|
+ * ***************** Version 1 *****************
|
|
+ * User: J. Lamotte Date: 08/08/07 Time: 11:00
|
|
+ * initial version
|
|
+ *
|
|
+ *
|
|
+ * \endverbatim
|
|
+ *
|
|
+ * */
|
|
+
|
|
+/*============================================================================*/
|
|
+/* INCLUDE FILES */
|
|
+/*============================================================================*/
|
|
+#include <linux/kernel.h>
|
|
+#include <linux/errno.h>
|
|
+#include <linux/string.h>
|
|
+#include <linux/types.h>
|
|
+#include <linux/i2c.h>
|
|
+#include <linux/delay.h>
|
|
+#include <linux/slab.h>
|
|
+#include <linux/semaphore.h>
|
|
+
|
|
+#include "tmdlHdmiTx_IW.h"
|
|
+#include "tmNxTypes.h"
|
|
+#include "tmdlHdmiTx.h"
|
|
+#include "tmdlHdmiTx_cfg.h"
|
|
+
|
|
+#include "tmbslHdmiTx.h"
|
|
+
|
|
+#define I2C_M_WR 0
|
|
+
|
|
+struct i2c_client *get_this_i2c_client(void);
|
|
+unsigned char my_i2c_data[255];
|
|
+
|
|
+/*============================================================================*/
|
|
+/* INTERNAL PROTOTYPE */
|
|
+/*============================================================================*/
|
|
+
|
|
+error_code_t tx_i2c_read_function(bsl_sys_args_t *p_sys_args);
|
|
+error_code_t tx_i2c_write_function(bsl_sys_args_t *p_sys_args);
|
|
+error_code_t tda9983_edid_read(bsl_sys_args_edid_t *p_arg);
|
|
+
|
|
+/*============================================================================*/
|
|
+/* MACRO */
|
|
+/*============================================================================*/
|
|
+
|
|
+/* macro for quick error handling */
|
|
+#define RETIF(cond, rslt) if ((cond)){return (rslt);}
|
|
+
|
|
+/*============================================================================*/
|
|
+/* TYPES DECLARATIONS */
|
|
+/*============================================================================*/
|
|
+
|
|
+/* I2C adress of the unit */
|
|
+#define UNIT_I2C_ADDRESS_0 0x70
|
|
+
|
|
+/* I2C adress of the unit */
|
|
+#define UNIT_I2C_ADDRESS_1 0x71
|
|
+
|
|
+/* Resolution supported */
|
|
+#ifndef FORMAT_PC
|
|
+#define RESOLUTION_NB 34
|
|
+#else
|
|
+#define RESOLUTION_NB 61
|
|
+#endif /* FORMAT_PC */
|
|
+
|
|
+/* HDCP key */
|
|
+#define KEY_SEED 0x1234
|
|
+
|
|
+/* Audio port configuration, bitn = 1 to enable port n, = 0 to disable port n */
|
|
+#define ENABLE_ALL_AUDIO_PORT 0xFF
|
|
+
|
|
+/* Audio clock port configuration */
|
|
+#define ENABLE_AUDIO_CLOCK_PORT true
|
|
+#define DISABLE_AUDIO_CLOCK_PORT false
|
|
+
|
|
+/* Audio port configuration, bitn = 1 to pulldown port n, = 0 to pulldown port n */
|
|
+#define DISABLE_ALL_AUDIO_PORT_PULLDOWN 0x00
|
|
+
|
|
+/* Audio clock port pulldown configuration */
|
|
+#define ENABLE_AUDIO_CLOCK_PORT_PULLDOWN true
|
|
+#define DISABLE_AUDIO_CLOCK_PORT_PULLDOWN false
|
|
+
|
|
+/*============================================================================*/
|
|
+/* DEFINES DECLARATIONS */
|
|
+/*============================================================================*/
|
|
+
|
|
+/*============================================================================*/
|
|
+/* VARIABLES DECLARATIONS */
|
|
+/*============================================================================*/
|
|
+
|
|
+/**
|
|
+ * \brief List of the resolution to be detected by the device library
|
|
+ * */
|
|
+
|
|
+const tx_cfg_resolution_t resolution_info_tx[RESOLUTION_NB] = {
|
|
+ /* TV Formats */
|
|
+ /* 60 HZ */
|
|
+ {dl_hdmitx_vfmt_01_640x480p_60hz, 640, 480, false, dl_hdmitx_vfreq_59hz, DL_HDMITX_P_ASPECT_RATIO_4_3},
|
|
+ {dl_hdmitx_vfmt_02_720x480p_60hz, 720, 480, false, dl_hdmitx_vfreq_59hz, DL_HDMITX_P_ASPECT_RATIO_4_3},
|
|
+ {dl_hdmitx_vfmt_03_720x480p_60hz, 720, 480, false, dl_hdmitx_vfreq_59hz, DL_HDMITX_P_ASPECT_RATIO_16_9},
|
|
+ {dl_hdmitx_vfmt_04_1280x720p_60hz, 1280, 720, false, dl_hdmitx_vfreq_60hz, DL_HDMITX_P_ASPECT_RATIO_16_9},
|
|
+ {dl_hdmitx_vfmt_05_1920x1080i_60hz, 1920, 1080, true, dl_hdmitx_vfreq_60hz, DL_HDMITX_P_ASPECT_RATIO_16_9},
|
|
+ {dl_hdmitx_vfmt_06_720x480i_60hz, 720, 480, true, dl_hdmitx_vfreq_59hz, DL_HDMITX_P_ASPECT_RATIO_4_3},
|
|
+ {dl_hdmitx_vfmt_07_720x480i_60hz, 720, 480, true, dl_hdmitx_vfreq_59hz, DL_HDMITX_P_ASPECT_RATIO_16_9},
|
|
+ {dl_hdmitx_vfmt_08_720x240p_60hz, 720, 240, false, dl_hdmitx_vfreq_59hz, DL_HDMITX_P_ASPECT_RATIO_4_3},
|
|
+ {dl_hdmitx_vfmt_09_720x240p_60hz, 720, 240, false, dl_hdmitx_vfreq_59hz, DL_HDMITX_P_ASPECT_RATIO_16_9},
|
|
+ {dl_hdmitx_vfmt_10_720x480i_60hz, 720, 480, true, dl_hdmitx_vfreq_59hz, DL_HDMITX_P_ASPECT_RATIO_4_3},
|
|
+ {dl_hdmitx_vfmt_11_720x480i_60hz, 720, 480, true, dl_hdmitx_vfreq_59hz, DL_HDMITX_P_ASPECT_RATIO_16_9},
|
|
+ {dl_hdmitx_vfmt_12_720x240p_60hz, 720, 240, false, dl_hdmitx_vfreq_59hz, DL_HDMITX_P_ASPECT_RATIO_4_3},
|
|
+ {dl_hdmitx_vfmt_13_720x240p_60hz, 720, 240, false, dl_hdmitx_vfreq_59hz, DL_HDMITX_P_ASPECT_RATIO_16_9},
|
|
+ {dl_hdmitx_vfmt_14_1440x480p_60hz, 1440, 480, false, dl_hdmitx_vfreq_59hz, DL_HDMITX_P_ASPECT_RATIO_4_3},
|
|
+ {dl_hdmitx_vfmt_15_1440x480p_60hz, 1440, 480, false, dl_hdmitx_vfreq_59hz, DL_HDMITX_P_ASPECT_RATIO_16_9},
|
|
+ {dl_hdmitx_vfmt_16_1920x1080p_60hz, 1920, 1080, false, dl_hdmitx_vfreq_60hz, DL_HDMITX_P_ASPECT_RATIO_16_9},
|
|
+ /* 50 HZ */
|
|
+ {dl_hdmitx_vfmt_17_720x576p_50hz, 720, 576, false, dl_hdmitx_vfreq_50hz, DL_HDMITX_P_ASPECT_RATIO_4_3},
|
|
+ {dl_hdmitx_vfmt_18_720x576p_50hz, 720, 576, false, dl_hdmitx_vfreq_50hz, DL_HDMITX_P_ASPECT_RATIO_16_9},
|
|
+ {dl_hdmitx_vfmt_19_1280x720p_50hz, 1280, 720, false, dl_hdmitx_vfreq_50hz, DL_HDMITX_P_ASPECT_RATIO_16_9},
|
|
+ {dl_hdmitx_vfmt_20_1920x1080i_50hz, 1920, 1080, true, dl_hdmitx_vfreq_50hz, DL_HDMITX_P_ASPECT_RATIO_16_9},
|
|
+ {dl_hdmitx_vfmt_21_720x576i_50hz, 720, 576, true, dl_hdmitx_vfreq_50hz, DL_HDMITX_P_ASPECT_RATIO_4_3},
|
|
+ {dl_hdmitx_vfmt_22_720x576i_50hz, 720, 576, true, dl_hdmitx_vfreq_50hz, DL_HDMITX_P_ASPECT_RATIO_16_9},
|
|
+ {dl_hdmitx_vfmt_23_720x288p_50hz, 720, 288, false, dl_hdmitx_vfreq_50hz, DL_HDMITX_P_ASPECT_RATIO_4_3},
|
|
+ {dl_hdmitx_vfmt_24_720x288p_50hz, 720, 288, false, dl_hdmitx_vfreq_50hz, DL_HDMITX_P_ASPECT_RATIO_16_9},
|
|
+ {dl_hdmitx_vfmt_25_720x576i_50hz, 720, 576, true, dl_hdmitx_vfreq_50hz, DL_HDMITX_P_ASPECT_RATIO_4_3},
|
|
+ {dl_hdmitx_vfmt_26_720x576i_50hz, 720, 576, true, dl_hdmitx_vfreq_50hz, DL_HDMITX_P_ASPECT_RATIO_16_9},
|
|
+ {dl_hdmitx_vfmt_27_720x288p_50hz, 720, 288, false, dl_hdmitx_vfreq_50hz, DL_HDMITX_P_ASPECT_RATIO_4_3},
|
|
+ {dl_hdmitx_vfmt_28_720x288p_50hz, 720, 288, false, dl_hdmitx_vfreq_50hz, DL_HDMITX_P_ASPECT_RATIO_16_9},
|
|
+ {dl_hdmitx_vfmt_29_1440x576p_50hz, 1440, 576, false, dl_hdmitx_vfreq_50hz, DL_HDMITX_P_ASPECT_RATIO_4_3},
|
|
+ {dl_hdmitx_vfmt_30_1440x576p_50hz, 1440, 576, false, dl_hdmitx_vfreq_50hz, DL_HDMITX_P_ASPECT_RATIO_16_9},
|
|
+ {dl_hdmitx_vfmt_31_1920x1080p_50hz, 1920, 1080, false, dl_hdmitx_vfreq_50hz, DL_HDMITX_P_ASPECT_RATIO_16_9},
|
|
+ {dl_hdmitx_vfmt_32_1920x1080p_24hz, 1920, 1080, false, dl_hdmitx_vfreq_24hz, DL_HDMITX_P_ASPECT_RATIO_16_9},
|
|
+ {dl_hdmitx_vfmt_33_1920x1080p_25hz, 1920, 1080, false, dl_hdmitx_vfreq_25hz, DL_HDMITX_P_ASPECT_RATIO_16_9},
|
|
+ {dl_hdmitx_vfmt_34_1920x1080p_30hz, 1920, 1080, false, dl_hdmitx_vfreq_30hz, DL_HDMITX_P_ASPECT_RATIO_16_9}
|
|
+#ifdef FORMAT_PC
|
|
+ /* PC Formats */
|
|
+ /* 60 HZ */
|
|
+ , {dl_hdmitx_vfmt_pc_640x480p_60hz, 640, 480, false, dl_hdmitx_vfreq_60hz, DL_HDMITX_P_ASPECT_RATIO_4_3},
|
|
+ {dl_hdmitx_vfmt_pc_800x600p_60hz, 800, 600, false, dl_hdmitx_vfreq_60hz, DL_HDMITX_P_ASPECT_RATIO_4_3},
|
|
+ {dl_hdmitx_vfmt_pc_1152x960p_60hz, 1152, 960, false, dl_hdmitx_vfreq_60hz, DL_HDMITX_P_ASPECT_RATIO_6_5},
|
|
+ {dl_hdmitx_vfmt_pc_1024x768p_60hz, 1024, 768, false, dl_hdmitx_vfreq_60hz, DL_HDMITX_P_ASPECT_RATIO_4_3},
|
|
+ {dl_hdmitx_vfmt_pc_1280x768p_60hz, 1280, 768, false, dl_hdmitx_vfreq_60hz, DL_HDMITX_P_ASPECT_RATIO_5_3},
|
|
+ {dl_hdmitx_vfmt_pc_1280x1024p_60hz, 1280, 1024, false, dl_hdmitx_vfreq_60hz, DL_HDMITX_P_ASPECT_RATIO_5_4},
|
|
+ {dl_hdmitx_vfmt_pc_1360x768p_60hz, 1360, 768, false, dl_hdmitx_vfreq_60hz, DL_HDMITX_P_ASPECT_RATIO_16_9},
|
|
+ {dl_hdmitx_vfmt_pc_1400x1050p_60hz, 1400, 1050, false, dl_hdmitx_vfreq_60hz, DL_HDMITX_P_ASPECT_RATIO_4_3},
|
|
+ {dl_hdmitx_vfmt_pc_1600x1200p_60hz, 1600, 1200, false, dl_hdmitx_vfreq_60hz, DL_HDMITX_P_ASPECT_RATIO_4_3},
|
|
+ /* 70 HZ */
|
|
+ {dl_hdmitx_vfmt_pc_1024x768p_70hz, 1024, 768, false, dl_hdmitx_vfreq_70hz, DL_HDMITX_P_ASPECT_RATIO_4_3},
|
|
+ /* 72 HZ */
|
|
+ {dl_hdmitx_vfmt_pc_640x480p_72hz, 640, 480, false, dl_hdmitx_vfreq_72hz, DL_HDMITX_P_ASPECT_RATIO_4_3},
|
|
+ {dl_hdmitx_vfmt_pc_800x600p_72hz, 800, 600, false, dl_hdmitx_vfreq_72hz, DL_HDMITX_P_ASPECT_RATIO_4_3},
|
|
+ /* 75 HZ */
|
|
+ {dl_hdmitx_vfmt_pc_640x480p_75hz, 640, 480, false, dl_hdmitx_vfreq_75hz, DL_HDMITX_P_ASPECT_RATIO_4_3},
|
|
+ {dl_hdmitx_vfmt_pc_1024x768p_75hz, 1024, 768, false, dl_hdmitx_vfreq_75hz, DL_HDMITX_P_ASPECT_RATIO_4_3},
|
|
+ {dl_hdmitx_vfmt_pc_800x600p_75hz, 800, 600, false, dl_hdmitx_vfreq_75hz, DL_HDMITX_P_ASPECT_RATIO_4_3},
|
|
+ {dl_hdmitx_vfmt_pc_1024x864p_75hz, 1024, 864, false, dl_hdmitx_vfreq_75hz, DL_HDMITX_P_ASPECT_RATIO_UNDEFINED},
|
|
+ {dl_hdmitx_vfmt_pc_1280x1024p_75hz, 1280, 1024, false, dl_hdmitx_vfreq_75hz, DL_HDMITX_P_ASPECT_RATIO_5_4},
|
|
+ /* 85 HZ */
|
|
+ {dl_hdmitx_vfmt_pc_640x350p_85hz, 640, 350, false, dl_hdmitx_vfreq_85hz, DL_HDMITX_P_ASPECT_RATIO_UNDEFINED},
|
|
+ {dl_hdmitx_vfmt_pc_640x400p_85hz, 640, 400, false, dl_hdmitx_vfreq_85hz, DL_HDMITX_P_ASPECT_RATIO_16_10},
|
|
+ {dl_hdmitx_vfmt_pc_720x400p_85hz, 720, 400, false, dl_hdmitx_vfreq_85hz, DL_HDMITX_P_ASPECT_RATIO_9_5},
|
|
+ {dl_hdmitx_vfmt_pc_640x480p_85hz, 640, 480, false, dl_hdmitx_vfreq_85hz, DL_HDMITX_P_ASPECT_RATIO_4_3},
|
|
+ {dl_hdmitx_vfmt_pc_800x600p_85hz, 800, 600, false, dl_hdmitx_vfreq_85hz, DL_HDMITX_P_ASPECT_RATIO_4_3},
|
|
+ {dl_hdmitx_vfmt_pc_1024x768p_85hz, 1024, 768, false, dl_hdmitx_vfreq_85hz, DL_HDMITX_P_ASPECT_RATIO_4_3},
|
|
+ {dl_hdmitx_vfmt_pc_1152x864p_85hz, 1152, 864, false, dl_hdmitx_vfreq_85hz, DL_HDMITX_P_ASPECT_RATIO_4_3},
|
|
+ {dl_hdmitx_vfmt_pc_1280x960p_85hz, 1280, 960, false, dl_hdmitx_vfreq_85hz, DL_HDMITX_P_ASPECT_RATIO_4_3},
|
|
+ {dl_hdmitx_vfmt_pc_1280x1024p_85hz, 1280, 1024, false, dl_hdmitx_vfreq_85hz, DL_HDMITX_P_ASPECT_RATIO_5_4},
|
|
+ /* 87 HZ */
|
|
+ {dl_hdmitx_vfmt_pc_1024x768i_87hz, 1024, 768, true, dl_hdmitx_vfreq_87hz, DL_HDMITX_P_ASPECT_RATIO_4_3}
|
|
+#endif /* FORMAT_PC */
|
|
+};
|
|
+
|
|
+const tx_cfg_video_signal444 video_port_mapping_yuv444[MAX_UNITS][6] = {
|
|
+ {
|
|
+ DL_HDMITX_VID444_BU_0_TO_3, /* Signals connected to VPA[0..3] */
|
|
+ DL_HDMITX_VID444_BU_4_TO_7, /* Signals connected to VPA[4..7] */
|
|
+ DL_HDMITX_VID444_GY_0_TO_3, /* Signals connected to VPB[0..3] */
|
|
+ DL_HDMITX_VID444_GY_4_TO_7, /* Signals connected to VPB[4..7] */
|
|
+ DL_HDMITX_VID444_VR_0_TO_3, /* Signals connected to VPC[0..3] */
|
|
+ DL_HDMITX_VID444_VR_4_TO_7 /* Signals connected to VPC[4..7] */
|
|
+ }
|
|
+};
|
|
+
|
|
+const tx_cfg_video_signal444 video_port_mapping_rgb444[MAX_UNITS][6] = {
|
|
+ {
|
|
+ DL_HDMITX_VID444_BU_0_TO_3, /* Signals connected to VPA[0..3] */
|
|
+ DL_HDMITX_VID444_BU_4_TO_7, /* Signals connected to VPA[4..7] */
|
|
+ DL_HDMITX_VID444_GY_0_TO_3, /* Signals connected to VPB[0..3] */
|
|
+ DL_HDMITX_VID444_GY_4_TO_7, /* Signals connected to VPB[4..7] */
|
|
+ DL_HDMITX_VID444_VR_0_TO_3, /* Signals connected to VPC[0..3] */
|
|
+ DL_HDMITX_VID444_VR_4_TO_7 /* Signals connected to VPC[4..7] */
|
|
+ }
|
|
+};
|
|
+
|
|
+const tx_cfg_video_signal422 video_port_mapping_yuv422[MAX_UNITS][6] = {
|
|
+
|
|
+ {
|
|
+ /* Signals connected to VPA[0..3] */
|
|
+ DL_HDMITX_VID422_Y_4_TO_7,
|
|
+ /* Signals connected to VPA[4..7] */
|
|
+ DL_HDMITX_VID422_Y_8_TO_11,
|
|
+ /* Signals connected to VPB[0..3] */
|
|
+ DL_HDMITX_VID422_UV_4_TO_7,
|
|
+ /* Signals connected to VPB[4..7] */
|
|
+ DL_HDMITX_VID422_UV_8_TO_11,
|
|
+ /* Signals connected to VPC[0..3] */
|
|
+ DL_HDMITX_VID422_NOT_CONNECTED,
|
|
+ /* Signals connected to VPC[4..7] */
|
|
+ DL_HDMITX_VID422_NOT_CONNECTED
|
|
+ }
|
|
+};
|
|
+
|
|
+const tx_cfg_video_signal_ccir656 video_port_mapping_ccir656[MAX_UNITS][6] = {
|
|
+ {
|
|
+ /* Signals connected to VPA[0..3] */
|
|
+ DL_HDMITX_VIDCCIR_4_TO_7,
|
|
+ /* Signals connected to VPA[4..7] */
|
|
+ DL_HDMITX_VIDCCIR_8_TO_11,
|
|
+ /* Signals connected to VPB[0..3] */
|
|
+ DL_HDMITX_VIDCCIR_NOT_CONNECTED,
|
|
+ /* Signals connected to VPB[4..7] */
|
|
+ DL_HDMITX_VIDCCIR_NOT_CONNECTED,
|
|
+ /* Signals connected to VPC[0..3] */
|
|
+ DL_HDMITX_VIDCCIR_NOT_CONNECTED,
|
|
+ /* Signals connected to VPC[4..7] */
|
|
+ DL_HDMITX_VIDCCIR_NOT_CONNECTED
|
|
+ }
|
|
+};
|
|
+
|
|
+/* Audio port configuration for SPDIF */
|
|
+/* Here you can specify the audio port routing configuration for SPDIF input. */
|
|
+/* enableAudioPortSPDIF and groundAudioPortSPDIF should be filled with a */
|
|
+/* value build as follows : each bit represent an audio port, LSB is port 0. */
|
|
+/* enableAudioClockPortSPDIF and groundAudioClockPortSPDIF can be configured */
|
|
+/* with the corresponding enums (See file tx_cfg.h for more details). */
|
|
+u8 enable_audio_port_spdif[MAX_UNITS] = {0x40};
|
|
+u8 enable_audio_clock_port_spdif[MAX_UNITS] = {DISABLE_AUDIO_CLOCK_PORT};
|
|
+u8 ground_audio_port_spdif[MAX_UNITS] = {0xBF};
|
|
+u8 ground_audio_clock_port_spdif[MAX_UNITS] = {ENABLE_AUDIO_CLOCK_PORT_PULLDOWN};
|
|
+
|
|
+/* Audio port configuration for I2S */
|
|
+/* Here you can specify the audio port routing configuration for SPDIF input. */
|
|
+/* enableAudioPortI2S and groundAudioPortI2S should be filled with a */
|
|
+/* value build as follows : each bit represent an audio port, LSB is port 0. */
|
|
+/* enableAudioClockPortI2S and groundAudioClockPortI2S can be configured */
|
|
+/* with the corresponding enums (See file tx_cfg.h for more details). */
|
|
+u8 enable_audio_port_i2s[MAX_UNITS] = {0x03};
|
|
+u8 enable_audio_port_i2s8c[MAX_UNITS] = {0x1F};
|
|
+u8 enable_audio_clock_port_i2s[MAX_UNITS] = {ENABLE_AUDIO_CLOCK_PORT};
|
|
+u8 ground_audio_port_i2s[MAX_UNITS] = {0xFC};
|
|
+u8 ground_audio_port_i2s8c[MAX_UNITS] = {0xE0};
|
|
+u8 ground_audio_clock_port_i2s[MAX_UNITS] = {DISABLE_AUDIO_CLOCK_PORT_PULLDOWN};
|
|
+
|
|
+/* Audio port configuration for OBA */
|
|
+/* Here you can specify the audio port routing configuration for SPDIF input. */
|
|
+/* enableAudioPortOBA and groundAudioPortOBA should be filled with a */
|
|
+/* value build as follows : each bit represent an audio port, LSB is port 0. */
|
|
+/* enableAudioClockPortOBA and groundAudioClockPortOBA can be configured */
|
|
+/* with the corresponding enums (See file tx_cfg.h for more details). */
|
|
+u8 enable_audio_port_oba[MAX_UNITS] = {0xFF};
|
|
+u8 enable_audio_clock_port_oba[MAX_UNITS] = {ENABLE_AUDIO_CLOCK_PORT};
|
|
+u8 ground_audio_port_oba[MAX_UNITS] = {0x00};
|
|
+u8 ground_audio_clock_port_oba[MAX_UNITS] = {DISABLE_AUDIO_CLOCK_PORT_PULLDOWN};
|
|
+
|
|
+/* Audio port configuration for DST */
|
|
+/* Here you can specify the audio port routing configuration for SPDIF input. */
|
|
+/* enableAudioPortDST and groundAudioPortDST should be filled with a */
|
|
+/* value build as follows : each bit represent an audio port, LSB is port 0. */
|
|
+/* enableAudioClockPortDST and groundAudioClockPortDST can be configured */
|
|
+/* with the corresponding enums (See file tx_cfg.h for more details). */
|
|
+u8 enable_audio_port_dst[MAX_UNITS] = {0xFF};
|
|
+u8 enable_audio_clock_port_dst[MAX_UNITS] = {ENABLE_AUDIO_CLOCK_PORT};
|
|
+u8 ground_audio_port_dst[MAX_UNITS] = {0x00};
|
|
+u8 ground_audio_clock_port_dst[MAX_UNITS] = {DISABLE_AUDIO_CLOCK_PORT_PULLDOWN};
|
|
+
|
|
+/* Audio port configuration for HBR */
|
|
+/* Here you can specify the audio port routing configuration for SPDIF input. */
|
|
+/* enableAudioPortHBR and groundAudioPortHBR should be filled with a */
|
|
+/* value build as follows : each bit represent an audio port, LSB is port 0. */
|
|
+/* enableAudioClockPortHBR and groundAudioClockPortHBR can be configured */
|
|
+/* with the corresponding enums (See file tx_cfg.h for more details). */
|
|
+u8 enable_audio_port_hbr[MAX_UNITS] = {0x1F};
|
|
+u8 enable_audio_clock_port_hbr[MAX_UNITS] = {ENABLE_AUDIO_CLOCK_PORT};
|
|
+u8 ground_audio_port_hbr[MAX_UNITS] = {0xE0};
|
|
+u8 ground_audio_clock_port_hbr[MAX_UNITS] = {DISABLE_AUDIO_CLOCK_PORT_PULLDOWN};
|
|
+
|
|
+/* Do not modify, those tables are filled dynamically by dlHdmiTxGenerateCfgVideoPortTables API */
|
|
+u8 mirror_table_ccir656[MAX_UNITS][6] = {{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}};
|
|
+u8 swap_table_ccir656[MAX_UNITS][6] = {{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}};
|
|
+u8 enable_video_port_ccir656[MAX_UNITS][3] = {{0x00, 0x00, 0x00}};
|
|
+u8 ground_video_port_ccir656[MAX_UNITS][3] = {{0xFF, 0xFF, 0xFF}};
|
|
+u8 mirror_table_yuv422[MAX_UNITS][6] = {{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}};
|
|
+u8 swap_table_yuv422[MAX_UNITS][6] = {{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}};
|
|
+u8 enable_video_port_yuv422[MAX_UNITS][3] = {{0x00, 0x00, 0x00}};
|
|
+u8 ground_video_port_yuv422[MAX_UNITS][3] = {{0xFF, 0xFF, 0xFF}};
|
|
+u8 mirror_table_yuv444[MAX_UNITS][6] = {{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}};
|
|
+u8 swap_table_yuv444[MAX_UNITS][6] = {{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}};
|
|
+u8 enable_video_port_yuv444[MAX_UNITS][3] = {{0x00, 0x00, 0x00}};
|
|
+u8 ground_video_port_yuv444[MAX_UNITS][3] = {{0xFF, 0xFF, 0xFF}};
|
|
+u8 mirror_table_rgb444[MAX_UNITS][6] = {{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}};
|
|
+u8 swap_table_rgb444[MAX_UNITS][6] = {{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}};
|
|
+u8 enable_video_port_rgb444[MAX_UNITS][3] = {{0x00, 0x00, 0x00}};
|
|
+u8 ground_video_port_rgb444[MAX_UNITS][3] = {{0xFF, 0xFF, 0xFF}};
|
|
+
|
|
+/**
|
|
+ * \brief Configuration Tables. This table can be modified by the customer
|
|
+ * to choose its prefered configuration.
|
|
+ * */
|
|
+tx_driver_config_table_t driver_config_table_tx[MAX_UNITS] = {
|
|
+ {
|
|
+ 250 ,/* COMMAND_TASK_PRIORITY_0 */
|
|
+ 128 ,/* COMMAND_TASK_STACKSIZE_0 */
|
|
+ 128 ,/* COMMAND_TASK_QUEUESIZE_0 */
|
|
+ 250 ,/* HDCP_CHECK_TASK_PRIORITY_0 */
|
|
+ 128 ,/* HDCP_CHECK_TASK_STACKSIZE_0 */
|
|
+ UNIT_I2C_ADDRESS_0,
|
|
+ tx_i2c_read_function,
|
|
+ tx_i2c_write_function,
|
|
+ tda9983_edid_read,
|
|
+ NULL, /* filled dynamically, do not modify */
|
|
+ RESOLUTION_NB,
|
|
+ /* filled dynamically, do not modify */
|
|
+ &mirror_table_ccir656[0][0],
|
|
+ /* filled dynamically, do not modify */
|
|
+ &swap_table_ccir656[0][0],
|
|
+ /* filled dynamically, do not modify */
|
|
+ &enable_video_port_ccir656[0][0],
|
|
+ /* filled dynamically, do not modify */
|
|
+ &ground_video_port_ccir656[0][0],
|
|
+ /* filled dynamically, do not modify */
|
|
+ &mirror_table_yuv422[0][0],
|
|
+ /* filled dynamically, do not modify */
|
|
+ &swap_table_yuv422[0][0],
|
|
+ /* filled dynamically, do not modify */
|
|
+ &enable_video_port_yuv422[0][0],
|
|
+ /* filled dynamically, do not modify */
|
|
+ &ground_video_port_yuv422[0][0],
|
|
+ /* filled dynamically, do not modify */
|
|
+ &mirror_table_yuv444[0][0],
|
|
+ /* filled dynamically, do not modify */
|
|
+ &swap_table_yuv444[0][0],
|
|
+ /* filled dynamically, do not modify */
|
|
+ &enable_video_port_yuv444[0][0],
|
|
+ /* filled dynamically, do not modify */
|
|
+ &ground_video_port_yuv444[0][0],
|
|
+ /* filled dynamically, do not modify */
|
|
+ &mirror_table_rgb444[0][0],
|
|
+ /* filled dynamically, do not modify */
|
|
+ &swap_table_rgb444[0][0],
|
|
+ /* filled dynamically, do not modify */
|
|
+ &enable_video_port_rgb444[0][0],
|
|
+ /* filled dynamically, do not modify */
|
|
+ &ground_video_port_rgb444[0][0],
|
|
+ &enable_audio_port_spdif[0],
|
|
+ &ground_audio_port_spdif[0],
|
|
+ &enable_audio_clock_port_spdif[0],
|
|
+ &ground_audio_clock_port_spdif[0],
|
|
+ &enable_audio_port_i2s[0],
|
|
+ &ground_audio_port_i2s[0],
|
|
+ &enable_audio_port_i2s8c[0],
|
|
+ &ground_audio_port_i2s8c[0],
|
|
+ &enable_audio_clock_port_i2s[0],
|
|
+ &ground_audio_clock_port_i2s[0],
|
|
+ &enable_audio_port_oba[0],
|
|
+ &ground_audio_port_oba[0],
|
|
+ &enable_audio_clock_port_oba[0],
|
|
+ &ground_audio_clock_port_oba[0],
|
|
+ &enable_audio_port_dst[0],
|
|
+ &ground_audio_port_dst[0],
|
|
+ &enable_audio_clock_port_dst[0],
|
|
+ &ground_audio_clock_port_dst[0],
|
|
+ &enable_audio_port_hbr[0],
|
|
+ &ground_audio_port_hbr[0],
|
|
+ &enable_audio_clock_port_hbr[0],
|
|
+ &ground_audio_clock_port_hbr[0],
|
|
+ KEY_SEED,
|
|
+ DL_HDMITX_PATTERN_BLUE
|
|
+ }
|
|
+};
|
|
+
|
|
+/*
|
|
+ *
|
|
+ * Linux wrapping starts here...............................
|
|
+ *
|
|
+ * */
|
|
+
|
|
+/*
|
|
+ * Write a bloc to a register in Tx device.
|
|
+ * */
|
|
+int blockwrite_reg(struct i2c_client *client,
|
|
+ u8 reg, u16 alength, u8 *val)
|
|
+{
|
|
+ int err = 0, i;
|
|
+ struct i2c_msg msg[1];
|
|
+
|
|
+ if(!client->adapter) {
|
|
+ dev_err(&client->dev, "<%s> ERROR: no HDMI device\n", __func__);
|
|
+ return -ENODEV;
|
|
+ }
|
|
+
|
|
+ msg->addr = client->addr;
|
|
+ msg->flags = I2C_M_WR;
|
|
+ msg->len = alength + 1;
|
|
+ msg->buf = my_i2c_data;
|
|
+
|
|
+ msg->buf[0] = reg;
|
|
+ for(i = 1; i <= alength; i++) msg->buf[i] = (*val++);
|
|
+
|
|
+ err = i2c_transfer(client->adapter, msg, 1);
|
|
+ udelay(50);
|
|
+
|
|
+ /* printk(KERN_INFO "DBG blockwrite_reg addr:%x reg:%d data:%x %s\n",msg->addr,reg,val,(err<0?"ERROR":"")); */
|
|
+
|
|
+ /* dev_dbg(&client->dev, "<%s> i2c Block write at 0x%x, " */
|
|
+ /* "*val=%d flags=%d byte[%d] err=%d\n", */
|
|
+ /* __func__, data[0], data[1], msg->flags, i, err); */
|
|
+ return (err < 0 ? err : 0);
|
|
+}
|
|
+
|
|
+/*
|
|
+ * Read a bloc to a register in Tx device.
|
|
+ * */
|
|
+int blockread_reg(struct i2c_client *client,
|
|
+ u8 reg, u16 alength, u8 *val)
|
|
+{
|
|
+ int err = 0;
|
|
+ struct i2c_msg msg[1];
|
|
+ u8 data[2];
|
|
+
|
|
+ if(!client->adapter) {
|
|
+ dev_err(&client->dev, "<%s> ERROR: no HDMI device\n", __func__);
|
|
+ return -ENODEV;
|
|
+ }
|
|
+
|
|
+ msg->addr = client->addr;
|
|
+ msg->flags = I2C_M_WR;
|
|
+ msg->len = 1;
|
|
+ msg->buf = data;
|
|
+ data[0] = reg; /* High byte goes out first */
|
|
+ err = i2c_transfer(client->adapter, msg, 1);
|
|
+ /* printk(KERN_INFO "DBG blockread_reg #1 addr:%x len:%d buf:%02x%02x%02x%02x %s\n",msg->addr,msg->len,\ */
|
|
+ /* msg->buf[0],msg->buf[1],msg->buf[2],msg->buf[3],(err<0?"ERROR":"")); */
|
|
+ if(err < 0) goto BLOCK_READ_OUPS;
|
|
+
|
|
+ msg->flags = I2C_M_RD;
|
|
+ msg->len = alength;
|
|
+ msg->buf = val;
|
|
+ err = i2c_transfer(client->adapter, msg, 1);
|
|
+ /* printk(KERN_INFO "DBG blockread_reg #2 addr:%x len:%d buf:%02x%02x%02x%02x %s\n",msg->addr,msg->len,\ */
|
|
+ /* msg->buf[0],msg->buf[1],msg->buf[2],msg->buf[3],(err<0?"ERROR":"")); */
|
|
+
|
|
+ if(err < 0) goto BLOCK_READ_OUPS;
|
|
+
|
|
+ return 0;
|
|
+
|
|
+BLOCK_READ_OUPS:
|
|
+ dev_err(&client->dev, "<%s> ERROR: i2c read at 0x%x, "
|
|
+ "*val=%d flags=%d bytes err=%d\n",
|
|
+ __func__, reg, *val, msg->flags, err);
|
|
+ return err;
|
|
+}
|
|
+
|
|
+/*
|
|
+ * Write a byte to a register in Tx device.
|
|
+ * */
|
|
+int write_reg(struct i2c_client *client, u8 reg, u8 val)
|
|
+{
|
|
+ int err = 0;
|
|
+ struct i2c_msg msg[1];
|
|
+ u8 data[2];
|
|
+ int retries = 0;
|
|
+
|
|
+ if(!client->adapter) {
|
|
+ dev_err(&client->dev, "<%s> ERROR: no HDMI device\n", __func__);
|
|
+ return -ENODEV;
|
|
+ }
|
|
+
|
|
+retry:
|
|
+ msg->addr = client->addr;
|
|
+ msg->flags = I2C_M_WR;
|
|
+ msg->len = 2;
|
|
+ msg->buf = data;
|
|
+
|
|
+ data[0] = reg;
|
|
+ data[1] = val;
|
|
+
|
|
+ err = i2c_transfer(client->adapter, msg, 1);
|
|
+ dev_dbg(&client->dev, "<%s> i2c write at=%x "
|
|
+ "val=%x flags=%d err=%d\n",
|
|
+ __func__, data[0], data[1], msg->flags, err);
|
|
+ udelay(50);
|
|
+
|
|
+ /* printk(KERN_INFO "DBG write_reg addr:%x reg:%d data:%x %s\n",msg->addr,reg,val,(err<0?"ERROR":"")); */
|
|
+
|
|
+ if(err >= 0)
|
|
+ return 0;
|
|
+
|
|
+ dev_err(&client->dev, "<%s> ERROR: i2c write at=%x "
|
|
+ "val=%x flags=%d err=%d\n",
|
|
+ __func__, data[0], data[1], msg->flags, err);
|
|
+ if(retries <= 5) {
|
|
+ dev_info(&client->dev, "retrying I2C... %d\n", retries);
|
|
+ retries++;
|
|
+ set_current_state(TASK_UNINTERRUPTIBLE);
|
|
+ schedule_timeout(msecs_to_jiffies(20));
|
|
+ goto retry;
|
|
+ }
|
|
+ return err;
|
|
+}
|
|
+
|
|
+/*
|
|
+ * Read a byte from a register in Tx device.
|
|
+ * */
|
|
+int read_reg(struct i2c_client *client, u16 data_length, u8 reg, u8 *val)
|
|
+{
|
|
+ int err = 0;
|
|
+ struct i2c_msg msg[1];
|
|
+ u8 data[2];
|
|
+
|
|
+ if(!client->adapter) {
|
|
+ dev_err(&client->dev, "<%s> ERROR: no HDMI device\n", __func__);
|
|
+ return -ENODEV;
|
|
+ }
|
|
+
|
|
+ msg->addr = client->addr;
|
|
+ msg->flags = I2C_M_WR;
|
|
+ msg->len = 1;
|
|
+ msg->buf = data;
|
|
+
|
|
+ data[0] = reg;
|
|
+ err = i2c_transfer(client->adapter, msg, 1);
|
|
+ dev_dbg(&client->dev, "<%s> i2c read1 reg=%x val=%d "
|
|
+ "flags=%d err=%d\n",
|
|
+ __func__, reg, data[1], msg->flags, err);
|
|
+
|
|
+ if(err >= 0) {
|
|
+ mdelay(3);
|
|
+ msg->flags = I2C_M_RD;
|
|
+ msg->len = data_length;
|
|
+ err = i2c_transfer(client->adapter, msg, 1);
|
|
+ }
|
|
+
|
|
+ if(err >= 0) {
|
|
+ *val = 0;
|
|
+ if(data_length == 1)
|
|
+ *val = data[0];
|
|
+ else if(data_length == 2)
|
|
+ *val = data[1] + (data[0] << 8);
|
|
+ dev_dbg(&client->dev, "<%s> i2c read2 at 0x%x, *val=%d "
|
|
+ "flags=%d err=%d\n",
|
|
+ __func__, reg, *val, msg->flags, err);
|
|
+ return 0;
|
|
+ }
|
|
+
|
|
+ dev_err(&client->dev, "<%s> ERROR: i2c read at 0x%x, "
|
|
+ "*val=%d flags=%d err=%d\n",
|
|
+ __func__, reg, *val, msg->flags, err);
|
|
+ return err;
|
|
+}
|
|
+
|
|
+/* The following function must be rewritten by the customer to fit its own */
|
|
+/* SW infrastructure. This function allows reading through I2C bus. */
|
|
+/* bslSysArgs_t definition is located into bsl_type.h file. */
|
|
+error_code_t tx_i2c_read_function(bsl_sys_args_t *p_sys_args)
|
|
+{
|
|
+
|
|
+ error_code_t err = 0;
|
|
+ struct i2c_client *client = get_this_i2c_client();
|
|
+ u32 client_main_addr = client->addr;
|
|
+
|
|
+ /* DevLib needs address control, so let it be */
|
|
+ client->addr = p_sys_args->slave_addr;
|
|
+
|
|
+ if(p_sys_args->len_data == 1) {
|
|
+ /* single byte */
|
|
+ err = read_reg(get_this_i2c_client(), 1, p_sys_args->first_register, p_sys_args->p_data);
|
|
+ } else {
|
|
+ /* block */
|
|
+ err = blockread_reg(get_this_i2c_client(), \
|
|
+ p_sys_args->first_register, \
|
|
+ p_sys_args->len_data, \
|
|
+ p_sys_args->p_data);
|
|
+ }
|
|
+
|
|
+ /* restore default client address */
|
|
+ client->addr = client_main_addr;
|
|
+
|
|
+ return err;
|
|
+}
|
|
+
|
|
+/* The following function must be rewritten by the customer to fit its own */
|
|
+/* SW infrastructure. This function allows writing through I2C bus. */
|
|
+/* bslSysArgs_t definition is located into bsl_type.h file. */
|
|
+error_code_t tx_i2c_write_function(bsl_sys_args_t *p_sys_args)
|
|
+{
|
|
+
|
|
+ error_code_t err = 0;
|
|
+ struct i2c_client *client = get_this_i2c_client();
|
|
+ u32 client_main_addr = client->addr;
|
|
+
|
|
+ /* DevLib needs address control, so let it be */
|
|
+ client->addr = p_sys_args->slave_addr;
|
|
+
|
|
+ if(p_sys_args->len_data == 1) {
|
|
+ /* single byte */
|
|
+ err = write_reg(get_this_i2c_client(), p_sys_args->first_register, *p_sys_args->p_data);
|
|
+ } else {
|
|
+ /* block */
|
|
+ err = blockwrite_reg(get_this_i2c_client(), \
|
|
+ p_sys_args->first_register, \
|
|
+ p_sys_args->len_data, \
|
|
+ p_sys_args->p_data);
|
|
+ }
|
|
+
|
|
+ /* restore default client address */
|
|
+ client->addr = client_main_addr;
|
|
+
|
|
+ return err;
|
|
+}
|
|
+
|
|
+error_code_t tda9983_edid_read(bsl_sys_args_edid_t *p_arg)
|
|
+{
|
|
+ struct i2c_client *client = get_this_i2c_client();
|
|
+ struct i2c_msg msg[3];
|
|
+ int index = 0;
|
|
+
|
|
+ if(p_arg->seg_ptr_addr != 0) {
|
|
+ msg[index].addr = (p_arg->seg_ptr_addr >> 1);
|
|
+ msg[index].flags = 0;
|
|
+ msg[index].len = 1;
|
|
+ p_arg->seg_ptr |= 0x01;
|
|
+ msg[index].buf = &p_arg->seg_ptr;
|
|
+ index++;
|
|
+ }
|
|
+
|
|
+ msg[index].addr = (p_arg->data_reg_addr >> 1);
|
|
+ msg[index].flags = 0;
|
|
+ msg[index].len = 1;
|
|
+ msg[index].buf = &p_arg->word_offset;
|
|
+ index++;
|
|
+
|
|
+ msg[index].addr = (p_arg->data_reg_addr >> 1);
|
|
+ msg[index].flags = I2C_M_RD;
|
|
+ msg[index].len = p_arg->len_data;
|
|
+ msg[index].buf = p_arg->p_data;
|
|
+ index++;
|
|
+ i2c_transfer(client->adapter, msg, index);
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+/******************************************************************************
|
|
+ * \brief This function blocks the current task for the specified amount time.
|
|
+ * This is a passive wait.
|
|
+ *
|
|
+ * \param Duration Duration of the task blocking in milliseconds.
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMITX_NO_RESOURCES: the resource is not available
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+error_code_t tx_iwwait
|
|
+(
|
|
+ u16 duration
|
|
+)
|
|
+{
|
|
+
|
|
+ mdelay((unsigned long)duration);
|
|
+
|
|
+ return(0);
|
|
+}
|
|
+
|
|
+/******************************************************************************
|
|
+ * \brief This function creates a semaphore.
|
|
+ *
|
|
+ * \param pHandle Pointer to the handle buffer.
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMITX_NO_RESOURCES: the resource is not available
|
|
+ * - ERR_DLHDMITX_INCONSISTENT_PARAMS: an input parameter is
|
|
+ * inconsistent
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+error_code_t tx_iwsemaphore_create
|
|
+(
|
|
+ tx_iwsem_handle_t *p_handle
|
|
+)
|
|
+{
|
|
+ struct semaphore *mutex;
|
|
+
|
|
+ /* check that input pointer is not NULL */
|
|
+ RETIF(p_handle == NULL, ERR_DLHDMITX_INCONSISTENT_PARAMS)
|
|
+
|
|
+ mutex = (struct semaphore *)kmalloc(sizeof(struct semaphore), GFP_KERNEL);
|
|
+ if(!mutex) {
|
|
+ printk(KERN_ERR "malloc failed in %s\n", __func__);
|
|
+ return ERR_DLHDMITX_NO_RESOURCES;
|
|
+ }
|
|
+
|
|
+ init_MUTEX(mutex);
|
|
+ *p_handle = (tx_iwsem_handle_t)mutex;
|
|
+
|
|
+ RETIF(p_handle == NULL, ERR_DLHDMITX_NO_RESOURCES)
|
|
+
|
|
+ return(0);
|
|
+}
|
|
+
|
|
+/******************************************************************************
|
|
+ * \brief This function destroys an existing semaphore.
|
|
+ *
|
|
+ * \param Handle Handle of the semaphore to be destroyed.
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+error_code_t tx_iwsemaphore_destroy
|
|
+(
|
|
+ tx_iwsem_handle_t handle
|
|
+)
|
|
+{
|
|
+ RETIF(handle == false, ERR_DLHDMITX_BAD_HANDLE);
|
|
+
|
|
+ if(atomic_read((atomic_t *)&((struct semaphore *)handle)->count) < 1) {
|
|
+ printk(KERN_ERR "release catched semaphore");
|
|
+ }
|
|
+
|
|
+ kfree((void *)handle);
|
|
+
|
|
+ return(0);
|
|
+}
|
|
+
|
|
+/******************************************************************************
|
|
+ * \brief This function acquires the specified semaphore.
|
|
+ *
|
|
+ * \param Handle Handle of the semaphore to be acquired.
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+error_code_t tx_iwsemaphore_p
|
|
+(
|
|
+ tx_iwsem_handle_t handle
|
|
+)
|
|
+{
|
|
+
|
|
+ down((struct semaphore *)handle);
|
|
+
|
|
+ return(0);
|
|
+}
|
|
+
|
|
+/******************************************************************************
|
|
+ * \brief This function releases the specified semaphore.
|
|
+ *
|
|
+ * \param Handle Handle of the semaphore to be released.
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+error_code_t tx_iwsemaphore_v
|
|
+(
|
|
+ tx_iwsem_handle_t handle
|
|
+)
|
|
+{
|
|
+ up((struct semaphore *)handle);
|
|
+
|
|
+ return(0);
|
|
+}
|
|
+
|
|
+/*============================================================================*/
|
|
+/* FUNCTIONS */
|
|
+/*============================================================================*/
|
|
+
|
|
+/*****************************************************************************
|
|
+ ******************************************************************************
|
|
+ * THIS PART MUST NOT BE MODIFIED BY CUSTOMER *
|
|
+ ******************************************************************************
|
|
+ *****************************************************************************/
|
|
+
|
|
+/******************************************************************************
|
|
+ * \brief Generate swap and mirror tables in function
|
|
+ * of video port mapping tables.
|
|
+ *
|
|
+ * \param unit Unit identifier.
|
|
+ *
|
|
+ * \return NA.
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+static void dl_hdmi_tx_generate_cfg_video_port_tables
|
|
+(
|
|
+ unit_select_t unit,
|
|
+ tx_driver_config_table_t *p_config
|
|
+)
|
|
+{
|
|
+ u8 i;
|
|
+
|
|
+ for(i = 0; i < 6; i++) {
|
|
+ /* CCIR656 */
|
|
+ if(video_port_mapping_ccir656[unit][i] != DL_HDMITX_VIDCCIR_NOT_CONNECTED) {
|
|
+ p_config->p_swap_table_ccir656[video_port_mapping_ccir656[unit][i] & 0x07F] = 5 - i;
|
|
+ p_config->p_mirror_table_ccir656[video_port_mapping_ccir656[unit][i] & 0x07F] = (u8)(video_port_mapping_ccir656[unit][i] >> 7);
|
|
+ /* Enable port and disable ground port */
|
|
+ if(((5 - i) % 2) == 0) {
|
|
+ p_config->p_enable_video_port_ccir656[i/2] |= 0x0F;
|
|
+ p_config->p_ground_video_port_ccir656[i/2] &= 0xF0;
|
|
+ } else {
|
|
+ p_config->p_enable_video_port_ccir656[i/2] |= 0xF0;
|
|
+ p_config->p_ground_video_port_ccir656[i/2] &= 0x0F;
|
|
+ }
|
|
+ }
|
|
+
|
|
+ /* YUV422 */
|
|
+ if(video_port_mapping_yuv422[unit][i] != DL_HDMITX_VID422_NOT_CONNECTED) {
|
|
+ p_config->p_swap_table_yuv422[video_port_mapping_yuv422[unit][i] & 0x07F] = 5 - i;
|
|
+ p_config->p_mirror_table_yuv422[video_port_mapping_yuv422[unit][i] & 0x07F] = (u8)(video_port_mapping_yuv422[unit][i] >> 7);
|
|
+ /* Enable port and disable ground port */
|
|
+ if(((5 - i) % 2) == 0) {
|
|
+ p_config->p_enable_video_port_yuv422[i/2] |= 0x0F;
|
|
+ p_config->p_ground_video_port_yuv422[i/2] &= 0xF0;
|
|
+ } else {
|
|
+ p_config->p_enable_video_port_yuv422[i/2] |= 0xF0;
|
|
+ p_config->p_ground_video_port_yuv422[i/2] &= 0x0F;
|
|
+ }
|
|
+ }
|
|
+
|
|
+ /* YUV444 */
|
|
+ if(video_port_mapping_yuv444[unit][i] != DL_HDMITX_VID444_NOT_CONNECTED) {
|
|
+ p_config->p_swap_table_yuv444[video_port_mapping_yuv444[unit][i] & 0x07F] = 5 - i;
|
|
+ p_config->p_mirror_table_yuv444[video_port_mapping_yuv444[unit][i] & 0x07F] = (u8)(video_port_mapping_yuv444[unit][i] >> 7);
|
|
+ /* Enable port and disable ground port */
|
|
+ if(((5 - i) % 2) == 0) {
|
|
+ p_config->p_enable_video_port_yuv444[i/2] |= 0x0F;
|
|
+ p_config->p_ground_video_port_yuv444[i/2] &= 0xF0;
|
|
+ } else {
|
|
+ p_config->p_enable_video_port_yuv444[i/2] |= 0xF0;
|
|
+ p_config->p_ground_video_port_yuv444[i/2] &= 0x0F;
|
|
+ }
|
|
+ }
|
|
+
|
|
+ /* RGB444 */
|
|
+ if(video_port_mapping_rgb444[unit][i] != DL_HDMITX_VID444_NOT_CONNECTED) {
|
|
+ p_config->p_swap_table_rgb444[video_port_mapping_rgb444[unit][i] & 0x07F] = 5 - i;
|
|
+ p_config->p_mirror_table_rgb444[video_port_mapping_rgb444[unit][i] & 0x07F] = (u8)(video_port_mapping_rgb444[unit][i] >> 7);
|
|
+ /* Enable port and disable ground port */
|
|
+ if(((5 - i) % 2) == 0) {
|
|
+ p_config->p_enable_video_port_rgb444[i/2] |= 0x0F;
|
|
+ p_config->p_ground_video_port_rgb444[i/2] &= 0xF0;
|
|
+ } else {
|
|
+ p_config->p_enable_video_port_rgb444[i/2] |= 0xF0;
|
|
+ p_config->p_ground_video_port_rgb444[i/2] &= 0x0F;
|
|
+ }
|
|
+ }
|
|
+ }
|
|
+}
|
|
+
|
|
+/******************************************************************************
|
|
+ * \brief This function allows to the main driver to retrieve its
|
|
+ * configuration parameters.
|
|
+ *
|
|
+ * \param pConfig Pointer to the config structure
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMITX_BAD_UNIT_NUMBER: the unit number is wrong or
|
|
+ * the receiver instance is not initialised
|
|
+ * - ERR_DLHDMITX_INCONSISTENT_PARAMS: an input parameter is
|
|
+ * inconsistent
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+error_code_t tx_cfg_get_config
|
|
+(
|
|
+ unit_select_t unit,
|
|
+ tx_driver_config_table_t *p_config
|
|
+)
|
|
+{
|
|
+ /* Check if unit number is in range */
|
|
+ RETIF((unit < 0) || (unit >= MAX_UNITS), ERR_DLHDMITX_BAD_UNIT_NUMBER)
|
|
+
|
|
+ /* Check if pointer is NULL */
|
|
+ RETIF(p_config == NULL, ERR_DLHDMITX_INCONSISTENT_PARAMS)
|
|
+
|
|
+ *p_config = driver_config_table_tx[unit];
|
|
+
|
|
+ /* Done here because of const declaration of tables in ARM7 case */
|
|
+ p_config->p_resolution_info = (ptx_cfg_resolution_t)resolution_info_tx;
|
|
+
|
|
+ /* Generate swap and mirror tables in function of video port mapping tables */
|
|
+ dl_hdmi_tx_generate_cfg_video_port_tables(unit, p_config);
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+/*============================================================================*/
|
|
+/* END OF FILE */
|
|
+/*============================================================================*/
|
|
diff --git a/drivers/video/hdmi/comps/tmdlTDA9983/cfg/tmdlHdmiTx_cfg.c b/drivers/video/hdmi/comps/tmdlTDA9983/cfg/tmdlHdmiTx_cfg.c
|
|
new file mode 100755
|
|
index 0000000..74ea1bd
|
|
--- /dev/null
|
|
+++ b/drivers/video/hdmi/comps/tmdlTDA9983/cfg/tmdlHdmiTx_cfg.c
|
|
@@ -0,0 +1,797 @@
|
|
+/**
|
|
+ * Copyright (C) 2006 NXP N.V., All Rights Reserved.
|
|
+ * This source code and any compilation or derivative thereof is the proprietary
|
|
+ * information of NXP N.V. and is confidential in nature. Under no circumstances
|
|
+ * is this software to be exposed to or placed under an Open Source License of
|
|
+ * any type without the expressed written permission of NXP N.V.
|
|
+ *
|
|
+ * \file tx_cfg.c
|
|
+ *
|
|
+ * \version Revision: 1
|
|
+ *
|
|
+ * \date Date: 08/08/07 11:00
|
|
+ *
|
|
+ * \brief devlib driver component API for the TDA998x HDMI Transmitters
|
|
+ *
|
|
+ * \section refs Reference Documents
|
|
+ * HDMI Tx Driver - FRS.doc,
|
|
+ *
|
|
+ * \section info Change Information
|
|
+ *
|
|
+ * \verbatim
|
|
+ *
|
|
+ * History: tx_cfg.c
|
|
+ *
|
|
+ * ***************** Version 1 *****************
|
|
+ * User: J. Lamotte Date: 08/08/07 Time: 11:00
|
|
+ * initial version
|
|
+ *
|
|
+ *
|
|
+ * \endverbatim
|
|
+ *
|
|
+ * */
|
|
+
|
|
+/*============================================================================*/
|
|
+/* INCLUDE FILES */
|
|
+/*============================================================================*/
|
|
+#include "tmdlHdmiTx_IW.h"
|
|
+#include "tmNxTypes.h"
|
|
+#include "tmdlHdmiTx.h"
|
|
+#include "tmdlHdmiTx_cfg.h"
|
|
+
|
|
+#ifdef TMFL_OS_WINDOWS /* OS Windows */
|
|
+#include "infra_i2c.h"
|
|
+#else /* OS ARM7 */
|
|
+#include "I2C.h"
|
|
+#include <LPC21xx.H>
|
|
+#endif /* endif TMFL_OS_WINDOWS */
|
|
+
|
|
+#include "tmbslHdmiTx.h"
|
|
+
|
|
+/******************************************************************************
|
|
+ ******************************************************************************
|
|
+ * THIS PART CAN BE MODIFIED BY CUSTOMER *
|
|
+ ******************************************************************************
|
|
+ *****************************************************************************/
|
|
+
|
|
+/*============================================================================*/
|
|
+/* INTERNAL PROTOTYPE */
|
|
+/*============================================================================*/
|
|
+#ifdef TMFL_OS_WINDOWS /* OS Windows */
|
|
+error_code_t windows_i2c_read_function(bsl_sys_args_t *p_sys_args);
|
|
+error_code_t windows_i2c_write_function(bsl_sys_args_t *p_sys_args);
|
|
+#else /* OS ARM7 */
|
|
+error_code_t rtx_tx_i2c_read_function(bsl_sys_args_t *p_sys_args);
|
|
+error_code_t rtx_tx_i2c_write_function(bsl_sys_args_t *p_sys_args);
|
|
+#endif /* endif TMFL_OS_WINDOWS */
|
|
+
|
|
+error_code_t edid_read_function(bsl_sys_args_edid_t *p_sys_args);
|
|
+
|
|
+/*============================================================================*/
|
|
+/* MACRO */
|
|
+/*============================================================================*/
|
|
+
|
|
+/* macro for quick error handling */
|
|
+#define RETIF(cond, rslt) if ((cond)){return (rslt);}
|
|
+
|
|
+/*============================================================================*/
|
|
+/* TYPES DECLARATIONS */
|
|
+/*============================================================================*/
|
|
+
|
|
+/*============================================================================*/
|
|
+/* CONSTANTS DECLARATIONS */
|
|
+/*============================================================================*/
|
|
+
|
|
+/* Configuration for unit 0 *************************** */
|
|
+/* priority of the command tasks */
|
|
+#ifdef TMFL_OS_WINDOWS /* OS Windows */
|
|
+#define COMMAND_TASK_PRIORITY_0 THREAD_PRIORITY_HIGHEST
|
|
+#else /* OS ARM7 */
|
|
+#define COMMAND_TASK_PRIORITY_0 250
|
|
+#endif /* endif TMFL_OS_WINDOWS */
|
|
+/* stack size of the command tasks */
|
|
+#define COMMAND_TASK_STACKSIZE_0 128
|
|
+/* size of the message queues for command tasks */
|
|
+#define COMMAND_TASK_QUEUESIZE_0 128
|
|
+
|
|
+/* priority of the hdcp check tasks */
|
|
+#ifdef TMFL_OS_WINDOWS /* OS Windows */
|
|
+#define HDCP_CHECK_TASK_PRIORITY_0 THREAD_PRIORITY_HIGHEST
|
|
+#else /* OS ARM7 */
|
|
+#define HDCP_CHECK_TASK_PRIORITY_0 250
|
|
+#endif /* endif TMFL_OS_WINDOWS */
|
|
+
|
|
+/* stack size of the hdcp check tasks */
|
|
+#define HDCP_CHECK_TASK_STACKSIZE_0 128
|
|
+/* I2C adress of the unit */
|
|
+#define UNIT_I2C_ADDRESS_0 0x70
|
|
+
|
|
+/* Configuration for unit 1 *************************** */
|
|
+/* priority of the command tasks */
|
|
+#ifdef TMFL_OS_WINDOWS /* OS Windows */
|
|
+#define COMMAND_TASK_PRIORITY_1 THREAD_PRIORITY_HIGHEST
|
|
+#else /* OS ARM7 */
|
|
+#define COMMAND_TASK_PRIORITY_1 250
|
|
+#endif /* endif TMFL_OS_WINDOWS */
|
|
+/* stack size of the command tasks */
|
|
+#define COMMAND_TASK_STACKSIZE_1 128
|
|
+/* size of the message queues for command tasks */
|
|
+#define COMMAND_TASK_QUEUESIZE_1 128
|
|
+
|
|
+/* priority of the hdcp check tasks */
|
|
+#ifdef TMFL_OS_WINDOWS /* OS Windows */
|
|
+#define HDCP_CHECK_TASK_PRIORITY_1 THREAD_PRIORITY_HIGHEST
|
|
+#else /* OS ARM7 */
|
|
+#define HDCP_CHECK_TASK_PRIORITY_1 250
|
|
+#endif /* endif TMFL_OS_WINDOWS */
|
|
+
|
|
+/* stack size of the hdcp check tasks */
|
|
+#define HDCP_CHECK_TASK_STACKSIZE_1 128
|
|
+/* I2C adress of the unit */
|
|
+#define UNIT_I2C_ADDRESS_1 0x71
|
|
+
|
|
+/* Resolution supported */
|
|
+#ifndef FORMAT_PC
|
|
+#define RESOLUTION_NB 34
|
|
+#else
|
|
+#define RESOLUTION_NB 61
|
|
+#endif /* FORMAT_PC */
|
|
+
|
|
+/* HDCP key */
|
|
+#define KEY_SEED 0x1234
|
|
+
|
|
+/* Audio port configuration, bitn = 1 to enable port n, = 0 to disable port n */
|
|
+#define ENABLE_ALL_AUDIO_PORT 0xFF
|
|
+
|
|
+/* Audio clock port configuration */
|
|
+#define ENABLE_AUDIO_CLOCK_PORT true
|
|
+#define DISABLE_AUDIO_CLOCK_PORT false
|
|
+
|
|
+/* Audio port configuration, bitn = 1 to pulldown port n, = 0 to pulldown port n */
|
|
+#define DISABLE_ALL_AUDIO_PORT_PULLDOWN 0x00
|
|
+
|
|
+/* Audio clock port pulldown configuration */
|
|
+#define ENABLE_AUDIO_CLOCK_PORT_PULLDOWN true
|
|
+#define DISABLE_AUDIO_CLOCK_PORT_PULLDOWN false
|
|
+
|
|
+/*============================================================================*/
|
|
+/* DEFINES DECLARATIONS */
|
|
+/*============================================================================*/
|
|
+
|
|
+/*============================================================================*/
|
|
+/* VARIABLES DECLARATIONS */
|
|
+/*============================================================================*/
|
|
+
|
|
+/**
|
|
+ * \brief List of the resolution to be detected by the device library
|
|
+ * */
|
|
+
|
|
+#ifdef TMFL_OS_WINDOWS /* OS Windows */
|
|
+tx_cfg_resolution_t resolution_info_tx[RESOLUTION_NB] = {
|
|
+#else /* OS ARM7 */
|
|
+const tx_cfg_resolution_t resolution_info_tx[RESOLUTION_NB] = {
|
|
+#endif /* endif TMFL_OS_WINDOWS */
|
|
+ /* TV Formats */
|
|
+ /* 60 HZ */
|
|
+ {dl_hdmitx_vfmt_01_640x480p_60hz, 640, 480, false, dl_hdmitx_vfreq_59hz, DL_HDMITX_P_ASPECT_RATIO_4_3},
|
|
+ {dl_hdmitx_vfmt_02_720x480p_60hz, 720, 480, false, dl_hdmitx_vfreq_59hz, DL_HDMITX_P_ASPECT_RATIO_4_3},
|
|
+ {dl_hdmitx_vfmt_03_720x480p_60hz, 720, 480, false, dl_hdmitx_vfreq_59hz, DL_HDMITX_P_ASPECT_RATIO_16_9},
|
|
+ {dl_hdmitx_vfmt_04_1280x720p_60hz, 1280, 720, false, dl_hdmitx_vfreq_60hz, DL_HDMITX_P_ASPECT_RATIO_16_9},
|
|
+ {dl_hdmitx_vfmt_05_1920x1080i_60hz, 1920, 1080, true, dl_hdmitx_vfreq_60hz, DL_HDMITX_P_ASPECT_RATIO_16_9},
|
|
+ {dl_hdmitx_vfmt_06_720x480i_60hz, 720, 480, true, dl_hdmitx_vfreq_59hz, DL_HDMITX_P_ASPECT_RATIO_4_3},
|
|
+ {dl_hdmitx_vfmt_07_720x480i_60hz, 720, 480, true, dl_hdmitx_vfreq_59hz, DL_HDMITX_P_ASPECT_RATIO_16_9},
|
|
+ {dl_hdmitx_vfmt_08_720x240p_60hz, 720, 240, false, dl_hdmitx_vfreq_59hz, DL_HDMITX_P_ASPECT_RATIO_4_3},
|
|
+ {dl_hdmitx_vfmt_09_720x240p_60hz, 720, 240, false, dl_hdmitx_vfreq_59hz, DL_HDMITX_P_ASPECT_RATIO_16_9},
|
|
+ {dl_hdmitx_vfmt_10_720x480i_60hz, 720, 480, true, dl_hdmitx_vfreq_59hz, DL_HDMITX_P_ASPECT_RATIO_4_3},
|
|
+ {dl_hdmitx_vfmt_11_720x480i_60hz, 720, 480, true, dl_hdmitx_vfreq_59hz, DL_HDMITX_P_ASPECT_RATIO_16_9},
|
|
+ {dl_hdmitx_vfmt_12_720x240p_60hz, 720, 240, false, dl_hdmitx_vfreq_59hz, DL_HDMITX_P_ASPECT_RATIO_4_3},
|
|
+ {dl_hdmitx_vfmt_13_720x240p_60hz, 720, 240, false, dl_hdmitx_vfreq_59hz, DL_HDMITX_P_ASPECT_RATIO_16_9},
|
|
+ {dl_hdmitx_vfmt_14_1440x480p_60hz, 1440, 480, false, dl_hdmitx_vfreq_59hz, DL_HDMITX_P_ASPECT_RATIO_4_3},
|
|
+ {dl_hdmitx_vfmt_15_1440x480p_60hz, 1440, 480, false, dl_hdmitx_vfreq_59hz, DL_HDMITX_P_ASPECT_RATIO_16_9},
|
|
+ {dl_hdmitx_vfmt_16_1920x1080p_60hz, 1920, 1080, false, dl_hdmitx_vfreq_60hz, DL_HDMITX_P_ASPECT_RATIO_16_9},
|
|
+ /* 50 HZ */
|
|
+ {dl_hdmitx_vfmt_17_720x576p_50hz, 720, 576, false, dl_hdmitx_vfreq_50hz, DL_HDMITX_P_ASPECT_RATIO_4_3},
|
|
+ {dl_hdmitx_vfmt_18_720x576p_50hz, 720, 576, false, dl_hdmitx_vfreq_50hz, DL_HDMITX_P_ASPECT_RATIO_16_9},
|
|
+ {dl_hdmitx_vfmt_19_1280x720p_50hz, 1280, 720, false, dl_hdmitx_vfreq_50hz, DL_HDMITX_P_ASPECT_RATIO_16_9},
|
|
+ {dl_hdmitx_vfmt_20_1920x1080i_50hz, 1920, 1080, true, dl_hdmitx_vfreq_50hz, DL_HDMITX_P_ASPECT_RATIO_16_9},
|
|
+ {dl_hdmitx_vfmt_21_720x576i_50hz, 720, 576, true, dl_hdmitx_vfreq_50hz, DL_HDMITX_P_ASPECT_RATIO_4_3},
|
|
+ {dl_hdmitx_vfmt_22_720x576i_50hz, 720, 576, true, dl_hdmitx_vfreq_50hz, DL_HDMITX_P_ASPECT_RATIO_16_9},
|
|
+ {dl_hdmitx_vfmt_23_720x288p_50hz, 720, 288, false, dl_hdmitx_vfreq_50hz, DL_HDMITX_P_ASPECT_RATIO_4_3},
|
|
+ {dl_hdmitx_vfmt_24_720x288p_50hz, 720, 288, false, dl_hdmitx_vfreq_50hz, DL_HDMITX_P_ASPECT_RATIO_16_9},
|
|
+ {dl_hdmitx_vfmt_25_720x576i_50hz, 720, 576, true, dl_hdmitx_vfreq_50hz, DL_HDMITX_P_ASPECT_RATIO_4_3},
|
|
+ {dl_hdmitx_vfmt_26_720x576i_50hz, 720, 576, true, dl_hdmitx_vfreq_50hz, DL_HDMITX_P_ASPECT_RATIO_16_9},
|
|
+ {dl_hdmitx_vfmt_27_720x288p_50hz, 720, 288, false, dl_hdmitx_vfreq_50hz, DL_HDMITX_P_ASPECT_RATIO_4_3},
|
|
+ {dl_hdmitx_vfmt_28_720x288p_50hz, 720, 288, false, dl_hdmitx_vfreq_50hz, DL_HDMITX_P_ASPECT_RATIO_16_9},
|
|
+ {dl_hdmitx_vfmt_29_1440x576p_50hz, 1440, 576, false, dl_hdmitx_vfreq_50hz, DL_HDMITX_P_ASPECT_RATIO_4_3},
|
|
+ {dl_hdmitx_vfmt_30_1440x576p_50hz, 1440, 576, false, dl_hdmitx_vfreq_50hz, DL_HDMITX_P_ASPECT_RATIO_16_9},
|
|
+ {dl_hdmitx_vfmt_31_1920x1080p_50hz, 1920, 1080, false, dl_hdmitx_vfreq_50hz, DL_HDMITX_P_ASPECT_RATIO_16_9},
|
|
+ {dl_hdmitx_vfmt_32_1920x1080p_24hz, 1920, 1080, false, dl_hdmitx_vfreq_24hz, DL_HDMITX_P_ASPECT_RATIO_16_9},
|
|
+ {dl_hdmitx_vfmt_33_1920x1080p_25hz, 1920, 1080, false, dl_hdmitx_vfreq_25hz, DL_HDMITX_P_ASPECT_RATIO_16_9},
|
|
+ {dl_hdmitx_vfmt_34_1920x1080p_30hz, 1920, 1080, false, dl_hdmitx_vfreq_30hz, DL_HDMITX_P_ASPECT_RATIO_16_9}
|
|
+#ifdef FORMAT_PC
|
|
+ /* PC Formats */
|
|
+ /* 60 HZ */
|
|
+ , {dl_hdmitx_vfmt_pc_640x480p_60hz, 640, 480, false, dl_hdmitx_vfreq_60hz, DL_HDMITX_P_ASPECT_RATIO_4_3},
|
|
+ {dl_hdmitx_vfmt_pc_800x600p_60hz, 800, 600, false, dl_hdmitx_vfreq_60hz, DL_HDMITX_P_ASPECT_RATIO_4_3},
|
|
+ {dl_hdmitx_vfmt_pc_1152x960p_60hz, 1152, 960, false, dl_hdmitx_vfreq_60hz, DL_HDMITX_P_ASPECT_RATIO_6_5},
|
|
+ {dl_hdmitx_vfmt_pc_1024x768p_60hz, 1024, 768, false, dl_hdmitx_vfreq_60hz, DL_HDMITX_P_ASPECT_RATIO_4_3},
|
|
+ {dl_hdmitx_vfmt_pc_1280x768p_60hz, 1280, 768, false, dl_hdmitx_vfreq_60hz, DL_HDMITX_P_ASPECT_RATIO_5_3},
|
|
+ {dl_hdmitx_vfmt_pc_1280x1024p_60hz, 1280, 1024, false, dl_hdmitx_vfreq_60hz, DL_HDMITX_P_ASPECT_RATIO_5_4},
|
|
+ {dl_hdmitx_vfmt_pc_1360x768p_60hz, 1360, 768, false, dl_hdmitx_vfreq_60hz, DL_HDMITX_P_ASPECT_RATIO_16_9},
|
|
+ {dl_hdmitx_vfmt_pc_1400x1050p_60hz, 1400, 1050, false, dl_hdmitx_vfreq_60hz, DL_HDMITX_P_ASPECT_RATIO_4_3},
|
|
+ {dl_hdmitx_vfmt_pc_1600x1200p_60hz, 1600, 1200, false, dl_hdmitx_vfreq_60hz, DL_HDMITX_P_ASPECT_RATIO_4_3},
|
|
+ /* 70 HZ */
|
|
+ {dl_hdmitx_vfmt_pc_1024x768p_70hz, 1024, 768, false, dl_hdmitx_vfreq_70hz, DL_HDMITX_P_ASPECT_RATIO_4_3},
|
|
+ /* 72 HZ */
|
|
+ {dl_hdmitx_vfmt_pc_640x480p_72hz, 640, 480, false, dl_hdmitx_vfreq_72hz, DL_HDMITX_P_ASPECT_RATIO_4_3},
|
|
+ {dl_hdmitx_vfmt_pc_800x600p_72hz, 800, 600, false, dl_hdmitx_vfreq_72hz, DL_HDMITX_P_ASPECT_RATIO_4_3},
|
|
+ /* 75 HZ */
|
|
+ {dl_hdmitx_vfmt_pc_640x480p_75hz, 640, 480, false, dl_hdmitx_vfreq_75hz, DL_HDMITX_P_ASPECT_RATIO_4_3},
|
|
+ {dl_hdmitx_vfmt_pc_1024x768p_75hz, 1024, 768, false, dl_hdmitx_vfreq_75hz, DL_HDMITX_P_ASPECT_RATIO_4_3},
|
|
+ {dl_hdmitx_vfmt_pc_800x600p_75hz, 800, 600, false, dl_hdmitx_vfreq_75hz, DL_HDMITX_P_ASPECT_RATIO_4_3},
|
|
+ {dl_hdmitx_vfmt_pc_1024x864p_75hz, 1024, 864, false, dl_hdmitx_vfreq_75hz, DL_HDMITX_P_ASPECT_RATIO_UNDEFINED},
|
|
+ {dl_hdmitx_vfmt_pc_1280x1024p_75hz, 1280, 1024, false, dl_hdmitx_vfreq_75hz, DL_HDMITX_P_ASPECT_RATIO_5_4},
|
|
+ /* 85 HZ */
|
|
+ {dl_hdmitx_vfmt_pc_640x350p_85hz, 640, 350, false, dl_hdmitx_vfreq_85hz, DL_HDMITX_P_ASPECT_RATIO_UNDEFINED},
|
|
+ {dl_hdmitx_vfmt_pc_640x400p_85hz, 640, 400, false, dl_hdmitx_vfreq_85hz, DL_HDMITX_P_ASPECT_RATIO_16_10},
|
|
+ {dl_hdmitx_vfmt_pc_720x400p_85hz, 720, 400, false, dl_hdmitx_vfreq_85hz, DL_HDMITX_P_ASPECT_RATIO_9_5},
|
|
+ {dl_hdmitx_vfmt_pc_640x480p_85hz, 640, 480, false, dl_hdmitx_vfreq_85hz, DL_HDMITX_P_ASPECT_RATIO_4_3},
|
|
+ {dl_hdmitx_vfmt_pc_800x600p_85hz, 800, 600, false, dl_hdmitx_vfreq_85hz, DL_HDMITX_P_ASPECT_RATIO_4_3},
|
|
+ {dl_hdmitx_vfmt_pc_1024x768p_85hz, 1024, 768, false, dl_hdmitx_vfreq_85hz, DL_HDMITX_P_ASPECT_RATIO_4_3},
|
|
+ {dl_hdmitx_vfmt_pc_1152x864p_85hz, 1152, 864, false, dl_hdmitx_vfreq_85hz, DL_HDMITX_P_ASPECT_RATIO_4_3},
|
|
+ {dl_hdmitx_vfmt_pc_1280x960p_85hz, 1280, 960, false, dl_hdmitx_vfreq_85hz, DL_HDMITX_P_ASPECT_RATIO_4_3},
|
|
+ {dl_hdmitx_vfmt_pc_1280x1024p_85hz, 1280, 1024, false, dl_hdmitx_vfreq_85hz, DL_HDMITX_P_ASPECT_RATIO_5_4},
|
|
+ /* 87 HZ */
|
|
+ {dl_hdmitx_vfmt_pc_1024x768i_87hz, 1024, 768, true, dl_hdmitx_vfreq_87hz, DL_HDMITX_P_ASPECT_RATIO_4_3}
|
|
+#endif /* FORMAT_PC */
|
|
+};
|
|
+
|
|
+#ifdef TMFL_OS_WINDOWS /* OS Windows */
|
|
+tx_cfg_video_signal444 video_port_mapping_yuv444[MAX_UNITS][6] = {
|
|
+#else /* OS ARM7 */
|
|
+const tx_cfg_video_signal444 video_port_mapping_yuv444[MAX_UNITS][6] = {
|
|
+#endif /* endif TMFL_OS_WINDOWS */
|
|
+ {
|
|
+ DL_HDMITX_VID444_BU_0_TO_3, /* Signals connected to VPA[0..3] */
|
|
+ DL_HDMITX_VID444_BU_4_TO_7, /* Signals connected to VPA[4..7] */
|
|
+ DL_HDMITX_VID444_GY_0_TO_3, /* Signals connected to VPB[0..3] */
|
|
+ DL_HDMITX_VID444_GY_4_TO_7, /* Signals connected to VPB[4..7] */
|
|
+ DL_HDMITX_VID444_VR_0_TO_3, /* Signals connected to VPC[0..3] */
|
|
+ DL_HDMITX_VID444_VR_4_TO_7 /* Signals connected to VPC[4..7] */
|
|
+ }
|
|
+};
|
|
+
|
|
+#ifdef TMFL_OS_WINDOWS /* OS Windows */
|
|
+tx_cfg_video_signal444 video_port_mapping_rgb444[MAX_UNITS][6] = {
|
|
+#else /* OS ARM7 */
|
|
+const tx_cfg_video_signal444 video_port_mapping_rgb444[MAX_UNITS][6] = {
|
|
+#endif /* endif TMFL_OS_WINDOWS */
|
|
+ {
|
|
+ DL_HDMITX_VID444_BU_0_TO_3, /* Signals connected to VPA[0..3] */
|
|
+ DL_HDMITX_VID444_BU_4_TO_7, /* Signals connected to VPA[4..7] */
|
|
+ DL_HDMITX_VID444_GY_0_TO_3, /* Signals connected to VPB[0..3] */
|
|
+ DL_HDMITX_VID444_GY_4_TO_7, /* Signals connected to VPB[4..7] */
|
|
+ DL_HDMITX_VID444_VR_0_TO_3, /* Signals connected to VPC[0..3] */
|
|
+ DL_HDMITX_VID444_VR_4_TO_7 /* Signals connected to VPC[4..7] */
|
|
+ }
|
|
+};
|
|
+
|
|
+#ifdef TMFL_OS_WINDOWS /* OS Windows */
|
|
+tx_cfg_video_signal422 video_port_mapping_yuv422[MAX_UNITS][6] = {
|
|
+#else /* OS ARM7 */
|
|
+const tx_cfg_video_signal422 video_port_mapping_yuv422[MAX_UNITS][6] = {
|
|
+#endif /* endif TMFL_OS_WINDOWS */
|
|
+
|
|
+ {
|
|
+ /* Signals connected to VPA[0..3] */
|
|
+ DL_HDMITX_VID422_Y_4_TO_7,
|
|
+ /* Signals connected to VPA[4..7] */
|
|
+ DL_HDMITX_VID422_Y_8_TO_11,
|
|
+ /* Signals connected to VPB[0..3] */
|
|
+ DL_HDMITX_VID422_UV_4_TO_7,
|
|
+ /* Signals connected to VPB[4..7] */
|
|
+ DL_HDMITX_VID422_UV_8_TO_11,
|
|
+ /* Signals connected to VPC[0..3] */
|
|
+ DL_HDMITX_VID422_NOT_CONNECTED,
|
|
+ /* Signals connected to VPC[4..7] */
|
|
+ DL_HDMITX_VID422_NOT_CONNECTED
|
|
+ }
|
|
+};
|
|
+
|
|
+#ifdef TMFL_OS_WINDOWS /* OS Windows */
|
|
+tx_cfg_video_signal_ccir656 video_port_mapping_ccir656[MAX_UNITS][6] = {
|
|
+#else /* OS ARM7 */
|
|
+const tx_cfg_video_signal_ccir656 video_port_mapping_ccir656[MAX_UNITS][6] = {
|
|
+#endif /* endif TMFL_OS_WINDOWS */
|
|
+ {
|
|
+ /* Signals connected to VPA[0..3] */
|
|
+ DL_HDMITX_VIDCCIR_4_TO_7,
|
|
+ /* Signals connected to VPA[4..7] */
|
|
+ DL_HDMITX_VIDCCIR_8_TO_11,
|
|
+ /* Signals connected to VPB[0..3] */
|
|
+ DL_HDMITX_VIDCCIR_NOT_CONNECTED,
|
|
+ /* Signals connected to VPB[4..7] */
|
|
+ DL_HDMITX_VIDCCIR_NOT_CONNECTED,
|
|
+ /* Signals connected to VPC[0..3] */
|
|
+ DL_HDMITX_VIDCCIR_NOT_CONNECTED,
|
|
+ /* Signals connected to VPC[4..7] */
|
|
+ DL_HDMITX_VIDCCIR_NOT_CONNECTED
|
|
+ }
|
|
+};
|
|
+
|
|
+/* Audio port configuration for SPDIF */
|
|
+/* Here you can specify the audio port routing configuration for SPDIF input. */
|
|
+/* enableAudioPortSPDIF and groundAudioPortSPDIF should be filled with a */
|
|
+/* value build as follows : each bit represent an audio port, LSB is port 0. */
|
|
+/* enableAudioClockPortSPDIF and groundAudioClockPortSPDIF can be configured */
|
|
+/* with the corresponding enums (See file tx_cfg.h for more details). */
|
|
+uint8 enable_audio_port_spdif[MAX_UNITS] = {0x40};
|
|
+uint8 enable_audio_clock_port_spdif[MAX_UNITS] = {DISABLE_AUDIO_CLOCK_PORT};
|
|
+uint8 ground_audio_port_spdif[MAX_UNITS] = {0xBF};
|
|
+uint8 ground_audio_clock_port_spdif[MAX_UNITS] = {ENABLE_AUDIO_CLOCK_PORT_PULLDOWN};
|
|
+
|
|
+/* Audio port configuration for I2S */
|
|
+/* Here you can specify the audio port routing configuration for SPDIF input. */
|
|
+/* enableAudioPortI2S and groundAudioPortI2S should be filled with a */
|
|
+/* value build as follows : each bit represent an audio port, LSB is port 0. */
|
|
+/* enableAudioClockPortI2S and groundAudioClockPortI2S can be configured */
|
|
+/* with the corresponding enums (See file tx_cfg.h for more details). */
|
|
+uint8 enable_audio_port_i2s[MAX_UNITS] = {0x03};
|
|
+uint8 enable_audio_port_i2s8c[MAX_UNITS] = {0x1F};
|
|
+uint8 enable_audio_clock_port_i2s[MAX_UNITS] = {ENABLE_AUDIO_CLOCK_PORT};
|
|
+uint8 ground_audio_port_i2s[MAX_UNITS] = {0xFC};
|
|
+uint8 ground_audio_port_i2s8c[MAX_UNITS] = {0xE0};
|
|
+uint8 ground_audio_clock_port_i2s[MAX_UNITS] = {DISABLE_AUDIO_CLOCK_PORT_PULLDOWN};
|
|
+
|
|
+/* Audio port configuration for OBA */
|
|
+/* Here you can specify the audio port routing configuration for SPDIF input. */
|
|
+/* enableAudioPortOBA and groundAudioPortOBA should be filled with a */
|
|
+/* value build as follows : each bit represent an audio port, LSB is port 0. */
|
|
+/* enableAudioClockPortOBA and groundAudioClockPortOBA can be configured */
|
|
+/* with the corresponding enums (See file tx_cfg.h for more details). */
|
|
+uint8 enable_audio_port_oba[MAX_UNITS] = {0xFF};
|
|
+uint8 enable_audio_clock_port_oba[MAX_UNITS] = {ENABLE_AUDIO_CLOCK_PORT};
|
|
+uint8 ground_audio_port_oba[MAX_UNITS] = {0x00};
|
|
+uint8 ground_audio_clock_port_oba[MAX_UNITS] = {DISABLE_AUDIO_CLOCK_PORT_PULLDOWN};
|
|
+
|
|
+/* Audio port configuration for DST */
|
|
+/* Here you can specify the audio port routing configuration for SPDIF input. */
|
|
+/* enableAudioPortDST and groundAudioPortDST should be filled with a */
|
|
+/* value build as follows : each bit represent an audio port, LSB is port 0. */
|
|
+/* enableAudioClockPortDST and groundAudioClockPortDST can be configured */
|
|
+/* with the corresponding enums (See file tx_cfg.h for more details). */
|
|
+uint8 enable_audio_port_dst[MAX_UNITS] = {0xFF};
|
|
+uint8 enable_audio_clock_port_dst[MAX_UNITS] = {ENABLE_AUDIO_CLOCK_PORT};
|
|
+uint8 ground_audio_port_dst[MAX_UNITS] = {0x00};
|
|
+uint8 ground_audio_clock_port_dst[MAX_UNITS] = {DISABLE_AUDIO_CLOCK_PORT_PULLDOWN};
|
|
+
|
|
+/* Audio port configuration for HBR */
|
|
+/* Here you can specify the audio port routing configuration for SPDIF input. */
|
|
+/* enableAudioPortHBR and groundAudioPortHBR should be filled with a */
|
|
+/* value build as follows : each bit represent an audio port, LSB is port 0. */
|
|
+/* enableAudioClockPortHBR and groundAudioClockPortHBR can be configured */
|
|
+/* with the corresponding enums (See file tx_cfg.h for more details). */
|
|
+uint8 enable_audio_port_hbr[MAX_UNITS] = {0x1F};
|
|
+uint8 enable_audio_clock_port_hbr[MAX_UNITS] = {ENABLE_AUDIO_CLOCK_PORT};
|
|
+uint8 ground_audio_port_hbr[MAX_UNITS] = {0xE0};
|
|
+uint8 ground_audio_clock_port_hbr[MAX_UNITS] = {DISABLE_AUDIO_CLOCK_PORT_PULLDOWN};
|
|
+
|
|
+/* Do not modify, those tables are filled dynamically by dlHdmiTxGenerateCfgVideoPortTables API */
|
|
+uint8 mirror_table_ccir656[MAX_UNITS][6] = {{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}};
|
|
+uint8 swap_table_ccir656[MAX_UNITS][6] = {{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}};
|
|
+uint8 enable_video_port_ccir656[MAX_UNITS][3] = {{0x00, 0x00, 0x00}};
|
|
+uint8 ground_video_port_ccir656[MAX_UNITS][3] = {{0xFF, 0xFF, 0xFF}};
|
|
+uint8 mirror_table_yuv422[MAX_UNITS][6] = {{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}};
|
|
+uint8 swap_table_yuv422[MAX_UNITS][6] = {{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}};
|
|
+uint8 enable_video_port_yuv422[MAX_UNITS][3] = {{0x00, 0x00, 0x00}};
|
|
+uint8 ground_video_port_yuv422[MAX_UNITS][3] = {{0xFF, 0xFF, 0xFF}};
|
|
+uint8 mirror_table_yuv444[MAX_UNITS][6] = {{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}};
|
|
+uint8 swap_table_yuv444[MAX_UNITS][6] = {{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}};
|
|
+uint8 enable_video_port_yuv444[MAX_UNITS][3] = {{0x00, 0x00, 0x00}};
|
|
+uint8 ground_video_port_yuv444[MAX_UNITS][3] = {{0xFF, 0xFF, 0xFF}};
|
|
+uint8 mirror_table_rgb444[MAX_UNITS][6] = {{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}};
|
|
+uint8 swap_table_rgb444[MAX_UNITS][6] = {{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}};
|
|
+uint8 enable_video_port_rgb444[MAX_UNITS][3] = {{0x00, 0x00, 0x00}};
|
|
+uint8 ground_video_port_rgb444[MAX_UNITS][3] = {{0xFF, 0xFF, 0xFF}};
|
|
+
|
|
+/**
|
|
+ * \brief Configuration Tables. This table can be modified by the customer
|
|
+ * to choose its prefered configuration.
|
|
+ * */
|
|
+#ifdef TMFL_OS_WINDOWS /* OS Windows */
|
|
+tx_driver_config_table_t driver_config_table_tx[MAX_UNITS] = {
|
|
+ {
|
|
+ COMMAND_TASK_PRIORITY_0,
|
|
+ COMMAND_TASK_STACKSIZE_0,
|
|
+ COMMAND_TASK_QUEUESIZE_0,
|
|
+ HDCP_CHECK_TASK_PRIORITY_0,
|
|
+ HDCP_CHECK_TASK_STACKSIZE_0,
|
|
+ UNIT_I2C_ADDRESS_0,
|
|
+ windows_i2c_read_function,
|
|
+ windows_i2c_write_function,
|
|
+ edid_read_function,
|
|
+ NULL, /* filled dynamically, do not modify */
|
|
+ RESOLUTION_NB,
|
|
+ /* filled dynamically, do not modify */
|
|
+ &mirror_table_ccir656[0][0],
|
|
+ /* filled dynamically, do not modify */
|
|
+ &swap_table_ccir656[0][0],
|
|
+ /* filled dynamically, do not modify */
|
|
+ &enable_video_port_ccir656[0][0],
|
|
+ /* filled dynamically, do not modify */
|
|
+ &ground_video_port_ccir656[0][0],
|
|
+ /* filled dynamically, do not modify */
|
|
+ &mirror_table_yuv422[0][0],
|
|
+ /* filled dynamically, do not modify */
|
|
+ &swap_table_yuv422[0][0],
|
|
+ /* filled dynamically, do not modify */
|
|
+ &enable_video_port_yuv422[0][0],
|
|
+ /* filled dynamically, do not modify */
|
|
+ &ground_video_port_yuv422[0][0],
|
|
+ /* filled dynamically, do not modify */
|
|
+ &mirror_table_yuv444[0][0],
|
|
+ /* filled dynamically, do not modify */
|
|
+ &swap_table_yuv444[0][0],
|
|
+ /* filled dynamically, do not modify */
|
|
+ &enable_video_port_yuv444[0][0],
|
|
+ /* filled dynamically, do not modify */
|
|
+ &ground_video_port_yuv444[0][0],
|
|
+ /* filled dynamically, do not modify */
|
|
+ &mirror_table_rgb444[0][0],
|
|
+ /* filled dynamically, do not modify */
|
|
+ &swap_table_rgb444[0][0],
|
|
+ /* filled dynamically, do not modify */
|
|
+ &enable_video_port_rgb444[0][0],
|
|
+ /* filled dynamically, do not modify */
|
|
+ &ground_video_port_rgb444[0][0],
|
|
+ &enable_audio_port_spdif[0],
|
|
+ &ground_audio_port_spdif[0],
|
|
+ &enable_audio_clock_port_spdif[0],
|
|
+ &ground_audio_clock_port_spdif[0],
|
|
+ &enable_audio_port_i2s[0],
|
|
+ &ground_audio_port_i2s[0],
|
|
+ &enable_audio_port_i2s8c[0],
|
|
+ &ground_audio_port_i2s8c[0],
|
|
+ &enable_audio_clock_port_i2s[0],
|
|
+ &ground_audio_clock_port_i2s[0],
|
|
+ &enable_audio_port_oba[0],
|
|
+ &ground_audio_port_oba[0],
|
|
+ &enable_audio_clock_port_oba[0],
|
|
+ &ground_audio_clock_port_oba[0],
|
|
+ &enable_audio_port_dst[0],
|
|
+ &ground_audio_port_dst[0],
|
|
+ &enable_audio_clock_port_dst[0],
|
|
+ &ground_audio_clock_port_dst[0],
|
|
+ &enable_audio_port_hbr[0],
|
|
+ &ground_audio_port_hbr[0],
|
|
+ &enable_audio_clock_port_hbr[0],
|
|
+ &ground_audio_clock_port_hbr[0],
|
|
+ KEY_SEED,
|
|
+ DL_HDMITX_PATTERN_BLUE,
|
|
+ /* by default, the DE signal is considered available */
|
|
+ 1
|
|
+ }
|
|
+};
|
|
+#else /* OS ARM7 */
|
|
+tx_driver_config_table_t driver_config_table_tx[MAX_UNITS] = {
|
|
+ {
|
|
+ COMMAND_TASK_PRIORITY_0,
|
|
+ COMMAND_TASK_STACKSIZE_0,
|
|
+ COMMAND_TASK_QUEUESIZE_0,
|
|
+ HDCP_CHECK_TASK_PRIORITY_0,
|
|
+ HDCP_CHECK_TASK_STACKSIZE_0,
|
|
+ UNIT_I2C_ADDRESS_0,
|
|
+ rtx_tx_i2c_read_function,
|
|
+ rtx_tx_i2c_write_function,
|
|
+ edid_read_function,
|
|
+ NULL, /* filled dynamically, do not modify */
|
|
+ RESOLUTION_NB,
|
|
+ /* filled dynamically, do not modify */
|
|
+ &mirror_table_ccir656[0][0],
|
|
+ /* filled dynamically, do not modify */
|
|
+ &swap_table_ccir656[0][0],
|
|
+ /* filled dynamically, do not modify */
|
|
+ &enable_video_port_ccir656[0][0],
|
|
+ /* filled dynamically, do not modify */
|
|
+ &ground_video_port_ccir656[0][0],
|
|
+ /* filled dynamically, do not modify */
|
|
+ &mirror_table_yuv422[0][0],
|
|
+ /* filled dynamically, do not modify */
|
|
+ &swap_table_yuv422[0][0],
|
|
+ /* filled dynamically, do not modify */
|
|
+ &enable_video_port_yuv422[0][0],
|
|
+ /* filled dynamically, do not modify */
|
|
+ &ground_video_port_yuv422[0][0],
|
|
+ /* filled dynamically, do not modify */
|
|
+ &mirror_table_yuv444[0][0],
|
|
+ /* filled dynamically, do not modify */
|
|
+ &swap_table_yuv444[0][0],
|
|
+ /* filled dynamically, do not modify */
|
|
+ &enable_video_port_yuv444[0][0],
|
|
+ /* filled dynamically, do not modify */
|
|
+ &ground_video_port_yuv444[0][0],
|
|
+ /* filled dynamically, do not modify */
|
|
+ &mirror_table_rgb444[0][0],
|
|
+ /* filled dynamically, do not modify */
|
|
+ &swap_table_rgb444[0][0],
|
|
+ /* filled dynamically, do not modify */
|
|
+ &enable_video_port_rgb444[0][0],
|
|
+ /* filled dynamically, do not modify */
|
|
+ &ground_video_port_rgb444[0][0],
|
|
+ &enable_audio_port_spdif[0],
|
|
+ &ground_audio_port_spdif[0],
|
|
+ &enable_audio_clock_port_spdif[0],
|
|
+ &ground_audio_clock_port_spdif[0],
|
|
+ &enable_audio_port_i2s[0],
|
|
+ &ground_audio_port_i2s[0],
|
|
+ &enable_audio_port_i2s8c[0],
|
|
+ &ground_audio_port_i2s8c[0],
|
|
+ &enable_audio_clock_port_i2s[0],
|
|
+ &ground_audio_clock_port_i2s[0],
|
|
+ &enable_audio_port_oba[0],
|
|
+ &ground_audio_port_oba[0],
|
|
+ &enable_audio_clock_port_oba[0],
|
|
+ &ground_audio_clock_port_oba[0],
|
|
+ &enable_audio_port_dst[0],
|
|
+ &ground_audio_port_dst[0],
|
|
+ &enable_audio_clock_port_dst[0],
|
|
+ &ground_audio_clock_port_dst[0],
|
|
+ &enable_audio_port_hbr[0],
|
|
+ &ground_audio_port_hbr[0],
|
|
+ &enable_audio_clock_port_hbr[0],
|
|
+ &ground_audio_clock_port_hbr[0],
|
|
+ KEY_SEED,
|
|
+ DL_HDMITX_PATTERN_BLUE,
|
|
+ /* by default, the DE signal is considered available */
|
|
+ 1
|
|
+ }
|
|
+};
|
|
+#endif /* endif TMFL_OS_WINDOWS */
|
|
+
|
|
+/*============================================================================*/
|
|
+/* FUNCTIONS */
|
|
+/*============================================================================*/
|
|
+#ifdef TMFL_OS_WINDOWS /* OS Windows */
|
|
+/******************************************************************************
|
|
+ * \brief Read to BSL driver through I2C bus
|
|
+ *
|
|
+ * \param pSysArgs Pointer to the I2C read structure
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+error_code_t windows_i2c_read_function
|
|
+(
|
|
+ bsl_sys_args_t *p_sys_args
|
|
+)
|
|
+{
|
|
+ error_code_t err;
|
|
+
|
|
+ err = i2c_read(reg_tda_998x, (bsl_hdmi_sys_args_t *) p_sys_args);
|
|
+
|
|
+ return err;
|
|
+}
|
|
+
|
|
+/******************************************************************************
|
|
+ * \brief Write to BSL driver through I2C bus
|
|
+ *
|
|
+ * \param pSysArgs Pointer to the I2C write structure
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+error_code_t windows_i2c_write_function
|
|
+(
|
|
+ bsl_sys_args_t *p_sys_args
|
|
+)
|
|
+{
|
|
+ error_code_t err;
|
|
+
|
|
+ err = i2c_write(reg_tda_998x, (bsl_hdmi_sys_args_t *) p_sys_args);
|
|
+
|
|
+ return err;
|
|
+}
|
|
+
|
|
+#else /* OS ARM7 */
|
|
+/*============================================================================*/
|
|
+
|
|
+/******************************************************************************
|
|
+ * \brief Write to BSL driver through I2C bus
|
|
+ *
|
|
+ * \param pSysArgs Pointer to the I2C read structure
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+error_code_t
|
|
+rtx_tx_i2c_read_function
|
|
+(
|
|
+ bsl_sys_args_t *p_sys_args
|
|
+)
|
|
+{
|
|
+ error_code_t err;
|
|
+
|
|
+ err = i2c_read(reg_tda_998x, (bsl_hdmi_sys_args_t *) p_sys_args);
|
|
+
|
|
+ return err;
|
|
+}
|
|
+
|
|
+/******************************************************************************
|
|
+ * \brief Write to BSL driver through I2C bus
|
|
+ *
|
|
+ * \param pSysArgs Pointer to the I2C write structure
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+error_code_t
|
|
+rtx_tx_i2c_write_function
|
|
+(
|
|
+ bsl_sys_args_t *p_sys_args
|
|
+)
|
|
+{
|
|
+ error_code_t err;
|
|
+
|
|
+ err = i2c_write(reg_tda_998x, (bsl_hdmi_sys_args_t *) p_sys_args);
|
|
+
|
|
+ return err;
|
|
+}
|
|
+
|
|
+#endif /* endif TMFL_OS_WINDOWS */
|
|
+
|
|
+/*****************************************************************************
|
|
+ ******************************************************************************
|
|
+ * THIS PART MUST NOT BE MODIFIED BY CUSTOMER *
|
|
+ ******************************************************************************
|
|
+ *****************************************************************************/
|
|
+
|
|
+/******************************************************************************
|
|
+ * \brief Generate swap and mirror tables in function
|
|
+ * of video port mapping tables.
|
|
+ *
|
|
+ * \param unit Unit identifier.
|
|
+ *
|
|
+ * \return NA.
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+static void dl_hdmi_tx_generate_cfg_video_port_tables
|
|
+(
|
|
+ unit_select_t unit,
|
|
+ tx_driver_config_table_t *p_config
|
|
+)
|
|
+{
|
|
+ u8 i;
|
|
+
|
|
+ for(i = 0; i < 6; i++) {
|
|
+ /* CCIR656 */
|
|
+ if(video_port_mapping_ccir656[unit][i] != DL_HDMITX_VIDCCIR_NOT_CONNECTED) {
|
|
+ p_config->p_swap_table_ccir656[video_port_mapping_ccir656[unit][i] & 0x07F] = 5 - i;
|
|
+ p_config->p_mirror_table_ccir656[video_port_mapping_ccir656[unit][i] & 0x07F] = (u8)(video_port_mapping_ccir656[unit][i] >> 7);
|
|
+ /* Enable port and disable ground port */
|
|
+ if(((5 - i) % 2) == 0) {
|
|
+ p_config->p_enable_video_port_ccir656[i/2] |= 0x0F;
|
|
+ p_config->p_ground_video_port_ccir656[i/2] &= 0xF0;
|
|
+ } else {
|
|
+ p_config->p_enable_video_port_ccir656[i/2] |= 0xF0;
|
|
+ p_config->p_ground_video_port_ccir656[i/2] &= 0x0F;
|
|
+ }
|
|
+ }
|
|
+
|
|
+ /* YUV422 */
|
|
+ if(video_port_mapping_yuv422[unit][i] != DL_HDMITX_VID422_NOT_CONNECTED) {
|
|
+ p_config->p_swap_table_yuv422[video_port_mapping_yuv422[unit][i] & 0x07F] = 5 - i;
|
|
+ p_config->p_mirror_table_yuv422[video_port_mapping_yuv422[unit][i] & 0x07F] = (u8)(video_port_mapping_yuv422[unit][i] >> 7);
|
|
+ /* Enable port and disable ground port */
|
|
+ if(((5 - i) % 2) == 0) {
|
|
+ p_config->p_enable_video_port_yuv422[i/2] |= 0x0F;
|
|
+ p_config->p_ground_video_port_yuv422[i/2] &= 0xF0;
|
|
+ } else {
|
|
+ p_config->p_enable_video_port_yuv422[i/2] |= 0xF0;
|
|
+ p_config->p_ground_video_port_yuv422[i/2] &= 0x0F;
|
|
+ }
|
|
+ }
|
|
+
|
|
+ /* YUV444 */
|
|
+ if(video_port_mapping_yuv444[unit][i] != DL_HDMITX_VID444_NOT_CONNECTED) {
|
|
+ p_config->p_swap_table_yuv444[video_port_mapping_yuv444[unit][i] & 0x07F] = 5 - i;
|
|
+ p_config->p_mirror_table_yuv444[video_port_mapping_yuv444[unit][i] & 0x07F] = (u8)(video_port_mapping_yuv444[unit][i] >> 7);
|
|
+ /* Enable port and disable ground port */
|
|
+ if(((5 - i) % 2) == 0) {
|
|
+ p_config->p_enable_video_port_yuv444[i/2] |= 0x0F;
|
|
+ p_config->p_ground_video_port_yuv444[i/2] &= 0xF0;
|
|
+ } else {
|
|
+ p_config->p_enable_video_port_yuv444[i/2] |= 0xF0;
|
|
+ p_config->p_ground_video_port_yuv444[i/2] &= 0x0F;
|
|
+ }
|
|
+ }
|
|
+
|
|
+ /* RGB444 */
|
|
+ if(video_port_mapping_rgb444[unit][i] != DL_HDMITX_VID444_NOT_CONNECTED) {
|
|
+ p_config->p_swap_table_rgb444[video_port_mapping_rgb444[unit][i] & 0x07F] = 5 - i;
|
|
+ p_config->p_mirror_table_rgb444[video_port_mapping_rgb444[unit][i] & 0x07F] = (u8)(video_port_mapping_rgb444[unit][i] >> 7);
|
|
+ /* Enable port and disable ground port */
|
|
+ if(((5 - i) % 2) == 0) {
|
|
+ p_config->p_enable_video_port_rgb444[i/2] |= 0x0F;
|
|
+ p_config->p_ground_video_port_rgb444[i/2] &= 0xF0;
|
|
+ } else {
|
|
+ p_config->p_enable_video_port_rgb444[i/2] |= 0xF0;
|
|
+ p_config->p_ground_video_port_rgb444[i/2] &= 0x0F;
|
|
+ }
|
|
+ }
|
|
+ }
|
|
+}
|
|
+
|
|
+/******************************************************************************
|
|
+ * \brief This function allows to the main driver to retrieve its
|
|
+ * configuration parameters.
|
|
+ *
|
|
+ * \param pConfig Pointer to the config structure
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMITX_BAD_UNIT_NUMBER: the unit number is wrong or
|
|
+ * the receiver instance is not initialised
|
|
+ * - ERR_DLHDMITX_INCONSISTENT_PARAMS: an input parameter is
|
|
+ * inconsistent
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+error_code_t tx_cfg_get_config
|
|
+(
|
|
+ unit_select_t unit,
|
|
+ tx_driver_config_table_t *p_config
|
|
+)
|
|
+{
|
|
+ /* Check if unit number is in range */
|
|
+ RETIF((unit < 0) || (unit >= MAX_UNITS), ERR_DLHDMITX_BAD_UNIT_NUMBER)
|
|
+
|
|
+ /* Check if pointer is NULL */
|
|
+ RETIF(p_config == NULL, ERR_DLHDMITX_INCONSISTENT_PARAMS)
|
|
+
|
|
+ *p_config = driver_config_table_tx[unit];
|
|
+
|
|
+ /* Done here because of const declaration of tables in ARM7 case */
|
|
+ p_config->p_resolution_info = (ptx_cfg_resolution_t)resolution_info_tx;
|
|
+
|
|
+ /* Generate swap and mirror tables in function of video port mapping tables */
|
|
+ dl_hdmi_tx_generate_cfg_video_port_tables(unit, p_config);
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+/******************************************************************************
|
|
+ * \brief Driver callback function for i2c EDID read (REQUIRED SW INTERFACE)
|
|
+ *
|
|
+ * \param
|
|
+ * \param
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * 0: the call was successfull
|
|
+ * ERR_HDMI_I2C_READ: failed when reading the I2C bus
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+error_code_t edid_read_function(bsl_sys_args_edid_t *p_sys_args)
|
|
+{
|
|
+ u8 seg_address = p_sys_args->seg_ptr_addr;
|
|
+ u8 segptr = p_sys_args->seg_ptr;
|
|
+ u8 data_address = p_sys_args->data_reg_addr;
|
|
+ u8 offset = p_sys_args->word_offset;
|
|
+ u8 *ptr = p_sys_args->p_data;
|
|
+ u8 nb_char = p_sys_args->len_data;
|
|
+ u8 i = 0;
|
|
+ error_code_t err;
|
|
+
|
|
+ do {
|
|
+ err = (i2c_read_edid(seg_address, segptr, data_address, offset, nb_char, ptr)) ? ERR_HDMI_I2C_READ : 0;
|
|
+ i++;
|
|
+ } while((err != 0) && (i < 3));
|
|
+
|
|
+ return err;
|
|
+}
|
|
+
|
|
+/*============================================================================*/
|
|
+/* END OF FILE */
|
|
+/*============================================================================*/
|
|
diff --git a/drivers/video/hdmi/comps/tmdlTDA9983/cfg/tmdlHdmiTx_cfg.h b/drivers/video/hdmi/comps/tmdlTDA9983/cfg/tmdlHdmiTx_cfg.h
|
|
new file mode 100755
|
|
index 0000000..f30c47a
|
|
--- /dev/null
|
|
+++ b/drivers/video/hdmi/comps/tmdlTDA9983/cfg/tmdlHdmiTx_cfg.h
|
|
@@ -0,0 +1,246 @@
|
|
+/**
|
|
+ * Copyright (C) 2006 NXP N.V., All Rights Reserved.
|
|
+ * This source code and any compilation or derivative thereof is the proprietary
|
|
+ * information of NXP N.V. and is confidential in nature. Under no circumstances
|
|
+ * is this software to be exposed to or placed under an Open Source License of
|
|
+ * any type without the expressed written permission of NXP N.V.
|
|
+ *
|
|
+ * \file tx_cfg.h
|
|
+ *
|
|
+ * \version $Revision: 1 $
|
|
+ *
|
|
+ * \date $Date: 08/08/07 11:00 $
|
|
+ *
|
|
+ * \brief devlib driver component API for the TDA998x HDMI Transmitters
|
|
+ *
|
|
+ * \section refs Reference Documents
|
|
+ * HDMI Tx Driver - FRS.doc,
|
|
+ *
|
|
+ * \section info Change Information
|
|
+ *
|
|
+ * \verbatim
|
|
+ *
|
|
+ * $History: bsl_cfg.h $
|
|
+ *
|
|
+ * ***************** Version 1 *****************
|
|
+ * User: J. Lamotte Date: 08/08/07 Time: 11:00
|
|
+ * initial version
|
|
+ *
|
|
+ *
|
|
+ * \endverbatim
|
|
+ *
|
|
+ * */
|
|
+
|
|
+/*****************************************************************************/
|
|
+/*****************************************************************************/
|
|
+/* THIS FILE MUST NOT BE MODIFIED BY CUSTOMER */
|
|
+/*****************************************************************************/
|
|
+/*****************************************************************************/
|
|
+
|
|
+#ifndef DLHDMITX_CFG_H
|
|
+#define DLHDMITX_CFG_H
|
|
+
|
|
+#include "tmNxTypes.h"
|
|
+#include "tmbslHdmiTx.h"
|
|
+#include "tmdlHdmiTx_Types.h"
|
|
+
|
|
+/*============================================================================*/
|
|
+/* TYPES DECLARATIONS */
|
|
+/*============================================================================*/
|
|
+typedef struct _tx_cfg_resolution_t {
|
|
+ tx_vid_fmt_t resolution_id;
|
|
+ u16 width;
|
|
+ u16 height;
|
|
+ bool interlaced;
|
|
+ tx_vfreq_t vfrequency;
|
|
+ tx_pict_aspect_ratio_t aspect_ratio;
|
|
+} tx_cfg_resolution_t, *ptx_cfg_resolution_t;
|
|
+
|
|
+/**
|
|
+ * \brief Video signals that can be input to video ports in RGB/YUV 4:4:4 mode
|
|
+ * */
|
|
+typedef enum {
|
|
+ /**< Video signal G/Y, bits 4 to 7 */
|
|
+ DL_HDMITX_VID444_GY_4_TO_7 = 0x00,
|
|
+ /**< Video signal G/Y, bits 0 to 3 */
|
|
+ DL_HDMITX_VID444_GY_0_TO_3 = 0x01,
|
|
+ /**< Video signal B/U, bits 4 to 7 */
|
|
+ DL_HDMITX_VID444_BU_4_TO_7 = 0x02,
|
|
+ /**< Video signal B/U, bits 0 to 3 */
|
|
+ DL_HDMITX_VID444_BU_0_TO_3 = 0x03,
|
|
+ /**< Video signal V/R, bits 4 to 7 */
|
|
+ DL_HDMITX_VID444_VR_4_TO_7 = 0x04,
|
|
+ /**< Video signal V/R, bits 0 to 3 */
|
|
+ DL_HDMITX_VID444_VR_0_TO_3 = 0x05,
|
|
+ /**< Video signal G/Y, bits 7 to 4 (mirrored) */
|
|
+ DL_HDMITX_VID444_GY_7_TO_4 = 0x80,
|
|
+ /**< Video signal G/Y, bits 3 to 0 (mirrored) */
|
|
+ DL_HDMITX_VID444_GY_3_TO_0 = 0x81,
|
|
+ /**< Video signal B/U, bits 7 to 4 (mirrored) */
|
|
+ DL_HDMITX_VID444_BU_7_TO_4 = 0x82,
|
|
+ /**< Video signal B/U, bits 3 to 0 (mirrored) */
|
|
+ DL_HDMITX_VID444_BU_3_TO_0 = 0x83,
|
|
+ /**< Video signal V/R, bits 7 to 4 (mirrored) */
|
|
+ DL_HDMITX_VID444_VR_7_TO_4 = 0x84,
|
|
+ /**< Video signal V/R, bits 3 to 0 (mirrored) */
|
|
+ DL_HDMITX_VID444_VR_3_TO_0 = 0x85,
|
|
+ DL_HDMITX_VID444_NOT_CONNECTED = 0x100 /**< No signal connected */
|
|
+} tx_cfg_video_signal444;
|
|
+
|
|
+/**
|
|
+ * \brief Video signals that can be input to video ports in semi-planar YUV 4:2:2 mode
|
|
+ * */
|
|
+typedef enum {
|
|
+ /**< Video signal G/Y, bits 8 to 11 */
|
|
+ DL_HDMITX_VID422_Y_8_TO_11 = 0x00,
|
|
+ /**< Video signal G/Y, bits 4 to 7 */
|
|
+ DL_HDMITX_VID422_Y_4_TO_7 = 0x01,
|
|
+ /**< Video signal G/Y, bits 0 to 3 */
|
|
+ DL_HDMITX_VID422_Y_0_TO_3 = 0x02,
|
|
+ /**< Video signal B/U, bits 8 to 11 */
|
|
+ DL_HDMITX_VID422_UV_8_TO_11 = 0x03,
|
|
+ /**< Video signal B/U, bits 4 to 7 */
|
|
+ DL_HDMITX_VID422_UV_4_TO_7 = 0x04,
|
|
+ /**< Video signal B/U, bits 0 to 3 */
|
|
+ DL_HDMITX_VID422_UV_0_TO_3 = 0x05,
|
|
+ /**< Video signal G/Y, bits 11 to 8 (mirrored) */
|
|
+ DL_HDMITX_VID422_Y_11_TO_8 = 0x80,
|
|
+ /**< Video signal G/Y, bits 7 to 4 (mirrored) */
|
|
+ DL_HDMITX_VID422_Y_7_TO_4 = 0x81,
|
|
+ /**< Video signal G/Y, bits 3 to 0 (mirrored) */
|
|
+ DL_HDMITX_VID422_Y_3_TO_0 = 0x82,
|
|
+ /**< Video signal B/U, bits 11 to 8 (mirrored) */
|
|
+ DL_HDMITX_VID422_UV_11_TO_8 = 0x83,
|
|
+ /**< Video signal B/U, bits 7 to 4 (mirrored) */
|
|
+ DL_HDMITX_VID422_UV_7_TO_4 = 0x84,
|
|
+ /**< Video signal B/U, bits 3 to 0 (mirrored) */
|
|
+ DL_HDMITX_VID422_UV_3_TO_0 = 0x85,
|
|
+ DL_HDMITX_VID422_NOT_CONNECTED = 0x100 /**< No signal connected */
|
|
+} tx_cfg_video_signal422;
|
|
+
|
|
+/**
|
|
+ *
|
|
+ * \brief Video signals that can be input to video ports in semi-planar CCIR 656 mode
|
|
+ * */
|
|
+typedef enum {
|
|
+ /**< Video signal CCIR, bits 8 to 11 */
|
|
+ DL_HDMITX_VIDCCIR_8_TO_11 = 0x00,
|
|
+ /**< Video signal CCIR, bits 4 to 7 */
|
|
+ DL_HDMITX_VIDCCIR_4_TO_7 = 0x01,
|
|
+ /**< Video signal CCIR, bits 0 to 3 */
|
|
+ DL_HDMITX_VIDCCIR_0_TO_3 = 0x02,
|
|
+ /**< Video signal CCIR, bits 11 to 8 (mirrored) */
|
|
+ DL_HDMITX_VIDCCIR_11_TO_8 = 0x80,
|
|
+ /**< Video signal CCIR, bits 7 to 4 (mirrored) */
|
|
+ DL_HDMITX_VIDCCIR_7_TO_4 = 0x81,
|
|
+ /**< Video signal CCIR, bits 3 to 0 (mirrored) */
|
|
+ DL_HDMITX_VIDCCIR_3_TO_0 = 0x82,
|
|
+ DL_HDMITX_VIDCCIR_NOT_CONNECTED = 0x100 /**< No signal connected */
|
|
+} tx_cfg_video_signal_ccir656;
|
|
+
|
|
+typedef struct {
|
|
+ u8 command_task_priority;
|
|
+ u8 command_task_stack_size;
|
|
+ u8 command_task_queue_size;
|
|
+ u8 hdcp_task_priority;
|
|
+ u8 hdcp_task_stack_size;
|
|
+ u8 i2c_address;
|
|
+ pbsl_sys_func_t i2c_read_function;
|
|
+ pbsl_sys_func_t i2c_write_function;
|
|
+ pbsl_sys_func_edid_t edid_read_function;
|
|
+ ptx_cfg_resolution_t p_resolution_info;
|
|
+ u8 resolution_nb;
|
|
+ u8 *p_mirror_table_ccir656;
|
|
+ u8 *p_swap_table_ccir656;
|
|
+ u8 *p_enable_video_port_ccir656;
|
|
+ u8 *p_ground_video_port_ccir656;
|
|
+ u8 *p_mirror_table_yuv422;
|
|
+ u8 *p_swap_table_yuv422;
|
|
+ u8 *p_enable_video_port_yuv422;
|
|
+ u8 *p_ground_video_port_yuv422;
|
|
+ u8 *p_mirror_table_yuv444;
|
|
+ u8 *p_swap_table_yuv444;
|
|
+ u8 *p_enable_video_port_yuv444;
|
|
+ u8 *p_ground_video_port_yuv444;
|
|
+ u8 *p_mirror_table_rgb444;
|
|
+ u8 *p_swap_table_rgb444;
|
|
+ u8 *p_enable_video_port_rgb444;
|
|
+ u8 *p_ground_video_port_rgb444;
|
|
+ u8 *p_enable_audio_port_spdif;
|
|
+ u8 *p_ground_audio_port_spdif;
|
|
+ u8 *p_enable_audio_clock_port_spdif;
|
|
+ u8 *p_ground_audio_clock_port_spdif;
|
|
+ u8 *p_enable_audio_port_i2s;
|
|
+ u8 *p_ground_audio_port_i2s;
|
|
+ u8 *p_enable_audio_port_i2s8c;
|
|
+ u8 *p_ground_audio_port_i2s8c;
|
|
+ u8 *p_enable_audio_clock_port_i2s;
|
|
+ u8 *p_ground_audio_clock_port_i2s;
|
|
+ u8 *p_enable_audio_port_oba;
|
|
+ u8 *p_ground_audio_port_oba;
|
|
+ u8 *p_enable_audio_clock_port_oba;
|
|
+ u8 *p_ground_audio_clock_port_oba;
|
|
+ u8 *p_enable_audio_port_dst;
|
|
+ u8 *p_ground_audio_port_dst;
|
|
+ u8 *p_enable_audio_clock_port_dst;
|
|
+ u8 *p_ground_audio_clock_port_dst;
|
|
+ u8 *p_enable_audio_port_hbr;
|
|
+ u8 *p_ground_audio_port_hbr;
|
|
+ u8 *p_enable_audio_clock_port_hbr;
|
|
+ u8 *p_ground_audio_clock_port_hbr;
|
|
+ u16 key_seed;
|
|
+ tx_test_pattern_t pattern;
|
|
+ /* 0 DE is NOT available, 1 DE is there */
|
|
+ u8 data_enable_signal_available;
|
|
+} tx_driver_config_table_t;
|
|
+
|
|
+/*============================================================================*/
|
|
+/* FUNCTIONS DECLARATIONS */
|
|
+/*============================================================================*/
|
|
+
|
|
+/******************************************************************************
|
|
+ * \brief This function allows to the main driver to retrieve its
|
|
+ * configuration parameters.
|
|
+ *
|
|
+ * \param pConfig Pointer to the config structure
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMITX_BAD_UNIT_NUMBER: the unit number is wrong or
|
|
+ * the receiver instance is not initialised
|
|
+ * - ERR_DLHDMITX_INCONSISTENT_PARAMS: an input parameter is
|
|
+ * inconsistent
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+error_code_t tx_cfg_get_config
|
|
+(
|
|
+ unit_select_t unit,
|
|
+ tx_driver_config_table_t *p_config
|
|
+);
|
|
+
|
|
+#ifdef TMFL_CEC_AVAILABLE
|
|
+
|
|
+#include "tmdlHdmiCEC_Types.h"
|
|
+
|
|
+typedef struct {
|
|
+ u8 command_task_priority;
|
|
+ u8 command_task_stack_size;
|
|
+ u8 command_task_queue_size;
|
|
+ u8 i2c_address;
|
|
+ ptmdl_hdmi_cec_sys_func_t i2c_read_function;
|
|
+ ptmdl_hdmi_cec_sys_func_t i2c_write_function;
|
|
+ dl_hdmi_cec_capabilities_t *p_capabilities_list;
|
|
+} dl_hdmi_cec_driver_config_table_t;
|
|
+
|
|
+error_code_t dl_hdmi_cec_cfg_get_config
|
|
+(
|
|
+ unit_select_t unit,
|
|
+ dl_hdmi_cec_driver_config_table_t *p_config
|
|
+);
|
|
+#endif
|
|
+
|
|
+#endif /* DLHDMITX_CFG_H */
|
|
+
|
|
+/*============================================================================*/
|
|
+/* END OF FILE */
|
|
+/*============================================================================*/
|
|
diff --git a/drivers/video/hdmi/comps/tmdlTDA9983/inc/tmdlHdmiTx.h b/drivers/video/hdmi/comps/tmdlTDA9983/inc/tmdlHdmiTx.h
|
|
new file mode 100755
|
|
index 0000000..f8efa14
|
|
--- /dev/null
|
|
+++ b/drivers/video/hdmi/comps/tmdlTDA9983/inc/tmdlHdmiTx.h
|
|
@@ -0,0 +1,54 @@
|
|
+/**
|
|
+ * Copyright (C) 2007 NXP N.V., All Rights Reserved.
|
|
+ * This source code and any compilation or derivative thereof is the proprietary
|
|
+ * information of NXP N.V. and is confidential in nature. Under no circumstances
|
|
+ * is this software to be exposed to or placed under an Open Source License of
|
|
+ * any type without the expressed written permission of NXP N.V.
|
|
+ *
|
|
+ * \file tx.h
|
|
+ *
|
|
+ * \version $Revision: 1 $
|
|
+ *
|
|
+ * \date $Date: 02/08/07 08:32 $
|
|
+ *
|
|
+ * \brief devlib driver component API for the TDA998x HDMI Transmitters
|
|
+ *
|
|
+ * \section refs Reference Documents
|
|
+ * HDMI Tx Driver - FRS.doc,
|
|
+ * HDMI Tx Driver - tx - SCS.doc
|
|
+ *
|
|
+ * \section info Change Information
|
|
+ *
|
|
+ * \verbatim
|
|
+ *
|
|
+ * $History: tx.h $
|
|
+ *
|
|
+ * ***************** Version 13 *****************
|
|
+ * User: Demoment Date: 02/08/07 Time: 08:32
|
|
+ * Updated in $/Source/tx/inc
|
|
+ * initial version
|
|
+ *
|
|
+ *
|
|
+ * \endverbatim
|
|
+ *
|
|
+ * */
|
|
+
|
|
+#ifndef DLHDMITX_H
|
|
+#define DLHDMITX_H
|
|
+
|
|
+/*============================================================================*/
|
|
+/* INCLUDE FILES */
|
|
+/*============================================================================*/
|
|
+#include "tmNxCompId.h"
|
|
+#include "tmdlHdmiTx_Types.h"
|
|
+#include "tmdlHdmiTx_Functions.h"
|
|
+
|
|
+/* Number of HW units supported by SW driver */
|
|
+#define MAX_UNITS 1
|
|
+
|
|
+#endif /* DLHDMITX_H */
|
|
+
|
|
+/*============================================================================*/
|
|
+/* END OF FILE */
|
|
+/*============================================================================*/
|
|
+
|
|
diff --git a/drivers/video/hdmi/comps/tmdlTDA9983/inc/tmdlHdmiTx_Functions.h b/drivers/video/hdmi/comps/tmdlTDA9983/inc/tmdlHdmiTx_Functions.h
|
|
new file mode 100755
|
|
index 0000000..f3c1886
|
|
--- /dev/null
|
|
+++ b/drivers/video/hdmi/comps/tmdlTDA9983/inc/tmdlHdmiTx_Functions.h
|
|
@@ -0,0 +1,1446 @@
|
|
+/**
|
|
+ * Copyright (C) 2007 NXP N.V., All Rights Reserved.
|
|
+ * This source code and any compilation or derivative thereof is the proprietary
|
|
+ * information of NXP N.V. and is confidential in nature. Under no circumstances
|
|
+ * is this software to be exposed to or placed under an Open Source License of
|
|
+ * any type without the expressed written permission of NXP N.V.
|
|
+ *
|
|
+ * \file tx_Functions.h
|
|
+ *
|
|
+ * \version $Revision: 1 $
|
|
+ *
|
|
+ * \date $Date: 02/08/07 8:32 $
|
|
+ *
|
|
+ * \brief devlib driver component API for the TDA998x HDMI Transmitters
|
|
+ *
|
|
+ * \section refs Reference Documents
|
|
+ * HDMI Tx Driver - FRS.doc,
|
|
+ * HDMI Tx Driver - tx - SCS.doc
|
|
+ *
|
|
+ * \section info Change Information
|
|
+ *
|
|
+ * \verbatim
|
|
+ *
|
|
+ * $History: tx_Functions.h $
|
|
+ *
|
|
+ * ***************** Version 1 *****************
|
|
+ * User: Demoment Date: 02/08/07 Time: 8:32
|
|
+ * Updated in $/Source/tx/inc
|
|
+ * initial version
|
|
+ *
|
|
+ *
|
|
+ * \endverbatim
|
|
+ *
|
|
+ * */
|
|
+
|
|
+#ifndef DLHDMITX_FUNCTIONS_H
|
|
+#define DLHDMITX_FUNCTIONS_H
|
|
+
|
|
+/*============================================================================*/
|
|
+/* INCLUDE FILES */
|
|
+/*============================================================================*/
|
|
+
|
|
+#include "tmNxTypes.h"
|
|
+#include "tmdlHdmiTx_Types.h"
|
|
+
|
|
+/*============================================================================*/
|
|
+/* EXTERN FUNCTION PROTOTYPES */
|
|
+/*============================================================================*/
|
|
+
|
|
+/*****************************************************************************/
|
|
+/**
|
|
+ * \brief Get the software version of the driver.
|
|
+ *
|
|
+ * \param pSWVersion Pointer to the version structure.
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMITX_INCONSISTENT_PARAMS: an input parameter is
|
|
+ * inconsistent
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+error_code_t tx_get_swversion
|
|
+(
|
|
+ swversion_t *p_swversion
|
|
+);
|
|
+
|
|
+/*****************************************************************************/
|
|
+/**
|
|
+ * \brief Get the number of available HDMI transmitters devices in the system.
|
|
+ * A unit directly represents a physical device.
|
|
+ *
|
|
+ * \param pUnitCount Pointer to the number of available units.
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMITX_INCONSISTENT_PARAMS: an input parameter is
|
|
+ * inconsistent
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+error_code_t tx_get_number_of_units
|
|
+(
|
|
+ u32 *p_unit_count
|
|
+);
|
|
+
|
|
+/*****************************************************************************/
|
|
+/**
|
|
+ * \brief Get the capabilities of unit 0. Capabilities are stored into a
|
|
+ * dedicated structure and are directly read from the HW device.
|
|
+ *
|
|
+ * \param pCapabilities Pointer to the capabilities structure.
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMITX_BAD_UNIT_NUMBER: the unit number is wrong or
|
|
+ * the receiver instance is not initialised
|
|
+ * - ERR_DLHDMITX_INCONSISTENT_PARAMS: an input parameter is
|
|
+ * inconsistent
|
|
+ * - ERR_DLHDMITX_BAD_PARAMETER: a parameter is invalid or out
|
|
+ * of range
|
|
+ * - ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number
|
|
+ * - ERR_HDMI_BAD_PARAMETER: a parameter was out of range
|
|
+ * - ERR_HDMI_NOT_INITIALIZED: transmitter not initialized
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+error_code_t tx_get_capabilities
|
|
+(
|
|
+ tx_capabilities_t *p_capabilities
|
|
+);
|
|
+
|
|
+/*****************************************************************************/
|
|
+/**
|
|
+ * \brief Get the capabilities of a specific unit. Capabilities are stored
|
|
+ * into a dedicated structure and are directly read from the HW
|
|
+ * device.
|
|
+ *
|
|
+ * \param unit Unit to be probed.
|
|
+ * \param pCapabilities Pointer to the capabilities structure.
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMITX_BAD_UNIT_NUMBER: the unit number is wrong or
|
|
+ * the receiver instance is not initialised
|
|
+ * - ERR_DLHDMITX_INCONSISTENT_PARAMS: an input parameter is
|
|
+ * inconsistent
|
|
+ * - ERR_DLHDMITX_BAD_PARAMETER: a parameter is invalid or out
|
|
+ * of range
|
|
+ * - ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number
|
|
+ * - ERR_HDMI_BAD_PARAMETER: a parameter was out of range
|
|
+ * - ERR_HDMI_NOT_INITIALIZED: transmitter not initialized
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+error_code_t tx_get_capabilities_m
|
|
+(
|
|
+ unit_select_t unit,
|
|
+ tx_capabilities_t *p_capabilities
|
|
+);
|
|
+
|
|
+/*****************************************************************************/
|
|
+/**
|
|
+ * \brief Open unit 0 of HdmiTx driver and provides the instance number to
|
|
+ * the caller. Note that one unit of HdmiTx represents one physical
|
|
+ * HDMI transmitter and that only one instance per unit can be opened.
|
|
+ *
|
|
+ * \param pInstance Pointer to the variable that will receive the instance
|
|
+ * identifier.
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMITX_BAD_UNIT_NUMBER: the unit number is wrong or
|
|
+ * the transmitter instance is not initialised
|
|
+ * - ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong
|
|
+ * - ERR_DLHDMITX_INCONSISTENT_PARAMS: an input parameter is
|
|
+ * inconsistent
|
|
+ * - ERR_DLHDMITX_RESOURCE_OWNED: the resource is already in use
|
|
+ * - ERR_DLHDMITX_INVALID_STATE: the state is invalid for
|
|
+ * the function
|
|
+ * - ERR_DLHDMITX_INIT_FAILED: the unit instance is already
|
|
+ * initialised or something wrong happened at lower level.
|
|
+ * - ERR_DLHDMITX_NO_RESOURCES: the resource is not available
|
|
+ * - ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number
|
|
+ * - ERR_HDMI_NOT_INITIALIZED: the unit is not initialized
|
|
+ * - ERR_HDMI_BAD_PARAMETER: a parameter is invalid or out
|
|
+ * of range
|
|
+ * - ERR_HDMI_INIT_FAILED: the unit instance is already
|
|
+ * initialised
|
|
+ * - ERR_HDMI_COMPATIBILITY: the driver is not compatiable
|
|
+ * with the internal device version code
|
|
+ * - ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus
|
|
+ * - ERR_HDMI_I2C_READ: failed when reading the I2C bus
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+error_code_t tx_open
|
|
+(
|
|
+ instance_t *p_instance
|
|
+);
|
|
+
|
|
+/*****************************************************************************/
|
|
+/**
|
|
+ * \brief Open a specific unit of HdmiTx driver and provides the instance
|
|
+ * number to the caller. Note that one unit of HdmiTx represents one
|
|
+ * physical HDMI transmitter and that only one instance per unit can be
|
|
+ * opened. This function switches driver's state machine to
|
|
+ * "initialized" state.
|
|
+ *
|
|
+ * \param pInstance Pointer to the structure that will receive the instance
|
|
+ * identifier.
|
|
+ * \param unit Unit number to be opened.
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMITX_BAD_UNIT_NUMBER: the unit number is wrong or
|
|
+ * the transmitter instance is not initialised
|
|
+ * - ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong
|
|
+ * - ERR_DLHDMITX_INCONSISTENT_PARAMS: an input parameter is
|
|
+ * inconsistent
|
|
+ * - ERR_DLHDMITX_RESOURCE_OWNED: the resource is already in use
|
|
+ * - ERR_DLHDMITX_INVALID_STATE: the state is invalid for
|
|
+ * the function
|
|
+ * - ERR_DLHDMITX_INIT_FAILED: the unit instance is already
|
|
+ * initialised or something wrong happened at lower level.
|
|
+ * - ERR_DLHDMITX_NO_RESOURCES: the resource is not available
|
|
+ * - ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number
|
|
+ * - ERR_HDMI_NOT_INITIALIZED: the unit is not initialized
|
|
+ * - ERR_HDMI_BAD_PARAMETER: a parameter is invalid or out
|
|
+ * of range
|
|
+ * - ERR_HDMI_INIT_FAILED: the unit instance is already
|
|
+ * initialised
|
|
+ * - ERR_HDMI_COMPATIBILITY: the driver is not compatiable
|
|
+ * with the internal device version code
|
|
+ * - ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus
|
|
+ * - ERR_HDMI_I2C_READ: failed when reading the I2C bus
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+error_code_t tx_open_m
|
|
+(
|
|
+ instance_t *p_instance,
|
|
+ unit_select_t unit
|
|
+);
|
|
+
|
|
+/*****************************************************************************/
|
|
+/**
|
|
+ * \brief Close an instance of HdmiTx driver.
|
|
+ *
|
|
+ * \param instance Instance identifier.
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMITX_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ * - ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+error_code_t tx_close
|
|
+(
|
|
+ instance_t instance
|
|
+);
|
|
+
|
|
+/*****************************************************************************/
|
|
+/**
|
|
+ * \brief Set the power state of an instance of the HDMI transmitter.
|
|
+ *
|
|
+ * \param instance Instance identifier.
|
|
+ * \param powerState Power state to set.
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong
|
|
+ * - ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number
|
|
+ * - ERR_HDMI_BAD_PARAMETER: a parameter was out of range
|
|
+ * - ERR_HDMI_NOT_INITIALIZED: transmitter not initialized
|
|
+ * - ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+error_code_t tx_set_power_state
|
|
+(
|
|
+ instance_t instance,
|
|
+ power_state_t power_state
|
|
+);
|
|
+
|
|
+/*****************************************************************************/
|
|
+/**
|
|
+ * \brief Get the power state of an instance of the HDMI transmitter.
|
|
+ *
|
|
+ * \param instance Instance identifier.
|
|
+ * \param pPowerState Pointer to the power state.
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong
|
|
+ * - ERR_DLHDMITX_INCONSISTENT_PARAMS: an input parameter is
|
|
+ * inconsistent
|
|
+ * - ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number
|
|
+ * - ERR_HDMI_BAD_PARAMETER: a parameter was out of range
|
|
+ * - ERR_HDMI_NOT_INITIALIZED: transmitter not initialized
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+error_code_t tx_get_power_state
|
|
+(
|
|
+ instance_t instance,
|
|
+ power_state_t *p_power_state
|
|
+);
|
|
+
|
|
+/*****************************************************************************/
|
|
+/**
|
|
+ * \brief Set the configuration of instance attributes. This function is
|
|
+ * required by DVP architecture rules but actually does nothing in this
|
|
+ * driver
|
|
+ *
|
|
+ * \param instance Instance identifier.
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+error_code_t tx_instance_config
|
|
+(
|
|
+ instance_t instance
|
|
+);
|
|
+
|
|
+/*****************************************************************************/
|
|
+/**
|
|
+ * \brief Setup the instance with its configuration parameters. This function
|
|
+ * allows basic instance configuration like enabling HDCP, choosing
|
|
+ * HDCP encryption mode or enabling HDCP repeater mode.
|
|
+ *
|
|
+ * \param instance Instance identifier.
|
|
+ * \param pSetupInfo Pointer to the structure containing all setup parameters.
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong
|
|
+ * - ERR_DLHDMITX_INCONSISTENT_PARAMS: an input parameter is
|
|
+ * inconsistent
|
|
+ * - ERR_DLHDMITX_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ * - ERR_DLHDMITX_INVALID_STATE: the state is invalid for
|
|
+ * the function
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+error_code_t tx_instance_setup
|
|
+(
|
|
+ instance_t instance,
|
|
+ tx_instance_setup_info_t *p_setup_info
|
|
+);
|
|
+
|
|
+/*****************************************************************************/
|
|
+/**
|
|
+ * \brief Get instance setup parameters.
|
|
+ *
|
|
+ * \param instance Instance identifier.
|
|
+ * \param pSetupInfo Pointer to the structure that will receive setup
|
|
+ * parameters.
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong
|
|
+ * - ERR_DLHDMITX_INCONSISTENT_PARAMS: an input parameter is
|
|
+ * inconsistent
|
|
+ * - ERR_DLHDMITX_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+error_code_t tx_get_instance_setup
|
|
+(
|
|
+ instance_t instance,
|
|
+ tx_instance_setup_info_t *p_setup_info
|
|
+);
|
|
+
|
|
+/*****************************************************************************/
|
|
+/**
|
|
+ * \brief Make device library handle an incoming interrupt. This function is
|
|
+ * used by application to tell the device library that the hardware
|
|
+ * sent an interrupt.
|
|
+ *
|
|
+ * \param instance Instance identifier.
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong
|
|
+ * - ERR_DLHDMITX_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ * - ERR_DLHDMITX_FULL: the queue is full
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+error_code_t tx_handle_interrupt
|
|
+(
|
|
+ instance_t instance
|
|
+);
|
|
+
|
|
+/*****************************************************************************/
|
|
+/**
|
|
+ * \brief Register event callbacks. Only one callback is registered through
|
|
+ * this API. This callback will received the type of event that
|
|
+ * occured throug a dedicated parameter and will be called as many
|
|
+ * times as there is pending events.
|
|
+ * This function is synchronous.
|
|
+ * This function is ISR friendly.
|
|
+ *
|
|
+ * \param instance Instance identifier.
|
|
+ * \param pCallback Pointer to the callback function that will handle events
|
|
+ * from the devlib.
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong
|
|
+ * - ERR_DLHDMITX_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ * - ERR_DLHDMITX_INVALID_STATE: the state is invalid for
|
|
+ * the function
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+error_code_t tx_register_callbacks
|
|
+(
|
|
+ instance_t instance,
|
|
+ ptx_callback_t p_callback
|
|
+);
|
|
+
|
|
+/*****************************************************************************/
|
|
+/**
|
|
+ * \brief This function allows enabling a specific event. By default, all
|
|
+ * events are disabled, except input lock.
|
|
+ *
|
|
+ * \param instance Instance identifier.
|
|
+ * \param event Event to enable.
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+error_code_t tx_enable_event
|
|
+(
|
|
+ instance_t instance,
|
|
+ tx_event_t event
|
|
+);
|
|
+
|
|
+/*****************************************************************************/
|
|
+/**
|
|
+ * \brief This function allows disabling a specific event. By default, all
|
|
+ * events are disabled, except input lock.
|
|
+ *
|
|
+ * \param instance Instance identifier.
|
|
+ * \param event Event to disable.
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+error_code_t tx_disable_event
|
|
+(
|
|
+ instance_t instance,
|
|
+ tx_event_t event
|
|
+);
|
|
+
|
|
+/*****************************************************************************/
|
|
+/**
|
|
+ * \brief Get specifications of a given video format. Application can use
|
|
+ * this function to retreives all specifications (frequencies,
|
|
+ * resolution, etc.) of a given IA/CEA 861-D video format.
|
|
+ * This function is synchronous.
|
|
+ * This function is ISR friendly.
|
|
+ *
|
|
+ * \param instance Instance identifier.
|
|
+ * \param resolutionID ID of the resolution to retrieve specs from.
|
|
+ * \param pResolutionSpecs Pointer to the structure receiving specs.
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMITX_INCONSISTENT_PARAMS: an input parameter is
|
|
+ * inconsistent
|
|
+ * - ERR_DLHDMITX_RESOLUTION_UNKNOWN: the resolution is unknown
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+error_code_t tx_get_video_format_specs
|
|
+(
|
|
+ instance_t instance,
|
|
+ tx_vid_fmt_t resolution_id,
|
|
+ tx_vid_fmt_specs_t *p_resolution_specs
|
|
+);
|
|
+
|
|
+/*****************************************************************************/
|
|
+/**
|
|
+ * \brief Configures all input and output parameters : format, modes, rates,
|
|
+ * etc. This is the main configuration function of the driver. Here
|
|
+ * are transmitted all crucial input and output parameters of the
|
|
+ * device.
|
|
+ * This function is synchronous.
|
|
+ * This function is not ISR friendly.
|
|
+ *
|
|
+ * \param instance Instance identifier.
|
|
+ * \param videoInputConfig Configuration of the input video.
|
|
+ * \param videoOutputConfig Configuration of the output video.
|
|
+ * \param audioInputConfig Configuration of the input audio.
|
|
+ * \param sinkType Type of sink connected to the output of the Tx.
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong
|
|
+ * - ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number
|
|
+ * - ERR_HDMI_BAD_PARAMETER: a parameter was out of range
|
|
+ * - ERR_HDMI_NOT_INITIALIZED: transmitter not initialized
|
|
+ * - ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus
|
|
+ * - ERR_HDMI_I2C_READ: failed when reading to the I2C bus
|
|
+ * - ERR_HDMI_OPERATION_NOT_PERMITTED: not allowed in DVI mode
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+error_code_t tx_set_input_output
|
|
+(
|
|
+ instance_t instance,
|
|
+ tx_video_in_config_t video_input_config,
|
|
+ tx_video_out_config_t video_output_config,
|
|
+ tx_audio_in_config_t audio_input_config,
|
|
+ tx_sink_type_t sink_type
|
|
+);
|
|
+
|
|
+/*****************************************************************************/
|
|
+/**
|
|
+ * \brief Configures audio input parameters : format, rate, etc.
|
|
+ * This function is similar to txSetInputOutput except that
|
|
+ * video is not reconfigured.
|
|
+ * This function is synchronous.
|
|
+ * This function is not ISR friendly.
|
|
+ *
|
|
+ * \param instance Instance identifier.
|
|
+ * \param audioInputConfig Configuration of the input audio.
|
|
+ * \param sinkType Type of sink connected to the output of the Tx.
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong
|
|
+ * - ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number
|
|
+ * - ERR_HDMI_BAD_PARAMETER: a parameter was out of range
|
|
+ * - ERR_HDMI_NOT_INITIALIZED: transmitter not initialized
|
|
+ * - ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus
|
|
+ * - ERR_HDMI_I2C_READ: failed when reading to the I2C bus
|
|
+ * - ERR_HDMI_OPERATION_NOT_PERMITTED: not allowed in DVI mode
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+error_code_t tx_set_audio_input
|
|
+(
|
|
+ instance_t instance,
|
|
+ tx_audio_in_config_t audio_input_config,
|
|
+ tx_sink_type_t sink_type
|
|
+);
|
|
+
|
|
+/*****************************************************************************/
|
|
+/**
|
|
+ * \brief Defines the content of AVI infoframe to be sent by Tx device.
|
|
+ * This function is synchronous.
|
|
+ * This function is not ISR friendly.
|
|
+ *
|
|
+ * \param instance Instance identifier.
|
|
+ * \param enable Enable/disable infoframe insertion.
|
|
+ * \param pAviIfData Pointer to the structure containing AVI infoframe
|
|
+ * parameters.
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong
|
|
+ * - ERR_DLHDMITX_INCONSISTENT_PARAMS: an input parameter is
|
|
+ * inconsistent
|
|
+ * - ERR_HDMI_BAD_PARAMETER: a parameter was out of range
|
|
+ * - ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number
|
|
+ * - ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus
|
|
+ * - ERR_HDMI_I2C_READ: failed when reading to the I2C bus
|
|
+ * - ERR_HDMI_NOT_INITIALIZED: transmitter not initialized
|
|
+ * - ERR_HDMI_OPERATION_NOT_PERMITTED: not allowed in DVI mode
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+error_code_t tx_set_video_infoframe
|
|
+(
|
|
+ instance_t instance,
|
|
+ bool enable,
|
|
+ tx_avi_if_data_t *p_avi_if_data
|
|
+);
|
|
+
|
|
+/*****************************************************************************/
|
|
+/**
|
|
+ * \brief Defines the content of AUD infoframe to be sent by Tx device.
|
|
+ * This function is synchronous.
|
|
+ * This function is not ISR friendly.
|
|
+ *
|
|
+ * \param instance Instance identifier.
|
|
+ * \param enable Enable/disable infoframe insertion.
|
|
+ * \param pAudIfData Pointer to the structure containing AUD infoframe
|
|
+ * parameters.
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong
|
|
+ * - ERR_DLHDMITX_INCONSISTENT_PARAMS: an input parameter is
|
|
+ * inconsistent
|
|
+ * - ERR_HDMI_BAD_PARAMETER: a parameter was out of range
|
|
+ * - ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number
|
|
+ * - ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus
|
|
+ * - ERR_HDMI_I2C_READ: failed when reading to the I2C bus
|
|
+ * - ERR_HDMI_NOT_INITIALIZED: transmitter not initialized
|
|
+ * - ERR_HDMI_OPERATION_NOT_PERMITTED: not allowed in DVI mode
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+error_code_t tx_set_audio_infoframe
|
|
+(
|
|
+ instance_t instance,
|
|
+ bool enable,
|
|
+ tx_aud_if_data_t *p_aud_if_data
|
|
+);
|
|
+
|
|
+/*****************************************************************************/
|
|
+/**
|
|
+ * \brief Defines the content of the audio content protection packet to be
|
|
+ * sent by Tx device.
|
|
+ * This function is synchronous.
|
|
+ * This function is not ISR friendly.
|
|
+ *
|
|
+ * \param instance Instance identifier.
|
|
+ * \param enable Enable/disable infoframe insertion.
|
|
+ * \param pAcpPktData Pointer to the structure containing ACP infoframe
|
|
+ * parameters.
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong
|
|
+ * - ERR_DLHDMITX_INCONSISTENT_PARAMS: an input parameter is
|
|
+ * inconsistent
|
|
+ * - ERR_HDMI_BAD_PARAMETER: a parameter was out of range
|
|
+ * - ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number
|
|
+ * - ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus
|
|
+ * - ERR_HDMI_I2C_READ: failed when reading to the I2C bus
|
|
+ * - ERR_HDMI_NOT_INITIALIZED: transmitter not initialized
|
|
+ * - ERR_HDMI_OPERATION_NOT_PERMITTED: not allowed in DVI mode
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+error_code_t tx_set_acppacket
|
|
+(
|
|
+ instance_t instance,
|
|
+ bool enable,
|
|
+ tx_acp_pkt_data_t *p_acp_pkt_data
|
|
+);
|
|
+
|
|
+/*****************************************************************************/
|
|
+/**
|
|
+ * \brief Defines the content of the General Control packet to be sent by Tx
|
|
+ * device.
|
|
+ * This function is synchronous.
|
|
+ * This function is not ISR friendly.
|
|
+ *
|
|
+ * \param instance Instance identifier.
|
|
+ * \param enable Enable/disable infoframe insertion.
|
|
+ * \param pGcpPktData Pointer to the structure containing GCP packet parameters.
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong
|
|
+ * - ERR_DLHDMITX_INCONSISTENT_PARAMS: an input parameter is
|
|
+ * inconsistent
|
|
+ * - ERR_HDMI_BAD_PARAMETER: a parameter was out of range
|
|
+ * - ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number
|
|
+ * - ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus
|
|
+ * - ERR_HDMI_I2C_READ: failed when reading to the I2C bus
|
|
+ * - ERR_HDMI_NOT_INITIALIZED: transmitter not initialized
|
|
+ * - ERR_HDMI_OPERATION_NOT_PERMITTED: not allowed in DVI mode
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+error_code_t tx_set_general_control_packet
|
|
+(
|
|
+ instance_t instance,
|
|
+ bool enable,
|
|
+ tx_gcp_pkt_data_t *p_gcp_pkt_data
|
|
+);
|
|
+
|
|
+/*****************************************************************************/
|
|
+/**
|
|
+ * \brief Defines the content of ISRC1 packet to be sent by Tx device.
|
|
+ * This function is synchronous.
|
|
+ * This function is not ISR friendly.
|
|
+ *
|
|
+ * \param instance Instance identifier.
|
|
+ * \param enable Enable/disable infoframe insertion.
|
|
+ * \param pIsrc1PktData Pointer to the structure containing GCP packet parameters.
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong
|
|
+ * - ERR_DLHDMITX_INCONSISTENT_PARAMS: an input parameter is
|
|
+ * inconsistent
|
|
+ * - ERR_HDMI_BAD_PARAMETER: a parameter was out of range
|
|
+ * - ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number
|
|
+ * - ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus
|
|
+ * - ERR_HDMI_I2C_READ: failed when reading to the I2C bus
|
|
+ * - ERR_HDMI_NOT_INITIALIZED: transmitter not initialized
|
|
+ * - ERR_HDMI_OPERATION_NOT_PERMITTED: not allowed in DVI mode
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+error_code_t tx_set_isrc1packet
|
|
+(
|
|
+ instance_t instance,
|
|
+ bool enable,
|
|
+ tx_isrc1pkt_data_t *p_isrc1pkt_data
|
|
+);
|
|
+
|
|
+/*****************************************************************************/
|
|
+/**
|
|
+ * \brief Defines the content of ISRC2 packet to be sent by Tx device.
|
|
+ * This function is synchronous.
|
|
+ * This function is not ISR friendly.
|
|
+ *
|
|
+ * \param instance Instance identifier.
|
|
+ * \param enable Enable/disable infoframe insertion.
|
|
+ * \param pIsrc2PktData Pointer to the structure containing GCP packet parameters.
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong
|
|
+ * - ERR_DLHDMITX_INCONSISTENT_PARAMS: an input parameter is
|
|
+ * inconsistent
|
|
+ * - ERR_HDMI_BAD_PARAMETER: a parameter was out of range
|
|
+ * - ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number
|
|
+ * - ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus
|
|
+ * - ERR_HDMI_I2C_READ: failed when reading to the I2C bus
|
|
+ * - ERR_HDMI_NOT_INITIALIZED: transmitter not initialized
|
|
+ * - ERR_HDMI_OPERATION_NOT_PERMITTED: not allowed in DVI mode
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+error_code_t tx_set_isrc2packet
|
|
+(
|
|
+ instance_t instance,
|
|
+ bool enable,
|
|
+ tx_isrc2pkt_data_t *p_isrc2pkt_data
|
|
+);
|
|
+
|
|
+/*****************************************************************************/
|
|
+/**
|
|
+ * \brief Defines the content of MPS infoframe to be sent by Tx device.
|
|
+ * This function is synchronous.
|
|
+ * This function is not ISR friendly.
|
|
+ *
|
|
+ * \param instance Instance identifier.
|
|
+ * \param enable Enable/disable infoframe insertion.
|
|
+ * \param pMpsIfData Pointer to the structure containing MPS infoframe
|
|
+ * parameters.
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong
|
|
+ * - ERR_DLHDMITX_INCONSISTENT_PARAMS: an input parameter is
|
|
+ * inconsistent
|
|
+ * - ERR_HDMI_BAD_PARAMETER: a parameter was out of range
|
|
+ * - ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number
|
|
+ * - ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus
|
|
+ * - ERR_HDMI_I2C_READ: failed when reading to the I2C bus
|
|
+ * - ERR_HDMI_NOT_INITIALIZED: transmitter not initialized
|
|
+ * - ERR_HDMI_OPERATION_NOT_PERMITTED: not allowed in DVI mode
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+error_code_t tx_set_mpsinfoframe
|
|
+(
|
|
+ instance_t instance,
|
|
+ bool enable,
|
|
+ tx_mps_if_data_t *p_mps_if_data
|
|
+);
|
|
+
|
|
+/*****************************************************************************/
|
|
+/**
|
|
+ * \brief Defines the content of SPD infoframe to be sent by Tx device.
|
|
+ * This function is synchronous.
|
|
+ * This function is not ISR friendly.
|
|
+ *
|
|
+ * \param instance Instance identifier.
|
|
+ * \param enable Enable/disable infoframe insertion.
|
|
+ * \param pSpdIfData Pointer to the structure containing SPD infoframe
|
|
+ * parameters.
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong
|
|
+ * - ERR_DLHDMITX_INCONSISTENT_PARAMS: an input parameter is
|
|
+ * inconsistent
|
|
+ * - ERR_HDMI_BAD_PARAMETER: a parameter was out of range
|
|
+ * - ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number
|
|
+ * - ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus
|
|
+ * - ERR_HDMI_I2C_READ: failed when reading to the I2C bus
|
|
+ * - ERR_HDMI_NOT_INITIALIZED: transmitter not initialized
|
|
+ * - ERR_HDMI_OPERATION_NOT_PERMITTED: not allowed in DVI mode
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+error_code_t tx_set_spd_infoframe
|
|
+(
|
|
+ instance_t instance,
|
|
+ bool enable,
|
|
+ tx_spd_if_data_t *p_spd_if_data
|
|
+);
|
|
+
|
|
+/*****************************************************************************/
|
|
+/**
|
|
+ * \brief Defines the content of VS infoframe to be sent by Tx device.
|
|
+ * This function is synchronous.
|
|
+ * This function is not ISR friendly.
|
|
+ *
|
|
+ * \param instance Instance identifier.
|
|
+ * \param enable Enable/disable infoframe insertion.
|
|
+ * \param pVsIfData Pointer to the structure containing VS infoframe
|
|
+ * parameters.
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong
|
|
+ * - ERR_DLHDMITX_INCONSISTENT_PARAMS: an input parameter is
|
|
+ * inconsistent
|
|
+ * - ERR_HDMI_BAD_PARAMETER: a parameter was out of range
|
|
+ * - ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number
|
|
+ * - ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus
|
|
+ * - ERR_HDMI_I2C_READ: failed when reading to the I2C bus
|
|
+ * - ERR_HDMI_NOT_INITIALIZED: transmitter not initialized
|
|
+ * - ERR_HDMI_OPERATION_NOT_PERMITTED: not allowed in DVI mode
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+error_code_t tx_set_vs_infoframe
|
|
+(
|
|
+ instance_t instance,
|
|
+ bool enable,
|
|
+ tx_vs_pkt_data_t *p_vs_if_data
|
|
+);
|
|
+
|
|
+/*****************************************************************************/
|
|
+/**
|
|
+ * \brief Enables/disables NULL packet sending (only used for debug purpose).
|
|
+ * This function is synchronous.
|
|
+ * This function is not ISR friendly.
|
|
+ *
|
|
+ * \param instance Instance identifier.
|
|
+ * \param enable Enable/disable packet insertion.
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong
|
|
+ * - ERR_HDMI_BAD_PARAMETER: a parameter was out of range
|
|
+ * - ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number
|
|
+ * - ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus
|
|
+ * - ERR_HDMI_I2C_READ: failed when reading to the I2C bus
|
|
+ * - ERR_HDMI_NOT_INITIALIZED: transmitter not initialized
|
|
+ * - ERR_HDMI_OPERATION_NOT_PERMITTED: not allowed in DVI mode
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+error_code_t tx_debug_set_null_packet
|
|
+(
|
|
+ instance_t instance,
|
|
+ bool enable
|
|
+);
|
|
+
|
|
+/*****************************************************************************/
|
|
+/**
|
|
+ * \brief Send one single NULL packet (only used for debug purpose).
|
|
+ * This function is synchronous.
|
|
+ * This function is not ISR friendly.
|
|
+ *
|
|
+ * \param instance Instance identifier.
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong
|
|
+ * - ERR_HDMI_BAD_PARAMETER: a parameter was out of range
|
|
+ * - ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number
|
|
+ * - ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus
|
|
+ * - ERR_HDMI_I2C_READ: failed when reading to the I2C bus
|
|
+ * - ERR_HDMI_NOT_INITIALIZED: transmitter not initialized
|
|
+ * - ERR_HDMI_OPERATION_NOT_PERMITTED: not allowed in DVI mode
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+error_code_t tx_debug_set_single_null_packet
|
|
+(
|
|
+ instance_t instance
|
|
+);
|
|
+
|
|
+/*****************************************************************************/
|
|
+/**
|
|
+ * \brief Set the audio output mute status. This function can be used to mute
|
|
+ * audio output, without muting video. This can be typically used when
|
|
+ * reconfiguring the audio HW after a sample rate change.
|
|
+ * This function is synchronous.
|
|
+ * This function is not ISR friendly.
|
|
+ *
|
|
+ * \param instance Instance identifier.
|
|
+ * \param muteStatus Mute status (true/false).
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong
|
|
+ * - ERR_HDMI_BAD_PARAMETER: a parameter was out of range
|
|
+ * - ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number
|
|
+ * - ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus
|
|
+ * - ERR_HDMI_I2C_READ: failed when reading to the I2C bus
|
|
+ * - ERR_HDMI_NOT_INITIALIZED: transmitter not initialized
|
|
+ * - ERR_HDMI_OPERATION_NOT_PERMITTED: not allowed in DVI mode
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+error_code_t tx_set_audio_mute
|
|
+(
|
|
+ instance_t instance,
|
|
+ bool audio_mute
|
|
+);
|
|
+
|
|
+/*****************************************************************************/
|
|
+/**
|
|
+ * \brief Reset audio CTS.
|
|
+ * This function is synchronous.
|
|
+ * This function is not ISR friendly.
|
|
+ *
|
|
+ * \param instance Instance identifier.
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong
|
|
+ * - ERR_HDMI_BAD_PARAMETER: a parameter was out of range
|
|
+ * - ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number
|
|
+ * - ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus
|
|
+ * - ERR_HDMI_I2C_READ: failed when reading to the I2C bus
|
|
+ * - ERR_HDMI_NOT_INITIALIZED: transmitter not initialized
|
|
+ * - ERR_HDMI_OPERATION_NOT_PERMITTED: not allowed in DVI mode
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+error_code_t tx_reset_audio_cts
|
|
+(
|
|
+ instance_t instance
|
|
+);
|
|
+
|
|
+/*****************************************************************************/
|
|
+/**
|
|
+ * \brief Retrieve EDID Status from driver.
|
|
+ * This function is synchronous.
|
|
+ * This function is ISR friendly.
|
|
+ *
|
|
+ * \param instance Instance identifier.
|
|
+ * \param pEdidStatus Pointer to the array that will receive the EDID Status.
|
|
+ * \param pEdidBlkCount Pointer to the integer that will receive the number of
|
|
+ * read EDID block.
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong
|
|
+ * - ERR_DLHDMITX_INCONSISTENT_PARAMS: an input parameter is
|
|
+ * inconsistent
|
|
+ * - ERR_HDMI_BAD_PARAMETER: a parameter was out of range
|
|
+ * - ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number
|
|
+ * - ERR_HDMI_NOT_INITIALIZED: transmitter not initialized
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+error_code_t tx_get_edid_status
|
|
+(
|
|
+ instance_t instance,
|
|
+ tx_edid_status_t *p_edid_status,
|
|
+ u8 *p_edid_blk_count
|
|
+);
|
|
+
|
|
+/*****************************************************************************/
|
|
+/**
|
|
+ * \brief Retrieves audio descriptors from receiver's EDID. This function
|
|
+ * parses the EDID of Tx device to get the relevant data.
|
|
+ * This function is synchronous.
|
|
+ * This function is not ISR friendly.
|
|
+ *
|
|
+ * \param instance Instance identifier.
|
|
+ * \param pAudioDescs Pointer to the array that will receive audio
|
|
+ * descriptors.
|
|
+ * \param maxAudioDescs Size of the array.
|
|
+ * \param pWrittenAudioDescs Pointer to the integer that will receive the actual
|
|
+ * number of written descriptors.
|
|
+ * \param pAudioFlags Pointer to the byte to receive Audio Capabilities Flags.
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong
|
|
+ * - ERR_DLHDMITX_INCONSISTENT_PARAMS: an input parameter is
|
|
+ * inconsistent
|
|
+ * - ERR_DLHDMITX_INVALID_STATE: the state is invalid for
|
|
+ * the function
|
|
+ * - ERR_HDMI_BAD_PARAMETER: a parameter was out of range
|
|
+ * - ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number
|
|
+ * - ERR_HDMI_RESOURCE_NOT_AVAILABLE : EDID not read
|
|
+ * - ERR_HDMI_NOT_INITIALIZED: transmitter not initialized
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+error_code_t tx_get_edid_audio_caps
|
|
+(
|
|
+ instance_t instance,
|
|
+ tx_edid_audio_desc_t *p_audio_descs,
|
|
+ uint max_audio_descs,
|
|
+ uint *p_written_audio_descs,
|
|
+ u8 *p_audio_flags
|
|
+);
|
|
+
|
|
+/*****************************************************************************/
|
|
+/**
|
|
+ * \brief Retrieves supported video formats (short descriptors) from
|
|
+ * receiver's EDID. This function parses the EDID of Rx device to get
|
|
+ * the relevant data.
|
|
+ * This function is synchronous.
|
|
+ * This function is not ISR friendly.
|
|
+ *
|
|
+ * \param instance Instance identifier.
|
|
+ * \param pVideoDesc Pointer to the structure that will receive short
|
|
+ * video descriptors.
|
|
+ * \param maxVideoFormats Size of the array.
|
|
+ * \param pWrittenVideoFormats Pointer to the integer that will receive the actual
|
|
+ * number of written descriptors.
|
|
+ * \param pVideoFlags Pointer to the byte to receive Video Capability Flags.
|
|
+ * b7: underscan supported
|
|
+ * b6: YCbCr 4:4:4 supported
|
|
+ * b5: YCbCr 4:2:2 supported
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong
|
|
+ * - ERR_DLHDMITX_INCONSISTENT_PARAMS: an input parameter is
|
|
+ * inconsistent
|
|
+ * - ERR_DLHDMITX_INVALID_STATE: the state is invalid for
|
|
+ * the function
|
|
+ * - ERR_HDMI_BAD_PARAMETER: a parameter was out of range
|
|
+ * - ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number
|
|
+ * - ERR_HDMI_RESOURCE_NOT_AVAILABLE : EDID not read
|
|
+ * - ERR_HDMI_NOT_INITIALIZED: transmitter not initialized
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+error_code_t tx_get_edid_video_caps
|
|
+(
|
|
+ instance_t instance,
|
|
+ tx_short_vid_desc_t *p_video_desc,
|
|
+ uint max_video_formats,
|
|
+ uint *p_written_video_formats,
|
|
+ u8 *p_video_flags
|
|
+);
|
|
+
|
|
+/*****************************************************************************/
|
|
+/**
|
|
+ * \brief Retrieves supported video formats (short descriptors) from
|
|
+ * receiver's EDID. This function parses the EDID of Rx device to get
|
|
+ * the relevant data.
|
|
+ * This function is synchronous.
|
|
+ * This function is not ISR friendly.
|
|
+ *
|
|
+ * \param instance Instance identifier.
|
|
+ * \param pPreferredVideoFormat Pointer to the array that will receive video
|
|
+ * timing descriptor.
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong
|
|
+ * - ERR_DLHDMITX_INCONSISTENT_PARAMS: an input parameter is
|
|
+ * inconsistent
|
|
+ * - ERR_DLHDMITX_INVALID_STATE: the state is invalid for
|
|
+ * the function
|
|
+ * - ERR_HDMI_BAD_PARAMETER: a parameter was out of range
|
|
+ * - ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number
|
|
+ * - ERR_HDMI_RESOURCE_NOT_AVAILABLE : EDID not read
|
|
+ * - ERR_HDMI_NOT_INITIALIZED: transmitter not initialized
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+error_code_t tx_get_edid_video_preferred
|
|
+(
|
|
+ instance_t instance,
|
|
+ tx_edid_video_timings_t *p_preferred_video_format
|
|
+);
|
|
+
|
|
+/*****************************************************************************/
|
|
+/**
|
|
+ * \brief Retrieves the sink type from receiver's EDID (HDMI or DVI). This
|
|
+ * function parses the EDID of Rx device to get the relevant data.
|
|
+ * This function is synchronous.
|
|
+ * This function is not ISR friendly.
|
|
+ *
|
|
+ * \param instance Instance identifier.
|
|
+ * \param pSinkType Pointer to the array that will receive sink type.
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong
|
|
+ * - ERR_DLHDMITX_BAD_PARAMETER: a parameter is invalid or out
|
|
+ * of range
|
|
+ * - ERR_DLHDMITX_NO_RESOURCES: the resource is not available
|
|
+ * - ERR_DLHDMITX_BAD_UNIT_NUMBER: bad transmitter unit number
|
|
+ * - ERR_DLHDMITX_NOT_INITIALIZED: the transmitter is not initialized
|
|
+ * - ERR_DLHDMITX_INVALID_STATE: the state is invalid for
|
|
+ * the function
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+error_code_t tx_get_edid_sink_type
|
|
+(
|
|
+ instance_t instance,
|
|
+ tx_sink_type_t *p_sink_type
|
|
+);
|
|
+
|
|
+/*****************************************************************************/
|
|
+/**
|
|
+ * \brief Retrieves source address from receivers's EDID. This
|
|
+ * function parses the EDID of Rx device to get the relevant data.
|
|
+ * This function is synchronous.
|
|
+ * This function is not ISR friendly.
|
|
+ *
|
|
+ * \param instance Instance identifier.
|
|
+ * \param pSourceAddress Pointer to the integer that will receive the EDID source
|
|
+ * address.
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong
|
|
+ * - ERR_DLHDMITX_INCONSISTENT_PARAMS: an input parameter is
|
|
+ * inconsistent
|
|
+ * - ERR_DLHDMITX_INVALID_STATE: the state is invalid for
|
|
+ * the function
|
|
+ * - ERR_HDMI_BAD_PARAMETER: a parameter was out of range
|
|
+ * - ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number
|
|
+ * - ERR_HDMI_RESOURCE_NOT_AVAILABLE : EDID not read
|
|
+ * - ERR_HDMI_NOT_INITIALIZED: transmitter not initialized
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+error_code_t tx_get_edid_source_address
|
|
+(
|
|
+ instance_t instance,
|
|
+ u16 *p_source_address
|
|
+);
|
|
+
|
|
+/*****************************************************************************/
|
|
+/**
|
|
+ * \brief Retreives KSV list received by Tx device.
|
|
+ * This function is synchronous.
|
|
+ * This function is not ISR friendly.
|
|
+ *
|
|
+ * \param instance Instance identifier.
|
|
+ * \param pKsv Pointer to the array that will receive the KSV list.
|
|
+ * \param maxKsv Maximum number of KSV that the array can store.
|
|
+ * \param pWrittenKsv Actual number of KSV written into the array.
|
|
+ * \param pDepth Connection tree depth.
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong
|
|
+ * - ERR_DLHDMITX_INCONSISTENT_PARAMS: an input parameter is
|
|
+ * inconsistent
|
|
+ * - ERR_DLHDMITX_INVALID_STATE: the state is invalid for
|
|
+ * the function
|
|
+ * - ERR_DLHDMITX_NOT_SUPPORTED: device does not support HDCP
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+error_code_t tx_get_ksv_list
|
|
+(
|
|
+ instance_t instance,
|
|
+ u8 *p_ksv,
|
|
+ u8 max_ksv,
|
|
+ u8 *p_written_ksv,
|
|
+ u8 *p_depth,
|
|
+ bool *p_max_casc_exd,
|
|
+ bool *p_max_devs_exd
|
|
+);
|
|
+
|
|
+/*****************************************************************************/
|
|
+/**
|
|
+ * \brief Enable/Disable HDCP encryption.
|
|
+ * This function is synchronous.
|
|
+ * This function is not ISR friendly.
|
|
+ *
|
|
+ * \param instance Instance identifier.
|
|
+ * \param hdcpEnable HDCP On/Off (true = On, false = Off).
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong
|
|
+ * - ERR_DLHDMITX_INVALID_STATE: the state is invalid for
|
|
+ * the function
|
|
+ * - ERR_DLHDMITX_RESOLUTION_UNKNOWN: the resolution is unknown
|
|
+ * - ERR_DLHDMITX_NOT_SUPPORTED: device does not support HDCP
|
|
+ * - ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number
|
|
+ * - ERR_HDMI_BAD_PARAMETER: a parameter was out of range
|
|
+ * - ERR_HDMI_NOT_INITIALIZED: transmitter not initialized
|
|
+ * - ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus
|
|
+ * - ERR_HDMI_I2C_READ: failed when reading the I2C bus
|
|
+ * - ERR_HDMI_BAD_PARAMETER: a parameter was out of range
|
|
+ * - ERR_HDMI_NOT_SUPPORTED: device does not support HDCP
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+error_code_t tx_set_hdcp
|
|
+(
|
|
+ instance_t instance,
|
|
+ bool hdcp_enable
|
|
+);
|
|
+
|
|
+/*****************************************************************************/
|
|
+/**
|
|
+ * \brief Get the driver HDCP state.
|
|
+ * This function is synchronous.
|
|
+ * This function is not ISR friendly.
|
|
+ *
|
|
+ * \param instance Instance identifier.
|
|
+ * \param pHdcpCheckState Pointer to the integer that will receive the HDCP check state.
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong
|
|
+ * - ERR_DLHDMITX_INCONSISTENT_PARAMS: an input parameter is
|
|
+ * inconsistent
|
|
+ * - ERR_DLHDMITX_NOT_SUPPORTED: device does not support HDCP
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+error_code_t tx_get_hdcp_state
|
|
+(
|
|
+ instance_t instance,
|
|
+ tx_hdcp_check_t *p_hdcp_check_state
|
|
+);
|
|
+
|
|
+/*****************************************************************************/
|
|
+/**
|
|
+ * \brief Check the result of an HDCP encryption attempt, called at
|
|
+ * intervals (set by timeSinceLastCall) after txSetHdcp(true).
|
|
+ * This API must be used only in case of No Operating System. if OS,
|
|
+ * this is manage internally of this device library.
|
|
+ * This function is synchronous.
|
|
+ * This function is not ISR friendly.
|
|
+ *
|
|
+ * \param instance Instance identifier.
|
|
+ * \param timeSinceLastCall Time passed in milliseconds since last call,
|
|
+ * must be shorter than 600 ms.
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong
|
|
+ * - ERR_DLHDMITX_NOT_SUPPORTED: device does not support HDCP
|
|
+ * - ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number
|
|
+ * - ERR_HDMI_BAD_PARAMETER: a parameter was out of range
|
|
+ * - ERR_HDMI_NOT_INITIALIZED: transmitter not initialized
|
|
+ * - ERR_HDMI_I2C_READ: failed when reading the I2C bus
|
|
+ * - ERR_HDMI_I2C_WRITE: failed when writing the I2C bus
|
|
+ * - ERR_HDMI_NOT_SUPPORTED: device does not support HDCP
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+error_code_t tx_hdcp_check
|
|
+(
|
|
+ instance_t instance,
|
|
+ u16 time_since_last_call
|
|
+);
|
|
+
|
|
+/*****************************************************************************/
|
|
+/**
|
|
+ * \brief This function loads a gamut metadata packet into the HW. HW will
|
|
+ * actually send it at the beginning of next VS, during the vertical
|
|
+ * blanking.
|
|
+ * This function is synchronous.
|
|
+ * This function is not ISR friendly.
|
|
+ *
|
|
+ * \param instance Instance identifier.
|
|
+ * \param enable Enable/disable gamut metadata packet insertion.
|
|
+ * \param pGamutData Pointer to the structure containing gamut metadata
|
|
+ * parameters.
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong
|
|
+ * - ERR_DLHDMITX_INVALID_STATE: the state is invalid for
|
|
+ * the function
|
|
+ * - ERR_DLHDMITX_INCONSISTENT_PARAMS: an input parameter is
|
|
+ * inconsistent
|
|
+ * - ERR_HDMI_BAD_PARAMETER: a parameter was out of range
|
|
+ * - ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number
|
|
+ * - ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus
|
|
+ * - ERR_HDMI_I2C_READ: failed when reading to the I2C bus
|
|
+ * - ERR_HDMI_NOT_INITIALIZED: transmitter not initialized
|
|
+ * - ERR_HDMI_OPERATION_NOT_PERMITTED: not allowed in DVI mode
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+error_code_t tx_set_gamut_packet
|
|
+(
|
|
+ instance_t instance,
|
|
+ bool enable,
|
|
+ tx_gamut_data_t *p_gamut_data
|
|
+);
|
|
+
|
|
+/*****************************************************************************/
|
|
+/**
|
|
+ * \brief Retrieves supported detailled video descriptors from
|
|
+ * receiver's EDID. This function parses the EDID of Rx device to get
|
|
+ * the relevant data.
|
|
+ * This function is synchronous.
|
|
+ * This function is not ISR friendly.
|
|
+ *
|
|
+ * \param instance Instance identifier.
|
|
+ * \param pDTDescriptors Pointer to the array that will receive detailled
|
|
+ * timing descriptors.
|
|
+ * \param maxDTDesc Size of the array.
|
|
+ * \param pWrittenDesc Pointer to the integer that will receive the actual
|
|
+ * number of written descriptors.
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong
|
|
+ * - ERR_DLHDMITX_INCONSISTENT_PARAMS: an input parameter is
|
|
+ * inconsistent
|
|
+ * - ERR_DLHDMITX_INVALID_STATE: the state is invalid for
|
|
+ * the function
|
|
+ * - ERR_HDMI_BAD_PARAMETER: a parameter was out of range
|
|
+ * - ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number
|
|
+ * - ERR_HDMI_RESOURCE_NOT_AVAILABLE : EDID not read
|
|
+ * - ERR_HDMI_NOT_INITIALIZED: transmitter not initialized
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+error_code_t tx_get_edid_detailled_timing_descriptors
|
|
+(
|
|
+ instance_t instance,
|
|
+ tx_edid_video_timings_t *p_dtdescriptors,
|
|
+ u8 max_dtdesc,
|
|
+ u8 *p_written_dtdesc
|
|
+);
|
|
+
|
|
+/*****************************************************************************/
|
|
+/**
|
|
+ * \brief Retrieves supported monitor descriptor from receiver's EDID.
|
|
+ * This function parses the EDID of Rx device to get
|
|
+ * the relevant data.
|
|
+ * This function is synchronous.
|
|
+ * This function is not ISR friendly.
|
|
+ *
|
|
+ * \param instance Instance identifier.
|
|
+ * \param pEdidFirstMD Pointer to the array that will receive the first monitor
|
|
+ * descriptors.
|
|
+ * \param pEdidSecondMD Pointer to the array that will receive the second monitor
|
|
+ * descriptors.
|
|
+ * \param pEdidOtherMD Pointer to the array that will receive the other monitor
|
|
+ * descriptors.
|
|
+ * \param maxOtherMD Size of the array.
|
|
+ * \param pWrittenOtherMD Pointer to the integer that will receive the actual
|
|
+ * number of written descriptors.
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong
|
|
+ * - ERR_DLHDMITX_INCONSISTENT_PARAMS: an input parameter is
|
|
+ * inconsistent
|
|
+ * - ERR_DLHDMITX_INVALID_STATE: the state is invalid for
|
|
+ * the function
|
|
+ * - ERR_HDMI_BAD_PARAMETER: a parameter was out of range
|
|
+ * - ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number
|
|
+ * - ERR_HDMI_RESOURCE_NOT_AVAILABLE : EDID not read
|
|
+ * - ERR_HDMI_NOT_INITIALIZED: transmitter not initialized
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+error_code_t tx_get_monitor_descriptors
|
|
+(
|
|
+ instance_t instance,
|
|
+ tx_edid_first_md_t *p_edid_first_md,
|
|
+ tx_edid_second_md_t *p_edid_second_md,
|
|
+ tx_edid_other_md_t *p_edid_other_md,
|
|
+ u8 max_other_md,
|
|
+ u8 *p_written_other_md
|
|
+);
|
|
+
|
|
+/******************************************************************************
|
|
+ * \brief This function set the revocation list use for HDCP
|
|
+ * This function is synchronous.
|
|
+ * This function is not ISR friendly.
|
|
+ *
|
|
+ * \param instance Instance identifier.
|
|
+ * \param listPtr Pointer on revocation list provide by application.
|
|
+ * \param length length of revocation list.
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong
|
|
+ * - ERR_DLHDMITX_INCONSISTENT_PARAMS: an input parameter is
|
|
+ * inconsistent
|
|
+ ******************************************************************************/
|
|
+
|
|
+error_code_t tx_set_hdcprevocation_list(
|
|
+ instance_t instance,
|
|
+ void *list_ptr,
|
|
+ u32 length
|
|
+);
|
|
+
|
|
+error_code_t tx_get_hpdstatus
|
|
+(
|
|
+ instance_t instance,
|
|
+ tx_hot_plug_t *p_hpdstatus
|
|
+);
|
|
+
|
|
+#endif /* DLHDMITX_FUNCTIONS_H */
|
|
+
|
|
+/*============================================================================*/
|
|
+/* END OF FILE */
|
|
+/*============================================================================*/
|
|
+
|
|
diff --git a/drivers/video/hdmi/comps/tmdlTDA9983/inc/tmdlHdmiTx_Types.h b/drivers/video/hdmi/comps/tmdlTDA9983/inc/tmdlHdmiTx_Types.h
|
|
new file mode 100755
|
|
index 0000000..906af9d
|
|
--- /dev/null
|
|
+++ b/drivers/video/hdmi/comps/tmdlTDA9983/inc/tmdlHdmiTx_Types.h
|
|
@@ -0,0 +1,839 @@
|
|
+/**
|
|
+ * copyright (C) 2007 NXP N.V., all rights reserved.
|
|
+ * this source code and any compilation or derivative thereof is the proprietary
|
|
+ * information of NXP N.V. and is confidential in nature. under no circumstances
|
|
+ * is this software to be exposed to or placed under an open source license of
|
|
+ * any type without the expressed written permission of NXP N.V.
|
|
+ *
|
|
+ * \file tx_types.h
|
|
+ *
|
|
+ * \version $revision: 1 $
|
|
+ *
|
|
+ * \date $date: 02/08/07 08:32 $
|
|
+ *
|
|
+ * \brief devlib driver component API for the tda_998x HDMI transmitters
|
|
+ *
|
|
+ * \section refs reference documents
|
|
+ * HDMI tx driver - FRS.doc,
|
|
+ * HDMI tx driver - tx - SCS.doc
|
|
+ *
|
|
+ * \section info change information
|
|
+ *
|
|
+ * \verbatim
|
|
+ *
|
|
+ * $history: tx_types.h $
|
|
+ *
|
|
+ * ***************** version 1 *****************
|
|
+ * user: demoment date: 02/08/07 time: 08:32
|
|
+ * updated in $/source/tx/inc
|
|
+ * initial version
|
|
+ *
|
|
+ * \endverbatim
|
|
+ *
|
|
+ * */
|
|
+
|
|
+#ifndef DLHDMITX_TYPES_H
|
|
+#define DLHDMITX_TYPES_H
|
|
+
|
|
+/*============================================================================*/
|
|
+/* INCLUDE FILES */
|
|
+/*============================================================================*/
|
|
+
|
|
+#include "tmNxTypes.h"
|
|
+
|
|
+/*============================================================================*/
|
|
+/* MACRO DEFINITIONS */
|
|
+/*============================================================================*/
|
|
+
|
|
+/*============================================================================*/
|
|
+/* DEFINES */
|
|
+/*============================================================================*/
|
|
+
|
|
+/**< Error Codes */
|
|
+#define ERR_DLHDMITX_BASE 0x100
|
|
+#define ERR_DLHDMITX_COMPATIBILITY (ERR_DLHDMITX_BASE + ERR_COMPATIBILITY) /**< SW Interface compatibility */
|
|
+#define ERR_DLHDMITX_MAJOR_VERSION (ERR_DLHDMITX_BASE + ERR_MAJOR_VERSION) /**< SW Major Version error */
|
|
+#define ERR_DLHDMITX_COMP_VERSION (ERR_DLHDMITX_BASE + ERR_COMP_VERSION) /**< SW component version error */
|
|
+#define ERR_DLHDMITX_BAD_UNIT_NUMBER (ERR_DLHDMITX_BASE + ERR_BAD_UNIT_NUMBER) /**< Invalid device unit number */
|
|
+#define ERR_DLHDMITX_BAD_INSTANCE (ERR_DLHDMITX_BASE + ERR_BAD_INSTANCE) /**< Bad input instance value */
|
|
+#define ERR_DLHDMITX_BAD_HANDLE (ERR_DLHDMITX_BASE + ERR_BAD_HANDLE) /**< Bad input handle */
|
|
+#define ERR_DLHDMITX_BAD_PARAMETER (ERR_DLHDMITX_BASE + ERR_BAD_PARAMETER) /**< Invalid input parameter */
|
|
+#define ERR_DLHDMITX_NO_RESOURCES (ERR_DLHDMITX_BASE + ERR_NO_RESOURCES) /**< Resource is not available */
|
|
+#define ERR_DLHDMITX_RESOURCE_OWNED (ERR_DLHDMITX_BASE + ERR_RESOURCE_OWNED) /**< Resource is already in use */
|
|
+#define ERR_DLHDMITX_RESOURCE_NOT_OWNED (ERR_DLHDMITX_BASE + ERR_RESOURCE_NOT_OWNED) /**< Caller does not own resource */
|
|
+#define ERR_DLHDMITX_INCONSISTENT_PARAMS (ERR_DLHDMITX_BASE + ERR_INCONSISTENT_PARAMS) /**< Inconsistent input params */
|
|
+#define ERR_DLHDMITX_NOT_INITIALIZED (ERR_DLHDMITX_BASE + ERR_NOT_INITIALIZED) /**< Component is not initialized */
|
|
+#define ERR_DLHDMITX_NOT_SUPPORTED (ERR_DLHDMITX_BASE + ERR_NOT_SUPPORTED) /**< Function is not supported */
|
|
+#define ERR_DLHDMITX_INIT_FAILED (ERR_DLHDMITX_BASE + ERR_INIT_FAILED) /**< Initialization failed */
|
|
+#define ERR_DLHDMITX_BUSY (ERR_DLHDMITX_BASE + ERR_BUSY) /**< Component is busy */
|
|
+#define ERR_DLHDMITX_I2C_READ (ERR_DLHDMITX_BASE + ERR_READ) /**< Read error */
|
|
+#define ERR_DLHDMITX_I2C_WRITE (ERR_DLHDMITX_BASE + ERR_WRITE) /**< Write error */
|
|
+#define ERR_DLHDMITX_FULL (ERR_DLHDMITX_BASE + ERR_FULL) /**< Queue is full */
|
|
+#define ERR_DLHDMITX_NOT_STARTED (ERR_DLHDMITX_BASE + ERR_NOT_STARTED) /**< Function is not started */
|
|
+#define ERR_DLHDMITX_ALREADY_STARTED (ERR_DLHDMITX_BASE + ERR_ALREADY_STARTED) /**< Function is already started */
|
|
+#define ERR_DLHDMITX_ASSERTION (ERR_DLHDMITX_BASE + ERR_ASSERTION) /**< Assertion failure */
|
|
+#define ERR_DLHDMITX_INVALID_STATE (ERR_DLHDMITX_BASE + ERR_INVALID_STATE) /**< Invalid state for function */
|
|
+#define ERR_DLHDMITX_OPERATION_NOT_PERMITTED (ERR_DLHDMITX_BASE + ERR_OPERATION_NOT_PERMITTED) /**< Corresponds to posix EPERM */
|
|
+#define ERR_DLHDMITX_RESOLUTION_UNKNOWN (ERR_DLHDMITX_BASE + ERR_BAD_FORMAT) /**< Bad format */
|
|
+
|
|
+/* Defined here for tx_CmpTst */
|
|
+#define ERR_DLHDMITX_COMP ERR_DLHDMITX_BASE | ERR_COMP_UNIQUE_START
|
|
+#define DL_DLHDMITX_HDCP_SECURE (ERR_DLHDMITX_COMP + 0x0001) /**< Revocation list is secure */
|
|
+#define DL_DLHDMITX_HDCP_NOT_SECURE (ERR_DLHDMITX_COMP + 0x0002) /**< Revocation list is NOT secure */
|
|
+
|
|
+/*============================================================================*/
|
|
+/* ENUM OR TYPE DEFINITIONS */
|
|
+/*============================================================================*/
|
|
+
|
|
+/**
|
|
+ * \brief Enum listing all events that can be signalled to application
|
|
+ * */
|
|
+typedef enum {
|
|
+ /**< HDCP encryption status switched to active */
|
|
+ DL_HDMITX_HDCP_ACTIVE = 0,
|
|
+ /**< HDCP encryption status switched to inactive */
|
|
+ DL_HDMITX_HDCP_INACTIVE = 1,
|
|
+ /**< Hotplug status switched to active */
|
|
+ DL_HDMITX_HPD_ACTIVE = 2,
|
|
+ /**< Hotplug status switched to inactive */
|
|
+ DL_HDMITX_HPD_INACTIVE = 3,
|
|
+ DL_HDMITX_RX_KEYS_RECEIVED = 4, /**< Receiver(s) key(s) received */
|
|
+ /**< Rx device is connected and active */
|
|
+ DL_HDMITX_RX_DEVICE_ACTIVE = 5,
|
|
+ /**< Rx device is connected but inactive (standby) */
|
|
+ DL_HDMITX_RX_DEVICE_INACTIVE = 6,
|
|
+ DL_HDMITX_EDID_RECEIVED = 7, /**< EDID has been received */
|
|
+ /**< VS interrupt has been received */
|
|
+ DL_HDMITX_VS_RPT_RECEIVED = 8
|
|
+} tx_event_t;
|
|
+
|
|
+/**
|
|
+ * \brief Enum listing all available event status
|
|
+ * */
|
|
+typedef enum {
|
|
+ DL_HDMITX_EVENT_ENABLED, /**< Event is enabled */
|
|
+ DL_HDMITX_EVENT_DISABLED /**< Event is disabled */
|
|
+} tx_event_status_t;
|
|
+
|
|
+/**
|
|
+ * \brief Callback function pointer type, used to allow driver to callback
|
|
+ * application when activity status is changing at input.
|
|
+ * \param Event Identifier of the source event.
|
|
+ * */
|
|
+typedef void (*ptx_callback_t)(tx_event_t event);
|
|
+
|
|
+/**
|
|
+ * \brief Enum listing all supported device versions
|
|
+ * */
|
|
+typedef enum {
|
|
+ DL_HDMITX_DEVICE_UNKNOWN, /**< HW device is unknown */
|
|
+ DL_HDMITX_DEVICE_TDA9984, /**< HW device is IC TDA9984 */
|
|
+ DL_HDMITX_DEVICE_TDA9989, /**< HW device is IC TDA9989 */
|
|
+ DL_HDMITX_DEVICE_LIPP4200, /**< HW device is IP LIPP4200 */
|
|
+ DL_HDMITX_DEVICE_TDA9981, /**< HW device is IC TDA9981 */
|
|
+ DL_HDMITX_DEVICE_TDA9983 /**< HW device is IC TDA9983 */
|
|
+} tx_device_version_t;
|
|
+
|
|
+/**
|
|
+ * \brief Enum defining the supported HDMI standard version
|
|
+ * */
|
|
+typedef enum {
|
|
+ DL_HDMITX_HDMI_VERSION_UNKNOWN, /**< Unknown */
|
|
+ DL_HDMITX_HDMI_VERSION_1_1, /**< HDMI 1.1 */
|
|
+ dl_hdmitx_hdmi_version_1_2a, /**< HDMI 1.2a */
|
|
+ dl_hdmitx_hdmi_version_1_3a /**< HDMI 1.3 */
|
|
+} tx_hdmi_version_t;
|
|
+
|
|
+/**
|
|
+ * \brief Enum listing all color depth (8 bits/color, 10 bits/color, etc.)
|
|
+ * */
|
|
+typedef enum {
|
|
+ DL_HDMITX_COLORDEPTH_24 = 0, /**< 8 bits per color */
|
|
+ DL_HDMITX_COLORDEPTH_30 = 1, /**< 10 bits per color */
|
|
+ DL_HDMITX_COLORDEPTH_36 = 2, /**< 12 bits per color */
|
|
+ DL_HDMITX_COLORDEPTH_48 = 3, /**< 16 bits per color */
|
|
+} tx_color_depth_t;
|
|
+
|
|
+/**
|
|
+ * \brief Enum defining the EDID Status
|
|
+ * */
|
|
+typedef enum {
|
|
+ DL_HDMITX_EDID_READ = 0, /**< All blocks read OK */
|
|
+ /**< All blocks read OK but buffer too small to return all of them */
|
|
+ DL_HDMITX_EDID_READ_INCOMPLETE = 1,
|
|
+ DL_HDMITX_EDID_ERROR_CHK_BLOCK_0 = 2, /**< Block 0 checksum error */
|
|
+ /**< Block 0 OK, checksum error in one or more other blocks */
|
|
+ DL_HDMITX_EDID_ERROR_CHK = 3,
|
|
+ DL_HDMITX_EDID_NOT_READ = 4, /**< EDID not read */
|
|
+ DL_HDMITX_EDID_STATUS_INVALID = 5 /**< Invalid */
|
|
+} tx_edid_status_t;
|
|
+
|
|
+/**
|
|
+ * \brief Structure defining the supported audio packets
|
|
+ * */
|
|
+typedef struct {
|
|
+ bool HBR; /**< High Bitrate Audio packet */
|
|
+ bool DST; /**< Direct Stream Transport audio packet */
|
|
+ bool one_bit_audio; /**< One Bit Audio sample packet */
|
|
+} tx_audio_packet_t;
|
|
+
|
|
+/**
|
|
+ * \brief Enum listing all possible audio input formats
|
|
+ * */
|
|
+typedef enum {
|
|
+ DL_HDMITX_AFMT_SPDIF = 0, /**< SPDIF */
|
|
+ DL_HDMITX_AFMT_I2S = 1, /**< I2S */
|
|
+ DL_HDMITX_AFMT_OBA = 2, /**< One bit audio / DSD */
|
|
+ DL_HDMITX_AFMT_DST = 3, /**< DST */
|
|
+ DL_HDMITX_AFMT_HBR = 4 /**< HBR */
|
|
+} tx_audio_format_t;
|
|
+
|
|
+/**
|
|
+ * \brief Enum listing all possible audio input sample rates
|
|
+ * */
|
|
+typedef enum {
|
|
+ DL_HDMITX_AFS_32K = 0, /**< 32kHz */
|
|
+ DL_HDMITX_AFS_44K = 1, /**< 44.1kHz */
|
|
+ DL_HDMITX_AFS_48K = 2, /**< 48kHz */
|
|
+ DL_HDMITX_AFS_88K = 3, /**< 88.2kHz */
|
|
+ DL_HDMITX_AFS_96K = 4, /**< 96kHz */
|
|
+ DL_HDMITX_AFS_176K = 5, /**< 176.4kHz */
|
|
+ DL_HDMITX_AFS_192K = 6 /**< 192kHz */
|
|
+} tx_audio_rate_t;
|
|
+
|
|
+/**
|
|
+ * \brief Enum listing all possible audio input sample rates
|
|
+ * */
|
|
+typedef enum {
|
|
+ DL_HDMITX_I2SQ_16BITS = 16, /**< 16 bits */
|
|
+ DL_HDMITX_I2SQ_32BITS = 32, /**< 32 bits */
|
|
+ DL_HDMITX_I2SQ_OTHERS = 0, /**< for SPDIF and DSD */
|
|
+} tx_audio_i2squalifier_t;
|
|
+
|
|
+/**
|
|
+ * \brief Enum listing all possible audio I2S formats
|
|
+ * */
|
|
+typedef enum {
|
|
+ DL_HDMITX_I2SFOR_PHILIPS_L = 0, /**< Philips like format */
|
|
+ /**< Other non Philips left justified */
|
|
+ DL_HDMITX_I2SFOR_OTH_L = 2,
|
|
+ /**< Other non Philips right justified */
|
|
+ DL_HDMITX_I2SFOR_OTH_R = 3,
|
|
+ DL_HDMITX_I2SFOR_INVALID = 4 /**< Invalid format */
|
|
+} tx_audio_i2sformat_t;
|
|
+
|
|
+/**
|
|
+ * \brief Enum listing all possible DST data transfer rates
|
|
+ * */
|
|
+typedef enum {
|
|
+ DL_HDMITX_DSTRATE_SINGLE = 0, /**< Single transfer rate */
|
|
+ DL_HDMITX_DSTRATE_DOUBLE = 1 /**< Double data rate */
|
|
+} tx_dst_rate_t;
|
|
+
|
|
+/**
|
|
+ * \brief Structure describing unit capabilities
|
|
+ * */
|
|
+typedef struct {
|
|
+ tx_device_version_t device_version; /**< HW device version */
|
|
+ /**< Supported HDMI standard version */
|
|
+ tx_hdmi_version_t hdmi_version;
|
|
+ tx_audio_packet_t audio_packet; /**< Supported audio packets */
|
|
+ tx_color_depth_t color_depth; /**< Supported color depth */
|
|
+ /**< Supported Hdcp encryption (true/false) */
|
|
+ bool hdcp;
|
|
+ /**< Supported scaler (true/false) */
|
|
+ bool scaler;
|
|
+} tx_capabilities_t;
|
|
+
|
|
+/**
|
|
+ * \brief Structure gathering all instance setup parameters
|
|
+ * */
|
|
+typedef struct {
|
|
+ bool simplay_hd; /**< Enable simplayHD support */
|
|
+ bool repeater_enable; /**< Enable repeater mode */
|
|
+ u8 *p_edid_buffer; /**< Pointer to raw EDID data */
|
|
+ u32 edid_buffer_size; /**< Size of buffer for raw EDID data */
|
|
+} tx_instance_setup_info_t;
|
|
+
|
|
+/**
|
|
+ * \brief Enum listing all IA/CEA 861-D video formats
|
|
+ * */
|
|
+typedef enum {
|
|
+ /**< Not a valid format... */
|
|
+ DL_HDMITX_VFMT_NULL = 0,
|
|
+ /**< ...or no change required */
|
|
+ DL_HDMITX_VFMT_NO_CHANGE = 0,
|
|
+ /**< Lowest valid format */
|
|
+ DL_HDMITX_VFMT_MIN = 1,
|
|
+ /**< Lowest valid TV format */
|
|
+ DL_HDMITX_VFMT_TV_MIN = 1,
|
|
+ /**< Format 01 640 x 480p 60Hz */
|
|
+ dl_hdmitx_vfmt_01_640x480p_60hz = 1,
|
|
+ /**< Format 02 720 x 480p 60Hz */
|
|
+ dl_hdmitx_vfmt_02_720x480p_60hz = 2,
|
|
+ /**< Format 03 720 x 480p 60Hz */
|
|
+ dl_hdmitx_vfmt_03_720x480p_60hz = 3,
|
|
+ /**< Format 04 1280 x 720p 60Hz */
|
|
+ dl_hdmitx_vfmt_04_1280x720p_60hz = 4,
|
|
+ /**< Format 05 1920 x 1080i 60Hz */
|
|
+ dl_hdmitx_vfmt_05_1920x1080i_60hz = 5,
|
|
+ /**< Format 06 720 x 480i 60Hz */
|
|
+ dl_hdmitx_vfmt_06_720x480i_60hz = 6,
|
|
+ /**< Format 07 720 x 480i 60Hz */
|
|
+ dl_hdmitx_vfmt_07_720x480i_60hz = 7,
|
|
+ /**< Format 08 720 x 240p 60Hz */
|
|
+ dl_hdmitx_vfmt_08_720x240p_60hz = 8,
|
|
+ /**< Format 09 720 x 240p 60Hz */
|
|
+ dl_hdmitx_vfmt_09_720x240p_60hz = 9,
|
|
+ /**< Format 10 720 x 480i 60Hz */
|
|
+ dl_hdmitx_vfmt_10_720x480i_60hz = 10,
|
|
+ /**< Format 11 720 x 480i 60Hz */
|
|
+ dl_hdmitx_vfmt_11_720x480i_60hz = 11,
|
|
+ /**< Format 12 720 x 240p 60Hz */
|
|
+ dl_hdmitx_vfmt_12_720x240p_60hz = 12,
|
|
+ /**< Format 13 720 x 240p 60Hz */
|
|
+ dl_hdmitx_vfmt_13_720x240p_60hz = 13,
|
|
+ /**< Format 14 1440 x 480p 60Hz */
|
|
+ dl_hdmitx_vfmt_14_1440x480p_60hz = 14,
|
|
+ /**< Format 15 1440 x 480p 60Hz */
|
|
+ dl_hdmitx_vfmt_15_1440x480p_60hz = 15,
|
|
+ /**< Format 16 1920 x 1080p 60Hz */
|
|
+ dl_hdmitx_vfmt_16_1920x1080p_60hz = 16,
|
|
+ /**< Format 17 720 x 576p 50Hz */
|
|
+ dl_hdmitx_vfmt_17_720x576p_50hz = 17,
|
|
+ /**< Format 18 720 x 576p 50Hz */
|
|
+ dl_hdmitx_vfmt_18_720x576p_50hz = 18,
|
|
+ /**< Format 19 1280 x 720p 50Hz */
|
|
+ dl_hdmitx_vfmt_19_1280x720p_50hz = 19,
|
|
+ /**< Format 20 1920 x 1080i 50Hz */
|
|
+ dl_hdmitx_vfmt_20_1920x1080i_50hz = 20,
|
|
+ /**< Format 21 720 x 576i 50Hz */
|
|
+ dl_hdmitx_vfmt_21_720x576i_50hz = 21,
|
|
+ /**< Format 22 720 x 576i 50Hz */
|
|
+ dl_hdmitx_vfmt_22_720x576i_50hz = 22,
|
|
+ /**< Format 23 720 x 288p 50Hz */
|
|
+ dl_hdmitx_vfmt_23_720x288p_50hz = 23,
|
|
+ /**< Format 24 720 x 288p 50Hz */
|
|
+ dl_hdmitx_vfmt_24_720x288p_50hz = 24,
|
|
+ /**< Format 25 720 x 576i 50Hz */
|
|
+ dl_hdmitx_vfmt_25_720x576i_50hz = 25,
|
|
+ /**< Format 26 720 x 576i 50Hz */
|
|
+ dl_hdmitx_vfmt_26_720x576i_50hz = 26,
|
|
+ /**< Format 27 720 x 288p 50Hz */
|
|
+ dl_hdmitx_vfmt_27_720x288p_50hz = 27,
|
|
+ /**< Format 28 720 x 288p 50Hz */
|
|
+ dl_hdmitx_vfmt_28_720x288p_50hz = 28,
|
|
+ /**< Format 29 1440 x 576p 50Hz */
|
|
+ dl_hdmitx_vfmt_29_1440x576p_50hz = 29,
|
|
+ /**< Format 30 1440 x 576p 50Hz */
|
|
+ dl_hdmitx_vfmt_30_1440x576p_50hz = 30,
|
|
+ /**< Format 31 1920 x 1080p 50Hz */
|
|
+ dl_hdmitx_vfmt_31_1920x1080p_50hz = 31,
|
|
+ /**< Format 32 1920 x 1080p 24Hz */
|
|
+ dl_hdmitx_vfmt_32_1920x1080p_24hz = 32,
|
|
+ /**< Format 33 1920 x 1080p 25Hz */
|
|
+ dl_hdmitx_vfmt_33_1920x1080p_25hz = 33,
|
|
+ /**< Format 34 1920 x 1080p 30Hz */
|
|
+ dl_hdmitx_vfmt_34_1920x1080p_30hz = 34,
|
|
+ /**< Highest valid TV format */
|
|
+ DL_HDMITX_VFMT_TV_MAX = 34,
|
|
+ /**< Lowest TV format without prefetched table */
|
|
+ DL_HDMITX_VFMT_TV_NO_REG_MIN = 32,
|
|
+ /**< Number of TV formats & null */
|
|
+ DL_HDMITX_VFMT_TV_NUM = 35,
|
|
+ /**< Lowest valid PC format */
|
|
+ DL_HDMITX_VFMT_PC_MIN = 128,
|
|
+ /**< PC format 128 */
|
|
+ dl_hdmitx_vfmt_pc_640x480p_60hz = 128,
|
|
+ /**< PC format 129 */
|
|
+ dl_hdmitx_vfmt_pc_800x600p_60hz = 129,
|
|
+ /**< PC format 130 */
|
|
+ dl_hdmitx_vfmt_pc_1152x960p_60hz = 130,
|
|
+ /**< PC format 131 */
|
|
+ dl_hdmitx_vfmt_pc_1024x768p_60hz = 131,
|
|
+ /**< PC format 132 */
|
|
+ dl_hdmitx_vfmt_pc_1280x768p_60hz = 132,
|
|
+ /**< PC format 133 */
|
|
+ dl_hdmitx_vfmt_pc_1280x1024p_60hz = 133,
|
|
+ /**< PC format 134 */
|
|
+ dl_hdmitx_vfmt_pc_1360x768p_60hz = 134,
|
|
+ /**< PC format 135 */
|
|
+ dl_hdmitx_vfmt_pc_1400x1050p_60hz = 135,
|
|
+ /**< PC format 136 */
|
|
+ dl_hdmitx_vfmt_pc_1600x1200p_60hz = 136,
|
|
+ /**< PC format 137 */
|
|
+ dl_hdmitx_vfmt_pc_1024x768p_70hz = 137,
|
|
+ /**< PC format 138 */
|
|
+ dl_hdmitx_vfmt_pc_640x480p_72hz = 138,
|
|
+ /**< PC format 139 */
|
|
+ dl_hdmitx_vfmt_pc_800x600p_72hz = 139,
|
|
+ /**< PC format 140 */
|
|
+ dl_hdmitx_vfmt_pc_640x480p_75hz = 140,
|
|
+ /**< PC format 141 */
|
|
+ dl_hdmitx_vfmt_pc_1024x768p_75hz = 141,
|
|
+ /**< PC format 142 */
|
|
+ dl_hdmitx_vfmt_pc_800x600p_75hz = 142,
|
|
+ /**< PC format 143 */
|
|
+ dl_hdmitx_vfmt_pc_1024x864p_75hz = 143,
|
|
+ /**< PC format 144 */
|
|
+ dl_hdmitx_vfmt_pc_1280x1024p_75hz = 144,
|
|
+ /**< PC format 145 */
|
|
+ dl_hdmitx_vfmt_pc_640x350p_85hz = 145,
|
|
+ /**< PC format 146 */
|
|
+ dl_hdmitx_vfmt_pc_640x400p_85hz = 146,
|
|
+ /**< PC format 147 */
|
|
+ dl_hdmitx_vfmt_pc_720x400p_85hz = 147,
|
|
+ /**< PC format 148 */
|
|
+ dl_hdmitx_vfmt_pc_640x480p_85hz = 148,
|
|
+ /**< PC format 149 */
|
|
+ dl_hdmitx_vfmt_pc_800x600p_85hz = 149,
|
|
+ /**< PC format 150 */
|
|
+ dl_hdmitx_vfmt_pc_1024x768p_85hz = 150,
|
|
+ /**< PC format 151 */
|
|
+ dl_hdmitx_vfmt_pc_1152x864p_85hz = 151,
|
|
+ /**< PC format 152 */
|
|
+ dl_hdmitx_vfmt_pc_1280x960p_85hz = 152,
|
|
+ /**< PC format 153 */
|
|
+ dl_hdmitx_vfmt_pc_1280x1024p_85hz = 153,
|
|
+ /**< PC format 154 */
|
|
+ dl_hdmitx_vfmt_pc_1024x768i_87hz = 154,
|
|
+ /**< Highest valid PC format */
|
|
+ DL_HDMITX_VFMT_PC_MAX = 154,
|
|
+ /**< Number of PC formats */
|
|
+ DL_HDMITX_VFMT_PC_NUM = (1 + 154 - 128)
|
|
+} tx_vid_fmt_t;
|
|
+
|
|
+/**
|
|
+ * \brief Structure defining the EDID short video descriptor
|
|
+ * */
|
|
+typedef struct {
|
|
+ /**< Video format as defined by EIA/CEA 861-D */
|
|
+ tx_vid_fmt_t video_format;
|
|
+ /**< true if format is the preferred video format */
|
|
+ bool native_video_format;
|
|
+} tx_short_vid_desc_t;
|
|
+
|
|
+/**
|
|
+ * \brief Enum listing all picture aspect ratio (H:V) (4:3, 16:9)
|
|
+ * */
|
|
+typedef enum {
|
|
+ /**< Undefined picture aspect ratio */
|
|
+ DL_HDMITX_P_ASPECT_RATIO_UNDEFINED = 0,
|
|
+ /**< 6:5 picture aspect ratio (PAR) */
|
|
+ DL_HDMITX_P_ASPECT_RATIO_6_5 = 1,
|
|
+ DL_HDMITX_P_ASPECT_RATIO_5_4 = 2, /**< 5:4 PAR */
|
|
+ DL_HDMITX_P_ASPECT_RATIO_4_3 = 3, /**< 4:3 PAR */
|
|
+ DL_HDMITX_P_ASPECT_RATIO_16_10 = 4, /**< 16:10 PAR */
|
|
+ DL_HDMITX_P_ASPECT_RATIO_5_3 = 5, /**< 5:3 PAR */
|
|
+ DL_HDMITX_P_ASPECT_RATIO_16_9 = 6, /**< 16:9 PAR */
|
|
+ DL_HDMITX_P_ASPECT_RATIO_9_5 = 7, /**< 9:5 PAR */
|
|
+} tx_pict_aspect_ratio_t;
|
|
+
|
|
+/**
|
|
+ * \brief Enum listing all vertical frequency
|
|
+ * */
|
|
+typedef enum {
|
|
+ dl_hdmitx_vfreq_24hz = 0, /**< 24Hz */
|
|
+ dl_hdmitx_vfreq_25hz = 1, /**< 25Hz */
|
|
+ dl_hdmitx_vfreq_30hz = 2, /**< 30Hz */
|
|
+ dl_hdmitx_vfreq_50hz = 3, /**< 50Hz */
|
|
+ dl_hdmitx_vfreq_59hz = 4, /**< 59.94Hz */
|
|
+ dl_hdmitx_vfreq_60hz = 5, /**< 60Hz */
|
|
+#ifndef FORMAT_PC
|
|
+ DL_HDMITX_VFREQ_INVALID = 6, /**< Invalid */
|
|
+ DL_HDMITX_VFREQ_NUM = 6 /**< No. of values */
|
|
+#else /* FORMAT_PC */
|
|
+ dl_hdmitx_vfreq_70hz = 6, /**< 70Hz */
|
|
+ dl_hdmitx_vfreq_72hz = 7, /**< 72Hz */
|
|
+ dl_hdmitx_vfreq_75hz = 8, /**< 75Hz */
|
|
+ dl_hdmitx_vfreq_85hz = 9, /**< 85Hz */
|
|
+ dl_hdmitx_vfreq_87hz = 10, /**< 87Hz */
|
|
+ DL_HDMITX_VFREQ_INVALID = 11, /**< Invalid */
|
|
+ DL_HDMITX_VFREQ_NUM = 11 /**< No. of values */
|
|
+#endif /* FORMAT_PC */
|
|
+} tx_vfreq_t;
|
|
+
|
|
+/**
|
|
+ * \brief Structure storing specifications of a video resolution
|
|
+ * */
|
|
+typedef struct {
|
|
+ /**< Width of the frame in pixels */
|
|
+ u16 width;
|
|
+ /**< Height of the frame in pixels */
|
|
+ u16 height;
|
|
+ /**< Interlaced mode (true/false) */
|
|
+ bool interlaced;
|
|
+ tx_vfreq_t vfrequency; /**< Vertical frequency in Hz */
|
|
+ tx_pict_aspect_ratio_t aspect_ratio; /**< Picture aspect ratio (H:V) */
|
|
+} tx_vid_fmt_specs_t;
|
|
+
|
|
+/**
|
|
+ * \brief Enum listing all video input modes (CCIR, RGB, etc.)
|
|
+ * */
|
|
+typedef enum {
|
|
+ DL_HDMITX_VINMODE_CCIR656 = 0, /**< CCIR656 */
|
|
+ DL_HDMITX_VINMODE_RGB444 = 1, /**< RGB444 */
|
|
+ DL_HDMITX_VINMODE_YUV444 = 2, /**< YUV444 */
|
|
+ DL_HDMITX_VINMODE_YUV422 = 3, /**< YUV422 */
|
|
+ DL_HDMITX_VINMODE_NO_CHANGE = 4, /**< No change */
|
|
+ DL_HDMITX_VINMODE_INVALID = 5 /**< Invalid */
|
|
+} tx_vin_mode_t;
|
|
+
|
|
+/**
|
|
+ * \brief Enum listing all possible sync sources
|
|
+ * */
|
|
+typedef enum {
|
|
+ DL_HDMITX_SYNCSRC_EMBEDDED = 0, /**< Embedded sync */
|
|
+ DL_HDMITX_SYNCSRC_EXT_VREF = 1, /**< External sync Vref, Href, Fref */
|
|
+ DL_HDMITX_SYNCSRC_EXT_VS = 2, /**< External sync Vs, Hs */
|
|
+} tx_sync_source_t;
|
|
+
|
|
+/**
|
|
+ * \brief Enum listing all output pixel rate (Single, Double, etc.)
|
|
+ * */
|
|
+typedef enum {
|
|
+ DL_HDMITX_PIXRATE_DOUBLE = 0, /**< Double pixel rate */
|
|
+ DL_HDMITX_PIXRATE_SINGLE = 1, /**< Single pixel rate */
|
|
+ /**< Single pixel repeated */
|
|
+ DL_HDMITX_PIXRATE_SINGLE_REPEATED = 2,
|
|
+} tx_pix_rate_t;
|
|
+
|
|
+/**
|
|
+ * \brief Structure defining the video input configuration
|
|
+ * */
|
|
+typedef struct {
|
|
+ /**< Video format as defined by EIA/CEA 861-D */
|
|
+ tx_vid_fmt_t format;
|
|
+ tx_vin_mode_t mode; /**< Video mode (CCIR, RGB, YUV, etc.) */
|
|
+ tx_sync_source_t sync_source; /**< Sync source type */
|
|
+ tx_pix_rate_t pixel_rate; /**< Pixel rate */
|
|
+} tx_video_in_config_t;
|
|
+
|
|
+/**
|
|
+ * \brief Enum listing all video output modes (YUV, RGB, etc.)
|
|
+ * */
|
|
+typedef enum {
|
|
+ DL_HDMITX_VOUTMODE_RGB444 = 0, /**< RGB444 */
|
|
+ DL_HDMITX_VOUTMODE_YUV422 = 1, /**< YUV422 */
|
|
+ DL_HDMITX_VOUTMODE_YUV444 = 2, /**< YUV444 */
|
|
+} tx_vout_mode_t;
|
|
+
|
|
+/**
|
|
+ * \brief Enum defining possible quantization range
|
|
+ * */
|
|
+typedef enum {
|
|
+ DL_HDMITX_VQR_DEFAULT = 0, /* Follow HDMI spec. */
|
|
+ DL_HDMITX_RGB_FULL = 1, /* Force RGB FULL , DVI only */
|
|
+ DL_HDMITX_RGB_LIMITED = 2 /* Force RGB LIMITED , DVI only */
|
|
+} tx_vqr_t;
|
|
+
|
|
+/**
|
|
+ * \brief Structure defining the video output configuration
|
|
+ * */
|
|
+typedef struct {
|
|
+ /**< Video format as defined by EIA/CEA 861-D */
|
|
+ tx_vid_fmt_t format;
|
|
+ tx_vout_mode_t mode; /**< Video mode (CCIR, RGB, YUV, etc.) */
|
|
+ tx_color_depth_t color_depth; /**< Color depth */
|
|
+ tx_vqr_t dvi_vqr; /**< VQR applied in DVI mode */
|
|
+} tx_video_out_config_t;
|
|
+
|
|
+/**
|
|
+ * \brief Structure defining the audio input configuration
|
|
+ * */
|
|
+typedef struct {
|
|
+ /**< Audio format (I2S, SPDIF, etc.) */
|
|
+ tx_audio_format_t format;
|
|
+ tx_audio_rate_t rate; /**< Audio sampling rate */
|
|
+ /**< I2S format of the audio input */
|
|
+ tx_audio_i2sformat_t i2s_format;
|
|
+ /**< I2S qualifier of the audio input (8,16,32 bits) */
|
|
+ tx_audio_i2squalifier_t i2s_qualifier;
|
|
+ tx_dst_rate_t dst_rate; /**< DST data transfer rate */
|
|
+ /**< Ref to CEA-861D p85 */
|
|
+ u8 channel_allocation;
|
|
+} tx_audio_in_config_t;
|
|
+
|
|
+/**
|
|
+ * \brief Enum listing all the type of sunk
|
|
+ * */
|
|
+typedef enum {
|
|
+ DL_HDMITX_SINK_DVI = 0, /**< DVI */
|
|
+ DL_HDMITX_SINK_HDMI = 1, /**< HDMI */
|
|
+ DL_HDMITX_SINK_EDID = 2, /**< As currently defined in EDID */
|
|
+} tx_sink_type_t;
|
|
+
|
|
+/**
|
|
+ * \brief Structure defining the content of a gamut packet
|
|
+ * */
|
|
+typedef struct {
|
|
+ /**< Gamut relevant for field following packet insertion */
|
|
+ bool next_field;
|
|
+ /**< Profile of the gamut packet : 0 = P0, 1 = P1 */
|
|
+ u8 gbd_profile;
|
|
+ /**< Gamut sequence number of the field that have to be affected by this gamut packet */
|
|
+ u8 affected_gamut_seq_num;
|
|
+ /**< Current field not using specific gamut */
|
|
+ bool no_current_gbd;
|
|
+ /**< Gamut sequence number of the current field */
|
|
+ u8 current_gamut_seq_num;
|
|
+ /**< Sequence of the packet inside a multiple packet gamut */
|
|
+ u8 packet_sequence;
|
|
+ u8 payload[28]; /**< Payload of the gamut packet */
|
|
+} tx_gamut_data_t;
|
|
+
|
|
+/**
|
|
+ * \brief Type defining the content of a generic packet
|
|
+ * */
|
|
+typedef u8 tx_generic_packet[28];
|
|
+
|
|
+/**
|
|
+ * \brief Structure defining the content of an ACP packet
|
|
+ * */
|
|
+typedef struct {
|
|
+ u8 acp_type;
|
|
+ u8 acp_data[28];
|
|
+} tx_acp_pkt_data_t;
|
|
+
|
|
+/**
|
|
+ * \brief Structure defining the content of an AVI infoframe
|
|
+ * */
|
|
+typedef struct {
|
|
+ /**< RGB or YCbCr indicator. See CEA-861-B table 8 for details */
|
|
+ u8 color_indicator;
|
|
+ /**< Active information present. Indicates if activeFormatAspectRatio field is valid */
|
|
+ u8 active_info_present;
|
|
+ u8 bar_information_data_valid; /**< Bar information data valid */
|
|
+ /**< Scan information. See CEA-861-B table 8 for details */
|
|
+ u8 scan_information;
|
|
+ /**< Colorimetry. See CEA-861-B table 9 for details */
|
|
+ u8 colorimetry;
|
|
+ /**< Picture aspect ratio. See CEA-861-B table 9 for details */
|
|
+ u8 picture_aspect_ratio;
|
|
+ /**< Active Format aspect ratio. See CEA-861-B table 10 and Annex H for details */
|
|
+ u8 active_format_aspect_ratio;
|
|
+ /**< Non-uniform picture scaling. See CEA-861-B table 11 for details */
|
|
+ u8 non_uniform_picture_scaling;
|
|
+ /**< Video format indentification code. See CEA-861-B section 6.3 for details */
|
|
+ u8 video_format_identification_code;
|
|
+ /**< Pixel repetition factor. See CEA-861-B table 11 for details */
|
|
+ u8 pixel_repetition_factor;
|
|
+ u16 line_number_end_top_bar;
|
|
+ u16 line_number_start_bottom_bar;
|
|
+ u16 line_number_end_left_bar;
|
|
+ u16 line_number_start_right_bar;
|
|
+} tx_avi_if_data_t;
|
|
+
|
|
+/**
|
|
+ * \brief Structure defining the content of an ACP packet
|
|
+ * */
|
|
+typedef struct {
|
|
+ bool av_mute;
|
|
+} tx_gcp_pkt_data_t;
|
|
+
|
|
+/**
|
|
+ * \brief Structure defining the content of an AUD infoframe
|
|
+ * */
|
|
+typedef struct {
|
|
+ u8 coding_type; /**< Coding type (always set to zero) */
|
|
+ /**< Channel count. See CEA-861-B table 17 for details */
|
|
+ u8 channel_count;
|
|
+ /**< Sample frequency. See CEA-861-B table 18 for details */
|
|
+ u8 samplefrequency;
|
|
+ /**< Sample frequency. See CEA-861-B table 18 for details */
|
|
+ u8 sample_size;
|
|
+ /**< Channel allocation. See CEA-861-B section 6.3.2 for details */
|
|
+ u8 channel_allocation;
|
|
+ /**< Downmix inhibit. See CEA-861-B section 6.3.2 for details */
|
|
+ bool downmix_inhibit;
|
|
+ /**< level shift value for downmixing. See CEA-861-B section 6.3.2 and table 23 for details */
|
|
+ u8 level_shift_value;
|
|
+} tx_aud_if_data_t;
|
|
+
|
|
+/**
|
|
+ * \brief Structure defining the content of an ISRC1 packet
|
|
+ * */
|
|
+typedef struct {
|
|
+ bool isrc_cont; /**< ISRC packet continued in next packet */
|
|
+ /**< Set to one when ISRCStatus and UPC_EAN_ISRC_xx are valid */
|
|
+ bool isrc_valid;
|
|
+ u8 isrc_status; /**< ISRC status */
|
|
+ u8 UPC_EAN_ISRC[16]; /**< ISRC packet data */
|
|
+} tx_isrc1pkt_data_t;
|
|
+
|
|
+/**
|
|
+ * \brief Structure defining the content of an ISRC2 packet
|
|
+ * */
|
|
+typedef struct {
|
|
+ u8 UPC_EAN_ISRC[16]; /**< ISRC packet data */
|
|
+} tx_isrc2pkt_data_t;
|
|
+
|
|
+/**
|
|
+ * \brief Structure defining the content of an MPS infoframe
|
|
+ * */
|
|
+typedef struct {
|
|
+ u32 bit_rate; /**< MPEG bit rate in Hz */
|
|
+ u32 frame_type; /**< MPEG frame type */
|
|
+ bool field_repeat; /**< 0: new field, 1:repeated field */
|
|
+} tx_mps_if_data_t;
|
|
+
|
|
+/**
|
|
+ * \brief Structure defining the content of an SPD infoframe
|
|
+ * */
|
|
+typedef struct {
|
|
+ u8 vendor_name[8]; /**< Vendor name */
|
|
+ u8 product_desc[16]; /**< Product Description */
|
|
+ u32 source_dev_info; /**< Source Device Info */
|
|
+} tx_spd_if_data_t;
|
|
+
|
|
+/**
|
|
+ * \brief Structure defining the content of a VS packet
|
|
+ * */
|
|
+typedef struct {
|
|
+ u8 version;
|
|
+ u8 vs_data[27];
|
|
+} tx_vs_pkt_data_t;
|
|
+
|
|
+/**
|
|
+ * \brief Structure defining the Edid audio descriptor
|
|
+ * */
|
|
+typedef struct {
|
|
+ u8 format; /* EIA/CEA861 mode */
|
|
+ u8 channels; /* number of channels */
|
|
+ u8 supported_freqs; /* bitmask of supported frequencies */
|
|
+ u8 supported_res; /* bitmask of supported resolutions (LPCM only) */
|
|
+ /* Maximum bitrate divided by 8KHz (compressed formats only) */
|
|
+ u8 max_bitrate;
|
|
+} tx_edid_audio_desc_t;
|
|
+
|
|
+/**
|
|
+ * \brief Structure defining detailed timings of a video format
|
|
+ * */
|
|
+typedef struct {
|
|
+ u16 pixel_clock; /**< Pixel Clock/10 000 */
|
|
+ u16 h_active_pixels; /**< Horizontal Active Pixels */
|
|
+ u16 h_blank_pixels; /**< Horizontal Blanking Pixels */
|
|
+ u16 v_active_lines; /**< Vertical Active Lines */
|
|
+ u16 v_blank_lines; /**< Vertical Blanking Lines */
|
|
+ u16 h_sync_offset; /**< Horizontal Sync Offset */
|
|
+ u16 h_sync_width; /**< Horiz. Sync Pulse Width */
|
|
+ u16 v_sync_offset; /**< Vertical Sync Offset */
|
|
+ u16 v_sync_width; /**< Vertical Sync Pulse Width */
|
|
+ u16 h_image_size; /**< Horizontal Image Size */
|
|
+ u16 v_image_size; /**< Vertical Image Size */
|
|
+ u16 h_border_pixels; /**< Horizontal Border */
|
|
+ u16 v_border_pixels; /**< Vertical Border */
|
|
+ u8 flags; /**< Interlace/sync info */
|
|
+} tx_edid_video_timings_t;
|
|
+
|
|
+/** size descriptor block of monitor descriptor */
|
|
+#define EDID_MONITOR_DESCRIPTOR_SIZE 13
|
|
+
|
|
+/**
|
|
+ * \brief Structure defining the first monitor descriptor
|
|
+ * */
|
|
+typedef struct {
|
|
+ /**< true when parameters of struct are available */
|
|
+ bool desc_record;
|
|
+ /**< Monitor Name */
|
|
+ u8 monitor_name[EDID_MONITOR_DESCRIPTOR_SIZE];
|
|
+} tx_edid_first_md_t;
|
|
+
|
|
+/**
|
|
+ * \brief Structure defining the second monitor descriptor
|
|
+ * */
|
|
+typedef struct {
|
|
+ /**< true when parameters of struct are available */
|
|
+ bool desc_record;
|
|
+ /**< Min vertical rate in Hz */
|
|
+ u8 min_vertical_rate;
|
|
+ /**< Max vertical rate in Hz */
|
|
+ u8 max_vertical_rate;
|
|
+ /**< Min horizontal rate in Hz */
|
|
+ u8 min_horizontal_rate;
|
|
+ /**< Max horizontal rate in Hz */
|
|
+ u8 max_horizontal_rate;
|
|
+ /**< Max suuported pixel clock rate in MHz */
|
|
+ u8 max_supported_pixel_clk;
|
|
+} tx_edid_second_md_t;
|
|
+
|
|
+/**
|
|
+ * \brief Structure defining the other monitor descriptor
|
|
+ * */
|
|
+typedef struct {
|
|
+ /**< true when parameters of struct are available */
|
|
+ bool desc_record;
|
|
+ /**< Other monitor Descriptor */
|
|
+ u8 other_descriptor[EDID_MONITOR_DESCRIPTOR_SIZE];
|
|
+} tx_edid_other_md_t;
|
|
+
|
|
+/**
|
|
+ * \brief Test pattern types
|
|
+ * */
|
|
+typedef enum {
|
|
+ DL_HDMITX_PATTERN_OFF = 0, /**< Insert test pattern */
|
|
+ DL_HDMITX_PATTERN_CBAR4 = 1, /**< Insert 4-bar colour bar */
|
|
+ DL_HDMITX_PATTERN_CBAR8 = 2, /**< Insert 8-bar colour bar */
|
|
+ DL_HDMITX_PATTERN_BLUE = 3, /**< Insert Blue screen */
|
|
+ DL_HDMITX_PATTERN_BLACK = 4, /**< Insert Black screen */
|
|
+ DL_HDMITX_PATTERN_INVALID = 5 /**< Invalid pattern */
|
|
+} tx_test_pattern_t;
|
|
+
|
|
+/**
|
|
+ * \brief Enum listing all hdcp state
|
|
+ * */
|
|
+typedef enum {
|
|
+ DL_HDMITX_HDCP_CHECK_NOT_STARTED = 0, /**< Check not started */
|
|
+ /**< No failures, more to do */
|
|
+ DL_HDMITX_HDCP_CHECK_IN_PROGRESS = 1,
|
|
+ /**< Final check has passed */
|
|
+ DL_HDMITX_HDCP_CHECK_PASS = 2,
|
|
+ /**< First check failure code */
|
|
+ DL_HDMITX_HDCP_CHECK_FAIL_FIRST = 3,
|
|
+ /**< Driver not AUTHENTICATED */
|
|
+ DL_HDMITX_HDCP_CHECK_FAIL_DRIVER_STATE = 3,
|
|
+ /**< A T0 interrupt occurred */
|
|
+ DL_HDMITX_HDCP_CHECK_FAIL_DEVICE_T0 = 4,
|
|
+ DL_HDMITX_HDCP_CHECK_FAIL_DEVICE_RI = 5, /**< Device RI changed */
|
|
+ DL_HDMITX_HDCP_CHECK_FAIL_DEVICE_FSM = 6, /**< Device FSM not 10h */
|
|
+ /**< Number of check results */
|
|
+ DL_HDMITX_HDCP_CHECK_NUM = 7
|
|
+} tx_hdcp_check_t;
|
|
+
|
|
+/**
|
|
+ * \brief Enum listing all hdcp option flags
|
|
+ * */
|
|
+typedef enum {
|
|
+ /* Not set: obey PJ result */
|
|
+ DL_HDMITX_HDCP_OPTION_FORCE_PJ_IGNORED = 0x01,
|
|
+ /* Not set: obey BCAPS setting */
|
|
+ DL_HDMITX_HDCP_OPTION_FORCE_SLOW_DDC = 0x02,
|
|
+ /* Not set: obey BCAPS setting */
|
|
+ DL_HDMITX_HDCP_OPTION_FORCE_NO_1_1 = 0x04,
|
|
+ /* Not set: obey BCAPS setting */
|
|
+ DL_HDMITX_HDCP_OPTION_FORCE_REPEATER = 0x08,
|
|
+ /* Not set: obey BCAPS setting */
|
|
+ DL_HDMITX_HDCP_OPTION_FORCE_NO_REPEATER = 0x10,
|
|
+ /* Not set: obey V=V' result */
|
|
+ DL_HDMITX_HDCP_OPTION_FORCE_V_EQU_VBAR = 0x20,
|
|
+ DL_HDMITX_HDCP_OPTION_FORCE_VSLOW_DDC = 0x40, /* Set: 50kHz DDC */
|
|
+ /* All the above Not Set vals */
|
|
+ DL_HDMITX_HDCP_OPTION_DEFAULT = 0x00,
|
|
+ /* Only these bits are allowed */
|
|
+ DL_HDMITX_HDCP_OPTION_MASK = 0x7F,
|
|
+ /* These bits are not allowed */
|
|
+ DL_HDMITX_HDCP_OPTION_MASK_BAD = 0x80
|
|
+} tx_hdcp_options_t;
|
|
+
|
|
+typedef enum {
|
|
+ DL_HDMITX_HOTPLUG_INACTIVE = 0, /**< Hotplug inactive */
|
|
+ DL_HDMITX_HOTPLUG_ACTIVE = 1, /**< Hotplug active */
|
|
+ DL_HDMITX_HOTPLUG_INVALID = 2 /**< Invalid Hotplug */
|
|
+} tx_hot_plug_t;
|
|
+
|
|
+#endif /* DLHDMITX_TYPES_H */
|
|
+
|
|
+/*============================================================================*/
|
|
+/* END OF FILE */
|
|
+/*============================================================================*/
|
|
+
|
|
diff --git a/drivers/video/hdmi/comps/tmdlTDA9983/src/tmdlHdmiTx.c b/drivers/video/hdmi/comps/tmdlTDA9983/src/tmdlHdmiTx.c
|
|
new file mode 100755
|
|
index 0000000..9864072
|
|
--- /dev/null
|
|
+++ b/drivers/video/hdmi/comps/tmdlTDA9983/src/tmdlHdmiTx.c
|
|
@@ -0,0 +1,5163 @@
|
|
+/**
|
|
+ * Copyright (C) 2006 NXP N.V., All Rights Reserved.
|
|
+ * This source code and any compilation or derivative thereof is the proprietary
|
|
+ * information of NXP N.V. and is confidential in nature. Under no circumstances
|
|
+ * is this software to be exposed to or placed under an Open Source License of
|
|
+ * any type without the expressed written permission of NXP N.V.
|
|
+ *
|
|
+ * \file tx.c
|
|
+ *
|
|
+ * \version Revision: 1
|
|
+ *
|
|
+ * \date Date: 10/08/07 10:00
|
|
+ *
|
|
+ * \brief devlib driver component API for the TDA998x HDMI Transmitters
|
|
+ *
|
|
+ * \section refs Reference Documents
|
|
+ * HDMI Tx Driver - FRS.doc,
|
|
+ *
|
|
+ * \section info Change Information
|
|
+ *
|
|
+ * \verbatim
|
|
+ *
|
|
+ * History: tx.c
|
|
+ *
|
|
+ * ***************** Version 1 *****************
|
|
+ * User: J. Lamotte Date: 10/08/07 Time: 10:00
|
|
+ * Updated in $/Source/tx/inc
|
|
+ * initial version
|
|
+ *
|
|
+ * \endverbatim
|
|
+ *
|
|
+ * */
|
|
+
|
|
+/*============================================================================*/
|
|
+/* INCLUDE FILES */
|
|
+/*============================================================================*/
|
|
+#include "tmdlHdmiTx_IW.h"
|
|
+#include "tmdlHdmiTx.h"
|
|
+#include "tmdlHdmiTx_local.h"
|
|
+#include "tmbslHdmiTx.h"
|
|
+#include "tmdlHdmiTx_cfg.h"
|
|
+
|
|
+/*============================================================================*/
|
|
+/* TYPES DECLARATIONS */
|
|
+/*============================================================================*/
|
|
+
|
|
+/* Macro to avoid compilation warnings */
|
|
+#ifdef TMFL_OS_WINDOWS
|
|
+#define DUMMY_ACCESS(x) x
|
|
+#else
|
|
+#define DUMMY_ACCESS(x)
|
|
+#endif
|
|
+
|
|
+/*============================================================================*/
|
|
+/* CONSTANTS DECLARATIONS */
|
|
+/*============================================================================*/
|
|
+
|
|
+/*============================================================================*/
|
|
+/* FUNCTION PROTOTYPES */
|
|
+/*============================================================================*/
|
|
+
|
|
+extern error_code_t bsl_debug_write_fake_reg_page(unit_select_t tx_unit);
|
|
+
|
|
+/* Prototypes of internal functions */
|
|
+/* Task functions */
|
|
+#ifndef TMFL_NO_RTOS
|
|
+static void command_task_unit0(void);
|
|
+static void hdcp_task_unit0(void);
|
|
+#endif /* TMFL_NO_RTOS */
|
|
+
|
|
+/* Interrupt callback functions */
|
|
+static void dl_hdmi_tx_handle_encrypt(instance_t instance);
|
|
+static void dl_hdmi_tx_handle_hpd(instance_t instance);
|
|
+static void dl_hdmi_tx_handle_t0(instance_t instance);
|
|
+static void dl_hdmi_tx_handle_bcaps(instance_t instance);
|
|
+static void dl_hdmi_tx_handle_bstatus(instance_t instance);
|
|
+static void dl_hdmi_tx_handle_sha_1(instance_t instance);
|
|
+static void dl_hdmi_tx_handle_pj(instance_t instance);
|
|
+#ifdef TMFL_TDA9981_SUPPORT
|
|
+static void dl_hdmi_tx_handle_r0(instance_t instance);
|
|
+static void dl_hdmi_tx_handle_sw_int(instance_t instance);
|
|
+#endif
|
|
+#ifdef TMFL_RX_SENSE_ON
|
|
+static void dl_hdmi_tx_handle_rx_sense(instance_t instance);
|
|
+#endif
|
|
+static void dl_hdmi_tx_handle_edid_read(instance_t instance);
|
|
+#if 0
|
|
+static void dl_hdmi_tx_handle_vs_rpt(instance_t instance);
|
|
+#endif
|
|
+
|
|
+/* Devlib internal color bar management functions */
|
|
+static void dl_hdmi_tx_check_color_bar(instance_t instance);
|
|
+static void dl_hdmi_tx_check_hdcp_color_bar(instance_t instance);
|
|
+
|
|
+/* Set the state machine of device library */
|
|
+static void dl_hdmi_tx_set_state
|
|
+(
|
|
+ instance_t instance,
|
|
+ tx_driver_state_t state
|
|
+);
|
|
+
|
|
+/* Get the event status (enable or disable) in order to known
|
|
+ * if event should be signaled */
|
|
+static tx_event_status_t dl_hdmi_tx_get_event_status
|
|
+(
|
|
+ instance_t instance,
|
|
+ tx_event_t event
|
|
+);
|
|
+
|
|
+/* Use by txSetInputOutput in scaler mode */
|
|
+static bool dl_hdmi_tx_get_refline_refpix
|
|
+(
|
|
+ tx_vid_fmt_t vin_fmt,
|
|
+ tx_vin_mode_t vin_mode,
|
|
+ tx_vid_fmt_t vout_fmt,
|
|
+ u8 sync_in,
|
|
+ tx_pix_rate_t pix_rate,
|
|
+ u16 *p_ref_pix,
|
|
+ u16 *p_ref_line,
|
|
+ u16 *p_sc_ref_pix,
|
|
+ u16 *p_sc_ref_line,
|
|
+ bool *pb_verified
|
|
+);
|
|
+
|
|
+/* Use by txSetInputOutput to set AVI infoframe */
|
|
+static error_code_t dl_hdmi_tx_set_video_infoframe
|
|
+(
|
|
+ instance_t instance,
|
|
+ tx_vid_fmt_t vout_fmt,
|
|
+ tx_vout_mode_t vout_mode
|
|
+);
|
|
+
|
|
+/* Get DTD from BSL */
|
|
+static error_code_t dl_hdmi_tx_edid_get_dtd
|
|
+(
|
|
+ instance_t instance,
|
|
+ tx_edid_video_timings_t *p_dtdescriptors,
|
|
+ u8 max_dtdesc,
|
|
+ u8 *p_written_dtdesc
|
|
+);
|
|
+
|
|
+/* Convert DTD to CEA */
|
|
+static tx_vid_fmt_t dl_hdmi_tx_convert_dtdto_cea
|
|
+(
|
|
+ tx_edid_video_timings_t *p_dtdescriptors
|
|
+);
|
|
+
|
|
+static tx_vid_fmt_t dl_hdmi_tx_convert_dtdto_cea_640hap
|
|
+(
|
|
+ tx_edid_video_timings_t *p_dtdescriptors
|
|
+);
|
|
+
|
|
+static tx_vid_fmt_t dl_hdmi_tx_convert_dtdto_cea_720hap
|
|
+(
|
|
+ tx_edid_video_timings_t *p_dtdescriptors,
|
|
+ tx_pict_aspect_ratio_t picture_aspect_ratio
|
|
+);
|
|
+
|
|
+static tx_vid_fmt_t dl_hdmi_tx_convert_dtdto_cea_1280hap
|
|
+(
|
|
+ tx_edid_video_timings_t *p_dtdescriptors
|
|
+);
|
|
+
|
|
+static tx_vid_fmt_t dl_hdmi_tx_convert_dtdto_cea_1920hap
|
|
+(
|
|
+ tx_edid_video_timings_t *p_dtdescriptors,
|
|
+ bool format_interlaced
|
|
+);
|
|
+
|
|
+static tx_vid_fmt_t dl_hdmi_tx_convert_dtdto_cea_1440hap
|
|
+(
|
|
+ tx_edid_video_timings_t *p_dtdescriptors,
|
|
+ tx_pict_aspect_ratio_t picture_aspect_ratio,
|
|
+ bool format_interlaced
|
|
+);
|
|
+
|
|
+static tx_vid_fmt_t dl_hdmi_tx_convert_dtdto_cea_2880hap
|
|
+(
|
|
+ tx_edid_video_timings_t *p_dtdescriptors,
|
|
+ tx_pict_aspect_ratio_t picture_aspect_ratio,
|
|
+ bool format_interlaced
|
|
+);
|
|
+
|
|
+static tx_pict_aspect_ratio_t dl_hdmi_tx_calc_aspect_ratio(
|
|
+ u16 himage_size,
|
|
+ u16 vimage_size
|
|
+);
|
|
+
|
|
+/* IMPORTANT: The 3 functions define below should not be declared in static
|
|
+ * in order to allow applicative API to call them. Those functions are not
|
|
+ * in tx_Functions.h but are in txCore.def */
|
|
+
|
|
+/* Get the device library state */
|
|
+tx_driver_state_t dl_hdmi_tx_get_state(instance_t instance);
|
|
+
|
|
+/* Set pattern ON (Blue screen or color bar) */
|
|
+error_code_t dl_hdmi_tx_set_test_pattern_on
|
|
+(
|
|
+ instance_t instance,
|
|
+ tx_vid_fmt_t vout_fmt,
|
|
+ tx_vout_mode_t vout_mode,
|
|
+ tx_test_pattern_t pattern
|
|
+);
|
|
+
|
|
+/* Set pattern OFF */
|
|
+error_code_t dl_hdmi_tx_set_test_pattern_off
|
|
+(
|
|
+ instance_t instance,
|
|
+ tx_vid_fmt_t vout_fmt,
|
|
+ tx_vout_mode_t vout_mode
|
|
+);
|
|
+
|
|
+static void dl_hdmi_tx_check_hdcp_bksv
|
|
+
|
|
+(
|
|
+ instance_t instance,
|
|
+ u8 *p_hdcp_bksv_tested,
|
|
+ bool *pb_bksv_secure,
|
|
+ bool b_big_endian
|
|
+);
|
|
+
|
|
+/*============================================================================*/
|
|
+/* VARIABLES DECLARATIONS */
|
|
+/*============================================================================*/
|
|
+
|
|
+tx_iwsem_handle_t dl_hdmi_tx_it_semaphore[MAX_UNITS];
|
|
+
|
|
+/* Unit configuration structure (device library system configuration) */
|
|
+unit_config_t unit_table_tx[MAX_UNITS] = {
|
|
+ {
|
|
+ false,
|
|
+ false,
|
|
+ (tx_hdcp_options_t)HDCP_OPT_DEFAULT,
|
|
+ false,
|
|
+ false,
|
|
+ DL_HDMITX_DEVICE_UNKNOWN,
|
|
+ 0,
|
|
+ 0,
|
|
+ (tx_iwtask_handle_t)0,
|
|
+ (tx_iwqueue_handle_t)0,
|
|
+ (tx_iwtask_handle_t)0,
|
|
+ STATE_NOT_INITIALIZED,
|
|
+ (ptx_callback_t)0,
|
|
+ {NULL, 0}
|
|
+ }
|
|
+};
|
|
+
|
|
+#ifndef TMFL_NO_RTOS
|
|
+
|
|
+tx_iwfunc_ptr_t command_task_table_tx[MAX_UNITS] = {
|
|
+ command_task_unit0
|
|
+};
|
|
+
|
|
+tx_iwfunc_ptr_t hdcp_task_table_tx[MAX_UNITS] = {
|
|
+ hdcp_task_unit0
|
|
+};
|
|
+
|
|
+#endif /* TMFL_NO_RTOS */
|
|
+
|
|
+bsl_callback_list_t callback_func_table_tx;
|
|
+
|
|
+/* Device library configuration structure completed by txCfgGetConfig with
|
|
+ * informations contained in config file */
|
|
+tx_driver_config_table_t gtx_driver_config_table[MAX_UNITS];
|
|
+
|
|
+/* Video info (see instanceStatusInfoTx) */
|
|
+tx_video_info_t video_info_list_tx = {
|
|
+ false,
|
|
+ {dl_hdmitx_vfmt_03_720x480p_60hz, DL_HDMITX_VINMODE_YUV422, DL_HDMITX_SYNCSRC_EXT_VS, DL_HDMITX_PIXRATE_SINGLE},
|
|
+ {dl_hdmitx_vfmt_03_720x480p_60hz, DL_HDMITX_VOUTMODE_YUV422, DL_HDMITX_COLORDEPTH_24}
|
|
+};
|
|
+
|
|
+/* Audio info (see instanceStatusInfoTx) */
|
|
+tx_audio_info_t audio_info_list_tx = {
|
|
+ false,
|
|
+ {
|
|
+ DL_HDMITX_AFMT_SPDIF, DL_HDMITX_AFS_48K,
|
|
+ DL_HDMITX_I2SFOR_PHILIPS_L, DL_HDMITX_I2SQ_16BITS, DL_HDMITX_DSTRATE_SINGLE, 0x00
|
|
+ }
|
|
+};
|
|
+
|
|
+/* Event state (see instanceStatusInfoTx) */
|
|
+tx_event_state_t event_state_list_tx[EVENT_NB] = {
|
|
+ {DL_HDMITX_HDCP_ACTIVE, DL_HDMITX_EVENT_DISABLED},
|
|
+ {DL_HDMITX_HDCP_INACTIVE, DL_HDMITX_EVENT_DISABLED},
|
|
+ {DL_HDMITX_HPD_ACTIVE, DL_HDMITX_EVENT_DISABLED},
|
|
+ {DL_HDMITX_HPD_INACTIVE, DL_HDMITX_EVENT_DISABLED},
|
|
+ {DL_HDMITX_RX_KEYS_RECEIVED, DL_HDMITX_EVENT_DISABLED},
|
|
+ {DL_HDMITX_RX_DEVICE_ACTIVE, DL_HDMITX_EVENT_DISABLED},
|
|
+ {DL_HDMITX_RX_DEVICE_INACTIVE, DL_HDMITX_EVENT_DISABLED},
|
|
+ {DL_HDMITX_EDID_RECEIVED, DL_HDMITX_EVENT_DISABLED},
|
|
+ {DL_HDMITX_VS_RPT_RECEIVED, DL_HDMITX_EVENT_DISABLED}
|
|
+};
|
|
+
|
|
+/* Color bars state (see instanceStatusInfoTx) */
|
|
+tx_col_bar_state_t color_bar_state_tx = {
|
|
+ false,
|
|
+ true,
|
|
+ true,
|
|
+ false,
|
|
+ false,
|
|
+ true,
|
|
+ false
|
|
+};
|
|
+
|
|
+/* Instance status (save the actual configuration) */
|
|
+instance_status_t instance_status_info_tx[MAX_UNITS] = {
|
|
+ {
|
|
+ (ptx_video_info_t) &video_info_list_tx,
|
|
+ (ptx_audio_info_t) &audio_info_list_tx,
|
|
+ (ptx_event_state_t) event_state_list_tx,
|
|
+ (ptx_col_bar_state_t) &color_bar_state_tx,
|
|
+ 0
|
|
+ }
|
|
+ /* &videoInfoListTx, */
|
|
+ /* &audioInfoListTx, */
|
|
+ /* eventStateListTx, */
|
|
+ /* &colorBarStateTx, */
|
|
+ /* 0 */
|
|
+};
|
|
+
|
|
+/* HDCP seed table, arranged as pairs of 16-bit integers: lookup value, seed value.
|
|
+ * If no table is programmed and if KEY_SEED in config file is null, HDCP will be disabled */
|
|
+#define SEED_TABLE_LEN 10
|
|
+static const u16 k_seed_table[SEED_TABLE_LEN][2] = {
|
|
+ {0, 0},
|
|
+ {0, 0},
|
|
+ {0, 0},
|
|
+ {0, 0},
|
|
+ {0, 0},
|
|
+ {0, 0},
|
|
+ {0, 0},
|
|
+ {0, 0},
|
|
+ {0, 0},
|
|
+ {0, 0}
|
|
+};
|
|
+
|
|
+/* EDID status */
|
|
+u8 edid_data_status = HDMITX_EDID_NOT_READ;
|
|
+
|
|
+/* Flag set in case HDP ACTIVE is detected during initialization */
|
|
+bool event_hpdactive_flag = false;
|
|
+bool event_call_hpdactive_cback = false;
|
|
+bool event_call_rxsens_active_cback = false;
|
|
+
|
|
+/* To remove the warnings */
|
|
+u8 g_no_warning;
|
|
+
|
|
+/* For debug purpose only, used to manage underlying I2C accessed */
|
|
+static bool g_i2cdebug_accesses_enabled = true;
|
|
+
|
|
+static u8 g_ksv_secure_timer_counter = 0;
|
|
+
|
|
+/*============================================================================*/
|
|
+/* FUNCTIONS */
|
|
+/*============================================================================*/
|
|
+
|
|
+/******************************************************************************
|
|
+ * \brief Get the software version of the driver.
|
|
+ *
|
|
+ * \param pSWVersion Pointer to the version structure.
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMITX_INCONSISTENT_PARAMS: an input parameter is
|
|
+ * inconsistent
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+error_code_t tx_get_swversion
|
|
+(
|
|
+ swversion_t *p_swversion
|
|
+)
|
|
+{
|
|
+ /* Check if SWVersion pointer is NULL */
|
|
+ RETIF(p_swversion == NULL, ERR_DLHDMITX_INCONSISTENT_PARAMS)
|
|
+
|
|
+ /* Copy SW version */
|
|
+ p_swversion->compatibility_nr = VERSION_COMPATIBILITY;
|
|
+ p_swversion->major_version_nr = VERSION_MAJOR;
|
|
+ p_swversion->minor_version_nr = VERSION_MINOR;
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+/******************************************************************************
|
|
+ * \brief Get the number of available HDMI transmitters devices in the system.
|
|
+ * A unit directly represents a physical device.
|
|
+ *
|
|
+ * \param pUnitCount Pointer to the number of available units.
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMITX_INCONSISTENT_PARAMS: an input parameter is
|
|
+ * inconsistent
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+error_code_t tx_get_number_of_units
|
|
+(
|
|
+ u32 *p_unit_count
|
|
+)
|
|
+{
|
|
+ /* Check if UnitCount pointer is NULL */
|
|
+ RETIF(p_unit_count == NULL, ERR_DLHDMITX_INCONSISTENT_PARAMS)
|
|
+
|
|
+ /* Copy the maximum number of units */
|
|
+ *p_unit_count = MAX_UNITS;
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+/******************************************************************************
|
|
+ * \brief Get the capabilities of unit 0. Capabilities are stored into a
|
|
+ * dedicated structure and are directly read from the HW device.
|
|
+ *
|
|
+ * \param pCapabilities Pointer to the capabilities structure.
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMITX_BAD_UNIT_NUMBER: the unit number is wrong or
|
|
+ * the receiver instance is not initialised
|
|
+ * - ERR_DLHDMITX_INCONSISTENT_PARAMS: an input parameter is
|
|
+ * inconsistent
|
|
+ * - ERR_DLHDMITX_BAD_PARAMETER: a parameter is invalid or out
|
|
+ * of range
|
|
+ * - ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number
|
|
+ * - ERR_HDMI_BAD_PARAMETER: a parameter was out of range
|
|
+ * - ERR_HDMI_NOT_INITIALIZED: transmitter not initialized
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+error_code_t tx_get_capabilities
|
|
+(
|
|
+ tx_capabilities_t *p_capabilities
|
|
+)
|
|
+{
|
|
+ /* Directly call GetCapabilitiesM function for unit 0 and return the result */
|
|
+ return(tx_get_capabilities_m((unit_select_t)0, p_capabilities));
|
|
+}
|
|
+
|
|
+/******************************************************************************
|
|
+ * \brief Get the capabilities of a specific unit. Capabilities are stored
|
|
+ * into a dedicated structure and are directly read from the HW
|
|
+ * device.
|
|
+ *
|
|
+ * \param unit Unit to be probed.
|
|
+ * \param pCapabilities Pointer to the capabilities structure.
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMITX_BAD_UNIT_NUMBER: the unit number is wrong or
|
|
+ * the receiver instance is not initialised
|
|
+ * - ERR_DLHDMITX_INCONSISTENT_PARAMS: an input parameter is
|
|
+ * inconsistent
|
|
+ * - ERR_DLHDMITX_BAD_PARAMETER: a parameter is invalid or out
|
|
+ * of range
|
|
+ * - ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number
|
|
+ * - ERR_HDMI_BAD_PARAMETER: a parameter was out of range
|
|
+ * - ERR_HDMI_NOT_INITIALIZED: transmitter not initialized
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+error_code_t tx_get_capabilities_m
|
|
+(
|
|
+ unit_select_t unit,
|
|
+ tx_capabilities_t *p_capabilities
|
|
+)
|
|
+{
|
|
+ error_code_t err = 0;
|
|
+ bsl_hw_feature_t bsl_device_capabilities;
|
|
+
|
|
+ /* Check if unit number is in range */
|
|
+ RETIF((unit < 0) || (unit >= MAX_UNITS), ERR_DLHDMITX_BAD_UNIT_NUMBER)
|
|
+
|
|
+ /* Check if Capalities pointer is NULL */
|
|
+ RETIF(p_capabilities == NULL, ERR_DLHDMITX_INCONSISTENT_PARAMS)
|
|
+
|
|
+ /* Device version */
|
|
+ p_capabilities->device_version = unit_table_tx[unit].device_version ;
|
|
+
|
|
+ /* Retrieve the capabilities from the BSL layer */
|
|
+ RETIF((err = bsl_hw_get_capabilities(unit, &bsl_device_capabilities)) != 0, err)
|
|
+
|
|
+ switch(bsl_device_capabilities) {
|
|
+ case bsl_hw_none: /* None feature */
|
|
+ p_capabilities->hdcp = false;
|
|
+ p_capabilities->scaler = false;
|
|
+ p_capabilities->audio_packet.HBR = false;
|
|
+ p_capabilities->audio_packet.one_bit_audio = true;
|
|
+ p_capabilities->audio_packet.DST = false;
|
|
+ p_capabilities->hdmi_version = dl_hdmitx_hdmi_version_1_2a;
|
|
+ p_capabilities->color_depth = DL_HDMITX_COLORDEPTH_24;
|
|
+ break;
|
|
+
|
|
+ case bsl_hw_hdcp: /* HDCP feature */
|
|
+ p_capabilities->hdcp = true;
|
|
+ p_capabilities->scaler = false;
|
|
+ p_capabilities->audio_packet.HBR = false;
|
|
+ p_capabilities->audio_packet.one_bit_audio = true;
|
|
+ p_capabilities->audio_packet.DST = false;
|
|
+ p_capabilities->hdmi_version = dl_hdmitx_hdmi_version_1_2a;
|
|
+ p_capabilities->color_depth = DL_HDMITX_COLORDEPTH_24;
|
|
+ break;
|
|
+
|
|
+ case bsl_hw_scaler: /* Scaler feature */
|
|
+ p_capabilities->hdcp = false;
|
|
+ p_capabilities->scaler = true;
|
|
+ p_capabilities->audio_packet.HBR = false;
|
|
+ p_capabilities->audio_packet.one_bit_audio = true;
|
|
+ p_capabilities->audio_packet.DST = false;
|
|
+ p_capabilities->hdmi_version = dl_hdmitx_hdmi_version_1_2a;
|
|
+ p_capabilities->color_depth = DL_HDMITX_COLORDEPTH_24;
|
|
+ break;
|
|
+
|
|
+ case bsl_hw_hdcpscaler: /* HDCP & Scaler feature */
|
|
+ p_capabilities->hdcp = true;
|
|
+ p_capabilities->scaler = true;
|
|
+ p_capabilities->audio_packet.HBR = false;
|
|
+ p_capabilities->audio_packet.one_bit_audio = true;
|
|
+ p_capabilities->audio_packet.DST = false;
|
|
+ p_capabilities->hdmi_version = dl_hdmitx_hdmi_version_1_2a;
|
|
+ p_capabilities->color_depth = DL_HDMITX_COLORDEPTH_24;
|
|
+ break;
|
|
+ }
|
|
+
|
|
+ return err;
|
|
+}
|
|
+
|
|
+/******************************************************************************
|
|
+ * \brief Open unit 0 of HdmiTx driver and provides the instance number to
|
|
+ * the caller. Note that one unit of HdmiTx represents one physical
|
|
+ * HDMI transmitter and that only one instance per unit can be opened.
|
|
+ *
|
|
+ * \param pInstance Pointer to the variable that will receive the instance
|
|
+ * identifier.
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMITX_BAD_UNIT_NUMBER: the unit number is wrong or
|
|
+ * the transmitter instance is not initialised
|
|
+ * - ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong
|
|
+ * - ERR_DLHDMITX_INCONSISTENT_PARAMS: an input parameter is
|
|
+ * inconsistent
|
|
+ * - ERR_DLHDMITX_RESOURCE_OWNED: the resource is already in use
|
|
+ * - ERR_DLHDMITX_INVALID_STATE: the state is invalid for
|
|
+ * the function
|
|
+ * - ERR_DLHDMITX_INIT_FAILED: the unit instance is already
|
|
+ * initialised or something wrong happened at lower level.
|
|
+ * - ERR_DLHDMITX_NO_RESOURCES: the resource is not available
|
|
+ * - ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number
|
|
+ * - ERR_HDMI_NOT_INITIALIZED: the unit is not initialized
|
|
+ * - ERR_HDMI_BAD_PARAMETER: a parameter is invalid or out
|
|
+ * of range
|
|
+ * - ERR_HDMI_INIT_FAILED: the unit instance is already
|
|
+ * initialised
|
|
+ * - ERR_HDMI_COMPATIBILITY: the driver is not compatiable
|
|
+ * with the internal device version code
|
|
+ * - ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus
|
|
+ * - ERR_HDMI_I2C_READ: failed when reading the I2C bus
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+error_code_t tx_open
|
|
+(
|
|
+ instance_t *p_instance
|
|
+)
|
|
+{
|
|
+ /* Directly call OpenM function for unit 0 and return the result */
|
|
+ return(tx_open_m(p_instance, (unit_select_t)0));
|
|
+}
|
|
+
|
|
+/******************************************************************************
|
|
+ * \brief Open a specific unit of HdmiTx driver and provides the instance
|
|
+ * number to the caller. Note that one unit of HdmiTx represents one
|
|
+ * physical HDMI transmitter and that only one instance per unit can be
|
|
+ * opened. This function switches driver's state machine to
|
|
+ * "initialized" state.
|
|
+ *
|
|
+ * \param pInstance Pointer to the structure that will receive the instance
|
|
+ * identifier.
|
|
+ * \param unit Unit number to be opened.
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMITX_BAD_UNIT_NUMBER: the unit number is wrong or
|
|
+ * the transmitter instance is not initialised
|
|
+ * - ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong
|
|
+ * - ERR_DLHDMITX_INCONSISTENT_PARAMS: an input parameter is
|
|
+ * inconsistent
|
|
+ * - ERR_DLHDMITX_RESOURCE_OWNED: the resource is already in use
|
|
+ * - ERR_DLHDMITX_INVALID_STATE: the state is invalid for
|
|
+ * the function
|
|
+ * - ERR_DLHDMITX_INIT_FAILED: the unit instance is already
|
|
+ * initialised or something wrong happened at lower level.
|
|
+ * - ERR_DLHDMITX_NO_RESOURCES: the resource is not available
|
|
+ * - ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number
|
|
+ * - ERR_HDMI_NOT_INITIALIZED: the unit is not initialized
|
|
+ * - ERR_HDMI_BAD_PARAMETER: a parameter is invalid or out
|
|
+ * of range
|
|
+ * - ERR_HDMI_INIT_FAILED: the unit instance is already
|
|
+ * initialised
|
|
+ * - ERR_HDMI_COMPATIBILITY: the driver is not compatiable
|
|
+ * with the internal device version code
|
|
+ * - ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus
|
|
+ * - ERR_HDMI_I2C_READ: failed when reading the I2C bus
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+error_code_t tx_open_m
|
|
+(
|
|
+ instance_t *p_instance,
|
|
+ unit_select_t unit
|
|
+)
|
|
+{
|
|
+ error_code_t err;
|
|
+ u16 i;
|
|
+ u8 device_version;
|
|
+ bsl_hw_feature_t feature_supported;
|
|
+
|
|
+ /* Check if unit number is in range */
|
|
+ RETIF((unit < 0) || (unit >= MAX_UNITS), ERR_DLHDMITX_BAD_UNIT_NUMBER)
|
|
+
|
|
+ /* Check if Instance pointer is NULL */
|
|
+ RETIF(p_instance == NULL, ERR_DLHDMITX_INCONSISTENT_PARAMS)
|
|
+
|
|
+ /* Create the semaphore to protect variables modified under interruption */
|
|
+ RETIF((err = tx_iwsemaphore_create(&dl_hdmi_tx_it_semaphore[unit])) != 0, err)
|
|
+
|
|
+ /* Take the sempahore */
|
|
+ RETIF((err = tx_iwsemaphore_p(dl_hdmi_tx_it_semaphore[unit])) != 0, err)
|
|
+
|
|
+ /* Check if unit is already instanciated */
|
|
+ RETIF_SEM(dl_hdmi_tx_it_semaphore[unit],
|
|
+ unit_table_tx[unit].opened == true, ERR_DLHDMITX_RESOURCE_OWNED)
|
|
+
|
|
+ /* Check the state */
|
|
+ RETIF_SEM(dl_hdmi_tx_it_semaphore[unit],
|
|
+ dl_hdmi_tx_get_state(unit) != STATE_NOT_INITIALIZED, ERR_DLHDMITX_INVALID_STATE)
|
|
+
|
|
+ /* Instanciate unit and return corresponding instance number */
|
|
+ /* Since HW unit are only instanciable once, instance = unit */
|
|
+ unit_table_tx[unit].opened = true;
|
|
+ unit_table_tx[unit].hdcp_enable = false;
|
|
+ unit_table_tx[unit].repeater_enable = false;
|
|
+ unit_table_tx[unit].device_version = DL_HDMITX_DEVICE_UNKNOWN;
|
|
+ unit_table_tx[unit].simplay_hd = false;
|
|
+ unit_table_tx[unit].p_callback = NULL;
|
|
+ unit_table_tx[unit].revocation_list.p_list = NULL;
|
|
+
|
|
+ unit_table_tx[unit].revocation_list.length = 0;
|
|
+
|
|
+ /* Recover the configuration of the device library */
|
|
+ RETIF_SEM(dl_hdmi_tx_it_semaphore[unit],
|
|
+ tx_cfg_get_config(unit, >x_driver_config_table[unit]) != 0, ERR_DLHDMITX_INIT_FAILED)
|
|
+
|
|
+#ifndef TMFL_NO_RTOS
|
|
+ /* Create message queue associated to this instance/unit */
|
|
+ RETIF_SEM(dl_hdmi_tx_it_semaphore[unit],
|
|
+ tx_iwqueue_create(gtx_driver_config_table[unit].command_task_queue_size,
|
|
+ &(unit_table_tx[unit].queue_handle)) != 0, ERR_DLHDMITX_NO_RESOURCES)
|
|
+
|
|
+ /* Create the command task associated to this instance/unit */
|
|
+ RETIF_SEM(dl_hdmi_tx_it_semaphore[unit],
|
|
+ tx_iwtask_create(command_task_table_tx[unit],
|
|
+ gtx_driver_config_table[unit].command_task_priority,
|
|
+ gtx_driver_config_table[unit].command_task_stack_size,
|
|
+ &(unit_table_tx[unit].command_task_handle)) != 0, ERR_DLHDMITX_NO_RESOURCES)
|
|
+
|
|
+ RETIF_SEM(dl_hdmi_tx_it_semaphore[unit],
|
|
+ tx_iwtask_start(unit_table_tx[unit].command_task_handle) != 0, ERR_DLHDMITX_NO_RESOURCES)
|
|
+
|
|
+ /* Create the hdcp check task associated to this instance/unit */
|
|
+ RETIF_SEM(dl_hdmi_tx_it_semaphore[unit],
|
|
+ tx_iwtask_create(hdcp_task_table_tx[unit],
|
|
+ gtx_driver_config_table[unit].hdcp_task_priority,
|
|
+ gtx_driver_config_table[unit].hdcp_task_stack_size,
|
|
+ &(unit_table_tx[unit].hdcp_task_handle)) != 0, ERR_DLHDMITX_NO_RESOURCES)
|
|
+
|
|
+#endif /* TMFL_NO_RTOS */
|
|
+
|
|
+ *p_instance = (instance_t)unit;
|
|
+
|
|
+ /* Init the BSL */
|
|
+ /* Make sure all events are disabled */
|
|
+ instance_status_info_tx[unit].p_event_state[DL_HDMITX_HDCP_ACTIVE].status = DL_HDMITX_EVENT_DISABLED;
|
|
+ instance_status_info_tx[unit].p_event_state[DL_HDMITX_HDCP_INACTIVE].status = DL_HDMITX_EVENT_DISABLED;
|
|
+ instance_status_info_tx[unit].p_event_state[DL_HDMITX_HPD_ACTIVE].status = DL_HDMITX_EVENT_DISABLED;
|
|
+ instance_status_info_tx[unit].p_event_state[DL_HDMITX_HPD_INACTIVE].status = DL_HDMITX_EVENT_DISABLED;
|
|
+ instance_status_info_tx[unit].p_event_state[DL_HDMITX_RX_KEYS_RECEIVED].status = DL_HDMITX_EVENT_DISABLED;
|
|
+ instance_status_info_tx[unit].p_event_state[DL_HDMITX_RX_DEVICE_ACTIVE].status = DL_HDMITX_EVENT_DISABLED;
|
|
+ instance_status_info_tx[unit].p_event_state[DL_HDMITX_RX_DEVICE_INACTIVE].status = DL_HDMITX_EVENT_DISABLED;
|
|
+ instance_status_info_tx[unit].p_event_state[DL_HDMITX_EDID_RECEIVED].status = DL_HDMITX_EVENT_DISABLED;
|
|
+ instance_status_info_tx[unit].p_event_state[DL_HDMITX_VS_RPT_RECEIVED].status = DL_HDMITX_EVENT_DISABLED;
|
|
+
|
|
+ instance_status_info_tx[unit].p_col_bar_state->disable_color_bar_on_r0 = false;
|
|
+ instance_status_info_tx[unit].p_col_bar_state->hdcp_colbar_change = false;
|
|
+ instance_status_info_tx[unit].p_col_bar_state->hdcp_encrypt_or_t0 = true;
|
|
+ instance_status_info_tx[unit].p_col_bar_state->hdcp_secure_or_t0 = false;
|
|
+ instance_status_info_tx[unit].p_col_bar_state->in_out_first_set_done = false;
|
|
+ instance_status_info_tx[unit].p_col_bar_state->color_bar_on = true;
|
|
+ instance_status_info_tx[unit].p_col_bar_state->change_color_bar_now = true;
|
|
+
|
|
+ /* use buffer 0 by default */
|
|
+ instance_status_info_tx[unit].gamut_buf_num = 0;
|
|
+
|
|
+ /* The funcCallback is not the same between BSL, so fill it dynamically */
|
|
+ for(i = 0; i < HDMITX_CALLBACK_INT_NUM; i++) {
|
|
+ callback_func_table_tx.func_callback[i] = NULL;
|
|
+ }
|
|
+ callback_func_table_tx.func_callback[HDMITX_CALLBACK_INT_ENCRYPT] = dl_hdmi_tx_handle_encrypt;
|
|
+ callback_func_table_tx.func_callback[HDMITX_CALLBACK_INT_HPD] = dl_hdmi_tx_handle_hpd;
|
|
+ callback_func_table_tx.func_callback[HDMITX_CALLBACK_INT_T0] = dl_hdmi_tx_handle_t0;
|
|
+ callback_func_table_tx.func_callback[HDMITX_CALLBACK_INT_BCAPS] = dl_hdmi_tx_handle_bcaps;
|
|
+ callback_func_table_tx.func_callback[HDMITX_CALLBACK_INT_BSTATUS] = dl_hdmi_tx_handle_bstatus;
|
|
+ callback_func_table_tx.func_callback[HDMITX_CALLBACK_INT_SHA_1] = dl_hdmi_tx_handle_sha_1;
|
|
+ callback_func_table_tx.func_callback[HDMITX_CALLBACK_INT_PJ] = dl_hdmi_tx_handle_pj;
|
|
+
|
|
+#ifdef TMFL_TDA9981_SUPPORT
|
|
+ callback_func_table_tx.func_callback[HDMITX_CALLBACK_INT_R0] = dl_hdmi_tx_handle_r0;
|
|
+ callback_func_table_tx.func_callback[HDMITX_CALLBACK_INT_SW_INT] = dl_hdmi_tx_handle_sw_int;
|
|
+#endif
|
|
+
|
|
+#ifdef TMFL_RX_SENSE_ON
|
|
+ callback_func_table_tx.func_callback[HDMITX_CALLBACK_INT_RX_SENSE] = dl_hdmi_tx_handle_rx_sense;
|
|
+#endif
|
|
+
|
|
+ /* Prepare static TDA9984 driver data as the compiler doesn't seem to */
|
|
+ bsl_hw_startup();
|
|
+
|
|
+ err = bsl_init(*p_instance,
|
|
+ gtx_driver_config_table[unit].i2c_address,
|
|
+ gtx_driver_config_table[unit].i2c_write_function,
|
|
+ gtx_driver_config_table[unit].i2c_read_function,
|
|
+ /* required for TDA9983 */
|
|
+ (pbsl_sys_func_edid_t)gtx_driver_config_table[unit].edid_read_function,
|
|
+ (pbsl_sys_func_timer_t)tx_iwwait,
|
|
+ &callback_func_table_tx,
|
|
+ false, /* Alternate EDID address not used */
|
|
+ (bsl_vid_fmt_t)instance_status_info_tx[unit].p_video_info->video_in_config.format,
|
|
+ (bsl_pix_rate_t)instance_status_info_tx[unit].p_video_info->video_in_config.pixel_rate);
|
|
+
|
|
+ if(err != 0) {
|
|
+ /* Init failed */
|
|
+ bsl_deinit(unit);
|
|
+
|
|
+ /* Release the sempahore */
|
|
+ RETIF((err = tx_iwsemaphore_v(dl_hdmi_tx_it_semaphore[unit])) != 0, err)
|
|
+
|
|
+ return err;
|
|
+ } else {
|
|
+ /* Init passed, continue */
|
|
+ /* Start by forcing the TMDS ouputs off */
|
|
+ err = bsl_tmds_set_outputs(unit,
|
|
+ HDMITX_TMDSOUT_FORCED0);
|
|
+ RETIF_SEM(dl_hdmi_tx_it_semaphore[unit], (err != 0) && (err != ERR_HDMI_NOT_SUPPORTED), err)
|
|
+
|
|
+ RETIF_SEM(dl_hdmi_tx_it_semaphore[unit],
|
|
+ (err = bsl_hw_get_capabilities(unit, &feature_supported)) != 0, err)
|
|
+
|
|
+ /* Retrieve the hardware device version from the BSL layer */
|
|
+ RETIF_SEM(dl_hdmi_tx_it_semaphore[unit],
|
|
+ (err = bsl_hw_get_version(unit,
|
|
+ &device_version)) != 0, err)
|
|
+
|
|
+ /* Store the hardware device version in the global variable */
|
|
+
|
|
+ switch(device_version) {
|
|
+ case BSLHDMITX_TDA9981:
|
|
+ unit_table_tx[unit].device_version = DL_HDMITX_DEVICE_TDA9981;
|
|
+ break;
|
|
+
|
|
+ case BSLHDMITX_TDA9983:
|
|
+ unit_table_tx[unit].device_version = DL_HDMITX_DEVICE_TDA9983;
|
|
+ break;
|
|
+
|
|
+ default:
|
|
+ unit_table_tx[unit].device_version = DL_HDMITX_DEVICE_UNKNOWN;
|
|
+ break;
|
|
+ }
|
|
+
|
|
+ }
|
|
+
|
|
+#ifndef TMFL_NO_RTOS
|
|
+ /* Start HDCP check task */
|
|
+ RETIF_SEM(dl_hdmi_tx_it_semaphore[unit],
|
|
+ tx_iwtask_start(unit_table_tx[unit].hdcp_task_handle) != 0, ERR_DLHDMITX_NO_RESOURCES)
|
|
+
|
|
+#endif /* TMFL_NO_RTOS */
|
|
+
|
|
+ /* Set the state machine to initialized */
|
|
+ dl_hdmi_tx_set_state(unit, STATE_INITIALIZED);
|
|
+
|
|
+ /* Release the sempahore */
|
|
+ RETIF((err = tx_iwsemaphore_v(dl_hdmi_tx_it_semaphore[unit])) != 0, err)
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+/******************************************************************************
|
|
+ * \brief Close an instance of HdmiTx driver.
|
|
+ *
|
|
+ * \param instance Instance identifier.
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMITX_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ * - ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+error_code_t tx_close
|
|
+(
|
|
+ instance_t instance
|
|
+)
|
|
+{
|
|
+ error_code_t err = 0;
|
|
+
|
|
+ /* Check if instance number is in range */
|
|
+ RETIF((instance < 0) || (instance >= MAX_UNITS), ERR_DLHDMITX_BAD_INSTANCE)
|
|
+
|
|
+ /* Take the sempahore */
|
|
+ RETIF((err = tx_iwsemaphore_p(dl_hdmi_tx_it_semaphore[instance])) != 0, err)
|
|
+
|
|
+ /* Check if unit corresponding to instance is opened */
|
|
+ RETIF_SEM(dl_hdmi_tx_it_semaphore[instance],
|
|
+ unit_table_tx[instance].opened == false, ERR_DLHDMITX_RESOURCE_NOT_OWNED)
|
|
+
|
|
+ /* Close instance */
|
|
+ unit_table_tx[instance].opened = false;
|
|
+
|
|
+ /* Set the state machine */
|
|
+ dl_hdmi_tx_set_state(instance, STATE_NOT_INITIALIZED);
|
|
+
|
|
+ /* Destroy resources allocated for this instance/unit */
|
|
+
|
|
+#ifndef TMFL_NO_RTOS
|
|
+ tx_iwtask_destroy(unit_table_tx[instance].hdcp_task_handle);
|
|
+ tx_iwtask_destroy(unit_table_tx[instance].command_task_handle);
|
|
+ tx_iwqueue_destroy(unit_table_tx[instance].queue_handle);
|
|
+
|
|
+#endif /* TMFL_NO_RTOS */
|
|
+
|
|
+ /* Reset an instance of an HDMI transmitter */
|
|
+ bsl_deinit(instance);
|
|
+
|
|
+ /* Release the sempahore */
|
|
+ RETIF((err = tx_iwsemaphore_v(dl_hdmi_tx_it_semaphore[instance])) != 0, err)
|
|
+
|
|
+ /* Close the handle to the semaphore */
|
|
+ RETIF((err == tx_iwsemaphore_destroy(dl_hdmi_tx_it_semaphore[instance])) != 0, err)
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+/******************************************************************************
|
|
+ * \brief Set the power state of an instance of the HDMI transmitter.
|
|
+ *
|
|
+ * \param instance Instance identifier.
|
|
+ * \param powerState Power state to set.
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong
|
|
+ * - ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number
|
|
+ * - ERR_HDMI_BAD_PARAMETER: a parameter was out of range
|
|
+ * - ERR_HDMI_NOT_INITIALIZED: transmitter not initialized
|
|
+ * - ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus
|
|
+ * - ERR_HDMI_I2C_READ: failed when reading to the I2C bus
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+error_code_t tx_set_power_state
|
|
+(
|
|
+ instance_t instance,
|
|
+ power_state_t power_state
|
|
+)
|
|
+{
|
|
+ error_code_t err;
|
|
+ bsl_hot_plug_t hpd_status; /* HPD status */
|
|
+
|
|
+ /* Check if instance number is in range */
|
|
+ RETIF((instance < 0) || (instance >= MAX_UNITS), ERR_DLHDMITX_BAD_INSTANCE)
|
|
+
|
|
+ /* Take the sempahore */
|
|
+ RETIF((err = tx_iwsemaphore_p(dl_hdmi_tx_it_semaphore[instance])) != 0, err)
|
|
+
|
|
+ if(unit_table_tx[instance].device_version == DL_HDMITX_DEVICE_TDA9984) {
|
|
+ if(power_state == power_suspend) {
|
|
+ return ERR_DLHDMITX_NOT_SUPPORTED;
|
|
+ }
|
|
+ }
|
|
+
|
|
+ /* Switch off HDCP */
|
|
+ if((power_state == power_off) && (unit_table_tx[instance].hdcp_enable == true)) {
|
|
+ /* Release the sempahore */
|
|
+ RETIF((err = tx_iwsemaphore_v(dl_hdmi_tx_it_semaphore[instance])) != 0, err)
|
|
+ /* Switch off HDCP */
|
|
+ RETIF((err = tx_set_hdcp(instance, false)) != 0, err)
|
|
+ /* Take the sempahore */
|
|
+ RETIF((err = tx_iwsemaphore_p(dl_hdmi_tx_it_semaphore[instance])) != 0, err)
|
|
+ }
|
|
+
|
|
+ /* CBE */
|
|
+ if(power_state == power_off) {
|
|
+ dl_hdmi_tx_set_state(instance, STATE_INITIALIZED);
|
|
+ }
|
|
+
|
|
+ /* Set the power state of the transmitter */
|
|
+ RETIF_SEM(dl_hdmi_tx_it_semaphore[instance],
|
|
+ (err = bsl_power_set_state(instance,
|
|
+ power_state)) != 0, err)
|
|
+
|
|
+ /* Get Hot Plug status */
|
|
+ RETIF_SEM(dl_hdmi_tx_it_semaphore[instance],
|
|
+ (err = bsl_hot_plug_get_status(instance,
|
|
+ &hpd_status)) != 0, err)
|
|
+
|
|
+ if(power_state == power_on) {
|
|
+ if((hpd_status == HDMITX_HOTPLUG_ACTIVE) && (dl_hdmi_tx_get_state(instance) != STATE_EDID_AVAILABLE)) {
|
|
+ /* Yes: Wait for DDC line to settle before reading EDID */
|
|
+ bsl_sys_timer_wait(instance, 500); /* ms */
|
|
+
|
|
+ /* EDID read */
|
|
+
|
|
+ RETIF_SEM(dl_hdmi_tx_it_semaphore[instance],
|
|
+ (err = bsl_edid_get_block_data(instance,
|
|
+ unit_table_tx[instance].p_edid_buffer, (u32)((unit_table_tx[instance].edid_buffer_size) >> 7),
|
|
+ unit_table_tx[instance].edid_buffer_size, &edid_data_status)) != 0, err)
|
|
+
|
|
+ dl_hdmi_tx_handle_edid_read(instance);
|
|
+ }
|
|
+ }
|
|
+
|
|
+ /* Release the sempahore */
|
|
+ RETIF((err = tx_iwsemaphore_v(dl_hdmi_tx_it_semaphore[instance])) != 0, err)
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+/******************************************************************************
|
|
+ * \brief Get the power state of an instance of the HDMI transmitter.
|
|
+ *
|
|
+ * \param instance Instance identifier.
|
|
+ * \param pPowerState Pointer to the power state.
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong
|
|
+ * - ERR_DLHDMITX_INCONSISTENT_PARAMS: an input parameter is
|
|
+ * inconsistent
|
|
+ * - ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number
|
|
+ * - ERR_HDMI_BAD_PARAMETER: a parameter was out of range
|
|
+ * - ERR_HDMI_NOT_INITIALIZED: transmitter not initialized
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+error_code_t tx_get_power_state
|
|
+(
|
|
+ instance_t instance,
|
|
+ power_state_t *p_power_state
|
|
+)
|
|
+{
|
|
+ error_code_t err;
|
|
+
|
|
+ /* Check if instance number is in range */
|
|
+ RETIF((instance < 0) || (instance >= MAX_UNITS), ERR_DLHDMITX_BAD_INSTANCE)
|
|
+
|
|
+ /* Check if PowerState pointer is NULL */
|
|
+ RETIF(p_power_state == NULL, ERR_DLHDMITX_INCONSISTENT_PARAMS)
|
|
+
|
|
+ /* Take the sempahore */
|
|
+ RETIF((err = tx_iwsemaphore_p(dl_hdmi_tx_it_semaphore[instance])) != 0, err)
|
|
+
|
|
+ /* Get the power state of the transmitter */
|
|
+ RETIF_SEM(dl_hdmi_tx_it_semaphore[instance],
|
|
+ (err = bsl_power_get_state(instance,
|
|
+ p_power_state)) != 0, err)
|
|
+
|
|
+ /* Release the sempahore */
|
|
+ RETIF((err = tx_iwsemaphore_v(dl_hdmi_tx_it_semaphore[instance])) != 0, err)
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+/******************************************************************************
|
|
+ * \brief Set the configuration of instance attributes. This function is
|
|
+ * required by DVP architecture rules but actually does nothing in this
|
|
+ * driver.
|
|
+ *
|
|
+ * \param instance Instance identifier.
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+error_code_t tx_instance_config
|
|
+(
|
|
+ instance_t instance
|
|
+)
|
|
+{
|
|
+ /* Check if instance number is in range */
|
|
+ RETIF((instance < 0) || (instance >= MAX_UNITS), ERR_DLHDMITX_BAD_INSTANCE)
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+/******************************************************************************
|
|
+ * \brief Setup the instance with its configuration parameters. This function
|
|
+ * allows basic instance configuration like enabling HDCP, choosing
|
|
+ * HDCP encryption mode or enabling HDCP repeater mode.
|
|
+ *
|
|
+ * \param instance Instance identifier.
|
|
+ * \param pSetupInfo Pointer to the structure containing all setup parameters.
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong
|
|
+ * - ERR_DLHDMITX_INCONSISTENT_PARAMS: an input parameter is
|
|
+ * inconsistent
|
|
+ * - ERR_DLHDMITX_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ * - ERR_DLHDMITX_INVALID_STATE: the state is invalid for
|
|
+ * the function
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+error_code_t tx_instance_setup
|
|
+(
|
|
+ instance_t instance,
|
|
+ tx_instance_setup_info_t *p_setup_info
|
|
+)
|
|
+{
|
|
+ error_code_t err;
|
|
+
|
|
+ RETIF((instance < 0) || (instance >= MAX_UNITS), ERR_DLHDMITX_BAD_INSTANCE)
|
|
+
|
|
+ /* Check if SetupInfo pointer is NULL */
|
|
+ RETIF(p_setup_info == NULL, ERR_DLHDMITX_INCONSISTENT_PARAMS)
|
|
+
|
|
+ /* Take the sempahore */
|
|
+ RETIF((err = tx_iwsemaphore_p(dl_hdmi_tx_it_semaphore[instance])) != 0, err)
|
|
+
|
|
+ /* Check if unit corresponding to instance is opened */
|
|
+ RETIF_SEM(dl_hdmi_tx_it_semaphore[instance],
|
|
+ unit_table_tx[instance].opened == false, ERR_DLHDMITX_RESOURCE_NOT_OWNED)
|
|
+
|
|
+ /* Check the state */
|
|
+ RETIF_SEM(dl_hdmi_tx_it_semaphore[instance],
|
|
+ dl_hdmi_tx_get_state(instance) != STATE_INITIALIZED, ERR_DLHDMITX_INVALID_STATE)
|
|
+
|
|
+ unit_table_tx[instance].repeater_enable = p_setup_info->repeater_enable;
|
|
+ unit_table_tx[instance].simplay_hd = p_setup_info->simplay_hd;
|
|
+ unit_table_tx[instance].p_edid_buffer = p_setup_info->p_edid_buffer;
|
|
+ unit_table_tx[instance].edid_buffer_size = p_setup_info->edid_buffer_size;
|
|
+
|
|
+ /* Set state machine to Unplugged */
|
|
+ dl_hdmi_tx_set_state(instance, STATE_UNPLUGGED);
|
|
+
|
|
+ if(event_hpdactive_flag == true) {
|
|
+ /* if the HPD active was rased during the initialisation, raise the event HPD */
|
|
+ dl_hdmi_tx_handle_hpd(instance);
|
|
+ event_hpdactive_flag = false;
|
|
+ }
|
|
+
|
|
+ /* Release the sempahore */
|
|
+ RETIF((err = tx_iwsemaphore_v(dl_hdmi_tx_it_semaphore[instance])) != 0, err)
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+/******************************************************************************
|
|
+ * \brief Get instance setup parameters.
|
|
+ *
|
|
+ * \param instance Instance identifier.
|
|
+ * \param pSetupInfo Pointer to the structure that will receive setup
|
|
+ * parameters.
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong
|
|
+ * - ERR_DLHDMITX_INCONSISTENT_PARAMS: an input parameter is
|
|
+ * inconsistent
|
|
+ * - ERR_DLHDMITX_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+error_code_t tx_get_instance_setup
|
|
+(
|
|
+ instance_t instance,
|
|
+ tx_instance_setup_info_t *p_setup_info
|
|
+)
|
|
+{
|
|
+ error_code_t err;
|
|
+
|
|
+ /* Check if instance number is in range */
|
|
+ RETIF((instance < 0) || (instance >= MAX_UNITS), ERR_DLHDMITX_BAD_INSTANCE)
|
|
+
|
|
+ /* Check if SetupInfo pointer is NULL */
|
|
+ RETIF(p_setup_info == NULL, ERR_DLHDMITX_INCONSISTENT_PARAMS)
|
|
+
|
|
+ /* Take the sempahore */
|
|
+ RETIF((err = tx_iwsemaphore_p(dl_hdmi_tx_it_semaphore[instance])) != 0, err)
|
|
+
|
|
+ /* Check if unit corresponding to instance is opened */
|
|
+ RETIF_SEM(dl_hdmi_tx_it_semaphore[instance],
|
|
+ unit_table_tx[instance].opened == false, ERR_DLHDMITX_RESOURCE_NOT_OWNED)
|
|
+
|
|
+ p_setup_info->simplay_hd = unit_table_tx[instance].simplay_hd;
|
|
+ p_setup_info->repeater_enable = unit_table_tx[instance].repeater_enable;
|
|
+ /* JL, TODO */
|
|
+
|
|
+ /* Release the sempahore */
|
|
+ RETIF((err = tx_iwsemaphore_v(dl_hdmi_tx_it_semaphore[instance])) != 0, err)
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+/******************************************************************************
|
|
+ * \brief Make device library handle an incoming interrupt. This function is
|
|
+ * used by application to tell the device library that the hardware
|
|
+ * sent an interrupt.
|
|
+ *
|
|
+ * \param instance Instance identifier.
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong
|
|
+ * - ERR_DLHDMITX_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ * - ERR_DLHDMITX_FULL: the queue is full
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+error_code_t tx_handle_interrupt
|
|
+(
|
|
+ instance_t instance
|
|
+)
|
|
+{
|
|
+#ifndef TMFL_NO_RTOS
|
|
+ error_code_t err;
|
|
+ u8 message = 0;
|
|
+#endif /* TMFL_NO_RTOS */
|
|
+
|
|
+ error_code_t err = 0;
|
|
+
|
|
+ (void)err;
|
|
+ /* Check if instance number is in range */
|
|
+ RETIF((instance < 0) || (instance >= MAX_UNITS), ERR_DLHDMITX_BAD_INSTANCE)
|
|
+
|
|
+#ifndef TMFL_NO_RTOS
|
|
+ RETIF((err = tx_iwqueue_send(unit_table_tx[instance].queue_handle, message)) != 0, err)
|
|
+
|
|
+ /* Disable interrupts for Tx until the callbacks have been done by the command task */
|
|
+ switch(instance) {
|
|
+ case INSTANCE_0:
|
|
+ tx_iwdisable_interrupts(DL_HDMI_IW_TX_1);
|
|
+ break;
|
|
+ case INSTANCE_1:
|
|
+ tx_iwdisable_interrupts(DL_HDMI_IW_TX_2);
|
|
+ break;
|
|
+ default:
|
|
+ return ERR_DLHDMITX_BAD_INSTANCE;
|
|
+ }
|
|
+
|
|
+#endif /* TMFL_NO_RTOS */
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+/******************************************************************************
|
|
+ * \brief Register event callbacks. Only one callback is registered through
|
|
+ * this API. This callback will received the type of event that
|
|
+ * occured throug a dedicated parameter and will be called as many
|
|
+ * times as there is pending events.
|
|
+ * This function is synchronous.
|
|
+ * This function is ISR friendly.
|
|
+ *
|
|
+ * \param instance Instance identifier.
|
|
+ * \param pCallback Pointer to the callback function that will handle events
|
|
+ * from the devlib.
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong
|
|
+ * - ERR_DLHDMITX_RESOURCE_NOT_OWNED: the caller does not own
|
|
+ * the resource
|
|
+ * - ERR_DLHDMITX_INVALID_STATE: the state is invalid for
|
|
+ * the function
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+error_code_t tx_register_callbacks
|
|
+(
|
|
+ instance_t instance,
|
|
+ ptx_callback_t p_callback
|
|
+)
|
|
+{
|
|
+ error_code_t err;
|
|
+
|
|
+ /* Check if instance number is in range */
|
|
+ RETIF((instance < 0) || (instance >= MAX_UNITS), ERR_DLHDMITX_BAD_INSTANCE)
|
|
+
|
|
+ /* Take the sempahore */
|
|
+ RETIF((err = tx_iwsemaphore_p(dl_hdmi_tx_it_semaphore[instance])) != 0, err)
|
|
+
|
|
+ /* Check if unit corresponding to instance is opened */
|
|
+ RETIF_SEM(dl_hdmi_tx_it_semaphore[instance],
|
|
+ unit_table_tx[instance].opened == false, ERR_DLHDMITX_RESOURCE_NOT_OWNED)
|
|
+
|
|
+ /* Check if instance state is correct */
|
|
+ RETIF_SEM(dl_hdmi_tx_it_semaphore[instance],
|
|
+ dl_hdmi_tx_get_state(instance) != STATE_INITIALIZED, ERR_DLHDMITX_INVALID_STATE)
|
|
+
|
|
+ /* Store callback pointers */
|
|
+ unit_table_tx[instance].p_callback = p_callback;
|
|
+
|
|
+ /* Release the sempahore */
|
|
+ RETIF((err = tx_iwsemaphore_v(dl_hdmi_tx_it_semaphore[instance])) != 0, err)
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+/******************************************************************************
|
|
+ * \brief This function allows enabling a specific event. By default, all
|
|
+ * events are disabled, except input lock.
|
|
+ *
|
|
+ * \param instance Instance identifier.
|
|
+ * \param event Event to enable.
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+error_code_t tx_enable_event
|
|
+(
|
|
+ instance_t instance,
|
|
+ tx_event_t event
|
|
+)
|
|
+{
|
|
+ error_code_t err;
|
|
+
|
|
+ /* Check if instance number is in range */
|
|
+ RETIF((instance < 0) || (instance >= MAX_UNITS), ERR_DLHDMITX_BAD_INSTANCE)
|
|
+
|
|
+ /* Check if the event exists */
|
|
+ RETIF_BADPARAM(event >= EVENT_NB)
|
|
+
|
|
+ /* Take the sempahore */
|
|
+ RETIF((err = tx_iwsemaphore_p(dl_hdmi_tx_it_semaphore[instance])) != 0, err)
|
|
+
|
|
+ /* Protect the access to this ressource */
|
|
+ instance_status_info_tx[instance].p_event_state[event].status = DL_HDMITX_EVENT_ENABLED;
|
|
+
|
|
+ /* Release the sempahore */
|
|
+ RETIF((err = tx_iwsemaphore_v(dl_hdmi_tx_it_semaphore[instance])) != 0, err)
|
|
+
|
|
+ switch(event) {
|
|
+ case DL_HDMITX_HPD_ACTIVE:
|
|
+ if(event_call_hpdactive_cback) {
|
|
+ event_call_hpdactive_cback = false;
|
|
+ unit_table_tx[instance].p_callback(DL_HDMITX_HPD_ACTIVE);
|
|
+ }
|
|
+ break;
|
|
+
|
|
+ case DL_HDMITX_RX_DEVICE_ACTIVE:
|
|
+ if(event_call_rxsens_active_cback) {
|
|
+ event_call_rxsens_active_cback = false;
|
|
+ unit_table_tx[instance].p_callback(DL_HDMITX_RX_DEVICE_ACTIVE);
|
|
+ }
|
|
+ break;
|
|
+
|
|
+ default:
|
|
+ break;
|
|
+
|
|
+ }
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+/******************************************************************************
|
|
+ * \brief This function allows disabling a specific event. By default, all
|
|
+ * events are disabled, except input lock.
|
|
+ *
|
|
+ * \param instance Instance identifier.
|
|
+ * \param event Event to disable.
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+error_code_t tx_disable_event
|
|
+(
|
|
+ instance_t instance,
|
|
+ tx_event_t event
|
|
+)
|
|
+{
|
|
+ error_code_t err;
|
|
+
|
|
+ /* Check if instance number is in range */
|
|
+ RETIF((instance < 0) || (instance >= MAX_UNITS), ERR_DLHDMITX_BAD_INSTANCE)
|
|
+
|
|
+ /* Check if the event exists */
|
|
+ RETIF_BADPARAM(event >= EVENT_NB)
|
|
+
|
|
+ /* Take the sempahore */
|
|
+ RETIF((err = tx_iwsemaphore_p(dl_hdmi_tx_it_semaphore[instance])) != 0, err)
|
|
+
|
|
+ /* Protect the access to this ressource */
|
|
+ instance_status_info_tx[instance].p_event_state[event].status = DL_HDMITX_EVENT_DISABLED;
|
|
+
|
|
+ /* Release the sempahore */
|
|
+ RETIF((err = tx_iwsemaphore_v(dl_hdmi_tx_it_semaphore[instance])) != 0, err)
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+/******************************************************************************
|
|
+ * \brief Get specifications of a given video format. Application can use
|
|
+ * this function to retreives all specifications (frequencies,
|
|
+ * resolution, etc.) of a given IA/CEA 861-D video format.
|
|
+ * This function is synchronous.
|
|
+ * This function is ISR friendly.
|
|
+ *
|
|
+ * \param instance Instance identifier.
|
|
+ * \param resolutionID ID of the resolution to retrieve specs from.
|
|
+ * \param pResolutionSpecs Pointer to the structure receiving specs.
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMITX_INCONSISTENT_PARAMS: an input parameter is
|
|
+ * inconsistent
|
|
+ * - ERR_DLHDMITX_RESOLUTION_UNKNOWN: the resolution is unknown
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+error_code_t tx_get_video_format_specs
|
|
+(
|
|
+ instance_t instance,
|
|
+ tx_vid_fmt_t resolution_id,
|
|
+ tx_vid_fmt_specs_t *p_resolution_specs
|
|
+)
|
|
+{
|
|
+ u8 i;
|
|
+ bool find = false;
|
|
+
|
|
+ /* Check if instance number is in range */
|
|
+ RETIF((instance < 0) || (instance >= MAX_UNITS), ERR_DLHDMITX_BAD_INSTANCE)
|
|
+
|
|
+ /* Check if ResolutionSpecs pointer is NULL */
|
|
+ RETIF(p_resolution_specs == NULL, ERR_DLHDMITX_INCONSISTENT_PARAMS)
|
|
+
|
|
+ for(i = 0; i < gtx_driver_config_table[instance].resolution_nb; i++) {
|
|
+ if(resolution_id == gtx_driver_config_table[instance].p_resolution_info[i].resolution_id) {
|
|
+ find = true;
|
|
+ p_resolution_specs->height = gtx_driver_config_table[instance].p_resolution_info[i].height;
|
|
+ p_resolution_specs->width = gtx_driver_config_table[instance].p_resolution_info[i].width;
|
|
+ p_resolution_specs->interlaced = gtx_driver_config_table[instance].p_resolution_info[i].interlaced;
|
|
+ p_resolution_specs->vfrequency = gtx_driver_config_table[instance].p_resolution_info[i].vfrequency;
|
|
+ p_resolution_specs->aspect_ratio = gtx_driver_config_table[instance].p_resolution_info[i].aspect_ratio;
|
|
+ break;
|
|
+ }
|
|
+ }
|
|
+
|
|
+ /* Resolution not found in table */
|
|
+ RETIF(find == false, ERR_DLHDMITX_RESOLUTION_UNKNOWN)
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+/******************************************************************************
|
|
+ * \brief Configures all input and output parameters : format, modes, rates,
|
|
+ * etc. This is the main configuration function of the driver. Here
|
|
+ * are transmitted all crucial input and output parameters of the
|
|
+ * device.
|
|
+ * This function is synchronous.
|
|
+ * This function is not ISR friendly.
|
|
+ *
|
|
+ * \param instance Instance identifier.
|
|
+ * \param videoInputConfig Configuration of the input video.
|
|
+ * \param videoOutputConfig Configuration of the output video.
|
|
+ * \param audioInputConfig Configuration of the input audio.
|
|
+ * \param sinkType Type of sink connected to the output of the Tx.
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong
|
|
+ * - ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number
|
|
+ * - ERR_HDMI_BAD_PARAMETER: a parameter was out of range
|
|
+ * - ERR_HDMI_NOT_INITIALIZED: transmitter not initialized
|
|
+ * - ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus
|
|
+ * - ERR_HDMI_I2C_READ: failed when reading to the I2C bus
|
|
+ * - ERR_HDMI_OPERATION_NOT_PERMITTED: not allowed in DVI mode
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+error_code_t tx_set_input_output
|
|
+(
|
|
+ instance_t instance,
|
|
+ tx_video_in_config_t video_input_config,
|
|
+ tx_video_out_config_t video_output_config,
|
|
+ tx_audio_in_config_t audio_input_config,
|
|
+ tx_sink_type_t sink_type
|
|
+)
|
|
+{
|
|
+ error_code_t err;
|
|
+ u8 pix_repeat; /* Pixel repetition */
|
|
+ bsl_vout_dbits_t path_bits; /* Data path bit width */
|
|
+ bsl_pix_edge_t pixel_edge; /* Pixel sampling edge */
|
|
+ bsl_vs_meth_t sync_method; /* Sync method */
|
|
+ bsl_pix_togl_t toggle; /* Toggling */
|
|
+ /* Embedded or external */
|
|
+ u8 sync_in;
|
|
+ bsl_pix_subpkt_t sp_sync; /* Subpacket sync */
|
|
+ bsl_blnk_src_t blankit; /* Blanking */
|
|
+ /* HDMITX_PIXRATE_SINGLE */
|
|
+ bsl_pix_rate_t pix_rate_single_double;
|
|
+ u16 u_ref_pix; /* REFPIX for output */
|
|
+ u16 u_ref_line; /* REFLINE for output */
|
|
+ u16 u_sc_ref_pix; /* REFPIX for scaler */
|
|
+ /* REFLINE for scaler */
|
|
+ u16 u_sc_ref_line;
|
|
+ /* Scaler setting verified */
|
|
+ bool b_verified;
|
|
+ /* Adjustment for interlaced output */
|
|
+ bsl_top_sel_t top_sel;
|
|
+ /* Line/pixel counters sync */
|
|
+ bsl_vs_once_t once;
|
|
+ bsl_sca_mode_t scaler_mode; /* Current scaler mode */
|
|
+
|
|
+ tx_capabilities_t audio_capabilities;
|
|
+
|
|
+ /* Initialized after (depend on video mode used) */
|
|
+ u8 *p_swap_table = NULL;
|
|
+ /* Initialized after (depend on video mode used) */
|
|
+ u8 *p_mirror_table = NULL;
|
|
+ /* Initialized after (depend on video mode used) */
|
|
+ u8 *p_ena_video_port_table = NULL;
|
|
+ /* Initialized after (depend on video mode used) */
|
|
+ u8 *p_gnd_video_port_table = NULL;
|
|
+
|
|
+ /* Check if instance number is in range */
|
|
+ RETIF((instance < 0) || (instance >= MAX_UNITS), ERR_DLHDMITX_BAD_INSTANCE)
|
|
+
|
|
+ /* Take the sempahore */
|
|
+ RETIF((err = tx_iwsemaphore_p(dl_hdmi_tx_it_semaphore[instance])) != 0, err)
|
|
+
|
|
+ /* Update the instance status information */
|
|
+ instance_status_info_tx[instance].p_video_info->video_in_config.format = video_input_config.format;
|
|
+ instance_status_info_tx[instance].p_video_info->video_in_config.mode = video_input_config.mode;
|
|
+ instance_status_info_tx[instance].p_video_info->video_in_config.sync_source = video_input_config.sync_source;
|
|
+ instance_status_info_tx[instance].p_video_info->video_in_config.pixel_rate = video_input_config.pixel_rate;
|
|
+
|
|
+ instance_status_info_tx[instance].p_video_info->video_out_config.format = video_output_config.format;
|
|
+ instance_status_info_tx[instance].p_video_info->video_out_config.mode = video_output_config.mode;
|
|
+ instance_status_info_tx[instance].p_video_info->video_out_config.color_depth = video_output_config.color_depth;
|
|
+
|
|
+ /* TODO */
|
|
+ /*instanceStatusInfoTx[instance].pVideoInfo->videoMuteState = */
|
|
+
|
|
+ /* Audio support */
|
|
+ RETIF_SEM(dl_hdmi_tx_it_semaphore[instance],
|
|
+ (err = tx_get_capabilities_m(instance, &audio_capabilities)) != 0, err)
|
|
+
|
|
+ /* Test if audio input format is supported */
|
|
+ if(((audio_input_config.format == DL_HDMITX_AFMT_OBA) && (audio_capabilities.audio_packet.one_bit_audio == false)) ||
|
|
+ ((audio_input_config.format == DL_HDMITX_AFMT_DST) && (audio_capabilities.audio_packet.DST == false)) ||
|
|
+ ((audio_input_config.format == DL_HDMITX_AFMT_HBR) && (audio_capabilities.audio_packet.HBR == false))) {
|
|
+ /* Release the sempahore */
|
|
+ RETIF((err = tx_iwsemaphore_v(dl_hdmi_tx_it_semaphore[instance])) != 0, err)
|
|
+
|
|
+ return ERR_DLHDMITX_NOT_SUPPORTED;
|
|
+ }
|
|
+
|
|
+ instance_status_info_tx[instance].p_audio_info->audio_in_cfg.format = audio_input_config.format;
|
|
+ instance_status_info_tx[instance].p_audio_info->audio_in_cfg.i2s_format = audio_input_config.i2s_format;
|
|
+ instance_status_info_tx[instance].p_audio_info->audio_in_cfg.i2s_qualifier = audio_input_config.i2s_qualifier;
|
|
+ instance_status_info_tx[instance].p_audio_info->audio_in_cfg.rate = audio_input_config.rate;
|
|
+ instance_status_info_tx[instance].p_audio_info->audio_in_cfg.channel_allocation = audio_input_config.channel_allocation;
|
|
+
|
|
+ /* TODO */
|
|
+ /*instanceStatusInfoTx[instance].pAudioInfo->audioMuteState = */
|
|
+
|
|
+ if(sink_type == DL_HDMITX_SINK_EDID) {
|
|
+ /* Change sink type with the currently defined in EDID */
|
|
+ RETIF_SEM(dl_hdmi_tx_it_semaphore[instance],
|
|
+ (err = bsl_edid_get_sink_type(instance,
|
|
+ (bsl_sink_type_t *)&sink_type)) != 0, err)
|
|
+ }
|
|
+
|
|
+ if((sink_type == DL_HDMITX_SINK_DVI) &&
|
|
+ ((video_output_config.format == dl_hdmitx_vfmt_06_720x480i_60hz) ||
|
|
+ (video_output_config.format == dl_hdmitx_vfmt_07_720x480i_60hz) ||
|
|
+ (video_output_config.format == dl_hdmitx_vfmt_10_720x480i_60hz) ||
|
|
+ (video_output_config.format == dl_hdmitx_vfmt_11_720x480i_60hz) ||
|
|
+ (video_output_config.format == dl_hdmitx_vfmt_21_720x576i_50hz) ||
|
|
+ (video_output_config.format == dl_hdmitx_vfmt_22_720x576i_50hz) ||
|
|
+ (video_output_config.format == dl_hdmitx_vfmt_25_720x576i_50hz) ||
|
|
+ (video_output_config.format == dl_hdmitx_vfmt_26_720x576i_50hz) ||
|
|
+ (video_output_config.format == dl_hdmitx_vfmt_08_720x240p_60hz) ||
|
|
+ (video_output_config.format == dl_hdmitx_vfmt_09_720x240p_60hz) ||
|
|
+ (video_output_config.format == dl_hdmitx_vfmt_12_720x240p_60hz) ||
|
|
+ (video_output_config.format == dl_hdmitx_vfmt_13_720x240p_60hz) ||
|
|
+ (video_output_config.format == dl_hdmitx_vfmt_23_720x288p_50hz) ||
|
|
+ (video_output_config.format == dl_hdmitx_vfmt_24_720x288p_50hz) ||
|
|
+ (video_output_config.format == dl_hdmitx_vfmt_27_720x288p_50hz) ||
|
|
+ (video_output_config.format == dl_hdmitx_vfmt_28_720x288p_50hz)
|
|
+ )
|
|
+ )
|
|
+ /* forbid format with pixel repetition in DVI */
|
|
+ {
|
|
+ /* Release the sempahore */
|
|
+ RETIF((err = tx_iwsemaphore_v(dl_hdmi_tx_it_semaphore[instance])) != 0, err)
|
|
+
|
|
+ return ERR_DLHDMITX_BAD_PARAMETER;
|
|
+ }
|
|
+
|
|
+ /* Set the TMDS outputs to a forced state */
|
|
+ err = bsl_tmds_set_outputs(instance,
|
|
+ HDMITX_TMDSOUT_FORCED0);
|
|
+ RETIF_SEM(dl_hdmi_tx_it_semaphore[instance], (err != 0) && (err != ERR_HDMI_NOT_SUPPORTED), err)
|
|
+
|
|
+ /* Fine-tune the TMDS serializer */
|
|
+ err = bsl_tmds_set_serializer(instance,
|
|
+ 4, 8);
|
|
+ RETIF_SEM(dl_hdmi_tx_it_semaphore[instance], (err != 0) && (err != ERR_HDMI_NOT_SUPPORTED), err)
|
|
+
|
|
+ /* Set video output configuration */
|
|
+ RETIF_SEM(dl_hdmi_tx_it_semaphore[instance],
|
|
+ (err = bsl_video_out_set_config(instance,
|
|
+ (bsl_sink_type_t)sink_type, (bsl_vout_mode_t)video_output_config.mode, HDMITX_VOUT_PREFIL_OFF,
|
|
+ HDMITX_VOUT_YUV_BLNK_16, HDMITX_VOUT_QRANGE_FS)) != 0, err)
|
|
+
|
|
+ /* Set default config */
|
|
+ pix_repeat = HDMITX_PIXREP_DEFAULT;
|
|
+ path_bits = HDMITX_VOUT_DBITS_12;
|
|
+ pixel_edge = HDMITX_PIXEDGE_CLK_POS;
|
|
+ sync_method = HDMITX_VSMETH_V_H;
|
|
+ toggle = HDMITX_PIXTOGL_ENABLE;
|
|
+
|
|
+ /* Set sync details */
|
|
+ if(video_input_config.sync_source == DL_HDMITX_SYNCSRC_EMBEDDED) {
|
|
+ /* Embedded sync */
|
|
+ sync_in = EMB;
|
|
+ sp_sync = HDMITX_PIXSUBPKT_SYNC_HEMB;
|
|
+ blankit = HDMITX_BLNKSRC_VS_HEMB_VEMB;
|
|
+ sync_method = HDMITX_VSMETH_V_XDE;
|
|
+ } else {
|
|
+ /* External sync */
|
|
+ sync_in = EXT;
|
|
+
|
|
+ if(gtx_driver_config_table[instance].data_enable_signal_available == 1) {
|
|
+ /* DE is available */
|
|
+ sp_sync = HDMITX_PIXSUBPKT_SYNC_DE;
|
|
+ } else {
|
|
+ /* DE is NOT available */
|
|
+ sp_sync = HDMITX_PIXSUBPKT_SYNC_HS;
|
|
+ }
|
|
+
|
|
+ blankit = HDMITX_BLNKSRC_NOT_DE;
|
|
+ }
|
|
+
|
|
+ /* Port swap table */
|
|
+ switch(video_input_config.mode) {
|
|
+ case DL_HDMITX_VINMODE_CCIR656:
|
|
+ path_bits = HDMITX_VOUT_DBITS_8;
|
|
+ pixel_edge = HDMITX_PIXEDGE_CLK_NEG;
|
|
+ p_swap_table = gtx_driver_config_table[instance].p_swap_table_ccir656;
|
|
+ p_mirror_table = gtx_driver_config_table[instance].p_mirror_table_ccir656;
|
|
+ p_ena_video_port_table = gtx_driver_config_table[instance].p_enable_video_port_ccir656;
|
|
+ p_gnd_video_port_table = gtx_driver_config_table[instance].p_ground_video_port_ccir656;
|
|
+ break;
|
|
+
|
|
+ case DL_HDMITX_VINMODE_RGB444:
|
|
+ p_swap_table = gtx_driver_config_table[instance].p_swap_table_rgb444;
|
|
+ p_mirror_table = gtx_driver_config_table[instance].p_mirror_table_rgb444;
|
|
+ p_ena_video_port_table = gtx_driver_config_table[instance].p_enable_video_port_rgb444;
|
|
+ p_gnd_video_port_table = gtx_driver_config_table[instance].p_ground_video_port_rgb444;
|
|
+ break;
|
|
+
|
|
+ case DL_HDMITX_VINMODE_YUV444:
|
|
+ p_swap_table = gtx_driver_config_table[instance].p_swap_table_yuv444;
|
|
+ p_mirror_table = gtx_driver_config_table[instance].p_mirror_table_yuv444;
|
|
+ p_ena_video_port_table = gtx_driver_config_table[instance].p_enable_video_port_yuv444;
|
|
+ p_gnd_video_port_table = gtx_driver_config_table[instance].p_ground_video_port_yuv444;
|
|
+ break;
|
|
+
|
|
+ case DL_HDMITX_VINMODE_YUV422:
|
|
+ p_swap_table = gtx_driver_config_table[instance].p_swap_table_yuv422;
|
|
+ p_mirror_table = gtx_driver_config_table[instance].p_mirror_table_yuv422;
|
|
+ p_ena_video_port_table = gtx_driver_config_table[instance].p_enable_video_port_yuv422;
|
|
+ p_gnd_video_port_table = gtx_driver_config_table[instance].p_ground_video_port_yuv422;
|
|
+ break;
|
|
+
|
|
+ default:
|
|
+ break;
|
|
+ }
|
|
+
|
|
+ /* Set the audio and video input port configuration */
|
|
+ err = bsl_set_video_port_config(instance,
|
|
+ p_ena_video_port_table, p_gnd_video_port_table);
|
|
+ RETIF_SEM(dl_hdmi_tx_it_semaphore[instance], (err != 0) && (err != ERR_HDMI_NOT_SUPPORTED), err)
|
|
+
|
|
+ /* No possible to set the audio clock port config on TDA9983 */
|
|
+
|
|
+ /* Video input mapping */
|
|
+ err = bsl_video_in_set_mapping(instance,
|
|
+ p_swap_table, p_mirror_table);
|
|
+ RETIF_SEM(dl_hdmi_tx_it_semaphore[instance], (err != 0) && (err != ERR_HDMI_NOT_SUPPORTED), err)
|
|
+
|
|
+ /* Set fine image position */
|
|
+ RETIF_SEM(dl_hdmi_tx_it_semaphore[instance], (err = bsl_video_in_set_fine(instance, sp_sync, HDMITX_PIXTOGL_NO_ACTION)) != 0, err)
|
|
+
|
|
+ /* Set input blanking */
|
|
+ err = bsl_video_in_set_blanking(instance, blankit, HDMITX_BLNKCODE_ALL_0);
|
|
+ RETIF_SEM(dl_hdmi_tx_it_semaphore[instance], (err != 0) && (err != ERR_HDMI_NOT_SUPPORTED), err)
|
|
+
|
|
+ /* Configure video input options and control the upsampler */
|
|
+ RETIF_SEM(dl_hdmi_tx_it_semaphore[instance],
|
|
+ (err = bsl_video_in_set_config(instance,
|
|
+ /* (bslVidFmt_t)videoOutputConfig.format ,*/
|
|
+ (bsl_vin_mode_t)video_input_config.mode, pixel_edge,
|
|
+ (bsl_pix_rate_t)video_input_config.pixel_rate, HDMITX_UPSAMPLE_AUTO)) != 0, err)
|
|
+
|
|
+ /* Only set audio for HDMI, not DVI */
|
|
+ if(sink_type == DL_HDMITX_SINK_HDMI) {
|
|
+ /* Release the sempahore */
|
|
+ RETIF((err = tx_iwsemaphore_v(dl_hdmi_tx_it_semaphore[instance])) != 0, err)
|
|
+ /* Set audio parameters */
|
|
+ RETIF((err = tx_set_audio_input(instance, audio_input_config, sink_type)) != 0, err)
|
|
+ /* Take the sempahore */
|
|
+ RETIF((err = tx_iwsemaphore_p(dl_hdmi_tx_it_semaphore[instance])) != 0, err)
|
|
+ }
|
|
+
|
|
+ /* Output fine adjustment */
|
|
+ pix_rate_single_double = (bsl_pix_rate_t)video_input_config.pixel_rate;
|
|
+ if(video_input_config.pixel_rate == HDMITX_PIXRATE_SINGLE_REPEATED) {
|
|
+ pix_rate_single_double = HDMITX_PIXRATE_SINGLE;
|
|
+ }
|
|
+
|
|
+ /* Set input ouput - may give NOT_SUPPORTED error */
|
|
+ RETIF_SEM(dl_hdmi_tx_it_semaphore[instance],
|
|
+ (err = bsl_video_set_in_out(instance,
|
|
+ (bsl_vid_fmt_t)video_input_config.format, HDMITX_SCAMODE_AUTO, (bsl_vid_fmt_t)video_output_config.format,
|
|
+ pix_repeat, HDMITX_MATMODE_AUTO, path_bits, (bsl_vqr_t) video_output_config.dvi_vqr)) != 0, err)
|
|
+
|
|
+ if(dl_hdmi_tx_get_refline_refpix(video_input_config.format, video_input_config.mode, video_output_config.format,
|
|
+ sync_in, (tx_pix_rate_t)pix_rate_single_double, &u_ref_pix, &u_ref_line,
|
|
+ &u_sc_ref_pix, &u_sc_ref_line, &b_verified) > 0) {
|
|
+ /* From 720p50/60 or 1080i50/60 up-scaling to 1080p50/60, when external sync,
|
|
+ * toggleV, toggleH and toggleX need to be set to 0 */
|
|
+ if(sync_in == EXT) {
|
|
+ switch(video_input_config.format) {
|
|
+ case hdmitx_vfmt_04_1280x720p_60hz:
|
|
+ case hdmitx_vfmt_19_1280x720p_50hz:
|
|
+ case hdmitx_vfmt_05_1920x1080i_60hz:
|
|
+ case hdmitx_vfmt_20_1920x1080i_50hz:
|
|
+ if((video_output_config.format == hdmitx_vfmt_16_1920x1080p_60hz)
|
|
+ || (video_output_config.format == hdmitx_vfmt_31_1920x1080p_50hz)) {
|
|
+ toggle = HDMITX_PIXTOGL_NO_ACTION;
|
|
+ }
|
|
+ break;
|
|
+ default:
|
|
+ toggle = HDMITX_PIXTOGL_ENABLE;
|
|
+ break;
|
|
+ }
|
|
+ }
|
|
+
|
|
+ /* Combination found in table for scaler: configure input manually */
|
|
+ RETIF_SEM(dl_hdmi_tx_it_semaphore[instance],
|
|
+ (err = bsl_video_in_set_sync_manual(instance,
|
|
+ (bsl_sync_source_t)video_input_config.sync_source, sync_method, toggle, toggle, toggle, u_ref_pix, u_ref_line)) != 0, err)
|
|
+ } else {
|
|
+ /* Not found so assume non-scaler and auto-configure input */
|
|
+ RETIF_SEM(dl_hdmi_tx_it_semaphore[instance],
|
|
+ (err = bsl_video_in_set_sync_auto(instance,
|
|
+ (bsl_sync_source_t)video_input_config.sync_source, (bsl_vid_fmt_t)video_input_config.format,
|
|
+ (bsl_vin_mode_t)video_input_config.mode)) != 0, err)
|
|
+ }
|
|
+
|
|
+ /* Only set infoframes for HDMI, not DVI */
|
|
+ if(sink_type == DL_HDMITX_SINK_HDMI) {
|
|
+ /* Set avi infoframe */
|
|
+ RETIF_SEM(dl_hdmi_tx_it_semaphore[instance],
|
|
+ (err = dl_hdmi_tx_set_video_infoframe(instance, video_output_config.format, video_output_config.mode)) != 0,
|
|
+ err)
|
|
+ }
|
|
+
|
|
+ err = bsl_scaler_get_mode(instance, &scaler_mode);
|
|
+
|
|
+ /* Ignore scaler ERR_HDMI_NOT_SUPPORTED error */
|
|
+ if((err == 0) && (scaler_mode == HDMITX_SCAMODE_ON)) {
|
|
+ /* Enable scaler mode */
|
|
+ RETIF_SEM(dl_hdmi_tx_it_semaphore[instance],
|
|
+ (err = bsl_scaler_in_disable(instance,
|
|
+ false)) != 0, err)
|
|
+
|
|
+ /* Correction to interlace */
|
|
+ top_sel = HDMITX_TOPSEL_INTERNAL;
|
|
+ if((video_output_config.format == dl_hdmitx_vfmt_05_1920x1080i_60hz)
|
|
+ || (video_output_config.format == dl_hdmitx_vfmt_20_1920x1080i_50hz)) {
|
|
+ /* video input format is range-checked by bslVideoSetInOut above */
|
|
+ if((k_vfmt_to_short_fmt_tv[video_input_config.format] == TV_480p_60HZ)
|
|
+ || (k_vfmt_to_short_fmt_tv[video_input_config.format] == TV_576p_50HZ)) {
|
|
+ /* Correct for 1080i output for p->i conversion only */
|
|
+ top_sel = HDMITX_TOPSEL_VRF;
|
|
+ }
|
|
+ }
|
|
+
|
|
+ /* Set scaler field positions */
|
|
+ RETIF_SEM(dl_hdmi_tx_it_semaphore[instance],
|
|
+ (err = bsl_scaler_set_field_order(instance,
|
|
+ HDMITX_INTEXT_NO_CHANGE, HDMITX_INTEXT_NO_CHANGE, top_sel, HDMITX_TOPTGL_NO_CHANGE)) != 0, err)
|
|
+
|
|
+ /* Scaler fine adjustment */
|
|
+ RETIF_SEM(dl_hdmi_tx_it_semaphore[instance],
|
|
+ (err = bsl_scaler_set_fine(instance,
|
|
+ u_sc_ref_pix, u_sc_ref_line)) != 0, err)
|
|
+
|
|
+ /* Not possible to set the scaler latency & phase on TDA9983 */
|
|
+
|
|
+ /* Set scaler synchronisation option */
|
|
+ RETIF_SEM(dl_hdmi_tx_it_semaphore[instance],
|
|
+ (err = bsl_scaler_set_sync(instance,
|
|
+ sync_method, HDMITX_VSONCE_EACH_FRAME)) != 0, err)
|
|
+
|
|
+ /* With scaler, use Only Once setting for bslVideoOutSetSync */
|
|
+ once = HDMITX_VSONCE_ONCE;
|
|
+ } else {
|
|
+ once = HDMITX_VSONCE_EACH_FRAME;
|
|
+ }
|
|
+
|
|
+ /* Set video synchronisation */
|
|
+ RETIF_SEM(dl_hdmi_tx_it_semaphore[instance],
|
|
+ (err = bsl_video_out_set_sync(instance,
|
|
+ HDMITX_VSSRC_INTERNAL, HDMITX_VSSRC_INTERNAL, HDMITX_VSSRC_INTERNAL,
|
|
+ HDMITX_VSTGL_TABLE, once)) != 0, err)
|
|
+
|
|
+ /* Release the sempahore */
|
|
+ RETIF((err = tx_iwsemaphore_v(dl_hdmi_tx_it_semaphore[instance])) != 0, err)
|
|
+
|
|
+ instance_status_info_tx[instance].p_col_bar_state->in_out_first_set_done = true;
|
|
+
|
|
+ /* Test if pattern is already on */
|
|
+ if(instance_status_info_tx[instance].p_col_bar_state->color_bar_on == true) {
|
|
+ /* If pattern is On, apply new settings */
|
|
+ instance_status_info_tx[instance].p_col_bar_state->change_color_bar_now = true;
|
|
+ }
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+/*****************************************************************************/
|
|
+/**
|
|
+ * \brief Configures audio input parameters : format, rate, etc.
|
|
+ * This function is similar to txSetInputOutput except that
|
|
+ * video is not reconfigured.
|
|
+ * This function is synchronous.
|
|
+ * This function is not ISR friendly.
|
|
+ *
|
|
+ * \param instance Instance identifier.
|
|
+ * \param audioInputConfig Configuration of the input audio.
|
|
+ * \param sinkType Type of sink connected to the output of the Tx.
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong
|
|
+ * - ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number
|
|
+ * - ERR_HDMI_BAD_PARAMETER: a parameter was out of range
|
|
+ * - ERR_HDMI_NOT_INITIALIZED: transmitter not initialized
|
|
+ * - ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus
|
|
+ * - ERR_HDMI_I2C_READ: failed when reading to the I2C bus
|
|
+ * - ERR_HDMI_OPERATION_NOT_PERMITTED: not allowed in DVI mode
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+error_code_t tx_set_audio_input
|
|
+(
|
|
+ instance_t instance,
|
|
+ tx_audio_in_config_t audio_input_config,
|
|
+ tx_sink_type_t sink_type
|
|
+)
|
|
+{
|
|
+ error_code_t err;
|
|
+ /* Used to convert video format to video frequency */
|
|
+ tx_vid_fmt_specs_t resolution_specs;
|
|
+ u8 layout; /* 0 or 1 */
|
|
+ /* audio info frame channels */
|
|
+ u8 aif_channel_count_code = 0;
|
|
+ /* Vertical output frequency */
|
|
+ bsl_vfreq_t v_out_freq;
|
|
+ bslcts_ref_t cts_ref; /* CTS ref source */
|
|
+ u16 u_cts_x; /* CtsX value */
|
|
+ bsl_pkt_aif_t pkt_aif; /* Audio infoframe packet */
|
|
+ tx_capabilities_t audio_capabilities;
|
|
+ u8 *p_ena_audio_port_cfg;
|
|
+ u8 *p_gnd_audio_port_cfg;
|
|
+
|
|
+ /* Check if instance number is in range */
|
|
+ RETIF((instance < 0) || (instance >= MAX_UNITS), ERR_DLHDMITX_BAD_INSTANCE)
|
|
+
|
|
+ /* Take the sempahore */
|
|
+ RETIF((err = tx_iwsemaphore_p(dl_hdmi_tx_it_semaphore[instance])) != 0, err)
|
|
+
|
|
+ /* Audio support */
|
|
+ RETIF_SEM(dl_hdmi_tx_it_semaphore[instance],
|
|
+ (err = tx_get_capabilities_m(instance, &audio_capabilities)) != 0, err)
|
|
+
|
|
+ /* Test if audio input format is supported */
|
|
+ if(((audio_input_config.format == DL_HDMITX_AFMT_OBA) && (audio_capabilities.audio_packet.one_bit_audio == false)) ||
|
|
+ ((audio_input_config.format == DL_HDMITX_AFMT_DST) && (audio_capabilities.audio_packet.DST == false)) ||
|
|
+ ((audio_input_config.format == DL_HDMITX_AFMT_HBR) && (audio_capabilities.audio_packet.HBR == false)))
|
|
+
|
|
+ {
|
|
+ /* Release the sempahore */
|
|
+ RETIF((err = tx_iwsemaphore_v(dl_hdmi_tx_it_semaphore[instance])) != 0, err)
|
|
+
|
|
+ return ERR_DLHDMITX_NOT_SUPPORTED;
|
|
+ }
|
|
+
|
|
+ if(sink_type == DL_HDMITX_SINK_EDID) {
|
|
+ /* Change sink type with the currently defined in EDID */
|
|
+ RETIF_SEM(dl_hdmi_tx_it_semaphore[instance],
|
|
+ (err = bsl_edid_get_sink_type(instance, (bsl_sink_type_t *)&sink_type)) != 0, err)
|
|
+ }
|
|
+
|
|
+ if(sink_type == DL_HDMITX_SINK_HDMI) {
|
|
+
|
|
+ layout = 1;
|
|
+
|
|
+ if(audio_input_config.channel_allocation == 0x00) {
|
|
+ layout = 0;
|
|
+ }
|
|
+
|
|
+ aif_channel_count_code = k_chan_alloc_chan_num[audio_input_config.channel_allocation] - 1;
|
|
+
|
|
+ /* Port audio configuration */
|
|
+ switch(audio_input_config.format) {
|
|
+ case DL_HDMITX_AFMT_SPDIF:
|
|
+ p_ena_audio_port_cfg = gtx_driver_config_table[instance].p_enable_audio_port_spdif;
|
|
+ p_gnd_audio_port_cfg = gtx_driver_config_table[instance].p_ground_audio_port_spdif;
|
|
+ break;
|
|
+
|
|
+ case DL_HDMITX_AFMT_I2S:
|
|
+
|
|
+ if(aif_channel_count_code >= 1) { /* For multi-channel */
|
|
+ p_ena_audio_port_cfg = gtx_driver_config_table[instance].p_enable_audio_port_i2s8c;
|
|
+ p_gnd_audio_port_cfg = gtx_driver_config_table[instance].p_ground_audio_port_i2s8c;
|
|
+ } else {
|
|
+ p_ena_audio_port_cfg = gtx_driver_config_table[instance].p_enable_audio_port_i2s;
|
|
+ p_gnd_audio_port_cfg = gtx_driver_config_table[instance].p_ground_audio_port_i2s;
|
|
+ }
|
|
+ break;
|
|
+
|
|
+ case DL_HDMITX_AFMT_OBA:
|
|
+ p_ena_audio_port_cfg = gtx_driver_config_table[instance].p_enable_audio_port_oba;
|
|
+ p_gnd_audio_port_cfg = gtx_driver_config_table[instance].p_ground_audio_port_oba;
|
|
+ break;
|
|
+
|
|
+ case DL_HDMITX_AFMT_DST:
|
|
+ p_ena_audio_port_cfg = gtx_driver_config_table[instance].p_enable_audio_port_dst;
|
|
+ p_gnd_audio_port_cfg = gtx_driver_config_table[instance].p_ground_audio_port_dst;
|
|
+ break;
|
|
+
|
|
+ case DL_HDMITX_AFMT_HBR:
|
|
+ p_ena_audio_port_cfg = gtx_driver_config_table[instance].p_enable_audio_port_hbr;
|
|
+ p_gnd_audio_port_cfg = gtx_driver_config_table[instance].p_ground_audio_port_hbr;
|
|
+ break;
|
|
+
|
|
+ default:
|
|
+ /* Release the sempahore */
|
|
+ RETIF((err = tx_iwsemaphore_v(dl_hdmi_tx_it_semaphore[instance])) != 0, err)
|
|
+
|
|
+ return ERR_DLHDMITX_BAD_PARAMETER;
|
|
+ }
|
|
+
|
|
+ err = bsl_set_audio_port_config(instance, p_ena_audio_port_cfg, p_gnd_audio_port_cfg);
|
|
+ RETIF_SEM(dl_hdmi_tx_it_semaphore[instance], (err != 0) && (err != ERR_HDMI_NOT_SUPPORTED), err)
|
|
+
|
|
+ /* Not possible to set the Clock port configuration on TDA9983 */
|
|
+
|
|
+ RETIF_SEM(dl_hdmi_tx_it_semaphore[instance],
|
|
+ (err = bsl_audio_in_set_config(instance, (bsla_fmt_t)audio_input_config.format,
|
|
+ audio_input_config.channel_allocation, HDMITX_CHAN_NO_CHANGE, HDMITX_CLKPOLDSD_NO_CHANGE, HDMITX_SWAPDSD_NO_CHANGE,
|
|
+ layout, 0x80)) != 0, err)
|
|
+
|
|
+ /* Find output vertical frequency from output format */
|
|
+ RETIF_SEM(dl_hdmi_tx_it_semaphore[instance],
|
|
+ (err = tx_get_video_format_specs(instance, instance_status_info_tx[instance].p_video_info->video_out_config.format,
|
|
+ &resolution_specs)) != 0, err)
|
|
+ v_out_freq = (bsl_vfreq_t)resolution_specs.vfrequency;
|
|
+
|
|
+ if((audio_input_config.format == DL_HDMITX_AFMT_SPDIF)
|
|
+ || (audio_input_config.format == DL_HDMITX_AFMT_OBA)) {
|
|
+ cts_ref = HDMITX_CTSREF_FS64SPDIF;
|
|
+ u_cts_x = HDMITX_CTSX_64;
|
|
+ } else { /* I2S */
|
|
+ cts_ref = HDMITX_CTSREF_ACLK;
|
|
+ if(audio_input_config.i2s_qualifier == DL_HDMITX_I2SQ_32BITS) {
|
|
+ u_cts_x = HDMITX_CTSX_64;
|
|
+ } else {
|
|
+ u_cts_x = HDMITX_CTSX_32;
|
|
+ }
|
|
+ }
|
|
+
|
|
+ /* Set the Clock Time Stamp generator in HDMI mode only */
|
|
+
|
|
+ RETIF_SEM(dl_hdmi_tx_it_semaphore[instance],
|
|
+ (err = bsl_audio_in_set_cts(instance, cts_ref, (bslafs_t)audio_input_config.rate,
|
|
+ (bsl_vid_fmt_t)instance_status_info_tx[instance].p_video_info->video_out_config.format,
|
|
+ v_out_freq, HDMITX_CTS_AUTO, u_cts_x, HDMITX_CTSK_USE_CTSX, HDMITX_CTSMTS_USE_CTSX)) != 0, err)
|
|
+
|
|
+ /* Set Channel Status registers
|
|
+ * No need to call bslTDA9984AudioOutSetChanStatusMapping, since default Byte 2
|
|
+ * values of "Do not take into account" are adequate */
|
|
+ RETIF_SEM(dl_hdmi_tx_it_semaphore[instance],
|
|
+ (err = bsl_audio_out_set_chan_status(instance, HDMITX_CSFI_PCM_2CHAN_NO_PRE,
|
|
+ HDMITX_CSCOPYRIGHT_PROTECTED, 0x00, (bslafs_t)audio_input_config.rate,
|
|
+ HDMITX_CSCLK_LEVEL_II, HDMITX_CSMAX_LENGTH_20, HDMITX_CSWORD_DEFAULT,
|
|
+ HDMITX_CSOFREQ_NOT_INDICATED)) != 0, err)
|
|
+
|
|
+ /* Set reset_fifo to 1 */
|
|
+ RETIF_SEM(dl_hdmi_tx_it_semaphore[instance],
|
|
+ (err = bsl_audio_out_set_mute(instance, HDMITX_AMUTE_ON)) != 0, err)
|
|
+ /* Wait for 20 ms */
|
|
+ RETIF_SEM(dl_hdmi_tx_it_semaphore[instance],
|
|
+ (err = tx_iwwait(20)) != 0, err)
|
|
+ /* Set reset_fifo to 0 */
|
|
+ RETIF_SEM(dl_hdmi_tx_it_semaphore[instance],
|
|
+ (err = bsl_audio_out_set_mute(instance, HDMITX_AMUTE_OFF)) != 0, err)
|
|
+
|
|
+ /* Set audio infoframe */
|
|
+ pkt_aif.channel_count = aif_channel_count_code;
|
|
+ pkt_aif.coding_type = 0; /* refer to stream header */
|
|
+ pkt_aif.sample_size = 0; /* refer to stream header */
|
|
+ pkt_aif.channel_alloc = audio_input_config.channel_allocation;
|
|
+ pkt_aif.level_shift = 0; /* 0dB level shift */
|
|
+ pkt_aif.down_mix_inhibit = 0; /* down-mix stereo permitted */
|
|
+ /* refer to stream header */
|
|
+ pkt_aif.sample_freq = AIF_SF_REFER_TO_STREAM_HEADER;
|
|
+
|
|
+ /* SampleFreq parameter need to be set for OBA and DST audio stream */
|
|
+ if((audio_input_config.format == DL_HDMITX_AFMT_OBA) ||
|
|
+ (audio_input_config.format == DL_HDMITX_AFMT_DST)) {
|
|
+ switch(audio_input_config.rate) {
|
|
+ case DL_HDMITX_AFS_32K:
|
|
+ pkt_aif.sample_freq = AIF_SF_32K; /* see table 18 of CEA-861 */
|
|
+ break;
|
|
+ case DL_HDMITX_AFS_44K:
|
|
+ pkt_aif.sample_freq = AIF_SF_44K;
|
|
+ break;
|
|
+ case DL_HDMITX_AFS_48K:
|
|
+ pkt_aif.sample_freq = AIF_SF_48K;
|
|
+ break;
|
|
+ case DL_HDMITX_AFS_88K:
|
|
+ pkt_aif.sample_freq = AIF_SF_88K;
|
|
+ break;
|
|
+ case DL_HDMITX_AFS_96K:
|
|
+ pkt_aif.sample_freq = AIF_SF_96K;
|
|
+ break;
|
|
+ case DL_HDMITX_AFS_176K:
|
|
+ pkt_aif.sample_freq = AIF_SF_176K;
|
|
+ break;
|
|
+ case DL_HDMITX_AFS_192K:
|
|
+ pkt_aif.sample_freq = AIF_SF_192K;
|
|
+ break;
|
|
+ default:
|
|
+ /* refer to stream header */
|
|
+ pkt_aif.sample_freq = AIF_SF_REFER_TO_STREAM_HEADER;
|
|
+ break;
|
|
+ }
|
|
+ }
|
|
+
|
|
+ RETIF_SEM(dl_hdmi_tx_it_semaphore[instance],
|
|
+ (err = bsl_pkt_set_audio_infoframe(instance, &pkt_aif, true)) != 0, err)
|
|
+ }
|
|
+
|
|
+ /* Release the sempahore */
|
|
+ RETIF((err = tx_iwsemaphore_v(dl_hdmi_tx_it_semaphore[instance])) != 0, err)
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+/******************************************************************************
|
|
+ * \brief Defines the content of AVI infoframe to be sent by Tx device.
|
|
+ * This function is synchronous.
|
|
+ * This function is not ISR friendly.
|
|
+ *
|
|
+ * \param instance Instance identifier.
|
|
+ * \param enable Enable/disable infoframe insertion.
|
|
+ * \param pAviIfData Pointer to the structure containing AVI infoframe
|
|
+ * parameters.
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong
|
|
+ * - ERR_DLHDMITX_INCONSISTENT_PARAMS: an input parameter is
|
|
+ * inconsistent
|
|
+ * - ERR_HDMI_BAD_PARAMETER: a parameter was out of range
|
|
+ * - ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number
|
|
+ * - ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus
|
|
+ * - ERR_HDMI_I2C_READ: failed when reading to the I2C bus
|
|
+ * - ERR_HDMI_NOT_INITIALIZED: transmitter not initialized
|
|
+ * - ERR_HDMI_OPERATION_NOT_PERMITTED: not allowed in DVI mode
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+error_code_t tx_set_video_infoframe
|
|
+(
|
|
+ instance_t instance,
|
|
+ bool enable,
|
|
+ tx_avi_if_data_t *p_avi_if_data
|
|
+)
|
|
+{
|
|
+ error_code_t err;
|
|
+ bsl_pkt_vif_t pkt_vif;
|
|
+ bsl_vid_fmt_t vif_info_frame;
|
|
+
|
|
+ /* Check if instance number is in range */
|
|
+ RETIF((instance < 0) || (instance >= MAX_UNITS), ERR_DLHDMITX_BAD_INSTANCE)
|
|
+
|
|
+ /* Take the sempahore */
|
|
+ RETIF((err = tx_iwsemaphore_p(dl_hdmi_tx_it_semaphore[instance])) != 0, err)
|
|
+
|
|
+ if(enable == true) {
|
|
+ /* Check if AviIfData pointer is NULL */
|
|
+ RETIF_SEM(dl_hdmi_tx_it_semaphore[instance], p_avi_if_data == NULL, ERR_DLHDMITX_INCONSISTENT_PARAMS)
|
|
+
|
|
+ /* 3rd api_set_avi_infoframe param */
|
|
+ pkt_vif.colour = p_avi_if_data->color_indicator;
|
|
+ pkt_vif.active_info = p_avi_if_data->active_info_present;
|
|
+ pkt_vif.bar_info = p_avi_if_data->bar_information_data_valid;
|
|
+ pkt_vif.scan_info = p_avi_if_data->scan_information;
|
|
+ pkt_vif.colorimetry = p_avi_if_data->colorimetry;
|
|
+#ifndef FORMAT_PC
|
|
+ pkt_vif.picture_aspect_ratio = k_vfmt_to_aspect_tv[p_avi_if_data->video_format_identification_code];
|
|
+#else /* FORMAT_PC */
|
|
+ if((p_avi_if_data->video_format_identification_code >= DL_HDMITX_VFMT_PC_MIN)
|
|
+ && (p_avi_if_data->video_format_identification_code <= DL_HDMITX_VFMT_PC_MAX)) {
|
|
+ pkt_vif.picture_aspect_ratio = k_vfmt_to_aspect_tv[p_avi_if_data->video_format_identification_code - DL_HDMITX_VFMT_PC_MIN + 1];
|
|
+ } else
|
|
+ pkt_vif.picture_aspect_ratio = k_vfmt_to_aspect_tv[p_avi_if_data->video_format_identification_code];
|
|
+#endif /* FORMAT_PC */
|
|
+ pkt_vif.active_format_ratio = p_avi_if_data->active_format_aspect_ratio;
|
|
+ pkt_vif.scaling = p_avi_if_data->non_uniform_picture_scaling;
|
|
+
|
|
+#ifdef FORMAT_PC
|
|
+ if(p_avi_if_data->video_format_identification_code >= HDMITX_VFMT_PC_MIN) {
|
|
+ if(p_avi_if_data->video_format_identification_code == hdmitx_vfmt_pc_640x480p_60hz) {
|
|
+ vif_info_frame = hdmitx_vfmt_01_640x480p_60hz;
|
|
+ } else {
|
|
+ /* Format PC not Valid in EIA861b */
|
|
+ vif_info_frame = HDMITX_VFMT_NULL;
|
|
+ }
|
|
+ } else {
|
|
+#endif /* FORMAT_PC */
|
|
+
|
|
+ vif_info_frame = (bsl_vid_fmt_t)p_avi_if_data->video_format_identification_code;
|
|
+
|
|
+#ifdef FORMAT_PC
|
|
+ }
|
|
+#endif /* FORMAT_PC */
|
|
+
|
|
+ pkt_vif.vid_format = vif_info_frame;
|
|
+
|
|
+ if(((p_avi_if_data->video_format_identification_code >= hdmitx_vfmt_06_720x480i_60hz)
|
|
+ && (p_avi_if_data->video_format_identification_code <= hdmitx_vfmt_09_720x240p_60hz))
|
|
+ || ((p_avi_if_data->video_format_identification_code >= hdmitx_vfmt_21_720x576i_50hz)
|
|
+ && (p_avi_if_data->video_format_identification_code <= hdmitx_vfmt_24_720x288p_50hz))) {
|
|
+ /* Force pixel repeat for formats where it's mandatory */
|
|
+ pkt_vif.pixel_repeat = 1;
|
|
+ } else {
|
|
+ /* Default to no repeat for all other formats */
|
|
+ pkt_vif.pixel_repeat = HDMITX_PIXREP_NONE;
|
|
+ }
|
|
+
|
|
+ pkt_vif.end_top_bar_line = p_avi_if_data->line_number_end_top_bar;
|
|
+ pkt_vif.start_bottom_bar_line = p_avi_if_data->line_number_start_bottom_bar;
|
|
+ pkt_vif.end_left_bar_pixel = p_avi_if_data->line_number_end_left_bar;
|
|
+ pkt_vif.start_right_bar_pixel = p_avi_if_data->line_number_start_right_bar;
|
|
+
|
|
+ err = bsl_pkt_set_video_infoframe(instance,
|
|
+ &pkt_vif, enable);
|
|
+ } else {
|
|
+ err = bsl_pkt_set_video_infoframe(instance,
|
|
+ NULL, enable);
|
|
+ }
|
|
+
|
|
+ /* Ignore infoframe interlock in DVI mode */
|
|
+ if(err == ERR_HDMI_OPERATION_NOT_PERMITTED) {
|
|
+ err = 0;
|
|
+ }
|
|
+
|
|
+ RETIF_SEM(dl_hdmi_tx_it_semaphore[instance], err != 0, err)
|
|
+
|
|
+ /* Release the sempahore */
|
|
+ RETIF((err = tx_iwsemaphore_v(dl_hdmi_tx_it_semaphore[instance])) != 0, err)
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+/******************************************************************************
|
|
+ * \brief Defines the content of AUD infoframe to be sent by Tx device.
|
|
+ * This function is synchronous.
|
|
+ * This function is not ISR friendly.
|
|
+ *
|
|
+ * \param instance Instance identifier.
|
|
+ * \param enable Enable/disable infoframe insertion.
|
|
+ * \param pAudIfData Pointer to the structure containing AUD infoframe
|
|
+ * parameters.
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong
|
|
+ * - ERR_DLHDMITX_INCONSISTENT_PARAMS: an input parameter is
|
|
+ * inconsistent
|
|
+ * - ERR_HDMI_BAD_PARAMETER: a parameter was out of range
|
|
+ * - ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number
|
|
+ * - ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus
|
|
+ * - ERR_HDMI_I2C_READ: failed when reading to the I2C bus
|
|
+ * - ERR_HDMI_NOT_INITIALIZED: transmitter not initialized
|
|
+ * - ERR_HDMI_OPERATION_NOT_PERMITTED: not allowed in DVI mode
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+error_code_t tx_set_audio_infoframe
|
|
+(
|
|
+ instance_t instance,
|
|
+ bool enable,
|
|
+ tx_aud_if_data_t *p_aud_if_data
|
|
+)
|
|
+{
|
|
+ error_code_t err;
|
|
+
|
|
+ /* Check if instance number is in range */
|
|
+ RETIF((instance < 0) || (instance >= MAX_UNITS), ERR_DLHDMITX_BAD_INSTANCE)
|
|
+
|
|
+ /* Take the sempahore */
|
|
+ RETIF((err = tx_iwsemaphore_p(dl_hdmi_tx_it_semaphore[instance])) != 0, err)
|
|
+
|
|
+ if(enable == true) {
|
|
+ /* Check if AudIfData pointer is NULL */
|
|
+ RETIF_SEM(dl_hdmi_tx_it_semaphore[instance], p_aud_if_data == NULL, ERR_DLHDMITX_INCONSISTENT_PARAMS)
|
|
+
|
|
+ RETIF_SEM(dl_hdmi_tx_it_semaphore[instance],
|
|
+ (err = bsl_pkt_set_audio_infoframe(instance,
|
|
+ (bsl_pkt_aif_t *)p_aud_if_data, enable)) != 0, err)
|
|
+ } else {
|
|
+ RETIF_SEM(dl_hdmi_tx_it_semaphore[instance],
|
|
+ (err = bsl_pkt_set_audio_infoframe(instance,
|
|
+ NULL, enable)) != 0, err)
|
|
+ }
|
|
+
|
|
+ /* Release the sempahore */
|
|
+ RETIF((err = tx_iwsemaphore_v(dl_hdmi_tx_it_semaphore[instance])) != 0, err)
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+/******************************************************************************
|
|
+ * \brief Defines the content of the audio content protection packet to be
|
|
+ * sent by Tx device.
|
|
+ * This function is synchronous.
|
|
+ * This function is not ISR friendly.
|
|
+ *
|
|
+ * \param instance Instance identifier.
|
|
+ * \param enable Enable/disable infoframe insertion.
|
|
+ * \param pAcpPktData Pointer to the structure containing ACP infoframe
|
|
+ * parameters.
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong
|
|
+ * - ERR_DLHDMITX_INCONSISTENT_PARAMS: an input parameter is
|
|
+ * inconsistent
|
|
+ * - ERR_HDMI_BAD_PARAMETER: a parameter was out of range
|
|
+ * - ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number
|
|
+ * - ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus
|
|
+ * - ERR_HDMI_I2C_READ: failed when reading to the I2C bus
|
|
+ * - ERR_HDMI_NOT_INITIALIZED: transmitter not initialized
|
|
+ * - ERR_HDMI_OPERATION_NOT_PERMITTED: not allowed in DVI mode
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+error_code_t tx_set_acppacket
|
|
+(
|
|
+ instance_t instance,
|
|
+ bool enable,
|
|
+ tx_acp_pkt_data_t *p_acp_pkt_data
|
|
+)
|
|
+{
|
|
+ error_code_t err;
|
|
+ bsl_pkt_t pkt;
|
|
+ u8 i;
|
|
+
|
|
+ /* Check if instance number is in range */
|
|
+ RETIF((instance < 0) || (instance >= MAX_UNITS), ERR_DLHDMITX_BAD_INSTANCE)
|
|
+
|
|
+ /* Take the sempahore */
|
|
+ RETIF((err = tx_iwsemaphore_p(dl_hdmi_tx_it_semaphore[instance])) != 0, err)
|
|
+
|
|
+ if(enable == true) {
|
|
+ /* Check if AcpPktData pointer is NULL */
|
|
+ RETIF_SEM(dl_hdmi_tx_it_semaphore[instance], p_acp_pkt_data == NULL, ERR_DLHDMITX_INCONSISTENT_PARAMS)
|
|
+
|
|
+ switch(p_acp_pkt_data->acp_type) {
|
|
+ /* Make sure bytes reserved are 0 */
|
|
+ case 0 : /* Generic audio */
|
|
+ for(i = 0; i < 28; i++) {
|
|
+ pkt.data_byte[i] = 0;
|
|
+ }
|
|
+ break;
|
|
+
|
|
+ case 1 : /* IEC 60958 identified audio */
|
|
+ for(i = 0; i < 28; i++) {
|
|
+ pkt.data_byte[i] = 0;
|
|
+ }
|
|
+ break;
|
|
+
|
|
+ case 2 : /* DVD Audio */
|
|
+ for(i = 0; i < 2; i++) {
|
|
+ pkt.data_byte[i] = p_acp_pkt_data->acp_data[i];
|
|
+ }
|
|
+ for(i = 2; i < 28; i++) {
|
|
+ pkt.data_byte[i] = 0;
|
|
+ }
|
|
+ break;
|
|
+
|
|
+ case 3 : /* SuperAudio CD */
|
|
+ for(i = 0; i < 17; i++) {
|
|
+ pkt.data_byte[i] = p_acp_pkt_data->acp_data[i];
|
|
+ }
|
|
+ for(i = 17; i < 28; i++) {
|
|
+ pkt.data_byte[i] = 0;
|
|
+ }
|
|
+ break;
|
|
+
|
|
+ default :
|
|
+ /* Release the sempahore */
|
|
+ RETIF((err = tx_iwsemaphore_v(dl_hdmi_tx_it_semaphore[instance])) != 0, err)
|
|
+ return ERR_DLHDMITX_INCONSISTENT_PARAMS;
|
|
+ }
|
|
+
|
|
+ RETIF_SEM(dl_hdmi_tx_it_semaphore[instance],
|
|
+ (err = bsl_pkt_set_acp(instance,
|
|
+ &pkt, 28, p_acp_pkt_data->acp_type, enable)) != 0, err)
|
|
+ } else {
|
|
+ RETIF_SEM(dl_hdmi_tx_it_semaphore[instance],
|
|
+ (err = bsl_pkt_set_acp(instance,
|
|
+ NULL, 0, 0, enable)) != 0, err)
|
|
+ }
|
|
+
|
|
+ /* Release the sempahore */
|
|
+ RETIF((err = tx_iwsemaphore_v(dl_hdmi_tx_it_semaphore[instance])) != 0, err)
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+/******************************************************************************
|
|
+ * \brief Defines the content of the General Control packet to be sent by Tx
|
|
+ * device.
|
|
+ * This function is synchronous.
|
|
+ * This function is not ISR friendly.
|
|
+ *
|
|
+ * \param instance Instance identifier.
|
|
+ * \param enable Enable/disable infoframe insertion.
|
|
+ * \param pGcpPktData Pointer to the structure containing GCP packet parameters.
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong
|
|
+ * - ERR_DLHDMITX_INCONSISTENT_PARAMS: an input parameter is
|
|
+ * inconsistent
|
|
+ * - ERR_HDMI_BAD_PARAMETER: a parameter was out of range
|
|
+ * - ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number
|
|
+ * - ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus
|
|
+ * - ERR_HDMI_I2C_READ: failed when reading to the I2C bus
|
|
+ * - ERR_HDMI_NOT_INITIALIZED: transmitter not initialized
|
|
+ * - ERR_HDMI_OPERATION_NOT_PERMITTED: not allowed in DVI mode
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+error_code_t tx_set_general_control_packet
|
|
+(
|
|
+ instance_t instance,
|
|
+ bool enable,
|
|
+ tx_gcp_pkt_data_t *p_gcp_pkt_data
|
|
+)
|
|
+{
|
|
+ error_code_t err;
|
|
+ bsla_mute_t a_mute;
|
|
+
|
|
+ /* Check if instance number is in range */
|
|
+ RETIF((instance < 0) || (instance >= MAX_UNITS), ERR_DLHDMITX_BAD_INSTANCE)
|
|
+
|
|
+ /* Take the sempahore */
|
|
+ RETIF((err = tx_iwsemaphore_p(dl_hdmi_tx_it_semaphore[instance])) != 0, err)
|
|
+
|
|
+ if(enable == true) {
|
|
+ /* Check if GcpPktData pointer is NULL */
|
|
+ RETIF_SEM(dl_hdmi_tx_it_semaphore[instance], p_gcp_pkt_data == NULL, ERR_DLHDMITX_INCONSISTENT_PARAMS)
|
|
+
|
|
+ if(p_gcp_pkt_data->av_mute == false) {
|
|
+ a_mute = HDMITX_AMUTE_OFF;
|
|
+ } else {
|
|
+ a_mute = HDMITX_AMUTE_ON;
|
|
+ }
|
|
+
|
|
+ /* Set contents of general control packet & enable/disable packet insertion */
|
|
+ RETIF_SEM(dl_hdmi_tx_it_semaphore[instance],
|
|
+ (err = bsl_pkt_set_general_cntrl(instance,
|
|
+ &a_mute, enable)) != 0, err)
|
|
+ } else {
|
|
+ RETIF_SEM(dl_hdmi_tx_it_semaphore[instance],
|
|
+ (err = bsl_pkt_set_general_cntrl(instance,
|
|
+ NULL, enable)) != 0, err)
|
|
+ }
|
|
+
|
|
+ /* Release the sempahore */
|
|
+ RETIF((err = tx_iwsemaphore_v(dl_hdmi_tx_it_semaphore[instance])) != 0, err)
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+/******************************************************************************
|
|
+ * \brief Defines the content of ISRC1 packet to be sent by Tx device.
|
|
+ * This function is synchronous.
|
|
+ * This function is not ISR friendly.
|
|
+ *
|
|
+ * \param instance Instance identifier.
|
|
+ * \param enable Enable/disable infoframe insertion.
|
|
+ * \param pIsrc1PktData Pointer to the structure containing GCP packet parameters.
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong
|
|
+ * - ERR_DLHDMITX_INCONSISTENT_PARAMS: an input parameter is
|
|
+ * inconsistent
|
|
+ * - ERR_HDMI_BAD_PARAMETER: a parameter was out of range
|
|
+ * - ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number
|
|
+ * - ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus
|
|
+ * - ERR_HDMI_I2C_READ: failed when reading to the I2C bus
|
|
+ * - ERR_HDMI_NOT_INITIALIZED: transmitter not initialized
|
|
+ * - ERR_HDMI_OPERATION_NOT_PERMITTED: not allowed in DVI mode
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+error_code_t tx_set_isrc1packet
|
|
+(
|
|
+ instance_t instance,
|
|
+ bool enable,
|
|
+ tx_isrc1pkt_data_t *p_isrc1pkt_data
|
|
+)
|
|
+{
|
|
+ error_code_t err;
|
|
+
|
|
+ /* Check if instance number is in range */
|
|
+ RETIF((instance < 0) || (instance >= MAX_UNITS), ERR_DLHDMITX_BAD_INSTANCE)
|
|
+
|
|
+ /* Take the sempahore */
|
|
+ RETIF((err = tx_iwsemaphore_p(dl_hdmi_tx_it_semaphore[instance])) != 0, err)
|
|
+
|
|
+ if(enable == true) {
|
|
+ /* Check if Isrc1PktData pointer is NULL */
|
|
+ RETIF_SEM(dl_hdmi_tx_it_semaphore[instance], p_isrc1pkt_data == NULL, ERR_DLHDMITX_INCONSISTENT_PARAMS)
|
|
+
|
|
+ RETIF_SEM(dl_hdmi_tx_it_semaphore[instance],
|
|
+ (err = bsl_pkt_set_isrc1(instance,
|
|
+ (bsl_pkt_t *)p_isrc1pkt_data->UPC_EAN_ISRC, 16, p_isrc1pkt_data->isrc_cont,
|
|
+ p_isrc1pkt_data->isrc_valid, p_isrc1pkt_data->isrc_status, enable)) != 0, err)
|
|
+ } else {
|
|
+ RETIF_SEM(dl_hdmi_tx_it_semaphore[instance],
|
|
+ (err = bsl_pkt_set_isrc1(instance,
|
|
+ NULL, 0, 0, 0, 0, enable)) != 0, err)
|
|
+ }
|
|
+
|
|
+ /* Release the sempahore */
|
|
+ RETIF((err = tx_iwsemaphore_v(dl_hdmi_tx_it_semaphore[instance])) != 0, err)
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+/******************************************************************************
|
|
+ * \brief Defines the content of ISRC2 packet to be sent by Tx device.
|
|
+ * This function is synchronous.
|
|
+ * This function is not ISR friendly.
|
|
+ *
|
|
+ * \param instance Instance identifier.
|
|
+ * \param enable Enable/disable infoframe insertion.
|
|
+ * \param pIsrc2PktData Pointer to the structure containing GCP packet parameters.
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong
|
|
+ * - ERR_DLHDMITX_INCONSISTENT_PARAMS: an input parameter is
|
|
+ * inconsistent
|
|
+ * - ERR_HDMI_BAD_PARAMETER: a parameter was out of range
|
|
+ * - ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number
|
|
+ * - ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus
|
|
+ * - ERR_HDMI_I2C_READ: failed when reading to the I2C bus
|
|
+ * - ERR_HDMI_NOT_INITIALIZED: transmitter not initialized
|
|
+ * - ERR_HDMI_OPERATION_NOT_PERMITTED: not allowed in DVI mode
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+error_code_t tx_set_isrc2packet
|
|
+(
|
|
+ instance_t instance,
|
|
+ bool enable,
|
|
+ tx_isrc2pkt_data_t *p_isrc2pkt_data
|
|
+)
|
|
+{
|
|
+ error_code_t err;
|
|
+
|
|
+ /* Check if instance number is in range */
|
|
+ RETIF((instance < 0) || (instance >= MAX_UNITS), ERR_DLHDMITX_BAD_INSTANCE)
|
|
+
|
|
+ /* Take the sempahore */
|
|
+ RETIF((err = tx_iwsemaphore_p(dl_hdmi_tx_it_semaphore[instance])) != 0, err)
|
|
+
|
|
+ if(enable == true) {
|
|
+ /* Check if Isrc1PktData pointer is NULL */
|
|
+ RETIF_SEM(dl_hdmi_tx_it_semaphore[instance], p_isrc2pkt_data == NULL, ERR_DLHDMITX_INCONSISTENT_PARAMS)
|
|
+
|
|
+ RETIF_SEM(dl_hdmi_tx_it_semaphore[instance],
|
|
+ (err = bsl_pkt_set_isrc2(instance,
|
|
+ (bsl_pkt_t *)p_isrc2pkt_data->UPC_EAN_ISRC, 16, enable)) != 0, err)
|
|
+ } else {
|
|
+ RETIF_SEM(dl_hdmi_tx_it_semaphore[instance],
|
|
+ (err = bsl_pkt_set_isrc2(instance,
|
|
+ NULL, 0, enable)) != 0, err)
|
|
+ }
|
|
+
|
|
+ /* Release the sempahore */
|
|
+ RETIF((err = tx_iwsemaphore_v(dl_hdmi_tx_it_semaphore[instance])) != 0, err)
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+/******************************************************************************
|
|
+ * \brief Defines the content of MPS infoframe to be sent by Tx device.
|
|
+ * This function is synchronous.
|
|
+ * This function is not ISR friendly.
|
|
+ *
|
|
+ * \param instance Instance identifier.
|
|
+ * \param enable Enable/disable infoframe insertion.
|
|
+ * \param pMpsIfData Pointer to the structure containing MPS infoframe
|
|
+ * parameters.
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong
|
|
+ * - ERR_DLHDMITX_INCONSISTENT_PARAMS: an input parameter is
|
|
+ * inconsistent
|
|
+ * - ERR_HDMI_BAD_PARAMETER: a parameter was out of range
|
|
+ * - ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number
|
|
+ * - ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus
|
|
+ * - ERR_HDMI_I2C_READ: failed when reading to the I2C bus
|
|
+ * - ERR_HDMI_NOT_INITIALIZED: transmitter not initialized
|
|
+ * - ERR_HDMI_OPERATION_NOT_PERMITTED: not allowed in DVI mode
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+error_code_t tx_set_mpsinfoframe
|
|
+(
|
|
+ instance_t instance,
|
|
+ bool enable,
|
|
+ tx_mps_if_data_t *p_mps_if_data
|
|
+)
|
|
+{
|
|
+ error_code_t err;
|
|
+
|
|
+ /* Check if instance number is in range */
|
|
+ RETIF((instance < 0) || (instance >= MAX_UNITS), ERR_DLHDMITX_BAD_INSTANCE)
|
|
+
|
|
+ /* Take the sempahore */
|
|
+ RETIF((err = tx_iwsemaphore_p(dl_hdmi_tx_it_semaphore[instance])) != 0, err)
|
|
+
|
|
+ if(enable == true) {
|
|
+ /* Check if MpsIfData pointer is NULL */
|
|
+ RETIF_SEM(dl_hdmi_tx_it_semaphore[instance], p_mps_if_data == NULL, ERR_DLHDMITX_INCONSISTENT_PARAMS)
|
|
+
|
|
+ RETIF_SEM(dl_hdmi_tx_it_semaphore[instance],
|
|
+ (err = bsl_pkt_set_mpeg_infoframe(instance,
|
|
+ (bsl_pkt_mpeg_t *)p_mps_if_data, enable)) != 0, err)
|
|
+ } else {
|
|
+ RETIF_SEM(dl_hdmi_tx_it_semaphore[instance],
|
|
+ (err = bsl_pkt_set_mpeg_infoframe(instance,
|
|
+ NULL, enable)) != 0, err)
|
|
+ }
|
|
+
|
|
+ /* Release the sempahore */
|
|
+ RETIF((err = tx_iwsemaphore_v(dl_hdmi_tx_it_semaphore[instance])) != 0, err)
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+/******************************************************************************
|
|
+ * \brief Defines the content of SPD infoframe to be sent by Tx device.
|
|
+ * This function is synchronous.
|
|
+ * This function is not ISR friendly.
|
|
+ *
|
|
+ * \param instance Instance identifier.
|
|
+ * \param enable Enable/disable infoframe insertion.
|
|
+ * \param pSpdIfData Pointer to the structure containing SPD infoframe
|
|
+ * parameters.
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong
|
|
+ * - ERR_DLHDMITX_INCONSISTENT_PARAMS: an input parameter is
|
|
+ * inconsistent
|
|
+ * - ERR_HDMI_BAD_PARAMETER: a parameter was out of range
|
|
+ * - ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number
|
|
+ * - ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus
|
|
+ * - ERR_HDMI_I2C_READ: failed when reading to the I2C bus
|
|
+ * - ERR_HDMI_NOT_INITIALIZED: transmitter not initialized
|
|
+ * - ERR_HDMI_OPERATION_NOT_PERMITTED: not allowed in DVI mode
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+error_code_t tx_set_spd_infoframe
|
|
+(
|
|
+ instance_t instance,
|
|
+ bool enable,
|
|
+ tx_spd_if_data_t *p_spd_if_data
|
|
+)
|
|
+{
|
|
+ error_code_t err;
|
|
+
|
|
+ /* Check if instance number is in range */
|
|
+ RETIF((instance < 0) || (instance >= MAX_UNITS), ERR_DLHDMITX_BAD_INSTANCE)
|
|
+
|
|
+ /* Take the sempahore */
|
|
+ RETIF((err = tx_iwsemaphore_p(dl_hdmi_tx_it_semaphore[instance])) != 0, err)
|
|
+
|
|
+ if(enable == true) {
|
|
+ /* Check if SpdIfData pointer is NULL */
|
|
+ RETIF_SEM(dl_hdmi_tx_it_semaphore[instance], p_spd_if_data == NULL, ERR_DLHDMITX_INCONSISTENT_PARAMS)
|
|
+
|
|
+ RETIF_SEM(dl_hdmi_tx_it_semaphore[instance],
|
|
+ (err = bsl_pkt_set_spd_infoframe(instance,
|
|
+ (bsl_pkt_spd_t *)p_spd_if_data, enable)) != 0, err)
|
|
+ } else {
|
|
+ RETIF_SEM(dl_hdmi_tx_it_semaphore[instance],
|
|
+ (err = bsl_pkt_set_spd_infoframe(instance,
|
|
+ NULL, enable)) != 0, err)
|
|
+ }
|
|
+
|
|
+ /* Release the sempahore */
|
|
+ RETIF((err = tx_iwsemaphore_v(dl_hdmi_tx_it_semaphore[instance])) != 0, err)
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+/******************************************************************************
|
|
+ * \brief Defines the content of VS infoframe to be sent by Tx device.
|
|
+ * This function is synchronous.
|
|
+ * This function is not ISR friendly.
|
|
+ *
|
|
+ * \param instance Instance identifier.
|
|
+ * \param enable Enable/disable infoframe insertion.
|
|
+ * \param pVsIfData Pointer to the structure containing VS infoframe
|
|
+ * parameters.
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong
|
|
+ * - ERR_DLHDMITX_INCONSISTENT_PARAMS: an input parameter is
|
|
+ * inconsistent
|
|
+ * - ERR_HDMI_BAD_PARAMETER: a parameter was out of range
|
|
+ * - ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number
|
|
+ * - ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus
|
|
+ * - ERR_HDMI_I2C_READ: failed when reading to the I2C bus
|
|
+ * - ERR_HDMI_NOT_INITIALIZED: transmitter not initialized
|
|
+ * - ERR_HDMI_OPERATION_NOT_PERMITTED: not allowed in DVI mode
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+error_code_t tx_set_vs_infoframe
|
|
+(
|
|
+ instance_t instance,
|
|
+ bool enable,
|
|
+ tx_vs_pkt_data_t *p_vs_if_data
|
|
+)
|
|
+{
|
|
+ error_code_t err;
|
|
+
|
|
+ /* Check if instance number is in range */
|
|
+ RETIF((instance < 0) || (instance >= MAX_UNITS), ERR_DLHDMITX_BAD_INSTANCE)
|
|
+
|
|
+ /* Take the sempahore */
|
|
+ RETIF((err = tx_iwsemaphore_p(dl_hdmi_tx_it_semaphore[instance])) != 0, err)
|
|
+
|
|
+ if(enable == true) {
|
|
+ /* Check if VsIfData pointer is NULL */
|
|
+ RETIF_SEM(dl_hdmi_tx_it_semaphore[instance], p_vs_if_data == NULL, ERR_DLHDMITX_INCONSISTENT_PARAMS)
|
|
+
|
|
+ RETIF_SEM(dl_hdmi_tx_it_semaphore[instance],
|
|
+ (err = bsl_pkt_set_vs_infoframe(instance,
|
|
+ (bsl_pkt_t *)p_vs_if_data->vs_data, 27, p_vs_if_data->version, enable)) != 0, err)
|
|
+ } else {
|
|
+ RETIF_SEM(dl_hdmi_tx_it_semaphore[instance],
|
|
+ (err = bsl_pkt_set_vs_infoframe(instance,
|
|
+ NULL, 0, p_vs_if_data->version, enable)) != 0, err)
|
|
+ }
|
|
+
|
|
+ /* Release the sempahore */
|
|
+ RETIF((err = tx_iwsemaphore_v(dl_hdmi_tx_it_semaphore[instance])) != 0, err)
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+/******************************************************************************
|
|
+ * \brief Enables/disables NULL packet sending (only used for debug purpose).
|
|
+ * This function is synchronous.
|
|
+ * This function is not ISR friendly.
|
|
+ *
|
|
+ * \param instance Instance identifier.
|
|
+ * \param enable Enable/disable packet insertion.
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong
|
|
+ * - ERR_HDMI_BAD_PARAMETER: a parameter was out of range
|
|
+ * - ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number
|
|
+ * - ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus
|
|
+ * - ERR_HDMI_I2C_READ: failed when reading to the I2C bus
|
|
+ * - ERR_HDMI_NOT_INITIALIZED: transmitter not initialized
|
|
+ * - ERR_HDMI_OPERATION_NOT_PERMITTED: not allowed in DVI mode
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+error_code_t tx_debug_set_null_packet
|
|
+(
|
|
+ instance_t instance,
|
|
+ bool enable
|
|
+)
|
|
+{
|
|
+ error_code_t err;
|
|
+
|
|
+ /* Check if instance number is in range */
|
|
+ RETIF((instance < 0) || (instance >= MAX_UNITS), ERR_DLHDMITX_BAD_INSTANCE)
|
|
+
|
|
+ /* Take the sempahore */
|
|
+ RETIF((err = tx_iwsemaphore_p(dl_hdmi_tx_it_semaphore[instance])) != 0, err)
|
|
+
|
|
+ RETIF_SEM(dl_hdmi_tx_it_semaphore[instance],
|
|
+ (err = bsl_pkt_set_null_insert(instance,
|
|
+ enable)) != 0, err)
|
|
+
|
|
+ /* Release the sempahore */
|
|
+ RETIF((err = tx_iwsemaphore_v(dl_hdmi_tx_it_semaphore[instance])) != 0, err)
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+/******************************************************************************
|
|
+ * \brief Send one single NULL packet (only used for debug purpose).
|
|
+ * This function is synchronous.
|
|
+ * This function is not ISR friendly.
|
|
+ *
|
|
+ * \param instance Instance identifier.
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong
|
|
+ * - ERR_HDMI_BAD_PARAMETER: a parameter was out of range
|
|
+ * - ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number
|
|
+ * - ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus
|
|
+ * - ERR_HDMI_I2C_READ: failed when reading to the I2C bus
|
|
+ * - ERR_HDMI_NOT_INITIALIZED: transmitter not initialized
|
|
+ * - ERR_HDMI_OPERATION_NOT_PERMITTED: not allowed in DVI mode
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+error_code_t tx_debug_set_single_null_packet
|
|
+(
|
|
+ instance_t instance
|
|
+)
|
|
+{
|
|
+ error_code_t err;
|
|
+
|
|
+ /* Check if instance number is in range */
|
|
+ RETIF((instance < 0) || (instance >= MAX_UNITS), ERR_DLHDMITX_BAD_INSTANCE)
|
|
+
|
|
+ /* Take the sempahore */
|
|
+ RETIF((err = tx_iwsemaphore_p(dl_hdmi_tx_it_semaphore[instance])) != 0, err)
|
|
+
|
|
+ RETIF_SEM(dl_hdmi_tx_it_semaphore[instance],
|
|
+ (err = bsl_pkt_set_null_single(instance))
|
|
+ != 0, err)
|
|
+
|
|
+ /* Release the sempahore */
|
|
+ RETIF((err = tx_iwsemaphore_v(dl_hdmi_tx_it_semaphore[instance])) != 0, err)
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+/******************************************************************************
|
|
+ * \brief Set the audio output mute status. This function can be used to mute
|
|
+ * audio output, without muting video. This can be typically used when
|
|
+ * reconfiguring the audio HW after a sample rate change.
|
|
+ * This function is synchronous.
|
|
+ * This function is not ISR friendly.
|
|
+ *
|
|
+ * \param instance Instance identifier.
|
|
+ * \param muteStatus Mute status (true/false).
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong
|
|
+ * - ERR_HDMI_BAD_PARAMETER: a parameter was out of range
|
|
+ * - ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number
|
|
+ * - ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus
|
|
+ * - ERR_HDMI_I2C_READ: failed when reading to the I2C bus
|
|
+ * - ERR_HDMI_NOT_INITIALIZED: transmitter not initialized
|
|
+ * - ERR_HDMI_OPERATION_NOT_PERMITTED: not allowed in DVI mode
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+error_code_t tx_set_audio_mute
|
|
+(
|
|
+ instance_t instance,
|
|
+ bool audio_mute
|
|
+)
|
|
+{
|
|
+ error_code_t err;
|
|
+
|
|
+ /* Check if instance number is in range */
|
|
+ RETIF((instance < 0) || (instance >= MAX_UNITS), ERR_DLHDMITX_BAD_INSTANCE)
|
|
+
|
|
+ /* Take the sempahore */
|
|
+ RETIF((err = tx_iwsemaphore_p(dl_hdmi_tx_it_semaphore[instance])) != 0, err)
|
|
+
|
|
+ /* Mute or Un-mute the audio output */
|
|
+ RETIF_SEM(dl_hdmi_tx_it_semaphore[instance],
|
|
+ (err = bsl_audio_out_set_mute(instance,
|
|
+ (bsla_mute_t)audio_mute)) != 0, err)
|
|
+
|
|
+ /* Release the sempahore */
|
|
+ RETIF((err = tx_iwsemaphore_v(dl_hdmi_tx_it_semaphore[instance])) != 0, err)
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+/******************************************************************************
|
|
+ * \brief Reset audio CTS.
|
|
+ * This function is synchronous.
|
|
+ * This function is not ISR friendly.
|
|
+ *
|
|
+ * \param instance Instance identifier.
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong
|
|
+ * - ERR_HDMI_BAD_PARAMETER: a parameter was out of range
|
|
+ * - ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number
|
|
+ * - ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus
|
|
+ * - ERR_HDMI_I2C_READ: failed when reading to the I2C bus
|
|
+ * - ERR_HDMI_NOT_INITIALIZED: transmitter not initialized
|
|
+ * - ERR_HDMI_OPERATION_NOT_PERMITTED: not allowed in DVI mode
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+error_code_t tx_reset_audio_cts
|
|
+(
|
|
+ instance_t instance
|
|
+)
|
|
+{
|
|
+ error_code_t err;
|
|
+
|
|
+ /* Check if instance number is in range */
|
|
+ RETIF((instance < 0) || (instance >= MAX_UNITS), ERR_DLHDMITX_BAD_INSTANCE)
|
|
+
|
|
+ /* Take the sempahore */
|
|
+ RETIF((err = tx_iwsemaphore_p(dl_hdmi_tx_it_semaphore[instance])) != 0, err)
|
|
+
|
|
+ /* Reset the audio Clock Time Stamp generator */
|
|
+ RETIF_SEM(dl_hdmi_tx_it_semaphore[instance],
|
|
+ (err = bsl_audio_in_reset_cts(instance)
|
|
+ ) != 0, err)
|
|
+
|
|
+ /* Release the sempahore */
|
|
+ RETIF((err = tx_iwsemaphore_v(dl_hdmi_tx_it_semaphore[instance])) != 0, err)
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+/******************************************************************************
|
|
+ * \brief Retrieve EDID Status from driver.
|
|
+ * This function is synchronous.
|
|
+ * This function is ISR friendly.
|
|
+ *
|
|
+ * \param instance Instance identifier.
|
|
+ * \param pEdidStatus Pointer to the array that will receive the EDID Status.
|
|
+ * \param pEdidBlkCount Pointer to the integer that will receive the number of
|
|
+ * read EDID block.
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong
|
|
+ * - ERR_DLHDMITX_INCONSISTENT_PARAMS: an input parameter is
|
|
+ * inconsistent
|
|
+ * - ERR_HDMI_BAD_PARAMETER: a parameter was out of range
|
|
+ * - ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number
|
|
+ * - ERR_HDMI_NOT_INITIALIZED: transmitter not initialized
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+error_code_t tx_get_edid_status
|
|
+(
|
|
+ instance_t instance,
|
|
+ tx_edid_status_t *p_edid_status,
|
|
+ u8 *p_edid_blk_count
|
|
+)
|
|
+{
|
|
+ error_code_t err;
|
|
+
|
|
+ /* Check if instance number is in range */
|
|
+ RETIF((instance < 0) || (instance >= MAX_UNITS), ERR_DLHDMITX_BAD_INSTANCE)
|
|
+
|
|
+ /* Check if EdidStatus and pReadBytesNumber pointers are NULL */
|
|
+ RETIF(p_edid_status == NULL, ERR_DLHDMITX_INCONSISTENT_PARAMS)
|
|
+ RETIF(p_edid_blk_count == NULL, ERR_DLHDMITX_INCONSISTENT_PARAMS)
|
|
+
|
|
+ /* Take the sempahore */
|
|
+ RETIF((err = tx_iwsemaphore_p(dl_hdmi_tx_it_semaphore[instance])) != 0, err)
|
|
+
|
|
+ /* Get the EDID status from BSL driver */
|
|
+ *p_edid_status = (tx_edid_status_t)edid_data_status;
|
|
+ *p_edid_blk_count = 0;
|
|
+
|
|
+ if(edid_data_status == DL_HDMITX_EDID_READ) {
|
|
+ /* Get the read EDID block number from BSL driver */
|
|
+ RETIF_SEM(dl_hdmi_tx_it_semaphore[instance],
|
|
+ (err = bsl_edid_get_block_count(instance,
|
|
+ p_edid_blk_count)) != 0, err)
|
|
+
|
|
+ }
|
|
+
|
|
+ /* Release the sempahore */
|
|
+ RETIF((err = tx_iwsemaphore_v(dl_hdmi_tx_it_semaphore[instance])) != 0, err)
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+/******************************************************************************
|
|
+ * \brief Retrieves audio descriptors from receiver's EDID. This function
|
|
+ * parses the EDID of Tx device to get the relevant data.
|
|
+ * This function is synchronous.
|
|
+ * This function is not ISR friendly.
|
|
+ *
|
|
+ * \param instance Instance identifier.
|
|
+ * \param pAudioDescs Pointer to the array that will receive audio
|
|
+ * descriptors.
|
|
+ * \param maxAudioDescs Size of the array.
|
|
+ * \param pWrittenAudioDescs Pointer to the integer that will receive the actual
|
|
+ * number of written descriptors.
|
|
+ * \param pAudioFlags Pointer to the byte to receive Audio Capabilities Flags.
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong
|
|
+ * - ERR_DLHDMITX_INCONSISTENT_PARAMS: an input parameter is
|
|
+ * inconsistent
|
|
+ * - ERR_DLHDMITX_INVALID_STATE: the state is invalid for
|
|
+ * the function
|
|
+ * - ERR_HDMI_BAD_PARAMETER: a parameter was out of range
|
|
+ * - ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number
|
|
+ * - ERR_HDMI_RESOURCE_NOT_AVAILABLE : EDID not read
|
|
+ * - ERR_HDMI_NOT_INITIALIZED: transmitter not initialized
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+error_code_t tx_get_edid_audio_caps
|
|
+(
|
|
+ instance_t instance,
|
|
+ tx_edid_audio_desc_t *p_audio_descs,
|
|
+ uint max_audio_descs,
|
|
+ uint *p_written_audio_descs,
|
|
+ u8 *p_audio_flags
|
|
+)
|
|
+{
|
|
+ error_code_t err;
|
|
+ bsl_edid_sad_t edid_sad[HDMI_TX_SAD_MAX_CNT];
|
|
+ uint i;
|
|
+
|
|
+ /* Check if instance number is in range */
|
|
+ RETIF((instance < 0) || (instance >= MAX_UNITS), ERR_DLHDMITX_BAD_INSTANCE)
|
|
+
|
|
+ /* Check if AudioDescs, WrittenAudioDescs and AudioFlags pointers are NULL */
|
|
+ RETIF(p_audio_descs == NULL, ERR_DLHDMITX_INCONSISTENT_PARAMS)
|
|
+ RETIF(p_written_audio_descs == NULL, ERR_DLHDMITX_INCONSISTENT_PARAMS)
|
|
+ RETIF(p_audio_flags == NULL, ERR_DLHDMITX_INCONSISTENT_PARAMS)
|
|
+
|
|
+ /* Take the sempahore */
|
|
+ RETIF((err = tx_iwsemaphore_p(dl_hdmi_tx_it_semaphore[instance])) != 0, err)
|
|
+
|
|
+ /* Check the current state */
|
|
+ RETIF_SEM(dl_hdmi_tx_it_semaphore[instance],
|
|
+ dl_hdmi_tx_get_state(instance) != STATE_EDID_AVAILABLE, ERR_DLHDMITX_INVALID_STATE)
|
|
+
|
|
+ /* Get video capabilities from EDID, return ERR_DLHDMITX_NO_RESOURCES if EDID are not read */
|
|
+ RETIF_SEM(dl_hdmi_tx_it_semaphore[instance],
|
|
+ (err = bsl_edid_get_audio_capabilities(instance,
|
|
+ edid_sad, max_audio_descs, p_written_audio_descs, p_audio_flags)) != 0, err)
|
|
+
|
|
+ for(i = 0; i < *p_written_audio_descs; i++) {
|
|
+ /* Bits[6:3]: EIA/CEA861 mode */
|
|
+ p_audio_descs[i].format = (edid_sad[i].mode_chans & 0x78) >> 3;
|
|
+ /* Bits[2:0]: channels */
|
|
+ p_audio_descs[i].channels = edid_sad[i].mode_chans & 0x07;
|
|
+ /* Supported frequencies */
|
|
+ p_audio_descs[i].supported_freqs = edid_sad[i].freqs;
|
|
+
|
|
+ if(p_audio_descs[i].format == 1) { /* LPCM format */
|
|
+ p_audio_descs[i].supported_res = edid_sad[i].byte3 & 0x07;
|
|
+ p_audio_descs[i].max_bitrate = 0x00;
|
|
+ } else if((p_audio_descs[i].format >= 2) && /* Compressed format */
|
|
+ (p_audio_descs[i].format <= 8)) {
|
|
+ p_audio_descs[i].supported_res = 0x00;
|
|
+ p_audio_descs[i].max_bitrate = edid_sad[i].byte3;
|
|
+ } else {
|
|
+ p_audio_descs[i].supported_res = 0x00;
|
|
+ p_audio_descs[i].max_bitrate = 0x00;
|
|
+ }
|
|
+ }
|
|
+
|
|
+ /* Release the sempahore */
|
|
+ RETIF((err = tx_iwsemaphore_v(dl_hdmi_tx_it_semaphore[instance])) != 0, err)
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+/******************************************************************************
|
|
+ * \brief Retrieves supported video formats (short descriptors) from
|
|
+ * receiver's EDID. This function parses the EDID of Rx device to get
|
|
+ * the relevant data.
|
|
+ * This function is synchronous.
|
|
+ * This function is not ISR friendly.
|
|
+ *
|
|
+ * \param instance Instance identifier.
|
|
+ * \param pVideoDesc Pointer to the structure that will receive short
|
|
+ * video descriptors.
|
|
+ * \param maxVideoFormats Size of the array.
|
|
+ * \param pWrittenVideoFormats Pointer to the integer that will receive the actual
|
|
+ * number of written descriptors.
|
|
+ * \param pVideoFlags Pointer to the byte to receive Video Capability Flags.
|
|
+ * b7: underscan supported
|
|
+ * b6: YCbCr 4:4:4 supported
|
|
+ * b5: YCbCr 4:2:2 supported
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong
|
|
+ * - ERR_DLHDMITX_INCONSISTENT_PARAMS: an input parameter is
|
|
+ * inconsistent
|
|
+ * - ERR_DLHDMITX_INVALID_STATE: the state is invalid for
|
|
+ * the function
|
|
+ * - ERR_HDMI_BAD_PARAMETER: a parameter was out of range
|
|
+ * - ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number
|
|
+ * - ERR_HDMI_RESOURCE_NOT_AVAILABLE : EDID not read
|
|
+ * - ERR_HDMI_NOT_INITIALIZED: transmitter not initialized
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+error_code_t tx_get_edid_video_caps
|
|
+(
|
|
+ instance_t instance,
|
|
+ tx_short_vid_desc_t *p_video_desc,
|
|
+ uint max_video_formats,
|
|
+ uint *p_written_video_formats,
|
|
+ u8 *p_video_flags
|
|
+)
|
|
+{
|
|
+ error_code_t err;
|
|
+ u8 edid_vfmts_buffer[HDMI_TX_SVD_MAX_CNT];
|
|
+ tx_edid_video_timings_t edid_dtdbuffer[NUMBER_DTD_STORED];
|
|
+ u8 i;
|
|
+ u8 written_dtd = 0;
|
|
+ u8 dtd_counter = 0;
|
|
+
|
|
+ /* Check if instance number is in range */
|
|
+ RETIF((instance < 0) || (instance >= MAX_UNITS), ERR_DLHDMITX_BAD_INSTANCE)
|
|
+
|
|
+ /* Check if Videoformats, WrittenVideoFormats and VideoFlags pointers are NULL */
|
|
+ RETIF(p_video_desc == NULL, ERR_DLHDMITX_INCONSISTENT_PARAMS)
|
|
+ RETIF(p_written_video_formats == NULL, ERR_DLHDMITX_INCONSISTENT_PARAMS)
|
|
+ RETIF(p_video_flags == NULL, ERR_DLHDMITX_INCONSISTENT_PARAMS)
|
|
+ RETIF(max_video_formats == 0, ERR_DLHDMITX_INCONSISTENT_PARAMS)
|
|
+
|
|
+ /* Take the sempahore */
|
|
+ RETIF((err = tx_iwsemaphore_p(dl_hdmi_tx_it_semaphore[instance])) != 0, err)
|
|
+
|
|
+ /* Check the current state */
|
|
+ RETIF_SEM(dl_hdmi_tx_it_semaphore[instance],
|
|
+ dl_hdmi_tx_get_state(instance) != STATE_EDID_AVAILABLE, ERR_DLHDMITX_INVALID_STATE)
|
|
+
|
|
+ /* Get video capabilities from EDID, return ERR_DLHDMITX_NO_RESOURCES if EDID are not read */
|
|
+ RETIF_SEM(dl_hdmi_tx_it_semaphore[instance],
|
|
+ (err = bsl_edid_get_video_capabilities(instance,
|
|
+ edid_vfmts_buffer, HDMI_TX_SVD_MAX_CNT, p_written_video_formats, p_video_flags)) != 0, err)
|
|
+
|
|
+ /* Get detailled descriptors from EDID, return ERR_DLHDMITX_NO_RESOURCES if EDID are not read */
|
|
+ RETIF_SEM(dl_hdmi_tx_it_semaphore[instance],
|
|
+ (err = dl_hdmi_tx_edid_get_dtd(instance, edid_dtdbuffer, NUMBER_DTD_STORED, &written_dtd)) != 0, err)
|
|
+
|
|
+ dtd_counter = 0;
|
|
+ if(written_dtd > 0) {
|
|
+ /* Write first DTD in first position of table video desc */
|
|
+ p_video_desc[0].video_format = dl_hdmi_tx_convert_dtdto_cea(&(edid_dtdbuffer[dtd_counter]));
|
|
+ dtd_counter++;
|
|
+
|
|
+ p_video_desc[0].native_video_format = false;
|
|
+ }
|
|
+
|
|
+ /* Start with i = 1 keep the first position for the first DTD */
|
|
+ for(i = dtd_counter; i < max_video_formats ; i++) {
|
|
+ if((i < (HDMI_TX_SVD_MAX_CNT + dtd_counter)) && (i < ((*p_written_video_formats) + dtd_counter))) {
|
|
+ /* Store SVD */
|
|
+ p_video_desc[i].video_format = (tx_vid_fmt_t)((int)edid_vfmts_buffer[i - dtd_counter] & 0x7F);
|
|
+ /* if bit 7 is true, it means that is a preferred video format */
|
|
+ if((edid_vfmts_buffer[i] & 0x80) == 0x80) {
|
|
+ p_video_desc[i].native_video_format = true;
|
|
+ } else {
|
|
+ p_video_desc[i].native_video_format = false;
|
|
+ }
|
|
+ } else {
|
|
+ if((dtd_counter < NUMBER_DTD_STORED) && (dtd_counter < written_dtd)) {
|
|
+ /* Store DTD except first DTD */
|
|
+ p_video_desc[i].video_format = dl_hdmi_tx_convert_dtdto_cea(&(edid_dtdbuffer[dtd_counter]));
|
|
+ dtd_counter++;
|
|
+
|
|
+ p_video_desc[i].native_video_format = false;
|
|
+ } else {
|
|
+ /* VGA is always supported */
|
|
+ p_video_desc[i].video_format = dl_hdmitx_vfmt_01_640x480p_60hz;
|
|
+ p_video_desc[i].native_video_format = false;
|
|
+ /* Last format supported exit from loop for */
|
|
+ break;
|
|
+ }
|
|
+ }
|
|
+ }
|
|
+
|
|
+ /* + 1 for VGA format */
|
|
+ *p_written_video_formats = *p_written_video_formats + dtd_counter + 1;
|
|
+
|
|
+ /* Release the sempahore */
|
|
+ RETIF((err = tx_iwsemaphore_v(dl_hdmi_tx_it_semaphore[instance])) != 0, err)
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+/******************************************************************************
|
|
+ * \brief Retrieves supported video formats (short descriptors) from
|
|
+ * receiver's EDID. This function parses the EDID of Rx device to get
|
|
+ * the relevant data.
|
|
+ * This function is synchronous.
|
|
+ * This function is not ISR friendly.
|
|
+ *
|
|
+ * \param instance Instance identifier.
|
|
+ * \param pPreferredVideoFormat Pointer to the array that will receive video
|
|
+ * timing descriptor.
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong
|
|
+ * - ERR_DLHDMITX_INCONSISTENT_PARAMS: an input parameter is
|
|
+ * inconsistent
|
|
+ * - ERR_DLHDMITX_INVALID_STATE: the state is invalid for
|
|
+ * the function
|
|
+ * - ERR_HDMI_BAD_PARAMETER: a parameter was out of range
|
|
+ * - ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number
|
|
+ * - ERR_HDMI_RESOURCE_NOT_AVAILABLE : EDID not read
|
|
+ * - ERR_HDMI_NOT_INITIALIZED: transmitter not initialized
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+error_code_t tx_get_edid_video_preferred
|
|
+(
|
|
+ instance_t instance,
|
|
+ tx_edid_video_timings_t *p_preferred_video_format
|
|
+)
|
|
+{
|
|
+ error_code_t err;
|
|
+
|
|
+ /* Check if instance number is in range */
|
|
+ RETIF((instance < 0) || (instance >= MAX_UNITS), ERR_DLHDMITX_BAD_INSTANCE)
|
|
+
|
|
+ /* Check if PreferredVideoFormat pointer is NULL */
|
|
+ RETIF(p_preferred_video_format == NULL, ERR_DLHDMITX_INCONSISTENT_PARAMS)
|
|
+
|
|
+ /* Take the sempahore */
|
|
+ RETIF((err = tx_iwsemaphore_p(dl_hdmi_tx_it_semaphore[instance])) != 0, err)
|
|
+
|
|
+ /* Check the current state */
|
|
+ RETIF_SEM(dl_hdmi_tx_it_semaphore[instance],
|
|
+ dl_hdmi_tx_get_state(instance) != STATE_EDID_AVAILABLE, ERR_DLHDMITX_INVALID_STATE)
|
|
+
|
|
+ /* Get preferred video format from EDID, return ERR_DLHDMITX_NO_RESOURCES if EDID are not read */
|
|
+ RETIF_SEM(dl_hdmi_tx_it_semaphore[instance],
|
|
+ (err = bsl_edid_get_video_preferred(instance,
|
|
+ (bsl_edid_dtd_t *)p_preferred_video_format)) != 0, err)
|
|
+
|
|
+ /* Release the sempahore */
|
|
+ RETIF((err = tx_iwsemaphore_v(dl_hdmi_tx_it_semaphore[instance])) != 0, err)
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+/*****************************************************************************/
|
|
+/**
|
|
+ * \brief Retrieves supported detailled video descriptors from
|
|
+ * receiver's EDID. This function parses the EDID of Rx device to get
|
|
+ * the relevant data.
|
|
+ * This function is synchronous.
|
|
+ * This function is not ISR friendly.
|
|
+ *
|
|
+ * \param instance Instance identifier.
|
|
+ * \param pDTDescriptors Pointer to the array that will receive detailled
|
|
+ * timing descriptors.
|
|
+ * \param maxDTDesc Size of the array.
|
|
+ * \param pWrittenDesc Pointer to the integer that will receive the actual
|
|
+ * number of written descriptors.
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong
|
|
+ * - ERR_DLHDMITX_INCONSISTENT_PARAMS: an input parameter is
|
|
+ * inconsistent
|
|
+ * - ERR_DLHDMITX_INVALID_STATE: the state is invalid for
|
|
+ * the function
|
|
+ * - ERR_HDMI_BAD_PARAMETER: a parameter was out of range
|
|
+ * - ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number
|
|
+ * - ERR_HDMI_RESOURCE_NOT_AVAILABLE : EDID not read
|
|
+ * - ERR_HDMI_NOT_INITIALIZED: transmitter not initialized
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+error_code_t tx_get_edid_detailled_timing_descriptors
|
|
+(
|
|
+ instance_t instance,
|
|
+ tx_edid_video_timings_t *p_dtdescriptors,
|
|
+ u8 max_dtdesc,
|
|
+ u8 *p_written_dtdesc
|
|
+)
|
|
+{
|
|
+ error_code_t err;
|
|
+
|
|
+ /* Check if instance number is in range */
|
|
+ RETIF((instance < 0) || (instance >= MAX_UNITS), ERR_DLHDMITX_BAD_INSTANCE)
|
|
+
|
|
+ /* Check if DTDescriptors, WrittenDTDesc pointers are NULL */
|
|
+ RETIF(p_dtdescriptors == NULL, ERR_DLHDMITX_INCONSISTENT_PARAMS)
|
|
+ RETIF(p_written_dtdesc == NULL, ERR_DLHDMITX_INCONSISTENT_PARAMS)
|
|
+
|
|
+ /* Take the sempahore */
|
|
+ RETIF((err = tx_iwsemaphore_p(dl_hdmi_tx_it_semaphore[instance])) != 0, err)
|
|
+
|
|
+ /* Check the current state */
|
|
+ RETIF_SEM(dl_hdmi_tx_it_semaphore[instance],
|
|
+ dl_hdmi_tx_get_state(instance) != STATE_EDID_AVAILABLE, ERR_DLHDMITX_INVALID_STATE)
|
|
+
|
|
+ /* Get detailled descriptors from EDID, return ERR_DLHDMITX_NO_RESOURCES if EDID are not read */
|
|
+ RETIF_SEM(dl_hdmi_tx_it_semaphore[instance],
|
|
+ (err = bsl_edid_get_detailed_timing_descriptors(instance,
|
|
+ (bsl_edid_dtd_t *)p_dtdescriptors, max_dtdesc, p_written_dtdesc)) != 0, err)
|
|
+
|
|
+ /* Release the sempahore */
|
|
+ RETIF((err = tx_iwsemaphore_v(dl_hdmi_tx_it_semaphore[instance])) != 0, err)
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+/*****************************************************************************/
|
|
+/**
|
|
+ * \brief Retrieves supported monitor descriptor from receiver's EDID.
|
|
+ * This function parses the EDID of Rx device to get
|
|
+ * the relevant data.
|
|
+ * This function is synchronous.
|
|
+ * This function is not ISR friendly.
|
|
+ *
|
|
+ * \param instance Instance identifier.
|
|
+ * \param pEdidFirstMD Pointer to the array that will receive the first monitor
|
|
+ * descriptors.
|
|
+ * \param pEdidSecondMD Pointer to the array that will receive the second monitor
|
|
+ * descriptors.
|
|
+ * \param pEdidOtherMD Pointer to the array that will receive the other monitor
|
|
+ * descriptors.
|
|
+ * \param maxOtherMD Size of the array.
|
|
+ * \param pWrittenOtherMD Pointer to the integer that will receive the actual
|
|
+ * number of written descriptors.
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong
|
|
+ * - ERR_DLHDMITX_INCONSISTENT_PARAMS: an input parameter is
|
|
+ * inconsistent
|
|
+ * - ERR_DLHDMITX_INVALID_STATE: the state is invalid for
|
|
+ * the function
|
|
+ * - ERR_HDMI_BAD_PARAMETER: a parameter was out of range
|
|
+ * - ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number
|
|
+ * - ERR_HDMI_RESOURCE_NOT_AVAILABLE : EDID not read
|
|
+ * - ERR_HDMI_NOT_INITIALIZED: transmitter not initialized
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+error_code_t tx_get_monitor_descriptors
|
|
+(
|
|
+ instance_t instance,
|
|
+ tx_edid_first_md_t *p_edid_first_md,
|
|
+ tx_edid_second_md_t *p_edid_second_md,
|
|
+ tx_edid_other_md_t *p_edid_other_md,
|
|
+ u8 max_other_md,
|
|
+ u8 *p_written_other_md
|
|
+)
|
|
+{
|
|
+#ifdef IMPLEMENTED_IN_BSL
|
|
+
|
|
+ error_code_t err;
|
|
+
|
|
+ /* Check if instance number is in range */
|
|
+ RETIF((instance < 0) || (instance >= MAX_UNITS), ERR_DLHDMITX_BAD_INSTANCE)
|
|
+
|
|
+ /* Check if DTDescriptors, WrittenDTDesc pointers are NULL */
|
|
+ RETIF(p_edid_first_md == NULL, ERR_DLHDMITX_INCONSISTENT_PARAMS)
|
|
+ RETIF(p_edid_second_md == NULL, ERR_DLHDMITX_INCONSISTENT_PARAMS)
|
|
+ RETIF(p_edid_other_md == NULL, ERR_DLHDMITX_INCONSISTENT_PARAMS)
|
|
+
|
|
+ /* Take the sempahore */
|
|
+ RETIF((err = tx_iwsemaphore_p(dl_hdmi_tx_it_semaphore[instance])) != 0, err)
|
|
+
|
|
+ /* Check the current state */
|
|
+ RETIF_SEM(dl_hdmi_tx_it_semaphore[instance],
|
|
+ dl_hdmi_tx_get_state(instance) != STATE_EDID_AVAILABLE, ERR_DLHDMITX_INVALID_STATE)
|
|
+
|
|
+ /* Get monitor descriptors from EDID, return ERR_DLHDMITX_NO_RESOURCES if EDID are not read */
|
|
+ RETIF_SEM(dl_hdmi_tx_it_semaphore[instance],
|
|
+ (err = bsl_edid_get_monitor_descriptors(instance,
|
|
+ (bsl_edid_first_md_t *)p_edid_first_md, (bsl_edid_second_md_t *)p_edid_second_md,
|
|
+ (bsl_edid_other_md_t *)p_edid_other_md, max_other_md, p_written_other_md)) != 0, err)
|
|
+
|
|
+ /* Release the sempahore */
|
|
+ RETIF((err = tx_iwsemaphore_v(dl_hdmi_tx_it_semaphore[instance])) != 0, err)
|
|
+
|
|
+ return 0;
|
|
+
|
|
+#else /* IMPLEMENTED_IN_BSL */
|
|
+
|
|
+ g_no_warning = (u8)instance;
|
|
+ if(p_edid_first_md) g_no_warning = 0;
|
|
+ if(p_edid_second_md) g_no_warning = 0;
|
|
+ if(p_edid_other_md) g_no_warning = 0;
|
|
+ g_no_warning = (u8)max_other_md;
|
|
+ if(p_written_other_md) g_no_warning = 0;
|
|
+
|
|
+ return ERR_DLHDMITX_NOT_SUPPORTED;
|
|
+
|
|
+#endif /* IMPLEMENTED_IN_BSL */
|
|
+
|
|
+}
|
|
+
|
|
+/******************************************************************************
|
|
+ * \brief Retrieves the sink type from receiver's EDID (HDMI or DVI). This
|
|
+ * function parses the EDID of Rx device to get the relevant data.
|
|
+ * This function is synchronous.
|
|
+ * This function is not ISR friendly.
|
|
+ *
|
|
+ * \param instance Instance identifier.
|
|
+ * \param pSinkType Pointer to the array that will receive sink type.
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong
|
|
+ * - ERR_DLHDMITX_INCONSISTENT_PARAMS: an input parameter is
|
|
+ * inconsistent
|
|
+ * - ERR_DLHDMITX_INVALID_STATE: the state is invalid for
|
|
+ * the function
|
|
+ * - ERR_HDMI_BAD_PARAMETER: a parameter was out of range
|
|
+ * - ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number
|
|
+ * - ERR_HDMI_RESOURCE_NOT_AVAILABLE : EDID not read
|
|
+ * - ERR_HDMI_NOT_INITIALIZED: transmitter not initialized
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+error_code_t tx_get_edid_sink_type
|
|
+(
|
|
+ instance_t instance,
|
|
+ tx_sink_type_t *p_sink_type
|
|
+)
|
|
+{
|
|
+ error_code_t err;
|
|
+
|
|
+ /* Check if instance number is in range */
|
|
+ RETIF((instance < 0) || (instance >= MAX_UNITS), ERR_DLHDMITX_BAD_INSTANCE)
|
|
+
|
|
+ /* Check if SinkType pointer is NULL */
|
|
+ RETIF(p_sink_type == NULL, ERR_DLHDMITX_INCONSISTENT_PARAMS)
|
|
+
|
|
+ /* Take the sempahore */
|
|
+ RETIF((err = tx_iwsemaphore_p(dl_hdmi_tx_it_semaphore[instance])) != 0, err)
|
|
+
|
|
+ /* Check the current state */
|
|
+ RETIF_SEM(dl_hdmi_tx_it_semaphore[instance],
|
|
+ dl_hdmi_tx_get_state(instance) != STATE_EDID_AVAILABLE, ERR_DLHDMITX_INVALID_STATE)
|
|
+
|
|
+ /* Read the source address from EDID, return ERR_DLHDMITX_NO_RESOURCES if EDID are not read */
|
|
+ RETIF_SEM(dl_hdmi_tx_it_semaphore[instance],
|
|
+ (err = bsl_edid_get_sink_type(instance,
|
|
+ (bsl_sink_type_t *)p_sink_type)) != 0, err)
|
|
+
|
|
+ /* Release the sempahore */
|
|
+ RETIF((err = tx_iwsemaphore_v(dl_hdmi_tx_it_semaphore[instance])) != 0, err)
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+/******************************************************************************
|
|
+ * \brief Retrieves source address from receivers's EDID. This
|
|
+ * function parses the EDID of Rx device to get the relevant data.
|
|
+ * This function is synchronous.
|
|
+ * This function is not ISR friendly.
|
|
+ *
|
|
+ * \param instance Instance identifier.
|
|
+ * \param pSourceAddress Pointer to the integer that will receive the EDID source
|
|
+ * address.
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong
|
|
+ * - ERR_DLHDMITX_INCONSISTENT_PARAMS: an input parameter is
|
|
+ * inconsistent
|
|
+ * - ERR_DLHDMITX_INVALID_STATE: the state is invalid for
|
|
+ * the function
|
|
+ * - ERR_HDMI_BAD_PARAMETER: a parameter was out of range
|
|
+ * - ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number
|
|
+ * - ERR_HDMI_RESOURCE_NOT_AVAILABLE : EDID not read
|
|
+ * - ERR_HDMI_NOT_INITIALIZED: transmitter not initialized
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+error_code_t tx_get_edid_source_address
|
|
+(
|
|
+ instance_t instance,
|
|
+ u16 *p_source_address
|
|
+)
|
|
+{
|
|
+ error_code_t err;
|
|
+
|
|
+ /* Check if instance number is in range */
|
|
+ RETIF((instance < 0) || (instance >= MAX_UNITS), ERR_DLHDMITX_BAD_INSTANCE)
|
|
+
|
|
+ /* Check if SourceAddress pointer is NULL */
|
|
+ RETIF(p_source_address == NULL, ERR_DLHDMITX_INCONSISTENT_PARAMS)
|
|
+
|
|
+ /* Take the sempahore */
|
|
+ RETIF((err = tx_iwsemaphore_p(dl_hdmi_tx_it_semaphore[instance])) != 0, err)
|
|
+
|
|
+ /* Check the current state */
|
|
+ RETIF_SEM(dl_hdmi_tx_it_semaphore[instance],
|
|
+ dl_hdmi_tx_get_state(instance) != STATE_EDID_AVAILABLE, ERR_DLHDMITX_INVALID_STATE)
|
|
+
|
|
+ /* Read the source address from EDID, return ERR_DLHDMITX_NO_RESOURCES if EDID are not read */
|
|
+ RETIF_SEM(dl_hdmi_tx_it_semaphore[instance],
|
|
+ (err = bsl_edid_get_source_address(instance,
|
|
+ p_source_address)) != 0, err)
|
|
+
|
|
+ /* Release the sempahore */
|
|
+ RETIF((err = tx_iwsemaphore_v(dl_hdmi_tx_it_semaphore[instance])) != 0, err)
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+/******************************************************************************
|
|
+ * \brief Retreives KSV list received by Tx device.
|
|
+ * This function is synchronous.
|
|
+ * This function is not ISR friendly.
|
|
+ *
|
|
+ * \param instance Instance identifier.
|
|
+ * \param pKsv Pointer to the array that will receive the KSV list.
|
|
+ * \param maxKsv Maximum number of KSV that the array can store.
|
|
+ * \param pWrittenKsv Actual number of KSV written into the array.
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong
|
|
+ * - ERR_DLHDMITX_INCONSISTENT_PARAMS: an input parameter is
|
|
+ * inconsistent
|
|
+ * - ERR_DLHDMITX_INVALID_STATE: the state is invalid for
|
|
+ * the function
|
|
+ * - ERR_DLHDMITX_NOT_SUPPORTED: device does not support HDCP
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+error_code_t tx_get_ksv_list
|
|
+(
|
|
+ instance_t instance,
|
|
+ u8 *p_ksv,
|
|
+ u8 max_ksv,
|
|
+ u8 *p_written_ksv,
|
|
+ u8 *p_depth,
|
|
+ bool *p_max_casc_exd,
|
|
+ bool *p_max_devs_exd
|
|
+)
|
|
+{
|
|
+
|
|
+ error_code_t err;
|
|
+
|
|
+ /* Check if instance number is in range */
|
|
+ RETIF((instance < 0) || (instance >= MAX_UNITS), ERR_DLHDMITX_BAD_INSTANCE)
|
|
+
|
|
+ /* Check if pDepth, Ksv and WrittenKsv pointers are NULL */
|
|
+ RETIF(p_ksv == NULL, ERR_DLHDMITX_INCONSISTENT_PARAMS)
|
|
+ RETIF(p_written_ksv == NULL, ERR_DLHDMITX_INCONSISTENT_PARAMS)
|
|
+ RETIF(p_depth == NULL, ERR_DLHDMITX_INCONSISTENT_PARAMS)
|
|
+ RETIF(p_max_casc_exd == NULL, ERR_DLHDMITX_INCONSISTENT_PARAMS)
|
|
+ RETIF(p_max_devs_exd == NULL, ERR_DLHDMITX_INCONSISTENT_PARAMS)
|
|
+
|
|
+ /* Maximum Ksv is HDMITX_KSV_LIST_MAX_DEVICES, 128 devices */
|
|
+ RETIF_BADPARAM(max_ksv > HDMITX_KSV_LIST_MAX_DEVICES)
|
|
+
|
|
+ /* Take the sempahore */
|
|
+ RETIF((err = tx_iwsemaphore_p(dl_hdmi_tx_it_semaphore[instance])) != 0, err)
|
|
+
|
|
+ /* Check the current state */
|
|
+ RETIF_SEM(dl_hdmi_tx_it_semaphore[instance],
|
|
+ dl_hdmi_tx_get_state(instance) != STATE_EDID_AVAILABLE, ERR_DLHDMITX_INVALID_STATE)
|
|
+
|
|
+ /* Make sure that *pWrittenKsv is 0 */
|
|
+ *p_written_ksv = 0;
|
|
+
|
|
+ /* Make sure that *pDepth is 0 */
|
|
+ *p_depth = 0;
|
|
+
|
|
+ /* Release the sempahore */
|
|
+ RETIF((err = tx_iwsemaphore_v(dl_hdmi_tx_it_semaphore[instance])) != 0, err)
|
|
+
|
|
+ return ERR_DLHDMITX_NOT_SUPPORTED;
|
|
+
|
|
+}
|
|
+
|
|
+/******************************************************************************
|
|
+ * \brief Enable/Disable HDCP encryption.
|
|
+ * This function is synchronous.
|
|
+ * This function is not ISR friendly.
|
|
+ *
|
|
+ * \param instance Instance identifier.
|
|
+ * \param hdcpEnable HDCP On/Off (true = On, false = Off).
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong
|
|
+ * - ERR_DLHDMITX_INVALID_STATE: the state is invalid for
|
|
+ * the function
|
|
+ * - ERR_DLHDMITX_RESOLUTION_UNKNOWN: the resolution is unknown
|
|
+ * - ERR_DLHDMITX_NOT_SUPPORTED: device does not support HDCP
|
|
+ * - ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number
|
|
+ * - ERR_HDMI_BAD_PARAMETER: a parameter was out of range
|
|
+ * - ERR_HDMI_NOT_INITIALIZED: transmitter not initialized
|
|
+ * - ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus
|
|
+ * - ERR_HDMI_I2C_READ: failed when reading the I2C bus
|
|
+ * - ERR_HDMI_BAD_PARAMETER: a parameter was out of range
|
|
+ * - ERR_HDMI_NOT_SUPPORTED: device does not support HDCP
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+error_code_t tx_set_hdcp
|
|
+(
|
|
+ instance_t instance,
|
|
+ bool hdcp_enable
|
|
+)
|
|
+{
|
|
+ error_code_t err;
|
|
+ bsl_rx_sense_t rx_sense_status; /* Rx Sense status */
|
|
+ bsl_hot_plug_t hpd_status; /* HPD status */
|
|
+
|
|
+ /* Check if instance number is in range */
|
|
+ RETIF((instance < 0) || (instance >= MAX_UNITS), ERR_DLHDMITX_BAD_INSTANCE)
|
|
+
|
|
+ /* Take the sempahore */
|
|
+ RETIF((err = tx_iwsemaphore_p(dl_hdmi_tx_it_semaphore[instance])) != 0, err)
|
|
+
|
|
+ /* Check the current state */
|
|
+ RETIF_SEM(dl_hdmi_tx_it_semaphore[instance],
|
|
+ dl_hdmi_tx_get_state(instance) != STATE_EDID_AVAILABLE, ERR_DLHDMITX_INVALID_STATE)
|
|
+
|
|
+ /* Hdcp is not supported if keySeed is null */
|
|
+ RETIF_SEM(dl_hdmi_tx_it_semaphore[instance],
|
|
+ gtx_driver_config_table[instance].key_seed == HDCP_SEED_NULL, ERR_DLHDMITX_NOT_SUPPORTED)
|
|
+
|
|
+ /* Read rxSenseStatus and hpdStatus to authorize HDCP only if active */
|
|
+#ifdef TMFL_RX_SENSE_ON
|
|
+ RETIF_SEM(dl_hdmi_tx_it_semaphore[instance],
|
|
+ (err = bsl_rx_sense_get_status(instance,
|
|
+ &rx_sense_status)) != 0, err)
|
|
+#else
|
|
+ rx_sense_status = HDMITX_RX_SENSE_ACTIVE;
|
|
+#endif
|
|
+
|
|
+ RETIF_SEM(dl_hdmi_tx_it_semaphore[instance],
|
|
+ (err = bsl_hot_plug_get_status(instance,
|
|
+ &hpd_status)) != 0, err)
|
|
+
|
|
+ /* Release the sempahore */
|
|
+ RETIF((err = tx_iwsemaphore_v(dl_hdmi_tx_it_semaphore[instance])) != 0, err)
|
|
+
|
|
+ return ERR_DLHDMITX_NOT_SUPPORTED;
|
|
+}
|
|
+
|
|
+/******************************************************************************
|
|
+ * \brief Get the driver HDCP state.
|
|
+ * This function is synchronous.
|
|
+ * This function is not ISR friendly.
|
|
+ *
|
|
+ * \param instance Instance identifier.
|
|
+ * \param pHdcpCheckState Pointer to the integer that will receive the HDCP check state.
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong
|
|
+ * - ERR_DLHDMITX_INCONSISTENT_PARAMS: an input parameter is
|
|
+ * inconsistent
|
|
+ * - ERR_DLHDMITX_NOT_SUPPORTED: device does not support HDCP
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+error_code_t tx_get_hdcp_state
|
|
+(
|
|
+ instance_t instance,
|
|
+ tx_hdcp_check_t *p_hdcp_check_state
|
|
+)
|
|
+{
|
|
+ error_code_t err;
|
|
+
|
|
+ /* Check if instance number is in range */
|
|
+ RETIF((instance < 0) || (instance >= MAX_UNITS), ERR_DLHDMITX_BAD_INSTANCE)
|
|
+
|
|
+ /* Take the sempahore */
|
|
+ RETIF((err = tx_iwsemaphore_p(dl_hdmi_tx_it_semaphore[instance])) != 0, err)
|
|
+
|
|
+ /* Check if HdcpCheckState pointer is NULL */
|
|
+ RETIF_SEM(dl_hdmi_tx_it_semaphore[instance], p_hdcp_check_state == NULL, ERR_DLHDMITX_INCONSISTENT_PARAMS)
|
|
+
|
|
+ *p_hdcp_check_state = DL_HDMITX_HDCP_CHECK_NOT_STARTED;
|
|
+
|
|
+ /* Release the sempahore */
|
|
+ RETIF((err = tx_iwsemaphore_v(dl_hdmi_tx_it_semaphore[instance])) != 0, err)
|
|
+
|
|
+ return ERR_DLHDMITX_NOT_SUPPORTED;
|
|
+}
|
|
+
|
|
+/******************************************************************************
|
|
+ * \brief Check the result of an HDCP encryption attempt, called at
|
|
+ * intervals (set by timeSinceLastCall) after txSetHdcp(true).
|
|
+ * This API must be used only in case of No Operating System. if OS,
|
|
+ * this is manage internally of this device library.
|
|
+ * This function is synchronous.
|
|
+ * This function is not ISR friendly.
|
|
+ *
|
|
+ * \param instance Instance identifier.
|
|
+ * \param timeSinceLastCall Time passed in milliseconds since last call,
|
|
+ * must be shorter than 600 ms.
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong
|
|
+ * - ERR_DLHDMITX_NOT_SUPPORTED: device does not support HDCP
|
|
+ * - ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number
|
|
+ * - ERR_HDMI_BAD_PARAMETER: a parameter was out of range
|
|
+ * - ERR_HDMI_NOT_INITIALIZED: transmitter not initialized
|
|
+ * - ERR_HDMI_I2C_READ: failed when reading the I2C bus
|
|
+ * - ERR_HDMI_I2C_WRITE: failed when writing the I2C bus
|
|
+ * - ERR_HDMI_NOT_SUPPORTED: device does not support HDCP
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+error_code_t tx_hdcp_check
|
|
+(
|
|
+ instance_t instance,
|
|
+ u16 time_since_last_call
|
|
+)
|
|
+{
|
|
+ error_code_t err;
|
|
+ bsl_hw_feature_t feature_supported;
|
|
+
|
|
+ /* Check if instance number is in range */
|
|
+ RETIF((instance < 0) || (instance >= MAX_UNITS), ERR_DLHDMITX_BAD_INSTANCE)
|
|
+
|
|
+ /* Take the sempahore */
|
|
+ RETIF((err = tx_iwsemaphore_p(dl_hdmi_tx_it_semaphore[instance])) != 0, err)
|
|
+
|
|
+ RETIF_SEM(dl_hdmi_tx_it_semaphore[instance],
|
|
+ (err = bsl_hw_get_capabilities(instance, &feature_supported)) != 0, err)
|
|
+
|
|
+ /* Release the sempahore */
|
|
+ RETIF((err = tx_iwsemaphore_v(dl_hdmi_tx_it_semaphore[instance])) != 0, err)
|
|
+
|
|
+ return ERR_DLHDMITX_NOT_SUPPORTED;
|
|
+}
|
|
+
|
|
+/******************************************************************************
|
|
+ * \brief This function loads a gamut metadata packet into the HW. HW will
|
|
+ * actually send it at the beginning of next VS, during the vertical
|
|
+ * blanking.
|
|
+ * This function is synchronous.
|
|
+ * This function is not ISR friendly.
|
|
+ *
|
|
+ * \param instance Instance identifier.
|
|
+ * \param enable Enable/disable gamut metadata packet insertion.
|
|
+ * \param pGamutData Pointer to the structure containing gamut metadata
|
|
+ * parameters.
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong
|
|
+ * - ERR_DLHDMITX_INVALID_STATE: the state is invalid for
|
|
+ * the function
|
|
+ * - ERR_DLHDMITX_INCONSISTENT_PARAMS: an input parameter is
|
|
+ * inconsistent
|
|
+ * - ERR_HDMI_BAD_PARAMETER: a parameter was out of range
|
|
+ * - ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number
|
|
+ * - ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus
|
|
+ * - ERR_HDMI_I2C_READ: failed when reading to the I2C bus
|
|
+ * - ERR_HDMI_NOT_INITIALIZED: transmitter not initialized
|
|
+ * - ERR_HDMI_OPERATION_NOT_PERMITTED: not allowed in DVI mode
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+error_code_t tx_set_gamut_packet
|
|
+(
|
|
+ instance_t instance,
|
|
+ bool enable,
|
|
+ tx_gamut_data_t *p_gamut_data
|
|
+)
|
|
+{
|
|
+ /* Not supported for TDA9983 */
|
|
+
|
|
+ g_no_warning = (u8)instance;
|
|
+ g_no_warning = (u8)enable;
|
|
+ if(p_gamut_data) g_no_warning = 0;
|
|
+
|
|
+ return ERR_DLHDMITX_NOT_SUPPORTED;
|
|
+
|
|
+}
|
|
+
|
|
+/******************************************************************************
|
|
+ *
|
|
+ * \brief This function set the revocation list use for HDCP
|
|
+ *
|
|
+ * This function is synchronous.
|
|
+ *
|
|
+ * This function is not ISR friendly.
|
|
+ *
|
|
+ * \param instance Instance identifier.
|
|
+ *
|
|
+ * \param listPtr Pointer on revocation list provide by application.
|
|
+ *
|
|
+ * \param length length of revocation list.
|
|
+ *
|
|
+ * \return The call result:
|
|
+ *
|
|
+ * - 0: the call was successful
|
|
+ *
|
|
+ * - ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or
|
|
+ *
|
|
+ * out of range
|
|
+ *
|
|
+ * - ERR_DLHDMITX_BAD_HANDLE: the handle number is wrong
|
|
+ *
|
|
+ * - ERR_DLHDMITX_INCONSISTENT_PARAMS: an input parameter is
|
|
+ *
|
|
+ * inconsistent
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+
|
|
+error_code_t tx_set_hdcprevocation_list(
|
|
+
|
|
+ instance_t instance,
|
|
+
|
|
+ void *list_ptr,
|
|
+
|
|
+ u32 length
|
|
+
|
|
+)
|
|
+
|
|
+{
|
|
+
|
|
+ error_code_t err;
|
|
+
|
|
+ /* Check if instance number is in range */
|
|
+
|
|
+ RETIF((instance < 0) || (instance >= MAX_UNITS), ERR_DLHDMITX_BAD_INSTANCE)
|
|
+
|
|
+ /* Check parameters */
|
|
+
|
|
+ RETIF((list_ptr == NULL) || (length == 0), ERR_DLHDMITX_INCONSISTENT_PARAMS)
|
|
+
|
|
+ /* Take the sempahore */
|
|
+
|
|
+ RETIF((err = tx_iwsemaphore_p(dl_hdmi_tx_it_semaphore[instance])) != 0, err)
|
|
+
|
|
+ unit_table_tx[instance].revocation_list.p_list = list_ptr;
|
|
+
|
|
+ unit_table_tx[instance].revocation_list.length = length;
|
|
+
|
|
+ /* Release the sempahore */
|
|
+
|
|
+ RETIF((err = tx_iwsemaphore_v(dl_hdmi_tx_it_semaphore[instance])) != 0, err)
|
|
+
|
|
+ return 0;
|
|
+
|
|
+}
|
|
+
|
|
+/*============================================================================*/
|
|
+/* INTERNAL FUNCTION */
|
|
+/*============================================================================*/
|
|
+
|
|
+/******************************************************************************
|
|
+ * \brief Get the REFPIX and REFLINE for output and scaler
|
|
+ * for the current settings.
|
|
+ *
|
|
+ * \param vinFmt Video input format.
|
|
+ * \param vinMode Video input mode.
|
|
+ * \param voutFmt Video output format.
|
|
+ * \param syncIn Type of synchro (ext or emb).
|
|
+ * \param pixRate Video pixel rate.
|
|
+ * \param pRefPix RefPix for output.
|
|
+ * \param pRefLine RefLine for output.
|
|
+ * \param pScRefPix RefPix for scaler.
|
|
+ * \param pScRefLine RefLine for scaler.
|
|
+ * \param pbVerified Pointer to the boolean that will receive the fact that
|
|
+ * this scaler setting was verified.
|
|
+ *
|
|
+ * \return true (Found) or false (Not found).
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+static bool dl_hdmi_tx_get_refline_refpix
|
|
+(
|
|
+ tx_vid_fmt_t vin_fmt,
|
|
+ tx_vin_mode_t vin_mode,
|
|
+ tx_vid_fmt_t vout_fmt,
|
|
+ u8 sync_in,
|
|
+ tx_pix_rate_t pix_rate,
|
|
+ u16 *p_ref_pix,
|
|
+ u16 *p_ref_line,
|
|
+ u16 *p_sc_ref_pix,
|
|
+ u16 *p_sc_ref_line,
|
|
+ bool *pb_verified
|
|
+)
|
|
+{
|
|
+ u8 short_vin_fmt;
|
|
+ u8 short_vout_fmt;
|
|
+ int i;
|
|
+ bool b_found;
|
|
+
|
|
+ /* Search for all values to match in table, until table end is reached
|
|
+ * when both refPix values are zero */
|
|
+ *p_ref_pix = 0;
|
|
+ *p_ref_line = 0;
|
|
+ *p_sc_ref_pix = 0;
|
|
+ *p_sc_ref_line = 0;
|
|
+
|
|
+ /* If match is not found in table, we can assume a verified non-scaler
|
|
+ * combination */
|
|
+ *pb_verified = 1;
|
|
+ b_found = false;
|
|
+
|
|
+ if(vout_fmt < DL_HDMITX_VFMT_TV_NO_REG_MIN) {
|
|
+ short_vin_fmt = k_vfmt_to_short_fmt_tv[vin_fmt];
|
|
+ short_vout_fmt = k_vfmt_to_short_fmt_tv[vout_fmt];
|
|
+
|
|
+ for(i = 0; k_refpix_refline[i].short_vin_fmt != TV_INVALID; i++) {
|
|
+ if((k_refpix_refline[i].short_vin_fmt == short_vin_fmt)
|
|
+ && (UNPKMODE(k_refpix_refline[i].mode_rate_sync_verf) == vin_mode)
|
|
+ && (k_refpix_refline[i].short_vout_fmt == short_vout_fmt)
|
|
+ && (UNPKRATE(k_refpix_refline[i].mode_rate_sync_verf) == pix_rate)
|
|
+ && (UNPKSYNC(k_refpix_refline[i].mode_rate_sync_verf) == sync_in)) {
|
|
+ *p_ref_pix = k_refpix_refline[i].ref_pix;
|
|
+ *p_ref_line = k_refpix_refline[i].ref_line;
|
|
+ *p_sc_ref_pix = k_refpix_refline[i].sc_ref_pix;
|
|
+ *p_sc_ref_line = k_refpix_refline[i].sc_ref_line;
|
|
+ *pb_verified = UNPKVERF(k_refpix_refline[i].mode_rate_sync_verf);
|
|
+ b_found = true;
|
|
+ break;
|
|
+ }
|
|
+ }
|
|
+ }
|
|
+
|
|
+ return b_found;
|
|
+}
|
|
+
|
|
+/******************************************************************************
|
|
+ * \brief Set the video infoframe.
|
|
+ *
|
|
+ * \param instance Instance identifier.
|
|
+ * \param voutFmt Video output format.
|
|
+ * \param voutMode Video output mode.
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_HDMI_BAD_PARAMETER: a parameter was out of range
|
|
+ * - ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number
|
|
+ * - ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus
|
|
+ * - ERR_HDMI_I2C_READ: failed when reading to the I2C bus
|
|
+ * - ERR_HDMI_NOT_INITIALIZED: transmitter not initialized
|
|
+ * - ERR_HDMI_OPERATION_NOT_PERMITTED: not allowed in DVI mode
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+static error_code_t dl_hdmi_tx_set_video_infoframe
|
|
+(
|
|
+ instance_t instance,
|
|
+ tx_vid_fmt_t vout_fmt,
|
|
+ tx_vout_mode_t vout_mode
|
|
+)
|
|
+{
|
|
+ error_code_t err;
|
|
+ bsl_pkt_vif_t pkt_vif;
|
|
+ bsl_vid_fmt_t vif_info_frame;
|
|
+
|
|
+ /* Check if instance number is in range */
|
|
+ RETIF((instance < 0) || (instance >= MAX_UNITS), ERR_DLHDMITX_BAD_INSTANCE)
|
|
+
|
|
+ /* 3rd api_set_avi_infoframe param */
|
|
+ pkt_vif.colour = vout_mode;
|
|
+ pkt_vif.active_info = 0;
|
|
+ pkt_vif.bar_info = 0;
|
|
+ pkt_vif.scan_info = 0;
|
|
+#ifndef FORMAT_PC
|
|
+ pkt_vif.picture_aspect_ratio = k_vfmt_to_aspect_tv[vout_fmt];
|
|
+#else /* FORMAT_PC */
|
|
+ if((vout_fmt >= DL_HDMITX_VFMT_PC_MIN)
|
|
+ && (vout_fmt <= DL_HDMITX_VFMT_PC_MAX)) {
|
|
+ pkt_vif.picture_aspect_ratio = k_vfmt_to_aspect_tv[vout_fmt - DL_HDMITX_VFMT_PC_MIN + 1];
|
|
+ } else
|
|
+ pkt_vif.picture_aspect_ratio = k_vfmt_to_aspect_tv[vout_fmt];
|
|
+#endif /* FORMAT_PC */
|
|
+ pkt_vif.active_format_ratio = 8;
|
|
+ pkt_vif.scaling = 0;
|
|
+
|
|
+#ifdef FORMAT_PC
|
|
+ if(vout_fmt >= DL_HDMITX_VFMT_PC_MIN) {
|
|
+ if(vout_fmt == dl_hdmitx_vfmt_pc_640x480p_60hz) {
|
|
+ vif_info_frame = (bsl_vid_fmt_t)dl_hdmitx_vfmt_01_640x480p_60hz;
|
|
+ } else {
|
|
+ /* Format PC not Valid in EIA861b */
|
|
+ vif_info_frame = (bsl_vid_fmt_t)DL_HDMITX_VFMT_NULL;
|
|
+ }
|
|
+ } else {
|
|
+#endif /* FORMAT_PC */
|
|
+
|
|
+ vif_info_frame = (bsl_vid_fmt_t)vout_fmt;
|
|
+
|
|
+#ifdef FORMAT_PC
|
|
+ }
|
|
+#endif /* FORMAT_PC */
|
|
+
|
|
+ pkt_vif.vid_format = vif_info_frame;
|
|
+ if(((vout_fmt >= dl_hdmitx_vfmt_06_720x480i_60hz) && (vout_fmt <= dl_hdmitx_vfmt_09_720x240p_60hz))
|
|
+ || ((vout_fmt >= dl_hdmitx_vfmt_21_720x576i_50hz) && (vout_fmt <= dl_hdmitx_vfmt_24_720x288p_50hz))) {
|
|
+ /* Force pixel repeat for formats where it's mandatory */
|
|
+ pkt_vif.pixel_repeat = 1;
|
|
+ } else {
|
|
+ /* Default to no repeat for all other formats */
|
|
+ pkt_vif.pixel_repeat = HDMITX_PIXREP_NONE;
|
|
+ }
|
|
+
|
|
+ switch(vout_fmt) {
|
|
+ case dl_hdmitx_vfmt_04_1280x720p_60hz:
|
|
+ case dl_hdmitx_vfmt_05_1920x1080i_60hz:
|
|
+ case dl_hdmitx_vfmt_16_1920x1080p_60hz:
|
|
+ case dl_hdmitx_vfmt_19_1280x720p_50hz:
|
|
+ case dl_hdmitx_vfmt_20_1920x1080i_50hz:
|
|
+ case dl_hdmitx_vfmt_31_1920x1080p_50hz:
|
|
+ pkt_vif.colorimetry = (u8)DL_HDMITX_COLORIMETRY_ITU709;
|
|
+ break;
|
|
+
|
|
+ default:
|
|
+ pkt_vif.colorimetry = (u8)DL_HDMITX_COLORIMETRY_ITU601;
|
|
+ break;
|
|
+ }
|
|
+
|
|
+ pkt_vif.end_top_bar_line = 0;
|
|
+ pkt_vif.start_bottom_bar_line = 0;
|
|
+ pkt_vif.end_left_bar_pixel = 0;
|
|
+ pkt_vif.start_right_bar_pixel = 0;
|
|
+
|
|
+ err = bsl_pkt_set_video_infoframe(instance,
|
|
+ &pkt_vif, true);
|
|
+
|
|
+ /* Ignore infoframe interlock in DVI mode */
|
|
+ if(err == ERR_HDMI_OPERATION_NOT_PERMITTED) {
|
|
+ err = 0;
|
|
+ }
|
|
+
|
|
+ return err;
|
|
+}
|
|
+
|
|
+/******************************************************************************
|
|
+ * \brief Set colourbar test pattern on with RGB infoframe
|
|
+ *
|
|
+ * \param instance Instance identifier.
|
|
+ * \param voutFmt Video output format.
|
|
+ * \param voutMode Video output mode.
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number
|
|
+ * - ERR_HDMI_BAD_PARAMETER: a parameter was out of range
|
|
+ * - ERR_HDMI_NOT_INITIALIZED: transmitter not initialized
|
|
+ * - ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+error_code_t dl_hdmi_tx_set_test_pattern_on
|
|
+(
|
|
+ instance_t instance,
|
|
+ tx_vid_fmt_t vout_fmt,
|
|
+ tx_vout_mode_t vout_mode,
|
|
+ tx_test_pattern_t pattern
|
|
+)
|
|
+{
|
|
+ error_code_t err;
|
|
+
|
|
+ /* Check if instance number is in range */
|
|
+ RETIF((instance < 0) || (instance >= MAX_UNITS), ERR_DLHDMITX_BAD_INSTANCE)
|
|
+
|
|
+ RETIF((err = bsl_test_set_pattern(instance,
|
|
+ (bsl_test_pattern_t)pattern)) != 0, err)
|
|
+
|
|
+ if(pattern > DL_HDMITX_PATTERN_CBAR8) {
|
|
+ RETIF((err = dl_hdmi_tx_set_video_infoframe(instance, vout_fmt, vout_mode)) != 0, err)
|
|
+ } else {
|
|
+ /* For DL_HDMITX_PATTERN_CBAR8 and DL_HDMITX_PATTERN_CBAR4, video mode in infoframe should be RGB */
|
|
+ RETIF((err = dl_hdmi_tx_set_video_infoframe(instance, vout_fmt, DL_HDMITX_VOUTMODE_RGB444)) != 0, err)
|
|
+ }
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+/******************************************************************************
|
|
+ * \brief Set colourbar test pattern off with previous infoframe
|
|
+ *
|
|
+ * \param instance Instance identifier.
|
|
+ * \param voutFmt Video output format.
|
|
+ * \param voutMode Video output mode.
|
|
+ *
|
|
+ * \return The call result:
|
|
+ * - 0: the call was successful
|
|
+ * - ERR_DLHDMITX_BAD_INSTANCE: the instance number is wrong or
|
|
+ * out of range
|
|
+ * - ERR_HDMI_BAD_UNIT_NUMBER: bad transmitter unit number
|
|
+ * - ERR_HDMI_BAD_PARAMETER: a parameter was out of range
|
|
+ * - ERR_HDMI_NOT_INITIALIZED: transmitter not initialized
|
|
+ * - ERR_HDMI_I2C_WRITE: failed when writing to the I2C bus
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+error_code_t dl_hdmi_tx_set_test_pattern_off
|
|
+(
|
|
+ instance_t instance,
|
|
+ tx_vid_fmt_t vout_fmt,
|
|
+ tx_vout_mode_t vout_mode
|
|
+)
|
|
+{
|
|
+ error_code_t err;
|
|
+
|
|
+ /* Check if instance number is in range */
|
|
+ RETIF((instance < 0) || (instance >= MAX_UNITS), ERR_DLHDMITX_BAD_INSTANCE)
|
|
+
|
|
+ RETIF((err = bsl_test_set_pattern(instance,
|
|
+ (bsl_test_pattern_t)DL_HDMITX_PATTERN_OFF)) != 0, err)
|
|
+
|
|
+ /* Restore video infoframe */
|
|
+ RETIF((err = dl_hdmi_tx_set_video_infoframe(instance, vout_fmt, vout_mode)) != 0, err)
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+/******************************************************************************
|
|
+ * \brief HDCP ENCRYPT interrupt callback.
|
|
+ *
|
|
+ * \param instance Instance identifier.
|
|
+ *
|
|
+ * \return NA.
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+static void dl_hdmi_tx_handle_encrypt
|
|
+(
|
|
+ instance_t instance
|
|
+)
|
|
+{
|
|
+ (void)instance; /* Remove compiler warning */
|
|
+}
|
|
+
|
|
+/******************************************************************************
|
|
+ * \brief HPD interrupt callback.
|
|
+ *
|
|
+ * \param instance Instance identifier.
|
|
+ *
|
|
+ * \return NA.
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+static void dl_hdmi_tx_handle_hpd
|
|
+(
|
|
+ instance_t instance
|
|
+)
|
|
+{
|
|
+ error_code_t err;
|
|
+ bsl_hot_plug_t hpd_status; /* HPD status */
|
|
+ power_state_t power_state; /* Power state of transmitter */
|
|
+
|
|
+ /* Get the current state */
|
|
+
|
|
+ /* If the current state is NOT_INITALIZED, set a flag */
|
|
+ if(dl_hdmi_tx_get_state(instance) == STATE_NOT_INITIALIZED) {
|
|
+ /* Get Hot Plug status */
|
|
+ err = bsl_hot_plug_get_status(instance, &hpd_status);
|
|
+
|
|
+ if(err != 0) return;
|
|
+
|
|
+ if(hpd_status == HDMITX_HOTPLUG_ACTIVE) {
|
|
+ event_hpdactive_flag = true;
|
|
+ } else {
|
|
+ event_hpdactive_flag = false;
|
|
+ }
|
|
+ } else {
|
|
+ hpd_status = HDMITX_HOTPLUG_INVALID;
|
|
+
|
|
+ /* Reset the EDID status */
|
|
+ edid_data_status = HDMITX_EDID_NOT_READ;
|
|
+
|
|
+ /* Get Hot Plug status */
|
|
+ err = bsl_hot_plug_get_status(instance, &hpd_status);
|
|
+
|
|
+ if(err != 0) return;
|
|
+
|
|
+ /* Get the power state of the transmitter */
|
|
+ err = bsl_power_get_state(instance, &power_state);
|
|
+
|
|
+ if(err != 0) return;
|
|
+
|
|
+ /* Has hot plug changed to Active? */
|
|
+ if(hpd_status == HDMITX_HOTPLUG_ACTIVE) {
|
|
+ /* Set state machine to Plugged */
|
|
+ dl_hdmi_tx_set_state(instance, STATE_PLUGGED);
|
|
+
|
|
+ if(dl_hdmi_tx_get_event_status(instance, DL_HDMITX_HPD_ACTIVE) == DL_HDMITX_EVENT_ENABLED) {
|
|
+ event_call_hpdactive_cback = false;
|
|
+ /* Release the sempahore */
|
|
+ (void)tx_iwsemaphore_v(dl_hdmi_tx_it_semaphore[instance]);
|
|
+ unit_table_tx[instance].p_callback(DL_HDMITX_HPD_ACTIVE);
|
|
+ /* Take the sempahore */
|
|
+ (void)tx_iwsemaphore_p(dl_hdmi_tx_it_semaphore[instance]);
|
|
+ } else {
|
|
+ event_call_hpdactive_cback = true;
|
|
+ }
|
|
+
|
|
+ if(power_state == power_on) {
|
|
+ /* Yes: Wait for DDC line to settle before reading EDID */
|
|
+ bsl_sys_timer_wait(instance, 500); /* ms */
|
|
+
|
|
+ /* EDID read */
|
|
+ err = bsl_edid_get_block_data(instance,
|
|
+ unit_table_tx[instance].p_edid_buffer, (u32)((unit_table_tx[instance].edid_buffer_size) >> 7),
|
|
+ unit_table_tx[instance].edid_buffer_size, &edid_data_status);
|
|
+
|
|
+ dl_hdmi_tx_handle_edid_read(instance);
|
|
+
|
|
+ }
|
|
+ } else {
|
|
+ event_call_hpdactive_cback = false;
|
|
+ /* Set state machine to Unplugged */
|
|
+ dl_hdmi_tx_set_state(instance, STATE_UNPLUGGED);
|
|
+
|
|
+ if(dl_hdmi_tx_get_event_status(instance, DL_HDMITX_HPD_INACTIVE) == DL_HDMITX_EVENT_ENABLED) {
|
|
+ /* Release the sempahore */
|
|
+ (void)tx_iwsemaphore_v(dl_hdmi_tx_it_semaphore[instance]);
|
|
+ unit_table_tx[instance].p_callback(DL_HDMITX_HPD_INACTIVE);
|
|
+ /* Take the sempahore */
|
|
+ (void)tx_iwsemaphore_p(dl_hdmi_tx_it_semaphore[instance]);
|
|
+ }
|
|
+ }
|
|
+ }
|
|
+}
|
|
+
|
|
+/******************************************************************************
|
|
+ * \brief T0 interrupt callback.
|
|
+ *
|
|
+ * \param instance Instance identifier.
|
|
+ *
|
|
+ * \return NA.
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+static void dl_hdmi_tx_handle_t0
|
|
+(
|
|
+ instance_t instance
|
|
+)
|
|
+{
|
|
+ (void)instance;
|
|
+}
|
|
+
|
|
+/******************************************************************************
|
|
+ * \brief BCAPS interrupt callback.
|
|
+ *
|
|
+ * \param instance Instance identifier.
|
|
+ *
|
|
+ * \return NA.
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+static void dl_hdmi_tx_handle_bcaps
|
|
+(
|
|
+ instance_t instance
|
|
+)
|
|
+{
|
|
+ (void)instance;
|
|
+}
|
|
+
|
|
+/******************************************************************************
|
|
+ * \brief BSTATUS interrupt callback.
|
|
+ *
|
|
+ * \param instance Instance identifier.
|
|
+ *
|
|
+ * \return NA.
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+static void dl_hdmi_tx_handle_bstatus
|
|
+(
|
|
+ instance_t instance
|
|
+)
|
|
+{
|
|
+ (void)instance;
|
|
+}
|
|
+
|
|
+/******************************************************************************
|
|
+ * \brief SHA_1 interrupt callback.
|
|
+ *
|
|
+ * \param instance Instance identifier.
|
|
+ *
|
|
+ * \return NA.
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+static void dl_hdmi_tx_handle_sha_1
|
|
+(
|
|
+ instance_t instance
|
|
+)
|
|
+{
|
|
+ (void)instance;
|
|
+}
|
|
+
|
|
+/******************************************************************************
|
|
+ * \brief PJ interrupt callback.
|
|
+ *
|
|
+ * \param instance Instance identifier.
|
|
+ *
|
|
+ * \return NA.
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+static void dl_hdmi_tx_handle_pj
|
|
+(
|
|
+ instance_t instance
|
|
+)
|
|
+{
|
|
+ (void)instance;
|
|
+}
|
|
+
|
|
+#ifdef TMFL_TDA9981_SUPPORT
|
|
+/******************************************************************************
|
|
+ * \brief R0 interrupt callback.
|
|
+ *
|
|
+ * \param instance Instance identifier.
|
|
+ *
|
|
+ * \return NA.
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+static void dl_hdmi_tx_handle_r0
|
|
+(
|
|
+ instance_t instance
|
|
+)
|
|
+{
|
|
+ instance_status_info_tx[instance].p_col_bar_state->hdcp_secure_or_t0 = false;
|
|
+ instance_status_info_tx[instance].p_col_bar_state->disable_color_bar_on_r0 = true;
|
|
+ instance_status_info_tx[instance].p_col_bar_state->hdcp_colbar_change = true;
|
|
+}
|
|
+
|
|
+/******************************************************************************
|
|
+ * \brief SW_INT interrupt callback.
|
|
+ *
|
|
+ * \param instance Instance identifier.
|
|
+ *
|
|
+ * \return NA.
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+static void dl_hdmi_tx_handle_sw_int
|
|
+(
|
|
+ instance_t instance
|
|
+)
|
|
+{
|
|
+ DUMMY_ACCESS(instance);
|
|
+}
|
|
+#endif
|
|
+
|
|
+/******************************************************************************
|
|
+ * \brief RX_SENSE interrupt callback.
|
|
+ *
|
|
+ * \param instance Instance identifier.
|
|
+ *
|
|
+ * \return NA.
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+#ifdef TMFL_RX_SENSE_ON
|
|
+static void dl_hdmi_tx_handle_rx_sense
|
|
+(
|
|
+ instance_t instance
|
|
+)
|
|
+{
|
|
+ error_code_t err;
|
|
+ bsl_rx_sense_t rx_sense_status; /* Rx Sense status */
|
|
+ bsl_hot_plug_t hpd_status; /* HPD status */
|
|
+
|
|
+ err = bsl_rx_sense_get_status(instance,
|
|
+ &rx_sense_status);
|
|
+
|
|
+ if(err != 0) return;
|
|
+
|
|
+ err = bsl_hot_plug_get_status(instance,
|
|
+ &hpd_status);
|
|
+
|
|
+ if(err != 0) return;
|
|
+
|
|
+ /* if (hpdStatus == HDMITX_HOTPLUG_ACTIVE)
|
|
+ * {*/
|
|
+ if(rx_sense_status == HDMITX_RX_SENSE_ACTIVE) {
|
|
+ if(dl_hdmi_tx_get_event_status(instance, DL_HDMITX_RX_DEVICE_ACTIVE) == DL_HDMITX_EVENT_ENABLED) {
|
|
+ event_call_rxsens_active_cback = false;
|
|
+ /* Release the sempahore */
|
|
+ (void)tx_iwsemaphore_v(dl_hdmi_tx_it_semaphore[instance]);
|
|
+ unit_table_tx[instance].p_callback(DL_HDMITX_RX_DEVICE_ACTIVE);
|
|
+ /* Take the sempahore */
|
|
+ (void)tx_iwsemaphore_p(dl_hdmi_tx_it_semaphore[instance]);
|
|
+ } else {
|
|
+ event_call_rxsens_active_cback = true;
|
|
+ }
|
|
+ } else if(rx_sense_status == HDMITX_RX_SENSE_INACTIVE) {
|
|
+ event_call_rxsens_active_cback = false;
|
|
+ }
|
|
+ /* }*/
|
|
+}
|
|
+#endif
|
|
+
|
|
+/******************************************************************************
|
|
+ * \brief EDID_READ interrupt callback.
|
|
+ *
|
|
+ * \param instance Instance identifier.
|
|
+ *
|
|
+ * \return NA.
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+static void dl_hdmi_tx_handle_edid_read
|
|
+(
|
|
+ instance_t instance
|
|
+)
|
|
+{
|
|
+ error_code_t err = 0;
|
|
+ u8 edid_status = DL_HDMITX_EDID_NOT_READ;
|
|
+
|
|
+ /* Get the edid status and read the connected device's EDID */
|
|
+
|
|
+ /* Get Edid status */
|
|
+ edid_status = edid_data_status;
|
|
+
|
|
+ if(err != 0) {
|
|
+ /* Set state machine to Plugged */
|
|
+ dl_hdmi_tx_set_state(instance, STATE_PLUGGED);
|
|
+ return;
|
|
+ }
|
|
+
|
|
+ /* Has hot plug changed to Active? */
|
|
+ if((edid_status == DL_HDMITX_EDID_READ) ||
|
|
+ (edid_status == DL_HDMITX_EDID_ERROR_CHK)) {
|
|
+ /* Set state machine to EDID available */
|
|
+ dl_hdmi_tx_set_state(instance, STATE_EDID_AVAILABLE);
|
|
+ } else {
|
|
+ /* Set state machine to Plugged */
|
|
+ dl_hdmi_tx_set_state(instance, STATE_PLUGGED);
|
|
+ }
|
|
+
|
|
+ if(dl_hdmi_tx_get_event_status(instance, DL_HDMITX_EDID_RECEIVED) == DL_HDMITX_EVENT_ENABLED) {
|
|
+ /* Release the sempahore */
|
|
+ (void)tx_iwsemaphore_v(dl_hdmi_tx_it_semaphore[instance]);
|
|
+ unit_table_tx[instance].p_callback(DL_HDMITX_EDID_RECEIVED);
|
|
+ /* Take the sempahore */
|
|
+ (void)tx_iwsemaphore_p(dl_hdmi_tx_it_semaphore[instance]);
|
|
+ }
|
|
+}
|
|
+
|
|
+/******************************************************************************
|
|
+ * \brief Command processing task, dedicated to unit/instance 0.
|
|
+ *
|
|
+ * \param NA.
|
|
+ *
|
|
+ * \return NA.
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+#ifndef TMFL_NO_RTOS
|
|
+static void command_task_unit0()
|
|
+{
|
|
+ u8 command;
|
|
+ /* Just to avoid compiler warning */
|
|
+ bool loop = true;
|
|
+
|
|
+ while(loop) {
|
|
+ tx_iwqueue_receive(unit_table_tx[0].queue_handle, &command);
|
|
+
|
|
+ /* Take the sempahore */
|
|
+ (void)tx_iwsemaphore_p(dl_hdmi_tx_it_semaphore[0]);
|
|
+
|
|
+ /* Clear T0 flag before polling for interrupts */
|
|
+ instance_status_info_tx[0].p_col_bar_state->hdcp_secure_or_t0 = false;
|
|
+
|
|
+ if(g_i2cdebug_accesses_enabled == true) {
|
|
+ bsl_hw_handle_interrupt(0);
|
|
+
|
|
+ } /* gI2CDebugAccessesEnabled */
|
|
+
|
|
+ /* Enable interrupts for Tx (interrupts are disabled in the HandleInterrupt function) */
|
|
+ tx_iwenable_interrupts(DL_HDMI_IW_TX_1);
|
|
+
|
|
+ /* Release the sempahore */
|
|
+ (void)tx_iwsemaphore_v(dl_hdmi_tx_it_semaphore[0]);
|
|
+ };
|
|
+}
|
|
+
|
|
+/******************************************************************************
|
|
+ * \brief Command processing task, dedicated to unit/instance 1.
|
|
+ *
|
|
+ * \param NA.
|
|
+ *
|
|
+ * \return NA.
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+static void command_task_unit1()
|
|
+{
|
|
+ u8 command;
|
|
+ /* Just to avoid compiler warning */
|
|
+ bool loop = true;
|
|
+
|
|
+ while(loop) {
|
|
+ tx_iwqueue_receive(unit_table_tx[1].queue_handle, &command);
|
|
+
|
|
+ /* Take the sempahore */
|
|
+ (void)tx_iwsemaphore_p(dl_hdmi_tx_it_semaphore[1]);
|
|
+
|
|
+ /* Clear T0 flag before polling for interrupts */
|
|
+ instance_status_info_tx[1].p_col_bar_state->hdcp_secure_or_t0 = false;
|
|
+
|
|
+ bsl_hw_handle_interrupt(1);
|
|
+
|
|
+ /* Enable interrupts for Tx (interrupts are disabled in the HandleInterrupt function) */
|
|
+ tx_iwenable_interrupts(DL_HDMI_IW_TX_2);
|
|
+
|
|
+ /* Release the sempahore */
|
|
+ (void)tx_iwsemaphore_v(dl_hdmi_tx_it_semaphore[1]);
|
|
+ };
|
|
+}
|
|
+
|
|
+/******************************************************************************
|
|
+ * \brief Hdcp check task, dedicated to unit/instance 0.
|
|
+ *
|
|
+ * \param NA.
|
|
+ *
|
|
+ * \return NA.
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+static void hdcp_task_unit0()
|
|
+{
|
|
+ bool loop = true; /* Just to avoid compiler warning */
|
|
+ bsl_hw_feature_t feature_supported;
|
|
+
|
|
+ bsl_hw_get_capabilities(0, &feature_supported);
|
|
+
|
|
+ while(loop) {
|
|
+ (void)tx_iwwait(35);
|
|
+
|
|
+ /* Take the sempahore */
|
|
+ (void)tx_iwsemaphore_p(dl_hdmi_tx_it_semaphore[0]);
|
|
+
|
|
+ if(g_i2cdebug_accesses_enabled == true) {
|
|
+
|
|
+ if(g_ksv_secure_timer_counter) {
|
|
+ g_ksv_secure_timer_counter++;
|
|
+
|
|
+ if(g_ksv_secure_timer_counter == 5) {
|
|
+#ifdef TMFL_TDA9981_SUPPORT
|
|
+ dl_hdmi_tx_handle_r0(0);
|
|
+#endif
|
|
+ g_ksv_secure_timer_counter = 0;
|
|
+ }
|
|
+
|
|
+ }
|
|
+
|
|
+ dl_hdmi_tx_check_color_bar(0);
|
|
+ dl_hdmi_tx_check_hdcp_color_bar(0);
|
|
+
|
|
+ } /* gI2CDebugAccessesEnabled == true*/
|
|
+
|
|
+ /* Release the sempahore */
|
|
+ (void)tx_iwsemaphore_v(dl_hdmi_tx_it_semaphore[0]);
|
|
+ };
|
|
+}
|
|
+
|
|
+/******************************************************************************
|
|
+ * \brief Hdcp check task, dedicated to unit/instance 1.
|
|
+ *
|
|
+ * \param NA.
|
|
+ *
|
|
+ * \return NA.
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+static void hdcp_task_unit1()
|
|
+{
|
|
+ bool loop = true; /* Just to avoid compiler warning */
|
|
+ bsl_hw_feature_t feature_supported;
|
|
+
|
|
+ bsl_hw_get_capabilities(1, &feature_supported);
|
|
+
|
|
+ while(loop) {
|
|
+ (void)tx_iwwait(35);
|
|
+
|
|
+ /* Take the sempahore */
|
|
+ (void)tx_iwsemaphore_p(dl_hdmi_tx_it_semaphore[1]);
|
|
+
|
|
+ dl_hdmi_tx_check_color_bar(1);
|
|
+ dl_hdmi_tx_check_hdcp_color_bar(1);
|
|
+
|
|
+ /* Release the sempahore */
|
|
+ (void)tx_iwsemaphore_v(dl_hdmi_tx_it_semaphore[1]);
|
|
+ };
|
|
+}
|
|
+#endif /* TMFL_NO_RTOS */
|
|
+
|
|
+/******************************************************************************
|
|
+ * \brief Check hdcp state to manage color bar.
|
|
+ *
|
|
+ * \param instance Instance identifier.
|
|
+ *
|
|
+ * \return NA.
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+static void dl_hdmi_tx_check_hdcp_color_bar
|
|
+(
|
|
+ instance_t instance
|
|
+)
|
|
+{
|
|
+ /* Use HDCP check result to control HDCP colour bars */
|
|
+ if((instance_status_info_tx[instance].p_col_bar_state->disable_color_bar_on_r0 == true)
|
|
+ && (instance_status_info_tx[instance].p_col_bar_state->hdcp_colbar_change == true)
|
|
+ && (instance_status_info_tx[instance].p_col_bar_state->hdcp_secure_or_t0 == false)) {
|
|
+ /* Remove test pattern once if Authenticated with no error interrupts */
|
|
+ if(instance_status_info_tx[instance].p_col_bar_state->color_bar_on != false) {
|
|
+ instance_status_info_tx[instance].p_col_bar_state->color_bar_on = false;
|
|
+ instance_status_info_tx[instance].p_col_bar_state->change_color_bar_now = true;
|
|
+ }
|
|
+ /* Reset state flags */
|
|
+ instance_status_info_tx[instance].p_col_bar_state->hdcp_colbar_change = false;
|
|
+ instance_status_info_tx[instance].p_col_bar_state->hdcp_secure_or_t0 = true;
|
|
+ }
|
|
+
|
|
+ if((instance_status_info_tx[instance].p_col_bar_state->hdcp_encrypt_or_t0 == true)
|
|
+ && (instance_status_info_tx[instance].p_col_bar_state->in_out_first_set_done == true)) {
|
|
+ /* Set test pattern once if not Authenticated, to mask HDCP failure */
|
|
+ if(instance_status_info_tx[instance].p_col_bar_state->color_bar_on != true) {
|
|
+ instance_status_info_tx[instance].p_col_bar_state->color_bar_on = true;
|
|
+ instance_status_info_tx[instance].p_col_bar_state->change_color_bar_now = true;
|
|
+ }
|
|
+ /* Reset state flag */
|
|
+ instance_status_info_tx[instance].p_col_bar_state->hdcp_encrypt_or_t0 = false;
|
|
+ }
|
|
+}
|
|
+
|
|
+/******************************************************************************
|
|
+ * \brief Show color bars or restore the last video format.
|
|
+ *
|
|
+ * \param instance Instance identifier.
|
|
+ *
|
|
+ * \return NA.
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+static void dl_hdmi_tx_check_color_bar
|
|
+(
|
|
+ instance_t instance
|
|
+)
|
|
+{
|
|
+ if((instance_status_info_tx[instance].p_col_bar_state->in_out_first_set_done == true)
|
|
+ && (instance_status_info_tx[instance].p_col_bar_state->change_color_bar_now == true)) {
|
|
+ instance_status_info_tx[instance].p_col_bar_state->change_color_bar_now = false;
|
|
+
|
|
+ if(unit_table_tx[instance].simplay_hd == true) {
|
|
+ if(instance_status_info_tx[instance].p_col_bar_state->color_bar_on == true) {
|
|
+ /* Set service mode colour bar on/off (also used as HDCP logo pattern) */
|
|
+ (void)dl_hdmi_tx_set_test_pattern_on(instance, instance_status_info_tx[instance].p_video_info->video_out_config.format,
|
|
+ instance_status_info_tx[instance].p_video_info->video_out_config.mode,
|
|
+ gtx_driver_config_table[instance].pattern);
|
|
+ } else {
|
|
+ /* Restore last output format and mode */
|
|
+ (void)dl_hdmi_tx_set_test_pattern_off(instance,
|
|
+ instance_status_info_tx[instance].p_video_info->video_out_config.format,
|
|
+ instance_status_info_tx[instance].p_video_info->video_out_config.mode);
|
|
+ }
|
|
+ }
|
|
+ }
|
|
+}
|
|
+
|
|
+/******************************************************************************
|
|
+ * \brief Set the state of the state machine.
|
|
+ *
|
|
+ * \param instance Instance identifier.
|
|
+ * \param state State of the state machine.
|
|
+ *
|
|
+ * \return NA.
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+static void dl_hdmi_tx_set_state
|
|
+(
|
|
+ instance_t instance,
|
|
+ tx_driver_state_t state
|
|
+)
|
|
+{
|
|
+ /* Set the state */
|
|
+ unit_table_tx[instance].state = state;
|
|
+}
|
|
+
|
|
+/******************************************************************************
|
|
+ * \brief Get the state of the state machine.
|
|
+ *
|
|
+ * \param instance Instance identifier.
|
|
+ *
|
|
+ * \return txDriverState_t Current State of the state machine.
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+tx_driver_state_t dl_hdmi_tx_get_state
|
|
+(
|
|
+ instance_t instance
|
|
+)
|
|
+{
|
|
+ tx_driver_state_t state;
|
|
+
|
|
+ /* Get the state */
|
|
+ state = unit_table_tx[instance].state;
|
|
+
|
|
+ return (state);
|
|
+}
|
|
+
|
|
+/******************************************************************************
|
|
+ * \brief Get the state of the event (enabled or disabled).
|
|
+ *
|
|
+ * \param instance Instance identifier.
|
|
+ * \param event Event to give the state.
|
|
+ *
|
|
+ * \return NA.
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+static tx_event_status_t dl_hdmi_tx_get_event_status
|
|
+(
|
|
+ instance_t instance,
|
|
+ tx_event_t event
|
|
+)
|
|
+{
|
|
+ tx_event_status_t event_status;
|
|
+
|
|
+ /* Get the event status */
|
|
+ event_status = instance_status_info_tx[instance].p_event_state[event].status;
|
|
+
|
|
+ return (event_status);
|
|
+}
|
|
+
|
|
+error_code_t tx_debug_enable_i2caccesses(instance_t instance,
|
|
+ bool enable_i2c)
|
|
+{
|
|
+ error_code_t err = 0;
|
|
+
|
|
+ /* Check if instance number is in range */
|
|
+ if((instance < 0) || (instance >= MAX_UNITS)) {
|
|
+ err = ERR_DLHDMITX_BAD_INSTANCE;
|
|
+ return err;
|
|
+ }
|
|
+
|
|
+ if(enable_i2c == true) {
|
|
+ err = bsl_debug_write_fake_reg_page(instance);
|
|
+ g_i2cdebug_accesses_enabled = true;
|
|
+ } else {
|
|
+ g_i2cdebug_accesses_enabled = false;
|
|
+ }
|
|
+
|
|
+ return err;
|
|
+}
|
|
+
|
|
+error_code_t dl_hdmi_tx_edid_get_dtd
|
|
+(
|
|
+ instance_t instance,
|
|
+ tx_edid_video_timings_t *p_dtdescriptors,
|
|
+ u8 max_dtdesc,
|
|
+ u8 *p_written_dtdesc
|
|
+)
|
|
+{
|
|
+ error_code_t err;
|
|
+
|
|
+ /* Check the current state */
|
|
+ RETIF(dl_hdmi_tx_get_state(instance) != STATE_EDID_AVAILABLE, ERR_DLHDMITX_INVALID_STATE)
|
|
+
|
|
+ /* Get detailled descriptors from EDID, return ERR_DLHDMITX_NO_RESOURCES if EDID are not read */
|
|
+ RETIF((err = bsl_edid_get_detailed_timing_descriptors(
|
|
+ instance, (bsl_edid_dtd_t *)p_dtdescriptors, max_dtdesc, p_written_dtdesc)) != 0, err);
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+static tx_vid_fmt_t dl_hdmi_tx_convert_dtdto_cea
|
|
+(
|
|
+ tx_edid_video_timings_t *p_dtdescriptors
|
|
+)
|
|
+{
|
|
+
|
|
+ tx_vid_fmt_t code_cea;
|
|
+ tx_pict_aspect_ratio_t picture_aspect_ratio;
|
|
+ bool format_interlaced;
|
|
+
|
|
+ format_interlaced = false;
|
|
+
|
|
+ if((p_dtdescriptors->flags) & 0x80) {
|
|
+ format_interlaced = true;
|
|
+ }
|
|
+
|
|
+ picture_aspect_ratio = dl_hdmi_tx_calc_aspect_ratio(p_dtdescriptors->h_image_size, p_dtdescriptors->v_image_size);
|
|
+
|
|
+ switch(p_dtdescriptors->h_active_pixels) {
|
|
+ case 640:
|
|
+ code_cea = dl_hdmi_tx_convert_dtdto_cea_640hap(p_dtdescriptors);
|
|
+ break;
|
|
+
|
|
+ case 720:
|
|
+ code_cea = dl_hdmi_tx_convert_dtdto_cea_720hap(p_dtdescriptors, picture_aspect_ratio);
|
|
+ break;
|
|
+
|
|
+ case 1280:
|
|
+ code_cea = dl_hdmi_tx_convert_dtdto_cea_1280hap(p_dtdescriptors);
|
|
+ break;
|
|
+
|
|
+ case 1920:
|
|
+ code_cea = dl_hdmi_tx_convert_dtdto_cea_1920hap(p_dtdescriptors, format_interlaced);
|
|
+ break;
|
|
+
|
|
+ case 1440:
|
|
+ code_cea = dl_hdmi_tx_convert_dtdto_cea_1440hap(p_dtdescriptors, picture_aspect_ratio, format_interlaced);
|
|
+ break;
|
|
+
|
|
+ case 2880:
|
|
+ code_cea = dl_hdmi_tx_convert_dtdto_cea_2880hap(p_dtdescriptors, picture_aspect_ratio, format_interlaced);
|
|
+ break;
|
|
+
|
|
+ default:
|
|
+ /* Not a valid format */
|
|
+ code_cea = DL_HDMITX_VFMT_NULL;
|
|
+ break;
|
|
+ }
|
|
+
|
|
+ return code_cea;
|
|
+
|
|
+}
|
|
+
|
|
+/******************************************************************************
|
|
+ * \brief dlHdmiTxConvertDTDtoCEA_640HAP .
|
|
+ *
|
|
+ * \param pDTDescriptors DTD to convert.
|
|
+ * pictureAspectRatio aspect ratio of DTD
|
|
+ * formatInterlaced DTD Interlaced or progressif
|
|
+ *
|
|
+ * \return NA.
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+static tx_vid_fmt_t dl_hdmi_tx_convert_dtdto_cea_640hap
|
|
+(
|
|
+ tx_edid_video_timings_t *p_dtdescriptors
|
|
+)
|
|
+{
|
|
+ tx_vid_fmt_t code_cea;
|
|
+
|
|
+ switch(p_dtdescriptors->v_active_lines) {
|
|
+ case 480:
|
|
+ code_cea = dl_hdmitx_vfmt_01_640x480p_60hz;
|
|
+ break;
|
|
+
|
|
+ default:
|
|
+ /* Not a valid format */
|
|
+ code_cea = DL_HDMITX_VFMT_NULL;
|
|
+ break;
|
|
+ }
|
|
+
|
|
+ return code_cea;
|
|
+
|
|
+}
|
|
+
|
|
+/******************************************************************************
|
|
+ * \brief dlHdmiTxConvertDTDtoCEA_720HAP .
|
|
+ *
|
|
+ * \param pDTDescriptors DTD to convert.
|
|
+ * pictureAspectRatio aspect ratio of DTD
|
|
+ * formatInterlaced DTD Interlaced or progressif
|
|
+ *
|
|
+ * \return NA.
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+static tx_vid_fmt_t dl_hdmi_tx_convert_dtdto_cea_720hap
|
|
+(
|
|
+ tx_edid_video_timings_t *p_dtdescriptors,
|
|
+ tx_pict_aspect_ratio_t picture_aspect_ratio
|
|
+)
|
|
+{
|
|
+ tx_vid_fmt_t code_cea;
|
|
+
|
|
+ switch(p_dtdescriptors->v_active_lines) {
|
|
+ case 480:
|
|
+ if(picture_aspect_ratio == DL_HDMITX_P_ASPECT_RATIO_4_3) {
|
|
+ code_cea = dl_hdmitx_vfmt_02_720x480p_60hz;
|
|
+ } else {
|
|
+ code_cea = dl_hdmitx_vfmt_03_720x480p_60hz;
|
|
+ }
|
|
+ break;
|
|
+
|
|
+ case 576:
|
|
+ if(picture_aspect_ratio == DL_HDMITX_P_ASPECT_RATIO_4_3) {
|
|
+ code_cea = dl_hdmitx_vfmt_17_720x576p_50hz;
|
|
+ } else {
|
|
+ code_cea = dl_hdmitx_vfmt_18_720x576p_50hz;
|
|
+ }
|
|
+ break;
|
|
+
|
|
+ default:
|
|
+ /* Not a valid format */
|
|
+ code_cea = DL_HDMITX_VFMT_NULL;
|
|
+ break;
|
|
+ }
|
|
+
|
|
+ return code_cea;
|
|
+
|
|
+}
|
|
+/******************************************************************************
|
|
+ * \brief dlHdmiTxConvertDTDtoCEA_1280HAP .
|
|
+ *
|
|
+ * \param pDTDescriptors DTD to convert.
|
|
+ * pictureAspectRatio aspect ratio of DTD
|
|
+ * formatInterlaced DTD Interlaced or progressif
|
|
+ *
|
|
+ * \return NA.
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+static tx_vid_fmt_t dl_hdmi_tx_convert_dtdto_cea_1280hap
|
|
+(
|
|
+ tx_edid_video_timings_t *p_dtdescriptors
|
|
+)
|
|
+{
|
|
+ tx_vid_fmt_t code_cea;
|
|
+
|
|
+ switch(p_dtdescriptors->v_active_lines) {
|
|
+ case 720:
|
|
+ switch(p_dtdescriptors->h_blank_pixels) {
|
|
+ case 370:
|
|
+ code_cea = dl_hdmitx_vfmt_04_1280x720p_60hz;
|
|
+ break;
|
|
+
|
|
+ case 700:
|
|
+ code_cea = dl_hdmitx_vfmt_19_1280x720p_50hz;
|
|
+ break;
|
|
+
|
|
+ default:
|
|
+ /* Not a valid format */
|
|
+ code_cea = DL_HDMITX_VFMT_NULL;
|
|
+ break;
|
|
+ }
|
|
+ break;
|
|
+
|
|
+ default:
|
|
+ /* Not a valid format */
|
|
+ code_cea = DL_HDMITX_VFMT_NULL;
|
|
+ break;
|
|
+ }
|
|
+
|
|
+ return code_cea;
|
|
+}
|
|
+
|
|
+/******************************************************************************
|
|
+ * \brief dlHdmiTxConvertDTDtoCEA_1920HAP .
|
|
+ *
|
|
+ * \param pDTDescriptors DTD to convert.
|
|
+ * pictureAspectRatio aspect ratio of DTD
|
|
+ * formatInterlaced DTD Interlaced or progressif
|
|
+ *
|
|
+ * \return NA.
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+static tx_vid_fmt_t dl_hdmi_tx_convert_dtdto_cea_1920hap
|
|
+(
|
|
+ tx_edid_video_timings_t *p_dtdescriptors,
|
|
+ bool format_interlaced
|
|
+
|
|
+)
|
|
+{
|
|
+ tx_vid_fmt_t code_cea;
|
|
+
|
|
+ switch(p_dtdescriptors->h_blank_pixels) {
|
|
+ case 280:
|
|
+ if(format_interlaced) {
|
|
+ code_cea = dl_hdmitx_vfmt_05_1920x1080i_60hz;
|
|
+ } else {
|
|
+ if(p_dtdescriptors->pixel_clock == 14850) {
|
|
+ code_cea = dl_hdmitx_vfmt_16_1920x1080p_60hz;
|
|
+ } else {
|
|
+ code_cea = dl_hdmitx_vfmt_34_1920x1080p_30hz;
|
|
+ }
|
|
+ }
|
|
+ break;
|
|
+
|
|
+ case 720:
|
|
+ if(format_interlaced) {
|
|
+ code_cea = dl_hdmitx_vfmt_20_1920x1080i_50hz;
|
|
+ } else {
|
|
+ switch(p_dtdescriptors->pixel_clock) {
|
|
+ case 14850:
|
|
+ code_cea = dl_hdmitx_vfmt_31_1920x1080p_50hz;
|
|
+ break;
|
|
+
|
|
+ case 7425:
|
|
+ code_cea = dl_hdmitx_vfmt_33_1920x1080p_25hz;
|
|
+ break;
|
|
+ default:
|
|
+ /* Not a valid format */
|
|
+ code_cea = DL_HDMITX_VFMT_NULL;
|
|
+ break;
|
|
+ }
|
|
+ }
|
|
+ break;
|
|
+
|
|
+ case 830:
|
|
+ code_cea = dl_hdmitx_vfmt_32_1920x1080p_24hz;
|
|
+ break;
|
|
+
|
|
+ default:
|
|
+ /* Not a valid format */
|
|
+ code_cea = DL_HDMITX_VFMT_NULL;
|
|
+ break;
|
|
+ }
|
|
+
|
|
+ return code_cea;
|
|
+}
|
|
+
|
|
+/******************************************************************************
|
|
+ * \brief dlHdmiTxConvertDTDtoCEA_1440HAP .
|
|
+ *
|
|
+ * \param pDTDescriptors DTD to convert.
|
|
+ * pictureAspectRatio aspect ratio of DTD
|
|
+ * formatInterlaced DTD Interlaced or progressif
|
|
+ *
|
|
+ * \return NA.
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+static tx_vid_fmt_t dl_hdmi_tx_convert_dtdto_cea_1440hap
|
|
+(
|
|
+ tx_edid_video_timings_t *p_dtdescriptors,
|
|
+ tx_pict_aspect_ratio_t picture_aspect_ratio,
|
|
+ bool format_interlaced
|
|
+
|
|
+)
|
|
+{
|
|
+ tx_vid_fmt_t code_cea;
|
|
+
|
|
+ switch(p_dtdescriptors->v_active_lines) {
|
|
+ case 240:
|
|
+ if(format_interlaced) {
|
|
+ if(picture_aspect_ratio == DL_HDMITX_P_ASPECT_RATIO_4_3) {
|
|
+ code_cea = dl_hdmitx_vfmt_06_720x480i_60hz;
|
|
+ } else {
|
|
+ code_cea = dl_hdmitx_vfmt_07_720x480i_60hz;
|
|
+ }
|
|
+ } else {
|
|
+ if(picture_aspect_ratio == DL_HDMITX_P_ASPECT_RATIO_4_3) {
|
|
+ code_cea = dl_hdmitx_vfmt_08_720x240p_60hz;
|
|
+ } else {
|
|
+ code_cea = dl_hdmitx_vfmt_09_720x240p_60hz;
|
|
+ }
|
|
+ }
|
|
+ break;
|
|
+
|
|
+ case 288:
|
|
+ if(format_interlaced) {
|
|
+ if(picture_aspect_ratio == DL_HDMITX_P_ASPECT_RATIO_4_3) {
|
|
+ code_cea = dl_hdmitx_vfmt_21_720x576i_50hz;
|
|
+ } else {
|
|
+ code_cea = dl_hdmitx_vfmt_22_720x576i_50hz;
|
|
+ }
|
|
+ } else {
|
|
+ if(picture_aspect_ratio == DL_HDMITX_P_ASPECT_RATIO_4_3) {
|
|
+ code_cea = dl_hdmitx_vfmt_23_720x288p_50hz;
|
|
+ } else {
|
|
+ code_cea = dl_hdmitx_vfmt_24_720x288p_50hz;
|
|
+ }
|
|
+ }
|
|
+ break;
|
|
+
|
|
+ case 480:
|
|
+ if(picture_aspect_ratio == DL_HDMITX_P_ASPECT_RATIO_4_3) {
|
|
+ code_cea = dl_hdmitx_vfmt_14_1440x480p_60hz;
|
|
+ } else {
|
|
+ code_cea = dl_hdmitx_vfmt_15_1440x480p_60hz;
|
|
+ }
|
|
+ break;
|
|
+
|
|
+ case 576:
|
|
+ if(picture_aspect_ratio == DL_HDMITX_P_ASPECT_RATIO_4_3) {
|
|
+ code_cea = dl_hdmitx_vfmt_29_1440x576p_50hz;
|
|
+ } else {
|
|
+ code_cea = dl_hdmitx_vfmt_30_1440x576p_50hz;
|
|
+ }
|
|
+ break;
|
|
+
|
|
+ default:
|
|
+ /* Not a valid format */
|
|
+ code_cea = DL_HDMITX_VFMT_NULL;
|
|
+ break;
|
|
+ }
|
|
+
|
|
+ return code_cea;
|
|
+}
|
|
+
|
|
+/******************************************************************************
|
|
+ * \brief dlHdmiTxConvertDTDtoCEA_2880HAP .
|
|
+ *
|
|
+ * \param pDTDescriptors DTD to convert.
|
|
+ * pictureAspectRatio aspect ratio of DTD
|
|
+ * formatInterlaced DTD Interlaced or progressif
|
|
+ *
|
|
+ * \return NA.
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+static tx_vid_fmt_t dl_hdmi_tx_convert_dtdto_cea_2880hap
|
|
+(
|
|
+ tx_edid_video_timings_t *p_dtdescriptors,
|
|
+ tx_pict_aspect_ratio_t picture_aspect_ratio,
|
|
+ bool format_interlaced
|
|
+)
|
|
+{
|
|
+ tx_vid_fmt_t code_cea;
|
|
+
|
|
+ switch(p_dtdescriptors->v_active_lines) {
|
|
+ case 240:
|
|
+ if(format_interlaced) {
|
|
+ if(picture_aspect_ratio == DL_HDMITX_P_ASPECT_RATIO_4_3) {
|
|
+ code_cea = dl_hdmitx_vfmt_10_720x480i_60hz;
|
|
+ } else {
|
|
+ code_cea = dl_hdmitx_vfmt_11_720x480i_60hz;
|
|
+ }
|
|
+ } else {
|
|
+ if(picture_aspect_ratio == DL_HDMITX_P_ASPECT_RATIO_4_3) {
|
|
+ code_cea = dl_hdmitx_vfmt_12_720x240p_60hz;
|
|
+ } else {
|
|
+ code_cea = dl_hdmitx_vfmt_13_720x240p_60hz;
|
|
+ }
|
|
+ }
|
|
+ break;
|
|
+
|
|
+ case 288:
|
|
+ if(format_interlaced) {
|
|
+ if(picture_aspect_ratio == DL_HDMITX_P_ASPECT_RATIO_4_3) {
|
|
+ code_cea = dl_hdmitx_vfmt_25_720x576i_50hz;
|
|
+ } else {
|
|
+ code_cea = dl_hdmitx_vfmt_26_720x576i_50hz;
|
|
+ }
|
|
+ } else {
|
|
+ if(picture_aspect_ratio == DL_HDMITX_P_ASPECT_RATIO_4_3) {
|
|
+ code_cea = dl_hdmitx_vfmt_27_720x288p_50hz;
|
|
+ } else {
|
|
+ code_cea = dl_hdmitx_vfmt_28_720x288p_50hz;
|
|
+ }
|
|
+ }
|
|
+ break;
|
|
+
|
|
+ default:
|
|
+ /* Not a valid format */
|
|
+ code_cea = DL_HDMITX_VFMT_NULL;
|
|
+ break;
|
|
+ }
|
|
+
|
|
+ return code_cea;
|
|
+}
|
|
+
|
|
+/******************************************************************************
|
|
+ * \brief Caculation of aspect ratio.
|
|
+ *
|
|
+ * \param HImageSize Horizontal image size.
|
|
+ * \param VImageSize Vertical image size.
|
|
+ *
|
|
+ * \return NA.
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+static tx_pict_aspect_ratio_t dl_hdmi_tx_calc_aspect_ratio(
|
|
+ u16 himage_size,
|
|
+ u16 vimage_size
|
|
+)
|
|
+{
|
|
+ tx_pict_aspect_ratio_t picture_aspect_ratio;
|
|
+ u16 calc_picture_aspect_ratio;
|
|
+
|
|
+ /* Define picture Aspect Ratio */
|
|
+ /* 16/9 = 1.77777 so the result approach is 2 */
|
|
+ /* 4/3 = 1.33333 so the result approach is 1 */
|
|
+ /* operation : */
|
|
+ /* ImageSize + (vImageSize/2) */
|
|
+ /* -------------------------- > vImageSize ->true 16/9 false 4/3 */
|
|
+ /* 2 */
|
|
+
|
|
+ calc_picture_aspect_ratio = ((u16)(himage_size + ((vimage_size) >> 1))) >> 1;
|
|
+
|
|
+ if(calc_picture_aspect_ratio > vimage_size) {
|
|
+ picture_aspect_ratio = DL_HDMITX_P_ASPECT_RATIO_16_9;
|
|
+ } else {
|
|
+ picture_aspect_ratio = DL_HDMITX_P_ASPECT_RATIO_4_3;
|
|
+ }
|
|
+
|
|
+ return picture_aspect_ratio;
|
|
+
|
|
+}
|
|
+
|
|
+/******************************************************************************
|
|
+ * \brief dlHdmiTxCheckHdcpBksv .
|
|
+ *
|
|
+ * \param pHdcpBksvTested ksv To test.
|
|
+ * \param pbBksvSecure Test result.
|
|
+ * \param bBigEndian ksv provide by hardware are in little or big endian.
|
|
+ *
|
|
+ * \return NA.
|
|
+ *
|
|
+ ******************************************************************************/
|
|
+static void dl_hdmi_tx_check_hdcp_bksv
|
|
+(
|
|
+ instance_t instance,
|
|
+ u8 *p_hdcp_bksv_tested,
|
|
+ bool *pb_bksv_secure,
|
|
+ bool b_big_endian
|
|
+)
|
|
+{
|
|
+ u32 nb_in_revocation_list;
|
|
+
|
|
+ nb_in_revocation_list = 0;
|
|
+
|
|
+ if((unit_table_tx[instance].revocation_list.p_list != NULL) && (unit_table_tx[instance].revocation_list.length > 0)) {
|
|
+ while((*pb_bksv_secure == true) && (nb_in_revocation_list < unit_table_tx[instance].revocation_list.length)) {
|
|
+ if(b_big_endian) {
|
|
+ if((p_hdcp_bksv_tested[0] == unit_table_tx[instance].revocation_list.p_list[nb_in_revocation_list * HDMITX_KSV_BYTES_PER_DEVICE])
|
|
+ &&
|
|
+ (p_hdcp_bksv_tested[1] == unit_table_tx[instance].revocation_list.p_list[1 + (nb_in_revocation_list * HDMITX_KSV_BYTES_PER_DEVICE)])
|
|
+ &&
|
|
+ (p_hdcp_bksv_tested[2] == unit_table_tx[instance].revocation_list.p_list[2 + (nb_in_revocation_list * HDMITX_KSV_BYTES_PER_DEVICE)])
|
|
+ &&
|
|
+ (p_hdcp_bksv_tested[3] == unit_table_tx[instance].revocation_list.p_list[3 + (nb_in_revocation_list * HDMITX_KSV_BYTES_PER_DEVICE)])
|
|
+ &&
|
|
+ (p_hdcp_bksv_tested[4] == unit_table_tx[instance].revocation_list.p_list[4 + (nb_in_revocation_list * HDMITX_KSV_BYTES_PER_DEVICE)])
|
|
+ ) {
|
|
+ *pb_bksv_secure = false;
|
|
+ }
|
|
+ } else {
|
|
+ if((p_hdcp_bksv_tested[4] == unit_table_tx[instance].revocation_list.p_list[nb_in_revocation_list * HDMITX_KSV_BYTES_PER_DEVICE])
|
|
+ &&
|
|
+ (p_hdcp_bksv_tested[3] == unit_table_tx[instance].revocation_list.p_list[1 + (nb_in_revocation_list * HDMITX_KSV_BYTES_PER_DEVICE)])
|
|
+ &&
|
|
+ (p_hdcp_bksv_tested[2] == unit_table_tx[instance].revocation_list.p_list[2 + (nb_in_revocation_list * HDMITX_KSV_BYTES_PER_DEVICE)])
|
|
+ &&
|
|
+ (p_hdcp_bksv_tested[1] == unit_table_tx[instance].revocation_list.p_list[3 + (nb_in_revocation_list * HDMITX_KSV_BYTES_PER_DEVICE)])
|
|
+ &&
|
|
+ (p_hdcp_bksv_tested[0] == unit_table_tx[instance].revocation_list.p_list[4 + (nb_in_revocation_list * HDMITX_KSV_BYTES_PER_DEVICE)])
|
|
+ ) {
|
|
+ *pb_bksv_secure = false;
|
|
+ }
|
|
+ }
|
|
+ nb_in_revocation_list++;
|
|
+ }
|
|
+ }
|
|
+}
|
|
+
|
|
+error_code_t tx_get_hpdstatus
|
|
+(
|
|
+ instance_t instance,
|
|
+ tx_hot_plug_t *p_hpdstatus
|
|
+)
|
|
+{
|
|
+ error_code_t err;
|
|
+
|
|
+ /* Check if instance number is in range */
|
|
+ RETIF((instance < 0) || (instance >= MAX_UNITS), ERR_DLHDMITX_BAD_INSTANCE)
|
|
+
|
|
+ RETIF(p_hpdstatus == NULL, ERR_DLHDMITX_INCONSISTENT_PARAMS)
|
|
+
|
|
+ /* Take the sempahore */
|
|
+ RETIF((err = tx_iwsemaphore_p(dl_hdmi_tx_it_semaphore[instance])) != 0, err)
|
|
+
|
|
+ /* Get the HPD status from BSL driver */
|
|
+ err = bsl_hot_plug_get_status(instance, (bsl_hot_plug_t *)p_hpdstatus);
|
|
+
|
|
+ if(err == 0) {
|
|
+ /* do nothing */
|
|
+ } else {
|
|
+ *p_hpdstatus = DL_HDMITX_HOTPLUG_INVALID;
|
|
+ }
|
|
+
|
|
+ /* Release the sempahore */
|
|
+ RETIF((err = tx_iwsemaphore_v(dl_hdmi_tx_it_semaphore[instance])) != 0, err)
|
|
+
|
|
+ return 0;
|
|
+
|
|
+} /* txGetHPDStatus */
|
|
+
|
|
+/*============================================================================*/
|
|
+/* END OF FILE */
|
|
+/*============================================================================*/
|
|
diff --git a/drivers/video/hdmi/comps/tmdlTDA9983/src/tmdlHdmiTx_local.h b/drivers/video/hdmi/comps/tmdlTDA9983/src/tmdlHdmiTx_local.h
|
|
new file mode 100755
|
|
index 0000000..847ca8d
|
|
--- /dev/null
|
|
+++ b/drivers/video/hdmi/comps/tmdlTDA9983/src/tmdlHdmiTx_local.h
|
|
@@ -0,0 +1,802 @@
|
|
+/**
|
|
+ * Copyright (C) 2006 NXP N.V., All Rights Reserved.
|
|
+ * This source code and any compilation or derivative thereof is the proprietary
|
|
+ * information of NXP N.V. and is confidential in nature. Under no circumstances
|
|
+ * is this software to be exposed to or placed under an Open Source License of
|
|
+ * any type without the expressed written permission of NXP N.V.
|
|
+ *
|
|
+ * \file tx_local.h
|
|
+ *
|
|
+ * \version $Revision: 1 $
|
|
+ *
|
|
+ * \date $Date: 02/08/07 08:32 $
|
|
+ *
|
|
+ * \brief devlib driver component API for the TDA998x HDMI Transmitters
|
|
+ *
|
|
+ * \section refs Reference Documents
|
|
+ * HDMI Tx Driver - FRS.doc,
|
|
+ *
|
|
+ * \section info Change Information
|
|
+ *
|
|
+ * \verbatim
|
|
+ *
|
|
+ * $History: tx_local.h $
|
|
+ *
|
|
+ * ***************** Version 13 *****************
|
|
+ * User: J. Lamotte Date: 02/08/07 Time: 08:32
|
|
+ * Updated in $/Source/tx/inc
|
|
+ * initial version
|
|
+ *
|
|
+ *
|
|
+ * \endverbatim
|
|
+ *
|
|
+ * */
|
|
+
|
|
+#ifndef DLHDMITX_LOCAL_H
|
|
+#define DLHDMITX_LOCAL_H
|
|
+
|
|
+#include "tmdlHdmiTx_IW.h"
|
|
+#include "tmNxTypes.h"
|
|
+#include "tmdlHdmiTx_Types.h"
|
|
+
|
|
+/*============================================================================*/
|
|
+/* MACRO DEFINITIONS */
|
|
+/*============================================================================*/
|
|
+
|
|
+/* Version of the SW driver */
|
|
+#define VERSION_COMPATIBILITY 0
|
|
+#define VERSION_MAJOR 4
|
|
+#define VERSION_MINOR 18
|
|
+
|
|
+/* Invalid HDCP seed */
|
|
+#define HDCP_SEED_NULL 0
|
|
+
|
|
+/* A default seed value may be defined here, or set to HDCP_SEED_NULL.
|
|
+ * If HDCP_SEED_NULL, a table of seeds may instead be programmed separately
|
|
+ * into flash at the location of kSeedTable, below */
|
|
+#define HDCP_SEED_DEFAULT HDCP_SEED_NULL
|
|
+
|
|
+/* Default SHA-1 test handling */
|
|
+#define HDCP_OPT_DEFAULT ( DL_HDMITX_HDCP_OPTION_FORCE_PJ_IGNORED \
|
|
+ | DL_HDMITX_HDCP_OPTION_FORCE_VSLOW_DDC \
|
|
+ | DL_HDMITX_HDCP_OPTION_FORCE_NO_1_1 )
|
|
+
|
|
+/**
|
|
+ * A macro to check a condition and if true return a result
|
|
+ * */
|
|
+#define RETIF(cond, rslt) if ((cond)){return (rslt);}
|
|
+
|
|
+/**
|
|
+ * A macro to check a condition and if true return
|
|
+ * ERR_DLHDMITX_BAD_PARAMETER.
|
|
+ * To save code space, it can be compiled out by defining NO_RETIF_BADPARAM on
|
|
+ * the compiler command line.
|
|
+ * */
|
|
+#ifdef NO_RETIF_BADPARAM
|
|
+#define RETIF_BADPARAM(cond)
|
|
+#else
|
|
+#define RETIF_BADPARAM(cond) if ((cond)){return ERR_DLHDMITX_BAD_PARAMETER;}
|
|
+#endif
|
|
+
|
|
+/**
|
|
+ * A macro to check a condition and if true, release the semaphore describe by handle and return a result
|
|
+ * */
|
|
+#define RETIF_SEM(handle, cond, rslt) if ((cond)){tx_iwsemaphore_v(handle); return (rslt);}
|
|
+
|
|
+/* Instance number */
|
|
+#define INSTANCE_0 0
|
|
+#define INSTANCE_1 1
|
|
+
|
|
+/* Number of event */
|
|
+#define EVENT_NB 9
|
|
+
|
|
+/* Size of a KSV is five bytes */
|
|
+#define KSV_SIZE 5
|
|
+
|
|
+/* Arbitrary short TV format values */
|
|
+#define TV_INVALID 0
|
|
+#define TV_VGA_60HZ 1
|
|
+#define TV_240p_60HZ 2
|
|
+#define TV_480p_60HZ 3
|
|
+#define TV_480i_60HZ 4
|
|
+#define TV_720p_60HZ 5
|
|
+#define TV_1080p_60HZ 6
|
|
+#define TV_1080i_60HZ 7
|
|
+#define TV_288p_50HZ 8
|
|
+#define TV_576p_50HZ 9
|
|
+#define TV_576i_50HZ 10
|
|
+#define TV_720p_50HZ 11
|
|
+#define TV_1080p_50HZ 12
|
|
+#define TV_1080i_50HZ 13
|
|
+
|
|
+/* Shorthands for vinMode values in bslTDA9984.h */
|
|
+#define iINVALID DL_HDMITX_VINMODE_INVALID
|
|
+#define iCCIR656 DL_HDMITX_VINMODE_CCIR656
|
|
+#define iRGB444 DL_HDMITX_VINMODE_RGB444
|
|
+#define iYUV444 DL_HDMITX_VINMODE_YUV444
|
|
+#define iYUV422 DL_HDMITX_VINMODE_YUV422
|
|
+
|
|
+/* Shorthands for input sync */
|
|
+#define EMB 1
|
|
+#define EXT 0
|
|
+
|
|
+/* Shorthands for single/double pixel rate in bslTDA9984.h */
|
|
+#define SINGLE DL_HDMITX_PIXRATE_SINGLE
|
|
+#define DOUBLE DL_HDMITX_PIXRATE_DOUBLE
|
|
+
|
|
+/* Shorthands for sampling frequency in txSetAudioInput API */
|
|
+#define AIF_SF_REFER_TO_STREAM_HEADER 0
|
|
+#define AIF_SF_32K 1
|
|
+#define AIF_SF_44K 2
|
|
+#define AIF_SF_48K 3
|
|
+#define AIF_SF_88K 4
|
|
+#define AIF_SF_96K 5
|
|
+#define AIF_SF_176K 6
|
|
+#define AIF_SF_192K 7
|
|
+
|
|
+/* HDCP check interval in milliseconds */
|
|
+#define HDCP_CHECK_INTERVAL_MS 2500
|
|
+
|
|
+/* Number of HDCP checks to carry out after HDCP is started */
|
|
+#define HDCP_NUM_CHECKS 5
|
|
+
|
|
+#define DL_HDMITX_CHANNELALLOC_LUT_SIZE 32
|
|
+
|
|
+static CONST_DAT u8 k_chan_alloc_chan_num[DL_HDMITX_CHANNELALLOC_LUT_SIZE] = \
|
|
+{2, 3, 3, 4, 3, 4, 4, 5, 4, 5, 5, 6, 5, 6, 6, 7, 6, 7, 7, 8, 4, 5, 5, 6, 5, 6, 6, 7, 6, 7, 7, 8 };
|
|
+
|
|
+/**
|
|
+ * Lookup table to convert from EIA/CEA TV video format to
|
|
+ * aspect ratio used in video infoframe:
|
|
+ * Aspect ratio 1=4:3, 2=16:9
|
|
+ * */
|
|
+#ifndef FORMAT_PC
|
|
+static CONST_DAT u8 k_vfmt_to_aspect_tv[DL_HDMITX_VFMT_TV_NUM] =
|
|
+#else /* FORMAT_PC */
|
|
+static CONST_DAT u8 k_vfmt_to_aspect_tv[DL_HDMITX_VFMT_TV_NUM + DL_HDMITX_VFMT_PC_NUM] =
|
|
+#endif /* FORMAT_PC */
|
|
+{
|
|
+ 0, /* HDMITX_VFMT_NULL */
|
|
+ 1, /* HDMITX_VFMT_01_640x480p_60HZ */
|
|
+ 1, /* HDMITX_VFMT_02_720x480p_60HZ */
|
|
+ 2, /* HDMITX_VFMT_03_720x480p_60HZ */
|
|
+ 2, /* HDMITX_VFMT_04_1280x720p_60HZ */
|
|
+ 2, /* HDMITX_VFMT_05_1920x1080i_60HZ */
|
|
+ 1, /* HDMITX_VFMT_06_720x480i_60HZ */
|
|
+ 2, /* HDMITX_VFMT_07_720x480i_60HZ */
|
|
+ 1, /* HDMITX_VFMT_08_720x240p_60HZ */
|
|
+ 2, /* HDMITX_VFMT_09_720x240p_60HZ */
|
|
+ 1, /* HDMITX_VFMT_10_720x480i_60HZ */
|
|
+ 2, /* HDMITX_VFMT_11_720x480i_60HZ */
|
|
+ 1, /* HDMITX_VFMT_12_720x240p_60HZ */
|
|
+ 2, /* HDMITX_VFMT_13_720x240p_60HZ */
|
|
+ 1, /* HDMITX_VFMT_14_1440x480p_60HZ */
|
|
+ 2, /* HDMITX_VFMT_15_1440x480p_60HZ */
|
|
+ 2, /* HDMITX_VFMT_16_1920x1080p_60HZ */
|
|
+ 1, /* HDMITX_VFMT_17_720x576p_50HZ */
|
|
+ 2, /* HDMITX_VFMT_18_720x576p_50HZ */
|
|
+ 2, /* HDMITX_VFMT_19_1280x720p_50HZ */
|
|
+ 2, /* HDMITX_VFMT_20_1920x1080i_50HZ */
|
|
+ 1, /* HDMITX_VFMT_21_720x576i_50HZ */
|
|
+ 2, /* HDMITX_VFMT_22_720x576i_50HZ */
|
|
+ 1, /* HDMITX_VFMT_23_720x288p_50HZ */
|
|
+ 2, /* HDMITX_VFMT_24_720x288p_50HZ */
|
|
+ 1, /* HDMITX_VFMT_25_720x576i_50HZ */
|
|
+ 2, /* HDMITX_VFMT_26_720x576i_50HZ */
|
|
+ 1, /* HDMITX_VFMT_27_720x288p_50HZ */
|
|
+ 2, /* HDMITX_VFMT_28_720x288p_50HZ */
|
|
+ 1, /* HDMITX_VFMT_29_1440x576p_50HZ */
|
|
+ 2, /* HDMITX_VFMT_30_1440x576p_50HZ */
|
|
+ 2, /* HDMITX_VFMT_31_1920x1080p_50HZ */
|
|
+ 2, /* HDMITX_VFMT_32_1920x1080p_24HZ */
|
|
+ 2, /* HDMITX_VFMT_33_1920x1080p_25HZ */
|
|
+ 2 /* HDMITX_VFMT_34_1920x1080p_30HZ */
|
|
+#ifdef FORMAT_PC
|
|
+ , 1, /* HDMITX_VFMT_PC_640x480p_60HZ */
|
|
+ 1, /* HDMITX_VFMT_PC_800x600p_60HZ */
|
|
+ 1, /* HDMITX_VFMT_PC_1152x960p_60HZ */
|
|
+ 1, /* HDMITX_VFMT_PC_1024x768p_60HZ */
|
|
+ 1, /* HDMITX_VFMT_PC_1280x768p_60HZ */
|
|
+ 1, /* HDMITX_VFMT_PC_1280x1024p_60HZ */
|
|
+ 1, /* HDMITX_VFMT_PC_1360x768p_60HZ */
|
|
+ 1, /* HDMITX_VFMT_PC_1400x1050p_60HZ */
|
|
+ 1, /* HDMITX_VFMT_PC_1600x1200p_60HZ */
|
|
+ 1, /* HDMITX_VFMT_PC_1024x768p_70HZ */
|
|
+ 1, /* HDMITX_VFMT_PC_640x480p_72HZ */
|
|
+ 1, /* HDMITX_VFMT_PC_800x600p_72HZ */
|
|
+ 1, /* HDMITX_VFMT_PC_640x480p_75HZ */
|
|
+ 1, /* HDMITX_VFMT_PC_1024x768p_75HZ */
|
|
+ 1, /* HDMITX_VFMT_PC_800x600p_75HZ */
|
|
+ 1, /* HDMITX_VFMT_PC_1024x864p_75HZ */
|
|
+ 1, /* HDMITX_VFMT_PC_1280x1024p_75HZ */
|
|
+ 1, /* HDMITX_VFMT_PC_640x350p_85HZ */
|
|
+ 1, /* HDMITX_VFMT_PC_640x400p_85HZ */
|
|
+ 1, /* HDMITX_VFMT_PC_720x400p_85HZ */
|
|
+ 1, /* HDMITX_VFMT_PC_640x480p_85HZ */
|
|
+ 1, /* HDMITX_VFMT_PC_800x600p_85HZ */
|
|
+ 1, /* HDMITX_VFMT_PC_1024x768p_85HZ */
|
|
+ 1, /* HDMITX_VFMT_PC_1152x864p_85HZ */
|
|
+ 1, /* HDMITX_VFMT_PC_1280x960p_85HZ */
|
|
+ 1, /* HDMITX_VFMT_PC_1280x1024p_85HZ */
|
|
+ 1 /* HDMITX_VFMT_PC_1024x768i_87HZ */
|
|
+#endif /* FORMAT_PC */
|
|
+};
|
|
+
|
|
+/**
|
|
+ * Lookup table to convert from EIA/CEA TV video format to
|
|
+ * the short format of resolution/interlace/frequency
|
|
+ * */
|
|
+static CONST_DAT u8 k_vfmt_to_short_fmt_tv[DL_HDMITX_VFMT_TV_NUM] = {
|
|
+ TV_INVALID, /* HDMITX_VFMT_NULL */
|
|
+ TV_VGA_60HZ, /* HDMITX_VFMT_01_640x480p_60HZ */
|
|
+ TV_480p_60HZ, /* HDMITX_VFMT_02_720x480p_60HZ */
|
|
+ TV_480p_60HZ, /* HDMITX_VFMT_03_720x480p_60HZ */
|
|
+ TV_720p_60HZ, /* HDMITX_VFMT_04_1280x720p_60HZ */
|
|
+ TV_1080i_60HZ, /* HDMITX_VFMT_05_1920x1080i_60HZ */
|
|
+ TV_480i_60HZ, /* HDMITX_VFMT_06_720x480i_60HZ */
|
|
+ TV_480i_60HZ, /* HDMITX_VFMT_07_720x480i_60HZ */
|
|
+ TV_240p_60HZ, /* HDMITX_VFMT_08_720x240p_60HZ */
|
|
+ TV_240p_60HZ, /* HDMITX_VFMT_09_720x240p_60HZ */
|
|
+ TV_480i_60HZ, /* HDMITX_VFMT_10_720x480i_60HZ */
|
|
+ TV_480i_60HZ, /* HDMITX_VFMT_11_720x480i_60HZ */
|
|
+ TV_240p_60HZ, /* HDMITX_VFMT_12_720x240p_60HZ */
|
|
+ TV_240p_60HZ, /* HDMITX_VFMT_13_720x240p_60HZ */
|
|
+ TV_480p_60HZ, /* HDMITX_VFMT_14_1440x480p_60HZ */
|
|
+ TV_480p_60HZ, /* HDMITX_VFMT_15_1440x480p_60HZ */
|
|
+ TV_1080p_60HZ, /* HDMITX_VFMT_16_1920x1080p_60HZ */
|
|
+ TV_576p_50HZ, /* HDMITX_VFMT_17_720x576p_50HZ */
|
|
+ TV_576p_50HZ, /* HDMITX_VFMT_18_720x576p_50HZ */
|
|
+ TV_720p_50HZ, /* HDMITX_VFMT_19_1280x720p_50HZ */
|
|
+ TV_1080i_50HZ, /* HDMITX_VFMT_20_1920x1080i_50HZ */
|
|
+ TV_576i_50HZ, /* HDMITX_VFMT_21_720x576i_50HZ */
|
|
+ TV_576i_50HZ, /* HDMITX_VFMT_22_720x576i_50HZ */
|
|
+ TV_288p_50HZ, /* HDMITX_VFMT_23_720x288p_50HZ */
|
|
+ TV_288p_50HZ, /* HDMITX_VFMT_24_720x288p_50HZ */
|
|
+ TV_576i_50HZ, /* HDMITX_VFMT_25_720x576i_50HZ */
|
|
+ TV_576i_50HZ, /* HDMITX_VFMT_26_720x576i_50HZ */
|
|
+ TV_288p_50HZ, /* HDMITX_VFMT_27_720x288p_50HZ */
|
|
+ TV_288p_50HZ, /* HDMITX_VFMT_28_720x288p_50HZ */
|
|
+ TV_576p_50HZ, /* HDMITX_VFMT_29_1440x576p_50HZ */
|
|
+ TV_576p_50HZ, /* HDMITX_VFMT_30_1440x576p_50HZ */
|
|
+ TV_1080p_50HZ /* HDMITX_VFMT_31_1920x1080p_50HZ */
|
|
+};
|
|
+
|
|
+/**
|
|
+ * Macro to pack vinMode(0-5), pixRate(0-1), syncIn(0-1) and bVerified(0-1)
|
|
+ * into a byte
|
|
+ * */
|
|
+#define PKBYTE(mode,rate,sync,verf) (((rate)<<7)|((sync)<<6)|((verf)<<5)|((mode)&0x1F))
|
|
+
|
|
+/**
|
|
+ * Macros to unpack vinMode(0-5), pixRate(0-1), syncIn(0-1) and bVerified(0-1)
|
|
+ * from a byte
|
|
+ * */
|
|
+#define UNPKRATE(byte) (((byte)>>7)&1)
|
|
+#define UNPKSYNC(byte) (((byte)>>6)&1)
|
|
+#define UNPKVERF(byte) (((byte)>>5)&1)
|
|
+#define UNPKMODE(byte) ((byte)&0x1F)
|
|
+
|
|
+/**
|
|
+ * Lookup table to match main video settings and look up sets of
|
|
+ * Refpix and Refline values
|
|
+ * */
|
|
+static CONST_DAT struct {
|
|
+ /* Values to match */
|
|
+ /* Packed vinMode, pixRate, syncIn, bVerified */
|
|
+ u8 mode_rate_sync_verf;
|
|
+ u8 short_vin_fmt;
|
|
+ u8 short_vout_fmt;
|
|
+ /* Values to look up */
|
|
+ u16 ref_pix; /* Output values */
|
|
+ u16 ref_line;
|
|
+ u16 sc_ref_pix; /* Scaler values */
|
|
+ u16 sc_ref_line;
|
|
+} k_refpix_refline [] = {
|
|
+ /*************************************************************/
|
|
+ /** Rows formatted in "Refpix_Refline.xls" and pasted here **/
|
|
+ /** DO NOT DELETE ANY ROWS, to keep all scaler combinations **/
|
|
+ /*************************************************************/
|
|
+ /* mode_____Rate___Sync_Verf shortVinFmt shortVoutFmt refPix refLine scRefPix scRefLine Test ID */
|
|
+ /* VID_F_04 */
|
|
+ {PKBYTE(iCCIR656, SINGLE, EMB, 1), TV_480i_60HZ, TV_480p_60HZ, 0x08b, 0x024, 0x078, 0x017},
|
|
+ /* VID_F_04 */
|
|
+ {PKBYTE(iCCIR656, SINGLE, EMB, 1), TV_480i_60HZ, TV_720p_60HZ, 0x08b, 0x012, 0x078, 0x017},
|
|
+ /* VID_F_04 */
|
|
+ {PKBYTE(iCCIR656, SINGLE, EMB, 1), TV_480i_60HZ, TV_1080i_60HZ, 0x08b, 0x00e, 0x078, 0x017},
|
|
+ /* */
|
|
+ {PKBYTE(iCCIR656, SINGLE, EMB, 1), TV_480i_60HZ, TV_1080p_60HZ, 0x08b, 0x021, 0x078, 0x017},
|
|
+ /* VID_F_01 */
|
|
+ {PKBYTE(iCCIR656, SINGLE, EMB, 1), TV_480p_60HZ, TV_720p_60HZ, 0x08b, 0x017, 0x078, 0x02c},
|
|
+ /* VID_F_01 */
|
|
+ {PKBYTE(iCCIR656, SINGLE, EMB, 1), TV_480p_60HZ, TV_1080i_60HZ, 0x08b, 0x013, 0x078, 0x02c},
|
|
+ /* */
|
|
+ {PKBYTE(iCCIR656, SINGLE, EMB, 1), TV_480p_60HZ, TV_1080p_60HZ, 0x08b, 0x027, 0x078, 0x02c},
|
|
+ /* VID_F_09 */
|
|
+ {PKBYTE(iCCIR656, SINGLE, EMB, 1), TV_576i_50HZ, TV_576p_50HZ, 0x091, 0x026, 0x085, 0x018},
|
|
+ /* VID_F_09 */
|
|
+ {PKBYTE(iCCIR656, SINGLE, EMB, 1), TV_576i_50HZ, TV_720p_50HZ, 0x091, 0x013, 0x085, 0x018},
|
|
+ /* VID_F_09 */
|
|
+ {PKBYTE(iCCIR656, SINGLE, EMB, 1), TV_576i_50HZ, TV_1080i_50HZ, 0x091, 0x00f, 0x085, 0x018},
|
|
+ /* */
|
|
+ {PKBYTE(iCCIR656, SINGLE, EMB, 1), TV_576i_50HZ, TV_1080p_50HZ, 0x091, 0x022, 0x085, 0x018},
|
|
+ /* VID_F_06 */
|
|
+ {PKBYTE(iCCIR656, SINGLE, EMB, 1), TV_576p_50HZ, TV_720p_50HZ, 0x091, 0x019, 0x085, 0x02e},
|
|
+ /* VID_F_06 */
|
|
+ {PKBYTE(iCCIR656, SINGLE, EMB, 1), TV_576p_50HZ, TV_1080i_50HZ, 0x091, 0x014, 0x085, 0x02e},
|
|
+ /* */
|
|
+ {PKBYTE(iCCIR656, SINGLE, EMB, 1), TV_576p_50HZ, TV_1080p_50HZ, 0x091, 0x028, 0x085, 0x02e},
|
|
+ /* VID_F_04 */
|
|
+ {PKBYTE(iCCIR656, SINGLE, EXT, 1), TV_480i_60HZ, TV_480p_60HZ, 0x014, 0x20d, 0x359, 0x004},
|
|
+ /* VID_F_04 */
|
|
+ {PKBYTE(iCCIR656, SINGLE, EXT, 1), TV_480i_60HZ, TV_720p_60HZ, 0x014, 0x2cb, 0x359, 0x004},
|
|
+ /* VID_F_04 */
|
|
+ {PKBYTE(iCCIR656, SINGLE, EXT, 1), TV_480i_60HZ, TV_1080i_60HZ, 0x014, 0x44c, 0x359, 0x004},
|
|
+ /* */
|
|
+ {PKBYTE(iCCIR656, SINGLE, EXT, 1), TV_480i_60HZ, TV_1080p_60HZ, 0x014, 0x436, 0x359, 0x004},
|
|
+ /* VID_F_01 */
|
|
+ {PKBYTE(iCCIR656, SINGLE, EXT, 1), TV_480p_60HZ, TV_720p_60HZ, 0x011, 0x2d3, 0x358, 0x007},
|
|
+ /* VID_F_01 */
|
|
+ {PKBYTE(iCCIR656, SINGLE, EXT, 1), TV_480p_60HZ, TV_1080i_60HZ, 0x011, 0x452, 0x358, 0x007},
|
|
+ /* */
|
|
+ {PKBYTE(iCCIR656, SINGLE, EXT, 1), TV_480p_60HZ, TV_1080p_60HZ, 0x011, 0x43e, 0x358, 0x007},
|
|
+ /* VID_F_09 */
|
|
+ {PKBYTE(iCCIR656, SINGLE, EXT, 1), TV_576i_50HZ, TV_576p_50HZ, 0x00d, 0x26b, 0x35f, 0x001},
|
|
+ /* VID_F_09 */
|
|
+ {PKBYTE(iCCIR656, SINGLE, EXT, 1), TV_576i_50HZ, TV_720p_50HZ, 0x00d, 0x2cb, 0x35f, 0x001},
|
|
+ /* VID_F_09 */
|
|
+ {PKBYTE(iCCIR656, SINGLE, EXT, 1), TV_576i_50HZ, TV_1080i_50HZ, 0x00d, 0x44b, 0x35f, 0x001},
|
|
+ /* */
|
|
+ {PKBYTE(iCCIR656, SINGLE, EXT, 1), TV_576i_50HZ, TV_1080p_50HZ, 0x00d, 0x435, 0x35f, 0x001},
|
|
+ /* VID_F_06 */
|
|
+ {PKBYTE(iCCIR656, SINGLE, EXT, 1), TV_576p_50HZ, TV_720p_50HZ, 0x00d, 0x2d1, 0x35f, 0x001},
|
|
+ /* VID_F_06 */
|
|
+ {PKBYTE(iCCIR656, SINGLE, EXT, 1), TV_576p_50HZ, TV_1080i_50HZ, 0x00d, 0x451, 0x35f, 0x001},
|
|
+ /* */
|
|
+ {PKBYTE(iCCIR656, SINGLE, EXT, 1), TV_576p_50HZ, TV_1080p_50HZ, 0x00d, 0x43d, 0x35f, 0x001},
|
|
+ /* VID_F_04 */
|
|
+ {PKBYTE(iCCIR656, DOUBLE, EMB, 1), TV_480i_60HZ, TV_480p_60HZ, 0x08b, 0x024, 0x078, 0x017},
|
|
+ /* VID_F_04 */
|
|
+ {PKBYTE(iCCIR656, DOUBLE, EMB, 1), TV_480i_60HZ, TV_720p_60HZ, 0x08b, 0x012, 0x078, 0x017},
|
|
+ /* VID_F_04 */
|
|
+ {PKBYTE(iCCIR656, DOUBLE, EMB, 1), TV_480i_60HZ, TV_1080i_60HZ, 0x08b, 0x00e, 0x078, 0x017},
|
|
+ /* */
|
|
+ {PKBYTE(iCCIR656, DOUBLE, EMB, 1), TV_480i_60HZ, TV_1080p_60HZ, 0x08b, 0x021, 0x078, 0x017},
|
|
+ /* VID_F_01 */
|
|
+ {PKBYTE(iCCIR656, DOUBLE, EMB, 1), TV_480p_60HZ, TV_720p_60HZ, 0x08b, 0x017, 0x078, 0x02c},
|
|
+ /* VID_F_01 */
|
|
+ {PKBYTE(iCCIR656, DOUBLE, EMB, 1), TV_480p_60HZ, TV_1080i_60HZ, 0x08b, 0x013, 0x078, 0x02c},
|
|
+ /* */
|
|
+ {PKBYTE(iCCIR656, DOUBLE, EMB, 1), TV_480p_60HZ, TV_1080p_60HZ, 0x08b, 0x027, 0x078, 0x02c},
|
|
+ /* VID_F_09 */
|
|
+ {PKBYTE(iCCIR656, DOUBLE, EMB, 1), TV_576i_50HZ, TV_576p_50HZ, 0x091, 0x026, 0x085, 0x018},
|
|
+ /* VID_F_09 */
|
|
+ {PKBYTE(iCCIR656, DOUBLE, EMB, 1), TV_576i_50HZ, TV_720p_50HZ, 0x091, 0x013, 0x085, 0x018},
|
|
+ /* VID_F_09 */
|
|
+ {PKBYTE(iCCIR656, DOUBLE, EMB, 1), TV_576i_50HZ, TV_1080i_50HZ, 0x091, 0x00f, 0x085, 0x018},
|
|
+ /* */
|
|
+ {PKBYTE(iCCIR656, DOUBLE, EMB, 1), TV_576i_50HZ, TV_1080p_50HZ, 0x091, 0x022, 0x085, 0x018},
|
|
+ /* VID_F_06 */
|
|
+ {PKBYTE(iCCIR656, DOUBLE, EMB, 1), TV_576p_50HZ, TV_720p_50HZ, 0x091, 0x019, 0x085, 0x02e},
|
|
+ /* VID_F_06 */
|
|
+ {PKBYTE(iCCIR656, DOUBLE, EMB, 1), TV_576p_50HZ, TV_1080i_50HZ, 0x091, 0x014, 0x085, 0x02e},
|
|
+ /* */
|
|
+ {PKBYTE(iCCIR656, DOUBLE, EMB, 1), TV_576p_50HZ, TV_1080p_50HZ, 0x091, 0x028, 0x085, 0x02e},
|
|
+ /* VID_F_04 */
|
|
+ {PKBYTE(iCCIR656, DOUBLE, EXT, 1), TV_480i_60HZ, TV_480p_60HZ, 0x014, 0x20d, 0x359, 0x004},
|
|
+ /* VID_F_04 */
|
|
+ {PKBYTE(iCCIR656, DOUBLE, EXT, 1), TV_480i_60HZ, TV_720p_60HZ, 0x014, 0x2cb, 0x359, 0x004},
|
|
+ /* VID_F_04 */
|
|
+ {PKBYTE(iCCIR656, DOUBLE, EXT, 1), TV_480i_60HZ, TV_1080i_60HZ, 0x014, 0x44c, 0x359, 0x004},
|
|
+ /* */
|
|
+ {PKBYTE(iCCIR656, DOUBLE, EXT, 1), TV_480i_60HZ, TV_1080p_60HZ, 0x014, 0x436, 0x359, 0x004},
|
|
+ /* VID_F_01 */
|
|
+ {PKBYTE(iCCIR656, DOUBLE, EXT, 1), TV_480p_60HZ, TV_720p_60HZ, 0x011, 0x2d3, 0x358, 0x007},
|
|
+ /* VID_F_01 */
|
|
+ {PKBYTE(iCCIR656, DOUBLE, EXT, 1), TV_480p_60HZ, TV_1080i_60HZ, 0x011, 0x452, 0x358, 0x007},
|
|
+ /* */
|
|
+ {PKBYTE(iCCIR656, DOUBLE, EXT, 1), TV_480p_60HZ, TV_1080p_60HZ, 0x011, 0x43e, 0x358, 0x007},
|
|
+ /* VID_F_09 */
|
|
+ {PKBYTE(iCCIR656, DOUBLE, EXT, 1), TV_576i_50HZ, TV_576p_50HZ, 0x00d, 0x26b, 0x35f, 0x001},
|
|
+ /* VID_F_09 */
|
|
+ {PKBYTE(iCCIR656, DOUBLE, EXT, 1), TV_576i_50HZ, TV_720p_50HZ, 0x00d, 0x2cb, 0x35f, 0x001},
|
|
+ /* VID_F_09 */
|
|
+ {PKBYTE(iCCIR656, DOUBLE, EXT, 1), TV_576i_50HZ, TV_1080i_50HZ, 0x00d, 0x44b, 0x35f, 0x001},
|
|
+ /* */
|
|
+ {PKBYTE(iCCIR656, DOUBLE, EXT, 1), TV_576i_50HZ, TV_1080p_50HZ, 0x00d, 0x435, 0x35f, 0x001},
|
|
+ /* VID_F_06 */
|
|
+ {PKBYTE(iCCIR656, DOUBLE, EXT, 1), TV_576p_50HZ, TV_720p_50HZ, 0x00d, 0x2d1, 0x35f, 0x001},
|
|
+ /* VID_F_06 */
|
|
+ {PKBYTE(iCCIR656, DOUBLE, EXT, 1), TV_576p_50HZ, TV_1080i_50HZ, 0x00d, 0x451, 0x35f, 0x001},
|
|
+ /* */
|
|
+ {PKBYTE(iCCIR656, DOUBLE, EXT, 1), TV_576p_50HZ, TV_1080p_50HZ, 0x00d, 0x43d, 0x35f, 0x001},
|
|
+ /* VID_F_04 */
|
|
+ {PKBYTE(iYUV422, SINGLE, EMB, 1), TV_480i_60HZ, TV_480p_60HZ, 0x08d, 0x028, 0x078, 0x017},
|
|
+ /* VID_F_04 */
|
|
+ {PKBYTE(iYUV422, SINGLE, EMB, 1), TV_480i_60HZ, TV_720p_60HZ, 0x08d, 0x014, 0x078, 0x017},
|
|
+ /* VID_F_04 */
|
|
+ {PKBYTE(iYUV422, SINGLE, EMB, 1), TV_480i_60HZ, TV_1080i_60HZ, 0x08d, 0x010, 0x078, 0x017},
|
|
+ /* */
|
|
+ {PKBYTE(iYUV422, SINGLE, EMB, 1), TV_480i_60HZ, TV_1080p_60HZ, 0x08d, 0x021, 0x078, 0x017},
|
|
+ /* VID_F_01 */
|
|
+ {PKBYTE(iYUV422, SINGLE, EMB, 1), TV_480p_60HZ, TV_720p_60HZ, 0x08d, 0x017, 0x078, 0x02c},
|
|
+ /* VID_F_01 */
|
|
+ {PKBYTE(iYUV422, SINGLE, EMB, 1), TV_480p_60HZ, TV_1080i_60HZ, 0x08d, 0x014, 0x078, 0x02c},
|
|
+ /* */
|
|
+ {PKBYTE(iYUV422, SINGLE, EMB, 1), TV_480p_60HZ, TV_1080p_60HZ, 0x08d, 0x027, 0x078, 0x02c},
|
|
+ /* VID_F_09 */
|
|
+ {PKBYTE(iYUV422, SINGLE, EMB, 1), TV_576i_50HZ, TV_576p_50HZ, 0x093, 0x02a, 0x085, 0x018},
|
|
+ /* VID_F_09 */
|
|
+ {PKBYTE(iYUV422, SINGLE, EMB, 1), TV_576i_50HZ, TV_720p_50HZ, 0x093, 0x013, 0x085, 0x018},
|
|
+ /* VID_F_09 */
|
|
+ {PKBYTE(iYUV422, SINGLE, EMB, 1), TV_576i_50HZ, TV_1080i_50HZ, 0x093, 0x00e, 0x085, 0x018},
|
|
+ /* */
|
|
+ {PKBYTE(iYUV422, SINGLE, EMB, 1), TV_576i_50HZ, TV_1080p_50HZ, 0x093, 0x022, 0x085, 0x018},
|
|
+ /* VID_F_06 */
|
|
+ {PKBYTE(iYUV422, SINGLE, EMB, 1), TV_576p_50HZ, TV_720p_50HZ, 0x093, 0x019, 0x085, 0x02e},
|
|
+ /* VID_F_06 */
|
|
+ {PKBYTE(iYUV422, SINGLE, EMB, 1), TV_576p_50HZ, TV_1080i_50HZ, 0x093, 0x014, 0x085, 0x02e},
|
|
+ /* */
|
|
+ {PKBYTE(iYUV422, SINGLE, EMB, 1), TV_576p_50HZ, TV_1080p_50HZ, 0x093, 0x028, 0x085, 0x02e},
|
|
+ /* */
|
|
+ {PKBYTE(iYUV422, SINGLE, EMB, 1), TV_720p_50HZ, TV_1080p_50HZ, 0x2bf, 0x024, 0x105, 0x019},
|
|
+ /* */
|
|
+ {PKBYTE(iYUV422, SINGLE, EMB, 1), TV_720p_60HZ, TV_1080p_60HZ, 0x175, 0x024, 0x105, 0x019},
|
|
+ /* */
|
|
+ {PKBYTE(iYUV422, SINGLE, EMB, 1), TV_1080i_50HZ, TV_1080p_50HZ, 0x2d3, 0x023, 0x0c3, 0x014},
|
|
+ /* */
|
|
+ {PKBYTE(iYUV422, SINGLE, EMB, 1), TV_1080i_60HZ, TV_1080p_60HZ, 0x11b, 0x023, 0x0c3, 0x014},
|
|
+ /* VID_F_04 */
|
|
+ {PKBYTE(iYUV422, SINGLE, EXT, 1), TV_480i_60HZ, TV_480p_60HZ, 0x016, 0x20d, 0x359, 0x004},
|
|
+ /* VID_F_04 */
|
|
+ {PKBYTE(iYUV422, SINGLE, EXT, 1), TV_480i_60HZ, TV_720p_60HZ, 0x016, 0x2cb, 0x359, 0x004},
|
|
+ /* VID_F_04 */
|
|
+ {PKBYTE(iYUV422, SINGLE, EXT, 1), TV_480i_60HZ, TV_1080i_60HZ, 0x016, 0x44c, 0x359, 0x004},
|
|
+ /* */
|
|
+ {PKBYTE(iYUV422, SINGLE, EXT, 1), TV_480i_60HZ, TV_1080p_60HZ, 0x016, 0x436, 0x359, 0x004},
|
|
+ /* VID_F_01 */
|
|
+ {PKBYTE(iYUV422, SINGLE, EXT, 1), TV_480p_60HZ, TV_720p_60HZ, 0x013, 0x2d3, 0x358, 0x007},
|
|
+ /* VID_F_01 */
|
|
+ {PKBYTE(iYUV422, SINGLE, EXT, 1), TV_480p_60HZ, TV_1080i_60HZ, 0x013, 0x452, 0x358, 0x007},
|
|
+ /* */
|
|
+ {PKBYTE(iYUV422, SINGLE, EXT, 1), TV_480p_60HZ, TV_1080p_60HZ, 0x013, 0x43e, 0x358, 0x007},
|
|
+ /* VID_F_09 */
|
|
+ {PKBYTE(iYUV422, SINGLE, EXT, 1), TV_576i_50HZ, TV_576p_50HZ, 0x00f, 0x26b, 0x35f, 0x001},
|
|
+ /* VID_F_09 */
|
|
+ {PKBYTE(iYUV422, SINGLE, EXT, 1), TV_576i_50HZ, TV_720p_50HZ, 0x00f, 0x2cb, 0x35f, 0x001},
|
|
+ /* VID_F_09 */
|
|
+ {PKBYTE(iYUV422, SINGLE, EXT, 1), TV_576i_50HZ, TV_1080i_50HZ, 0x00f, 0x44b, 0x35f, 0x001},
|
|
+ /* */
|
|
+ {PKBYTE(iYUV422, SINGLE, EXT, 1), TV_576i_50HZ, TV_1080p_50HZ, 0x00f, 0x435, 0x35f, 0x001},
|
|
+ /* VID_F_06 */
|
|
+ {PKBYTE(iYUV422, SINGLE, EXT, 1), TV_576p_50HZ, TV_720p_50HZ, 0x00f, 0x2d1, 0x35f, 0x001},
|
|
+ /* VID_F_06 */
|
|
+ {PKBYTE(iYUV422, SINGLE, EXT, 1), TV_576p_50HZ, TV_1080i_50HZ, 0x00f, 0x451, 0x35f, 0x001},
|
|
+ /* */
|
|
+ {PKBYTE(iYUV422, SINGLE, EXT, 1), TV_576p_50HZ, TV_1080p_50HZ, 0x00f, 0x43d, 0x35f, 0x001},
|
|
+ /* */
|
|
+ {PKBYTE(iYUV422, SINGLE, EXT, 1), TV_720p_50HZ, TV_1080p_50HZ, 0x1bb, 0x463, 0x7bb, 0x000},
|
|
+ /* */
|
|
+ {PKBYTE(iYUV422, SINGLE, EXT, 1), TV_720p_60HZ, TV_1080p_60HZ, 0x071, 0x463, 0x671, 0x000},
|
|
+ /* */
|
|
+ {PKBYTE(iYUV422, SINGLE, EXT, 1), TV_1080i_50HZ, TV_1080p_50HZ, 0x213, 0x460, 0xa4f, 0x000},
|
|
+ /* */
|
|
+ {PKBYTE(iYUV422, SINGLE, EXT, 1), TV_1080i_60HZ, TV_1080p_60HZ, 0x05b, 0x460, 0x897, 0x000},
|
|
+ /* VID_F_04 */
|
|
+ {PKBYTE(iYUV422, DOUBLE, EMB, 0), TV_480i_60HZ, TV_480p_60HZ, 0x000, 0x000, 0x000, 0x000},
|
|
+ /* VID_F_04 */
|
|
+ {PKBYTE(iYUV422, DOUBLE, EMB, 0), TV_480i_60HZ, TV_720p_60HZ, 0x000, 0x000, 0x000, 0x000},
|
|
+ /* VID_F_04 */
|
|
+ {PKBYTE(iYUV422, DOUBLE, EMB, 0), TV_480i_60HZ, TV_1080i_60HZ, 0x000, 0x000, 0x000, 0x000},
|
|
+ /* VID_F_01 */
|
|
+ {PKBYTE(iYUV422, DOUBLE, EMB, 0), TV_480p_60HZ, TV_720p_60HZ, 0x000, 0x000, 0x000, 0x000},
|
|
+ /* VID_F_01 */
|
|
+ {PKBYTE(iYUV422, DOUBLE, EMB, 0), TV_480p_60HZ, TV_1080i_60HZ, 0x000, 0x000, 0x000, 0x000},
|
|
+ /* VID_F_09 */
|
|
+ {PKBYTE(iYUV422, DOUBLE, EMB, 0), TV_576i_50HZ, TV_576p_50HZ, 0x000, 0x000, 0x000, 0x000},
|
|
+ /* VID_F_09 */
|
|
+ {PKBYTE(iYUV422, DOUBLE, EMB, 0), TV_576i_50HZ, TV_720p_50HZ, 0x000, 0x000, 0x000, 0x000},
|
|
+ /* VID_F_09 */
|
|
+ {PKBYTE(iYUV422, DOUBLE, EMB, 0), TV_576i_50HZ, TV_1080i_50HZ, 0x000, 0x000, 0x000, 0x000},
|
|
+ /* VID_F_06 */
|
|
+ {PKBYTE(iYUV422, DOUBLE, EMB, 0), TV_576p_50HZ, TV_720p_50HZ, 0x000, 0x000, 0x000, 0x000},
|
|
+ /* VID_F_06 */
|
|
+ {PKBYTE(iYUV422, DOUBLE, EMB, 0), TV_576p_50HZ, TV_1080i_50HZ, 0x000, 0x000, 0x000, 0x000},
|
|
+ /* VID_F_04 */
|
|
+ {PKBYTE(iYUV422, DOUBLE, EXT, 0), TV_480i_60HZ, TV_480p_60HZ, 0x000, 0x000, 0x000, 0x000},
|
|
+ /* VID_F_04 */
|
|
+ {PKBYTE(iYUV422, DOUBLE, EXT, 0), TV_480i_60HZ, TV_720p_60HZ, 0x000, 0x000, 0x000, 0x000},
|
|
+ /* VID_F_04 */
|
|
+ {PKBYTE(iYUV422, DOUBLE, EXT, 0), TV_480i_60HZ, TV_1080i_60HZ, 0x000, 0x000, 0x000, 0x000},
|
|
+ /* VID_F_01 */
|
|
+ {PKBYTE(iYUV422, DOUBLE, EXT, 0), TV_480p_60HZ, TV_720p_60HZ, 0x000, 0x000, 0x000, 0x000},
|
|
+ /* VID_F_01 */
|
|
+ {PKBYTE(iYUV422, DOUBLE, EXT, 0), TV_480p_60HZ, TV_1080i_60HZ, 0x000, 0x000, 0x000, 0x000},
|
|
+ /* VID_F_09 */
|
|
+ {PKBYTE(iYUV422, DOUBLE, EXT, 0), TV_576i_50HZ, TV_576p_50HZ, 0x000, 0x000, 0x000, 0x000},
|
|
+ /* VID_F_09 */
|
|
+ {PKBYTE(iYUV422, DOUBLE, EXT, 0), TV_576i_50HZ, TV_720p_50HZ, 0x000, 0x000, 0x000, 0x000},
|
|
+ /* VID_F_09 */
|
|
+ {PKBYTE(iYUV422, DOUBLE, EXT, 0), TV_576i_50HZ, TV_1080i_50HZ, 0x000, 0x000, 0x000, 0x000},
|
|
+ /* VID_F_06 */
|
|
+ {PKBYTE(iYUV422, DOUBLE, EXT, 0), TV_576p_50HZ, TV_720p_50HZ, 0x000, 0x000, 0x000, 0x000},
|
|
+ /* VID_F_06 */
|
|
+ {PKBYTE(iYUV422, DOUBLE, EXT, 0), TV_576p_50HZ, TV_1080i_50HZ, 0x000, 0x000, 0x000, 0x000},
|
|
+ /* VID_F_04 */
|
|
+ {PKBYTE(iYUV444, SINGLE, EMB, 0), TV_480i_60HZ, TV_480p_60HZ, 0x000, 0x000, 0x000, 0x000},
|
|
+ /* VID_F_04 */
|
|
+ {PKBYTE(iYUV444, SINGLE, EMB, 0), TV_480i_60HZ, TV_720p_60HZ, 0x000, 0x000, 0x000, 0x000},
|
|
+ /* VID_F_04 */
|
|
+ {PKBYTE(iYUV444, SINGLE, EMB, 0), TV_480i_60HZ, TV_1080i_60HZ, 0x000, 0x000, 0x000, 0x000},
|
|
+ /* VID_F_01 */
|
|
+ {PKBYTE(iYUV444, SINGLE, EMB, 0), TV_480p_60HZ, TV_720p_60HZ, 0x000, 0x000, 0x000, 0x000},
|
|
+ /* VID_F_01 */
|
|
+ {PKBYTE(iYUV444, SINGLE, EMB, 0), TV_480p_60HZ, TV_1080i_60HZ, 0x000, 0x000, 0x000, 0x000},
|
|
+ /* VID_F_09 */
|
|
+ {PKBYTE(iYUV444, SINGLE, EMB, 0), TV_576i_50HZ, TV_576p_50HZ, 0x000, 0x000, 0x000, 0x000},
|
|
+ /* VID_F_09 */
|
|
+ {PKBYTE(iYUV444, SINGLE, EMB, 0), TV_576i_50HZ, TV_720p_50HZ, 0x000, 0x000, 0x000, 0x000},
|
|
+ /* VID_F_09 */
|
|
+ {PKBYTE(iYUV444, SINGLE, EMB, 0), TV_576i_50HZ, TV_1080i_50HZ, 0x000, 0x000, 0x000, 0x000},
|
|
+ /* VID_F_06 */
|
|
+ {PKBYTE(iYUV444, SINGLE, EMB, 0), TV_576p_50HZ, TV_720p_50HZ, 0x000, 0x000, 0x000, 0x000},
|
|
+ /* VID_F_06 */
|
|
+ {PKBYTE(iYUV444, SINGLE, EMB, 0), TV_576p_50HZ, TV_1080i_50HZ, 0x000, 0x000, 0x000, 0x000},
|
|
+ /* VID_F_04 */
|
|
+ {PKBYTE(iYUV444, SINGLE, EXT, 0), TV_480i_60HZ, TV_480p_60HZ, 0x000, 0x000, 0x000, 0x000},
|
|
+ /* VID_F_04 */
|
|
+ {PKBYTE(iYUV444, SINGLE, EXT, 0), TV_480i_60HZ, TV_720p_60HZ, 0x000, 0x000, 0x000, 0x000},
|
|
+ /* VID_F_04 */
|
|
+ {PKBYTE(iYUV444, SINGLE, EXT, 0), TV_480i_60HZ, TV_1080i_60HZ, 0x000, 0x000, 0x000, 0x000},
|
|
+ /* VID_F_01 */
|
|
+ {PKBYTE(iYUV444, SINGLE, EXT, 0), TV_480p_60HZ, TV_720p_60HZ, 0x000, 0x000, 0x000, 0x000},
|
|
+ /* VID_F_01 */
|
|
+ {PKBYTE(iYUV444, SINGLE, EXT, 0), TV_480p_60HZ, TV_1080i_60HZ, 0x000, 0x000, 0x000, 0x000},
|
|
+ /* VID_F_09 */
|
|
+ {PKBYTE(iYUV444, SINGLE, EXT, 0), TV_576i_50HZ, TV_576p_50HZ, 0x000, 0x000, 0x000, 0x000},
|
|
+ /* VID_F_09 */
|
|
+ {PKBYTE(iYUV444, SINGLE, EXT, 0), TV_576i_50HZ, TV_720p_50HZ, 0x000, 0x000, 0x000, 0x000},
|
|
+ /* VID_F_09 */
|
|
+ {PKBYTE(iYUV444, SINGLE, EXT, 0), TV_576i_50HZ, TV_1080i_50HZ, 0x000, 0x000, 0x000, 0x000},
|
|
+ /* VID_F_06 */
|
|
+ {PKBYTE(iYUV444, SINGLE, EXT, 0), TV_576p_50HZ, TV_720p_50HZ, 0x000, 0x000, 0x000, 0x000},
|
|
+ /* VID_F_06 */
|
|
+ {PKBYTE(iYUV444, SINGLE, EXT, 0), TV_576p_50HZ, TV_1080i_50HZ, 0x000, 0x000, 0x000, 0x000},
|
|
+ /* VID_F_04 */
|
|
+ {PKBYTE(iYUV444, DOUBLE, EMB, 0), TV_480i_60HZ, TV_480p_60HZ, 0x000, 0x000, 0x000, 0x000},
|
|
+ /* VID_F_04 */
|
|
+ {PKBYTE(iYUV444, DOUBLE, EMB, 0), TV_480i_60HZ, TV_720p_60HZ, 0x000, 0x000, 0x000, 0x000},
|
|
+ /* VID_F_04 */
|
|
+ {PKBYTE(iYUV444, DOUBLE, EMB, 0), TV_480i_60HZ, TV_1080i_60HZ, 0x000, 0x000, 0x000, 0x000},
|
|
+ /* VID_F_01 */
|
|
+ {PKBYTE(iYUV444, DOUBLE, EMB, 0), TV_480p_60HZ, TV_720p_60HZ, 0x000, 0x000, 0x000, 0x000},
|
|
+ /* VID_F_01 */
|
|
+ {PKBYTE(iYUV444, DOUBLE, EMB, 0), TV_480p_60HZ, TV_1080i_60HZ, 0x000, 0x000, 0x000, 0x000},
|
|
+ /* VID_F_09 */
|
|
+ {PKBYTE(iYUV444, DOUBLE, EMB, 0), TV_576i_50HZ, TV_576p_50HZ, 0x000, 0x000, 0x000, 0x000},
|
|
+ /* VID_F_09 */
|
|
+ {PKBYTE(iYUV444, DOUBLE, EMB, 0), TV_576i_50HZ, TV_720p_50HZ, 0x000, 0x000, 0x000, 0x000},
|
|
+ /* VID_F_09 */
|
|
+ {PKBYTE(iYUV444, DOUBLE, EMB, 0), TV_576i_50HZ, TV_1080i_50HZ, 0x000, 0x000, 0x000, 0x000},
|
|
+ /* VID_F_06 */
|
|
+ {PKBYTE(iYUV444, DOUBLE, EMB, 0), TV_576p_50HZ, TV_720p_50HZ, 0x000, 0x000, 0x000, 0x000},
|
|
+ /* VID_F_06 */
|
|
+ {PKBYTE(iYUV444, DOUBLE, EMB, 0), TV_576p_50HZ, TV_1080i_50HZ, 0x000, 0x000, 0x000, 0x000},
|
|
+ /* VID_F_04 */
|
|
+ {PKBYTE(iYUV444, DOUBLE, EXT, 0), TV_480i_60HZ, TV_480p_60HZ, 0x000, 0x000, 0x000, 0x000},
|
|
+ /* VID_F_04 */
|
|
+ {PKBYTE(iYUV444, DOUBLE, EXT, 0), TV_480i_60HZ, TV_720p_60HZ, 0x000, 0x000, 0x000, 0x000},
|
|
+ /* VID_F_04 */
|
|
+ {PKBYTE(iYUV444, DOUBLE, EXT, 0), TV_480i_60HZ, TV_1080i_60HZ, 0x000, 0x000, 0x000, 0x000},
|
|
+ /* VID_F_01 */
|
|
+ {PKBYTE(iYUV444, DOUBLE, EXT, 0), TV_480p_60HZ, TV_720p_60HZ, 0x000, 0x000, 0x000, 0x000},
|
|
+ /* VID_F_01 */
|
|
+ {PKBYTE(iYUV444, DOUBLE, EXT, 0), TV_480p_60HZ, TV_1080i_60HZ, 0x000, 0x000, 0x000, 0x000},
|
|
+ /* VID_F_09 */
|
|
+ {PKBYTE(iYUV444, DOUBLE, EXT, 0), TV_576i_50HZ, TV_576p_50HZ, 0x000, 0x000, 0x000, 0x000},
|
|
+ /* VID_F_09 */
|
|
+ {PKBYTE(iYUV444, DOUBLE, EXT, 0), TV_576i_50HZ, TV_720p_50HZ, 0x000, 0x000, 0x000, 0x000},
|
|
+ /* VID_F_09 */
|
|
+ {PKBYTE(iYUV444, DOUBLE, EXT, 0), TV_576i_50HZ, TV_1080i_50HZ, 0x000, 0x000, 0x000, 0x000},
|
|
+ /* VID_F_06 */
|
|
+ {PKBYTE(iYUV444, DOUBLE, EXT, 0), TV_576p_50HZ, TV_720p_50HZ, 0x000, 0x000, 0x000, 0x000},
|
|
+ /* VID_F_06 */
|
|
+ {PKBYTE(iYUV444, DOUBLE, EXT, 0), TV_576p_50HZ, TV_1080i_50HZ, 0x000, 0x000, 0x000, 0x000},
|
|
+ /* VID_F_04 */
|
|
+ {PKBYTE(iRGB444, SINGLE, EMB, 0), TV_480i_60HZ, TV_480p_60HZ, 0x000, 0x000, 0x000, 0x000},
|
|
+ /* VID_F_04 */
|
|
+ {PKBYTE(iRGB444, SINGLE, EMB, 0), TV_480i_60HZ, TV_720p_60HZ, 0x000, 0x000, 0x000, 0x000},
|
|
+ /* VID_F_04 */
|
|
+ {PKBYTE(iRGB444, SINGLE, EMB, 0), TV_480i_60HZ, TV_1080i_60HZ, 0x000, 0x000, 0x000, 0x000},
|
|
+ /* VID_F_01 */
|
|
+ {PKBYTE(iRGB444, SINGLE, EMB, 0), TV_480p_60HZ, TV_720p_60HZ, 0x000, 0x000, 0x000, 0x000},
|
|
+ /* VID_F_01 */
|
|
+ {PKBYTE(iRGB444, SINGLE, EMB, 0), TV_480p_60HZ, TV_1080i_60HZ, 0x000, 0x000, 0x000, 0x000},
|
|
+ /* VID_F_09 */
|
|
+ {PKBYTE(iRGB444, SINGLE, EMB, 0), TV_576i_50HZ, TV_576p_50HZ, 0x000, 0x000, 0x000, 0x000},
|
|
+ /* VID_F_09 */
|
|
+ {PKBYTE(iRGB444, SINGLE, EMB, 0), TV_576i_50HZ, TV_720p_50HZ, 0x000, 0x000, 0x000, 0x000},
|
|
+ /* VID_F_09 */
|
|
+ {PKBYTE(iRGB444, SINGLE, EMB, 0), TV_576i_50HZ, TV_1080i_50HZ, 0x000, 0x000, 0x000, 0x000},
|
|
+ /* VID_F_06 */
|
|
+ {PKBYTE(iRGB444, SINGLE, EMB, 0), TV_576p_50HZ, TV_720p_50HZ, 0x000, 0x000, 0x000, 0x000},
|
|
+ /* VID_F_06 */
|
|
+ {PKBYTE(iRGB444, SINGLE, EMB, 0), TV_576p_50HZ, TV_1080i_50HZ, 0x000, 0x000, 0x000, 0x000},
|
|
+ /* VID_F_04 */
|
|
+ {PKBYTE(iRGB444, SINGLE, EXT, 0), TV_480i_60HZ, TV_480p_60HZ, 0x000, 0x000, 0x000, 0x000},
|
|
+ /* VID_F_04 */
|
|
+ {PKBYTE(iRGB444, SINGLE, EXT, 0), TV_480i_60HZ, TV_720p_60HZ, 0x000, 0x000, 0x000, 0x000},
|
|
+ /* VID_F_04 */
|
|
+ {PKBYTE(iRGB444, SINGLE, EXT, 0), TV_480i_60HZ, TV_1080i_60HZ, 0x000, 0x000, 0x000, 0x000},
|
|
+ /* VID_F_01 */
|
|
+ {PKBYTE(iRGB444, SINGLE, EXT, 0), TV_480p_60HZ, TV_720p_60HZ, 0x000, 0x000, 0x000, 0x000},
|
|
+ /* VID_F_01 */
|
|
+ {PKBYTE(iRGB444, SINGLE, EXT, 0), TV_480p_60HZ, TV_1080i_60HZ, 0x000, 0x000, 0x000, 0x000},
|
|
+ /* VID_F_01 */
|
|
+ {PKBYTE(iRGB444, SINGLE, EXT, 0), TV_480p_60HZ, TV_VGA_60HZ, 0x000, 0x000, 0x000, 0x000},
|
|
+ /* VID_F_09 */
|
|
+ {PKBYTE(iRGB444, SINGLE, EXT, 0), TV_576i_50HZ, TV_576p_50HZ, 0x000, 0x000, 0x000, 0x000},
|
|
+ /* VID_F_09 */
|
|
+ {PKBYTE(iRGB444, SINGLE, EXT, 0), TV_576i_50HZ, TV_720p_50HZ, 0x000, 0x000, 0x000, 0x000},
|
|
+ /* VID_F_09 */
|
|
+ {PKBYTE(iRGB444, SINGLE, EXT, 0), TV_576i_50HZ, TV_1080i_50HZ, 0x000, 0x000, 0x000, 0x000},
|
|
+ /* VID_F_06 */
|
|
+ {PKBYTE(iRGB444, SINGLE, EXT, 0), TV_576p_50HZ, TV_720p_50HZ, 0x000, 0x000, 0x000, 0x000},
|
|
+ /* VID_F_06 */
|
|
+ {PKBYTE(iRGB444, SINGLE, EXT, 0), TV_576p_50HZ, TV_1080i_50HZ, 0x000, 0x000, 0x000, 0x000},
|
|
+ /* VID_F_04 */
|
|
+ {PKBYTE(iRGB444, DOUBLE, EMB, 0), TV_480i_60HZ, TV_480p_60HZ, 0x000, 0x000, 0x000, 0x000},
|
|
+ /* VID_F_04 */
|
|
+ {PKBYTE(iRGB444, DOUBLE, EMB, 0), TV_480i_60HZ, TV_720p_60HZ, 0x000, 0x000, 0x000, 0x000},
|
|
+ /* VID_F_04 */
|
|
+ {PKBYTE(iRGB444, DOUBLE, EMB, 0), TV_480i_60HZ, TV_1080i_60HZ, 0x000, 0x000, 0x000, 0x000},
|
|
+ /* VID_F_01 */
|
|
+ {PKBYTE(iRGB444, DOUBLE, EMB, 0), TV_480p_60HZ, TV_720p_60HZ, 0x000, 0x000, 0x000, 0x000},
|
|
+ /* VID_F_01 */
|
|
+ {PKBYTE(iRGB444, DOUBLE, EMB, 0), TV_480p_60HZ, TV_1080i_60HZ, 0x000, 0x000, 0x000, 0x000},
|
|
+ /* VID_F_09 */
|
|
+ {PKBYTE(iRGB444, DOUBLE, EMB, 0), TV_576i_50HZ, TV_576p_50HZ, 0x000, 0x000, 0x000, 0x000},
|
|
+ /* VID_F_09 */
|
|
+ {PKBYTE(iRGB444, DOUBLE, EMB, 0), TV_576i_50HZ, TV_720p_50HZ, 0x000, 0x000, 0x000, 0x000},
|
|
+ /* VID_F_09 */
|
|
+ {PKBYTE(iRGB444, DOUBLE, EMB, 0), TV_576i_50HZ, TV_1080i_50HZ, 0x000, 0x000, 0x000, 0x000},
|
|
+ /* VID_F_06 */
|
|
+ {PKBYTE(iRGB444, DOUBLE, EMB, 0), TV_576p_50HZ, TV_720p_50HZ, 0x000, 0x000, 0x000, 0x000},
|
|
+ /* VID_F_06 */
|
|
+ {PKBYTE(iRGB444, DOUBLE, EMB, 0), TV_576p_50HZ, TV_1080i_50HZ, 0x000, 0x000, 0x000, 0x000},
|
|
+ /* VID_F_04 */
|
|
+ {PKBYTE(iRGB444, DOUBLE, EXT, 0), TV_480i_60HZ, TV_480p_60HZ, 0x000, 0x000, 0x000, 0x000},
|
|
+ /* VID_F_04 */
|
|
+ {PKBYTE(iRGB444, DOUBLE, EXT, 0), TV_480i_60HZ, TV_720p_60HZ, 0x000, 0x000, 0x000, 0x000},
|
|
+ /* VID_F_04 */
|
|
+ {PKBYTE(iRGB444, DOUBLE, EXT, 0), TV_480i_60HZ, TV_1080i_60HZ, 0x000, 0x000, 0x000, 0x000},
|
|
+ /* VID_F_01 */
|
|
+ {PKBYTE(iRGB444, DOUBLE, EXT, 0), TV_480p_60HZ, TV_720p_60HZ, 0x000, 0x000, 0x000, 0x000},
|
|
+ /* VID_F_01 */
|
|
+ {PKBYTE(iRGB444, DOUBLE, EXT, 0), TV_480p_60HZ, TV_1080i_60HZ, 0x000, 0x000, 0x000, 0x000},
|
|
+ /* VID_F_09 */
|
|
+ {PKBYTE(iRGB444, DOUBLE, EXT, 0), TV_576i_50HZ, TV_576p_50HZ, 0x000, 0x000, 0x000, 0x000},
|
|
+ /* VID_F_09 */
|
|
+ {PKBYTE(iRGB444, DOUBLE, EXT, 0), TV_576i_50HZ, TV_720p_50HZ, 0x000, 0x000, 0x000, 0x000},
|
|
+ /* VID_F_09 */
|
|
+ {PKBYTE(iRGB444, DOUBLE, EXT, 0), TV_576i_50HZ, TV_1080i_50HZ, 0x000, 0x000, 0x000, 0x000},
|
|
+ /* VID_F_06 */
|
|
+ {PKBYTE(iRGB444, DOUBLE, EXT, 0), TV_576p_50HZ, TV_720p_50HZ, 0x000, 0x000, 0x000, 0x000},
|
|
+ /* VID_F_06 */
|
|
+ {PKBYTE(iRGB444, DOUBLE, EXT, 0), TV_576p_50HZ, TV_1080i_50HZ, 0x000, 0x000, 0x000, 0x000},
|
|
+ /* EndTable */
|
|
+ {PKBYTE(iINVALID, DOUBLE, EMB, 0), TV_INVALID, TV_INVALID, 0x000, 0x000, 0x000, 0x000}
|
|
+};
|
|
+
|
|
+/*============================================================================*/
|
|
+/* ENUM OR TYPE DEFINITIONS */
|
|
+/*============================================================================*/
|
|
+/* Enum listing all the type of colorimetry */
|
|
+typedef enum {
|
|
+ DL_HDMITX_COLORIMETRY_NO_DATA = 0,
|
|
+ DL_HDMITX_COLORIMETRY_ITU601 = 1,
|
|
+ DL_HDMITX_COLORIMETRY_ITU709 = 2,
|
|
+ DL_HDMITX_COLORIMETRY_EXTENDED = 3
|
|
+} tx_colorimetry_t;
|
|
+
|
|
+/* Possible states of the state machine */
|
|
+typedef enum {
|
|
+ STATE_NOT_INITIALIZED, /**< Driver is not initialized */
|
|
+ STATE_INITIALIZED, /**< Driver is initialized */
|
|
+ STATE_UNPLUGGED, /**< Receiver device not connected */
|
|
+ STATE_PLUGGED, /**< Receiver device connected, clock lock */
|
|
+ STATE_EDID_AVAILABLE /**< Managed to read receiver's EDID */
|
|
+} tx_driver_state_t;
|
|
+
|
|
+/* revocation list structure */
|
|
+typedef struct {
|
|
+ u8 *p_list;
|
|
+ u32 length;
|
|
+} revocation_list_t;
|
|
+
|
|
+/* unit configuration structure */
|
|
+typedef struct {
|
|
+ /**< Is unit instanciated ? */
|
|
+ bool opened;
|
|
+ /**< Is HDCP enabled ? */
|
|
+ bool hdcp_enable;
|
|
+ tx_hdcp_options_t hdcp_options; /**< HDCP options */
|
|
+ /**< Is repeater enabled ? */
|
|
+ bool repeater_enable;
|
|
+ /**< Enable simplayHD support */
|
|
+ bool simplay_hd;
|
|
+ /**< Version of the HW device */
|
|
+ tx_device_version_t device_version;
|
|
+ /**< Pointer to raw EDID data */
|
|
+ u8 *p_edid_buffer;
|
|
+ /**< Size of buffer for raw EDID data */
|
|
+ u32 edid_buffer_size;
|
|
+ /**< Handle of the command task associated to this unit */
|
|
+ tx_iwtask_handle_t command_task_handle;
|
|
+ /**< Handle of the message queue associated to this unit */
|
|
+ tx_iwqueue_handle_t queue_handle;
|
|
+ /**< Handle of the hdcp check task associated to this unit */
|
|
+ tx_iwtask_handle_t hdcp_task_handle;
|
|
+ /**< Current state of the driver */
|
|
+ tx_driver_state_t state;
|
|
+ ptx_callback_t p_callback; /**< Data callback */
|
|
+ /**< Revolation List */
|
|
+ revocation_list_t revocation_list;
|
|
+} unit_config_t;
|
|
+
|
|
+/* Instance status */
|
|
+
|
|
+/* Video information structure */
|
|
+typedef struct _tx_video_info_t {
|
|
+ /* Video mute state: on/off */
|
|
+ bool video_mute_state;
|
|
+ tx_video_in_config_t video_in_config; /* Video input configuration */
|
|
+ tx_video_out_config_t video_out_config; /* Video output configuration */
|
|
+} tx_video_info_t, *ptx_video_info_t;
|
|
+
|
|
+/* Audio information structure */
|
|
+typedef struct _tx_audio_info_t {
|
|
+ /* Audio mute state: on/off */
|
|
+ bool audio_mute_state;
|
|
+ tx_audio_in_config_t audio_in_cfg; /* Audio input configuration */
|
|
+} tx_audio_info_t, *ptx_audio_info_t;
|
|
+
|
|
+/* Event state structure */
|
|
+typedef struct _tx_event_state_t {
|
|
+ tx_event_t event; /* Event */
|
|
+ tx_event_status_t status; /* Event status: enabled or disabled */
|
|
+} tx_event_state_t, *ptx_event_state_t;
|
|
+
|
|
+/* Color bars state structure */
|
|
+typedef struct _tx_col_bar_state_t {
|
|
+ /* To be able to disable colorBar */
|
|
+ bool disable_color_bar_on_r0;
|
|
+ /* Used to auto-reset colour bars */
|
|
+ bool hdcp_colbar_change;
|
|
+ /* true when ENCRYPT or T0 interrupt */
|
|
+ bool hdcp_encrypt_or_t0;
|
|
+ /* true when BKSV secure or T0 */
|
|
+ bool hdcp_secure_or_t0;
|
|
+ /* API txSetInputOutput call at least one time*/
|
|
+ bool in_out_first_set_done;
|
|
+ bool color_bar_on;
|
|
+ bool change_color_bar_now;
|
|
+} tx_col_bar_state_t, *ptx_col_bar_state_t;
|
|
+
|
|
+/* instance status structure */
|
|
+typedef struct {
|
|
+ /* Video information: current mode and format... */
|
|
+ ptx_video_info_t p_video_info;
|
|
+ /* Audio information: current mode and format... */
|
|
+ ptx_audio_info_t p_audio_info;
|
|
+ /* Event state: enabled or disabled */
|
|
+ ptx_event_state_t p_event_state;
|
|
+ ptx_col_bar_state_t p_col_bar_state; /* Color bars state */
|
|
+ /* Numero of the buffer used for Gamut metadata (0 or 1) */
|
|
+ u8 gamut_buf_num;
|
|
+} instance_status_t;
|
|
+
|
|
+#endif /* DLHDMITX_LOCAL_H */
|
|
+
|
|
+/*============================================================================*/
|
|
+/* END OF FILE */
|
|
+/*============================================================================*/
|
|
diff --git a/drivers/video/hdmi/inc/tmNxCompId.h b/drivers/video/hdmi/inc/tmNxCompId.h
|
|
new file mode 100644
|
|
index 0000000..7cdcd58
|
|
--- /dev/null
|
|
+++ b/drivers/video/hdmi/inc/tmNxCompId.h
|
|
@@ -0,0 +1,287 @@
|
|
+/* -------------------------------------------------------------------------- */
|
|
+/* (C) Copyright 2000-2005 Koninklijke Philips Electronics N.V., */
|
|
+/* All rights reserved */
|
|
+/* */
|
|
+/* This source code and any compilation or derivative thereof is the */
|
|
+/* proprietary information of Konlinklijke Philips Electronics N.V. and is */
|
|
+/* Confidential in nature. */
|
|
+/* Under no circumstances is this software to be exposed to or placed under an*/
|
|
+/* Open Source License of any type without the expressed written permission of*/
|
|
+/* Koninklijke Philips Electronics N.V. */
|
|
+/* -------------------------------------------------------------------------- */
|
|
+/* */
|
|
+/* MoReUse - 2005-10-24 Version 118 */
|
|
+/* */
|
|
+/* Added: */
|
|
+/* CID_AACPENC */
|
|
+/* */
|
|
+/* */
|
|
+/* Changed: */
|
|
+/* */
|
|
+/* */
|
|
+/* */
|
|
+/* Removed: */
|
|
+/* */
|
|
+/* */
|
|
+/* */
|
|
+/* General Error Codes Added */
|
|
+/* */
|
|
+/* -------------------------------------------------------------------------- */
|
|
+/* FILE NAME: tmNxCompId.h */
|
|
+/* */
|
|
+/* DESCRIPTION: This header file identifies the standard component */
|
|
+/* identifiers (CIDs) and interface identifiers (IID) for */
|
|
+/* Nexperia platforms. */
|
|
+/* The objective of these identifiers is to enable unique */
|
|
+/* identification of software components and interfaces. */
|
|
+/* In addition, standard status values are also defined to make */
|
|
+/* determination of typical error cases much easier. */
|
|
+/* */
|
|
+/* Functional errors are not real errors in the sense of */
|
|
+/* unexpected behaviour but are part of the normal communication*/
|
|
+/* between a client an a server component. They are linked to */
|
|
+/* an interface, rather than to a component. All implementations*/
|
|
+/* of an interface must have the same behaviour with respect to */
|
|
+/* functional errors. Functional erros are all positive */
|
|
+/* One global functional error is defined: 0 0x00000000 */
|
|
+/* */
|
|
+/* Non-functional errors (all negative numbers) indicate */
|
|
+/* unexpected behaviour. They are linked to concrete component */
|
|
+/* implementations */
|
|
+/* */
|
|
+/* NOTE: The current implementation is different from the prev. */
|
|
+/* component identifier implementation, based on classes, */
|
|
+/* types and layers. However, the new system is backward */
|
|
+/* compatitible with the old implementation. */
|
|
+/* */
|
|
+/* tmNxCompId.h defines a number of general error codes that can*/
|
|
+/* be used by all components. These error codes are concatenated*/
|
|
+/* to the CID or IID value in the local component headerfile of */
|
|
+/* the component that wants to (re-)use this general error code */
|
|
+/* General error codes can be used for both functional and */
|
|
+/* non-functional errors. They should only be used if they */
|
|
+/* semantically fully match (if not, defined a new component or */
|
|
+/* interface specific error code. */
|
|
+/* */
|
|
+/* General Rules: */
|
|
+/* A return value has a length of 32 bits. At the binary level, */
|
|
+/* 1 bit indicates the component or interface flag; 16 bits are */
|
|
+/* used for the actual component id (CID) or interface id (IID) */
|
|
+/* and 12 bits for the return status. */
|
|
+/* The component/interface flag is bit 31. */
|
|
+/* Bits 30--28 are all 0. */
|
|
+/* The component/interface id occupies bits 27--12. */
|
|
+/* The return status occupies bits 11--0. */
|
|
+/* */
|
|
+/* +--------+-----+-------+-----------+ */
|
|
+/* | flag:1 | 0:3 | id:16 | status:12 | */
|
|
+/* +--------+-----+-------+-----------+ */
|
|
+/* */
|
|
+/* Format of interface ids: */
|
|
+/* */
|
|
+/* +-----+-----+--------+-----------+ */
|
|
+/* | 0:1 | 0:3 | iid:16 | status:12 | */
|
|
+/* +-----+-----+--------+-----------+ */
|
|
+/* */
|
|
+/* Format of component ids: */
|
|
+/* */
|
|
+/* +-----+-----+--------+-----------+ */
|
|
+/* | 1:1 | 0:3 | cid:16 | status:12 | */
|
|
+/* +-----+-----+--------+-----------+ */
|
|
+/* */
|
|
+/* At the macro level, we use the prefix "CID_" for component */
|
|
+/* ids (previous version "CID_COMP_") and "IID_" for interface */
|
|
+/* ids. */
|
|
+/* */
|
|
+/* Each component id will be used by only one component; each */
|
|
+/* component will have its own component id. */
|
|
+/* Each interface id will be used by only one interface; each */
|
|
+/* interface will have its own interface id. */
|
|
+/* */
|
|
+/* In order to avoid problems when promoting a UNIQUE interface */
|
|
+/* to a SEPARATE interface, the ranges for CIDs and IIDS must */
|
|
+/* not overlap. */
|
|
+/* */
|
|
+/* Component names and component ids have to be registered */
|
|
+/* together; the same applies for interface names and ids. */
|
|
+/* */
|
|
+/* NOTE about Compatibility */
|
|
+/* In the previous implementation the first four bits were */
|
|
+/* reserved for class, and there were separate fields for */
|
|
+/* type and tag, like this: */
|
|
+/* */
|
|
+/* +---------+--------+-------+---------+-----------+ */
|
|
+/* | class:4 | type:4 | tag:8 | layer:4 | status:12 | */
|
|
+/* +---------+--------+-------+---------+-----------+ */
|
|
+/* */
|
|
+/* The values 0 or 8 are not valid classes, and this fact */
|
|
+/* can be used to distinguish a new-style IID (class == 0), */
|
|
+/* a new-style CID (class == 8), and an old-style CID */
|
|
+/* (otherwise). */
|
|
+/* */
|
|
+/* NOTE about error codes */
|
|
+/* The general error codes use the range 0x001 to 0x7FF. */
|
|
+/* The component specific error codes are defined in the */
|
|
+/* local component header file and can use 0x800 to 0xFFF. */
|
|
+/* 0 has the value 0x00000000. */
|
|
+/* The proposed error code ranges (general and specific) are */
|
|
+/* the same for functional and non-functional errors. */
|
|
+/* */
|
|
+/* The previously defined ranges for external customers, */
|
|
+/* assert errors and fatal errors have been dropped. */
|
|
+/* The previously defined range for general errors started */
|
|
+/* at 0x000 instead of 0x001 */
|
|
+/* */
|
|
+/* DOCUMENT REF: Nexperia/MoReUse Naming Conventions */
|
|
+/* */
|
|
+/* -------------------------------------------------------------------------- */
|
|
+
|
|
+#ifndef TMNXCOMPID_H
|
|
+#define TMNXCOMPID_H
|
|
+
|
|
+/* -------------------------------------------------------------------------- */
|
|
+/* */
|
|
+/* Standard include files: */
|
|
+/* */
|
|
+/* -------------------------------------------------------------------------- */
|
|
+#include "tmNxTypes.h"
|
|
+
|
|
+/* -------------------------------------------------------------------------- */
|
|
+/* */
|
|
+/* Types and defines: */
|
|
+/* */
|
|
+/* -------------------------------------------------------------------------- */
|
|
+
|
|
+/* -------------------------------------------------------------------------- */
|
|
+/* */
|
|
+/* 0 is the 32 bit global status value used by all Nexperia components */
|
|
+/* to indicate successful function/operation status. If a non-zero value is*/
|
|
+/* returned as status, it should use the component ID formats defined. */
|
|
+/* */
|
|
+/* -------------------------------------------------------------------------- */
|
|
+
|
|
+/* -------------------------------------------------------------------------- */
|
|
+/* */
|
|
+/* General Defines */
|
|
+/* */
|
|
+/* -------------------------------------------------------------------------- */
|
|
+#define CID_IID_FLAG_BITSHIFT 31
|
|
+#define CID_ID_BITSHIFT 12
|
|
+#define IID_ID_BITSHIFT 12
|
|
+
|
|
+#define CID_FLAG (0x1U << CID_IID_FLAG_BITSHIFT)
|
|
+#define IID_FLAG (0x0U << CID_IID_FLAG_BITSHIFT)
|
|
+
|
|
+#define CID_ID(number) ((number) << CID_ID_BITSHIFT)
|
|
+#define CID_ID_BITMASK (0x7FFFFU << CID_ID_BITSHIFT)
|
|
+
|
|
+#define IID_ID(number) ((number) << IID_ID_BITSHIFT)
|
|
+#define IID_ID_BITMASK (0x7FFFFU << IID_ID_BITSHIFT)
|
|
+
|
|
+#define CID_ERR_BITMASK 0xFFFU
|
|
+#define CID_ERR_BITSHIFT 0
|
|
+#define CID_GET_ERROR(compId) ((compId & CID_ERR_BITMASK) >> CID_ERR_BITSHIFT)
|
|
+
|
|
+#define CID_BSL_HDMITX (CID_ID(0x8240U) | CID_FLAG)
|
|
+
|
|
+#define ERR_COMPATIBILITY 0x001U /* SW Interface compatibility */
|
|
+#define ERR_MAJOR_VERSION 0x002U /* SW Major Version error */
|
|
+#define ERR_COMP_VERSION 0x003U /* SW component version error */
|
|
+#define ERR_BAD_MODULE_ID 0x004U /* SW - HW module ID error */
|
|
+#define ERR_BAD_UNIT_NUMBER 0x005U /* Invalid device unit number */
|
|
+#define ERR_BAD_INSTANCE 0x006U /* Bad input instance value */
|
|
+#define ERR_BAD_HANDLE 0x007U /* Bad input handle */
|
|
+#define ERR_BAD_INDEX 0x008U /* Bad input index */
|
|
+#define ERR_BAD_PARAMETER 0x009U /* Invalid input parameter */
|
|
+#define ERR_NO_INSTANCES 0x00AU /* No instances available */
|
|
+#define ERR_NO_COMPONENT 0x00BU /* Component is not present */
|
|
+#define ERR_NO_RESOURCES 0x00CU /* Resource is not available */
|
|
+#define ERR_INSTANCE_IN_USE 0x00DU /* Instance is already in use */
|
|
+#define ERR_RESOURCE_OWNED 0x00EU /* Resource is already in use */
|
|
+#define ERR_RESOURCE_NOT_OWNED 0x00FU /* Caller does not own resource */
|
|
+#define ERR_INCONSISTENT_PARAMS 0x010U /* Inconsistent input params */
|
|
+#define ERR_NOT_INITIALIZED 0x011U /* Component is not initialized */
|
|
+#define ERR_NOT_ENABLED 0x012U /* Component is not enabled */
|
|
+#define ERR_NOT_SUPPORTED 0x013U /* Function is not supported */
|
|
+#define ERR_INIT_FAILED 0x014U /* Initialization failed */
|
|
+#define ERR_BUSY 0x015U /* Component is busy */
|
|
+#define ERR_NOT_BUSY 0x016U /* Component is not busy */
|
|
+#define ERR_READ 0x017U /* Read error */
|
|
+#define ERR_WRITE 0x018U /* Write error */
|
|
+#define ERR_ERASE 0x019U /* Erase error */
|
|
+#define ERR_LOCK 0x01AU /* Lock error */
|
|
+#define ERR_UNLOCK 0x01BU /* Unlock error */
|
|
+#define ERR_OUT_OF_MEMORY 0x01CU /* Memory allocation failed */
|
|
+#define ERR_BAD_VIRT_ADDRESS 0x01DU /* Bad virtual address */
|
|
+#define ERR_BAD_PHYS_ADDRESS 0x01EU /* Bad physical address */
|
|
+#define ERR_TIMEOUT 0x01FU /* Timeout error */
|
|
+#define ERR_OVERFLOW 0x020U /* Data overflow/overrun error */
|
|
+#define ERR_FULL 0x021U /* Queue (etc.) is full */
|
|
+#define ERR_EMPTY 0x022U /* Queue (etc.) is empty */
|
|
+#define ERR_NOT_STARTED 0x023U /* Streaming function failed */
|
|
+#define ERR_ALREADY_STARTED 0x024U /* Start function failed */
|
|
+#define ERR_NOT_STOPPED 0x025U /* Non-streaming function failed*/
|
|
+#define ERR_ALREADY_STOPPED 0x026U /* Stop function failed */
|
|
+#define ERR_ALREADY_SETUP 0x027U /* Setup function failed */
|
|
+#define ERR_NULL_PARAMETER 0x028U /* NULL input parameter */
|
|
+#define ERR_NULL_DATAINFUNC 0x029U /* NULL data input function */
|
|
+#define ERR_NULL_DATAOUTFUNC 0x02AU /* NULL data output function */
|
|
+#define ERR_NULL_CONTROLFUNC 0x02BU /* NULL control function */
|
|
+#define ERR_NULL_COMPLETIONFUNC 0x02CU /* NULL completion function */
|
|
+#define ERR_NULL_PROGRESSFUNC 0x02DU /* NULL progress function */
|
|
+#define ERR_NULL_ERRORFUNC 0x02EU /* NULL error handler function */
|
|
+#define ERR_NULL_MEMALLOCFUNC 0x02FU /* NULL memory alloc function */
|
|
+#define ERR_NULL_MEMFREEFUNC 0x030U /* NULL memory free function */
|
|
+#define ERR_NULL_CONFIGFUNC 0x031U /* NULL configuration function */
|
|
+#define ERR_NULL_PARENT 0x032U /* NULL parent data */
|
|
+#define ERR_NULL_IODESC 0x033U /* NULL in/out descriptor */
|
|
+#define ERR_NULL_CTRLDESC 0x034U /* NULL control descriptor */
|
|
+#define ERR_UNSUPPORTED_DATACLASS 0x035U /* Unsupported data class */
|
|
+#define ERR_UNSUPPORTED_DATATYPE 0x036U /* Unsupported data type */
|
|
+#define ERR_UNSUPPORTED_DATASUBTYPE 0x037U /* Unsupported data subtype */
|
|
+#define ERR_FORMAT 0x038U /* Invalid/unsupported format */
|
|
+#define ERR_INPUT_DESC_FLAGS 0x039U /* Bad input descriptor flags */
|
|
+#define ERR_OUTPUT_DESC_FLAGS 0x03AU /* Bad output descriptor flags */
|
|
+#define ERR_CAP_REQUIRED 0x03BU /* Capabilities required ??? */
|
|
+#define ERR_BAD_TMALFUNC_TABLE 0x03CU /* Bad TMAL function table */
|
|
+#define ERR_INVALID_CHANNEL_ID 0x03DU /* Invalid channel identifier */
|
|
+#define ERR_INVALID_COMMAND 0x03EU /* Invalid command/request */
|
|
+#define ERR_STREAM_MODE_CONFUSION 0x03FU /* Stream mode config conflict */
|
|
+#define ERR_UNDERRUN 0x040U /* Data underflow/underrun */
|
|
+#define ERR_EMPTY_PACKET_RECVD 0x041U /* Empty data packet received */
|
|
+#define ERR_OTHER_DATAINOUT_ERR 0x042U /* Other data input/output err */
|
|
+#define ERR_STOP_REQUESTED 0x043U /* Stop in progress */
|
|
+#define ERR_ASSERTION 0x049U /* Assertion failure */
|
|
+#define ERR_HIGHWAY_BANDWIDTH 0x04AU /* Highway bandwidth bus error */
|
|
+#define ERR_HW_RESET_FAILED 0x04BU /* Hardware reset failed */
|
|
+#define ERR_BAD_FLAGS 0x04DU /* Bad flags */
|
|
+#define ERR_BAD_PRIORITY 0x04EU /* Bad priority */
|
|
+#define ERR_BAD_REFERENCE_COUNT 0x04FU /* Bad reference count */
|
|
+#define ERR_BAD_SETUP 0x050U /* Bad setup */
|
|
+#define ERR_BAD_STACK_SIZE 0x051U /* Bad stack size */
|
|
+#define ERR_BAD_TEE 0x052U /* Bad tee */
|
|
+#define ERR_IN_PLACE 0x053U /* In place */
|
|
+#define ERR_NOT_CACHE_ALIGNED 0x054U /* Not cache aligned */
|
|
+#define ERR_NO_ROOT_TEE 0x055U /* No root tee */
|
|
+#define ERR_NO_TEE_ALLOWED 0x056U /* No tee allowed */
|
|
+#define ERR_NO_TEE_EMPTY_PACKET 0x057U /* No tee empty packet */
|
|
+#define ERR_NULL_PACKET 0x059U /* NULL packet */
|
|
+#define ERR_FORMAT_FREED 0x05AU /* Format freed */
|
|
+#define ERR_FORMAT_INTERNAL 0x05BU /* Format internal */
|
|
+#define ERR_BAD_FORMAT 0x05CU /* Bad format */
|
|
+#define ERR_FORMAT_NEGOTIATE_DATACLASS 0x05DU /* Format negotiate class */
|
|
+#define ERR_FORMAT_NEGOTIATE_DATATYPE 0x05EU /* Format negotiate type */
|
|
+#define ERR_FORMAT_NEGOTIATE_DATASUBTYPE 0x05FU /* Format negotiate subtype */
|
|
+#define ERR_FORMAT_NEGOTIATE_DESCRIPTION 0x060U /* Format negotiate desc */
|
|
+#define ERR_NULL_FORMAT 0x061U /* NULL format */
|
|
+#define ERR_FORMAT_REFERENCE_COUNT 0x062U /* Format reference count */
|
|
+#define ERR_FORMAT_NOT_UNIQUE 0x063U /* Format not unique */
|
|
+#define NEW_FORMAT 0x064U /* New format (not an error) */
|
|
+#define ERR_FORMAT_NEGOTIATE_EXTENSION 0x065U /* Format negotiate extension */
|
|
+#define ERR_INVALID_STATE 0x066U /* Invalid state for function */
|
|
+#define ERR_NULL_CONNECTION 0x067U /* No connection to this pin */
|
|
+#define ERR_OPERATION_NOT_PERMITTED 0x068U /* corresponds to posix EPERM */
|
|
+#define ERR_NOT_CLOCKED 0x069U /* Power down - clocked off */
|
|
+
|
|
+
|
|
+#endif /* TMNXCOMPID_H ----------------- */
|
|
diff --git a/drivers/video/hdmi/inc/tmNxTypes.h b/drivers/video/hdmi/inc/tmNxTypes.h
|
|
new file mode 100644
|
|
index 0000000..645a779
|
|
--- /dev/null
|
|
+++ b/drivers/video/hdmi/inc/tmNxTypes.h
|
|
@@ -0,0 +1,177 @@
|
|
+/*==========================================================================*/
|
|
+/* (Copyright (C) 2003 Koninklijke Philips Electronics N.V. */
|
|
+/* All rights reserved. */
|
|
+/* This source code and any compilation or derivative thereof is the */
|
|
+/* proprietary information of Koninklijke Philips Electronics N.V. */
|
|
+/* and is confidential in nature. */
|
|
+/* Under no circumstances is this software to be exposed to or placed */
|
|
+/* under an Open Source License of any type without the expressed */
|
|
+/* written permission of Koninklijke Philips Electronics N.V. */
|
|
+/*==========================================================================*/
|
|
+/*
|
|
+ * Copyright (C) 2000,2001
|
|
+ * Koninklijke Philips Electronics N.V.
|
|
+ * All Rights Reserved.
|
|
+ *
|
|
+ * Copyright (C) 2000,2001 TriMedia Technologies, Inc.
|
|
+ * All Rights Reserved.
|
|
+ *
|
|
+ *############################################################
|
|
+ *
|
|
+ * Module name : tmNxTypes.h %version: 7 %
|
|
+ *
|
|
+ * Last Update : %date_modified: Tue Jul 8 18:08:00 2003 %
|
|
+ *
|
|
+ * Description: TriMedia/MIPS global type definitions.
|
|
+ *
|
|
+ * Document Ref: DVP Software Coding Guidelines Specification
|
|
+ * DVP/MoReUse Naming Conventions specification
|
|
+ * DVP Software Versioning Specification
|
|
+ * DVP Device Library Architecture Specification
|
|
+ * DVP Board Support Library Architecture Specification
|
|
+ * DVP Hardware API Architecture Specification
|
|
+ *
|
|
+ *
|
|
+ *############################################################
|
|
+ * */
|
|
+
|
|
+#ifndef TMNXTYPES_H
|
|
+#define TMNXTYPES_H
|
|
+
|
|
+#include <linux/kernel.h>
|
|
+
|
|
+#ifndef _TMtypes_h
|
|
+#define _TMtypes_h
|
|
+
|
|
+#define false 0
|
|
+#define true 1
|
|
+
|
|
+/*----------------------------------------------------------------------------- */
|
|
+/* Legacy TM Types/Structures (Not necessarily DVP Coding Guideline compliant) */
|
|
+/* NOTE: For DVP Coding Gudeline compliant code, do not use these types. */
|
|
+
|
|
+typedef char *address; /* Ready for address-arithmetic */
|
|
+typedef char const *const_address;
|
|
+typedef unsigned char byte; /* Raw byte */
|
|
+typedef float float32; /* Single-precision float */
|
|
+typedef double float64; /* Double-precision float */
|
|
+typedef void *pointer; /* Pointer to anonymous object */
|
|
+typedef void const *const_pointer;
|
|
+typedef char const *const_string;
|
|
+
|
|
+typedef int endian;
|
|
+#define BigEndian 0
|
|
+#define LittleEndian 1
|
|
+
|
|
+typedef struct version {
|
|
+ u8 major_version;
|
|
+ u8 minor_version;
|
|
+ u16 build_version;
|
|
+} version_t, *p_version_t;
|
|
+#endif /*ndef _TMtypes_h*/
|
|
+
|
|
+#define TMFL_ENDIAN_BIG 1
|
|
+#define TMFL_ENDIAN_LITTLE 0
|
|
+#define TMFL_ENDIAN (TMFL_ENDIAN_LITTLE)
|
|
+
|
|
+/*Define DVP types that are not TCS types.*/
|
|
+/*
|
|
+ ** ===== updated from SDE2/2.3_beta/sde_template/inc/nx_types.h =====
|
|
+ **
|
|
+ ** NOTE: ibits32/ubits32 types are defined for use with 32 bit bitfields.
|
|
+ ** this is done because ANSI/ISO compliant compilers require bitfields
|
|
+ ** to be of type "int" else a large number of compiler warnings will
|
|
+ ** result. to avoid the risks associated with redefining int32/u32
|
|
+ ** to type "int" instead of type "long" (which are the same size on 32
|
|
+ ** bit cpus) separate 32bit signed/unsigned bitfield types are defined.
|
|
+ * */
|
|
+/* FIXME */
|
|
+typedef signed int ibits32; /* 32 bit signed integer bitfields */
|
|
+typedef unsigned int ubits32; /* 32 bit unsigned integer bitfields */
|
|
+typedef ibits32 *p_ibits32; /* 32 bit signed integer bitfield ptr */
|
|
+typedef ubits32 *p_ubits32; /* 32 bit unsigned integer bitfield ptr */
|
|
+
|
|
+typedef char *p_int8; /* 8 bit signed integer */
|
|
+typedef s16 *p_int16; /* 16 bit signed integer */
|
|
+typedef s32 *p_int32; /* 32 bit signed integer */
|
|
+typedef u8 *p_uint8; /* 8 bit unsigned integer */
|
|
+typedef u16 *p_uint16; /* 16 bit unsigned integer */
|
|
+typedef u32 *p_uint32; /* 32 bit unsigned integer */
|
|
+typedef void *p_void; /* void (typeless) */
|
|
+typedef float *p_float; /* 32 bit floating point */
|
|
+typedef double *p_double; /* 32/64 bit floating point */
|
|
+typedef bool *p_bool; /* Boolean (true/false) */
|
|
+typedef char *p_char; /* character, character array ptr */
|
|
+typedef int *p_int; /* machine-natural integer */
|
|
+typedef uint *p_uint; /* machine-natural unsigned integer */
|
|
+
|
|
+/* Maximum length of device name in all BSP and capability structures */
|
|
+#define HAL_DEVICE_NAME_LENGTH 16
|
|
+
|
|
+typedef u32 error_code_t;
|
|
+typedef u32 progress_code_t;
|
|
+
|
|
+
|
|
+//-----------------------------------------------------------------------------
|
|
+// Hardware device power states
|
|
+//
|
|
+typedef enum tmPowerState
|
|
+{
|
|
+ power_on, // Device powered on (D0 state)
|
|
+ power_standby, // Device power standby (D1 state)
|
|
+ power_suspend, // Device power suspended (D2 state)
|
|
+ power_off // Device powered off (D3 state)
|
|
+
|
|
+} power_state_t, *p_power_state_t;
|
|
+
|
|
+/*----------------------------------------------------------------------------- */
|
|
+/* Software Version Structure */
|
|
+
|
|
+typedef struct swversion {
|
|
+ u32 compatibility_nr; /* Interface compatibility number */
|
|
+ u32 major_version_nr; /* Interface major version number */
|
|
+ u32 minor_version_nr; /* Interface minor version number */
|
|
+
|
|
+} swversion_t, *p_swversion_t;
|
|
+
|
|
+/*Under the TCS, <tm1/tmBoardDef.h> may have been included by our client. In
|
|
+ * order to avoid errors, we take account of this possibility, but in order to
|
|
+ * support environments where the TCS is not available, we do not include the
|
|
+ * file by name.*/
|
|
+#ifndef _TMBOARDDEF_H_
|
|
+#define _TMBOARDDEF_H_
|
|
+
|
|
+/*----------------------------------------------------------------------------- */
|
|
+/* HW Unit Selection */
|
|
+
|
|
+typedef int unit_select_t, *p_unit_select_t;
|
|
+
|
|
+#define tmUnitNone (-1)
|
|
+#define tmUnit0 0
|
|
+#define tmUnit1 1
|
|
+#define tmUnit2 2
|
|
+#define tmUnit3 3
|
|
+#define tmUnit4 4
|
|
+
|
|
+/*+compatibility*/
|
|
+#define unitSelect_t tmUnitSelect_t
|
|
+#define unit0 tmUnit0
|
|
+#define unit1 tmUnit1
|
|
+#define unit2 tmUnit2
|
|
+#define unit3 tmUnit3
|
|
+#define unit4 tmUnit4
|
|
+#define DEVICE_NAME_LENGTH HAL_DEVICE_NAME_LENGTH
|
|
+/*-compatibility*/
|
|
+
|
|
+#endif /*ndef _TMBOARDDEF_H_ */
|
|
+
|
|
+/*----------------------------------------------------------------------------- */
|
|
+/* Instance handle */
|
|
+
|
|
+typedef int instance_t, *p_instance_t;
|
|
+
|
|
+/* Callback function declaration */
|
|
+typedef void(*p_callback_t)(u32 events, void *p_data, u32 user_data);
|
|
+#define tmCallback_t ptmCallback_t /*compatibility*/
|
|
+
|
|
+#endif /*ndef TMNXTYPES_H */
|
|
diff --git a/drivers/video/hdmi/release_note.txt b/drivers/video/hdmi/release_note.txt
|
|
new file mode 100644
|
|
index 0000000..4d427e8
|
|
--- /dev/null
|
|
+++ b/drivers/video/hdmi/release_note.txt
|
|
@@ -0,0 +1,305 @@
|
|
+Release note:
|
|
+
|
|
+-------------------------------
|
|
+ HDMI Tx modules for TDA998x
|
|
+ by
|
|
+ NXP Semiconductors BV
|
|
+-------------------------------
|
|
+
|
|
+The release note gives all necessary detail for installation in Linux
|
|
+kernel and application tunning. Installation is Linux typical and does
|
|
+not require any HDMI background. A default video and audio setting is
|
|
+defined in hdmi_tx_init function. It can be changed at will.
|
|
+There is no porting to do, it is already provided in module. And the
|
|
+classical HDMI DevLib is embedded in it. But the UserManual is still
|
|
+usefull for customers who like to optimise the module according to
|
|
+their needs. If so, feedback is welcome. ;)
|
|
+Customers who like to drive the module from userland can do it using
|
|
+IOCTL. IOCTL maps the classical HDMI API. Using the WAIT_FRAME IOCTL,
|
|
+userland can catch HDMI events like Hot Plug Detect, RxSens or EDID.
|
|
+
|
|
+So the two main functions the customer needs to take care are :
|
|
+- hdmi_tx_init
|
|
+- eventCallbackTx
|
|
+
|
|
+For OMAP architecture, a DSS plugin is provided. So in order to activate
|
|
+HDMI (switch DSS to HDMI output) just prompt on target:
|
|
+echo "3" > /sys/power/vdd2_lock
|
|
+echo "1" > /sys/devices/platform/omapdss/display2/enabled
|
|
+And desactivate :
|
|
+echo "0" > /sys/devices/platform/omapdss/display2/enabled
|
|
+
|
|
+-------------------------------
|
|
+
|
|
+- Contains :
|
|
+ . HdmiTx Linux module
|
|
+ . HdmiCec linux module
|
|
+ . HDCP linux module (on request only)
|
|
+ . test_hdmi/demo_tda test application
|
|
+ . TRANSMITTER_TDA998X_SW_UM_Devlib.pdf for HDMI TX API
|
|
+ . HDMI_CEC_User_Manual.pdf for HDMI CEC API
|
|
+ . this release note
|
|
+
|
|
+- Features :
|
|
+ . HDMI transmiter
|
|
+ . Hot Plug Detection
|
|
+ . HDCP (on request only)
|
|
+ . Customer Electronics Control (v1.4)
|
|
+
|
|
+- Target :
|
|
+ . OMAP3430-ZOOMII (http://omappedia.org/wiki/Android_Getting_Started)
|
|
+
|
|
+- OS :
|
|
+ . Linux Kernel 2.6.29, Android RLS25.12
|
|
+
|
|
+- Directory :
|
|
+ . driver/video/hdmi
|
|
+ . driver/video/hdcp (only if hdcp is delivered)
|
|
+
|
|
+- Compilation tool :
|
|
+ . arm-2007q3-51-arm-none-linux-gnueabi-i686-pc-linux-gnu
|
|
+
|
|
+-------------------------------
|
|
+
|
|
+- Release :
|
|
+
|
|
+ * V1.0: 2010, 1st Jully by Andre Lepine
|
|
+ . ATC compliancy
|
|
+ . BCaps polling during 5s when CCLK is not devided by 2
|
|
+ . It HPD+RxSens rebound (several changes before SW polling)
|
|
+ . EDID used for video mode switch (HDMI, DVI)
|
|
+ . blue screen before the HDCP authentification is passed
|
|
+ . TDA reset when removing Linux module
|
|
+ . hdcp_fail_status not used in TDA9981
|
|
+ * V0.964: 2010, 25th may by Andre Lepine
|
|
+ . Check incoming REQUEST_ACTIVE_SOURCE is a broadcast
|
|
+ * V0.963: 2010, 21th may by Andre Lepine
|
|
+ . External HDCP module validation
|
|
+ * V0.963: 2010, 18th may by Andre Lepine
|
|
+ . External HDCP module validation
|
|
+ * V0.962: 2010, 11th may by Andre Lepine
|
|
+ . Clean up
|
|
+ * V0.961: 2010, 4th may by Andre Lepine
|
|
+ . Put image_view_on under compilation flag because it is not suitable for
|
|
+ "only hdmi with videoplay" usecase
|
|
+ . DEVICE_VENDOR_ID boradcast after logical address retrival
|
|
+ . Allow CEC_OPCODE_VENDOR_COMMAND and CEC_OPCODE_DEVICE_VENDOR_ID (not send FEATURE ABORTED)
|
|
+ * V0.96: 2010, 16th april by Andre Lepine
|
|
+ . Accept HDCP support using the proprietary module nwolc.ko
|
|
+ * V0.95: 2010, 23th march by Andre Lepine
|
|
+ . Add TDA9981 driver
|
|
+ * V0.94: 2010, 19th march by Andre Lepine
|
|
+ . Merge TDA19989, TDA9984 and TDA9983 drivers
|
|
+ * V0.92: 2010, 11th march by Andre Lepine
|
|
+ . Clean-up
|
|
+ . DSS pixclock inversion
|
|
+ * V0.91: 2010, 18th february by Andre Lepine
|
|
+ . porting for TDA9983
|
|
+ * V0.9: 2010, 2nd february by Andre Lepine
|
|
+ . Change directory structure
|
|
+ . Update NXP DevLib
|
|
+ . CEC & HDP event handeling fix
|
|
+ * V0.8: 2010, 18 january by Andre Lepine
|
|
+ . Pure IRQ (remove IRQ flag for polling with timer)
|
|
+ . Merge with last HdmiTx and HdmiCec version
|
|
+ . Cec initialization and power state
|
|
+ . Check argument of IOCTL and use -EFAULT when inconsistant
|
|
+ * V0.7: 2010, 11 january by Andre Lepine
|
|
+ . Automatic CEC answering for following opcodes :
|
|
+ > GIVE_PHYSICAL_ADDRESS
|
|
+ > GET_CEC_VERSION
|
|
+ > GIVE_OSD_NAME
|
|
+ > GIVE_DEVICE_VENDOR_ID
|
|
+ > REQUEST_ACTIVE_SOURCE
|
|
+ > GIVE_DEVICE_POWER_STATUS
|
|
+ > STANDBY
|
|
+ > SET_STREAM_PATH
|
|
+ > ROUTING_CHANGE
|
|
+ > ABORT_MESSAGE
|
|
+ . Automatic logical address negociation
|
|
+ . HdmiCec gets EDID physical address and HDMI status from HdmiTx
|
|
+
|
|
+-------------------------------
|
|
+
|
|
+- Installation :
|
|
+
|
|
+ * On host:
|
|
+ . mkdir $KERNEL_MODULES
|
|
+ . cp linux-hdmi-nxp-modules.v##.cvfj $KERNEL_MODULES/.
|
|
+ . cd $KERNEL_MODULES
|
|
+ . tar xvfj linux-hdmi-nxp-modules.v##.cvfj
|
|
+ . update LINUX_DIR in hdmi/MakeModules with your kernel directory path
|
|
+ . select your TDA target in Makefile : for example TDA_TX := TDA9984 !!! CAUTION, don't forget this !!!
|
|
+ . select your platform in Makefile : for example TDA_PLATFORM := ZOOMII
|
|
+ . cd hdmi
|
|
+ . make -f MakeModules clean (optional for the first time)
|
|
+ . make -f MakeModules
|
|
+ . make -f MakeModules uptx (or any download mean that does not use adb)
|
|
+ . make -f MakeModules upcec (or any download mean that does not use adb)
|
|
+ . cd hdcp
|
|
+ . make -f MakeModules
|
|
+ . make -f MakeModules up (or any download mean that does not use adb)
|
|
+ * Application (optional), better use your own, this one is just a sample
|
|
+ . cd test
|
|
+ . make clean (optional for the first time)
|
|
+ . make
|
|
+ . make upload (or any download mean that does not use adb)
|
|
+ * On target:
|
|
+ . insmod hdmitx.ko verbose=1 (remove verbose to make the module silent)
|
|
+ . insmod hdmicec.ko verbose=1 device=4 (remove verbose to make the module silent)
|
|
+ . insmod nwolc.ko (only for HDCP)
|
|
+ * On TV
|
|
+ . connect TV to target
|
|
+
|
|
+- Usage :
|
|
+
|
|
+ . hdmitx module parameters used with insmod :
|
|
+ > verbose: Make the driver verbose
|
|
+ > major: The major number of the device mapper
|
|
+ . hdmicec module parameters used with insmod :
|
|
+ > verbose: Make the driver verbose
|
|
+ > major: The major number of the device mapper
|
|
+ > device: Device type can be 0:tv, 1:rec 3:tuner 4:mediaplayer, 5:audio
|
|
+ > addr: Physical address (until EDID received)
|
|
+ . modules handles automaticaly HPD, EDID and following CEC messaging :
|
|
+ device connectivity and addressing, routing, standby, OSD name,
|
|
+ vendor name features.
|
|
+ . tda_demo test application show how to take control of the two modules
|
|
+ from userland and catch CEC messages
|
|
+ BUT HDMI MODULES CAN RUN WITHOUT IT
|
|
+ . HDCP feature is only supported if nwolc module is installed, you can
|
|
+ add it or remove it dynamically using insmod nwolc.ko and rmmod nwolk.
|
|
+
|
|
+- FAQ :
|
|
+
|
|
+ . "this->driver.i2c_client not allocated" :
|
|
+ 1) Declare your I2C bus usage in arch/arm/mach-omap2/board-zoom2.c as follow :
|
|
+ | static struct i2c_board_info __initdata zoom2_i2c_bus3_info[] = {
|
|
+ | {I2C_BOARD_INFO(TX_NAME, TDA998X_I2C_SLAVEADDRESS),},
|
|
+ | {I2C_BOARD_INFO(CEC_NAME, TDA99XCEC_I2C_SLAVEADDRESS),},
|
|
+ | };
|
|
+ 2) Check the TDA target in Makefile : for example TDA_TX := TDA9984
|
|
+
|
|
+ . "Video format and plan are strange..." :
|
|
+ Check tda.setio.videoout/in in hdmi_tx_init() function of tda998x.c
|
|
+
|
|
+ . "The resolution is not the one I want" :
|
|
+ Update or create your own omap_video_timings structure and change
|
|
+ the video resolution of this->tda.setio.video_out.format in hdmi_tx_init()
|
|
+
|
|
+ . I want "720p@60Hz" :
|
|
+ 1- Line 860: Uncomment> /* this->tda.setio.video_out.format = TMDL_HDMITX_VFMT_04_1280x720p_60Hz; */
|
|
+ 2- Line 862: Comment> this->tda.setio.video_out.format = TMDL_HDMITX_VFMT_02_720x480p_60Hz;
|
|
+ 3- Line 1051: Replace> video_720x480at60Hz_panel_timings with video_1280x720at60Hz_panel_timings
|
|
+
|
|
+ . "Where can I find all video format definition ?":
|
|
+ in hdmi/comps/tmdlHdmiTx/inc/tmdlHdmiTx_Types.h
|
|
+
|
|
+ . "Where can I find all audio format definition ?":
|
|
+ in hdmi/comps/tmdlHdmiTx/inc/tmdlHdmiTx_Types.h
|
|
+
|
|
+ . "Where can I find all HDMI types definition ?":
|
|
+ in hdmi/comps/tmdlHdmiTx/inc/tmdlHdmiTx_Types.h
|
|
+
|
|
+ . "Where can I find all power management types definition ?":
|
|
+ in hdmi/comps/tmdlHdmiTx/inc/tmdlHdmiTx_Types.h
|
|
+
|
|
+ . "Where can I find all HDMI Tx API definition ?":
|
|
+ in hdmi/comps/tmdlHdmiTx/inc/tmdlHdmiTx_Functions.h
|
|
+
|
|
+ . "Where can I find all HDMI CEC types definition ?":
|
|
+ in hdmi/comps/tmdlHdmiCec/inc/tmdlHdmiCec_Types.h
|
|
+
|
|
+ . "Where can I find all HDMI CEC API definition ?":
|
|
+ in hdmi/comps/tmdlHdmiCec/inc/tmdlHdmiCec_Functions.h
|
|
+
|
|
+ . "I would like to get debug message" :
|
|
+ Install the module with debug messages > insmod hdmitx.ko verbose=1
|
|
+
|
|
+ . "I would like to see the EDID of the TV" :
|
|
+ Install the module with debug messages > insmod hdmitx.ko verbose=1
|
|
+
|
|
+
|
|
+ . "On the TV display some pixel are flickering" :
|
|
+ Check the OMAP DSS setup and update the dssdev->panel.config parameters
|
|
+
|
|
+ . "CEC send Samsung vendor ID" :
|
|
+ Yes, otherwise you cannot use Samsung devices... replace is by your own
|
|
+
|
|
+ . "I don't use OMAP"
|
|
+ This module contains an OMAP Display SubSystem plugin that automatically
|
|
+ drives video output of OMAP (video input of TDA). If you don't have OMAP
|
|
+ remove the ANDROID_DSS (or add your PLATFORM flag in Makefile) and do
|
|
+ the video bus configuration at your convience. Anyhow, any other usefull
|
|
+ plugin is welcome... So please feedback ;)
|
|
+
|
|
+ . "How to install HDMI module ?"
|
|
+ See installation chapter above.
|
|
+
|
|
+ . "HDCP is not supported"
|
|
+ Ask NXP to deliver you the proprietary HDCP module
|
|
+
|
|
+ . "HDCP module does not work"
|
|
+ Ask NXP to provide you your customer seed number...
|
|
+
|
|
+ . "How can I control the HDMI with my apps ?"
|
|
+ Use open("/dev/hdmitx") to get access to HdmiTx module.
|
|
+ Then use ioctl as described in tda998x_ioctl.h.
|
|
+
|
|
+ . "How can I control CEC with my apps ?"
|
|
+ Use open("/dev/hdmicec") to get access to HdmiCec module.
|
|
+ Then use ioctl as described in tda998x_ioctl.h.
|
|
+
|
|
+ . "How can my application get the HDMI event ?"
|
|
+ Create a dedicated incoming event thread in your apps and use ioctl WAIT_EVENT
|
|
+
|
|
+ . "Is is mandatory to create an incoming event thread in my apps ?"
|
|
+ No if you don't care.
|
|
+
|
|
+ . "Did I need to create some apps to make HDMI running ?"
|
|
+ No, you can modify hdmi_tx_init according to your needs and install the
|
|
+ modules in your init.rc. Hdmi will run automatically.
|
|
+
|
|
+- Restriction :
|
|
+
|
|
+ . Remove IRQ flag in Makefile for timer based polling
|
|
+ . Add ZOOMII_PATCH to reverse clock edge in ZOOMII
|
|
+ . add TWL4030_HACK to get keypad handle and inject CEC::USER_CONTROL events
|
|
+ . omap_dss_driver might not be supported by kernel, then hdmi_enable
|
|
+ and hdmi_disable should be triggered by any other kernel means or
|
|
+ replaced by direct call from application using:
|
|
+ --> ioctl(my_fd,TDA_IOCTL_SET_POWER,[tmPowerOn|tmPowerStandby]);
|
|
+ . HDCP can not be switch off dynamically with TDA_IOCTL_SET_HDCP but
|
|
+ removing nwolc.ko module
|
|
+
|
|
+- License :
|
|
+
|
|
+ . hdmitx and hdmicec modules are free software; you can redistribute
|
|
+ it and/or modify it under the terms of the GNU General Public License
|
|
+ as published by the Free Software Foundation, using version 2 of the License.
|
|
+ These modules are distributed in the hope that it will be useful, but
|
|
+ WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
|
+ or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
|
+ for more details.
|
|
+ . nwolc module source code and any compilation or derivative thereof is
|
|
+ the proprietary information of NXP N.V. and is confidential in nature.
|
|
+ Under no circumstances is this software to be exposed to or placed under
|
|
+ an Open Source License of any type without the expressed written permission
|
|
+ of NXP N.V.
|
|
+
|
|
+- DV :
|
|
+
|
|
+ . How to create a DV :
|
|
+ -> update tda998xversion.h and set PATCH_LEVEL to 0
|
|
+ -> update release_note.txt
|
|
+ $>cd driver/video/hdmi
|
|
+ $>make -f MakeModules clean
|
|
+ $>cd ..
|
|
+ $>tar cvfj $DV_FOLDER/linux-hdmi-nxp-modules.vXYZ.tar.cvfj hdmi
|
|
+
|
|
+-----------------------------------
|
|
+
|
|
+- Feedback : andre.lepine@nxp.com -
|
|
+
|
|
+-----------------------------------
|
|
+
|
|
diff --git a/drivers/video/hdmi/tda998x.c b/drivers/video/hdmi/tda998x.c
|
|
new file mode 100644
|
|
index 0000000..f2c531c
|
|
--- /dev/null
|
|
+++ b/drivers/video/hdmi/tda998x.c
|
|
@@ -0,0 +1,2481 @@
|
|
+/*****************************************************************************/
|
|
+/* Copyright (c) 2009 NXP Semiconductors BV */
|
|
+/* */
|
|
+/* This program is free software; you can redistribute it and/or modify */
|
|
+/* it under the terms of the GNU General Public License as published by */
|
|
+/* the Free Software Foundation, using version 2 of the License. */
|
|
+/* */
|
|
+/* This program is distributed in the hope that it will be useful, */
|
|
+/* but WITHOUT ANY WARRANTY; without even the implied warranty of */
|
|
+/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */
|
|
+/* GNU General Public License for more details. */
|
|
+/* */
|
|
+/* You should have received a copy of the GNU General Public License */
|
|
+/* along with this program; if not, write to the Free Software */
|
|
+/* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 */
|
|
+/* USA. */
|
|
+/* */
|
|
+/*****************************************************************************/
|
|
+
|
|
+#define _tx_c_
|
|
+
|
|
+#include <linux/kernel.h>
|
|
+#include <linux/init.h>
|
|
+#include <linux/module.h>
|
|
+#include <linux/cdev.h>
|
|
+#include <linux/fs.h>
|
|
+#include <linux/ioctl.h>
|
|
+#include <linux/i2c.h>
|
|
+#include <linux/delay.h>
|
|
+#include <linux/workqueue.h>
|
|
+#include <linux/interrupt.h>
|
|
+#include <linux/slab.h>
|
|
+#include <asm/uaccess.h>
|
|
+/*#include <mach/gpio.h>*/
|
|
+#include <asm/gpio.h>
|
|
+/*#include <mach/display.h> */
|
|
+
|
|
+/* HDMI DevLib */
|
|
+#include "tmNxCompId.h"
|
|
+#include "tmdlHdmiTx_Types.h"
|
|
+#include "tmdlHdmiTx_Functions.h"
|
|
+
|
|
+/* local */
|
|
+#include "tda998x_version.h"
|
|
+#include "tda998x.h"
|
|
+#include "tda998x_ioctl.h"
|
|
+
|
|
+#ifdef ANDROID_DSS
|
|
+/* DSS hack */
|
|
+#include <../omap2/dss/dss.h>
|
|
+#endif
|
|
+
|
|
+/*
|
|
+ *
|
|
+ * DEFINITION
|
|
+ * ----------
|
|
+ * LEVEL 0
|
|
+ *
|
|
+ * */
|
|
+
|
|
+/*
|
|
+ * Global
|
|
+ * */
|
|
+
|
|
+tda_instance our_instance;
|
|
+static struct cdev our_cdev, *this_cdev = &our_cdev;
|
|
+#ifdef ANDROID_DSS
|
|
+static struct omap_video_timings video_640x480at60hz_panel_timings = {
|
|
+ .x_res = 640,
|
|
+ .y_res = 480,
|
|
+ .pixel_clock = 25175,
|
|
+ .hfp = 16,
|
|
+ .hsw = 96,
|
|
+ .hbp = 48,
|
|
+ .vfp = 10,
|
|
+ .vsw = 2,
|
|
+ .vbp = 33,
|
|
+};
|
|
+static struct omap_video_timings video_640x480at72hz_panel_timings = {
|
|
+ .x_res = 640,
|
|
+ .y_res = 480,
|
|
+ .pixel_clock = 31500,
|
|
+ .hfp = 24,
|
|
+ .hsw = 40,
|
|
+ .hbp = 128,
|
|
+ .vfp = 9,
|
|
+ .vsw = 3,
|
|
+ .vbp = 28,
|
|
+};
|
|
+static struct omap_video_timings video_720x480at60hz_panel_timings = {
|
|
+ .x_res = 720,
|
|
+ .y_res = 480,
|
|
+ .pixel_clock = 27027,
|
|
+ .hfp = 16,
|
|
+ .hbp = 60,
|
|
+ .hsw = 62,
|
|
+ .vfp = 9,
|
|
+ .vbp = 30,
|
|
+ .vsw = 6,
|
|
+};
|
|
+static struct omap_video_timings video_1280x720at50hz_panel_timings = {
|
|
+ .x_res = 1280,
|
|
+ .y_res = 720,
|
|
+ .pixel_clock = 74250,
|
|
+#ifdef ZOOMII_PATCH
|
|
+ .hfp = 400,
|
|
+ .hbp = 260,
|
|
+#else
|
|
+ .hfp = 440,
|
|
+ .hbp = 220,
|
|
+#endif
|
|
+ .hsw = 40,
|
|
+ .vfp = 5,
|
|
+ .vbp = 20,
|
|
+ .vsw = 5,
|
|
+};
|
|
+static struct omap_video_timings video_1280x720at60hz_panel_timings = {
|
|
+ .x_res = 1280,
|
|
+ .y_res = 720,
|
|
+ .pixel_clock = 74250,
|
|
+#ifdef ZOOMII_PATCH
|
|
+ .hfp = 70,
|
|
+ .hbp = 260,
|
|
+#else
|
|
+ .hfp = 110,
|
|
+ .hbp = 220,
|
|
+#endif
|
|
+ .hsw = 40,
|
|
+ .vfp = 5,
|
|
+ .vbp = 20,
|
|
+ .vsw = 5,
|
|
+};
|
|
+static struct omap_video_timings video_1920x1080at50hz_panel_timings = {
|
|
+ .x_res = 1920,
|
|
+ .y_res = 1080,
|
|
+ .pixel_clock = 148500, /* 2640 x 1125 x 50 /2 */
|
|
+#ifdef ZOOMII_PATCH
|
|
+ .hfp = 488,
|
|
+ .hbp = 188,
|
|
+#else
|
|
+ .hfp = 528,
|
|
+ .hbp = 148,
|
|
+#endif
|
|
+ .hsw = 44,
|
|
+ .vfp = 4,
|
|
+ .vbp = 36,
|
|
+ .vsw = 5,
|
|
+};
|
|
+static struct omap_video_timings video_800x480at60hz_panel_timings = {
|
|
+ /* .x_res = 800 /\* 1280 *\/, */
|
|
+ /* .y_res = 480 /\* 720 *\/, */
|
|
+ /* .pixel_clock = 21800 /\* 21800 23800 25700 *\/, */
|
|
+ .x_res = 800,
|
|
+ .y_res = 480,
|
|
+ .pixel_clock = 21800,
|
|
+ .hfp = 6,
|
|
+ .hsw = 1,
|
|
+ .hbp = 4,
|
|
+ .vfp = 3,
|
|
+ .vsw = 1,
|
|
+ .vbp = 4,
|
|
+};
|
|
+
|
|
+struct omap_dss_device *sysdss;
|
|
+#endif
|
|
+
|
|
+/* #define HDCP_TEST 1 */
|
|
+#ifdef HDCP_TEST
|
|
+/* TEST */
|
|
+int test = 0;
|
|
+#endif
|
|
+
|
|
+/*
|
|
+ * Module params
|
|
+ * */
|
|
+
|
|
+static int param_verbose = 0, param_major = 0, param_minor = 0;
|
|
+module_param_named(verbose, param_verbose, int, S_IRUGO | S_IWUSR);
|
|
+MODULE_PARM_DESC(verbose, "make the driver verbose");
|
|
+module_param_named(major, param_major, int, S_IRUGO);
|
|
+MODULE_PARM_DESC(major, "the major number of the device mapper");
|
|
+
|
|
+/*
|
|
+ *
|
|
+ * TOOLBOX
|
|
+ * -------
|
|
+ * LEVEL 1
|
|
+ *
|
|
+ * - i2c read/write
|
|
+ * - chip Id check
|
|
+ * - i2c client info
|
|
+ *
|
|
+ * */
|
|
+
|
|
+/*
|
|
+ * no mknod nor busybox, so patch it
|
|
+ * */
|
|
+/* static int create_dev(char *name, dev_t dev) */
|
|
+/* { */
|
|
+/* sys_unlink(name); */
|
|
+/* return sys_mknod((const char __user *) name, S_IFCHR|0666 /\* S_IFCHR | S_IRUSR | S_IWUSR *\/, new_encode_dev(dev)); */
|
|
+/* } */
|
|
+
|
|
+/*
|
|
+ * Get main and unique I2C Client driver handle
|
|
+ * */
|
|
+struct i2c_client *get_this_i2c_client(void) {
|
|
+ tda_instance *this = &our_instance;
|
|
+ return this->driver.i2c_client;
|
|
+}
|
|
+
|
|
+/*
|
|
+ * error handling
|
|
+ * */
|
|
+char *hdmi_tx_err_string(int err)
|
|
+{
|
|
+ switch(err & 0x0FFF) {
|
|
+ case ERR_COMPATIBILITY: {
|
|
+ return "SW interface compatibility";
|
|
+ break;
|
|
+ }
|
|
+ case ERR_MAJOR_VERSION: {
|
|
+ return "SW major version error";
|
|
+ break;
|
|
+ }
|
|
+ case ERR_COMP_VERSION: {
|
|
+ return "SW component version error";
|
|
+ break;
|
|
+ }
|
|
+ case ERR_BAD_UNIT_NUMBER: {
|
|
+ return "invalid device unit number";
|
|
+ break;
|
|
+ }
|
|
+ case ERR_BAD_INSTANCE: {
|
|
+ return "bad input instance value ";
|
|
+ break;
|
|
+ }
|
|
+ case ERR_BAD_HANDLE: {
|
|
+ return "bad input handle";
|
|
+ break;
|
|
+ }
|
|
+ case ERR_BAD_PARAMETER: {
|
|
+ return "invalid input parameter";
|
|
+ break;
|
|
+ }
|
|
+ case ERR_NO_RESOURCES: {
|
|
+ return "resource is not available ";
|
|
+ break;
|
|
+ }
|
|
+ case ERR_RESOURCE_OWNED: {
|
|
+ return "resource is already in use";
|
|
+ break;
|
|
+ }
|
|
+ case ERR_RESOURCE_NOT_OWNED: {
|
|
+ return "caller does not own resource";
|
|
+ break;
|
|
+ }
|
|
+ case ERR_INCONSISTENT_PARAMS: {
|
|
+ return "inconsistent input params";
|
|
+ break;
|
|
+ }
|
|
+ case ERR_NOT_INITIALIZED: {
|
|
+ return "component is not initialised";
|
|
+ break;
|
|
+ }
|
|
+ case ERR_NOT_SUPPORTED: {
|
|
+ return "function is not supported";
|
|
+ break;
|
|
+ }
|
|
+ case ERR_INIT_FAILED: {
|
|
+ return "initialization failed";
|
|
+ break;
|
|
+ }
|
|
+ case ERR_BUSY: {
|
|
+ return "component is busy";
|
|
+ break;
|
|
+ }
|
|
+ case ERR_DLHDMITX_I2C_READ: {
|
|
+ return "read error";
|
|
+ break;
|
|
+ }
|
|
+ case ERR_DLHDMITX_I2C_WRITE: {
|
|
+ return "write error";
|
|
+ break;
|
|
+ }
|
|
+ case ERR_FULL: {
|
|
+ return "queue is full";
|
|
+ break;
|
|
+ }
|
|
+ case ERR_NOT_STARTED: {
|
|
+ return "function is not started";
|
|
+ break;
|
|
+ }
|
|
+ case ERR_ALREADY_STARTED: {
|
|
+ return "function is already starte";
|
|
+ break;
|
|
+ }
|
|
+ case ERR_ASSERTION: {
|
|
+ return "assertion failure";
|
|
+ break;
|
|
+ }
|
|
+ case ERR_INVALID_STATE: {
|
|
+ return "invalid state for function";
|
|
+ break;
|
|
+ }
|
|
+ case ERR_OPERATION_NOT_PERMITTED: {
|
|
+ return "corresponds to posix EPERM";
|
|
+ break;
|
|
+ }
|
|
+ case ERR_DLHDMITX_RESOLUTION_UNKNOWN: {
|
|
+ return "bad format";
|
|
+ break;
|
|
+ }
|
|
+ case 0: {
|
|
+ return "OK";
|
|
+ break;
|
|
+ }
|
|
+ default : {
|
|
+ printk(KERN_INFO "(err:%x) ", err);
|
|
+ return "unknown";
|
|
+ break;
|
|
+ }
|
|
+ }
|
|
+}
|
|
+
|
|
+static char *tda_spy_event(int event)
|
|
+{
|
|
+ switch(event) {
|
|
+ case DL_HDMITX_HDCP_ACTIVE: {
|
|
+ return "HDCP active";
|
|
+ break;
|
|
+ }
|
|
+ case DL_HDMITX_HDCP_INACTIVE: {
|
|
+ return "HDCP inactive";
|
|
+ break;
|
|
+ }
|
|
+ case DL_HDMITX_HPD_ACTIVE: {
|
|
+ return "HPD active";
|
|
+ break;
|
|
+ }
|
|
+ case DL_HDMITX_HPD_INACTIVE: {
|
|
+ return "HPD inactive";
|
|
+ break;
|
|
+ }
|
|
+ case DL_HDMITX_RX_KEYS_RECEIVED: {
|
|
+ return "rx keys received";
|
|
+ break;
|
|
+ }
|
|
+ case DL_HDMITX_RX_DEVICE_ACTIVE: {
|
|
+ return "rx device active";
|
|
+ break;
|
|
+ }
|
|
+ case DL_HDMITX_RX_DEVICE_INACTIVE: {
|
|
+ return "rx device inactive";
|
|
+ break;
|
|
+ }
|
|
+ case DL_HDMITX_EDID_RECEIVED: {
|
|
+ return "EDID received";
|
|
+ break;
|
|
+ }
|
|
+ case DL_HDMITX_VS_RPT_RECEIVED: {
|
|
+ return "VS interrupt has been received";
|
|
+ break;
|
|
+ }
|
|
+ /* case DL_HDMITX_B_STATUS: {return "TX received BStatus";break;} */
|
|
+#if defined (TMFL_TDA19989) || defined (TMFL_TDA9984)
|
|
+ case DL_HDMITX_DEBUG_EVENT_1: {
|
|
+ return "DEBUG_EVENT_1";
|
|
+ break;
|
|
+ }
|
|
+#endif
|
|
+ default : {
|
|
+ return "unkonwn event";
|
|
+ break;
|
|
+ }
|
|
+ }
|
|
+}
|
|
+#if defined (TMFL_TDA19989) || defined (TMFL_TDA9984)
|
|
+static char *tda_spy_hsdc_fail_status(int fail)
|
|
+{
|
|
+ switch(fail) {
|
|
+ case DL_HDMITX_HDCP_OK: {
|
|
+ return "ok";
|
|
+ break;
|
|
+ }
|
|
+ case DL_HDMITX_HDCP_BKSV_RCV_FAIL: {
|
|
+ return "source does not receive sink bksv ";
|
|
+ break;
|
|
+ }
|
|
+ case DL_HDMITX_HDCP_BKSV_CHECK_FAIL: {
|
|
+ return "bksv does not contain 20 zeros and 20 ones";
|
|
+ break;
|
|
+ }
|
|
+ case DL_HDMITX_HDCP_BCAPS_RCV_FAIL: {
|
|
+ return "source does not receive sink bcaps";
|
|
+ break;
|
|
+ }
|
|
+ case DL_HDMITX_HDCP_AKSV_SEND_FAIL: {
|
|
+ return "source does not send aksv";
|
|
+ break;
|
|
+ }
|
|
+ case DL_HDMITX_HDCP_R0_RCV_FAIL: {
|
|
+ return "source does not receive R'0";
|
|
+ break;
|
|
+ }
|
|
+ case DL_HDMITX_HDCP_R0_CHECK_FAIL: {
|
|
+ return "R0 = R'0 check fail";
|
|
+ break;
|
|
+ }
|
|
+ case DL_HDMITX_HDCP_BKSV_NOT_SECURE: {
|
|
+ return "bksv not secure";
|
|
+ break;
|
|
+ }
|
|
+ case DL_HDMITX_HDCP_RI_RCV_FAIL: {
|
|
+ return "source does not receive R'i";
|
|
+ break;
|
|
+ }
|
|
+ case DL_HDMITX_HDCP_RPT_RI_RCV_FAIL: {
|
|
+ return "source does not receive R'i repeater mode";
|
|
+ break;
|
|
+ }
|
|
+ case DL_HDMITX_HDCP_RI_CHECK_FAIL: {
|
|
+ return "RI = R'I check fail";
|
|
+ break;
|
|
+ }
|
|
+ case DL_HDMITX_HDCP_RPT_RI_CHECK_FAIL: {
|
|
+ return "RI = R'I check fail repeater mode";
|
|
+ break;
|
|
+ }
|
|
+ case DL_HDMITX_HDCP_RPT_BCAPS_RCV_FAIL: {
|
|
+ return "source does not receive sink bcaps repeater mode";
|
|
+ break;
|
|
+ }
|
|
+ case DL_HDMITX_HDCP_RPT_BCAPS_READY_TIMEOUT: {
|
|
+ return "bcaps ready timeout";
|
|
+ break;
|
|
+ }
|
|
+ case DL_HDMITX_HDCP_RPT_V_RCV_FAIL: {
|
|
+ return "source does not receive V";
|
|
+ break;
|
|
+ }
|
|
+ case DL_HDMITX_HDCP_RPT_BSTATUS_RCV_FAIL: {
|
|
+ return "source does not receive BSTATUS repeater mode";
|
|
+ break;
|
|
+ }
|
|
+ case DL_HDMITX_HDCP_RPT_KSVLIST_RCV_FAIL: {
|
|
+ return "source does not receive ksv list in repeater mode";
|
|
+ break;
|
|
+ }
|
|
+ case DL_HDMITX_HDCP_RPT_KSVLIST_NOT_SECURE: {
|
|
+ return "ksvlist not secure";
|
|
+ break;
|
|
+ }
|
|
+ default: {
|
|
+ return "";
|
|
+ break;
|
|
+ }
|
|
+ }
|
|
+}
|
|
+
|
|
+static char *tda_spy_hdcp_status(int status)
|
|
+{
|
|
+ switch(status) {
|
|
+ case DL_HDMITX_HDCP_CHECK_NOT_STARTED: {
|
|
+ return "check not started";
|
|
+ break;
|
|
+ }
|
|
+ case DL_HDMITX_HDCP_CHECK_IN_PROGRESS: {
|
|
+ return "no failures, more to do";
|
|
+ break;
|
|
+ }
|
|
+ case DL_HDMITX_HDCP_CHECK_PASS: {
|
|
+ return "final check has passed";
|
|
+ break;
|
|
+ }
|
|
+ case DL_HDMITX_HDCP_CHECK_FAIL_FIRST: {
|
|
+ return "first check failure code\n_driver not AUTHENTICATED";
|
|
+ break;
|
|
+ }
|
|
+ case DL_HDMITX_HDCP_CHECK_FAIL_DEVICE_T0: {
|
|
+ return "A T0 interrupt occurred";
|
|
+ break;
|
|
+ }
|
|
+ case DL_HDMITX_HDCP_CHECK_FAIL_DEVICE_RI: {
|
|
+ return "device RI changed";
|
|
+ break;
|
|
+ }
|
|
+ case DL_HDMITX_HDCP_CHECK_FAIL_DEVICE_FSM: {
|
|
+ return "device FSM not 10h";
|
|
+ break;
|
|
+ }
|
|
+ default : {
|
|
+ return "unknown hdcp status";
|
|
+ break;
|
|
+ }
|
|
+ }
|
|
+
|
|
+}
|
|
+#endif
|
|
+
|
|
+static char *tda_spy_sink(int sink)
|
|
+{
|
|
+ switch(sink) {
|
|
+ case DL_HDMITX_SINK_DVI: {
|
|
+ return "DVI";
|
|
+ break;
|
|
+ }
|
|
+ case DL_HDMITX_SINK_HDMI: {
|
|
+ return "HDMI";
|
|
+ break;
|
|
+ }
|
|
+ case DL_HDMITX_SINK_EDID: {
|
|
+ return "as currently defined in EDID";
|
|
+ break;
|
|
+ }
|
|
+ default : {
|
|
+ return "unkonwn sink";
|
|
+ break;
|
|
+ }
|
|
+ }
|
|
+}
|
|
+
|
|
+#if defined (TMFL_TDA19989) || defined (TMFL_TDA9984)
|
|
+static char *tda_spy_aspect_ratio(int ar)
|
|
+{
|
|
+ switch(ar) {
|
|
+ case DL_HDMITX_P_ASPECT_RATIO_UNDEFINED: {
|
|
+ return "undefined picture aspect rati";
|
|
+ break;
|
|
+ }
|
|
+ case DL_HDMITX_P_ASPECT_RATIO_6_5: {
|
|
+ return "6:5 picture aspect ratio (PAR";
|
|
+ break;
|
|
+ }
|
|
+ case DL_HDMITX_P_ASPECT_RATIO_5_4: {
|
|
+ return "5:4 PA";
|
|
+ break;
|
|
+ }
|
|
+ case DL_HDMITX_P_ASPECT_RATIO_4_3: {
|
|
+ return "4:3 PA";
|
|
+ break;
|
|
+ }
|
|
+ case DL_HDMITX_P_ASPECT_RATIO_16_10: {
|
|
+ return "16:10 PA";
|
|
+ break;
|
|
+ }
|
|
+ case DL_HDMITX_P_ASPECT_RATIO_5_3: {
|
|
+ return "5:3 PA";
|
|
+ break;
|
|
+ }
|
|
+ case DL_HDMITX_P_ASPECT_RATIO_16_9: {
|
|
+ return "16:9 PA";
|
|
+ break;
|
|
+ }
|
|
+ case DL_HDMITX_P_ASPECT_RATIO_9_5: {
|
|
+ return "9:5 PA";
|
|
+ break;
|
|
+ }
|
|
+ default : {
|
|
+ return "unknown aspect ratio";
|
|
+ break;
|
|
+ }
|
|
+ }
|
|
+}
|
|
+
|
|
+#if 0 /* no more used */
|
|
+static char *tda_spy_edid_status(int status)
|
|
+{
|
|
+ switch(status) {
|
|
+ case DL_HDMITX_EDID_READ: {
|
|
+ return "all blocks read";
|
|
+ break;
|
|
+ }
|
|
+ case DL_HDMITX_EDID_READ_INCOMPLETE: {
|
|
+ return "all blocks read OK but buffer too small to return all of the";
|
|
+ break;
|
|
+ }
|
|
+ case DL_HDMITX_EDID_ERROR_CHK_BLOCK_0: {
|
|
+ return "block 0 checksum erro";
|
|
+ break;
|
|
+ }
|
|
+ case DL_HDMITX_EDID_ERROR_CHK: {
|
|
+ return "block 0 OK, checksum error in one or more other block";
|
|
+ break;
|
|
+ }
|
|
+ case DL_HDMITX_EDID_NOT_READ: {
|
|
+ return "EDID not read";
|
|
+ break;
|
|
+ }
|
|
+ case DL_HDMITX_EDID_STATUS_INVALID: {
|
|
+ return "invalid ";
|
|
+ break;
|
|
+ }
|
|
+ default : {
|
|
+ return "unknown edid status";
|
|
+ break;
|
|
+ }
|
|
+ }
|
|
+}
|
|
+#endif
|
|
+
|
|
+static char *tda_spy_vfmt(int fmt)
|
|
+{
|
|
+ switch(fmt) {
|
|
+ case ERR_DLHDMITX_COMPATIBILITY: {
|
|
+ return "SW interface compatibility";
|
|
+ break;
|
|
+ }
|
|
+ case ERR_DLHDMITX_MAJOR_VERSION: {
|
|
+ return "SW major version error";
|
|
+ break;
|
|
+ }
|
|
+
|
|
+ case DL_HDMITX_VFMT_NULL: {
|
|
+ return "not a valid format...";
|
|
+ break;
|
|
+ }
|
|
+ case dl_hdmitx_vfmt_01_640x480p_60hz: {
|
|
+ return "format 01 640 x 480p 60hz";
|
|
+ break;
|
|
+ }
|
|
+ case dl_hdmitx_vfmt_02_720x480p_60hz: {
|
|
+ return "format 02 720 x 480p 60hz";
|
|
+ break;
|
|
+ }
|
|
+ case dl_hdmitx_vfmt_03_720x480p_60hz: {
|
|
+ return "format 03 720 x 480p 60hz";
|
|
+ break;
|
|
+ }
|
|
+ case dl_hdmitx_vfmt_04_1280x720p_60hz: {
|
|
+ return "format 04 1280 x 720p 60hz";
|
|
+ break;
|
|
+ }
|
|
+ case dl_hdmitx_vfmt_05_1920x1080i_60hz: {
|
|
+ return "format 05 1920 x 1080i 60hz";
|
|
+ break;
|
|
+ }
|
|
+ case dl_hdmitx_vfmt_06_720x480i_60hz: {
|
|
+ return "format 06 720 x 480i 60hz";
|
|
+ break;
|
|
+ }
|
|
+ case dl_hdmitx_vfmt_07_720x480i_60hz: {
|
|
+ return "format 07 720 x 480i 60hz";
|
|
+ break;
|
|
+ }
|
|
+ case dl_hdmitx_vfmt_08_720x240p_60hz: {
|
|
+ return "format 08 720 x 240p 60hz";
|
|
+ break;
|
|
+ }
|
|
+ case dl_hdmitx_vfmt_09_720x240p_60hz: {
|
|
+ return "format 09 720 x 240p 60hz";
|
|
+ break;
|
|
+ }
|
|
+ case dl_hdmitx_vfmt_10_720x480i_60hz: {
|
|
+ return "format 10 720 x 480i 60hz";
|
|
+ break;
|
|
+ }
|
|
+ case dl_hdmitx_vfmt_11_720x480i_60hz: {
|
|
+ return "format 11 720 x 480i 60hz";
|
|
+ break;
|
|
+ }
|
|
+ case dl_hdmitx_vfmt_12_720x240p_60hz: {
|
|
+ return "format 12 720 x 240p 60hz";
|
|
+ break;
|
|
+ }
|
|
+ case dl_hdmitx_vfmt_13_720x240p_60hz: {
|
|
+ return "format 13 720 x 240p 60hz";
|
|
+ break;
|
|
+ }
|
|
+ case dl_hdmitx_vfmt_14_1440x480p_60hz: {
|
|
+ return "format 14 1440 x 480p 60hz";
|
|
+ break;
|
|
+ }
|
|
+ case dl_hdmitx_vfmt_15_1440x480p_60hz: {
|
|
+ return "format 15 1440 x 480p 60hz";
|
|
+ break;
|
|
+ }
|
|
+ case dl_hdmitx_vfmt_16_1920x1080p_60hz: {
|
|
+ return "format 16 1920 x 1080p 60hz";
|
|
+ break;
|
|
+ }
|
|
+ case dl_hdmitx_vfmt_17_720x576p_50hz: {
|
|
+ return "format 17 720 x 576p 50hz";
|
|
+ break;
|
|
+ }
|
|
+ case dl_hdmitx_vfmt_18_720x576p_50hz: {
|
|
+ return "format 18 720 x 576p 50hz";
|
|
+ break;
|
|
+ }
|
|
+ case dl_hdmitx_vfmt_19_1280x720p_50hz: {
|
|
+ return "format 19 1280 x 720p 50hz";
|
|
+ break;
|
|
+ }
|
|
+ case dl_hdmitx_vfmt_20_1920x1080i_50hz: {
|
|
+ return "format 20 1920 x 1080i 50hz";
|
|
+ break;
|
|
+ }
|
|
+ case dl_hdmitx_vfmt_21_720x576i_50hz: {
|
|
+ return "format 21 720 x 576i 50hz";
|
|
+ break;
|
|
+ }
|
|
+ case dl_hdmitx_vfmt_22_720x576i_50hz: {
|
|
+ return "format 22 720 x 576i 50hz";
|
|
+ break;
|
|
+ }
|
|
+ case dl_hdmitx_vfmt_23_720x288p_50hz: {
|
|
+ return "format 23 720 x 288p 50hz";
|
|
+ break;
|
|
+ }
|
|
+ case dl_hdmitx_vfmt_24_720x288p_50hz: {
|
|
+ return "format 24 720 x 288p 50hz";
|
|
+ break;
|
|
+ }
|
|
+ case dl_hdmitx_vfmt_25_720x576i_50hz: {
|
|
+ return "format 25 720 x 576i 50hz";
|
|
+ break;
|
|
+ }
|
|
+ case dl_hdmitx_vfmt_26_720x576i_50hz: {
|
|
+ return "format 26 720 x 576i 50hz";
|
|
+ break;
|
|
+ }
|
|
+ case dl_hdmitx_vfmt_27_720x288p_50hz: {
|
|
+ return "format 27 720 x 288p 50hz";
|
|
+ break;
|
|
+ }
|
|
+ case dl_hdmitx_vfmt_28_720x288p_50hz: {
|
|
+ return "format 28 720 x 288p 50hz";
|
|
+ break;
|
|
+ }
|
|
+ case dl_hdmitx_vfmt_29_1440x576p_50hz: {
|
|
+ return "format 29 1440 x 576p 50hz";
|
|
+ break;
|
|
+ }
|
|
+ case dl_hdmitx_vfmt_30_1440x576p_50hz: {
|
|
+ return "format 30 1440 x 576p 50hz";
|
|
+ break;
|
|
+ }
|
|
+ case dl_hdmitx_vfmt_31_1920x1080p_50hz: {
|
|
+ return "format 31 1920 x 1080p 50hz";
|
|
+ break;
|
|
+ }
|
|
+ case dl_hdmitx_vfmt_32_1920x1080p_24hz: {
|
|
+ return "format 32 1920 x 1080p 24hz";
|
|
+ break;
|
|
+ }
|
|
+ case dl_hdmitx_vfmt_33_1920x1080p_25hz: {
|
|
+ return "format 33 1920 x 1080p 25hz";
|
|
+ break;
|
|
+ }
|
|
+ case dl_hdmitx_vfmt_34_1920x1080p_30hz: {
|
|
+ return "format 34 1920 x 1080p 30hz";
|
|
+ break;
|
|
+ }
|
|
+ case DL_HDMITX_VFMT_TV_NUM: {
|
|
+ return "number of TV formats & null";
|
|
+ break;
|
|
+ }
|
|
+ case DL_HDMITX_VFMT_PC_MIN: {
|
|
+ return "lowest valid PC format";
|
|
+ break;
|
|
+ }
|
|
+ case dl_hdmitx_vfmt_pc_800x600p_60hz: {
|
|
+ return "PC format 129";
|
|
+ break;
|
|
+ }
|
|
+ case dl_hdmitx_vfmt_pc_1152x960p_60hz: {
|
|
+ return "PC format 130";
|
|
+ break;
|
|
+ }
|
|
+ case dl_hdmitx_vfmt_pc_1024x768p_60hz: {
|
|
+ return "PC format 131";
|
|
+ break;
|
|
+ }
|
|
+ case dl_hdmitx_vfmt_pc_1280x768p_60hz: {
|
|
+ return "PC format 132";
|
|
+ break;
|
|
+ }
|
|
+ case dl_hdmitx_vfmt_pc_1280x1024p_60hz: {
|
|
+ return "PC format 133";
|
|
+ break;
|
|
+ }
|
|
+ case dl_hdmitx_vfmt_pc_1360x768p_60hz: {
|
|
+ return "PC format 134";
|
|
+ break;
|
|
+ }
|
|
+ case dl_hdmitx_vfmt_pc_1400x1050p_60hz: {
|
|
+ return "PC format 135";
|
|
+ break;
|
|
+ }
|
|
+ case dl_hdmitx_vfmt_pc_1600x1200p_60hz: {
|
|
+ return "PC format 136";
|
|
+ break;
|
|
+ }
|
|
+ case dl_hdmitx_vfmt_pc_1024x768p_70hz: {
|
|
+ return "PC format 137";
|
|
+ break;
|
|
+ }
|
|
+ case dl_hdmitx_vfmt_pc_640x480p_72hz: {
|
|
+ return "PC format 138";
|
|
+ break;
|
|
+ }
|
|
+ case dl_hdmitx_vfmt_pc_800x600p_72hz: {
|
|
+ return "PC format 139";
|
|
+ break;
|
|
+ }
|
|
+ case dl_hdmitx_vfmt_pc_640x480p_75hz: {
|
|
+ return "PC format 140";
|
|
+ break;
|
|
+ }
|
|
+ case dl_hdmitx_vfmt_pc_1024x768p_75hz: {
|
|
+ return "PC format 141";
|
|
+ break;
|
|
+ }
|
|
+ case dl_hdmitx_vfmt_pc_800x600p_75hz: {
|
|
+ return "PC format 142";
|
|
+ break;
|
|
+ }
|
|
+ case dl_hdmitx_vfmt_pc_1024x864p_75hz: {
|
|
+ return "PC format 143";
|
|
+ break;
|
|
+ }
|
|
+ case dl_hdmitx_vfmt_pc_1280x1024p_75hz: {
|
|
+ return "PC format 144";
|
|
+ break;
|
|
+ }
|
|
+ case dl_hdmitx_vfmt_pc_640x350p_85hz: {
|
|
+ return "PC format 145";
|
|
+ break;
|
|
+ }
|
|
+ case dl_hdmitx_vfmt_pc_640x400p_85hz: {
|
|
+ return "PC format 146";
|
|
+ break;
|
|
+ }
|
|
+ case dl_hdmitx_vfmt_pc_720x400p_85hz: {
|
|
+ return "PC format 147";
|
|
+ break;
|
|
+ }
|
|
+ case dl_hdmitx_vfmt_pc_640x480p_85hz: {
|
|
+ return "PC format 148";
|
|
+ break;
|
|
+ }
|
|
+ case dl_hdmitx_vfmt_pc_800x600p_85hz: {
|
|
+ return "PC format 149";
|
|
+ break;
|
|
+ }
|
|
+ case dl_hdmitx_vfmt_pc_1024x768p_85hz: {
|
|
+ return "PC format 150";
|
|
+ break;
|
|
+ }
|
|
+ case dl_hdmitx_vfmt_pc_1152x864p_85hz: {
|
|
+ return "PC format 151";
|
|
+ break;
|
|
+ }
|
|
+ case dl_hdmitx_vfmt_pc_1280x960p_85hz: {
|
|
+ return "PC format 152";
|
|
+ break;
|
|
+ }
|
|
+ case dl_hdmitx_vfmt_pc_1280x1024p_85hz: {
|
|
+ return "PC format 153";
|
|
+ break;
|
|
+ }
|
|
+ case dl_hdmitx_vfmt_pc_1024x768i_87hz: {
|
|
+ return "PC format 154";
|
|
+ break;
|
|
+ }
|
|
+ default : {
|
|
+ return "unknown video format";
|
|
+ break;
|
|
+ }
|
|
+ }
|
|
+}
|
|
+#endif
|
|
+
|
|
+static char *tda_ioctl(int io)
|
|
+{
|
|
+ switch(io) {
|
|
+ case TDA_VERBOSE_ON_CMD: {
|
|
+ return "TDA_VERBOSE_ON_CMD";
|
|
+ break;
|
|
+ }
|
|
+ case TDA_VERBOSE_OFF_CMD: {
|
|
+ return "TDA_VERBOSE_OFF_CMD";
|
|
+ break;
|
|
+ }
|
|
+ case TDA_BYEBYE_CMD: {
|
|
+ return "TDA_BYEBYE_CMD";
|
|
+ break;
|
|
+ }
|
|
+ case TDA_GET_SW_VERSION_CMD: {
|
|
+ return "TDA_GET_SW_VERSION_CMD";
|
|
+ break;
|
|
+ }
|
|
+ case TDA_SET_POWER_CMD: {
|
|
+ return "TDA_SET_POWER_CMD";
|
|
+ break;
|
|
+ }
|
|
+ case TDA_GET_POWER_CMD: {
|
|
+ return "TDA_GET_POWER_CMD";
|
|
+ break;
|
|
+ }
|
|
+ case TDA_SETUP_CMD: {
|
|
+ return "TDA_SETUP_CMD";
|
|
+ break;
|
|
+ }
|
|
+ case TDA_GET_SETUP_CMD: {
|
|
+ return "TDA_GET_SETUP_CMD";
|
|
+ break;
|
|
+ }
|
|
+ case TDA_WAIT_EVENT_CMD: {
|
|
+ return "TDA_WAIT_EVENT_CMD";
|
|
+ break;
|
|
+ }
|
|
+ case TDA_ENABLE_EVENT_CMD: {
|
|
+ return "TDA_ENABLE_EVENT_CMD";
|
|
+ break;
|
|
+ }
|
|
+ case TDA_DISABLE_EVENT_CMD: {
|
|
+ return "TDA_DISABLE_EVENT_CMD";
|
|
+ break;
|
|
+ }
|
|
+ case TDA_GET_VIDEO_SPEC_CMD: {
|
|
+ return "TDA_GET_VIDEO_SPEC_CMD";
|
|
+ break;
|
|
+ }
|
|
+ case TDA_SET_INPUT_OUTPUT_CMD: {
|
|
+ return "TDA_SET_INPUT_OUTPUT_CMD";
|
|
+ break;
|
|
+ }
|
|
+ case TDA_SET_AUDIO_INPUT_CMD: {
|
|
+ return "TDA_SET_AUDIO_INPUT_CMD";
|
|
+ break;
|
|
+ }
|
|
+ case TDA_SET_VIDEO_INFOFRAME_CMD: {
|
|
+ return "TDA_SET_VIDEO_INFOFRAME_CMD";
|
|
+ break;
|
|
+ }
|
|
+ case TDA_SET_AUDIO_INFOFRAME_CMD: {
|
|
+ return "TDA_SET_AUDIO_INFOFRAME_CMD";
|
|
+ break;
|
|
+ }
|
|
+ case TDA_SET_ACP_CMD: {
|
|
+ return "TDA_SET_ACP_CMD";
|
|
+ break;
|
|
+ }
|
|
+ case TDA_SET_GCP_CMD: {
|
|
+ return "TDA_SET_GCP_CMD";
|
|
+ break;
|
|
+ }
|
|
+ case TDA_SET_ISRC1_CMD: {
|
|
+ return "TDA_SET_ISRC1_CMD";
|
|
+ break;
|
|
+ }
|
|
+ case TDA_SET_ISRC2_CMD: {
|
|
+ return "TDA_SET_ISRC2_CMD";
|
|
+ break;
|
|
+ }
|
|
+ case TDA_SET_MPS_INFOFRAME_CMD: {
|
|
+ return "TDA_SET_MPS_INFOFRAME_CMD";
|
|
+ break;
|
|
+ }
|
|
+ case TDA_SET_SPD_INFOFRAME_CMD: {
|
|
+ return "TDA_SET_SPD_INFOFRAME_CMD";
|
|
+ break;
|
|
+ }
|
|
+ case TDA_SET_VS_INFOFRAME_CMD: {
|
|
+ return "TDA_SET_VS_INFOFRAME_CMD";
|
|
+ break;
|
|
+ }
|
|
+ case TDA_SET_AUDIO_MUTE_CMD: {
|
|
+ return "TDA_SET_AUDIO_MUTE_CMD";
|
|
+ break;
|
|
+ }
|
|
+ case TDA_RESET_AUDIO_CTS_CMD: {
|
|
+ return "TDA_RESET_AUDIO_CTS_CMD";
|
|
+ break;
|
|
+ }
|
|
+ case TDA_GET_EDID_STATUS_CMD: {
|
|
+ return "TDA_GET_EDID_STATUS_CMD";
|
|
+ break;
|
|
+ }
|
|
+ case TDA_GET_EDID_AUDIO_CAPS_CMD: {
|
|
+ return "TDA_GET_EDID_AUDIO_CAPS_CMD";
|
|
+ break;
|
|
+ }
|
|
+ case TDA_GET_EDID_VIDEO_CAPS_CMD: {
|
|
+ return "TDA_GET_EDID_VIDEO_CAPS_CMD";
|
|
+ break;
|
|
+ }
|
|
+ case TDA_GET_EDID_VIDEO_PREF_CMD: {
|
|
+ return "TDA_GET_EDID_VIDEO_PREF_CMD";
|
|
+ break;
|
|
+ }
|
|
+ case TDA_GET_EDID_SINK_TYPE_CMD: {
|
|
+ return "TDA_GET_EDID_SINK_TYPE_CMD";
|
|
+ break;
|
|
+ }
|
|
+ case TDA_GET_EDID_SOURCE_ADDRESS_CMD: {
|
|
+ return "TDA_GET_EDID_SOURCE_ADDRESS_CMD";
|
|
+ break;
|
|
+ }
|
|
+ case TDA_SET_GAMMUT_CMD: {
|
|
+ return "TDA_SET_GAMMUT_CMD";
|
|
+ break;
|
|
+ }
|
|
+ case TDA_GET_EDID_DTD_CMD: {
|
|
+ return "TDA_GET_EDID_DTD_CMD";
|
|
+ break;
|
|
+ }
|
|
+ case TDA_GET_EDID_MD_CMD: {
|
|
+ return "TDA_GET_EDID_MD_CMD";
|
|
+ break;
|
|
+ }
|
|
+ case TDA_GET_EDID_TV_ASPECT_RATIO_CMD: {
|
|
+ return "TDA_GET_EDID_TV_ASPECT_RATIO_CMD";
|
|
+ break;
|
|
+ }
|
|
+ case TDA_GET_EDID_LATENCY_CMD: {
|
|
+ return "TDA_GET_EDID_LATENCY_CMD";
|
|
+ break;
|
|
+ }
|
|
+ default : {
|
|
+ return "unknown";
|
|
+ break;
|
|
+ }
|
|
+ }
|
|
+
|
|
+}
|
|
+
|
|
+#if defined (TMFL_TDA19989) || defined (TMFL_TDA9984)
|
|
+/*
|
|
+ *
|
|
+ * */
|
|
+static int tda_spy(int verbose)
|
|
+{
|
|
+ tda_instance *this = &our_instance;
|
|
+ int i, err = 0;
|
|
+
|
|
+ if(!verbose) {
|
|
+ return err;
|
|
+ }
|
|
+
|
|
+ printk(KERN_INFO "\n<edid video caps>\n");
|
|
+ this->tda.edid_video_caps.max = EXAMPLE_MAX_SVD;
|
|
+ TRY(tx_get_edid_video_caps(this->tda.instance, \
|
|
+ this->tda.edid_video_caps.desc, \
|
|
+ this->tda.edid_video_caps.max, \
|
|
+ &this->tda.edid_video_caps.written, \
|
|
+ &this->tda.edid_video_caps.flags));
|
|
+ printk(KERN_INFO "written:%d\n", this->tda.edid_video_caps.written);
|
|
+ printk(KERN_INFO "flags:0X%x\n", this->tda.edid_video_caps.flags);
|
|
+ if(this->tda.edid_video_caps.written > this->tda.edid_video_caps.max) {
|
|
+ printk(KERN_ERR "get %d video caps but was waiting for %d\n", \
|
|
+ this->tda.edid_video_caps.written, \
|
|
+ this->tda.edid_video_caps.max);
|
|
+ this->tda.edid_video_caps.written = this->tda.edid_video_caps.max;
|
|
+ }
|
|
+ for(i = 0; i < this->tda.edid_video_caps.written; i++) {
|
|
+ printk(KERN_INFO "video_format:%s\n", tda_spy_vfmt(this->tda.edid_video_caps.desc[i].video_format));
|
|
+ printk(KERN_INFO "native_video_format:%s\n", (this->tda.edid_video_caps.desc[i].native_video_format ? "yes" : "no"));
|
|
+ }
|
|
+
|
|
+ printk(KERN_INFO "\n<edid video timings>\n");
|
|
+ TRY(tx_get_edid_video_preferred(this->tda.instance, \
|
|
+ &this->tda.edid_video_timings));
|
|
+ printk(KERN_INFO "pixel clock/10 000:%d\n", this->tda.edid_video_timings.pixel_clock);
|
|
+ printk(KERN_INFO "horizontal active pixels:%d\n", this->tda.edid_video_timings.h_active_pixels);
|
|
+ printk(KERN_INFO "horizontal blanking pixels:%d\n", this->tda.edid_video_timings.h_blank_pixels);
|
|
+ printk(KERN_INFO "vertical active lines:%d\n", this->tda.edid_video_timings.v_active_lines);
|
|
+ printk(KERN_INFO "vertical blanking lines:%d\n", this->tda.edid_video_timings.v_blank_lines);
|
|
+ printk(KERN_INFO "horizontal sync offset:%d\n", this->tda.edid_video_timings.h_sync_offset);
|
|
+ printk(KERN_INFO "horiz. sync pulse width:%d\n", this->tda.edid_video_timings.h_sync_width);
|
|
+ printk(KERN_INFO "vertical sync offset:%d\n", this->tda.edid_video_timings.v_sync_offset);
|
|
+ printk(KERN_INFO "vertical sync pulse width:%d\n", this->tda.edid_video_timings.v_sync_width);
|
|
+ printk(KERN_INFO "horizontal image size:%d\n", this->tda.edid_video_timings.h_image_size);
|
|
+ printk(KERN_INFO "vertical image size:%d\n", this->tda.edid_video_timings.v_image_size);
|
|
+ printk(KERN_INFO "horizontal border:%d\n", this->tda.edid_video_timings.h_border_pixels);
|
|
+ printk(KERN_INFO "vertical border:%d\n", this->tda.edid_video_timings.v_border_pixels);
|
|
+ printk(KERN_INFO "interlace/sync info:%x\n", this->tda.edid_video_timings.flags);
|
|
+
|
|
+ printk(KERN_INFO "\n<sink type>\n");
|
|
+ TRY(tx_get_edid_sink_type(this->tda.instance, \
|
|
+ &this->tda.setio.sink));
|
|
+ printk(KERN_INFO "%s\n", tda_spy_sink(this->tda.setio.sink));
|
|
+ printk(KERN_INFO "\n<source address>\n");
|
|
+ TRY(tx_get_edid_source_address(this->tda.instance, \
|
|
+ &this->tda.src_address));
|
|
+ printk(KERN_INFO "%x\n", this->tda.src_address);
|
|
+ printk(KERN_INFO "\n<detailled timing descriptors>\n");
|
|
+ this->tda.edid_dtd.max = EXAMPLE_MAX_SVD;
|
|
+ TRY(tx_get_edid_detailled_timing_descriptors(this->tda.instance, \
|
|
+ this->tda.edid_dtd.desc, \
|
|
+ this->tda.edid_dtd.max, \
|
|
+ &this->tda.edid_dtd.written));
|
|
+ printk(KERN_INFO "interlace/sync info:%x\n", this->tda.edid_dtd.desc[i].flags);
|
|
+ printk(KERN_INFO "written:%d\n", this->tda.edid_dtd.written);
|
|
+ if(this->tda.edid_dtd.written > this->tda.edid_dtd.max) {
|
|
+ printk(KERN_ERR "get %d video caps but was waiting for %d\n", \
|
|
+ this->tda.edid_dtd.written, \
|
|
+ this->tda.edid_dtd.max);
|
|
+ this->tda.edid_dtd.written = this->tda.edid_dtd.max;
|
|
+ }
|
|
+ for(i = 0; i < this->tda.edid_dtd.written; i++) {
|
|
+ printk(KERN_INFO "pixel clock/10 000:%d\n", this->tda.edid_dtd.desc[i].pixel_clock);
|
|
+ printk(KERN_INFO "horizontal active pixels:%d\n", this->tda.edid_dtd.desc[i].h_active_pixels);
|
|
+ printk(KERN_INFO "horizontal blanking pixels:%d\n", this->tda.edid_dtd.desc[i].h_blank_pixels);
|
|
+ printk(KERN_INFO "vertical active lines:%d\n", this->tda.edid_dtd.desc[i].v_active_lines);
|
|
+ printk(KERN_INFO "vertical blanking lines:%d\n", this->tda.edid_dtd.desc[i].v_blank_lines);
|
|
+ printk(KERN_INFO "horizontal sync offset:%d\n", this->tda.edid_dtd.desc[i].h_sync_offset);
|
|
+ printk(KERN_INFO "horiz. sync pulse width:%d\n", this->tda.edid_dtd.desc[i].h_sync_width);
|
|
+ printk(KERN_INFO "vertical sync offset:%d\n", this->tda.edid_dtd.desc[i].v_sync_offset);
|
|
+ printk(KERN_INFO "vertical sync pulse width:%d\n", this->tda.edid_dtd.desc[i].v_sync_width);
|
|
+ printk(KERN_INFO "horizontal image size:%d\n", this->tda.edid_dtd.desc[i].h_image_size);
|
|
+ printk(KERN_INFO "vertical image size:%d\n", this->tda.edid_dtd.desc[i].v_image_size);
|
|
+ printk(KERN_INFO "horizontal border:%d\n", this->tda.edid_dtd.desc[i].h_border_pixels);
|
|
+ printk(KERN_INFO "vertical border:%d\n", this->tda.edid_dtd.desc[i].v_border_pixels);
|
|
+ }
|
|
+
|
|
+ printk(KERN_INFO "\n<monitor descriptors>\n");
|
|
+ this->tda.edid_md.max = EXAMPLE_MAX_SVD;
|
|
+ TRY(tx_get_edid_monitor_descriptors(this->tda.instance, \
|
|
+ this->tda.edid_md.desc1, \
|
|
+ this->tda.edid_md.desc2, \
|
|
+ this->tda.edid_md.other, \
|
|
+ this->tda.edid_md.max, \
|
|
+ &this->tda.edid_md.written));
|
|
+ printk(KERN_INFO "written:%d\n", this->tda.edid_md.written);
|
|
+ if(this->tda.edid_md.written > this->tda.edid_md.max) {
|
|
+ printk(KERN_ERR "get %d video caps but was waiting for %d\n", \
|
|
+ this->tda.edid_md.written, \
|
|
+ this->tda.edid_md.max);
|
|
+ this->tda.edid_md.written = this->tda.edid_md.max;
|
|
+ }
|
|
+ for(i = 0; i < this->tda.edid_md.written; i++) {
|
|
+ if(this->tda.edid_md.desc1[i].desc_record) {
|
|
+ this->tda.edid_md.desc1[i].monitor_name[EDID_MONITOR_DESCRIPTOR_SIZE] = 0;
|
|
+ printk(KERN_INFO "monitor name:%s\n", this->tda.edid_md.desc1[i].monitor_name);
|
|
+ }
|
|
+ if(this->tda.edid_md.desc1[i].desc_record) {
|
|
+ printk(KERN_INFO "min vertical rate in hz:%d\n", this->tda.edid_md.desc2[i].min_vertical_rate);
|
|
+ printk(KERN_INFO "max vertical rate in hz:%d\n", this->tda.edid_md.desc2[i].max_vertical_rate);
|
|
+ printk(KERN_INFO "min horizontal rate in hz:%d\n", this->tda.edid_md.desc2[i].min_horizontal_rate);
|
|
+ printk(KERN_INFO "max horizontal rate in hz:%d\n", this->tda.edid_md.desc2[i].max_horizontal_rate);
|
|
+ printk(KERN_INFO "max suuported pixel clock rate in mhz:%d\n", this->tda.edid_md.desc2[i].max_supported_pixel_clk);
|
|
+ }
|
|
+ }
|
|
+
|
|
+ printk(KERN_INFO "\n<TV picture ratio>\n");
|
|
+ TRY(tx_get_edid_tvpicture_ratio(this->tda.instance, \
|
|
+ &this->tda.edid_tv_aspect_ratio));
|
|
+ printk(KERN_INFO "%s\n", tda_spy_aspect_ratio(this->tda.edid_tv_aspect_ratio));
|
|
+
|
|
+ printk(KERN_INFO "\n<latency info>\n");
|
|
+ TRY(tx_get_edid_latency_info(this->tda.instance, \
|
|
+ &this->tda.edid_latency));
|
|
+ if(this->tda.edid_latency.latency_available) {
|
|
+ printk(KERN_INFO "edid video:%d\n", this->tda.edid_latency.edidvideo_latency);
|
|
+ printk(KERN_INFO "edid audio:%d\n", this->tda.edid_latency.edidaudio_latency);
|
|
+ }
|
|
+ if(this->tda.edid_latency.ilatency_available) {
|
|
+ printk(KERN_INFO "edid ivideo:%d\n", this->tda.edid_latency.edid_ivideo_latency);
|
|
+ printk(KERN_INFO "edid iaudio:%d\n", this->tda.edid_latency.edid_iaudio_latency);
|
|
+ }
|
|
+TRY_DONE:
|
|
+ return err;
|
|
+}
|
|
+#endif
|
|
+
|
|
+/*
|
|
+ *
|
|
+ * PROCESSING
|
|
+ * ----------
|
|
+ * LEVEL 2
|
|
+ *
|
|
+ * -
|
|
+ *
|
|
+ * */
|
|
+
|
|
+/*
|
|
+ * On/Off HDCP
|
|
+ * */
|
|
+void hdcp_onoff(tda_instance *this)
|
|
+{
|
|
+
|
|
+ int err = 0;
|
|
+
|
|
+ /* printk("DBG %s status:%d enable:%d\n",__func__,this->tda.hdcp_status,this->tda.hdcp_enable); */
|
|
+ if(this->tda.rx_device_active) {
|
|
+ if(this->tda.hot_plug_detect == DL_HDMITX_HOTPLUG_ACTIVE) {
|
|
+ if(this->tda.power == power_on) {
|
|
+ if(this->tda.src_address != 0xFFFF) {
|
|
+ /* ugly is bad */
|
|
+ if(this->tda.hdcp_status != DL_HDMITX_HDCP_CHECK_NUM) {
|
|
+ if(this->tda.hdcp_status == DL_HDMITX_HDCP_CHECK_NOT_STARTED) {
|
|
+ if(this->tda.hdcp_enable) {
|
|
+ TRY(tx_set_hdcp(this->tda.instance, true));
|
|
+#if defined (TMFL_TDA19989) || defined (TMFL_TDA9984)
|
|
+ TRY(tx_set_bscreen(this->tda.instance, DL_HDMITX_PATTERN_BLUE));
|
|
+#endif
|
|
+ }
|
|
+ } else if(this->tda.hdcp_status != DL_HDMITX_HDCP_CHECK_NOT_STARTED) {
|
|
+ if(!this->tda.hdcp_enable) {
|
|
+ TRY(tx_set_hdcp(this->tda.instance, false));
|
|
+ }
|
|
+ }
|
|
+ }
|
|
+ }
|
|
+ }
|
|
+ }
|
|
+ }
|
|
+TRY_DONE:
|
|
+ (void)0;
|
|
+}
|
|
+
|
|
+/*
|
|
+ * Run video
|
|
+ * */
|
|
+void show_video(tda_instance *this)
|
|
+{
|
|
+
|
|
+ int err = 0;
|
|
+
|
|
+ if(this->tda.rx_device_active) {
|
|
+ if(this->tda.hot_plug_detect == DL_HDMITX_HOTPLUG_ACTIVE) {
|
|
+ if(this->tda.power == power_on) {
|
|
+ /* if (this->tda.src_address != 0xFFFF) { */
|
|
+ TRY(tx_set_input_output(this->tda.instance, \
|
|
+ this->tda.setio.video_in, \
|
|
+ this->tda.setio.video_out, \
|
|
+ this->tda.setio.audio_in, \
|
|
+ this->tda.setio.sink));
|
|
+ hdcp_onoff(this);
|
|
+ /* } */
|
|
+ }
|
|
+ }
|
|
+ }
|
|
+TRY_DONE:
|
|
+ (void)0;
|
|
+}
|
|
+
|
|
+/*
|
|
+ * TDA interrupt polling
|
|
+ * */
|
|
+static void interrupt_polling(struct work_struct *dummy)
|
|
+{
|
|
+ tda_instance *this = &our_instance;
|
|
+ int err = 0;
|
|
+
|
|
+ /* Tx part */
|
|
+ TRY(tx_handle_interrupt(this->tda.instance));
|
|
+
|
|
+ /* CEC part */
|
|
+ if(this->driver.cec_callback) this->driver.cec_callback(dummy);
|
|
+
|
|
+ /* FIX : IT anti debounce */
|
|
+ TRY(tx_handle_interrupt(this->tda.instance));
|
|
+
|
|
+TRY_DONE:
|
|
+
|
|
+ /* setup next polling */
|
|
+#ifndef IRQ
|
|
+ mod_timer(&this->driver.no_irq_timer, jiffies + (CHECK_EVERY_XX_MS * HZ / 1000));
|
|
+#endif
|
|
+
|
|
+ (void)0;
|
|
+}
|
|
+
|
|
+/*
|
|
+ * TDA interrupt polling
|
|
+ * */
|
|
+static void hdcp_check(struct work_struct *dummy)
|
|
+{
|
|
+ int err = 0;
|
|
+ tda_instance *this = &our_instance;
|
|
+ tx_hdcp_check_t hdcp_status;
|
|
+
|
|
+ down(&this->driver.sem);
|
|
+
|
|
+ /* ugly is bad */
|
|
+ if(this->tda.hdcp_status == DL_HDMITX_HDCP_CHECK_NUM) goto TRY_DONE;
|
|
+
|
|
+ TRY(tx_hdcp_check(this->tda.instance, HDCP_CHECK_EVERY_MS));
|
|
+ TRY(tx_get_hdcp_state(this->tda.instance, &hdcp_status));
|
|
+#if defined (TMFL_TDA19989) || defined (TMFL_TDA9984)
|
|
+ if(this->tda.hdcp_status != hdcp_status) {
|
|
+ LOG(KERN_INFO, "HDCP status:%s\n", tda_spy_hdcp_status(hdcp_status));
|
|
+ this->tda.hdcp_status = hdcp_status;
|
|
+ }
|
|
+#endif
|
|
+#ifdef HDCP_TEST
|
|
+ /* TEST */
|
|
+ if(test++ > 500) {
|
|
+ test = 0;
|
|
+ this->tda.hdcp_enable = 1 - this->tda.hdcp_enable;
|
|
+ printk("TEST hdcp:%d\n", this->tda.hdcp_enable);
|
|
+ hdcp_onoff(this);
|
|
+ }
|
|
+#endif
|
|
+
|
|
+TRY_DONE:
|
|
+
|
|
+ /* setup next polling */
|
|
+ mod_timer(&this->driver.hdcp_check, jiffies + (HDCP_CHECK_EVERY_MS * HZ / 1000));
|
|
+
|
|
+ up(&this->driver.sem);
|
|
+}
|
|
+
|
|
+void register_cec_interrupt(cec_callback_t fct)
|
|
+{
|
|
+ tda_instance *this = &our_instance;
|
|
+
|
|
+ this->driver.cec_callback = fct;
|
|
+}
|
|
+EXPORT_SYMBOL(register_cec_interrupt);
|
|
+
|
|
+void unregister_cec_interrupt(void)
|
|
+{
|
|
+ tda_instance *this = &our_instance;
|
|
+
|
|
+ this->driver.cec_callback = NULL;
|
|
+}
|
|
+EXPORT_SYMBOL(unregister_cec_interrupt);
|
|
+
|
|
+static DECLARE_WORK(wq_irq, interrupt_polling);
|
|
+void polling_timeout(unsigned long arg)
|
|
+{
|
|
+ /* derefered because ATOMIC context of timer does not support I2C_transfert */
|
|
+ schedule_work(&wq_irq);
|
|
+}
|
|
+
|
|
+static DECLARE_WORK(wq_hdcp, hdcp_check);
|
|
+void hdcp_check_timeout(unsigned long arg)
|
|
+{
|
|
+ /* derefered because ATOMIC context of timer does not support I2C_transfert */
|
|
+ schedule_work(&wq_hdcp);
|
|
+}
|
|
+
|
|
+#ifdef IRQ
|
|
+/*
|
|
+ * TDA irq
|
|
+ * */
|
|
+static irqreturn_t tda_irq(int irq, void *_udc)
|
|
+{
|
|
+
|
|
+ /* do it now */
|
|
+ schedule_work(&wq_irq);
|
|
+
|
|
+ return IRQ_HANDLED;
|
|
+}
|
|
+#endif
|
|
+
|
|
+/*
|
|
+ * TDA callback
|
|
+ * */
|
|
+static void event_callback_tx(tx_event_t event)
|
|
+{
|
|
+ tda_instance *this = &our_instance;
|
|
+ int err = 0;
|
|
+ unsigned short new_addr;
|
|
+#if defined (TMFL_TDA19989) || defined (TMFL_TDA9984)
|
|
+ tda_hdcp_fail hdcp_fail;
|
|
+#endif
|
|
+
|
|
+ this->tda.event = event;
|
|
+ if(DL_HDMITX_HDCP_INACTIVE != event) {
|
|
+ printk(KERN_INFO "hdmi %s\n", tda_spy_event(event));
|
|
+ }
|
|
+
|
|
+ switch(event) {
|
|
+ case DL_HDMITX_EDID_RECEIVED:
|
|
+ TRY(tx_get_edid_source_address(this->tda.instance, \
|
|
+ &new_addr));
|
|
+ LOG(KERN_INFO, "phy.@:%x\n", new_addr);
|
|
+ /* if (this->tda.src_address == new_addr) { */
|
|
+ /* break; */
|
|
+ /* } */
|
|
+ this->tda.src_address = new_addr;
|
|
+#if defined (TMFL_TDA19989) || defined (TMFL_TDA9984)
|
|
+ tda_spy(this->param.verbose > 1);
|
|
+#endif
|
|
+ /*
|
|
+ * Customer may add stuff to analyse EDID (see tda_spy())
|
|
+ * and select automatically some video/audio settings.
|
|
+ * By default, let go on with next case and activate
|
|
+ * default video/audio settings with txSetInputOutput()
|
|
+ * */
|
|
+
|
|
+ TRY(tx_get_edid_sink_type(this->tda.instance, \
|
|
+ &this->tda.setio.sink));
|
|
+ if(DL_HDMITX_SINK_HDMI != this->tda.setio.sink) {
|
|
+ printk(KERN_INFO "/!\\ CAUTION /!\\ sink is not HDMI but %s\n", tda_spy_sink(this->tda.setio.sink));
|
|
+ }
|
|
+
|
|
+ msleep(100);
|
|
+ case DL_HDMITX_RX_DEVICE_ACTIVE:
|
|
+ this->tda.rx_device_active = 1;
|
|
+ show_video(this);
|
|
+ break;
|
|
+ case DL_HDMITX_RX_DEVICE_INACTIVE:
|
|
+ this->tda.rx_device_active = 0;
|
|
+ break;
|
|
+ case DL_HDMITX_HPD_ACTIVE:
|
|
+ this->tda.hot_plug_detect = DL_HDMITX_HOTPLUG_ACTIVE;
|
|
+ show_video(this);
|
|
+ break;
|
|
+ case DL_HDMITX_HPD_INACTIVE:
|
|
+ this->tda.hot_plug_detect = DL_HDMITX_HOTPLUG_INACTIVE;
|
|
+ this->tda.src_address = 0xFFFF;
|
|
+ break;
|
|
+#if defined (TMFL_TDA19989) || defined (TMFL_TDA9984)
|
|
+ case DL_HDMITX_HDCP_INACTIVE:
|
|
+ tx_get_hdcp_fail_status(this->tda.instance, \
|
|
+ &hdcp_fail, \
|
|
+ &this->tda.hdcp_raw_status);
|
|
+ if(this->tda.hdcp_fail != hdcp_fail) {
|
|
+ if(this->tda.hdcp_fail) {
|
|
+ LOG(KERN_INFO, "%s (%d)\n", tda_spy_hsdc_fail_status(this->tda.hdcp_fail), this->tda.hdcp_raw_status);
|
|
+ }
|
|
+ this->tda.hdcp_fail = hdcp_fail;
|
|
+ tx_set_bscreen(this->tda.instance, DL_HDMITX_PATTERN_BLUE);
|
|
+ }
|
|
+ break;
|
|
+ case DL_HDMITX_RX_KEYS_RECEIVED:
|
|
+ tx_remove_bscreen(this->tda.instance);
|
|
+ break;
|
|
+#endif
|
|
+ default:
|
|
+ break;
|
|
+ }
|
|
+
|
|
+ this->driver.poll_done = true;
|
|
+ wake_up_interruptible(&this->driver.wait);
|
|
+
|
|
+TRY_DONE:
|
|
+ (void)0;
|
|
+}
|
|
+
|
|
+/*
|
|
+ * hdmi Tx init
|
|
+ * */
|
|
+static int hdmi_tx_init(tda_instance *this)
|
|
+{
|
|
+ int err = 0;
|
|
+
|
|
+ LOG(KERN_INFO, "called\n");
|
|
+
|
|
+ /*Initialize HDMI Transmiter*/
|
|
+ TRY(tx_open(&this->tda.instance));
|
|
+ /* Register the HDMI TX events callbacks */
|
|
+ TRY(tx_register_callbacks(this->tda.instance, (ptx_callback_t)event_callback_tx));
|
|
+
|
|
+ /* Size of the application EDID buffer */
|
|
+ this->tda.setup.edid_buffer_size = EDID_BLOCK_COUNT * EDID_BLOCK_SIZE;
|
|
+ /* Buffer to store the application EDID data */
|
|
+ this->tda.setup.p_edid_buffer = this->tda.raw_edid;
|
|
+ /* To Enable/disable repeater feature, nor relevant here */
|
|
+ this->tda.setup.repeater_enable = false;
|
|
+ /* To enable/disable simplayHD feature: blue screen when not authenticated */
|
|
+ this->tda.setup.simplay_hd = false;
|
|
+
|
|
+ /* Provides HDMI TX instance configuration */
|
|
+ TRY(tx_instance_setup(this->tda.instance, &this->tda.setup));
|
|
+ /* Get IC version */
|
|
+ TRY(tx_get_capabilities(&this->tda.capabilities));
|
|
+
|
|
+ /* Main settings */
|
|
+ this->tda.setio.video_out.mode = DL_HDMITX_VOUTMODE_RGB444;
|
|
+ this->tda.setio.video_out.color_depth = DL_HDMITX_COLORDEPTH_24;
|
|
+#ifdef TMFL_TDA19989
|
|
+ /* Use HDMI rules for DVI output */
|
|
+ this->tda.setio.video_out.dvi_vqr = DL_HDMITX_VQR_DEFAULT;
|
|
+#endif
|
|
+ /* this->tda.setio.video_out.format = DL_HDMITX_VFMT_31_1920x1080p_50Hz; */
|
|
+ /* this->tda.setio.video_out.format = DL_HDMITX_VFMT_PC_640x480p_60Hz; */
|
|
+ /* this->tda.setio.video_out.format = DL_HDMITX_VFMT_PC_640x480p_72Hz; */
|
|
+ /* this->tda.setio.video_out.format = DL_HDMITX_VFMT_04_1280x720p_60Hz; */
|
|
+ /* this->tda.setio.video_out.format = DL_HDMITX_VFMT_19_1280x720p_50Hz; */
|
|
+
|
|
+ this->tda.setio.video_out.format = dl_hdmitx_vfmt_04_1280x720p_60hz;
|
|
+
|
|
+ this->tda.setio.video_in.mode = DL_HDMITX_VINMODE_RGB444;
|
|
+ /* this->tda.setio.video_in.mode = DL_HDMITX_VINMODE_YUV422; */
|
|
+ this->tda.setio.video_in.format = this->tda.setio.video_out.format;
|
|
+ this->tda.setio.video_in.pixel_rate = DL_HDMITX_PIXRATE_SINGLE;
|
|
+ /* we use HS,VS as synchronisation source */
|
|
+ this->tda.setio.video_in.sync_source = 1;
|
|
+
|
|
+ this->tda.setio.audio_in.format = DL_HDMITX_AFMT_I2S;
|
|
+ this->tda.setio.audio_in.rate = DL_HDMITX_AFS_48K;
|
|
+ this->tda.setio.audio_in.i2s_format = DL_HDMITX_I2SFOR_PHILIPS_L;
|
|
+ this->tda.setio.audio_in.i2s_qualifier = DL_HDMITX_I2SQ_32BITS;
|
|
+ /* not relevant here */
|
|
+ this->tda.setio.audio_in.dst_rate = DL_HDMITX_DSTRATE_SINGLE;
|
|
+ /* audio channel allocation (Ref to CEA-861D p85) */
|
|
+ this->tda.setio.audio_in.channel_allocation = 0;
|
|
+
|
|
+ this->tda.setio.sink = DL_HDMITX_SINK_HDMI; /* skip edid reading */
|
|
+ /* this->tda.src_address = 0x1000; /\* debug *\/ */
|
|
+ this->tda.src_address = NO_PHY_ADDR; /* it's unref */
|
|
+
|
|
+ /* EnableEvent, all by default */
|
|
+ TRY(tx_enable_event(this->tda.instance, DL_HDMITX_HDCP_ACTIVE));
|
|
+ TRY(tx_enable_event(this->tda.instance, DL_HDMITX_HDCP_INACTIVE));
|
|
+ TRY(tx_enable_event(this->tda.instance, DL_HDMITX_HPD_ACTIVE));
|
|
+ TRY(tx_enable_event(this->tda.instance, DL_HDMITX_HPD_INACTIVE));
|
|
+ TRY(tx_enable_event(this->tda.instance, DL_HDMITX_RX_KEYS_RECEIVED));
|
|
+ TRY(tx_enable_event(this->tda.instance, DL_HDMITX_RX_DEVICE_ACTIVE));
|
|
+ TRY(tx_enable_event(this->tda.instance, DL_HDMITX_RX_DEVICE_INACTIVE));
|
|
+ TRY(tx_enable_event(this->tda.instance, DL_HDMITX_EDID_RECEIVED));
|
|
+TRY_DONE:
|
|
+ return err;
|
|
+}
|
|
+
|
|
+void reset_hdmi(int hdcp_module)
|
|
+{
|
|
+ tda_instance *this = &our_instance;
|
|
+ int err = 0;
|
|
+
|
|
+ down(&this->driver.sem);
|
|
+
|
|
+ /* PATCH because of SetPowerState that calls SetHdcp that has just been removed by nwolc :( */
|
|
+ if(hdcp_module == 2) {
|
|
+ tx_set_hdcp(this->tda.instance, 0);
|
|
+ goto TRY_DONE;
|
|
+ }
|
|
+
|
|
+ TRY(tx_set_power_state(this->tda.instance, power_standby));
|
|
+ tx_close(this->tda.instance);
|
|
+ /* reset */
|
|
+ hdmi_tx_init(this);
|
|
+ /* recover previous power state */
|
|
+ TRY(tx_set_power_state(this->tda.instance, this->tda.power));
|
|
+ /* check if activ for timer */
|
|
+ tx_get_hpdstatus(this->tda.instance, &this->tda.hot_plug_detect);
|
|
+ show_video(this);
|
|
+
|
|
+ /* wake up or shut down hdcp checking */
|
|
+ if(hdcp_module) {
|
|
+ this->driver.hdcp_check.expires = jiffies + (HDCP_CHECK_EVERY_MS * HZ / 1000);
|
|
+ add_timer(&this->driver.hdcp_check);
|
|
+ /* ugly is bad ! */
|
|
+ this->tda.hdcp_status = DL_HDMITX_HDCP_CHECK_NOT_STARTED;
|
|
+ this->tda.hdcp_enable = 1; /* FIXME : fallback 4 HDCP on/off is ok */
|
|
+#if defined (TMFL_TDA19989) || defined (TMFL_TDA9984)
|
|
+ tx_set_bscreen(this->tda.instance, DL_HDMITX_PATTERN_BLUE);
|
|
+#endif
|
|
+ } else {
|
|
+ del_timer(&this->driver.hdcp_check);
|
|
+ this->tda.hdcp_status = DL_HDMITX_HDCP_CHECK_NUM; /* ugly is bad ! */
|
|
+ this->tda.hdcp_enable = 0; /* FIXME : fallback 4 HDCP on/off is ok */
|
|
+ }
|
|
+
|
|
+TRY_DONE:
|
|
+ up(&this->driver.sem);
|
|
+}
|
|
+EXPORT_SYMBOL(reset_hdmi);
|
|
+
|
|
+/*
|
|
+ *
|
|
+ * */
|
|
+short edid_phy_addr(void)
|
|
+{
|
|
+ tda_instance *this = &our_instance;
|
|
+
|
|
+ return this->tda.src_address;
|
|
+}
|
|
+EXPORT_SYMBOL(edid_phy_addr);
|
|
+
|
|
+/*
|
|
+ *
|
|
+ * */
|
|
+tda_power get_hdmi_status(void)
|
|
+{
|
|
+ tda_instance *this = &our_instance;
|
|
+
|
|
+ return this->tda.power;
|
|
+}
|
|
+EXPORT_SYMBOL(get_hdmi_status);
|
|
+
|
|
+/*
|
|
+ *
|
|
+ * */
|
|
+tda_power get_hpd_status(void)
|
|
+{
|
|
+ tda_instance *this = &our_instance;
|
|
+
|
|
+ return (this->tda.hot_plug_detect == DL_HDMITX_HOTPLUG_ACTIVE);
|
|
+}
|
|
+EXPORT_SYMBOL(get_hpd_status);
|
|
+
|
|
+/*
|
|
+ *
|
|
+ * */
|
|
+int edid_received(void)
|
|
+{
|
|
+ tda_instance *this = &our_instance;
|
|
+
|
|
+ return (this->tda.event == DL_HDMITX_EDID_RECEIVED);
|
|
+}
|
|
+EXPORT_SYMBOL(edid_received);
|
|
+
|
|
+/*
|
|
+ *
|
|
+ * */
|
|
+int hdmi_enable(void)
|
|
+{
|
|
+ tda_instance *this = &our_instance;
|
|
+ int err = 0;
|
|
+
|
|
+ LOG(KERN_INFO, "called\n");
|
|
+
|
|
+ down(&this->driver.sem);
|
|
+
|
|
+ this->tda.power = power_on;
|
|
+ TRY(tx_set_power_state(this->tda.instance, this->tda.power));
|
|
+ if(err == ERR_NO_RESOURCES) {
|
|
+ LOG(KERN_INFO, "busy...\n");
|
|
+ TRY(tx_handle_interrupt(this->tda.instance));
|
|
+ TRY(tx_handle_interrupt(this->tda.instance));
|
|
+ TRY(tx_handle_interrupt(this->tda.instance));
|
|
+ }
|
|
+ tx_get_hpdstatus(this->tda.instance, &this->tda.hot_plug_detect);
|
|
+ show_video(this); /* FIXME : mind usecases without HPD and RX_SEND... */
|
|
+
|
|
+TRY_DONE:
|
|
+ up(&this->driver.sem);
|
|
+ return err;
|
|
+}
|
|
+EXPORT_SYMBOL(hdmi_enable);
|
|
+
|
|
+/*
|
|
+ *
|
|
+ * */
|
|
+int hdmi_disable(int event_tracking)
|
|
+{
|
|
+ tda_instance *this = &our_instance;
|
|
+ int err = 0;
|
|
+
|
|
+ LOG(KERN_INFO, "called\n");
|
|
+
|
|
+ down(&this->driver.sem);
|
|
+
|
|
+ this->tda.power = (event_tracking ? power_suspend : power_standby);
|
|
+ TRY(tx_set_power_state(this->tda.instance, this->tda.power));
|
|
+
|
|
+TRY_DONE:
|
|
+ up(&this->driver.sem);
|
|
+ return err;
|
|
+}
|
|
+EXPORT_SYMBOL(hdmi_disable);
|
|
+
|
|
+/*
|
|
+ *
|
|
+ * ENTRY POINTS
|
|
+ * ------------
|
|
+ * LEVEL 3
|
|
+ *
|
|
+ * -
|
|
+ *
|
|
+ * */
|
|
+
|
|
+#ifdef ANDROID_DSS
|
|
+/*
|
|
+ * DSS driver :: probe
|
|
+ * */
|
|
+static int hdmi_panel_probe(struct omap_dss_device *dssdev)
|
|
+{
|
|
+ tda_instance *this = &our_instance;
|
|
+
|
|
+ LOG(KERN_INFO, " called\n");
|
|
+
|
|
+ sysdss = dssdev;
|
|
+
|
|
+ /* OMAP_DSS_LCD_IVS = 1<<0, */
|
|
+ /* OMAP_DSS_LCD_IHS = 1<<1, */
|
|
+ /* OMAP_DSS_LCD_IPC = 1<<2, */
|
|
+ /* OMAP_DSS_LCD_IEO = 1<<3, */
|
|
+ /* OMAP_DSS_LCD_RF = 1<<4, */
|
|
+ /* OMAP_DSS_LCD_ONOFF = 1<<5, */
|
|
+ /* OMAP_DSS_LCD_TFT = 1<<20, */
|
|
+
|
|
+ dssdev->panel.config = OMAP_DSS_LCD_ONOFF | OMAP_DSS_LCD_IPC | \
|
|
+ OMAP_DSS_LCD_TFT | OMAP_DSS_LCD_IVS | OMAP_DSS_LCD_IHS;
|
|
+ dssdev->panel.timings = video_720x480at60hz_panel_timings;
|
|
+ (void)video_1280x720at60hz_panel_timings;
|
|
+ (void)video_720x480at60hz_panel_timings;
|
|
+ (void)video_1280x720at50hz_panel_timings;
|
|
+ (void)video_800x480at60hz_panel_timings;
|
|
+ (void)video_1280x720at50hz_panel_timings;
|
|
+ (void)video_1920x1080at50hz_panel_timings;
|
|
+ (void)video_640x480at72hz_panel_timings;
|
|
+ (void)video_640x480at60hz_panel_timings;
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+/*
|
|
+ * DSS driver :: enable
|
|
+ * */
|
|
+static void hdmi_panel_remove(struct omap_dss_device *dssdev)
|
|
+{
|
|
+}
|
|
+
|
|
+/*
|
|
+ * DSS driver :: enable
|
|
+ * */
|
|
+static int hdmi_panel_enable(struct omap_dss_device *dssdev)
|
|
+{
|
|
+ int r = 0;
|
|
+
|
|
+ if(dssdev->platform_enable)
|
|
+ r = dssdev->platform_enable(dssdev);
|
|
+
|
|
+ if(r)
|
|
+ goto ERROR0;
|
|
+
|
|
+ r = hdmi_enable();
|
|
+ if(r)
|
|
+ goto ERROR0;
|
|
+ /* wait couple of vsyncs until enabling the LCD */
|
|
+ msleep(50);
|
|
+
|
|
+ return 0;
|
|
+ERROR0:
|
|
+ return r;
|
|
+}
|
|
+
|
|
+/*
|
|
+ * DSS driver :: disable
|
|
+ * */
|
|
+static void hdmi_panel_disable(struct omap_dss_device *dssdev)
|
|
+{
|
|
+ hdmi_disable(0);
|
|
+
|
|
+ /* wait couple of vsyncs until enabling the hdmi */
|
|
+ msleep(50);
|
|
+
|
|
+ if(dssdev->platform_disable)
|
|
+ dssdev->platform_disable(dssdev);
|
|
+}
|
|
+
|
|
+/*
|
|
+ * DSS driver :: suspend
|
|
+ * */
|
|
+static int hdmi_panel_suspend(struct omap_dss_device *dssdev)
|
|
+{
|
|
+ hdmi_panel_disable(dssdev);
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+/*
|
|
+ * DSS driver :: resume
|
|
+ * */
|
|
+static int hdmi_panel_resume(struct omap_dss_device *dssdev)
|
|
+{
|
|
+ return hdmi_panel_enable(dssdev);
|
|
+}
|
|
+
|
|
+/*
|
|
+ * DSS driver (frontend with omapzoom)
|
|
+ * -----------------------------------
|
|
+ * */
|
|
+static struct omap_dss_driver hdmi_driver = {
|
|
+ .probe = hdmi_panel_probe,
|
|
+ .remove = hdmi_panel_remove,
|
|
+ .enable = hdmi_panel_enable,
|
|
+ .disable = hdmi_panel_disable,
|
|
+ .suspend = hdmi_panel_suspend,
|
|
+ .resume = hdmi_panel_resume,
|
|
+ .driver = {
|
|
+ .name = "hdmi_panel",
|
|
+ .owner = THIS_MODULE,
|
|
+ }
|
|
+};
|
|
+#endif
|
|
+
|
|
+/*
|
|
+ * ioctl driver :: opening
|
|
+ * */
|
|
+
|
|
+static int this_cdev_open(struct inode *p_inode, struct file *p_file)
|
|
+{
|
|
+ tda_instance *this;
|
|
+ int minor = iminor(p_inode);
|
|
+
|
|
+ if(minor >= MAX_MINOR) {
|
|
+ printk(KERN_ERR "hdmitx:%s:only one tda can be open\n", __func__);
|
|
+ return -EINVAL;
|
|
+ }
|
|
+
|
|
+ if((p_file->private_data != NULL) && (p_file->private_data != &our_instance)) {
|
|
+ printk(KERN_ERR "hdmitx:%s:p_file missmatch\n", __func__);
|
|
+ }
|
|
+ this = p_file->private_data = &our_instance;
|
|
+ down(&this->driver.sem);
|
|
+
|
|
+ LOG(KERN_INFO, "major:%d minor:%d user:%d\n", imajor(p_inode), iminor(p_inode), this->driver.user_counter);
|
|
+
|
|
+ if((this->driver.user_counter++) && (this->driver.minor == minor)) {
|
|
+ /* init already done */
|
|
+ up(&this->driver.sem);
|
|
+ return 0;
|
|
+ }
|
|
+ this->driver.minor = minor;
|
|
+
|
|
+ up(&this->driver.sem);
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+/*
|
|
+ * ioctl driver :: ioctl
|
|
+ * */
|
|
+static int this_cdev_ioctl(struct inode *p_inode, struct file *p_file, unsigned int cmd, unsigned long arg)
|
|
+{
|
|
+ tda_instance *this = p_file->private_data;
|
|
+ int err = 0;
|
|
+
|
|
+ LOG(KERN_INFO, ":%s\n", tda_ioctl(_IOC_NR(cmd)));
|
|
+
|
|
+ BUG_ON(this->driver.minor != iminor(p_inode));
|
|
+ if(_IOC_TYPE(cmd) != TDA_IOCTL_BASE) {
|
|
+ printk(KERN_INFO "hdmitx:%s:unknown ioctl type: %x\n", __func__, _IOC_TYPE(cmd));
|
|
+ return -ENOIOCTLCMD;
|
|
+ }
|
|
+
|
|
+ if(_IOC_DIR(cmd) & _IOC_READ)
|
|
+ err = !access_ok(VERIFY_WRITE, (void __user *)arg, _IOC_SIZE(cmd)) || !arg;
|
|
+ else if(_IOC_DIR(cmd) & _IOC_WRITE)
|
|
+ err = !access_ok(VERIFY_READ, (void __user *)arg, _IOC_SIZE(cmd)) || !arg;
|
|
+ if(err) {
|
|
+ printk(KERN_ERR "hdmitx:%s:argument access denied (check address vs value)\n", __func__);
|
|
+ printk(KERN_ERR "_IOC_DIR:%d arg:%lx\n", _IOC_DIR(cmd), arg);
|
|
+ return -EFAULT;
|
|
+ }
|
|
+
|
|
+ down(&this->driver.sem);
|
|
+
|
|
+ /* Check DevLib consistancy here */
|
|
+
|
|
+ switch(_IOC_NR(cmd)) {
|
|
+ case TDA_VERBOSE_ON_CMD: {
|
|
+ this->param.verbose = 1;
|
|
+ printk(KERN_INFO "hdmitx:verbose on\n");
|
|
+ break;
|
|
+ }
|
|
+
|
|
+ case TDA_VERBOSE_OFF_CMD: {
|
|
+ printk(KERN_INFO "hdmitx:verbose off\n");
|
|
+ this->param.verbose = 0;
|
|
+ break;
|
|
+ }
|
|
+
|
|
+ case TDA_BYEBYE_CMD: {
|
|
+ LOG(KERN_INFO, "release event handeling request\n");
|
|
+ this->tda.event = RELEASE;
|
|
+ this->driver.poll_done = true;
|
|
+ wake_up_interruptible(&this->driver.wait);
|
|
+ break;
|
|
+ }
|
|
+
|
|
+ case TDA_GET_SW_VERSION_CMD: {
|
|
+ TRY(tx_get_swversion(&this->tda.version));
|
|
+ BUG_ON(copy_to_user((tda_version *)arg, &this->tda.version, sizeof(tda_version)) != 0);
|
|
+ break;
|
|
+ }
|
|
+
|
|
+ case TDA_SET_POWER_CMD: {
|
|
+ BUG_ON(copy_from_user(&this->tda.power, (tda_power *)arg, sizeof(tda_power)) != 0);
|
|
+ TRY(tx_set_power_state(this->tda.instance, \
|
|
+ this->tda.power));
|
|
+ break;
|
|
+ }
|
|
+
|
|
+ case TDA_GET_POWER_CMD: {
|
|
+ TRY(tx_get_power_state(this->tda.instance, \
|
|
+ &this->tda.power));
|
|
+ BUG_ON(copy_to_user((tda_power *)arg, &this->tda.power, sizeof(tda_power)) != 0);
|
|
+ break;
|
|
+ }
|
|
+
|
|
+ case TDA_SETUP_CMD: {
|
|
+ BUG_ON(copy_from_user(&this->tda.setup, (tda_setup_info *)arg, sizeof(tda_setup_info)) != 0);
|
|
+ TRY(tx_instance_setup(this->tda.instance, \
|
|
+ &this->tda.setup));
|
|
+ break;
|
|
+ }
|
|
+
|
|
+ case TDA_GET_SETUP_CMD: {
|
|
+ TRY(tx_get_instance_setup(this->tda.instance, \
|
|
+ &this->tda.setup));
|
|
+ BUG_ON(copy_to_user((tda_setup *)arg, &this->tda.setup, sizeof(tda_setup)) != 0);
|
|
+ break;
|
|
+ }
|
|
+
|
|
+ case TDA_WAIT_EVENT_CMD: {
|
|
+ this->driver.poll_done = false;
|
|
+ up(&this->driver.sem);
|
|
+ if(wait_event_interruptible(this->driver.wait, this->driver.poll_done)) return -ERESTARTSYS;
|
|
+ down(&this->driver.sem);
|
|
+ BUG_ON(copy_to_user((tda_event *)arg, &this->tda.event, sizeof(tda_event)) != 0);
|
|
+ break;
|
|
+ }
|
|
+
|
|
+ case TDA_ENABLE_EVENT_CMD: {
|
|
+ tx_event_t event;
|
|
+ BUG_ON(copy_from_user(&event, (tx_event_t *)arg, sizeof(tx_event_t)) != 0);
|
|
+ TRY(tx_enable_event(this->tda.instance, event));
|
|
+ break;
|
|
+ }
|
|
+
|
|
+ case TDA_DISABLE_EVENT_CMD: {
|
|
+ tx_event_t event;
|
|
+ BUG_ON(copy_from_user(&event, (tx_event_t *)arg, sizeof(tx_event_t)) != 0);
|
|
+ TRY(tx_disable_event(this->tda.instance, event));
|
|
+ break;
|
|
+ }
|
|
+
|
|
+ case TDA_GET_VIDEO_SPEC_CMD: {
|
|
+ TRY(tx_get_video_format_specs(this->tda.instance, \
|
|
+ this->tda.video_fmt.id, \
|
|
+ &this->tda.video_fmt.spec));
|
|
+ BUG_ON(copy_to_user((tda_video_format *)arg, &this->tda.video_fmt, sizeof(tda_video_format)) != 0);
|
|
+ break;
|
|
+ }
|
|
+
|
|
+ case TDA_SET_INPUT_OUTPUT_CMD: {
|
|
+ BUG_ON(copy_from_user(&this->tda.setio, (tda_set_in_out *)arg, sizeof(tda_set_in_out)) != 0);
|
|
+
|
|
+ TRY(tx_set_input_output(this->tda.instance, \
|
|
+ this->tda.setio.video_in, \
|
|
+ this->tda.setio.video_out, \
|
|
+ this->tda.setio.audio_in, \
|
|
+ this->tda.setio.sink));
|
|
+ break;
|
|
+ }
|
|
+
|
|
+ case TDA_SET_AUDIO_INPUT_CMD: {
|
|
+ BUG_ON(copy_from_user(&this->tda.setio.audio_in, (tda_set_audio_in *)arg, sizeof(tda_set_audio_in)) != 0);
|
|
+ TRY(tx_set_audio_input(this->tda.instance, \
|
|
+ this->tda.setio.audio_in, \
|
|
+ this->tda.setio.sink));
|
|
+ break;
|
|
+ }
|
|
+
|
|
+ case TDA_SET_VIDEO_INFOFRAME_CMD: {
|
|
+ BUG_ON(copy_from_user(&this->tda.video_infoframe, (tda_video_infoframe *)arg, sizeof(tda_video_infoframe)) != 0);
|
|
+ TRY(tx_set_video_infoframe(this->tda.instance, \
|
|
+ this->tda.video_infoframe.enable, \
|
|
+ &this->tda.video_infoframe.data));
|
|
+ break;
|
|
+ }
|
|
+
|
|
+ case TDA_SET_AUDIO_INFOFRAME_CMD: {
|
|
+ BUG_ON(copy_from_user(&this->tda.audio_infoframe, (tda_audio_infoframe *)arg, sizeof(tda_audio_infoframe)) != 0);
|
|
+ TRY(tx_set_audio_infoframe(this->tda.instance, \
|
|
+ this->tda.audio_infoframe.enable, \
|
|
+ &this->tda.audio_infoframe.data));
|
|
+ break;
|
|
+ }
|
|
+
|
|
+ case TDA_SET_ACP_CMD: {
|
|
+ BUG_ON(copy_from_user(&this->tda.acp, (tda_acp *)arg, sizeof(tda_acp)) != 0);
|
|
+ TRY(tx_set_acppacket(this->tda.instance, \
|
|
+ this->tda.acp.enable, \
|
|
+ &this->tda.acp.data));
|
|
+ break;
|
|
+ }
|
|
+
|
|
+ case TDA_SET_GCP_CMD: {
|
|
+ BUG_ON(copy_from_user(&this->tda.gcp, (tda_gcp *)arg, sizeof(tda_gcp)) != 0);
|
|
+ TRY(tx_set_general_control_packet(this->tda.instance, \
|
|
+ this->tda.gcp.enable, \
|
|
+ &this->tda.gcp.data));
|
|
+ break;
|
|
+ }
|
|
+
|
|
+ case TDA_SET_ISRC1_CMD: {
|
|
+ BUG_ON(copy_from_user(&this->tda.isrc1, (tda_isrc1 *)arg, sizeof(tda_isrc1)) != 0);
|
|
+ TRY(tx_set_isrc1packet(this->tda.instance, \
|
|
+ this->tda.isrc1.enable, \
|
|
+ &this->tda.isrc1.data));
|
|
+ break;
|
|
+ }
|
|
+
|
|
+ case TDA_SET_MPS_INFOFRAME_CMD: {
|
|
+ BUG_ON(copy_from_user(&this->tda.mps_infoframe, (tda_mps_infoframe *)arg, sizeof(tda_mps_infoframe)) != 0);
|
|
+ TRY(tx_set_mpsinfoframe(this->tda.instance, \
|
|
+ this->tda.mps_infoframe.enable, \
|
|
+ &this->tda.mps_infoframe.data));
|
|
+ break;
|
|
+ }
|
|
+
|
|
+ case TDA_SET_SPD_INFOFRAME_CMD: {
|
|
+ BUG_ON(copy_from_user(&this->tda.spd_infoframe, (tda_spd_infoframe *)arg, sizeof(tda_spd_infoframe)) != 0);
|
|
+ TRY(tx_set_spd_infoframe(this->tda.instance, \
|
|
+ this->tda.spd_infoframe.enable, \
|
|
+ &this->tda.spd_infoframe.data));
|
|
+ break;
|
|
+ }
|
|
+
|
|
+ case TDA_SET_VS_INFOFRAME_CMD: {
|
|
+ BUG_ON(copy_from_user(&this->tda.vs_infoframe, (tda_vs_infoframe *)arg, sizeof(tda_vs_infoframe)) != 0);
|
|
+ TRY(tx_set_vs_infoframe(this->tda.instance, \
|
|
+ this->tda.vs_infoframe.enable, \
|
|
+ &this->tda.vs_infoframe.data));
|
|
+ break;
|
|
+ }
|
|
+
|
|
+ case TDA_SET_AUDIO_MUTE_CMD: {
|
|
+ BUG_ON(copy_from_user(&this->tda.audio_mute, (bool *)arg, sizeof(bool)) != 0);
|
|
+ TRY(tx_set_audio_mute(this->tda.instance, \
|
|
+ this->tda.audio_mute));
|
|
+ break;
|
|
+ }
|
|
+
|
|
+ case TDA_RESET_AUDIO_CTS_CMD: {
|
|
+ TRY(tx_reset_audio_cts(this->tda.instance));
|
|
+ break;
|
|
+ }
|
|
+
|
|
+ case TDA_GET_EDID_STATUS_CMD: {
|
|
+ TRY(tx_get_edid_status(this->tda.instance, \
|
|
+ &this->tda.edid.status, \
|
|
+ &this->tda.edid.block_count));
|
|
+ BUG_ON(copy_to_user((tda_edid *)arg, &this->tda.edid, sizeof(tda_edid)) != 0);
|
|
+ break;
|
|
+ }
|
|
+
|
|
+ case TDA_GET_EDID_AUDIO_CAPS_CMD: {
|
|
+ TRY(tx_get_edid_audio_caps(this->tda.instance, \
|
|
+ this->tda.edid_audio_caps.desc, \
|
|
+ this->tda.edid_audio_caps.max, \
|
|
+ &this->tda.edid_audio_caps.written, \
|
|
+ &this->tda.edid_audio_caps.flags));
|
|
+ BUG_ON(copy_to_user((tda_edid_audio_caps *)arg, &this->tda.edid_audio_caps, sizeof(tda_edid_audio_caps)) != 0);
|
|
+ break;
|
|
+ }
|
|
+
|
|
+ case TDA_GET_EDID_VIDEO_CAPS_CMD: {
|
|
+ TRY(tx_get_edid_video_caps(this->tda.instance, \
|
|
+ this->tda.edid_video_caps.desc, \
|
|
+ this->tda.edid_video_caps.max, \
|
|
+ &this->tda.edid_video_caps.written, \
|
|
+ &this->tda.edid_video_caps.flags));
|
|
+ BUG_ON(copy_to_user((tda_edid_video_caps *)arg, &this->tda.edid_video_caps, sizeof(tda_edid_video_caps)) != 0);
|
|
+ break;
|
|
+ }
|
|
+
|
|
+ case TDA_GET_EDID_VIDEO_PREF_CMD: {
|
|
+ TRY(tx_get_edid_video_preferred(this->tda.instance, \
|
|
+ &this->tda.edid_video_timings));
|
|
+ BUG_ON(copy_to_user((tda_edid_video_timings *)arg, &this->tda.edid_video_timings, sizeof(tda_edid_video_timings)) != 0);
|
|
+ break;
|
|
+ }
|
|
+
|
|
+ case TDA_GET_EDID_SINK_TYPE_CMD: {
|
|
+ TRY(tx_get_edid_sink_type(this->tda.instance, \
|
|
+ &this->tda.setio.sink));
|
|
+ BUG_ON(copy_to_user((tda_sink *)arg, &this->tda.setio.sink, sizeof(tda_sink)) != 0);
|
|
+ break;
|
|
+ }
|
|
+
|
|
+ case TDA_GET_EDID_SOURCE_ADDRESS_CMD: {
|
|
+ TRY(tx_get_edid_source_address(this->tda.instance, \
|
|
+ &this->tda.src_address));
|
|
+ BUG_ON(copy_to_user((unsigned short *)arg, &this->tda.src_address, sizeof(unsigned short)) != 0);
|
|
+ break;
|
|
+ }
|
|
+
|
|
+ case TDA_SET_GAMMUT_CMD: {
|
|
+ BUG_ON(copy_from_user(&this->tda.gammut, (tda_gammut *)arg, sizeof(tda_gammut)) != 0);
|
|
+ TRY(tx_set_gamut_packet(this->tda.instance, \
|
|
+ this->tda.gammut.enable, \
|
|
+ &this->tda.gammut.data));
|
|
+ break;
|
|
+ }
|
|
+
|
|
+ case TDA_GET_EDID_DTD_CMD: {
|
|
+ TRY(tx_get_edid_detailled_timing_descriptors(this->tda.instance, \
|
|
+ this->tda.edid_dtd.desc, \
|
|
+ this->tda.edid_dtd.max, \
|
|
+ &this->tda.edid_dtd.written));
|
|
+ BUG_ON(copy_to_user((tda_edid_dtd *)arg, &this->tda.edid_dtd, sizeof(tda_edid_dtd)) != 0);
|
|
+ break;
|
|
+ }
|
|
+
|
|
+#if defined (TMFL_TDA19989) || defined (TMFL_TDA9984)
|
|
+ case TDA_GET_EDID_MD_CMD: {
|
|
+ TRY(tx_get_edid_monitor_descriptors(this->tda.instance, \
|
|
+ this->tda.edid_md.desc1, \
|
|
+ this->tda.edid_md.desc2, \
|
|
+ this->tda.edid_md.other, \
|
|
+ this->tda.edid_md.max, \
|
|
+ &this->tda.edid_md.written));
|
|
+ BUG_ON(copy_to_user((tda_edid_md *)arg, &this->tda.edid_md, sizeof(tda_edid_md)) != 0);
|
|
+ break;
|
|
+ }
|
|
+
|
|
+ case TDA_GET_EDID_TV_ASPECT_RATIO_CMD: {
|
|
+ TRY(tx_get_edid_tvpicture_ratio(this->tda.instance, \
|
|
+ &this->tda.edid_tv_aspect_ratio));
|
|
+ BUG_ON(copy_to_user((tda_edid_tv_aspect_ratio *)arg, &this->tda.edid_tv_aspect_ratio, sizeof(tda_edid_tv_aspect_ratio)) != 0);
|
|
+ break;
|
|
+ }
|
|
+
|
|
+ case TDA_GET_EDID_LATENCY_CMD: {
|
|
+ TRY(tx_get_edid_latency_info(this->tda.instance, \
|
|
+ &this->tda.edid_latency));
|
|
+ BUG_ON(copy_to_user((tda_edid_latency *)arg, &this->tda.edid_latency, sizeof(tda_edid_latency)) != 0);
|
|
+ break;
|
|
+ }
|
|
+
|
|
+ case TDA_SET_HDCP_CMD: {
|
|
+ BUG_ON(copy_from_user(&this->tda.hdcp_enable, (bool *)arg, sizeof(bool)) != 0);
|
|
+ break;
|
|
+ }
|
|
+
|
|
+ case TDA_GET_HDCP_STATUS_CMD: {
|
|
+ BUG_ON(copy_to_user((tda_edid_latency *)arg, &this->tda.hdcp_status, sizeof(tda_hdcp_status)) != 0);
|
|
+ break;
|
|
+ }
|
|
+#endif
|
|
+
|
|
+ default: {
|
|
+ /* unrecognized ioctl */
|
|
+ printk(KERN_INFO "hdmitx:%s:unknown ioctl number: %x\n", __func__, cmd);
|
|
+ up(&this->driver.sem);
|
|
+ return -ENOIOCTLCMD;
|
|
+ }
|
|
+ }
|
|
+
|
|
+TRY_DONE:
|
|
+ up(&this->driver.sem);
|
|
+ return err;
|
|
+}
|
|
+
|
|
+/*
|
|
+ * ioctl driver :: releasing
|
|
+ * */
|
|
+static int this_cdev_release(struct inode *p_inode, struct file *p_file)
|
|
+{
|
|
+ tda_instance *this = p_file->private_data;
|
|
+ int minor = iminor(p_inode);
|
|
+
|
|
+ LOG(KERN_INFO, "called\n");
|
|
+
|
|
+ if(minor >= MAX_MINOR) {
|
|
+ LOG(KERN_ERR, "minor too big!\n");
|
|
+ return -EINVAL;
|
|
+ }
|
|
+
|
|
+ BUG_ON(this->driver.minor != iminor(p_inode));
|
|
+ down(&this->driver.sem);
|
|
+
|
|
+ this->driver.user_counter--;
|
|
+ if(this->driver.user_counter == 0) {
|
|
+ p_file->private_data = NULL;
|
|
+ } else {
|
|
+ LOG(KERN_INFO, "still %d users pending\n", this->driver.user_counter);
|
|
+ }
|
|
+
|
|
+ up(&this->driver.sem);
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+/*
|
|
+ * I2C client :: creation
|
|
+ * */
|
|
+static int this_i2c_probe(struct i2c_client *client, const struct i2c_device_id *id)
|
|
+{
|
|
+ tda_instance *this = &our_instance;
|
|
+ int err = 0;
|
|
+
|
|
+ LOG(KERN_INFO, "called\n");
|
|
+
|
|
+ /*
|
|
+ * I2C setup
|
|
+ * */
|
|
+ if(this->driver.i2c_client) {
|
|
+ dev_err(&this->driver.i2c_client->dev, "<%s> HDMI device already created \n",
|
|
+ __func__);
|
|
+ return -ENODEV;
|
|
+ }
|
|
+
|
|
+ this->driver.i2c_client = kmalloc(sizeof(struct i2c_client), GFP_KERNEL);
|
|
+ if(!this->driver.i2c_client) {
|
|
+ return -ENOMEM;
|
|
+ }
|
|
+ memset(this->driver.i2c_client, 0, sizeof(struct i2c_client));
|
|
+
|
|
+ strncpy(this->driver.i2c_client->name, TX_NAME, I2C_NAME_SIZE);
|
|
+ this->driver.i2c_client->addr = TDA998X_I2C_SLAVEADDRESS;
|
|
+ this->driver.i2c_client->adapter = client->adapter;
|
|
+
|
|
+ i2c_set_clientdata(client, this->driver.i2c_client);
|
|
+
|
|
+#ifdef ANDROID_DSS
|
|
+ /* probe DSS */
|
|
+ err = omap_dss_register_driver(&hdmi_driver);
|
|
+#endif
|
|
+ if(err) goto i2c_tx_out;
|
|
+
|
|
+ /* prepare event */
|
|
+ this->driver.poll_done = true; /* currently idle */
|
|
+ init_waitqueue_head(&this->driver.wait);
|
|
+
|
|
+ /* I2C ok, then let's startup TDA */
|
|
+ err = hdmi_tx_init(this);
|
|
+ if(err) {
|
|
+ goto i2c_out;
|
|
+ }
|
|
+ this->tda.hdcp_enable = 0;
|
|
+ /* Standby the HDMI TX instance */
|
|
+ this->tda.power = power_standby;
|
|
+ tx_set_power_state(this->tda.instance, this->tda.power);
|
|
+ /* update HPD */
|
|
+ tx_get_hpdstatus(this->tda.instance, &this->tda.hot_plug_detect);
|
|
+
|
|
+#ifdef IRQ
|
|
+ /* FRO calibration */
|
|
+ err = gpio_request(TDA_IRQ_CALIB, "tda998x calibration");
|
|
+ if(err < 0) {
|
|
+ printk(KERN_ERR "hdmitx:%s:cannot use GPIO %d\n", __func__, TDA_IRQ_CALIB);
|
|
+ goto i2c_out;
|
|
+ }
|
|
+ /* turn GPIO into IRQ */
|
|
+ gpio_direction_input(TDA_IRQ_CALIB);
|
|
+ msleep(1);
|
|
+ if(request_irq(gpio_to_irq(TDA_IRQ_CALIB), \
|
|
+ tda_irq, IRQF_TRIGGER_FALLING | IRQF_DISABLED, "TDA IRQ", NULL)) {
|
|
+ printk(KERN_ERR "hdmitx:%s:cannot request irq, err:%d\n", __func__, err);
|
|
+ gpio_free(TDA_IRQ_CALIB);
|
|
+ goto i2c_out;
|
|
+ }
|
|
+#else
|
|
+ init_timer(&this->driver.no_irq_timer);
|
|
+ this->driver.no_irq_timer.function = polling_timeout;
|
|
+ this->driver.no_irq_timer.data = 0;
|
|
+ /* start polling in one sec */
|
|
+ this->driver.no_irq_timer.expires = jiffies + HZ;
|
|
+ add_timer(&this->driver.no_irq_timer);
|
|
+#endif
|
|
+
|
|
+ /* setup hdcp check timer */
|
|
+ init_timer(&this->driver.hdcp_check);
|
|
+ this->driver.hdcp_check.function = hdcp_check_timeout;
|
|
+ this->driver.hdcp_check.data = 0;
|
|
+
|
|
+ tx_get_swversion(&this->tda.version);
|
|
+ printk(KERN_INFO "HDMI TX SW version:%ul.%ul compatibility:%ul\n", \
|
|
+ this->tda.version.major_version_nr, \
|
|
+ this->tda.version.minor_version_nr, \
|
|
+ this->tda.version.compatibility_nr);
|
|
+
|
|
+ return 0;
|
|
+
|
|
+i2c_tx_out:
|
|
+ LOG(KERN_INFO, "tx closed\n");
|
|
+ /* close DevLib */
|
|
+ err = tx_close(this->tda.instance);
|
|
+
|
|
+i2c_out:
|
|
+ LOG(KERN_INFO, "this->driver.i2c_client removed\n");
|
|
+ kfree(this->driver.i2c_client);
|
|
+ this->driver.i2c_client = NULL;
|
|
+
|
|
+ return err;
|
|
+}
|
|
+
|
|
+/*
|
|
+ * I2C client :: destroy
|
|
+ * */
|
|
+static int this_i2c_remove(struct i2c_client *client)
|
|
+{
|
|
+ tda_instance *this = &our_instance;
|
|
+ int err = 0;
|
|
+
|
|
+ LOG(KERN_INFO, "called\n");
|
|
+
|
|
+#ifdef ANDROID_DSS
|
|
+ /* unplug DSS */
|
|
+ omap_dss_unregister_driver(&hdmi_driver);
|
|
+#endif
|
|
+
|
|
+ if(!client->adapter) {
|
|
+ dev_err(&this->driver.i2c_client->dev, "<%s> no HDMI device \n",
|
|
+ __func__);
|
|
+ return -ENODEV;
|
|
+ }
|
|
+ kfree(this->driver.i2c_client);
|
|
+ this->driver.i2c_client = NULL;
|
|
+
|
|
+ return err;
|
|
+}
|
|
+
|
|
+/*
|
|
+ * I2C client driver (backend)
|
|
+ * -----------------
|
|
+ * */
|
|
+static const struct i2c_device_id this_i2c_id[] = {
|
|
+ { TX_NAME, 0 },
|
|
+ { },
|
|
+};
|
|
+
|
|
+MODULE_DEVICE_TABLE(i2c, this_i2c_id);
|
|
+
|
|
+static struct i2c_driver this_i2c_driver = {
|
|
+ .driver = {
|
|
+ .owner = THIS_MODULE,
|
|
+ .name = TX_NAME,
|
|
+ },
|
|
+ .probe = this_i2c_probe,
|
|
+ .remove = this_i2c_remove,
|
|
+ .id_table = this_i2c_id,
|
|
+ };
|
|
+
|
|
+/*
|
|
+ * ioctl driver (userland frontend)
|
|
+ * ------------
|
|
+ * */
|
|
+static struct file_operations this_cdev_fops = {
|
|
+owner:
|
|
+ THIS_MODULE,
|
|
+open:
|
|
+ this_cdev_open,
|
|
+release:
|
|
+ this_cdev_release,
|
|
+/*ioctl:*/
|
|
+unlocked_ioctl:
|
|
+ this_cdev_ioctl,
|
|
+};
|
|
+
|
|
+/*
|
|
+ * Module :: start up
|
|
+ * */
|
|
+static int __init tx_init(void)
|
|
+{
|
|
+ tda_instance *this = &our_instance;
|
|
+ dev_t dev = 0;
|
|
+ int err = 0;
|
|
+
|
|
+ /*
|
|
+ * general device context
|
|
+ * */
|
|
+ memset(this, 0, sizeof(tda_instance));
|
|
+ this->param.verbose = param_verbose;
|
|
+ this->param.major = param_major;
|
|
+ this->param.minor = param_minor;
|
|
+
|
|
+ /* Hello word */
|
|
+ printk(KERN_INFO "%s(%s) %d.%d.%d compiled: %s %s %s\n", HDMITX_NAME, TDA_NAME,
|
|
+ TDA_VERSION_MAJOR,
|
|
+ TDA_VERSION_MINOR,
|
|
+ TDA_VERSION_PATCHLEVEL,
|
|
+ __DATE__, __TIME__, TDA_VERSION_EXTRA);
|
|
+ if(this->param.verbose) LOG(KERN_INFO, ".verbose mode\n");
|
|
+
|
|
+ /*
|
|
+ * plug I2C (backend : Hw interfacing)
|
|
+ * */
|
|
+ err = i2c_add_driver(&this_i2c_driver);
|
|
+ if(err < 0) {
|
|
+ printk(KERN_ERR "driver registration failed\n");
|
|
+ return -ENODEV;
|
|
+ }
|
|
+
|
|
+ if(this->driver.i2c_client == NULL) {
|
|
+ printk(KERN_ERR "this->driver.i2c_client not allocated\n");
|
|
+ /* unregister i2c */
|
|
+ err = -ENODEV;
|
|
+ goto init_out;
|
|
+ }
|
|
+
|
|
+ /*
|
|
+ * cdev init (userland frontend)
|
|
+ * */
|
|
+
|
|
+ /* arbitray range of device numbers */
|
|
+ if(this->param.major) {
|
|
+ /* user force major number @ insmod */
|
|
+ dev = MKDEV(this->param.major, this->param.minor);
|
|
+ err = register_chrdev_region(dev, MAX_MINOR, HDMITX_NAME);
|
|
+ if(err) {
|
|
+ printk(KERN_ERR "unable to register %s, dev=%d %s\n", HDMITX_NAME, dev, ERR_TO_STR(err));
|
|
+ goto init_out;
|
|
+ }
|
|
+ } else {
|
|
+ /* fully dynamic major number */
|
|
+ err = alloc_chrdev_region(&dev, this->param.minor, MAX_MINOR, HDMITX_NAME);
|
|
+ if(err) {
|
|
+ printk(KERN_ERR "unable to alloc chrdev region for %s, dev=%d %s\n", HDMITX_NAME, dev, ERR_TO_STR(err));
|
|
+ goto init_out;
|
|
+ }
|
|
+ this->param.major = MAJOR(dev);
|
|
+ this->param.minor = MINOR(dev);
|
|
+ /* create_dev("/dev/hdmitx",dev); */
|
|
+ LOG(KERN_INFO, "/dev/hdmitx created major:%d minor:%d\n", this->param.major, this->param.minor);
|
|
+ }
|
|
+
|
|
+ cdev_init(this_cdev, &this_cdev_fops);
|
|
+ this_cdev->owner = THIS_MODULE;
|
|
+
|
|
+ this->driver.class = class_create(THIS_MODULE, HDMITX_NAME);
|
|
+ if(IS_ERR(this->driver.class)) {
|
|
+ printk(KERN_INFO "error creating mmap device class.\n");
|
|
+ err = -EIO;
|
|
+ goto init_out;
|
|
+ }
|
|
+ /* parent */
|
|
+ this->driver.dev = device_create(this->driver.class, NULL , dev, NULL, HDMITX_NAME);
|
|
+
|
|
+ this->driver.devno = dev;
|
|
+ err = cdev_add(this_cdev, this->driver.devno, MAX_MINOR);
|
|
+ if(err) {
|
|
+ printk(KERN_INFO "unable to add device for %s, ipp_driver.devno=%d %s\n", HDMITX_NAME, this->driver.devno, ERR_TO_STR(err));
|
|
+ device_destroy(this->driver.class, this->driver.devno);
|
|
+ class_destroy(this->driver.class);
|
|
+ unregister_chrdev_region(this->driver.devno, MAX_MINOR);
|
|
+ goto init_out;
|
|
+ }
|
|
+
|
|
+ /*
|
|
+ * general device context
|
|
+ * */
|
|
+ init_MUTEX(&this->driver.sem);
|
|
+ hdmi_enable();
|
|
+ return 0;
|
|
+
|
|
+init_out:
|
|
+ i2c_del_driver(&this_i2c_driver);
|
|
+ return err;
|
|
+}
|
|
+
|
|
+/*
|
|
+ * Module :: shut down
|
|
+ * */
|
|
+static void __exit tx_exit(void)
|
|
+{
|
|
+ tda_instance *this = &our_instance;
|
|
+
|
|
+ LOG(KERN_INFO, "called\n");
|
|
+
|
|
+#ifdef IRQ
|
|
+ free_irq(gpio_to_irq(TDA_IRQ_CALIB), NULL);
|
|
+ gpio_free(TDA_IRQ_CALIB);
|
|
+#else
|
|
+ del_timer(&this->driver.no_irq_timer);
|
|
+#endif
|
|
+
|
|
+ del_timer(&this->driver.hdcp_check);
|
|
+ msleep(100);
|
|
+
|
|
+ /* close DevLib */
|
|
+ tx_close(this->tda.instance);
|
|
+
|
|
+ /* unregister cdevice */
|
|
+ cdev_del(this_cdev);
|
|
+ unregister_chrdev_region(this->driver.devno, MAX_MINOR);
|
|
+
|
|
+ /* unregister device */
|
|
+ device_destroy(this->driver.class, this->driver.devno);
|
|
+ class_destroy(this->driver.class);
|
|
+
|
|
+ /* unregister i2c */
|
|
+ i2c_del_driver(&this_i2c_driver);
|
|
+}
|
|
+
|
|
+/*
|
|
+ * Module
|
|
+ * ------
|
|
+ * */
|
|
+/* late_initcall(tx_init); */
|
|
+module_init(tx_init);
|
|
+module_exit(tx_exit);
|
|
+
|
|
+/*
|
|
+ * Disclamer
|
|
+ * ---------
|
|
+ * */
|
|
+MODULE_LICENSE("GPL");
|
|
+MODULE_AUTHOR("andre lepine <andre.lepine@nxp.com>");
|
|
+MODULE_DESCRIPTION(HDMITX_NAME " driver");
|
|
diff --git a/drivers/video/hdmi/tda998x.h b/drivers/video/hdmi/tda998x.h
|
|
new file mode 100644
|
|
index 0000000..008d1c5
|
|
--- /dev/null
|
|
+++ b/drivers/video/hdmi/tda998x.h
|
|
@@ -0,0 +1,139 @@
|
|
+/*****************************************************************************/
|
|
+/* Copyright (c) 2009 NXP Semiconductors BV */
|
|
+/* */
|
|
+/* This program is free software; you can redistribute it and/or modify */
|
|
+/* it under the terms of the GNU General Public License as published by */
|
|
+/* the Free Software Foundation, using version 2 of the License. */
|
|
+/* */
|
|
+/* This program is distributed in the hope that it will be useful, */
|
|
+/* but WITHOUT ANY WARRANTY; without even the implied warranty of */
|
|
+/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */
|
|
+/* GNU General Public License for more details. */
|
|
+/* */
|
|
+/* You should have received a copy of the GNU General Public License */
|
|
+/* along with this program; if not, write to the Free Software */
|
|
+/* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 */
|
|
+/* USA. */
|
|
+/* */
|
|
+/*****************************************************************************/
|
|
+
|
|
+#ifndef __tx_h__
|
|
+#define __tx_h__
|
|
+
|
|
+#include "tda998x_ioctl.h"
|
|
+
|
|
+#define HDMITX_NAME "hdmitx"
|
|
+
|
|
+#define POLLING_WQ_NAME "TDA_POLLING"
|
|
+#define HDCP_CHECK_EVERY_MS 35
|
|
+#define CHECK_EVERY_XX_MS 200
|
|
+#define OMAP_LCD_GPIO 8
|
|
+
|
|
+#define TDA_MAJOR 234 /* old-style interval of device numbers */
|
|
+#define MAX_MINOR 1 /* 1 minor but 2 access : 1 more for pooling */
|
|
+
|
|
+/* common I2C define with kernel */
|
|
+/* should be the same as arch/arm/mach-omap2/board-zoom2.c */
|
|
+#define TX_NAME "tda998X"
|
|
+#define TDA998X_I2C_SLAVEADDRESS 0x70
|
|
+
|
|
+/* On gplugD GPIO # 84 is connected to HDMI interrupt line */
|
|
+#define TDA_IRQ_CALIB 84
|
|
+
|
|
+#define EDID_BLOCK_COUNT 4
|
|
+#define EDID_BLOCK_SIZE 128
|
|
+#define MAX_EDID_TRIAL 5
|
|
+#define NO_PHY_ADDR 0xFFFF
|
|
+
|
|
+#define LOG(type,fmt,args...) {if (this->param.verbose) {printk(type HDMITX_NAME":%s:" fmt, __func__, ## args);}}
|
|
+/* not found the kernel "strerror" one! If someone knows, please replace it */
|
|
+#define ERR_TO_STR(e)((e == -ENODATA)?"ENODATA, no data available":\
|
|
+ (e == -ENOMEM)? "ENOMEM, no memory available":\
|
|
+ (e == -EINVAL)? "EINVAL, invalid argument":\
|
|
+ (e == -EIO)? "EIO, input/output error":\
|
|
+ (e == -ETIMEDOUT)? "ETIMEOUT, timeout has expired":\
|
|
+ (e == -EBUSY)? "EBUSY, device or resource busy":\
|
|
+ (e == -ENOENT)? "ENOENT, no such file or directory":\
|
|
+ (e == -EACCES)? "EACCES, permission denied":\
|
|
+ (e == 0)? "":\
|
|
+ "!UNKNOWN!")
|
|
+
|
|
+#define TRY(fct) do { \
|
|
+ err=(fct); \
|
|
+ if (err) { \
|
|
+ printk(KERN_ERR "%s returned in %s line %d\n",hdmi_tx_err_string(err),__func__,__LINE__); \
|
|
+ goto TRY_DONE; \
|
|
+ } \
|
|
+ }while(0)
|
|
+
|
|
+typedef void (*cec_callback_t)(struct work_struct *dummy);
|
|
+
|
|
+typedef struct {
|
|
+ /* module params */
|
|
+ struct {
|
|
+ int verbose;
|
|
+ int major;
|
|
+ int minor;
|
|
+ } param;
|
|
+ /* driver */
|
|
+ struct {
|
|
+ struct class *class;
|
|
+ struct device *dev;
|
|
+ int devno;
|
|
+ struct i2c_client *i2c_client;
|
|
+ struct semaphore sem;
|
|
+ int user_counter;
|
|
+ int minor;
|
|
+ wait_queue_head_t wait;
|
|
+ bool poll_done;
|
|
+#ifndef IRQ
|
|
+ struct timer_list no_irq_timer;
|
|
+#endif
|
|
+ struct timer_list hdcp_check;
|
|
+ cec_callback_t cec_callback;
|
|
+ } driver;
|
|
+ /* HDMI */
|
|
+ struct {
|
|
+ int instance;
|
|
+ tda_version version;
|
|
+ tda_setup setup;
|
|
+ tda_power power;
|
|
+ tx_hot_plug_t hot_plug_detect;
|
|
+ bool rx_device_active;
|
|
+ tda_video_format video_fmt;
|
|
+ tda_set_in_out setio;
|
|
+ bool audio_mute;
|
|
+ tda_video_infoframe video_infoframe;
|
|
+ tda_audio_infoframe audio_infoframe;
|
|
+ tda_acp acp;
|
|
+ tda_gcp gcp;
|
|
+ tda_isrc1 isrc1;
|
|
+ tda_isrc2 isrc2;
|
|
+ tda_gammut gammut;
|
|
+ tda_mps_infoframe mps_infoframe;
|
|
+ tda_spd_infoframe spd_infoframe;
|
|
+ tda_vs_infoframe vs_infoframe;
|
|
+ tda_edid edid;
|
|
+ tda_edid_dtd edid_dtd;
|
|
+ tda_edid_md edid_md;
|
|
+ tda_edid_audio_caps edid_audio_caps;
|
|
+ tda_edid_video_caps edid_video_caps;
|
|
+ tda_edid_video_timings edid_video_timings;
|
|
+ tda_edid_tv_aspect_ratio edid_tv_aspect_ratio;
|
|
+#ifdef TMFL_TDA19989
|
|
+ tda_edid_latency edid_latency;
|
|
+#endif
|
|
+ unsigned short src_address;
|
|
+ unsigned char raw_edid[EDID_BLOCK_COUNT *EDID_BLOCK_SIZE];
|
|
+ tda_capabilities capabilities;
|
|
+ tda_event event;
|
|
+ tda_hdcp_status hdcp_status;
|
|
+ bool hdcp_enable;
|
|
+#if defined (TMFL_TDA19989) || defined (TMFL_TDA9984)
|
|
+ tda_hdcp_fail hdcp_fail;
|
|
+#endif
|
|
+ unsigned char hdcp_raw_status;
|
|
+ } tda;
|
|
+} tda_instance;
|
|
+
|
|
+#endif /* __tx_h__ */
|
|
diff --git a/drivers/video/hdmi/tda998x_cec.c b/drivers/video/hdmi/tda998x_cec.c
|
|
new file mode 100644
|
|
index 0000000..103acbd
|
|
--- /dev/null
|
|
+++ b/drivers/video/hdmi/tda998x_cec.c
|
|
@@ -0,0 +1,2629 @@
|
|
+/*****************************************************************************/
|
|
+/* Copyright (c) 2009 NXP Semiconductors BV */
|
|
+/* */
|
|
+/* This program is free software; you can redistribute it and/or modify */
|
|
+/* it under the terms of the GNU General Public License as published by */
|
|
+/* the Free Software Foundation, using version 2 of the License. */
|
|
+/* */
|
|
+/* This program is distributed in the hope that it will be useful, */
|
|
+/* but WITHOUT ANY WARRANTY; without even the implied warranty of */
|
|
+/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */
|
|
+/* GNU General Public License for more details. */
|
|
+/* */
|
|
+/* You should have received a copy of the GNU General Public License */
|
|
+/* along with this program; if not, write to the Free Software */
|
|
+/* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 */
|
|
+/* USA. */
|
|
+/* */
|
|
+/*****************************************************************************/
|
|
+
|
|
+#define _cec_c_
|
|
+
|
|
+#include <linux/init.h>
|
|
+#include <linux/kernel.h>
|
|
+#include <linux/module.h>
|
|
+#include <linux/cdev.h>
|
|
+#include <linux/fs.h>
|
|
+#include <linux/ioctl.h>
|
|
+#include <linux/i2c.h>
|
|
+#include <linux/delay.h>
|
|
+#include <linux/interrupt.h>
|
|
+#include <linux/input.h>
|
|
+#include <asm/uaccess.h>
|
|
+#include <mach/gpio.h>
|
|
+
|
|
+/* HDMI DevLib */
|
|
+#include "tmNxCompId.h"
|
|
+#include "tmdlHdmiCEC.h"
|
|
+#include "tmdlHdmiCEC_local.h"
|
|
+
|
|
+/* local */
|
|
+#include "tda998x_version.h"
|
|
+#include "tda998x_cec.h"
|
|
+#include "tda998x_ioctl.h"
|
|
+
|
|
+/*
|
|
+ *
|
|
+ * DEFINITION
|
|
+ * ----------
|
|
+ * LEVEL 0
|
|
+ *
|
|
+ * */
|
|
+
|
|
+/*
|
|
+ * Global
|
|
+ * */
|
|
+
|
|
+MODULE_DEVICE_TABLE(i2c, this_i2c_id);
|
|
+static const struct i2c_device_id this_i2c_id[] = {
|
|
+ { CEC_NAME, 0 },
|
|
+ { },
|
|
+};
|
|
+cec_instance our_instance;
|
|
+static struct cdev our_cdev, *this_cdev = &our_cdev;
|
|
+
|
|
+#ifdef TWL4030_HACK
|
|
+/* AL : hack to bypass keypad */
|
|
+struct input_dev *gkp_input;
|
|
+extern struct input_dev *get_twm4030_input(void);
|
|
+#endif
|
|
+
|
|
+/*
|
|
+ * Dependancies to HdmiTx module
|
|
+ * */
|
|
+
|
|
+extern void register_cec_interrupt(cec_callback_t fct);
|
|
+extern void unregister_cec_interrupt(void);
|
|
+extern short edid_phy_addr(void);
|
|
+extern int hdmi_enable(void);
|
|
+extern int hdmi_disable(int event_tracking);
|
|
+extern cec_power get_hdmi_status(void);
|
|
+extern cec_power get_hpd_status(void);
|
|
+extern int edid_received(void);
|
|
+
|
|
+/*
|
|
+ * Module params
|
|
+ * */
|
|
+
|
|
+static int param_verbose = 0, param_major = 0, param_minor = 0, param_device = 4, param_addr = 0xFFFF;
|
|
+module_param_named(verbose, param_verbose, int, S_IRUGO | S_IWUSR);
|
|
+MODULE_PARM_DESC(verbose, "make the driver verbose");
|
|
+module_param_named(major, param_major, int, S_IRUGO);
|
|
+MODULE_PARM_DESC(major, "the major number of the device mapper");
|
|
+module_param_named(device, param_device, int, S_IRUGO);
|
|
+MODULE_PARM_DESC(device, "device type can be 0:tv, 1:rec 3:tuner 4:mediaplayer, 5:audio");
|
|
+module_param_named(addr, param_addr, int, S_IRUGO);
|
|
+MODULE_PARM_DESC(addr, "physical address (until EDID received)");
|
|
+
|
|
+/*
|
|
+ *
|
|
+ * TOOLBOX
|
|
+ * -------
|
|
+ * LEVEL 1
|
|
+ *
|
|
+ * - i2c read/write
|
|
+ * - chip Id check
|
|
+ * - i2c client info
|
|
+ *
|
|
+ * */
|
|
+
|
|
+/*
|
|
+ * Get main and unique I2C Client driver handle
|
|
+ * */
|
|
+struct i2c_client *get_this_i2c_client(void) {
|
|
+ cec_instance *this = &our_instance;
|
|
+ return this->driver.i2c_client;
|
|
+}
|
|
+
|
|
+/*
|
|
+ * error handling
|
|
+ * */
|
|
+static char *hdmi_cec_err_string(int err)
|
|
+{
|
|
+ switch(err) {
|
|
+ case ERR_DLHDMICEC_COMPATIBILITY: {
|
|
+ return "SW interface compatibility";
|
|
+ break;
|
|
+ }
|
|
+ case ERR_DLHDMICEC_MAJOR_VERSION: {
|
|
+ return "SW major version error";
|
|
+ break;
|
|
+ }
|
|
+ case ERR_DLHDMICEC_COMP_VERSION: {
|
|
+ return "SW component version error";
|
|
+ break;
|
|
+ }
|
|
+ case ERR_DLHDMICEC_BAD_UNIT_NUMBER: {
|
|
+ return "invalid device unit number";
|
|
+ break;
|
|
+ }
|
|
+ case ERR_DLHDMICEC_BAD_INSTANCE: {
|
|
+ return "bad input instance value ";
|
|
+ break;
|
|
+ }
|
|
+ case ERR_DLHDMICEC_BAD_HANDLE: {
|
|
+ return "bad input handle";
|
|
+ break;
|
|
+ }
|
|
+ case ERR_DLHDMICEC_BAD_PARAMETER: {
|
|
+ return "invalid input parameter";
|
|
+ break;
|
|
+ }
|
|
+ case ERR_DLHDMICEC_NO_RESOURCES: {
|
|
+ return "resource is not available ";
|
|
+ break;
|
|
+ }
|
|
+ case ERR_DLHDMICEC_RESOURCE_OWNED: {
|
|
+ return "resource is already in use";
|
|
+ break;
|
|
+ }
|
|
+ case ERR_DLHDMICEC_RESOURCE_NOT_OWNED: {
|
|
+ return "caller does not own resource";
|
|
+ break;
|
|
+ }
|
|
+ case ERR_DLHDMICEC_INCONSISTENT_PARAMS: {
|
|
+ return "inconsistent input params";
|
|
+ break;
|
|
+ }
|
|
+ case ERR_DLHDMICEC_NOT_INITIALIZED: {
|
|
+ return "component is not initializ";
|
|
+ break;
|
|
+ }
|
|
+ case ERR_DLHDMICEC_NOT_SUPPORTED: {
|
|
+ return "function is not supported";
|
|
+ break;
|
|
+ }
|
|
+ case ERR_DLHDMICEC_INIT_FAILED: {
|
|
+ return "initialization failed";
|
|
+ break;
|
|
+ }
|
|
+ case ERR_DLHDMICEC_BUSY: {
|
|
+ return "component is busy";
|
|
+ break;
|
|
+ }
|
|
+ case ERR_DLHDMICEC_I2C_READ: {
|
|
+ return "read error";
|
|
+ break;
|
|
+ }
|
|
+ case ERR_DLHDMICEC_I2C_WRITE: {
|
|
+ return "write error";
|
|
+ break;
|
|
+ }
|
|
+ case ERR_DLHDMICEC_FULL: {
|
|
+ return "queue is full";
|
|
+ break;
|
|
+ }
|
|
+ case ERR_DLHDMICEC_NOT_STARTED: {
|
|
+ return "function is not started";
|
|
+ break;
|
|
+ }
|
|
+ case ERR_DLHDMICEC_ALREADY_STARTED: {
|
|
+ return "function is already starte";
|
|
+ break;
|
|
+ }
|
|
+ case ERR_DLHDMICEC_ASSERTION: {
|
|
+ return "assertion failure";
|
|
+ break;
|
|
+ }
|
|
+ case ERR_DLHDMICEC_INVALID_STATE: {
|
|
+ return "invalid state for function";
|
|
+ break;
|
|
+ }
|
|
+ case ERR_DLHDMICEC_OPERATION_NOT_PERMITTED: {
|
|
+ return "corresponds to posix EPERM";
|
|
+ break;
|
|
+ }
|
|
+ default : {
|
|
+ return "unexpected error";
|
|
+ break;
|
|
+ }
|
|
+ }
|
|
+}
|
|
+
|
|
+char *cec_opcode(int op)
|
|
+{
|
|
+ switch(op) {
|
|
+ case CEC_OPCODE_FEATURE_ABORT: {
|
|
+ return "CEC_OPCODE_FEATURE_ABORT";
|
|
+ break;
|
|
+ }
|
|
+ case CEC_OPCODE_IMAGE_VIEW_ON: {
|
|
+ return "CEC_OPCODE_IMAGE_VIEW_ON";
|
|
+ break;
|
|
+ }
|
|
+ case CEC_OPCODE_TUNER_STEP_INCREMENT: {
|
|
+ return "CEC_OPCODE_TUNER_STEP_INCREMENT";
|
|
+ break;
|
|
+ }
|
|
+ case CEC_OPCODE_TUNER_STEP_DECREMENT: {
|
|
+ return "CEC_OPCODE_TUNER_STEP_DECREMENT";
|
|
+ break;
|
|
+ }
|
|
+ case CEC_OPCODE_TUNER_DEVICE_STATUS: {
|
|
+ return "CEC_OPCODE_TUNER_DEVICE_STATUS";
|
|
+ break;
|
|
+ }
|
|
+ case CEC_OPCODE_GIVE_TUNER_DEVICE_STATUS: {
|
|
+ return "CEC_OPCODE_GIVE_TUNER_DEVICE_STATUS";
|
|
+ break;
|
|
+ }
|
|
+ case CEC_OPCODE_RECORD_ON: {
|
|
+ return "CEC_OPCODE_RECORD_ON";
|
|
+ break;
|
|
+ }
|
|
+ case CEC_OPCODE_RECORD_STATUS: {
|
|
+ return "CEC_OPCODE_RECORD_STATUS";
|
|
+ break;
|
|
+ }
|
|
+ case CEC_OPCODE_RECORD_OFF: {
|
|
+ return "CEC_OPCODE_RECORD_OFF";
|
|
+ break;
|
|
+ }
|
|
+ case CEC_OPCODE_TEXT_VIEW_ON: {
|
|
+ return "CEC_OPCODE_TEXT_VIEW_ON";
|
|
+ break;
|
|
+ }
|
|
+ case CEC_OPCODE_RECORD_TV_SCREEN: {
|
|
+ return "CEC_OPCODE_RECORD_TV_SCREEN";
|
|
+ break;
|
|
+ }
|
|
+ case CEC_OPCODE_GIVE_DECK_STATUS: {
|
|
+ return "CEC_OPCODE_GIVE_DECK_STATUS";
|
|
+ break;
|
|
+ }
|
|
+ case CEC_OPCODE_DECK_STATUS: {
|
|
+ return "CEC_OPCODE_DECK_STATUS";
|
|
+ break;
|
|
+ }
|
|
+ case CEC_OPCODE_SET_MENU_LANGUAGE: {
|
|
+ return "CEC_OPCODE_SET_MENU_LANGUAGE";
|
|
+ break;
|
|
+ }
|
|
+ case CEC_OPCODE_CLEAR_ANALOGUE_TIMER: {
|
|
+ return "CEC_OPCODE_CLEAR_ANALOGUE_TIMER";
|
|
+ break;
|
|
+ }
|
|
+ case CEC_OPCODE_SET_ANALOGUE_TIMER: {
|
|
+ return "CEC_OPCODE_SET_ANALOGUE_TIMER";
|
|
+ break;
|
|
+ }
|
|
+ case CEC_OPCODE_TIMER_STATUS: {
|
|
+ return "CEC_OPCODE_TIMER_STATUS";
|
|
+ break;
|
|
+ }
|
|
+ case CEC_OPCODE_STANDBY: {
|
|
+ return "CEC_OPCODE_STANDBY";
|
|
+ break;
|
|
+ }
|
|
+ case CEC_OPCODE_PLAY: {
|
|
+ return "CEC_OPCODE_PLAY";
|
|
+ break;
|
|
+ }
|
|
+ /* case CEC_OPCODE_DECK_CONTROL: {return "CEC_OPCODE_DECK_CONTROL";break;} */
|
|
+ case CEC_OPCODE_TIMER_CLEARED_STATUS: {
|
|
+ return "CEC_OPCODE_TIMER_CLEARED_STATUS";
|
|
+ break;
|
|
+ }
|
|
+ case CEC_OPCODE_USER_CONTROL_PRESSED: {
|
|
+ return "CEC_OPCODE_USER_CONTROL_PRESSED";
|
|
+ break;
|
|
+ }
|
|
+ case CEC_OPCODE_USER_CONTROL_RELEASED: {
|
|
+ return "CEC_OPCODE_USER_CONTROL_RELEASED";
|
|
+ break;
|
|
+ }
|
|
+ case CEC_OPCODE_GIVE_OSD_NAME: {
|
|
+ return "CEC_OPCODE_GIVE_OSD_NAME";
|
|
+ break;
|
|
+ }
|
|
+ case CEC_OPCODE_SET_OSD_NAME: {
|
|
+ return "CEC_OPCODE_SET_OSD_NAME";
|
|
+ break;
|
|
+ }
|
|
+ case CEC_OPCODE_SET_OSD_STRING: {
|
|
+ return "CEC_OPCODE_SET_OSD_STRING";
|
|
+ break;
|
|
+ }
|
|
+ case CEC_OPCODE_SET_TIMER_PROGRAM_TITLE: {
|
|
+ return "CEC_OPCODE_SET_TIMER_PROGRAM_TITLE";
|
|
+ break;
|
|
+ }
|
|
+ case CEC_OPCODE_SYSTEM_AUDIO_MODE_REQUEST: {
|
|
+ return "CEC_OPCODE_SYSTEM_AUDIO_MODE_REQUEST";
|
|
+ break;
|
|
+ }
|
|
+ case CEC_OPCODE_GIVE_AUDIO_STATUS: {
|
|
+ return "CEC_OPCODE_GIVE_AUDIO_STATUS";
|
|
+ break;
|
|
+ }
|
|
+ case CEC_OPCODE_SET_SYSTEM_AUDIO_MODE: {
|
|
+ return "CEC_OPCODE_SET_SYSTEM_AUDIO_MODE";
|
|
+ break;
|
|
+ }
|
|
+ case CEC_OPCODE_REPORT_AUDIO_STATUS: {
|
|
+ return "CEC_OPCODE_REPORT_AUDIO_STATUS";
|
|
+ break;
|
|
+ }
|
|
+ case CEC_OPCODE_GIVE_SYSTEM_AUDIO_MODE_STATUS: {
|
|
+ return "CEC_OPCODE_GIVE_SYSTEM_AUDIO_MODE_STATUS";
|
|
+ break;
|
|
+ }
|
|
+ case CEC_OPCODE_SYSTEM_AUDIO_MODE_STATUS: {
|
|
+ return "CEC_OPCODE_SYSTEM_AUDIO_MODE_STATUS";
|
|
+ break;
|
|
+ }
|
|
+ case CEC_OPCODE_ROUTING_CHANGE: {
|
|
+ return "CEC_OPCODE_ROUTING_CHANGE";
|
|
+ break;
|
|
+ }
|
|
+ case CEC_OPCODE_ROUTING_INFORMATION: {
|
|
+ return "CEC_OPCODE_ROUTING_INFORMATION";
|
|
+ break;
|
|
+ }
|
|
+ case CEC_OPCODE_ACTIVE_SOURCE: {
|
|
+ return "CEC_OPCODE_ACTIVE_SOURCE";
|
|
+ break;
|
|
+ }
|
|
+ case CEC_OPCODE_GIVE_PHYSICAL_ADDRESS: {
|
|
+ return "CEC_OPCODE_GIVE_PHYSICAL_ADDRESS";
|
|
+ break;
|
|
+ }
|
|
+ case CEC_OPCODE_REPORT_PHYSICAL_ADDRESS: {
|
|
+ return "CEC_OPCODE_REPORT_PHYSICAL_ADDRESS";
|
|
+ break;
|
|
+ }
|
|
+ case CEC_OPCODE_REQUEST_ACTIVE_SOURCE: {
|
|
+ return "CEC_OPCODE_REQUEST_ACTIVE_SOURCE";
|
|
+ break;
|
|
+ }
|
|
+ case CEC_OPCODE_SET_STREAM_PATH: {
|
|
+ return "CEC_OPCODE_SET_STREAM_PATH";
|
|
+ break;
|
|
+ }
|
|
+ case CEC_OPCODE_DEVICE_VENDOR_ID: {
|
|
+ return "CEC_OPCODE_DEVICE_VENDOR_ID";
|
|
+ break;
|
|
+ }
|
|
+ case CEC_OPCODE_VENDOR_COMMAND: {
|
|
+ return "CEC_OPCODE_VENDOR_COMMAND";
|
|
+ break;
|
|
+ }
|
|
+ case CEC_OPCODE_VENDOR_REMOTE_BUTTON_DOWN: {
|
|
+ return "CEC_OPCODE_VENDOR_REMOTE_BUTTON_DOWN";
|
|
+ break;
|
|
+ }
|
|
+ case CEC_OPCODE_VENDOR_REMOTE_BUTTON_UP: {
|
|
+ return "CEC_OPCODE_VENDOR_REMOTE_BUTTON_UP";
|
|
+ break;
|
|
+ }
|
|
+ case CEC_OPCODE_GIVE_DEVICE_VENDOR_ID: {
|
|
+ return "CEC_OPCODE_GIVE_DEVICE_VENDOR_ID";
|
|
+ break;
|
|
+ }
|
|
+ case CEC_OPCODE_MENU_REQUEST: {
|
|
+ return "CEC_OPCODE_MENU_REQUEST";
|
|
+ break;
|
|
+ }
|
|
+ case CEC_OPCODE_MENU_STATUS: {
|
|
+ return "CEC_OPCODE_MENU_STATUS";
|
|
+ break;
|
|
+ }
|
|
+ case CEC_OPCODE_GIVE_DEVICE_POWER_STATUS: {
|
|
+ return "CEC_OPCODE_GIVE_DEVICE_POWER_STATUS";
|
|
+ break;
|
|
+ }
|
|
+ case CEC_OPCODE_REPORT_POWER_STATUS: {
|
|
+ return "CEC_OPCODE_REPORT_POWER_STATUS";
|
|
+ break;
|
|
+ }
|
|
+ case CEC_OPCODE_GET_MENU_LANGUAGE: {
|
|
+ return "CEC_OPCODE_GET_MENU_LANGUAGE";
|
|
+ break;
|
|
+ }
|
|
+ case CEC_OPCODE_SET_ANALOGUE_SERVICE: {
|
|
+ return "CEC_OPCODE_SET_ANALOGUE_SERVICE";
|
|
+ break;
|
|
+ }
|
|
+ case CEC_OPCODE_SET_DIGITAL_SERVICE: {
|
|
+ return "CEC_OPCODE_SET_DIGITAL_SERVICE";
|
|
+ break;
|
|
+ }
|
|
+ case CEC_OPCODE_SET_DIGITAL_TIMER: {
|
|
+ return "CEC_OPCODE_SET_DIGITAL_TIMER";
|
|
+ break;
|
|
+ }
|
|
+ case CEC_OPCODE_CLEAR_DIGITAL_TIMER: {
|
|
+ return "CEC_OPCODE_CLEAR_DIGITAL_TIMER";
|
|
+ break;
|
|
+ }
|
|
+ case CEC_OPCODE_SET_AUDIO_RATE: {
|
|
+ return "CEC_OPCODE_SET_AUDIO_RATE";
|
|
+ break;
|
|
+ }
|
|
+ case CEC_OPCODE_INACTIVE_SOURCE: {
|
|
+ return "CEC_OPCODE_INACTIVE_SOURCE";
|
|
+ break;
|
|
+ }
|
|
+ case CEC_OPCODE_CEC_VERSION: {
|
|
+ return "CEC_OPCODE_CEC_VERSION";
|
|
+ break;
|
|
+ }
|
|
+ case CEC_OPCODE_GET_CEC_VERSION: {
|
|
+ return "CEC_OPCODE_GET_CEC_VERSION";
|
|
+ break;
|
|
+ }
|
|
+ case CEC_OPCODE_VENDOR_COMMAND_WITH_ID: {
|
|
+ return "CEC_OPCODE_VENDOR_COMMAND_WITH_ID";
|
|
+ break;
|
|
+ }
|
|
+ case CEC_OPCODE_CLEAR_EXTERNAL_TIMER: {
|
|
+ return "CEC_OPCODE_CLEAR_EXTERNAL_TIMER";
|
|
+ break;
|
|
+ }
|
|
+ case CEC_OPCODE_SET_EXTERNAL_TIMER: {
|
|
+ return "CEC_OPCODE_SET_EXTERNAL_TIMER";
|
|
+ break;
|
|
+ }
|
|
+ case CEC_OPCODE_ABORT_MESSAGE: {
|
|
+ return "CEC_OPCODE_ABORT_MESSAGE";
|
|
+ break;
|
|
+ }
|
|
+ default : {
|
|
+ return "unknown";
|
|
+ break;
|
|
+ }
|
|
+ }
|
|
+}
|
|
+
|
|
+static char *cec_ioctl(int io)
|
|
+{
|
|
+ switch(io) {
|
|
+ case CEC_VERBOSE_ON_CMD: {
|
|
+ return "CEC_VERBOSE_ON_CMD";
|
|
+ break;
|
|
+ }
|
|
+ case CEC_VERBOSE_OFF_CMD: {
|
|
+ return "CEC_VERBOSE_OFF_CMD";
|
|
+ break;
|
|
+ }
|
|
+ case CEC_BYEBYE_CMD: {
|
|
+ return "CEC_BYEBYE_CMD";
|
|
+ break;
|
|
+ }
|
|
+ case CEC_IOCTL_RX_ADDR_CMD: {
|
|
+ return "CEC_IOCTL_RX_ADDR_CMD";
|
|
+ break;
|
|
+ }
|
|
+ case CEC_IOCTL_PHY_ADDR_CMD: {
|
|
+ return "CEC_IOCTL_PHY_ADDR_CMD";
|
|
+ break;
|
|
+ }
|
|
+ case CEC_IOCTL_WAIT_FRAME_CMD: {
|
|
+ return "CEC_IOCTL_WAIT_FRAME_CMD";
|
|
+ break;
|
|
+ }
|
|
+ case CEC_IOCTL_ABORT_MSG_CMD: {
|
|
+ return "CEC_IOCTL_ABORT_MSG_CMD";
|
|
+ break;
|
|
+ }
|
|
+ case CEC_IOCTL_ACTIVE_SRC_CMD: {
|
|
+ return "CEC_IOCTL_ACTIVE_SRC_CMD";
|
|
+ break;
|
|
+ }
|
|
+ case CEC_IOCTL_VERSION_CMD: {
|
|
+ return "CEC_IOCTL_VERSION_CMD";
|
|
+ break;
|
|
+ }
|
|
+ case CEC_IOCTL_CLEAR_ANALOGUE_TIMER_CMD: {
|
|
+ return "CEC_IOCTL_CLEAR_ANALOGUE_TIMER_CMD";
|
|
+ break;
|
|
+ }
|
|
+ case CEC_IOCTL_CLEAR_DIGITAL_TIMER_CMD: {
|
|
+ return "CEC_IOCTL_CLEAR_DIGITAL_TIMER_CMD";
|
|
+ break;
|
|
+ }
|
|
+ case CEC_IOCTL_CLEAR_EXT_TIMER_WITH_EXT_PLUG_CMD: {
|
|
+ return "CEC_IOCTL_CLEAR_EXT_TIMER_WITH_EXT_PLUG_CMD";
|
|
+ break;
|
|
+ }
|
|
+ case CEC_IOCTL_CLEAR_EXT_TIMER_WITH_PHY_ADDR_CMD: {
|
|
+ return "CEC_IOCTL_CLEAR_EXT_TIMER_WITH_PHY_ADDR_CMD";
|
|
+ break;
|
|
+ }
|
|
+ case CEC_IOCTL_DECK_CTRL_CMD: {
|
|
+ return "CEC_IOCTL_DECK_CTRL_CMD";
|
|
+ break;
|
|
+ }
|
|
+ case CEC_IOCTL_DECK_STATUS_CMD: {
|
|
+ return "CEC_IOCTL_DECK_STATUS_CMD";
|
|
+ break;
|
|
+ }
|
|
+ case CEC_IOCTL_DEVICE_VENDOR_ID_CMD: {
|
|
+ return "CEC_IOCTL_DEVICE_VENDOR_ID_CMD";
|
|
+ break;
|
|
+ }
|
|
+ case CEC_IOCTL_FEATURE_ABORT_CMD: {
|
|
+ return "CEC_IOCTL_FEATURE_ABORT_CMD";
|
|
+ break;
|
|
+ }
|
|
+ case CEC_IOCTL_GET_CEC_VERSION_CMD: {
|
|
+ return "CEC_IOCTL_GET_CEC_VERSION_CMD";
|
|
+ break;
|
|
+ }
|
|
+ case CEC_IOCTL_GET_MENU_LANGUAGE_CMD: {
|
|
+ return "CEC_IOCTL_GET_MENU_LANGUAGE_CMD";
|
|
+ break;
|
|
+ }
|
|
+ case CEC_IOCTL_GIVE_AUDIO_STATUS_CMD: {
|
|
+ return "CEC_IOCTL_GIVE_AUDIO_STATUS_CMD";
|
|
+ break;
|
|
+ }
|
|
+ case CEC_IOCTL_GIVE_DECK_STATUS_CMD: {
|
|
+ return "CEC_IOCTL_GIVE_DECK_STATUS_CMD";
|
|
+ break;
|
|
+ }
|
|
+ case CEC_IOCTL_GIVE_DEVICE_POWER_STATUS_CMD: {
|
|
+ return "CEC_IOCTL_GIVE_DEVICE_POWER_STATUS_CMD";
|
|
+ break;
|
|
+ }
|
|
+ case CEC_IOCTL_GIVE_DEVICE_VENDOR_ID_CMD: {
|
|
+ return "CEC_IOCTL_GIVE_DEVICE_VENDOR_ID_CMD";
|
|
+ break;
|
|
+ }
|
|
+ case CEC_IOCTL_GIVE_OSD_NAME_CMD: {
|
|
+ return "CEC_IOCTL_GIVE_OSD_NAME_CMD";
|
|
+ break;
|
|
+ }
|
|
+ case CEC_IOCTL_GIVE_PHY_ADDR_CMD: {
|
|
+ return "CEC_IOCTL_GIVE_PHY_ADDR_CMD";
|
|
+ break;
|
|
+ }
|
|
+ case CEC_IOCTL_GIVE_SYS_AUDIO_MODE_STATUS_CMD: {
|
|
+ return "CEC_IOCTL_GIVE_SYS_AUDIO_MODE_STATUS_CMD";
|
|
+ break;
|
|
+ }
|
|
+ case CEC_IOCTL_GIVE_TUNER_DEVICE_STATUS_CMD: {
|
|
+ return "CEC_IOCTL_GIVE_TUNER_DEVICE_STATUS_CMD";
|
|
+ break;
|
|
+ }
|
|
+ case CEC_IOCTL_IMAGE_VIEW_ON_CMD: {
|
|
+ return "CEC_IOCTL_IMAGE_VIEW_ON_CMD";
|
|
+ break;
|
|
+ }
|
|
+ case CEC_IOCTL_INACTIVE_SRC_CMD: {
|
|
+ return "CEC_IOCTL_INACTIVE_SRC_CMD";
|
|
+ break;
|
|
+ }
|
|
+ case CEC_IOCTL_MENU_REQUEST_CMD: {
|
|
+ return "CEC_IOCTL_MENU_REQUEST_CMD";
|
|
+ break;
|
|
+ }
|
|
+ case CEC_IOCTL_MENU_STATUS_CMD: {
|
|
+ return "CEC_IOCTL_MENU_STATUS_CMD";
|
|
+ break;
|
|
+ }
|
|
+ case CEC_IOCTL_PLAY_CMD: {
|
|
+ return "CEC_IOCTL_PLAY_CMD";
|
|
+ break;
|
|
+ }
|
|
+ case CEC_IOCTL_POLLING_MSG_CMD: {
|
|
+ return "CEC_IOCTL_POLLING_MSG_CMD";
|
|
+ break;
|
|
+ }
|
|
+ case CEC_IOCTL_REC_OFF_CMD: {
|
|
+ return "CEC_IOCTL_REC_OFF_CMD";
|
|
+ break;
|
|
+ }
|
|
+ case CEC_IOCTL_REC_ON_ANALOGUE_SERVICE_CMD: {
|
|
+ return "CEC_IOCTL_REC_ON_ANALOGUE_SERVICE_CMD";
|
|
+ break;
|
|
+ }
|
|
+ case CEC_IOCTL_REC_ON_DIGITAL_SERVICE_CMD: {
|
|
+ return "CEC_IOCTL_REC_ON_DIGITAL_SERVICE_CMD";
|
|
+ break;
|
|
+ }
|
|
+ case CEC_IOCTL_REC_ON_EXT_PHY_ADDR_CMD: {
|
|
+ return "CEC_IOCTL_REC_ON_EXT_PHY_ADDR_CMD";
|
|
+ break;
|
|
+ }
|
|
+ case CEC_IOCTL_REC_ON_EXT_PLUG_CMD: {
|
|
+ return "CEC_IOCTL_REC_ON_EXT_PLUG_CMD";
|
|
+ break;
|
|
+ }
|
|
+ case CEC_IOCTL_REC_ON_OWN_SRC_CMD: {
|
|
+ return "CEC_IOCTL_REC_ON_OWN_SRC_CMD";
|
|
+ break;
|
|
+ }
|
|
+ case CEC_IOCTL_REC_STATUS_CMD: {
|
|
+ return "CEC_IOCTL_REC_STATUS_CMD";
|
|
+ break;
|
|
+ }
|
|
+ case CEC_IOCTL_REC_TV_SCREEN_CMD: {
|
|
+ return "CEC_IOCTL_REC_TV_SCREEN_CMD";
|
|
+ break;
|
|
+ }
|
|
+ case CEC_IOCTL_REPORT_AUDIO_STATUS_CMD: {
|
|
+ return "CEC_IOCTL_REPORT_AUDIO_STATUS_CMD";
|
|
+ break;
|
|
+ }
|
|
+ case CEC_IOCTL_REPORT_PHY_ADDR_CMD: {
|
|
+ return "CEC_IOCTL_REPORT_PHY_ADDR_CMD";
|
|
+ break;
|
|
+ }
|
|
+ case CEC_IOCTL_REPORT_POWER_STATUS_CMD: {
|
|
+ return "CEC_IOCTL_REPORT_POWER_STATUS_CMD";
|
|
+ break;
|
|
+ }
|
|
+ case CEC_IOCTL_REQUEST_ACTIVE_SRC_CMD: {
|
|
+ return "CEC_IOCTL_REQUEST_ACTIVE_SRC_CMD";
|
|
+ break;
|
|
+ }
|
|
+ case CEC_IOCTL_ROUTING_CHANGE_CMD: {
|
|
+ return "CEC_IOCTL_ROUTING_CHANGE_CMD";
|
|
+ break;
|
|
+ }
|
|
+ case CEC_IOCTL_ROUTING_INFORMATION_CMD: {
|
|
+ return "CEC_IOCTL_ROUTING_INFORMATION_CMD";
|
|
+ break;
|
|
+ }
|
|
+ case CEC_IOCTL_SELECT_ANALOGUE_SERVICE_CMD: {
|
|
+ return "CEC_IOCTL_SELECT_ANALOGUE_SERVICE_CMD";
|
|
+ break;
|
|
+ }
|
|
+ case CEC_IOCTL_SELECT_DIGITAL_SERVICE_CMD: {
|
|
+ return "CEC_IOCTL_SELECT_DIGITAL_SERVICE_CMD";
|
|
+ break;
|
|
+ }
|
|
+ case CEC_IOCTL_SET_ANALOGUE_TIMER_CMD: {
|
|
+ return "CEC_IOCTL_SET_ANALOGUE_TIMER_CMD";
|
|
+ break;
|
|
+ }
|
|
+ case CEC_IOCTL_SET_AUDIO_RATE_CMD: {
|
|
+ return "CEC_IOCTL_SET_AUDIO_RATE_CMD";
|
|
+ break;
|
|
+ }
|
|
+ case CEC_IOCTL_SET_DIGITAL_TIMER_CMD: {
|
|
+ return "CEC_IOCTL_SET_DIGITAL_TIMER_CMD";
|
|
+ break;
|
|
+ }
|
|
+ case CEC_IOCTL_SET_EXT_TIMER_WITH_EXT_PLUG_CMD: {
|
|
+ return "CEC_IOCTL_SET_EXT_TIMER_WITH_EXT_PLUG_CMD";
|
|
+ break;
|
|
+ }
|
|
+ case CEC_IOCTL_SET_EXT_TIMER_WITH_PHY_ADDR_CMD: {
|
|
+ return "CEC_IOCTL_SET_EXT_TIMER_WITH_PHY_ADDR_CMD";
|
|
+ break;
|
|
+ }
|
|
+ case CEC_IOCTL_SET_MENU_LANGUAGE_CMD: {
|
|
+ return "CEC_IOCTL_SET_MENU_LANGUAGE_CMD";
|
|
+ break;
|
|
+ }
|
|
+ case CEC_IOCTL_SET_OSD_NAME_CMD: {
|
|
+ return "CEC_IOCTL_SET_OSD_NAME_CMD";
|
|
+ break;
|
|
+ }
|
|
+ case CEC_IOCTL_SET_OSD_STRING_CMD: {
|
|
+ return "CEC_IOCTL_SET_OSD_STRING_CMD";
|
|
+ break;
|
|
+ }
|
|
+ case CEC_IOCTL_SET_STREAM_PATH_CMD: {
|
|
+ return "CEC_IOCTL_SET_STREAM_PATH_CMD";
|
|
+ break;
|
|
+ }
|
|
+ case CEC_IOCTL_SET_SYS_AUDIO_MODE_CMD: {
|
|
+ return "CEC_IOCTL_SET_SYS_AUDIO_MODE_CMD";
|
|
+ break;
|
|
+ }
|
|
+ case CEC_IOCTL_SET_TIMER_PROGRAM_TITLE_CMD: {
|
|
+ return "CEC_IOCTL_SET_TIMER_PROGRAM_TITLE_CMD";
|
|
+ break;
|
|
+ }
|
|
+ case CEC_IOCTL_STANDBY_CMD: {
|
|
+ return "CEC_IOCTL_STANDBY_CMD";
|
|
+ break;
|
|
+ }
|
|
+ case CEC_IOCTL_SYS_AUDIO_MODE_REQUEST_CMD: {
|
|
+ return "CEC_IOCTL_SYS_AUDIO_MODE_REQUEST_CMD";
|
|
+ break;
|
|
+ }
|
|
+ case CEC_IOCTL_SYS_AUDIO_MODE_STATUS_CMD: {
|
|
+ return "CEC_IOCTL_SYS_AUDIO_MODE_STATUS_CMD";
|
|
+ break;
|
|
+ }
|
|
+ case CEC_IOCTL_TEXT_VIEW_ON_CMD: {
|
|
+ return "CEC_IOCTL_TEXT_VIEW_ON_CMD";
|
|
+ break;
|
|
+ }
|
|
+ case CEC_IOCTL_TIMER_CLEARED_STATUS_CMD: {
|
|
+ return "CEC_IOCTL_TIMER_CLEARED_STATUS_CMD";
|
|
+ break;
|
|
+ }
|
|
+ case CEC_IOCTL_TIMER_STATUS_CMD: {
|
|
+ return "CEC_IOCTL_TIMER_STATUS_CMD";
|
|
+ break;
|
|
+ }
|
|
+ case CEC_IOCTL_TUNER_DEVICE_STATUS_ANALOGUE_CMD: {
|
|
+ return "CEC_IOCTL_TUNER_DEVICE_STATUS_ANALOGUE_CMD";
|
|
+ break;
|
|
+ }
|
|
+ case CEC_IOCTL_TUNER_DEVICE_STATUS_DIGITAL_CMD: {
|
|
+ return "CEC_IOCTL_TUNER_DEVICE_STATUS_DIGITAL_CMD";
|
|
+ break;
|
|
+ }
|
|
+ case CEC_IOCTL_TUNER_STEP_DECREMENT_CMD: {
|
|
+ return "CEC_IOCTL_TUNER_STEP_DECREMENT_CMD";
|
|
+ break;
|
|
+ }
|
|
+ case CEC_IOCTL_TUNER_STEP_INCREMENT_CMD: {
|
|
+ return "CEC_IOCTL_TUNER_STEP_INCREMENT_CMD";
|
|
+ break;
|
|
+ }
|
|
+ case CEC_IOCTL_USER_CTRL_CMD: {
|
|
+ return "CEC_IOCTL_USER_CTRL_CMD";
|
|
+ break;
|
|
+ }
|
|
+ case CEC_IOCTL_USER_CTRL_PLAY_CMD: {
|
|
+ return "CEC_IOCTL_USER_CTRL_PLAY_CMD";
|
|
+ break;
|
|
+ }
|
|
+ case CEC_IOCTL_USER_CTRL_SELECT_AUDIOINPUT_CMD: {
|
|
+ return "CEC_IOCTL_USER_CTRL_SELECT_AUDIOINPUT_CMD";
|
|
+ break;
|
|
+ }
|
|
+ case CEC_IOCTL_USER_CTRL_SELECT_AVINPUT_CMD: {
|
|
+ return "CEC_IOCTL_USER_CTRL_SELECT_AVINPUT_CMD";
|
|
+ break;
|
|
+ }
|
|
+ case CEC_IOCTL_USER_CTRL_SELECT_MEDIA_CMD: {
|
|
+ return "CEC_IOCTL_USER_CTRL_SELECT_MEDIA_CMD";
|
|
+ break;
|
|
+ }
|
|
+ case CEC_IOCTL_USER_CTRL_TUNE_CMD: {
|
|
+ return "CEC_IOCTL_USER_CTRL_TUNE_CMD";
|
|
+ break;
|
|
+ }
|
|
+ case CEC_IOCTL_USER_CTRL_RELEASED_CMD: {
|
|
+ return "CEC_IOCTL_USER_CTRL_RELEASED_CMD";
|
|
+ break;
|
|
+ }
|
|
+ case CEC_IOCTL_VENDOR_COMMAND_CMD: {
|
|
+ return "CEC_IOCTL_VENDOR_COMMAND_CMD";
|
|
+ break;
|
|
+ }
|
|
+ case CEC_IOCTL_VENDOR_COMMAND_WITH_ID_CMD: {
|
|
+ return "CEC_IOCTL_VENDOR_COMMAND_WITH_ID_CMD";
|
|
+ break;
|
|
+ }
|
|
+ case CEC_IOCTL_VENDOR_REMOTE_BUTTON_DOWN_CMD: {
|
|
+ return "CEC_IOCTL_VENDOR_REMOTE_BUTTON_DOWN_CMD";
|
|
+ break;
|
|
+ }
|
|
+ case CEC_IOCTL_VENDOR_REMOTE_BUTTON_UP_CMD: {
|
|
+ return "CEC_IOCTL_VENDOR_REMOTE_BUTTON_UP_CMD";
|
|
+ break;
|
|
+ }
|
|
+ case CEC_IOCTL_GET_SW_VERSION_CMD: {
|
|
+ return "CEC_IOCTL_GET_SW_VERSION_CMD";
|
|
+ break;
|
|
+ }
|
|
+ case CEC_IOCTL_SET_POWER_STATE_CMD: {
|
|
+ return "CEC_IOCTL_SET_POWER_STATE_CMD";
|
|
+ break;
|
|
+ }
|
|
+ case CEC_IOCTL_GET_POWER_STATE_CMD: {
|
|
+ return "CEC_IOCTL_GET_POWER_STATE_CMD";
|
|
+ break;
|
|
+ }
|
|
+ case CEC_IOCTL_INSTANCE_CONFIG_CMD: {
|
|
+ return "CEC_IOCTL_INSTANCE_CONFIG_CMD";
|
|
+ break;
|
|
+ }
|
|
+ case CEC_IOCTL_INSTANCE_SETUP_CMD: {
|
|
+ return "CEC_IOCTL_INSTANCE_SETUP_CMD";
|
|
+ break;
|
|
+ }
|
|
+ case CEC_IOCTL_GET_INSTANCE_SETUP_CMD: {
|
|
+ return "CEC_IOCTL_GET_INSTANCE_SETUP_CMD";
|
|
+ break;
|
|
+ }
|
|
+ case CEC_IOCTL_ENABLE_EVENT_CMD: {
|
|
+ return "CEC_IOCTL_ENABLE_EVENT_CMD";
|
|
+ break;
|
|
+ }
|
|
+ case CEC_IOCTL_DISABLE_EVENT_CMD: {
|
|
+ return "CEC_IOCTL_DISABLE_EVENT_CMD";
|
|
+ break;
|
|
+ }
|
|
+ case CEC_IOCTL_ENABLE_CALIBRATION_CMD: {
|
|
+ return "CEC_IOCTL_ENABLE_CALIBRATION_CMD";
|
|
+ break;
|
|
+ }
|
|
+ case CEC_IOCTL_DISABLE_CALIBRATION_CMD: {
|
|
+ return "CEC_IOCTL_DISABLE_CALIBRATION_CMD";
|
|
+ break;
|
|
+ }
|
|
+ case CEC_IOCTL_SEND_MSG_CMD: {
|
|
+ return "CEC_IOCTL_SEND_MSG_CMD";
|
|
+ break;
|
|
+ }
|
|
+ case CEC_IOCTL_SET_REGISTER_CMD: {
|
|
+ return "CEC_IOCTL_SET_REGISTER_CMD";
|
|
+ break;
|
|
+ }
|
|
+ default : {
|
|
+ return "unknown";
|
|
+ break;
|
|
+ }
|
|
+ }
|
|
+}
|
|
+
|
|
+static char *cec_rxstatus(int s)
|
|
+{
|
|
+ switch(s) {
|
|
+ case CEC_MSG_SUCCESS : {
|
|
+ return "success";
|
|
+ break;
|
|
+ }
|
|
+ case CEC_MSG_FAIL_DATA_NOT_ACK : {
|
|
+ return "data not ack";
|
|
+ break;
|
|
+ }
|
|
+ case CEC_CSP_OFF_STATE : {
|
|
+ return "CSP off";
|
|
+ break;
|
|
+ }
|
|
+ case CEC_BAD_REQ_SERVICE : {
|
|
+ return "bad req";
|
|
+ break;
|
|
+ }
|
|
+ case CEC_MSG_FAIL_UNABLE_TO_ACCESS : {
|
|
+ return "CEC line error";
|
|
+ break;
|
|
+ }
|
|
+ case CEC_MSG_FAIL_ARBITRATION_ERROR : {
|
|
+ return "arb error";
|
|
+ break;
|
|
+ }
|
|
+ case CEC_MSG_FAIL_BIT_TIMMING_ERROR : {
|
|
+ return "bit error";
|
|
+ break;
|
|
+ }
|
|
+ case CEC_MSG_FAIL_DEST_NOT_ACK : {
|
|
+ return "destination not ack";
|
|
+ break;
|
|
+ }
|
|
+ default : {
|
|
+ return "unknown";
|
|
+ break;
|
|
+ }
|
|
+ }
|
|
+}
|
|
+
|
|
+static unsigned char get_next_logical_addr(cec_device_type device, unsigned char la)
|
|
+{
|
|
+ switch(device) {
|
|
+ case CEC_DEVICE_TYPE_TV:
|
|
+ switch(la) {
|
|
+ case CEC_LOGICAL_ADDRESS_TV:
|
|
+ return CEC_LOGICAL_ADDRESS_UNREGISTRED_BROADCAST;
|
|
+ default:
|
|
+ return CEC_LOGICAL_ADDRESS_TV;
|
|
+ }
|
|
+ case CEC_DEVICE_TYPE_REC_DEVICE:
|
|
+ switch(la) {
|
|
+ case CEC_LOGICAL_ADDRESS_RECORDING_DEVICE_1:
|
|
+ return CEC_LOGICAL_ADDRESS_RECORDING_DEVICE_2;
|
|
+ case CEC_LOGICAL_ADDRESS_RECORDING_DEVICE_2:
|
|
+ return CEC_LOGICAL_ADDRESS_RECORDING_DEVICE_3;
|
|
+ case CEC_LOGICAL_ADDRESS_RECORDING_DEVICE_3:
|
|
+ return CEC_LOGICAL_ADDRESS_UNREGISTRED_BROADCAST;
|
|
+ default:
|
|
+ return CEC_LOGICAL_ADDRESS_RECORDING_DEVICE_1;
|
|
+ }
|
|
+ case CEC_DEVICE_TYPE_TUNER:
|
|
+ switch(la) {
|
|
+ case CEC_LOGICAL_ADDRESS_TUNER_1:
|
|
+ return CEC_LOGICAL_ADDRESS_TUNER_2;
|
|
+ case CEC_LOGICAL_ADDRESS_TUNER_2:
|
|
+ return CEC_LOGICAL_ADDRESS_TUNER_3;
|
|
+ case CEC_LOGICAL_ADDRESS_TUNER_3:
|
|
+ return CEC_LOGICAL_ADDRESS_TUNER_4;
|
|
+ case CEC_LOGICAL_ADDRESS_TUNER_4:
|
|
+ return CEC_LOGICAL_ADDRESS_UNREGISTRED_BROADCAST;
|
|
+ default:
|
|
+ return CEC_LOGICAL_ADDRESS_TUNER_1;
|
|
+ }
|
|
+ case CEC_DEVICE_TYPE_PLAYBACK_DEVICE:
|
|
+ switch(la) {
|
|
+ case CEC_LOGICAL_ADDRESS_PLAYBACK_DEVICE_1:
|
|
+ return CEC_LOGICAL_ADDRESS_PLAYBACK_DEVICE_2;
|
|
+ case CEC_LOGICAL_ADDRESS_PLAYBACK_DEVICE_2:
|
|
+ return CEC_LOGICAL_ADDRESS_PLAYBACK_DEVICE_3;
|
|
+ case CEC_LOGICAL_ADDRESS_PLAYBACK_DEVICE_3:
|
|
+ return CEC_LOGICAL_ADDRESS_UNREGISTRED_BROADCAST;
|
|
+ default:
|
|
+ return CEC_LOGICAL_ADDRESS_PLAYBACK_DEVICE_1;
|
|
+ }
|
|
+ case CEC_DEVICE_TYPE_AUDIO_DEVICE:
|
|
+ switch(la) {
|
|
+ case CEC_LOGICAL_ADDRESS_AUDIO_SYSTEM:
|
|
+ return CEC_LOGICAL_ADDRESS_UNREGISTRED_BROADCAST;
|
|
+ default:
|
|
+ return CEC_LOGICAL_ADDRESS_AUDIO_SYSTEM;
|
|
+ }
|
|
+ default:
|
|
+ return CEC_LOGICAL_ADDRESS_UNREGISTRED_BROADCAST;
|
|
+ }
|
|
+}
|
|
+
|
|
+static int device_type(int type)
|
|
+{
|
|
+ printk(KERN_INFO "hdmicec declared as a ");
|
|
+ switch(type) {
|
|
+ case CEC_DEVICE_TYPE_TV:
|
|
+ printk("TV");
|
|
+ break;
|
|
+ case CEC_DEVICE_TYPE_REC_DEVICE:
|
|
+ printk("record");
|
|
+ break;
|
|
+ case CEC_DEVICE_TYPE_TUNER:
|
|
+ printk("tuner");
|
|
+ break;
|
|
+ case CEC_DEVICE_TYPE_PLAYBACK_DEVICE:
|
|
+ printk("playback");
|
|
+ break;
|
|
+ case CEC_DEVICE_TYPE_AUDIO_DEVICE:
|
|
+ printk("audio");
|
|
+ break;
|
|
+ default:
|
|
+ printk("default (playback)");
|
|
+ type = CEC_DEVICE_TYPE_PLAYBACK_DEVICE;
|
|
+ break;
|
|
+ }
|
|
+ printk(" device type\n");
|
|
+ return type;
|
|
+}
|
|
+
|
|
+/*
|
|
+ *
|
|
+ * PROCESSING
|
|
+ * ----------
|
|
+ * LEVEL 2
|
|
+ *
|
|
+ * */
|
|
+
|
|
+/*
|
|
+ * CEC Power On
|
|
+ * */
|
|
+static void cec_on(cec_instance *this)
|
|
+{
|
|
+ int err;
|
|
+ struct task_struct *tsk = current;
|
|
+
|
|
+ disable_irq(gpio_to_irq(TDA_IRQ_CALIB));
|
|
+
|
|
+ this->cec.power = power_on;
|
|
+ TRY(dl_hdmi_cec_set_power_state(this->cec.inst, this->cec.power));
|
|
+
|
|
+ /* turn GPIO into calib pulse generator */
|
|
+ /* output (1 means try-state or high) */
|
|
+ gpio_direction_output(TDA_IRQ_CALIB, 0);
|
|
+ __gpio_set_value(TDA_IRQ_CALIB, 1);
|
|
+ this->cec.clock = DL_HDMICEC_CLOCK_FRO;
|
|
+ TRY(dl_hdmi_cec_enable_calibration(this->cec.inst, this->cec.clock));
|
|
+ msleep(10);
|
|
+ set_current_state(TASK_UNINTERRUPTIBLE);
|
|
+
|
|
+ /* CAUTION : TDA needs a real 10ms pulse */
|
|
+ cpu_relax();
|
|
+ spin_lock_irq(&tsk->sighand->siglock);
|
|
+ __gpio_set_value(TDA_IRQ_CALIB, 0);
|
|
+ __udelay(10000);
|
|
+ __gpio_set_value(TDA_IRQ_CALIB, 1);
|
|
+ spin_unlock_irq(&tsk->sighand->siglock);
|
|
+
|
|
+ msleep(10);
|
|
+ TRY(dl_hdmi_cec_disable_calibration(this->cec.inst));
|
|
+
|
|
+ /* setup */
|
|
+ TRY(dl_hdmi_cec_get_instance_setup(this->cec.inst, &this->cec.setup));
|
|
+ this->cec.setup.device_logical_address = this->cec.rx_addr;
|
|
+ this->cec.clock = DL_HDMICEC_CLOCK_FRO;
|
|
+ this->cec.setup.cec_clock_source = this->cec.clock;
|
|
+ TRY(dl_hdmi_cec_instance_setup(this->cec.inst, &this->cec.setup));
|
|
+
|
|
+ /* turn GPIO into IRQ */
|
|
+ gpio_direction_input(TDA_IRQ_CALIB);
|
|
+ enable_irq(gpio_to_irq(TDA_IRQ_CALIB));
|
|
+
|
|
+ LOG(KERN_INFO, "standby --> on\n");
|
|
+
|
|
+TRY_DONE:
|
|
+ (void)0;
|
|
+}
|
|
+
|
|
+/*
|
|
+ * CEC Power Off
|
|
+ * */
|
|
+static void cec_standby(cec_instance *this)
|
|
+{
|
|
+ int err;
|
|
+
|
|
+ this->cec.power = power_standby;
|
|
+ TRY(dl_hdmi_cec_set_power_state(this->cec.inst, this->cec.power));
|
|
+
|
|
+ LOG(KERN_INFO, "on --> standby\n");
|
|
+
|
|
+TRY_DONE:
|
|
+ (void)0;
|
|
+}
|
|
+
|
|
+/*
|
|
+ * CEC interrupt polling
|
|
+ * */
|
|
+static void cec_interrupt(struct work_struct *dummy)
|
|
+{
|
|
+ cec_instance *this = &our_instance;
|
|
+ unsigned short new_phy_addr = edid_phy_addr();
|
|
+ int err = 0;
|
|
+
|
|
+ LOG(KERN_INFO, "%s called\n", __func__);
|
|
+
|
|
+ /* switch on/off CEC */
|
|
+ if(!get_hpd_status() && \
|
|
+ (this->cec.power == power_on)) {
|
|
+ this->cec.source_status = CEC_POWER_STATUS_STANDBY;
|
|
+ /* TRY(dlHdmiCecInactiveSource(this->cec.inst, \ */
|
|
+ /* this->cec.initiator, \ */
|
|
+ /* this->cec.phy_addr)); */
|
|
+ cec_standby(this);
|
|
+ } else if(get_hpd_status() && \
|
|
+ (this->cec.power == power_standby)) {
|
|
+ /* send active msg when hdmi has been abled */
|
|
+ cec_on(this);
|
|
+ }
|
|
+ /* new phy addr means new EDID, mean HPD ! */
|
|
+ else if((this->cec.phy_addr != new_phy_addr) && \
|
|
+ (this->cec.source_status == CEC_POWER_STATUS_ON)) {
|
|
+ LOG(KERN_INFO, "new physical address %02x\n", new_phy_addr);
|
|
+ this->cec.phy_addr = new_phy_addr;
|
|
+ if(this->cec.phy_addr != 0xFFFF) {
|
|
+ this->cec.rx_addr = get_next_logical_addr(this->cec.device_type, CEC_LOGICAL_ADDRESS_UNREGISTRED_BROADCAST);
|
|
+ TRY(dl_hdmi_cec_polling_message(this->cec.inst, this->cec.rx_addr));
|
|
+ } else {
|
|
+ this->cec.rx_addr = CEC_LOGICAL_ADDRESS_UNREGISTRED_BROADCAST;
|
|
+ }
|
|
+ }
|
|
+#ifdef GUI_OVER_HDMI
|
|
+ else if(edid_received()) { /* Check me */
|
|
+ if(this->cec.source_status == CEC_POWER_STATUS_STANDBY) {
|
|
+ /* only for GFX on HDMI, do not use if only video playback on HDMI */
|
|
+ TRY(dl_hdmi_cec_image_view_on(this->cec.inst, this->cec.initiator));
|
|
+ TRY(dl_hdmi_cec_handle_interrupt(this->cec.inst));
|
|
+ msleep(200);
|
|
+ TRY(dl_hdmi_cec_active_source(this->cec.inst, this->cec.phy_addr));
|
|
+ this->cec.source_status = CEC_POWER_STATUS_ON;
|
|
+ }
|
|
+ }
|
|
+#endif
|
|
+
|
|
+#if 0
|
|
+ if(this->cec.phy_addr != 0xFFFF) {
|
|
+
|
|
+ /* claim source status */
|
|
+ if((get_hdmi_status() == power_standby) && \
|
|
+ (this->cec.source_status == CEC_POWER_STATUS_ON)) {
|
|
+ /* send inactive msg when hdmi has been disabled */
|
|
+ this->cec.source_status = CEC_POWER_STATUS_STANDBY;
|
|
+ TRY(dl_hdmi_cec_inactive_source(this->cec.inst, \
|
|
+ this->cec.initiator, \
|
|
+ this->cec.phy_addr));
|
|
+ } else if((get_hdmi_status() == power_on) && \
|
|
+ (this->cec.source_status == CEC_POWER_STATUS_STANDBY)) {
|
|
+ /* send active msg when hdmi has been abled */
|
|
+ this->cec.source_status = CEC_POWER_STATUS_ON;
|
|
+ TRY(dl_hdmi_cec_active_source(this->cec.inst, \
|
|
+ this->cec.phy_addr));
|
|
+ }
|
|
+ /* printk(KERN_INFO "DBG phd_status:%s cec.power:%s\n", \ */
|
|
+ /* get_hpd_status()?"Active":"Inactive", \ */
|
|
+ /* (this->cec.power==tmPowerOn)?"On":"Standby"); */
|
|
+ }
|
|
+#endif
|
|
+
|
|
+ /* internal handeling */
|
|
+ TRY(dl_hdmi_cec_handle_interrupt(this->cec.inst));
|
|
+
|
|
+TRY_DONE:
|
|
+
|
|
+ /* setup next tick */
|
|
+ if(!this->driver.deinit_req) {
|
|
+ /* setup next polling */
|
|
+#ifndef IRQ
|
|
+ /* this->driver.timer.expires = jiffies + ( CHECK_EVERY_XX_MS * HZ / 1000 ); */
|
|
+ /* add_timer(&this->driver.timer); */
|
|
+ mod_timer(&this->driver.timer, jiffies + (CHECK_EVERY_XX_MS * HZ / 1000));
|
|
+#endif
|
|
+ } else {
|
|
+ this->driver.deinit_req++;
|
|
+ wake_up_interruptible(&this->driver.wait);
|
|
+ }
|
|
+}
|
|
+
|
|
+#ifndef IRQ
|
|
+static DECLARE_WORK(wq_name, cec_interrupt);
|
|
+
|
|
+void polling_timeout(unsigned long arg)
|
|
+{
|
|
+
|
|
+#if 0
|
|
+ /* fake frame for equipement-less testing */
|
|
+
|
|
+ cec_instance *this = &our_instance;
|
|
+
|
|
+ if(this->driver.timer.data++ > 1000) {
|
|
+ printk(KERN_INFO "fake rx message\n");
|
|
+ this->driver.timer.data = 0;
|
|
+
|
|
+ this->cec.frame.count = 4;
|
|
+ this->cec.frame.addr = 4; /* 0-->4 (TV-->MediaPlayer1) */
|
|
+ this->cec.frame.data[0] = 0x46; /* opcode: "GiveOsd" */
|
|
+ this->cec.frame.service = CEC_RX_DONE;
|
|
+
|
|
+ this->driver.poll_done = true;
|
|
+ wake_up_interruptible(&this->driver.wait);
|
|
+ }
|
|
+#endif
|
|
+
|
|
+ /* derefered because ATOMIC context of timer does not support I2C_transfert */
|
|
+ schedule_work(&wq_name);
|
|
+
|
|
+}
|
|
+#endif
|
|
+
|
|
+#ifndef IRQ
|
|
+/*
|
|
+ * TDA irq
|
|
+ * */
|
|
+static irqreturn_t tda_irq(int irq, void *_udc)
|
|
+{
|
|
+ cec_instance *this = &our_instance;
|
|
+ /* printk(KERN_INFO "DBG caught irq:%d\n",irq); */
|
|
+
|
|
+ /* do it now */
|
|
+ mod_timer(&this->driver.timer, jiffies);
|
|
+
|
|
+ return IRQ_HANDLED;
|
|
+}
|
|
+#endif
|
|
+
|
|
+#ifdef TWL4030_HACK
|
|
+/*
|
|
+ * User Control
|
|
+ * */
|
|
+static void user_control(int key, int press)
|
|
+{
|
|
+ input_report_key(gkp_input, key, press);
|
|
+ input_sync(gkp_input);
|
|
+ msleep(20);
|
|
+ input_report_key(gkp_input, key, 0);
|
|
+ input_sync(gkp_input);
|
|
+}
|
|
+#endif
|
|
+
|
|
+/*
|
|
+ * CEC callback
|
|
+ * */
|
|
+static void event_callback_cec(dl_hdmi_cec_event_t event, unsigned char *data, unsigned char length)
|
|
+{
|
|
+ int err = 0;
|
|
+ cec_instance *this = &our_instance;
|
|
+ int opcode;
|
|
+ int initiator, receiver;
|
|
+
|
|
+ if(event == DL_HDMICEC_CALLBACK_MESSAGE_AVAILABLE) {
|
|
+
|
|
+ this->cec.frame.count = length;
|
|
+ this->cec.frame.addr = data[1]; /* .AddressByte */
|
|
+ initiator = (this->cec.frame.addr >> 4) & 0x0F;
|
|
+ this->cec.initiator = initiator;
|
|
+ receiver = this->cec.frame.addr & 0x0F;
|
|
+ /* .DataBytes[], length - siezof(length,addr,ack) */
|
|
+ memcpy(&this->cec.frame.data, &data[2], length - 2);
|
|
+ opcode = this->cec.frame.data[0];
|
|
+ printk(KERN_INFO "hdmicec:rx:[%x--->%x] %s length:%d addr:%d %02x%02x%02x%02x\n", initiator, receiver, cec_opcode(opcode), \
|
|
+ length, data[1],
|
|
+ this->cec.frame.data[0], \
|
|
+ this->cec.frame.data[1], \
|
|
+ this->cec.frame.data[2], \
|
|
+ this->cec.frame.data[3]);
|
|
+ this->cec.frame.service = CEC_RX_DONE;
|
|
+
|
|
+ msleep(20);
|
|
+
|
|
+ /* automatic answering */
|
|
+ switch(opcode) {
|
|
+ case CEC_OPCODE_GIVE_PHYSICAL_ADDRESS:
|
|
+ TRY(dl_hdmi_cec_report_physical_address(this->cec.inst, \
|
|
+ this->cec.phy_addr, \
|
|
+ this->cec.device_type));
|
|
+ break;
|
|
+ case CEC_OPCODE_GET_CEC_VERSION:
|
|
+ TRY(dl_hdmi_cec_version(this->cec.inst, \
|
|
+ this->cec.initiator, \
|
|
+ this->cec.version));
|
|
+ break;
|
|
+ case CEC_OPCODE_GIVE_OSD_NAME:
|
|
+ TRY(dl_hdmi_cec_set_osd_name(this->cec.inst, \
|
|
+ this->cec.initiator, \
|
|
+ this->cec.osd_name.data, \
|
|
+ this->cec.osd_name.length));
|
|
+ break;
|
|
+ case CEC_OPCODE_GIVE_DEVICE_VENDOR_ID:
|
|
+ TRY(dl_hdmi_cec_device_vendor_id(this->cec.inst, \
|
|
+ this->cec.vendor_id));
|
|
+ break;
|
|
+ case CEC_OPCODE_REQUEST_ACTIVE_SOURCE:
|
|
+ if(this->cec.source_status == CEC_POWER_STATUS_ON) {
|
|
+ if(this->cec.initiator != 0x0F) {
|
|
+ if(receiver == 0x0F) {
|
|
+ TRY(dl_hdmi_cec_active_source(this->cec.inst, this->cec.phy_addr));
|
|
+ }
|
|
+ }
|
|
+ }
|
|
+ break;
|
|
+ case CEC_OPCODE_ACTIVE_SOURCE:
|
|
+ if(this->cec.source_status == CEC_POWER_STATUS_ON) {
|
|
+ this->cec.source_status = CEC_POWER_STATUS_STANDBY;
|
|
+ hdmi_disable(1);
|
|
+ this->cec.power = power_on;
|
|
+ /* keeps CEC alive */
|
|
+ TRY(dl_hdmi_cec_set_power_state(this->cec.inst, this->cec.power));
|
|
+ }
|
|
+ break;
|
|
+ case CEC_OPCODE_GIVE_DEVICE_POWER_STATUS:
|
|
+ TRY(dl_hdmi_cec_report_power_status(this->cec.inst, \
|
|
+ this->cec.initiator, \
|
|
+ this->cec.source_status));
|
|
+ break;
|
|
+ case CEC_OPCODE_STANDBY:
|
|
+ /* mind recording device can only be stopped by appli */
|
|
+ if(this->cec.device_type != CEC_DEVICE_TYPE_REC_DEVICE) {
|
|
+ this->cec.source_status = CEC_POWER_STATUS_STANDBY;
|
|
+ hdmi_disable(1);
|
|
+ this->cec.power = power_on;
|
|
+ /* keeps CEC alive */
|
|
+ TRY(dl_hdmi_cec_set_power_state(this->cec.inst, this->cec.power));
|
|
+ }
|
|
+ break;
|
|
+ case CEC_OPCODE_ROUTING_INFORMATION:
|
|
+ case CEC_OPCODE_SET_STREAM_PATH:
|
|
+ /* wake-up if called */
|
|
+ if(this->cec.phy_addr == (((int)this->cec.frame.data[1] << 8) + this->cec.frame.data[2])) {
|
|
+ if(this->cec.source_status != CEC_POWER_STATUS_ON) {
|
|
+ this->cec.source_status = CEC_POWER_STATUS_ON;
|
|
+ hdmi_enable();
|
|
+ }
|
|
+ TRY(dl_hdmi_cec_active_source(this->cec.inst, this->cec.phy_addr));
|
|
+ }
|
|
+ break;
|
|
+ /* case /\* NEW DECK ??? *\/ */
|
|
+ case CEC_OPCODE_ROUTING_CHANGE:
|
|
+ /* wake-up if called */
|
|
+ if(this->cec.phy_addr == (((int)this->cec.frame.data[3] << 8) + this->cec.frame.data[4])) {
|
|
+ if(this->cec.source_status != CEC_POWER_STATUS_ON) {
|
|
+ this->cec.source_status = CEC_POWER_STATUS_ON;
|
|
+ hdmi_enable();
|
|
+ }
|
|
+ TRY(dl_hdmi_cec_active_source(this->cec.inst, this->cec.phy_addr));
|
|
+ }
|
|
+ break;
|
|
+ case CEC_OPCODE_ABORT_MESSAGE:
|
|
+ if(this->cec.phy_addr == (((int)this->cec.frame.data[3] << 8) + this->cec.frame.data[4])) {
|
|
+ TRY(dl_hdmi_cec_feature_abort(this->cec.inst, \
|
|
+ this->cec.initiator, \
|
|
+ this->cec.feature_abort.feature_opcode, \
|
|
+ this->cec.feature_abort.abort_reason));
|
|
+ }
|
|
+ break;
|
|
+ case CEC_OPCODE_MENU_REQUEST:
|
|
+#ifdef TWL4030_HACK
|
|
+ this->cec.menu_status = CEC_MENU_STATE_ACTIVATE;
|
|
+ TRY(dl_hdmi_cec_menu_status(this->cec.inst, \
|
|
+ this->cec.initiator, \
|
|
+ this->cec.menu_status));
|
|
+ break;
|
|
+#endif
|
|
+ case CEC_OPCODE_USER_CONTROL_PRESSED:
|
|
+ switch(this->cec.frame.data[1]) {
|
|
+#ifdef TWL4030_HACK /* AL : hack to bypass keypad */
|
|
+ case CEC_REMOTE_BUTTON_SELECT:
|
|
+ user_control(353, 64);
|
|
+ break;
|
|
+ case CEC_REMOTE_BUTTON_UP:
|
|
+ user_control(103, 128);
|
|
+ break;
|
|
+ case CEC_REMOTE_BUTTON_DOWN:
|
|
+ user_control(108, 128);
|
|
+ break;
|
|
+ case CEC_REMOTE_BUTTON_LEFT:
|
|
+ user_control(105, 128);
|
|
+ break;
|
|
+ case CEC_REMOTE_BUTTON_RIGHT:
|
|
+ user_control(106, 128);
|
|
+ break;
|
|
+ case CEC_REMOTE_BUTTON_EXIT:
|
|
+ user_control(14, 8);
|
|
+ break;
|
|
+#endif
|
|
+ case CEC_REMOTE_BUTTON_POWER:
|
|
+ this->cec.source_status = CEC_POWER_STATUS_ON;
|
|
+ hdmi_enable();
|
|
+ break;
|
|
+ default:
|
|
+ this->cec.feature_abort.feature_opcode = opcode;
|
|
+ this->cec.feature_abort.abort_reason = CEC_ABORT_INVALID_OPERAND;
|
|
+ TRY(dl_hdmi_cec_feature_abort(this->cec.inst, \
|
|
+ this->cec.initiator, \
|
|
+ this->cec.feature_abort.feature_opcode, \
|
|
+ this->cec.feature_abort.abort_reason));
|
|
+ break;
|
|
+ }
|
|
+ break;
|
|
+#ifdef TWL4030_HACK
|
|
+ case CEC_OPCODE_VENDOR_REMOTE_BUTTON_DOWN:
|
|
+ user_control(59, 8);
|
|
+#endif
|
|
+ break;
|
|
+ case CEC_OPCODE_FEATURE_ABORT:
|
|
+ /* stop any state machine transition */
|
|
+ break;
|
|
+ case CEC_OPCODE_VENDOR_COMMAND:
|
|
+ case CEC_OPCODE_DEVICE_VENDOR_ID:
|
|
+ /* hopefully will be handle in userspace */
|
|
+ break;
|
|
+ default:
|
|
+ if(receiver != 0x0F) {
|
|
+ this->cec.feature_abort.feature_opcode = opcode;
|
|
+ this->cec.feature_abort.abort_reason = CEC_ABORT_UNKNOWN_OPCODE;
|
|
+ TRY(dl_hdmi_cec_feature_abort(this->cec.inst, \
|
|
+ this->cec.initiator, \
|
|
+ this->cec.feature_abort.feature_opcode, \
|
|
+ this->cec.feature_abort.abort_reason));
|
|
+ }
|
|
+ break;
|
|
+ }
|
|
+ this->driver.poll_done = true;
|
|
+ wake_up_interruptible(&this->driver.wait);
|
|
+ } else if(event == DL_HDMICEC_CALLBACK_STATUS) {
|
|
+
|
|
+ this->cec.frame.count = length;
|
|
+ this->cec.frame.addr = data[1]; /* .AddressByte */
|
|
+ initiator = (this->cec.frame.addr >> 4) & 0x0F;
|
|
+ receiver = this->cec.frame.addr & 0x0F;
|
|
+ /* .DataBytes[], length - siezof(length,addr) */
|
|
+ memcpy(&this->cec.frame.data, &data[2], length - 2);
|
|
+ opcode = this->cec.frame.data[0];
|
|
+ this->cec.frame.service = CEC_TX_DONE;
|
|
+
|
|
+ if(length == POLLING_LENGTH) {
|
|
+ if(opcode == CEC_MSG_FAIL_DEST_NOT_ACK) {
|
|
+ /* no echo means it's mine ! */
|
|
+ TRY(dl_hdmi_cec_set_logical_address(this->cec.inst, this->cec.rx_addr));
|
|
+ TRY(dl_hdmi_cec_report_physical_address(this->cec.inst, \
|
|
+ this->cec.phy_addr, \
|
|
+ this->cec.device_type));
|
|
+ /* DEVICE VENDOR ID sending after logicial address allocation according to spec 1.4 */
|
|
+ TRY(dl_hdmi_cec_device_vendor_id(this->cec.inst, this->cec.vendor_id));
|
|
+ } else if(opcode == CEC_MSG_SUCCESS) {
|
|
+ /* try next one */
|
|
+ this->cec.rx_addr = get_next_logical_addr(this->cec.device_type, this->cec.rx_addr);
|
|
+ if(this->cec.rx_addr != CEC_LOGICAL_ADDRESS_UNREGISTRED_BROADCAST) {
|
|
+ TRY(dl_hdmi_cec_polling_message(this->cec.inst, this->cec.rx_addr));
|
|
+ } else {
|
|
+ /* no more room, keep and claim unregistred */
|
|
+ TRY(dl_hdmi_cec_set_logical_address(this->cec.inst, this->cec.rx_addr));
|
|
+ TRY(dl_hdmi_cec_report_physical_address(this->cec.inst, \
|
|
+ this->cec.phy_addr, \
|
|
+ this->cec.device_type));
|
|
+ }
|
|
+ } else {
|
|
+ printk(KERN_INFO "ACK [%x--->%x] %s\n", initiator, receiver, cec_rxstatus(opcode));
|
|
+ }
|
|
+ } else {
|
|
+ if(CEC_MSG_SUCCESS != opcode) {
|
|
+ printk(KERN_INFO "ACK [%x--->%x] %s\n", initiator, receiver, cec_rxstatus(opcode));
|
|
+ }
|
|
+ }
|
|
+
|
|
+ this->driver.poll_done = true;
|
|
+ wake_up_interruptible(&this->driver.wait);
|
|
+
|
|
+ } else {
|
|
+ LOG(KERN_ERR, "oups ! callback got invalid event %d !\n", event);
|
|
+ }
|
|
+
|
|
+TRY_DONE:
|
|
+ (void)err;
|
|
+}
|
|
+
|
|
+/*
|
|
+ * DevLib CEC opening
|
|
+ * */
|
|
+static int hdmi_cec_init(cec_instance *this)
|
|
+{
|
|
+ int err = 0;
|
|
+
|
|
+ /* Real opening */
|
|
+ TRY(dl_hdmi_cec_open(&this->cec.inst));
|
|
+
|
|
+ /* this->cec.vendor_id = 0x006037; /\* NXP (IEEE OUI) *\/ */
|
|
+ /* this->cec.vendor_id = 0x0000f0; /\* Samsung *\/ */
|
|
+ this->cec.vendor_id = 0x00e091; /* LGE */
|
|
+
|
|
+ /* this->cec.version = CEC_VERSION_1_4; */
|
|
+ this->cec.version = cec_version_1_3a;
|
|
+ this->cec.osd_name.data[0] = 0x54; /* TDA19989 by default */
|
|
+ this->cec.osd_name.data[1] = 0x44;
|
|
+ this->cec.osd_name.data[2] = 0x41;
|
|
+ this->cec.osd_name.data[3] = 0x31;
|
|
+ this->cec.osd_name.data[4] = 0x39;
|
|
+ this->cec.osd_name.data[5] = 0x39;
|
|
+ this->cec.osd_name.data[6] = 0x38;
|
|
+ this->cec.osd_name.data[7] = 0x39;
|
|
+ this->cec.osd_name.length = 8;
|
|
+
|
|
+ TRY(dl_hdmi_cec_register_callbacks(this->cec.inst, event_callback_cec));
|
|
+
|
|
+ this->cec.phy_addr = param_addr;
|
|
+ this->cec.device_type = device_type(param_device);
|
|
+
|
|
+TRY_DONE:
|
|
+ return err;
|
|
+}
|
|
+
|
|
+/*
|
|
+ *
|
|
+ * ENTRY POINTS
|
|
+ * ------------
|
|
+ * LEVEL 3
|
|
+ *
|
|
+ * -
|
|
+ *
|
|
+ * */
|
|
+
|
|
+/*
|
|
+ * ioctl driver :: opening
|
|
+ * */
|
|
+
|
|
+static int this_cdev_open(struct inode *p_inode, struct file *p_file)
|
|
+{
|
|
+ cec_instance *this;
|
|
+ int minor = iminor(p_inode);
|
|
+
|
|
+ if(minor >= MAX_MINOR) {
|
|
+ printk(KERN_ERR "hdmicec:%s:only one cec opening please\n", __func__);
|
|
+ return -EINVAL;
|
|
+ }
|
|
+
|
|
+ if((p_file->private_data != NULL) && (p_file->private_data != &our_instance)) {
|
|
+ printk(KERN_ERR "hdmicec:%s:p_file missmatch\n", __func__);
|
|
+ }
|
|
+ this = p_file->private_data = &our_instance;
|
|
+ down(&this->driver.sem);
|
|
+
|
|
+ LOG(KERN_INFO, "major:%d minor:%d user:%d\n", imajor(p_inode), iminor(p_inode), this->driver.user_counter);
|
|
+
|
|
+ if((this->driver.user_counter++) && (this->driver.minor == minor)) {
|
|
+ /* init already done */
|
|
+ up(&this->driver.sem);
|
|
+ return 0;
|
|
+ }
|
|
+ this->driver.minor = minor;
|
|
+
|
|
+ up(&this->driver.sem);
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+/*
|
|
+ * ioctl driver :: ioctl
|
|
+ * */
|
|
+static int this_cdev_ioctl(struct inode *p_inode, struct file *p_file, unsigned int cmd, unsigned long arg)
|
|
+{
|
|
+ cec_instance *this = p_file->private_data;
|
|
+ int err = 0;
|
|
+
|
|
+ LOG(KERN_INFO, ":%s\n", cec_ioctl(_IOC_NR(cmd)));
|
|
+
|
|
+ BUG_ON(this->driver.minor != iminor(p_inode));
|
|
+ if(_IOC_TYPE(cmd) != CEC_IOCTL_BASE) {
|
|
+ printk(KERN_INFO "hdmicec:%s:unknown ioctl type: %x\n", __func__, _IOC_TYPE(cmd));
|
|
+ return -ENOIOCTLCMD;
|
|
+ }
|
|
+
|
|
+ if(_IOC_DIR(cmd) & _IOC_READ)
|
|
+ err = !access_ok(VERIFY_WRITE, (void __user *)arg, _IOC_SIZE(cmd)) || !arg;
|
|
+ else if(_IOC_DIR(cmd) & _IOC_WRITE)
|
|
+ err = !access_ok(VERIFY_READ, (void __user *)arg, _IOC_SIZE(cmd)) || !arg;
|
|
+ if(err) {
|
|
+ printk(KERN_ERR "hdmicec:%s:argument access denied (check address vs value)\n", __func__);
|
|
+ printk(KERN_ERR "_IOC_DIR:%d arg:%lx\n", _IOC_DIR(cmd), arg);
|
|
+ return -EFAULT;
|
|
+ }
|
|
+
|
|
+ down(&this->driver.sem);
|
|
+
|
|
+ /* Check DevLib consistancy here */
|
|
+
|
|
+ switch(_IOC_NR(cmd)) {
|
|
+ case CEC_VERBOSE_ON_CMD: {
|
|
+ printk(KERN_INFO "verbose on\n");
|
|
+ this->param.verbose = 1;
|
|
+ break;
|
|
+ }
|
|
+
|
|
+ case CEC_VERBOSE_OFF_CMD: {
|
|
+ printk(KERN_INFO "verbose off\n");
|
|
+ this->param.verbose = 0;
|
|
+ break;
|
|
+ }
|
|
+
|
|
+ case CEC_BYEBYE_CMD: {
|
|
+ LOG(KERN_INFO, "callback release request\n");
|
|
+ this->cec.frame.service = CEC_RELEASE;
|
|
+ this->driver.poll_done = true;
|
|
+ wake_up_interruptible(&this->driver.wait);
|
|
+ break;
|
|
+ }
|
|
+
|
|
+ /*
|
|
+ * no param
|
|
+ * */
|
|
+
|
|
+ case CEC_IOCTL_DISABLE_CALIBRATION_CMD: {
|
|
+ TRY(dl_hdmi_cec_disable_calibration(this->cec.inst));
|
|
+ break;
|
|
+ }
|
|
+
|
|
+ case CEC_IOCTL_INSTANCE_CONFIG_CMD: {
|
|
+ TRY(dl_hdmi_cec_instance_config(this->cec.inst));
|
|
+ break;
|
|
+ }
|
|
+
|
|
+ case CEC_IOCTL_REQUEST_ACTIVE_SRC_CMD: {
|
|
+ TRY(dl_hdmi_cec_request_active_source(this->cec.inst));
|
|
+ break;
|
|
+ }
|
|
+
|
|
+ case CEC_IOCTL_ABORT_MSG_CMD: {
|
|
+ TRY(dl_hdmi_cec_abort_message(this->cec.inst, this->cec.initiator));
|
|
+ break;
|
|
+ }
|
|
+
|
|
+ case CEC_IOCTL_GET_MENU_LANGUAGE_CMD: {
|
|
+ TRY(dl_hdmi_cec_get_menu_language(this->cec.inst, this->cec.initiator));
|
|
+ break;
|
|
+ }
|
|
+
|
|
+ case CEC_IOCTL_GIVE_AUDIO_STATUS_CMD: {
|
|
+ TRY(dl_hdmi_cec_give_audio_status(this->cec.inst, this->cec.initiator));
|
|
+ break;
|
|
+ }
|
|
+
|
|
+ case CEC_IOCTL_GIVE_DEVICE_POWER_STATUS_CMD: {
|
|
+ TRY(dl_hdmi_cec_give_device_power_status(this->cec.inst, this->cec.initiator));
|
|
+ break;
|
|
+ }
|
|
+
|
|
+ case CEC_IOCTL_GIVE_DEVICE_VENDOR_ID_CMD: {
|
|
+ TRY(dl_hdmi_cec_give_device_vendor_id(this->cec.inst, this->cec.initiator));
|
|
+ break;
|
|
+ }
|
|
+
|
|
+ case CEC_IOCTL_GIVE_OSD_NAME_CMD: {
|
|
+ TRY(dl_hdmi_cec_give_osd_name(this->cec.inst, this->cec.initiator));
|
|
+ break;
|
|
+ }
|
|
+
|
|
+ case CEC_IOCTL_GIVE_PHY_ADDR_CMD: {
|
|
+ TRY(dl_hdmi_cec_give_physical_address(this->cec.inst, this->cec.initiator));
|
|
+ break;
|
|
+ }
|
|
+
|
|
+ case CEC_IOCTL_GIVE_SYS_AUDIO_MODE_STATUS_CMD: {
|
|
+ TRY(dl_hdmi_cec_give_system_audio_mode_status(this->cec.inst, this->cec.initiator));
|
|
+ break;
|
|
+ }
|
|
+
|
|
+ case CEC_IOCTL_IMAGE_VIEW_ON_CMD: {
|
|
+ TRY(dl_hdmi_cec_image_view_on(this->cec.inst, this->cec.initiator));
|
|
+ break;
|
|
+ }
|
|
+
|
|
+ case CEC_IOCTL_POLLING_MSG_CMD: {
|
|
+ TRY(dl_hdmi_cec_polling_message(this->cec.inst, this->cec.rx_addr));
|
|
+ break;
|
|
+ }
|
|
+
|
|
+ case CEC_IOCTL_REC_OFF_CMD: {
|
|
+ TRY(dl_hdmi_cec_record_off(this->cec.inst, this->cec.initiator));
|
|
+ break;
|
|
+ }
|
|
+
|
|
+ case CEC_IOCTL_REC_ON_OWN_SRC_CMD: {
|
|
+ TRY(dl_hdmi_cec_record_on_own_source(this->cec.inst, this->cec.initiator));
|
|
+ break;
|
|
+ }
|
|
+
|
|
+ case CEC_IOCTL_REC_TV_SCREEN_CMD: {
|
|
+ TRY(dl_hdmi_cec_record_tv_screen(this->cec.inst, this->cec.initiator));
|
|
+ break;
|
|
+ }
|
|
+
|
|
+ case CEC_IOCTL_STANDBY_CMD: {
|
|
+ TRY(dl_hdmi_cec_standby(this->cec.inst, this->cec.initiator));
|
|
+ break;
|
|
+ }
|
|
+
|
|
+ case CEC_IOCTL_TEXT_VIEW_ON_CMD: {
|
|
+ TRY(dl_hdmi_cec_text_view_on(this->cec.inst, this->cec.initiator));
|
|
+ break;
|
|
+ }
|
|
+
|
|
+ case CEC_IOCTL_TUNER_STEP_DECREMENT_CMD: {
|
|
+ TRY(dl_hdmi_cec_tuner_step_decrement(this->cec.inst, this->cec.initiator));
|
|
+ break;
|
|
+ }
|
|
+
|
|
+ case CEC_IOCTL_TUNER_STEP_INCREMENT_CMD: {
|
|
+ TRY(dl_hdmi_cec_tuner_step_increment(this->cec.inst, this->cec.initiator));
|
|
+ break;
|
|
+ }
|
|
+
|
|
+ case CEC_IOCTL_USER_CTRL_RELEASED_CMD: {
|
|
+ TRY(dl_hdmi_cec_user_control_released(this->cec.inst, this->cec.initiator));
|
|
+ break;
|
|
+ }
|
|
+
|
|
+ case CEC_IOCTL_VENDOR_REMOTE_BUTTON_UP_CMD: {
|
|
+ TRY(dl_hdmi_cec_vendor_remote_button_up(this->cec.inst, this->cec.initiator));
|
|
+ break;
|
|
+ }
|
|
+
|
|
+ case CEC_IOCTL_ROUTING_INFORMATION_CMD: {
|
|
+ TRY(dl_hdmi_cec_routing_information(this->cec.inst, this->cec.phy_addr));
|
|
+ break;
|
|
+ }
|
|
+
|
|
+ case CEC_IOCTL_SET_STREAM_PATH_CMD: {
|
|
+ TRY(dl_hdmi_cec_set_stream_path(this->cec.inst, this->cec.phy_addr));
|
|
+ break;
|
|
+ }
|
|
+
|
|
+ case CEC_IOCTL_ACTIVE_SRC_CMD: {
|
|
+ /* NEW first do a <image view on> */
|
|
+ /* NEW when switch by DSS and was inactive */
|
|
+ TRY(dl_hdmi_cec_active_source(this->cec.inst, this->cec.phy_addr));
|
|
+ break;
|
|
+ }
|
|
+
|
|
+ case CEC_IOCTL_SYS_AUDIO_MODE_REQUEST_CMD: {
|
|
+ TRY(dl_hdmi_cec_system_audio_mode_request(this->cec.inst, \
|
|
+ this->cec.initiator, \
|
|
+ this->cec.phy_addr));
|
|
+ break;
|
|
+ }
|
|
+
|
|
+ /*
|
|
+ * 1 param
|
|
+ * */
|
|
+
|
|
+ case CEC_IOCTL_RX_ADDR_CMD: {
|
|
+ /* BUG_ON(copy_from_user(&this->cec.rx_addr,(unsigned char*)arg,sizeof(unsigned char)) != 0); */
|
|
+ this->cec.rx_addr = arg;
|
|
+ TRY(dl_hdmi_cec_set_logical_address(this->cec.inst, this->cec.rx_addr));
|
|
+ break;
|
|
+ }
|
|
+
|
|
+ case CEC_IOCTL_PHY_ADDR_CMD: {
|
|
+ BUG_ON(copy_from_user(&this->cec.phy_addr, (unsigned short *)arg, sizeof(unsigned short)) != 0);
|
|
+ break;
|
|
+ }
|
|
+
|
|
+ case CEC_IOCTL_GET_CEC_VERSION_CMD: {
|
|
+ BUG_ON(copy_from_user(&this->cec.version, (cec_version *)arg, sizeof(cec_version)) != 0);
|
|
+ TRY(dl_hdmi_cec_get_cec_version(this->cec.inst, this->cec.version));
|
|
+ break;
|
|
+ }
|
|
+
|
|
+ case CEC_IOCTL_GET_SW_VERSION_CMD: {
|
|
+ TRY(dl_hdmi_cec_get_swversion(&this->cec.sw_version));
|
|
+ BUG_ON(copy_to_user((cec_sw_version *)arg, &this->cec.sw_version, sizeof(cec_sw_version)) != 0);
|
|
+ break;
|
|
+ }
|
|
+
|
|
+ case CEC_IOCTL_SET_POWER_STATE_CMD: {
|
|
+ /* NEW : log : please use DSS */
|
|
+ BUG_ON(copy_from_user(&this->cec.power, (cec_power *)arg, sizeof(cec_power)) != 0);
|
|
+ TRY(dl_hdmi_cec_set_power_state(this->cec.inst, this->cec.power));
|
|
+ break;
|
|
+ }
|
|
+
|
|
+ case CEC_IOCTL_GET_POWER_STATE_CMD: {
|
|
+ TRY(dl_hdmi_cec_get_power_state(this->cec.inst, &this->cec.power));
|
|
+ BUG_ON(copy_to_user((cec_power *)arg, &this->cec.power, sizeof(cec_power)) != 0);
|
|
+ break;
|
|
+ }
|
|
+
|
|
+ case CEC_IOCTL_INSTANCE_SETUP_CMD: {
|
|
+ BUG_ON(copy_from_user(&this->cec.setup, (cec_setup *)arg, sizeof(cec_setup)) != 0);
|
|
+ TRY(dl_hdmi_cec_instance_setup(this->cec.inst, &this->cec.setup));
|
|
+ break;
|
|
+ }
|
|
+
|
|
+ case CEC_IOCTL_GET_INSTANCE_SETUP_CMD: {
|
|
+ TRY(dl_hdmi_cec_get_instance_setup(this->cec.inst, &this->cec.setup));
|
|
+ BUG_ON(copy_to_user((cec_setup *)arg, &this->cec.setup, sizeof(cec_setup)) != 0);
|
|
+ break;
|
|
+ }
|
|
+
|
|
+ /*
|
|
+ * case CEC_IOCTL_ENABLE_EVENT_CMD:
|
|
+ * {
|
|
+ * BUG_ON(copy_from_user(&this->cec.an_event,(cec_event*)arg,sizeof(cec_event)) != 0);
|
|
+ * TRY(dlHdmiCecEnableEvent(this->cec.inst,this->cec.an_event));
|
|
+ * break;
|
|
+ * }
|
|
+ *
|
|
+ * case CEC_IOCTL_DISABLE_EVENT_CMD:
|
|
+ * {
|
|
+ * BUG_ON(copy_from_user(&this->cec.an_event,(cec_event*)arg,sizeof(cec_event)) != 0);
|
|
+ * TRY(dlHdmiCecDisableEvent(this->cec.inst,this->cec.an_event));
|
|
+ * break;
|
|
+ * }
|
|
+ * */
|
|
+
|
|
+ case CEC_IOCTL_SET_MENU_LANGUAGE_CMD: {
|
|
+ BUG_ON(copy_from_user(&this->cec.clock, (cec_string *)arg, sizeof(cec_string)) != 0);
|
|
+ TRY(dl_hdmi_cec_set_menu_language(this->cec.inst, this->cec.string.data));
|
|
+ break;
|
|
+ }
|
|
+
|
|
+ case CEC_IOCTL_ENABLE_CALIBRATION_CMD: {
|
|
+ BUG_ON(copy_from_user(&this->cec.clock, (cec_clock *)arg, sizeof(cec_clock)) != 0);
|
|
+ TRY(dl_hdmi_cec_enable_calibration(this->cec.inst, this->cec.clock));
|
|
+ break;
|
|
+ }
|
|
+
|
|
+ /*
|
|
+ * >1 param
|
|
+ * */
|
|
+
|
|
+ case CEC_IOCTL_WAIT_FRAME_CMD: {
|
|
+ this->cec.frame.service = CEC_WAITING;
|
|
+ this->driver.poll_done = false;
|
|
+ up(&this->driver.sem);
|
|
+ if(wait_event_interruptible(this->driver.wait, this->driver.poll_done)) return -ERESTARTSYS;
|
|
+ down(&this->driver.sem);
|
|
+ BUG_ON(copy_to_user((cec_frame *)arg, &this->cec.frame, sizeof(cec_frame)) != 0);
|
|
+ break;
|
|
+ }
|
|
+
|
|
+ case CEC_IOCTL_VERSION_CMD: {
|
|
+ BUG_ON(copy_from_user(&this->cec.version, (cec_version *)arg, sizeof(cec_version)) != 0);
|
|
+ TRY(dl_hdmi_cec_version(this->cec.inst, \
|
|
+ this->cec.initiator, \
|
|
+ this->cec.version));
|
|
+ break;
|
|
+ }
|
|
+
|
|
+ case CEC_IOCTL_CLEAR_ANALOGUE_TIMER_CMD: {
|
|
+ BUG_ON(copy_from_user(&this->cec.analog_timer, (cec_analogue_timer *)arg, sizeof(cec_analogue_timer)) != 0);
|
|
+ TRY(dl_hdmi_cec_clear_analogue_timer(this->cec.inst, \
|
|
+ this->cec.initiator, \
|
|
+ this->cec.analog_timer.day_of_month, \
|
|
+ this->cec.analog_timer.month_of_year, \
|
|
+ this->cec.analog_timer.start_time, \
|
|
+ &this->cec.analog_timer.duration, \
|
|
+ this->cec.analog_timer.recording_sequence, \
|
|
+ this->cec.analog_timer.analogue_broadcast_type, \
|
|
+ this->cec.analog_timer.analogue_frequency, \
|
|
+ this->cec.analog_timer.broadcast_system));
|
|
+ break;
|
|
+ }
|
|
+
|
|
+ case CEC_IOCTL_CLEAR_DIGITAL_TIMER_CMD: {
|
|
+ BUG_ON(copy_from_user(&this->cec.digital_timer, (cec_digital_timer *)arg, sizeof(cec_digital_timer)) != 0);
|
|
+ TRY(dl_hdmi_cec_clear_digital_timer(this->cec.inst, \
|
|
+ this->cec.initiator, \
|
|
+ this->cec.digital_timer.day_of_month, \
|
|
+ this->cec.digital_timer.month_of_year, \
|
|
+ this->cec.digital_timer.start_time, \
|
|
+ &this->cec.digital_timer.duration, \
|
|
+ this->cec.digital_timer.recording_sequence, \
|
|
+ &this->cec.digital_timer.service_identification));
|
|
+ break;
|
|
+ }
|
|
+
|
|
+ case CEC_IOCTL_CLEAR_EXT_TIMER_WITH_EXT_PLUG_CMD: {
|
|
+ BUG_ON(copy_from_user(&this->cec.etwep, (cec_ext_timer_with_ext_plug *)arg, sizeof(cec_ext_timer_with_ext_plug)) != 0);
|
|
+ TRY(dl_hdmi_cec_clear_external_timer_with_external_plug(this->cec.inst, \
|
|
+ this->cec.initiator, \
|
|
+ this->cec.etwep.day_of_month, \
|
|
+ this->cec.etwep.month_of_year, \
|
|
+ this->cec.etwep.start_time, \
|
|
+ &this->cec.etwep.duration, \
|
|
+ this->cec.etwep.recording_sequence, \
|
|
+ this->cec.etwep.external_plug));
|
|
+ break;
|
|
+ }
|
|
+
|
|
+ case CEC_IOCTL_CLEAR_EXT_TIMER_WITH_PHY_ADDR_CMD: {
|
|
+ BUG_ON(copy_from_user(&this->cec.etwpa, (cec_ext_timer_with_phy_addr *)arg, sizeof(cec_ext_timer_with_phy_addr)) != 0);
|
|
+ TRY(dl_hdmi_cec_clear_external_timer_with_physical_address(this->cec.inst, \
|
|
+ this->cec.initiator, \
|
|
+ this->cec.etwpa.day_of_month, \
|
|
+ this->cec.etwpa.month_of_year, \
|
|
+ this->cec.etwpa.start_time, \
|
|
+ &this->cec.etwpa.duration, \
|
|
+ this->cec.etwpa.recording_sequence, \
|
|
+ this->cec.etwpa.external_physical_address));
|
|
+ break;
|
|
+ }
|
|
+
|
|
+ case CEC_IOCTL_DECK_CTRL_CMD: {
|
|
+ BUG_ON(copy_from_user(&this->cec.deck_ctrl, (cec_deck_ctrl *)arg, sizeof(cec_deck_ctrl)) != 0);
|
|
+ TRY(dl_hdmi_cec_deck_control(this->cec.inst, \
|
|
+ this->cec.initiator, \
|
|
+ this->cec.deck_ctrl));
|
|
+ break;
|
|
+ }
|
|
+
|
|
+ case CEC_IOCTL_DECK_STATUS_CMD: {
|
|
+ BUG_ON(copy_from_user(&this->cec.deck_status, (cec_deck_status *)arg, sizeof(cec_deck_status)) != 0);
|
|
+ TRY(dl_hdmi_cec_deck_status(this->cec.inst, \
|
|
+ this->cec.initiator, \
|
|
+ this->cec.deck_status));
|
|
+ break;
|
|
+ }
|
|
+
|
|
+ case CEC_IOCTL_DEVICE_VENDOR_ID_CMD: {
|
|
+ BUG_ON(copy_from_user(&this->cec.vendor_id, (unsigned long *)arg, sizeof(unsigned long)) != 0);
|
|
+ TRY(dl_hdmi_cec_device_vendor_id(this->cec.inst, \
|
|
+ this->cec.vendor_id));
|
|
+ break;
|
|
+ }
|
|
+
|
|
+ case CEC_IOCTL_FEATURE_ABORT_CMD: {
|
|
+ BUG_ON(copy_from_user(&this->cec.feature_abort, (cec_feature_abort *)arg, sizeof(cec_feature_abort)) != 0);
|
|
+ TRY(dl_hdmi_cec_feature_abort(this->cec.inst, \
|
|
+ this->cec.initiator, \
|
|
+ this->cec.feature_abort.feature_opcode, \
|
|
+ this->cec.feature_abort.abort_reason));
|
|
+ break;
|
|
+ }
|
|
+
|
|
+ case CEC_IOCTL_GIVE_DECK_STATUS_CMD: {
|
|
+ BUG_ON(copy_from_user(&this->cec.satus_request, (cec_status_request *)arg, sizeof(cec_status_request)) != 0);
|
|
+ TRY(dl_hdmi_cec_give_deck_status(this->cec.inst, \
|
|
+ this->cec.initiator, \
|
|
+ this->cec.satus_request));
|
|
+ break;
|
|
+ }
|
|
+
|
|
+ case CEC_IOCTL_GIVE_TUNER_DEVICE_STATUS_CMD: {
|
|
+ BUG_ON(copy_from_user(&this->cec.satus_request, (cec_status_request *)arg, sizeof(cec_status_request *)) != 0);
|
|
+ TRY(dl_hdmi_cec_give_tuner_device_status(this->cec.inst, \
|
|
+ this->cec.initiator, \
|
|
+ this->cec.satus_request));
|
|
+ break;
|
|
+ }
|
|
+
|
|
+ case CEC_IOCTL_INACTIVE_SRC_CMD: {
|
|
+ /* NEW first stand by video */
|
|
+ /* NEW when hdmi_disable and was active */
|
|
+ TRY(dl_hdmi_cec_inactive_source(this->cec.inst, \
|
|
+ this->cec.initiator, \
|
|
+ this->cec.phy_addr));
|
|
+ break;
|
|
+ }
|
|
+
|
|
+ case CEC_IOCTL_MENU_REQUEST_CMD: {
|
|
+ BUG_ON(copy_from_user(&this->cec.menu_request, (cec_menu_request *)arg, sizeof(cec_menu_request)) != 0);
|
|
+ TRY(dl_hdmi_cec_menu_request(this->cec.inst, \
|
|
+ this->cec.initiator, \
|
|
+ this->cec.menu_request));
|
|
+ break;
|
|
+ }
|
|
+
|
|
+ case CEC_IOCTL_MENU_STATUS_CMD: {
|
|
+ BUG_ON(copy_from_user(&this->cec.menu_status, (cec_menu_status *)arg, sizeof(cec_menu_status)) != 0);
|
|
+ TRY(dl_hdmi_cec_menu_status(this->cec.inst, \
|
|
+ this->cec.initiator, \
|
|
+ this->cec.menu_status));
|
|
+ break;
|
|
+ }
|
|
+
|
|
+ case CEC_IOCTL_PLAY_CMD: {
|
|
+ BUG_ON(copy_from_user(&this->cec.play, (cec_play *)arg, sizeof(cec_play)) != 0);
|
|
+ TRY(dl_hdmi_cec_play(this->cec.inst, \
|
|
+ this->cec.initiator, \
|
|
+ this->cec.play));
|
|
+ break;
|
|
+ }
|
|
+
|
|
+ case CEC_IOCTL_REC_ON_ANALOGUE_SERVICE_CMD: {
|
|
+ BUG_ON(copy_from_user(&this->cec.analog_service, (cec_analogue_service *)arg, sizeof(cec_analogue_service)) != 0);
|
|
+ TRY(dl_hdmi_cec_record_on_analogue_service(this->cec.inst, \
|
|
+ this->cec.initiator, \
|
|
+ this->cec.analog_service.analogue_broadcast_type, \
|
|
+ this->cec.analog_service.analogue_frequency, \
|
|
+ this->cec.analog_service.broadcast_system));
|
|
+ break;
|
|
+ }
|
|
+
|
|
+ case CEC_IOCTL_REC_ON_DIGITAL_SERVICE_CMD: {
|
|
+ BUG_ON(copy_from_user(&this->cec.digital_service, (cec_digital_service *)arg, sizeof(cec_digital_service)) != 0);
|
|
+ TRY(dl_hdmi_cec_record_on_digital_service(this->cec.inst, \
|
|
+ this->cec.initiator, \
|
|
+ &this->cec.digital_service));
|
|
+ break;
|
|
+ }
|
|
+
|
|
+ case CEC_IOCTL_REC_ON_EXT_PHY_ADDR_CMD: {
|
|
+ TRY(dl_hdmi_cec_record_on_external_physical_address(this->cec.inst, \
|
|
+ this->cec.initiator, \
|
|
+ this->cec.phy_addr));
|
|
+ break;
|
|
+ }
|
|
+
|
|
+ case CEC_IOCTL_REC_ON_EXT_PLUG_CMD: {
|
|
+ BUG_ON(copy_from_user(&this->cec.ext_plug, (cec_ext_plug *)arg, sizeof(cec_ext_plug)) != 0);
|
|
+ TRY(dl_hdmi_cec_record_on_external_plug(this->cec.inst, \
|
|
+ this->cec.initiator, \
|
|
+ this->cec.ext_plug));
|
|
+ break;
|
|
+ }
|
|
+
|
|
+ case CEC_IOCTL_REC_STATUS_CMD: {
|
|
+ BUG_ON(copy_from_user(&this->cec.rec_status, (cec_rec_status *)arg, sizeof(cec_rec_status)) != 0);
|
|
+ TRY(dl_hdmi_cec_record_status(this->cec.inst, \
|
|
+ this->cec.initiator, \
|
|
+ this->cec.rec_status));
|
|
+ break;
|
|
+ }
|
|
+
|
|
+ case CEC_IOCTL_REPORT_AUDIO_STATUS_CMD: {
|
|
+ BUG_ON(copy_from_user(&this->cec.audio_status, (cec_audio_status *)arg, sizeof(cec_audio_status)) != 0);
|
|
+ TRY(dl_hdmi_cec_report_audio_status(this->cec.inst, \
|
|
+ this->cec.initiator, \
|
|
+ &this->cec.audio_status));
|
|
+ break;
|
|
+ }
|
|
+
|
|
+ case CEC_IOCTL_REPORT_PHY_ADDR_CMD: {
|
|
+ BUG_ON(copy_from_user(&this->cec.device_type, (cec_device_type *)arg, sizeof(cec_device_type)) != 0);
|
|
+ TRY(dl_hdmi_cec_report_physical_address(this->cec.inst, \
|
|
+ this->cec.phy_addr, \
|
|
+ this->cec.device_type));
|
|
+ break;
|
|
+ }
|
|
+
|
|
+ case CEC_IOCTL_REPORT_POWER_STATUS_CMD: {
|
|
+ BUG_ON(copy_from_user(&this->cec.source_status, (cec_power_status *)arg, sizeof(cec_power_status)) != 0);
|
|
+ TRY(dl_hdmi_cec_report_power_status(this->cec.inst, \
|
|
+ this->cec.initiator, \
|
|
+ this->cec.source_status));
|
|
+ break;
|
|
+ }
|
|
+
|
|
+ case CEC_IOCTL_SELECT_ANALOGUE_SERVICE_CMD: {
|
|
+ BUG_ON(copy_from_user(&this->cec.analog_service, (cec_analogue_service *)arg, sizeof(cec_analogue_service)) != 0);
|
|
+ TRY(dl_hdmi_cec_select_analogue_service(this->cec.inst, \
|
|
+ this->cec.initiator, \
|
|
+ this->cec.analog_service.analogue_broadcast_type, \
|
|
+ this->cec.analog_service.analogue_frequency, \
|
|
+ this->cec.analog_service.broadcast_system));
|
|
+ break;
|
|
+ }
|
|
+
|
|
+ case CEC_IOCTL_SELECT_DIGITAL_SERVICE_CMD: {
|
|
+ BUG_ON(copy_from_user(&this->cec.digital_service, (cec_digital_service *)arg, sizeof(cec_digital_service)) != 0);
|
|
+ TRY(dl_hdmi_cec_select_digital_service(this->cec.inst, \
|
|
+ this->cec.initiator, \
|
|
+ &this->cec.digital_service));
|
|
+ break;
|
|
+ }
|
|
+
|
|
+ case CEC_IOCTL_SET_ANALOGUE_TIMER_CMD: {
|
|
+ BUG_ON(copy_from_user(&this->cec.analog_timer, (cec_analogue_timer *)arg, sizeof(cec_analogue_timer)) != 0);
|
|
+ TRY(dl_hdmi_cec_set_analogue_timer(this->cec.inst, \
|
|
+ this->cec.initiator, \
|
|
+ this->cec.analog_timer.day_of_month, \
|
|
+ this->cec.analog_timer.month_of_year, \
|
|
+ this->cec.analog_timer.start_time, \
|
|
+ &this->cec.analog_timer.duration, \
|
|
+ this->cec.analog_timer.recording_sequence, \
|
|
+ this->cec.analog_timer.analogue_broadcast_type, \
|
|
+ this->cec.analog_timer.analogue_frequency, \
|
|
+ this->cec.analog_timer.broadcast_system));
|
|
+ break;
|
|
+ }
|
|
+
|
|
+ case CEC_IOCTL_SET_AUDIO_RATE_CMD: {
|
|
+ BUG_ON(copy_from_user(&this->cec.audio_rate, (cec_audio_rate *)arg, sizeof(cec_audio_rate)) != 0);
|
|
+ TRY(dl_hdmi_cec_set_audio_rate(this->cec.inst, \
|
|
+ this->cec.initiator, \
|
|
+ this->cec.audio_rate));
|
|
+ break;
|
|
+ }
|
|
+
|
|
+ case CEC_IOCTL_SET_DIGITAL_TIMER_CMD: {
|
|
+ BUG_ON(copy_from_user(&this->cec.digital_timer, (cec_digital_timer *)arg, sizeof(cec_digital_timer)) != 0);
|
|
+ TRY(dl_hdmi_cec_set_digital_timer(this->cec.inst, \
|
|
+ this->cec.initiator, \
|
|
+ this->cec.digital_timer.day_of_month, \
|
|
+ this->cec.digital_timer.month_of_year, \
|
|
+ this->cec.digital_timer.start_time, \
|
|
+ &this->cec.digital_timer.duration, \
|
|
+ this->cec.digital_timer.recording_sequence, \
|
|
+ &this->cec.digital_timer.service_identification));
|
|
+ break;
|
|
+ }
|
|
+
|
|
+ case CEC_IOCTL_SET_EXT_TIMER_WITH_EXT_PLUG_CMD: {
|
|
+ BUG_ON(copy_from_user(&this->cec.etwep, (cec_ext_timer_with_ext_plug *)arg, sizeof(cec_ext_timer_with_ext_plug)) != 0);
|
|
+ TRY(dl_hdmi_cec_set_external_timer_with_external_plug(this->cec.inst, \
|
|
+ this->cec.initiator, \
|
|
+ this->cec.etwep.day_of_month, \
|
|
+ this->cec.etwep.month_of_year, \
|
|
+ this->cec.etwep.start_time, \
|
|
+ &this->cec.etwep.duration, \
|
|
+ this->cec.etwep.recording_sequence, \
|
|
+ this->cec.etwep.external_plug));
|
|
+ break;
|
|
+ }
|
|
+
|
|
+ case CEC_IOCTL_SET_EXT_TIMER_WITH_PHY_ADDR_CMD: {
|
|
+ BUG_ON(copy_from_user(&this->cec.etwpa, (cec_ext_timer_with_phy_addr *)arg, sizeof(cec_ext_timer_with_phy_addr)) != 0);
|
|
+ TRY(dl_hdmi_cec_set_external_timer_with_physical_address(this->cec.inst, \
|
|
+ this->cec.initiator, \
|
|
+ this->cec.etwpa.day_of_month, \
|
|
+ this->cec.etwpa.month_of_year, \
|
|
+ this->cec.etwpa.start_time, \
|
|
+ &this->cec.etwpa.duration, \
|
|
+ this->cec.etwpa.recording_sequence, \
|
|
+ this->cec.etwpa.external_physical_address));
|
|
+ break;
|
|
+ }
|
|
+
|
|
+ case CEC_IOCTL_SET_SYS_AUDIO_MODE_CMD: {
|
|
+ BUG_ON(copy_from_user(&this->cec.sys_audio_status, (cec_sys_audio_status *)arg, sizeof(cec_sys_audio_status)) != 0);
|
|
+ TRY(dl_hdmi_cec_set_system_audio_mode(this->cec.inst, \
|
|
+ this->cec.initiator, \
|
|
+ this->cec.sys_audio_status));
|
|
+ break;
|
|
+ }
|
|
+
|
|
+ case CEC_IOCTL_SYS_AUDIO_MODE_STATUS_CMD: {
|
|
+ BUG_ON(copy_from_user(&this->cec.sys_audio_status, (cec_sys_audio_status *)arg, sizeof(cec_sys_audio_status)) != 0);
|
|
+ TRY(dl_hdmi_cec_system_audio_mode_status(this->cec.inst, \
|
|
+ this->cec.initiator, \
|
|
+ this->cec.sys_audio_status));
|
|
+ break;
|
|
+ }
|
|
+
|
|
+ case CEC_IOCTL_TIMER_CLEARED_STATUS_CMD: {
|
|
+ BUG_ON(copy_from_user(&this->cec.timer_cleared_status, (cec_timer_cleared_status *)arg, sizeof(cec_timer_cleared_status)) != 0);
|
|
+ TRY(dl_hdmi_cec_timer_cleared_status(this->cec.inst, \
|
|
+ this->cec.initiator, \
|
|
+ this->cec.timer_cleared_status));
|
|
+ break;
|
|
+ }
|
|
+
|
|
+ case CEC_IOCTL_TIMER_STATUS_CMD: {
|
|
+ BUG_ON(copy_from_user(&this->cec.timer_status, (cec_timer_status *)arg, sizeof(cec_timer_status)) != 0);
|
|
+ TRY(dl_hdmi_cec_timer_status(this->cec.inst, \
|
|
+ this->cec.initiator, \
|
|
+ &this->cec.timer_status));
|
|
+ break;
|
|
+ }
|
|
+
|
|
+ case CEC_IOCTL_TUNER_DEVICE_STATUS_ANALOGUE_CMD: {
|
|
+ BUG_ON(copy_from_user(&this->cec.tdsa, (cec_tuner_device_status_analogue *)arg, sizeof(cec_tuner_device_status_analogue)) != 0);
|
|
+ TRY(dl_hdmi_cec_tuner_device_status_analogue(this->cec.inst, \
|
|
+ this->cec.initiator, \
|
|
+ this->cec.tdsa.recording_flag, \
|
|
+ this->cec.tdsa.tuner_display_info, \
|
|
+ this->cec.tdsa.analogue_broadcast_type, \
|
|
+ this->cec.tdsa.analogue_frequency, \
|
|
+ this->cec.tdsa.broadcast_system));
|
|
+ break;
|
|
+ }
|
|
+
|
|
+ case CEC_IOCTL_TUNER_DEVICE_STATUS_DIGITAL_CMD: {
|
|
+ BUG_ON(copy_from_user(&this->cec.tdsd, (cec_tuner_device_status_digital *)arg, sizeof(cec_tuner_device_status_digital)) != 0);
|
|
+ TRY(dl_hdmi_cec_tuner_device_status_digital(this->cec.inst, \
|
|
+ this->cec.initiator, \
|
|
+ this->cec.tdsd.recording_flag, \
|
|
+ this->cec.tdsd.tuner_display_info, \
|
|
+ &this->cec.tdsd.service_identification));
|
|
+ break;
|
|
+ }
|
|
+
|
|
+ case CEC_IOCTL_USER_CTRL_CMD: {
|
|
+ BUG_ON(copy_from_user(&this->cec.user_ctrl, (cec_user_ctrl *)arg, sizeof(cec_user_ctrl)) != 0);
|
|
+ TRY(dl_hdmi_cec_user_control_pressed(this->cec.inst, \
|
|
+ this->cec.initiator, \
|
|
+ this->cec.user_ctrl));
|
|
+ break;
|
|
+ }
|
|
+
|
|
+ case CEC_IOCTL_USER_CTRL_PLAY_CMD: {
|
|
+ BUG_ON(copy_from_user(&this->cec.play, (cec_play *)arg, sizeof(cec_play)) != 0);
|
|
+ TRY(dl_hdmi_cec_user_control_pressed_play(this->cec.inst, \
|
|
+ this->cec.initiator, \
|
|
+ this->cec.play));
|
|
+ break;
|
|
+ }
|
|
+
|
|
+ case CEC_IOCTL_USER_CTRL_SELECT_AUDIOINPUT_CMD: {
|
|
+ BUG_ON(copy_from_user(&this->cec.select, (unsigned char *)arg, sizeof(unsigned char)) != 0);
|
|
+ TRY(dl_hdmi_cec_user_control_pressed_select_audio_input(this->cec.inst, \
|
|
+ this->cec.initiator, \
|
|
+ this->cec.select));
|
|
+ break;
|
|
+ }
|
|
+
|
|
+ case CEC_IOCTL_USER_CTRL_SELECT_AVINPUT_CMD: {
|
|
+ BUG_ON(copy_from_user(&this->cec.select, (unsigned char *)arg, sizeof(unsigned char)) != 0);
|
|
+ TRY(dl_hdmi_cec_user_control_pressed_select_avinput(this->cec.inst, \
|
|
+ this->cec.initiator, \
|
|
+ this->cec.select));
|
|
+ break;
|
|
+ }
|
|
+
|
|
+ case CEC_IOCTL_USER_CTRL_SELECT_MEDIA_CMD: {
|
|
+ BUG_ON(copy_from_user(&this->cec.select, (unsigned char *)arg, sizeof(unsigned char)) != 0);
|
|
+ TRY(dl_hdmi_cec_user_control_pressed_select_media(this->cec.inst, \
|
|
+ this->cec.initiator, \
|
|
+ this->cec.select));
|
|
+ break;
|
|
+ }
|
|
+
|
|
+ case CEC_IOCTL_USER_CTRL_TUNE_CMD: {
|
|
+ BUG_ON(copy_from_user(&this->cec.user_ctrl_tune, (cec_user_ctrl_tune *)arg, sizeof(cec_user_ctrl_tune)) != 0);
|
|
+ TRY(dl_hdmi_cec_user_control_pressed_tune(this->cec.inst, \
|
|
+ this->cec.initiator, \
|
|
+ &this->cec.user_ctrl_tune));
|
|
+ break;
|
|
+ }
|
|
+
|
|
+ case CEC_IOCTL_SET_OSD_NAME_CMD: {
|
|
+ BUG_ON(copy_from_user(&this->cec.osd_name, (cec_string *)arg, sizeof(cec_string)) != 0);
|
|
+ TRY(dl_hdmi_cec_set_osd_name(this->cec.inst, \
|
|
+ this->cec.initiator, \
|
|
+ this->cec.osd_name.data, \
|
|
+ this->cec.osd_name.length));
|
|
+ break;
|
|
+ }
|
|
+
|
|
+ case CEC_IOCTL_SET_OSD_STRING_CMD: {
|
|
+ BUG_ON(copy_from_user(&this->cec.osd_string, (cec_osd_string *)arg, sizeof(cec_osd_string)) != 0);
|
|
+ TRY(dl_hdmi_cec_set_osd_string(this->cec.inst, \
|
|
+ this->cec.initiator, \
|
|
+ this->cec.osd_string.display_control, \
|
|
+ this->cec.osd_string.data, \
|
|
+ this->cec.osd_string.length));
|
|
+ break;
|
|
+ }
|
|
+
|
|
+ case CEC_IOCTL_SET_TIMER_PROGRAM_TITLE_CMD: {
|
|
+ BUG_ON(copy_from_user(&this->cec.string, (cec_string *)arg, sizeof(cec_string)) != 0);
|
|
+ TRY(dl_hdmi_cec_set_timer_program_title(this->cec.inst, \
|
|
+ this->cec.initiator, \
|
|
+ this->cec.string.data, \
|
|
+ this->cec.string.length));
|
|
+ break;
|
|
+ }
|
|
+
|
|
+ case CEC_IOCTL_VENDOR_COMMAND_CMD: {
|
|
+ BUG_ON(copy_from_user(&this->cec.string, (cec_string *)arg, sizeof(cec_string)) != 0);
|
|
+ TRY(dl_hdmi_cec_vendor_command(this->cec.inst, \
|
|
+ this->cec.initiator, \
|
|
+ this->cec.string.data, \
|
|
+ this->cec.string.length));
|
|
+ break;
|
|
+ }
|
|
+
|
|
+ case CEC_IOCTL_VENDOR_REMOTE_BUTTON_DOWN_CMD: {
|
|
+ BUG_ON(copy_from_user(&this->cec.string, (cec_string *)arg, sizeof(cec_string)) != 0);
|
|
+ TRY(dl_hdmi_cec_vendor_remote_button_down(this->cec.inst, \
|
|
+ this->cec.initiator, \
|
|
+ this->cec.string.data, \
|
|
+ this->cec.string.length));
|
|
+ break;
|
|
+ }
|
|
+
|
|
+ case CEC_IOCTL_VENDOR_COMMAND_WITH_ID_CMD: {
|
|
+ BUG_ON(copy_from_user(&this->cec.vcwi, (cec_vendor_command_with_id *)arg, sizeof(cec_vendor_command_with_id)) != 0);
|
|
+ TRY(dl_hdmi_cec_vendor_command_with_id(this->cec.inst, \
|
|
+ this->cec.initiator, \
|
|
+ this->cec.vcwi.vendor_id, \
|
|
+ this->cec.vcwi.cmd.data, \
|
|
+ this->cec.vcwi.cmd.length));
|
|
+ break;
|
|
+ }
|
|
+
|
|
+ /* case : */
|
|
+ /* { */
|
|
+ /* BUG_ON(copy_from_user(&this->cec.,(*)arg,sizeof()) != 0); */
|
|
+ /* TRY((this->cec.inst, \ */
|
|
+ /* this->cec., \ */
|
|
+ /* &this->cec.)); */
|
|
+ /* break; */
|
|
+ /* } */
|
|
+
|
|
+ default: {
|
|
+ /* unrecognized ioctl */
|
|
+ printk(KERN_INFO " unknown ioctl %x\n", cmd);
|
|
+ up(&this->driver.sem);
|
|
+ return -ENOIOCTLCMD;
|
|
+ }
|
|
+ }
|
|
+
|
|
+TRY_DONE:
|
|
+ up(&this->driver.sem);
|
|
+ return err;
|
|
+}
|
|
+
|
|
+/*
|
|
+ * ioctl driver :: releasing
|
|
+ * */
|
|
+static int this_cdev_release(struct inode *p_inode, struct file *p_file)
|
|
+{
|
|
+ cec_instance *this = p_file->private_data;
|
|
+ int minor = iminor(p_inode);
|
|
+
|
|
+ LOG(KERN_INFO, "called\n");
|
|
+
|
|
+ if(minor >= MAX_MINOR) {
|
|
+ return -EINVAL;
|
|
+ }
|
|
+
|
|
+ BUG_ON(this->driver.minor != iminor(p_inode));
|
|
+ down(&this->driver.sem);
|
|
+
|
|
+ this->driver.user_counter--;
|
|
+ if(this->driver.user_counter == 0) {
|
|
+ p_file->private_data = NULL;
|
|
+ } else {
|
|
+ LOG(KERN_INFO, "still %d user pending\n", this->driver.user_counter);
|
|
+ }
|
|
+
|
|
+ up(&this->driver.sem);
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+/*
|
|
+ * I2C client :: creation
|
|
+ * */
|
|
+static int __devinit this_i2c_probe(struct i2c_client *client, const struct i2c_device_id *id)
|
|
+{
|
|
+ cec_instance *this = &our_instance;
|
|
+ int err = 0;
|
|
+
|
|
+ LOG(KERN_INFO, "called\n");
|
|
+
|
|
+ /*
|
|
+ * I2C setup
|
|
+ * */
|
|
+ if(this->driver.i2c_client) {
|
|
+ dev_err(&this->driver.i2c_client->dev, "<%s> CEC device already created \n",
|
|
+ __func__);
|
|
+ return -ENODEV;
|
|
+ }
|
|
+
|
|
+ this->driver.i2c_client = kmalloc(sizeof(struct i2c_client), GFP_KERNEL);
|
|
+ if(!this->driver.i2c_client) {
|
|
+ return -ENOMEM;
|
|
+ }
|
|
+ memset(this->driver.i2c_client, 0, sizeof(struct i2c_client));
|
|
+
|
|
+ strncpy(this->driver.i2c_client->name, CEC_NAME, I2C_NAME_SIZE);
|
|
+ this->driver.i2c_client->addr = TDA99XCEC_I2C_SLAVEADDRESS;
|
|
+ this->driver.i2c_client->adapter = client->adapter;
|
|
+
|
|
+ i2c_set_clientdata(client, this->driver.i2c_client);
|
|
+
|
|
+ dl_hdmi_cec_get_swversion(&this->cec.sw_version);
|
|
+ LOG(KERN_INFO, "HDMI CEC SW version:%ul.%ul compatibility:%ul\n", \
|
|
+ this->cec.sw_version.major_version_nr, \
|
|
+ this->cec.sw_version.minor_version_nr, \
|
|
+ this->cec.sw_version.compatibility_nr);
|
|
+
|
|
+ /* I2C ok, then let's startup CEC */
|
|
+
|
|
+ /* prepare event */
|
|
+ this->driver.poll_done = true; /* currently idle */
|
|
+ init_waitqueue_head(&this->driver.wait);
|
|
+#ifndef IRQ
|
|
+ init_timer(&this->driver.timer); /* do it before request_irq */
|
|
+ this->driver.timer.function = polling_timeout;
|
|
+ this->driver.timer.data = 0;
|
|
+ this->driver.timer.expires = jiffies + HZ; /* start polling in one sec */
|
|
+ add_timer(&this->driver.timer);
|
|
+#else
|
|
+ register_cec_interrupt((cec_callback_t)cec_interrupt);
|
|
+#endif
|
|
+
|
|
+#ifndef IRQ
|
|
+ /* FRO calibration */
|
|
+ err = gpio_request(TDA_IRQ_CALIB, "tda19989 calibration");
|
|
+ if(err < 0) {
|
|
+ printk(KERN_ERR "hdmicec:%s:cannot use GPIO 107\n", __func__);
|
|
+ goto i2c_out;
|
|
+ }
|
|
+ /* turn GPIO into IRQ */
|
|
+ gpio_direction_input(TDA_IRQ_CALIB);
|
|
+ msleep(1);
|
|
+ if(request_irq(gpio_to_irq(TDA_IRQ_CALIB), \
|
|
+ tda_irq, IRQF_TRIGGER_FALLING | IRQF_DISABLED, "TDA IRQ", NULL)) {
|
|
+ printk(KERN_ERR "hdmicec:%s:cannot request irq, err:%d\n", __func__, err);
|
|
+ gpio_free(TDA_IRQ_CALIB);
|
|
+ goto i2c_out;
|
|
+ }
|
|
+#endif
|
|
+
|
|
+ err = hdmi_cec_init(this);
|
|
+ if(err) goto i2c_out;
|
|
+ this->cec.rx_addr = CEC_LOGICAL_ADDRESS_UNREGISTRED_BROADCAST;
|
|
+
|
|
+ if(get_hpd_status()) {
|
|
+ cec_on(this);
|
|
+ disable_irq(gpio_to_irq(TDA_IRQ_CALIB));
|
|
+ cec_interrupt(NULL); /* initiate polling */
|
|
+ enable_irq(gpio_to_irq(TDA_IRQ_CALIB));
|
|
+ } else {
|
|
+ cec_standby(this);
|
|
+ }
|
|
+
|
|
+ return 0;
|
|
+
|
|
+i2c_out:
|
|
+ LOG(KERN_INFO, "HDMICEC eject: this->driver.i2c_client removed\n");
|
|
+ dl_hdmi_cec_close(this->cec.inst);
|
|
+ kfree(this->driver.i2c_client);
|
|
+ this->driver.i2c_client = NULL;
|
|
+
|
|
+ return err;
|
|
+}
|
|
+
|
|
+/*
|
|
+ * I2C client :: destroy
|
|
+ * */
|
|
+static int this_i2c_remove(struct i2c_client *client)
|
|
+{
|
|
+ cec_instance *this = &our_instance;
|
|
+ int err = 0;
|
|
+
|
|
+ LOG(KERN_INFO, "called\n");
|
|
+
|
|
+ err = dl_hdmi_cec_close(this->cec.inst);
|
|
+
|
|
+ if(!client->adapter) {
|
|
+ dev_err(&this->driver.i2c_client->dev, "<%s> no CEC device \n",
|
|
+ __func__);
|
|
+ return -ENODEV;
|
|
+ }
|
|
+ kfree(this->driver.i2c_client);
|
|
+ this->driver.i2c_client = NULL;
|
|
+
|
|
+ return err;
|
|
+}
|
|
+
|
|
+/*
|
|
+ * I2C client driver (backend)
|
|
+ * -----------------
|
|
+ * */
|
|
+static struct i2c_driver this_i2c_driver = {
|
|
+ .driver = {
|
|
+ .owner = THIS_MODULE,
|
|
+ .name = CEC_NAME,
|
|
+ },
|
|
+ .probe = this_i2c_probe,
|
|
+ .remove = this_i2c_remove,
|
|
+ .id_table = this_i2c_id,
|
|
+ };
|
|
+
|
|
+/*
|
|
+ * ioctl driver (userland frontend)
|
|
+ * ------------
|
|
+ * */
|
|
+static struct file_operations this_cdev_fops = {
|
|
+owner:
|
|
+ THIS_MODULE,
|
|
+open:
|
|
+ this_cdev_open,
|
|
+release:
|
|
+ this_cdev_release,
|
|
+ioctl:
|
|
+ this_cdev_ioctl,
|
|
+};
|
|
+
|
|
+/*
|
|
+ * Module :: start up
|
|
+ * */
|
|
+static int __init cec_init(void)
|
|
+{
|
|
+ cec_instance *this = &our_instance;
|
|
+ dev_t dev = 0;
|
|
+ int err = 0;
|
|
+
|
|
+ /*
|
|
+ * general device context
|
|
+ * */
|
|
+ memset(this, 0, sizeof(cec_instance));
|
|
+ this->param.verbose = param_verbose;
|
|
+ this->param.major = param_major;
|
|
+ this->param.minor = param_minor;
|
|
+
|
|
+ /* Hello word */
|
|
+ printk(KERN_INFO "%s(%s) %d.%d.%d compiled: %s %s %s\n", HDMICEC_NAME, TDA_NAME, TDA_VERSION_MAJOR,
|
|
+ TDA_VERSION_MINOR, TDA_VERSION_PATCHLEVEL, __DATE__, __TIME__, TDA_VERSION_EXTRA);
|
|
+ if(this->param.verbose) LOG(KERN_INFO, ".verbose mode\n");
|
|
+
|
|
+ /*
|
|
+ * plug I2C (backend : Hw interfacing)
|
|
+ * */
|
|
+ err = i2c_add_driver(&this_i2c_driver);
|
|
+ if(err < 0) {
|
|
+ printk(KERN_ERR "driver registration failed\n");
|
|
+ return -ENODEV;
|
|
+ }
|
|
+
|
|
+ if(this->driver.i2c_client == NULL) {
|
|
+ printk(KERN_ERR "this->driver.i2c_client not allocated\n");
|
|
+ err = -ENODEV;
|
|
+ goto init_out;
|
|
+ }
|
|
+
|
|
+ /*
|
|
+ * cdev init (userland frontend)
|
|
+ * */
|
|
+
|
|
+ /* arbitray range of device numbers */
|
|
+ if(this->param.major) {
|
|
+ /* user force major number @ insmod */
|
|
+ dev = MKDEV(this->param.major, this->param.minor);
|
|
+ err = register_chrdev_region(dev, MAX_MINOR, HDMICEC_NAME);
|
|
+ if(err) {
|
|
+ printk(KERN_ERR "unable to register %s, dev=%d %s\n", HDMICEC_NAME, dev, ERR_TO_STR(err));
|
|
+ goto init_out;
|
|
+ }
|
|
+ } else {
|
|
+ /* fully dynamic major number */
|
|
+ err = alloc_chrdev_region(&dev, this->param.minor, MAX_MINOR, HDMICEC_NAME);
|
|
+ if(err) {
|
|
+ printk(KERN_ERR "unable to alloc chrdev region for %s, dev=%d %s\n", HDMICEC_NAME, dev, ERR_TO_STR(err));
|
|
+ goto init_out;
|
|
+ }
|
|
+ this->param.major = MAJOR(dev);
|
|
+ }
|
|
+
|
|
+ cdev_init(this_cdev, &this_cdev_fops);
|
|
+ this_cdev->owner = THIS_MODULE;
|
|
+
|
|
+ this->driver.class = class_create(THIS_MODULE, HDMICEC_NAME);
|
|
+ if(IS_ERR(this->driver.class)) {
|
|
+ printk(KERN_INFO "error creating mmap device class.\n");
|
|
+ err = -EIO;
|
|
+ goto init_out;
|
|
+ }
|
|
+ this->driver.dev = device_create(this->driver.class, NULL, dev, NULL, HDMICEC_NAME);
|
|
+
|
|
+ this->driver.devno = dev;
|
|
+ err = cdev_add(this_cdev, this->driver.devno, MAX_MINOR);
|
|
+ if(err) {
|
|
+ printk(KERN_INFO "unable to add device for %s, ipp_driver.devno=%d %s\n", HDMICEC_NAME, this->driver.devno, ERR_TO_STR(err));
|
|
+ device_destroy(this->driver.class, this->driver.devno);
|
|
+ class_destroy(this->driver.class);
|
|
+ unregister_chrdev_region(this->driver.devno, MAX_MINOR);
|
|
+ goto init_out;
|
|
+ }
|
|
+
|
|
+#ifdef TWL4030_HACK
|
|
+ /* AL : hack to bypass keypad */
|
|
+ gkp_input = get_twm4030_input();
|
|
+#endif
|
|
+
|
|
+ /*
|
|
+ * general device context
|
|
+ * */
|
|
+ init_MUTEX(&this->driver.sem);
|
|
+ this->driver.deinit_req = 0;
|
|
+
|
|
+#if 0
|
|
+ /* TEST START */
|
|
+ {
|
|
+ struct device *dev, *devn;
|
|
+ struct kset *dev_kset;
|
|
+ int cpt = 0;
|
|
+
|
|
+ dev_kset = this->driver.dev->kobj.kset;
|
|
+ list_for_each_entry_safe_reverse(dev, devn, &dev_kset->list, kobj.entry) {
|
|
+ cpt++;
|
|
+ if((dev->bus_id[0] == 'h') \
|
|
+ && (dev->bus_id[1] == 'd') \
|
|
+ && (dev->bus_id[2] == 'm') \
|
|
+ && (dev->bus_id[3] == 'i')) {
|
|
+ printk("DBG -%s-\n", dev->bus_id);
|
|
+ }
|
|
+ }
|
|
+ printk("DBG get %d devices\n", cpt);
|
|
+ }
|
|
+ /* TEST STOP */
|
|
+#endif
|
|
+
|
|
+ return 0;
|
|
+
|
|
+init_out:
|
|
+ i2c_del_driver(&this_i2c_driver);
|
|
+ return err;
|
|
+}
|
|
+
|
|
+/*
|
|
+ * Module :: shut down
|
|
+ * */
|
|
+static void __exit cec_exit(void)
|
|
+{
|
|
+ cec_instance *this = &our_instance;
|
|
+
|
|
+ LOG(KERN_INFO, "called\n");
|
|
+
|
|
+#ifndef IRQ
|
|
+ free_irq(gpio_to_irq(TDA_IRQ_CALIB), NULL);
|
|
+#endif
|
|
+
|
|
+ unregister_cec_interrupt();
|
|
+ this->driver.deinit_req = 1;
|
|
+#ifndef IRQ
|
|
+ if(wait_event_interruptible(this->driver.wait, this->driver.deinit_req > 1)) {
|
|
+ /* oups... just wait... */
|
|
+ msleep(CHECK_EVERY_XX_MS * 20);
|
|
+ }
|
|
+#endif
|
|
+
|
|
+#ifndef IRQ
|
|
+ /* release GPIO */
|
|
+ gpio_free(TDA_IRQ_CALIB);
|
|
+#endif
|
|
+
|
|
+ /* unregister cdevice */
|
|
+ cdev_del(this_cdev);
|
|
+ unregister_chrdev_region(this->driver.devno, MAX_MINOR);
|
|
+
|
|
+ /* unregister device */
|
|
+ device_destroy(this->driver.class, this->driver.devno);
|
|
+ class_destroy(this->driver.class);
|
|
+
|
|
+ /* unregister i2c */
|
|
+ i2c_del_driver(&this_i2c_driver);
|
|
+
|
|
+}
|
|
+
|
|
+/*
|
|
+ * Module
|
|
+ * ------
|
|
+ * */
|
|
+/* late_initcall(cec_init); */
|
|
+module_init(cec_init);
|
|
+module_exit(cec_exit);
|
|
+
|
|
+/*
|
|
+ * Disclamer
|
|
+ * ---------
|
|
+ * */
|
|
+MODULE_LICENSE("GPL");
|
|
+MODULE_AUTHOR("andre lepine <andre.lepine@nxp.com>");
|
|
+MODULE_DESCRIPTION(HDMICEC_NAME " driver");
|
|
diff --git a/drivers/video/hdmi/tda998x_cec.h b/drivers/video/hdmi/tda998x_cec.h
|
|
new file mode 100644
|
|
index 0000000..4504d12
|
|
--- /dev/null
|
|
+++ b/drivers/video/hdmi/tda998x_cec.h
|
|
@@ -0,0 +1,140 @@
|
|
+/*****************************************************************************/
|
|
+/* Copyright (c) 2009 NXP Semiconductors BV */
|
|
+/* */
|
|
+/* This program is free software; you can redistribute it and/or modify */
|
|
+/* it under the terms of the GNU General Public License as published by */
|
|
+/* the Free Software Foundation, using version 2 of the License. */
|
|
+/* */
|
|
+/* This program is distributed in the hope that it will be useful, */
|
|
+/* but WITHOUT ANY WARRANTY; without even the implied warranty of */
|
|
+/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */
|
|
+/* GNU General Public License for more details. */
|
|
+/* */
|
|
+/* You should have received a copy of the GNU General Public License */
|
|
+/* along with this program; if not, write to the Free Software */
|
|
+/* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 */
|
|
+/* USA. */
|
|
+/* */
|
|
+/*****************************************************************************/
|
|
+
|
|
+#ifndef __cec_h__
|
|
+#define __cec_h__
|
|
+
|
|
+#include "tda998x_ioctl.h"
|
|
+
|
|
+#define HDMICEC_NAME "hdmicec"
|
|
+
|
|
+#define CEC_MAJOR 234 /* old-style interval of device numbers */
|
|
+#define MAX_MINOR 1 /* 1 minor but 2 access : 1 more for pooling */
|
|
+
|
|
+/* common I2C define with kernel */
|
|
+/* should be the same as arch/arm/mach-omap2/board-zoom2.c */
|
|
+#define CEC_NAME "tda99Xcec"
|
|
+#define TDA99XCEC_I2C_SLAVEADDRESS 0x34
|
|
+
|
|
+/* On gplugD GPIO # 36 is connected to CEC interrupt line */
|
|
+#define TDA_IRQ_CALIB 36
|
|
+#define POLLING_LENGTH 3
|
|
+
|
|
+#define EDID_BLOCK_COUNT 4
|
|
+#define EDID_BLOCK_SIZE 128
|
|
+
|
|
+#ifdef GPL
|
|
+#define CHECK_EVERY_XX_MS 500 /* ms */
|
|
+#else
|
|
+#define CHECK_EVERY_XX_MS 10 /* ms */
|
|
+#endif
|
|
+
|
|
+#define LOG(type,fmt,args...) {if (this->param.verbose) {printk(type HDMICEC_NAME":%s:" fmt, __func__, ## args);}}
|
|
+/* not found the kernel "strerror" one! If someone knows, please replace it */
|
|
+#define ERR_TO_STR(e)((e == -ENODATA)?"ENODATA, no data available":\
|
|
+ (e == -ENOMEM)? "ENOMEM, no memory available":\
|
|
+ (e == -EINVAL)? "EINVAL, invalid argument":\
|
|
+ (e == -EIO)? "EIO, input/output error":\
|
|
+ (e == -ETIMEDOUT)? "ETIMEOUT, timeout has expired":\
|
|
+ (e == -EBUSY)? "EBUSY, device or resource busy":\
|
|
+ (e == -ENOENT)? "ENOENT, no such file or directory":\
|
|
+ (e == -EACCES)? "EACCES, permission denied":\
|
|
+ (e == 0)? "":\
|
|
+ "!UNKNOWN!")
|
|
+
|
|
+#define TRY(fct) do { \
|
|
+ err=(fct); \
|
|
+ if (err) { \
|
|
+ printk(KERN_ERR "%s? in %s line %d\n",hdmi_cec_err_string(err),__func__,__LINE__); \
|
|
+ goto TRY_DONE; \
|
|
+ } \
|
|
+ }while(0)
|
|
+
|
|
+typedef void (*cec_callback_t)(struct work_struct *dummy);
|
|
+
|
|
+typedef struct {
|
|
+ /* module params */
|
|
+ struct {
|
|
+ int verbose;
|
|
+ int major;
|
|
+ int minor;
|
|
+ } param;
|
|
+ /* driver */
|
|
+ struct {
|
|
+ struct class *class;
|
|
+ struct device *dev;
|
|
+ int devno;
|
|
+ struct i2c_client *i2c_client;
|
|
+ struct semaphore sem;
|
|
+ int user_counter;
|
|
+ int minor;
|
|
+ wait_queue_head_t wait;
|
|
+ bool poll_done;
|
|
+ int deinit_req;
|
|
+ struct timer_list timer;
|
|
+ } driver;
|
|
+ /* cec */
|
|
+ struct {
|
|
+ int inst;
|
|
+ unsigned char rx_addr;
|
|
+ unsigned short phy_addr;
|
|
+ unsigned char initiator;
|
|
+ cec_version version;
|
|
+ cec_sw_version sw_version;
|
|
+ cec_power power;
|
|
+ cec_setup setup;
|
|
+ cec_clock clock;
|
|
+ cec_analogue_timer analog_timer;
|
|
+ cec_digital_timer digital_timer;
|
|
+ cec_ext_timer_with_ext_plug etwep;
|
|
+ cec_ext_timer_with_phy_addr etwpa;
|
|
+ cec_deck_ctrl deck_ctrl;
|
|
+ cec_deck_status deck_status;
|
|
+ unsigned long vendor_id;
|
|
+ cec_feature_abort feature_abort;
|
|
+ cec_status_request satus_request;
|
|
+ cec_menu_request menu_request;
|
|
+ cec_menu_status menu_status;
|
|
+ cec_play play;
|
|
+ cec_analogue_service analog_service;
|
|
+ cec_digital_service digital_service;
|
|
+ cec_ext_plug ext_plug;
|
|
+ cec_rec_status rec_status;
|
|
+ cec_audio_status audio_status;
|
|
+ cec_device_type device_type;
|
|
+ cec_power_status source_status;
|
|
+ cec_audio_rate audio_rate;
|
|
+ cec_sys_audio_status sys_audio_status;
|
|
+ cec_timer_cleared_status timer_cleared_status;
|
|
+ cec_timer_status timer_status;
|
|
+ cec_tuner_device_status_analogue tdsa;
|
|
+ cec_tuner_device_status_digital tdsd;
|
|
+ cec_user_ctrl user_ctrl;
|
|
+ unsigned char select;
|
|
+ cec_user_ctrl_tune user_ctrl_tune;
|
|
+ cec_frame frame;
|
|
+ bool byebye;
|
|
+ cec_string string;
|
|
+ cec_string osd_name;
|
|
+ cec_osd_string osd_string;
|
|
+ cec_vendor_command_with_id vcwi;
|
|
+ } cec;
|
|
+} cec_instance;
|
|
+
|
|
+#endif /* __cec_h__ */
|
|
diff --git a/drivers/video/hdmi/tda998x_ioctl.h b/drivers/video/hdmi/tda998x_ioctl.h
|
|
new file mode 100644
|
|
index 0000000..fc8f3c9
|
|
--- /dev/null
|
|
+++ b/drivers/video/hdmi/tda998x_ioctl.h
|
|
@@ -0,0 +1,1142 @@
|
|
+/**
|
|
+ * Copyright (C) 2006 NXP N.V., All Rights Reserved.
|
|
+ * This source code and any compilation or derivative thereof is the proprietary
|
|
+ * information of NXP N.V. and is confidential in nature. Under no circumstances
|
|
+ * is this software to be exposed to or placed under an Open Source License of
|
|
+ * any type without the expressed written permission of NXP N.V.
|
|
+ *
|
|
+ * Version Revision: 1.0
|
|
+ *
|
|
+ * Date Date: 27/10/09
|
|
+ *
|
|
+ * Brief API for the TDA1998x HDMI Transmitters
|
|
+ *
|
|
+ **/
|
|
+
|
|
+#include <linux/types.h>
|
|
+
|
|
+#ifndef __tx_ioctl__
|
|
+#define __tx_ioctl__
|
|
+
|
|
+#ifdef __tx_h__
|
|
+
|
|
+#define TRANS_TYPE 1
|
|
+
|
|
+#if TRANS_TYPE
|
|
+
|
|
+#define EXAMPLE_MAX_SVD 30
|
|
+
|
|
+/*
|
|
+ * trans-type
|
|
+ * */
|
|
+typedef swversion_t tda_version;
|
|
+typedef power_state_t tda_power;
|
|
+typedef tx_instance_setup_info_t tda_setup;
|
|
+typedef tx_capabilities_t tda_capabilities;
|
|
+typedef tx_video_out_config_t tda_video_out;
|
|
+typedef tx_video_in_config_t tda_video_in;
|
|
+typedef tx_sink_type_t tda_sink;
|
|
+typedef tx_audio_in_config_t tda_audio_in;
|
|
+typedef tx_edid_audio_desc_t tda_edid_audio_desc;
|
|
+typedef tx_short_vid_desc_t tda_edid_video_desc;
|
|
+typedef tx_event_t tda_event;
|
|
+typedef tx_instance_setup_info_t tda_setup_info;
|
|
+typedef tx_edid_video_timings_t tda_edid_video_timings;
|
|
+typedef tx_pict_aspect_ratio_t tda_edid_tv_aspect_ratio;
|
|
+typedef tx_hdcp_check_t tda_hdcp_status;
|
|
+#if defined (TMFL_TDA19989) || defined (TMFL_TDA9984)
|
|
+typedef tx_hdcp_status_t tda_hdcp_fail;
|
|
+#endif
|
|
+#ifdef TMFL_TDA19989
|
|
+typedef tx_edid_latency_t tda_edid_latency;
|
|
+#endif
|
|
+
|
|
+typedef struct {
|
|
+ bool enable;
|
|
+ tx_gamut_data_t data;
|
|
+} tda_gammut;
|
|
+
|
|
+typedef struct {
|
|
+ bool enable;
|
|
+ tx_vs_pkt_data_t data;
|
|
+} tda_vs_infoframe;
|
|
+
|
|
+typedef struct {
|
|
+ bool enable;
|
|
+ tx_spd_if_data_t data;
|
|
+} tda_spd_infoframe;
|
|
+
|
|
+typedef struct {
|
|
+ bool enable;
|
|
+ tx_mps_if_data_t data;
|
|
+} tda_mps_infoframe;
|
|
+
|
|
+typedef struct {
|
|
+ bool enable;
|
|
+ tx_isrc1pkt_data_t data;
|
|
+} tda_isrc1;
|
|
+
|
|
+typedef struct {
|
|
+ bool enable;
|
|
+ tx_isrc2pkt_data_t data;
|
|
+} tda_isrc2;
|
|
+
|
|
+typedef struct {
|
|
+ bool enable;
|
|
+ tx_acp_pkt_data_t data;
|
|
+} tda_acp;
|
|
+
|
|
+typedef struct {
|
|
+ bool enable;
|
|
+ tx_gcp_pkt_data_t data;
|
|
+} tda_gcp;
|
|
+
|
|
+typedef struct {
|
|
+ bool enable;
|
|
+ tx_avi_if_data_t data;
|
|
+} tda_video_infoframe;
|
|
+
|
|
+typedef struct {
|
|
+ bool enable;
|
|
+ tx_aud_if_data_t data;
|
|
+} tda_audio_infoframe;
|
|
+
|
|
+typedef struct {
|
|
+ tx_vid_fmt_t id;
|
|
+ tx_vid_fmt_specs_t spec;
|
|
+} tda_video_format;
|
|
+
|
|
+typedef struct {
|
|
+ tda_video_in video_in;
|
|
+ tda_video_out video_out;
|
|
+ tda_audio_in audio_in; /* Mind tda_set_audio_in if you change this */
|
|
+ tda_sink sink; /* Mind tda_set_audio_in if you change this */
|
|
+} tda_set_in_out;
|
|
+
|
|
+typedef struct {
|
|
+ tda_audio_in audio_in;
|
|
+ tda_sink sink;
|
|
+} tda_set_audio_in;
|
|
+
|
|
+typedef struct {
|
|
+ tda_edid_audio_desc desc[EXAMPLE_MAX_SVD];
|
|
+ unsigned int max;
|
|
+ unsigned int written;
|
|
+ unsigned char flags;
|
|
+} tda_edid_audio_caps;
|
|
+
|
|
+typedef struct {
|
|
+ tda_edid_video_desc desc[EXAMPLE_MAX_SVD];
|
|
+ unsigned int max;
|
|
+ unsigned int written;
|
|
+ unsigned char flags;
|
|
+} tda_edid_video_caps;
|
|
+
|
|
+typedef struct {
|
|
+ tx_edid_status_t status;
|
|
+ unsigned char block_count;
|
|
+} tda_edid;
|
|
+
|
|
+typedef struct {
|
|
+ tx_edid_video_timings_t desc[EXAMPLE_MAX_SVD];
|
|
+ unsigned char max;
|
|
+ unsigned char written;
|
|
+} tda_edid_dtd;
|
|
+
|
|
+typedef struct {
|
|
+ tx_edid_first_md_t desc1[EXAMPLE_MAX_SVD];
|
|
+ tx_edid_second_md_t desc2[EXAMPLE_MAX_SVD];
|
|
+ tx_edid_other_md_t other[EXAMPLE_MAX_SVD];
|
|
+ unsigned char max;
|
|
+ unsigned char written;
|
|
+} tda_edid_md;
|
|
+
|
|
+#else
|
|
+
|
|
+#error do not compiled this !
|
|
+
|
|
+typedef enum {
|
|
+ /**< HDCP encryption status switched to active */
|
|
+ TDA_HDCP_ACTIVE = 0,
|
|
+ /**< HDCP encryption status switched to inactive */
|
|
+ TDA_HDCP_INACTIVE = 1,
|
|
+ TDA_HPD_ACTIVE = 2, /**< Hotplug status switched to active */
|
|
+ TDA_HPD_INACTIVE = 3, /**< Hotplug status switched to inactive */
|
|
+ TDA_RX_KEYS_RECEIVED = 4, /**< Receiver(s) key(s) received */
|
|
+ TDA_RX_DEVICE_ACTIVE = 5, /**< Rx device is connected and active */
|
|
+ /**< Rx device is connected but inactive (standby) */
|
|
+ TDA_RX_DEVICE_INACTIVE = 6,
|
|
+ TDA_EDID_RECEIVED = 7, /**< EDID has been received */
|
|
+ TDA_VS_RPT_RECEIVED = 8, /**< VS interrupt has been received */
|
|
+#ifdef HDMI_TX_REPEATER_ISR_MODE
|
|
+ TDA_B_STATUS = 9, /**< TX received BStatus */
|
|
+#endif /* HDMI_TX_REPEATER_ISR_MODE */
|
|
+ TDA_DEBUG_EVENT_1 = 10 /**< This is a debug event */
|
|
+} tda_event;
|
|
+
|
|
+typedef struct {
|
|
+ unsigned char format; /* EIA/CEA861 mode */
|
|
+ unsigned char channels; /* number of channels */
|
|
+ unsigned char supported_freqs; /* bitmask of supported frequencies */
|
|
+ /* bitmask of supported resolutions (LPCM only) */
|
|
+ unsigned char supported_res;
|
|
+ /* Maximum bitrate divided by 8KHz (compressed formats only) */
|
|
+ unsigned char max_bitrate;
|
|
+} tda_edid_audio_desc;
|
|
+
|
|
+typedef enum {
|
|
+ TDA_EDID_READ = 0, /**< All blocks read OK */
|
|
+ /**< All blocks read OK but buffer too small to return all of them */
|
|
+ TDA_EDID_READ_INCOMPLETE = 1,
|
|
+ TDA_EDID_ERROR_CHK_BLOCK_0 = 2, /**< Block 0 checksum error */
|
|
+ /**< Block 0 OK, checksum error in one or more other blocks */
|
|
+ TDA_EDID_ERROR_CHK = 3,
|
|
+ TDA_EDID_NOT_READ = 4, /**< EDID not read */
|
|
+ TDA_EDID_STATUS_INVALID = 5 /**< Invalid */
|
|
+} tda_edid_status;
|
|
+
|
|
+typedef struct {
|
|
+ int HBR; /**< High Bitrate Audio packet */
|
|
+ int DST; /**< Direct Stream Transport audio packet */
|
|
+ int one_bit_audio; /**< One Bit Audio sample packet */
|
|
+} tda_audio_packet;
|
|
+
|
|
+typedef enum {
|
|
+ TDA_AFMT_SPDIF = 0, /**< SPDIF */
|
|
+ TDA_AFMT_I2S = 1, /**< I2S */
|
|
+ TDA_AFMT_OBA = 2, /**< One bit audio / DSD */
|
|
+ TDA_AFMT_DST = 3, /**< DST */
|
|
+ TDA_AFMT_HBR = 4 /**< HBR */
|
|
+} tda_audio_format;
|
|
+
|
|
+typedef enum {
|
|
+ TDA_AFS_32K = 0, /**< 32kHz */
|
|
+ TDA_AFS_44K = 1, /**< 44.1kHz */
|
|
+ TDA_AFS_48K = 2, /**< 48kHz */
|
|
+ TDA_AFS_88K = 3, /**< 88.2kHz */
|
|
+ TDA_AFS_96K = 4, /**< 96kHz */
|
|
+ TDA_AFS_176K = 5, /**< 176.4kHz */
|
|
+ TDA_AFS_192K = 6 /**< 192kHz */
|
|
+} tda_audio_rate;
|
|
+
|
|
+typedef enum {
|
|
+ TDA_I2SQ_16BITS = 16, /**< 16 bits */
|
|
+ TDA_I2SQ_32BITS = 32, /**< 32 bits */
|
|
+ TDA_I2SQ_OTHERS = 0 /**< for SPDIF and DSD */
|
|
+} tda_audio_i2s_qualifier;
|
|
+
|
|
+typedef enum {
|
|
+ TDA_I2SFOR_PHILIPS_L = 0, /**< Philips like format */
|
|
+ TDA_I2SFOR_OTH_L = 2, /**< Other non Philips left justified */
|
|
+ TDA_I2SFOR_OTH_R = 3, /**< Other non Philips right justified */
|
|
+ TDA_I2SFOR_INVALID = 4 /**< Invalid format */
|
|
+} tda_audio_i2s_format;
|
|
+
|
|
+typedef enum {
|
|
+ TDA_DSTRATE_SINGLE = 0, /**< Single transfer rate */
|
|
+ TDA_DSTRATE_DOUBLE = 1 /**< Double data rate */
|
|
+} tda_dst_rate;
|
|
+
|
|
+typedef struct {
|
|
+ int simplay_hd; /**< Enable simplayHD support */
|
|
+ int repeater_enable; /**< Enable repeater mode */
|
|
+ unsigned char *p_edid_buffer; /**< Pointer to raw EDID data */
|
|
+ /**< Size of buffer for raw EDID data */
|
|
+ unsigned long edid_buffer_size;
|
|
+} tda_instance_setup_info;
|
|
+
|
|
+typedef enum {
|
|
+ TDA_VFMT_NULL = 0, /**< Not a valid format... */
|
|
+ TDA_VFMT_NO_CHANGE = 0, /**< ...or no change required */
|
|
+ TDA_VFMT_MIN = 1, /**< Lowest valid format */
|
|
+ TDA_VFMT_TV_MIN = 1, /**< Lowest valid TV format */
|
|
+ tda_vfmt_01_640x480p_60hz = 1, /**< Format 01 640 x 480p 60Hz */
|
|
+ tda_vfmt_02_720x480p_60hz = 2, /**< Format 02 720 x 480p 60Hz */
|
|
+ tda_vfmt_03_720x480p_60hz = 3, /**< Format 03 720 x 480p 60Hz */
|
|
+ tda_vfmt_04_1280x720p_60hz = 4, /**< Format 04 1280 x 720p 60Hz */
|
|
+ tda_vfmt_05_1920x1080i_60hz = 5, /**< Format 05 1920 x 1080i 60Hz */
|
|
+ tda_vfmt_06_720x480i_60hz = 6, /**< Format 06 720 x 480i 60Hz */
|
|
+ tda_vfmt_07_720x480i_60hz = 7, /**< Format 07 720 x 480i 60Hz */
|
|
+ tda_vfmt_08_720x240p_60hz = 8, /**< Format 08 720 x 240p 60Hz */
|
|
+ tda_vfmt_09_720x240p_60hz = 9, /**< Format 09 720 x 240p 60Hz */
|
|
+ tda_vfmt_10_720x480i_60hz = 10, /**< Format 10 720 x 480i 60Hz */
|
|
+ tda_vfmt_11_720x480i_60hz = 11, /**< Format 11 720 x 480i 60Hz */
|
|
+ tda_vfmt_12_720x240p_60hz = 12, /**< Format 12 720 x 240p 60Hz */
|
|
+ tda_vfmt_13_720x240p_60hz = 13, /**< Format 13 720 x 240p 60Hz */
|
|
+ tda_vfmt_14_1440x480p_60hz = 14, /**< Format 14 1440 x 480p 60Hz */
|
|
+ tda_vfmt_15_1440x480p_60hz = 15, /**< Format 15 1440 x 480p 60Hz */
|
|
+ tda_vfmt_16_1920x1080p_60hz = 16, /**< Format 16 1920 x 1080p 60Hz */
|
|
+ tda_vfmt_17_720x576p_50hz = 17, /**< Format 17 720 x 576p 50Hz */
|
|
+ tda_vfmt_18_720x576p_50hz = 18, /**< Format 18 720 x 576p 50Hz */
|
|
+ tda_vfmt_19_1280x720p_50hz = 19, /**< Format 19 1280 x 720p 50Hz */
|
|
+ tda_vfmt_20_1920x1080i_50hz = 20, /**< Format 20 1920 x 1080i 50Hz */
|
|
+ tda_vfmt_21_720x576i_50hz = 21, /**< Format 21 720 x 576i 50Hz */
|
|
+ tda_vfmt_22_720x576i_50hz = 22, /**< Format 22 720 x 576i 50Hz */
|
|
+ tda_vfmt_23_720x288p_50hz = 23, /**< Format 23 720 x 288p 50Hz */
|
|
+ tda_vfmt_24_720x288p_50hz = 24, /**< Format 24 720 x 288p 50Hz */
|
|
+ tda_vfmt_25_720x576i_50hz = 25, /**< Format 25 720 x 576i 50Hz */
|
|
+ tda_vfmt_26_720x576i_50hz = 26, /**< Format 26 720 x 576i 50Hz */
|
|
+ tda_vfmt_27_720x288p_50hz = 27, /**< Format 27 720 x 288p 50Hz */
|
|
+ tda_vfmt_28_720x288p_50hz = 28, /**< Format 28 720 x 288p 50Hz */
|
|
+ tda_vfmt_29_1440x576p_50hz = 29, /**< Format 29 1440 x 576p 50Hz */
|
|
+ tda_vfmt_30_1440x576p_50hz = 30, /**< Format 30 1440 x 576p 50Hz */
|
|
+ tda_vfmt_31_1920x1080p_50hz = 31, /**< Format 31 1920 x 1080p 50Hz */
|
|
+ tda_vfmt_32_1920x1080p_24hz = 32, /**< Format 32 1920 x 1080p 24Hz */
|
|
+ tda_vfmt_33_1920x1080p_25hz = 33, /**< Format 33 1920 x 1080p 25Hz */
|
|
+ tda_vfmt_34_1920x1080p_30hz = 34, /**< Format 34 1920 x 1080p 30Hz */
|
|
+ TDA_VFMT_TV_MAX = 34, /**< Highest valid TV format */
|
|
+ /**< Lowest TV format without prefetched table */
|
|
+ TDA_VFMT_TV_NO_REG_MIN = 32,
|
|
+ TDA_VFMT_TV_NUM = 35, /**< Number of TV formats & null */
|
|
+ TDA_VFMT_PC_MIN = 128, /**< Lowest valid PC format */
|
|
+ tda_vfmt_pc_640x480p_60hz = 128, /**< PC format 128 */
|
|
+ tda_vfmt_pc_800x600p_60hz = 129, /**< PC format 129 */
|
|
+ tda_vfmt_pc_1152x960p_60hz = 130, /**< PC format 130 */
|
|
+ tda_vfmt_pc_1024x768p_60hz = 131, /**< PC format 131 */
|
|
+ tda_vfmt_pc_1280x768p_60hz = 132, /**< PC format 132 */
|
|
+ tda_vfmt_pc_1280x1024p_60hz = 133, /**< PC format 133 */
|
|
+ tda_vfmt_pc_1360x768p_60hz = 134, /**< PC format 134 */
|
|
+ tda_vfmt_pc_1400x1050p_60hz = 135, /**< PC format 135 */
|
|
+ tda_vfmt_pc_1600x1200p_60hz = 136, /**< PC format 136 */
|
|
+ tda_vfmt_pc_1024x768p_70hz = 137, /**< PC format 137 */
|
|
+ tda_vfmt_pc_640x480p_72hz = 138, /**< PC format 138 */
|
|
+ tda_vfmt_pc_800x600p_72hz = 139, /**< PC format 139 */
|
|
+ tda_vfmt_pc_640x480p_75hz = 140, /**< PC format 140 */
|
|
+ tda_vfmt_pc_1024x768p_75hz = 141, /**< PC format 141 */
|
|
+ tda_vfmt_pc_800x600p_75hz = 142, /**< PC format 142 */
|
|
+ tda_vfmt_pc_1024x864p_75hz = 143, /**< PC format 143 */
|
|
+ tda_vfmt_pc_1280x1024p_75hz = 144, /**< PC format 144 */
|
|
+ tda_vfmt_pc_640x350p_85hz = 145, /**< PC format 145 */
|
|
+ tda_vfmt_pc_640x400p_85hz = 146, /**< PC format 146 */
|
|
+ tda_vfmt_pc_720x400p_85hz = 147, /**< PC format 147 */
|
|
+ tda_vfmt_pc_640x480p_85hz = 148, /**< PC format 148 */
|
|
+ tda_vfmt_pc_800x600p_85hz = 149, /**< PC format 149 */
|
|
+ tda_vfmt_pc_1024x768p_85hz = 150, /**< PC format 150 */
|
|
+ tda_vfmt_pc_1152x864p_85hz = 151, /**< PC format 151 */
|
|
+ tda_vfmt_pc_1280x960p_85hz = 152, /**< PC format 152 */
|
|
+ tda_vfmt_pc_1280x1024p_85hz = 153, /**< PC format 153 */
|
|
+ tda_vfmt_pc_1024x768i_87hz = 154, /**< PC format 154 */
|
|
+ TDA_VFMT_PC_MAX = 154, /**< Highest valid PC format */
|
|
+ /**< Number of PC formats */
|
|
+ TDA_VFMT_PC_NUM = (1 + 154 - 128)
|
|
+} tda_video_fmt_id;
|
|
+
|
|
+typedef struct {
|
|
+ /**< Video format as defined by EIA/CEA 861-D */
|
|
+ tda_video_fmt_id video_format;
|
|
+ /**< true if format is the preferred video format */
|
|
+ int native_video_format;
|
|
+} tda_edid_video_desc;
|
|
+
|
|
+typedef struct {
|
|
+ /**< Video format as defined by EIA/CEA 861-D */
|
|
+ tda_video_fmt_id video_format;
|
|
+ /**< true if format is the preferred video format */
|
|
+ int native_video_format;
|
|
+} tda_short_video_desc;
|
|
+
|
|
+typedef enum {
|
|
+ /**< Undefined picture aspect ratio */
|
|
+ TDA_P_ASPECT_RATIO_UNDEFINED = 0,
|
|
+ /**< 6:5 picture aspect ratio (PAR) */
|
|
+ TDA_P_ASPECT_RATIO_6_5 = 1,
|
|
+ TDA_P_ASPECT_RATIO_5_4 = 2, /**< 5:4 PAR */
|
|
+ TDA_P_ASPECT_RATIO_4_3 = 3, /**< 4:3 PAR */
|
|
+ TDA_P_ASPECT_RATIO_16_10 = 4, /**< 16:10 PAR */
|
|
+ TDA_P_ASPECT_RATIO_5_3 = 5, /**< 5:3 PAR */
|
|
+ TDA_P_ASPECT_RATIO_16_9 = 6, /**< 16:9 PAR */
|
|
+ TDA_P_ASPECT_RATIO_9_5 = 7 /**< 9:5 PAR */
|
|
+} tda_pict_aspect_ratio;
|
|
+
|
|
+typedef enum {
|
|
+ tda_vfreq_24hz = 0, /**< 24Hz */
|
|
+ tda_vfreq_25hz = 1, /**< 25Hz */
|
|
+ tda_vfreq_30hz = 2, /**< 30Hz */
|
|
+ tda_vfreq_50hz = 3, /**< 50Hz */
|
|
+ tda_vfreq_59hz = 4, /**< 59.94Hz */
|
|
+ tda_vfreq_60hz = 5, /**< 60Hz */
|
|
+ tda_vfreq_70hz = 6, /**< 70Hz */
|
|
+ tda_vfreq_72hz = 7, /**< 72Hz */
|
|
+ tda_vfreq_75hz = 8, /**< 75Hz */
|
|
+ tda_vfreq_85hz = 9, /**< 85Hz */
|
|
+ tda_vfreq_87hz = 10, /**< 87Hz */
|
|
+ TDA_VFREQ_INVALID = 11, /**< Invalid */
|
|
+ TDA_VFREQ_NUM = 11 /**< No. of values */
|
|
+} tda_vfreq;
|
|
+
|
|
+typedef struct {
|
|
+ /**< Width of the frame in pixels */
|
|
+ unsigned short width;
|
|
+ /**< Height of the frame in pixels */
|
|
+ unsigned short height;
|
|
+ /**< Interlaced mode (true/false) */
|
|
+ int interlaced;
|
|
+ tda_vfreq vfrequency; /**< Vertical frequency in Hz */
|
|
+ tda_pict_aspect_ratio aspect_ratio; /**< Picture aspect ratio (H:V) */
|
|
+} tda_video_fmt_specs;
|
|
+
|
|
+typedef enum {
|
|
+ TDA_VINMODE_CCIR656 = 0, /**< CCIR656 */
|
|
+ TDA_VINMODE_RGB444 = 1, /**< RGB444 */
|
|
+ TDA_VINMODE_YUV444 = 2, /**< YUV444 */
|
|
+ TDA_VINMODE_YUV422 = 3, /**< YUV422 */
|
|
+ TDA_VINMODE_NO_CHANGE = 4, /**< No change */
|
|
+ TDA_VINMODE_INVALID = 5 /**< Invalid */
|
|
+} tda_vinmode;
|
|
+
|
|
+typedef enum {
|
|
+ TDA_SYNCSRC_EMBEDDED = 0, /**< Embedded sync */
|
|
+ TDA_SYNCSRC_EXT_VREF = 1, /**< External sync Vref, Href, Fref */
|
|
+ TDA_SYNCSRC_EXT_VS = 2 /**< External sync Vs, Hs */
|
|
+} tda_sync_source;
|
|
+
|
|
+typedef enum {
|
|
+ TDA_PIXRATE_DOUBLE = 0, /**< Double pixel rate */
|
|
+ TDA_PIXRATE_SINGLE = 1, /**< Single pixel rate */
|
|
+ TDA_PIXRATE_SINGLE_REPEATED = 2 /**< Single pixel repeated */
|
|
+} tda_pix_rate;
|
|
+
|
|
+typedef struct {
|
|
+ /**< Video format as defined by EIA/CEA 861-D */
|
|
+ tda_video_fmt_id format;
|
|
+ tda_vinmode mode; /**< Video mode (CCIR, RGB, YUV, etc.) */
|
|
+ tda_sync_source sync_source; /**< Sync source type */
|
|
+ tda_pix_rate pixel_rate; /**< Pixel rate */
|
|
+} tda_video_in;
|
|
+
|
|
+typedef enum {
|
|
+ TDA_VOUTMODE_RGB444 = 0, /**< RGB444 */
|
|
+ TDA_VOUTMODE_YUV422 = 1, /**< YUV422 */
|
|
+ TDA_VOUTMODE_YUV444 = 2 /**< YUV444 */
|
|
+} tda_vout_mode;
|
|
+
|
|
+typedef enum {
|
|
+ TDA_VQR_DEFAULT = 0, /* Follow HDMI spec. */
|
|
+ TDA_RGB_FULL = 1, /* Force RGB FULL , DVI only */
|
|
+ TDA_RGB_LIMITED = 2 /* Force RGB LIMITED , DVI only */
|
|
+} tda_vqr;
|
|
+
|
|
+typedef enum {
|
|
+ TDA_COLORDEPTH_24 = 0, /**< 8 bits per color */
|
|
+ TDA_COLORDEPTH_30 = 1, /**< 10 bits per color */
|
|
+ TDA_COLORDEPTH_36 = 2, /**< 12 bits per color */
|
|
+ TDA_COLORDEPTH_48 = 3 /**< 16 bits per color */
|
|
+} tda_color_depth;
|
|
+
|
|
+typedef struct {
|
|
+ /**< Video format as defined by EIA/CEA 861-D */
|
|
+ tda_video_fmt_id format;
|
|
+ tda_vout_mode mode; /**< Video mode (CCIR, RGB, YUV, etc.) */
|
|
+ tda_color_depth color_depth; /**< Color depth */
|
|
+ tda_vqr dvi_vqr; /**< VQR applied in DVI mode */
|
|
+} tda_video_out;
|
|
+
|
|
+typedef struct {
|
|
+ /**< Audio format (I2S, SPDIF, etc.) */
|
|
+ tda_audio_format format;
|
|
+ tda_audio_rate rate; /**< Audio sampling rate */
|
|
+ /**< I2S format of the audio input */
|
|
+ tda_audio_i2s_format i2s_format;
|
|
+ /**< I2S qualifier of the audio input (8,16,32 bits) */
|
|
+ tda_audio_i2s_qualifier i2s_qualifier;
|
|
+ /**< DST data transfer rate */
|
|
+ tda_dst_rate dst_rate;
|
|
+ /**< Ref to CEA-861D p85 */
|
|
+ unsigned char channel_allocation;
|
|
+} tda_audio_in;
|
|
+
|
|
+typedef enum {
|
|
+ TDA_SINK_DVI = 0, /**< DVI */
|
|
+ TDA_SINK_HDMI = 1, /**< HDMI */
|
|
+ TDA_SINK_EDID = 2 /**< As currently defined in EDID */
|
|
+} tda_sink;
|
|
+
|
|
+typedef enum {
|
|
+ TDA_DEVICE_UNKNOWN, /**< HW device is unknown */
|
|
+ TDA_DEVICE_TDA9984, /**< HW device is IC TDA9984 */
|
|
+ TDA_DEVICE_TDA9989, /**< HW device is IC TDA9989 */
|
|
+ TDA_DEVICE_TDA9981, /**< HW device is IC TDA9981 */
|
|
+ TDA_DEVICE_TDA9983, /**< HW device is IC TDA9983 */
|
|
+ TDA_DEVICE_TDA19989 /**< HW device is IC TDA19989 */
|
|
+} tda_device_version;
|
|
+
|
|
+typedef enum {
|
|
+ TDA_HDMI_VERSION_UNKNOWN, /**< Unknown */
|
|
+ TDA_HDMI_VERSION_1_1, /**< HDMI 1.1 */
|
|
+ tda_hdmi_version_1_2a, /**< HDMI 1.2a */
|
|
+ tda_hdmi_version_1_3a /**< HDMI 1.3 */
|
|
+} tda_hdmi_version;
|
|
+
|
|
+typedef struct {
|
|
+ int HBR; /**< High Bitrate Audio packet */
|
|
+ int DST; /**< Direct Stream Transport audio packet */
|
|
+ int one_bit_audio; /**< One Bit Audio sample packet */
|
|
+} tda_audio_packet;
|
|
+
|
|
+typedef enum {
|
|
+ TDA_COLORDEPTH_24 = 0, /**< 8 bits per color */
|
|
+ TDA_COLORDEPTH_30 = 1, /**< 10 bits per color */
|
|
+ TDA_COLORDEPTH_36 = 2, /**< 12 bits per color */
|
|
+ TDA_COLORDEPTH_48 = 3 /**< 16 bits per color */
|
|
+} tda_color_depth;
|
|
+
|
|
+typedef struct {
|
|
+ tda_device_version device_version; /**< HW device version */
|
|
+ tda_hdmi_version hdmi_version; /**< Supported HDMI standard version */
|
|
+ tda_audio_packet audio_packet; /**< Supported audio packets */
|
|
+ tda_color_depth color_depth; /**< Supported color depth */
|
|
+ int hdcp; /**< Supported Hdcp encryption (true/false) */
|
|
+ int scaler; /**< Supported scaler (true/false) */
|
|
+} tda_capabilities;
|
|
+
|
|
+typedef struct {
|
|
+ unsigned long compatibility_nr; /* Interface compatibility number */
|
|
+ /* Interface major version number */
|
|
+ unsigned long major_version_nr;
|
|
+ /* Interface minor version number */
|
|
+ unsigned long minor_version_nr;
|
|
+} tda_version;
|
|
+
|
|
+typedef enum {
|
|
+ power_on, /* Device powered on (D0 state) */
|
|
+ power_standby, /* Device power standby (D1 state) */
|
|
+ power_suspend, /* Device power suspended (D2 state) */
|
|
+ power_off /* Device powered off (D3 state) */
|
|
+} tda_power_xxx;
|
|
+
|
|
+typedef struct {
|
|
+ unsigned int simplay_hd; /**< Enable simplayHD support */
|
|
+ unsigned int repeater_enable; /**< Enable repeater mode */
|
|
+ unsigned char *p_edid_buffer; /**< Pointer to raw EDID data */
|
|
+ /**< Size of buffer for raw EDID data */
|
|
+ unsigned long edid_buffer_size;
|
|
+} tda_setup;
|
|
+
|
|
+typedef struct {
|
|
+ tda_video_fmt_id id;
|
|
+ tda_video_fmt_specs spec;
|
|
+} tda_video_format;
|
|
+
|
|
+typedef struct {
|
|
+ tda_video_in video_in;
|
|
+ tda_video_out video_out;
|
|
+ tda_audio_in audio_in;
|
|
+} tda_set_in_out;
|
|
+
|
|
+typedef struct {
|
|
+ tda_edid_audio_desc desc;
|
|
+ unsigned int max;
|
|
+ unsigned int written;
|
|
+ unsigned char flags;
|
|
+} tda_edid_audio_caps;
|
|
+
|
|
+typedef struct {
|
|
+ tda_edid_video_desc desc;
|
|
+ unsigned int max;
|
|
+ unsigned int written;
|
|
+ unsigned char flags;
|
|
+} tda_edid_video_caps;
|
|
+
|
|
+typedef struct {
|
|
+ tda_edid_status status;
|
|
+ unsigned char block_count;
|
|
+} tda_edid;
|
|
+
|
|
+#endif
|
|
+
|
|
+#define TDA_IOCTL_BASE 0x40
|
|
+#define RELEASE 0xFF
|
|
+
|
|
+enum {
|
|
+ /* driver specific */
|
|
+ TDA_VERBOSE_ON_CMD = 0,
|
|
+ TDA_VERBOSE_OFF_CMD,
|
|
+ TDA_BYEBYE_CMD,
|
|
+ /* HDMI Tx */
|
|
+ TDA_GET_SW_VERSION_CMD,
|
|
+ TDA_SET_POWER_CMD,
|
|
+ TDA_GET_POWER_CMD,
|
|
+ TDA_SETUP_CMD,
|
|
+ TDA_GET_SETUP_CMD,
|
|
+ TDA_WAIT_EVENT_CMD,
|
|
+ TDA_ENABLE_EVENT_CMD,
|
|
+ TDA_DISABLE_EVENT_CMD,
|
|
+ TDA_GET_VIDEO_SPEC_CMD,
|
|
+ TDA_SET_INPUT_OUTPUT_CMD,
|
|
+ TDA_SET_AUDIO_INPUT_CMD,
|
|
+ TDA_SET_VIDEO_INFOFRAME_CMD,
|
|
+ TDA_SET_AUDIO_INFOFRAME_CMD,
|
|
+ TDA_SET_ACP_CMD,
|
|
+ TDA_SET_GCP_CMD,
|
|
+ TDA_SET_ISRC1_CMD,
|
|
+ TDA_SET_ISRC2_CMD,
|
|
+ TDA_SET_MPS_INFOFRAME_CMD,
|
|
+ TDA_SET_SPD_INFOFRAME_CMD,
|
|
+ TDA_SET_VS_INFOFRAME_CMD,
|
|
+ TDA_SET_AUDIO_MUTE_CMD,
|
|
+ TDA_RESET_AUDIO_CTS_CMD,
|
|
+ TDA_GET_EDID_STATUS_CMD,
|
|
+ TDA_GET_EDID_AUDIO_CAPS_CMD,
|
|
+ TDA_GET_EDID_VIDEO_CAPS_CMD,
|
|
+ TDA_GET_EDID_VIDEO_PREF_CMD,
|
|
+ TDA_GET_EDID_SINK_TYPE_CMD,
|
|
+ TDA_GET_EDID_SOURCE_ADDRESS_CMD,
|
|
+ TDA_SET_GAMMUT_CMD,
|
|
+ TDA_GET_EDID_DTD_CMD,
|
|
+ TDA_GET_EDID_MD_CMD,
|
|
+ TDA_GET_EDID_TV_ASPECT_RATIO_CMD,
|
|
+ TDA_GET_EDID_LATENCY_CMD,
|
|
+ TDA_SET_HDCP_CMD,
|
|
+ TDA_GET_HDCP_STATUS_CMD,
|
|
+};
|
|
+
|
|
+/* driver specific */
|
|
+#define TDA_IOCTL_VERBOSE_ON _IO(TDA_IOCTL_BASE, TDA_VERBOSE_ON_CMD)
|
|
+#define TDA_IOCTL_VERBOSE_OFF _IO(TDA_IOCTL_BASE, TDA_VERBOSE_OFF_CMD)
|
|
+#define TDA_IOCTL_BYEBYE _IO(TDA_IOCTL_BASE, TDA_BYEBYE_CMD)
|
|
+/* HDMI Tx */
|
|
+#define TDA_IOCTL_GET_SW_VERSION _IOWR(TDA_IOCTL_BASE, TDA_GET_SW_VERSION_CMD,tda_version)
|
|
+#define TDA_IOCTL_SET_POWER _IOWR(TDA_IOCTL_BASE, TDA_SET_POWER_CMD,tda_power)
|
|
+#define TDA_IOCTL_GET_POWER _IOWR(TDA_IOCTL_BASE, TDA_GET_POWER_CMD,tda_power)
|
|
+#define TDA_IOCTL_SETUP _IOWR(TDA_IOCTL_BASE, TDA_SETUP_CMD,tda_setup_info)
|
|
+#define TDA_IOCTL_GET_SETUP _IOWR(TDA_IOCTL_BASE, TDA_GET_SETUP_CMD,tda_setup_info)
|
|
+#define TDA_IOCTL_WAIT_EVENT _IOWR(TDA_IOCTL_BASE, TDA_WAIT_EVENT_CMD,tda_event)
|
|
+#define TDA_IOCTL_ENABLE_EVENT _IOWR(TDA_IOCTL_BASE, TDA_ENABLE_EVENT_CMD,tda_event)
|
|
+#define TDA_IOCTL_DISABLE_EVENT _IOWR(TDA_IOCTL_BASE, TDA_DISABLE_EVENT_CMD,tda_event)
|
|
+#define TDA_IOCTL_GET_VIDEO_SPEC _IOWR(TDA_IOCTL_BASE, TDA_GET_VIDEO_SPEC_CMD,tda_video_format)
|
|
+#define TDA_IOCTL_SET_INPUT_OUTPUT _IOWR(TDA_IOCTL_BASE, TDA_SET_INPUT_OUTPUT_CMD,tda_set_in_out)
|
|
+#define TDA_IOCTL_SET_AUDIO_INPUT _IOWR(TDA_IOCTL_BASE, TDA_SET_AUDIO_INPUT_CMD,tda_audio_in)
|
|
+#define TDA_IOCTL_SET_VIDEO_INFOFRAME _IOWR(TDA_IOCTL_BASE, TDA_SET_VIDEO_INFOFRAME_CMD,tda_video_infoframe)
|
|
+#define TDA_IOCTL_SET_AUDIO_INFOFRAME _IOWR(TDA_IOCTL_BASE, TDA_SET_AUDIO_INFOFRAME_CMD,tda_audio_infoframe)
|
|
+#define TDA_IOCTL_SET_ACP _IOWR(TDA_IOCTL_BASE, TDA_SET_ACP_CMD,tda_acp)
|
|
+#define TDA_IOCTL_SET_GCP _IOWR(TDA_IOCTL_BASE, TDA_SET_GCP_CMD,tda_gcp)
|
|
+#define TDA_IOCTL_SET_ISRC1 _IOWR(TDA_IOCTL_BASE, TDA_SET_ISRC1_CMD,tda_isrc1)
|
|
+#define TDA_IOCTL_SET_ISRC2 _IOWR(TDA_IOCTL_BASE, TDA_SET_ISRC2_CMD,tda_isrc2)
|
|
+#define TDA_IOCTL_SET_MPS_INFOFRAME _IOWR(TDA_IOCTL_BASE, TDA_SET_MPS_INFOFRAME_CMD,tda_mps_infoframe)
|
|
+#define TDA_IOCTL_SET_SPD_INFOFRAME _IOWR(TDA_IOCTL_BASE, TDA_SET_SPD_INFOFRAME_CMD,tda_spd_infoframe)
|
|
+#define TDA_IOCTL_SET_VS_INFOFRAME _IOWR(TDA_IOCTL_BASE, TDA_SET_VS_INFOFRAME_CMD,tda_vs_infoframe)
|
|
+#define TDA_IOCTL_SET_AUDIO_MUTE _IOWR(TDA_IOCTL_BASE, TDA_SET_AUDIO_MUTE_CMD,bool)
|
|
+#define TDA_IOCTL_RESET_AUDIO_CTS _IO(TDA_IOCTL_BASE, TDA_RESET_AUDIO_CTS_CMD)
|
|
+#define TDA_IOCTL_GET_EDID_STATUS _IOWR(TDA_IOCTL_BASE, TDA_GET_EDID_STATUS_CMD,tda_edid)
|
|
+#define TDA_IOCTL_GET_EDID_AUDIO_CAPS _IOWR(TDA_IOCTL_BASE, TDA_GET_EDID_AUDIO_CAPS_CMD,tda_edid_audio_caps)
|
|
+#define TDA_IOCTL_GET_EDID_VIDEO_CAPS _IOWR(TDA_IOCTL_BASE, TDA_GET_EDID_VIDEO_CAPS_CMD,tda_edid_video_caps)
|
|
+#define TDA_IOCTL_GET_EDID_VIDEO_PREF _IOWR(TDA_IOCTL_BASE, TDA_GET_EDID_VIDEO_PREF_CMD,tda_edid_video_timings)
|
|
+#define TDA_IOCTL_GET_EDID_SINK_TYPE _IOWR(TDA_IOCTL_BASE, TDA_GET_EDID_SINK_TYPE_CMD,tda_sink)
|
|
+#define TDA_IOCTL_GET_EDID_SOURCE_ADDRESS _IOWR(TDA_IOCTL_BASE, TDA_GET_EDID_SOURCE_ADDRESS_CMD,unsigned short)
|
|
+#define TDA_IOCTL_SET_GAMMUT _IOWR(TDA_IOCTL_BASE, TDA_SET_GAMMUT_CMD,tda_gammut)
|
|
+#define TDA_IOCTL_GET_EDID_DTD _IOWR(TDA_IOCTL_BASE, TDA_GET_EDID_DTD_CMD,tda_edid_dtd)
|
|
+#define TDA_IOCTL_GET_EDID_MD _IOWR(TDA_IOCTL_BASE, TDA_GET_EDID_MD_CMD,tda_edid_md)
|
|
+#define TDA_IOCTL_GET_EDID_TV_ASPECT_RATIO _IOWR(TDA_IOCTL_BASE, TDA_GET_EDID_TV_ASPECT_RATIO_CMD,tda_edid_tv_aspect_ratio)
|
|
+#ifdef TMFL_TDA19989
|
|
+#define TDA_IOCTL_GET_EDID_LATENCY _IOWR(TDA_IOCTL_BASE, TDA_GET_EDID_LATENCY_CMD,tda_edid_latency)
|
|
+#define TDA_IOCTL_SET_HDCP _IOWR(TDA_IOCTL_BASE, TDA_SET_HDCP_CMD,bool)
|
|
+#define TDA_IOCTL_GET_HDCP_STATUS _IOWR(TDA_IOCTL_BASE, TDA_GET_HDCP_STATUS_CMD,tda_hdcp_status)
|
|
+#endif
|
|
+
|
|
+/* --- Full list --- */
|
|
+
|
|
+/* legend: */
|
|
+/* ------- */
|
|
+/* [ ] : not supported */
|
|
+/* [x] : IOCTL */
|
|
+/* [i] : open, init... */
|
|
+
|
|
+/* [x] txGetSWVersion */
|
|
+/* [ ] txGetNumberOfUnits */
|
|
+/* [i] txGetCapabilities */
|
|
+/* [ ] txGetCapabilitiesM */
|
|
+/* [i] txOpen */
|
|
+/* [ ] txOpenM */
|
|
+/* [i] txClose */
|
|
+/* [x] txSetPowerState */
|
|
+/* [x] txGetPowerState */
|
|
+/* [ ] txInstanceConfig */
|
|
+/* [xi] txInstanceSetup */
|
|
+/* [x] txGetInstanceSetup */
|
|
+/* [x] txHandleInterrupt see IOCTL_WAIT_EVENT */
|
|
+/* [i] txRegisterCallbacks */
|
|
+/* [x] txEnableEvent */
|
|
+/* [x] txDisableEvent */
|
|
+/* [x] txGetVideoFormatSpecs */
|
|
+/* [x] txSetInputOutput */
|
|
+/* [x] txSetAudioInput */
|
|
+/* [x] txSetVideoInfoframe */
|
|
+/* [x] txSetAudioInfoframe */
|
|
+/* [x] txSetACPPacket */
|
|
+/* [x] txSetGeneralControlPacket */
|
|
+/* [x] txSetISRC1Packet */
|
|
+/* [x] txSetISRC2Packet */
|
|
+/* [x] txSetMPSInfoframe */
|
|
+/* [x] txSetSpdInfoframe */
|
|
+/* [x] txSetVsInfoframe */
|
|
+/* [ ] txDebugSetNullPacket */
|
|
+/* [ ] txDebugSetSingleNullPacket */
|
|
+/* [x] txSetAudioMute */
|
|
+/* [x] txResetAudioCts */
|
|
+/* [x] txGetEdidStatus */
|
|
+/* [x] txGetEdidAudioCaps */
|
|
+/* [x] txGetEdidVideoCaps */
|
|
+/* [x] txGetEdidVideoPreferred */
|
|
+/* [x] txGetEdidSinkType */
|
|
+/* [x] txGetEdidSourceAddress */
|
|
+/* [ ] txGetKsvList */
|
|
+/* [ ] txGetDepth */
|
|
+/* [ ] txGeneSHA_1_IT */
|
|
+/* [ ] txSetHdcp */
|
|
+/* [ ] txGetHdcpState */
|
|
+/* [ ] txHdcpCheck */
|
|
+/* [x] txSetGamutPacket */
|
|
+/* [x] txGetEdidDetailledTimingDescriptors */
|
|
+/* [x] txGetEdidMonitorDescriptors */
|
|
+/* [x] txGetEdidTVPictureRatio */
|
|
+/* [ ] txSetHDCPRevocationList */
|
|
+/* [ ] txGetHdcpFailStatus */
|
|
+/* [x] txGetEdidLatencyInfo */
|
|
+/* [ ] txSetBScreen */
|
|
+/* [ ] txRemoveBScreen */
|
|
+
|
|
+#endif /* __tx_h__ */
|
|
+#endif /* __tx_ioctl__ */
|
|
+
|
|
+#ifndef __cec_ioctl__
|
|
+#define __cec_ioctl__
|
|
+
|
|
+#ifdef __cec_h__
|
|
+
|
|
+typedef struct {
|
|
+ u8 day_of_month;
|
|
+ u8 month_of_year;
|
|
+ u16 start_time;
|
|
+ dl_hdmi_cecduration_t duration;
|
|
+ u8 recording_sequence;
|
|
+ dl_hdmi_cecanalogue_broadcast_type_t analogue_broadcast_type;
|
|
+ u16 analogue_frequency;
|
|
+ dl_hdmi_cecbroadcast_system_t broadcast_system;
|
|
+} cec_analogue_timer;
|
|
+
|
|
+typedef struct {
|
|
+ u8 day_of_month;
|
|
+ u8 month_of_year;
|
|
+ u16 start_time;
|
|
+ dl_hdmi_cecduration_t duration;
|
|
+ u8 recording_sequence;
|
|
+ dl_hdmi_cecdigital_service_identification_t service_identification;
|
|
+} cec_digital_timer;
|
|
+
|
|
+typedef struct {
|
|
+ u8 day_of_month;
|
|
+ u8 month_of_year;
|
|
+ u16 start_time;
|
|
+ dl_hdmi_cecduration_t duration;
|
|
+ u8 recording_sequence;
|
|
+ dl_hdmi_cecexternal_plug_t external_plug;
|
|
+} cec_ext_timer_with_ext_plug;
|
|
+
|
|
+typedef struct {
|
|
+ u8 day_of_month;
|
|
+ u8 month_of_year;
|
|
+ u16 start_time;
|
|
+ dl_hdmi_cecduration_t duration;
|
|
+ u8 recording_sequence;
|
|
+ dl_hdmi_cecexternal_physical_address_t external_physical_address;
|
|
+} cec_ext_timer_with_phy_addr;
|
|
+
|
|
+typedef struct {
|
|
+ dl_hdmi_cecfeature_opcode_t feature_opcode;
|
|
+ dl_hdmi_cecabort_reason_t abort_reason;
|
|
+} cec_feature_abort;
|
|
+
|
|
+typedef struct {
|
|
+ dl_hdmi_cecanalogue_broadcast_type_t analogue_broadcast_type;
|
|
+ u16 analogue_frequency;
|
|
+ dl_hdmi_cecbroadcast_system_t broadcast_system;
|
|
+} cec_analogue_service;
|
|
+
|
|
+typedef struct {
|
|
+ u16 original_address;
|
|
+ u16 new_address;
|
|
+} cec_routing_change;
|
|
+
|
|
+typedef struct {
|
|
+ char data[15];
|
|
+ unsigned char length;
|
|
+} cec_string;
|
|
+
|
|
+typedef struct {
|
|
+ dl_hdmi_cecdisplay_control_t display_control;
|
|
+ char data[15];
|
|
+ unsigned char length;
|
|
+} cec_osd_string;
|
|
+
|
|
+typedef struct {
|
|
+ dl_hdmi_cecrecording_flag_t recording_flag;
|
|
+ dl_hdmi_cectuner_display_info_t tuner_display_info;
|
|
+ dl_hdmi_cecanalogue_broadcast_type_t analogue_broadcast_type;
|
|
+ u16 analogue_frequency;
|
|
+ dl_hdmi_cecbroadcast_system_t broadcast_system;
|
|
+} cec_tuner_device_status_analogue;
|
|
+
|
|
+typedef struct {
|
|
+ dl_hdmi_cecrecording_flag_t recording_flag;
|
|
+ dl_hdmi_cectuner_display_info_t tuner_display_info;
|
|
+ dl_hdmi_cecdigital_service_identification_t service_identification;
|
|
+} cec_tuner_device_status_digital;
|
|
+
|
|
+typedef struct {
|
|
+ unsigned long vendor_id;
|
|
+ cec_string cmd;
|
|
+} cec_vendor_command_with_id;
|
|
+
|
|
+/*
|
|
+ * typedef struct {
|
|
+ * u8 *pData;
|
|
+ * u16 lenData;
|
|
+ * } cec_send_msg;
|
|
+ * */
|
|
+
|
|
+typedef struct {
|
|
+ unsigned char count;
|
|
+ unsigned char service;
|
|
+ unsigned char addr;
|
|
+ unsigned char data[15];
|
|
+} cec_frame;
|
|
+/* typedef dlHdmiCecFrameFormat_t cec_frame; */
|
|
+
|
|
+typedef swversion_t cec_sw_version;
|
|
+typedef power_state_t cec_power;
|
|
+typedef dl_hdmi_cec_instance_setup_t cec_setup;
|
|
+typedef dl_hdmi_cec_event_t cec_event;
|
|
+typedef dl_hdmi_cec_clock_source_t cec_clock;
|
|
+typedef dl_hdmi_cecsystem_audio_status_t cec_sys_audio_status;
|
|
+typedef dl_hdmi_cecaudio_rate_t cec_audio_rate;
|
|
+typedef dl_hdmi_cecdigital_service_identification_t cec_digital_service;
|
|
+typedef dl_hdmi_cecversion_t cec_version;
|
|
+typedef dl_hdmi_cecdec_control_mode_t cec_deck_ctrl;
|
|
+typedef dl_hdmi_cecdec_info_t cec_deck_status;
|
|
+typedef dl_hdmi_cecstatus_request_t cec_status_request;
|
|
+typedef dl_hdmi_cecmenu_request_type_t cec_menu_request;
|
|
+typedef dl_hdmi_cecmenu_state_t cec_menu_status;
|
|
+typedef dl_hdmi_cecplay_mode_t cec_play;
|
|
+typedef dl_hdmi_cecexternal_plug_t cec_ext_plug;
|
|
+typedef dl_hdmi_cecrecord_status_info_t cec_rec_status;
|
|
+typedef dl_hdmi_cecaudio_status_t cec_audio_status;
|
|
+typedef dl_hdmi_cecpower_status_t cec_power_status;
|
|
+typedef dl_hdmi_cectimer_cleared_status_data_t cec_timer_cleared_status;
|
|
+typedef dl_hdmi_cectimer_status_data_t cec_timer_status;
|
|
+typedef dl_hdmi_cecuser_remote_control_command_t cec_user_ctrl;
|
|
+typedef dl_hdmi_cecchannel_identifier_t cec_user_ctrl_tune;
|
|
+typedef dl_hdmi_cecdevice_type_t cec_device_type;
|
|
+
|
|
+#define CEC_IOCTL_BASE 0x40
|
|
+
|
|
+/* service */
|
|
+enum {
|
|
+ CEC_WAITING = 0x80,
|
|
+ CEC_RELEASE,
|
|
+ CEC_RX_DONE,
|
|
+ CEC_TX_DONE
|
|
+};
|
|
+
|
|
+enum {
|
|
+ /* driver specific */
|
|
+ CEC_VERBOSE_ON_CMD = 0,
|
|
+ CEC_VERBOSE_OFF_CMD,
|
|
+ CEC_BYEBYE_CMD,
|
|
+
|
|
+ /* CEC */
|
|
+ CEC_IOCTL_RX_ADDR_CMD, /* receiver logical address selector */
|
|
+ CEC_IOCTL_PHY_ADDR_CMD, /* physical address selector */
|
|
+ CEC_IOCTL_WAIT_FRAME_CMD,
|
|
+ CEC_IOCTL_ABORT_MSG_CMD,
|
|
+ CEC_IOCTL_ACTIVE_SRC_CMD,
|
|
+ CEC_IOCTL_VERSION_CMD,
|
|
+ CEC_IOCTL_CLEAR_ANALOGUE_TIMER_CMD,
|
|
+ CEC_IOCTL_CLEAR_DIGITAL_TIMER_CMD,
|
|
+ CEC_IOCTL_CLEAR_EXT_TIMER_WITH_EXT_PLUG_CMD,
|
|
+ CEC_IOCTL_CLEAR_EXT_TIMER_WITH_PHY_ADDR_CMD,
|
|
+ CEC_IOCTL_DECK_CTRL_CMD,
|
|
+ CEC_IOCTL_DECK_STATUS_CMD,
|
|
+ CEC_IOCTL_DEVICE_VENDOR_ID_CMD,
|
|
+ CEC_IOCTL_FEATURE_ABORT_CMD,
|
|
+ CEC_IOCTL_GET_CEC_VERSION_CMD,
|
|
+ CEC_IOCTL_GET_MENU_LANGUAGE_CMD,
|
|
+ CEC_IOCTL_GIVE_AUDIO_STATUS_CMD,
|
|
+ CEC_IOCTL_GIVE_DECK_STATUS_CMD,
|
|
+ CEC_IOCTL_GIVE_DEVICE_POWER_STATUS_CMD,
|
|
+ CEC_IOCTL_GIVE_DEVICE_VENDOR_ID_CMD,
|
|
+ CEC_IOCTL_GIVE_OSD_NAME_CMD,
|
|
+ CEC_IOCTL_GIVE_PHY_ADDR_CMD,
|
|
+ CEC_IOCTL_GIVE_SYS_AUDIO_MODE_STATUS_CMD,
|
|
+ CEC_IOCTL_GIVE_TUNER_DEVICE_STATUS_CMD,
|
|
+ CEC_IOCTL_IMAGE_VIEW_ON_CMD,
|
|
+ CEC_IOCTL_INACTIVE_SRC_CMD,
|
|
+ CEC_IOCTL_MENU_REQUEST_CMD,
|
|
+ CEC_IOCTL_MENU_STATUS_CMD,
|
|
+ CEC_IOCTL_PLAY_CMD,
|
|
+ CEC_IOCTL_POLLING_MSG_CMD,
|
|
+ CEC_IOCTL_REC_OFF_CMD,
|
|
+ CEC_IOCTL_REC_ON_ANALOGUE_SERVICE_CMD,
|
|
+ CEC_IOCTL_REC_ON_DIGITAL_SERVICE_CMD,
|
|
+ CEC_IOCTL_REC_ON_EXT_PHY_ADDR_CMD,
|
|
+ CEC_IOCTL_REC_ON_EXT_PLUG_CMD,
|
|
+ CEC_IOCTL_REC_ON_OWN_SRC_CMD,
|
|
+ CEC_IOCTL_REC_STATUS_CMD,
|
|
+ CEC_IOCTL_REC_TV_SCREEN_CMD,
|
|
+ CEC_IOCTL_REPORT_AUDIO_STATUS_CMD,
|
|
+ CEC_IOCTL_REPORT_PHY_ADDR_CMD,
|
|
+ CEC_IOCTL_REPORT_POWER_STATUS_CMD,
|
|
+ CEC_IOCTL_REQUEST_ACTIVE_SRC_CMD,
|
|
+ CEC_IOCTL_ROUTING_CHANGE_CMD,
|
|
+ CEC_IOCTL_ROUTING_INFORMATION_CMD,
|
|
+ CEC_IOCTL_SELECT_ANALOGUE_SERVICE_CMD,
|
|
+ CEC_IOCTL_SELECT_DIGITAL_SERVICE_CMD,
|
|
+ CEC_IOCTL_SET_ANALOGUE_TIMER_CMD,
|
|
+ CEC_IOCTL_SET_AUDIO_RATE_CMD,
|
|
+ CEC_IOCTL_SET_DIGITAL_TIMER_CMD,
|
|
+ CEC_IOCTL_SET_EXT_TIMER_WITH_EXT_PLUG_CMD,
|
|
+ CEC_IOCTL_SET_EXT_TIMER_WITH_PHY_ADDR_CMD,
|
|
+ CEC_IOCTL_SET_MENU_LANGUAGE_CMD,
|
|
+ CEC_IOCTL_SET_OSD_NAME_CMD,
|
|
+ CEC_IOCTL_SET_OSD_STRING_CMD,
|
|
+ CEC_IOCTL_SET_STREAM_PATH_CMD,
|
|
+ CEC_IOCTL_SET_SYS_AUDIO_MODE_CMD,
|
|
+ CEC_IOCTL_SET_TIMER_PROGRAM_TITLE_CMD,
|
|
+ CEC_IOCTL_STANDBY_CMD,
|
|
+ CEC_IOCTL_SYS_AUDIO_MODE_REQUEST_CMD,
|
|
+ CEC_IOCTL_SYS_AUDIO_MODE_STATUS_CMD,
|
|
+ CEC_IOCTL_TEXT_VIEW_ON_CMD,
|
|
+ CEC_IOCTL_TIMER_CLEARED_STATUS_CMD,
|
|
+ CEC_IOCTL_TIMER_STATUS_CMD,
|
|
+ CEC_IOCTL_TUNER_DEVICE_STATUS_ANALOGUE_CMD,
|
|
+ CEC_IOCTL_TUNER_DEVICE_STATUS_DIGITAL_CMD,
|
|
+ CEC_IOCTL_TUNER_STEP_DECREMENT_CMD,
|
|
+ CEC_IOCTL_TUNER_STEP_INCREMENT_CMD,
|
|
+ CEC_IOCTL_USER_CTRL_CMD,
|
|
+ CEC_IOCTL_USER_CTRL_PLAY_CMD,
|
|
+ CEC_IOCTL_USER_CTRL_SELECT_AUDIOINPUT_CMD,
|
|
+ CEC_IOCTL_USER_CTRL_SELECT_AVINPUT_CMD,
|
|
+ CEC_IOCTL_USER_CTRL_SELECT_MEDIA_CMD,
|
|
+ CEC_IOCTL_USER_CTRL_TUNE_CMD,
|
|
+ CEC_IOCTL_USER_CTRL_RELEASED_CMD,
|
|
+ CEC_IOCTL_VENDOR_COMMAND_CMD,
|
|
+ CEC_IOCTL_VENDOR_COMMAND_WITH_ID_CMD,
|
|
+ CEC_IOCTL_VENDOR_REMOTE_BUTTON_DOWN_CMD,
|
|
+ CEC_IOCTL_VENDOR_REMOTE_BUTTON_UP_CMD,
|
|
+ CEC_IOCTL_GET_SW_VERSION_CMD,
|
|
+ CEC_IOCTL_SET_POWER_STATE_CMD,
|
|
+ CEC_IOCTL_GET_POWER_STATE_CMD,
|
|
+ CEC_IOCTL_INSTANCE_CONFIG_CMD,
|
|
+ CEC_IOCTL_INSTANCE_SETUP_CMD,
|
|
+ CEC_IOCTL_GET_INSTANCE_SETUP_CMD,
|
|
+ CEC_IOCTL_ENABLE_EVENT_CMD,
|
|
+ CEC_IOCTL_DISABLE_EVENT_CMD,
|
|
+ CEC_IOCTL_ENABLE_CALIBRATION_CMD,
|
|
+ CEC_IOCTL_DISABLE_CALIBRATION_CMD,
|
|
+ CEC_IOCTL_SEND_MSG_CMD,
|
|
+ CEC_IOCTL_SET_REGISTER_CMD
|
|
+};
|
|
+
|
|
+/* driver specific */
|
|
+#define CEC_IOCTL_VERBOSE_ON _IO(CEC_IOCTL_BASE, CEC_VERBOSE_ON_CMD)
|
|
+#define CEC_IOCTL_VERBOSE_OFF _IO(CEC_IOCTL_BASE, CEC_VERBOSE_OFF_CMD)
|
|
+#define CEC_IOCTL_BYEBYE _IO(CEC_IOCTL_BASE, CEC_BYEBYE_CMD)
|
|
+
|
|
+/* CEC */
|
|
+#define CEC_IOCTL_RX_ADDR _IOWR(CEC_IOCTL_BASE,CEC_IOCTL_RX_ADDR_CMD,unsigned char)
|
|
+#define CEC_IOCTL_PHY_ADDR _IOWR(CEC_IOCTL_BASE,CEC_IOCTL_PHY_ADDR_CMD,unsigned short)
|
|
+#define CEC_IOCTL_WAIT_FRAME _IOWR(CEC_IOCTL_BASE,CEC_IOCTL_WAIT_FRAME_CMD,cec_frame)
|
|
+#define CEC_IOCTL_ABORT_MSG _IO(CEC_IOCTL_BASE,CEC_IOCTL_ABORT_MSG_CMD)
|
|
+#define CEC_IOCTL_ACTIVE_SRC _IO(CEC_IOCTL_BASE,CEC_IOCTL_ACTIVE_SRC_CMD)
|
|
+#define CEC_IOCTL_VERSION _IOWR(CEC_IOCTL_BASE,CEC_IOCTL_VERSION_CMD,cec_version)
|
|
+#define CEC_IOCTL_CLEAR_ANALOGUE_TIMER _IOWR(CEC_IOCTL_BASE,CEC_IOCTL_CLEAR_ANALOGUE_TIMER_CMD,cec_analogue_timer)
|
|
+#define CEC_IOCTL_CLEAR_DIGITAL_TIMER _IOWR(CEC_IOCTL_BASE,CEC_IOCTL_CLEAR_DIGITAL_TIMER_CMD,cec_digital_timer)
|
|
+#define CEC_IOCTL_CLEAR_EXT_TIMER_WITH_EXT_PLUG _IOWR(CEC_IOCTL_BASE,CEC_IOCTL_CLEAR_EXT_TIMER_WITH_EXT_PLUG_CMD,cec_ext_timer_with_ext_plug)
|
|
+#define CEC_IOCTL_CLEAR_EXT_TIMER_WITH_PHY_ADDR _IOWR(CEC_IOCTL_BASE,CEC_IOCTL_CLEAR_EXT_TIMER_WITH_PHY_ADDR_CMD,cec_ext_timer_with_phy_addr)
|
|
+#define CEC_IOCTL_DECK_CTRL _IOWR(CEC_IOCTL_BASE,CEC_IOCTL_DECK_CTRL_CMD,cec_deck_ctrl)
|
|
+#define CEC_IOCTL_DECK_STATUS _IOWR(CEC_IOCTL_BASE,CEC_IOCTL_DECK_STATUS_CMD,cec_deck_status)
|
|
+#define CEC_IOCTL_DEVICE_VENDOR_ID _IOWR(CEC_IOCTL_BASE,CEC_IOCTL_DEVICE_VENDOR_ID_CMD,unsigned long)
|
|
+#define CEC_IOCTL_FEATURE_ABORT _IOWR(CEC_IOCTL_BASE,CEC_IOCTL_FEATURE_ABORT_CMD,cec_feature_abort)
|
|
+#define CEC_IOCTL_GET_CEC_VERSION _IOWR(CEC_IOCTL_BASE,CEC_IOCTL_GET_CEC_VERSION_CMD,unsigned char)
|
|
+#define CEC_IOCTL_GET_MENU_LANGUAGE _IO(CEC_IOCTL_BASE,CEC_IOCTL_GET_MENU_LANGUAGE_CMD)
|
|
+#define CEC_IOCTL_GIVE_AUDIO_STATUS _IO(CEC_IOCTL_BASE,CEC_IOCTL_GIVE_AUDIO_STATUS_CMD)
|
|
+#define CEC_IOCTL_GIVE_DECK_STATUS _IOWR(CEC_IOCTL_BASE,CEC_IOCTL_GIVE_DECK_STATUS_CMD,cec_status_request)
|
|
+#define CEC_IOCTL_GIVE_DEVICE_POWER_STATUS _IO(CEC_IOCTL_BASE,CEC_IOCTL_GIVE_DEVICE_POWER_STATUS_CMD)
|
|
+#define CEC_IOCTL_GIVE_DEVICE_VENDOR_ID _IO(CEC_IOCTL_BASE,CEC_IOCTL_GIVE_DEVICE_VENDOR_ID_CMD)
|
|
+#define CEC_IOCTL_GIVE_OSD_NAME _IO(CEC_IOCTL_BASE,CEC_IOCTL_GIVE_OSD_NAME_CMD)
|
|
+#define CEC_IOCTL_GIVE_PHY_ADDR _IO(CEC_IOCTL_BASE,CEC_IOCTL_GIVE_PHY_ADDR_CMD)
|
|
+#define CEC_IOCTL_GIVE_SYS_AUDIO_MODE_STATUS _IO(CEC_IOCTL_BASE,CEC_IOCTL_GIVE_SYS_AUDIO_MODE_STATUS_CMD)
|
|
+#define CEC_IOCTL_GIVE_TUNER_DEVICE_STATUS _IOWR(CEC_IOCTL_BASE,CEC_IOCTL_GIVE_TUNER_DEVICE_STATUS_CMD,cec_status_request)
|
|
+#define CEC_IOCTL_IMAGE_VIEW_ON _IO(CEC_IOCTL_BASE,CEC_IOCTL_IMAGE_VIEW_ON_CMD)
|
|
+#define CEC_IOCTL_INACTIVE_SRC _IO(CEC_IOCTL_BASE,CEC_IOCTL_INACTIVE_SRC_CMD)
|
|
+#define CEC_IOCTL_MENU_REQUEST _IOWR(CEC_IOCTL_BASE,CEC_IOCTL_MENU_REQUEST_CMD,cec_menu_request)
|
|
+#define CEC_IOCTL_MENU_STATUS _IOWR(CEC_IOCTL_BASE,CEC_IOCTL_MENU_STATUS_CMD,cec_menu_status)
|
|
+#define CEC_IOCTL_PLAY _IOWR(CEC_IOCTL_BASE,CEC_IOCTL_PLAY_CMD,cec_play)
|
|
+#define CEC_IOCTL_POLLING_MSG _IO(CEC_IOCTL_BASE,CEC_IOCTL_POLLING_MSG_CMD)
|
|
+#define CEC_IOCTL_REC_OFF _IO(CEC_IOCTL_BASE,CEC_IOCTL_REC_OFF_CMD)
|
|
+#define CEC_IOCTL_REC_ON_ANALOGUE_SERVICE _IOWR(CEC_IOCTL_BASE,CEC_IOCTL_REC_ON_ANALOGUE_SERVICE_CMD,cec_analogue_service)
|
|
+#define CEC_IOCTL_REC_ON_DIGITAL_SERVICE _IOWR(CEC_IOCTL_BASE,CEC_IOCTL_REC_ON_DIGITAL_SERVICE_CMD,cec_digital_service)
|
|
+#define CEC_IOCTL_REC_ON_EXT_PHY_ADDR _IO(CEC_IOCTL_BASE,CEC_IOCTL_REC_ON_EXT_PHY_ADDR_CMD)
|
|
+#define CEC_IOCTL_REC_ON_EXT_PLUG _IOWR(CEC_IOCTL_BASE,CEC_IOCTL_REC_ON_EXT_PLUG_CMD,cec_ext_plug)
|
|
+#define CEC_IOCTL_REC_ON_OWN_SRC _IO(CEC_IOCTL_BASE,CEC_IOCTL_REC_ON_OWN_SRC_CMD)
|
|
+#define CEC_IOCTL_REC_STATUS _IOWR(CEC_IOCTL_BASE,CEC_IOCTL_REC_STATUS_CMD,cec_rec_status)
|
|
+#define CEC_IOCTL_REC_TV_SCREEN _IO(CEC_IOCTL_BASE,CEC_IOCTL_REC_TV_SCREEN_CMD)
|
|
+#define CEC_IOCTL_REPORT_AUDIO_STATUS _IOWR(CEC_IOCTL_BASE,CEC_IOCTL_REPORT_AUDIO_STATUS_CMD,cec_audio_status)
|
|
+#define CEC_IOCTL_REPORT_PHY_ADDR _IOWR(CEC_IOCTL_BASE,CEC_IOCTL_REPORT_PHY_ADDR_CMD,cec_device_type)
|
|
+#define CEC_IOCTL_REPORT_POWER_STATUS _IOWR(CEC_IOCTL_BASE,CEC_IOCTL_REPORT_POWER_STATUS_CMD,cec_power_status)
|
|
+#define CEC_IOCTL_REQUEST_ACTIVE_SRC _IO(CEC_IOCTL_BASE,CEC_IOCTL_REQUEST_ACTIVE_SRC_CMD)
|
|
+#define CEC_IOCTL_ROUTING_CHANGE _IOWR(CEC_IOCTL_BASE,CEC_IOCTL_ROUTING_CHANGE_CMD,cec_routing_change)
|
|
+#define CEC_IOCTL_ROUTING_INFORMATION _IO(CEC_IOCTL_BASE,CEC_IOCTL_ROUTING_INFORMATION_CMD)
|
|
+#define CEC_IOCTL_SELECT_ANALOGUE_SERVICE _IOWR(CEC_IOCTL_BASE,CEC_IOCTL_SELECT_ANALOGUE_SERVICE_CMD,cec_analogue_service)
|
|
+#define CEC_IOCTL_SELECT_DIGITAL_SERVICE _IOWR(CEC_IOCTL_BASE,CEC_IOCTL_SELECT_DIGITAL_SERVICE_CMD,cec_digital_service)
|
|
+#define CEC_IOCTL_SET_ANALOGUE_TIMER _IOWR(CEC_IOCTL_BASE,CEC_IOCTL_SET_ANALOGUE_TIMER_CMD,cec_analogue_timer)
|
|
+#define CEC_IOCTL_SET_AUDIO_RATE _IOWR(CEC_IOCTL_BASE,CEC_IOCTL_SET_AUDIO_RATE_CMD,cec_audio_rate)
|
|
+#define CEC_IOCTL_SET_DIGITAL_TIMER _IOWR(CEC_IOCTL_BASE,CEC_IOCTL_SET_DIGITAL_TIMER_CMD,cec_digital_timer)
|
|
+#define CEC_IOCTL_SET_EXT_TIMER_WITH_EXT_PLUG _IOWR(CEC_IOCTL_BASE,CEC_IOCTL_SET_EXT_TIMER_WITH_EXT_PLUG_CMD,cec_ext_timer_with_ext_plug)
|
|
+#define CEC_IOCTL_SET_EXT_TIMER_WITH_PHY_ADDR _IOWR(CEC_IOCTL_BASE,CEC_IOCTL_SET_EXT_TIMER_WITH_PHY_ADDR_CMD,cec_ext_timer_with_phy_addr)
|
|
+#define CEC_IOCTL_SET_MENU_LANGUAGE _IOWR(CEC_IOCTL_BASE,CEC_IOCTL_SET_MENU_LANGUAGE_CMD,cec_string)
|
|
+#define CEC_IOCTL_SET_OSD_NAME _IOWR(CEC_IOCTL_BASE,CEC_IOCTL_SET_OSD_NAME_CMD,cec_string)
|
|
+#define CEC_IOCTL_SET_OSD_STRING _IOWR(CEC_IOCTL_BASE,CEC_IOCTL_SET_OSD_STRING_CMD,cec_osd_string)
|
|
+#define CEC_IOCTL_SET_STREAM_PATH _IO(CEC_IOCTL_BASE,CEC_IOCTL_SET_STREAM_PATH_CMD)
|
|
+#define CEC_IOCTL_SET_SYS_AUDIO_MODE _IOWR(CEC_IOCTL_BASE,CEC_IOCTL_SET_SYS_AUDIO_MODE_CMD,cec_sys_audio_status)
|
|
+#define CEC_IOCTL_SET_TIMER_PROGRAM_TITLE _IOWR(CEC_IOCTL_BASE,CEC_IOCTL_SET_TIMER_PROGRAM_TITLE_CMD,cec_string)
|
|
+#define CEC_IOCTL_STANDBY _IO(CEC_IOCTL_BASE,CEC_IOCTL_STANDBY_CMD)
|
|
+#define CEC_IOCTL_SYS_AUDIO_MODE_REQUEST _IO(CEC_IOCTL_BASE,CEC_IOCTL_SYS_AUDIO_MODE_REQUEST_CMD)
|
|
+#define CEC_IOCTL_SYS_AUDIO_MODE_STATUS _IOWR(CEC_IOCTL_BASE,CEC_IOCTL_SYS_AUDIO_MODE_STATUS_CMD,cec_sys_audio_status)
|
|
+#define CEC_IOCTL_TEXT_VIEW_ON _IO(CEC_IOCTL_BASE,CEC_IOCTL_TEXT_VIEW_ON_CMD)
|
|
+#define CEC_IOCTL_TIMER_CLEARED_STATUS _IOWR(CEC_IOCTL_BASE,CEC_IOCTL_TIMER_CLEARED_STATUS_CMD,cec_timer_cleared_status)
|
|
+#define CEC_IOCTL_TIMER_STATUS _IOWR(CEC_IOCTL_BASE,CEC_IOCTL_TIMER_STATUS_CMD,cec_timer_status)
|
|
+#define CEC_IOCTL_TUNER_DEVICE_STATUS_ANALOGUE _IOWR(CEC_IOCTL_BASE,CEC_IOCTL_TUNER_DEVICE_STATUS_ANALOGUE_CMD,cec_tuner_device_status_analogue)
|
|
+#define CEC_IOCTL_TUNER_DEVICE_STATUS_DIGITAL _IOWR(CEC_IOCTL_BASE,CEC_IOCTL_TUNER_DEVICE_STATUS_DIGITAL_CMD,cec_tuner_device_status_digital)
|
|
+#define CEC_IOCTL_TUNER_STEP_DECREMENT _IO(CEC_IOCTL_BASE,CEC_IOCTL_TUNER_STEP_DECREMENT_CMD)
|
|
+#define CEC_IOCTL_TUNER_STEP_INCREMENT _IO(CEC_IOCTL_BASE,CEC_IOCTL_TUNER_STEP_INCREMENT_CMD)
|
|
+#define CEC_IOCTL_USER_CTRL_PRESSED _IOWR(CEC_IOCTL_BASE,CEC_IOCTL_USER_CTRL_CMD,cec_user_ctrl)
|
|
+#define CEC_IOCTL_USER_CTRL_PLAY _IOWR(CEC_IOCTL_BASE,CEC_IOCTL_USER_CTRL_PLAY_CMD,cec_play)
|
|
+#define CEC_IOCTL_USER_CTRL_SELECT_AUDIOINPUT _IOWR(CEC_IOCTL_BASE,CEC_IOCTL_USER_CTRL_SELECT_AUDIOINPUT_CMD,unsigned char)
|
|
+#define CEC_IOCTL_USER_CTRL_SELECT_AVINPUT _IOWR(CEC_IOCTL_BASE,CEC_IOCTL_USER_CTRL_SELECT_AVINPUT_CMD,unsigned char)
|
|
+#define CEC_IOCTL_USER_CTRL_SELECT_MEDIA _IOWR(CEC_IOCTL_BASE,CEC_IOCTL_USER_CTRL_SELECT_MEDIA_CMD,unsigned char)
|
|
+#define CEC_IOCTL_USER_CTRL_TUNE _IOWR(CEC_IOCTL_BASE,CEC_IOCTL_USER_CTRL_TUNE_CMD,cec_user_ctrl_tune)
|
|
+#define CEC_IOCTL_USER_CTRL_RELEASED _IO(CEC_IOCTL_BASE,CEC_IOCTL_USER_CTRL_RELEASED_CMD)
|
|
+#define CEC_IOCTL_VENDOR_COMMAND _IOWR(CEC_IOCTL_BASE,CEC_IOCTL_VENDOR_COMMAND_CMD,cec_string)
|
|
+#define CEC_IOCTL_VENDOR_COMMAND_WITH_ID _IOWR(CEC_IOCTL_BASE,CEC_IOCTL_VENDOR_COMMAND_WITH_ID_CMD,cec_vendor_command_with_id)
|
|
+#define CEC_IOCTL_VENDOR_REMOTE_BUTTON_DOWN _IOWR(CEC_IOCTL_BASE,CEC_IOCTL_VENDOR_REMOTE_BUTTON_DOWN_CMD,cec_string)
|
|
+#define CEC_IOCTL_VENDOR_REMOTE_BUTTON_UP _IO(CEC_IOCTL_BASE,CEC_IOCTL_VENDOR_REMOTE_BUTTON_UP_CMD)
|
|
+#define CEC_IOCTL_GET_SW_VERSION _IOWR(CEC_IOCTL_BASE,CEC_IOCTL_GET_SW_VERSION_CMD,cec_sw_version)
|
|
+#define CEC_IOCTL_SET_POWER_STATE _IOWR(CEC_IOCTL_BASE,CEC_IOCTL_SET_POWER_STATE_CMD,cec_power)
|
|
+#define CEC_IOCTL_GET_POWER_STATE _IOWR(CEC_IOCTL_BASE,CEC_IOCTL_GET_POWER_STATE_CMD,cec_power)
|
|
+#define CEC_IOCTL_INSTANCE_CONFIG _IO(CEC_IOCTL_BASE,CEC_IOCTL_INSTANCE_CONFIG_CMD)
|
|
+#define CEC_IOCTL_INSTANCE_SETUP _IOWR(CEC_IOCTL_BASE,CEC_IOCTL_INSTANCE_SETUP_CMD,cec_setup)
|
|
+#define CEC_IOCTL_GET_INSTANCE_SETUP _IOWR(CEC_IOCTL_BASE,CEC_IOCTL_GET_INSTANCE_SETUP_CMD,cec_setup)
|
|
+#define CEC_IOCTL_ENABLE_EVENT _IOWR(CEC_IOCTL_BASE,CEC_IOCTL_ENABLE_EVENT_CMD,cec_event)
|
|
+#define CEC_IOCTL_DISABLE_EVENT _IOWR(CEC_IOCTL_BASE,CEC_IOCTL_DISABLE_EVENT_CMD,cec_event)
|
|
+#define CEC_IOCTL_ENABLE_CALIBRATION _IOWR(CEC_IOCTL_BASE,CEC_IOCTL_ENABLE_CALIBRATION_CMD,cec_clock)
|
|
+#define CEC_IOCTL_DISABLE_CALIBRATION _IO(CEC_IOCTL_BASE,CEC_IOCTL_DISABLE_CALIBRATION_CMD)
|
|
+/*#define CEC_IOCTL_SEND_MSG _IOWR(CEC_IOCTL_BASE,CEC_IOCTL_SEND_MSG_CMD,cec_send_msg) */
|
|
+
|
|
+/* --- Full list --- */
|
|
+
|
|
+/* legend: */
|
|
+/* ------- */
|
|
+/* [ ] : not supported */
|
|
+/* [x] : IOCTL */
|
|
+/* [i] : open, init... */
|
|
+
|
|
+/* [ ] dlHdmiCecAbortMessage */
|
|
+/* [ ] dlHdmiCecActiveSource */
|
|
+/* [ ] dlHdmiCecVersion */
|
|
+/* [ ] dlHdmiCecClearAnalogueTimer */
|
|
+/* [ ] dlHdmiCecClearDigitalTimer */
|
|
+/* [ ] dlHdmiCecClearExternalTimerWithExternalPlug */
|
|
+/* [ ] dlHdmiCecClearExternalTimerWithPhysicalAddress */
|
|
+/* [ ] dlHdmiCecDeckControl */
|
|
+/* [ ] dlHdmiCecDeckStatus */
|
|
+/* [ ] dlHdmiCecDeviceVendorID */
|
|
+/* [ ] dlHdmiCecFeatureAbort */
|
|
+/* [ ] dlHdmiCecGetCecVersion */
|
|
+/* [ ] dlHdmiCecGetMenuLanguage */
|
|
+/* [ ] dlHdmiCecGiveAudioStatus */
|
|
+/* [ ] dlHdmiCecGiveDeckStatus */
|
|
+/* [ ] dlHdmiCecGiveDevicePowerStatus */
|
|
+/* [ ] dlHdmiCecGiveDeviceVendorID */
|
|
+/* [ ] dlHdmiCecGiveOsdName */
|
|
+/* [ ] dlHdmiCecGivePhysicalAddress */
|
|
+/* [ ] dlHdmiCecGiveSystemAudioModeStatus */
|
|
+/* [ ] dlHdmiCecGiveTunerDeviceStatus */
|
|
+/* [ ] dlHdmiCecImageViewOn */
|
|
+/* [ ] dlHdmiCecInactiveSource */
|
|
+/* [ ] dlHdmiCecMenuRequest */
|
|
+/* [ ] dlHdmiCecMenuStatus */
|
|
+/* [ ] dlHdmiCecPlay */
|
|
+/* [ ] dlHdmiCecPollingMessage */
|
|
+/* [ ] dlHdmiCecRecordOff */
|
|
+/* [ ] dlHdmiCecRecordOnAnalogueService */
|
|
+/* [ ] dlHdmiCecRecordOnDigitalService */
|
|
+/* [ ] dlHdmiCecRecordOnExternalPhysicalAddress */
|
|
+/* [ ] dlHdmiCecRecordOnExternalPlug */
|
|
+/* [ ] dlHdmiCecRecordOnOwnSource */
|
|
+/* [ ] dlHdmiCecRecordStatus */
|
|
+/* [ ] dlHdmiCecRecordTvScreen */
|
|
+/* [ ] dlHdmiCecReportAudioStatus */
|
|
+/* [ ] dlHdmiCecReportPhysicalAddress */
|
|
+/* [ ] dlHdmiCecReportPowerStatus */
|
|
+/* [ ] dlHdmiCecRequestActiveSource */
|
|
+/* [ ] dlHdmiCecRoutingChange */
|
|
+/* [ ] dlHdmiCecRoutingInformation */
|
|
+/* [ ] dlHdmiCecSelectAnalogueService */
|
|
+/* [ ] dlHdmiCecSelectDigitalService */
|
|
+/* [ ] dlHdmiCecSetAnalogueTimer */
|
|
+/* [ ] dlHdmiCecSetAudioRate */
|
|
+/* [ ] dlHdmiCecSetDigitalTimer */
|
|
+/* [ ] dlHdmiCecSetExternalTimerWithExternalPlug */
|
|
+/* [ ] dlHdmiCecSetExternalTimerWithPhysicalAddress */
|
|
+/* [ ] dlHdmiCecSetMenuLanguage */
|
|
+/* [ ] dlHdmiCecSetOsdName */
|
|
+/* [ ] dlHdmiCecSetOsdString */
|
|
+/* [ ] dlHdmiCecSetStreamPath */
|
|
+/* [ ] dlHdmiCecSetSystemAudioMode */
|
|
+/* [ ] dlHdmiCecSetTimerProgramTitle */
|
|
+/* [ ] dlHdmiCecStandby */
|
|
+/* [ ] dlHdmiCecSystemAudioModeRequest */
|
|
+/* [ ] dlHdmiCecSystemAudioModeStatus */
|
|
+/* [ ] dlHdmiCecTextViewOn */
|
|
+/* [ ] dlHdmiCecTimerClearedStatus */
|
|
+/* [ ] dlHdmiCecTimerStatus */
|
|
+/* [ ] dlHdmiCecTunerDeviceStatusAnalogue */
|
|
+/* [ ] dlHdmiCecTunerDeviceStatusDigital */
|
|
+/* [ ] dlHdmiCecTunerStepDecrement */
|
|
+/* [ ] dlHdmiCecTunerStepIncrement */
|
|
+/* [ ] dlHdmiCecUserControlPressed */
|
|
+/* [ ] dlHdmiCecUserControlPressedPlay */
|
|
+/* [ ] dlHdmiCecUserControlPressedSelectAudioInput */
|
|
+/* [ ] dlHdmiCecUserControlPressedSelectAVInput */
|
|
+/* [ ] dlHdmiCecUserControlPressedSelectMedia */
|
|
+/* [ ] dlHdmiCecUserControlPressedTune */
|
|
+/* [ ] dlHdmiCecUserControlReleased */
|
|
+/* [ ] dlHdmiCecVendorCommand */
|
|
+/* [ ] dlHdmiCecVendorCommandWithID */
|
|
+/* [ ] dlHdmiCecVendorRemoteButtonDown */
|
|
+/* [ ] dlHdmiCecVendorRemoteButtonUp */
|
|
+/* [ ] dlHdmiCecGetSWVersion */
|
|
+/* [ ] dlHdmiCecGetNumberOfUnits */
|
|
+/* [ ] dlHdmiCecGetCapabilities */
|
|
+/* [ ] dlHdmiCecGetCapabilitiesM */
|
|
+/* [ ] dlHdmiCecOpen */
|
|
+/* [ ] dlHdmiCecOpenM */
|
|
+/* [ ] dlHdmiCecClose */
|
|
+/* [ ] dlHdmiCecSetPowerState */
|
|
+/* [ ] dlHdmiCecGetPowerState */
|
|
+/* [ ] dlHdmiCecInstanceConfig */
|
|
+/* [ ] dlHdmiCecInstanceSetup */
|
|
+/* [ ] dlHdmiCecGetInstanceSetup */
|
|
+/* [ ] dlHdmiCecHandleInterrupt */
|
|
+/* [ ] dlHdmiCecRegisterCallbacks */
|
|
+/* [ ] dlHdmiCecSetAutoAnswer */
|
|
+/* [ ] dlHdmiCecSetLogicalAddress */
|
|
+/* [ ] dlHdmiCecEnableEvent */
|
|
+/* [ ] dlHdmiCecDisableEvent */
|
|
+/* [ ] dlHdmiCecEnableCalibration */
|
|
+/* [ ] dlHdmiCecDisableCalibration */
|
|
+/* [ ] dlHdmiCecSendMessage */
|
|
+/* [ ] dlHdmiCecSetRegister */
|
|
+
|
|
+#endif /* __cec_h__ */
|
|
+#endif /* __cec_ioctl__ */
|
|
diff --git a/drivers/video/hdmi/tda998x_version.h b/drivers/video/hdmi/tda998x_version.h
|
|
new file mode 100644
|
|
index 0000000..5edc5c1
|
|
--- /dev/null
|
|
+++ b/drivers/video/hdmi/tda998x_version.h
|
|
@@ -0,0 +1,16 @@
|
|
+#ifndef __tda_version__
|
|
+#define __tda_version__
|
|
+
|
|
+/* version */
|
|
+#define TDA_VERSION_MAJOR 1
|
|
+#define TDA_VERSION_MINOR 1
|
|
+#define TDA_VERSION_PATCHLEVEL 0
|
|
+#define TDA_VERSION_EXTRA "-ioctl (2009-10-15)"
|
|
+
|
|
+/* TDA TX chip list */
|
|
+#define TDA19989 "tda19989"
|
|
+#define TDA9984 "tda9984"
|
|
+#define TDA9983 "tda9983"
|
|
+#define TDA9981 "tda9981"
|
|
+
|
|
+#endif
|
|
diff --git a/drivers/video/pxa168fb.c b/drivers/video/pxa168fb.c
|
|
index aa9bd1f..4ae8924 100644
|
|
--- a/drivers/video/pxa168fb.c
|
|
+++ b/drivers/video/pxa168fb.c
|
|
@@ -30,67 +30,243 @@
|
|
#include <linux/uaccess.h>
|
|
#include <video/pxa168fb.h>
|
|
|
|
+#include <linux/gpio.h>
|
|
#include "pxa168fb.h"
|
|
|
|
-#define DEFAULT_REFRESH 60 /* Hz */
|
|
+#include <asm/mach-types.h>
|
|
|
|
-static int determine_best_pix_fmt(struct fb_var_screeninfo *var)
|
|
+#ifdef CONFIG_DVFM
|
|
+#include <mach/dvfm.h>
|
|
+
|
|
+static int dvfm_dev_idx;
|
|
+static void set_dvfm_constraint(void)
|
|
{
|
|
- /*
|
|
- * Pseudocolor mode?
|
|
- */
|
|
- if (var->bits_per_pixel == 8)
|
|
- return PIX_FMT_PSEUDOCOLOR;
|
|
+ /* Disable Lowpower mode */
|
|
+ dvfm_disable_op_name("apps_idle", dvfm_dev_idx);
|
|
+ dvfm_disable_op_name("apps_sleep", dvfm_dev_idx);
|
|
+ dvfm_disable_op_name("sys_sleep", dvfm_dev_idx);
|
|
+ dvfm_disable_op_name("26MHz", dvfm_dev_idx);
|
|
+}
|
|
|
|
- /*
|
|
- * Check for 565/1555.
|
|
- */
|
|
- if (var->bits_per_pixel == 16 && var->red.length <= 5 &&
|
|
- var->green.length <= 6 && var->blue.length <= 5) {
|
|
- if (var->transp.length == 0) {
|
|
- if (var->red.offset >= var->blue.offset)
|
|
- return PIX_FMT_RGB565;
|
|
- else
|
|
- return PIX_FMT_BGR565;
|
|
- }
|
|
+static void unset_dvfm_constraint(void)
|
|
+{
|
|
+ /* Enable Lowpower mode */
|
|
+ dvfm_enable_op_name("apps_idle", dvfm_dev_idx);
|
|
+ dvfm_enable_op_name("apps_sleep", dvfm_dev_idx);
|
|
+ dvfm_enable_op_name("sys_sleep", dvfm_dev_idx);
|
|
+ dvfm_enable_op_name("26MHz", dvfm_dev_idx);
|
|
+}
|
|
|
|
- if (var->transp.length == 1 && var->green.length <= 5) {
|
|
- if (var->red.offset >= var->blue.offset)
|
|
- return PIX_FMT_RGB1555;
|
|
- else
|
|
- return PIX_FMT_BGR1555;
|
|
- }
|
|
+#else
|
|
+static void set_dvfm_constraint(void) {}
|
|
+static void unset_dvfm_constraint(void) {}
|
|
+#endif
|
|
|
|
- /* fall through */
|
|
- }
|
|
+#define MAX_HWC_SIZE (64*64*2)
|
|
+#define MAX_REFRESH_RATE 100 /* Hz */
|
|
+#define MIN_REFRESH_RATE 47 /* Hz */
|
|
+#define DEFAULT_REFRESH 60 /* Hz */
|
|
|
|
- /*
|
|
- * Check for 888/A888.
|
|
- */
|
|
- if (var->bits_per_pixel <= 32 && var->red.length <= 8 &&
|
|
- var->green.length <= 8 && var->blue.length <= 8) {
|
|
- if (var->bits_per_pixel == 24 && var->transp.length == 0) {
|
|
- if (var->red.offset >= var->blue.offset)
|
|
- return PIX_FMT_RGB888PACK;
|
|
- else
|
|
- return PIX_FMT_BGR888PACK;
|
|
+/* Compatibility mode global switch .....
|
|
+ *
|
|
+ * This is a secret switch for user space programs that may want to
|
|
+ * select color spaces and set resolutions the same as legacy PXA display
|
|
+ * drivers. The switch is set and unset by setting a specific value in the
|
|
+ * var_screeninfo.nonstd variable.
|
|
+ *
|
|
+ * To turn on compatibility with older PXA, set the MSB of nonstd to 0xAA.
|
|
+ * To turn off compatibility with older PXA, set the MSB of nonstd to 0x55.
|
|
+ */
|
|
+
|
|
+static unsigned int COMPAT_MODE;
|
|
+unsigned int gra_dma_base_address;
|
|
+EXPORT_SYMBOL(gra_dma_base_address);
|
|
+static unsigned int max_fb_size = 0;
|
|
+
|
|
+#ifdef CONFIG_PM
|
|
+static int _pxa168fb_resume(struct pxa168fb_info *fbi);
|
|
+static int _pxa168fb_suspend(struct pxa168fb_info *fbi, pm_message_t mesg);
|
|
+#endif
|
|
+
|
|
+void pxa168fb_spi_send(struct pxa168fb_info *fbi, void *value, int count, unsigned int spi_gpio_cs)
|
|
+{
|
|
+ u32 x, spi_byte_len;
|
|
+ u8 *cmd = (u8 *)value;
|
|
+ int i, err, isr, iopad;
|
|
+
|
|
+ if (spi_gpio_cs != -1) {
|
|
+ err = gpio_request(spi_gpio_cs, "LCD_SPI_CS");
|
|
+ if (err) {
|
|
+ printk("failed to request GPIO for LCD CS\n");
|
|
+ return;
|
|
+ }
|
|
+ gpio_direction_output(spi_gpio_cs, 1);
|
|
+ }
|
|
+ /* get spi data size */
|
|
+ spi_byte_len = readl(fbi->reg_base + LCD_SPU_SPI_CTRL);
|
|
+ spi_byte_len = (spi_byte_len >> 8) & 0xff;
|
|
+ /* It should be (spi_byte_len + 7) >> 3, but spi controller request set one less than bit length */
|
|
+ spi_byte_len = (spi_byte_len + 8) >> 3;
|
|
+ /* spi command provided by platform should be 1, 2, or 4 byte aligned */
|
|
+ if(spi_byte_len == 3)
|
|
+ spi_byte_len = 4;
|
|
+
|
|
+ iopad = readl(fbi->reg_base + SPU_IOPAD_CONTROL);
|
|
+ for (i = 0; i < count; i++) {
|
|
+ if ((iopad & CFG_IOPADMODE_MASK) != PIN_MODE_DUMB_18_SPI) {
|
|
+ writel(iopad & ~CFG_IOPADMODE_MASK, fbi->reg_base + SPU_IOPAD_CONTROL);
|
|
+ writel(iopad | PIN_MODE_DUMB_18_SPI, fbi->reg_base + SPU_IOPAD_CONTROL);
|
|
}
|
|
+ if (spi_gpio_cs != -1)
|
|
+ gpio_set_value(spi_gpio_cs, 0);
|
|
+ isr = readl(fbi->reg_base + SPU_IRQ_ISR);
|
|
+ writel((isr & ~SPI_IRQ_ENA_MASK), fbi->reg_base + SPU_IRQ_ISR);
|
|
+ switch (spi_byte_len){
|
|
+ case 1:
|
|
+ writel(*cmd, fbi->reg_base + LCD_SPU_SPI_TXDATA);
|
|
+ break;
|
|
+ case 2:
|
|
+ writel(*(u16*)cmd, fbi->reg_base + LCD_SPU_SPI_TXDATA);
|
|
+ break;
|
|
+ case 4:
|
|
+ writel(*(u32*)cmd, fbi->reg_base + LCD_SPU_SPI_TXDATA);
|
|
+ break;
|
|
+ default:
|
|
+ printk("Wrong spi bit length\n");
|
|
+ }
|
|
+ cmd += spi_byte_len;
|
|
+ x = readl(fbi->reg_base + LCD_SPU_SPI_CTRL);
|
|
+ x |= 0x1;
|
|
+ writel(x, fbi->reg_base + LCD_SPU_SPI_CTRL);
|
|
+ isr = readl(fbi->reg_base + SPU_IRQ_ISR);
|
|
+ while(!(isr & SPI_IRQ_ENA_MASK)) {
|
|
+ udelay(1);
|
|
+ isr = readl(fbi->reg_base + SPU_IRQ_ISR);
|
|
+ }
|
|
+ x = readl(fbi->reg_base + LCD_SPU_SPI_CTRL);
|
|
+ x &= ~0x1;
|
|
+ writel(x, fbi->reg_base + LCD_SPU_SPI_CTRL);
|
|
+ if (spi_gpio_cs != -1)
|
|
+ gpio_set_value(spi_gpio_cs, 1);
|
|
+ if ((iopad & CFG_IOPADMODE_MASK) != PIN_MODE_DUMB_18_SPI)
|
|
+ writel(iopad, fbi->reg_base + SPU_IOPAD_CONTROL);
|
|
+ }
|
|
+ if (spi_gpio_cs != -1)
|
|
+ gpio_free(spi_gpio_cs);
|
|
+}
|
|
+EXPORT_SYMBOL(pxa168fb_spi_send);
|
|
|
|
- if (var->bits_per_pixel == 32 && var->transp.length == 8) {
|
|
- if (var->red.offset >= var->blue.offset)
|
|
- return PIX_FMT_RGBA888;
|
|
- else
|
|
- return PIX_FMT_BGRA888;
|
|
- } else {
|
|
- if (var->red.offset >= var->blue.offset)
|
|
- return PIX_FMT_RGB888UNPACK;
|
|
+static int determine_best_pix_fmt(struct fb_var_screeninfo *var)
|
|
+{
|
|
+ unsigned char pxa_format;
|
|
+
|
|
+ /* compatibility switch: if var->nonstd MSB is 0xAA then skip to
|
|
+ * using the nonstd variable to select the color space.
|
|
+ */
|
|
+ if(COMPAT_MODE != 0x2625) {
|
|
+
|
|
+ /*
|
|
+ * Pseudocolor mode?
|
|
+ */
|
|
+ if (var->bits_per_pixel == 8)
|
|
+ return PIX_FMT_PSEUDOCOLOR;
|
|
+
|
|
+ /*
|
|
+ * Check for YUV422PACK.
|
|
+ */
|
|
+ if (var->bits_per_pixel == 16 && var->red.length == 16 &&
|
|
+ var->green.length == 16 && var->blue.length == 16) {
|
|
+ if (var->red.offset >= var->blue.offset) {
|
|
+ if (var->red.offset == 4)
|
|
+ return PIX_FMT_YUV422PACK;
|
|
else
|
|
- return PIX_FMT_BGR888UNPACK;
|
|
+ return PIX_FMT_YUYV422PACK;
|
|
+ } else
|
|
+ return PIX_FMT_YVU422PACK;
|
|
+ }
|
|
+
|
|
+ /*
|
|
+ * Check for 565/1555.
|
|
+ */
|
|
+ if (var->bits_per_pixel == 16 && var->red.length <= 5 &&
|
|
+ var->green.length <= 6 && var->blue.length <= 5) {
|
|
+ if (var->transp.length == 0) {
|
|
+ if (var->red.offset >= var->blue.offset)
|
|
+ return PIX_FMT_RGB565;
|
|
+ else
|
|
+ return PIX_FMT_BGR565;
|
|
+ }
|
|
+
|
|
+ if (var->transp.length == 1 && var->green.length <= 5) {
|
|
+ if (var->red.offset >= var->blue.offset)
|
|
+ return PIX_FMT_RGB1555;
|
|
+ else
|
|
+ return PIX_FMT_BGR1555;
|
|
+ }
|
|
+
|
|
+ /* fall through */
|
|
+ }
|
|
+
|
|
+ /*
|
|
+ * Check for 888/A888.
|
|
+ */
|
|
+ if (var->bits_per_pixel <= 32 && var->red.length <= 8 &&
|
|
+ var->green.length <= 8 && var->blue.length <= 8) {
|
|
+ if (var->bits_per_pixel == 24 && var->transp.length == 0) {
|
|
+ if (var->red.offset >= var->blue.offset)
|
|
+ return PIX_FMT_RGB888PACK;
|
|
+ else
|
|
+ return PIX_FMT_BGR888PACK;
|
|
+ }
|
|
+
|
|
+ if (var->bits_per_pixel == 32 && var->transp.length == 8) {
|
|
+ if (var->red.offset >= var->blue.offset)
|
|
+ return PIX_FMT_RGBA888;
|
|
+ else
|
|
+ return PIX_FMT_BGRA888;
|
|
+ } else {
|
|
+ if (var->red.offset >= var->blue.offset)
|
|
+ return PIX_FMT_RGB888UNPACK;
|
|
+ else
|
|
+ return PIX_FMT_BGR888UNPACK;
|
|
+ }
|
|
+
|
|
+ /* fall through */
|
|
}
|
|
|
|
- /* fall through */
|
|
}
|
|
|
|
+ else {
|
|
+
|
|
+ pxa_format = (var->nonstd >> 20) & 0xf;
|
|
+
|
|
+ switch (pxa_format) {
|
|
+ case 0:
|
|
+ return PIX_FMT_RGB565;
|
|
+ break;
|
|
+ case 5:
|
|
+ return PIX_FMT_RGB1555;
|
|
+ break;
|
|
+ case 6:
|
|
+ return PIX_FMT_RGB888PACK;
|
|
+ break;
|
|
+ case 7:
|
|
+ return PIX_FMT_RGB888UNPACK;
|
|
+ break;
|
|
+ case 8:
|
|
+ return PIX_FMT_RGBA888;
|
|
+ break;
|
|
+ case 9:
|
|
+ return PIX_FMT_YUV422PACK;
|
|
+ break;
|
|
+
|
|
+ default:
|
|
+ return -EINVAL;
|
|
+ }
|
|
+ }
|
|
+
|
|
+
|
|
+
|
|
return -EINVAL;
|
|
}
|
|
|
|
@@ -103,6 +279,7 @@ static void set_pix_fmt(struct fb_var_screeninfo *var, int pix_fmt)
|
|
var->green.offset = 5; var->green.length = 6;
|
|
var->blue.offset = 0; var->blue.length = 5;
|
|
var->transp.offset = 0; var->transp.length = 0;
|
|
+ var->nonstd &= ~0xff0fffff;
|
|
break;
|
|
case PIX_FMT_BGR565:
|
|
var->bits_per_pixel = 16;
|
|
@@ -110,6 +287,7 @@ static void set_pix_fmt(struct fb_var_screeninfo *var, int pix_fmt)
|
|
var->green.offset = 5; var->green.length = 6;
|
|
var->blue.offset = 11; var->blue.length = 5;
|
|
var->transp.offset = 0; var->transp.length = 0;
|
|
+ var->nonstd &= ~0xff0fffff;
|
|
break;
|
|
case PIX_FMT_RGB1555:
|
|
var->bits_per_pixel = 16;
|
|
@@ -117,6 +295,8 @@ static void set_pix_fmt(struct fb_var_screeninfo *var, int pix_fmt)
|
|
var->green.offset = 5; var->green.length = 5;
|
|
var->blue.offset = 0; var->blue.length = 5;
|
|
var->transp.offset = 15; var->transp.length = 1;
|
|
+ var->nonstd &= ~0xff0fffff;
|
|
+ var->nonstd |= 5 << 20;
|
|
break;
|
|
case PIX_FMT_BGR1555:
|
|
var->bits_per_pixel = 16;
|
|
@@ -124,35 +304,91 @@ static void set_pix_fmt(struct fb_var_screeninfo *var, int pix_fmt)
|
|
var->green.offset = 5; var->green.length = 5;
|
|
var->blue.offset = 10; var->blue.length = 5;
|
|
var->transp.offset = 15; var->transp.length = 1;
|
|
- break;
|
|
+ var->nonstd &= ~0xff0fffff;
|
|
+ var->nonstd |= 5 << 20;
|
|
+ break;
|
|
case PIX_FMT_RGB888PACK:
|
|
var->bits_per_pixel = 24;
|
|
var->red.offset = 16; var->red.length = 8;
|
|
var->green.offset = 8; var->green.length = 8;
|
|
var->blue.offset = 0; var->blue.length = 8;
|
|
var->transp.offset = 0; var->transp.length = 0;
|
|
- break;
|
|
+ var->nonstd &= ~0xff0fffff;
|
|
+ var->nonstd |= 6 << 20;
|
|
+ break;
|
|
case PIX_FMT_BGR888PACK:
|
|
var->bits_per_pixel = 24;
|
|
var->red.offset = 0; var->red.length = 8;
|
|
var->green.offset = 8; var->green.length = 8;
|
|
var->blue.offset = 16; var->blue.length = 8;
|
|
var->transp.offset = 0; var->transp.length = 0;
|
|
- break;
|
|
+ var->nonstd &= ~0xff0fffff;
|
|
+ var->nonstd |= 6 << 20;
|
|
+ break;
|
|
+ case PIX_FMT_RGB888UNPACK:
|
|
+ var->bits_per_pixel = 32;
|
|
+ var->red.offset = 16; var->red.length = 8;
|
|
+ var->green.offset = 8; var->green.length = 8;
|
|
+ var->blue.offset = 0; var->blue.length = 8;
|
|
+ var->transp.offset = 0; var->transp.length = 8;
|
|
+ var->nonstd &= ~0xff0fffff;
|
|
+ var->nonstd |= 7 << 20;
|
|
+ break;
|
|
+ case PIX_FMT_BGR888UNPACK:
|
|
+ var->bits_per_pixel = 32;
|
|
+ var->red.offset = 0; var->red.length = 8;
|
|
+ var->green.offset = 8; var->green.length = 8;
|
|
+ var->blue.offset = 16; var->blue.length = 8;
|
|
+ var->transp.offset = 0; var->transp.length = 8;
|
|
+ var->nonstd &= ~0xff0fffff;
|
|
+ var->nonstd |= 7 << 20;
|
|
+ break;
|
|
case PIX_FMT_RGBA888:
|
|
var->bits_per_pixel = 32;
|
|
var->red.offset = 16; var->red.length = 8;
|
|
var->green.offset = 8; var->green.length = 8;
|
|
var->blue.offset = 0; var->blue.length = 8;
|
|
var->transp.offset = 24; var->transp.length = 8;
|
|
- break;
|
|
+ var->nonstd &= ~0xff0fffff;
|
|
+ var->nonstd |= 8 << 20;
|
|
+ break;
|
|
case PIX_FMT_BGRA888:
|
|
var->bits_per_pixel = 32;
|
|
var->red.offset = 0; var->red.length = 8;
|
|
var->green.offset = 8; var->green.length = 8;
|
|
var->blue.offset = 16; var->blue.length = 8;
|
|
var->transp.offset = 24; var->transp.length = 8;
|
|
- break;
|
|
+ var->nonstd &= ~0xff0fffff;
|
|
+ var->nonstd |= 8 << 20;
|
|
+ break;
|
|
+ case PIX_FMT_YUYV422PACK:
|
|
+ var->bits_per_pixel = 16;
|
|
+ var->red.offset = 8; var->red.length = 16;
|
|
+ var->green.offset = 4; var->green.length = 16;
|
|
+ var->blue.offset = 0; var->blue.length = 16;
|
|
+ var->transp.offset = 0; var->transp.length = 0;
|
|
+ var->nonstd &= ~0xff0fffff;
|
|
+ var->nonstd |= 9 << 20;
|
|
+ break;
|
|
+ case PIX_FMT_YVU422PACK:
|
|
+ var->bits_per_pixel = 16;
|
|
+ var->red.offset = 0; var->red.length = 16;
|
|
+ var->green.offset = 8; var->green.length = 16;
|
|
+ var->blue.offset = 12; var->blue.length = 16;
|
|
+ var->transp.offset = 0; var->transp.length = 0;
|
|
+ var->nonstd &= ~0xff0fffff;
|
|
+ var->nonstd |= 9 << 20;
|
|
+ break;
|
|
+ case PIX_FMT_YUV422PACK:
|
|
+ var->bits_per_pixel = 16;
|
|
+ var->red.offset = 4; var->red.length = 16;
|
|
+ var->green.offset = 12; var->green.length = 16;
|
|
+ var->blue.offset = 0; var->blue.length = 16;
|
|
+ var->transp.offset = 0; var->transp.length = 0;
|
|
+ var->nonstd &= ~0xff0fffff;
|
|
+ var->nonstd |= 9 << 20;
|
|
+ break;
|
|
+
|
|
case PIX_FMT_PSEUDOCOLOR:
|
|
var->bits_per_pixel = 8;
|
|
var->red.offset = 0; var->red.length = 8;
|
|
@@ -164,18 +400,17 @@ static void set_pix_fmt(struct fb_var_screeninfo *var, int pix_fmt)
|
|
}
|
|
|
|
static void set_mode(struct pxa168fb_info *fbi, struct fb_var_screeninfo *var,
|
|
- struct fb_videomode *mode, int pix_fmt, int ystretch)
|
|
+ const struct fb_videomode *mode, int pix_fmt, int ystretch)
|
|
{
|
|
- struct fb_info *info = fbi->info;
|
|
|
|
- set_pix_fmt(var, pix_fmt);
|
|
+ dev_dbg(fbi->info->dev, "Enter %s\n", __FUNCTION__);
|
|
+ set_pix_fmt(var, pix_fmt);
|
|
|
|
var->xres = mode->xres;
|
|
var->yres = mode->yres;
|
|
var->xres_virtual = max(var->xres, var->xres_virtual);
|
|
if (ystretch)
|
|
- var->yres_virtual = info->fix.smem_len /
|
|
- (var->xres_virtual * (var->bits_per_pixel >> 3));
|
|
+ var->yres_virtual = var->yres *2;
|
|
else
|
|
var->yres_virtual = max(var->yres, var->yres_virtual);
|
|
var->grayscale = 0;
|
|
@@ -195,17 +430,19 @@ static void set_mode(struct pxa168fb_info *fbi, struct fb_var_screeninfo *var,
|
|
static int pxa168fb_check_var(struct fb_var_screeninfo *var,
|
|
struct fb_info *info)
|
|
{
|
|
- struct pxa168fb_info *fbi = info->par;
|
|
- int pix_fmt;
|
|
+ dev_dbg(info->dev, "Enter %s\n", __FUNCTION__);
|
|
+ if (var->bits_per_pixel == 8)
|
|
+ return -EINVAL;
|
|
|
|
- /*
|
|
- * Determine which pixel format we're going to use.
|
|
- */
|
|
- pix_fmt = determine_best_pix_fmt(var);
|
|
- if (pix_fmt < 0)
|
|
- return pix_fmt;
|
|
- set_pix_fmt(var, pix_fmt);
|
|
- fbi->pix_fmt = pix_fmt;
|
|
+ /* compatibility mode: if the MSB of var->nonstd is 0xAA then
|
|
+ * set xres_virtual and yres_virtual to xres and yres.
|
|
+ */
|
|
+
|
|
+ if((var->nonstd >> 24) == 0xAA)
|
|
+ COMPAT_MODE = 0x2625;
|
|
+
|
|
+ if((var->nonstd >> 24) == 0x55)
|
|
+ COMPAT_MODE = 0x0;
|
|
|
|
/*
|
|
* Basic geometry sanity checks.
|
|
@@ -225,7 +462,7 @@ static int pxa168fb_check_var(struct fb_var_screeninfo *var,
|
|
* Check size of framebuffer.
|
|
*/
|
|
if (var->xres_virtual * var->yres_virtual *
|
|
- (var->bits_per_pixel >> 3) > info->fix.smem_len)
|
|
+ (var->bits_per_pixel >> 3) > max_fb_size)
|
|
return -EINVAL;
|
|
|
|
return 0;
|
|
@@ -249,6 +486,17 @@ static void set_clock_divider(struct pxa168fb_info *fbi,
|
|
u64 div_result;
|
|
u32 x = 0;
|
|
|
|
+ /* gplugd uses external clock */
|
|
+ if (machine_is_gplugd()) {
|
|
+ /* Clear bi 31, set bit 28 to use External Clock;
|
|
+ * set clock divider*/
|
|
+ x = (1 << 28);
|
|
+
|
|
+ /* Set CLK_INT_DIV to 1 */
|
|
+ x |= 0x1;
|
|
+ writel(x, fbi->reg_base + LCD_CFG_SCLK_DIV);
|
|
+ return;
|
|
+ }
|
|
/*
|
|
* Notice: The field pixclock is used by linux fb
|
|
* is in pixel second. E.g. struct fb_videomode &
|
|
@@ -258,8 +506,9 @@ static void set_clock_divider(struct pxa168fb_info *fbi,
|
|
/*
|
|
* Check input values.
|
|
*/
|
|
- if (!m || !m->pixclock || !m->refresh) {
|
|
- dev_err(fbi->dev, "Input refresh or pixclock is wrong.\n");
|
|
+ dev_dbg(fbi->info->dev, "Enter %s\n", __FUNCTION__);
|
|
+ if (!m || !m->pixclock || !m->refresh) {
|
|
+ printk(KERN_ERR "Input refresh or pixclock is wrong.\n");
|
|
return;
|
|
}
|
|
|
|
@@ -279,8 +528,8 @@ static void set_clock_divider(struct pxa168fb_info *fbi,
|
|
|
|
/* check whether divisor is too small. */
|
|
if (divider_int < 2) {
|
|
- dev_warn(fbi->dev, "Warning: clock source is too slow."
|
|
- "Try smaller resolution\n");
|
|
+ printk(KERN_WARNING "Warning: clock source is too slow."
|
|
+ "Try smaller resolution\n");
|
|
divider_int = 2;
|
|
}
|
|
|
|
@@ -295,12 +544,13 @@ static void set_dma_control0(struct pxa168fb_info *fbi)
|
|
{
|
|
u32 x;
|
|
|
|
+
|
|
+ dev_dbg(fbi->info->dev,"Enter %s\n", __FUNCTION__);
|
|
/*
|
|
* Set bit to enable graphics DMA.
|
|
*/
|
|
x = readl(fbi->reg_base + LCD_SPU_DMA_CTRL0);
|
|
- x &= ~CFG_GRA_ENA_MASK;
|
|
- x |= fbi->active ? CFG_GRA_ENA(1) : CFG_GRA_ENA(0);
|
|
+ x |= fbi->active ? 0x00000100 : 0;
|
|
|
|
/*
|
|
* If we are in a pseudo-color mode, we need to enable
|
|
@@ -316,12 +566,27 @@ static void set_dma_control0(struct pxa168fb_info *fbi)
|
|
x |= (fbi->pix_fmt >> 1) << 16;
|
|
|
|
/*
|
|
- * Check red and blue pixel swap.
|
|
- * 1. source data swap
|
|
- * 2. panel output data swap
|
|
+ * Check YUV422PACK
|
|
*/
|
|
- x &= ~(1 << 12);
|
|
- x |= ((fbi->pix_fmt & 1) ^ (fbi->panel_rbswap)) << 12;
|
|
+ x &= ~((1 << 9) | (1 << 11) | (1 << 10) | (1 << 12));
|
|
+ if (((fbi->pix_fmt >> 1) == 5) || (fbi->pix_fmt & 0x1000)) {
|
|
+ x |= 1 << 9;
|
|
+ x |= (fbi->panel_rbswap) << 12;
|
|
+ if (fbi->pix_fmt == 11)
|
|
+ x |= 1 << 11;
|
|
+ if (fbi->pix_fmt & 0x1000)
|
|
+ x |= 1 << 10;
|
|
+ } else {
|
|
+
|
|
+ /*
|
|
+ * Check red and blue pixel swap.
|
|
+ * 1. source data swap. BGR[M:L] rather than RGB[M:L] is stored in memeory as source format.
|
|
+ * 2. panel output data swap
|
|
+ */
|
|
+ x |= (((fbi->pix_fmt & 1) ^ 1) ^ (fbi->panel_rbswap)) << 12;
|
|
+ }
|
|
+
|
|
+ x |= CFG_ARBFAST_ENA(1);
|
|
|
|
writel(x, fbi->reg_base + LCD_SPU_DMA_CTRL0);
|
|
}
|
|
@@ -330,14 +595,14 @@ static void set_dma_control1(struct pxa168fb_info *fbi, int sync)
|
|
{
|
|
u32 x;
|
|
|
|
- /*
|
|
+ dev_dbg(fbi->info->dev, "Enter %s\n", __FUNCTION__);
|
|
+ /*
|
|
* Configure default bits: vsync triggers DMA, gated clock
|
|
* enable, power save enable, configure alpha registers to
|
|
* display 100% graphics, and set pixel command.
|
|
*/
|
|
x = readl(fbi->reg_base + LCD_SPU_DMA_CTRL1);
|
|
- x |= 0x2032ff81;
|
|
-
|
|
+
|
|
/*
|
|
* We trigger DMA on the falling edge of vsync if vsync is
|
|
* active low, or on the rising edge if vsync is active high.
|
|
@@ -345,6 +610,7 @@ static void set_dma_control1(struct pxa168fb_info *fbi, int sync)
|
|
if (!(sync & FB_SYNC_VERT_HIGH_ACT))
|
|
x |= 0x08000000;
|
|
|
|
+
|
|
writel(x, fbi->reg_base + LCD_SPU_DMA_CTRL1);
|
|
}
|
|
|
|
@@ -355,10 +621,26 @@ static void set_graphics_start(struct fb_info *info, int xoffset, int yoffset)
|
|
int pixel_offset;
|
|
unsigned long addr;
|
|
|
|
- pixel_offset = (yoffset * var->xres_virtual) + xoffset;
|
|
+ pixel_offset = (yoffset * var->xres_virtual) + xoffset;
|
|
+ /*pixel_offset = (100 * var->xres_virtual) + 100;*/
|
|
|
|
addr = fbi->fb_start_dma + (pixel_offset * (var->bits_per_pixel >> 3));
|
|
- writel(addr, fbi->reg_base + LCD_CFG_GRA_START_ADDR0);
|
|
+
|
|
+ /* The video layer will write this address at VSync time */
|
|
+
|
|
+ gra_dma_base_address = addr;
|
|
+
|
|
+ if (0/*is_android()*/) {
|
|
+ writel(gra_dma_base_address,
|
|
+ fbi->reg_base + LCD_CFG_GRA_START_ADDR0);
|
|
+ } else {
|
|
+ /* Enable the interrupt */
|
|
+ writel(readl(fbi->reg_base+SPU_IRQ_ENA)
|
|
+ |VSYNC_IRQ_ENA(0x1),
|
|
+ fbi->reg_base+SPU_IRQ_ENA);
|
|
+ }
|
|
+
|
|
+
|
|
}
|
|
|
|
static void set_dumb_panel_control(struct fb_info *info)
|
|
@@ -367,7 +649,9 @@ static void set_dumb_panel_control(struct fb_info *info)
|
|
struct pxa168fb_mach_info *mi = fbi->dev->platform_data;
|
|
u32 x;
|
|
|
|
- /*
|
|
+ dev_dbg(info->dev, "Enter %s\n", __FUNCTION__);
|
|
+
|
|
+ /*
|
|
* Preserve enable flag.
|
|
*/
|
|
x = readl(fbi->reg_base + LCD_SPU_DUMB_CTRL) & 0x00000001;
|
|
@@ -379,8 +663,8 @@ static void set_dumb_panel_control(struct fb_info *info)
|
|
x |= mi->invert_composite_blank ? 0x00000040 : 0;
|
|
x |= (info->var.sync & FB_SYNC_COMP_HIGH_ACT) ? 0x00000020 : 0;
|
|
x |= mi->invert_pix_val_ena ? 0x00000010 : 0;
|
|
- x |= (info->var.sync & FB_SYNC_VERT_HIGH_ACT) ? 0 : 0x00000008;
|
|
- x |= (info->var.sync & FB_SYNC_HOR_HIGH_ACT) ? 0 : 0x00000004;
|
|
+ x |= (info->var.sync & FB_SYNC_VERT_HIGH_ACT) ? 0x00000008 : 0;
|
|
+ x |= (info->var.sync & FB_SYNC_HOR_HIGH_ACT) ? 0x00000004 : 0;
|
|
x |= mi->invert_pixclock ? 0x00000002 : 0;
|
|
|
|
writel(x, fbi->reg_base + LCD_SPU_DUMB_CTRL);
|
|
@@ -393,37 +677,49 @@ static void set_dumb_screen_dimensions(struct fb_info *info)
|
|
int x;
|
|
int y;
|
|
|
|
- x = v->xres + v->right_margin + v->hsync_len + v->left_margin;
|
|
+ dev_dbg(info->dev, "Enter %s\n", __FUNCTION__);
|
|
+
|
|
+ x = v->xres + v->right_margin + v->hsync_len + v->left_margin;
|
|
y = v->yres + v->lower_margin + v->vsync_len + v->upper_margin;
|
|
|
|
writel((y << 16) | x, fbi->reg_base + LCD_SPUT_V_H_TOTAL);
|
|
}
|
|
|
|
+static void pxa168fb_clear_framebuffer(struct fb_info *info)
|
|
+{
|
|
+ struct pxa168fb_info *fbi = info->par;
|
|
+
|
|
+ memset(fbi->fb_start, 0, fbi->fb_size);
|
|
+}
|
|
+
|
|
static int pxa168fb_set_par(struct fb_info *info)
|
|
{
|
|
struct pxa168fb_info *fbi = info->par;
|
|
struct fb_var_screeninfo *var = &info->var;
|
|
- struct fb_videomode mode;
|
|
+ const struct fb_videomode *mode;
|
|
+ int pix_fmt;
|
|
u32 x;
|
|
struct pxa168fb_mach_info *mi;
|
|
|
|
- mi = fbi->dev->platform_data;
|
|
+ dev_dbg(info->dev, "Enter %s\n", __FUNCTION__);
|
|
+
|
|
+ mi = fbi->dev->platform_data;
|
|
+ /*
|
|
+ * Determine which pixel format we're going to use.
|
|
+ */
|
|
+ pix_fmt = determine_best_pix_fmt(&info->var);
|
|
+ if (pix_fmt < 0)
|
|
+ return pix_fmt;
|
|
+ fbi->pix_fmt = pix_fmt;
|
|
+ dev_dbg(info->dev, "Pixel Format = %d\n", pix_fmt);
|
|
|
|
/*
|
|
* Set additional mode info.
|
|
*/
|
|
- if (fbi->pix_fmt == PIX_FMT_PSEUDOCOLOR)
|
|
+ if (pix_fmt == PIX_FMT_PSEUDOCOLOR)
|
|
info->fix.visual = FB_VISUAL_PSEUDOCOLOR;
|
|
else
|
|
info->fix.visual = FB_VISUAL_TRUECOLOR;
|
|
- info->fix.line_length = var->xres_virtual * var->bits_per_pixel / 8;
|
|
- info->fix.ypanstep = var->yres;
|
|
-
|
|
- /*
|
|
- * Disable panel output while we setup the display.
|
|
- */
|
|
- x = readl(fbi->reg_base + LCD_SPU_DUMB_CTRL);
|
|
- writel(x & ~1, fbi->reg_base + LCD_SPU_DUMB_CTRL);
|
|
|
|
/*
|
|
* Configure global panel parameters.
|
|
@@ -431,13 +727,22 @@ static int pxa168fb_set_par(struct fb_info *info)
|
|
writel((var->yres << 16) | var->xres,
|
|
fbi->reg_base + LCD_SPU_V_H_ACTIVE);
|
|
|
|
+ dev_dbg(info->dev, "xres=%d yres=%d\n", var->xres, var->yres);
|
|
/*
|
|
* convet var to video mode
|
|
*/
|
|
- fb_var_to_videomode(&mode, &info->var);
|
|
+
|
|
+ mode = fb_find_best_mode(var, &info->modelist);
|
|
+ set_mode(fbi, var, mode, pix_fmt, 1);
|
|
+
|
|
+ info->fix.line_length = var->xres_virtual * var->bits_per_pixel / 8;
|
|
+ info->fix.ypanstep = var->yres;
|
|
+
|
|
+ info->fix.smem_len = var->xres_virtual * var->yres_virtual * var->bits_per_pixel/8;
|
|
+ info->screen_size = info->fix.smem_len;
|
|
|
|
/* Calculate clock divisor. */
|
|
- set_clock_divider(fbi, &mode);
|
|
+ set_clock_divider(fbi, mode);
|
|
|
|
/* Configure dma ctrl regs. */
|
|
set_dma_control0(fbi);
|
|
@@ -446,6 +751,7 @@ static int pxa168fb_set_par(struct fb_info *info)
|
|
/*
|
|
* Configure graphics DMA parameters.
|
|
*/
|
|
+ set_graphics_start(info, info->var.xoffset, info->var.yoffset);
|
|
x = readl(fbi->reg_base + LCD_CFG_GRA_PITCH);
|
|
x = (x & ~0xFFFF) | ((var->xres_virtual * var->bits_per_pixel) >> 3);
|
|
writel(x, fbi->reg_base + LCD_CFG_GRA_PITCH);
|
|
@@ -465,12 +771,10 @@ static int pxa168fb_set_par(struct fb_info *info)
|
|
writel((var->upper_margin << 16) | var->lower_margin,
|
|
fbi->reg_base + LCD_SPU_V_PORCH);
|
|
|
|
- /*
|
|
- * Re-enable panel output.
|
|
- */
|
|
- x = readl(fbi->reg_base + LCD_SPU_DUMB_CTRL);
|
|
- writel(x | 1, fbi->reg_base + LCD_SPU_DUMB_CTRL);
|
|
|
|
+ x = readl(fbi->reg_base + LCD_SPU_DUMB_CTRL);
|
|
+ if ((x & 1) == 0)
|
|
+ writel(x | 1, fbi->reg_base + LCD_SPU_DUMB_CTRL);
|
|
return 0;
|
|
}
|
|
|
|
@@ -495,7 +799,7 @@ static u32 to_rgb(u16 red, u16 green, u16 blue)
|
|
struct pxa168fb_info *fbi = info->par;
|
|
u32 val;
|
|
|
|
- if (info->var.grayscale)
|
|
+ if (info->var.grayscale)
|
|
red = green = blue = (19595 * red + 38470 * green +
|
|
7471 * blue) >> 16;
|
|
|
|
@@ -519,38 +823,228 @@ static int pxa168fb_blank(int blank, struct fb_info *info)
|
|
{
|
|
struct pxa168fb_info *fbi = info->par;
|
|
|
|
+#ifdef CONFIG_PM
|
|
+
|
|
+ pm_message_t mesg = PMSG_SUSPEND;
|
|
+
|
|
+ switch (blank) {
|
|
+ case FB_BLANK_POWERDOWN:
|
|
+ case FB_BLANK_VSYNC_SUSPEND:
|
|
+ case FB_BLANK_HSYNC_SUSPEND:
|
|
+ case FB_BLANK_NORMAL:
|
|
+ _pxa168fb_suspend(fbi, mesg);
|
|
+ break;
|
|
+
|
|
+ case FB_BLANK_UNBLANK:
|
|
+ _pxa168fb_resume(fbi);
|
|
+ break;
|
|
+ default:
|
|
+ break;
|
|
+ }
|
|
+ return 0;
|
|
+#else
|
|
+
|
|
fbi->is_blanked = (blank == FB_BLANK_UNBLANK) ? 0 : 1;
|
|
set_dumb_panel_control(info);
|
|
|
|
return 0;
|
|
+#endif
|
|
}
|
|
|
|
static int pxa168fb_pan_display(struct fb_var_screeninfo *var,
|
|
struct fb_info *info)
|
|
{
|
|
- set_graphics_start(info, var->xoffset, var->yoffset);
|
|
+ dev_dbg(info->dev, "Enter %s\n", __FUNCTION__);
|
|
+ set_graphics_start(info, var->xoffset, var->yoffset);
|
|
|
|
return 0;
|
|
}
|
|
|
|
static irqreturn_t pxa168fb_handle_irq(int irq, void *dev_id)
|
|
{
|
|
- struct pxa168fb_info *fbi = dev_id;
|
|
- u32 isr = readl(fbi->reg_base + SPU_IRQ_ISR);
|
|
+ struct pxa168fb_info *fbi = (struct pxa168fb_info *)dev_id;
|
|
+ u32 isr;
|
|
+
|
|
+ isr = readl(fbi->reg_base+SPU_IRQ_ISR);
|
|
|
|
if ((isr & GRA_FRAME_IRQ0_ENA_MASK)) {
|
|
+ /* wake up queue. */
|
|
+ atomic_set(&fbi->w_intr, 1);
|
|
+ wake_up(&fbi->w_intr_wq);
|
|
|
|
writel(isr & (~GRA_FRAME_IRQ0_ENA_MASK),
|
|
- fbi->reg_base + SPU_IRQ_ISR);
|
|
+ fbi->reg_base+SPU_IRQ_ISR);
|
|
|
|
return IRQ_HANDLED;
|
|
}
|
|
+
|
|
return IRQ_NONE;
|
|
}
|
|
|
|
+#ifdef CONFIG_DYNAMIC_PRINTK_DEBUG
|
|
+static void debug_identify_called_ioctl(struct fb_info *info, int cmd, unsigned long arg)
|
|
+{
|
|
+ switch (cmd) {
|
|
+ case FBIO_CLEAR_FRAMEBUFFER:
|
|
+ dev_dbg(info->dev, " FBIO_CLEAR_FRAMEBUFFER\n");
|
|
+ break;
|
|
+ case FBIOPUT_SWAP_GRAPHIC_RED_BLUE:
|
|
+ dev_dbg(info->dev,
|
|
+ " FBIOPUT_SWAP_GRAPHIC_RED_BLUE with arg = %08x\n",
|
|
+ (unsigned int)arg);
|
|
+ break;
|
|
+ case FBIOPUT_SWAP_GRAPHIC_U_V:
|
|
+ dev_dbg(info->dev,
|
|
+ " FBIOPUT_SWAP_GRAPHIC_U_V with arg = %08x\n",
|
|
+ (unsigned int)arg);
|
|
+ break;
|
|
+ case FBIOPUT_SWAP_GRAPHIC_Y_UV:
|
|
+ dev_dbg(info->dev,
|
|
+ " FBIOPUT_SWAP_GRAPHIC_Y_UV with arg = %08x\n",
|
|
+ (unsigned int)arg);
|
|
+ break;
|
|
+ case FBIOPUT_VIDEO_ALPHABLEND:
|
|
+ dev_dbg(info->dev,
|
|
+ " FBIOPUT_VIDEO_ALPHABLEND with arg = %08x\n",
|
|
+ (unsigned int)arg);
|
|
+ break;
|
|
+ case FBIOPUT_GLOBAL_ALPHABLEND:
|
|
+ dev_dbg(info->dev,
|
|
+ " FBIOPUT_GLOBAL_ALPHABLEND with arg = %08x\n",
|
|
+ (unsigned int) arg);
|
|
+ break;
|
|
+ case FBIOPUT_GRAPHIC_ALPHABLEND:
|
|
+ dev_dbg(info->dev,
|
|
+ " FBIOPUT_GRAPHIC_ALPHABLEND with arg = %08x\n",
|
|
+ (unsigned int)arg);
|
|
+ break;
|
|
+
|
|
+ }
|
|
+}
|
|
+#endif
|
|
+
|
|
+static int pxa168_graphic_ioctl(struct fb_info *info, unsigned int cmd, unsigned long arg)
|
|
+{
|
|
+ int blendval;
|
|
+ int val;
|
|
+ unsigned char param;
|
|
+ struct pxa168fb_info *fbi = info->par;
|
|
+
|
|
+#ifdef CONFIG_DYNAMIC_PRINTK_DEBUG
|
|
+ debug_identify_called_ioctl(info, cmd, arg);
|
|
+#endif
|
|
+
|
|
+ switch (cmd) {
|
|
+
|
|
+ case FBIO_CLEAR_FRAMEBUFFER:
|
|
+ pxa168fb_clear_framebuffer(info);
|
|
+ return 0;
|
|
+ break;
|
|
+
|
|
+ case FBIOPUT_VIDEO_ALPHABLEND:
|
|
+ /*
|
|
+ * This puts the blending control to the Video layer.
|
|
+ */
|
|
+ val = readl(fbi->reg_base + LCD_SPU_DMA_CTRL1);
|
|
+ val &= ~CFG_ALPHA_MODE_MASK;
|
|
+ val &= ~CFG_ALPHA_MASK;
|
|
+ val |= CFG_ALPHA_MODE(0);
|
|
+ val |= CFG_ALPHA(0xff);
|
|
+ writel(val, fbi->reg_base + LCD_SPU_DMA_CTRL1);
|
|
+ return 0;
|
|
+ break;
|
|
+
|
|
+ case FBIOPUT_GLOBAL_ALPHABLEND:
|
|
+ /*
|
|
+ * The userspace application can specify a byte value for the amount of global blend
|
|
+ * between the video layer and the graphic layer.
|
|
+ *
|
|
+ * The alpha blending is per the formula below:
|
|
+ * P = (V[P] * blendval/255) + (G[P] * (1 - blendval/255))
|
|
+ *
|
|
+ * where: P = Pixel value, V = Video Layer, and G = Graphic Layer
|
|
+ */
|
|
+ blendval = (arg & 0xff);
|
|
+ val = readl(fbi->reg_base + LCD_SPU_DMA_CTRL1);
|
|
+ val &= ~CFG_ALPHA_MODE_MASK;
|
|
+ val &= ~CFG_ALPHA_MASK;
|
|
+ val |= CFG_ALPHA_MODE(2);
|
|
+ val |= CFG_ALPHA(blendval);
|
|
+ writel(val, fbi->reg_base + LCD_SPU_DMA_CTRL1);
|
|
+ return 0;
|
|
+ break;
|
|
+
|
|
+ case FBIOPUT_GRAPHIC_ALPHABLEND:
|
|
+ /*
|
|
+ * This puts the blending back to the default mode of allowing
|
|
+ * the graphic layer to do pixel level blending.
|
|
+ */
|
|
+ val = readl(fbi->reg_base + LCD_SPU_DMA_CTRL1);
|
|
+ val &= ~CFG_ALPHA_MODE_MASK;
|
|
+ val &= ~CFG_ALPHA_MASK;
|
|
+ val |= CFG_ALPHA_MODE(1);
|
|
+ val |= CFG_ALPHA(0xff);
|
|
+ writel(val, fbi->reg_base + LCD_SPU_DMA_CTRL1);
|
|
+ return 0;
|
|
+ break;
|
|
+
|
|
+ case FBIOPUT_SWAP_GRAPHIC_RED_BLUE:
|
|
+ param = (arg & 0x1);
|
|
+
|
|
+ val = readl(fbi->reg_base + LCD_SPU_DMA_CTRL0);
|
|
+ val &= ~CFG_GRA_SWAPRB_MASK;
|
|
+ val |= CFG_GRA_SWAPRB(param);
|
|
+ writel(val, fbi->reg_base + LCD_SPU_DMA_CTRL0);
|
|
+ return 0;
|
|
+ break;
|
|
+
|
|
+ case FBIOPUT_SWAP_GRAPHIC_U_V:
|
|
+ param = (arg & 0x1);
|
|
+
|
|
+ val = readl(fbi->reg_base + LCD_SPU_DMA_CTRL0);
|
|
+ val &= ~CFG_GRA_SWAPUV_MASK;
|
|
+ val |= CFG_GRA_SWAPUV(param);
|
|
+ writel(val, fbi->reg_base + LCD_SPU_DMA_CTRL0);
|
|
+ return 0;
|
|
+ break;
|
|
+
|
|
+ case FBIOPUT_SWAP_GRAPHIC_Y_UV:
|
|
+ param = (arg & 0x1);
|
|
+
|
|
+ val = readl(fbi->reg_base + LCD_SPU_DMA_CTRL0);
|
|
+ val &= ~CFG_GRA_SWAPYU_MASK;
|
|
+ val |= CFG_GRA_SWAPYU(param);
|
|
+ writel(val, fbi->reg_base + LCD_SPU_DMA_CTRL0);
|
|
+ return 0;
|
|
+ break;
|
|
+
|
|
+
|
|
+
|
|
+ default:
|
|
+ break;
|
|
+
|
|
+ }
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+static int pxa168fb_release(struct fb_info *info, int user)
|
|
+{
|
|
+ struct fb_var_screeninfo *var = &info->var;
|
|
+
|
|
+ dev_dbg(info->dev, "Enter %s\n", __FUNCTION__);
|
|
+
|
|
+ /* Turn off compatibility mode */
|
|
+
|
|
+ var->nonstd &= ~0xff000000;
|
|
+ COMPAT_MODE = 0;
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+
|
|
static struct fb_ops pxa168fb_ops = {
|
|
.owner = THIS_MODULE,
|
|
.fb_check_var = pxa168fb_check_var,
|
|
+ .fb_release = pxa168fb_release,
|
|
.fb_set_par = pxa168fb_set_par,
|
|
.fb_setcolreg = pxa168fb_setcolreg,
|
|
.fb_blank = pxa168fb_blank,
|
|
@@ -558,6 +1052,7 @@ static irqreturn_t pxa168fb_handle_irq(int irq, void *dev_id)
|
|
.fb_fillrect = cfb_fillrect,
|
|
.fb_copyarea = cfb_copyarea,
|
|
.fb_imageblit = cfb_imageblit,
|
|
+ .fb_ioctl = pxa168_graphic_ioctl,
|
|
};
|
|
|
|
static int pxa168fb_init_mode(struct fb_info *info,
|
|
@@ -570,11 +1065,24 @@ static int pxa168fb_init_mode(struct fb_info *info,
|
|
u64 div_result;
|
|
const struct fb_videomode *m;
|
|
|
|
+ dev_dbg(info->dev, "Enter %s\n", __FUNCTION__);
|
|
+
|
|
/*
|
|
* Set default value
|
|
*/
|
|
refresh = DEFAULT_REFRESH;
|
|
|
|
+ /*
|
|
+ * If has bootargs, apply it first.
|
|
+ */
|
|
+ if (fbi->dft_vmode.xres && fbi->dft_vmode.yres &&
|
|
+ fbi->dft_vmode.refresh) {
|
|
+ /* set data according bootargs */
|
|
+ var->xres = fbi->dft_vmode.xres;
|
|
+ var->yres = fbi->dft_vmode.yres;
|
|
+ refresh = fbi->dft_vmode.refresh;
|
|
+ }
|
|
+
|
|
/* try to find best video mode. */
|
|
m = fb_find_best_mode(&info->var, &info->modelist);
|
|
if (m)
|
|
@@ -582,10 +1090,7 @@ static int pxa168fb_init_mode(struct fb_info *info,
|
|
|
|
/* Init settings. */
|
|
var->xres_virtual = var->xres;
|
|
- var->yres_virtual = info->fix.smem_len /
|
|
- (var->xres_virtual * (var->bits_per_pixel >> 3));
|
|
- dev_dbg(fbi->dev, "pxa168fb: find best mode: res = %dx%d\n",
|
|
- var->xres, var->yres);
|
|
+ var->yres_virtual = var->yres * 2;
|
|
|
|
/* correct pixclock. */
|
|
total_w = var->xres + var->left_margin + var->right_margin +
|
|
@@ -600,7 +1105,57 @@ static int pxa168fb_init_mode(struct fb_info *info,
|
|
return ret;
|
|
}
|
|
|
|
-static int pxa168fb_probe(struct platform_device *pdev)
|
|
+static void pxa168fb_set_default(struct pxa168fb_info *fbi, struct pxa168fb_mach_info *mi)
|
|
+{
|
|
+ /*
|
|
+ * Configure default register values.
|
|
+ */
|
|
+ /*writel(0x00000000, fbi->reg_base + LCD_SPU_BLANKCOLOR);*/
|
|
+ writel(0x55aa55aa, fbi->reg_base + LCD_SPU_BLANKCOLOR);
|
|
+ writel(mi->io_pin_allocation_mode, fbi->reg_base + SPU_IOPAD_CONTROL);
|
|
+ writel(0x00000000, fbi->reg_base + LCD_CFG_GRA_START_ADDR1);
|
|
+ writel(0x00000000, fbi->reg_base + LCD_SPU_GRA_OVSA_HPXL_VLN);
|
|
+ writel(0x0, fbi->reg_base + LCD_SPU_SRAM_PARA0);
|
|
+ writel(CFG_CSB_256x32(0x1)|CFG_CSB_256x24(0x1)|CFG_CSB_256x8(0x1),
|
|
+ fbi->reg_base + LCD_SPU_SRAM_PARA1);
|
|
+ writel(VIDEO_FIFO(1) | GRAPHIC_FIFO(1) , fbi->reg_base + LCD_FIFO_DEPTH);
|
|
+
|
|
+
|
|
+ /*
|
|
+ * Configure default bits: vsync triggers DMA,
|
|
+ * power save enable, configure alpha registers to
|
|
+ * display 100% graphics, and set pixel command.
|
|
+ */
|
|
+ writel(0x2011ff81, fbi->reg_base + LCD_SPU_DMA_CTRL1);
|
|
+ /*writel(0x2001ff81, fbi->reg_base + LCD_SPU_DMA_CTRL1);*/
|
|
+}
|
|
+
|
|
+static void pxa168fb_power(struct pxa168fb_info *fbi, struct pxa168fb_mach_info *mi, int on)
|
|
+{
|
|
+ if (on)
|
|
+ set_dvfm_constraint();
|
|
+
|
|
+ if ((mi->spi_ctrl != -1) && (mi->spi_ctrl & CFG_SPI_ENA_MASK))
|
|
+ writel(mi->spi_ctrl, fbi->reg_base + LCD_SPU_SPI_CTRL);
|
|
+
|
|
+ if (mi->pxa168fb_lcd_power)
|
|
+ mi->pxa168fb_lcd_power(fbi, mi->spi_gpio_cs, mi->spi_gpio_reset, on);
|
|
+
|
|
+ if (!on)
|
|
+ unset_dvfm_constraint();
|
|
+}
|
|
+
|
|
+static int __init get_fb_size(char *str)
|
|
+{
|
|
+ int n;
|
|
+ if (!get_option(&str, &n))
|
|
+ return 0;
|
|
+ max_fb_size = n;
|
|
+ return 1;
|
|
+}
|
|
+__setup("fb_size=", get_fb_size);
|
|
+
|
|
+static int pxa168fb_probe(struct platform_device *pdev)
|
|
{
|
|
struct pxa168fb_mach_info *mi;
|
|
struct fb_info *info = 0;
|
|
@@ -624,46 +1179,51 @@ static int pxa168fb_probe(struct platform_device *pdev)
|
|
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
|
if (res == NULL) {
|
|
dev_err(&pdev->dev, "no IO memory defined\n");
|
|
- ret = -ENOENT;
|
|
- goto failed_put_clk;
|
|
+ return -ENOENT;
|
|
}
|
|
|
|
irq = platform_get_irq(pdev, 0);
|
|
if (irq < 0) {
|
|
dev_err(&pdev->dev, "no IRQ defined\n");
|
|
- ret = -ENOENT;
|
|
- goto failed_put_clk;
|
|
+ return -ENOENT;
|
|
}
|
|
|
|
info = framebuffer_alloc(sizeof(struct pxa168fb_info), &pdev->dev);
|
|
- if (info == NULL) {
|
|
- ret = -ENOMEM;
|
|
- goto failed_put_clk;
|
|
- }
|
|
+ if (info == NULL)
|
|
+ return -ENOMEM;
|
|
|
|
/* Initialize private data */
|
|
fbi = info->par;
|
|
fbi->info = info;
|
|
+ platform_set_drvdata(pdev, fbi);
|
|
fbi->clk = clk;
|
|
- fbi->dev = info->dev = &pdev->dev;
|
|
+ fbi->dev = &pdev->dev;
|
|
fbi->panel_rbswap = mi->panel_rbswap;
|
|
fbi->is_blanked = 0;
|
|
+ fbi->debug = 0;
|
|
fbi->active = mi->active;
|
|
|
|
+ /* Initialize boot setting */
|
|
+ fbi->dft_vmode.xres = mi->modes->xres;
|
|
+ fbi->dft_vmode.yres = mi->modes->yres;
|
|
+ fbi->dft_vmode.refresh = mi->modes->refresh;
|
|
+
|
|
+ init_waitqueue_head(&fbi->w_intr_wq);
|
|
+
|
|
/*
|
|
* Initialise static fb parameters.
|
|
*/
|
|
info->flags = FBINFO_DEFAULT | FBINFO_PARTIAL_PAN_OK |
|
|
- FBINFO_HWACCEL_XPAN | FBINFO_HWACCEL_YPAN;
|
|
+ FBINFO_HWACCEL_XPAN | FBINFO_HWACCEL_YPAN;
|
|
info->node = -1;
|
|
- strlcpy(info->fix.id, mi->id, 16);
|
|
+ strcpy(info->fix.id, mi->id);
|
|
info->fix.type = FB_TYPE_PACKED_PIXELS;
|
|
info->fix.type_aux = 0;
|
|
info->fix.xpanstep = 0;
|
|
info->fix.ypanstep = 0;
|
|
info->fix.ywrapstep = 0;
|
|
info->fix.mmio_start = res->start;
|
|
- info->fix.mmio_len = resource_size(res);
|
|
+ info->fix.mmio_len = res->end - res->start + 1;
|
|
info->fix.accel = FB_ACCEL_NONE;
|
|
info->fbops = &pxa168fb_ops;
|
|
info->pseudo_palette = fbi->pseudo_palette;
|
|
@@ -671,27 +1231,47 @@ static int pxa168fb_probe(struct platform_device *pdev)
|
|
/*
|
|
* Map LCD controller registers.
|
|
*/
|
|
- fbi->reg_base = devm_ioremap_nocache(&pdev->dev, res->start,
|
|
- resource_size(res));
|
|
+ fbi->reg_base = ioremap_nocache(res->start, res->end - res->start);
|
|
if (fbi->reg_base == NULL) {
|
|
ret = -ENOMEM;
|
|
- goto failed_free_info;
|
|
+ goto failed;
|
|
}
|
|
|
|
/*
|
|
* Allocate framebuffer memory.
|
|
*/
|
|
- info->fix.smem_len = PAGE_ALIGN(DEFAULT_FB_SIZE);
|
|
|
|
- info->screen_base = dma_alloc_writecombine(fbi->dev, info->fix.smem_len,
|
|
- &fbi->fb_start_dma, GFP_KERNEL);
|
|
- if (info->screen_base == NULL) {
|
|
+ if (!max_fb_size) {
|
|
+ if (mi->max_fb_size)
|
|
+ max_fb_size = mi->max_fb_size;
|
|
+ else
|
|
+ max_fb_size = DEFAULT_FB_SIZE;
|
|
+ }
|
|
+ max_fb_size = PAGE_ALIGN(max_fb_size);
|
|
+ fbi->fb_size = max_fb_size;
|
|
+
|
|
+ fbi->fb_start = dma_alloc_writecombine(fbi->dev, max_fb_size,
|
|
+ &fbi->fb_start_dma,
|
|
+ GFP_KERNEL);
|
|
+
|
|
+ if (!fbi->fb_start || !fbi->fb_start_dma) {
|
|
+ fbi->fb_start = (void *)__get_free_pages(GFP_DMA | GFP_KERNEL,
|
|
+ get_order(fbi->fb_size));
|
|
+ fbi->fb_start_dma = (dma_addr_t)__virt_to_phys((long unsigned int)fbi->fb_start);
|
|
+ }
|
|
+
|
|
+ if (fbi->fb_start == NULL) {
|
|
+ printk("%s: no enough memory!\n", __func__);
|
|
ret = -ENOMEM;
|
|
- goto failed_free_info;
|
|
+ goto failed;
|
|
}
|
|
|
|
- info->fix.smem_start = (unsigned long)fbi->fb_start_dma;
|
|
- set_graphics_start(info, 0, 0);
|
|
+ memset(fbi->fb_start, 0, fbi->fb_size);
|
|
+ info->fix.smem_start = fbi->fb_start_dma;
|
|
+ info->fix.smem_len = fbi->fb_size;
|
|
+ info->screen_base = fbi->fb_start;
|
|
+ info->screen_size = fbi->fb_size;
|
|
+ gra_dma_base_address = (unsigned int)fbi->fb_start_dma;
|
|
|
|
/*
|
|
* Set video mode according to platform data.
|
|
@@ -706,29 +1286,16 @@ static int pxa168fb_probe(struct platform_device *pdev)
|
|
pxa168fb_init_mode(info, mi);
|
|
|
|
/*
|
|
- * Fill in sane defaults.
|
|
+ * enable controller clock
|
|
*/
|
|
- ret = pxa168fb_check_var(&info->var, info);
|
|
- if (ret)
|
|
- goto failed_free_fbmem;
|
|
+ clk_prepare_enable(fbi->clk);
|
|
|
|
/*
|
|
- * enable controller clock
|
|
+ * Fill in sane defaults.
|
|
*/
|
|
- clk_enable(fbi->clk);
|
|
-
|
|
pxa168fb_set_par(info);
|
|
|
|
- /*
|
|
- * Configure default register values.
|
|
- */
|
|
- writel(0, fbi->reg_base + LCD_SPU_BLANKCOLOR);
|
|
- writel(mi->io_pin_allocation_mode, fbi->reg_base + SPU_IOPAD_CONTROL);
|
|
- writel(0, fbi->reg_base + LCD_CFG_GRA_START_ADDR1);
|
|
- writel(0, fbi->reg_base + LCD_SPU_GRA_OVSA_HPXL_VLN);
|
|
- writel(0, fbi->reg_base + LCD_SPU_SRAM_PARA0);
|
|
- writel(CFG_CSB_256x32(0x1)|CFG_CSB_256x24(0x1)|CFG_CSB_256x8(0x1),
|
|
- fbi->reg_base + LCD_SPU_SRAM_PARA1);
|
|
+ pxa168fb_set_default(fbi, mi);
|
|
|
|
/*
|
|
* Allocate color map.
|
|
@@ -741,13 +1308,13 @@ static int pxa168fb_probe(struct platform_device *pdev)
|
|
/*
|
|
* Register irq handler.
|
|
*/
|
|
- ret = devm_request_irq(&pdev->dev, irq, pxa168fb_handle_irq,
|
|
- IRQF_SHARED, info->fix.id, fbi);
|
|
+ ret = request_irq(irq, pxa168fb_handle_irq, IRQF_SHARED, mi->id, fbi);
|
|
if (ret < 0) {
|
|
dev_err(&pdev->dev, "unable to request IRQ\n");
|
|
ret = -ENXIO;
|
|
goto failed_free_cmap;
|
|
}
|
|
+ writel(0x0, fbi->reg_base + SPU_IRQ_ISR);
|
|
|
|
/*
|
|
* Enable GFX interrupt
|
|
@@ -761,77 +1328,151 @@ static int pxa168fb_probe(struct platform_device *pdev)
|
|
if (ret < 0) {
|
|
dev_err(&pdev->dev, "Failed to register pxa168-fb: %d\n", ret);
|
|
ret = -ENXIO;
|
|
- goto failed_free_cmap;
|
|
+ goto failed_free_irq;
|
|
}
|
|
+ printk(KERN_INFO "pxa168fb: frame buffer device was loaded"
|
|
+ " to /dev/fb%d <%s>.\n", info->node, info->fix.id);
|
|
|
|
- platform_set_drvdata(pdev, fbi);
|
|
+ pxa168fb_power(fbi, mi, 1);
|
|
return 0;
|
|
|
|
+failed_free_irq:
|
|
+ free_irq(irq, fbi);
|
|
failed_free_cmap:
|
|
fb_dealloc_cmap(&info->cmap);
|
|
failed_free_clk:
|
|
- clk_disable(fbi->clk);
|
|
-failed_free_fbmem:
|
|
- dma_free_coherent(fbi->dev, info->fix.smem_len,
|
|
- info->screen_base, fbi->fb_start_dma);
|
|
-failed_free_info:
|
|
- kfree(info);
|
|
-failed_put_clk:
|
|
- clk_put(clk);
|
|
-
|
|
- dev_err(&pdev->dev, "frame buffer device init failed with %d\n", ret);
|
|
+ clk_disable_unprepare(fbi->clk);
|
|
+ clk_put(fbi->clk);
|
|
+failed:
|
|
+ pr_err("pxa168-fb: frame buffer device init failed\n");
|
|
+ platform_set_drvdata(pdev, NULL);
|
|
+ fb_dealloc_cmap(&info->cmap);
|
|
+
|
|
+ if (fbi && fbi->reg_base) {
|
|
+ iounmap(fbi->reg_base);
|
|
+ kfree(fbi);
|
|
+ }
|
|
+
|
|
return ret;
|
|
}
|
|
|
|
-static int pxa168fb_remove(struct platform_device *pdev)
|
|
+#ifdef CONFIG_PM
|
|
+static int _pxa168fb_suspend(struct pxa168fb_info *fbi, pm_message_t mesg)
|
|
{
|
|
- struct pxa168fb_info *fbi = platform_get_drvdata(pdev);
|
|
- struct fb_info *info;
|
|
- int irq;
|
|
- unsigned int data;
|
|
+ struct fb_info *info = fbi->info;
|
|
+ struct pxa168fb_mach_info *mi = fbi->dev->platform_data;
|
|
+ unsigned int reg;
|
|
+ unsigned int cntrl0;
|
|
|
|
- if (!fbi)
|
|
+ printk(KERN_INFO "_pxa168fb_suspend(): state = %d.\n", mesg.event);
|
|
+
|
|
+ if(FBINFO_STATE_SUSPENDED == info->state)
|
|
return 0;
|
|
|
|
- /* disable DMA transfer */
|
|
- data = readl(fbi->reg_base + LCD_SPU_DMA_CTRL0);
|
|
- data &= ~CFG_GRA_ENA_MASK;
|
|
- writel(data, fbi->reg_base + LCD_SPU_DMA_CTRL0);
|
|
+ /* disable the graphic place DMA to prevent disruption of the
|
|
+ * TPO display calibration on the resume cycle.
|
|
+ */
|
|
+ cntrl0 = readl(fbi->reg_base + LCD_SPU_DMA_CTRL0);
|
|
+ fbi->active = 0;
|
|
+ if (cntrl0 & CFG_GRA_ENA_MASK) {
|
|
+ fbi->active = 1;
|
|
+ writel(cntrl0 & ~CFG_GRA_ENA_MASK,
|
|
+ fbi->reg_base + LCD_SPU_DMA_CTRL0);
|
|
+ }
|
|
|
|
- info = fbi->info;
|
|
+ pxa168fb_power(fbi, mi, 0);
|
|
|
|
- unregister_framebuffer(info);
|
|
+ /* Disable interrupts */
|
|
+ reg = readl(fbi->reg_base+SPU_IRQ_ENA);
|
|
+ reg &= ~GRA_FRAME_IRQ0_ENA_MASK;
|
|
+ writel(reg, fbi->reg_base+SPU_IRQ_ENA);
|
|
|
|
- writel(GRA_FRAME_IRQ0_ENA(0x0), fbi->reg_base + SPU_IRQ_ENA);
|
|
+ fb_set_suspend(info, 1);
|
|
|
|
- if (info->cmap.len)
|
|
- fb_dealloc_cmap(&info->cmap);
|
|
+ clk_disable(fbi->clk);
|
|
|
|
- irq = platform_get_irq(pdev, 0);
|
|
+ return 0;
|
|
+}
|
|
|
|
- dma_free_writecombine(fbi->dev, PAGE_ALIGN(info->fix.smem_len),
|
|
- info->screen_base, info->fix.smem_start);
|
|
+static int _pxa168fb_resume(struct pxa168fb_info *fbi)
|
|
+{
|
|
+ struct fb_info *info = fbi->info;
|
|
+ struct pxa168fb_mach_info *mi = fbi->dev->platform_data;
|
|
+ unsigned int cntrl0;
|
|
|
|
- clk_disable(fbi->clk);
|
|
- clk_put(fbi->clk);
|
|
+ printk(KERN_INFO "pxa168fb resuming...\n");
|
|
+
|
|
+ if(FBINFO_STATE_RUNNING == info->state)
|
|
+ return 0;
|
|
+
|
|
+ clk_enable(fbi->clk);
|
|
+
|
|
+ pxa168fb_set_par(info);
|
|
+
|
|
+ pxa168fb_power(fbi, mi, 1);
|
|
+
|
|
+ pxa168fb_set_default(fbi, mi);
|
|
+
|
|
+ fb_set_suspend(info, 0);
|
|
+
|
|
+ /* Enable interrupts */
|
|
+ writel(0x0, fbi->reg_base + SPU_IRQ_ISR);
|
|
+ writel(readl(fbi->reg_base + SPU_IRQ_ENA) | GRA_FRAME_IRQ0_ENA_MASK,
|
|
+ fbi->reg_base + SPU_IRQ_ENA);
|
|
+
|
|
+ /* Re-enable the graphic DMA only after the display has been
|
|
+ * calibrated.
|
|
+ */
|
|
|
|
- framebuffer_release(info);
|
|
+ if (fbi->active) {
|
|
+ cntrl0 = readl(fbi->reg_base + LCD_SPU_DMA_CTRL0);
|
|
+ writel(cntrl0 | CFG_GRA_ENA_MASK,
|
|
+ fbi->reg_base + LCD_SPU_DMA_CTRL0);
|
|
+ }
|
|
+
|
|
+ printk(KERN_INFO "pxa168fb resumed\n");
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+static int pxa168fb_suspend(struct platform_device *pdev, pm_message_t mesg)
|
|
+{
|
|
+ struct pxa168fb_info *fbi = platform_get_drvdata(pdev);
|
|
+
|
|
+ _pxa168fb_suspend(fbi, mesg);
|
|
+ pdev->dev.power.power_state = mesg;
|
|
|
|
return 0;
|
|
}
|
|
|
|
+static int pxa168fb_resume(struct platform_device *pdev)
|
|
+{
|
|
+ struct pxa168fb_info *fbi = platform_get_drvdata(pdev);
|
|
+ _pxa168fb_resume(fbi);
|
|
+ return 0;
|
|
+}
|
|
+#endif
|
|
+
|
|
static struct platform_driver pxa168fb_driver = {
|
|
.driver = {
|
|
.name = "pxa168-fb",
|
|
.owner = THIS_MODULE,
|
|
},
|
|
.probe = pxa168fb_probe,
|
|
- .remove = pxa168fb_remove,
|
|
+#ifdef CONFIG_PM
|
|
+ .suspend = pxa168fb_suspend,
|
|
+ .resume = pxa168fb_resume,
|
|
+#endif
|
|
};
|
|
|
|
-module_platform_driver(pxa168fb_driver);
|
|
+static int pxa168fb_init(void)
|
|
+{
|
|
+#ifdef CONFIG_DVFM
|
|
+ dvfm_register("LCD Base", &dvfm_dev_idx);
|
|
+#endif
|
|
+ return platform_driver_register(&pxa168fb_driver);
|
|
+}
|
|
+module_init(pxa168fb_init);
|
|
|
|
-MODULE_AUTHOR("Lennert Buytenhek <buytenh@marvell.com> "
|
|
- "Green Wan <gwan@marvell.com>");
|
|
-MODULE_DESCRIPTION("Framebuffer driver for PXA168/910");
|
|
+MODULE_AUTHOR("Lennert Buytenhek <buytenh@marvell.com>");
|
|
+MODULE_DESCRIPTION("Framebuffer driver for PXA168");
|
|
MODULE_LICENSE("GPL");
|
|
diff --git a/drivers/video/pxa168fb.h b/drivers/video/pxa168fb.h
|
|
index eee0927..fc8bb61 100644
|
|
--- a/drivers/video/pxa168fb.h
|
|
+++ b/drivers/video/pxa168fb.h
|
|
@@ -461,6 +461,13 @@
|
|
#define PWRDN_IRQ_MASK 0x00020000
|
|
#define ERR_IRQ(irq) ((irq) << 16)
|
|
#define ERR_IRQ_MASK 0x00010000
|
|
+
|
|
+#define LCD_FIFO_DEPTH 0x01c8
|
|
+#define VIDEO_FIFO(fi) (fi << 0)
|
|
+#define VIDEO_FIFO_MASK 0x00000003
|
|
+#define GRAPHIC_FIFO(fi) (fi << 2)
|
|
+#define GRAPHIC_FIFO_MASK 0x0000000c
|
|
+
|
|
/* read-only */
|
|
#define DMA_FRAME_IRQ0_LEVEL_MASK 0x00008000
|
|
#define DMA_FRAME_IRQ1_LEVEL_MASK 0x00004000
|
|
diff --git a/drivers/video/pxa168fb_ovly.c b/drivers/video/pxa168fb_ovly.c
|
|
new file mode 100644
|
|
index 0000000..522093f
|
|
--- /dev/null
|
|
+++ b/drivers/video/pxa168fb_ovly.c
|
|
@@ -0,0 +1,2209 @@
|
|
+/**************************************************************************
|
|
+ *
|
|
+ * Copyright (c) 2009, 2010 Marvell International Ltd.
|
|
+ *
|
|
+ * This file is part of GNU program.
|
|
+ *
|
|
+ * GNU program is free software: you can redistribute it and/or modify it
|
|
+ * under the terms of the GNU General Public License as published by the
|
|
+ * Free Software Foundation, either version 2 of the License, or (at your
|
|
+ * option) any later version.
|
|
+ *
|
|
+ * GNU program is distributed in the hope that it will be useful, but
|
|
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
|
|
+ * Public License for more details.
|
|
+ *
|
|
+ * You should have received a copy of the GNU General Public License along
|
|
+ * with this program.
|
|
+ *
|
|
+ * If not, see http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
|
|
+ *
|
|
+ *************************************************************************/
|
|
+
|
|
+/*
|
|
+ * linux/drivers/video/pxa168fb_ovly.c -- Marvell PXA168 LCD Controller
|
|
+ *
|
|
+ * 2009-03-19 adapted from original version for PXA168
|
|
+ * Green Wan <gwan@marvell.com>
|
|
+ * Kevin Liu <kliu5@marvell.com>
|
|
+ */
|
|
+
|
|
+/*
|
|
+ * 1. Adapted from: linux/drivers/video/skeletonfb.c
|
|
+ * 2. Merged from: linux/drivers/video/dovefb.c (Lennert Buytenhek)
|
|
+ */
|
|
+#include <linux/module.h>
|
|
+#include <linux/moduleparam.h>
|
|
+#include <linux/kernel.h>
|
|
+#include <linux/sched.h>
|
|
+#include <linux/errno.h>
|
|
+#include <linux/string.h>
|
|
+#include <linux/interrupt.h>
|
|
+#include <linux/slab.h>
|
|
+#include <linux/delay.h>
|
|
+#include <linux/init.h>
|
|
+#include <linux/ioport.h>
|
|
+#include <linux/cpufreq.h>
|
|
+#include <linux/platform_device.h>
|
|
+#include <linux/dma-mapping.h>
|
|
+#include <linux/clk.h>
|
|
+#include <linux/err.h>
|
|
+#include <linux/uaccess.h>
|
|
+#include <linux/console.h>
|
|
+
|
|
+//#include <asm/hardware.h>
|
|
+#include <asm/io.h>
|
|
+#include <asm/irq.h>
|
|
+
|
|
+/*#include <mach/pxa168fb.h>*/
|
|
+#include <video/pxa168fb.h>
|
|
+
|
|
+#include <mach/hardware.h>
|
|
+#include <mach/gpio.h>
|
|
+#include <asm/mach-types.h>
|
|
+#include "pxa168fb.h"
|
|
+
|
|
+#ifdef CONFIG_DVFM
|
|
+#include <mach/dvfm.h>
|
|
+static int dvfm_dev_idx;
|
|
+static void set_dvfm_constraint(void)
|
|
+{
|
|
+ /* Disable Lowpower mode */
|
|
+ dvfm_disable_op_name("apps_idle", dvfm_dev_idx);
|
|
+ dvfm_disable_op_name("apps_sleep", dvfm_dev_idx);
|
|
+ dvfm_disable_op_name("sys_sleep", dvfm_dev_idx);
|
|
+}
|
|
+
|
|
+static void unset_dvfm_constraint(void)
|
|
+{
|
|
+ /* Enable Lowpower mode */
|
|
+ dvfm_enable_op_name("apps_idle", dvfm_dev_idx);
|
|
+ dvfm_enable_op_name("apps_sleep", dvfm_dev_idx);
|
|
+ dvfm_enable_op_name("sys_sleep", dvfm_dev_idx);
|
|
+}
|
|
+#else
|
|
+static void set_dvfm_constraint(void) {}
|
|
+static void unset_dvfm_constraint(void) {}
|
|
+#endif
|
|
+
|
|
+#define RESET_BUF 0x1
|
|
+#define FREE_ENTRY 0x2
|
|
+
|
|
+static int pxa168fb_set_par(struct fb_info *fi);
|
|
+static void set_graphics_start(struct fb_info *fi, int xoffset, int yoffset);
|
|
+static void set_dma_control0(struct pxa168fb_info *fbi);
|
|
+static int wait_for_vsync(struct pxa168fb_info *fbi);
|
|
+static int pxa168fb_pan_display(struct fb_var_screeninfo *var, struct fb_info *fi);
|
|
+
|
|
+static int pxa168fb_switch_buff(struct fb_info *fi);
|
|
+static int addFreeBuf(u8 **bufList, u8 *freeBuf);
|
|
+static void clearFreeBuf(u8 **bufList, int iFlag);
|
|
+static void clearFilterBuf(u8 *bufList[][3], int iFlag);
|
|
+static void collectFreeBuf(u8 *filterList[][3], u8 **freeList, int count);
|
|
+static u8 *filterBufList[MAX_QUEUE_NUM][3];
|
|
+static u8 *freeBufList[MAX_QUEUE_NUM];
|
|
+static atomic_t global_op_count = ATOMIC_INIT(0);
|
|
+static atomic_t dma_flag = ATOMIC_INIT(0);
|
|
+static unsigned int dma_base_address;
|
|
+static unsigned int max_fb_size = 0;
|
|
+static int gLastFrame = 0;
|
|
+
|
|
+/* Compatibility mode global switch .....
|
|
+ *
|
|
+ * This is a secret switch for user space programs that may want to
|
|
+ * select color spaces and set overlay position through the nonstd
|
|
+ * element of fb_var_screeninfo This is the way legacy PXA display
|
|
+ * drivers were used. The mode reverts back to normal mode on driver release.
|
|
+ *
|
|
+ * To turn on compatibility with older PXA, set the MSB of nonstd to 0xAA.
|
|
+ */
|
|
+
|
|
+static unsigned int COMPAT_MODE;
|
|
+
|
|
+
|
|
+
|
|
+static struct _sViewPortInfo gViewPortInfo = {
|
|
+ .srcWidth = 640, /* video source size */
|
|
+ .srcHeight = 480,
|
|
+ .zoomXSize = 640, /* size after zooming */
|
|
+ .zoomYSize = 480,
|
|
+};
|
|
+
|
|
+static struct _sViewPortOffset gViewPortOffset = {
|
|
+ .xOffset = 0, /* position on screen */
|
|
+ .yOffset = 0
|
|
+};
|
|
+
|
|
+#ifdef FB_PM_DEBUG
|
|
+static unsigned int g_regs[1024];
|
|
+static unsigned int g_regs1[1024];
|
|
+static unsigned int pxa168fb_rw_all_regs(struct pxa168fb_info *fbi,
|
|
+ unsigned int *regs, int is_read)
|
|
+{
|
|
+ u32 i;
|
|
+ u32 reg;
|
|
+
|
|
+ for (i = 0xC0; i <= 0x01C4; i += 4) {
|
|
+ if (is_read) {
|
|
+ reg = readl(fbi->reg_base + i);
|
|
+ regs[i] = reg;
|
|
+ } else {
|
|
+ writel(regs[i], fbi->reg_base + i);
|
|
+ }
|
|
+ }
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+#endif
|
|
+
|
|
+static void pxa168fb_do_tasklet(unsigned long data)
|
|
+{
|
|
+ struct fb_info *fi;
|
|
+
|
|
+ fi = (struct fb_info *)data;
|
|
+ pxa168fb_switch_buff(fi);
|
|
+}
|
|
+
|
|
+#if 0
|
|
+static struct fb_videomode *
|
|
+find_best_mode(struct pxa168fb_info *fbi, struct fb_var_screeninfo *var)
|
|
+{
|
|
+ struct pxa168fb_mach_info *mi = fbi->dev->platform_data;
|
|
+ struct fb_videomode *best_mode;
|
|
+ int i;
|
|
+
|
|
+ dev_dbg(fbi->info->dev, "Enter %s\n", __FUNCTION__);
|
|
+ best_mode = NULL;
|
|
+ for (i = 0; i < mi->num_modes; i++) {
|
|
+ struct fb_videomode *m = mi->modes + i;
|
|
+
|
|
+ /*
|
|
+ * Check whether this mode is suitable.
|
|
+ */
|
|
+ if (var->xres > m->xres)
|
|
+ continue;
|
|
+ if (var->yres > m->yres)
|
|
+ continue;
|
|
+
|
|
+ /*
|
|
+ * Check whether this mode is more suitable than
|
|
+ * the best mode so far.
|
|
+ */
|
|
+ if (best_mode != NULL &&
|
|
+ (best_mode->xres < m->xres ||
|
|
+ best_mode->yres < m->yres ||
|
|
+ best_mode->pixclock > m->pixclock))
|
|
+ continue;
|
|
+
|
|
+ best_mode = m;
|
|
+ }
|
|
+
|
|
+ return best_mode;
|
|
+}
|
|
+#endif
|
|
+
|
|
+static int determine_best_pix_fmt(struct fb_var_screeninfo *var)
|
|
+{
|
|
+ unsigned char pxa_format;
|
|
+
|
|
+ /* compatibility switch: if var->nonstd MSB is 0xAA then skip to
|
|
+ * using the nonstd variable to select the color space.
|
|
+ */
|
|
+ if(COMPAT_MODE != 0x2625) {
|
|
+
|
|
+ /*
|
|
+ * Pseudocolor mode?
|
|
+ */
|
|
+ if (var->bits_per_pixel == 8)
|
|
+ return PIX_FMT_PSEUDOCOLOR;
|
|
+ /*
|
|
+ * Check for YUV422PACK.
|
|
+ */
|
|
+ if (var->bits_per_pixel == 16 && var->red.length == 16 &&
|
|
+ var->green.length == 16 && var->blue.length == 16) {
|
|
+ if (var->red.offset >= var->blue.offset) {
|
|
+ if (var->red.offset == 4)
|
|
+ return PIX_FMT_YUV422PACK;
|
|
+ else
|
|
+ return PIX_FMT_YUYV422PACK;
|
|
+ } else
|
|
+ return PIX_FMT_YVU422PACK;
|
|
+ }
|
|
+ /*
|
|
+ * Check for YUV422PLANAR.
|
|
+ */
|
|
+ if (var->bits_per_pixel == 16 && var->red.length == 8 &&
|
|
+ var->green.length == 4 && var->blue.length == 4) {
|
|
+ if (var->red.offset >= var->blue.offset)
|
|
+ return PIX_FMT_YUV422PLANAR;
|
|
+ else
|
|
+ return PIX_FMT_YVU422PLANAR;
|
|
+ }
|
|
+
|
|
+ /*
|
|
+ * Check for YUV420PLANAR.
|
|
+ */
|
|
+ if (var->bits_per_pixel == 12 && var->red.length == 8 &&
|
|
+ var->green.length == 2 && var->blue.length == 2) {
|
|
+ if (var->red.offset >= var->blue.offset)
|
|
+ return PIX_FMT_YUV420PLANAR;
|
|
+ else
|
|
+ return PIX_FMT_YVU420PLANAR;
|
|
+ }
|
|
+ /*
|
|
+ * Check for 565/1555.
|
|
+ */
|
|
+ if (var->bits_per_pixel == 16 && var->red.length <= 5 &&
|
|
+ var->green.length <= 6 && var->blue.length <= 5) {
|
|
+ if (var->transp.length == 0) {
|
|
+ if (var->red.offset >= var->blue.offset)
|
|
+ return PIX_FMT_RGB565;
|
|
+ else
|
|
+ return PIX_FMT_BGR565;
|
|
+ }
|
|
+
|
|
+ if (var->transp.length == 1 && var->green.length <= 5) {
|
|
+ if (var->red.offset >= var->blue.offset)
|
|
+ return PIX_FMT_RGB1555;
|
|
+ else
|
|
+ return PIX_FMT_BGR1555;
|
|
+ }
|
|
+
|
|
+ /* fall through */
|
|
+ }
|
|
+
|
|
+ /*
|
|
+ * Check for 888/A888.
|
|
+ */
|
|
+ if (var->bits_per_pixel <= 32 && var->red.length <= 8 &&
|
|
+ var->green.length <= 8 && var->blue.length <= 8) {
|
|
+ if (var->bits_per_pixel == 24 && var->transp.length == 0) {
|
|
+ if (var->red.offset >= var->blue.offset)
|
|
+ return PIX_FMT_RGB888PACK;
|
|
+ else
|
|
+ return PIX_FMT_BGR888PACK;
|
|
+ }
|
|
+
|
|
+ if (var->bits_per_pixel == 32 && var->transp.length == 8) {
|
|
+ if (var->red.offset >= var->blue.offset)
|
|
+ return PIX_FMT_RGBA888;
|
|
+ else
|
|
+ return PIX_FMT_BGRA888;
|
|
+ } else {
|
|
+ if (var->transp.offset == 24) {
|
|
+ if (var->red.offset >= var->blue.offset)
|
|
+ return PIX_FMT_RGB888UNPACK;
|
|
+ else
|
|
+ return PIX_FMT_BGR888UNPACK;
|
|
+ } else
|
|
+ return PIX_FMT_YUV422PACK_IRE_90_270;
|
|
+
|
|
+ }
|
|
+ /* fall through */
|
|
+ }
|
|
+ } else {
|
|
+
|
|
+ pxa_format = (var->nonstd >> 20) & 0xf;
|
|
+
|
|
+ switch (pxa_format) {
|
|
+ case 0:
|
|
+ return PIX_FMT_RGB565;
|
|
+ break;
|
|
+ case 3:
|
|
+ return PIX_FMT_YUV422PLANAR;
|
|
+ break;
|
|
+ case 4:
|
|
+ return PIX_FMT_YUV420PLANAR;
|
|
+ break;
|
|
+ case 5:
|
|
+ return PIX_FMT_RGB1555;
|
|
+ break;
|
|
+ case 6:
|
|
+ return PIX_FMT_RGB888PACK;
|
|
+ break;
|
|
+ case 7:
|
|
+ return PIX_FMT_RGB888UNPACK;
|
|
+ break;
|
|
+ case 8:
|
|
+ return PIX_FMT_RGBA888;
|
|
+ break;
|
|
+ case 9:
|
|
+ return PIX_FMT_YUV422PACK;
|
|
+ break;
|
|
+
|
|
+ default:
|
|
+ return -EINVAL;
|
|
+ }
|
|
+ }
|
|
+
|
|
+
|
|
+
|
|
+ return -EINVAL;
|
|
+}
|
|
+
|
|
+static void set_pix_fmt(struct fb_var_screeninfo *var, int pix_fmt)
|
|
+{
|
|
+ switch (pix_fmt) {
|
|
+ case PIX_FMT_RGB565:
|
|
+ var->bits_per_pixel = 16;
|
|
+ var->red.offset = 11; var->red.length = 5;
|
|
+ var->green.offset = 5; var->green.length = 6;
|
|
+ var->blue.offset = 0; var->blue.length = 5;
|
|
+ var->transp.offset = 0; var->transp.length = 0;
|
|
+ var->nonstd &= ~0xff0fffff;
|
|
+ break;
|
|
+ case PIX_FMT_BGR565:
|
|
+ var->bits_per_pixel = 16;
|
|
+ var->red.offset = 0; var->red.length = 5;
|
|
+ var->green.offset = 5; var->green.length = 6;
|
|
+ var->blue.offset = 11; var->blue.length = 5;
|
|
+ var->transp.offset = 0; var->transp.length = 0;
|
|
+ var->nonstd &= ~0xff0fffff;
|
|
+ break;
|
|
+ case PIX_FMT_RGB1555:
|
|
+ var->bits_per_pixel = 16;
|
|
+ var->red.offset = 10; var->red.length = 5;
|
|
+ var->green.offset = 5; var->green.length = 5;
|
|
+ var->blue.offset = 0; var->blue.length = 5;
|
|
+ var->transp.offset = 15; var->transp.length = 1;
|
|
+ var->nonstd &= ~0xff0fffff;
|
|
+ var->nonstd |= 5 << 20;
|
|
+ break;
|
|
+ case PIX_FMT_BGR1555:
|
|
+ var->bits_per_pixel = 16;
|
|
+ var->red.offset = 0; var->red.length = 5;
|
|
+ var->green.offset = 5; var->green.length = 5;
|
|
+ var->blue.offset = 10; var->blue.length = 5;
|
|
+ var->transp.offset = 15; var->transp.length = 1;
|
|
+ var->nonstd &= ~0xff0fffff;
|
|
+ var->nonstd |= 5 << 20;
|
|
+ break;
|
|
+ case PIX_FMT_RGB888PACK:
|
|
+ var->bits_per_pixel = 24;
|
|
+ var->red.offset = 16; var->red.length = 8;
|
|
+ var->green.offset = 8; var->green.length = 8;
|
|
+ var->blue.offset = 0; var->blue.length = 8;
|
|
+ var->transp.offset = 0; var->transp.length = 0;
|
|
+ var->nonstd &= ~0xff0fffff;
|
|
+ var->nonstd |= 6 << 20;
|
|
+ break;
|
|
+ case PIX_FMT_BGR888PACK:
|
|
+ var->bits_per_pixel = 24;
|
|
+ var->red.offset = 0; var->red.length = 8;
|
|
+ var->green.offset = 8; var->green.length = 8;
|
|
+ var->blue.offset = 16; var->blue.length = 8;
|
|
+ var->transp.offset = 0; var->transp.length = 0;
|
|
+ var->nonstd &= ~0xff0fffff;
|
|
+ var->nonstd |= 6 << 20;
|
|
+ break;
|
|
+ case PIX_FMT_RGB888UNPACK:
|
|
+ var->bits_per_pixel = 32;
|
|
+ var->red.offset = 16; var->red.length = 8;
|
|
+ var->green.offset = 8; var->green.length = 8;
|
|
+ var->blue.offset = 0; var->blue.length = 8;
|
|
+ var->transp.offset = 24; var->transp.length = 0;
|
|
+ var->nonstd &= ~0xff0fffff;
|
|
+ var->nonstd |= 7 << 20;
|
|
+ break;
|
|
+ case PIX_FMT_BGR888UNPACK:
|
|
+ var->bits_per_pixel = 32;
|
|
+ var->red.offset = 0; var->red.length = 8;
|
|
+ var->green.offset = 8; var->green.length = 8;
|
|
+ var->blue.offset = 16; var->blue.length = 8;
|
|
+ var->transp.offset = 24; var->transp.length = 0;
|
|
+ var->nonstd &= ~0xff0fffff;
|
|
+ var->nonstd |= 7 << 20;
|
|
+ break;
|
|
+ case PIX_FMT_RGBA888:
|
|
+ var->bits_per_pixel = 32;
|
|
+ var->red.offset = 16; var->red.length = 8;
|
|
+ var->green.offset = 8; var->green.length = 8;
|
|
+ var->blue.offset = 0; var->blue.length = 8;
|
|
+ var->transp.offset = 24; var->transp.length = 8;
|
|
+ var->nonstd &= ~0xff0fffff;
|
|
+ var->nonstd |= 8 << 20;
|
|
+ break;
|
|
+ case PIX_FMT_BGRA888:
|
|
+ var->bits_per_pixel = 32;
|
|
+ var->red.offset = 0; var->red.length = 8;
|
|
+ var->green.offset = 8; var->green.length = 8;
|
|
+ var->blue.offset = 16; var->blue.length = 8;
|
|
+ var->transp.offset = 24; var->transp.length = 8;
|
|
+ var->nonstd &= ~0xff0fffff;
|
|
+ var->nonstd |= 8 << 20;
|
|
+ break;
|
|
+ case PIX_FMT_YUYV422PACK:
|
|
+ var->bits_per_pixel = 16;
|
|
+ var->red.offset = 8; var->red.length = 16;
|
|
+ var->green.offset = 4; var->green.length = 16;
|
|
+ var->blue.offset = 0; var->blue.length = 16;
|
|
+ var->transp.offset = 0; var->transp.length = 0;
|
|
+ var->nonstd &= ~0xff0fffff;
|
|
+ var->nonstd |= 9 << 20;
|
|
+ break;
|
|
+ case PIX_FMT_YVU422PACK:
|
|
+ var->bits_per_pixel = 16;
|
|
+ var->red.offset = 0; var->red.length = 16;
|
|
+ var->green.offset = 8; var->green.length = 16;
|
|
+ var->blue.offset = 12; var->blue.length = 16;
|
|
+ var->transp.offset = 0; var->transp.length = 0;
|
|
+ var->nonstd &= ~0xff0fffff;
|
|
+ var->nonstd |= 9 << 20;
|
|
+ break;
|
|
+ case PIX_FMT_YUV422PLANAR:
|
|
+ var->bits_per_pixel = 16;
|
|
+ var->red.offset = 8; var->red.length = 8;
|
|
+ var->green.offset = 4; var->green.length = 4;
|
|
+ var->blue.offset = 0; var->blue.length = 4;
|
|
+ var->transp.offset = 0; var->transp.length = 0;
|
|
+ var->nonstd &= ~0xff0fffff;
|
|
+ var->nonstd |= 3 << 20;
|
|
+ break;
|
|
+ case PIX_FMT_YVU422PLANAR:
|
|
+ var->bits_per_pixel = 16;
|
|
+ var->red.offset = 0; var->red.length = 8;
|
|
+ var->green.offset = 8; var->green.length = 4;
|
|
+ var->blue.offset = 12; var->blue.length = 4;
|
|
+ var->transp.offset = 0; var->transp.length = 0;
|
|
+ var->nonstd &= ~0xff0fffff;
|
|
+ var->nonstd |= 3 << 20;
|
|
+ break;
|
|
+ case PIX_FMT_YUV420PLANAR:
|
|
+ var->bits_per_pixel = 12;
|
|
+ var->red.offset = 4; var->red.length = 8;
|
|
+ var->green.offset = 2; var->green.length = 2;
|
|
+ var->blue.offset = 0; var->blue.length = 2;
|
|
+ var->transp.offset = 0; var->transp.length = 0;
|
|
+ var->nonstd &= ~0xff0fffff;
|
|
+ var->nonstd |= 4 << 20;
|
|
+ break;
|
|
+ case PIX_FMT_YVU420PLANAR:
|
|
+ var->bits_per_pixel = 12;
|
|
+ var->red.offset = 0; var->red.length = 8;
|
|
+ var->green.offset = 8; var->green.length = 2;
|
|
+ var->blue.offset = 10; var->blue.length = 2;
|
|
+ var->transp.offset = 0; var->transp.length = 0;
|
|
+ var->nonstd &= ~0xff0fffff;
|
|
+ var->nonstd |= 4 << 20;
|
|
+ break;
|
|
+
|
|
+ case PIX_FMT_PSEUDOCOLOR:
|
|
+ var->bits_per_pixel = 8;
|
|
+ var->red.offset = 0; var->red.length = 8;
|
|
+ var->green.offset = 0; var->green.length = 8;
|
|
+ var->blue.offset = 0; var->blue.length = 8;
|
|
+ var->transp.offset = 0; var->transp.length = 0;
|
|
+ break;
|
|
+ case PIX_FMT_YUV422PACK:
|
|
+ var->bits_per_pixel = 16;
|
|
+ var->red.offset = 4; var->red.length = 16;
|
|
+ var->green.offset = 12; var->green.length = 16;
|
|
+ var->blue.offset = 0; var->blue.length = 16;
|
|
+ var->transp.offset = 0; var->transp.length = 0;
|
|
+ var->nonstd &= ~0xff0fffff;
|
|
+ var->nonstd |= 9 << 20;
|
|
+ break;
|
|
+ case PIX_FMT_YUV422PACK_IRE_90_270: /* YUV422 Packed will be YUV444 Packed after IRE 90 and 270 degree rotation*/
|
|
+ var->bits_per_pixel = 32;
|
|
+ var->red.offset = 16; var->red.length = 8;
|
|
+ var->green.offset = 8; var->green.length = 8;
|
|
+ var->blue.offset = 0; var->blue.length = 8;
|
|
+ var->transp.offset = 0; var->transp.length = 0;
|
|
+ var->nonstd &= ~0xff0fffff;
|
|
+ var->nonstd |= 7 << 20;
|
|
+ break;
|
|
+ default:
|
|
+ BUG();
|
|
+ }
|
|
+}
|
|
+
|
|
+static int convert_pix_fmt(u32 vmode)
|
|
+{
|
|
+/* printk(KERN_INFO "vmode=%d\n", vmode); */
|
|
+ switch(vmode) {
|
|
+ case FB_VMODE_YUV422PACKED:
|
|
+ return PIX_FMT_YUV422PACK;
|
|
+ case FB_VMODE_YUV422PACKED_SWAPUV:
|
|
+ return PIX_FMT_YVU422PACK;
|
|
+ case FB_VMODE_YUV422PLANAR:
|
|
+ return PIX_FMT_YUV422PLANAR;
|
|
+ case FB_VMODE_YUV422PLANAR_SWAPUV:
|
|
+ return PIX_FMT_YVU422PLANAR;
|
|
+ case FB_VMODE_YUV420PLANAR:
|
|
+ return PIX_FMT_YUV420PLANAR;
|
|
+ case FB_VMODE_YUV420PLANAR_SWAPUV:
|
|
+ return PIX_FMT_YVU420PLANAR;
|
|
+ case FB_VMODE_YUV422PACKED_SWAPYUorV:
|
|
+ return PIX_FMT_YUYV422PACK;
|
|
+ case FB_VMODE_YUV422PACKED_IRE_90_270:
|
|
+ return PIX_FMT_YUV422PACK_IRE_90_270;
|
|
+ case FB_VMODE_RGB565:
|
|
+ return PIX_FMT_RGB565;
|
|
+ case FB_VMODE_BGR565:
|
|
+ return PIX_FMT_BGR565;
|
|
+ case FB_VMODE_RGB1555:
|
|
+ return PIX_FMT_RGB1555;
|
|
+ case FB_VMODE_BGR1555:
|
|
+ return PIX_FMT_BGR1555;
|
|
+ case FB_VMODE_RGB888PACK:
|
|
+ return PIX_FMT_RGB888PACK;
|
|
+ case FB_VMODE_BGR888PACK:
|
|
+ return PIX_FMT_BGR888PACK;
|
|
+ case FB_VMODE_RGBA888:
|
|
+ return PIX_FMT_RGBA888;
|
|
+ case FB_VMODE_BGRA888:
|
|
+ return PIX_FMT_BGRA888;
|
|
+ case FB_VMODE_RGB888UNPACK:
|
|
+ case FB_VMODE_BGR888UNPACK:
|
|
+ case FB_VMODE_YUV422PLANAR_SWAPYUorV:
|
|
+ case FB_VMODE_YUV420PLANAR_SWAPYUorV:
|
|
+ default:
|
|
+ return -1;
|
|
+ }
|
|
+}
|
|
+
|
|
+static void pxa168_sync_colorkey_structures(struct pxa168fb_info *fbi, int direction)
|
|
+{
|
|
+ struct _sColorKeyNAlpha *colorkey = &fbi->ckey_alpha;
|
|
+ struct pxa168_fb_chroma *chroma = &fbi->chroma;
|
|
+ unsigned int temp;
|
|
+
|
|
+ dev_dbg(fbi->info->dev, "ENTER %s\n", __FUNCTION__);
|
|
+ if (direction == FB_SYNC_COLORKEY_TO_CHROMA) {
|
|
+ chroma->mode = colorkey->mode;
|
|
+ chroma->y_alpha = (colorkey->Y_ColorAlpha) & 0xff;
|
|
+ chroma->y = (colorkey->Y_ColorAlpha >> 8) & 0xff;
|
|
+ chroma->y1 = (colorkey->Y_ColorAlpha >> 16) & 0xff;
|
|
+ chroma->y2 = (colorkey->Y_ColorAlpha >> 24) & 0xff;
|
|
+
|
|
+ chroma->u_alpha = (colorkey->U_ColorAlpha) & 0xff;
|
|
+ chroma->u = (colorkey->U_ColorAlpha >> 8) & 0xff;
|
|
+ chroma->u1 = (colorkey->U_ColorAlpha >> 16) & 0xff;
|
|
+ chroma->u2 = (colorkey->U_ColorAlpha >> 24) & 0xff;
|
|
+
|
|
+ chroma->v_alpha = (colorkey->V_ColorAlpha) & 0xff;
|
|
+ chroma->v = (colorkey->V_ColorAlpha >> 8) & 0xff;
|
|
+ chroma->v1 = (colorkey->V_ColorAlpha >> 16) & 0xff;
|
|
+ chroma->v2 = (colorkey->V_ColorAlpha >> 24) & 0xff;
|
|
+ }
|
|
+
|
|
+
|
|
+ if (direction == FB_SYNC_CHROMA_TO_COLORKEY) {
|
|
+
|
|
+ colorkey->mode = chroma->mode;
|
|
+ temp = chroma->y_alpha;
|
|
+ temp |= chroma->y << 8;
|
|
+ temp |= chroma->y1 << 16;
|
|
+ temp |= chroma->y2 << 24;
|
|
+ colorkey->Y_ColorAlpha = temp;
|
|
+
|
|
+ temp = chroma->u_alpha;
|
|
+ temp |= chroma->u << 8;
|
|
+ temp |= chroma->u1 << 16;
|
|
+ temp |= chroma->u2 << 24;
|
|
+ colorkey->U_ColorAlpha = temp;
|
|
+
|
|
+ temp = chroma->v_alpha;
|
|
+ temp |= chroma->v << 8;
|
|
+ temp |= chroma->v1 << 16;
|
|
+ temp |= chroma->v2 << 24;
|
|
+ colorkey->V_ColorAlpha = temp;
|
|
+
|
|
+ }
|
|
+}
|
|
+
|
|
+/* check whether h/w turn on RB swap. */
|
|
+static u32 colorkey_rbswap(struct pxa168fb_info *fbi)
|
|
+{
|
|
+ unsigned int rb;
|
|
+ struct _sColorKeyNAlpha *color_a = &fbi->ckey_alpha;
|
|
+
|
|
+ rb = readl(fbi->reg_base + LCD_SPU_DMA_CTRL0);
|
|
+ if (((color_a->alphapath == FB_GRA_PATH_ALPHA) && (rb & CFG_GRA_SWAPRB_MASK))
|
|
+ || ((color_a->alphapath == FB_VID_PATH_ALPHA) && (rb & CFG_DMA_SWAPRB_MASK)))
|
|
+ return 1;
|
|
+ else
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+static u32 pxa168fb_ovly_set_colorkeyalpha(struct pxa168fb_info *fbi)
|
|
+{
|
|
+ unsigned int temp;
|
|
+ unsigned int x;
|
|
+ struct _sColorKeyNAlpha *color_a = &fbi->ckey_alpha;
|
|
+
|
|
+ dev_dbg(fbi->info->dev, "Enter %s\n", __FUNCTION__);
|
|
+ /* reset to 0x0 to disable color key. */
|
|
+ x = readl(fbi->reg_base + LCD_SPU_DMA_CTRL1) & ~(CFG_COLOR_KEY_MASK | CFG_ALPHA_MODE_MASK | CFG_ALPHA_MASK);
|
|
+
|
|
+ /* switch to color key mode */
|
|
+ switch (color_a->mode) {
|
|
+ case FB_DISABLE_COLORKEY_MODE:
|
|
+ /* do nothing */
|
|
+ break;
|
|
+ case FB_ENABLE_Y_COLORKEY_MODE:
|
|
+ x |= CFG_COLOR_KEY_MODE(0x1);
|
|
+ break;
|
|
+ case FB_ENABLE_U_COLORKEY_MODE:
|
|
+ x |= CFG_COLOR_KEY_MODE(0x2);
|
|
+ break;
|
|
+ case FB_ENABLE_V_COLORKEY_MODE:
|
|
+ x |= CFG_COLOR_KEY_MODE(0x4);
|
|
+ break;
|
|
+ case FB_ENABLE_RGB_COLORKEY_MODE:
|
|
+ x |= CFG_COLOR_KEY_MODE(0x3);
|
|
+ if (colorkey_rbswap(fbi)) {
|
|
+ /* exchange r b fields. */
|
|
+ temp = color_a->Y_ColorAlpha;
|
|
+ color_a->Y_ColorAlpha = color_a->V_ColorAlpha;
|
|
+ color_a->V_ColorAlpha = temp;
|
|
+ }
|
|
+ break;
|
|
+ case FB_ENABLE_R_COLORKEY_MODE:
|
|
+ if (colorkey_rbswap(fbi))
|
|
+ x |= CFG_COLOR_KEY_MODE(0x7);
|
|
+ else
|
|
+ x |= CFG_COLOR_KEY_MODE(0x5);
|
|
+ break;
|
|
+ case FB_ENABLE_G_COLORKEY_MODE:
|
|
+ x |= CFG_COLOR_KEY_MODE(0x6);
|
|
+ break;
|
|
+ case FB_ENABLE_B_COLORKEY_MODE:
|
|
+ if (colorkey_rbswap(fbi))
|
|
+ x |= CFG_COLOR_KEY_MODE(0x5);
|
|
+ else
|
|
+ x |= CFG_COLOR_KEY_MODE(0x7);
|
|
+ break;
|
|
+ default:
|
|
+ printk(KERN_INFO "unknown mode");
|
|
+ return -1;
|
|
+ }
|
|
+
|
|
+ /* switch to alpha path selection */
|
|
+ switch (color_a->alphapath) {
|
|
+ case FB_VID_PATH_ALPHA:
|
|
+ x |= CFG_ALPHA_MODE(0x0);
|
|
+ break;
|
|
+ case FB_GRA_PATH_ALPHA:
|
|
+ x |= CFG_ALPHA_MODE(0x1);
|
|
+ break;
|
|
+ case FB_CONFIG_ALPHA:
|
|
+ x |= CFG_ALPHA_MODE(0x2);
|
|
+ break;
|
|
+ default:
|
|
+ printk(KERN_INFO "unknown alpha path");
|
|
+ return -1;
|
|
+ }
|
|
+
|
|
+ /* configure alpha */
|
|
+ x |= CFG_ALPHA((color_a->config & 0xff));
|
|
+
|
|
+ writel(x, fbi->reg_base + LCD_SPU_DMA_CTRL1);
|
|
+ writel(color_a->Y_ColorAlpha, fbi->reg_base + LCD_SPU_COLORKEY_Y);
|
|
+ writel(color_a->U_ColorAlpha, fbi->reg_base + LCD_SPU_COLORKEY_U);
|
|
+ writel(color_a->V_ColorAlpha, fbi->reg_base + LCD_SPU_COLORKEY_V);
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+static int check_surface(struct fb_info *fi,
|
|
+ FBVideoMode new_mode,
|
|
+ struct _sViewPortInfo *new_info,
|
|
+ struct _sViewPortOffset *new_offset,
|
|
+ struct _sVideoBufferAddr *new_addr)
|
|
+{
|
|
+ struct pxa168fb_info *fbi = (struct pxa168fb_info *)fi->par;
|
|
+ struct fb_var_screeninfo *var = &fi->var;
|
|
+ int changed = 0;
|
|
+
|
|
+ dev_dbg(fi->dev, "Enter %s\n", __FUNCTION__);
|
|
+
|
|
+ /*
|
|
+ * check mode
|
|
+ */
|
|
+ if (new_mode >= 0 && fbi->surface.videoMode != new_mode) {
|
|
+ fbi->surface.videoMode = new_mode;
|
|
+ fbi->pix_fmt = convert_pix_fmt(new_mode);
|
|
+ set_pix_fmt(var, fbi->pix_fmt);
|
|
+ changed = 1;
|
|
+ }
|
|
+
|
|
+ /*
|
|
+ * check view port settings.
|
|
+ */
|
|
+ if (new_info &&
|
|
+ (fbi->surface.viewPortInfo.srcWidth != new_info->srcWidth ||
|
|
+ fbi->surface.viewPortInfo.srcHeight != new_info->srcHeight ||
|
|
+ fbi->surface.viewPortInfo.zoomXSize != new_info->zoomXSize ||
|
|
+ fbi->surface.viewPortInfo.zoomYSize != new_info->zoomYSize ||
|
|
+ fbi->surface.viewPortInfo.yPitch != new_info->yPitch ||
|
|
+ fbi->surface.viewPortInfo.uPitch != new_info->uPitch ||
|
|
+ fbi->surface.viewPortInfo.vPitch != new_info->vPitch)) {
|
|
+ if (!(new_addr && new_addr->startAddr[0])) {
|
|
+ if (((new_info->srcWidth * new_info->srcHeight * var->bits_per_pixel / 8) * 2) > max_fb_size) {
|
|
+ printk("%s: requested memory buffer size %d exceed the max limit %d!\n", __func__,
|
|
+ (new_info->srcWidth * new_info->srcHeight * var->bits_per_pixel / 4), max_fb_size);
|
|
+ return changed;
|
|
+ }
|
|
+ }
|
|
+ var->xres_virtual = new_info->srcWidth;
|
|
+ var->yres_virtual = new_info->srcHeight * 2;
|
|
+ var->xres = new_info->srcWidth;
|
|
+ var->yres = new_info->srcHeight;
|
|
+ fbi->surface.viewPortInfo = *new_info;
|
|
+ set_pix_fmt(var, fbi->pix_fmt);
|
|
+ changed = 1;
|
|
+ }
|
|
+
|
|
+ /*
|
|
+ * Check offset
|
|
+ */
|
|
+ if (new_offset &&
|
|
+ (fbi->surface.viewPortOffset.xOffset != new_offset->xOffset ||
|
|
+ fbi->surface.viewPortOffset.yOffset != new_offset->yOffset)) {
|
|
+ fbi->surface.viewPortOffset.xOffset = new_offset->xOffset;
|
|
+ fbi->surface.viewPortOffset.yOffset = new_offset->yOffset;
|
|
+ changed = 1;
|
|
+ }
|
|
+
|
|
+ /*
|
|
+ * Check buffer address
|
|
+ */
|
|
+ if (new_addr && new_addr->startAddr[0] &&
|
|
+ fbi->new_addr[0] != (unsigned long)new_addr->startAddr[0]) {
|
|
+ fbi->new_addr[0] = (unsigned long)new_addr->startAddr[0];
|
|
+ fbi->new_addr[1] = (unsigned long)new_addr->startAddr[1];
|
|
+ fbi->new_addr[2] = (unsigned long)new_addr->startAddr[2];
|
|
+ changed = 1;
|
|
+ }
|
|
+
|
|
+ return changed;
|
|
+}
|
|
+
|
|
+static void pxa168fb_clear_framebuffer(struct fb_info *fi)
|
|
+{
|
|
+ struct pxa168fb_info *fbi = fi->par;
|
|
+
|
|
+ memset(fbi->fb_start, 0, fbi->fb_size);
|
|
+}
|
|
+
|
|
+
|
|
+
|
|
+#ifdef CONFIG_DYNAMIC_PRINTK_DEBUG
|
|
+static void debug_identify_called_ioctl(struct fb_info *fi, int cmd, unsigned long arg)
|
|
+{
|
|
+ switch (cmd) {
|
|
+ case FBIO_CLEAR_FRAMEBUFFER:
|
|
+ dev_dbg(fi->dev," FBIO_CLEAR_FRAMEBUFFER\n");
|
|
+ break;
|
|
+ case FB_IOCTL_WAIT_VSYNC:
|
|
+ dev_dbg(fi->dev," FB_IOCTL_WAIT_VSYNC\n");
|
|
+ break;
|
|
+ case FB_IOCTL_GET_VIEWPORT_INFO:
|
|
+ dev_dbg(fi->dev," FB_IOCTL_GET_VIEWPORT_INFO with arg = %08x\n", (unsigned int)arg);
|
|
+ break;
|
|
+ case FB_IOCTL_SET_VIEWPORT_INFO:
|
|
+ dev_dbg(fi->dev," FB_IOCTL_SET_VIEWPORT_INFO with arg = %08x\n", (unsigned int)arg);
|
|
+ break;
|
|
+ case FB_IOCTL_SET_VIDEO_MODE:
|
|
+ dev_dbg(fi->dev," FB_IOCTL_SET_VIDEO_MODE with arg = %08x\n", (unsigned int)arg);
|
|
+ break;
|
|
+ case FB_IOCTL_GET_VIDEO_MODE:
|
|
+ dev_dbg(fi->dev," FB_IOCTL_GET_VIDEO_MODE with arg = %08x\n", (unsigned int)arg);
|
|
+ break;
|
|
+ case FB_IOCTL_FLIP_VID_BUFFER:
|
|
+ dev_dbg(fi->dev," FB_IOCTL_FLIP_VID_BUFFER with arg = %08x\n", (unsigned int)arg);
|
|
+ break;
|
|
+ case FB_IOCTL_GET_FREELIST:
|
|
+ dev_dbg(fi->dev," FB_IOCTL_GET_FREELIST with arg = %08x\n", (unsigned int)arg);
|
|
+ break;
|
|
+ case FB_IOCTL_GET_BUFF_ADDR:
|
|
+ dev_dbg(fi->dev," FB_IOCTL_GET_BUFF_ADDR with arg = %08x\n", (unsigned int)arg);
|
|
+ break;
|
|
+ case FB_IOCTL_SET_VID_OFFSET:
|
|
+ dev_dbg(fi->dev," FB_IOCTL_SET_VID_OFFSET with arg = %08x\n", (unsigned int)arg);
|
|
+ break;
|
|
+ case FB_IOCTL_GET_VID_OFFSET:
|
|
+ dev_dbg(fi->dev," FB_IOCTL_GET_VID_OFFSET with arg = %08x\n", (unsigned int)arg);
|
|
+ break;
|
|
+ case FB_IOCTL_SET_MEMORY_TOGGLE:
|
|
+ dev_dbg(fi->dev," FB_IOCTL_SET_MEMORY_TOGGLE with arg = %08x\n",(unsigned int) arg);
|
|
+ break;
|
|
+ case FB_IOCTL_SET_COLORKEYnALPHA:
|
|
+ dev_dbg(fi->dev," FB_IOCTL_SET_COLORKEYnALPHA with arg = %08x\n", (unsigned int)arg);
|
|
+ break;
|
|
+ case FBIOGET_CHROMAKEYS:
|
|
+ dev_dbg(fi->dev," FBIOGET_CHROMAKEYS with arg = %08x\n", (unsigned int)arg);
|
|
+ break;
|
|
+ case FBIOPUT_CHROMAKEYS:
|
|
+ dev_dbg(fi->dev," FBIOPUT_CHROMAKEYS with arg = %08x\n", (unsigned int)arg);
|
|
+ break;
|
|
+ case FB_IOCTL_GET_COLORKEYnALPHA:
|
|
+ dev_dbg(fi->dev," FB_IOCTL_GET_COLORKEYnALPHA with arg = %08x\n", (unsigned int)arg);
|
|
+ break;
|
|
+ case FB_IOCTL_SWITCH_VID_OVLY:
|
|
+ dev_dbg(fi->dev," FB_IOCTL_SWITCH_VID_OVLY with arg = %08x\n", (unsigned int)arg);
|
|
+ break;
|
|
+ case FB_IOCTL_SWITCH_GRA_OVLY:
|
|
+ dev_dbg(fi->dev," FB_IOCTL_SWITCH_GRA_OVLY with arg = %08x\n", (unsigned int)arg);
|
|
+ break;
|
|
+ case FBIOPUT_SWAP_VIDEO_RED_BLUE:
|
|
+ dev_dbg(fi->dev," FBIOPUT_SWAP_VIDEO_RED_BLUE with arg = %08x\n", (unsigned int)arg);
|
|
+ break;
|
|
+ case FBIOPUT_SWAP_VIDEO_U_V:
|
|
+ dev_dbg(fi->dev," FBIOPUT_SWAP_VIDEO_U_V with arg = %08x\n", (unsigned int)arg);
|
|
+ break;
|
|
+ case FBIOPUT_SWAP_VIDEO_Y_UV:
|
|
+ dev_dbg(fi->dev," FBIOPUT_SWAP_VIDEO_Y_UV with arg = %08x\n", (unsigned int)arg);
|
|
+ break;
|
|
+ case FBIOPUT_VIDEO_ALPHABLEND:
|
|
+ dev_dbg(fi->dev," FBIOPUT_VIDEO_ALPHABLEND with arg = %08x\n", (unsigned int)arg);
|
|
+ break;
|
|
+ case FBIOPUT_GLOBAL_ALPHABLEND:
|
|
+ dev_dbg(fi->dev," FBIOPUT_GLOBAL_ALPHABLEND with arg = %08x\n", (unsigned int)arg);
|
|
+ break;
|
|
+ case FBIOPUT_GRAPHIC_ALPHABLEND:
|
|
+ dev_dbg(fi->dev," FBIOPUT_GRAPHIC_ALPHABLEND with arg = %08x\n", (unsigned int)arg);
|
|
+ break;
|
|
+
|
|
+ }
|
|
+}
|
|
+#endif
|
|
+
|
|
+static int pxa168fb_ioctl(struct fb_info *fi, unsigned int cmd,
|
|
+ unsigned long arg)
|
|
+{
|
|
+ void __user *argp = (void __user *)arg;
|
|
+ struct pxa168fb_info *fbi = (struct pxa168fb_info *)fi->par;
|
|
+ u32 x;
|
|
+ int vmode = 0;
|
|
+ int gfx_on = 1;
|
|
+ int vid_on = 1;
|
|
+ int val;
|
|
+ unsigned char param;
|
|
+ int blendval;
|
|
+
|
|
+#ifdef CONFIG_DYNAMIC_PRINTK_DEBUG
|
|
+ debug_identify_called_ioctl(fi, cmd, arg);
|
|
+#endif
|
|
+
|
|
+ switch (cmd) {
|
|
+ case FBIO_CLEAR_FRAMEBUFFER:
|
|
+ pxa168fb_clear_framebuffer(fi);
|
|
+ return 0;
|
|
+ break;
|
|
+ case FB_IOCTL_WAIT_VSYNC:
|
|
+ wait_for_vsync(fbi);
|
|
+ break;
|
|
+ case FB_IOCTL_GET_VIEWPORT_INFO:
|
|
+ return copy_to_user(argp, &fbi->surface.viewPortInfo,
|
|
+ sizeof(struct _sViewPortInfo)) ? -EFAULT : 0;
|
|
+ case FB_IOCTL_SET_VIEWPORT_INFO:
|
|
+ mutex_lock(&fbi->access_ok);
|
|
+ if (copy_from_user(&gViewPortInfo, argp,
|
|
+ sizeof(gViewPortInfo))) {
|
|
+ mutex_unlock(&fbi->access_ok);
|
|
+ return -EFAULT;
|
|
+ }
|
|
+
|
|
+ if (check_surface(fi, -1, &gViewPortInfo, 0, 0))
|
|
+ pxa168fb_set_par(fi);
|
|
+
|
|
+ mutex_unlock(&fbi->access_ok);
|
|
+ break;
|
|
+ case FB_IOCTL_SET_VIDEO_MODE:
|
|
+ /*
|
|
+ * Get data from user space.
|
|
+ */
|
|
+ if (copy_from_user(&vmode, argp, sizeof(vmode)))
|
|
+ return -EFAULT;
|
|
+
|
|
+ if (check_surface(fi, vmode, 0, 0, 0))
|
|
+ pxa168fb_set_par(fi);
|
|
+ break;
|
|
+ case FB_IOCTL_GET_VIDEO_MODE:
|
|
+ return copy_to_user(argp, &fbi->surface.videoMode,
|
|
+ sizeof(u32)) ? -EFAULT : 0;
|
|
+ case FB_IOCTL_FLIP_VID_BUFFER:
|
|
+ {
|
|
+ struct _sOvlySurface *surface = 0;
|
|
+ u8 *start_addr[3], *input_data;
|
|
+ u32 length;
|
|
+ surface = kmalloc(sizeof(struct _sOvlySurface),
|
|
+ GFP_KERNEL);
|
|
+
|
|
+ /* Get user-mode data. */
|
|
+ if (copy_from_user(surface, argp,
|
|
+ sizeof(struct _sOvlySurface))) {
|
|
+ kfree(surface);
|
|
+ return -EFAULT;
|
|
+ }
|
|
+
|
|
+ length = surface->videoBufferAddr.length;
|
|
+ start_addr[0] = surface->videoBufferAddr.startAddr[0];
|
|
+ input_data = surface->videoBufferAddr.inputData;
|
|
+
|
|
+ /*
|
|
+ * Has DMA addr?
|
|
+ */
|
|
+ if (start_addr[0] &&
|
|
+ (!input_data)) {
|
|
+ if (0 != addFreeBuf(freeBufList, (u8 *)surface)) {
|
|
+ printk(KERN_INFO "Error: addFreeBuf()\n");
|
|
+ mutex_unlock(&fbi->access_ok);
|
|
+ kfree(surface);
|
|
+ return -EFAULT;
|
|
+ }
|
|
+ tasklet_schedule(&fbi->tasklet);
|
|
+ } else {
|
|
+ if (check_surface(fi, surface->videoMode,
|
|
+ &surface->viewPortInfo,
|
|
+ &surface->viewPortOffset,
|
|
+ &surface->videoBufferAddr))
|
|
+ pxa168fb_set_par(fi);
|
|
+
|
|
+ /* copy buffer */
|
|
+ if (input_data) {
|
|
+ wait_for_vsync(fbi);
|
|
+ /* if support hw DMA, replace this. */
|
|
+ if (copy_from_user(fbi->fb_start,
|
|
+ input_data, length))
|
|
+ return -EFAULT;
|
|
+ return 0;
|
|
+ }
|
|
+
|
|
+ /*
|
|
+ * if it has its own physical address,
|
|
+ * switch to this memory. don't support YUV planar format
|
|
+ * with split YUV buffers. but below code seems have no
|
|
+ * chancee to execute. - FIXME
|
|
+ */
|
|
+ if (start_addr[0]) {
|
|
+ if (fbi->mem_status)
|
|
+ free_pages(
|
|
+ (unsigned long)fbi->fb_start,
|
|
+ get_order(fbi->fb_size));
|
|
+ else
|
|
+ dma_free_writecombine(fbi->dev,
|
|
+ fbi->fb_size,
|
|
+ fbi->fb_start,
|
|
+ fbi->fb_start_dma);
|
|
+
|
|
+ fbi->fb_start = __va(start_addr[0]);
|
|
+ fbi->fb_size = length;
|
|
+ fbi->fb_start_dma =
|
|
+ (dma_addr_t)__pa(fbi->fb_start);
|
|
+ fbi->mem_status = 1;
|
|
+ fi->fix.smem_start = fbi->fb_start_dma;
|
|
+ fi->fix.smem_len = fbi->fb_size;
|
|
+ fi->screen_base = fbi->fb_start;
|
|
+ fi->screen_size = fbi->fb_size;
|
|
+ }
|
|
+
|
|
+ kfree(surface);
|
|
+ }
|
|
+
|
|
+ mutex_unlock(&fbi->access_ok);
|
|
+ return 0;
|
|
+ }
|
|
+ case FB_IOCTL_GET_FREELIST:
|
|
+ {
|
|
+ mutex_lock(&fbi->access_ok);
|
|
+
|
|
+ /* Collect expired frame to list */
|
|
+ collectFreeBuf(filterBufList, freeBufList, gLastFrame);
|
|
+
|
|
+ if (copy_to_user(argp, filterBufList,
|
|
+ 3*MAX_QUEUE_NUM*sizeof(u8 *))) {
|
|
+ mutex_unlock(&fbi->access_ok);
|
|
+ return -EFAULT;
|
|
+ }
|
|
+
|
|
+ clearFilterBuf(filterBufList, RESET_BUF);
|
|
+
|
|
+ mutex_unlock(&fbi->access_ok);
|
|
+ return 0;
|
|
+ }
|
|
+ case FB_IOCTL_GET_BUFF_ADDR:
|
|
+ {
|
|
+ return copy_to_user(argp, &fbi->surface.videoBufferAddr,
|
|
+ sizeof(struct _sVideoBufferAddr)) ? -EFAULT : 0;
|
|
+ }
|
|
+ case FB_IOCTL_SET_VID_OFFSET:
|
|
+ mutex_lock(&fbi->access_ok);
|
|
+ if (copy_from_user(&gViewPortOffset, argp,
|
|
+ sizeof(gViewPortOffset))) {
|
|
+ mutex_unlock(&fbi->access_ok);
|
|
+ return -EFAULT;
|
|
+ }
|
|
+
|
|
+ if (check_surface(fi, -1, 0, &gViewPortOffset, 0))
|
|
+ pxa168fb_set_par(fi);
|
|
+ mutex_unlock(&fbi->access_ok);
|
|
+ break;
|
|
+ case FB_IOCTL_GET_VID_OFFSET:
|
|
+ return copy_to_user(argp, &fbi->surface.viewPortOffset,
|
|
+ sizeof(struct _sViewPortOffset)) ? -EFAULT : 0;
|
|
+ case FB_IOCTL_SET_MEMORY_TOGGLE:
|
|
+ break;
|
|
+
|
|
+ case FB_IOCTL_SET_COLORKEYnALPHA:
|
|
+ if (copy_from_user(&fbi->ckey_alpha, argp,
|
|
+ sizeof(struct _sColorKeyNAlpha)))
|
|
+ return -EFAULT;
|
|
+
|
|
+ pxa168fb_ovly_set_colorkeyalpha(fbi);
|
|
+ break;
|
|
+ case FBIOGET_CHROMAKEYS:
|
|
+ pxa168_sync_colorkey_structures(fbi, FB_SYNC_COLORKEY_TO_CHROMA);
|
|
+ return copy_to_user(argp, &fbi->chroma, sizeof(struct pxa168_fb_chroma)) ? -EFAULT : 0;
|
|
+ case FBIOPUT_CHROMAKEYS:
|
|
+ if (copy_from_user(&fbi->chroma, argp, sizeof(struct pxa168_fb_chroma)))
|
|
+ return -EFAULT;
|
|
+ pxa168_sync_colorkey_structures(fbi, FB_SYNC_CHROMA_TO_COLORKEY);
|
|
+ pxa168fb_ovly_set_colorkeyalpha(fbi);
|
|
+ return copy_to_user(argp, &fbi->chroma, sizeof(struct pxa168_fb_chroma)) ? -EFAULT : 0;
|
|
+
|
|
+ case FB_IOCTL_GET_COLORKEYnALPHA:
|
|
+ if (copy_to_user(argp, &fbi->ckey_alpha,
|
|
+ sizeof(struct _sColorKeyNAlpha)))
|
|
+ return -EFAULT;
|
|
+ break;
|
|
+ case FB_IOCTL_SWITCH_VID_OVLY:
|
|
+ if (copy_from_user(&vid_on, argp, sizeof(int)))
|
|
+ return -EFAULT;
|
|
+ if (0 == vid_on) {
|
|
+ x = readl(fbi->reg_base + LCD_SPU_DMA_CTRL0) &
|
|
+ ~CFG_DMA_ENA_MASK;
|
|
+ writel(x, fbi->reg_base + LCD_SPU_DMA_CTRL0);
|
|
+ atomic_set(&dma_flag, 0);
|
|
+ } else {
|
|
+ x = readl(fbi->reg_base + LCD_SPU_DMA_CTRL0) |
|
|
+ CFG_DMA_ENA(0x1);
|
|
+ writel(x, fbi->reg_base + LCD_SPU_DMA_CTRL0);
|
|
+ atomic_set(&dma_flag, 1);
|
|
+ }
|
|
+ break;
|
|
+ case FB_IOCTL_SWITCH_GRA_OVLY:
|
|
+ if (copy_from_user(&gfx_on, argp, sizeof(int))){
|
|
+ return -EFAULT;
|
|
+ }
|
|
+ if (0 == gfx_on) {
|
|
+ x = readl(fbi->reg_base + LCD_SPU_DMA_CTRL0) &
|
|
+ ~CFG_GRA_ENA_MASK;
|
|
+ writel(x, fbi->reg_base + LCD_SPU_DMA_CTRL0);
|
|
+ } else {
|
|
+ x = readl(fbi->reg_base + LCD_SPU_DMA_CTRL0) |
|
|
+ CFG_GRA_ENA(0x1);
|
|
+ writel(x, fbi->reg_base + LCD_SPU_DMA_CTRL0);
|
|
+ }
|
|
+ break;
|
|
+ case FBIOPUT_SWAP_VIDEO_RED_BLUE:
|
|
+ param = (arg & 0x1);
|
|
+
|
|
+ val = readl(fbi->reg_base + LCD_SPU_DMA_CTRL0);
|
|
+ val &= ~CFG_DMA_SWAPRB_MASK;
|
|
+ val |= CFG_DMA_SWAPRB(param);
|
|
+ writel(val, fbi->reg_base + LCD_SPU_DMA_CTRL0);
|
|
+
|
|
+ return 0;
|
|
+ break;
|
|
+
|
|
+ case FBIOPUT_SWAP_VIDEO_U_V:
|
|
+ param = (arg & 0x1);
|
|
+
|
|
+ val = readl(fbi->reg_base + LCD_SPU_DMA_CTRL0);
|
|
+ val &= ~CFG_DMA_SWAPUV_MASK;
|
|
+ val |= CFG_DMA_SWAPUV(param);
|
|
+ writel(val, fbi->reg_base + LCD_SPU_DMA_CTRL0);
|
|
+
|
|
+ return 0;
|
|
+ break;
|
|
+
|
|
+ case FBIOPUT_SWAP_VIDEO_Y_UV:
|
|
+ param = (arg & 0x1);
|
|
+
|
|
+ val = readl(fbi->reg_base + LCD_SPU_DMA_CTRL0);
|
|
+ val &= ~CFG_DMA_SWAPYU_MASK;
|
|
+ val |= CFG_DMA_SWAPYU(param);
|
|
+ writel(val, fbi->reg_base + LCD_SPU_DMA_CTRL0);
|
|
+
|
|
+ return 0;
|
|
+
|
|
+ break;
|
|
+
|
|
+ case FBIOPUT_VIDEO_ALPHABLEND:
|
|
+ /*
|
|
+ * This puts the blending control to the Video layer.
|
|
+ */
|
|
+ val = readl(fbi->reg_base + LCD_SPU_DMA_CTRL1);
|
|
+ val &= ~CFG_ALPHA_MODE_MASK;
|
|
+ val &= ~CFG_ALPHA_MASK;
|
|
+ val |= CFG_ALPHA_MODE(0);
|
|
+ val |= CFG_ALPHA(0xff);
|
|
+ writel(val, fbi->reg_base + LCD_SPU_DMA_CTRL1);
|
|
+ return 0;
|
|
+ break;
|
|
+
|
|
+ case FBIOPUT_GLOBAL_ALPHABLEND:
|
|
+ /*
|
|
+ * The userspace application can specify a byte value for the amount of global blend
|
|
+ * between the video layer and the graphic layer.
|
|
+ *
|
|
+ * The alpha blending is per the formula below:
|
|
+ * P = (V[P] * blendval/255) + (G[P] * (1 - blendval/255))
|
|
+ *
|
|
+ * where: P = Pixel value, V = Video Layer, and G = Graphic Layer
|
|
+ */
|
|
+ blendval = (arg & 0xff);
|
|
+ val = readl(fbi->reg_base + LCD_SPU_DMA_CTRL1);
|
|
+ val &= ~CFG_ALPHA_MODE_MASK;
|
|
+ val &= ~CFG_ALPHA_MASK;
|
|
+ val |= CFG_ALPHA_MODE(2);
|
|
+ val |= CFG_ALPHA(blendval);
|
|
+ writel(val, fbi->reg_base + LCD_SPU_DMA_CTRL1);
|
|
+ return 0;
|
|
+ break;
|
|
+
|
|
+ case FBIOPUT_GRAPHIC_ALPHABLEND:
|
|
+ /*
|
|
+ * This puts the blending back to the default mode of allowing
|
|
+ * the graphic layer to do pixel level blending.
|
|
+ */
|
|
+ val = readl(fbi->reg_base + LCD_SPU_DMA_CTRL1);
|
|
+ val &= ~CFG_ALPHA_MODE_MASK;
|
|
+ val &= ~CFG_ALPHA_MASK;
|
|
+ val |= CFG_ALPHA_MODE(1);
|
|
+ val |= CFG_ALPHA(0xff);
|
|
+ writel(val, fbi->reg_base + LCD_SPU_DMA_CTRL1);
|
|
+ return 0;
|
|
+ break;
|
|
+
|
|
+
|
|
+ default:
|
|
+ break;
|
|
+ }
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+static void collectFreeBuf(u8 *filterList[][3], u8 **freeList, int count)
|
|
+{
|
|
+ int i = 0, j = 0;
|
|
+ struct _sOvlySurface *srf = 0;
|
|
+ u8 *ptr;
|
|
+
|
|
+ if ((count < 1) || !filterList || !freeList)
|
|
+ return;
|
|
+
|
|
+ for (i = 0, j = 0; i < count; i++) {
|
|
+
|
|
+ ptr = freeList[i];
|
|
+
|
|
+ /* Check freeList's content. */
|
|
+ if (ptr) {
|
|
+ for (; j < MAX_QUEUE_NUM; j++) {
|
|
+ if (!(filterList[j][0])) {
|
|
+ /* get surface's ptr. */
|
|
+ srf = (struct _sOvlySurface *)ptr;
|
|
+
|
|
+ /*
|
|
+ * save ptrs which need
|
|
+ * to be freed.
|
|
+ */
|
|
+ filterList[j][0] = srf->videoBufferAddr.startAddr[0];
|
|
+ filterList[j][1] = srf->videoBufferAddr.startAddr[1];
|
|
+ filterList[j][2] = srf->videoBufferAddr.startAddr[2];
|
|
+ break;
|
|
+ }
|
|
+ }
|
|
+
|
|
+ if (j >= MAX_QUEUE_NUM)
|
|
+ break;
|
|
+
|
|
+ kfree(freeList[i]);
|
|
+ freeList[i] = 0;
|
|
+ }
|
|
+ else
|
|
+ {
|
|
+ /* till content is null. */
|
|
+ break;
|
|
+ }
|
|
+ }
|
|
+ for (i = (MAX_QUEUE_NUM-1); i >= 0; i--) {
|
|
+ if (freeList[i])
|
|
+ break;
|
|
+ }
|
|
+ for (j = count; j <= i; j++) {
|
|
+ freeList[j-count] = freeList[j];
|
|
+ freeList[j] = 0;
|
|
+ }
|
|
+// freeList[0] = freeList[count];
|
|
+// freeList[count] = 0;
|
|
+}
|
|
+
|
|
+static int addFreeBuf(u8 **ppBufList, u8 *pFreeBuf)
|
|
+{
|
|
+ int i = 0 ;
|
|
+ struct _sOvlySurface *srf0 = (struct _sOvlySurface *)(pFreeBuf);
|
|
+ struct _sOvlySurface *srf1 = 0;
|
|
+
|
|
+ /* Error checking */
|
|
+ if (!srf0) return -1;
|
|
+
|
|
+ for (; i < MAX_QUEUE_NUM; i++) {
|
|
+ srf1 = (struct _sOvlySurface *)ppBufList[i];
|
|
+
|
|
+ if (!srf1)
|
|
+ {
|
|
+ /* printk(KERN_INFO "Set pFreeBuf "
|
|
+ "into %d entry.\n", i);
|
|
+ */
|
|
+ ppBufList[i] = pFreeBuf;
|
|
+ return 0;
|
|
+ }
|
|
+
|
|
+ if (srf1->videoBufferAddr.startAddr[0] ==
|
|
+ srf0->videoBufferAddr.startAddr[0]) {
|
|
+ /* same address, free this request. */
|
|
+ kfree(pFreeBuf);
|
|
+ return 0;
|
|
+ }
|
|
+ }
|
|
+
|
|
+
|
|
+ if (i >= MAX_QUEUE_NUM)
|
|
+ printk(KERN_INFO "buffer overflow\n");
|
|
+
|
|
+ return -3;
|
|
+}
|
|
+
|
|
+static void clearFilterBuf(u8 *ppBufList[][3], int iFlag)
|
|
+{
|
|
+ /* Check null pointer. */
|
|
+ if (!ppBufList)
|
|
+ return;
|
|
+ if (RESET_BUF & iFlag)
|
|
+ memset(ppBufList, 0, 3 * MAX_QUEUE_NUM * sizeof(u8 *));
|
|
+}
|
|
+
|
|
+static void clearFreeBuf(u8 **ppBufList, int iFlag)
|
|
+{
|
|
+ int i = 0;
|
|
+
|
|
+ /* Check null pointer. */
|
|
+ if (!ppBufList)
|
|
+ return;
|
|
+
|
|
+ /* free */
|
|
+ if (FREE_ENTRY & iFlag) {
|
|
+ for (i = 0; i < MAX_QUEUE_NUM; i++) {
|
|
+ if (ppBufList && ppBufList[i])
|
|
+ kfree(ppBufList[i]);
|
|
+ }
|
|
+ }
|
|
+
|
|
+ if (RESET_BUF & iFlag)
|
|
+ memset(ppBufList, 0, MAX_QUEUE_NUM * sizeof(u8 *));
|
|
+}
|
|
+
|
|
+static int pxa168fb_open(struct fb_info *fi, int user)
|
|
+{
|
|
+ u32 val;
|
|
+ struct pxa168fb_mach_info *mi;
|
|
+ struct pxa168fb_info *fbi = (struct pxa168fb_info *)fi->par;
|
|
+ struct fb_var_screeninfo *var = &fi->var;
|
|
+
|
|
+ dev_dbg(fi->dev, "Enter %s\n", __func__);
|
|
+
|
|
+ if (mutex_is_locked(&fbi->access_ok))
|
|
+ mutex_unlock(&fbi->access_ok);
|
|
+
|
|
+ set_dvfm_constraint();
|
|
+
|
|
+ atomic_inc(&global_op_count);
|
|
+
|
|
+ if (atomic_read(&global_op_count) == 1) {
|
|
+ mutex_lock(&fbi->access_ok);
|
|
+ mi = fbi->dev->platform_data;
|
|
+ fbi->new_addr[0] = 0;
|
|
+ fbi->new_addr[1] = 0;
|
|
+ fbi->new_addr[2] = 0;
|
|
+ fi->fix.smem_start = fbi->fb_start_dma;
|
|
+ fi->screen_base = fbi->fb_start;
|
|
+ fbi->surface.videoMode = -1;
|
|
+ fbi->surface.viewPortInfo.srcWidth = var->xres;
|
|
+ fbi->surface.viewPortInfo.srcHeight = var->yres;
|
|
+ fbi->active = 1;
|
|
+ set_pix_fmt(var, fbi->pix_fmt);
|
|
+ pxa168fb_set_par(fi);
|
|
+
|
|
+ /* clear buffer list. */
|
|
+
|
|
+ clearFilterBuf(filterBufList, RESET_BUF);
|
|
+ clearFreeBuf(freeBufList, RESET_BUF|FREE_ENTRY);
|
|
+
|
|
+ /* Compatibility with older PXA behavior.
|
|
+ Force Video DMA engine on during the OPEN.
|
|
+ */
|
|
+
|
|
+ val = readl(fbi->reg_base + LCD_SPU_DMA_CTRL0);
|
|
+ val |= CFG_DMA_ENA_MASK;
|
|
+ writel(val, fbi->reg_base + LCD_SPU_DMA_CTRL0);
|
|
+ mutex_unlock(&fbi->access_ok);
|
|
+ }
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+static int pxa168fb_release(struct fb_info *fi, int user)
|
|
+{
|
|
+ u32 val;
|
|
+ struct pxa168fb_info *fbi = (struct pxa168fb_info *)fi->par;
|
|
+ struct fb_var_screeninfo *var = &fi->var;
|
|
+
|
|
+ dev_dbg(fi->dev, "Enter %s\n", __func__);
|
|
+
|
|
+
|
|
+ if (atomic_dec_and_test(&global_op_count)) {
|
|
+ /* clear buffer list. */
|
|
+ mutex_lock(&fbi->access_ok);
|
|
+ clearFilterBuf(filterBufList, RESET_BUF);
|
|
+ clearFreeBuf(freeBufList, RESET_BUF|FREE_ENTRY);
|
|
+ mutex_unlock(&fbi->access_ok);
|
|
+
|
|
+ /* Compatibility with older PXA behavior.
|
|
+ Force Video DMA engine off at RELEASE.
|
|
+ */
|
|
+ if (!atomic_read(&dma_flag)) {
|
|
+ val = readl(fbi->reg_base + LCD_SPU_DMA_CTRL0);
|
|
+ val &= ~(CFG_DMA_ENA_MASK);
|
|
+ writel(val, fbi->reg_base + LCD_SPU_DMA_CTRL0);
|
|
+ }
|
|
+ }
|
|
+ fbi->active = 0;
|
|
+
|
|
+ /* Turn off compatibility mode */
|
|
+
|
|
+ var->nonstd &= ~0xff000000;
|
|
+ COMPAT_MODE = 0;
|
|
+
|
|
+ unset_dvfm_constraint();
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+static int pxa168fb_switch_buff(struct fb_info *fi)
|
|
+{
|
|
+ struct pxa168fb_info *fbi = (struct pxa168fb_info *)fi->par;
|
|
+ int i = 0;
|
|
+ struct _sOvlySurface *pOvlySurface = 0;
|
|
+
|
|
+ /*
|
|
+ * Find the latest frame.
|
|
+ */
|
|
+ for (i = (MAX_QUEUE_NUM-1); i >= 0; i--) {
|
|
+ if (freeBufList[i]) {
|
|
+ pOvlySurface = (struct _sOvlySurface *)freeBufList[i];
|
|
+ break;
|
|
+ }
|
|
+ }
|
|
+ gLastFrame = i;
|
|
+
|
|
+ /*
|
|
+ * Got new frame?
|
|
+ */
|
|
+ if (pOvlySurface && (fbi->new_addr[0] !=
|
|
+ (unsigned long)pOvlySurface->videoBufferAddr.startAddr[0])) {
|
|
+ /*
|
|
+ * Update new surface.
|
|
+ */
|
|
+ if (check_surface(fi, pOvlySurface->videoMode,
|
|
+ &pOvlySurface->viewPortInfo,
|
|
+ &pOvlySurface->viewPortOffset,
|
|
+ &pOvlySurface->videoBufferAddr))
|
|
+ pxa168fb_set_par(fi);
|
|
+ } else {
|
|
+ /*printk(KERN_INFO "********Oops: pOvlySurface"
|
|
+ " is NULL!!!!\n\n");
|
|
+ */
|
|
+ return -1;
|
|
+ }
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+static void set_mode(struct pxa168fb_info *fbi, struct fb_var_screeninfo *var,
|
|
+ struct fb_videomode *mode, int pix_fmt, int ystretch)
|
|
+{
|
|
+ dev_dbg(fbi->info->dev, "Enter %s\n", __FUNCTION__);
|
|
+ set_pix_fmt(var, pix_fmt);
|
|
+
|
|
+ var->xres = mode->xres;
|
|
+ var->yres = mode->yres;
|
|
+ var->xres_virtual = max(var->xres, var->xres_virtual);
|
|
+ if (ystretch)
|
|
+ var->yres_virtual = var->yres*2;
|
|
+ else
|
|
+ var->yres_virtual = max(var->yres, var->yres_virtual);
|
|
+
|
|
+ var->grayscale = 0;
|
|
+ var->accel_flags = FB_ACCEL_NONE;
|
|
+ var->pixclock = mode->pixclock;
|
|
+ var->left_margin = mode->left_margin;
|
|
+ var->right_margin = mode->right_margin;
|
|
+ var->upper_margin = mode->upper_margin;
|
|
+ var->lower_margin = mode->lower_margin;
|
|
+ var->hsync_len = mode->hsync_len;
|
|
+ var->vsync_len = mode->vsync_len;
|
|
+ var->sync = mode->sync;
|
|
+ var->vmode = FB_VMODE_NONINTERLACED;
|
|
+ var->rotate = FB_ROTATE_UR;
|
|
+}
|
|
+
|
|
+static int pxa168fb_check_var(struct fb_var_screeninfo *var, struct fb_info *fi)
|
|
+{
|
|
+ int pix_fmt;
|
|
+
|
|
+ dev_dbg(fi->dev, "Enter %s\n", __FUNCTION__);
|
|
+ if (var->bits_per_pixel == 8) {
|
|
+ printk("bits per pixel too small\n");
|
|
+ return -EINVAL;
|
|
+ }
|
|
+
|
|
+ /* compatibility mode: if the MSB of var->nonstd is 0xAA then
|
|
+ * set xres_virtual and yres_virtual to xres and yres.
|
|
+ */
|
|
+
|
|
+ if((var->nonstd >> 24) == 0xAA)
|
|
+ COMPAT_MODE = 0x2625;
|
|
+
|
|
+ if((var->nonstd >> 24) == 0x55)
|
|
+ COMPAT_MODE = 0x0;
|
|
+
|
|
+ /*
|
|
+ * Basic geometry sanity checks.
|
|
+ */
|
|
+
|
|
+ if (var->xoffset + var->xres > var->xres_virtual) {
|
|
+ printk("ERROR: xoffset + xres is greater than xres_virtual\n");
|
|
+ return -EINVAL;
|
|
+ }
|
|
+ if (var->yoffset + var->yres > var->yres_virtual) {
|
|
+ printk("ERROR: yoffset + yres is greater than yres_virtual\n");
|
|
+ return -EINVAL;
|
|
+ }
|
|
+
|
|
+ if (var->xres + var->right_margin +
|
|
+ var->hsync_len + var->left_margin > 2048)
|
|
+ return -EINVAL;
|
|
+ if (var->yres + var->lower_margin +
|
|
+ var->vsync_len + var->upper_margin > 2048)
|
|
+ return -EINVAL;
|
|
+
|
|
+ /*
|
|
+ * Check size of framebuffer.
|
|
+ */
|
|
+ if (var->xres_virtual * var->yres_virtual *
|
|
+ (var->bits_per_pixel >> 3) > max_fb_size)
|
|
+ return -EINVAL;
|
|
+
|
|
+ /*
|
|
+ * Select most suitable hardware pixel format.
|
|
+ */
|
|
+ pix_fmt = determine_best_pix_fmt(var);
|
|
+ dev_dbg(fi->dev, "%s determine_best_pix_fmt returned: %d\n", __FUNCTION__, pix_fmt);
|
|
+ if (pix_fmt < 0)
|
|
+ return pix_fmt;
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+static void set_dma_control0(struct pxa168fb_info *fbi)
|
|
+{
|
|
+ u32 x, x_bk;
|
|
+
|
|
+ dev_dbg(fbi->info->dev, "FB1: Enter %s\n", __FUNCTION__);
|
|
+ /*
|
|
+ * Get reg's current value
|
|
+ */
|
|
+ x_bk = x = readl(fbi->reg_base + LCD_SPU_DMA_CTRL0);
|
|
+ /*
|
|
+ * clear video layer's field
|
|
+ */
|
|
+ x &= 0xef0fff01;
|
|
+
|
|
+ /*
|
|
+ * If we are in a pseudo-color mode, we need to enable
|
|
+ * palette lookup.
|
|
+ */
|
|
+ if (fbi->pix_fmt == PIX_FMT_PSEUDOCOLOR)
|
|
+ x |= 0x10000000;
|
|
+
|
|
+ /*
|
|
+ * Configure hardware pixel format.
|
|
+ */
|
|
+ x |= ((fbi->pix_fmt & ~0x1000) >> 1) << 20;
|
|
+
|
|
+ /*
|
|
+ * color format in memory:
|
|
+ * PXA168/PXA910:
|
|
+ * PIX_FMT_YUV422PACK: UYVY(CbY0CrY1)
|
|
+ * PIX_FMT_YUV422PLANAR: YUV
|
|
+ * PIX_FMT_YUV420PLANAR: YUV
|
|
+ */
|
|
+ if (((fbi->pix_fmt & ~0x1000) >> 1) == 5) {
|
|
+ x |= 0x00000002;
|
|
+ if (fbi->pix_fmt & 0x1000) {
|
|
+ x |= ((fbi->panel_rbswap) ^ 1) << 4; /* YUYV need swap RB after CSC. doc bug? */
|
|
+ x |= 1 << 2; /* Y and U/V is swapped */
|
|
+ } else {
|
|
+ x |= (fbi->panel_rbswap) << 4;
|
|
+ x |= (fbi->pix_fmt & 1) << 3;
|
|
+ }
|
|
+ } else if (fbi->pix_fmt >= 12) { /* PIX_FMT_YUV422PACK_IRE_90_270 is here */
|
|
+ x |= 0x00000002;
|
|
+ x |= (fbi->pix_fmt & 1) << 3;
|
|
+ x |= (fbi->panel_rbswap) << 4;
|
|
+ } else {
|
|
+ x |= (((fbi->pix_fmt & 1) ^ 1) ^ (fbi->panel_rbswap)) << 4;
|
|
+ }
|
|
+ if (x_bk != x)
|
|
+ writel(x, fbi->reg_base + LCD_SPU_DMA_CTRL0);
|
|
+}
|
|
+
|
|
+static void set_dma_control1(struct pxa168fb_info *fbi, int sync)
|
|
+{
|
|
+ u32 x, x_bk;
|
|
+
|
|
+ dev_dbg(fbi->info->dev, "FB1: Enter %s\n", __FUNCTION__);
|
|
+ /*
|
|
+ * Get current settings.
|
|
+ */
|
|
+ x_bk = x = readl(fbi->reg_base + LCD_SPU_DMA_CTRL1);
|
|
+
|
|
+ /*
|
|
+ * We trigger DMA on the falling edge of vsync if vsync is
|
|
+ * active low, or on the rising edge if vsync is active high.
|
|
+ */
|
|
+ if (!(sync & FB_SYNC_VERT_HIGH_ACT))
|
|
+ x |= 0x08000000;
|
|
+
|
|
+
|
|
+ if (x_bk != x)
|
|
+ writel(x, fbi->reg_base + LCD_SPU_DMA_CTRL1);
|
|
+}
|
|
+
|
|
+static int wait_for_vsync(struct pxa168fb_info *fbi)
|
|
+{
|
|
+ if (fbi) {
|
|
+ wait_event_interruptible(fbi->w_intr_wq,
|
|
+ atomic_read(&fbi->w_intr));
|
|
+ atomic_set(&fbi->w_intr, 0);
|
|
+ return 0;
|
|
+ }
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+static void set_graphics_start(struct fb_info *fi, int xoffset, int yoffset)
|
|
+{
|
|
+ struct pxa168fb_info *fbi = fi->par;
|
|
+ struct fb_var_screeninfo *var = &fi->var;
|
|
+ int pixel_offset;
|
|
+ unsigned long addr = 0;
|
|
+ static int debugcount = 0;
|
|
+
|
|
+ if(debugcount < 10)
|
|
+ debugcount++;
|
|
+
|
|
+ if (debugcount < 9)
|
|
+ dev_dbg(fi->dev, "Enter %s\n", __FUNCTION__);
|
|
+
|
|
+
|
|
+ /* If we are not using the viewport functionality */
|
|
+ if (!(fbi->new_addr[0])) {
|
|
+ pixel_offset = (yoffset * var->xres_virtual) + xoffset;
|
|
+ /* Set this at VSync interrupt time */
|
|
+ dma_base_address = fbi->fb_start_dma +
|
|
+ ((pixel_offset * var->bits_per_pixel) >> 3);
|
|
+ }
|
|
+
|
|
+ /* Android system does not want us to synchronize the
|
|
+ * dma address to VSync
|
|
+ */
|
|
+ /* FIXME: At this stage do not check for Android system*/
|
|
+ /*if (is_android()) {*/
|
|
+ if (0) {
|
|
+ if (fbi->new_addr[0]) {
|
|
+ /* we are using the viewport functionality */
|
|
+ writel(fbi->new_addr[0], fbi->reg_base +
|
|
+ LCD_SPU_DMA_START_ADDR_Y0);
|
|
+ if (fbi->pix_fmt >= 12 && fbi->pix_fmt <= 15) {
|
|
+ writel(fbi->new_addr[1], fbi->reg_base +
|
|
+ LCD_SPU_DMA_START_ADDR_U0);
|
|
+ writel(fbi->new_addr[2], fbi->reg_base +
|
|
+ LCD_SPU_DMA_START_ADDR_V0);
|
|
+ }
|
|
+ } else {
|
|
+ addr = dma_base_address;
|
|
+ writel(addr, fbi->reg_base + LCD_SPU_DMA_START_ADDR_Y0);
|
|
+ if (fbi->pix_fmt >= 12 && fbi->pix_fmt <= 15)
|
|
+ addr += var->xres * var->yres;
|
|
+ writel(addr, fbi->reg_base + LCD_SPU_DMA_START_ADDR_U0);
|
|
+ if ((fbi->pix_fmt>>1) == 6)
|
|
+ addr += var->xres * var->yres/2;
|
|
+ else if ((fbi->pix_fmt>>1) == 7)
|
|
+ addr += var->xres * var->yres/4;
|
|
+ writel(addr, fbi->reg_base + LCD_SPU_DMA_START_ADDR_V0);
|
|
+ }
|
|
+ } else {
|
|
+ /* Enable the interrupt */
|
|
+ writel(readl(fbi->reg_base+SPU_IRQ_ENA)
|
|
+ |VSYNC_IRQ_ENA(0x1),
|
|
+ fbi->reg_base+SPU_IRQ_ENA);
|
|
+ }
|
|
+}
|
|
+
|
|
+static int pxa168fb_set_par(struct fb_info *fi)
|
|
+{
|
|
+ struct pxa168fb_info *fbi = fi->par;
|
|
+ struct fb_var_screeninfo *var = &fi->var;
|
|
+ int pix_fmt;
|
|
+ int xzoom, yzoom;
|
|
+ int xpos = 0;
|
|
+ int ypos = 0;
|
|
+
|
|
+ dev_dbg(fi->dev,"FB1: Enter %s\n", __FUNCTION__);
|
|
+ /*
|
|
+ * Determine which pixel format we're going to use.
|
|
+ */
|
|
+ pix_fmt = determine_best_pix_fmt(&fi->var);
|
|
+ dev_dbg(fi->dev,"determine_best_pix_fmt returned: %d\n", pix_fmt);
|
|
+ if (pix_fmt < 0)
|
|
+ return pix_fmt;
|
|
+ fbi->pix_fmt = pix_fmt;
|
|
+
|
|
+ dev_dbg(fi->dev, "pix_fmt=%d\n", pix_fmt);
|
|
+ dev_dbg(fi->dev,"BPP = %d\n", var->bits_per_pixel);
|
|
+ /*
|
|
+ * Set additional mode info.
|
|
+ */
|
|
+ if (pix_fmt == PIX_FMT_PSEUDOCOLOR)
|
|
+ fi->fix.visual = FB_VISUAL_PSEUDOCOLOR;
|
|
+ else
|
|
+ fi->fix.visual = FB_VISUAL_TRUECOLOR;
|
|
+ fi->fix.line_length = var->xres_virtual * var->bits_per_pixel / 8;
|
|
+
|
|
+ /*
|
|
+ * Configure global panel parameters.
|
|
+ */
|
|
+ set_dma_control0(fbi);
|
|
+ set_dma_control1(fbi, fi->var.sync);
|
|
+
|
|
+ /*
|
|
+ * Configure graphics DMA parameters.
|
|
+ */
|
|
+ set_graphics_start(fi, fi->var.xoffset, fi->var.yoffset);
|
|
+
|
|
+ if (((fbi->pix_fmt & ~0x1000) >> 1) < 6)
|
|
+ writel((fbi->surface.viewPortInfo.yPitch) ?
|
|
+ (fbi->surface.viewPortInfo.yPitch) :
|
|
+ var->xres * var->bits_per_pixel >> 3,
|
|
+ fbi->reg_base + LCD_SPU_DMA_PITCH_YC);
|
|
+
|
|
+ else {
|
|
+ writel(fbi->surface.viewPortInfo.yPitch ?
|
|
+ fbi->surface.viewPortInfo.yPitch : var->xres,
|
|
+ fbi->reg_base + LCD_SPU_DMA_PITCH_YC);
|
|
+ writel((fbi->surface.viewPortInfo.uPitch && fbi->surface.viewPortInfo.vPitch) ?
|
|
+ ((fbi->surface.viewPortInfo.vPitch << 16) |
|
|
+ (fbi->surface.viewPortInfo.uPitch)) :
|
|
+ ((var->xres >> 1) << 16 | (var->xres >> 1)),
|
|
+ fbi->reg_base + LCD_SPU_DMA_PITCH_UV);
|
|
+ }
|
|
+
|
|
+ dev_dbg(fi->dev, "Executing Standard Mode\n");
|
|
+ writel((var->yres << 16) | var->xres,
|
|
+ fbi->reg_base + LCD_SPU_DMA_HPXL_VLN);
|
|
+
|
|
+ yzoom = fbi->surface.viewPortInfo.zoomYSize;
|
|
+ xzoom = fbi->surface.viewPortInfo.zoomXSize;
|
|
+
|
|
+ writel((yzoom << 16) | xzoom,
|
|
+ fbi->reg_base + LCD_SPU_DZM_HPXL_VLN);
|
|
+
|
|
+ if(COMPAT_MODE != 0x2625) {
|
|
+ /* update video position offset */
|
|
+ dev_dbg(fi->dev, "Setting Surface offsets...\n");
|
|
+
|
|
+ writel(CFG_DMA_OVSA_VLN(fbi->surface.viewPortOffset.yOffset)|
|
|
+ fbi->surface.viewPortOffset.xOffset,
|
|
+ fbi->reg_base + LCD_SPUT_DMA_OVSA_HPXL_VLN);
|
|
+ }
|
|
+ else {
|
|
+ dev_dbg(fi->dev, "Executing 2625 compatibility mode\n");
|
|
+ xpos = (var->nonstd & 0x3ff);
|
|
+ ypos = (var->nonstd >> 10) & 0x3ff;
|
|
+ writel(CFG_DMA_OVSA_VLN(ypos) | xpos, fbi->reg_base + LCD_SPUT_DMA_OVSA_HPXL_VLN);
|
|
+ writel((var->height << 16) | var->width,
|
|
+ fbi->reg_base + LCD_SPU_DZM_HPXL_VLN);
|
|
+ }
|
|
+
|
|
+ fi->fix.smem_len = var->xres_virtual * var->yres_virtual * var->bits_per_pixel/8;
|
|
+ fi->screen_size = fi->fix.smem_len;
|
|
+
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+static unsigned int chan_to_field(unsigned int chan, struct fb_bitfield *bf)
|
|
+{
|
|
+ return ((chan & 0xffff) >> (16 - bf->length)) << bf->offset;
|
|
+}
|
|
+
|
|
+static u32 to_rgb(u16 red, u16 green, u16 blue)
|
|
+{
|
|
+ red >>= 8;
|
|
+ green >>= 8;
|
|
+ blue >>= 8;
|
|
+
|
|
+ return (red << 16) | (green << 8) | blue;
|
|
+}
|
|
+
|
|
+static int
|
|
+pxa168fb_setcolreg(unsigned int regno, unsigned int red, unsigned int green,
|
|
+ unsigned int blue, unsigned int trans, struct fb_info *fi)
|
|
+{
|
|
+ struct pxa168fb_info *fbi = fi->par;
|
|
+ u32 val;
|
|
+
|
|
+ if (fi->fix.visual == FB_VISUAL_TRUECOLOR && regno < 16) {
|
|
+ val = chan_to_field(red, &fi->var.red);
|
|
+ val |= chan_to_field(green, &fi->var.green);
|
|
+ val |= chan_to_field(blue , &fi->var.blue);
|
|
+ fbi->pseudo_palette[regno] = val;
|
|
+ }
|
|
+
|
|
+ if (fi->fix.visual == FB_VISUAL_PSEUDOCOLOR && regno < 256) {
|
|
+ val = to_rgb(red, green, blue);
|
|
+ writel(val, fbi->reg_base + LCD_SPU_SRAM_WRDAT);
|
|
+ writel(0x8300 | regno, fbi->reg_base + LCD_SPU_SRAM_CTRL);
|
|
+ }
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+static int pxa168fb_pan_display(struct fb_var_screeninfo *var,
|
|
+ struct fb_info *fi)
|
|
+{
|
|
+ set_graphics_start(fi, var->xoffset, var->yoffset);
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+static int pxa168fb_fb_sync(struct fb_info *info)
|
|
+{
|
|
+ struct pxa168fb_info *fbi = (struct pxa168fb_info *)info->par;
|
|
+
|
|
+ return wait_for_vsync(fbi);
|
|
+}
|
|
+
|
|
+
|
|
+/*
|
|
+ * pxa168fb_handle_irq(two lcd controllers)
|
|
+ */
|
|
+static irqreturn_t pxa168fb_handle_irq(int irq, void *dev_id)
|
|
+{
|
|
+ struct fb_info *fi = (struct fb_info *)dev_id;
|
|
+ struct pxa168fb_info *fbi = (struct pxa168fb_info *)fi->par;
|
|
+ struct fb_var_screeninfo *var = &fi->var;
|
|
+ u32 isr;
|
|
+ u32 addr;
|
|
+ u32 ret = IRQ_NONE;
|
|
+
|
|
+ isr = readl(fbi->reg_base+SPU_IRQ_ISR);
|
|
+
|
|
+ if ((isr & DMA_FRAME_IRQ0_ENA_MASK)) {
|
|
+ /* wake up queue. */
|
|
+ atomic_set(&fbi->w_intr, 1);
|
|
+ wake_up(&fbi->w_intr_wq);
|
|
+ writel(isr & (~DMA_FRAME_IRQ0_ENA_MASK),
|
|
+ fbi->reg_base + SPU_IRQ_ISR);
|
|
+ ret = IRQ_HANDLED;
|
|
+ }
|
|
+
|
|
+ if ((isr & VSYNC_IRQ_ENA_MASK)) {
|
|
+ if (fbi->new_addr[0]) {
|
|
+ writel(fbi->new_addr[0], fbi->reg_base +
|
|
+ LCD_SPU_DMA_START_ADDR_Y0);
|
|
+ if (fbi->pix_fmt >= 12 && fbi->pix_fmt <= 15) {
|
|
+ writel(fbi->new_addr[1], fbi->reg_base +
|
|
+ LCD_SPU_DMA_START_ADDR_U0);
|
|
+ writel(fbi->new_addr[2], fbi->reg_base +
|
|
+ LCD_SPU_DMA_START_ADDR_V0);
|
|
+ }
|
|
+ } else {
|
|
+ addr = dma_base_address;
|
|
+ writel(addr, fbi->reg_base + LCD_SPU_DMA_START_ADDR_Y0);
|
|
+ if (fbi->pix_fmt >= 12 && fbi->pix_fmt <= 15)
|
|
+ addr += var->xres * var->yres;
|
|
+ writel(addr, fbi->reg_base + LCD_SPU_DMA_START_ADDR_U0);
|
|
+ if ((fbi->pix_fmt>>1) == 6)
|
|
+ addr += var->xres * var->yres/2;
|
|
+ else if ((fbi->pix_fmt>>1) == 7)
|
|
+ addr += var->xres * var->yres/4;
|
|
+ writel(addr, fbi->reg_base + LCD_SPU_DMA_START_ADDR_V0);
|
|
+ }
|
|
+ /* write the graphic layer start address */
|
|
+ writel(gra_dma_base_address,
|
|
+ fbi->reg_base + LCD_CFG_GRA_START_ADDR0);
|
|
+
|
|
+ writel(isr &= ~VSYNC_IRQ_ENA_MASK,
|
|
+ fbi->reg_base + SPU_IRQ_ISR);
|
|
+
|
|
+ ret = IRQ_HANDLED;
|
|
+ }
|
|
+
|
|
+ return ret;
|
|
+}
|
|
+
|
|
+
|
|
+static struct fb_ops pxa168fb_ops = {
|
|
+ .owner = THIS_MODULE,
|
|
+ .fb_open = pxa168fb_open,
|
|
+ .fb_release = pxa168fb_release,
|
|
+
|
|
+ .fb_check_var = pxa168fb_check_var,
|
|
+ .fb_set_par = pxa168fb_set_par,
|
|
+ .fb_setcolreg = pxa168fb_setcolreg,
|
|
+ .fb_pan_display = pxa168fb_pan_display,
|
|
+ .fb_fillrect = cfb_fillrect,
|
|
+ .fb_copyarea = cfb_copyarea,
|
|
+ .fb_imageblit = cfb_imageblit,
|
|
+ .fb_sync = pxa168fb_fb_sync,
|
|
+ .fb_ioctl = pxa168fb_ioctl,
|
|
+};
|
|
+
|
|
+static int __init get_ovly_size(char *str)
|
|
+{
|
|
+ int n;
|
|
+ if (!get_option(&str, &n))
|
|
+ return 0;
|
|
+ max_fb_size = n;
|
|
+ return 1;
|
|
+}
|
|
+__setup("ovly_size=", get_ovly_size);
|
|
+
|
|
+static int pxa168fb_probe(struct platform_device *pdev)
|
|
+{
|
|
+ struct pxa168fb_mach_info *mi;
|
|
+ struct fb_info *fi;
|
|
+ struct pxa168fb_info *fbi;
|
|
+ struct resource *res;
|
|
+ int ret;
|
|
+ int temp;
|
|
+
|
|
+ mi = pdev->dev.platform_data;
|
|
+ if (mi == NULL){
|
|
+ return -EINVAL;
|
|
+ }
|
|
+
|
|
+ res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
|
+ if (res == NULL){
|
|
+ return -EINVAL;
|
|
+ }
|
|
+
|
|
+ fi = framebuffer_alloc(sizeof(struct pxa168fb_info), &pdev->dev);
|
|
+ if (fi == NULL){
|
|
+ printk("%s: no enough memory!\n", __func__);
|
|
+ return -ENOMEM;
|
|
+ }
|
|
+
|
|
+ fbi = fi->par;
|
|
+ platform_set_drvdata(pdev, fbi);
|
|
+ fbi->info = fi;
|
|
+ fbi->dev = &pdev->dev;
|
|
+ fbi->id = pdev->id;
|
|
+ fbi->panel_rbswap = mi->panel_rbswap;
|
|
+ fbi->is_blanked = 0;
|
|
+ fbi->cursor_enabled = 0;
|
|
+ fbi->debug = 0;
|
|
+ fbi->mem_status = 0;
|
|
+ init_waitqueue_head(&fbi->w_intr_wq);
|
|
+ mutex_init(&fbi->access_ok);
|
|
+
|
|
+ /* get LCD clock information. */
|
|
+ fbi->clk = clk_get(&pdev->dev, "LCDCLK");
|
|
+
|
|
+ /*
|
|
+ * Initialise static fb parameters.
|
|
+ */
|
|
+ fi->flags = FBINFO_DEFAULT | FBINFO_PARTIAL_PAN_OK |
|
|
+ FBINFO_HWACCEL_XPAN | FBINFO_HWACCEL_YPAN;
|
|
+ fi->node = -1;
|
|
+ strcpy(fi->fix.id, mi->id);
|
|
+ fi->fix.type = FB_TYPE_PACKED_PIXELS;
|
|
+ fi->fix.type_aux = 0;
|
|
+ fi->fix.xpanstep = 1;
|
|
+ fi->fix.ypanstep = 1;
|
|
+ fi->fix.ywrapstep = 0;
|
|
+ fi->fix.mmio_start = res->start;
|
|
+ fi->fix.mmio_len = res->end - res->start + 1;
|
|
+ fi->fix.accel = FB_ACCEL_NONE;
|
|
+ fi->fbops = &pxa168fb_ops;
|
|
+ fi->pseudo_palette = fbi->pseudo_palette;
|
|
+
|
|
+ /*
|
|
+ * Map LCD controller registers.
|
|
+ */
|
|
+ fbi->reg_base = ioremap_nocache(res->start, res->end - res->start);
|
|
+ if (fbi->reg_base == NULL) {
|
|
+ printk("%s: no enough memory!\n", __func__);
|
|
+ ret = -ENOMEM;
|
|
+ goto failed;
|
|
+ }
|
|
+
|
|
+ /*
|
|
+ * Allocate framebuffer memory.
|
|
+ */
|
|
+ if (!max_fb_size) {
|
|
+ if (mi->max_fb_size)
|
|
+ max_fb_size = mi->max_fb_size;
|
|
+ else
|
|
+ max_fb_size = DEFAULT_FB_SIZE;
|
|
+ }
|
|
+ max_fb_size = PAGE_ALIGN(max_fb_size);
|
|
+ fbi->fb_size = max_fb_size;
|
|
+
|
|
+ /*
|
|
+ * FIXME, It may fail to alloc DMA buffer from dma_alloc_xxx
|
|
+ */
|
|
+ fbi->fb_start = dma_alloc_writecombine(fbi->dev, max_fb_size,
|
|
+ &fbi->fb_start_dma,
|
|
+ GFP_KERNEL);
|
|
+ if (!fbi->fb_start || !fbi->fb_start_dma) {
|
|
+ fbi->new_addr[0] = 0;
|
|
+ fbi->new_addr[1] = 0;
|
|
+ fbi->new_addr[2] = 0;
|
|
+ fbi->mem_status = 1;
|
|
+ fbi->fb_start = (void *)__get_free_pages(GFP_DMA | GFP_KERNEL,
|
|
+ get_order(fbi->fb_size));
|
|
+ fbi->fb_start_dma = (dma_addr_t)__virt_to_phys((long unsigned int)fbi->fb_start);
|
|
+ }
|
|
+
|
|
+ if (fbi->fb_start == NULL) {
|
|
+ printk("%s: no enough memory!\n", __func__);
|
|
+ ret = -ENOMEM;
|
|
+ goto failed;
|
|
+ }
|
|
+
|
|
+ memset(fbi->fb_start, 0, fbi->fb_size);
|
|
+ fi->fix.smem_start = fbi->fb_start_dma;
|
|
+ fi->fix.smem_len = fbi->fb_size;
|
|
+ fi->screen_base = fbi->fb_start;
|
|
+ fi->screen_size = fbi->fb_size;
|
|
+ dma_base_address = (unsigned int)fbi->fb_start_dma;
|
|
+
|
|
+#ifdef FB_PM_DEBUG
|
|
+ pxa168fb_rw_all_regs(fbi, g_regs, 1);
|
|
+#endif
|
|
+
|
|
+ /*
|
|
+ * Fill in sane defaults.
|
|
+ */
|
|
+ set_mode(fbi, &fi->var, mi->modes, mi->pix_fmt, 1);
|
|
+ pxa168fb_set_par(fi);
|
|
+ fbi->active = mi->active;
|
|
+
|
|
+ /*
|
|
+ * Configure default register values.
|
|
+ */
|
|
+ writel(0x00000000, fbi->reg_base + LCD_SPU_DMA_START_ADDR_Y1);
|
|
+ writel(0x00000000, fbi->reg_base + LCD_SPU_DMA_START_ADDR_U1);
|
|
+ writel(0x00000000, fbi->reg_base + LCD_SPU_DMA_START_ADDR_V1);
|
|
+ writel(0x00000000, fbi->reg_base + LCD_SPUT_DMA_OVSA_HPXL_VLN);
|
|
+
|
|
+ /* Set this frame off by default */
|
|
+ temp = readl(fbi->reg_base + LCD_SPU_DMA_CTRL0);
|
|
+ temp &= ~(CFG_DMA_ENA_MASK);
|
|
+ writel(temp, fbi->reg_base + LCD_SPU_DMA_CTRL0);
|
|
+
|
|
+ /*
|
|
+ * Allocate color map.
|
|
+ */
|
|
+ if (fb_alloc_cmap(&fi->cmap, 256, 0) < 0) {
|
|
+ ret = -ENOMEM;
|
|
+ goto failed;
|
|
+ }
|
|
+
|
|
+ /*
|
|
+ * Get IRQ number.
|
|
+ */
|
|
+ res = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
|
|
+ if (res == NULL)
|
|
+ return -EINVAL;
|
|
+
|
|
+ /*
|
|
+ * Register irq handler.
|
|
+ */
|
|
+ ret = request_irq(res->start, pxa168fb_handle_irq, IRQF_SHARED,
|
|
+ mi->id, fi);
|
|
+ if (ret < 0)
|
|
+ {
|
|
+ /*
|
|
+ *
|
|
+ */
|
|
+ dev_err(&pdev->dev, "Failed to register pxa168fb: %d\n", ret);
|
|
+ ret = -ENXIO;
|
|
+ goto failed;
|
|
+ }
|
|
+
|
|
+ /*
|
|
+ * Enable Video interrupt
|
|
+ */
|
|
+ fbi->tasklet.next = NULL;
|
|
+ fbi->tasklet.state = 0;
|
|
+ atomic_set(&fbi->tasklet.count, 0);
|
|
+ fbi->tasklet.func = pxa168fb_do_tasklet;
|
|
+ fbi->tasklet.data = (unsigned long)fi;
|
|
+
|
|
+ writel(readl(fbi->reg_base+SPU_IRQ_ENA)
|
|
+ |DMA_FRAME_IRQ0_ENA(0x1),
|
|
+ fbi->reg_base+SPU_IRQ_ENA);
|
|
+
|
|
+ /*
|
|
+ * Register framebuffer.
|
|
+ */
|
|
+ ret = register_framebuffer(fi);
|
|
+ if (ret < 0) {
|
|
+ dev_err(&pdev->dev, "Failed to register pxa168fb: %d\n", ret);
|
|
+ ret = -ENXIO;
|
|
+ goto failed;
|
|
+ }
|
|
+
|
|
+ printk(KERN_INFO "pxa168fb_ovly: frame buffer device was loaded"
|
|
+ " to /dev/fb%d <%s>.\n", fi->node, fi->fix.id);
|
|
+
|
|
+#ifdef CONFIG_DVFM
|
|
+ dvfm_register("overlay1", &dvfm_dev_idx);
|
|
+#endif
|
|
+ return 0;
|
|
+
|
|
+failed:
|
|
+ platform_set_drvdata(pdev, NULL);
|
|
+ fb_dealloc_cmap(&fi->cmap);
|
|
+ if (fbi->fb_start != NULL) {
|
|
+ if (fbi->mem_status)
|
|
+ free_pages((unsigned long)fbi->fb_start,
|
|
+ get_order(max_fb_size));
|
|
+ else
|
|
+ dma_free_writecombine(fbi->dev, max_fb_size,
|
|
+ fbi->fb_start, fbi->fb_start_dma);
|
|
+ }
|
|
+ if (fbi->reg_base != NULL)
|
|
+ iounmap(fbi->reg_base);
|
|
+ kfree(fbi);
|
|
+ return ret;
|
|
+}
|
|
+
|
|
+#ifdef CONFIG_PM
|
|
+static int pxa168fb_vid_suspend(struct platform_device *pdev, pm_message_t mesg)
|
|
+{
|
|
+ struct pxa168fb_info *fbi = platform_get_drvdata(pdev);
|
|
+ struct fb_info *fi = fbi->info;
|
|
+ unsigned int cntrl0;
|
|
+
|
|
+#ifdef FB_PM_DEBUG
|
|
+ pxa168fb_rw_all_regs(fbi, g_regs1, 1);
|
|
+#endif
|
|
+
|
|
+ cntrl0 = readl(fbi->reg_base + LCD_SPU_DMA_CTRL0);
|
|
+ fbi->active = 0;
|
|
+ if (cntrl0 & CFG_DMA_ENA_MASK) {
|
|
+ fbi->active = 1;
|
|
+ writel(cntrl0 & ~CFG_DMA_ENA_MASK,
|
|
+ fbi->reg_base + LCD_SPU_DMA_CTRL0);
|
|
+ }
|
|
+
|
|
+ if (mesg.event & PM_EVENT_SLEEP)
|
|
+ fb_set_suspend(fi, 1);
|
|
+ pdev->dev.power.power_state = mesg;
|
|
+
|
|
+#ifdef FB_PM_DEBUG
|
|
+ pxa168fb_rw_all_regs(fbi, g_regs, 0);
|
|
+#endif
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+static int pxa168fb_vid_resume(struct platform_device *pdev)
|
|
+{
|
|
+ struct pxa168fb_info *fbi = platform_get_drvdata(pdev);
|
|
+ struct fb_info *fi = fbi->info;
|
|
+ unsigned int temp;
|
|
+
|
|
+ clk_enable(fbi->clk);
|
|
+ if (pxa168fb_set_par(fi) != 0) {
|
|
+ printk(KERN_INFO "pxa168fb_vid_resume(): Failed in "
|
|
+ "pxa168fb_set_par().\n");
|
|
+ return -1;
|
|
+ }
|
|
+
|
|
+ fb_set_suspend(fi, 0);
|
|
+
|
|
+ if(fbi->active){
|
|
+ temp = readl(fbi->reg_base + SPU_IRQ_ENA);
|
|
+ temp |= GRA_FRAME_IRQ0_ENA_MASK,
|
|
+ writel(temp, fbi->reg_base + SPU_IRQ_ENA);
|
|
+
|
|
+ temp = readl(fbi->reg_base + LCD_SPU_DMA_CTRL0);
|
|
+ temp |= CFG_DMA_ENA_MASK | 0x1;
|
|
+ writel(temp, fbi->reg_base + LCD_SPU_DMA_CTRL0);
|
|
+ }
|
|
+
|
|
+#ifdef FB_PM_DEBUG
|
|
+ {
|
|
+ u32 i;
|
|
+ u32 reg;
|
|
+
|
|
+ for (i = 0xC0; i <= 0x01C4; i += 4) {
|
|
+ reg = readl(fbi->reg_base + i);
|
|
+ if (reg != g_regs1[i])
|
|
+ printk("Register 0x%08x: 0x%08x - 0x%08x.\n",
|
|
+ i, g_regs1[i], reg);
|
|
+ }
|
|
+ }
|
|
+#endif
|
|
+
|
|
+ clk_disable(fbi->clk);
|
|
+ printk(KERN_INFO "pxa168fb_vid_resumed\n");
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+#endif
|
|
+
|
|
+
|
|
+static struct platform_driver pxa168fb_driver = {
|
|
+ .probe = pxa168fb_probe,
|
|
+/* .remove = pxa168fb_remove, */
|
|
+#ifdef CONFIG_PM
|
|
+ .suspend = pxa168fb_vid_suspend,
|
|
+ .resume = pxa168fb_vid_resume,
|
|
+#endif
|
|
+ .driver = {
|
|
+ .name = "pxa168fb_ovly",
|
|
+ .owner = THIS_MODULE,
|
|
+ },
|
|
+};
|
|
+
|
|
+static int pxa168fb_init(void)
|
|
+{
|
|
+ return platform_driver_register(&pxa168fb_driver);
|
|
+}
|
|
+
|
|
+/*module_init(pxa168fb_init);*/
|
|
+late_initcall(pxa168fb_init);
|
|
+
|
|
+MODULE_DESCRIPTION("Framebuffer driver for PXA168");
|
|
+MODULE_LICENSE("GPL");
|
|
diff --git a/include/linux/pxa168_eth.h b/include/linux/pxa168_eth.h
|
|
index 18d75e7..2df91c5 100644
|
|
--- a/include/linux/pxa168_eth.h
|
|
+++ b/include/linux/pxa168_eth.h
|
|
@@ -20,6 +20,8 @@ struct pxa168_eth_platform_data {
|
|
int rx_queue_size;
|
|
int tx_queue_size;
|
|
|
|
+ u8 mac_addr[6]; /* mac address if non-zero*/
|
|
+
|
|
/*
|
|
* init callback is used for board specific initialization
|
|
* e.g on Aspenite its used to initialize the PHY transceiver.
|
|
diff --git a/include/linux/pxa2xx_ssp.h b/include/linux/pxa2xx_ssp.h
|
|
index 467cc63..154e7f9 100644
|
|
--- a/include/linux/pxa2xx_ssp.h
|
|
+++ b/include/linux/pxa2xx_ssp.h
|
|
@@ -215,7 +215,8 @@ static inline u32 pxa_ssp_read_reg(struct ssp_device *dev, u32 reg)
|
|
return __raw_readl(dev->mmio_base + reg);
|
|
}
|
|
|
|
-#ifdef CONFIG_ARCH_PXA
|
|
+#if defined(CONFIG_ARCH_PXA) || (\
|
|
+ defined(CONFIG_ARCH_MMP) && defined(CONFIG_MACH_GPLUGD) )
|
|
struct ssp_device *pxa_ssp_request(int port, const char *label);
|
|
void pxa_ssp_free(struct ssp_device *);
|
|
#else
|
|
diff --git a/include/video/pxa168fb.h b/include/video/pxa168fb.h
|
|
index 8c2f385..e4cecce 100644
|
|
--- a/include/video/pxa168fb.h
|
|
+++ b/include/video/pxa168fb.h
|
|
@@ -14,6 +14,221 @@
|
|
#include <linux/fb.h>
|
|
#include <linux/interrupt.h>
|
|
|
|
+/* ---------------------------------------------- */
|
|
+/* IOCTL Definition */
|
|
+/* ---------------------------------------------- */
|
|
+#define FB_IOC_MAGIC 'm'
|
|
+#define FB_IOCTL_CONFIG_CURSOR _IO(FB_IOC_MAGIC, 0)
|
|
+#define FB_IOCTL_DUMP_REGS _IO(FB_IOC_MAGIC, 1)
|
|
+#define FB_IOCTL_CLEAR_IRQ _IO(FB_IOC_MAGIC, 2)
|
|
+
|
|
+/*
|
|
+ * There are many video mode supported.
|
|
+ */
|
|
+#define FB_IOCTL_SET_VIDEO_MODE _IO(FB_IOC_MAGIC, 3)
|
|
+#define FB_IOCTL_GET_VIDEO_MODE _IO(FB_IOC_MAGIC, 4)
|
|
+/* Request a new video buffer from driver. User program needs to free
|
|
+ * this memory.
|
|
+ */
|
|
+#define FB_IOCTL_CREATE_VID_BUFFER _IO(FB_IOC_MAGIC, 5)
|
|
+
|
|
+/* Configure viewport in driver. */
|
|
+#define FB_IOCTL_SET_VIEWPORT_INFO _IO(FB_IOC_MAGIC, 6)
|
|
+#define FB_IOCTL_GET_VIEWPORT_INFO _IO(FB_IOC_MAGIC, 7)
|
|
+
|
|
+/* Flip the video buffer from user mode. Vide buffer can be separated into:
|
|
+ * a. Current-used buffer - user program put any data into it. It will be
|
|
+ * displayed immediately.
|
|
+ * b. Requested from driver but not current-used - user programe can put any
|
|
+ * data into it. It will be displayed after calling
|
|
+ * FB_IOCTL_FLIP_VID_BUFFER.
|
|
+ * User program should free this memory when they don't use it any more.
|
|
+ * c. User program alloated - user program can allocated a contiguos DMA
|
|
+ * buffer to store its video data. And flip it to driver. Notices that
|
|
+ * this momory should be free by user programs. Driver won't take care of
|
|
+ * this.
|
|
+ */
|
|
+#define FB_IOCTL_FLIP_VID_BUFFER _IO(FB_IOC_MAGIC, 8)
|
|
+
|
|
+/* Get the current buffer information. User program could use it to display
|
|
+ * anything directly. If developer wants to allocate multiple video layers,
|
|
+ * try to use FB_IOCTL_CREATE_VID_BUFFER to request a brand new video
|
|
+ * buffer.
|
|
+ */
|
|
+#define FB_IOCTL_GET_BUFF_ADDR _IO(FB_IOC_MAGIC, 9)
|
|
+
|
|
+/* Get/Set offset position of screen */
|
|
+#define FB_IOCTL_SET_VID_OFFSET _IO(FB_IOC_MAGIC, 10)
|
|
+#define FB_IOCTL_GET_VID_OFFSET _IO(FB_IOC_MAGIC, 11)
|
|
+
|
|
+/* Turn on the memory toggle function to improve the frame rate while playing
|
|
+ * movie.
|
|
+ */
|
|
+#define FB_IOCTL_SET_MEMORY_TOGGLE _IO(FB_IOC_MAGIC, 12)
|
|
+
|
|
+/* Turn on the memory toggle function to improve the frame rate while playing
|
|
+ * movie.
|
|
+ */
|
|
+#define FB_IOCTL_SET_COLORKEYnALPHA _IO(FB_IOC_MAGIC, 13)
|
|
+#define FB_IOCTL_GET_COLORKEYnALPHA _IO(FB_IOC_MAGIC, 14)
|
|
+#define FB_IOCTL_SWITCH_GRA_OVLY _IO(FB_IOC_MAGIC, 15)
|
|
+#define FB_IOCTL_SWITCH_VID_OVLY _IO(FB_IOC_MAGIC, 16)
|
|
+
|
|
+/* For VPro integration */
|
|
+#define FB_IOCTL_GET_FREELIST _IO(FB_IOC_MAGIC, 17)
|
|
+
|
|
+/* Wait for vsync happen. */
|
|
+#define FB_IOCTL_WAIT_VSYNC _IO(FB_IOC_MAGIC, 18)
|
|
+
|
|
+/* clear framebuffer: Makes resolution or color space changes look nicer */
|
|
+#define FBIO_CLEAR_FRAMEBUFFER _IO(FB_IOC_MAGIC, 19)
|
|
+
|
|
+/* Global alpha blend controls - Maintaining compatibility with existing
|
|
+ user programs. */
|
|
+#define FBIOPUT_VIDEO_ALPHABLEND 0xeb
|
|
+#define FBIOPUT_GLOBAL_ALPHABLEND 0xe1
|
|
+#define FBIOPUT_GRAPHIC_ALPHABLEND 0xe2
|
|
+
|
|
+/* color swapping */
|
|
+#define FBIOPUT_SWAP_GRAPHIC_RED_BLUE 0xe3
|
|
+#define FBIOPUT_SWAP_GRAPHIC_U_V 0xe4
|
|
+#define FBIOPUT_SWAP_GRAPHIC_Y_UV 0xe5
|
|
+#define FBIOPUT_SWAP_VIDEO_RED_BLUE 0xe6
|
|
+#define FBIOPUT_SWAP_VIDEO_U_V 0xe7
|
|
+#define FBIOPUT_SWAP_VIDEO_Y_UV 0xe8
|
|
+
|
|
+/* colorkey compatibility */
|
|
+#define FBIOGET_CHROMAKEYS 0xe9
|
|
+#define FBIOPUT_CHROMAKEYS 0xea
|
|
+
|
|
+
|
|
+#define FB_VMODE_RGB565 0x100
|
|
+#define FB_VMODE_BGR565 0x101
|
|
+#define FB_VMODE_RGB1555 0x102
|
|
+#define FB_VMODE_BGR1555 0x103
|
|
+#define FB_VMODE_RGB888PACK 0x104
|
|
+#define FB_VMODE_BGR888PACK 0x105
|
|
+#define FB_VMODE_RGB888UNPACK 0x106
|
|
+#define FB_VMODE_BGR888UNPACK 0x107
|
|
+#define FB_VMODE_RGBA888 0x108
|
|
+#define FB_VMODE_BGRA888 0x109
|
|
+
|
|
+#define FB_VMODE_YUV422PACKED 0x0
|
|
+#define FB_VMODE_YUV422PACKED_SWAPUV 0x1
|
|
+#define FB_VMODE_YUV422PACKED_SWAPYUorV 0x2
|
|
+#define FB_VMODE_YUV422PLANAR 0x3
|
|
+#define FB_VMODE_YUV422PLANAR_SWAPUV 0x4
|
|
+#define FB_VMODE_YUV422PLANAR_SWAPYUorV 0x5
|
|
+#define FB_VMODE_YUV420PLANAR 0x6
|
|
+#define FB_VMODE_YUV420PLANAR_SWAPUV 0x7
|
|
+#define FB_VMODE_YUV420PLANAR_SWAPYUorV 0x8
|
|
+#define FB_VMODE_YUV422PACKED_IRE_90_270 0x9
|
|
+
|
|
+#define FB_HWCMODE_1BITMODE 0x0
|
|
+#define FB_HWCMODE_2BITMODE 0x1
|
|
+
|
|
+#define FB_DISABLE_COLORKEY_MODE 0x0
|
|
+#define FB_ENABLE_Y_COLORKEY_MODE 0x1
|
|
+#define FB_ENABLE_U_COLORKEY_MODE 0x2
|
|
+#define FB_ENABLE_V_COLORKEY_MODE 0x4
|
|
+#define FB_ENABLE_RGB_COLORKEY_MODE 0x3
|
|
+#define FB_ENABLE_R_COLORKEY_MODE 0x5
|
|
+#define FB_ENABLE_G_COLORKEY_MODE 0x6
|
|
+#define FB_ENABLE_B_COLORKEY_MODE 0x7
|
|
+
|
|
+#define FB_VID_PATH_ALPHA 0x0
|
|
+#define FB_GRA_PATH_ALPHA 0x1
|
|
+#define FB_CONFIG_ALPHA 0x2
|
|
+
|
|
+#define FB_SYNC_COLORKEY_TO_CHROMA 1
|
|
+#define FB_SYNC_CHROMA_TO_COLORKEY 2
|
|
+
|
|
+#define PXA168FB_FB_NUM 2
|
|
+/* overlay max buffer number */
|
|
+#define MAX_QUEUE_NUM 30
|
|
+
|
|
+/* ---------------------------------------------- */
|
|
+/* Data Structure */
|
|
+/* ---------------------------------------------- */
|
|
+/*
|
|
+ * The follow structures are used to pass data from
|
|
+ * user space into the kernel for the creation of
|
|
+ * overlay surfaces and setting the video mode.
|
|
+ */
|
|
+
|
|
+#define FBVideoMode int
|
|
+
|
|
+struct _sViewPortInfo {
|
|
+ unsigned short srcWidth; /* video source size */
|
|
+ unsigned short srcHeight;
|
|
+ unsigned short zoomXSize; /* size after zooming */
|
|
+ unsigned short zoomYSize;
|
|
+ unsigned short yPitch;
|
|
+ unsigned short uPitch;
|
|
+ unsigned short vPitch;
|
|
+};
|
|
+
|
|
+struct _sViewPortOffset {
|
|
+ unsigned short xOffset; /* position on screen */
|
|
+ unsigned short yOffset;
|
|
+};
|
|
+
|
|
+struct _sVideoBufferAddr {
|
|
+ unsigned char frameID; /* which frame wants */
|
|
+ unsigned char *startAddr[3]; /* new buffer (PA). three addr for YUV planar */
|
|
+ unsigned char *inputData; /* input buf address (VA) */
|
|
+ unsigned int length; /* input data's length */
|
|
+};
|
|
+
|
|
+/* The pxa168_fb_chroma structure is here for legacy compatibility with former
|
|
+ * PXA display driver usage.
|
|
+ */
|
|
+
|
|
+struct pxa168_fb_chroma {
|
|
+ u_char mode;
|
|
+ u_char y_alpha;
|
|
+ u_char y;
|
|
+ u_char y1;
|
|
+ u_char y2;
|
|
+ u_char u_alpha;
|
|
+ u_char u;
|
|
+ u_char u1;
|
|
+ u_char u2;
|
|
+ u_char v_alpha;
|
|
+ u_char v;
|
|
+ u_char v1;
|
|
+ u_char v2;
|
|
+};
|
|
+
|
|
+
|
|
+struct _sColorKeyNAlpha {
|
|
+ unsigned int mode;
|
|
+ unsigned int alphapath;
|
|
+ unsigned int config;
|
|
+ unsigned int Y_ColorAlpha;
|
|
+ unsigned int U_ColorAlpha;
|
|
+ unsigned int V_ColorAlpha;
|
|
+};
|
|
+
|
|
+struct _sOvlySurface {
|
|
+ FBVideoMode videoMode;
|
|
+ struct _sViewPortInfo viewPortInfo;
|
|
+ struct _sViewPortOffset viewPortOffset;
|
|
+ struct _sVideoBufferAddr videoBufferAddr;
|
|
+};
|
|
+
|
|
+struct _sCursorConfig {
|
|
+ unsigned char enable; /* enable cursor or not */
|
|
+ unsigned char mode; /* 1bit or 2bit mode */
|
|
+ unsigned int color1; /* foreground color */
|
|
+ unsigned int color2; /* background color */
|
|
+ unsigned short xoffset;
|
|
+ unsigned short yoffset;
|
|
+ unsigned short width;
|
|
+ unsigned short height;
|
|
+ unsigned char *pBuffer; /* cursor data */
|
|
+};
|
|
+
|
|
/* Dumb interface */
|
|
#define PIN_MODE_DUMB_24 0
|
|
#define PIN_MODE_DUMB_18_SPI 1
|
|
@@ -60,6 +275,15 @@
|
|
#define PIX_FMT_YVU420PLANAR 15
|
|
#define PIX_FMT_PSEUDOCOLOR 20
|
|
#define PIX_FMT_UYVY422PACK (0x1000|PIX_FMT_YUV422PACK)
|
|
+#define PIX_FMT_YUYV422PACK (0x1000|PIX_FMT_YUV422PACK)
|
|
+#define PIX_FMT_YUV422PACK_IRE_90_270 (0x1000|PIX_FMT_RGB888UNPACK)
|
|
+
|
|
+/*
|
|
+ * panel interface
|
|
+ */
|
|
+#define DPI 0
|
|
+#define DSI2DPI 1
|
|
+#define DSI 2
|
|
|
|
/*
|
|
* PXA LCD controller private state.
|
|
@@ -67,16 +291,47 @@
|
|
struct pxa168fb_info {
|
|
struct device *dev;
|
|
struct clk *clk;
|
|
+ int id;
|
|
+ void *dsi1_reg_base;
|
|
+ void *dsi2_reg_base;
|
|
+ unsigned long new_addr[3]; /* three addr for YUV planar */
|
|
struct fb_info *info;
|
|
|
|
void __iomem *reg_base;
|
|
dma_addr_t fb_start_dma;
|
|
+ void *fb_start;
|
|
+ int fb_size;
|
|
+ atomic_t w_intr;
|
|
+ wait_queue_head_t w_intr_wq;
|
|
+ struct mutex access_ok;
|
|
+ struct _sOvlySurface surface;
|
|
+ struct _sColorKeyNAlpha ckey_alpha;
|
|
+ struct fb_videomode dft_vmode;
|
|
+ struct fb_videomode out_vmode;
|
|
+ int fixed_output;
|
|
+ unsigned char *hwc_buf;
|
|
+ struct tasklet_struct tasklet;
|
|
+ char *mode_option;
|
|
+ int io_pin_allocation;
|
|
u32 pseudo_palette[16];
|
|
|
|
int pix_fmt;
|
|
unsigned is_blanked:1;
|
|
+ unsigned edid:1;
|
|
+ unsigned cursor_enabled:1;
|
|
+ unsigned cursor_cfg:1;
|
|
unsigned panel_rbswap:1;
|
|
+ unsigned debug:1;
|
|
unsigned active:1;
|
|
+ unsigned enabled:1;
|
|
+ unsigned edid_en:1;
|
|
+
|
|
+ /*
|
|
+ * 0: DMA mem is from DMA region.
|
|
+ * 1: DMA mem is from normal region.
|
|
+ */
|
|
+ unsigned mem_status:1;
|
|
+ struct pxa168_fb_chroma chroma;
|
|
};
|
|
|
|
/*
|
|
@@ -84,9 +339,11 @@ struct pxa168fb_info {
|
|
*/
|
|
struct pxa168fb_mach_info {
|
|
char id[16];
|
|
+ unsigned int sclk_clock;
|
|
|
|
int num_modes;
|
|
struct fb_videomode *modes;
|
|
+ unsigned int max_fb_size;
|
|
|
|
/*
|
|
* Pix_fmt
|
|
@@ -117,9 +374,31 @@ struct pxa168fb_mach_info {
|
|
unsigned invert_composite_blank:1;
|
|
unsigned invert_pix_val_ena:1;
|
|
unsigned invert_pixclock:1;
|
|
+ unsigned invert_vsync:1;
|
|
+ unsigned invert_hsync:1;
|
|
unsigned panel_rbswap:1;
|
|
unsigned active:1;
|
|
unsigned enable_lcd:1;
|
|
+ /*
|
|
+ * SPI control
|
|
+ */
|
|
+ unsigned int spi_ctrl;
|
|
+ unsigned int spi_gpio_cs;
|
|
+ unsigned int spi_gpio_reset;
|
|
+ /*
|
|
+ * panel interface
|
|
+ */
|
|
+ unsigned int display_interface;
|
|
+
|
|
+ /*
|
|
+ * power on/off function.
|
|
+ */
|
|
+ void (*pxa168fb_lcd_power)(struct pxa168fb_info *, unsigned int, unsigned int, int);
|
|
+ /*
|
|
+ * dsi to dpi setting function
|
|
+ */
|
|
+ void (*dsi2dpi_set)(struct pxa168fb_info *);
|
|
};
|
|
+extern unsigned int gra_dma_base_address;
|
|
|
|
#endif /* __ASM_MACH_PXA168FB_H */
|
|
--
|
|
1.8.1.6
|
|
|