blob: 7bb4fe9c2fa30bf4af4ccee5eb8a1bcbd47871a8 [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>Changing the System Clock Configuration &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="Using Kernel Threads" href="usingkernelthreads.html" />
<link rel="prev" title="Device Tree" href="devicetree.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"><a class="reference internal" href="../components/index.html">OS Components</a></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 current"><a class="reference internal" href="index.html">Guides</a><ul class="current">
<li class="toctree-l2"><a class="reference internal" href="nfs.html">NFS Client How-To</a></li>
<li class="toctree-l2"><a class="reference internal" href="usbtrace.html">USB Device Trace</a></li>
<li class="toctree-l2"><a class="reference internal" href="simulator.html">Simulator</a></li>
<li class="toctree-l2"><a class="reference internal" href="rndis.html">How to use RNDIS</a></li>
<li class="toctree-l2"><a class="reference internal" href="drivers.html">Drivers</a></li>
<li class="toctree-l2"><a class="reference internal" href="cpp_cmake.html">C++ Example using CMake</a></li>
<li class="toctree-l2"><a class="reference internal" href="pysimcoder.html">pysimCoder integration with NuttX</a></li>
<li class="toctree-l2"><a class="reference internal" href="customboards.html">Custom Boards How-To</a></li>
<li class="toctree-l2"><a class="reference internal" href="customapps.html">Custom Apps How-to</a></li>
<li class="toctree-l2"><a class="reference internal" href="citests.html">Running CI Test Locally</a></li>
<li class="toctree-l2"><a class="reference internal" href="zerolatencyinterrupts.html">High Performance: Zero Latency Interrupts, Maskable Nested Interrupts</a></li>
<li class="toctree-l2"><a class="reference internal" href="fortify.html">Fortify</a></li>
<li class="toctree-l2"><a class="reference internal" href="nestedinterrupts.html">Nested Interrupts</a></li>
<li class="toctree-l2"><a class="reference internal" href="ofloader.html">Open Flash Loader</a></li>
<li class="toctree-l2"><a class="reference internal" href="testingtcpip.html">Testing TCP/IP Network Stacks</a></li>
<li class="toctree-l2"><a class="reference internal" href="automounter.html">Auto-Mounter</a></li>
<li class="toctree-l2"><a class="reference internal" href="stm32nullpointer.html">STM32 Null Pointer Detection</a></li>
<li class="toctree-l2"><a class="reference internal" href="stm32ccm.html">STM32 CCM Allocator</a></li>
<li class="toctree-l2"><a class="reference internal" href="etcromfs.html">etc romfs</a></li>
<li class="toctree-l2"><a class="reference internal" href="thread_local_storage.html">Thread Local Storage</a></li>
<li class="toctree-l2"><a class="reference internal" href="devicetree.html">Device Tree</a></li>
<li class="toctree-l2 current"><a class="current reference internal" href="#">Changing the System Clock Configuration</a><ul>
<li class="toctree-l3"><a class="reference internal" href="#question">Question</a></li>
<li class="toctree-l3"><a class="reference internal" href="#answer">Answer</a><ul>
<li class="toctree-l4"><a class="reference internal" href="#custom-clock-configuration">Custom Clock Configuration</a></li>
<li class="toctree-l4"><a class="reference internal" href="#peripheral-clocks">Peripheral Clocks</a></li>
<li class="toctree-l4"><a class="reference internal" href="#reinitializing-peripherals">Reinitializing Peripherals</a></li>
<li class="toctree-l4"><a class="reference internal" href="#variable-peripheral-clocking">Variable Peripheral Clocking</a></li>
<li class="toctree-l4"><a class="reference internal" href="#systick-timer">Systick Timer</a></li>
<li class="toctree-l4"><a class="reference internal" href="#up-mdelay">up_mdelay</a></li>
<li class="toctree-l4"><a class="reference internal" href="#power-management">Power Management</a><ul>
<li class="toctree-l5"><a class="reference internal" href="../components/drivers/special/power/pm/index.html">Power Management</a></li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="usingkernelthreads.html">Using Kernel Threads</a></li>
<li class="toctree-l2"><a class="reference internal" href="armv7m_runtimestackcheck.html">ARMv7-M Run Time Stack Checking</a></li>
<li class="toctree-l2"><a class="reference internal" href="include_files_board_h.html">Including Files in board.h</a></li>
<li class="toctree-l2"><a class="reference internal" href="specialstuff_in_nuttxheaderfiles.html">Why can’t I put my special stuff in NuttX header files?</a></li>
<li class="toctree-l2"><a class="reference internal" href="kernel_threads_with_custom_stacks.html">Kernel Threads with Custom Stacks</a></li>
<li class="toctree-l2"><a class="reference internal" href="versioning_and_task_names.html">Versioning and Task Names</a></li>
<li class="toctree-l2"><a class="reference internal" href="logging_rambuffer.html">Logging to a RAM Buffer</a></li>
<li class="toctree-l2"><a class="reference internal" href="ipv6.html">IPv6</a></li>
<li class="toctree-l2"><a class="reference internal" href="integrate_newlib.html">Integrating with Newlib</a></li>
<li class="toctree-l2"><a class="reference internal" href="protected_build.html">NuttX Protected Build</a></li>
<li class="toctree-l2"><a class="reference internal" href="platform_directories.html">Platform Directories</a></li>
<li class="toctree-l2"><a class="reference internal" href="port_drivers_to_stm32f7.html">Porting Drivers to the STM32 F7</a></li>
<li class="toctree-l2"><a class="reference internal" href="semihosting.html">Semihosting</a></li>
<li class="toctree-l2"><a class="reference internal" href="renode.html">Run NuttX on Renode</a></li>
<li class="toctree-l2"><a class="reference internal" href="signal_events_interrupt_handlers.html">Signaling Events from Interrupt Handlers</a></li>
<li class="toctree-l2"><a class="reference internal" href="signaling_sem_priority_inheritance.html">Signaling Semaphores and Priority Inheritance</a></li>
<li class="toctree-l2"><a class="reference internal" href="smaller_vector_tables.html">Smaller Vector Tables</a></li>
<li class="toctree-l2"><a class="reference internal" href="port.html">How to port</a></li>
<li class="toctree-l2"><a class="reference internal" href="updating_release_system_elf.html">Updating a Release System with ELF Programs</a></li>
<li class="toctree-l2"><a class="reference internal" href="partially_linked_elf.html">ELF Programs – With Symbol Tables</a></li>
<li class="toctree-l2"><a class="reference internal" href="fully_linked_elf.html">ELF Programs – No Symbol Tables</a></li>
<li class="toctree-l2"><a class="reference internal" href="building_nuttx_with_app_out_of_src_tree.html">Building NuttX with Applications Outside the Source Tree</a></li>
<li class="toctree-l2"><a class="reference internal" href="building_uclibcpp.html">Building uClibc++</a></li>
<li class="toctree-l2"><a class="reference internal" href="custom_app_directories.html">Custom Application Directories</a></li>
<li class="toctree-l2"><a class="reference internal" href="multiple_nsh_sessions.html">Multiple NSH Sessions</a></li>
<li class="toctree-l2"><a class="reference internal" href="nsh_network_link_management.html">NSH Network Link Management</a></li>
<li class="toctree-l2"><a class="reference internal" href="ram_rom_disks.html">RAM Disks and ROM Disks</a></li>
<li class="toctree-l2"><a class="reference internal" href="reading_can_msgs.html">Reading CAN Messages</a></li>
<li class="toctree-l2"><a class="reference internal" href="remove_device_drivers_nsh.html">Removing Device Drivers with NSH</a></li>
<li class="toctree-l2"><a class="reference internal" href="rust.html">Rust in NuttX</a></li>
<li class="toctree-l2"><a class="reference internal" href="optee.html">Interfacing with OP-TEE</a></li>
</ul>
</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">Guides</a></li>
<li class="breadcrumb-item active">Changing the System Clock Configuration</li>
<li class="wy-breadcrumbs-aside">
<a href="https://github.com/apache/nuttx/blob/master/Documentation/guides/changing_systemclockconfig.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">
<section id="changing-the-system-clock-configuration">
<h1>Changing the System Clock Configuration<a class="headerlink" href="#changing-the-system-clock-configuration" title="Permalink to this heading"></a></h1>
<div class="admonition warning">
<p class="admonition-title">Warning</p>
<p>Migrated from:
<a class="reference external" href="https://cwiki.apache.org/confluence/display/NUTTX/Changing+the+System+Clock+Configuration">https://cwiki.apache.org/confluence/display/NUTTX/Changing+the+System+Clock+Configuration</a></p>
</div>
<section id="question">
<h2>Question<a class="headerlink" href="#question" title="Permalink to this heading"></a></h2>
<p><cite>Is an STM32 configuration booting with the internal 16 MHz clock, then
switching later (on command) to an external 25 MHz xtal doable? I don’t think
so, but would you mind confirming that?</cite></p>
</section>
<section id="answer">
<h2>Answer<a class="headerlink" href="#answer" title="Permalink to this heading"></a></h2>
<p>Of course, that is what always happens: The STM32 boots using an internal clock
and switches to the external crystal source after booting. But I assume that
you mean MUCH later on, after initialization.</p>
<p>Yes that can be done too. There are only a few issues and things to be aware of:</p>
<section id="custom-clock-configuration">
<h3>Custom Clock Configuration<a class="headerlink" href="#custom-clock-configuration" title="Permalink to this heading"></a></h3>
<p>The <code class="docutils literal notranslate"><span class="pre">configs/vsn/</span></code> configuration does something like you say. It skips the
initial clock configuration by defining
<code class="docutils literal notranslate"><span class="pre">CONFIG_ARCH_BOARD_STM32_CUSTOM_CLOCKCONFIG=y</span></code>. Then the normal clock
configuration logic in <code class="docutils literal notranslate"><span class="pre">arch/arm/src/stm32/stm32_rcc.c</span></code> is not executed.
Instead, the “custom” clock initialization at <code class="docutils literal notranslate"><span class="pre">configs/vsn/src/sysclock.c</span></code>
is called:</p>
<div class="highlight-c notranslate"><div class="highlight"><pre><span></span><span class="kt">void</span><span class="w"> </span><span class="nf">stm32_clockconfig</span><span class="p">(</span><span class="kt">void</span><span class="p">)</span>
<span class="p">{</span>
<span class="w"> </span><span class="cm">/* Make sure that we are starting in the reset state */</span>
<span class="w"> </span><span class="n">rcc_reset</span><span class="p">();</span>
<span class="cp">#if defined(CONFIG_ARCH_BOARD_STM32_CUSTOM_CLOCKCONFIG)</span>
<span class="w"> </span><span class="cm">/* Invoke Board Custom Clock Configuration */</span>
<span class="w"> </span><span class="n">stm32_board_clockconfig</span><span class="p">();</span>
<span class="cp">#else</span>
<span class="w"> </span><span class="cm">/* Invoke standard, fixed clock configuration based on definitions in board.h */</span>
<span class="w"> </span><span class="n">stm32_stdclockconfig</span><span class="p">();</span>
<span class="cp">#endif</span>
<span class="w"> </span><span class="cm">/* Enable peripheral clocking */</span>
<span class="w"> </span><span class="n">rcc_enableperipherals</span><span class="p">();</span>
<span class="p">}</span>
</pre></div>
</div>
<p>Doing things that way, you can have complete control over when the crystal
clock source is used. The initial “custom” clock configuration can use an
internal source, then other custom clock configuration logic can change the
clock source later.</p>
<p>NOTE: Since this original writing, the VSN configuration has been retired and
is no long in at config/vsn. The retired code can still be found in the
<a class="reference external" href="https://bitbucket.org/patacongo/obsoleted/src/master/nuttx/configs/vsn">Obsoleted repository</a>.</p>
</section>
<section id="peripheral-clocks">
<h3>Peripheral Clocks<a class="headerlink" href="#peripheral-clocks" title="Permalink to this heading"></a></h3>
<p>The peripheral clock used by many devices to set up things like the SPI
frequency and UART bard rates. Currently, those peripheral clock frequencies
are hardcoded in the board.h header file. So you have two options:</p>
<ol class="arabic simple">
<li><p><strong>Fixed Peripheral Clocking</strong>. Ideally, you would like to keep the peripheral
clock frequencies the same in either case. Then life is simple. You could
probably use an internal RC clock source as input to a PLL and set up
dividers so that you get the same peripheral clocks. Then, I think, from
the standpoint of the peripherals, nothing happened.</p></li>
<li><p><strong>Variable Peripheral Clocking</strong>. You can make the peripheral clocking
variable. I had to do this for the SAMA5Dx family. Look at
<code class="docutils literal notranslate"><span class="pre">boards/arm/stm32/sama5d4-ek/include/board_sdram.h</span></code> for example. Notice
that the frequencies are not constants, but function calls:</p></li>
</ol>
<div class="highlight-c notranslate"><div class="highlight"><pre><span></span><span class="cp">#define BOARD_MAINCK_FREQUENCY BOARD_MAINOSC_FREQUENCY</span>
<span class="cp">#define BOARD_PLLA_FREQUENCY (sam_pllack_frequency(BOARD_MAINOSC_FREQUENCY))</span>
<span class="cp">#define BOARD_PLLADIV2_FREQUENCY (sam_plladiv2_frequency(BOARD_MAINOSC_FREQUENCY))</span>
<span class="cp">#define BOARD_PCK_FREQUENCY (sam_pck_frequency(BOARD_MAINOSC_FREQUENCY))</span>
<span class="cp">#define BOARD_MCK_FREQUENCY (sam_mck_frequency(BOARD_MAINOSC_FREQUENCY))</span>
</pre></div>
</div>
<p>Given that I know that XTAL oscillator frequency I can derive the frequency of
other clocks. This turns out to be more work than you would think, however,
because there are probably C pre-processor tests that will now fail. Like:</p>
<div class="highlight-c notranslate"><div class="highlight"><pre><span></span><span class="cp">#if BOARD_MCK_FREQUENCY &gt; 16000000</span>
<span class="p">...</span><span class="w"> </span><span class="k">do</span><span class="w"> </span><span class="n">something</span><span class="w"> </span><span class="p">...</span>
<span class="cp">#endif</span>
</pre></div>
</div>
<p>Such logic would have to be converted from a compile time decision to a
run-time decision, perhaps like this:</p>
<div class="highlight-c notranslate"><div class="highlight"><pre><span></span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">BOARD_MCK_FREQUENCY</span><span class="w"> </span><span class="o">&gt;</span><span class="w"> </span><span class="mi">16000000</span><span class="p">)</span>
<span class="p">{</span>
<span class="w"> </span><span class="p">...</span><span class="w"> </span><span class="k">do</span><span class="w"> </span><span class="n">something</span><span class="w"> </span><span class="p">...</span>
<span class="p">}</span>
</pre></div>
</div>
<p>The SAMA5D4-EK case was intended for the case where the software is running out
of SDRAM and the clocking cannot be reconfigured. Rather, it must derive the
clocking as it was left by the bootloader. But you could do something like what
was done for the SAMA5D4-EK when you change the frequency too. You could also
make the peripheral clocks variable.</p>
</section>
<section id="reinitializing-peripherals">
<h3>Reinitializing Peripherals<a class="headerlink" href="#reinitializing-peripherals" title="Permalink to this heading"></a></h3>
</section>
<section id="variable-peripheral-clocking">
<h3>Variable Peripheral Clocking<a class="headerlink" href="#variable-peripheral-clocking" title="Permalink to this heading"></a></h3>
<p>If you did something like what was done for the SAMA5D4-EK when you change the
frequency, then the peripheral clocks would be variable. The main problem would
then be that you would have to re-initialize the peripherals when the
peripheral clocking changes. If, for example, the UART was initialized at
the initial peripheral clock, then you would have to recalculate the BAUD
divisor if the peripheral clock changes.</p>
<p>But this is not really be a big issue. You can force the UARTs to recalculate
the BAUD divisor with TERMIOS ioctl calls. You could use the setfrequency()
methods to recalculate I2C and SPI BAUD divisors. But there are also memory
card frequencies and more.</p>
</section>
<section id="systick-timer">
<h3>Systick Timer<a class="headerlink" href="#systick-timer" title="Permalink to this heading"></a></h3>
<p>If the CPU frequency changes, you would have to change the Systick timer
configuration: It is always driven by the CPU clock</p>
</section>
<section id="up-mdelay">
<h3>up_mdelay<a class="headerlink" href="#up-mdelay" title="Permalink to this heading"></a></h3>
<p>up_mdelay() provides a low level timing loop and must be re-calibrated for
anything that causes change in the rate of execution of that timing loop.
This calibration is not critical and fairly large errors in the calibration
are tolerable. Hopefully, you could keep the execution rate close enough that
up_mdelay() would not be grossly in error.</p>
</section>
<section id="power-management">
<h3>Power Management<a class="headerlink" href="#power-management" title="Permalink to this heading"></a></h3>
<p>This is also the same kind of thing that you would have to do if you wanted to
switch clocking for power management reasons. NuttX does have a power
management system and perhaps making use of the power management system
to manage system clocking changes might be possible. For example, when the
clocking changes, you could force some power management state change. That
state change would notify all drivers and, in response, the drivers could
recalculate their frequency related settings.</p>
<p>Here is some Power Management documentation:</p>
<div class="toctree-wrapper compound">
<ul>
<li class="toctree-l1"><a class="reference internal" href="../components/drivers/special/power/pm/index.html">Power Management</a></li>
</ul>
</div>
</section>
</section>
</section>
</div>
</div>
<footer><div class="rst-footer-buttons" role="navigation" aria-label="Footer">
<a href="devicetree.html" class="btn btn-neutral float-left" title="Device Tree" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left" aria-hidden="true"></span> Previous</a>
<a href="usingkernelthreads.html" class="btn btn-neutral float-right" title="Using Kernel Threads" 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>