开发板适配之SAI

SAI(synchronous audio interface)是音频专用接口,i.MX6ULL有3路SAI(synchronous audio interface)接口,支持具有帧同步功能的全双工串行接口,例如I2S、AC97、TDM、codec/DSP接口。i.MX6ULL的SAI音频接口只是传输音频数据的数字接口,而我们要听到播放数字音频文件的声音,就需要将这些数字数据信号转换模拟的连续的声音波形(数模转换DAC),经过放大器放大到扬声器或者到耳机。同样录音的时候,就需要将我们的声音通过mic或者拾音器,将连续的模拟信号转换成离散的数字信号(模数转换ADC),一般需要完成采样、量化和编码三个步骤。我们将DAC和ADC的过程称为音频编解码。

SAI音频接口只是传输音频数据的数字接口,所以这些音频编解码的工作需要一个专有的编解码芯片来完成,ELF 1使用的是NAU88C22芯片,NAU88C22可连接mic和扬声器或耳机用于录音和播放声音。i.MX6ULL使用I2S总线与NAU88C22进行音频数据的传输,I2S(Inter—IC Sound)总线,又称集成电路内置音频总线,是Philips公司为数字音频设备之间的音频数据传输而制定的一种总线标准,该总线专门用于音频设备之间的数据传输,广泛应用于各种多媒体系统。

上图中的SAI2_MCLK、SAI2_BCLK、SAI2_SYNC、SAI2_TXD、SAI2_RXD是本音频方案中I2S总线包括的信号,其中SAI2_MCLK是系统时钟,SAI2_BCLK是数据位时钟,SAI2_SYNC是帧时钟,SAI2_TXD是数据发送,SAI2_RXD是数据接收。I2S使用的信号线可根据具体方案而定,不过一般都会包含BCLK、SYNC、TXD或RXD,三根或四根信号线。具体的I2S总线协议原理不再展开来讲,如果有兴趣的或者遇到问题时需要测量其时序的,可自行研究。

i.MX6ULL与NAU88C22相连接的还有一路I2C总线,主要是用于对NAU88C22寄存器进行配置,如初始化配置,或者动态音量调节等等。

硬件原理

i.MX6ULL有3路SAI接口,本方案使用SAI2。I2C总线使用I2C2。i.MX6ULL与NAU88C22连接的引脚有:SAI2_MCLK(JTAG_TMS)、SAI2_BCLK(JTAG_TDI)、SAI2_SYNC(JTAG_TDO)、SAI2_TXD(JTAG_TRST_B)、SAI2_RXD(JTAG_TCK)、I2C2_SDA(UART5_RX_DATA)、I2C2_SCL(UART5_TX_DATA)。

IOMUX配置

确定完引脚,可以在设备树中arch/arm/boot/dts/imx6ull-elf1-emmc.dts添加IOMUX配置节点,在iomuxc节点下已添加好sai2子节点和i2c2子节点:

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

       >;

};

效果如下:

 

pinctrl_i2c2: i2c2grp {

       fsl,pins = <

             MX6UL_PAD_UART5_TX_DATA__I2C2_SCL  0x4001b8b0

             MX6UL_PAD_UART5_RX_DATA__I2C2_SDA  0x4001b8b0

       >;

};

效果如下:

设备节点

已添加好的sai2节点:

其中pinctrl-0属性中引用了&pinctrl_sai2_hp_det_b节点,此节点是关于耳机和mic插拔检测引脚配置,我们的方案没有使用插拔检测,所以注释掉此配置。iomuxc_snvs节点中的IOMUX配置也注释掉:

sai2节点下的属性主要是进行了时钟设置。

在i2c2节点下添加的NAU88C22子节点:

&i2c2 {

        clock_frequency = <100000>;

        pinctrl-names = “default”;

        pinctrl-0 = <&pinctrl_i2c2>;

        status = “okay”;



        nau8822: nau8822@1a {

                compatible = "nuvoton,nau8822";

                reg = <0x1a>;

                clocks = <&clks IMX6UL_CLK_SAI2>;

                clock-names = "mclk";

                #sound-dai-cells = <0>;

                status = "okay";

        };

};

效果如下:

其子节点codec设备就是NAU88C22芯片,reg属性是此芯片i2c地址0x1a。clocks和clock-name配置了Mclk时钟及时钟名;

