This commit brings in a complete, but untested, implementation of a driver for the TI TDA19988 HDMI Encoder. This encoder is used on the Beaglebone Black board. Since this driver is untested, it requires CONFIG_EXPERIMENTAL in the configuration.

Squashed commit of the following:

    drivers/lcd/tda19988.c:  Numerous changes for a clean compilation.

    drivers/lcd/tda19988:  Bring in the final pieces from the FreeBSD TDA19988 driver.  The driver is now code complete.

    drivers/lcd/tda19988.c:  Flesh on EDID read logic (still not complete).  Add unlink shutdown logic.

    drivers/lcd/tda19988.c:  Add logic to read one EDID block.

    drivers/lcd/tda19988.c:  Add tda19988_read_edid() interface.  Flesh read() and seek() methods.

    drivers/lcd/st7032.c:  Fix another error in seek method:  Does not account for negative offsets!

    drivers/lcd/tda19988.c:  Add basic IOCTL infrastructure to support configuratin the video mode.  Mostly just a framework for now.

    drivers/lcd/tda19988.c:  Add more register definitions.  Encode page+address in the same was as FreeBSD.

    drivers/lcd/tda19988.c:  Add support for CEC messaging.

    drivers/lcd/tda19988.c:  Implement the unlink method.  No IOCTLs defined yet.

    drivers/lcd/tda19988.c:  Add placeholders for missing character driver methods.

    drivers/lcd/tda19988.c:  Trivial interface improvement to permit reading multiple TDA19988 registers.

    drivers/lcd/tda19988.c:  Feeble start of TCA19988 drivers.  Consists of lower half interface definition and some I2C helper functions.  Nothing more.
This commit is contained in:
Gregory Nutt 2019-01-15 08:55:53 -06:00
parent 937c30e57a
commit a830d59da2
6 changed files with 2408 additions and 3 deletions

View File

@ -1147,6 +1147,8 @@ endif # LCD_FT80X
endmenu # LCD Driver selection
endif # LCD
comment "Character/Segment LCD Devices"
menuconfig SLCD
bool "Alphanumeric/Segment LCD Devices"
default n
@ -1212,4 +1214,25 @@ config LCD_ST7032
the ground. So only I2C pins SDA and SCL are used by NuttX.
endif # SLCD
comment "Other LCD-related Devices"
config LCD_OTHER
bool
default n
config LCD_TDA19988
bool "TDA19988 HDMI Encoder"
default n
select LCD_OTHER
depends on I2C && EXPERIMENTAL
---help---
Enable support for the TI TDA19988 HDMI Encoder. The TDA19988 is a
very low power and very small size High-Definition Multimedia
Interface (HDMI) 1.4a transmitter. This device is primarily
intended for mobile applications like Digital Video Camera (DVC),
Digital Still Camera (DSC), Portable Multimedia Player (PMP), Mobile
Phone and Ultra-Mobile Personal Computer (UM PC), new PC tablet and
MID where size and power are key for battery autonomy.
endmenu # LCD Driver Support

View File

@ -134,6 +134,12 @@ ifeq ($(CONFIG_LCD_ST7032),y)
endif
endif # CONFIG_SLCD
# Other LCD-related devices
ifeq ($(CONFIG_LCD_TDA19988),y)
CSRCS += tda19988.c
endif
# Include LCD driver build support (the nested if-then-else implements an OR)
ifeq ($(CONFIG_LCD),y)
@ -144,4 +150,8 @@ else ifeq ($(CONFIG_SLCD),y)
DEPPATH += --dep-path lcd
VPATH += :lcd
CFLAGS += ${shell $(INCDIR) $(INCDIROPT) "$(CC)" $(TOPDIR)$(DELIM)drivers$(DELIM)lcd}
else ifeq ($(CONFIG_LCD_OTHER),y)
DEPPATH += --dep-path lcd
VPATH += :lcd
CFLAGS += ${shell $(INCDIR) $(INCDIROPT) "$(CC)" $(TOPDIR)$(DELIM)drivers$(DELIM)lcd}
endif

