STM32MP157 Linux系统移植开发篇16:Linux内核音频驱动移植

本文章为《STM32MP157 Linux系统移植开发篇》系列中的一篇,笔者使用的开发平台为华清远见FS-MP1A开发板(STM32MP157开发板)。stm32mp157是ARM双核,2个A7核,1个M4核,A7核上可以跑Linux操作系统,M4核上可以跑FreeRTOS、RT-Thread等实时操作系统,STM32MP157开发板所以既可以学嵌入式linux,也可以学stm32单片机。

针对FS-MP1A开发板,除了Linux系统移植篇外,还包括其他多系列教程,包括Cortex-A7开发篇、Cortex-M4开发篇、扩展板驱动移植篇、Linux应用开发篇、FreeRTOS系统移植篇、Linux驱动开发篇、硬件设计篇、人工智能机器视觉篇、Qt应用编程篇、Qt综合项目实战篇等。欢迎关注,更多stm32mp157开发教程及视频,可加技术交流Q群459754978,感谢关注。

关于FS-MP1A开发板:
手机淘宝分享码:复制本行文字打开手淘₤T4FPXn3YYJ2₤
链接:https://item.taobao.com/item.htm?id=622457259672

1.实验原理

FS-MP1A使用的是CS42L51音频芯片,SoC通过I2C和SAI与其进行数据交互,原理图如下:

SAI2管脚对应关系:

I2C5管脚对应关系:

芯片复位管脚对应关系:

原理图网络编号对应管脚管脚功能管脚功能码
SAI2_MCLKAPE0SAI2_MCLK_AAF10
SAI2_SDBPF11SDA2_SD_BAF10
SAI2_SCKAPI5SAI2_SCK_AAF10
SAI_SDAPI6SAI2_SD_AAF10
SAI2_FSAPI7SAI2_FS_AAF10
AUDIO_RSTPC0IOANALOG
I2C5_SDAPA11I2C5_SDAAF4
I2C5_SCLPA12I2C5_SDAAF4

  1. SAI2设备树节点

参考文档:

Documentation/devicetree/bindings/sound/st,stm32-sai.txt

内核中ST对STM32MP15x系列芯片的设备树资源了做了定义,可参见:

sai2: sai@4400b000 {

compatible = "st,stm32h7-sai";

#address-cells = <1>;

#size-cells = <1>;

ranges = <0 0x4400b000 0x400>;

reg = <0x4400b000 0x4>, <0x4400b3f0 0x10>;

interrupts = <GIC_SPI 91 IRQ_TYPE_LEVEL_HIGH>;

resets = <&rcc SAI2_R>;

status = "disabled";

sai2a: audio-controller@4400b004 {

#sound-dai-cells = <0>;

compatible = "st,stm32-sai-sub-a";

reg = <0x4 0x1c>;

clocks = <&rcc SAI2_K>;

clock-names = "sai_ck";

dmas = <&dmamux1 89 0x400 0x01>;

status = "disabled";

};

sai2b: audio-controller@4400b024 {

#sound-dai-cells = <0>;

compatible = "st,stm32-sai-sub-b";

reg = <0x24 0x1c>;

clocks = <&rcc SAI2_K>;

clock-names = "sai_ck";

dmas = <&dmamux1 90 0x400 0x01>;

status = "disabled";

};

};

上述代码只对SAI2做了基本的初始化,并没有针对不同的硬件设计做适配,所以需结合硬件补全设备树节点信息。

参考stm32mp15xx-dkx.dtsi对于SAI2设备节点的描述,增加SAI2内容如下:

