最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

STM32MP157 Linux系統(tǒng)移植開發(fā)篇16:Linux內(nèi)核音頻驅(qū)動(dòng)移植

2021-09-15 11:45 作者:華清遠(yuǎn)見研發(fā)中心  | 我要投稿

本文章為《STM32MP157 Linux系統(tǒng)移植開發(fā)篇》系列中的一篇,筆者使用的開發(fā)平臺(tái)為華清遠(yuǎn)見FS-MP1A開發(fā)板(STM32MP157開發(fā)板)。stm32mp157是ARM雙核,2個(gè)A7核,1個(gè)M4核,A7核上可以跑Linux操作系統(tǒng),M4核上可以跑FreeRTOS、RT-Thread等實(shí)時(shí)操作系統(tǒng),STM32MP157開發(fā)板所以既可以學(xué)嵌入式linux,也可以學(xué)stm32單片機(jī)。

針對(duì)FS-MP1A開發(fā)板,除了Linux系統(tǒng)移植篇外,還包括其他多系列教程,包括Cortex-A7開發(fā)篇、Cortex-M4開發(fā)篇、擴(kuò)展板驅(qū)動(dòng)移植篇、Linux應(yīng)用開發(fā)篇、FreeRTOS系統(tǒng)移植篇、Linux驅(qū)動(dòng)開發(fā)篇、硬件設(shè)計(jì)篇、人工智能機(jī)器視覺篇、Qt應(yīng)用編程篇、Qt綜合項(xiàng)目實(shí)戰(zhàn)篇等。歡迎關(guān)注,更多stm32mp157開發(fā)教程及視頻,可加技術(shù)交流Q群459754978,感謝關(guān)注。

關(guān)于FS-MP1A開發(fā)板:
手機(jī)淘寶分享碼:復(fù)制本行文字打開手淘?T4FPXn3YYJ2?
鏈接:https://item.taobao.com/item.htm?id=622457259672


1.實(shí)驗(yàn)原理

FS-MP1A使用的是CS42L51音頻芯片,SoC通過I2C和SAI與其進(jìn)行數(shù)據(jù)交互,原理圖如下:



SAI2管腳對(duì)應(yīng)關(guān)系:



I2C5管腳對(duì)應(yīng)關(guān)系:



芯片復(fù)位管腳對(duì)應(yīng)關(guān)系:




原理圖網(wǎng)絡(luò)編號(hào)對(duì)應(yīng)管腳管腳功能管腳功能碼SAI2_MCLKAPE0SAI2_MCLK_AAF10SAI2_SDBPF11SDA2_SD_BAF10SAI2_SCKAPI5SAI2_SCK_AAF10SAI_SDAPI6SAI2_SD_AAF10SAI2_FSAPI7SAI2_FS_AAF10AUDIO_RSTPC0IOANALOGI2C5_SDAPA11I2C5_SDAAF4I2C5_SCLPA12I2C5_SDAAF4


  1. SAI2設(shè)備樹節(jié)點(diǎn)

參考文檔:

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

內(nèi)核中ST對(duì)STM32MP15x系列芯片的設(shè)備樹資源了做了定義,可參見:

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";

};

};

上述代碼只對(duì)SAI2做了基本的初始化,并沒有針對(duì)不同的硬件設(shè)計(jì)做適配,所以需結(jié)合硬件補(bǔ)全設(shè)備樹節(jié)點(diǎn)信息。

參考stm32mp15xx-dkx.dtsi對(duì)于SAI2設(shè)備節(jié)點(diǎn)的描述,增加SAI2內(nèi)容如下:

&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中對(duì)于SAI2管腳的定義與FS-MP1A實(shí)際使用管腳一致,所以無需修改。

  1. CS42L51設(shè)備樹節(jié)點(diǎn)

由于前文中已經(jīng)增加過I2C5的節(jié)點(diǎn)信息,本節(jié)就不再重復(fù),在原有I2C5節(jié)點(diǎn)添加CS42L51內(nèi)容即可。

參考文檔:

Documentation/devicetree/bindings/sound/cs42l51.txt

參考stm32mp15xx-dkx.dtsi對(duì)于codec芯片設(shè)備節(jié)點(diǎn)的描述,增加內(nèi)容如下:

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電源設(shè)備節(jié)點(diǎn)

前文已經(jīng)說過如何添加電源節(jié)點(diǎn),本節(jié)不再重復(fù),在根節(jié)點(diǎn)添加&v1v8_audio節(jié)點(diǎn),內(nèi)容如下:

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聲卡驅(qū)動(dòng)節(jié)點(diǎn)

