Based on kernel version 4.9. Page generated on 2016-12-21 14:35 EST.
1 LED Transient Trigger 2 ===================== 3 4 The leds timer trigger does not currently have an interface to activate 5 a one shot timer. The current support allows for setting two timers, one for 6 specifying how long a state to be on, and the second for how long the state 7 to be off. The delay_on value specifies the time period an LED should stay 8 in on state, followed by a delay_off value that specifies how long the LED 9 should stay in off state. The on and off cycle repeats until the trigger 10 gets deactivated. There is no provision for one time activation to implement 11 features that require an on or off state to be held just once and then stay in 12 the original state forever. 13 14 Without one shot timer interface, user space can still use timer trigger to 15 set a timer to hold a state, however when user space application crashes or 16 goes away without deactivating the timer, the hardware will be left in that 17 state permanently. 18 19 As a specific example of this use-case, let's look at vibrate feature on 20 phones. Vibrate function on phones is implemented using PWM pins on SoC or 21 PMIC. There is a need to activate one shot timer to control the vibrate 22 feature, to prevent user space crashes leaving the phone in vibrate mode 23 permanently causing the battery to drain. 24 25 Transient trigger addresses the need for one shot timer activation. The 26 transient trigger can be enabled and disabled just like the other leds 27 triggers. 28 29 When an led class device driver registers itself, it can specify all leds 30 triggers it supports and a default trigger. During registration, activation 31 routine for the default trigger gets called. During registration of an led 32 class device, the LED state does not change. 33 34 When the driver unregisters, deactivation routine for the currently active 35 trigger will be called, and LED state is changed to LED_OFF. 36 37 Driver suspend changes the LED state to LED_OFF and resume doesn't change 38 the state. Please note that there is no explicit interaction between the 39 suspend and resume actions and the currently enabled trigger. LED state 40 changes are suspended while the driver is in suspend state. Any timers 41 that are active at the time driver gets suspended, continue to run, without 42 being able to actually change the LED state. Once driver is resumed, triggers 43 start functioning again. 44 45 LED state changes are controlled using brightness which is a common led 46 class device property. When brightness is set to 0 from user space via 47 echo 0 > brightness, it will result in deactivating the current trigger. 48 49 Transient trigger uses standard register and unregister interfaces. During 50 trigger registration, for each led class device that specifies this trigger 51 as its default trigger, trigger activation routine will get called. During 52 registration, the LED state does not change, unless there is another trigger 53 active, in which case LED state changes to LED_OFF. 54 55 During trigger unregistration, LED state gets changed to LED_OFF. 56 57 Transient trigger activation routine doesn't change the LED state. It 58 creates its properties and does its initialization. Transient trigger 59 deactivation routine, will cancel any timer that is active before it cleans 60 up and removes the properties it created. It will restore the LED state to 61 non-transient state. When driver gets suspended, irrespective of the transient 62 state, the LED state changes to LED_OFF. 63 64 Transient trigger can be enabled and disabled from user space on led class 65 devices, that support this trigger as shown below: 66 67 echo transient > trigger 68 echo none > trigger 69 70 NOTE: Add a new property trigger state to control the state. 71 72 This trigger exports three properties, activate, state, and duration. When 73 transient trigger is activated these properties are set to default values. 74 75 - duration allows setting timer value in msecs. The initial value is 0. 76 - activate allows activating and deactivating the timer specified by 77 duration as needed. The initial and default value is 0. This will allow 78 duration to be set after trigger activation. 79 - state allows user to specify a transient state to be held for the specified 80 duration. 81 82 activate - one shot timer activate mechanism. 83 1 when activated, 0 when deactivated. 84 default value is zero when transient trigger is enabled, 85 to allow duration to be set. 86 87 activate state indicates a timer with a value of specified 88 duration running. 89 deactivated state indicates that there is no active timer 90 running. 91 92 duration - one shot timer value. When activate is set, duration value 93 is used to start a timer that runs once. This value doesn't 94 get changed by the trigger unless user does a set via 95 echo new_value > duration 96 97 state - transient state to be held. It has two values 0 or 1. 0 maps 98 to LED_OFF and 1 maps to LED_FULL. The specified state is 99 held for the duration of the one shot timer and then the 100 state gets changed to the non-transient state which is the 101 inverse of transient state. 102 If state = LED_FULL, when the timer runs out the state will 103 go back to LED_OFF. 104 If state = LED_OFF, when the timer runs out the state will 105 go back to LED_FULL. 106 Please note that current LED state is not checked prior to 107 changing the state to the specified state. 108 Driver could map these values to inverted depending on the 109 default states it defines for the LED in its brightness_set() 110 interface which is called from the led brightness_set() 111 interfaces to control the LED state. 112 113 When timer expires activate goes back to deactivated state, duration is left 114 at the set value to be used when activate is set at a future time. This will 115 allow user app to set the time once and activate it to run it once for the 116 specified value as needed. When timer expires, state is restored to the 117 non-transient state which is the inverse of the transient state. 118 119 echo 1 > activate - starts timer = duration when duration is not 0. 120 echo 0 > activate - cancels currently running timer. 121 echo n > duration - stores timer value to be used upon next 122 activate. Currently active timer if 123 any, continues to run for the specified time. 124 echo 0 > duration - stores timer value to be used upon next 125 activate. Currently active timer if any, 126 continues to run for the specified time. 127 echo 1 > state - stores desired transient state LED_FULL to be 128 held for the specified duration. 129 echo 0 > state - stores desired transient state LED_OFF to be 130 held for the specified duration. 131 132 What is not supported: 133 ====================== 134 - Timer activation is one shot and extending and/or shortening the timer 135 is not supported. 136 137 Example use-case 1: 138 echo transient > trigger 139 echo n > duration 140 echo 1 > state 141 repeat the following step as needed: 142 echo 1 > activate - start timer = duration to run once 143 echo 1 > activate - start timer = duration to run once 144 echo none > trigger 145 146 This trigger is intended to be used for for the following example use cases: 147 - Control of vibrate (phones, tablets etc.) hardware by user space app. 148 - Use of LED by user space app as activity indicator. 149 - Use of LED by user space app as a kind of watchdog indicator -- as 150 long as the app is alive, it can keep the LED illuminated, if it dies 151 the LED will be extinguished automatically. 152 - Use by any user space app that needs a transient GPIO output.