&sai2 {

clocks = <&rcc SAI2>, <&rcc PLL3_Q>, <&rcc PLL3_R>;

clock-names = "pclk", "x8k", "x11k";

pinctrl-names = "default", "sleep";

pinctrl-0 = <&sai2a_pins_a>, <&sai2b_pins_b>;

pinctrl-1 = <&sai2a_sleep_pins_a>, <&sai2b_sleep_pins_b>;

status = "okay";

sai2a: audio-controller@4400b004 {

#clock-cells = <0>;

dma-names = "tx";

clocks = <&rcc SAI2_K>;

clock-names = "sai_ck";

status = "okay";

sai2a_port: port {

sai2a_endpoint: endpoint {

remote-endpoint = <&cs42l51_tx_endpoint>;

format = "i2s";

mclk-fs = <256>;

dai-tdm-slot-num = <2>;

dai-tdm-slot-width = <32>;

};

};

};

sai2b: audio-controller@4400b024 {

dma-names = "rx";

st,sync = <&sai2a 2>;

clocks = <&rcc SAI2_K>, <&sai2a>;

clock-names = "sai_ck", "MCLK";

status = "okay";

sai2b_port: port {

sai2b_endpoint: endpoint {

remote-endpoint = <&cs42l51_rx_endpoint>;

format = "i2s";

mclk-fs = <256>;

dai-tdm-slot-num = <2>;

dai-tdm-slot-width = <32>;

};

};

};

};

由于stm32mp15-pinctrl.dtsi中对于SAI2管脚的定义与FS-MP1A实际使用管脚一致,所以无需修改。

  1. CS42L51设备树节点

由于前文中已经增加过I2C5的节点信息,本节就不再重复,在原有I2C5节点添加CS42L51内容即可。

参考文档:

Documentation/devicetree/bindings/sound/cs42l51.txt

参考stm32mp15xx-dkx.dtsi对于codec芯片设备节点的描述,增加内容如下:

cs42l51: cs42l51@4a {

compatible = "cirrus,cs42l51";

reg = <0x4a>;

#sound-dai-cells = <0>;

VL-supply = <&v3v3>;

VD-supply = <&v1v8_audio>;

VA-supply = <&v1v8_audio>;

VAHP-supply = <&v1v8_audio>;

reset-gpios = <&gpioc 0 GPIO_ACTIVE_LOW>;

clocks = <&sai2a>;

clock-names = "MCLK";

status = "okay";

cs42l51_port: port {

#address-cells = <1>;

#size-cells = <0>;

cs42l51_tx_endpoint: endpoint@0 {

reg = <0>;

remote-endpoint = <&sai2a_endpoint>;

frame-master;

bitclock-master;

};

cs42l51_rx_endpoint: endpoint@1 {

reg = <1>;

remote-endpoint = <&sai2b_endpoint>;

frame-master;

bitclock-master;

};

};

};

  1. 1.8V电源设备节点

前文已经说过如何添加电源节点,本节不再重复,在根节点添加&v1v8_audio节点,内容如下:

v1v8_audio: regulator-v1v8_audio {

compatible = "regulator-fixed";

regulator-name = "v1v8_audio";

regulator-min-microvolt = <1800000>;

regulator-max-microvolt = <1800000>;

regulator-always-on;

regulator-boot-on;

};

  1. SOC声卡驱动节点

内核中包含audio-graph-card驱动,驱动将声卡各个部分关联起来,驱动正常工作需添加对应设备树节点。

参考文档:

Documentation/devicetree/bindings/sound/audio-graph-card.txt

在根节点写下添加sound节点:

sound {

compatible = "audio-graph-card";

label = "STM32MP1-FSMP1A";

routing =

"Playback" , "MCLK",

"Capture" , "MCLK",

"MICL" , "Mic Bias";

dais = <&sai2a_port &sai2b_port>;

status = "okay";

};

2.实验平台

华清远见开发环境,FS-MP1A平台;

3.实验目的

熟悉基于Linux操作系统下的音频设备驱动移植配置过程。

4.实验步骤

  1. 导入交叉编译工具链

linux@ubuntu:$ source /opt/st/stm32mp1/3.1-openstlinux-5.4-dunfell-mp1-20-06-24/environment-setup-cortexa7t2hf-neon-vfpv4-ostl-linux-gnueabi

  1. 添加SAI2节点