內(nèi)核中包含audio-graph-card驅(qū)動(dòng),驅(qū)動(dòng)將聲卡各個(gè)部分關(guān)聯(lián)起來,驅(qū)動(dòng)正常工作需添加對(duì)應(yīng)設(shè)備樹節(jié)點(diǎn)。

參考文檔:

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

在根節(jié)點(diǎn)寫下添加sound節(jié)點(diǎn):


sound {

compatible = "audio-graph-card";

label = "STM32MP1-FSMP1A";

routing =

"Playback" , "MCLK",

"Capture" , "MCLK",

"MICL" , "Mic Bias";

dais = <&sai2a_port &sai2b_port>;

status = "okay";

};

2.實(shí)驗(yàn)平臺(tái)

華清遠(yuǎn)見開發(fā)環(huán)境,F(xiàn)S-MP1A平臺(tái);

3.實(shí)驗(yàn)?zāi)康?/h1>

熟悉基于Linux操作系統(tǒng)下的音頻設(shè)備驅(qū)動(dòng)移植配置過程。

4.實(shí)驗(yàn)步驟

  1. 導(dǎo)入交叉編譯工具鏈

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節(jié)點(diǎn)

修改arch/arm/boot/dts/stm32mp15xx-fsmp1x.dtsi文件,在文件末尾添加如下內(nèi)容:

&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節(jié)點(diǎn)

修改arch/arm/boot/dts/stm32mp15xx-fsmp1x.dtsi文件,在I2C5節(jié)點(diǎn)中添加如下內(nèi)容:

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電源節(jié)點(diǎn)

修改arch/arm/boot/dts/stm32mp15xx-fsmp1x.dtsi文件,在根節(jié)點(diǎn)中添加如下內(nèi)容:

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節(jié)點(diǎn)

修改arch/arm/boot/dts/stm32mp15xx-fsmp1x.dtsi文件,在根節(jié)點(diǎn)中添加如下內(nèi)容:

sound {

compatible = "audio-graph-card";

label = "STM32MP1-FSMP1A";

routing =

"Playback" , "MCLK",

"Capture" , "MCLK",

"MICL" , "Mic Bias";

dais = <&sai2a_port &sai2b_port>;

status = "okay";

};

  1. 配置內(nèi)核

由于內(nèi)核源碼默認(rèn)配置以及支持CS42L51,本節(jié)列出主要選項(xiàng),如下:

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. 編譯內(nèi)核及設(shè)備樹

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

  1. 重啟測(cè)試

將編譯好的設(shè)備樹和內(nèi)核鏡像拷貝到/tftpboot目錄下,通過tftp引導(dǎo)內(nèi)核,啟動(dòng)后啟動(dòng)信息中出現(xiàn)如下內(nèi)容:



插上耳機(jī),終端輸入錄音命令:

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

終端輸入播放命令:

root@fsmp1a:# aplay test.wav

注意:由于3.5mm的4段式耳機(jī)接口還分為兩種,一種是美標(biāo)版(CTIA),也稱為“蘋果標(biāo)準(zhǔn)”,同時(shí)小米、魅族也是使用這種標(biāo)準(zhǔn);另外一種是國(guó)標(biāo)版(OMTP),也稱為“諾基亞標(biāo)準(zhǔn)”,現(xiàn)在絕大多數(shù)諾基亞和大多數(shù)國(guó)產(chǎn)手機(jī)都是使用這種標(biāo)準(zhǔn)。FS-MP1A使用的是國(guó)標(biāo)版,所以部分耳機(jī)并不能正常實(shí)現(xiàn)錄播功能。


硬件平臺(tái):華清遠(yuǎn)見FS-MP1A開發(fā)板(STM32MP157)

部分開發(fā)教程下載:加QQ群459754978,群文件里有。

淘寶購(gòu)買鏈接:item.taobao.com/item.ht

手機(jī)淘寶分享碼:復(fù)制本行文字打開手淘?T4FPXn3YYJ2?


STM32MP157 Linux系統(tǒng)移植開發(fā)篇16:Linux內(nèi)核音頻驅(qū)動(dòng)移植的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
舒兰市| 二连浩特市| 绥江县| 本溪市| 广平县| 海城市| 新田县| 沁阳市| 香港 | 简阳市| 疏附县| 江陵县| 德安县| 佛教| 娱乐| 巨野县| 都兰县| 乡城县| 灵川县| 黄陵县| 清水河县| 西吉县| 大安市| 元阳县| 珲春市| 遂昌县| 山东省| 龙门县| 珠海市| 沂南县| 缙云县| 岳普湖县| 阿拉善左旗| 孝义市| 当阳市| 临清市| 淳安县| 永昌县| 锡林浩特市| 铁力市| 吉隆县|