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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
音频驱动实验教程
——疯壳·嵌入式平板开发
6 a' @2 q' D& a/ R

/ M+ B5 Q0 _. P1 R
" }) K; J) |  o: S6 l0 e9 x
0 g& a8 T% ~. Z- F2 o    
6 `, F+ [' `9 o   图1 - ~1 P- l3 Y& ^4 o2 i! C
    如上图是音频模块 codec 和 cpu 连接框图,主要由三部分组成:0 j9 L4 J! F, k  k2 U6 [; x% Q
    I2C 总线 - cpu 通过它实现对 Codec 寄存器数据的读写。: @" a! u: h2 T1 x* Z8 `2 ]3 h
    I2S 总线 - 实现音频数据在 CPU 和 Codec 间的通信。4 y6 o6 f! Q8 o1 \
    HP_DEC - 实现检测是否有 HeadSet 设备插入。( L; ~$ x/ d  f+ h! v4 U3 f
, Z% s0 ?8 {' A7 J: U- t
    第二节 linux workqueue 工作原理, v1 Q$ q9 f7 i. a6 l: F5 m
    音频子系统的源代码中用到了一个概念:workqueue。对于不了解的朋友,读代码可能会引起疑惑,所以这里做一个简单介绍。Linux 中的 Workqueue 机制就是为了简化内核线程的创建,只是通过调用 workqueue 的接口就能创建内核线程;并且可以根据当前系统 CPU 的个数创建线程的数量,使得线程处理的事务能够并行化;workqueue 是内核中实现简单而有效的机制,它显然简化了内核 Daemon 的创建,方便了用户的编程。工作队列(workqueue) 是另外一种将工作推后执行的形式。它把工作推后,交由一个内核线程去执行,也就是说,   这个下半部分可以在进程上下文中执行。最重要的就是工作队列允许被重新调度甚至是睡眠。  举个栗子:3 t5 j5 Y" w9 u4 ~+ @& \
+ s& g+ P0 d# ]
- o- L0 e* S  c/ P2 [$ x. P- K: _, n
   
$ W: ~4 e9 n! Y7 x& y    代码1% {3 `' _$ A7 u/ r
/ E! ^2 ?# X7 r) |, ~7 M
    第三节 电路原理图介绍
, O9 a# U+ p+ U! R7 H/ L    下图来源于文档 3128_sdk_a02_20170325.pdf 中第 18 页。
1 b9 A5 }* g+ [: N* x4 i    图一、绿色框中是 codec 芯片自己检测是否有 HeadSet 设备插入的电路原理图,它是通过 HP_HOOK(HP_HOOK 和 HP_DEC 是连在一条线上)与 cpu 的 ADC_IN0 连接,这个有点类似于 AD 按键检测的功能;音频 Codec 模块是数据与控制分开的,所以有 I2c 来控制 Codec 的寄存器的读写,数据通过 I2s 总线进行传输。9 d- a2 V& Q9 w$ M3 n0 R/ g
% u5 k2 f5 `$ m4 P) T8 K
8 [( p* t; _0 Y! U( H! R8 j
    图2
9 a, H0 h6 `5 h9 @: T  M- B( ?: n) j
    第四节 音频驱动代码结构
7 A* f2 c) Q9 l" G8 P# _% I
7 g; m( d& H* g" w, y    
: p3 O" q2 \( ^0 C2 O    代码2
; L' r. f; i0 E& u" @4 f7 [( {& Q" J/ v- N9 {( a% \
    第五节 dts 文件讲解3 t3 [7 j- ~6 u6 T  }6 i
) E3 ]. V7 q$ p! r4 W
- o, M: b/ `/ T4 p5 N$ F# t& u
  
  q) i' l1 y5 [1 |    代码30 W- ?: y; p1 C* u" W8 C( s/ u1 v

! s* Z0 Z, Q+ D" p    HeadSet 配置文件# ^, o6 T8 w8 x7 @
' O8 X9 i6 R+ l: O2 R1 X! v
    ; {7 [) \2 T8 `, n% Q
    代码4+ @% i- k: p; v5 f  j3 r
1 s/ P: F; x/ z" |
    I2c 配置文件
* k! V: g+ w- x# p7 W1 i* A0 p6 p9 t. j5 S- |  U0 N3 x
   
3 l# P6 `: ?& n$ \    代码5
* v7 w* w) ~- t7 K' P, O    I2s 配置文件9 r' o% I4 `8 g5 z
    rockchip-rt3224 {: q0 `5 Z+ r1 G9 ?8 d; A/ n7 w
9 i' `6 J+ K6 U/ m; c
9 ^: S/ w$ w7 m* n7 ?. I! U1 A' X! O

1 l% D5 q5 S; H# s0 C; f  Z      G) u0 V+ e) e7 w
    代码6
4 Q. F4 P  |4 ?' v' s
+ z+ q0 |1 V7 W6 M' D    第六节 实验代码. U- M$ m. ~1 k9 [
    1.HeadSet 检测9 I3 }3 S8 Z3 g
    原理类似于一个 ad 按键的功能。2 {' Z6 ]- Q; I$ L9 R$ i/ S7 u+ g
    注意:这里如果要测试这个功能必须在 codec 中设置一个值:. y2 C; K, S4 J) S6 C: B: b0 t$ m8 Q
    codec_hp_det = <0>; ===> codec_hp_det = <1>;
6 B' E  h' q7 p1 S7 o    增加两条测试信息到如下代码中。) t0 H7 d+ i" Q! O* ?

/ K: b) t9 i+ }# s- ?* E, g4 Y( {0 t     1 T1 R: R/ X  j2 O) o" G1 G
    代码7
& h7 n0 e, c2 v. Z    耳机检测状态的调试:& f4 I' H/ i5 x- b! f) @
    cat sys/class/switch/h2w/state 0:无耳机插入
% x4 J/ e2 k) n$ u6 y8 N, u    1:带Mic 耳机插入(四段耳机)
) J1 K9 v% x; E: s1 O4 J' P; [    2:不带 Mic 耳机插入(三段耳机)
$ v: ?( X, J) k+ f! D    2.测试命令        amix; a3 g) V/ H" P! E8 B& f
    用 amix 命令来调节音量5 _# J+ D( _$ B5 {0 U' S0 f
    amix 11 08 H' \2 T. u9 O# [) I. W
    amix 11 120
( \5 _# \8 o/ L9 v6 E/ e' @5 L' o3 y/ E5 t/ ~. P
. @! ]6 z$ ]# ~  P

& p' ^- I4 z, v/ ?- v
& c, Q6 `+ ~; R9 z% [- ^9 X5 d( z: G1 U
文件下载请点击: 6、音频驱动实验教程.pdf (507.76 KB, 下载次数: 0) # V4 }) n: k- e6 q; H5 y
$ ~: ], p! B' `$ ~8 Q

该用户从未签到

2#
发表于 2022-8-9 13:25 | 只看该作者
实验结果如何2 l6 L# [) y, w& h4 N
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-7-25 21:21 , Processed in 0.125000 second(s), 26 queries , Gzip On.

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

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

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