xref: /aosp_15_r20/external/pigweed/pw_clock_tree/examples.rst (revision 61c4878ac05f98d0ceed94b57d316916de578985)
1*61c4878aSAndroid Build Coastguard Worker.. _module-pw_clock_tree-examples:
2*61c4878aSAndroid Build Coastguard Worker
3*61c4878aSAndroid Build Coastguard Worker--------
4*61c4878aSAndroid Build Coastguard WorkerExamples
5*61c4878aSAndroid Build Coastguard Worker--------
6*61c4878aSAndroid Build Coastguard Worker.. pigweed-module-subpage::
7*61c4878aSAndroid Build Coastguard Worker   :name: pw_clock_tree
8*61c4878aSAndroid Build Coastguard Worker
9*61c4878aSAndroid Build Coastguard Worker.. grid:: 2
10*61c4878aSAndroid Build Coastguard Worker
11*61c4878aSAndroid Build Coastguard Worker   .. grid-item-card:: :octicon:`code-square` Integration into device driver
12*61c4878aSAndroid Build Coastguard Worker      :link: module-pw_clock_tree-example-device_driver
13*61c4878aSAndroid Build Coastguard Worker      :link-type: ref
14*61c4878aSAndroid Build Coastguard Worker      :class-item: sales-pitch-cta-primary
15*61c4878aSAndroid Build Coastguard Worker
16*61c4878aSAndroid Build Coastguard Worker      Example that shows how to integrate the clock tree functionality
17*61c4878aSAndroid Build Coastguard Worker      into a device driver.
18*61c4878aSAndroid Build Coastguard Worker
19*61c4878aSAndroid Build Coastguard Worker   .. grid-item-card:: :octicon:`code-square` Clock tree usage
20*61c4878aSAndroid Build Coastguard Worker      :link: module-pw_clock_tree-example-clock_tree_usage
21*61c4878aSAndroid Build Coastguard Worker      :link-type: ref
22*61c4878aSAndroid Build Coastguard Worker      :class-item: sales-pitch-cta-secondary
23*61c4878aSAndroid Build Coastguard Worker
24*61c4878aSAndroid Build Coastguard Worker      Example that shows how to define platform specific clock tree elements
25*61c4878aSAndroid Build Coastguard Worker      and how to interact with them to manage clocks of an embedded system.
26*61c4878aSAndroid Build Coastguard Worker
27*61c4878aSAndroid Build Coastguard Worker
28*61c4878aSAndroid Build Coastguard Worker.. _module-pw_clock_tree-example-device_driver:
29*61c4878aSAndroid Build Coastguard Worker
30*61c4878aSAndroid Build Coastguard WorkerClock tree integration into device drivers
31*61c4878aSAndroid Build Coastguard Worker==========================================
32*61c4878aSAndroid Build Coastguard Worker
33*61c4878aSAndroid Build Coastguard WorkerThe example below shows how the clock tree functionality can get integrated into a new
34*61c4878aSAndroid Build Coastguard Workerdevice driver that requires that a clock tree abstraction is present in the system.
35*61c4878aSAndroid Build Coastguard Worker
36*61c4878aSAndroid Build Coastguard Worker.. literalinclude:: examples.cc
37*61c4878aSAndroid Build Coastguard Worker   :language: cpp
38*61c4878aSAndroid Build Coastguard Worker   :linenos:
39*61c4878aSAndroid Build Coastguard Worker   :start-after: [pw_clock_tree-examples-IntegrationIntoDeviceDriversClassDef]
40*61c4878aSAndroid Build Coastguard Worker   :end-before: [pw_clock_tree-examples-IntegrationIntoDeviceDriversClassDef]
41*61c4878aSAndroid Build Coastguard Worker
42*61c4878aSAndroid Build Coastguard Worker
43*61c4878aSAndroid Build Coastguard Worker.. _module-pw_clock_tree-example-clock_tree_usage:
44*61c4878aSAndroid Build Coastguard Worker
45*61c4878aSAndroid Build Coastguard WorkerDefinition and use of clock tree elements
46*61c4878aSAndroid Build Coastguard Worker=========================================
47*61c4878aSAndroid Build Coastguard Worker
48*61c4878aSAndroid Build Coastguard WorkerFor the example below we use a clock tree with two clock sources ``clock_a`` and ``clock_b``.
49*61c4878aSAndroid Build Coastguard Worker``clock_a`` can be selected as an input source by ``clock_selector_c``, and ``clock_b`` is an input into
50*61c4878aSAndroid Build Coastguard Workerdivider ``clock_divider_d``, which can be selected as an alternative input source by
51*61c4878aSAndroid Build Coastguard Worker``clock_selector_c``.
52*61c4878aSAndroid Build Coastguard Worker
53*61c4878aSAndroid Build Coastguard Worker.. mermaid::
54*61c4878aSAndroid Build Coastguard Worker
55*61c4878aSAndroid Build Coastguard Worker    flowchart LR
56*61c4878aSAndroid Build Coastguard Worker          A(clock_a) -..-> C(clock_selector_c)
57*61c4878aSAndroid Build Coastguard Worker          B(clock_b)--> D(clock_divider_d)
58*61c4878aSAndroid Build Coastguard Worker          D -..-> C
59*61c4878aSAndroid Build Coastguard Worker
60*61c4878aSAndroid Build Coastguard Worker.. cpp:namespace-push:: pw::clock_tree::Element
61*61c4878aSAndroid Build Coastguard Worker
62*61c4878aSAndroid Build Coastguard WorkerDerived ``ClockSourceExample`` class template that overrides
63*61c4878aSAndroid Build Coastguard Worker:cpp:func:`DoEnable` and :cpp:func:`DoDisable` methods.
64*61c4878aSAndroid Build Coastguard Worker
65*61c4878aSAndroid Build Coastguard Worker.. literalinclude:: examples.cc
66*61c4878aSAndroid Build Coastguard Worker   :language: cpp
67*61c4878aSAndroid Build Coastguard Worker   :linenos:
68*61c4878aSAndroid Build Coastguard Worker   :start-after: [pw_clock_tree-examples-ClockSourceExampleDef]
69*61c4878aSAndroid Build Coastguard Worker   :end-before: [pw_clock_tree-examples-ClockSourceExampleDef]
70*61c4878aSAndroid Build Coastguard Worker
71*61c4878aSAndroid Build Coastguard WorkerDerived ``ClockDividerExample`` class template that overrides
72*61c4878aSAndroid Build Coastguard Worker:cpp:func:`DoEnable` method.
73*61c4878aSAndroid Build Coastguard Worker
74*61c4878aSAndroid Build Coastguard Worker.. literalinclude:: examples.cc
75*61c4878aSAndroid Build Coastguard Worker   :language: cpp
76*61c4878aSAndroid Build Coastguard Worker   :linenos:
77*61c4878aSAndroid Build Coastguard Worker   :start-after: [pw_clock_tree-examples-ClockDividerExampleDef]
78*61c4878aSAndroid Build Coastguard Worker   :end-before: [pw_clock_tree-examples-ClockDividerExampleDef]
79*61c4878aSAndroid Build Coastguard Worker
80*61c4878aSAndroid Build Coastguard WorkerDerived ``ClockSelectorExample`` class template that overrides
81*61c4878aSAndroid Build Coastguard Worker:cpp:func:`DoEnable` and :cpp:func:`DoDisable` methods,
82*61c4878aSAndroid Build Coastguard Workerand defines the ``SetSource`` method to allow the clock selector to change from one dependent source to
83*61c4878aSAndroid Build Coastguard Workeranother source. If the dependent source of a clock selector doesn't change at any point, one doesn't
84*61c4878aSAndroid Build Coastguard Workerneed to implement a method like ``SetSource``.
85*61c4878aSAndroid Build Coastguard Worker
86*61c4878aSAndroid Build Coastguard Worker.. cpp:namespace-pop::
87*61c4878aSAndroid Build Coastguard Worker
88*61c4878aSAndroid Build Coastguard Worker.. literalinclude:: examples.cc
89*61c4878aSAndroid Build Coastguard Worker   :language: cpp
90*61c4878aSAndroid Build Coastguard Worker   :linenos:
91*61c4878aSAndroid Build Coastguard Worker   :start-after: [pw_clock_tree-examples-ClockSelectorExampleDef]
92*61c4878aSAndroid Build Coastguard Worker   :end-before: [pw_clock_tree-examples-ClockSelectorExampleDef]
93*61c4878aSAndroid Build Coastguard Worker
94*61c4878aSAndroid Build Coastguard Worker.. cpp:namespace-push:: pw::clock_tree
95*61c4878aSAndroid Build Coastguard Worker
96*61c4878aSAndroid Build Coastguard WorkerDerived ``ClockTreeSetSource`` class that provides ``SetSource`` method to allow to change the
97*61c4878aSAndroid Build Coastguard Workersource a clock selector depends on. If ``ClockSelectorExample`` wouldn't provide the ``SetSource``
98*61c4878aSAndroid Build Coastguard Workermethod, one could use the :cpp:class:`ClockTree` class directly in the example below.
99*61c4878aSAndroid Build Coastguard Worker
100*61c4878aSAndroid Build Coastguard Worker.. literalinclude:: examples.cc
101*61c4878aSAndroid Build Coastguard Worker   :language: cpp
102*61c4878aSAndroid Build Coastguard Worker   :linenos:
103*61c4878aSAndroid Build Coastguard Worker   :start-after: [pw_clock_tree-examples-ClockTreeSetSourcesExampleDef]
104*61c4878aSAndroid Build Coastguard Worker   :end-before: [pw_clock_tree-examples-ClockTreeSetSourcesExampleDef]
105*61c4878aSAndroid Build Coastguard Worker
106*61c4878aSAndroid Build Coastguard WorkerDeclare the :cpp:class:`ClockTree` class object.
107*61c4878aSAndroid Build Coastguard Worker
108*61c4878aSAndroid Build Coastguard Worker.. literalinclude:: examples.cc
109*61c4878aSAndroid Build Coastguard Worker   :language: cpp
110*61c4878aSAndroid Build Coastguard Worker   :linenos:
111*61c4878aSAndroid Build Coastguard Worker   :start-after: [pw_clock_tree-examples-ClockTreeDec]
112*61c4878aSAndroid Build Coastguard Worker   :end-before: [pw_clock_tree-examples-ClockTreeDec]
113*61c4878aSAndroid Build Coastguard Worker
114*61c4878aSAndroid Build Coastguard WorkerDeclare the clock tree elements.
115*61c4878aSAndroid Build Coastguard Worker``clock_selector_c`` depends on ``clock_a``, and ``clock_divider_d`` depends on ``clock_b``.
116*61c4878aSAndroid Build Coastguard Worker
117*61c4878aSAndroid Build Coastguard Worker.. literalinclude:: examples.cc
118*61c4878aSAndroid Build Coastguard Worker   :language: cpp
119*61c4878aSAndroid Build Coastguard Worker   :linenos:
120*61c4878aSAndroid Build Coastguard Worker   :start-after: [pw_clock_tree-examples-ClockTreeElementsDec]
121*61c4878aSAndroid Build Coastguard Worker   :end-before: [pw_clock_tree-examples-ClockTreeElementsDec]
122*61c4878aSAndroid Build Coastguard Worker
123*61c4878aSAndroid Build Coastguard WorkerAcquire a reference to ``clock_selector_c``, which will acquire a reference to the dependent source
124*61c4878aSAndroid Build Coastguard Worker``clock_a``. When the reference to ``clock_a`` gets acquired, ``clock_a`` gets enabled. Once the
125*61c4878aSAndroid Build Coastguard Workerreference to ``clock_a`` has been acquired and it is enabled, ``clock_selector_c`` gets enabled.
126*61c4878aSAndroid Build Coastguard Worker
127*61c4878aSAndroid Build Coastguard Worker.. mermaid::
128*61c4878aSAndroid Build Coastguard Worker
129*61c4878aSAndroid Build Coastguard Worker    flowchart LR
130*61c4878aSAndroid Build Coastguard Worker          A(clock_A) -->C(clock_selector_c)
131*61c4878aSAndroid Build Coastguard Worker          B(clock_B)--> D(clock_divider_d)
132*61c4878aSAndroid Build Coastguard Worker          D -..-> C
133*61c4878aSAndroid Build Coastguard Worker          style A fill:#0f0,stroke:#333,stroke-width:4px
134*61c4878aSAndroid Build Coastguard Worker          style C fill:#0f0,stroke:#333,stroke-width:4px
135*61c4878aSAndroid Build Coastguard Worker          style B fill:#f00,stroke:#333,stroke-width:4px
136*61c4878aSAndroid Build Coastguard Worker          style D fill:#f00,stroke:#333,stroke-width:4px
137*61c4878aSAndroid Build Coastguard Worker
138*61c4878aSAndroid Build Coastguard Worker.. literalinclude:: examples.cc
139*61c4878aSAndroid Build Coastguard Worker   :language: cpp
140*61c4878aSAndroid Build Coastguard Worker   :linenos:
141*61c4878aSAndroid Build Coastguard Worker   :start-after: [pw_clock_tree-examples-AcquireClockSelectorC]
142*61c4878aSAndroid Build Coastguard Worker   :end-before: [pw_clock_tree-examples-AcquireClockSelectorC]
143*61c4878aSAndroid Build Coastguard Worker
144*61c4878aSAndroid Build Coastguard WorkerChange the dependent source of ``clock_selector_c`` from ``clock_a`` to ``clock_divider_d`` while
145*61c4878aSAndroid Build Coastguard Workerthe ``clock_selector_c`` is enabled. Before ``clock_divider_d`` can be configured as the new
146*61c4878aSAndroid Build Coastguard Workerdependent source, a reference to ``clock_divider_d`` will need to get acquired, which will acquire
147*61c4878aSAndroid Build Coastguard Workera reference to ``clock_b`` and enable ``clock_b`` before ``clock_divider_d`` gets enabled.
148*61c4878aSAndroid Build Coastguard WorkerOnce the dependent source has been changed from ``clock_a`` to ``clock_divider_d``, the reference to
149*61c4878aSAndroid Build Coastguard Worker``clock_a`` will get released, which will disable ``clock_a``.
150*61c4878aSAndroid Build Coastguard Worker
151*61c4878aSAndroid Build Coastguard Worker.. mermaid::
152*61c4878aSAndroid Build Coastguard Worker
153*61c4878aSAndroid Build Coastguard Worker    flowchart LR
154*61c4878aSAndroid Build Coastguard Worker          A(clock_A) -..->C(clock_selector_c)
155*61c4878aSAndroid Build Coastguard Worker          B(clock_B)--> D(clock_divider_d)
156*61c4878aSAndroid Build Coastguard Worker          D --> C
157*61c4878aSAndroid Build Coastguard Worker          style A fill:#f00,stroke:#333,stroke-width:4px
158*61c4878aSAndroid Build Coastguard Worker          style C fill:#0f0,stroke:#333,stroke-width:4px
159*61c4878aSAndroid Build Coastguard Worker          style B fill:#0f0,stroke:#333,stroke-width:4px
160*61c4878aSAndroid Build Coastguard Worker          style D fill:#0f0,stroke:#333,stroke-width:4px
161*61c4878aSAndroid Build Coastguard Worker
162*61c4878aSAndroid Build Coastguard Worker.. literalinclude:: examples.cc
163*61c4878aSAndroid Build Coastguard Worker   :language: cpp
164*61c4878aSAndroid Build Coastguard Worker   :linenos:
165*61c4878aSAndroid Build Coastguard Worker   :start-after: [pw_clock_tree-examples-ChangeClockSelectorCDependentSource]
166*61c4878aSAndroid Build Coastguard Worker   :end-before: [pw_clock_tree-examples-ChangeClockSelectorCDependentSource]
167*61c4878aSAndroid Build Coastguard Worker
168*61c4878aSAndroid Build Coastguard WorkerSet the clock divider value while the ``clock_divider_d`` is enabled.
169*61c4878aSAndroid Build Coastguard Worker
170*61c4878aSAndroid Build Coastguard Worker.. literalinclude:: examples.cc
171*61c4878aSAndroid Build Coastguard Worker   :language: cpp
172*61c4878aSAndroid Build Coastguard Worker   :linenos:
173*61c4878aSAndroid Build Coastguard Worker   :start-after: [pw_clock_tree-examples-SetClockDividerDValue]
174*61c4878aSAndroid Build Coastguard Worker   :end-before: [pw_clock_tree-examples-SetClockDividerDValue]
175*61c4878aSAndroid Build Coastguard Worker
176*61c4878aSAndroid Build Coastguard WorkerRelease the reference to the ``clock_selector_c``, which will disable ``clock_selector_c``, and
177*61c4878aSAndroid Build Coastguard Workerthen release the reference to ``clock_divider_d``. Then ``clock_divider_d`` will get disabled before
178*61c4878aSAndroid Build Coastguard Workerit releases its reference to ``clock_b`` that gets disabled afterward. At this point all clock
179*61c4878aSAndroid Build Coastguard Workertree elements are disabled.
180*61c4878aSAndroid Build Coastguard Worker
181*61c4878aSAndroid Build Coastguard Worker.. literalinclude:: examples.cc
182*61c4878aSAndroid Build Coastguard Worker   :language: cpp
183*61c4878aSAndroid Build Coastguard Worker   :linenos:
184*61c4878aSAndroid Build Coastguard Worker   :start-after: [pw_clock_tree-examples-ReleaseClockSelectorC]
185*61c4878aSAndroid Build Coastguard Worker   :end-before: [pw_clock_tree-examples-ReleaseClockSelectorC]
186