1817
drivers/lcd/tda19988.c Normal file

File diff suppressed because it is too large Load Diff

313
drivers/lcd/tda19988.h Normal file
View File

@ -0,0 +1,313 @@
/******************************************************************************************************
* drivers/lcd/tda19988.h
* Definitions for the TDA19988. The TDA19988 is a very low power and very small
* size High-Definition Multimedia Interface (HDMI) 1.4a transmitter
*
* Copyright (C) 2018 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <gnutt@nuttx.org>
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
* 3. Neither the name NuttX nor the names of its contributors may be
* used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
******************************************************************************************************/
#ifndef __DRIVERS_LCD_TDA19988_H
#define __DRIVERS_LCD_TDA19988_H
/******************************************************************************************************
* Included Files
******************************************************************************************************/
/******************************************************************************************************
* Pre-processor Definitions
******************************************************************************************************/
/* CEC Registers **************************************************************************************/
/* The device has two I2C interfaces CEC (0x34) and HDMI (0x70). */
#define CEC_FRO_IM_CLK_CTRL_REG 0xfb
# define CEC_FRO_IM_CLK_CTRL_GHOST_DIS (1 << 7)
# define CEC_FRO_IM_CLK_CTRL_IMCLK_SEL (1 << 1)
#define CEC_STATUS_REG 0xfe
# define CEC_STATUS_CONNECTED (1 << 1)
#define CEC_ENAMODS_REG 0xff
# define CEC_ENAMODS_HDMI (1 << 1)
# define CEC_ENAMODS_RXSENS (1 << 2)
# define CEC_ENABLE_ALL 0x87
/* HDMI Memory Pages **********************************************************************************/
/* HDMI Memory is accessed via page and address. The page must first be selected, then
* only the address is sent in order accessing memory locations within the selected
* page.
*/
#define HDMI_CTRL_PAGE 0x00 /* General control page */
#define HDMI_PLL_PAGE 0x02 /* PLL settings page */
#define HDMI_EDID_PAGE 0x09 /* EDID control page */
#define HDMI_INFO_PAGE 0x10 /* Information frames and packets page */
#define HDMI_AUDIO_PAGE 0x11 /* Audio settings and content info packets page */
#define HDMI_HDCPOTP_PAGE 0x12 /* HDCP (TDA19988AHN and TDA19988AET only) and OTP */
#define HDMI_GAMUT_PAGE 0x13 /* Gamut-related metadata packets page */
/* The page select register does not lie within the above pages. The value of 0xff is
* used for this access.
*/
#define HDMI_NO_PAGE 0xff
/* Page-related macros */
#define MKREG(page, addr) (((page) << 8) | (addr))
#define REGPAGE(reg) (((reg) >> 8) & 0xff)
#define REGADDR(reg) ((reg) & 0xff)
/* General Control Page Registers and Bit Definitions */
#define HDMI_CTRL_REV_LO_REG MKREG(HDMI_CTRL_PAGE, 0x00)
#define HDMI_CTRL_MAIN_CNTRL0_REG MKREG(HDMI_CTRL_PAGE, 0x01)
# define HDMI_CTRL_MAIN_CNTRL0_SR (1 << 0)
#define HDMI_CTRL_REV_HI_REG MKREG(HDMI_CTRL_PAGE, 0x02)
# define HDMI_CTRL_REV_TDA9989N2 0x0101 /* Masking out bits 4-5 */
# define HDMI_CTRL_REV_TDA19989 0x0201
# define HDMI_CTRL_REV_TDA19989N2 0x0202
# define HDMI_CTRL_REV_TDA19988 0x0301
#define HDMI_CTRL_RESET_REG MKREG(HDMI_CTRL_PAGE, 0x0a)
# define HDMI_CTRL_RESET_AUDIO (1 << 0)
# define HDMI_CTRL_RESET_I2C (1 << 1)
#define HDMI_CTRL_DDC_CTRL_REG MKREG(HDMI_CTRL_PAGE, 0x0b)
# define HDMI_CTRL_DDC_EN 0x00
#define HDMI_CTRL_DDC_CLK_REG MKREG(HDMI_CTRL_PAGE, 0x0c)
# define HDMI_CTRL_DDC_CLK_EN (1 << 0)
#define HDMI_CTRL_INTR_CTRL_REG MKREG(HDMI_CTRL_PAGE, 0x0f)
# define HDMI_CTRL_INTR_EN_GLO (1 << 2)
#define HDMI_CTRL_INT_REG MKREG(HDMI_CTRL_PAGE, 0x11)
# define HDMI_CTRL_INT_EDID (1 << 1)
#define HDMI_CTRL_VIPCTRL_0_REG MKREG(HDMI_CTRL_PAGE, 0x20)
#define HDMI_CTRL_VIPCTRL_1_REG MKREG(HDMI_CTRL_PAGE, 0x21)
#define HDMI_CTRL_VIPCTRL_2_REG MKREG(HDMI_CTRL_PAGE, 0x22)
#define HDMI_CTRL_VIPCTRL_3_REG MKREG(HDMI_CTRL_PAGE, 0x23)
# define HDMI_CTRL_VIPCTRL_3_SYNC_HS (2 << 4)
# define HDMI_CTRL_VIPCTRL_3_V_TGL (1 << 2)
# define HDMI_CTRL_VIPCTRL_3_H_TGL (1 << 1)
#define HDMI_CTRL_VIPCTRL_4_REG MKREG(HDMI_CTRL_PAGE, 0x24)
# define HDMI_CTRL_VIPCTRL_4_BLANKIT_NDE (0 << 2)
# define HDMI_CTRL_VIPCTRL_4_BLANKIT_HS_VS (1 << 2)
# define HDMI_CTRL_VIPCTRL_4_BLANKIT_NHS_VS (2 << 2)
# define HDMI_CTRL_VIPCTRL_4_BLANKIT_HE_VE (3 << 2)
# define HDMI_CTRL_VIPCTRL_4_BLC_NONE (0 << 0)
# define HDMI_CTRL_VIPCTRL_4_BLC_RGB444 (1 << 0)
# define HDMI_CTRL_VIPCTRL_4_BLC_YUV444 (2 << 0)
# define HDMI_CTRL_VIPCTRL_4_BLC_YUV422 (3 << 0)
#define HDMI_CTRL_VIPCTRL_5_REG MKREG(HDMI_CTRL_PAGE, 0x25)
# define HDMI_CTRL_VIPCTRL_5_SP_CNT(n) (((n) & 3) << 1)
#define HDMI_CTRL_MUX_VP_VIP_OUT_REG MKREG(HDMI_CTRL_PAGE, 0x27)
#define HDMI_CTRL_MATCTRL_REG MKREG(HDMI_CTRL_PAGE, 0x80)
# define HDMI_CTRL_MAT_CONTRL_MAT_BP (1 << 2)
#define HDMI_CTRL_MUX_VIDFORMAT_REG MKREG(HDMI_CTRL_PAGE, 0xa0)
#define HDMI_CTRL_MUX_REFPIX_MSB_REG MKREG(HDMI_CTRL_PAGE, 0xa1)
#define HDMI_CTRL_MUX_REFPIX_LSB_REG MKREG(HDMI_CTRL_PAGE, 0xa2)
#define HDMI_CTRL_MUX_REFLINE_MSB_REG MKREG(HDMI_CTRL_PAGE, 0xa3)
#define HDMI_CTRL_MUX_REFLINE_LSB_REG MKREG(HDMI_CTRL_PAGE, 0xa4)
#define HDMI_CTRL_MUX_NPIX_MSB_REG MKREG(HDMI_CTRL_PAGE, 0xa5)
#define HDMI_CTRL_MUX_NPIX_LSB_REG MKREG(HDMI_CTRL_PAGE, 0xa6)
#define HDMI_CTRL_MUX_NLINE_MSB_REG MKREG(HDMI_CTRL_PAGE, 0xa7)
#define HDMI_CTRL_MUX_NLINE_LSB_REG MKREG(HDMI_CTRL_PAGE, 0xa8)
#define HDMI_CTRL_MUX_VS_LINE_STRT_1_MSB_REG MKREG(HDMI_CTRL_PAGE, 0xa9)
#define HDMI_CTRL_MUX_VS_LINE_STRT_1_LSB_REG MKREG(HDMI_CTRL_PAGE, 0xaa)
#define HDMI_CTRL_MUX_VS_PIX_STRT_1_MSB_REG MKREG(HDMI_CTRL_PAGE, 0xab)
#define HDMI_CTRL_VS_PIX_STRT_1_LSB_REG MKREG(HDMI_CTRL_PAGE, 0xac)
#define HDMI_CTRL_VS_LINE_END_1_MSB_REG MKREG(HDMI_CTRL_PAGE, 0xad)
#define HDMI_CTRL_VS_LINE_END_1_LSB_REG MKREG(HDMI_CTRL_PAGE, 0xae)
#define HDMI_CTRL_VS_PIX_END_1_MSB_REG MKREG(HDMI_CTRL_PAGE, 0xaf)
#define HDMI_CTRL_VS_PIX_END_1_LSB_REG MKREG(HDMI_CTRL_PAGE, 0xb0)
#define HDMI_CTRL_VS_LINE_STRT_2_MSB_REG MKREG(HDMI_CTRL_PAGE, 0xb1)
#define HDMI_CTRL_VS_LINE_STRT_2_LSB_REG MKREG(HDMI_CTRL_PAGE, 0xb2)
#define HDMI_CTRL_VS_PIX_STRT_2_MSB_REG MKREG(HDMI_CTRL_PAGE, 0xb3)
#define HDMI_CTRL_VS_PIX_STRT_2_LSB_REG MKREG(HDMI_CTRL_PAGE, 0xb4)
#define HDMI_CTRL_VS_LINE_END_2_MSB_REG MKREG(HDMI_CTRL_PAGE, 0xb5)
#define HDMI_CTRL_VS_LINE_END_2_LSB_REG MKREG(HDMI_CTRL_PAGE, 0xb6)
#define HDMI_CTRL_VS_PIX_END_2_MSB_REG MKREG(HDMI_CTRL_PAGE, 0xb7)
#define HDMI_CTRL_VS_PIX_END_2_LSB_REG MKREG(HDMI_CTRL_PAGE, 0xb8)
#define HDMI_CTRL_HS_PIX_START_MSB_REG MKREG(HDMI_CTRL_PAGE, 0xb9)
#define HDMI_CTRL_HS_PIX_START_LSB_REG MKREG(HDMI_CTRL_PAGE, 0xba)
#define HDMI_CTRL_HS_PIX_STOP_MSB_REG MKREG(HDMI_CTRL_PAGE, 0xbb)
#define HDMI_CTRL_HS_PIX_STOP_LSB_REG MKREG(HDMI_CTRL_PAGE, 0xbc)
#define HDMI_CTRL_VWIN_START_1_MSB_REG MKREG(HDMI_CTRL_PAGE, 0xbd)
#define HDMI_CTRL_VWIN_START_1_LSB_REG MKREG(HDMI_CTRL_PAGE, 0xbe)
#define HDMI_CTRL_VWIN_END_1_MSB_REG MKREG(HDMI_CTRL_PAGE, 0xbf)
#define HDMI_CTRL_VWIN_END_1_LSB_REG MKREG(HDMI_CTRL_PAGE, 0xc0)
#define HDMI_CTRL_VWIN_START_2_MSB_REG MKREG(HDMI_CTRL_PAGE, 0xc1)
#define HDMI_CTRL_VWIN_START_2_LSB_REG MKREG(HDMI_CTRL_PAGE, 0xc2)
#define HDMI_CTRL_VWIN_END_2_MSB_REG MKREG(HDMI_CTRL_PAGE, 0xc3)
#define HDMI_CTRL_VWIN_END_2_LSB_REG MKREG(HDMI_CTRL_PAGE, 0xc4)
#define HDMI_CTRL_DE_START_MSB_REG MKREG(HDMI_CTRL_PAGE, 0xc5)
#define HDMI_CTRL_DE_START_LSB_REG MKREG(HDMI_CTRL_PAGE, 0xc6)
#define HDMI_CTRL_DE_STOP_MSB_REG MKREG(HDMI_CTRL_PAGE, 0xc7)
#define HDMI_CTRL_DE_STOP_LSB_REG MKREG(HDMI_CTRL_PAGE, 0xc8)
#define HDMI_CTRL_TBG_CNTRL_0_REG MKREG(HDMI_CTRL_PAGE, 0xca)
# define HDMI_CTRL_TBG_CNTRL_0_SYNC_MTHD (1 << 6)
# define HDMI_CTRL_TBG_CNTRL_0_SYNC_ONCE (1 << 7)
#define HDMI_CTRL_TBG_CNTRL_1_REG MKREG(HDMI_CTRL_PAGE, 0xcb)
# define HDMI_CTRL_TBG_CNTRL_1_H_TGL (1 << 0)
# define HDMI_CTRL_TBG_CNTRL_1_V_TGL (1 << 1)
# define HDMI_CTRL_TBG_CNTRL_1_TGL_EN (1 << 2)
# define HDMI_CTRL_TBG_CNTRL_1_DWIN_DIS (1 << 6)
#define HDMI_CTRL_HVF_CNTRL_0_REG MKREG(HDMI_CTRL_PAGE, 0xe4)
# define HDMI_CTRL_HVF_CNTRL_0_INTPOL_BYPASS (0 << 0)
# define HDMI_CTRL_HVF_CNTRL_0_PREFIL_NONE (0 << 2)
#define HDMI_CTRL_HVF_CNTRL_1_REG MKREG(HDMI_CTRL_PAGE, 0xe5)
# define HDMI_CTRL_HVF_CNTRL_1_VQR(x) (((x) & 3) << 2)
# define HDMI_CTRL_HVF_CNTRL_1_VQR_FULL HDMI_CTRL_HVF_CNTRL_1_VQR(0)
#define HDMI_CTRL_ENABLE_SPACE_REG MKREG(HDMI_CTRL_PAGE, 0xd6)
#define HDMI_CTRL_RPT_CNTRL_REG MKREG(HDMI_CTRL_PAGE, 0xf0)
/* PLL Page Registers */
#define HDMI_PLL_SERIAL_1_REG MKREG(HDMI_PLL_PAGE, 0x00)
# define HDMI_PLL_SERIAL_1_SRL_MAN_IP (1 << 6)
#define HDMI_PLL_SERIAL_2_REG MKREG(HDMI_PLL_PAGE, 0x01)
# define HDMI_PLL_SERIAL_2_SRL_NOSC(x) (((x) & 0x3) << 0)
# define HDMI_PLL_SERIAL_2_SRL_PR(x) (((x) & 0xf) << 4)
#define HDMI_PLL_SERIAL_3_REG MKREG(HDMI_PLL_PAGE, 0x02)
# define HDMI_PLL_SERIAL_3_SRL_CCIR (1 << 0)
# define HDMI_PLL_SERIAL_3_SRL_DE (1 << 2)
# define HDMI_PLL_SERIAL_3_SRL_PXIN_SEL (1 << 4)
#define HDMI_PLL_SERIALIZER_REG MKREG(HDMI_PLL_PAGE, 0x03)
#define HDMI_PLL_BUFFER_OUT_REG MKREG(HDMI_PLL_PAGE, 0x04)
#define HDMI_PLL_SCG1_REG MKREG(HDMI_PLL_PAGE, 0x05)
#define HDMI_PLL_SCG2_REG MKREG(HDMI_PLL_PAGE, 0x06)
#define HDMI_PLL_SCGN1_REG MKREG(HDMI_PLL_PAGE, 0x07)
#define HDMI_PLL_SCGN2_REG MKREG(HDMI_PLL_PAGE, 0x08)
#define HDMI_PLL_SCGR1_REG MKREG(HDMI_PLL_PAGE, 0x09)
#define HDMI_PLL_SCGR2_REG MKREG(HDMI_PLL_PAGE, 0x0a)
#define HDMI_PLL_SEL_CLK_REG MKREG(HDMI_PLL_PAGE, 0x11)
# define HDMI_PLL_SEL_CLK_ENA_SC_CLK (1 << 3)
# define HDMI_PLL_SEL_CLK_SEL_VRF_CLK(x) (((x) & 3) << 1)
# define HDMI_PLL_SEL_CLK_SEL_CLK1 (1 << 0)
#define HDMI_PLL_ANA_GENERAL_REG MKREG(HDMI_PLL_PAGE, 0x12)
/* EDID Control Page Registers and Bit Definitions */
#define HDMI_EDID_DATA_REG MKREG(HDMI_EDID_PAGE, 0x00)
#define HDMI_EDID_REQ_REG MKREG(HDMI_EDID_PAGE, 0xfa)
# define HDMI_EDID_REQ_READ (1 << 0)
#define HDMI_EDID_DEV_ADDR_REG MKREG(HDMI_EDID_PAGE, 0xfb)
# define HDMI_EDID_DEV_ADDR 0xa0
#define HDMI_EDID_OFFSET_REG MKREG(HDMI_EDID_PAGE, 0xfc)
# define HDMI_EDID_OFFSET 0x00
#define HDMI_EDID_SEGM_ADDR_REG MKREG(HDMI_EDID_PAGE, 0xfd)
#define HDMI_EDID_SEGM_ADDR 0x00
#define HDMI_EDID_DDC_SEGM_REG MKREG(HDMI_EDID_PAGE, 0xfe)
# define HDMI_EDID_SEG_ADDR 0x00
/* HDCP (TDA19988AHN and TDA19988AET only) and OTP Page Registers and Bit
* Definitions.
*/
#define HDMI_HDCPOTP_TX3_REG MKREG(HDMI_HDCPOTP_PAGE, 0x9a)
#define HDMI_HDCPOTP_TX4_REG MKREG(HDMI_HDCPOTP_PAGE, 0x9b)
# define HDMI_HDCPOTP_TX4_PDRAM (1 << 1)
#define HDMI_HDCPOTP_TX33_REG MKREG(HDMI_HDCPOTP_PAGE, 0x9b)
# define HDMI_HDCPOTP_TX33_HDMI (1 << 1)
/* Information Frames and Packets Page Registers and Bit Definitions */
#define HDMI_INFO_VSP MKREG(HDMI_INFO_PAGE, 0x20)
#define HDMI_INFO_AVI MKREG(HDMI_INFO_PAGE, 0x40)
#define HDMI_INFO_SPD MKREG(HDMI_INFO_PAGE, 0x60)
#define HDMI_INFO_AUD MKREG(HDMI_INFO_PAGE, 0x80)
#define HDMI_INFO_MPS MKREG(HDMI_INFO_PAGE, 0xa0)
/* Audio settings and content info packets page Registers and Bit Definitions */
#define HDMI_AUDIO_ENC_CTRL_REG MKREG(HDMI_AUDIO_PAGE, 0x0d)
# define HDMI_AUDIO_ENC_CNTRL_DVI_MODE (0 << 2)
# define HDMI_AUDIO_ENC_CNTRL_HDMI_MODE (1 << 2)
#define HDMI_AUDIO_DIP_IF_FLAGS_REG MKREG(HDMI_AUDIO_PAGE, 0x0f)
# define HDMI_AUDIO_DIP_IF_FLAGS_IF1 (1 << 1)
# define HDMI_AUDIO_DIP_IF_FLAGS_IF2 (1 << 2) /* AVI IF on page 10h */
# define HDMI_AUDIO_DIP_IF_FLAGS_IF3 (1 << 3)
# define HDMI_AUDIO_DIP_IF_FLAGS_IF4 (1 << 4)
# define HDMI_AUDIO_DIP_IF_FLAGS_IF5 (1 << 5)
/* Page Select Register (no page) */
#define HDMI_PAGE_SELECT_REG MKREG(HDMI_NO_PAGE, 0xff)
/* EDID Definitions */
#define EDID_LENGTH 128
/* EDID fields */
#define EDID_MODES0 35
#define EDID_MODES1 36
#define EDID_TIMING_START 38
#define EDID_TIMING_END 54
#define EDID_TIMING_X(v) (((v) + 31) * 8)
#define EDID_FREQ(v) (((v) & 0x3f) + 60)
#define EDID_RATIO(v) (((v) >> 6) & 0x3)
#define EDID_RATIO_10x16 0
#define EDID_RATIO_3x4 1
#define EDID_RATIO_4x5 2
#define EDID_RATIO_9x16 3
#endif /* __DRIVERS_LCD_TDA19988_H */

