|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
音频驱动实验教程
& U3 A2 T. Y, H
6 L2 Q3 V# i6 F5 n
; K7 a3 C0 A8 W% ]: o0 o v8 n5 u. `& d, S3 e# s
2 c: V$ B+ Y1 [/ b4 _ 图1
! Q; ]0 {6 f/ |# O' T1 ]' v 如上图是音频模块 codec 和 cpu 连接框图,主要由三部分组成:
6 | J5 z. q! ]) i I2C 总线 - cpu 通过它实现对 Codec 寄存器数据的读写。
$ t: e1 |; h n/ R I2S 总线 - 实现音频数据在 CPU 和 Codec 间的通信。
/ n' k' \' ~, P3 T" Z HP_DEC - 实现检测是否有 HeadSet 设备插入。
. \. W5 Z1 ?" [ }1 g; L, u. `# n( M) D. y; [
第二节 linux workqueue 工作原理" I6 z C J+ E h
音频子系统的源代码中用到了一个概念:workqueue。对于不了解的朋友,读代码可能会引起疑惑,所以这里做一个简单介绍。Linux 中的 Workqueue 机制就是为了简化内核线程的创建,只是通过调用 workqueue 的接口就能创建内核线程;并且可以根据当前系统 CPU 的个数创建线程的数量,使得线程处理的事务能够并行化;workqueue 是内核中实现简单而有效的机制,它显然简化了内核 Daemon 的创建,方便了用户的编程。工作队列(workqueue) 是另外一种将工作推后执行的形式。它把工作推后,交由一个内核线程去执行,也就是说, 这个下半部分可以在进程上下文中执行。最重要的就是工作队列允许被重新调度甚至是睡眠。 举个栗子:
0 C' ?, E+ a8 W) c6 `5 g! O& L. l, H
; E- Z7 X* f& N" M+ |: \+ s5 X
/ S3 W4 Y8 o3 _6 M6 [
0 g9 \3 I) f+ Q; l; z4 K8 |$ R2 E
代码1
' G7 x; P$ {( }0 N0 Y
$ P* b7 S3 e6 I5 d' W% ? 第三节 电路原理图介绍
& ~/ n* L+ ^/ r: M 下图来源于文档 3128_sdk_a02_20170325.pdf 中第 18 页。* T- U7 c: V# U
图一、绿色框中是 codec 芯片自己检测是否有 HeadSet 设备插入的电路原理图,它是通过 HP_HOOK(HP_HOOK 和 HP_DEC 是连在一条线上)与 cpu 的 ADC_IN0 连接,这个有点类似于 AD 按键检测的功能;音频 Codec 模块是数据与控制分开的,所以有 I2c 来控制 Codec 的寄存器的读写,数据通过 I2s 总线进行传输。
, e% _. c' }- g- t5 J+ s2 d! z- E6 S9 H9 H- Y+ b% [. \& D; c
5 ~+ |7 ^3 _: y) p6 I6 L
图2+ A$ z1 d% k- T( U% X$ W
" w. \( A6 O5 d/ K" F: \ C
第四节 音频驱动代码结构/ f( s0 i# g1 w
! Z! U: k5 R' X2 E- H, k% P
8 ? y2 b7 J0 l, S+ g 代码2& a3 l7 ?9 H# r2 X- ~) s
1 }, N$ ], C7 R% b 第五节 dts 文件讲解
: u3 A% w+ r7 u: ]# ~
, p$ x# v$ V( }2 m! H
# {* x6 W, o3 @* r1 i V: G r1 L
& E6 ?. G2 U' y( V! f, ?
代码3
. m2 e E" P7 ]# c. I h8 d6 }) P
HeadSet 配置文件# ~8 T7 Q R: k5 x
" H r4 K# j& }! Z
7 l y# @1 L2 d. q 代码4$ G! Q' J$ g4 p- ?8 V+ L& c" o8 m( H5 |
) K) |; ~; n$ q
I2c 配置文件
% g5 g7 ~1 F! X0 G3 B; w- z/ h. g
% _6 ` R, Q8 h, N
, t0 P; l: M+ u6 q 代码56 p" R! w7 X7 C) ~: w* Y
I2s 配置文件4 `- V5 u; ?$ W1 E
rockchip-rt3224 {9 ^; C1 O, H$ [* W8 G
: n7 x5 G# ^0 e2 v6 j9 ~
k: i3 k n5 E5 c/ y
8 Y) A ?5 x0 v+ M! s" K8 y
9 j, D' a* y! _# c0 y; O; h
代码6
: k5 z, N; S" p i5 r7 o' z0 p. r7 ]5 W- z# h
第六节 实验代码* P& ?- v6 g4 _3 G+ `! S
1.HeadSet 检测
! ]! h& l3 I5 Z' |. y 原理类似于一个 ad 按键的功能。% T, N. k/ w5 M# O+ W
注意:这里如果要测试这个功能必须在 codec 中设置一个值:1 A6 W( d! U, g7 [( u/ m8 e
codec_hp_det = <0>; ===> codec_hp_det = <1>;8 }2 ]7 j$ K$ U
增加两条测试信息到如下代码中。
; c- N+ w/ x# n% t# f& m4 S. l
% v( q+ h: E# c( o
8 ^% E8 e* q8 ] W
代码7
W+ t4 {; X+ c 耳机检测状态的调试:3 V9 s" o9 b0 _" l% Y4 c, { t
cat sys/class/switch/h2w/state 0:无耳机插入1 ` y6 d1 U3 s
1:带Mic 耳机插入(四段耳机)4 f+ J$ ~4 P( Y: ]. }
2:不带 Mic 耳机插入(三段耳机)$ c( \6 `$ i! l( [
2.测试命令 amix
4 L) z9 H2 D6 h, Z; t 用 amix 命令来调节音量
' |9 v- A, U4 A% z amix 11 0; Z$ N; @1 a+ c k3 q2 [
amix 11 120( R4 ~7 o! Y9 @* U& }
% n/ r2 @1 t& U" k8 E. u
: n3 d J0 K. W# O7 ~
, {# W3 U! w8 z9 l% K7 C
0 } ~: P0 M* j$ x" j3 d+ Y7 g& @8 }6 }
文件下载请点击:
6、音频驱动实验教程.pdf
(507.76 KB, 下载次数: 0)
( H# q7 i% i7 k& D0 _: v8 v
: s5 I; L- N$ F3 O0 e- J* k5 L+ | |
|