<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic Re: Design with HDMI Transmitter TDA19988 in Digital Signal Controllers</title>
    <link>https://community.nxp.com/t5/Digital-Signal-Controllers/Design-with-HDMI-Transmitter-TDA19988/m-p/715879#M1139</link>
    <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;I'm in the same boat -- I'd like a technical reference manual and/or information about programming the i2c registers. :smileyhappy:&lt;/P&gt;&lt;P&gt;Apparently you have to sign an NDA for this, according to the support team.&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
    <pubDate>Thu, 26 Jul 2018 16:47:10 GMT</pubDate>
    <dc:creator>electrodev</dc:creator>
    <dc:date>2018-07-26T16:47:10Z</dc:date>
    <item>
      <title>Design with HDMI Transmitter TDA19988</title>
      <link>https://community.nxp.com/t5/Digital-Signal-Controllers/Design-with-HDMI-Transmitter-TDA19988/m-p/715878#M1138</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hi,&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;I am about to design in the&amp;nbsp;TDA19988. But I got a bit uncertain regarding EOL for this part.&amp;nbsp;No info can be found at nxp.com. The only thing I found was EOL info for the development boards&amp;nbsp;E1TDA19988A (&lt;A class="link-titled" href="https://www.nxp.com/search?client=nxp_search_all_results&amp;amp;site=nxp_en&amp;amp;proxystylesheet=nxp_search_style_fe&amp;amp;sort=date%3AD%3AL%3Ad1&amp;amp;oe=UTF-8&amp;amp;ie=UTF-8&amp;amp;ud=1&amp;amp;output=xml_no_dtd&amp;amp;exclude_apps=1&amp;amp;callback=ss_show&amp;amp;lang_cd=en&amp;amp;filter=0&amp;amp;getfields=*&amp;amp;baseUrl=%2F%2Fwww.nxp.com%2Fwebapp&amp;amp;SEARCH_OPERATOR=Contains&amp;amp;attempt=-1&amp;amp;rc=1&amp;amp;hl=en&amp;amp;dnavs=&amp;amp;q=tda19988" title="https://www.nxp.com/search?client=nxp_search_all_results&amp;amp;site=nxp_en&amp;amp;proxystylesheet=nxp_search_style_fe&amp;amp;sort=date%3AD%3AL%3Ad1&amp;amp;oe=UTF-8&amp;amp;ie=UTF-8&amp;amp;ud=1&amp;amp;output=xml_no_dtd&amp;amp;exclude_apps=1&amp;amp;callback=ss_show&amp;amp;lang_cd=en&amp;amp;filter=0&amp;amp;getfields=*&amp;amp;baseUrl=%2F%2Fwww.nxp.com%2Fwebapp&amp;amp;SEARCH_OPERATOR=Contains&amp;amp;attempt=-1&amp;amp;rc=1&amp;amp;hl=en&amp;amp;dnavs=&amp;amp;q=tda19988"&gt;Search Results: tda19988&lt;/A&gt;&amp;nbsp;).&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Also, are there any programming guide for this chip? Or is the datasheet found at mouser all info available?&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Thanks,&lt;/P&gt;&lt;P&gt;Magnus&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Thu, 11 Jan 2018 19:28:16 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Digital-Signal-Controllers/Design-with-HDMI-Transmitter-TDA19988/m-p/715878#M1138</guid>
      <dc:creator>malo</dc:creator>
      <dc:date>2018-01-11T19:28:16Z</dc:date>
    </item>
    <item>
      <title>Re: Design with HDMI Transmitter TDA19988</title>
      <link>https://community.nxp.com/t5/Digital-Signal-Controllers/Design-with-HDMI-Transmitter-TDA19988/m-p/715879#M1139</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;I'm in the same boat -- I'd like a technical reference manual and/or information about programming the i2c registers. :smileyhappy:&lt;/P&gt;&lt;P&gt;Apparently you have to sign an NDA for this, according to the support team.&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Thu, 26 Jul 2018 16:47:10 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Digital-Signal-Controllers/Design-with-HDMI-Transmitter-TDA19988/m-p/715879#M1139</guid>
      <dc:creator>electrodev</dc:creator>
      <dc:date>2018-07-26T16:47:10Z</dc:date>
    </item>
    <item>
      <title>Re: Design with HDMI Transmitter TDA19988</title>
      <link>https://community.nxp.com/t5/Digital-Signal-Controllers/Design-with-HDMI-Transmitter-TDA19988/m-p/2008136#M3635</link>
      <description>&lt;P&gt;All you guys need is NXP source deliverable.&lt;/P&gt;&lt;P&gt;Here it is:&amp;nbsp;&lt;A href="https://github.com/joelagnel/beagle-nxp-hdmi" target="_blank"&gt;GitHub - joelagnel/beagle-nxp-hdmi: TDA19988 driver for Linux Kernel&lt;/A&gt;&lt;/P&gt;&lt;P&gt;This deliverable is for Linux, but exists for MCU's as vel. Both share same driver.&lt;/P&gt;&lt;P&gt;Read&amp;nbsp;&lt;A href="https://github.com/joelagnel/beagle-nxp-hdmi/blob/master/hdmi/comps/tmdlHdmiTx/docs/14_user_doc/TRANSMITTER_TDA998X_SW_UM_Devlib.pdf" target="_blank"&gt;beagle-nxp-hdmi/hdmi/comps/tmdlHdmiTx/docs/14_user_doc/TRANSMITTER_TDA998X_SW_UM_Devlib.pdf at master · joelagnel/beagle-nxp-hdmi · GitHub&lt;/A&gt;&amp;nbsp;on how to set up driver or port to other OS. Driver supports Linux/Android/RTOS/Bare Metal.&lt;/P&gt;&lt;P&gt;In my implementation for BT656 source and STM32 I included:&lt;BR /&gt;tmdlHdmiTx.c&lt;BR /&gt;tmdlHdmiTx_local.c&lt;BR /&gt;tmbslTDA9989_edid.c&lt;BR /&gt;tmbslTDA9989_HDCP.c&lt;BR /&gt;tmbslTDA9989_InOut.c&lt;BR /&gt;tmbslTDA9989_local.c&lt;BR /&gt;tmbslTDA9989_misc.c&lt;BR /&gt;&lt;SPAN&gt;tmbslTDA9989_state.c&lt;BR /&gt;&lt;/SPAN&gt;I modified supplied templates&amp;nbsp;tmdlHdmiTx_cfg.c and tmdlHdmiTx_IW.c according to that pdf (above).&lt;BR /&gt;&lt;BR /&gt;And my initialization code, which uses NXP driver:&lt;/P&gt;&lt;P&gt;int hdmi_enable(void)&lt;BR /&gt;{&lt;BR /&gt;tda_instance *this = &amp;amp;our_instance;&lt;BR /&gt;int err = 0;&lt;/P&gt;&lt;P&gt;LOG("called\n");&lt;/P&gt;&lt;P&gt;#ifndef STM32F446xx&lt;BR /&gt;down(&amp;amp;this-&amp;gt;driver.sem);&lt;BR /&gt;#endif&lt;/P&gt;&lt;P&gt;this-&amp;gt;driver.omap_dss_hdmi_panel = true;&lt;/P&gt;&lt;P&gt;this-&amp;gt;tda.power = tmPowerOn;&lt;BR /&gt;TRY(tmdlHdmiTxSetPowerState(this-&amp;gt;tda.instance, this-&amp;gt;tda.power));&lt;BR /&gt;if (err == TM_ERR_NO_RESOURCES)&lt;BR /&gt;{&lt;BR /&gt;LOG("Busy...\n");&lt;BR /&gt;TRY(tmdlHdmiTxHandleInterrupt(this-&amp;gt;tda.instance));&lt;BR /&gt;TRY(tmdlHdmiTxHandleInterrupt(this-&amp;gt;tda.instance));&lt;BR /&gt;TRY(tmdlHdmiTxHandleInterrupt(this-&amp;gt;tda.instance));&lt;BR /&gt;}&lt;BR /&gt;tmdlHdmiTxGetHPDStatus(this-&amp;gt;tda.instance, &amp;amp;this-&amp;gt;tda.hot_plug_detect);&lt;BR /&gt;show_video(this);&lt;/P&gt;&lt;P&gt;TRY_DONE:&lt;BR /&gt;#ifndef STM32F446xx&lt;BR /&gt;up(&amp;amp;this-&amp;gt;driver.sem);&lt;BR /&gt;#endif&lt;BR /&gt;return err;&lt;BR /&gt;}&lt;/P&gt;&lt;P&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;/P&gt;&lt;DIV&gt;static int hdmi_tx_init(tda_instance *this)&lt;/DIV&gt;&lt;DIV&gt;{&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp;int err = 0;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp;LOG("called\n");&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp;/*&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; general device context&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp;*/&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp;memset(this, 0, sizeof(tda_instance));&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp;this-&amp;gt;param.verbose = param_verbose;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp;this-&amp;gt;param.major = param_major;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp;this-&amp;gt;param.minor = param_minor;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp;/*Initialize HDMI Transmiter*/&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;TRY(tmdlHdmiTxOpen(&amp;amp;this-&amp;gt;tda.instance));&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp;/* Register the HDMI TX events callbacks */&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp;TRY(tmdlHdmiTxRegisterCallbacks(this-&amp;gt;tda.instance, (ptmdlHdmiTxCallback_t)eventCallbackTx));&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp;/* EnableEvent, all by default */&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp;TRY(tmdlHdmiTxEnableEvent(this-&amp;gt;tda.instance, TMDL_HDMITX_HDCP_ACTIVE));&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp;TRY(tmdlHdmiTxEnableEvent(this-&amp;gt;tda.instance, TMDL_HDMITX_HDCP_INACTIVE));&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp;TRY(tmdlHdmiTxEnableEvent(this-&amp;gt;tda.instance, TMDL_HDMITX_HPD_ACTIVE));&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp;TRY(tmdlHdmiTxEnableEvent(this-&amp;gt;tda.instance, TMDL_HDMITX_HPD_INACTIVE));&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp;TRY(tmdlHdmiTxEnableEvent(this-&amp;gt;tda.instance, TMDL_HDMITX_RX_KEYS_RECEIVED));&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp;TRY(tmdlHdmiTxEnableEvent(this-&amp;gt;tda.instance, TMDL_HDMITX_RX_DEVICE_ACTIVE));&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp;TRY(tmdlHdmiTxEnableEvent(this-&amp;gt;tda.instance, TMDL_HDMITX_RX_DEVICE_INACTIVE));&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp;TRY(tmdlHdmiTxEnableEvent(this-&amp;gt;tda.instance, TMDL_HDMITX_EDID_RECEIVED));&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp;/* Size of the application EDID buffer */&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp;this-&amp;gt;tda.setup.edidBufferSize = EDID_BLOCK_COUNT * EDID_BLOCK_SIZE;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp;/* Buffer to store the application EDID data */&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp;this-&amp;gt;tda.setup.pEdidBuffer = this-&amp;gt;tda.raw_edid;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp;/* To Enable/disable repeater feature, nor relevant here */&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp;this-&amp;gt;tda.setup.repeaterEnable = false;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp;/* To enable/disable simplayHD feature: blue screen when not authenticated */&lt;/DIV&gt;&lt;DIV&gt;#ifdef SIMPLAYHD&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp;this-&amp;gt;tda.setup.simplayHd = (this-&amp;gt;tda.hdcp_enable ? true : false);&lt;/DIV&gt;&lt;DIV&gt;#else&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp;this-&amp;gt;tda.setup.simplayHd = false;&lt;/DIV&gt;&lt;DIV&gt;#endif&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp;/* Provides HDMI TX instance configuration */&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp;TRY(tmdlHdmiTxInstanceSetup(this-&amp;gt;tda.instance, &amp;amp;this-&amp;gt;tda.setup));&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp;/* Get IC version */&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp;TRY(tmdlHdmiTxGetCapabilities(&amp;amp;this-&amp;gt;tda.capabilities));&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp;/* Main settings */&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp;this-&amp;gt;tda.setio.video_out.mode = TMDL_HDMITX_VOUTMODE_RGB444;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp;this-&amp;gt;tda.setio.video_out.colorDepth = TMDL_HDMITX_COLORDEPTH_24;&lt;/DIV&gt;&lt;DIV&gt;#ifdef TMFL_TDA19989&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp;this-&amp;gt;tda.setio.video_out.dviVqr = TMDL_HDMITX_VQR_DEFAULT; /* Use HDMI rules for DVI output */&lt;/DIV&gt;&lt;DIV&gt;#endif&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp;this-&amp;gt;tda.setio.video_out.format = TMDL_HDMITX_VFMT_19_1280x720p_50Hz;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp;this-&amp;gt;tda.setio.video_in.mode = TMDL_HDMITX_VINMODE_CCIR656;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp;this-&amp;gt;tda.setio.video_in.format = this-&amp;gt;tda.setio.video_out.format;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp;this-&amp;gt;tda.setio.video_in.pixelRate = TMDL_HDMITX_PIXRATE_SINGLE;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp;this-&amp;gt;tda.setio.video_in.syncSource = TMDL_HDMITX_SYNCSRC_EMBEDDED; /* we use HS,VS as synchronisation source */&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp;this-&amp;gt;tda.setio.audio_in.format = TMDL_HDMITX_AFMT_I2S;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp;this-&amp;gt;tda.setio.audio_in.rate = TMDL_HDMITX_AFS_44K;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp;this-&amp;gt;tda.setio.audio_in.i2sFormat = TMDL_HDMITX_I2SFOR_PHILIPS_L;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp;this-&amp;gt;tda.setio.audio_in.i2sQualifier = TMDL_HDMITX_I2SQ_16BITS;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp;this-&amp;gt;tda.setio.audio_in.dstRate = TMDL_HDMITX_DSTRATE_SINGLE; /* not relevant here */&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp;this-&amp;gt;tda.setio.audio_in.channelAllocation = 0;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; /* audio channel allocation (Ref to CEA-861D p85) */&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp;/* audio channel allocation (Ref to CEA-861D p85) */&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp;this-&amp;gt;tda.setio.audio_in.channelStatus.PcmIdentification = TMDL_HDMITX_AUDIO_DATA_PCM;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp;this-&amp;gt;tda.setio.audio_in.channelStatus.CopyrightInfo = TMDL_HDMITX_CSCOPYRIGHT_UNPROTECTED;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp;this-&amp;gt;tda.setio.audio_in.channelStatus.FormatInfo = TMDL_HDMITX_CSFI_PCM_2CHAN_NO_PRE;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp;this-&amp;gt;tda.setio.audio_in.channelStatus.categoryCode = 0;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp;this-&amp;gt;tda.setio.audio_in.channelStatus.clockAccuracy = TMDL_HDMITX_CSCLK_LEVEL_II;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp;this-&amp;gt;tda.setio.audio_in.channelStatus.maxWordLength = TMDL_HDMITX_CSMAX_LENGTH_24;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp;this-&amp;gt;tda.setio.audio_in.channelStatus.wordLength = TMDL_HDMITX_CSWORD_DEFAULT;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp;this-&amp;gt;tda.setio.audio_in.channelStatus.origSampleFreq = TMDL_HDMITX_CSOFREQ_44_1k;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp;this-&amp;gt;tda.setio.sink = TMDL_HDMITX_SINK_HDMI; /* skip edid reading */&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp;/*&amp;nbsp; &amp;nbsp; this-&amp;gt;tda.src_address = 0x1000; /\* debug *\/ */&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp;this-&amp;gt;tda.src_address = NO_PHY_ADDR; /* it's unref */&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;TRY_DONE:&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp;return err;&lt;/DIV&gt;&lt;DIV&gt;}&lt;/DIV&gt;&lt;P&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;/P&gt;&lt;P&gt;void hdcp_on(tda_instance *this)&lt;BR /&gt;{&lt;/P&gt;&lt;P&gt;int err = 0;&lt;/P&gt;&lt;P&gt;if (this-&amp;gt;tda.hdcp_status != HDCP_IS_NOT_INSTALLED)&lt;BR /&gt;{ /* check HDCP is installed ... */&lt;BR /&gt;if (this-&amp;gt;tda.hdcp_enable)&lt;BR /&gt;{ /* ... but requested ! */&lt;BR /&gt;TRY(tmdlHdmiTxSetHdcp(this-&amp;gt;tda.instance, True)); /* switch if on */&lt;BR /&gt;#if defined(TMFL_TDA19989) || defined(TMFL_TDA9984)&lt;BR /&gt;/* hide video content until HDCP authentification is finished */&lt;BR /&gt;if (!this-&amp;gt;tda.setup.simplayHd)&lt;BR /&gt;{&lt;BR /&gt;TRY(tmdlHdmiTxSetBScreen(this-&amp;gt;tda.instance, TMDL_HDMITX_PATTERN_BLUE));&lt;BR /&gt;}&lt;BR /&gt;#endif&lt;BR /&gt;}&lt;BR /&gt;}&lt;BR /&gt;TRY_DONE:&lt;BR /&gt;(void)0;&lt;BR /&gt;}&lt;/P&gt;&lt;P&gt;/*&lt;BR /&gt;* Off HDCP&lt;BR /&gt;*/&lt;BR /&gt;void hdcp_off(tda_instance *this)&lt;BR /&gt;{&lt;/P&gt;&lt;P&gt;int err = 0;&lt;/P&gt;&lt;P&gt;if (this-&amp;gt;tda.hdcp_status != HDCP_IS_NOT_INSTALLED)&lt;BR /&gt;{ /* check HDCP is installed ... */&lt;/P&gt;&lt;P&gt;if (this-&amp;gt;tda.hdcp_enable)&lt;BR /&gt;{ /* but no more requested */&lt;BR /&gt;TRY(tmdlHdmiTxSetHdcp(this-&amp;gt;tda.instance, False)); /* switch if off */&lt;BR /&gt;}&lt;BR /&gt;}&lt;BR /&gt;TRY_DONE:&lt;BR /&gt;(void)0;&lt;BR /&gt;}&lt;/P&gt;&lt;P&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;/P&gt;&lt;P&gt;void show_video(tda_instance *this)&lt;BR /&gt;{&lt;/P&gt;&lt;P&gt;int err = 0;&lt;/P&gt;&lt;P&gt;if (this-&amp;gt;tda.rx_device_active)&lt;BR /&gt;{ /* check RxSens */&lt;BR /&gt;if (this-&amp;gt;tda.hot_plug_detect == TMDL_HDMITX_HOTPLUG_ACTIVE)&lt;BR /&gt;{ /* should be useless, but legacy... */&lt;BR /&gt;if (this-&amp;gt;tda.power == tmPowerOn)&lt;BR /&gt;{ /* check CEC or DSS didn't switch it off */&lt;BR /&gt;if (this-&amp;gt;tda.src_address != 0xFFFF)&lt;BR /&gt;{ /* check EDID has been received */&lt;BR /&gt;hdcp_off(this);&lt;BR /&gt;TRY(tmdlHdmiTxSetInputOutput(this-&amp;gt;tda.instance,&lt;BR /&gt;this-&amp;gt;tda.setio.video_in,&lt;BR /&gt;this-&amp;gt;tda.setio.video_out,&lt;BR /&gt;this-&amp;gt;tda.setio.audio_in,&lt;BR /&gt;this-&amp;gt;tda.setio.sink));&lt;BR /&gt;hdcp_on(this);&lt;BR /&gt;/*&lt;BR /&gt;Mind that SetInputOutput disable the blue color matrix settings of tmdlHdmiTxSetBScreen ...&lt;BR /&gt;so put tmdlHdmiTxSetBScreen (or hdcp_on) always after&lt;BR /&gt;*/&lt;BR /&gt;}&lt;BR /&gt;}&lt;BR /&gt;}&lt;BR /&gt;}&lt;/P&gt;&lt;P&gt;TRY_DONE:&lt;BR /&gt;(void)0;&lt;BR /&gt;}&lt;/P&gt;&lt;P&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;/P&gt;&lt;P&gt;int hdmi_disable(int event_tracking)&lt;BR /&gt;{&lt;BR /&gt;tda_instance *this = &amp;amp;our_instance;&lt;BR /&gt;int err = 0;&lt;/P&gt;&lt;P&gt;LOG("called\n");&lt;/P&gt;&lt;P&gt;#ifndef STM32F446xx&lt;BR /&gt;down(&amp;amp;this-&amp;gt;driver.sem);&lt;BR /&gt;#endif&lt;BR /&gt;this-&amp;gt;tda.power = (event_tracking ? tmPowerSuspend : tmPowerStandby);&lt;BR /&gt;TRY(tmdlHdmiTxSetPowerState(this-&amp;gt;tda.instance, this-&amp;gt;tda.power));&lt;/P&gt;&lt;P&gt;TRY_DONE:&lt;BR /&gt;this-&amp;gt;driver.omap_dss_hdmi_panel = false;&lt;BR /&gt;#ifndef STM32F446xx&lt;BR /&gt;up(&amp;amp;this-&amp;gt;driver.sem);&lt;BR /&gt;#endif&lt;BR /&gt;return err;&lt;BR /&gt;}&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;int hdmi_enable(void)&lt;BR /&gt;{&lt;BR /&gt;tda_instance *this = &amp;amp;our_instance;&lt;BR /&gt;int err = 0;&lt;/P&gt;&lt;P&gt;LOG("called\n");&lt;/P&gt;&lt;P&gt;#ifndef STM32F446xx&lt;BR /&gt;down(&amp;amp;this-&amp;gt;driver.sem);&lt;BR /&gt;#endif&lt;/P&gt;&lt;P&gt;this-&amp;gt;driver.omap_dss_hdmi_panel = true;&lt;/P&gt;&lt;P&gt;this-&amp;gt;tda.power = tmPowerOn;&lt;BR /&gt;TRY(tmdlHdmiTxSetPowerState(this-&amp;gt;tda.instance, this-&amp;gt;tda.power));&lt;BR /&gt;if (err == TM_ERR_NO_RESOURCES)&lt;BR /&gt;{&lt;BR /&gt;LOG("Busy...\n");&lt;BR /&gt;TRY(tmdlHdmiTxHandleInterrupt(this-&amp;gt;tda.instance));&lt;BR /&gt;TRY(tmdlHdmiTxHandleInterrupt(this-&amp;gt;tda.instance));&lt;BR /&gt;TRY(tmdlHdmiTxHandleInterrupt(this-&amp;gt;tda.instance));&lt;BR /&gt;}&lt;BR /&gt;tmdlHdmiTxGetHPDStatus(this-&amp;gt;tda.instance, &amp;amp;this-&amp;gt;tda.hot_plug_detect);&lt;BR /&gt;show_video(this);&lt;/P&gt;&lt;P&gt;TRY_DONE:&lt;BR /&gt;#ifndef STM32F446xx&lt;BR /&gt;up(&amp;amp;this-&amp;gt;driver.sem);&lt;BR /&gt;#endif&lt;BR /&gt;return err;&lt;BR /&gt;}&lt;/P&gt;&lt;P&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;/P&gt;&lt;P&gt;static int tx_init(void)&lt;BR /&gt;{&lt;BR /&gt;tda_instance *this = &amp;amp;our_instance;&lt;BR /&gt;// dev_t dev=0;&lt;BR /&gt;int err = 0;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;/* Hello word */&lt;BR /&gt;I2C_PRINTF("%s(%s) %d.%d.%d compiled: %s %s %s\n", HDMITX_NAME, "TDA19988",&lt;BR /&gt;0,&lt;BR /&gt;0,&lt;BR /&gt;0,&lt;BR /&gt;__DATE__, __TIME__, 0);&lt;BR /&gt;if (this-&amp;gt;param.verbose)&lt;BR /&gt;LOG(".verbose mode\n");&lt;/P&gt;&lt;P&gt;/*&lt;BR /&gt;/!\ WARNING /! \&lt;BR /&gt;the startup power sequence SHALL BE standby AND THEN suspend (core driver legacy...)&lt;BR /&gt;this is the only way to get the TDA idle but with active HDP and RxSens interrupt listening&lt;BR /&gt;*/&lt;BR /&gt;hdmi_disable(1); /* power start sequence phase 2 */&lt;/P&gt;&lt;P&gt;/*&lt;BR /&gt;/!\ WARNING /! \&lt;BR /&gt;if HDMI is plugged, the core driver will send HDP nor RXSENS event when beeing powered on !&lt;BR /&gt;So the Android HDMI service shall start by asking the HDP status using the IOCTL GET_HPD_STATUS&lt;BR /&gt;*/&lt;BR /&gt;tmdlHdmiTxGetHPDStatus(this-&amp;gt;tda.instance,&lt;BR /&gt;&amp;amp;this-&amp;gt;tda.hot_plug_detect); /* power start sequence phase 3 */&lt;/P&gt;&lt;P&gt;/* sysfs_attrs */&lt;BR /&gt;#ifndef STM32F446xx&lt;BR /&gt;comm_init(); /* create display sysfs links (not used in STM32F4XX) */&lt;BR /&gt;#endif&lt;BR /&gt;hdmi_enable();&lt;BR /&gt;return 0;&lt;BR /&gt;}&lt;/P&gt;&lt;P&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;/P&gt;&lt;DIV&gt;uint8_t hdmiInit(void)&lt;/DIV&gt;&lt;DIV&gt;{&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp;tda_instance *this = &amp;amp;our_instance;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp;// dev_t dev=0;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp;uint8_t err = 0;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp;tmErrorCode_t status = TM_OK;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp;/* High level */&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp;err = hdmi_tx_init(this);&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp;if (err)&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; goto i2c_out;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp;this-&amp;gt;tda.hdcp_enable = 0;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp;/* Standby the HDMI TX instance : this is mandatory for TDA boot up sequence, do not change it */&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp;this-&amp;gt;tda.power = tmPowerStandby; /* power start sequence phase 1, see phase 2 */&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp;tmdlHdmiTxSetPowerState(this-&amp;gt;tda.instance, this-&amp;gt;tda.power);&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp;/* update HPD */&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp;tmdlHdmiTxGetHPDStatus(this-&amp;gt;tda.instance, &amp;amp;this-&amp;gt;tda.hot_plug_detect);&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp;tmdlHdmiTxGetSWVersion(&amp;amp;this-&amp;gt;tda.version);&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp;I2C_PRINTF("HDMI TX SW Version:%lu.%lu compatibility:%lu\n",&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; this-&amp;gt;tda.version.majorVersionNr,&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; this-&amp;gt;tda.version.minorVersionNr,&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; this-&amp;gt;tda.version.compatibilityNr);&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;tx_init();&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp;return 0;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;i2c_tx_out:&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp;LOG("tmdlHdmiTx closed\n");&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp;/* close DevLib */&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp;err = tmdlHdmiTxClose(this-&amp;gt;tda.instance);&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;i2c_out:&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp;LOG("this-&amp;gt;driver.i2c_client removed\n");&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp;this-&amp;gt;driver.i2c_client = NULL;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp; &amp;nbsp;return err;&lt;/DIV&gt;&lt;DIV&gt;}&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;Call&amp;nbsp;hdmiInit in your initialization sequence after I2C was initialized. And in while loop&amp;nbsp;check for interrupt (since most of the driver can't be run from ISR):&lt;BR /&gt;if (hdmiIntDetected &amp;gt; 0)&lt;BR /&gt;{&lt;BR /&gt;tmdlHdmiTxHandleInterrupt(hdmiInstance);&lt;BR /&gt;hdmiIntDetected = 0;&lt;BR /&gt;}&lt;/DIV&gt;</description>
      <pubDate>Thu, 05 Dec 2024 11:12:28 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Digital-Signal-Controllers/Design-with-HDMI-Transmitter-TDA19988/m-p/2008136#M3635</guid>
      <dc:creator>assbass</dc:creator>
      <dc:date>2024-12-05T11:12:28Z</dc:date>
    </item>
  </channel>
</rss>

