|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
音频驱动实验教程 $ s1 Z4 e( S% v$ B$ y; ^+ f+ d
- w/ ~5 P) K( k& e: r& x7 F% J' N/ G. X2 F/ C6 `* _
3 G3 A _ W1 C, Q# M: t
! _5 f& b1 n) i) z6 U7 H0 R 图1
, Q' b/ \6 C/ X' q 如上图是音频模块 codec 和 cpu 连接框图,主要由三部分组成:0 y9 C% n4 z W- R6 g% b @) o, B
I2C 总线 - cpu 通过它实现对 Codec 寄存器数据的读写。8 x( {& r" m& Y, ~
I2S 总线 - 实现音频数据在 CPU 和 Codec 间的通信。
+ E7 |+ n8 c/ U& r' P9 s HP_DEC - 实现检测是否有 HeadSet 设备插入。
0 A+ R( u8 {* z6 F" x. ^6 m, Q3 u' k+ f
第二节 linux workqueue 工作原理, o& m u% t3 q* O3 Q
音频子系统的源代码中用到了一个概念:workqueue。对于不了解的朋友,读代码可能会引起疑惑,所以这里做一个简单介绍。Linux 中的 Workqueue 机制就是为了简化内核线程的创建,只是通过调用 workqueue 的接口就能创建内核线程;并且可以根据当前系统 CPU 的个数创建线程的数量,使得线程处理的事务能够并行化;workqueue 是内核中实现简单而有效的机制,它显然简化了内核 Daemon 的创建,方便了用户的编程。工作队列(workqueue) 是另外一种将工作推后执行的形式。它把工作推后,交由一个内核线程去执行,也就是说, 这个下半部分可以在进程上下文中执行。最重要的就是工作队列允许被重新调度甚至是睡眠。 举个栗子:
* e3 y2 }) \- X, o; j2 u* @* u* ?5 s: ^5 I: v( Z& j( g& p
1 x6 ~) U7 Z) ?6 B7 Y* M, F3 {9 Z
, q- q+ ?9 x o4 |4 [6 K
' H' J. m. a4 t8 I5 m& l! J+ H 代码1# J0 L) ~% ?- g
9 Q# u" e9 f- s7 A0 S, v 第三节 电路原理图介绍
u8 d$ ]: }" |- h1 ? 下图来源于文档 3128_sdk_a02_20170325.pdf 中第 18 页。
: U8 c8 {5 \- A: C* E' r7 u6 ] 图一、绿色框中是 codec 芯片自己检测是否有 HeadSet 设备插入的电路原理图,它是通过 HP_HOOK(HP_HOOK 和 HP_DEC 是连在一条线上)与 cpu 的 ADC_IN0 连接,这个有点类似于 AD 按键检测的功能;音频 Codec 模块是数据与控制分开的,所以有 I2c 来控制 Codec 的寄存器的读写,数据通过 I2s 总线进行传输。
% g; s) N( e7 q0 Y/ E
7 R2 {* R% D( z# R
' M, }+ k5 L2 D- s7 _" X# B" m; M 图2
1 T( l# y1 C2 ^3 Q1 H- V8 Z2 r1 G! H6 k( G
第四节 音频驱动代码结构' z" U+ v* z. m' d
1 Q0 I7 `) r7 }4 d; k7 ~
4 t' G! t" K: F! D9 _% Q& ~" q( x: T 代码2) R9 J( A2 t' Z0 C. z# N, }" N$ G
8 q. \/ K$ v2 C3 b+ { 第五节 dts 文件讲解4 H2 Y9 [9 D. b* M9 h* B" L: ]) v
& @4 Y d( @6 x
3 _9 J" q" e& E
8 k ]2 f$ e6 f2 q- G 代码3- S N' o ?+ q
- [. V5 h+ Z$ D5 q
HeadSet 配置文件3 ?4 a% B& r. z7 y% T7 ?4 M
' D5 T: b( A" m# Y- D' h) _
/ T$ |" [8 H# z 代码40 }7 t* h" W, F6 R; ~) O
* L8 V- p- a0 J0 F7 b/ ], g- l0 M: z
I2c 配置文件3 m# n$ h& O; P, p: Y
3 G/ S/ z7 p; d M
# _7 f- e9 U0 E 代码5
. O @5 d9 U9 m I2s 配置文件
4 b# l7 w& T7 p `) K; E1 S. ]6 K2 H$ o rockchip-rt3224 {
3 u& [5 ]! _+ C+ h+ D3 U
- B" s) U+ R( k* i. U: p/ y
9 u; r7 O1 T' Q6 M4 K# `
! f, i+ |7 F/ t, \
" j. M I4 G* D0 h 代码6
; I5 g& y& c2 T' m! N9 ?9 [+ _9 ]: S
第六节 实验代码
# @# z: S: [/ r( [+ a/ u 1.HeadSet 检测
( f' _0 ~& w! n$ o. y% a' W 原理类似于一个 ad 按键的功能。& {6 c2 H3 g9 j* f2 f5 C w: d
注意:这里如果要测试这个功能必须在 codec 中设置一个值:: c! ~1 s; L( v! q2 Y/ s8 T
codec_hp_det = <0>; ===> codec_hp_det = <1>;
6 B7 ], o( p7 k2 E, _9 _% I( L 增加两条测试信息到如下代码中。. |* Y, o- t# v5 G
4 I/ Q' t1 l8 }+ x
: l: _3 ~4 c* j 代码7% V; H: I9 w3 C+ l& B
耳机检测状态的调试:; n0 C* }2 ?) Y$ E9 x
cat sys/class/switch/h2w/state 0:无耳机插入
* X) G) L$ n$ T h$ ` 1:带Mic 耳机插入(四段耳机)7 Q. l0 f/ m* x0 U/ Z
2:不带 Mic 耳机插入(三段耳机)
& ?& {9 ~5 `4 w6 M9 N, O$ F 2.测试命令 amix
& c2 }1 W6 R- b% b K& v 用 amix 命令来调节音量
2 M8 Z5 l8 }2 T# k: M; @' l amix 11 0
?& I: X6 O0 c2 ~% J3 Z+ t+ N amix 11 120
; k" e# P [# i7 e- T, x, u" @$ J% w5 W( s8 u( C2 I4 d% a& [
. m- l# y) J6 c2 J" l9 m _! G6 _: _) g8 c4 E, q* k
文件下载请点击:
6、音频驱动实验教程.pdf
(507.76 KB, 下载次数: 0)
4 g* Z: N; O6 z8 j8 p. l
2 n0 ^, n6 T9 x: H8 h' c! } |
|