blob: 2c51dbb11f8eda57dcc9c68f130e3164c8e107ed [file] [log] [blame]
<!--
Documentation/_templates/layout.html
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership. The
ASF licenses this file to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance with the
License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
License for the specific language governing permissions and limitations
under the License.
-->
<!DOCTYPE html>
<html class="writer-html5" lang="en">
<head>
<meta charset="utf-8" /><meta name="generator" content="Docutils 0.19: https://docutils.sourceforge.io/" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>LCD Character Drivers &mdash; NuttX latest documentation</title>
<link rel="stylesheet" type="text/css" href="../../../_static/pygments.css" />
<link rel="stylesheet" type="text/css" href="../../../_static/css/theme.css" />
<link rel="stylesheet" type="text/css" href="../../../_static/copybutton.css" />
<link rel="stylesheet" type="text/css" href="../../../_static/design-style.1e8bd061cd6da7fc9cf755528e8ffc24.min.css" />
<link rel="stylesheet" type="text/css" href="../../../_static/custom.css" />
<link rel="shortcut icon" href="../../../_static/favicon.ico"/>
<script src="../../../_static/jquery.js"></script>
<script src="../../../_static/_sphinx_javascript_frameworks_compat.js"></script>
<script data-url_root="../../../" id="documentation_options" src="../../../_static/documentation_options.js"></script>
<script src="../../../_static/doctools.js"></script>
<script src="../../../_static/sphinx_highlight.js"></script>
<script src="../../../_static/clipboard.min.js"></script>
<script src="../../../_static/copybutton.js"></script>
<script src="../../../_static/design-tabs.js"></script>
<script src="../../../_static/js/theme.js"></script>
<link rel="index" title="Index" href="../../../genindex.html" />
<link rel="search" title="Search" href="../../../search.html" />
<link rel="next" title="Memory Technology Device Drivers" href="mtd.html" />
<link rel="prev" title="IO Expander Device Drivers" href="ioexpander.html" />
</head>
<body class="wy-body-for-nav">
<div class="wy-grid-for-nav">
<nav data-toggle="wy-nav-shift" class="wy-nav-side">
<div class="wy-side-scroll">
<div class="wy-side-nav-search" >
<a href="../../../index.html" class="icon icon-home"> NuttX
</a>
<!-- this version selector is quite ugly, should be probably replaced by something
more modern -->
<div class="version-selector">
<select onchange="javascript:location.href = this.value;">
<option value="../../../../latest" selected="selected">latest</option>
<option value="../../../../10.0.0" >10.0.0</option>
<option value="../../../../10.0.1" >10.0.1</option>
<option value="../../../../10.1.0" >10.1.0</option>
<option value="../../../../10.2.0" >10.2.0</option>
<option value="../../../../10.3.0" >10.3.0</option>
<option value="../../../../11.0.0" >11.0.0</option>
<option value="../../../../12.0.0" >12.0.0</option>
<option value="../../../../12.1.0" >12.1.0</option>
<option value="../../../../12.2.0" >12.2.0</option>
<option value="../../../../12.2.1" >12.2.1</option>
<option value="../../../../12.3.0" >12.3.0</option>
<option value="../../../../12.4.0" >12.4.0</option>
<option value="../../../../12.5.0" >12.5.0</option>
<option value="../../../../12.5.1" >12.5.1</option>
<option value="../../../../12.6.0" >12.6.0</option>
<option value="../../../../12.7.0" >12.7.0</option>
<option value="../../../../12.8.0" >12.8.0</option>
<option value="../../../../12.9.0" >12.9.0</option>
<option value="../../../../12.10.0" >12.10.0</option>
<option value="../../../../12.11.0" >12.11.0</option>
</select>
</div>
<div role="search">
<form id="rtd-search-form" class="wy-form" action="../../../search.html" method="get">
<input type="text" name="q" placeholder="Search docs" aria-label="Search docs" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
</div>
</div><div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="Navigation menu">
<p class="caption" role="heading"><span class="caption-text">Table of Contents</span></p>
<ul class="current">
<li class="toctree-l1"><a class="reference internal" href="../../../index.html">Home</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../introduction/index.html">Introduction</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../quickstart/index.html">Getting Started</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../contributing/index.html">Contributing</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../introduction/inviolables.html">The Inviolable Principles of NuttX</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../platforms/index.html">Supported Platforms</a></li>
<li class="toctree-l1 current"><a class="reference internal" href="../../index.html">OS Components</a><ul class="current">
<li class="toctree-l2"><a class="reference internal" href="../../binfmt.html">Binary Loader</a></li>
<li class="toctree-l2 current"><a class="reference internal" href="../index.html">Device Drivers</a><ul class="current">
<li class="toctree-l3"><a class="reference internal" href="../character/index.html">Character Device Drivers</a></li>
<li class="toctree-l3"><a class="reference internal" href="../block/index.html">Block Device Drivers</a></li>
<li class="toctree-l3 current"><a class="reference internal" href="index.html">Specialized Device Drivers</a><ul class="current">
<li class="toctree-l4"><a class="reference internal" href="audio.html">Audio Device Drivers</a></li>
<li class="toctree-l4"><a class="reference internal" href="clk.html">Clock management (CLK)</a></li>
<li class="toctree-l4"><a class="reference internal" href="devicetree.html">Device Tree support</a></li>
<li class="toctree-l4"><a class="reference internal" href="devmem.html">DEVMEM Drivers</a></li>
<li class="toctree-l4"><a class="reference internal" href="dma.html">DMA Drivers</a></li>
<li class="toctree-l4"><a class="reference internal" href="framebuffer.html">Frame Buffer Drivers</a></li>
<li class="toctree-l4"><a class="reference internal" href="i2c.html">I2C Device Drivers</a></li>
<li class="toctree-l4"><a class="reference internal" href="i3c.html">I3C Device Drivers</a></li>
<li class="toctree-l4"><a class="reference internal" href="ioexpander.html">IO Expander Device Drivers</a></li>
<li class="toctree-l4 current"><a class="current reference internal" href="#">LCD Character Drivers</a><ul>
<li class="toctree-l5"><a class="reference internal" href="#binding">Binding</a></li>
<li class="toctree-l5"><a class="reference internal" href="#supported-devices">Supported devices</a></li>
<li class="toctree-l5"><a class="reference internal" href="#examples">Examples</a></li>
<li class="toctree-l5"><a class="reference internal" href="#lcd-header-files">LCD Header files</a></li>
</ul>
</li>
<li class="toctree-l4"><a class="reference internal" href="mtd.html">Memory Technology Device Drivers</a></li>
<li class="toctree-l4"><a class="reference internal" href="regmap.html">drivers/regmap</a></li>
<li class="toctree-l4"><a class="reference internal" href="reset.html">Reset Driver</a></li>
<li class="toctree-l4"><a class="reference internal" href="rptun.html">Remote Proc Tunnel Drivers</a></li>
<li class="toctree-l4"><a class="reference internal" href="rwbuffer.html"><code class="docutils literal notranslate"><span class="pre">rwbuffer.c</span></code></a></li>
<li class="toctree-l4"><a class="reference internal" href="sensors.html">Sensor Drivers</a></li>
<li class="toctree-l4"><a class="reference internal" href="segger.html">Segger RTT drivers</a></li>
<li class="toctree-l4"><a class="reference internal" href="spi.html">SPI Device Drivers</a></li>
<li class="toctree-l4"><a class="reference internal" href="syslog.html">SYSLOG</a></li>
<li class="toctree-l4"><a class="reference internal" href="sdio.html">SDIO Device Drivers</a></li>
<li class="toctree-l4"><a class="reference internal" href="usbdev.html">USB Device-Side Drivers</a></li>
<li class="toctree-l4"><a class="reference internal" href="usbhost.html">USB Host-Side Drivers</a></li>
<li class="toctree-l4"><a class="reference internal" href="usbmisc.html">USB Miscellaneous Drivers</a></li>
<li class="toctree-l4"><a class="reference internal" href="usbmonitor.html">USB Monitor support</a></li>
<li class="toctree-l4"><a class="reference internal" href="usrsock.html">Usrsock Driver</a></li>
<li class="toctree-l4"><a class="reference internal" href="mmcsd.html">MMCSD Device Drivers</a></li>
<li class="toctree-l4"><a class="reference internal" href="net/index.html">Network interface drivers</a></li>
<li class="toctree-l4"><a class="reference internal" href="pci/index.html">PCI(e) Bus Drivers</a></li>
<li class="toctree-l4"><a class="reference internal" href="pinctrl.html">Pinctrl Device Drivers</a></li>
<li class="toctree-l4"><a class="reference internal" href="pipes.html">FIFO and named pipe drivers</a></li>
<li class="toctree-l4"><a class="reference internal" href="power/index.html">Power-related Drivers</a></li>
<li class="toctree-l4"><a class="reference internal" href="virtio.html">Virtio Device Drivers</a></li>
<li class="toctree-l4"><a class="reference internal" href="video.html">Video Device Drivers</a></li>
<li class="toctree-l4"><a class="reference internal" href="wireless.html">Wireless Drivers</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="../thermal/index.html">Thermal Framework</a></li>
<li class="toctree-l3"><a class="reference internal" href="../index.html#lower-half-and-upper-half">Lower-half and upper-half</a></li>
<li class="toctree-l3"><a class="reference internal" href="../index.html#subdirectories-of-nuttx-drivers">Subdirectories of <code class="docutils literal notranslate"><span class="pre">nuttx/drivers</span></code></a></li>
<li class="toctree-l3"><a class="reference internal" href="../index.html#skeleton-files">Skeleton Files</a></li>
<li class="toctree-l3"><a class="reference internal" href="../index.html#drivers-early-initialization">Drivers Early Initialization</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="../../nxflat.html">NXFLAT</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../nxgraphics/index.html">NX Graphics Subsystem</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../paging.html">On-Demand Paging</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../audio/index.html">Audio Subsystem</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../filesystem/index.html">NuttX File System</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../libs/index.html">NuttX libraries</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../net/index.html">Network Support</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../mm/index.html">Memory Management</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../syscall.html">Syscall Layer</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../tools/index.html"><code class="docutils literal notranslate"><span class="pre">/tools</span></code> Host Tools</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../arch/index.html">Architecture-Specific Code</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../boards.html">Boards Support</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../cmake.html">CMake Support</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../openamp.html">OpenAMP Support</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../video.html">Video Subsystem</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../crypto.html">Crypto API Subsystem</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../wireless.html">Wireless Subsystem</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="../../../applications/index.html">Applications</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../implementation/index.html">Implementation Details</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../reference/index.html">API Reference</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../faq/index.html">FAQ</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../debugging/index.html">Debugging</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../guides/index.html">Guides</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../glossary.html">Glossary</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../logos/index.html">NuttX Logos</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../_tags/tagsindex.html">Tags</a></li>
</ul>
</div>
</div>
</nav>
<section data-toggle="wy-nav-shift" class="wy-nav-content-wrap"><nav class="wy-nav-top" aria-label="Mobile navigation menu" >
<i data-toggle="wy-nav-top" class="fa fa-bars"></i>
<a href="../../../index.html">NuttX</a>
</nav>
<div class="wy-nav-content">
<div class="rst-content">
<div role="navigation" aria-label="Page navigation">
<ul class="wy-breadcrumbs">
<li><a href="../../../index.html" class="icon icon-home" aria-label="Home"></a></li>
<li class="breadcrumb-item"><a href="../../index.html">OS Components</a></li>
<li class="breadcrumb-item"><a href="../index.html">Device Drivers</a></li>
<li class="breadcrumb-item"><a href="index.html">Specialized Device Drivers</a></li>
<li class="breadcrumb-item active">LCD Character Drivers</li>
<li class="wy-breadcrumbs-aside">
<a href="https://github.com/apache/nuttx/blob/master/Documentation/components/drivers/special/lcd.rst" class="fa fa-github"> Edit on GitHub</a>
</li>
</ul>
<hr/>
</div>
<div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
<div itemprop="articleBody">
<div class="admonition note">
<p class="admonition-title">Note</p>
<p>See also the usage of the LCD driver in the graphics/ directory.</p>
</div>
<section id="lcd-character-drivers">
<h1>LCD Character Drivers<a class="headerlink" href="#lcd-character-drivers" title="Permalink to this heading"></a></h1>
<p>The LCD driver exposes the LCD interface to userspace via <code class="docutils literal notranslate"><span class="pre">ioctl()</span></code> commands.</p>
<p>The LCD driver is intended to be used in the following scenarios:</p>
<ul class="simple">
<li><dl class="simple">
<dt>On memory-constrained devices, as it doesn’t require a buffer to represent</dt><dd><p>the whole display:</p>
<ul>
<li><p>Hence, it’s an alternative to the <a class="reference internal" href="framebuffer.html"><span class="doc">Frame Buffer Drivers</span></a></p></li>
</ul>
</dd>
</dl>
</li>
<li><p>For graphics libraries that draw specific areas of the displays, like <code class="docutils literal notranslate"><span class="pre">LVGL</span></code></p></li>
</ul>
<section id="binding">
<h2>Binding<a class="headerlink" href="#binding" title="Permalink to this heading"></a></h2>
<p>LCD drivers usually are not directly accessed by user code, but are usually
bound to another, higher-level device driver. In general, the binding sequence is:</p>
<ol class="arabic simple">
<li><p>Get an instance of <code class="docutils literal notranslate"><span class="pre">struct</span> <span class="pre">lcd_dev_s</span></code> from the hardware-specific LCD screen driver, and</p></li>
<li><p>Provide that instance to the initialization method of the higher-level character driver.</p></li>
</ol>
<section id="generic-lcd-character-driver">
<span id="genericlcdlcd"></span><h3>Generic LCD Character Driver<a class="headerlink" href="#generic-lcd-character-driver" title="Permalink to this heading"></a></h3>
<p>This example will walk through the path from userspace to hardware-specific
details on how an LCD screen is bound to an LCD character driver.</p>
<ul>
<li><dl class="simple">
<dt><code class="docutils literal notranslate"><span class="pre">include/nuttx/lcd/lcd.h</span></code> provides all structures and APIs needed to work</dt><dd><p>with LCD screens drivers:</p>
<ul class="simple">
<li><p>This header file also depends on some of the same definitions used for the
frame buffer driver as provided in <code class="docutils literal notranslate"><span class="pre">include/nuttx/video/fb.h</span></code></p></li>
</ul>
</dd>
</dl>
</li>
<li><dl class="simple">
<dt><code class="docutils literal notranslate"><span class="pre">drivers/lcd/lcd_dev.c</span></code> is the higher-level device driver. An instance of</dt><dd><p><code class="docutils literal notranslate"><span class="pre">struct</span> <span class="pre">lcd_dev_s</span></code> will be provided to it:</p>
<ul class="simple">
<li><p><code class="docutils literal notranslate"><span class="pre">include/nuttx/lcd/lcd_dev.h</span></code> prototypes public structures and functions;</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">lcddev_register</span></code> registers the LCD character driver as <code class="docutils literal notranslate"><span class="pre">/dev/lcdN</span></code>
where N is the display number and,</p></li>
<li><p>calls the <code class="docutils literal notranslate"><span class="pre">board_lcd_getdev</span></code>, an LCD-specific function usually defined in
<code class="docutils literal notranslate"><span class="pre">boards/&lt;arch&gt;/&lt;chip&gt;/&lt;board&gt;/src</span></code> and prototyped in <code class="docutils literal notranslate"><span class="pre">include/nuttx/board.h</span></code></p></li>
</ul>
</dd>
</dl>
</li>
<li><p>Finally, the LCD screen drivers are usually available at <code class="docutils literal notranslate"><span class="pre">drivers/lcd/</span></code> and
implement the callbacks defined at <code class="docutils literal notranslate"><span class="pre">include/nuttx/lcd/lcd.h</span></code>:</p>
<blockquote>
<div><ul class="simple">
<li><p><code class="docutils literal notranslate"><span class="pre">include/nuttx/lcd/lcd.h</span></code> provides structures and APIs needed to work
with LCD screens, whether using the framebuffer adapter or the <a class="reference internal" href="#"><span class="doc">LCD Character Drivers</span></a>;</p></li>
</ul>
</div></blockquote>
</li>
</ul>
</section>
</section>
<section id="supported-devices">
<h2>Supported devices<a class="headerlink" href="#supported-devices" title="Permalink to this heading"></a></h2>
<p>Reusable LCD drivers reside in the drivers/lcd directory:</p>
<section id="lcds">
<h3>LCDs<a class="headerlink" href="#lcds" title="Permalink to this heading"></a></h3>
<ul>
<li><p><code class="docutils literal notranslate"><span class="pre">mio283qt2.c</span></code></p>
<p>This is a driver for the MI0283QT-2 LCD from Multi-Inno
Technology Co., Ltd. This LCD is based on the Himax HX8347-D LCD
controller.</p>
</li>
<li><p><code class="docutils literal notranslate"><span class="pre">mio283qt9a.c</span></code></p>
<p>This is a driver for the MI0283QT-9A LCD from Multi-Inno
Technology Co., Ltd. This LCD is based on the Ilitek ILI9341 LCD
controller.</p>
</li>
<li><p><code class="docutils literal notranslate"><span class="pre">ssd12989.c</span></code></p>
<p>Generic LCD driver for LCDs based on the Solomon Systech
SSD1289 LCD controller. Think of this as a template for an LCD driver
that you will probably have to customize for any particular LCD
hardware. (See also boards/arm/stm32/hymini-stm32v/src/ssd1289.c below).</p>
</li>
<li><p><code class="docutils literal notranslate"><span class="pre">st7567.c</span></code></p>
<p>LCD Display Module, ST7567, Univision Technology Inc.
Used with the LPCXpresso and Embedded Artists base board.</p>
</li>
<li><p><code class="docutils literal notranslate"><span class="pre">memlcd.c</span></code></p>
<p>Sharp Memory LCD Suite, LS013B7DH01, LS013B7DH03, etc.
There are some more different models, they are basically controlled
by similar logics, thus this driver can be extended.</p>
</li>
<li><p><code class="docutils literal notranslate"><span class="pre">ra8875.c</span></code></p>
<p>RAiO Technologies RA8875 LCD controller. Contributed by Marten Svanfeldt.</p>
</li>
</ul>
</section>
<section id="oleds">
<h3>OLEDs<a class="headerlink" href="#oleds" title="Permalink to this heading"></a></h3>
<ul>
<li><p><code class="docutils literal notranslate"><span class="pre">p14201.c</span></code></p>
<p>Driver for RiT P14201 series display with SD1329 IC controller.
Based on the SD1329 controller. This OLED is used with
older versions of the TI/Luminary LM3S8962 Evaluation Kit. Example
usage:</p>
<div class="highlight-none notranslate"><div class="highlight"><pre><span></span>boards/arm/tiva/lm3s6965-ek/src
boards/arm/tiva/lm3s8962-ek/src
</pre></div>
</div>
</li>
<li><p><code class="docutils literal notranslate"><span class="pre">ug-2864ambag01.c</span></code></p>
<p>OLED Display Module, UUG-2864AMBAG01, Univision Technology Inc.
Based on the SH1101A controller. Example usage:</p>
<div class="highlight-none notranslate"><div class="highlight"><pre><span></span>boards/arm/stm32/stm32f4discovery
boards/arm/lpc214x/zp214xpa
</pre></div>
</div>
</li>
<li><p><code class="docutils literal notranslate"><span class="pre">ug-9664hswag01.c</span></code></p>
<p>OLED Display Module, UG-9664HSWAG01, Univision Technology Inc.
Based on the SSD1305 controller. Used with the
LPC Xpresso and Embedded Artists base board. Example usage:</p>
<div class="highlight-none notranslate"><div class="highlight"><pre><span></span>boards/arm/lpc71xx_40xx/lpcxpresso-lpc1768
</pre></div>
</div>
</li>
<li><p><code class="docutils literal notranslate"><span class="pre">ssd1306.c</span></code></p>
<p>OLED Display Modules based on the SSD1306 controllers.
This includes the UG-2864HSWEG01 and UG2832HSWEG04, both from Univision
Technology Inc. The latter is used with the OLED1 module that comes
with the Atmel SAM4l Xplained Pro board. This driver also supports
Densitron Technologies DD-12864WO-4A which is based on SSD1309 LCD
controller. Example usage:</p>
<div class="highlight-none notranslate"><div class="highlight"><pre><span></span>boards/arm/stm32/stm32f4discovery
boards/arm/sam34/sam4l-xplained
</pre></div>
</div>
</li>
</ul>
</section>
<section id="segment-lcds-slcds">
<h3>Segment LCDS (SLCDs)<a class="headerlink" href="#segment-lcds-slcds" title="Permalink to this heading"></a></h3>
<ul>
<li><p><code class="docutils literal notranslate"><span class="pre">pcf8574_lcd_backpack.c</span></code></p>
<p>See pcf8574_lcd_backpack_readme.txt.</p>
</li>
</ul>
</section>
</section>
<section id="examples">
<h2>Examples<a class="headerlink" href="#examples" title="Permalink to this heading"></a></h2>
<p>Examples apply to specific cases of the <a class="reference internal" href="#genericlcdlcd"><span class="std std-ref">Generic LCD Character Driver</span></a>:</p>
<section id="ttgo-t-display-esp32-board">
<span id="ttgotdisplayesp32-lcd"></span><h3>TTGO T-Display ESP32 board<a class="headerlink" href="#ttgo-t-display-esp32-board" title="Permalink to this heading"></a></h3>
<p>This board contains an ST7789 TFT Display (135x240).
By selecting the <code class="docutils literal notranslate"><span class="pre">ttgo_t_display_esp32:lvgl_lcd</span></code> config, the <code class="docutils literal notranslate"><span class="pre">lvgldemo</span></code>
example will be built with the LCD character interface.</p>
<ul class="simple">
<li><p><code class="docutils literal notranslate"><span class="pre">boards/xtensa/esp32/ttgo_t_display_esp32/src/esp32_bringup.c</span></code> registers the
LCD character driver:</p></li>
</ul>
<div class="highlight-c notranslate"><div class="highlight"><pre><span></span><span class="cp">#ifdef CONFIG_LCD_DEV</span>
<span class="w"> </span><span class="n">ret</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">board_lcd_initialize</span><span class="p">();</span>
<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">ret</span><span class="w"> </span><span class="o">&lt;</span><span class="w"> </span><span class="mi">0</span><span class="p">)</span>
<span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="n">syslog</span><span class="p">(</span><span class="n">LOG_ERR</span><span class="p">,</span><span class="w"> </span><span class="s">&quot;ERROR: board_lcd_initialize() failed: %d</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">,</span><span class="w"> </span><span class="n">ret</span><span class="p">);</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="n">ret</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">lcddev_register</span><span class="p">(</span><span class="mi">0</span><span class="p">);</span>
<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">ret</span><span class="w"> </span><span class="o">&lt;</span><span class="w"> </span><span class="mi">0</span><span class="p">)</span>
<span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="n">syslog</span><span class="p">(</span><span class="n">LOG_ERR</span><span class="p">,</span><span class="w"> </span><span class="s">&quot;ERROR: lcddev_register() failed: %d</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">,</span><span class="w"> </span><span class="n">ret</span><span class="p">);</span>
<span class="w"> </span><span class="p">}</span>
<span class="cp">#endif</span>
</pre></div>
</div>
<ul>
<li><p><code class="docutils literal notranslate"><span class="pre">board_lcd_initialize</span></code> and <code class="docutils literal notranslate"><span class="pre">board_lcd_getdev</span></code> are defined at
<code class="docutils literal notranslate"><span class="pre">boards/xtensa/esp32/common/src/esp32_st7789.c</span></code>;</p>
<blockquote>
<div><ul class="simple">
<li><p><code class="docutils literal notranslate"><span class="pre">board_lcd_initialize</span></code> initializes the LCD hardware on the board by
defining the SPI interface which is connected to the display controller;</p></li>
</ul>
</div></blockquote>
</li>
<li><p><code class="docutils literal notranslate"><span class="pre">lcddev_register</span></code> then calls <code class="docutils literal notranslate"><span class="pre">board_lcd_getdev</span></code>:</p>
<blockquote>
<div><ul class="simple">
<li><p><code class="docutils literal notranslate"><span class="pre">board_lcd_getdev</span></code> calls the <code class="docutils literal notranslate"><span class="pre">st7789_lcdinitialize</span></code> and returns a
reference to the LCD object for the specified LCD;</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">st7789_lcdinitialize</span></code> is part of the LCD screen driver at
<code class="docutils literal notranslate"><span class="pre">drivers/lcd/st7789.c</span></code>;</p></li>
</ul>
</div></blockquote>
</li>
<li><p>The LVGL demo application (<code class="docutils literal notranslate"><span class="pre">lvgldemo</span></code>) makes use of the <code class="docutils literal notranslate"><span class="pre">ioctl</span></code> system
call to trigger an <code class="docutils literal notranslate"><span class="pre">LCDDEVIO_PUTAREA</span></code> request to the higher-level device
driver to refresh the LCD screen with data:</p></li>
</ul>
<div class="highlight-c notranslate"><div class="highlight"><pre><span></span><span class="n">ioctl</span><span class="p">(</span><span class="n">state</span><span class="p">.</span><span class="n">fd</span><span class="p">,</span><span class="w"> </span><span class="n">LCDDEVIO_PUTAREA</span><span class="p">,</span><span class="w"> </span><span class="p">(</span><span class="kt">unsigned</span><span class="w"> </span><span class="kt">long</span><span class="p">)((</span><span class="kt">uintptr_t</span><span class="p">)</span><span class="o">&amp;</span><span class="n">lcd_area</span><span class="p">));;</span>
</pre></div>
</div>
</section>
<section id="nuttx-simulator">
<h3>NuttX Simulator<a class="headerlink" href="#nuttx-simulator" title="Permalink to this heading"></a></h3>
<dl class="simple">
<dt><a class="reference internal" href="../../../platforms/sim/sim/index.html"><span class="doc">NuttX Simulator</span></a> provides a X11-based LCD</dt><dd><p>character driver to simulate the LCD character displat usage into a
X11-compatible host.</p>
</dd>
</dl>
<p>By selecting the <code class="docutils literal notranslate"><span class="pre">sim:lvgl_lcd</span></code> config, the <code class="docutils literal notranslate"><span class="pre">lvgldemo</span></code> example will be
built with the LCD character interface.</p>
<ul>
<li><p><code class="docutils literal notranslate"><span class="pre">boards/sim/sim/sim/src/sim_bringup.c</span></code> registers the lcd driver the
same way <a class="reference internal" href="#ttgotdisplayesp32-lcd"><span class="std std-ref">TTGO T-Display ESP32 board</span></a>;</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">arch/sim/src/sim/up_lcd.c</span></code> and <code class="docutils literal notranslate"><span class="pre">arch/sim/src/sim/up_x11framebuffer.c</span></code>
will be built as <code class="docutils literal notranslate"><span class="pre">CONFIG_SIM_LCDDRIVER</span> <span class="pre">=</span> <span class="pre">y</span></code> and <code class="docutils literal notranslate"><span class="pre">CONFIG_SIM_X11FB</span> <span class="pre">=</span> <span class="pre">y</span></code>
are set, respectively;</p>
<blockquote>
<div><ul>
<li><p><code class="docutils literal notranslate"><span class="pre">up_lcd.c</span></code> provides <code class="docutils literal notranslate"><span class="pre">board_lcd_initialize</span></code> and <code class="docutils literal notranslate"><span class="pre">board_lcd_getdev</span></code>:</p>
<blockquote>
<div><ul class="simple">
<li><p><code class="docutils literal notranslate"><span class="pre">board_lcd_initialize</span></code> calls <code class="docutils literal notranslate"><span class="pre">up_x11initialize</span></code> from
<code class="docutils literal notranslate"><span class="pre">up_x11framebuffer.c</span></code> that initializes a X11-based window as an LCD
character device. This is the underlying “driver”.</p></li>
</ul>
</div></blockquote>
</li>
</ul>
</div></blockquote>
</li>
<li><p>The LVGL demo application (<code class="docutils literal notranslate"><span class="pre">lvgldemo</span></code>) makes use of the <code class="docutils literal notranslate"><span class="pre">ioctl</span></code> system
call to trigger an <code class="docutils literal notranslate"><span class="pre">LCDDEVIO_PUTAREA</span></code> request to the higher-level device
driver to refresh the LCD screen with data as usual;</p></li>
</ul>
</section>
</section>
<section id="lcd-header-files">
<h2>LCD Header files<a class="headerlink" href="#lcd-header-files" title="Permalink to this heading"></a></h2>
<p><code class="docutils literal notranslate"><span class="pre">include/nuttx/lcd/lcd.h</span></code></p>
<blockquote>
<div><p>Structures and APIs needed to work with LCD drivers are provided in
this header file. This header file also depends on some of the same
definitions used for the frame buffer driver as provided in
include/nuttx/video/fb.h.</p>
</div></blockquote>
<p><code class="docutils literal notranslate"><span class="pre">struct</span> <span class="pre">lcd_dev_s</span></code></p>
<blockquote>
<div><p>Each LCD device driver must implement an instance of struct lcd_dev_s.
That structure defines a call table with the following methods:</p>
<ul>
<li><p>Get information about the LCD video controller configuration and the
configuration of each LCD color plane.</p>
<div class="highlight-C notranslate"><div class="highlight"><pre><span></span><span class="kt">int</span><span class="w"> </span><span class="p">(</span><span class="o">*</span><span class="n">getvideoinfo</span><span class="p">)(</span><span class="n">FAR</span><span class="w"> </span><span class="k">struct</span><span class="w"> </span><span class="nc">lcd_dev_s</span><span class="w"> </span><span class="o">*</span><span class="n">dev</span><span class="p">,</span>
<span class="w"> </span><span class="n">FAR</span><span class="w"> </span><span class="k">struct</span><span class="w"> </span><span class="nc">fb_videoinfo_s</span><span class="w"> </span><span class="o">*</span><span class="n">vinfo</span><span class="p">);</span>
<span class="kt">int</span><span class="w"> </span><span class="p">(</span><span class="o">*</span><span class="n">getplaneinfo</span><span class="p">)(</span><span class="n">FAR</span><span class="w"> </span><span class="k">struct</span><span class="w"> </span><span class="nc">lcd_dev_s</span><span class="w"> </span><span class="o">*</span><span class="n">dev</span><span class="p">,</span><span class="w"> </span><span class="kt">unsigned</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">planeno</span><span class="p">,</span>
<span class="w"> </span><span class="n">FAR</span><span class="w"> </span><span class="k">struct</span><span class="w"> </span><span class="nc">lcd_planeinfo_s</span><span class="w"> </span><span class="o">*</span><span class="n">pinfo</span><span class="p">);</span>
</pre></div>
</div>
</li>
<li><p>The following are provided only if the video hardware supports RGB
color mapping:</p>
<blockquote>
<div><div class="highlight-C notranslate"><div class="highlight"><pre><span></span><span class="kt">int</span><span class="w"> </span><span class="p">(</span><span class="o">*</span><span class="n">getcmap</span><span class="p">)(</span><span class="n">FAR</span><span class="w"> </span><span class="k">struct</span><span class="w"> </span><span class="nc">lcd_dev_s</span><span class="w"> </span><span class="o">*</span><span class="n">dev</span><span class="p">,</span>
<span class="w"> </span><span class="n">FAR</span><span class="w"> </span><span class="k">struct</span><span class="w"> </span><span class="nc">fb_cmap_s</span><span class="w"> </span><span class="o">*</span><span class="n">cmap</span><span class="p">);</span>
<span class="kt">int</span><span class="w"> </span><span class="p">(</span><span class="o">*</span><span class="n">putcmap</span><span class="p">)(</span><span class="n">FAR</span><span class="w"> </span><span class="k">struct</span><span class="w"> </span><span class="nc">lcd_dev_s</span><span class="w"> </span><span class="o">*</span><span class="n">dev</span><span class="p">,</span>
<span class="w"> </span><span class="n">FAR</span><span class="w"> </span><span class="k">const</span><span class="w"> </span><span class="k">struct</span><span class="w"> </span><span class="nc">fb_cmap_s</span><span class="w"> </span><span class="o">*</span><span class="n">cmap</span><span class="p">);</span>
</pre></div>
</div>
</div></blockquote>
</li>
<li><p>The following are provided only if the video hardware supports a
hardware cursor:</p>
<blockquote>
<div><div class="highlight-C notranslate"><div class="highlight"><pre><span></span><span class="kt">int</span><span class="w"> </span><span class="p">(</span><span class="o">*</span><span class="n">getcursor</span><span class="p">)(</span><span class="n">FAR</span><span class="w"> </span><span class="k">struct</span><span class="w"> </span><span class="nc">lcd_dev_s</span><span class="w"> </span><span class="o">*</span><span class="n">dev</span><span class="p">,</span>
<span class="w"> </span><span class="n">FAR</span><span class="w"> </span><span class="k">struct</span><span class="w"> </span><span class="nc">fb_cursorattrib_s</span><span class="w"> </span><span class="o">*</span><span class="n">attrib</span><span class="p">);</span>
<span class="kt">int</span><span class="w"> </span><span class="p">(</span><span class="o">*</span><span class="n">setcursor</span><span class="p">)(</span><span class="n">FAR</span><span class="w"> </span><span class="k">struct</span><span class="w"> </span><span class="nc">lcd_dev_s</span><span class="w"> </span><span class="o">*</span><span class="n">dev</span><span class="p">,</span>
<span class="w"> </span><span class="n">FAR</span><span class="w"> </span><span class="k">struct</span><span class="w"> </span><span class="nc">fb_setcursor_s</span><span class="w"> </span><span class="o">*</span><span class="n">settings</span><span class="p">);</span>
</pre></div>
</div>
</div></blockquote>
</li>
<li><p>Get the LCD panel power status (0: full off - CONFIG_LCD_MAXPOWER:
full on). On backlit LCDs, this setting may correspond to the
backlight setting:</p>
<blockquote>
<div><div class="highlight-C notranslate"><div class="highlight"><pre><span></span><span class="kt">int</span><span class="w"> </span><span class="p">(</span><span class="o">*</span><span class="n">getpower</span><span class="p">)(</span><span class="k">struct</span><span class="w"> </span><span class="nc">lcd_dev_s</span><span class="w"> </span><span class="o">*</span><span class="n">dev</span><span class="p">);</span>
</pre></div>
</div>
</div></blockquote>
</li>
<li><p>Enable/disable LCD panel power (0: full off - CONFIG_LCD_MAXPOWER:
full on). On backlit LCDs, this setting may correspond to the
backlight setting:</p>
<blockquote>
<div><div class="highlight-C notranslate"><div class="highlight"><pre><span></span><span class="kt">int</span><span class="w"> </span><span class="p">(</span><span class="o">*</span><span class="n">setpower</span><span class="p">)(</span><span class="k">struct</span><span class="w"> </span><span class="nc">lcd_dev_s</span><span class="w"> </span><span class="o">*</span><span class="n">dev</span><span class="p">,</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">power</span><span class="p">);</span>
</pre></div>
</div>
</div></blockquote>
</li>
<li><p>Get the current contrast setting (0-CONFIG_LCD_MAXCONTRAST):</p>
<blockquote>
<div><div class="highlight-C notranslate"><div class="highlight"><pre><span></span><span class="kt">int</span><span class="w"> </span><span class="p">(</span><span class="o">*</span><span class="n">getcontrast</span><span class="p">)(</span><span class="k">struct</span><span class="w"> </span><span class="nc">lcd_dev_s</span><span class="w"> </span><span class="o">*</span><span class="n">dev</span><span class="p">);</span>
</pre></div>
</div>
</div></blockquote>
</li>
<li><p>Set LCD panel contrast (0-CONFIG_LCD_MAXCONTRAST):</p>
<blockquote>
<div><div class="highlight-C notranslate"><div class="highlight"><pre><span></span><span class="kt">int</span><span class="w"> </span><span class="p">(</span><span class="o">*</span><span class="n">setcontrast</span><span class="p">)(</span><span class="k">struct</span><span class="w"> </span><span class="nc">lcd_dev_s</span><span class="w"> </span><span class="o">*</span><span class="n">dev</span><span class="p">,</span><span class="w"> </span><span class="kt">unsigned</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">contrast</span><span class="p">);</span>
</pre></div>
</div>
</div></blockquote>
</li>
</ul>
</div></blockquote>
</section>
</section>
</div>
</div>
<footer><div class="rst-footer-buttons" role="navigation" aria-label="Footer">
<a href="ioexpander.html" class="btn btn-neutral float-left" title="IO Expander Device Drivers" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left" aria-hidden="true"></span> Previous</a>
<a href="mtd.html" class="btn btn-neutral float-right" title="Memory Technology Device Drivers" accesskey="n" rel="next">Next <span class="fa fa-arrow-circle-right" aria-hidden="true"></span></a>
</div>
<hr/>
<div role="contentinfo">
<p>&#169; Copyright 2023, The Apache Software Foundation.</p>
</div>
</footer>
</div>
</div>
</section>
</div>
<script>
jQuery(function () {
SphinxRtdTheme.Navigation.enable(true);
});
</script>
</body>
</html>