View File

@ -2,7 +2,7 @@
* include/nuttx/input/slcd_ioctl.h
* IOCTL commands for segment LCDs
*
* Copyright (C) 2013 Gregory Nutt. All rights reserved.
* Copyright (C) 2013, 2019 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <gnutt@nuttx.org>
*
* Redistribution and use in source and binary forms, with or without
@ -50,7 +50,12 @@
/* IOCTL commands set aside for FT80x character driver */
#define FT80X_NIOCTL_CMDS 16
#define FT80X_NIOCTL_BASE 0x0001
#define FT80X_NIOCTL_CMDS 16
#define FT80X_NIOCTL_BASE 0x0001
/* IOCTL commands set aside for TDA19988 HDMI encoder */
#define TDA19988_NIOCTL_CMDS 1
#define TDA19988_NIOCTL_BASE (FT80X_NIOCTL_BASE + FT80X_NIOCTL_CMDS)
#endif /* __INCLUDE_NUTTX_INPUT_LCD_IOCTL_H */

View File

@ -0,0 +1,237 @@
/****************************************************************************
* include/nuttx/lcd/tca19988.h
*
* Copyright (C) 2019 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <gnutt@nuttx.org>
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
* 3. Neither the name NuttX nor the names of its contributors may be
* used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
****************************************************************************/
#ifndef __INCLUDE_NUTTX_LCD_TDA19988_H
#define __INCLUDE_NUTTX_LCD_TDA19988_H
/****************************************************************************
* Included Files
****************************************************************************/
#include <stdint.h>
#include <stdbool.h>
#include <nuttx/irq.h>
#include <nuttx/i2c/i2c_master.h>
#include <nuttx/lcd/lcd_ioctl.h>
#ifdef CONFIG_LCD_TDA19988
/****************************************************************************
* Pre-processor Definitions
****************************************************************************/
/* TDA19988 IOCTL commands **************************************************
*
* TDA19988_IOC_VIDEOMODE:
* Description: Select the video mode. This must be done as part of the
* initialization of the driver. This is equivalent to
* calling tda18899_videomode() within the OS.
* Argument: A reference to a tda19988_videomode_s structure instance.
* See struct tda19988_videomode_s below.
* Returns: None
*/
#define TDA19988_IOC_VIDEOMODE _LCDIOC(TDA19988_NIOCTL_BASE + 0)
/* Values for video mode flags */
#define VID_PHSYNC 0x0001
#define VID_NHSYNC 0x0002
#define VID_PVSYNC 0x0004
#define VID_NVSYNC 0x0008
#define VID_INTERLACE 0x0010
#define VID_DBLSCAN 0x0020
#define VID_CSYNC 0x0040
#define VID_PCSYNC 0x0080
#define VID_NCSYNC 0x0100
#define VID_HSKEW 0x0200
#define VID_BCAST 0x0400
#define VID_PIXMUX 0x1000
#define VID_DBLCLK 0x2000
#define VID_CLKDIV2 0x4000
/****************************************************************************
* Public Types
****************************************************************************/
/* Opaque handle returned by tda19988_register() */
typedef FAR void *TDA19988_HANDLE;
/* Structure that provides the TDA19988 video mode */
struct tda19988_videomode_s
{
int dot_clock; /* Dot clock frequency in kHz. */
int hdisplay;
int hsync_start;
int hsync_end;
int htotal;
int vdisplay;
int vsync_start;
int vsync_end;
int vtotal;
int flags; /* Video mode flags; see above. */
int hskew;
};
/* This structure defines the I2C interface.
* REVISIT: This could be simplified because the CEC and HDMI reside on
* the same I2C bus (pins CSCL and CSCA).
*/
struct tda19988_i2c_s
{
struct i2c_config_s config; /* Frequency, address, address length */
FAR struct i2c_master_s *i2c; /* I2C bus interface */
};
/* This structure provides the TDA19988 lower half interface */
struct i2c_master_s; /* Forward reference */
struct tda19988_lower_s
{
/* I2C bus interfaces (CEC and HDMI lie on same I2C bus) */
struct tda19988_i2c_s cec;
struct tda19988_i2c_s hdmi;
/* Interrupt controls */
CODE int (*attach)(FAR const struct tda19988_lower_s *lower,
xcpt_t handler, FAR void *arg);
CODE int (*enable)(FAR const struct tda19988_lower_s *lower,
bool enable);
};
/****************************************************************************
* Public Data
****************************************************************************/
#ifdef __cplusplus
#define EXTERN extern "C"
extern "C"
{
#else
#define EXTERN extern
#endif
/****************************************************************************
* Public Function Prototypes
****************************************************************************/
/****************************************************************************
* Name: tda19988_register
*
* Description:
* Create and register the the TDA19988 driver at 'devpath'
*
* Input Parameters:
* devpath - The location to register the TDA19988 driver instance
* lower - The interface to the the TDA19988 lower half driver.
*
* Returned Value:
* On success, non-NULL handle is returned that may be subsequently used
* with tda19988_videomode(). NULL is returned on failure.
*
****************************************************************************/
TDA19988_HANDLE tda19988_register(FAR const char *devpath,
FAR const struct tda19988_lower_s *lower);
/****************************************************************************
* Name: tda19988_videomode
*
* Description:
* Initialize the TDA19988 driver to a specified video mode. This is a
* necessary part of the TDA19988 initialization: A video mode must be
* configured before the driver is usable.
*
* NOTE: This may be done in two ways: (1) via a call to
* tda19988_videomode() from board-specific logic within the OS, or
* equivalently (2) using the TDA19988_IOC_VIDEOMODE from application
* logic outside of the OS.
*
* Input Parameters:
* handle - The handle previously returned by tda19988_register().
* mode - The new video mode.
*
* Returned Value:
* Zero (OK) is returned on success; a negated errno value is returned on
* any failure.
*
****************************************************************************/
int tda19988_videomode(TDA19988_HANDLE handle,
FAR const struct tda19988_videomode_s *mode);
/****************************************************************************
* Name: tda19988_read_edid
*
* Description:
* Read the EDID (Extended Display Identification Data).
*
* NOTE: This may be done in two ways: (1) via a call to
* tda19988_read_edid() from board-specific logic within the OS, or
* equivalently (2) using a standard read() to read the EDID from
* application logic outside of the OS.
*
* Input Parameters:
* handle - The handle previously returned by tda19988_register().
* offset - The offset into the EDID to begin reading (0..127)
* buffer - Location in which to return the EDID data
* buflen - Size of buffer in bytes
*
* Returned Value:
* On success, the number of bytes read is returned; a negated errno value
* is returned on any failure.
*
****************************************************************************/
ssize_t tda19988_read_edid(TDA19988_HANDLE handle, off_t offset,
FAR uint8_t *buffer, size_t buflen);
#undef EXTERN
#ifdef __cplusplus
}
#endif
#endif /* CONFIG_LCD_TDA19988 */
#endif /* __INCLUDE_NUTTX_LCD_TDA19988_H */