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