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

【嵌入式开发教程6】疯壳·平板电脑-音频驱动实验教程

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
音频驱动实验教程
——疯壳·嵌入式平板开发
6 h% ^6 _1 @  p/ ~$ x) |: Q( b* o
7 x6 `3 r5 k1 n4 x; Y* U$ @
- g: P- C6 f1 W# G
' A+ ]( E' \3 ], B. s! J
   
$ F0 H2 t/ _/ R; m# u3 w# ?   图1
; C( o, S" A+ E& f    如上图是音频模块 codec 和 cpu 连接框图,主要由三部分组成:
7 b, l8 c+ d3 l; O    I2C 总线 - cpu 通过它实现对 Codec 寄存器数据的读写。
2 S0 X6 }0 I5 w# |+ k    I2S 总线 - 实现音频数据在 CPU 和 Codec 间的通信。! d( u9 ]  a3 i7 g: |1 V' G7 h* u8 K
    HP_DEC - 实现检测是否有 HeadSet 设备插入。  S" O0 P- R4 J  Y8 |) m

  Q" |8 s' R2 @- h5 c  A    第二节 linux workqueue 工作原理- \% G; ]1 Z% @4 E! E& X. f- U
    音频子系统的源代码中用到了一个概念:workqueue。对于不了解的朋友,读代码可能会引起疑惑,所以这里做一个简单介绍。Linux 中的 Workqueue 机制就是为了简化内核线程的创建,只是通过调用 workqueue 的接口就能创建内核线程;并且可以根据当前系统 CPU 的个数创建线程的数量,使得线程处理的事务能够并行化;workqueue 是内核中实现简单而有效的机制,它显然简化了内核 Daemon 的创建,方便了用户的编程。工作队列(workqueue) 是另外一种将工作推后执行的形式。它把工作推后,交由一个内核线程去执行,也就是说,   这个下半部分可以在进程上下文中执行。最重要的就是工作队列允许被重新调度甚至是睡眠。  举个栗子:
4 g! C. o$ D4 h: g( h* q4 N+ q, Z/ d  V; \, g( R5 _. B
4 b9 Q7 [4 G4 c# q# t' h  s
   
+ P; Q3 |2 p( @6 w- x    代码1; m, {9 s% O* Y- g

2 c* k2 ~! x* b" L( H$ H* M    第三节 电路原理图介绍1 V$ A: @8 L/ A; |  Q
    下图来源于文档 3128_sdk_a02_20170325.pdf 中第 18 页。, M7 N4 Y5 ]- @$ m2 W* {& K7 P0 q4 M
    图一、绿色框中是 codec 芯片自己检测是否有 HeadSet 设备插入的电路原理图,它是通过 HP_HOOK(HP_HOOK 和 HP_DEC 是连在一条线上)与 cpu 的 ADC_IN0 连接,这个有点类似于 AD 按键检测的功能;音频 Codec 模块是数据与控制分开的,所以有 I2c 来控制 Codec 的寄存器的读写,数据通过 I2s 总线进行传输。
' X9 h$ Q+ L: R) H4 {, h& y8 {6 |8 E( Q, q/ w" [  X
& T2 b* I  O! N" `+ S, x5 K
    图2
- s$ {% t, U8 M& Z' l3 U1 R- d# c- I- j2 H5 T
    第四节 音频驱动代码结构
' N8 v) [& i, C. N! G5 K
! p9 Q: K3 a6 d3 h  I7 b    
* L* S& s2 w$ b: Y6 T    代码23 j1 N! ~5 F' k6 k" v% C! R
8 }5 K8 U2 e& Q9 X6 H. `
    第五节 dts 文件讲解
0 U7 N, W' ?7 ?) k  U8 h7 B0 V5 i
1 d2 W% J) g- _3 E( ~1 y) { 5 q: p& k% U( c" K8 v5 v; R& B* I
  
) u& A/ U3 L. V    代码3
2 R  v9 z4 R7 s4 f
( g5 H/ C- I( e+ T& F! I    HeadSet 配置文件
! ^6 O- {" R7 @  D% A3 Y  }" p& k$ n4 @* o9 A
    0 U$ D3 u; M, q9 s1 S; \7 U
    代码4) r! Z8 V+ e7 g: s$ i8 A2 v) ~3 k
) G( j! t" A( [& ~" P  w" S
    I2c 配置文件" i) a- G, K( n3 t9 x2 y, y
% ?% v/ n4 I: [! D1 j
   
2 N4 T" N8 w& g- d+ v# ?    代码5
( O- g% G) S7 W: q: G# _$ F. G    I2s 配置文件, K7 j4 z7 Z- l
    rockchip-rt3224 {
8 h5 ?/ `% I6 g' t* ~6 A6 p: _7 X2 y
. s9 B! Z5 o4 _; j+ w
  u& P1 @7 ]5 E& H: G7 K
0 H% |" u7 Y3 c; W/ A. H    - l% N6 h0 g8 s& y" g8 R
    代码6
- i' e* y' s+ Q/ e0 I/ S  A* n% R! w, A% v) `
    第六节 实验代码, _: l* G  E- g$ G8 e/ O
    1.HeadSet 检测% |+ k/ m6 D) O8 Z5 T
    原理类似于一个 ad 按键的功能。
. u* s% j/ b, n) y; w* W    注意:这里如果要测试这个功能必须在 codec 中设置一个值:
: U6 R5 h% H, N! b! @3 H    codec_hp_det = <0>; ===> codec_hp_det = <1>;! _/ W( k4 `" E
    增加两条测试信息到如下代码中。8 W; K: V0 _! G  F1 x% a
# v* M$ M- D" S3 v- N6 x
   
9 H; Q, j  e: a2 R    代码7
9 Q+ w1 C0 \. M7 d    耳机检测状态的调试:
8 Z' e4 b. P" A4 I0 U. T6 d5 L1 T    cat sys/class/switch/h2w/state 0:无耳机插入. i1 F! x; M4 U( H4 B
    1:带Mic 耳机插入(四段耳机)
+ ^$ M  v8 J. V    2:不带 Mic 耳机插入(三段耳机)
1 u: \  c$ D2 p6 ]# A    2.测试命令        amix! r- |. o0 p4 F! @
    用 amix 命令来调节音量
1 J7 J5 @/ c3 U% {# }. s. r. d    amix 11 09 }5 ?5 F/ P7 T! l9 i- N/ X& z' z
    amix 11 120; E* f& C9 M5 G  r( s5 r0 q2 J  K/ ?! n

" U& B2 y8 a% D* `: f/ o
+ i  r' T& h9 m6 Y5 g
4 @: k- I' W+ p8 V( K' ^# h! A8 N- `1 W( V3 |

) M  F# [" ~& s  U6 l9 D9 l文件下载请点击: 6、音频驱动实验教程.pdf (507.76 KB, 下载次数: 0) + F/ V7 ]8 a% s  D6 E
4 |1 P, [5 R4 I( A

该用户从未签到

2#
发表于 2022-8-9 13:25 | 只看该作者
实验结果如何+ N" k, p! t' y8 q: [
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-10-28 19:50 , Processed in 0.187500 second(s), 27 queries , Gzip On.

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

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

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