说明:本文适用于基于 linux 4.4 内核版本开发的 RK 系列 SDK。硬件上,RK 芯片端 i2s mclk 引脚连接外部 codec 芯片 mclk 引脚,为外部芯片提供 mclk 时钟。软件上,需要对 mclk 做使能处理。

DTS配置

不同平台对应的时钟名称不一样,下述只举例 RK3399 和 RK3288 平台配置,其他平台可以去 kernel\drivers\clk\rockchip\clk-rk3xxx.c 中确定。

RK3399:
/{dummy_codec: dummy-codec {status = "okay";compatible = "rockchip,dummy-codec";#sound-dai-cells = <0>;
+        clocks = <&cru SCLK_I2S_8CH_OUT>;
+        clock-names = "mclk";
+        pinctrl-names = "default";
+        pinctrl-0 = <&i2s_8ch_mclk>;};
};RK3288:
/{dummy_codec: dummy-codec {#sound-dai-cells = <0>;compatible = "rockchip,dummy-codec";
+       clocks = <&cru SCLK_I2S0_OUT>;
+       clock-names = "mclk";
+       pinctrl-names = "default";
+       pinctrl-0 = <&i2s0_mclk>;};
};
codec 驱动

使用 dummy codec driver 需要添加下述patch:

diff --git a/sound/soc/codecs/dummy-codec.c b/sound/soc/codecs/dummy-codec.c
index 2761797..354251c 100644
--- a/sound/soc/codecs/dummy-codec.c
+++ b/sound/soc/codecs/dummy-codec.c
@@ -14,6 +14,7 @@**/+#include <linux/clk.h>#include <linux/module.h>#include <linux/moduleparam.h>#include <linux/slab.h>
@@ -23,6 +24,37 @@#include <sound/pcm.h>#include <sound/initval.h>+struct dummy_codec_priv {+  struct snd_soc_codec *codec;
+  struct clk *mclk;
+};
+
+static int dummy_codec_startup(struct snd_pcm_substream *substream,
+                 struct snd_soc_dai *dai)
+{+  struct snd_soc_codec *codec = dai->codec;
+  struct dummy_codec_priv *dummy_codec = snd_soc_codec_get_drvdata(codec);
+
+  if (!IS_ERR(dummy_codec->mclk))
+      clk_prepare_enable(dummy_codec->mclk);
+  return 0;
+}
+
+static void dummy_codec_shutdown(struct snd_pcm_substream *substream,
+               struct snd_soc_dai *dai)
+{+  struct snd_soc_codec *codec = dai->codec;
+  struct dummy_codec_priv *dummy_codec = snd_soc_codec_get_drvdata(codec);
+
+  if (!IS_ERR(dummy_codec->mclk))
+      clk_disable_unprepare(dummy_codec->mclk);
+}
+
+static struct snd_soc_dai_ops dummy_codec_dai_ops = {+  .startup    = dummy_codec_startup,
+  .shutdown   = dummy_codec_shutdown,
+};
+struct snd_soc_dai_driver dummy_dai = {.name = "dummy_codec",.playback = {@@ -45,12 +77,33 @@ struct snd_soc_dai_driver dummy_dai = {SNDRV_PCM_FMTBIT_S24_LE |SNDRV_PCM_FMTBIT_S32_LE),},
+  .ops = &dummy_codec_dai_ops,};static struct snd_soc_codec_driver soc_dummy_codec;static int rockchip_dummy_codec_probe(struct platform_device *pdev){+  struct dummy_codec_priv *codec_priv;
+
+  codec_priv = devm_kzalloc(&pdev->dev, sizeof(*codec_priv),
+                GFP_KERNEL);
+  if (!codec_priv)
+      return -ENOMEM;
+  platform_set_drvdata(pdev, codec_priv);
+
+  codec_priv->mclk = devm_clk_get(&pdev->dev, "mclk");
+  if (IS_ERR(codec_priv->mclk)) {+      /* some devices may not need mclk,so warnnig */
+      dev_warn(&pdev->dev, "Unable to get mclk\n");
+      if (PTR_ERR(codec_priv->mclk) == -EPROBE_DEFER)
+          return -EPROBE_DEFER;
+      else if (PTR_ERR(codec_priv->mclk) != -ENOENT)
+          return -EINVAL;
+  } else {+      dev_info(&pdev->dev, "get mclk success\n");
+  }
+return snd_soc_register_codec(&pdev->dev, &soc_dummy_codec,&dummy_dai, 1);}

使用外置音频codec芯片均可参照下述 RT5670 driver 的修改:

diff --git a/sound/soc/codecs/rt5670.c b/sound/soc/codecs/rt5670.c
old mode 100644
new mode 100755
index 49a9e70..8763ea7
--- a/sound/soc/codecs/rt5670.c
+++ b/sound/soc/codecs/rt5670.c
@@ -2654,6 +2654,21 @@ static int rt5670_probe(struct snd_soc_codec *codec){struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec);struct rt5670_priv *rt5670 = snd_soc_codec_get_drvdata(codec);
+  int ret ;
+
+     /* Check if MCLK provided */
+     rt5670->mclk = devm_clk_get(codec->dev, "mclk");
+     if (PTR_ERR(rt5670->mclk) == -EPROBE_DEFER)
+         return -EPROBE_DEFER;
+
+     ret = clk_prepare_enable(rt5670->mclk);
+     if (ret){+         printk("%s clk_prepare_enable failed!",__func__)
+         return ret;
+     }switch (snd_soc_read(codec, RT5670_RESET) & RT5670_ID_MASK) {case RT5670_ID_5670:diff --git a/sound/soc/codecs/rt5670.h b/sound/soc/codecs/rt5670.h
old mode 100644
new mode 100755
index 3f1b0f1..f8152c4
--- a/sound/soc/codecs/rt5670.h
+++ b/sound/soc/codecs/rt5670.h
@@ -13,6 +13,7 @@#define __RT5670_H__#include <sound/rt5670.h>
+#include <linux/clk.h>/* Info */#define RT5670_RESET                0x00
@@ -1990,6 +1991,7 @@ struct rt5670_priv {struct regmap *regmap;struct snd_soc_jack *jack;struct snd_soc_jack_gpio hp_gpio;
+  struct clk *mclk;int sysclk;int sysclk_src;

RK系列SDK -- i2s mclk 无输出相关推荐

  1. RK系列SDK -- dummy codec虚拟声卡注册

    注:适用于基于4.4内核版本开发的RK系列SDK 虚拟声卡的注册主要应用于硬解码芯片的使用,硬件设计上主控I2S直接接到该类芯片,硬解码芯片能够将数字信号直接转换成模拟信号输出.同时,这类芯片需要主控 ...

  2. RK系列(RK3568) i2s 音频输入 麦克风驱动

    平台:Android12 SOC:RK3568 外围芯片:XS9922 i2s简介: 从上图看I2s主要的线有:SDO SCLK LRCK MCLK I2S协议只定义三根信号线:串行时钟信号SCLK( ...

  3. ZYNQ开发系列——SDK输出串口选择以及打印函数print、printf、xil_printf的差别

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 ZYNQ开发系列--SDK输出串口选择以及打印函数print.printf.xil_printf的差别 前言 两个串口到底是谁在打印? ...

  4. RK系列开发板音频驱动适配指南(二)

    背景: 上一篇文章RK系列开发板音频驱动适配指南-DAI模块适配中已经阐述音频驱动适配的DAI模块适配步骤以及核心代码的展示,本次主要介绍音频驱动适配中的DMA模块适配. RK系列开发板 DMA模块适 ...

  5. RK系列开发板音频驱动适配指南(一)

    背景: 多媒体系统目前在Linux操作系统,windows操作系统已经非常成熟,并且应用场景广泛,但是,基于OpenAtom OpenHarmony(以下简称"OpenHarmony&quo ...

  6. 小米笔记本电脑故障——USB口拷贝文件中断/电池在低温时无输出

    --USB口拷贝文件中断/电池在低温时无输出 本文主要叙述如何发现计算机故障,以及如何呈现.同时,也给网友传达如何正确与厂家交涉. 本电脑在2018年3月14日左右购买,在2018年9日前,给亲人使用 ...

  7. shell脚本自动执行,top命令无输出

    shell脚本在系统启动时推后台自动执行,发现其中/usr/bin/top -n 1 -c -b -u ceph 命令并无输出 但是系统启动之后手动执行脚本,&推后台脚本中的top仍然能够正常 ...

  8. [20180403]访问dba_autotask_task无输出问题.txt

    [20180403]访问dba_autotask_task无输出问题.txt --//链接http://www.itpub.net/thread-1911421-1-1.html的讨论,还没注意原先的 ...

  9. [工具] 解决sublime text运行javascript console无输出问题

    1.使用nodeJS在sublime text 运行javascript 下载安装nodeJS 在sublime text新建build system:tools->build system-& ...

  10. redis 启动无输出_Git Bash 中执行交互式命令无响应

    众所周知的原因,Windows下的命令行工具CMD非常难用,所以大家一般用Git Bash作为替代品,但是有时候在其中执行一些命令会出现无响应(无输出结果.无报错信息)的现象,本文将给出该现象的原因及 ...

最新文章

  1. php display_errors
  2. 人群计数--Cross-scene Crowd Counting via Deep Convolutional Neural Networks
  3. 好技术领导和差技术领导区别在哪里--转
  4. 分布式计算第四章 RMI
  5. Mysql:替换某个字段中的部分字符串——replace函数
  6. arcgis两点之间连线_使用ArcGIS制作城市关系强度图(附数据下载)
  7. TypeError: __str__ returned non-string (type NoneType)
  8. Golang教程:(十五)指针
  9. 80 - 抓取豆瓣音乐排行榜
  10. 2021机动车检测站签字授权人考试专业基础知识部分题库与答案
  11. 电子线路设计技巧5:CDRH系列贴片电感
  12. 判断一颗二叉树是否对称
  13. 基于js管理大文件上传以及断点续传
  14. Matlab App Designer 【04】使用公共函数在两个App之间传递数据
  15. html tr隐藏 边框存在,CSS 设置tr的边框
  16. 第 12 章 武装飞船
  17. 微信小程序开发详细步骤解决方案
  18. Bseline基准预测、zip()、dict()、groupy().agg()、
  19. the working directory ‘XXX’ does not exist
  20. Android 客户端Socket 实现及简单封装。

热门文章

  1. python文本文件对比工具_python实现比较文件内容异同
  2. win10系统无法登录ftp服务器失败,win10电脑下ftp连接失败怎么解决
  3. BLM业务战略规划的底层逻辑是什么?
  4. 《英雄联盟》捞月狗数据初探
  5. 【WeUI】关于jQuery WeUI和WeUI版本兼容的问题
  6. 数据结构面试常见问题
  7. RDPWrap远程桌面的一次脱坑
  8. RestSharp是什么?
  9. c语言日志管理系统 --- zlog
  10. SpringBoot+JWT+Shiro,linux 高级编程面试题