另外,由于音频部分采用了和NXP官方不同的方案,我们需要对sound节点进行修改:

        sound {

                compatible = "fsl,imx6ul-evk-nau8822",

                             "fsl,imx-audio-nau8822";

                model = "nau8822-audio";

                cpu-dai = <&sai2>;

                audio-codec = <&nau8822>;

                asrc-controller = <&asrc>;

                gpr = <&gpr 4 0x100000 0x100000>;



                audio-routing =

                        "Headphone Jack", "AUXOUT1",

                        "Headphone Jack", "AUXOUT2",

                        "Headphone Jack", "LHP",

                        "Headphone Jack", "RHP",

                        "Ext Spk", "LSPK",

                        "Ext Spk", "RSPK",

                        "LMICP", "Main MIC",

                        "LMICN", "Main MIC",

                        "RMICP", "Main MIC",

                        "RMICN", "Main MIC",

                        "Main MIC", "Mic Bias",

                        "CPU-Playback", "ASRC-Playback",

                        "Playback", "CPU-Playback",

                        "ASRC-Capture", "CPU-Capture",

                        "CPU-Capture", "Capture";

                status = "okay";

        };

修改后效果如下:

其中cpu-dai指向使用的具体的sai接口;

audio-codec属性指向使用的音频编解码芯片NAU88C22;

asrc-controller属性指使用的异步采样率转换器;

gpr属性用于配置sai相关的gpr通用寄存器。

audio-routing是音频组件连接源和连接点对应关系的列表。

至此,设备树已配置完成。

添加NAU88C22驱动

一、将ELF 1开发板资料包\02-Linux 源代码\02-1 驱动源码\06_nau88c22\nau8822.cELF 1开发板资料包\02-Linux 源代码\02-1 驱动源码\06_nau88c22\nau8822.h拷贝到内核源码的sound/soc/codecs/路径下;

二、将ELF 1开发板资料包\02-Linux 源代码\02-1 驱动源码\06_nau88c22\imx-nau8822.c拷贝到内核源码的sound/soc/fsl/路径下:

三、修改sound/soc/codecs/路径下的Kconfig和Makefile:

elf@ubuntu:~/work/linux-imx-imx_4.1.15_2.0.0_ga$ vi sound/soc/codecs/Kconfig

添加以下内容:

select SND_SOC_nau8822 if I2C

…

config SND_SOC_nau8822

        tristate

添加后效果如下:

 

elf@ubuntu:~/work/linux-imx-imx_4.1.15_2.0.0_ga$ vi sound/soc/codecs/Makefile

添加以下内容:

snd-soc-nau8822-objs := nau8822.o

…

obj-$(CONFIG_SND_SOC_nau8822)    += snd-soc-nau8822.o

添加后效果如下:

四、修改sound/soc/fsl/路径下的Kconfig和Makefile:

elf@ubuntu:~/work/linux-imx-imx_4.1.15_2.0.0_ga$ vi sound/soc/fsl/Kconfig

添加以下内容:

config SND_SOC_IMX_nau8822

        tristate "SoC Audio support for i.MX boards with nau8822"

        depends on OF && I2C

        select SND_SOC_nau8822

        select SND_SOC_IMX_PCM_DMA

        select SND_SOC_FSL_SAI

        select SND_SOC_FSL_UTILS

        select SND_KCTL_JACK

        help

          SoC Audio support for i.MX boards with nau8822

          Say Y if you want to add support for SoC audio on an i.MX board with

          a nau8822 codec.
elf@ubuntu:~/work/linux-imx-imx_4.1.15_2.0.0_ga$ vi sound/soc/fsl/Makefile

添加以下内容:

snd-soc-imx-nau8822-objs := imx-nau8822.o

…

obj-$(CONFIG_SND_SOC_IMX_nau8822) += snd-soc-imx-nau8822.o

添加后效果如下:

使用make menuconfig打开图形化配置界面:

elf@ubuntu:~/work/linux-imx-imx_4.1.15_2.0.0_ga$ make menuconfig

在路径下增加此两项的配置:

-> Device Drivers                                                                                                                                                                               

  -> Sound card support (SOUND [=y])                                                                                                                                                            

    -> Advanced Linux Sound Architecture (SND [=y])                                                                                                                                             

      -> ALSA for SoC audio support (SND_SOC [=y])                                                                                                                                              

        -> SoC Audio for Freescale CPUs

