Linux自带wm8978的驱动https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/sound/soc/codecs/wm8978.c?h=v5.9-rc6,先编译下(配置CONFIG_SND_SOC_WM8978为y)

dts配置如下

 wlf:wm8978@1a{compatible = "wlf,wm8978";#sound-dai-cells = <0>;reg = <0x1a>;};

采用简易声卡模型,配置CONFIG_SND_SIMPLE_CARD_UTILS和CONFIG_SND_SIMPLE_CARD为y

参考Documentation/devicetree/bindings/sound/simple-card.txt配置声卡(不同平台有差异,请自行适配,这里是展讯平台的配置)

具体的含义可参考https://blog.csdn.net/mike8825/article/details/108417775

 sound {compatible = "simple-audio-card";simple-audio-card,name = "WLF Audio";simple-audio-card,dai-link@0 {plat {sound-dai = <&sprd_pcm_iis>;};cpu {sound-dai = <&i2s0>;};codec {system-clock-frequency = <26000000>;system-clock-direction-out;dai-format = "i2s";sound-dai = <&wlf 0>;};};};

下载内核进手机后,系统已经生成了对应的声卡。

从wm8978规格书中,看到的参考设计如下

MCLK应该给多少M呢

 一种方案是是随着LRCLK的变化,自动调整MCLK/SYSCLK的值(256*fs),另一种方案是MCLK给固定的值,利用wm8978内部的pll模块来调整SYSCLK。刚好上面的表格里有26M的时钟,那可以采用26M的晶振,或者采用带时钟输出功能的引脚输出26M。那ic怎么知道输入是26M呢,dts里有配置26M(asoc_sprd_card_sub_parse_of会解析到)。

这里测试的是cpu做主(i2s主),wm8978作从(i2s从)的模式(snd_soc_of_parse_daifmt函数会解析配置)。

先播放一个音频看下,这里生成的声卡设备为/dev/snd/pcmC1D0p

tinyplay /data/不药而愈.wav -D 1 -d 0

接耳机或者喇叭都有声音输出,都不需要打开ic内部的开关。

再测试接3.5mm接口音频线到模块上,没有声音输出,因为默认的通路没有没有打开,通过如下命令打开下,喇叭也有声音。

tinymix -D 1 "Left Output Mixer Line Bypass Switch" "1"
tinymix -D 1 "Right Output Mixer Line Bypass Switch" "1"

看log并没有走到pll模块,这时的sysclk的值是接近值(非最优),这是由于asoc_simple_card_init_dai这里传递的值固定为0,导致wm8978->sysclk = WM8978_MCLK,默认wm8978->sysclk = WM8978_PLL

加入如下修改

打印如下

再来测试下录音

tinycap /data/1.wav -D 1  -d 0 -c 2 -r 16000 -b 16 -T 10   //-T 10指只录10s

把音频放到电脑上看波形(https://blog.csdn.net/mike8825/article/details/95017611),发现数据是空的。

测量mic的偏置引脚(32)没有电压。

再看下代码,发现wm8978_set_bias_level这个函数有调用,发现驱动里还有一个函数SND_SOC_DAPM_MICBIAS("Mic Bias", WM8978_POWER_MANAGEMENT_1, 4, 0),但tinymix没有看到有相应的开关,先配置下再看下,合入下面的补丁

这时候,也能录到音了。

如果不采用简易声卡模型,展讯平台默认也有一个声卡(非展讯平台请忽略这两个修改),dts配置如下

&sound_sprd_ap_alliis {status = "okay";sprd-audio-card,dai-link@0 {plat {sound-dai = <&sprd_pcm_iis>;};cpu {sound-dai = <&i2s0>;};codec {sound-dai = <&wlf 0>;};};
};

通过如下方式设置主时钟

这里调试基本完成了,再把相应的数据链路理通下,达到融会贯通的境界(这下面的代码都会用sound/soc/codecs)

先看这张图

是不是有很多开关和PGA(Pmgrammable Gain Amplifier),那驱动如何描述该部件呢

看下驱动的这部分

controls:指能动态配置的部分,如音量和开关等,可以通过tinymix去配置
dapm_widgets:(DAPM--Dynamic Audio Power Management)音频ic里面有很多电源,用的时候才打开,能节省电源,这也是DAPM的概念,这里描述的是开启电源的寄存器
dapm_routes:中文描述为DAPM路由表,也就是什么时打开DAPM,如
{"Right Input Mixer", "MicN Switch", "RMICN"},会将"Right Input Mixer"和"MicN Switch"涉及的电源都打开

Linux下wm8978调试指南相关推荐

  1. linux下gdb调试方法和技巧详解

    linux下gdb调试方法和技巧整理 简介 UNIX或者UNIX-like下调试工具 启动gdb # 1. 在可执行程序不需要输入参数时,我们可以使用 gdb + 可执行程序 gdb ./typeid ...

  2. gdb 调试_一文入门Linux下gdb调试(二)

    点击"蓝字"关注我吧 作者:良知犹存 转载授权以及围观:欢迎添加微信号:Conscience_Remains 总述     今天我们介绍一下core dump文件,Core dum ...

  3. Linux下串口调试及使用shell编程接收数据

    串口简介 串行口是计算机一种常用的接口,具有连接线少,通讯简单,得到广泛的使用.常用的串口是 RS-232-C 接口(又称 EIA RS-232-C)它是在 1970 年由美国电子工业协会(EIA)联 ...

  4. UART和RS232/RS485的关系是什么?RS485在linux下的调试 ubuntu串口调试工具

    串口通讯是电子工程师和嵌入式开发工程师面对的最基本问题,RS232则是其中最简单最常用的通讯方式.但是初学者往往搞不清有关的名词如UART和RS232或RS485之间是什么关系,因为它们经常被放到语句 ...

  5. linux gdb网络调试,一文入门Linux下gdb调试(二)

    本文转载自[微信公众号:羽林君,ID:Conscience_Remains] 总述 今天我们介绍一下core dump文件,Core dump叫做核心转储,它是进程运行时在突然崩溃的那一刻的一个内存快 ...

  6. C++(Qt)软件调试---linux下生成/调试Core文件(3)

    #软件调试 C++(Qt)软件调试-linux下生成/调试Core文件(3) 文章目录 C++(Qt)软件调试---linux下生成/调试Core文件(3) 前言 1.C++生成Core和使用GDB调 ...

  7. Linux下gdb调试用法

    稍微小小介绍一下 gdb是GUN组织开发的Linux下的调试利器.一般用于调试C/C++程序. GDB主要有以下4个功能: 1.启动你的程序,可以按照你的自定义的要求随心所欲的运行程序. 2.可让被调 ...

  8. LINUX下GDB调试

    LINUX下GDB调试 (gdb) p result[2]=33 $5 = 33 (gdb) p printf("result[2]=%d\n", result[2]) resul ...

  9. linux下 如何调试php,linux下使用gdb对php源码调试

    title: linux下使用gdb对php源码调试 date: 2018-02-11 17:59:08 tags: --- linux下使用gdb进行php调试 调试了一些php的漏洞,记录一下大概 ...

  10. c linux下并行编程指南,Linux环境下C编程指南(第2版)

    摘要: <Linux环境下C编程指南(第2版)>系统地介绍在Linux平台下用C语言进行程序开发的过程,通过列举大量的程序实例,使读者能够很快掌握在Linux平台下进行C程序开发的方法和技 ...

最新文章

  1. 【OpenCV 4开发详解】分割图像——分水岭法
  2. abs传感器电压有几伏电_CC6501、CC6502、CC6503 高性能线性霍尔传感器IC
  3. 新研究旨在用“黑箱”算法解决人工智能偏差问题
  4. 动态修改easyui datagrid 列宽度
  5. python汉诺塔游戏_Python实战:搭建汉诺塔小游戏,快和小伙伴一起玩玩吧
  6. C#中实现文件重命名的方式
  7. 云栖新品|阿里云IoT发布云芯一体智能视觉解决方案
  8. 引领性指标与滞后性指标_测量可用性组同步滞后
  9. Vivado设计流程(一)新建工程
  10. Python源码深度解析—对象的行为和多态性
  11. SPI通信实验---verilog(FPGA作为从机,使用可读可写)
  12. SpringBoot之Idea不显示项目文件夹
  13. 【网络流24题-23】洛谷P3356 火星探险问题
  14. w7计算机文件夹打开怎么设置密码,win7电脑文件夹怎么设置密码
  15. ibm服务器前面板显示屏,ibm_x3500服务器前面板指示灯的含义.doc
  16. 线段树 hdu3265 Posters
  17. 元旦在家撸了两天Seata源码,你们是咋度过的呢?
  18. 摩拜创始人套现15亿:你的同龄人,正在抛弃你+韩寒回应
  19. 解决电脑扩展屏幕模糊的小技巧
  20. python量化交易笔记---13.描述性统计

热门文章

  1. Python程序员面试技巧
  2. 面向AMD64的文件xxx与项目的目标平台x86不兼容
  3. B,KB,MB,GB之间换算
  4. PC端后台项目的总结
  5. MUI 的侧滑菜单 详解
  6. 浅谈Hibernate的flush机制
  7. FragmentVisible
  8. ip地址冲突该如何解决?
  9. jav中什么是组织java程序_在Java中,开发图形用户界面的程序需要使用一个系统提供的类库,这个类库就是以下的______包。A.jav...
  10. linux 输入法成繁体字_寻找Ubuntu中繁体字输入法