修改arch/arm/boot/dts/stm32mp15xx-fsmp1x.dtsi文件,在文件末尾添加如下内容:

&sai2 {

clocks = <&rcc SAI2>, <&rcc PLL3_Q>, <&rcc PLL3_R>;

clock-names = "pclk", "x8k", "x11k";

pinctrl-names = "default", "sleep";

pinctrl-0 = <&sai2a_pins_a>, <&sai2b_pins_b>;

pinctrl-1 = <&sai2a_sleep_pins_a>, <&sai2b_sleep_pins_b>;

status = "okay";

sai2a: audio-controller@4400b004 {

#clock-cells = <0>;

dma-names = "tx";

clocks = <&rcc SAI2_K>;

clock-names = "sai_ck";

status = "okay";

sai2a_port: port {

sai2a_endpoint: endpoint {

remote-endpoint = <&cs42l51_tx_endpoint>;

format = "i2s";

mclk-fs = <256>;

dai-tdm-slot-num = <2>;

dai-tdm-slot-width = <32>;

};

};

};

sai2b: audio-controller@4400b024 {

dma-names = "rx";

st,sync = <&sai2a 2>;

clocks = <&rcc SAI2_K>, <&sai2a>;

clock-names = "sai_ck", "MCLK";

status = "okay";

sai2b_port: port {

sai2b_endpoint: endpoint {

remote-endpoint = <&cs42l51_rx_endpoint>;

format = "i2s";

mclk-fs = <256>;

dai-tdm-slot-num = <2>;

dai-tdm-slot-width = <32>;

};

};

};

};

  1. 添加CS42L51节点

修改arch/arm/boot/dts/stm32mp15xx-fsmp1x.dtsi文件,在I2C5节点中添加如下内容:

cs42l51: cs42l51@4a {

compatible = "cirrus,cs42l51";

reg = <0x4a>;

#sound-dai-cells = <0>;

VL-supply = <&v3v3>;

VD-supply = <&v1v8_audio>;

VA-supply = <&v1v8_audio>;

VAHP-supply = <&v1v8_audio>;

reset-gpios = <&gpioc 0 GPIO_ACTIVE_LOW>;

clocks = <&sai2a>;

clock-names = "MCLK";

status = "okay";

cs42l51_port: port {

#address-cells = <1>;

#size-cells = <0>;

cs42l51_tx_endpoint: endpoint@0 {

reg = <0>;

remote-endpoint = <&sai2a_endpoint>;

frame-master;

bitclock-master;

};

cs42l51_rx_endpoint: endpoint@1 {

reg = <1>;

remote-endpoint = <&sai2b_endpoint>;

frame-master;

bitclock-master;

};

};

};

  1. 添加v1v8_audio电源节点

修改arch/arm/boot/dts/stm32mp15xx-fsmp1x.dtsi文件,在根节点中添加如下内容:

v1v8_audio: regulator-v1v8_audio {

compatible = "regulator-fixed";

regulator-name = "v1v8_audio";

regulator-min-microvolt = <1800000>;

regulator-max-microvolt = <1800000>;

regulator-always-on;

regulator-boot-on;

};

  1. 添加Sound节点

修改arch/arm/boot/dts/stm32mp15xx-fsmp1x.dtsi文件,在根节点中添加如下内容:

sound {

compatible = "audio-graph-card";

label = "STM32MP1-FSMP1A";

routing =

"Playback" , "MCLK",

"Capture" , "MCLK",

"MICL" , "Mic Bias";

dais = <&sai2a_port &sai2b_port>;

status = "okay";

};

  1. 配置内核

由于内核源码默认配置以及支持CS42L51,本节列出主要选项,如下:

linux@ubuntu:$ make menuconfig

Device Drivers --->

<*> Sound card support --->

<*> Advanced Linux Sound Architecture --->

<*> ALSA for SoC audio support --->

STMicroelectronics STM32 SOC audio support --->

<*> STM32 SAI interface (Serial Audio Interface) support

