|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
音频驱动实验教程 6 a' @2 q' D& a/ R
/ M+ B5 Q0 _. P1 R
" }) K; J) | o: S6 l0 e9 x
0 g& a8 T% ~. Z- F2 o
6 `, F+ [' `9 o 图1 - ~1 P- l3 Y& ^4 o2 i! C
如上图是音频模块 codec 和 cpu 连接框图,主要由三部分组成:0 j9 L4 J! F, k k2 U6 [; x% Q
I2C 总线 - cpu 通过它实现对 Codec 寄存器数据的读写。: @" a! u: h2 T1 x* Z8 `2 ]3 h
I2S 总线 - 实现音频数据在 CPU 和 Codec 间的通信。4 y6 o6 f! Q8 o1 \
HP_DEC - 实现检测是否有 HeadSet 设备插入。( L; ~$ x/ d f+ h! v4 U3 f
, Z% s0 ?8 {' A7 J: U- t
第二节 linux workqueue 工作原理, v1 Q$ q9 f7 i. a6 l: F5 m
音频子系统的源代码中用到了一个概念:workqueue。对于不了解的朋友,读代码可能会引起疑惑,所以这里做一个简单介绍。Linux 中的 Workqueue 机制就是为了简化内核线程的创建,只是通过调用 workqueue 的接口就能创建内核线程;并且可以根据当前系统 CPU 的个数创建线程的数量,使得线程处理的事务能够并行化;workqueue 是内核中实现简单而有效的机制,它显然简化了内核 Daemon 的创建,方便了用户的编程。工作队列(workqueue) 是另外一种将工作推后执行的形式。它把工作推后,交由一个内核线程去执行,也就是说, 这个下半部分可以在进程上下文中执行。最重要的就是工作队列允许被重新调度甚至是睡眠。 举个栗子:3 t5 j5 Y" w9 u4 ~+ @& \
+ s& g+ P0 d# ]
- o- L0 e* S c/ P2 [$ x. P- K: _, n
$ W: ~4 e9 n! Y7 x& y 代码1% {3 `' _$ A7 u/ r
/ E! ^2 ?# X7 r) |, ~7 M
第三节 电路原理图介绍
, O9 a# U+ p+ U! R7 H/ L 下图来源于文档 3128_sdk_a02_20170325.pdf 中第 18 页。
1 b9 A5 }* g+ [: N* x4 i 图一、绿色框中是 codec 芯片自己检测是否有 HeadSet 设备插入的电路原理图,它是通过 HP_HOOK(HP_HOOK 和 HP_DEC 是连在一条线上)与 cpu 的 ADC_IN0 连接,这个有点类似于 AD 按键检测的功能;音频 Codec 模块是数据与控制分开的,所以有 I2c 来控制 Codec 的寄存器的读写,数据通过 I2s 总线进行传输。9 d- a2 V& Q9 w$ M3 n0 R/ g
% u5 k2 f5 `$ m4 P) T8 K
8 [( p* t; _0 Y! U( H! R8 j
图2
9 a, H0 h6 `5 h9 @: T M- B( ?: n) j
第四节 音频驱动代码结构
7 A* f2 c) Q9 l" G8 P# _% I
7 g; m( d& H* g" w, y
: p3 O" q2 \( ^0 C2 O 代码2
; L' r. f; i0 E& u" @4 f7 [( {& Q" J/ v- N9 {( a% \
第五节 dts 文件讲解3 t3 [7 j- ~6 u6 T }6 i
) E3 ]. V7 q$ p! r4 W
- o, M: b/ `/ T4 p5 N$ F# t& u
q) i' l1 y5 [1 | 代码30 W- ?: y; p1 C* u" W8 C( s/ u1 v
! s* Z0 Z, Q+ D" p HeadSet 配置文件# ^, o6 T8 w8 x7 @
' O8 X9 i6 R+ l: O2 R1 X! v
; {7 [) \2 T8 `, n% Q
代码4+ @% i- k: p; v5 f j3 r
1 s/ P: F; x/ z" |
I2c 配置文件
* k! V: g+ w- x# p7 W1 i* A0 p6 p9 t. j5 S- | U0 N3 x
3 l# P6 `: ?& n$ \ 代码5
* v7 w* w) ~- t7 K' P, O I2s 配置文件9 r' o% I4 `8 g5 z
rockchip-rt3224 {: q0 `5 Z+ r1 G9 ?8 d; A/ n7 w
9 i' `6 J+ K6 U/ m; c
9 ^: S/ w$ w7 m* n7 ?. I! U1 A' X! O
1 l% D5 q5 S; H# s0 C; f Z
G) u0 V+ e) e7 w
代码6
4 Q. F4 P |4 ?' v' s
+ z+ q0 |1 V7 W6 M' D 第六节 实验代码. U- M$ m. ~1 k9 [
1.HeadSet 检测9 I3 }3 S8 Z3 g
原理类似于一个 ad 按键的功能。2 {' Z6 ]- Q; I$ L9 R$ i/ S7 u+ g
注意:这里如果要测试这个功能必须在 codec 中设置一个值:. y2 C; K, S4 J) S6 C: B: b0 t$ m8 Q
codec_hp_det = <0>; ===> codec_hp_det = <1>;
6 B' E h' q7 p1 S7 o 增加两条测试信息到如下代码中。) t0 H7 d+ i" Q! O* ?
/ K: b) t9 i+ }# s- ?* E, g4 Y( {0 t
1 T1 R: R/ X j2 O) o" G1 G
代码7
& h7 n0 e, c2 v. Z 耳机检测状态的调试:& f4 I' H/ i5 x- b! f) @
cat sys/class/switch/h2w/state 0:无耳机插入
% x4 J/ e2 k) n$ u6 y8 N, u 1:带Mic 耳机插入(四段耳机)
) J1 K9 v% x; E: s1 O4 J' P; [ 2:不带 Mic 耳机插入(三段耳机)
$ v: ?( X, J) k+ f! D 2.测试命令 amix; a3 g) V/ H" P! E8 B& f
用 amix 命令来调节音量5 _# J+ D( _$ B5 {0 U' S0 f
amix 11 08 H' \2 T. u9 O# [) I. W
amix 11 120
( \5 _# \8 o/ L9 v6 E/ e' @5 L' o3 y/ E5 t/ ~. P
. @! ]6 z$ ]# ~ P
& p' ^- I4 z, v/ ?- v
& c, Q6 `+ ~; R9 z% [- ^9 X5 d( z: G1 U
文件下载请点击:
6、音频驱动实验教程.pdf
(507.76 KB, 下载次数: 0)
# V4 }) n: k- e6 q; H5 y
$ ~: ], p! B' `$ ~8 Q
|
|