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

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

[复制链接]

该用户从未签到

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

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! }
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-6-20 21:46 , Processed in 0.078125 second(s), 27 queries , Gzip On.

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

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

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