CODEC drivers --->

<*> Cirrus Logic CS42L51 CODEC (I2C)

<*> ASoC Audio Graph sound card support

  1. 编译内核及设备树

linux@ubuntu:$ make -j4 uImage dtbs LOADADDR=0xC2000040

  1. 重启测试

将编译好的设备树和内核镜像拷贝到/tftpboot目录下,通过tftp引导内核,启动后启动信息中出现如下内容:

插上耳机,终端输入录音命令:

root@fsmp1a:# arecord -D record_codec -f S16_LE -d 10 test.wav

终端输入播放命令:

root@fsmp1a:# aplay test.wav

注意:由于3.5mm的4段式耳机接口还分为两种,一种是美标版(CTIA),也称为“苹果标准”,同时小米、魅族也是使用这种标准;另外一种是国标版(OMTP),也称为“诺基亚标准”,现在绝大多数诺基亚和大多数国产手机都是使用这种标准。FS-MP1A使用的是国标版,所以部分耳机并不能正常实现录播功能。

硬件平台:华清远见FS-MP1A开发板(STM32MP157)

部分开发教程下载:加QQ群459754978,群文件里有。

部分视频课程收看:华清远见研发中心的个人空间_哔哩哔哩_Bilibili

淘宝购买链接:https://item.taobao.com/item.htm?id=622457259672

手机淘宝分享码:复制本行文字打开手淘₤T4FPXn3YYJ2₤

  • 5
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 《stm32mp157开发教程之linux系统移植(完整版).pdf》是一本关于stm32mp157芯片的开发教程,主要介绍了如何将Linux系统移植stm32mp157芯片上的方法和步骤。 该教程首先介绍了stm32mp157芯片的基本特性和架构,包括CPU,内存,外设等方面的介绍,让读者对该芯片有一个整体的了解。 然后,教程详细介绍了在Linux系统移植过程中需要用到的工具和软件,包括编译工具链、Bootloader、内核等。对每个工具和软件的使用方法和配置要求进行了详细的说明。 接下来,教程介绍了如何通过串口和USB连接stm32mp157芯片,以及如何使用工具和软件进行系统的烧录和调试。通过实例演示,让读者了解系统移植过程中可能遇到的问题和解决方法。 最后,教程还包含了一些常见的应用开发案例,比如GPIO控制、串口通信、网络编程等,让读者更加深入地了解如何在stm32mp157芯片上开发应用程序。 总的来说,该教程内容详实,操作简明,适合初学者学习和使用。可以帮助读者顺利完成stm32mp157芯片的Linux系统移植工作,并能在此基础上进行应用开发。 ### 回答2: 《stm32mp157开发教程之linux系统移植(完整版).pdf》是一本关于如何将Linux系统移植stm32mp157开发板的教程。教程的详细内容包括以下几个方面: 1. 硬件环境准备:介绍了stm32mp157开发板的硬件配置和连接。包括处理器、内存、外设等的介绍和配置。 2. 开发环境搭建:介绍了在PC上搭建交叉编译环境的步骤和方法。包括安装交叉编译工具链、配置开发环境等。 3. Linux内核移植:详细介绍了如何下载Linux内核源码,并进行配置和编译。包括选择适合的内核版本、配置内核选项、编译内核等步骤。 4. 设备树配置:解释了设备树的作用和配置方法。包括如何编辑设备树文件,配置硬件资源和外设等。 5. 根文件系统制作:介绍了如何制作根文件系统,包括选择和下载合适的根文件系统镜像、挂载和配置文件系统等。 6. 系统烧录和调试:详细介绍了如何将编译好的内核和文件系统烧录到stm32mp157开发板上,并进行调试和测试。包括使用烧录工具、配置开发板启动参数等。 通过阅读这本教程,读者可以了解到如何将Linux系统移植stm32mp157开发板上,并能够掌握相应的操作步骤和方法。这对于想要在stm32mp157开发板上进行Linux开发的人来说是一个非常实用的指南。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值