This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

dm8168的mcasp0 声卡设备注册疑惑



你好,TI工程师!
我想在dm8168的mcasp0上注册一个声卡设备,MCA[0]_AHCLKR、MCA[0]_ACLKR、MCA[0]_AFSR、MCA[0]_AXR[0] 的输入源是在外部处理的数字信号,没有i2c控制, 这种情况能在8168上面注册一个可用的声卡设备吗?

下面的注册方法是需要:Machine、Platform和Codec三大部分

.name = "TLV320AIC3X",
.stream_name = "AIC3X",
.cpu_dai_name= "davinci-mcasp.2",
.codec_dai_name = "tlv320aic3x-hifi",
.codec_name = "tlv320aic3x-codec.1-0018",
.platform_name = "davinci-pcm-audio",
.init = ti81xx_evm_aic3x_init,
.ops = &ti81xx_evm_ops,

 问题:
1、这种方法在8168是不是可行的;

2、如果可行,要怎么去修改,有没有相关芯片的案例 

  • 你好,

    支持DM816x EVM的标准linux驱动里面应该是支持音频驱动的,你有看过么?

    http://arago-project.org/git/projects/?p=linux-omap3.git;a=summary

  • Hi Chris Meng,

       谢谢你的回复,我采用了虚拟一个声卡的方法,但出现了snd_pcm_open出现了错误“cannot open audio device (Invalid argument)”,

    代码修改如下:

    Ti81xx-etv.c

     

    static struct snd_soc_dai_link ti81xx_dummy_dai = {

                       .name = "DUMMY_SOC_LINK",

                       .stream_name = "dummy",

                       .cpu_dai_name = "davinci-mcasp.0",

                       .platform_name = "davinci-pcm-audio",

                       .codec_dai_name = "DUMMY-DAI-CODEC",

                       .codec_name = "dummy-dummy-codec",

    };

    -----

    static struct snd_soc_card ti81xx_evm_snd_card2 = {

             .name = "TI81XX ETV SOUND2",

             .dai_link = &ti81xx_dummy_dai,

             .num_links = 1,

    };

    static struct platform_device *ti81xx_pdev2;

    ------

             ti81xx_pdev2 = platform_device_alloc("soc-audio", 2);

             if (!ti81xx_pdev2) {

                       platform_device_put(ti81xx_pdev0);

                        platform_device_put(ti81xx_pdev1);

                       return -ENOMEM;

             }

     

             platform_set_drvdata(ti81xx_pdev2, &ti81xx_evm_snd_card2);

         ret = platform_device_add(ti81xx_pdev2);

         if (ret) {

          printk(KERN_ERR "Can't add soc platform device\n");

          platform_device_put(ti81xx_pdev0);

          platform_device_put(ti81xx_pdev1);

          platform_device_put(ti81xx_pdev2);

          return ret;

         }

    static void __exit ti81xx_evm_soc_exit(void)

    {

             ………….

            platform_device_unregister(ti81xx_pdev2);

    }

     

    Board-ti8168etv.c

    /* 这是配置mcasp 0 的多路复用 */

             TI816X_MUX(MCA0_AXR0, OMAP_MUX_MODE1),      

             TI816X_MUX(MCA0_AXR1, OMAP_MUX_MODE1),      

             TI816X_MUX(MCA0_AXR2, OMAP_MUX_MODE1),      

             TI816X_MUX(MCA0_AXR3, OMAP_MUX_MODE0),      

             TI816X_MUX(MCA0_AXR4, OMAP_MUX_MODE0),

             TI816X_MUX(MCA0_AXR5, OMAP_MUX_MODE0),

     

    static u8 ti8168_iis_serializer_direction_0[] = {

            RX_MODE,        INACTIVE_MODE,  INACTIVE_MODE,

            INACTIVE_MODE,  INACTIVE_MODE,  INACTIVE_MODE,  INACTIVE_MODE,

            INACTIVE_MODE,  INACTIVE_MODE,  INACTIVE_MODE,  INACTIVE_MODE,

            INACTIVE_MODE,  INACTIVE_MODE,  INACTIVE_MODE,  INACTIVE_MODE,

    };

     

    static struct snd_platform_data ti8168_evm_snd_data_0 = {

            .tx_dma_offset  = 0x46000000,

            .rx_dma_offset  = 0x46000000,

            .op_mode        = DAVINCI_MCASP_IIS_MODE,

            .num_serializer = ARRAY_SIZE(ti8168_iis_serializer_direction_0),

            .tdm_slots      = 2,

            .serial_dir     = ti8168_iis_serializer_direction_0,

            .asp_chan_q     = EVENTQ_2,

            .version        = MCASP_VERSION_2,

            .txnumevt       = 0,

            .rxnumevt       = 1,

              .clk_input_pin         = MCASP_AHCLKX_OUT,

    };

     

    static struct platform_device ti8168_dummy_codec_device = {

             .name       = "dummy-dummy-codec",

             .id     = -1,

    };

    static struct platform_device *ti8168_devices[] __initdata = {

             &ti8168_hdmi_audio_device,

             &ti8168_hdmi_codec_device,

             &ti8168_dummy_codec_device,  //add

    };

    void __init ti8168_hdmi_mclk_init(void){don’t modify};

    ti81xx_register_mcasp(0, &ti8168_evm_snd_data_0); //add

    devices.c (mach-omap2)

     

    static struct resource ti81xx_mcasp0_resource[] = {

             {

                       .name = "mcasp0",

                       .start = TI81XX_ASP0_BASE,

                       .end = TI81XX_ASP0_BASE + (SZ_1K * 12) - 1,

                       .flags = IORESOURCE_MEM,

             },

             /* TX event */

             {

                       .start = TI81XX_DMA_MCASP0_AXEVT,

                       .end = TI81XX_DMA_MCASP0_AXEVT,

                       .flags = IORESOURCE_DMA,

             },

             /* RX event */

             {

                       .start = TI81XX_DMA_MCASP0_AREVT,

                       .end = TI81XX_DMA_MCASP0_AREVT,

                       .flags = IORESOURCE_DMA,

             },

    };

     

    static struct platform_device ti81xx_mcasp0_device = {

             .name = "davinci-mcasp", /* driver name */

             .id = 0,

             .num_resources = ARRAY_SIZE(ti81xx_mcasp0_resource),

             .resource = ti81xx_mcasp0_resource,

    };

     

    void __init ti81xx_register_mcasp(int id, struct snd_platform_data *pdata)

    {

            ti81xx_mcasp0_device.dev.platform_data = pdata;

            platform_device_register(&ti81xx_mcasp0_device);

    }

    CODEC

    {

    .name = "DUMMY-DAI-CODEC",

    .capture = {

    .stream_name = "capture",

    .channels_min = 1,

    .channels_max = 1,

    .rates = SNDRV_PCM_RATE_48000

    | SNDRV_PCM_RATE_32000

    | SNDRV_PCM_RATE_44100

    | SNDRV_PCM_RATE_96000

    | SNDRV_PCM_RATE_192000 ,

    .formats = SNDRV_PCM_FMTBIT_S16_LE

    | SNDRV_PCM_FMTBIT_S32_LE

    | SNDRV_PCM_FMTBIT_S20_3LE

    | SNDRV_PCM_FMTBIT_S8

    | SNDRV_PCM_FMTBIT_S24_LE,

    },

    },

    我希望能得到你的帮助!

  • Hi Chris Meng,

       我忘记修改 davinci-mcasp.c中 davinci-mcasp.0 的dai 中,把playback去掉只留.capture 就好了,现在可以录制,但录制出来的文件只有44字节,因为对于mcasp0只做接收就是从设备,我想问一下怎么让输入的时钟、数据 和mcasp0虚拟设备对应上,是修改哪些文件?

  • Hi Chris Meng,

        抱歉,之前上面这些问题都是我自己理解错了,需求是配置DM8168输出WCLK、BCLK和MCLK,这样麦克风才能运行并发出TDM数据出来,我还是重新开个窗口提问吧!