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.

[参考译文] Linux/TLV320AIC3106-Q1:如何配置第2个I2S/PCM?

Guru**** 2386610 points
Other Parts Discussed in Thread: TLV320AIC3106-Q1, TLV320AIC3106, TLV320AIC3268, TLV320AIC3262, TLV320AIC3212
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/audio-group/audio/f/audio-forum/652142/linux-tlv320aic3106-q1-how-to-configure-the-2nd-i2s-pcm

部件号:TLV320AIC3106-Q1
线程中讨论的其他部件: TLV320AIC3106TLV320AIC3268TLV320AIC3262TLV320AIC3212

工具/软件:Linux

大家好,

我当时正在配置TLV320AIC3106-Q1的第2个I2S/PCM,如下所示配置WL2833Q蓝牙。

我似乎只需要添加一个类似的:ai3x-gPIo-func"

i2c2{

       时钟频率=<40万>;

       pinctrl-names ="default";

       pinctrl-0 =<&pinctrl_i2c2>;

       状态="正常";

 

       编解码器:tlv320aic3106@18 {////音频编解码器

               兼容="ti,tlv320aic3x";

               REG =<0x18>;

              Clocks =<&codec_osc>;

               Clock-names ="clko_clk";

               AVDD-SUPPLY =<&REG_AUDIO>;

               IOVdd-supply =<&reg_audio>;

               DRVDD-SUPPLY =<&REG_AUDIO>;

               DVDD-SUPPLY =<&REG_AUDIO>;

       GPIO重置=<&GPIO4 26 1>;

       ai3x-gPIo-func =<11 8>;//<AIC3X_GPIO1_FUNC_AUDIO_WORDCLK,AIC3X_GPIO2_FUNC_AUDIO_BITCLK>

   };

};

但实际上,它会在播放音频时使我的第一个I2S (WCLK,BCLK,DIN,DOUT)崩溃。 所以我尝试通过发送配置命令  

I2C类:

i2cset -f -y 1 0x18 98 0xB0

i2cset -f -y 1 0x18 99 0x80

i2cset -f -y 0x18 8 0xD0

我确实从我的示波器中看到了GPIO1和GPIO2信号。

如果我尝试播放来自iMX6Q的音频,它将使GPIO1和GPIO2不可用。

i2ctget -f -y 1 0x18 98显示0x00

i2ctget -f -y 1 0x18 99显示0x00

i2cegt -f -y 1 0x18 98 8显示0x00

如果有一种很好的方法来配置和启用我的蓝牙?  感谢你的帮助。

