You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nuttx.apache.org by bt...@apache.org on 2020/08/24 17:30:18 UTC

[incubator-nuttx] 07/17: backport SocketCAN documentation to new docs (PR #1533)

This is an automated email from the ASF dual-hosted git repository.

btashton pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-nuttx.git

commit 2fb9910b017649c2c64295cb948d56e7403e367d
Author: Matias N <ma...@protobits.dev>
AuthorDate: Fri Aug 14 17:31:06 2020 -0300

    backport SocketCAN documentation to new docs (PR #1533)
---
 Documentation/components/index.rst     |  1 +
 Documentation/components/socketcan.rst | 66 ++++++++++++++++++++++++++++++++++
 2 files changed, 67 insertions(+)

diff --git a/Documentation/components/index.rst b/Documentation/components/index.rst
index aa34634..b2ba8e6 100644
--- a/Documentation/components/index.rst
+++ b/Documentation/components/index.rst
@@ -10,6 +10,7 @@ OS Components
    
    nsh/index.rst
    power.rst
+   socketcan.rst
    syslog.rst
    binfmt.rst
    drivers/index.rst
diff --git a/Documentation/components/socketcan.rst b/Documentation/components/socketcan.rst
new file mode 100644
index 0000000..f8323a2
--- /dev/null
+++ b/Documentation/components/socketcan.rst
@@ -0,0 +1,66 @@
+========================
+SocketCAN Device Drivers
+========================
+
+  -  **``include/nuttx/net/netdev.h``**. 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 netdev_register().
+
+  -  **``include/nuttx/can.h``**. CAN & CAN FD frame data
+     structures.
+
+  -  **``int netdev_register(FAR struct net_driver_s *dev, enum net_lltype_e lltype)'``**.
+     Each driver registers itself by calling netdev_register().
+
+  -  **``Include/nuttx/net/can.h``**. contains lookup tables for CAN
+     dlc to CAN FD len sizes named
+
+     .. code-block:: c
+     
+       extern const uint8_t can_dlc_to_len[16];
+       extern const uint8_t len_to_can_dlc[65];
+
+  -  **Initialization sequence is as follows**.
+
+     #. up_netinitialize(void) is called on startup of NuttX in this
+        function you call your own init function to initialize your
+        CAN driver
+     #. In your own init function you create the net_driver_s
+        structure set required init values and register the required
+        callbacks for SocketCAN
+     #. Then you ensure that the CAN interface is in down mode
+        (usually done by calling the d_ifdown function)
+     #. Register the net_driver_s using netdev_register
+
+  -  **Receive sequence is as follows**.
+
+     #. Device generates interrupt
+     #. Process this interrupt in your interrupt handler
+     #. When a new CAN frame has been received you process this
+        frame
+     #. 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).
+     #. Copy the frame from the driver to the struct you've
+        allocated in the previous step.
+     #. Point the net_driver_s d_buf pointer to the allocated
+        can_frame
+     #. Call the ``can_input(FAR struct net_driver_s *dev)``
+        function ``include/nuttx/net/can.h``
+
+  -  **Transmit sequence is as follows**.
+
+     #. Socket layer executes d_txavail callback
+     #. An example of the txavail function can be found in
+        ``arch/arm/src/s32k1xx/s32k1xx_flexcan.c``
+     #. An example of the txpoll function can be found in
+        ``arch/arm/src/s32k1xx/s32k1xx_flexcan.c``
+     #. In your ``transmit(struct driver_s *priv)`` function you
+        check the length of ``net_driver_s.d_len`` whether it
+        matches the size of a ``struct can_frame`` or
+        ``struct canfd_frame`` then you cast the content of the
+        ``net_driver_s.d_buf`` pointer to the correct CAN frame
+        struct
+