Blame view

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