xref: /aosp_15_r20/external/pigweed/pw_hdlc/guide.rst (revision 61c4878ac05f98d0ceed94b57d316916de578985)
1*61c4878aSAndroid Build Coastguard Worker.. _module-pw_hdlc-guide:
2*61c4878aSAndroid Build Coastguard Worker
3*61c4878aSAndroid Build Coastguard Worker====================
4*61c4878aSAndroid Build Coastguard WorkerGet started & guides
5*61c4878aSAndroid Build Coastguard Worker====================
6*61c4878aSAndroid Build Coastguard Worker.. pigweed-module-subpage::
7*61c4878aSAndroid Build Coastguard Worker   :name: pw_hdlc
8*61c4878aSAndroid Build Coastguard Worker
9*61c4878aSAndroid Build Coastguard Worker.. include:: design.rst
10*61c4878aSAndroid Build Coastguard Worker   :start-after: .. pw_hdlc-overview-start
11*61c4878aSAndroid Build Coastguard Worker   :end-before: .. pw_hdlc-overview-end
12*61c4878aSAndroid Build Coastguard Worker
13*61c4878aSAndroid Build Coastguard Worker.. _module-pw_hdlc-getstarted:
14*61c4878aSAndroid Build Coastguard Worker
15*61c4878aSAndroid Build Coastguard Worker------------------------
16*61c4878aSAndroid Build Coastguard WorkerGet started with pw_hdlc
17*61c4878aSAndroid Build Coastguard Worker------------------------
18*61c4878aSAndroid Build Coastguard WorkerDepend on the library:
19*61c4878aSAndroid Build Coastguard Worker
20*61c4878aSAndroid Build Coastguard Worker.. tab-set::
21*61c4878aSAndroid Build Coastguard Worker
22*61c4878aSAndroid Build Coastguard Worker   .. tab-item:: Bazel
23*61c4878aSAndroid Build Coastguard Worker      :sync: bazel
24*61c4878aSAndroid Build Coastguard Worker
25*61c4878aSAndroid Build Coastguard Worker      Add ``@pigweed//pw_hdlc`` to the ``deps`` list in your Bazel target:
26*61c4878aSAndroid Build Coastguard Worker
27*61c4878aSAndroid Build Coastguard Worker      .. code-block::
28*61c4878aSAndroid Build Coastguard Worker
29*61c4878aSAndroid Build Coastguard Worker         cc_library("...") {
30*61c4878aSAndroid Build Coastguard Worker           # ...
31*61c4878aSAndroid Build Coastguard Worker           deps = [
32*61c4878aSAndroid Build Coastguard Worker             # ...
33*61c4878aSAndroid Build Coastguard Worker             "@pigweed//pw_hdlc",
34*61c4878aSAndroid Build Coastguard Worker             # ...
35*61c4878aSAndroid Build Coastguard Worker           ]
36*61c4878aSAndroid Build Coastguard Worker         }
37*61c4878aSAndroid Build Coastguard Worker
38*61c4878aSAndroid Build Coastguard Worker      This assumes that your Bazel ``WORKSPACE`` has a `repository
39*61c4878aSAndroid Build Coastguard Worker      <https://bazel.build/concepts/build-ref#repositories>`_ named ``@pigweed``
40*61c4878aSAndroid Build Coastguard Worker      that points to the upstream Pigweed repository.
41*61c4878aSAndroid Build Coastguard Worker
42*61c4878aSAndroid Build Coastguard Worker   .. tab-item:: GN
43*61c4878aSAndroid Build Coastguard Worker      :sync: gn
44*61c4878aSAndroid Build Coastguard Worker
45*61c4878aSAndroid Build Coastguard Worker      Add ``$dir_pw_hdlc`` to the ``deps`` list in your ``pw_executable()``
46*61c4878aSAndroid Build Coastguard Worker      build target:
47*61c4878aSAndroid Build Coastguard Worker
48*61c4878aSAndroid Build Coastguard Worker      .. code-block::
49*61c4878aSAndroid Build Coastguard Worker
50*61c4878aSAndroid Build Coastguard Worker         pw_executable("...") {
51*61c4878aSAndroid Build Coastguard Worker           # ...
52*61c4878aSAndroid Build Coastguard Worker           deps = [
53*61c4878aSAndroid Build Coastguard Worker             # ...
54*61c4878aSAndroid Build Coastguard Worker             "$dir_pw_hdlc",
55*61c4878aSAndroid Build Coastguard Worker             # ...
56*61c4878aSAndroid Build Coastguard Worker           ]
57*61c4878aSAndroid Build Coastguard Worker         }
58*61c4878aSAndroid Build Coastguard Worker
59*61c4878aSAndroid Build Coastguard Worker
60*61c4878aSAndroid Build Coastguard Worker   .. tab-item:: CMake
61*61c4878aSAndroid Build Coastguard Worker      :sync: cmake
62*61c4878aSAndroid Build Coastguard Worker
63*61c4878aSAndroid Build Coastguard Worker      Add ``pw_hdlc`` to your ``pw_add_library`` or similar CMake target:
64*61c4878aSAndroid Build Coastguard Worker
65*61c4878aSAndroid Build Coastguard Worker      .. code-block::
66*61c4878aSAndroid Build Coastguard Worker
67*61c4878aSAndroid Build Coastguard Worker         pw_add_library(my_library STATIC
68*61c4878aSAndroid Build Coastguard Worker           HEADERS
69*61c4878aSAndroid Build Coastguard Worker             # ...
70*61c4878aSAndroid Build Coastguard Worker           PRIVATE_DEPS
71*61c4878aSAndroid Build Coastguard Worker             # ...
72*61c4878aSAndroid Build Coastguard Worker             pw_hdlc
73*61c4878aSAndroid Build Coastguard Worker             # ...
74*61c4878aSAndroid Build Coastguard Worker         )
75*61c4878aSAndroid Build Coastguard Worker
76*61c4878aSAndroid Build Coastguard Worker   .. tab-item:: Zephyr
77*61c4878aSAndroid Build Coastguard Worker      :sync: zephyr
78*61c4878aSAndroid Build Coastguard Worker
79*61c4878aSAndroid Build Coastguard Worker      There are two ways to use ``pw_hdlc`` from a Zephyr project:
80*61c4878aSAndroid Build Coastguard Worker
81*61c4878aSAndroid Build Coastguard Worker      * (Recommended) Depend on ``pw_hdlc`` in your CMake target. See the CMake
82*61c4878aSAndroid Build Coastguard Worker        tab. The Pigweed team recommends this approach because it enables
83*61c4878aSAndroid Build Coastguard Worker        precise CMake dependency analysis.
84*61c4878aSAndroid Build Coastguard Worker
85*61c4878aSAndroid Build Coastguard Worker      * Add ``CONFIG_PIGWEED_HDLC=y`` to your Zephyr project's configuration.
86*61c4878aSAndroid Build Coastguard Worker        Also add ``CONFIG_PIGWEED_HDLC_RPC=y`` if using RPC. Although this is
87*61c4878aSAndroid Build Coastguard Worker        the typical Zephyr solution, the Pigweed team doesn't recommend this
88*61c4878aSAndroid Build Coastguard Worker        approach because it makes ``pw_hdlc`` a global dependency and exposes
89*61c4878aSAndroid Build Coastguard Worker        its includes to all targets.
90*61c4878aSAndroid Build Coastguard Worker
91*61c4878aSAndroid Build Coastguard WorkerAnd then :ref:`encode <module-pw_hdlc-guide-encode>` and
92*61c4878aSAndroid Build Coastguard Worker:ref:`decode <module-pw_hdlc-guide-decode>` some data!
93*61c4878aSAndroid Build Coastguard Worker
94*61c4878aSAndroid Build Coastguard WorkerSet up RPC over HDLC
95*61c4878aSAndroid Build Coastguard Worker====================
96*61c4878aSAndroid Build Coastguard WorkerSee :ref:`module-pw_hdlc-rpc-example`.
97*61c4878aSAndroid Build Coastguard Worker
98*61c4878aSAndroid Build Coastguard Worker.. _module-pw_hdlc-guide-encode:
99*61c4878aSAndroid Build Coastguard Worker
100*61c4878aSAndroid Build Coastguard Worker--------
101*61c4878aSAndroid Build Coastguard WorkerEncoding
102*61c4878aSAndroid Build Coastguard Worker--------
103*61c4878aSAndroid Build Coastguard Worker.. include:: docs.rst
104*61c4878aSAndroid Build Coastguard Worker   :start-after: .. pw_hdlc-encoding-example-start
105*61c4878aSAndroid Build Coastguard Worker   :end-before: .. pw_hdlc-encoding-example-end
106*61c4878aSAndroid Build Coastguard Worker
107*61c4878aSAndroid Build Coastguard WorkerAllocating buffers when encoding
108*61c4878aSAndroid Build Coastguard Worker================================
109*61c4878aSAndroid Build Coastguard Worker.. tab-set::
110*61c4878aSAndroid Build Coastguard Worker
111*61c4878aSAndroid Build Coastguard Worker   .. tab-item:: C++
112*61c4878aSAndroid Build Coastguard Worker      :sync: cpp
113*61c4878aSAndroid Build Coastguard Worker
114*61c4878aSAndroid Build Coastguard Worker      HDLC encoding overhead changes depending on the payload size and the
115*61c4878aSAndroid Build Coastguard Worker      nature of the data being encoded. ``pw_hdlc`` provides helper functions
116*61c4878aSAndroid Build Coastguard Worker      for determining the size of buffers. The helper functions provide
117*61c4878aSAndroid Build Coastguard Worker      worst-case sizes of frames given a certain payload size and vice-versa.
118*61c4878aSAndroid Build Coastguard Worker
119*61c4878aSAndroid Build Coastguard Worker      .. code-block:: cpp
120*61c4878aSAndroid Build Coastguard Worker
121*61c4878aSAndroid Build Coastguard Worker         #include "pw_assert/check.h"
122*61c4878aSAndroid Build Coastguard Worker         #include "pw_bytes/span.h"
123*61c4878aSAndroid Build Coastguard Worker         #include "pw_hdlc/encoder"
124*61c4878aSAndroid Build Coastguard Worker         #include "pw_hdlc/encoded_size.h"
125*61c4878aSAndroid Build Coastguard Worker         #include "pw_status/status.h"
126*61c4878aSAndroid Build Coastguard Worker
127*61c4878aSAndroid Build Coastguard Worker         // The max on-the-wire size in bytes of a single HDLC frame after encoding.
128*61c4878aSAndroid Build Coastguard Worker         constexpr size_t kMtu = 512;
129*61c4878aSAndroid Build Coastguard Worker         constexpr size_t kRpcEncodeBufferSize = pw::hdlc::MaxSafePayloadSize(kMtu);
130*61c4878aSAndroid Build Coastguard Worker         std::array<std::byte, kRpcEncodeBufferSize> rpc_encode_buffer;
131*61c4878aSAndroid Build Coastguard Worker
132*61c4878aSAndroid Build Coastguard Worker         // Any data encoded to this buffer is guaranteed to fit in the MTU after
133*61c4878aSAndroid Build Coastguard Worker         // HDLC encoding.
134*61c4878aSAndroid Build Coastguard Worker         pw::ConstByteSpan GetRpcEncodeBuffer() {
135*61c4878aSAndroid Build Coastguard Worker           return rpc_encode_buffer;
136*61c4878aSAndroid Build Coastguard Worker         }
137*61c4878aSAndroid Build Coastguard Worker
138*61c4878aSAndroid Build Coastguard Worker.. _module-pw_hdlc-guide-decode:
139*61c4878aSAndroid Build Coastguard Worker
140*61c4878aSAndroid Build Coastguard Worker--------
141*61c4878aSAndroid Build Coastguard WorkerDecoding
142*61c4878aSAndroid Build Coastguard Worker--------
143*61c4878aSAndroid Build Coastguard Worker.. include:: docs.rst
144*61c4878aSAndroid Build Coastguard Worker   :start-after: .. pw_hdlc-decoding-example-start
145*61c4878aSAndroid Build Coastguard Worker   :end-before: .. pw_hdlc-decoding-example-end
146*61c4878aSAndroid Build Coastguard Worker
147*61c4878aSAndroid Build Coastguard Worker
148*61c4878aSAndroid Build Coastguard WorkerAllocating buffers when decoding
149*61c4878aSAndroid Build Coastguard Worker================================
150*61c4878aSAndroid Build Coastguard Worker.. tab-set::
151*61c4878aSAndroid Build Coastguard Worker
152*61c4878aSAndroid Build Coastguard Worker   .. tab-item:: C++
153*61c4878aSAndroid Build Coastguard Worker      :sync: cpp
154*61c4878aSAndroid Build Coastguard Worker
155*61c4878aSAndroid Build Coastguard Worker      ``pw::hdlc::Decoder`` is a helper for allocating a buffer. It has slightly
156*61c4878aSAndroid Build Coastguard Worker      lower overhead because it doesn't need to decode the entire escaped
157*61c4878aSAndroid Build Coastguard Worker      frame in-memory.
158*61c4878aSAndroid Build Coastguard Worker
159*61c4878aSAndroid Build Coastguard Worker      .. code-block:: cpp
160*61c4878aSAndroid Build Coastguard Worker
161*61c4878aSAndroid Build Coastguard Worker         #include "pw_hdlc/decoder.h"
162*61c4878aSAndroid Build Coastguard Worker
163*61c4878aSAndroid Build Coastguard Worker         // The max on-the-wire size in bytes of a single HDLC frame after encoding.
164*61c4878aSAndroid Build Coastguard Worker         constexpr size_t kMtu = 512;
165*61c4878aSAndroid Build Coastguard Worker
166*61c4878aSAndroid Build Coastguard Worker         // Create a decoder given the MTU constraint.
167*61c4878aSAndroid Build Coastguard Worker         constexpr size_t kDecoderBufferSize =
168*61c4878aSAndroid Build Coastguard Worker             pw::hdlc::Decoder::RequiredBufferSizeForFrameSize(kMtu);
169*61c4878aSAndroid Build Coastguard Worker         pw::hdlc::DecoderBuffer<kDecoderBufferSize> decoder;
170*61c4878aSAndroid Build Coastguard Worker
171*61c4878aSAndroid Build Coastguard Worker-----------------
172*61c4878aSAndroid Build Coastguard WorkerMore pw_hdlc docs
173*61c4878aSAndroid Build Coastguard Worker-----------------
174*61c4878aSAndroid Build Coastguard Worker.. include:: docs.rst
175*61c4878aSAndroid Build Coastguard Worker   :start-after: .. pw_hdlc-nav-start
176*61c4878aSAndroid Build Coastguard Worker   :end-before: .. pw_hdlc-nav-end
177