1*61c4878aSAndroid Build Coastguard Worker.. _module-pw_clock_tree: 2*61c4878aSAndroid Build Coastguard Worker 3*61c4878aSAndroid Build Coastguard Worker================ 4*61c4878aSAndroid Build Coastguard Workerpw_clock_tree 5*61c4878aSAndroid Build Coastguard Worker================ 6*61c4878aSAndroid Build Coastguard Worker.. pigweed-module:: 7*61c4878aSAndroid Build Coastguard Worker :name: pw_clock_tree 8*61c4878aSAndroid Build Coastguard Worker 9*61c4878aSAndroid Build Coastguard Worker - **Constinit compatible**: Clock tree elements can be declared as ``constinit`` 10*61c4878aSAndroid Build Coastguard Worker - **Platform independent**: Clock tree management sits above the platform layer 11*61c4878aSAndroid Build Coastguard Worker - **Handles complex topologies**: Clock tree elements can be used to model 12*61c4878aSAndroid Build Coastguard Worker complex clock tree topologies 13*61c4878aSAndroid Build Coastguard Worker 14*61c4878aSAndroid Build Coastguard Worker``pw_clock_tree`` provides class definitions to implement a platform 15*61c4878aSAndroid Build Coastguard Workerspecific clock tree management solution. By passing the clock tree element 16*61c4878aSAndroid Build Coastguard Workerthat clocks a particular device to the corresponding device driver, the 17*61c4878aSAndroid Build Coastguard Workerdevice driver can ensure that the clock is only enabled when required to 18*61c4878aSAndroid Build Coastguard Workermaximize power savings. 19*61c4878aSAndroid Build Coastguard Worker 20*61c4878aSAndroid Build Coastguard WorkerFor example the clock tree functionality could be integrated into a uart device driver 21*61c4878aSAndroid Build Coastguard Workerlike this: 22*61c4878aSAndroid Build Coastguard Worker 23*61c4878aSAndroid Build Coastguard Worker.. literalinclude:: examples.cc 24*61c4878aSAndroid Build Coastguard Worker :language: cpp 25*61c4878aSAndroid Build Coastguard Worker :linenos: 26*61c4878aSAndroid Build Coastguard Worker :start-after: [pw_clock_tree-examples-IntegrationIntoDeviceDriversClassDef] 27*61c4878aSAndroid Build Coastguard Worker :end-before: // Device constructor that optionally accepts 28*61c4878aSAndroid Build Coastguard Worker 29*61c4878aSAndroid Build Coastguard WorkerIt could be initialized and used like this: 30*61c4878aSAndroid Build Coastguard Worker 31*61c4878aSAndroid Build Coastguard Worker.. literalinclude:: examples.cc 32*61c4878aSAndroid Build Coastguard Worker :language: cpp 33*61c4878aSAndroid Build Coastguard Worker :linenos: 34*61c4878aSAndroid Build Coastguard Worker :start-after: [pw_clock_tree-examples-IntegrationIntoDeviceDriversUsage] 35*61c4878aSAndroid Build Coastguard Worker :end-before: [pw_clock_tree-examples-IntegrationIntoDeviceDriversUsage] 36*61c4878aSAndroid Build Coastguard Worker 37*61c4878aSAndroid Build Coastguard Worker.. grid:: 2 38*61c4878aSAndroid Build Coastguard Worker 39*61c4878aSAndroid Build Coastguard Worker .. grid-item-card:: :octicon:`rocket` Quickstart 40*61c4878aSAndroid Build Coastguard Worker :link: module-pw_clock_tree-examples 41*61c4878aSAndroid Build Coastguard Worker :link-type: ref 42*61c4878aSAndroid Build Coastguard Worker :class-item: sales-pitch-cta-primary 43*61c4878aSAndroid Build Coastguard Worker 44*61c4878aSAndroid Build Coastguard Worker Examples that show how to integrate a clock tree into a device driver, 45*61c4878aSAndroid Build Coastguard Worker and how to define and use platform specific clock tree elements. 46*61c4878aSAndroid Build Coastguard Worker 47*61c4878aSAndroid Build Coastguard Worker .. grid-item-card:: :octicon:`code-square` Reference 48*61c4878aSAndroid Build Coastguard Worker :link: module-pw_clock_tree-reference 49*61c4878aSAndroid Build Coastguard Worker :link-type: ref 50*61c4878aSAndroid Build Coastguard Worker :class-item: sales-pitch-cta-secondary 51*61c4878aSAndroid Build Coastguard Worker 52*61c4878aSAndroid Build Coastguard Worker API references for ``pw::clock_tree::Element``, 53*61c4878aSAndroid Build Coastguard Worker ``pw::clock_tree::DependentElement``, ``pw::clock_tree::ClockTree``, 54*61c4878aSAndroid Build Coastguard Worker and more. 55*61c4878aSAndroid Build Coastguard Worker 56*61c4878aSAndroid Build Coastguard Worker 57*61c4878aSAndroid Build Coastguard Worker-------- 58*61c4878aSAndroid Build Coastguard WorkerOverview 59*61c4878aSAndroid Build Coastguard Worker-------- 60*61c4878aSAndroid Build Coastguard Worker.. cpp:namespace-push:: pw::clock_tree::ClockTree 61*61c4878aSAndroid Build Coastguard Worker 62*61c4878aSAndroid Build Coastguard WorkerPigweed's clock tree module provides the ability to represent the clock tree of an embedded 63*61c4878aSAndroid Build Coastguard Workerdevice, and to manage the individual clocks and clock tree elements. 64*61c4878aSAndroid Build Coastguard Worker 65*61c4878aSAndroid Build Coastguard WorkerThe :cpp:class:`ClockTree` implements two basic methods that apply to all clock tree elements: 66*61c4878aSAndroid Build Coastguard Worker 67*61c4878aSAndroid Build Coastguard Worker* :cpp:func:`Acquire` 68*61c4878aSAndroid Build Coastguard Worker* :cpp:func:`Release` 69*61c4878aSAndroid Build Coastguard Worker 70*61c4878aSAndroid Build Coastguard WorkerIn addition, clock divider elements can use the :cpp:func:`SetDividerValue` method to update the current 71*61c4878aSAndroid Build Coastguard Workerclock divider value. 72*61c4878aSAndroid Build Coastguard Worker 73*61c4878aSAndroid Build Coastguard Worker.. cpp:namespace-pop:: 74*61c4878aSAndroid Build Coastguard Worker 75*61c4878aSAndroid Build Coastguard Worker.. cpp:namespace-push:: pw::clock_tree::Element 76*61c4878aSAndroid Build Coastguard Worker 77*61c4878aSAndroid Build Coastguard WorkerThe clock tree module defines the :cpp:class:`Element` abstract class from which all 78*61c4878aSAndroid Build Coastguard Workerother classes are derived from. The :cpp:class:`Element` abstract class implements basic reference 79*61c4878aSAndroid Build Coastguard Workercounting methods :cpp:func:`IncRef` and :cpp:func:`DecRef`, but requires derived classes to use the 80*61c4878aSAndroid Build Coastguard Workerreference counting methods to properly acquire and release references to clock 81*61c4878aSAndroid Build Coastguard Workertree elements. If an :cpp:class:`Element` reference is passed to a constructor of a 82*61c4878aSAndroid Build Coastguard Workerderived :cpp:class:`Element`, the class object depends on the referenced :cpp:class:`Element` object. 83*61c4878aSAndroid Build Coastguard Worker 84*61c4878aSAndroid Build Coastguard WorkerThree derived abstract classes are defined for :cpp:class:`Element`: 85*61c4878aSAndroid Build Coastguard Worker 86*61c4878aSAndroid Build Coastguard Worker.. cpp:namespace-pop:: 87*61c4878aSAndroid Build Coastguard Worker 88*61c4878aSAndroid Build Coastguard Worker.. cpp:namespace-push:: pw::clock_tree 89*61c4878aSAndroid Build Coastguard Worker 90*61c4878aSAndroid Build Coastguard Worker* :cpp:class:`ElementBlocking` for clock tree elements that might block when acquired or released. 91*61c4878aSAndroid Build Coastguard Worker Acquiring or releasing such a clock tree element might fail. 92*61c4878aSAndroid Build Coastguard Worker* :cpp:class:`ElementNonBlockingCannotFail` for clock tree elements that will not block when 93*61c4878aSAndroid Build Coastguard Worker acquired or released. Acquiring or releasing such a clock tree element will always succeed. 94*61c4878aSAndroid Build Coastguard Worker* :cpp:class:`ElementNonBlockingMightFail` for clock tree elements that will not block when 95*61c4878aSAndroid Build Coastguard Worker acquired or released. Acquiring or releasing such a clock tree element might fail. 96*61c4878aSAndroid Build Coastguard Worker 97*61c4878aSAndroid Build Coastguard Worker:cpp:class:`ElementNonBlockingCannotFail` and :cpp:class:`ElementsNonBlockingMightFail` elements can 98*61c4878aSAndroid Build Coastguard Workerbe acquired from an interrupt context. 99*61c4878aSAndroid Build Coastguard Worker 100*61c4878aSAndroid Build Coastguard WorkerAll classes representing a clock tree element should be implemented as a template and accept 101*61c4878aSAndroid Build Coastguard Worker:cpp:class:`ElementBlocking`, :cpp:class:`ElementNonBlockingCannotFail` or 102*61c4878aSAndroid Build Coastguard Worker:cpp:class:`ElementNonBlockingMightFail` as a template argument. Only if it is known at compile time 103*61c4878aSAndroid Build Coastguard Workerthat a clock tree element can only be either blocking or non-blocking, one can directly derive the 104*61c4878aSAndroid Build Coastguard Workerclass from :cpp:class:`ElementBlocking` or :cpp:class:`ElementNonBlockingCannotFail` / 105*61c4878aSAndroid Build Coastguard Worker:cpp:class:`ElementNonBlockingMightFail`, respectively. 106*61c4878aSAndroid Build Coastguard Worker 107*61c4878aSAndroid Build Coastguard Worker.. cpp:namespace-pop:: 108*61c4878aSAndroid Build Coastguard Worker 109*61c4878aSAndroid Build Coastguard Worker.. cpp:namespace-push:: pw::clock_tree::ElementController 110*61c4878aSAndroid Build Coastguard Worker 111*61c4878aSAndroid Build Coastguard WorkerFor ease of use :cpp:class:`ElementController` encapsulates :cpp:class:`ClockTree` and :cpp:class:`Element` into a single object and provides :cpp:func:`Acquire` and :cpp:func:`Release` methods that check whether both optional objects have been specified, and only if yes, call the respective :cpp:class:`ClockTree` methods, otherwise they return ``pw::OkStatus()``. 112*61c4878aSAndroid Build Coastguard Worker 113*61c4878aSAndroid Build Coastguard Worker.. cpp:namespace-pop:: 114*61c4878aSAndroid Build Coastguard Worker 115*61c4878aSAndroid Build Coastguard Worker--------------- 116*61c4878aSAndroid Build Coastguard WorkerSynchronization 117*61c4878aSAndroid Build Coastguard Worker--------------- 118*61c4878aSAndroid Build Coastguard Worker.. cpp:namespace-push:: pw::clock_tree 119*61c4878aSAndroid Build Coastguard Worker 120*61c4878aSAndroid Build Coastguard WorkerThe clock tree class uses a mutex to serialize access to :cpp:class:`ElementBlocking` clock tree 121*61c4878aSAndroid Build Coastguard Workerelements, and uses an interrupt spin lock to serialize access to 122*61c4878aSAndroid Build Coastguard Worker:cpp:class:`ElementNonBlockingCannotFail` and :cpp:class:`ElementNonBlockingMightFail` clock tree 123*61c4878aSAndroid Build Coastguard Workerelements. :cpp:class:`ElementBlocking` clock tree elements and 124*61c4878aSAndroid Build Coastguard Worker:cpp:class:`ElementNonBlockingCannotFail` / :cpp:class:`ElementNonBlockingMightFail` clock tree 125*61c4878aSAndroid Build Coastguard Workerelements are not serialized with each other, while :cpp:class:`ElementNonBlockingCannotFail` and 126*61c4878aSAndroid Build Coastguard Worker:cpp:class:`ElementNonBlockingMightFail` are serialized with each other. 127*61c4878aSAndroid Build Coastguard Worker 128*61c4878aSAndroid Build Coastguard Worker.. cpp:namespace-pop:: 129*61c4878aSAndroid Build Coastguard Worker 130*61c4878aSAndroid Build Coastguard Worker.. toctree:: 131*61c4878aSAndroid Build Coastguard Worker :hidden: 132*61c4878aSAndroid Build Coastguard Worker :maxdepth: 1 133*61c4878aSAndroid Build Coastguard Worker 134*61c4878aSAndroid Build Coastguard Worker examples 135*61c4878aSAndroid Build Coastguard Worker api 136*61c4878aSAndroid Build Coastguard Worker implementations 137