WM8960 NXP 官方移植手记的理解

/ 0评 / 0

本文未验证,我也没完全理解,而且我对ALSA驱动,基本没有了解,所以,将就看看就好.另外,里面加上了我一些理解,需要还是看原文吧.

原文地址:https://freescale.jiveon.com/docs/DOC-106295

Introduction

这是一篇移植手记,基于 L3.0.35 Linux BSP(但是我用的是L4.9.11),讨论的是如何移植WM8960这个驱动.

ALSA

更多需要了解的,参考维基百科.

AlsaProject

Advanced Linux Sound Architecture (中文版)

kcontrols 在 ./include/sound/soc.h 和 soc-dapm.h 中定义.

控制通道/路径:(大概可以理解为如何走吧.)

手册19页,输入通道.

输出通道,35页.

根据输入输出通道,和电路图设计,可以修改源码,这些可以被alsamixer使用.

原始是这样的.

其中,字段含义:

SOC_SINGLE,设置一个简单开关

这个字段名为PCM Playback -6dB Switch

然后WM8960_DACCTL1为0x05,这个在头文件定义的.

其中7指明是第7位.(BIT7)

1表示他只有开关两种状态.

0这个数值1就是开,0就是关,不用翻转.

SOC_SINGLE_TLV,他是有等级的一个开关,意思是一个范围,比如音量.

4代表最低位是第4位(BIT4).

7代表他有7档.

0,是否翻转.这里不翻转.

lineinboost_tlv是一个DECLARE_TLV_DB_SCALE.

这个数值为了简单阅读一些准备的(我个人认为).他指示从-1500开始,每一步步进是300,他从1开始计算.(有些DAC的0相当于禁用,静音.).

如下图,每一步3db,-15db开始(-12db - 3db = -15db).

SOC_DOUBLE_R_TLV是立体声版本的SOC_SINGLE_TLV.

依次是:左右音量寄存器,从BIT0开始,分63档,不翻转,由inpga_tlv来描述.

SOC_DOUBLE_R是立体声版本的SOC_SINGLE.

左右声道静音,这个一次可以描述两个通道.BIT7,只有开关功能,翻转.就是0时候静音,1时候不静音.(貌似跟手册有出入啊.)

SOC_ENUM,枚举型,只有几个档位,没有规律的.

很明显,枚举数值和配置在wm8960_enum写着.

而上面对应是7,则是.

其中的变量又为.

很容易理解,BIT4是控制符,有2个枚举方案,第一个(也就是0),是立体声,第二个(也就是1),就是单声道.

嗯,当你上面这些都核对,移植好了(什么?我还没管.先继续吧.)

然后可以开始连线?(对,里面这么多通道.)

这玩意叫SOC_DAPM_SINGLE等等... 反正,好乱.但是如果设置不好,就没声音了.(原文作者,把他改到跟寄存器名一模一样,这样在alsamixer上很容易找得到对应的.)

SOC_DAPM_SINGLE和SOC_SINGLE非常类似啊,也是指明BIT,然后开关,是否翻转.

创建输入输出连线.

开始布线(这样描述是不是有点奇怪.)

比如原始代码(部分):

第一句是什么意思,先分析一下,LINPUT1 Switch描述了LINPUT1寄存器的BIT8位,就是LMN1.

然后打通上路.

第二个用的是Boost Switch.就是20h的BIT3.

这就可以把后面也打通了.

最后一个是WM8960_POWER1的BIT3.正是ADCL的上电.

再举个DAC通路的例子.

先是PCM Playback Switch指向了如下代码.

就是这个开关.

打通了LD2LO.

接着LOUT1 PGA打通了LOUT1.

最后一个指定了他是HP_L输出源的名字(这条通路就唯一他了.)

把这些每一路配置好,alsamixer就可以用M按键配置开关,用上下箭头配置音量等.

另一个重要部分是这个函数.

先确定我们的MCLK.原作者直接设置了分频.但是我们代码是传入频率,然后设置,再怎么样.

具体要确定是否正确,看Table 45. (最方便就是打印寄存器.)

在驱动中,有两个名字很重要, 一个是编解码器的名称,就是wm8960,要与imx-wm8960.c中使用的名称相同.

另一个是I2C名,几乎所有CODEC都是I2C + I2S通信的.也得与dts的同名.

另外,imx-wm8960.c我从SAI修改成SSI,还没验证,日后分析.

发表评论

电子邮件地址不会被公开。 必填项已用*标注

This site uses Akismet to reduce spam. Learn how your comment data is processed.