|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
音频驱动实验教程 6 h% ^6 _1 @ p/ ~$ x) |: Q( b* o
7 x6 `3 r5 k1 n4 x; Y* U$ @
- g: P- C6 f1 W# G
' A+ ]( E' \3 ], B. s! J
$ F0 H2 t/ _/ R; m# u3 w# ? 图1
; C( o, S" A+ E& f 如上图是音频模块 codec 和 cpu 连接框图,主要由三部分组成:
7 b, l8 c+ d3 l; O I2C 总线 - cpu 通过它实现对 Codec 寄存器数据的读写。
2 S0 X6 }0 I5 w# |+ k I2S 总线 - 实现音频数据在 CPU 和 Codec 间的通信。! d( u9 ] a3 i7 g: |1 V' G7 h* u8 K
HP_DEC - 实现检测是否有 HeadSet 设备插入。 S" O0 P- R4 J Y8 |) m
Q" |8 s' R2 @- h5 c A 第二节 linux workqueue 工作原理- \% G; ]1 Z% @4 E! E& X. f- U
音频子系统的源代码中用到了一个概念:workqueue。对于不了解的朋友,读代码可能会引起疑惑,所以这里做一个简单介绍。Linux 中的 Workqueue 机制就是为了简化内核线程的创建,只是通过调用 workqueue 的接口就能创建内核线程;并且可以根据当前系统 CPU 的个数创建线程的数量,使得线程处理的事务能够并行化;workqueue 是内核中实现简单而有效的机制,它显然简化了内核 Daemon 的创建,方便了用户的编程。工作队列(workqueue) 是另外一种将工作推后执行的形式。它把工作推后,交由一个内核线程去执行,也就是说, 这个下半部分可以在进程上下文中执行。最重要的就是工作队列允许被重新调度甚至是睡眠。 举个栗子:
4 g! C. o$ D4 h: g( h* q4 N+ q, Z/ d V; \, g( R5 _. B
4 b9 Q7 [4 G4 c# q# t' h s
+ P; Q3 |2 p( @6 w- x 代码1; m, {9 s% O* Y- g
2 c* k2 ~! x* b" L( H$ H* M 第三节 电路原理图介绍1 V$ A: @8 L/ A; | Q
下图来源于文档 3128_sdk_a02_20170325.pdf 中第 18 页。, M7 N4 Y5 ]- @$ m2 W* {& K7 P0 q4 M
图一、绿色框中是 codec 芯片自己检测是否有 HeadSet 设备插入的电路原理图,它是通过 HP_HOOK(HP_HOOK 和 HP_DEC 是连在一条线上)与 cpu 的 ADC_IN0 连接,这个有点类似于 AD 按键检测的功能;音频 Codec 模块是数据与控制分开的,所以有 I2c 来控制 Codec 的寄存器的读写,数据通过 I2s 总线进行传输。
' X9 h$ Q+ L: R) H4 {, h& y8 {6 |8 E( Q, q/ w" [ X
& T2 b* I O! N" `+ S, x5 K
图2
- s$ {% t, U8 M& Z' l3 U1 R- d# c- I- j2 H5 T
第四节 音频驱动代码结构
' N8 v) [& i, C. N! G5 K
! p9 Q: K3 a6 d3 h I7 b
* L* S& s2 w$ b: Y6 T 代码23 j1 N! ~5 F' k6 k" v% C! R
8 }5 K8 U2 e& Q9 X6 H. `
第五节 dts 文件讲解
0 U7 N, W' ?7 ?) k U8 h7 B0 V5 i
1 d2 W% J) g- _3 E( ~1 y) {
5 q: p& k% U( c" K8 v5 v; R& B* I
) u& A/ U3 L. V 代码3
2 R v9 z4 R7 s4 f
( g5 H/ C- I( e+ T& F! I HeadSet 配置文件
! ^6 O- {" R7 @ D% A3 Y }" p& k$ n4 @* o9 A
0 U$ D3 u; M, q9 s1 S; \7 U
代码4) r! Z8 V+ e7 g: s$ i8 A2 v) ~3 k
) G( j! t" A( [& ~" P w" S
I2c 配置文件" i) a- G, K( n3 t9 x2 y, y
% ?% v/ n4 I: [! D1 j
2 N4 T" N8 w& g- d+ v# ? 代码5
( O- g% G) S7 W: q: G# _$ F. G I2s 配置文件, K7 j4 z7 Z- l
rockchip-rt3224 {
8 h5 ?/ `% I6 g' t* ~6 A6 p: _7 X2 y
. s9 B! Z5 o4 _; j+ w
u& P1 @7 ]5 E& H: G7 K
0 H% |" u7 Y3 c; W/ A. H
- l% N6 h0 g8 s& y" g8 R
代码6
- i' e* y' s+ Q/ e0 I/ S A* n% R! w, A% v) `
第六节 实验代码, _: l* G E- g$ G8 e/ O
1.HeadSet 检测% |+ k/ m6 D) O8 Z5 T
原理类似于一个 ad 按键的功能。
. u* s% j/ b, n) y; w* W 注意:这里如果要测试这个功能必须在 codec 中设置一个值:
: U6 R5 h% H, N! b! @3 H codec_hp_det = <0>; ===> codec_hp_det = <1>;! _/ W( k4 `" E
增加两条测试信息到如下代码中。8 W; K: V0 _! G F1 x% a
# v* M$ M- D" S3 v- N6 x
9 H; Q, j e: a2 R 代码7
9 Q+ w1 C0 \. M7 d 耳机检测状态的调试:
8 Z' e4 b. P" A4 I0 U. T6 d5 L1 T cat sys/class/switch/h2w/state 0:无耳机插入. i1 F! x; M4 U( H4 B
1:带Mic 耳机插入(四段耳机)
+ ^$ M v8 J. V 2:不带 Mic 耳机插入(三段耳机)
1 u: \ c$ D2 p6 ]# A 2.测试命令 amix! r- |. o0 p4 F! @
用 amix 命令来调节音量
1 J7 J5 @/ c3 U% {# }. s. r. d amix 11 09 }5 ?5 F/ P7 T! l9 i- N/ X& z' z
amix 11 120; E* f& C9 M5 G r( s5 r0 q2 J K/ ?! n
" U& B2 y8 a% D* `: f/ o
+ i r' T& h9 m6 Y5 g
4 @: k- I' W+ p8 V( K' ^# h! A8 N- `1 W( V3 |
) M F# [" ~& s U6 l9 D9 l文件下载请点击:
6、音频驱动实验教程.pdf
(507.76 KB, 下载次数: 0)
+ F/ V7 ]8 a% s D6 E
4 |1 P, [5 R4 I( A
|
|