-Justin

 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,Justin,

    我负责此设备的同事已收到有关您的问题的通知。 由于他在休假期间不在办公室,因此回复可能会延迟,因此我们感谢您的理解。

    此致,

     -Diego Mel é ndez López ñ a
      音频应用工程师

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,Diego,

    现在是假日季,一切都好。他回来后,请回复我。
    非常感谢。

    -Justin
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Justin,您好!

    感谢您在假期期间的耐心等待!   

    请参见下图。  MFP3和GPIO是多路复用的,因此不能与来自iMX60的信号同时使用。   

    这将允许您在处理器处于睡眠/低功耗模式时继续使用蓝牙设备。

    我希望这能回答你的问题, 但如果我误解了,请告诉我。  我很乐意为您提供帮助!

    此致,  

    -Steve Wilson

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,Steve,

    您说的是(WCLK,BCLK,DIN,DOUT)和(GPIO1,GPIO2, MFP3,DOUT)两个信道只能激活一个?

    那么我应该将此激活代码放在哪里? 这是否意味着我要使用信道时启用该信道,不想使用时禁用该信道?

    由于无法在设备树中写入ai3x-gPIo-func,如何配置/启用/切换到(GPIO1,GPIO2,MFP3,DOUT)此通道?

    -Justin
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Justin,您好!

    正确,一次只能有一个音频总线处于活动状态。 因此,如果WL8.133万处于活动状态,则iMX60不应处于活动状态。

    当您对寄存器进行编程以用作I2S音频端口时,GPIO引脚将变为活动状态。

    切换至WL8.133万之前,应停止使用iMX60的音频,然后更改音频总线,然后启动WL8.133万音频。
    暂时将DAC设为静音也许是有道理的,但请看一下情况如何。

    此致,
    -Steve Wilson
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Justin,

    如果要同时使用两条音频总线,TLV320AIC3262,TLV320AIC3212和TLV320AIC3268将具有此功能。

    此致,
    -Steve
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,Steve,

    您能否向我提供一些代码片段或GPIO1和GPIO2到I2S/PCM的配置示例代码? 我曾尝试将寄存器98设置为0xB0 (作为WCLK),将寄存器99设置为0x80 (作为BCLK),但未成功。

    -Justin
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,Steve,

    我的开发环境是Android 7.1 1 (Linux 4.1 15)。
    我目前的情况是蓝牙耳机可以连接
    我的开发板,但我听不到任何声音。 音频编解码器可以
    来自Android应用程序(如音乐/录音机)和Linux二进制文件的播放和录制
    例如tinyplay/tinycap。

    相关代码如下:
    [设备树:imx6q-asurada-pins.dtsi]
    /{
    sound - tlv320aic3106{
    兼容="FSL,imx6-asurada-tlv320aic3106",
    "FSL,IMX-audio-tlv320aic3x";
    型号="tlv320aic3x-audio";
    audio-codec =<&codec>;
    CPU-DAI =<&SSI2>;
    MUX-int-port =<2>;
    MUX-ext-port =<4>;
    音频路由=
    "线路输出插孔","LLOOUt",
    "EXT SPK", "单声道输出",
    "线路输出插孔","RLOUT",
    "LINE1L", "AV Line in Jack (AV线路输入插孔)",
    "LINE1R", "AV Line in Jack (AV线路输入插孔)",
    "LINE2L", "转向器线路输入",
    "LINE2R", "1388线路输出",
    "MIC3L", "插孔中的辅助线路",
    "MIC3R", "插孔中的辅助线路",
    "播放", "CPU回放",
    "CPU-Capture"(CPU捕获), "捕获";
    };
    };

    i2c2{
    时钟频率=<40万>;
    pinctrl-names ="default";
    pinctrl-0 =<&pinctrl_i2c2>;
    状态="正常";

    编解码器:tlv320aic3106@18 {////音频编解码器
    兼容="ti,tlv320aic3x";
    REG =<0x18>;
    Clocks =<&codec_osc>;//原始
    //时钟=<&CLKS IMX6QDL_CLK_CKO>;
    Clock-names ="clko_clk";
    AVDD-SUPPLY =<&REG_AUDIO>;
    IOVdd-supply =<&reg_audio>;
    DRVDD-SUPPLY =<&REG_AUDIO>;
    DVDD-SUPPLY =<&REG_AUDIO>;
    GPIO重置=<&GPIO4 26 1>;
    #IF 0 //Justin@2017.1228万
    ai3x-gpi-func =<
    11 //Justin@2017.1219万:AIC3X_GPIO1_FUNC_AUDIO_WORDCLK
    8 //Justin@2017.1219万:AIC3X_GPIO2_FUNC_AUDIO_BITCLK
    >;
    #endif
    };
    };

    [编解码器驱动程序:kewrnel_imx/sodc/codecs/tlv320aic3x.c]
    静态const结构snd_kcontrol_new aic3x_mono_control[]={

    /* Justin@2018.0103万 */
    SOC_single ("GPIO1控制开关",AIC3X_GPIO1_REG,4,0x0F,0),
    SOC_single ("GPIO2控制开关",AIC3X_GPIO2_REG,4,0x0F,0),
    SOC_SINGLE ("音频串行数据接口模式",AIC3X_ASD_INTF_CtrlB,6,0x03,0),
    };

    [tinyalsa_hal.c的config_tlv320aic3x.h ]
    静态结构route_setting mm_bt_mic_input_TLV320AIC3X[]={
    //R98 (AIC3X_GPIO1_REG):WCLK

    .ctl_name ="GPIO1控制开关",
    intval = 11,
    },
    //R99 (AIC3X_GPIO2_REG):BCLK

    .ctl_name ="GPIO2控制开关",
    intval = 8,
    },
    //R9 (AIC3X_ASD_INTF_CtrlB):DSP模式

    .ctl_name ="音频串行数据接口传输模式",
    intval = 1,
    },
    //R81 (PGAL_2_LLOPM_VOL)

    .ctl_name ="左线路混合器PGAL旁路开关",
    intval = 1,
    },
    //R84 (PGAR_2_LLOPM_VOL)

    .ctl_name ="左线路混合器PGAR旁路开关",
    intval = 1,
    },

    .ctl_name = NULL,
    },
    };

    静态结构audio_card tlv320aic3x_card ={
    .name ="tlv320aic3x-audio",
    驱动程序名称="tlv320aic3X aud",
    supported_out设备=(
    AUDIO_DEVICE_OUT有线耳机|
    AUDIO_DEVICE_OUT有线耳机|
    AUDIO_DEVICE_OUT扬声器|
    AUDIO_DEVICE_OUT _ALL _SCO |
    audio_device_out缺省),
    supported_in_devices =(
    AUDIO_DEVICE_IN_wired_headset |
    AUDIO_DEVICE_IN_BUILTIN_MIC |
    AUDIO_DEVICE_IN_All_SCO |
    AUDIO_DEVICE_IN_DEFAULT),
    默认值 = DEFAULTS_TLV320AIC3X,
    .bt_output = NULL,//bt_output_TLV320AIC3X,
    扬声器输出 = NULL,//扬声器输出_TLV320AIC3X,
    .hs_输出 = NULL,//hs_output_TLV320AIC3X,
    .听 筒输出 = NULL,//听 筒输出_TLV320AIC3X,
    .vx_hs_mic_input = NULL,//VX_hs_mic_input_TLV320AIC3X,
    MM_MAIN_mic_input = NULL,//MM_MAIN_mic_input_TLV320AIC3X,
    .vx_main_mic_input = NULL,//vx_main_mic_input_TLV320AIC3X,
    MM_hs_mic_input = NULL,//MM_hs_mic_input_TLV320AIC3X,
    .vx_bt_mic_input = mm_bt_mic_input_TLV320AIC3X,//VX_bt_mic_input_TLV320AIC3X,
    mm_bt_mic_input = mm_bt_mic_input_TLV320AIC3X,
    卡 = 0,
    输出率 = 0,
    输出通道 = 0,
    输出格式 = 0,
    费率 = 0,
    in_channels = 0,
    .in_format = 0,
    };

    [板配置:DEVICE/FSL/asurada/AUDIO_POLICY_CONFILE.conf]
    AUDIO_HW_MODULES{
    主{
    输出{
    主{
    采样率4.8万
    channel_masks audio_channel_out立体声
    格式AUDIO_FORMAT_PCM_16_bit
    # Justin: 设备AUDIO_DEVICE_OUT扬声器|AUDIO_DEVICE_OUT有线耳机|AUDIO_DEVICE_OUT有线耳机|AUDIO_DEVICE_OUT AUX_DIGITAL
    设备AUDIO_DEVICE_OUT扬声器|AUDIO_DEVICE_OUT有线耳机|AUDIO_DEVICE_OUT有线耳机|AUDIO_DEVICE_OUT AUX_DIGITAL |AUDIO_DEVICE_OUT ALL _SCO
    标记AUDIO_OUTPUT_FLAG_PRIMARY
    }
    HDMI{
    Sampling_Rates动态
    channel_masks动态
    格式AUDIO_FORMAT_PCM_16_bit
    设备AUDIO_DEVICE_OUT AUX_DIGITAL
    标记audio_output_flag_direct
    }
    艾塞{
    采样率4.8万
    Channel_Masks AUDIO_CHANGE_OUT _5POINT1|AUDIO_CHANGE_OUT _7POINT1
    格式AUDIO_FORMAT_PCM_16_bit
    设备audio_device_out扬声器
    标记audio_output_flag_direct
    }
    }
    输入{
    主{
    采样率8000|11025|16000|22050|24000|32000|44100|48000</s>1.1025万 1.6万2.205万2.4万3.2万4.41万4.8万
    Channel_Masks AUDIO_CHANGE_IN_MONO|AUDIO_CHANGE_IN_STEREO
    格式AUDIO_FORMAT_PCM_16_bit
    #Justin: 设备AUDIO_DEVICE_IN_BUILTIN_MIC|AUDIO_DEVICE_IN_wired_headset|AUDIO_DEVICE_IN_AUX_DIGITAL
    #Justin:|AUDIO_DEVICE_IN_Bluetooth_SCO_headset (可能)
    设备AUDIO_DEVICE_IN_BUILTIN_MIC|AUDIO_DEVICE_IN_wired_headset|AUDIO_DEVICE_IN_AUX_DIGITAL |AUDIO_DEVICE_IN_All_SCO
    }
    }
    }
    #Justin:=== >
    A2DP{
    输出{
    A2DP{
    Sampling_Rates 4.41万
    channel_masks audio_channel_out立体声
    格式AUDIO_FORMAT_PCM_16_bit
    设备AUDIO_DEVICE_OUT _ALL _A2DP
    }
    }
    输入{
    A2DP{
    Sampling_Rates 4.41万|48000</s>4.8万
    Channel_Masks AUDIO_CHANGE_IN_MONO|AUDIO_CHANGE_IN_STEREO
    格式AUDIO_FORMAT_PCM_16_bit
    设备AUDIO_DEVICE_IN_BLUETOOTH_A2DP
    }
    }
    }
    #Justin:<=========

    }


    当前的问题,我的路由路径(MM_bt_mic_input_TLV320AIC3X)无法从我的代码跟踪建立。
    我怀疑tinyalsa_hal.c不知道蓝牙是打开而不是关闭的(mm_bt_mic_input_TLV320AIC3X)。
    [tinyalsa_hal.c]
    静态void select_input_device (结构IMX_audio_device *adev)

    int i;
    int headset_on = 0;
    int main_mic_on = 0;
    int sub_mic_on = 0;
    int bt_on = adev->in_device & audio_device_in_all_sco;

    如果(!bt_on){
    如果((adev->mode != audio_mode_in_call)&&(adev->active_input !=0){
    /*子麦克风用于扬声器电话上的摄像机或VoIP */
    sub_mic_on =(adev->active_input->source == audio_source_camcorder)||
    ((adev->out设备和audio_device_out扬声器)&&
    (adev->active_input->source == audio_source_voice_communication);
    }

    Headset_on = adev->in_device & audio_device_in_wired_headset;
    main_mic_on = adev->in_device & audio_device_in_BUILTIN_MIC;
    }

    ALOGI ("Justin:%s:BT_on =%d,headset_on =%d,main_mic_on =%d,sub_mic_on =%d\n",
    __func__,bt_on,headset_on,main_mic_on,sub_mic_on);
    /*待办事项:检查如何在语音通话中进行捕获或是否进行捕获
    *两种用例相互排斥。
    */
    如果(bt_on)

    ALOGI ("Justin:%s:BT_on\n",__func__);
    对于(i = 0;i < MAX_AUDIO_CARD_NUM;I++)
    set_route_by_array(adev->mixer[i],adev->card_list[I]->mm_bt_mic_input,1);
    }
    否则{
    /*选择前端*/
    如果(头戴式耳机打开)

    ALOGI ("Justin:%s:耳机开\n",__func__);
    对于(i = 0;i < MAX_AUDIO_CARD_NUM;I++)
    set_route_by_array(adev->mixer[i],adev->card_list[I]->mm_hs_mic_input,1);
    }
    否则,如果(main_mic_on || sub_mic_on)

    ALOGI ("Justin:%s:main_mic_on || sub_mic_on\n",__func__);
    对于(i = 0;i < MAX_AUDIO_CARD_NUM;I++)
    set_route_by_array(adev->mixer[i],adev->card_list[I]->mm_main_mic_input,1);
    }
    否则

    ALOGI ("Justin:%s:else \n",__func__);
    对于(i = 0;i < MAX_AUDIO_CARD_NUM;I++)
    set_route_by_array(adev->mixer[i],adev->card_list[I]->mm_main_mic_input,0);
    }
    }
    }

    请帮助。 非常感谢。

    -Justin
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Justin,

    我没有忘记你。 今天下午,我将尝试设置次I2S,并将结果反馈给您。

    此致
    -Steve Wilson
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,Steve,

    感谢你的帮助。 我期待您的结果。

    -Justin
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Justin,

    我今天能够在实验室中测试这个。

    如果您的iMX60与编解码器一起工作,并且您要切换I2S总线,则必须关闭ADC和DAC的电源,然后应将寄存器98,99和101写入。 然后为ADC和DAC供电。

    98:0xC0
    99:0x80
    101:0x10

    此致,
    -Steve Wilson
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,Steve,

    正如您在电子邮件回复中提到的那样。 切换I2S总线的正确方法是:
    [1] ADC和DAC断电。 但是,有哪些回响?
    [2]寄存器98设置为0xC0。 但为什么不使用0xB0呢?
    [3]将寄存器99设置为0x80。
    [4]寄存器101设置为0x10。 但为什么启用了MFP3引脚作为音频串行数据输入引脚(MOSI),而不是SDIN?
    [5] ADC和DAC是否已通电? 但是,有哪些回响?

    请您将您的代码片段发送给我吗?
    您如何知道您的交换I2S总线已成功?

    感谢你的帮助。

    -Justin
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Justin,

    1:此信息位于数据表中。 ADC:R19和R22。 发援会:R37。
    2:是的,我的错误,0xB0是正确的值。
    3:是的
    4:不幸的是,数据表对此不是很清楚。当您查看数据表中的mux图时,必须有人控制mux,告诉它数字音频数据来自何处。它是MFP3引脚或DIN引脚。默认值为DIN, 因此,更改此值将使mux切换到我在测试中确认的MOSI/GPIO引脚(MFP3),如果您写入0x00以注册101,则Din引脚仍处于活动状态。如果您写入0x10,MFP3引脚处于活动状态。
    5:与#1相同


    我在EVM上执行了测试,因此我没有任何代码片段,只需注册配置即可。它们就在这里。

    i i2cfast
    W 30 01 80
    W 30 07 8A
    W 30 62 B0
    W 30 63 80
    宽30 65 10.
    W 30 08 C0
    W 30 29 02
    W 30 2B 00
    宽30 25 D0
    W 30 26 20.
    W 30 40 80
    W 30 2F 80
    W 30 33 0D
    W 30 41 0D


    我知道我的I2S总线切换正确,因为我正在提供来自AP的测试音,并且我可以通过AP监控相同的测试音。 看起来不错。

    此致,
    -Steve Wilson

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好Steve

    我想确保我在"其他文章"中提出的问题。

    我们是否可以控制AIC3106-Q1将音频从主机处理器路由到PCM输出到WL1833Q蓝牙WiFi芯片组? 此外,我们是否可以将WL1833Q PCM路由到主机处理器,以实现Voice Recorder功能? 这就是我们想要编解码器的用途。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Bright Wang,

    只有一条串行总线,而不是两条。 如果不禁用处理器所需的Din,则不能对BT模块使用DIN。 只有一个Din。
    因此,您无法使用此设备执行所需操作。除非您只希望一次激活一个DIN。  

    此致,
    -Steve Wilson