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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
音频驱动实验教程
——疯壳·嵌入式平板开发
$ f' u6 w* o7 T  U# L" G

; I- \1 o/ H4 K1 W: F8 g& r( ^6 C" k" y

$ B% @! l$ i( F$ |) V# y    
8 ]) z  f" X8 T% o- x   图1 ; n, Z1 P: t% \- A* c0 G$ w- ~
    如上图是音频模块 codec 和 cpu 连接框图,主要由三部分组成:
/ s; J5 K! ?( U( f8 a4 r, p0 J    I2C 总线 - cpu 通过它实现对 Codec 寄存器数据的读写。0 a' _! s; I" j6 |
    I2S 总线 - 实现音频数据在 CPU 和 Codec 间的通信。' I# L+ w( C" _5 R3 q5 \8 u, g4 g
    HP_DEC - 实现检测是否有 HeadSet 设备插入。+ m& k: B) P  f8 u# G( d7 I- D: F
* M6 c* o- U- V4 y3 G) B8 @
    第二节 linux workqueue 工作原理$ c5 m9 C# q6 F+ n
    音频子系统的源代码中用到了一个概念:workqueue。对于不了解的朋友,读代码可能会引起疑惑,所以这里做一个简单介绍。Linux 中的 Workqueue 机制就是为了简化内核线程的创建,只是通过调用 workqueue 的接口就能创建内核线程;并且可以根据当前系统 CPU 的个数创建线程的数量,使得线程处理的事务能够并行化;workqueue 是内核中实现简单而有效的机制,它显然简化了内核 Daemon 的创建,方便了用户的编程。工作队列(workqueue) 是另外一种将工作推后执行的形式。它把工作推后,交由一个内核线程去执行,也就是说,   这个下半部分可以在进程上下文中执行。最重要的就是工作队列允许被重新调度甚至是睡眠。  举个栗子:: y. M+ I1 l8 u+ Q# _5 e  Q& c' ?

! b# x$ t0 Y4 H7 X. J1 H. q% |/ a+ Z5 B: d3 X5 J0 f! _. Y
   
* W& i" i  `& p4 v4 Y
" K" X# V$ @+ J. N    代码1! N) Z( h, Z2 i8 R4 l7 a/ H

3 o5 Q5 R2 u% z2 n/ T& x    第三节 电路原理图介绍
) p0 [$ Z! R4 f    下图来源于文档 3128_sdk_a02_20170325.pdf 中第 18 页。
2 \; ?  p: u$ b9 }  z4 m    图一、绿色框中是 codec 芯片自己检测是否有 HeadSet 设备插入的电路原理图,它是通过 HP_HOOK(HP_HOOK 和 HP_DEC 是连在一条线上)与 cpu 的 ADC_IN0 连接,这个有点类似于 AD 按键检测的功能;音频 Codec 模块是数据与控制分开的,所以有 I2c 来控制 Codec 的寄存器的读写,数据通过 I2s 总线进行传输。; y  s' c: Y9 b( @8 n7 `1 Q

0 Q) x* p& U8 v2 K, I      P) O7 h, @/ n9 [' O$ m2 }# E
    图2
6 B9 z1 s, u0 A& Q6 X# i+ B$ u! k6 h# i
    第四节 音频驱动代码结构
  U  z/ T8 O+ O2 L+ S, l4 E
+ y- _' g; l% e) Y9 f% _    
" l1 Y2 J7 @  w& ?  s, [( _8 i    代码2
3 a  h$ ^; ]; W( f  ?! ]) @$ a, h- X
    第五节 dts 文件讲解
2 j6 a4 B3 M8 N/ ]4 e7 D1 Y, W' K  @! o. _! q4 l7 P  A
( {4 `9 G. G! U. j: _
   8 g) Y; E0 T4 H6 n  v
    代码3
  g) \4 v1 B0 k* z9 L0 `$ g+ q4 F3 E$ g$ u* \) A5 [/ S0 @. C+ J
    HeadSet 配置文件
, e) o+ n% t) G3 n: [7 L& R( B" m) g  q
  
4 E, T: ~5 z% L6 ^    代码4
+ X: U& d) V2 b4 M2 j! Y
, m" t! {8 b- U    I2c 配置文件( P2 ?  {" l# j; N1 F9 b; {# x: O! U

3 o, G3 R1 \+ ^    
. i) }# p" W/ Z1 {* K# e    代码5" W, ~# M! D% M$ d: ?% A
    I2s 配置文件) u& R5 j& [: J3 y
    rockchip-rt3224 {- a+ W, O! _. v- P9 K  }

6 B% p$ q7 {) I, l( d+ D+ ~ 9 L$ X/ S* k- p7 ~) I

6 \3 K- M* i* _& a# j    
2 e' Q5 ~; i( `+ _5 u8 h& i! L    代码6( C- b7 {( R( i5 j" G; b
2 w% g* p7 a' Y+ D2 i2 P, w
    第六节 实验代码8 {- _- u+ V+ p- a
    1.HeadSet 检测
# {4 }/ ]# V0 J    原理类似于一个 ad 按键的功能。' B' Y$ L; ^5 l7 u! m  Y
    注意:这里如果要测试这个功能必须在 codec 中设置一个值:$ @, Q" ^# c3 u
    codec_hp_det = <0>; ===> codec_hp_det = <1>;
0 u: A1 m0 k/ F* ?    增加两条测试信息到如下代码中。) @0 k3 R6 }% A
6 T" ]9 P% M3 b( ?+ y
   8 q' z  \# A8 f* t8 o
    代码7
- i' [; e7 p$ J( H" `- E8 J    耳机检测状态的调试:+ l+ X6 P7 l0 ~; Z# D
    cat sys/class/switch/h2w/state 0:无耳机插入% n0 Z1 v2 h( e2 v& D: G
    1:带Mic 耳机插入(四段耳机)' y( ]/ I* P: r# E9 R( |1 z
    2:不带 Mic 耳机插入(三段耳机)
7 R, J0 Q; `- \! b    2.测试命令        amix- E4 j9 o7 q4 f; N% w0 J
    用 amix 命令来调节音量
/ m& E( `1 j# a# D/ o2 z% h    amix 11 00 t; b4 x3 E/ o$ l6 [6 B$ F" q
    amix 11 120: ?& U6 m" P9 ~, ^. I3 ~6 Z! K

7 Z& Y& F" ^( }+ {: _* k: p! I. @, M2 G. Q

- M$ F6 b/ W' ?3 s' V9 }- U文件下载请点击: 6、音频驱动实验教程.pdf (507.76 KB, 下载次数: 0) + J# a5 O& q9 K- }, M

. e6 c; r4 ]' X) `) X
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-10-13 00:01 , Processed in 0.140625 second(s), 27 queries , Gzip On.

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

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

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