使用F1C200S从零制作掌机之音频驱动

一、硬件

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配置

img

先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 自带多种格式的解码器,不需要我们再另外安装。

  1. mplayer在2018.05版本之后,就不包含了。如何自己添加呢?

  2. 从之前buildroot版本中的package中的mplayer文件夹拷贝过来

  3. 修改package/Config.in。

    source "package/mpg123/Config.in"
    source "package/mplayer/Config.in"
    source "package/mpv/Config.in"
    
  4. 修改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.
    
  5. 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值