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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
音频驱动实验教程
——疯壳·嵌入式平板开发
. o3 z* v6 w0 i7 N/ F
3 i6 ^, g1 f  p8 X. G5 ^9 J
3 h9 z5 w+ K2 U; ]- x6 E
, F" k' M' {3 Q- P
    4 O7 \' E1 U0 C0 O# t1 m
   图1 . [1 C+ [3 y' `
    如上图是音频模块 codec 和 cpu 连接框图,主要由三部分组成:
2 I  ~2 B" L0 G* q$ u* A1 o% O    I2C 总线 - cpu 通过它实现对 Codec 寄存器数据的读写。5 t) X- z( n2 u: y, e. ^8 q6 \
    I2S 总线 - 实现音频数据在 CPU 和 Codec 间的通信。
& z7 A3 r( z% v) O5 E% @) E    HP_DEC - 实现检测是否有 HeadSet 设备插入。
+ v2 s: n+ J% g( j' {1 J4 x; b
/ ^' W& ^# W9 N& X+ M$ M    第二节 linux workqueue 工作原理
) s  C+ k. ^1 A" m$ I' q    音频子系统的源代码中用到了一个概念:workqueue。对于不了解的朋友,读代码可能会引起疑惑,所以这里做一个简单介绍。Linux 中的 Workqueue 机制就是为了简化内核线程的创建,只是通过调用 workqueue 的接口就能创建内核线程;并且可以根据当前系统 CPU 的个数创建线程的数量,使得线程处理的事务能够并行化;workqueue 是内核中实现简单而有效的机制,它显然简化了内核 Daemon 的创建,方便了用户的编程。工作队列(workqueue) 是另外一种将工作推后执行的形式。它把工作推后,交由一个内核线程去执行,也就是说,   这个下半部分可以在进程上下文中执行。最重要的就是工作队列允许被重新调度甚至是睡眠。  举个栗子:
% c) o) p1 N" n& R( @* I' j
1 ~; @3 ^2 n- B# v1 A& l+ k/ C0 G4 z0 A1 b
    6 k. Q6 |3 h1 N
) b9 |2 U6 V  `8 v  r
    代码1
$ w1 ]% F! ^, W% b1 O+ M: O, b) w) U
    第三节 电路原理图介绍$ k" D$ l& B  H0 _: @* b
    下图来源于文档 3128_sdk_a02_20170325.pdf 中第 18 页。
! S8 _" ?6 C5 |7 Q    图一、绿色框中是 codec 芯片自己检测是否有 HeadSet 设备插入的电路原理图,它是通过 HP_HOOK(HP_HOOK 和 HP_DEC 是连在一条线上)与 cpu 的 ADC_IN0 连接,这个有点类似于 AD 按键检测的功能;音频 Codec 模块是数据与控制分开的,所以有 I2c 来控制 Codec 的寄存器的读写,数据通过 I2s 总线进行传输。
3 F- h1 A: s% A# Z" K- i
" Y. G4 P8 H2 V  M. S    % S9 i& C8 L( m- S, [) Y9 v8 A  }! r
    图2# K0 }2 p" m6 v# M8 q

2 l# c* [( |1 }- f0 {    第四节 音频驱动代码结构- x5 _' Z& ]: }9 K+ @

  J8 t2 q7 S; H9 c6 p* R    ! n9 [9 i" U/ J5 o) E" p% u
    代码2# G, G; ~/ x( R( R

8 s, K( J# G& y1 r    第五节 dts 文件讲解) p  U* Y1 s3 Q% h2 v' D. R+ ]4 f) s

' B+ h4 l+ f* u 6 I: d! x1 y& b+ s
   
  o/ |, b' J  k" \3 I. `    代码30 V, f/ u  ^5 r5 G" |  h( I
8 r  C1 B" v) f; U) p& K/ x
    HeadSet 配置文件
% m/ G: m5 p; {& P$ y0 D/ O5 H) q6 u0 c8 }! O( q
  3 p/ ~# ?/ d4 i
    代码4; P5 b: a" d3 k5 o8 o! X- B& t7 V
% e# [$ U0 y2 R1 J2 N# d
    I2c 配置文件
  G8 F) M1 J; p
( B( R% l( ]% H) t7 {& C    
3 ?4 {3 l6 |1 l$ u    代码5
6 b" s5 W1 h% A    I2s 配置文件  J2 M6 S: ?0 }; n
    rockchip-rt3224 {
1 A1 J& n) `& B
- x; l+ V1 w4 r; m9 V
. a. C. B5 j( z( t # a& {2 K5 x3 W9 r% \) Q
    . c5 i' u9 ]$ F# `$ N- `- E
    代码6
9 t; s5 L4 c, \
  q, ~! g4 ~9 |) b- A% J" |    第六节 实验代码6 z/ y. i, D. x4 H7 _9 ~
    1.HeadSet 检测
0 ~: A% ?% E& P: J. q" @    原理类似于一个 ad 按键的功能。
" U, p: p& @1 |! V& m5 a    注意:这里如果要测试这个功能必须在 codec 中设置一个值:6 v: n- T* X4 ~8 p) o% S
    codec_hp_det = <0>; ===> codec_hp_det = <1>;
/ J5 P2 \' `5 f; c9 V    增加两条测试信息到如下代码中。5 j1 O2 O) F$ z1 M; D

, I$ Q& u" z! g& J: W    4 E1 N/ H4 W' ]4 a. d; ]
    代码79 e5 c9 G& I& [0 h6 t
    耳机检测状态的调试:" ]' k4 a0 Y  w# a( O2 ]
    cat sys/class/switch/h2w/state 0:无耳机插入
4 A- t3 p7 F- n+ o% X    1:带Mic 耳机插入(四段耳机)* \! b, `8 n1 Q$ |/ T( F: W
    2:不带 Mic 耳机插入(三段耳机)
. j; j" S( l+ w' }- u& r9 }' n    2.测试命令        amix. u( Q, g# U8 {6 a
    用 amix 命令来调节音量
' C( g/ l; Z/ b+ N/ i( n0 e    amix 11 07 }8 s$ K- ]3 Q
    amix 11 120& Y/ y. ?6 D0 T: q3 P, J4 |) i& t6 M4 u
8 {- _2 R) q8 \+ A( V3 ?7 E" P

% Z( k% B- I5 M( |5 d
: Y+ `1 K$ j# C9 B5 }/ P文件下载请点击: 6、音频驱动实验教程.pdf (507.76 KB, 下载次数: 0) : b& C( G# b+ S$ G
, I( [: F5 m& h9 w  |# @
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

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

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

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

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