|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
音频驱动实验教程 0 Y/ u5 @' s2 C
6 `- e& B/ P3 F5 ^) |9 v$ P
* m9 P& r+ z# n8 r- B9 N# q; S# }# H, k5 H g
0 g* J6 _9 J! z, ~
图1 8 r" Z, x6 c; U0 V
如上图是音频模块 codec 和 cpu 连接框图,主要由三部分组成:
) U: k, {2 a" a2 V+ G: P1 [ I2C 总线 - cpu 通过它实现对 Codec 寄存器数据的读写。
& h5 a+ \- y; O3 X. j I2S 总线 - 实现音频数据在 CPU 和 Codec 间的通信。2 p* A6 [8 r9 N" X
HP_DEC - 实现检测是否有 HeadSet 设备插入。( r, ?) |# h7 L' [4 v1 C3 ?; X& s
: @- a8 z# u' ~& H5 H! I 第二节 linux workqueue 工作原理7 s. p$ p# t5 n* y0 k
音频子系统的源代码中用到了一个概念:workqueue。对于不了解的朋友,读代码可能会引起疑惑,所以这里做一个简单介绍。Linux 中的 Workqueue 机制就是为了简化内核线程的创建,只是通过调用 workqueue 的接口就能创建内核线程;并且可以根据当前系统 CPU 的个数创建线程的数量,使得线程处理的事务能够并行化;workqueue 是内核中实现简单而有效的机制,它显然简化了内核 Daemon 的创建,方便了用户的编程。工作队列(workqueue) 是另外一种将工作推后执行的形式。它把工作推后,交由一个内核线程去执行,也就是说, 这个下半部分可以在进程上下文中执行。最重要的就是工作队列允许被重新调度甚至是睡眠。 举个栗子:
0 Y3 x W1 ?' j6 O2 c* @- d0 q" d, l) Q5 Y, M
2 _, D n/ I+ t0 J8 z1 q
+ F( @& Q7 k+ o$ k$ M* U
5 O$ i- \. T: R3 |/ K' Q
代码1
! P2 U; V( m8 |* \% ~: X* {
" H' |/ J4 V1 D& ]6 S9 c8 r 第三节 电路原理图介绍5 o* L+ z: T* p: _
下图来源于文档 3128_sdk_a02_20170325.pdf 中第 18 页。" }# F. }7 H0 J
图一、绿色框中是 codec 芯片自己检测是否有 HeadSet 设备插入的电路原理图,它是通过 HP_HOOK(HP_HOOK 和 HP_DEC 是连在一条线上)与 cpu 的 ADC_IN0 连接,这个有点类似于 AD 按键检测的功能;音频 Codec 模块是数据与控制分开的,所以有 I2c 来控制 Codec 的寄存器的读写,数据通过 I2s 总线进行传输。
9 F. U2 d. A' \+ f
0 D0 K( W1 F3 f: M& o9 E9 j# C. a
( L1 t3 E' U" i7 W) L, Y
图29 I% O/ V9 c1 {, e, t
- _6 T1 l% G* w7 n- S
第四节 音频驱动代码结构% ~8 ]: M* [3 Y9 o3 m/ J3 |& X
% f0 Z" X8 ]2 l' z
' Q1 ]3 P# s% p0 {9 M) L+ K c- w
代码2
# |$ z/ u! \5 K8 F
( [; j. ^; ?8 b! u7 H1 r 第五节 dts 文件讲解+ @; r3 \/ U- }* w
( n3 t! n% W3 ^! n* t) y/ a( L
# Y% b; K9 Z( E y% n
7 f$ W' i4 @) I5 ?- m- s
代码3
$ ~2 z5 O9 W% h! X1 h$ x2 E* L
' U" ^% b2 m( e+ Y. K8 r HeadSet 配置文件, l7 y* V% n# _, @
) B2 w# a7 |0 V- E& I7 _+ J1 j
0 I( M+ r4 b& U) d6 {* W 代码4: B2 {; Z& z' ~7 J* ?; w) s
- |5 V0 t8 J- s# m& {2 P" N0 n
I2c 配置文件# K; z% [7 S3 \) Q _* V1 D
- i/ Y# i: o0 J. V
/ m7 Q0 P" {8 v/ M& r
代码5+ k: S' f W; U; O. z
I2s 配置文件4 k l' J. c/ p; j
rockchip-rt3224 {
' Z8 a6 C4 T6 f- M9 q7 S! \% N- G6 d
" u, o. s& M/ b8 y+ k I0 [
1 n* [" x# Z$ r9 ?' g& D4 F9 b
) Z( W3 P4 U7 _2 D 代码6
$ h3 { Y- T. c2 x- f4 l. ~5 E2 d
# h) F7 J q, ^& f; P, j 第六节 实验代码
" H; t8 Q: v/ o8 G' A, q( C 1.HeadSet 检测
2 y }4 J' F J; o6 y+ h r 原理类似于一个 ad 按键的功能。
: T" K* Y$ p; c4 y3 e% v 注意:这里如果要测试这个功能必须在 codec 中设置一个值:
6 |9 V7 {4 P2 c$ E% F codec_hp_det = <0>; ===> codec_hp_det = <1>;! b2 m4 X1 {) _* S. O. a$ I& D* k
增加两条测试信息到如下代码中。
0 d( g' \3 O' S& r6 g* j. W" v& {7 z4 D+ \# ^
$ ^8 L: e; @0 Q; G! m, V 代码7
% A1 B9 T( C+ t; e7 H- U2 @" a 耳机检测状态的调试:; [- l. L+ I' R2 Y6 [
cat sys/class/switch/h2w/state 0:无耳机插入
2 {8 F( N/ ~9 @) g* q/ K1 c' v 1:带Mic 耳机插入(四段耳机)
6 z3 M) `7 V- ~) A. b5 p Q/ M 2:不带 Mic 耳机插入(三段耳机)6 X0 p4 e ]# J- p6 |
2.测试命令 amix: `) Q6 l+ \1 D5 z. h0 e1 V( P
用 amix 命令来调节音量
2 x" ~1 P2 d a: z/ b2 P amix 11 0, b& L, O v" c/ ]$ ]
amix 11 120
7 o" B+ k: }6 o' m2 ^, G+ r) p8 I
3 W; G$ f+ o8 D7 z+ i
" [8 s6 K* y4 r/ _, N+ S$ g文件下载请点击:
6、音频驱动实验教程.pdf
(507.76 KB, 下载次数: 0)
* S- {7 J4 k8 M& r. Z# n$ J8 E3 S- J! X: e* L! Y% w
|
|