|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
音频驱动实验教程 $ f' u6 w* o7 T U# L" G
; I- \1 o/ H4 K1 W: F8 g& r( ^6 C" k" y
$ B% @! l$ i( F$ |) V# y
8 ]) z f" X8 T% o- x 图1 ; n, Z1 P: t% \- A* c0 G$ w- ~
如上图是音频模块 codec 和 cpu 连接框图,主要由三部分组成:
/ s; J5 K! ?( U( f8 a4 r, p0 J I2C 总线 - cpu 通过它实现对 Codec 寄存器数据的读写。0 a' _! s; I" j6 |
I2S 总线 - 实现音频数据在 CPU 和 Codec 间的通信。' I# L+ w( C" _5 R3 q5 \8 u, g4 g
HP_DEC - 实现检测是否有 HeadSet 设备插入。+ m& k: B) P f8 u# G( d7 I- D: F
* M6 c* o- U- V4 y3 G) B8 @
第二节 linux workqueue 工作原理$ c5 m9 C# q6 F+ n
音频子系统的源代码中用到了一个概念:workqueue。对于不了解的朋友,读代码可能会引起疑惑,所以这里做一个简单介绍。Linux 中的 Workqueue 机制就是为了简化内核线程的创建,只是通过调用 workqueue 的接口就能创建内核线程;并且可以根据当前系统 CPU 的个数创建线程的数量,使得线程处理的事务能够并行化;workqueue 是内核中实现简单而有效的机制,它显然简化了内核 Daemon 的创建,方便了用户的编程。工作队列(workqueue) 是另外一种将工作推后执行的形式。它把工作推后,交由一个内核线程去执行,也就是说, 这个下半部分可以在进程上下文中执行。最重要的就是工作队列允许被重新调度甚至是睡眠。 举个栗子:: y. M+ I1 l8 u+ Q# _5 e Q& c' ?
! b# x$ t0 Y4 H7 X. J1 H. q% |/ a+ Z5 B: d3 X5 J0 f! _. Y
* W& i" i `& p4 v4 Y
" K" X# V$ @+ J. N 代码1! N) Z( h, Z2 i8 R4 l7 a/ H
3 o5 Q5 R2 u% z2 n/ T& x 第三节 电路原理图介绍
) p0 [$ Z! R4 f 下图来源于文档 3128_sdk_a02_20170325.pdf 中第 18 页。
2 \; ? p: u$ b9 } z4 m 图一、绿色框中是 codec 芯片自己检测是否有 HeadSet 设备插入的电路原理图,它是通过 HP_HOOK(HP_HOOK 和 HP_DEC 是连在一条线上)与 cpu 的 ADC_IN0 连接,这个有点类似于 AD 按键检测的功能;音频 Codec 模块是数据与控制分开的,所以有 I2c 来控制 Codec 的寄存器的读写,数据通过 I2s 总线进行传输。; y s' c: Y9 b( @8 n7 `1 Q
0 Q) x* p& U8 v2 K, I
P) O7 h, @/ n9 [' O$ m2 }# E
图2
6 B9 z1 s, u0 A& Q6 X# i+ B$ u! k6 h# i
第四节 音频驱动代码结构
U z/ T8 O+ O2 L+ S, l4 E
+ y- _' g; l% e) Y9 f% _
" l1 Y2 J7 @ w& ? s, [( _8 i 代码2
3 a h$ ^; ]; W( f ?! ]) @$ a, h- X
第五节 dts 文件讲解
2 j6 a4 B3 M8 N/ ]4 e7 D1 Y, W' K @! o. _! q4 l7 P A
( {4 `9 G. G! U. j: _
8 g) Y; E0 T4 H6 n v
代码3
g) \4 v1 B0 k* z9 L0 `$ g+ q4 F3 E$ g$ u* \) A5 [/ S0 @. C+ J
HeadSet 配置文件
, e) o+ n% t) G3 n: [7 L& R( B" m) g q
4 E, T: ~5 z% L6 ^ 代码4
+ X: U& d) V2 b4 M2 j! Y
, m" t! {8 b- U I2c 配置文件( P2 ? {" l# j; N1 F9 b; {# x: O! U
3 o, G3 R1 \+ ^
. i) }# p" W/ Z1 {* K# e 代码5" W, ~# M! D% M$ d: ?% A
I2s 配置文件) u& R5 j& [: J3 y
rockchip-rt3224 {- a+ W, O! _. v- P9 K }
6 B% p$ q7 {) I, l( d+ D+ ~
9 L$ X/ S* k- p7 ~) I
6 \3 K- M* i* _& a# j
2 e' Q5 ~; i( `+ _5 u8 h& i! L 代码6( C- b7 {( R( i5 j" G; b
2 w% g* p7 a' Y+ D2 i2 P, w
第六节 实验代码8 {- _- u+ V+ p- a
1.HeadSet 检测
# {4 }/ ]# V0 J 原理类似于一个 ad 按键的功能。' B' Y$ L; ^5 l7 u! m Y
注意:这里如果要测试这个功能必须在 codec 中设置一个值:$ @, Q" ^# c3 u
codec_hp_det = <0>; ===> codec_hp_det = <1>;
0 u: A1 m0 k/ F* ? 增加两条测试信息到如下代码中。) @0 k3 R6 }% A
6 T" ]9 P% M3 b( ?+ y
8 q' z \# A8 f* t8 o
代码7
- i' [; e7 p$ J( H" `- E8 J 耳机检测状态的调试:+ l+ X6 P7 l0 ~; Z# D
cat sys/class/switch/h2w/state 0:无耳机插入% n0 Z1 v2 h( e2 v& D: G
1:带Mic 耳机插入(四段耳机)' y( ]/ I* P: r# E9 R( |1 z
2:不带 Mic 耳机插入(三段耳机)
7 R, J0 Q; `- \! b 2.测试命令 amix- E4 j9 o7 q4 f; N% w0 J
用 amix 命令来调节音量
/ m& E( `1 j# a# D/ o2 z% h amix 11 00 t; b4 x3 E/ o$ l6 [6 B$ F" q
amix 11 120: ?& U6 m" P9 ~, ^. I3 ~6 Z! K
7 Z& Y& F" ^( }+ {: _* k: p! I. @, M2 G. Q
- M$ F6 b/ W' ?3 s' V9 }- U文件下载请点击:
6、音频驱动实验教程.pdf
(507.76 KB, 下载次数: 0)
+ J# a5 O& q9 K- }, M
. e6 c; r4 ]' X) `) X |
|