blob: 6fa09f01628921f29a084e40881a63bff7f6d86b [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>SocketCAN Device Drivers &mdash; NuttX latest documentation</title>
<link rel="stylesheet" href="../../_static/pygments.css" type="text/css" />
<link rel="stylesheet" href="../../_static/css/theme.css" type="text/css" />
<link rel="stylesheet" href="../../_static/copybutton.css" type="text/css" />
<link rel="stylesheet" href="../../_static/tabs.css" type="text/css" />
<link rel="stylesheet" href="../../_static/custom.css" type="text/css" />
<link rel="shortcut icon" href="../../_static/favicon.ico"/>
<!--[if lt IE 9]>
<script src="../../_static/js/html5shiv.min.js"></script>
<![endif]-->
<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="“Raw” packet socket support" href="pkt.html" />
<link rel="prev" title="6LoWPAN" href="sixlowpan.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>
</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"><a class="reference internal" href="../drivers/index.html">Device Drivers</a></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 current"><a class="reference internal" href="index.html">Network Support</a><ul class="current">
<li class="toctree-l3"><a class="reference internal" href="sixlowpan.html">6LoWPAN</a></li>
<li class="toctree-l3 current"><a class="current reference internal" href="#">SocketCAN Device Drivers</a></li>
<li class="toctree-l3"><a class="reference internal" href="pkt.html">“Raw” packet socket support</a></li>
<li class="toctree-l3"><a class="reference internal" href="nat.html">Network Address Translation (NAT)</a></li>
<li class="toctree-l3"><a class="reference internal" href="netdev.html">Network Devices</a></li>
<li class="toctree-l3"><a class="reference internal" href="netguardsize.html">CONFIG_NET_GUARDSIZE</a></li>
<li class="toctree-l3"><a class="reference internal" href="slip.html">SLIP</a></li>
<li class="toctree-l3"><a class="reference internal" href="wqueuedeadlocks.html">Work Queue Deadlocks</a></li>
</ul>
</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>
</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">Network Support</a></li>
<li class="breadcrumb-item active">SocketCAN Device Drivers</li>
<li class="wy-breadcrumbs-aside">
<a href="../../_sources/components/net/socketcan.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="socketcan-device-drivers">
<h1>SocketCAN Device Drivers<a class="headerlink" href="#socketcan-device-drivers" title="Permalink to this heading"></a></h1>
<ul>
<li><p><code class="docutils literal notranslate"><span class="pre">include/nuttx/net/netdev.h</span></code>. All structures and APIs
needed to work with drivers are provided in this header file.
The structure struct net_driver_s defines the interface and is
passed to the network via <code class="docutils literal notranslate"><span class="pre">netdev_register()</span></code>.</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">include/nuttx/can.h</span></code>. CAN &amp; CAN FD frame data structures.</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">int</span> <span class="pre">netdev_register(FAR</span> <span class="pre">struct</span> <span class="pre">net_driver_s</span> <span class="pre">*dev,</span> <span class="pre">enum</span> <span class="pre">net_lltype_e</span> <span class="pre">lltype)'</span></code>.
Each driver registers itself by calling <code class="docutils literal notranslate"><span class="pre">netdev_register()</span></code>.</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">Include/nuttx/net/can.h</span></code>. contains lookup tables for CAN
dlc to CAN FD len sizes named</p>
<div class="highlight-c notranslate"><div class="highlight"><pre><span></span><span class="k">extern</span><span class="w"> </span><span class="k">const</span><span class="w"> </span><span class="kt">uint8_t</span><span class="w"> </span><span class="n">can_dlc_to_len</span><span class="p">[</span><span class="mi">16</span><span class="p">];</span>
<span class="k">extern</span><span class="w"> </span><span class="k">const</span><span class="w"> </span><span class="kt">uint8_t</span><span class="w"> </span><span class="n">len_to_can_dlc</span><span class="p">[</span><span class="mi">65</span><span class="p">];</span>
</pre></div>
</div>
</li>
<li><p><strong>Initialization sequence is as follows</strong>.</p>
<ol class="arabic simple">
<li><p><code class="docutils literal notranslate"><span class="pre">xxx_netinitialize(void)</span></code> is called on startup of NuttX in this
function you call your own init function to initialize your
CAN driver</p></li>
<li><p>In your own init function you create the net_driver_s
structure set required init values and register the required
callbacks for SocketCAN</p></li>
<li><p>Then you ensure that the CAN interface is in down mode
(usually done by calling the d_ifdown function)</p></li>
<li><p>Register the net_driver_s using netdev_register</p></li>
</ol>
</li>
<li><p><strong>Receive sequence is as follows</strong>.</p>
<ol class="arabic simple">
<li><p>Device generates interrupt</p></li>
<li><p>Process this interrupt in your interrupt handler</p></li>
<li><p>When a new CAN frame has been received you process this frame</p></li>
<li><p>When the CAN frame is a normal CAN frame you allocate the
can_frame struct, when it’s a CAN FD frame you allocate a
canfd_frame struct (note you can of course preallocate and
just use the pointer).</p></li>
<li><p>Copy the frame from the driver to the struct you’ve
allocated in the previous step.</p></li>
<li><p>Point the net_driver_s d_buf pointer to the allocated can_frame</p></li>
<li><p>Call the <code class="docutils literal notranslate"><span class="pre">can_input(FAR</span> <span class="pre">struct</span> <span class="pre">net_driver_s</span> <span class="pre">*dev)</span></code>
function <code class="docutils literal notranslate"><span class="pre">include/nuttx/net/can.h</span></code></p></li>
</ol>
</li>
<li><p><strong>Transmit sequence is as follows</strong>.</p>
<ol class="arabic simple">
<li><p>Socket layer executes d_txavail callback</p></li>
<li><p>An example of the txavail function can be found in
<code class="docutils literal notranslate"><span class="pre">arch/arm/src/s32k1xx/s32k1xx_flexcan.c</span></code></p></li>
<li><p>An example of the txpoll function can be found in
<code class="docutils literal notranslate"><span class="pre">arch/arm/src/s32k1xx/s32k1xx_flexcan.c</span></code></p></li>
<li><p>In your <code class="docutils literal notranslate"><span class="pre">transmit(struct</span> <span class="pre">driver_s</span> <span class="pre">*priv)</span></code> function you
check the length of <code class="docutils literal notranslate"><span class="pre">net_driver_s.d_len</span></code> whether it
matches the size of a <code class="docutils literal notranslate"><span class="pre">struct</span> <span class="pre">can_frame</span></code> or
<code class="docutils literal notranslate"><span class="pre">struct</span> <span class="pre">canfd_frame</span></code> then you cast the content of the
<code class="docutils literal notranslate"><span class="pre">net_driver_s.d_buf</span></code> pointer to the correct CAN frame struct</p></li>
</ol>
</li>
</ul>
</section>
</div>
</div>
<footer><div class="rst-footer-buttons" role="navigation" aria-label="Footer">
<a href="sixlowpan.html" class="btn btn-neutral float-left" title="6LoWPAN" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left" aria-hidden="true"></span> Previous</a>
<a href="pkt.html" class="btn btn-neutral float-right" title="“Raw” packet socket support" 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>