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:
parent
937c30e57a
commit
a830d59da2
@ -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
|
||||
|
@ -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
1817
drivers/lcd/tda19988.c
Normal file
File diff suppressed because it is too large
Load Diff
313
drivers/lcd/tda19988.h
Normal file
313
drivers/lcd/tda19988.h
Normal 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 */
|
@ -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 */
|
||||
|
237
include/nuttx/lcd/tda19988.h
Normal file
237
include/nuttx/lcd/tda19988.h
Normal 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 */
|
Loading…
x
Reference in New Issue
Block a user