查看: 2419|回复: 4

[原创] 【i.MX6ULL-evk试用】之四:音频移植与录制播放

[复制链接]
  • TA的每日心情
    开心
    8 小时前
  • 签到天数: 1274 天

    [LV.10]以坛为家III

    21

    主题

    1万

    帖子

    1

    金牌会员

    Rank: 6Rank: 6

    积分
    13214
    最后登录
    2024-4-19
    发表于 2022-4-11 16:12:22 | 显示全部楼层 |阅读模式
    本帖最后由 sumoon_yao 于 2022-4-11 16:16 编辑

        前段时间给一块根据官方板定制的iMX6UL板增加音频驱动,由于iMX6UL和iMX6ULL的音频部分基本一致,所以整个驱动移植和alsa库移植也同样适用于iMX6ULL板。
       arm linux内核中常用的音频芯片如wm8960等驱动源码都已经具备,所以最主要的工作就是根据硬件来配置设备树,以imx6ull_14x14_evk.dtb为例。
        下面是音频wm8960的原理图:
    codec原理图.png



        根据原理图,相应的在设备树文件中增加以下内容:
       在根节点下增加sound子节点:
        sound {
           compatible = "fsl,imx6ul-evk-wm8960",
                 "fsl,imx-audio-wm8960";
           model = "wm8960-audio";
           cpu-dai = <&sai2>;
           audio-codec = <&codec>;
           asrc-controller = <&asrc>;
           codec-master;
           gpr = <&gpr 4 0x100000 0x100000>;
           /*
                     * hp-det = <hp-det-pinhp-det-polarity>;
            * hp-det-pin: JD1JD2  or JD3
            * hp-det-polarity = 0:hp detect high for headphone
            * hp-det-polarity = 1:hp detect high for speaker
            */
           hp-det = <3 0>;
           hp-det-gpios = <&gpio5 4 0>;
           mic-det-gpios = <&gpio5 4 0>;
           audio-routing =
               "Headphone Jack", "HP_L",
               "Headphone Jack", "HP_R",
               "Ext Spk", "SPK_LP",
               "Ext Spk", "SPK_LN",
               "Ext Spk", "SPK_RP",
               "Ext Spk", "SPK_RN",
               "LINPUT2", "Mic Jack",
               "LINPUT3", "Mic Jack",
               "RINPUT1", "Main MIC",
               "RINPUT2", "Main MIC",
               "Mic Jack", "MICB",
               "Main MIC", "MICB",
               "CPU-Playback", "ASRC-Playback",
               "Playback", "CPU-Playback",
               "ASRC-Capture", "CPU-Capture",
               "CPU-Capture", "Capture";
        };
      在i2c2节点下增加codec:8960:
        codec: wm8960@1a {
           compatible = "wlf,wm8960";
           reg = <0x1a>;
           clocks = <&clks IMX6UL_CLK_SAI2>;
           clock-names = "mclk";
           wlf,shared-lrclk;
        };
        在iomuxc节点配置sai2引脚
           pinctrl_sai2: sai2grp {
               fsl,pins = <
                  MX6UL_PAD_JTAG_TDI__SAI2_TX_BCLK   0x17088
                  MX6UL_PAD_JTAG_TDO__SAI2_TX_SYNC   0x17088
                  MX6UL_PAD_JTAG_TRST_B__SAI2_TX_DATA    0x11088
                  MX6UL_PAD_JTAG_TCK__SAI2_RX_DATA   0x11088
                  MX6UL_PAD_JTAG_TMS__SAI2_MCLK      0x17088
               >;
           };
      配置sai2节点的pinctrl属性
    &sai2 {
        pinctrl-names = "default";
        pinctrl-0 = <&pinctrl_sai2
               &pinctrl_sai2_hp_det_b>;
        assigned-clocks = <&clks IMX6UL_CLK_SAI2_SEL>,
                 <&clksIMX6UL_CLK_SAI2>;
        assigned-clock-parents = <&clksIMX6UL_CLK_PLL4_AUDIO_DIV>;
        assigned-clock-rates = <0>, <12288000>;
        status = "okay";
    };

        在内核图形化配置界面中选中音频芯片wm8960,然后使用下面的命令重新编译内核和设备树。
    sudo make ARCH=arm CROSS_COMPILE=arm-none-eabi-
       使用mfgtool工具重新烧写镜像,完成后重启系统,此时内核启动信息中应该就会提示找到了音频芯片wm8960。

    找到音频芯片.png


        接着是alsa库的移植,先从alsa官网下载alsalib和utils源码:
    https://www.alsa-project.org/files/pub/lib/
        我下载的是alsa-lib-1.1.9.tar和alsa-utils-1.1.9.tar。

       alsa-lib要先编译,因为alsa-utils的编译要用到alsa-lib库文件。
       建目录/usr/share/alsa。
       清除中间文件,防止得不到想要的结果:
       sudo make clean
       然后顺序键入以下命令编译alsa-lib库。
       sudo ./configure --host=arm-linux-gnueabihf--prefix=/home/nfs/alsa-lib --with-configdir=/usr/share/alsa
       sudo make
       sudo make install
       再编译alsa-util。
       清除中间文件:
       sudo make clean
       顺序键入以下命令编译alsa-util库。
       sudo ./configure --host=arm-linux-gnueabihf--prefix=/home/nfs/alsa-util --with-alsa-inc-prefix=/home/nfs/alsa-lib/include--with-alsa-prefix=/home/nfs/alsa-lib/lib --disable-alsamixer --disable-xmlto
       sudo make
       sudo make install

        需要注意的是,库的移植以及应用的移植,一定要注意所使用的交叉编译工具版本类型,否则编译出来的库或者应用程序将不能正常运行

        编译完成后通过网络或者使用u盘分别将alsa-lib目录和alsa-util目录下的文件拷贝到开发板。
       /usr/share/alsa目录下的所有文件拷贝到开发板同一目录下。
        将alsa-lib/lib目录下的所有文件拷贝到开发板的/usr/lib目录,注意符号链接文件。
        将alsa-util目录下的3个子目录bin、sbin、share中的文件分别拷贝到开发板目录/usr/bin、/usr/sbin、/usr/share。

        在使用音频前需要通过amixer命令配置音频参数,以录音为例,需要配置的参数如下:
    amixer cset name='Left InputMixer Boost Switch' on/off
    左路音频输入开关
    amixer cset name='Left BoostMixer LINPUT1 Switch' on/off
    左路音频输入LINPUT1开关
    amixer cset name='Left BoostMixer LINPUT2 Switch' on/off
    左路音频输入LINPUT2开关
    amixer cset name='Left BoostMixer LINPUT3 Switch' on/off
    左路音频输入LINPUT3开关
    amixer cset name='Right InputMixer Boost Switch' on/off
    右路音频输入开关
    amixer cset name='Right BoostMixer RINPUT1 Switch' on/off
    右路音频输入RINPUT1开关
    amixer cset name='Right BoostMixer RINPUT2 Switch' on/off
    右路音频输入RINPUT2开关
    amixer cset name='Right BoostMixer RINPUT3 Switch' on/off
    右路音频输入RINPUT3开关
    amixer cset name='ADC PCMCapture Volume' 200(0 - 255)
    ADC PCM捕获音量设置
    amixer cset name='CaptureVolume' 50(0 - 63)
    捕获音量设置
    amixer cset name='ADC DataOutput Select' 0
    MAIN MIC或HP MIC单端输入设置
    amixer cset name='ADC DataOutput Select' 1
    HP MIC立体声输入设置
    amixer cset name='ADC DataOutput Select' 2
    MAIN MIC立体声输入设置

        参数配置完成后可以使用命令alsactl进行保存,下次使用时也可以通过该命令恢复配置的参数。
    先键一个子目录:
    mkdir /var/lib/alsa
      手动保存配置参数指令:
      alsactl –f /var/lib/alsa/asound.state store
      手动恢复保存的配置参数指令:
      alsactl –f /var/lib/alsa/asound.state restore

      配置好音频录制参数就可以使用arecord命令来录制音频了,目前只支持wav格式的音频录制。
    arecord -Dplughw:0,0 -r 44100-f S16_LE -c 2 -d 10 record.wav
    -D:指定声卡设备
    -r:指定采样频率
    -f:指定采样格式
    -c:指定采样通道数
    -d:录制时长(单位:秒)
    record.wav 录音文件名称
        由于项目只涉及音频录制,音频播放部分未作过多研究,所以本篇就不做介绍了。


    跟着日天混 ,三天饱九顿!
    回复

    使用道具 举报

  • TA的每日心情
    奋斗
    8 小时前
  • 签到天数: 1933 天

    [LV.Master]伴坛终老

    61

    主题

    1万

    帖子

    3

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    17218
    最后登录
    2024-4-19
    发表于 2022-4-11 16:36:07 | 显示全部楼层
    干货设备树
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2024-4-9 17:01
  • 签到天数: 1478 天

    [LV.10]以坛为家III

    203

    主题

    2万

    帖子

    64

    超级版主

    Rank: 8Rank: 8

    积分
    92609
    最后登录
    2024-4-9
    发表于 2022-4-11 18:35:57 | 显示全部楼层
    四联发啊,哈哈
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    3 小时前
  • 签到天数: 1204 天

    [LV.10]以坛为家III

    22

    主题

    4707

    帖子

    0

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    8030

    活跃会员

    最后登录
    2024-4-19
    发表于 2022-4-13 15:50:02 | 显示全部楼层
    前排支持
    该会员没有填写今日想说内容.
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2022-1-4 14:25
  • 签到天数: 1 天

    [LV.1]初来乍到

    0

    主题

    172

    帖子

    0

    高级会员

    Rank: 4

    积分
    567
    最后登录
    2024-4-10
    发表于 2024-4-9 17:47:21 | 显示全部楼层
    学习了,多谢
    每天登陆学习一下
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2024-4-19 20:05 , Processed in 0.135177 second(s), 24 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表