一、硬件
LC-PI-200S板卡已板载mic和音频放大,外接喇叭即可测试。
二、先使用LC-PI-200S固件测试
2.1 镜像
sysimage-sdcard.img
2.2 测试
查看声卡信息
# tinypcminfo
Info for card 0, device 0:
PCM out:
Access: 0x000009
Format[0]: 0x000404
Format[1]: 00000000
Format Name: S16_LE, S32_LE
Subformat: 0x000001
Rate: min=8000Hz max=192000Hz
Channels: min=1 max=2
Sample bits: min=16 max=32
Period size: min=32 max=32768
Period count: min=2 max=8192
PCM in:
Access: 0x000009
Format[0]: 0x000404
Format[1]: 00000000
Format Name: S16_LE, S32_LE
Subformat: 0x000001
Rate: min=8000Hz max=48000Hz
Channels: min=1 max=2
Sample bits: min=16 max=32
Period size: min=32 max=32768
Period count: min=2 max=8192
配置
tinymix set 2 1
tinymix set 1 63
tinymix set 13 1
tinymix contents
录音
tinycap /tmp/test.wav
播放
tinyplay /tmp/test.wav
三、尝试在5.4.99版本上实现音频驱动
从board下移植。
1 修改Makefile
ARCH ?= arm
CROSS_COMPILE ?= arm-linux-gnueabi-
2 配置文件
linux.defconfig -> .config
3 设备树
suniv-f1c100s.dtsi
devicetree.dts -> suniv-f1c100s-licheepi-nano.dts
4 补丁
patch -p1 < 0001-Add-USB-Support.patch
5 编译
make -j8
四、设备树
suniv-f1c100s.dtsi
#include <dt-bindings/dma/sun4i-a10.h>
dma: dma-controller@1c02000 {
compatible = "allwinner,suniv-f1c100s-dma";
reg = <0x01c02000 0x1000>;
interrupts = <18>;
clocks = <&ccu CLK_BUS_DMA>;
resets = <&ccu RST_BUS_DMA>;
#dma-cells = <2>;
};
codec: codec@1c23c00 {
compatible = "allwinner,suniv-f1c100s-codec";
reg = <0x01c23c00 0x400>;
interrupts = <21>;
clocks = <&ccu CLK_BUS_CODEC>,
<&ccu CLK_CODEC>;
clock-names = "apb", "codec";
resets = <&ccu RST_BUS_CODEC>;
dmas = <&dma SUN4I_DMA_NORMAL 0x0c>,
<&dma SUN4I_DMA_NORMAL 0x0c>;
dma-names = "rx", "tx";
status = "disabled";
};
suniv-f1c100s-licheepi-nano.dts
&codec {
allwinner,audio-routing =
"Headphone", "HP",
"Headphone", "HPCOM",
"LINEIN", "Line In",
"FMINL", "Left FM In",
"FMINR", "Right FM In",
"MIC", "Mic";
status = "okay";
};
五、内核配置(打补丁)
Device Drivers
-> Sound card support
-> Advanced Linux Sound Architecture
-> ALSA for SoC audio support
-> Allwinner SoC Audio support(使能该驱动)
Device Drivers
-> DMA Engine support(使能)
-> Allwinner A10 DMA SoCs support
六、tinyalsa
6.1 关于tinyalsa
目前 linux 中主流的音频体系结构是ALSA(Advanced Linux Sound Architecture),ALSA在内核驱动层提供了alsa-driver,在应用层提供了alsa-lib,应用程序只需要调用alsa-lib提供的API就可以完成对底层硬件的操作。
但是 ALSA 较为庞大,对于资源有限,可以满足需求的前提下,ALSA 的 简化版 tinyalsa 是个不错的选择。
tinyalsa 编译后会生成四个小工具:
- tinypcminfo
用于查看pcm通道的相关信息。
- tinymix
用于查看设置各项配置参数。
- tinycap
简易的录音软件,用于录音测试。
- tinyplay
用于播放测试,只能播放wav原始格式的音乐。
6.2 buildroot配置
先make clean,再make
6.3 测试
替换zImage,设备树和文件系统。
6.3.1 使用 tinymix 配置声卡
系统启动后,声卡默认是关闭的,需要配置一下通道开关、音量等。
- 查询声卡参数
首先查询下当前状态,使用命令:
tinymix contents
查询到的结果如下:
# tinymix contents
Number of controls: 25
ctl type num name value
0 INT 1 DAC Playback Volume 63 (range 0->63)
1 INT 1 Headphone Playback Volume 63 (range 0->63)
2 BOOL 2 Headphone Playback Switch On, On
3 INT 1 Line In Playback Volume 0 (range 0->7)
4 INT 1 FM In Playback Volume 0 (range 0->7)
5 INT 1 Mic In Playback Volume 3 (range 0->7)
6 INT 1 Mic Boost Volume 4 (range 0->7)
7 INT 1 ADC Capture Volume 3 (range 0->7)
8 BOOL 1 ADC Mixer Right Out Capture Switch Off
9 BOOL 1 ADC Mixer Left Out Capture Switch Off
10 BOOL 1 ADC Mixer Line In Capture Switch Off
11 BOOL 1 ADC Mixer Right FM In Capture Switch Off
12 BOOL 1 ADC Mixer Left FM In Capture Switch Off
13 BOOL 1 ADC Mixer Mic Capture Switch On
14 BOOL 1 Left Mixer Right DAC Playback Switch Off
15 BOOL 1 Left Mixer Left DAC Playback Switch Off
16 BOOL 1 Left Mixer FM In Playback Switch Off
17 BOOL 1 Left Mixer Line In Playback Switch Off
18 BOOL 1 Left Mixer Mic In Playback Switch Off
19 BOOL 1 Right Mixer Left DAC Playback Switch Off
20 BOOL 1 Right Mixer Right DAC Playback Switch Off
21 BOOL 1 Right Mixer FM In Playback Switch Off
22 BOOL 1 Right Mixer Line In Playback Switch Off
23 BOOL 1 Right Mixer Mic In Playback Switch Off
24 ENUM 2 Headphone Source Playback Route , DACMixer, , DACMixer
- 经过测试,至少设置下面三项:
设置耳机音量
tinymix set 1 63
设置耳机播放开关
tinymix set 2 1
设置MIC采集开关
tinymix set 13 1
# tinypcminfo
Info for card 0, device 0:
PCM out:
Access: 0x000009
Format[0]: 0x000404
Format[1]: 00000000
Format Name: S16_LE, S32_LE
Subformat: 0x000001
Rate: min=8000Hz max=192000Hz
Channels: min=1 max=2
Sample bits: min=16 max=32
Period size: min=32 max=32768
Period count: min=2 max=8192
PCM in:
Access: 0x000009
Format[0]: 0x000404
Format[1]: 00000000
Format Name: S16_LE, S32_LE
Subformat: 0x000001
Rate: min=8000Hz max=48000Hz
Channels: min=1 max=2
Sample bits: min=16 max=32
Period size: min=32 max=32768
Period count: min=2 max=8192
6.3.2 录音和播放
录音:
tinycap /tmp/test.wav
Ctrl + C 结束录音。
播放:
tinyplay /tmp/test.wav
七、mplayer
7.1 安装
mplayer是一款开源的多媒体播放器,可以用来播放音视频, mplayer 自带多种格式的解码器,不需要我们再另外安装。
-
mplayer在2018.05版本之后,就不包含了。如何自己添加呢?
-
从之前buildroot版本中的package中的mplayer文件夹拷贝过来
-
修改package/Config.in。
source "package/mpg123/Config.in" source "package/mplayer/Config.in" source "package/mpv/Config.in"
-
修改Config.in.legacy
#config BR2_PACKAGE_MPLAYER # bool "mplayer package removed" # select BR2_LEGACY # help # The mplayer package was removed. #config BR2_PACKAGE_MPLAYER_MPLAYER # bool "mplayer package removed" # select BR2_LEGACY # help # The mplayer package was removed. #config BR2_PACKAGE_MPLAYER_MENCODER # bool "mplayer package removed" # select BR2_LEGACY # help # The mplayer package was removed. #config BR2_PACKAGE_LIBPLAYER_MPLAYER # bool "mplayer support in libplayer removed" # select BR2_LEGACY # help # The mplayer package was removed.
-
make clean & make
7.2 测试
设置耳机音量
tinymix set 1 63
设置耳机播放开关
tinymix set 2 1
设置MIC采集开关
tinymix set 13 1
mplayer audio.mp3
mplayer -vo fbdev2 400x240_5_24000_64k.mp4
# cat /proc/asound/cards
0 [Codec ]: F1C100s_Audio_C - F1C100s Audio Codec
F1C100s Audio Codec
参考
https://blog.csdn.net/qq_41709234/article/details/128694780
https://www.cnblogs.com/twzy/p/15356109.html
https://whycan.com/t_8748_13.html
https://cloud.tencent.com/developer/article/2311002
https://developer.aliyun.com/article/1268429
https://blog.csdn.net/qq_41839588/article/details/130413480
https://wiki.dfrobot.com/MangoPi_R3_SKU_DFR0780#target_15
https://doc.embedfire.com/linux/imx6/base/zh/latest/submission/buildroot2017-2.html?highlight=buildroot