五、替换配置文件

通过make menuconfig修改的内容写入到了.config文件,当使用make imx6ull_elf1_defconfig配置内核源码时,.config文件会被覆盖,因此,需要替换原有的imx6ull_elf1_defconfig。

elf@ubuntu:~/work/linux-imx-imx_4.1.15_2.0.0_ga$ cp .config arch/arm/configs/imx6ul\l_elf1_defconfig

编译测试

编译内核和设备树并拷贝到开发板:

elf@ubuntu:~/work/linux-imx-imx_4.1.15_2.0.0_ga$ make zImage

elf@ubuntu:~/work/linux-imx-imx_4.1.15_2.0.0_ga$ make dtbs

elf@ubuntu:~/work/linux-imx-imx_4.1.15_2.0.0_ga$ scp arch/arm/boot/zImage   root\@172.16.0.175:/run/media/mmcblk1p1/

elf@ubuntu:~/work/linux-imx-imx_4.1.15_2.0.0_ga$ scp arch/arm/boot/dts/imx6ull-elf\1-emmc.dtb root@172.16.0.175:/run/media/mmcblk1p1/

进行sync操作后重启开发板:

一、设置参数,调整播录音音量大小,输入下图中的命令:

root@ELF1:~# amixer sset "PCM" 255

root@ELF1:~# amixer sset "Headphone" on

root@ELF1:~# amixer sset "Headphone" 25 

二、放音测试

root@ELF1:~# aplay elf1_audio.wav

三、录音测试

root@ELF1:~# arecord -r 44100 -f S16_LE -c 2 -d 10 record.wav

Playing WAVE 'record.wav' : Signed 16 bit Little Endian,Rate 44100 Hz,Stereo

四、播放录音

root@ELF1:~# aplay record.wav

Playing WAVE 'record.wav' : Signed 16 bit Little Endian,Rate 44100 Hz,Stereo

哪吒D1开发板是一款基于RISC-V架构的开发板,广泛用于嵌入式系统和物联网设备的开发。适配摄像头到哪吒D1开发板上,可以实现图像采集和处理功能。以下是适配摄像头的基本步骤: ### 1. 硬件连接 首先,需要将摄像头模块与哪吒D1开发板进行物理连接。不同类型的摄像头模块(如USB摄像头、MIPI CSI摄像头)有不同的连接方式: - **USB摄像头**:直接将USB接口插入开发板的USB端口。 - **MIPI CSI摄像头**:需要使用开发板上专用的CSI接口,并确保连接正确。 ### 2. 软件配置 接下来,需要在开发板上配置软件环境,以便能够识别和使用摄像头。 #### a. 安装必要的驱动 根据摄像头类型,安装相应的驱动程序。例如,对于USB摄像头,通常不需要额外的驱动,系统会自动识别。但对于MIPI CSI摄像头,可能需要手动编译和安装驱动。 #### b. 配置内核 如果使用的是Linux操作系统,可能需要配置内核以支持摄像头模块。编辑`/boot/config.txt`文件,添加或修改相关配置参数。 #### c. 安装图像处理库 安装OpenCV或其他图像处理库,以便进行图像采集和处理。例如: ```sh sudo apt-get update sudo apt-get install libopencv-dev python3-opencv ``` ### 3. 测试摄像头 完成硬件连接和软件配置后,可以通过以下命令测试摄像头是否正常工作: - **使用`fswebcam`测试USB摄像头**: ```sh sudo apt-get install fswebcam fswebcam test.jpg ``` - **使用`v4l2-ctl`测试MIPI CSI摄像头**: ```sh sudo apt-get install v4l-utils v4l2-ctl --list-devices ``` ### 4. 编写代码 使用编程语言(如Python)编写代码,调用摄像头进行图像采集和处理。以下是一个简单的Python示例,使用OpenCV库: ```python import cv2 # 打开摄像头 cap = cv2.VideoCapture(0) while True: # 读取帧 ret, frame = cap.read() if not ret: break # 显示帧 cv2.imshow('Camera', frame) # 按下q键退出 if cv2.waitKey(1) & 0xFF == ord('q'): break # 释放摄像头 cap.release() cv2.destroyAllWindows() ``` ### 5. 调试与优化 根据实际需求,调整摄像头参数(如分辨率、帧率)并进行调试和优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值