|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
音频驱动实验教程 . o3 z* v6 w0 i7 N/ F
3 i6 ^, g1 f p8 X. G5 ^9 J
3 h9 z5 w+ K2 U; ]- x6 E
, F" k' M' {3 Q- P
4 O7 \' E1 U0 C0 O# t1 m
图1 . [1 C+ [3 y' `
如上图是音频模块 codec 和 cpu 连接框图,主要由三部分组成:
2 I ~2 B" L0 G* q$ u* A1 o% O I2C 总线 - cpu 通过它实现对 Codec 寄存器数据的读写。5 t) X- z( n2 u: y, e. ^8 q6 \
I2S 总线 - 实现音频数据在 CPU 和 Codec 间的通信。
& z7 A3 r( z% v) O5 E% @) E HP_DEC - 实现检测是否有 HeadSet 设备插入。
+ v2 s: n+ J% g( j' {1 J4 x; b
/ ^' W& ^# W9 N& X+ M$ M 第二节 linux workqueue 工作原理
) s C+ k. ^1 A" m$ I' q 音频子系统的源代码中用到了一个概念:workqueue。对于不了解的朋友,读代码可能会引起疑惑,所以这里做一个简单介绍。Linux 中的 Workqueue 机制就是为了简化内核线程的创建,只是通过调用 workqueue 的接口就能创建内核线程;并且可以根据当前系统 CPU 的个数创建线程的数量,使得线程处理的事务能够并行化;workqueue 是内核中实现简单而有效的机制,它显然简化了内核 Daemon 的创建,方便了用户的编程。工作队列(workqueue) 是另外一种将工作推后执行的形式。它把工作推后,交由一个内核线程去执行,也就是说, 这个下半部分可以在进程上下文中执行。最重要的就是工作队列允许被重新调度甚至是睡眠。 举个栗子:
% c) o) p1 N" n& R( @* I' j
1 ~; @3 ^2 n- B# v1 A& l+ k/ C0 G4 z0 A1 b
6 k. Q6 |3 h1 N
) b9 |2 U6 V `8 v r
代码1
$ w1 ]% F! ^, W% b1 O+ M: O, b) w) U
第三节 电路原理图介绍$ k" D$ l& B H0 _: @* b
下图来源于文档 3128_sdk_a02_20170325.pdf 中第 18 页。
! S8 _" ?6 C5 |7 Q 图一、绿色框中是 codec 芯片自己检测是否有 HeadSet 设备插入的电路原理图,它是通过 HP_HOOK(HP_HOOK 和 HP_DEC 是连在一条线上)与 cpu 的 ADC_IN0 连接,这个有点类似于 AD 按键检测的功能;音频 Codec 模块是数据与控制分开的,所以有 I2c 来控制 Codec 的寄存器的读写,数据通过 I2s 总线进行传输。
3 F- h1 A: s% A# Z" K- i
" Y. G4 P8 H2 V M. S
% S9 i& C8 L( m- S, [) Y9 v8 A }! r
图2# K0 }2 p" m6 v# M8 q
2 l# c* [( |1 }- f0 { 第四节 音频驱动代码结构- x5 _' Z& ]: }9 K+ @
J8 t2 q7 S; H9 c6 p* R
! n9 [9 i" U/ J5 o) E" p% u
代码2# G, G; ~/ x( R( R
8 s, K( J# G& y1 r 第五节 dts 文件讲解) p U* Y1 s3 Q% h2 v' D. R+ ]4 f) s
' B+ h4 l+ f* u
6 I: d! x1 y& b+ s
o/ |, b' J k" \3 I. ` 代码30 V, f/ u ^5 r5 G" | h( I
8 r C1 B" v) f; U) p& K/ x
HeadSet 配置文件
% m/ G: m5 p; {& P$ y0 D/ O5 H) q6 u0 c8 }! O( q
3 p/ ~# ?/ d4 i
代码4; P5 b: a" d3 k5 o8 o! X- B& t7 V
% e# [$ U0 y2 R1 J2 N# d
I2c 配置文件
G8 F) M1 J; p
( B( R% l( ]% H) t7 {& C
3 ?4 {3 l6 |1 l$ u 代码5
6 b" s5 W1 h% A I2s 配置文件 J2 M6 S: ?0 }; n
rockchip-rt3224 {
1 A1 J& n) `& B
- x; l+ V1 w4 r; m9 V
. a. C. B5 j( z( t
# a& {2 K5 x3 W9 r% \) Q
. c5 i' u9 ]$ F# `$ N- `- E
代码6
9 t; s5 L4 c, \
q, ~! g4 ~9 |) b- A% J" | 第六节 实验代码6 z/ y. i, D. x4 H7 _9 ~
1.HeadSet 检测
0 ~: A% ?% E& P: J. q" @ 原理类似于一个 ad 按键的功能。
" U, p: p& @1 |! V& m5 a 注意:这里如果要测试这个功能必须在 codec 中设置一个值:6 v: n- T* X4 ~8 p) o% S
codec_hp_det = <0>; ===> codec_hp_det = <1>;
/ J5 P2 \' `5 f; c9 V 增加两条测试信息到如下代码中。5 j1 O2 O) F$ z1 M; D
, I$ Q& u" z! g& J: W
4 E1 N/ H4 W' ]4 a. d; ]
代码79 e5 c9 G& I& [0 h6 t
耳机检测状态的调试:" ]' k4 a0 Y w# a( O2 ]
cat sys/class/switch/h2w/state 0:无耳机插入
4 A- t3 p7 F- n+ o% X 1:带Mic 耳机插入(四段耳机)* \! b, `8 n1 Q$ |/ T( F: W
2:不带 Mic 耳机插入(三段耳机)
. j; j" S( l+ w' }- u& r9 }' n 2.测试命令 amix. u( Q, g# U8 {6 a
用 amix 命令来调节音量
' C( g/ l; Z/ b+ N/ i( n0 e amix 11 07 }8 s$ K- ]3 Q
amix 11 120& Y/ y. ?6 D0 T: q3 P, J4 |) i& t6 M4 u
8 {- _2 R) q8 \+ A( V3 ?7 E" P
% Z( k% B- I5 M( |5 d
: Y+ `1 K$ j# C9 B5 }/ P文件下载请点击:
6、音频驱动实验教程.pdf
(507.76 KB, 下载次数: 0)
: b& C( G# b+ S$ G
, I( [: F5 m& h9 w |# @
|
|