blob: 80eca75fa563d5cfd381410dc585eafdc1036461 [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.18.1: http://docutils.sourceforge.net/" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Frame Buffer 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/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/js/theme.js"></script>
<link rel="index" title="Index" href="../../../genindex.html" />
<link rel="search" title="Search" href="../../../search.html" />
<link rel="next" title="I2C Device Drivers" href="i2c.html" />
<link rel="prev" title="DMA Drivers" href="dma.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 current"><a class="current reference internal" href="#">Frame Buffer 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="#vsync">VSYNC</a></li>
<li class="toctree-l5"><a class="reference internal" href="#examples">Examples</a></li>
</ul>
</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="ioexpander.html">IO Expander Device Drivers</a></li>
<li class="toctree-l4"><a class="reference internal" href="lcd.html">LCD Character Drivers</a></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="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="../../../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>
</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">Frame Buffer Drivers</li>
<li class="wy-breadcrumbs-aside">
<a href="../../../_sources/components/drivers/special/framebuffer.rst.txt" rel="nofollow"> View page source</a>
</li>
</ul>
<hr/>
</div>
<div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
<div itemprop="articleBody">
<section id="frame-buffer-drivers">
<h1>Frame Buffer Drivers<a class="headerlink" href="#frame-buffer-drivers" title="Permalink to this heading"></a></h1>
<p>A framebuffer is a memory-mapped buffer that represents all the pixels necessary to drive a video display.</p>
<p>The Frame Buffer driver is intended to be used in the following scenarios:</p>
<ol class="arabic simple">
<li><p>Whenever it is necessary to hold all the pixels that would be used to drive a video display. This includes:</p>
<ol class="arabic simple">
<li><p>Graphics libraries that directly access the underlying framebuffer;</p></li>
<li><p>Advanced UIs (e.g. alpha blending) that need to read back the image data;</p></li>
</ol>
</li>
<li><p>Applications that expect the framebuffer to exist;</p></li>
</ol>
<section id="binding">
<h2>Binding<a class="headerlink" href="#binding" title="Permalink to this heading"></a></h2>
<p>LCD and frame buffer 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">fb_vtable_s</span></code> from the hardware-specific frame buffer device driver, and</p></li>
<li><p>Provide that instance to the initialization method of the higher-level device driver.</p></li>
</ol>
<section id="generic-lcd-frame-buffer">
<span id="genericlcdfb"></span><h3>Generic LCD Frame Buffer<a class="headerlink" href="#generic-lcd-frame-buffer" 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 a framebuffer.</p>
<ol class="arabic">
<li><p><code class="docutils literal notranslate"><span class="pre">include/nuttx/video/fb.h</span></code> provides all structures and APIs needed to work with frame buffer drivers:</p>
<ol class="arabic simple">
<li><p><code class="docutils literal notranslate"><span class="pre">drivers/video/fb.c</span></code> is the higher-level device driver. An instance of <code class="docutils literal notranslate"><span class="pre">struct</span> <span class="pre">fb_vtable_s</span></code> will be provided to it;</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">fb_register</span></code> registers the framebuffer character device at <code class="docutils literal notranslate"><span class="pre">/dev/fbN</span></code> where N is the display number;</p></li>
<li><p>It also provides the prototype of <code class="docutils literal notranslate"><span class="pre">up_fbinitialize</span></code>, which may be defined by:</p>
<ol class="arabic simple">
<li><p>An specific device into <code class="docutils literal notranslate"><span class="pre">arch/&lt;arch&gt;/src/&lt;chip&gt;</span></code> directory;</p></li>
<li><p>By the LCD framebuffer adapter in <code class="docutils literal notranslate"><span class="pre">drivers/lcd/lcd_framebuffer.c</span></code>, which provides an intermediary interface between the Frame Buffer Driver and the LCD screen drivers;</p></li>
</ol>
</li>
</ol>
</li>
<li><p>Let’s consider we are using the LCD framebuffer (<code class="docutils literal notranslate"><span class="pre">CONFIG_LCD_FRAMEBUFFER</span> <span class="pre">=</span> <span class="pre">y</span></code>):</p>
<ol class="arabic simple">
<li><p>This interface implements the <code class="docutils literal notranslate"><span class="pre">up_fbinitialize</span></code> which:</p>
<ol class="arabic simple">
<li><p>Provides the instance of <code class="docutils literal notranslate"><span class="pre">struct</span> <span class="pre">fb_vtable_s</span></code> (a member of <code class="docutils literal notranslate"><span class="pre">struct</span> <span class="pre">lcdfb_dev_s</span></code>);</p></li>
<li><p>Calls <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> LCD-specific functions. These functions are 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>
</ol>
</li>
</ol>
</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><ol class="arabic 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, whereas using the framebuffer adapter or the <a class="reference internal" href="lcd.html"><span class="doc">LCD Character Drivers</span></a>;</p></li>
</ol>
</div></blockquote>
</li>
</ol>
</section>
</section>
<section id="vsync">
<h2>VSYNC<a class="headerlink" href="#vsync" title="Permalink to this heading"></a></h2>
<p>Vertical synchronization (VSync) synchronizes the frame rate of an application’s graphics with the refresh rate of the display, helping to establish stability.
If not synchronized, it may cause screen tearing, which is the effect of the image appearing to have horizontal jagged edges or ghosting across the entire screen.</p>
<section id="vsync-offset">
<h3>VSYNC Offset<a class="headerlink" href="#vsync-offset" title="Permalink to this heading"></a></h3>
<p>During the VSYNC event, the screen starts displaying frame N while the renderer begins compositing window for frame N+1.
The application processes waiting input and generates frame N+2.
When the renderer has a short rendering time, it can cause a delay of almost two frames from the end of rendering to the completion of screen display.
To solve this problem, <code class="docutils literal notranslate"><span class="pre">FBIOSET_VSYNCOFFSET</span></code> can be used to set the VSYNC offset time (in microseconds) and reduce the delay from input device to screen using the VSYNC offset.</p>
</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="#genericlcdfb"><span class="std std-ref">Generic LCD Frame Buffer</span></a>:</p>
<section id="ttgo-t-display-esp32-board">
<span id="ttgotdisplayesp32-fb"></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_fb</span></code> config, the <code class="docutils literal notranslate"><span class="pre">lvgldemo</span></code> example will be built with the framebuffer 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 framebuffer driver:</p></li>
</ul>
<div class="highlight-c notranslate"><div class="highlight"><pre><span></span><span class="cp">#ifdef CONFIG_VIDEO_FB</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">fb_register</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="w"> </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: Failed to initialize Frame Buffer Driver.</span><span class="se">\n</span><span class="s">&quot;</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">up_fbinitialize</span></code> from the frame buffer adapter will then be called as <code class="docutils literal notranslate"><span class="pre">CONFIG_LCD_FRAMEBUFFER</span> <span class="pre">=</span> <span class="pre">y</span></code>:</p>
<blockquote>
<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>
<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>
</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 a <code class="docutils literal notranslate"><span class="pre">FBIO_UPDATE</span></code> request to the higher-level device driver to refresh the LCD screen with framebuffer 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">FBIO_UPDATE</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">fb_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>
<p><a class="reference internal" href="../../../platforms/sim/sim/index.html"><span class="doc">NuttX Simulator</span></a> provides a X11-based framebuffer driver to simulate the framebuffer usage into a X11-compatible host.</p>
<p>By selecting the <code class="docutils literal notranslate"><span class="pre">sim:lvgl_fb</span></code> config, the <code class="docutils literal notranslate"><span class="pre">lvgldemo</span></code> example will be built with the framebuffer driver.</p>
<ul>
<li><p><code class="docutils literal notranslate"><span class="pre">boards/sim/sim/sim/src/sim_bringup.c</span></code> registers the framebuffer driver the same way <a class="reference internal" href="#ttgotdisplayesp32-fb"><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_framebuffer.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_FRAMEBUFFER</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 class="simple">
<li><p><code class="docutils literal notranslate"><span class="pre">up_framebuffer.c</span></code> provides <code class="docutils literal notranslate"><span class="pre">up_fbinitialize</span></code> and,</p></li>
<li><p>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 a framebuffer. This is the underlying “driver”.</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 a <code class="docutils literal notranslate"><span class="pre">FBIO_UPDATE</span></code> request to the higher-level device driver in order to refresh the LCD screen with framebuffer data as usual;</p></li>
</ul>
<div class="admonition warning">
<p class="admonition-title">Warning</p>
<p>One must consider that framebuffer requires that the entire display’s pixels to be represented.
Considering a 320x480 &#64;RGB565 LCD screen, that would be 300KiB, which it’d be too much for a memory-constrained device.</p>
<p>However, when memory is not a constraint, framebuffer may offer applications a faster way to update display contents once writing to the RAM-mapped buffer is faster than doing multiple SPI transfers.</p>
<p>For memory-constrained devices, consider using <a class="reference internal" href="lcd.html"><span class="doc">LCD Character Drivers</span></a>.</p>
</div>
</section>
</section>
</section>
</div>
</div>
<footer><div class="rst-footer-buttons" role="navigation" aria-label="Footer">
<a href="dma.html" class="btn btn-neutral float-left" title="DMA Drivers" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left" aria-hidden="true"></span> Previous</a>
<a href="i2c.html" class="btn btn-neutral float-right" title="I2C 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>