File tree Expand file tree Collapse file tree 6 files changed +140
-0
lines changed
architectures/firmware/sof-zephyr/rtos_layer/io_drivers Expand file tree Collapse file tree 6 files changed +140
-0
lines changed Original file line number Diff line number Diff line change
1
+ .. _dmic_driver :
2
+
3
+ DMIC IO Driver
4
+ ##############
5
+
6
+ .. uml :: images/dmic_diagram.pu
7
+ :caption: DMIC IO Driver overview
8
+
9
+ Gateway Initialization
10
+ **********************
11
+
12
+ .. uml :: images/dmic_gateway_init.pu
13
+ :caption: DMIC Input Gateway Initialization
14
+
15
+ DMIC HW is initialized as follows:
16
+
17
+ 1. Mute microphones.
18
+ 2. Enable clock on microphones (also enable CIC and FIRs).
19
+ 3. Wait for clock stabilization (SoC defined delay).
20
+ 4. Unmute microphones using a curved ramp until the DC offset is gone and
21
+ replaced with the live stream.
22
+
23
+ Configuration BLOB
24
+ ******************
25
+
26
+ DMIC IO Driver is prepared for the configuration BLOB to come in context of any
27
+ instance of the DmicInput at any time. The configuration may be rejected if the
28
+ current state of PDM controllers and FIFOs is inappropriate. Accepting the
29
+ configuration does not always mean that it is immediately programmed to the HW.
30
+ The configuration is global, so when sent by an instance of DmicInput while
31
+ another instance is already running it is just compared with already programmed
32
+ data for the sake of consistency.
33
+
34
+ Gateway Release
35
+ ***************
36
+
37
+ .. uml :: images/dmic_gateway_release.pu
38
+ :caption: DMIC Input Gateway Release
39
+
40
+ State Transitions
41
+ *****************
42
+
43
+ .. uml :: images/dmic_gateway_state_transitions.pu
44
+ :caption: DMIC Input Gateway State Transition
Original file line number Diff line number Diff line change
1
+ @startuml
2
+
3
+ hide methods
4
+ hide attributes
5
+
6
+ component Zephyr {
7
+ class DmicDriver
8
+ interface dai_dmic_ops
9
+ interface dai_driver_api
10
+ }
11
+
12
+ component MPP {
13
+ interface Gateway
14
+
15
+ interface IoDriver
16
+ class DmicManager
17
+ class DmicInput
18
+ }
19
+
20
+ DmicDriver -up- dai_dmic_ops
21
+
22
+ dai_dmic_ops -left-|> dai_driver_api : implements
23
+
24
+ DmicManager -up- IoDriver
25
+ DmicManager -left-> DmicInput : manages
26
+ DmicInput -up- Gateway
27
+ DmicInput -down-> dai_dmic_ops : calls
28
+ DmicDriver --* DmicInput
29
+
30
+ @enduml
Original file line number Diff line number Diff line change
1
+ @startuml
2
+
3
+ participant "DMIC Manager" as dmic_manager
4
+ participant "Zephyr PM Subsystem" as zephyr_pm
5
+ participant "DMIC Driver" as dmic_driver
6
+
7
+ -> dmic_manager : gateway_allocate()
8
+ activate dmic_manager
9
+ dmic_manager -> zephyr_pm : pm_runtime_device_get (dmic)
10
+
11
+ activate zephyr_pm
12
+ zephyr_pm -> zephyr_pm : increase usage count
13
+ opt if usage == 1
14
+ zephyr_pm -> dmic_driver : pm_device_resume
15
+ activate dmic_driver
16
+ return
17
+ end
18
+ return
19
+
20
+ deactivate dmic_manager
21
+ <-- dmic_manager
22
+
23
+ @enduml
Original file line number Diff line number Diff line change
1
+ @startuml
2
+
3
+ participant "DMIC Manager" as dmic_manager
4
+ participant "Zephyr PM Subsystem" as zephyr_pm
5
+ participant "DMIC Driver" as dmic_driver
6
+
7
+ -> dmic_manager : gateway_release()
8
+ activate dmic_manager
9
+ dmic_manager -> zephyr_pm : pm_runtime_device_put (dmic)
10
+
11
+ activate zephyr_pm
12
+ zephyr_pm -> zephyr_pm : decrease usage count
13
+ opt if usage == 0
14
+ zephyr_pm -> dmic_driver : pm_device_suspend
15
+ activate dmic_driver
16
+ return
17
+ end
18
+ return
19
+
20
+ deactivate dmic_manager
21
+ <-- dmic_manager
22
+
23
+ @enduml
Original file line number Diff line number Diff line change
1
+
2
+ participant "Dmic Input\nGateway" as dmic_input
3
+ participant "DMA" as dma
4
+
5
+ == Dmic Input : STOPPED ==
6
+
7
+ -> dmic_input : STOPPED
8
+ dmic_input -> dma : stop()
9
+
10
+ == Dmic Input : PAUSED ==
11
+
12
+ -> dmic_input : PAUSED
13
+ dmic_input -> dma : init_transfer()
14
+ dmic_input -> dma : pause()
15
+
16
+ == Dmic Input : RUNNING ==
17
+
18
+ -> dmic_input : RUNNING
19
+ dmic_input -> dma : start()
Original file line number Diff line number Diff line change @@ -28,3 +28,4 @@ Drivers
28
28
29
29
hda/hda_driver
30
30
i2s/i2s_driver
31
+ dmic/dmic_driver
You can’t perform that action at this time.
0 commit comments