|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
音频驱动实验教程 % u$ T* x* q3 W4 A @3 b. @2 m; n: m
, D: a" \8 i2 T( I; I# I
0 A, n. V9 I% O& Z; o
! l U; O% Y5 b8 B7 I# ]% O; A4 K
7 a( ?' z0 [5 d+ i 图1 ]8 j0 l. K4 |. ^' H! z
如上图是音频模块 codec 和 cpu 连接框图,主要由三部分组成:
' w: t1 g' C; _$ X, j1 {- a I2C 总线 - cpu 通过它实现对 Codec 寄存器数据的读写。 I7 S. H6 x% C/ O
I2S 总线 - 实现音频数据在 CPU 和 Codec 间的通信。
% J5 |+ c7 s) X) x) N T: E/ Z' h HP_DEC - 实现检测是否有 HeadSet 设备插入。
: [* Z G% ~- j @0 O: B
! u# J! H7 I. B0 U6 }2 j( n 第二节 linux workqueue 工作原理
0 O$ G% i- y1 ?" g" z 音频子系统的源代码中用到了一个概念:workqueue。对于不了解的朋友,读代码可能会引起疑惑,所以这里做一个简单介绍。Linux 中的 Workqueue 机制就是为了简化内核线程的创建,只是通过调用 workqueue 的接口就能创建内核线程;并且可以根据当前系统 CPU 的个数创建线程的数量,使得线程处理的事务能够并行化;workqueue 是内核中实现简单而有效的机制,它显然简化了内核 Daemon 的创建,方便了用户的编程。工作队列(workqueue) 是另外一种将工作推后执行的形式。它把工作推后,交由一个内核线程去执行,也就是说, 这个下半部分可以在进程上下文中执行。最重要的就是工作队列允许被重新调度甚至是睡眠。 举个栗子:) v3 b4 _+ @/ e
* L2 ] }. }/ S# S0 W$ N, h
8 I- T, e: h/ v& g2 r% r
' O8 w# j' C% p% r4 U) b! _
5 u. @3 t: C5 E z" u* ~: P 代码1
: G% z8 k6 l: l. M+ Q% ?! L+ |* q& C$ C; p
第三节 电路原理图介绍
2 S, I. q5 m; f 下图来源于文档 3128_sdk_a02_20170325.pdf 中第 18 页。
) e: L8 W) b# Z+ Z$ v ~ 图一、绿色框中是 codec 芯片自己检测是否有 HeadSet 设备插入的电路原理图,它是通过 HP_HOOK(HP_HOOK 和 HP_DEC 是连在一条线上)与 cpu 的 ADC_IN0 连接,这个有点类似于 AD 按键检测的功能;音频 Codec 模块是数据与控制分开的,所以有 I2c 来控制 Codec 的寄存器的读写,数据通过 I2s 总线进行传输。" [% Z9 s. v/ g, P7 R7 p
* B$ ]6 m Q0 {& J+ D
6 L: N0 C6 _. e: r; k
图2. P! u" h( V2 O
) i. g0 E6 p {7 b5 _+ w4 B0 c 第四节 音频驱动代码结构
. y& k: y% I0 I, b% c' O/ H/ \ g+ Q6 q& L! S
}# b& K+ [9 B- G 代码27 J+ Q' ?" V ]
4 E6 S3 R8 s4 T 第五节 dts 文件讲解" d; {$ r8 t6 ], J- L5 x
# n. [/ B L) ] \: \
8 ^- |. V/ t' e2 b& B
( c$ ?4 b+ u! Q! i9 H' o/ I
代码30 H2 V! t0 y* n( U
( _) I9 d+ V( ]2 ^- n2 X7 S
HeadSet 配置文件8 n- D6 g# o9 i" }7 C2 T6 s
. m" |6 L+ j: y: b7 f
' _7 v3 ] U% [6 L+ ~ 代码4: k9 X* ]4 c8 u0 I0 S5 e- F
/ N7 H J7 ?4 j1 f! G; ^: }
I2c 配置文件" m! u% v K1 m ?. V' d
5 w- b- R' m. F% \$ y
& t$ X# a7 F: R- B" r( [% o+ q% B
代码5: ]6 V. q4 a7 g/ @4 Z
I2s 配置文件
; o1 s. ^& ]2 V( o" z rockchip-rt3224 {' b5 Y: {/ f" M `
, R3 u |5 c: Q: _+ ?4 P
0 |0 ` d& p' O
+ ?- E+ @ N1 \1 _
5 f1 w. k/ v' f8 c9 f; p3 S 代码61 `8 K3 L+ o5 C3 [
* \5 B9 q; r6 P8 A 第六节 实验代码6 H' ~8 Y; u6 {4 P% n" z" b
1.HeadSet 检测$ A4 h F% p' y# g, r
原理类似于一个 ad 按键的功能。
2 g3 `& ^4 i$ |8 f! e2 T v' E 注意:这里如果要测试这个功能必须在 codec 中设置一个值:8 i5 r! ` X/ V7 b6 O/ B
codec_hp_det = <0>; ===> codec_hp_det = <1>;
7 u& b I& ?( } 增加两条测试信息到如下代码中。
) N) j$ ]% V! V& a7 m7 _5 q3 W( C* e5 h U' I
+ G* `, r% U8 D( ^) X' [- ] 代码7 |7 S( ?4 Q- l
耳机检测状态的调试:
( I# S$ v# G7 t cat sys/class/switch/h2w/state 0:无耳机插入& m) \: O) b* V( y+ q. N _
1:带Mic 耳机插入(四段耳机)
( o- p5 N2 n( i Y% M 2:不带 Mic 耳机插入(三段耳机)
# x) v/ z% h: M1 ]5 O 2.测试命令 amix4 W. O8 V1 c3 J G2 d( `# x$ ~& A9 [
用 amix 命令来调节音量" b! t9 H2 [+ X. e$ u
amix 11 0
) V6 |, ^4 c2 e _ amix 11 120/ J" q2 C9 e/ o% w
0 j/ R* D! Z* @% L0 T, E
) ]) D4 |" N9 V( ^' ~
! D6 a! c; o9 e6 a6 J% i! T0 f7 }# K文件下载请点击:
6、音频驱动实验教程.pdf
(507.76 KB, 下载次数: 0)
; P( l: n! ~" I4 U
4 h% Q, C) q: i, ^4 l |
|