找回密码
 注册
关于网站域名变更的通知
查看: 160|回复: 0
打印 上一主题 下一主题

【教程6】手把手教你做平板电脑-音频驱动实验教程

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2022-8-17 17:37 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
音频驱动实验教程
——疯壳·嵌入式平板开发
% u$ T* x* q3 W4 A  @3 b. @2 m; n: m
, D: a" \8 i2 T( I; I# I
0 A, n. V9 I% O& Z; o

! l  U; O% Y5 b8 B7 I# ]% O; A4 K    
7 a( ?' z0 [5 d+ i   图1   ]8 j0 l. K4 |. ^' H! z
    如上图是音频模块 codec 和 cpu 连接框图,主要由三部分组成:
' w: t1 g' C; _$ X, j1 {- a    I2C 总线 - cpu 通过它实现对 Codec 寄存器数据的读写。  I7 S. H6 x% C/ O
    I2S 总线 - 实现音频数据在 CPU 和 Codec 间的通信。
% J5 |+ c7 s) X) x) N  T: E/ Z' h    HP_DEC - 实现检测是否有 HeadSet 设备插入。
: [* Z  G% ~- j  @0 O: B
! u# J! H7 I. B0 U6 }2 j( n    第二节 linux workqueue 工作原理
0 O$ G% i- y1 ?" g" z    音频子系统的源代码中用到了一个概念:workqueue。对于不了解的朋友,读代码可能会引起疑惑,所以这里做一个简单介绍。Linux 中的 Workqueue 机制就是为了简化内核线程的创建,只是通过调用 workqueue 的接口就能创建内核线程;并且可以根据当前系统 CPU 的个数创建线程的数量,使得线程处理的事务能够并行化;workqueue 是内核中实现简单而有效的机制,它显然简化了内核 Daemon 的创建,方便了用户的编程。工作队列(workqueue) 是另外一种将工作推后执行的形式。它把工作推后,交由一个内核线程去执行,也就是说,   这个下半部分可以在进程上下文中执行。最重要的就是工作队列允许被重新调度甚至是睡眠。  举个栗子:) v3 b4 _+ @/ e
* L2 ]  }. }/ S# S0 W$ N, h
8 I- T, e: h/ v& g2 r% r
   
' O8 w# j' C% p% r4 U) b! _
5 u. @3 t: C5 E  z" u* ~: P    代码1
: G% z8 k6 l: l. M+ Q% ?! L+ |* q& C$ C; p
    第三节 电路原理图介绍
2 S, I. q5 m; f    下图来源于文档 3128_sdk_a02_20170325.pdf 中第 18 页。
) e: L8 W) b# Z+ Z$ v  ~    图一、绿色框中是 codec 芯片自己检测是否有 HeadSet 设备插入的电路原理图,它是通过 HP_HOOK(HP_HOOK 和 HP_DEC 是连在一条线上)与 cpu 的 ADC_IN0 连接,这个有点类似于 AD 按键检测的功能;音频 Codec 模块是数据与控制分开的,所以有 I2c 来控制 Codec 的寄存器的读写,数据通过 I2s 总线进行传输。" [% Z9 s. v/ g, P7 R7 p
* B$ ]6 m  Q0 {& J+ D
   6 L: N0 C6 _. e: r; k
    图2. P! u" h( V2 O

) i. g0 E6 p  {7 b5 _+ w4 B0 c    第四节 音频驱动代码结构
. y& k: y% I0 I, b% c' O/ H/ \  g+ Q6 q& L! S
   
  }# b& K+ [9 B- G    代码27 J+ Q' ?" V  ]

4 E6 S3 R8 s4 T    第五节 dts 文件讲解" d; {$ r8 t6 ], J- L5 x
# n. [/ B  L) ]  \: \
8 ^- |. V/ t' e2 b& B
   ( c$ ?4 b+ u! Q! i9 H' o/ I
    代码30 H2 V! t0 y* n( U
( _) I9 d+ V( ]2 ^- n2 X7 S
    HeadSet 配置文件8 n- D6 g# o9 i" }7 C2 T6 s

. m" |6 L+ j: y: b7 f   
' _7 v3 ]  U% [6 L+ ~    代码4: k9 X* ]4 c8 u0 I0 S5 e- F
/ N7 H  J7 ?4 j1 f! G; ^: }
    I2c 配置文件" m! u% v  K1 m  ?. V' d
5 w- b- R' m. F% \$ y
    & t$ X# a7 F: R- B" r( [% o+ q% B
    代码5: ]6 V. q4 a7 g/ @4 Z
    I2s 配置文件
; o1 s. ^& ]2 V( o" z    rockchip-rt3224 {' b5 Y: {/ f" M  `
, R3 u  |5 c: Q: _+ ?4 P

0 |0 `  d& p' O + ?- E+ @  N1 \1 _
   
5 f1 w. k/ v' f8 c9 f; p3 S    代码61 `8 K3 L+ o5 C3 [

* \5 B9 q; r6 P8 A    第六节 实验代码6 H' ~8 Y; u6 {4 P% n" z" b
    1.HeadSet 检测$ A4 h  F% p' y# g, r
    原理类似于一个 ad 按键的功能。
2 g3 `& ^4 i$ |8 f! e2 T  v' E    注意:这里如果要测试这个功能必须在 codec 中设置一个值:8 i5 r! `  X/ V7 b6 O/ B
    codec_hp_det = <0>; ===> codec_hp_det = <1>;
7 u& b  I& ?( }    增加两条测试信息到如下代码中。
) N) j$ ]% V! V& a7 m7 _5 q3 W( C* e5 h  U' I
   
+ G* `, r% U8 D( ^) X' [- ]    代码7  |7 S( ?4 Q- l
    耳机检测状态的调试:
( I# S$ v# G7 t    cat sys/class/switch/h2w/state 0:无耳机插入& m) \: O) b* V( y+ q. N  _
    1:带Mic 耳机插入(四段耳机)
( o- p5 N2 n( i  Y% M    2:不带 Mic 耳机插入(三段耳机)
# x) v/ z% h: M1 ]5 O    2.测试命令        amix4 W. O8 V1 c3 J  G2 d( `# x$ ~& A9 [
    用 amix 命令来调节音量" b! t9 H2 [+ X. e$ u
    amix 11 0
) V6 |, ^4 c2 e  _    amix 11 120/ J" q2 C9 e/ o% w
0 j/ R* D! Z* @% L0 T, E
) ]) D4 |" N9 V( ^' ~

! D6 a! c; o9 e6 a6 J% i! T0 f7 }# K文件下载请点击: 6、音频驱动实验教程.pdf (507.76 KB, 下载次数: 0) ; P( l: n! ~" I4 U

4 h% Q, C) q: i, ^4 l
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-7-26 14:56 , Processed in 0.140625 second(s), 27 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表