android下調試音效卡驅動之Machine部分

來源:互聯網
上載者:User

android下調試音效卡驅動之Machine部分

本文介紹的代碼是在CPU(imx6)和Codec(wm8960)上做的調試並且Codec做主模式,在“概述篇”中提到Codec部分、

Platform部分代碼由裝置原廠提供和系統提供,所以我們在音效卡調試中需要做的只有Machine部分,其他代碼在需要的情況下略做微

調即可,調試過程中還要注意在BSP檔案裡配置好I2S(SSI和AUD複用)。

1、imx_hifi_hw_params函數介紹

static int imx_hifi_hw_params(struct snd_pcm_substream *substream,     struct snd_pcm_hw_params *params){/* 設定Codec與CPU音頻資料通訊格式為I2S,BLCK不反轉,Codec為主模式*/dai_format = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF |SND_SOC_DAIFMT_CBM_CFM;/*  set codec DAI configuration */ret = snd_soc_dai_set_fmt(codec_dai, dai_format);    if( ret < 0 ){        printk( "%s: Codec DAI configuration error, %d\n", __func__, ret );        return ret;    }/*  set i.MX active slot mask */snd_soc_dai_set_tdm_slot(cpu_dai,channels == 1 ? 0xfffffffe : 0xfffffffc,channels == 1 ? 0xfffffffe : 0xfffffffc,2, 32);/* 設定CPU與Codec音頻資料通訊格式為I2S,BLCK不反轉,CPU為從模式*/dai_format = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF |SND_SOC_DAIFMT_CBM_CFM;/*  set cpu DAI configuration */ret = snd_soc_dai_set_fmt(cpu_dai, dai_format);    if( ret < 0 ){        printk( "%s: AP DAI configuration error, %d\n", __func__, ret );        return ret;    }sample_rate = params_rate(params);switch (sample_rate) {       case 44100:        if (channels == 1) { // 根據通道數配置相關時鐘頻率(1:代表單通道)            /* Mono mode */            dacdiv = WM8960_DAC_DIV_2; /* 22.05 KHz */            bclk = WM8960_BCLK_DIV_16;        }        else {            /* Stereo Mode */            dacdiv =WM8960_DAC_DIV_1; // 44.1 KHz,為設定採樣頻率(LRCK),配置Codec寄存器的值            bclk = WM8960_BCLK_DIV_4; // 為設定BCLK頻率,配置Codec寄存器的值dclk = WM8960_DCLK_DIV_16;// 為設定D類放大器時鐘頻率,配置Codec寄存器的值}        sysclk_div = WM8960_SYSCLK_DIV_2; // 為設定Codec的系統時鐘頻率,配置Codec寄存器的值        pll_out = 11289600; // 設定PLL的頻率值        break;      default:        printk("do not support this sample frequency");        return -EINVAL;    }    /* 設定Codec的PLL頻率:11289600*/ret=snd_soc_dai_set_pll(codec_dai,1,0,priv->sysclk/2,pll_out);    if( ret < 0 ){        printk( "%s: AP codec pll error, %d\n", __func__, ret );        return ret;    }/* 設定Codec的系統時鐘:11289600*/    ret = snd_soc_dai_set_clkdiv( codec_dai, WM8960_SYSCLKDIV, sysclk_div );    if( ret < 0 ){        printk( "%s: Codec SYSCLKDIV setting error, %d\n", __func__, ret );        return ret;    }/* 設定採樣頻率(LRCK)的時鐘,lrckclk= sysclk/1*256=44100 */    ret = snd_soc_dai_set_clkdiv( codec_dai, WM8960_DACDIV, dacdiv);    if( ret < 0 ){        printk( "%s: Codec DACDIV setting error, %d\n", __func__, ret );        return ret;    }/* 設定D類放大器時鐘頻率:dclk= sysclk/16 */ret = snd_soc_dai_set_clkdiv( codec_dai, WM8960_DCLKDIV,dclk);if( ret < 0 ){printk( "%s: Codec DCLKDIV setting error, %d\n", __func__, ret );return ret;}/* 設定BCLK類放大器時鐘頻率:bitclk=sysclk/4 = 2822400 */ret = snd_soc_dai_set_clkdiv( codec_dai, WM8960_BCLKDIV, bclk); if( ret < 0 ){printk( "%s: Codec WM8960_BCLKDIV setting error, %d\n", __func__, ret );return ret;    }    return 0;}

2、snd_soc_dai_link結構體介紹

platform 串連 codec 與 cpu 的驅動時,需要通過核心功能結構體snd_soc_dai_link來設定兩邊的介面。

static struct snd_soc_dai_link imx_dai[] = {{.name = "HiFi",.stream_name = "HiFi",.codec_dai_name= "wm8960-hifi",.codec_name= "wm8960.1-001a", /* wm8960.1-001a代表的是用I2C1來控制codec,其I2C地址為0x1a;I2CX, X代表的是0,1,2,開始 */.cpu_dai_name= "imx-ssi.1",  /*  * 代表的是同一個音效卡中的第一個裝置與SSI1相連;I2SX X代表0,1,2;ssi.1代表SSI1。 * IMX6中的SSI介面有3對可以接著路I2S;三路SSI可以每路SSI 單獨作為一個音效卡, * 也可以是一個音效卡包含多個裝置;  */.platform_name= "imx-pcm-audio.1",/* 代表的串連介面與SSI來對應,用哪路SSI,其後面的數字就是幾。 */.init= imx_wm8960_init,.ops= &imx_hifi_ops,},};

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.