(九)音频驱动--从零开始自制linux掌上电脑(F1C200S) <嵌入式项目>

目录

一、前言

二、驱动修改

三、设备树修改

1、.dtsi文件修改

2、.dts文件修改

四、驱动使能

五、启动测试与配置

1、启动与检查

2、默认声卡配置

 六、音频视频播放测试

1、mplayer与alsa-utils安装

2、音频播放测试

3、视频播放测试

七、音频输入测试

八、主要参考内容


一、前言

F1C200s是全志的一款高度集成、低功耗的移动应用处理器,可用于多种多媒体音视频设备中。

全志F1C200s基于ARM 9架构,集成了DDR。它支持高清视频解码,包括H.264、H.263、MPEG 1/2/4等。它还集成了音频编解码器和I2S/PCM接口,以增强用户体验。

由上面的介绍可以看出,F1C200s具有高清视频解码功能,因此本文使用F1C200s完成音视频播放功能。由于本文对输出音频的品质没有要求,因此本文未采用I2S声卡( I2S总线有时候也写作 IIS,I2S 是飞利浦公司提出的一种用于数字音频设备之间进行音频数据传输的总线),直接使用F1C200s自带的声卡,注意,F1C200s自带的声卡比较差劲,对声音品质要求较高请勿采用此方案。

既然音频CODEC的本质是ADC和DAC,那么采样率和采样位数就是衡量一款音频CODEC最重要的指标。比如常见音频采样率有8K、44.1K、48K、192K甚至384K和768K,采样位数常见的有8位、16位、24位、32位。

-- 正点原子

理解一下上面的概念,后面会提到:

采样位数——可以理解数字音频设备处理声音的解析度,即对声音的辨析度就像表示颜色的位数一样(8位表示256种颜色,16位表示65536种颜色),有8位,16位,24位等。这个数值越大,解析度就越高,录制和回放的声音就越真实。

采样频率——就是对声音信息1秒钟采样多少次以记录成数字信息。如CD音频是44.1KHz采样率,它对声音以每秒44100次的频率来记录信息。原则上采样率越高,声音的质量越好。


二、驱动修改

接下来在Linux内核目录中替换下面补丁包中的代码,本补丁包在Linux5.7.1下测试成功,其他版本请备份源码后尝试,这里的代码是通过改造sun4i-codec解码方案而来。

-- 墨云

具体修改内容详见https://lkml.org/lkml/2018/12/2/259,或直接使用墨云提供的内核补丁包(这是Allwinner suniv F1C100s支持DMA和音频解码器的RFC补丁),相关讨论详见此处请问有没有大神搞定了f1c100s的主线kernel4.19下的声卡驱动?,本文直接使用墨云提供的补丁包。

Suniv F1C100s具有与sun4i非常相似的DMA。但也有一些不同之处。 Suniv在时钟控制单元中有一个DMA复位位。它有更小的DMA通道数。几个寄存器有不同的地址。 它的最大突发大小是 4而不是8,添加一个 quirk 字段以区分它们。DMA端点编号也不同。


三、设备树修改

1、.dtsi文件修改

首先在.dtsi文件中添加头文件的引用:

#include <dt-bindings/dma/sun4i-a10.h> 

然后在soc结点下添加如下结点,F1C200s利用DMA通道发送和接收ADC-DAC样本,所以需要DMA支持。

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

2、.dts文件修改

Allwinner suniv F1C200s 现在具有基本的音频编解码器支持,在设备树dts文件中为Lichee Pi Nano开发板激活它。

&codec {
    allwinner,audio-routing =
    "Headphone", "HP",
    "Headphone", "HPCOM",
    "MIC", "Mic";
    status = "okay";
};

四、驱动使能

使用make menuconfig图形化配置驱动,进入如下路径,使能对应的驱动。注意:这两个驱动默认处于使能状态。

Device Drivers

        -> Sound card support

                -> Advanced Linux Sound Architecture

                        -> ALSA for SoC audio support        

                                -> Allwinner SoC Audio support(使能该驱动)

 Device Drivers

        -> DMA Engine support(使能)


五、启动测试与配置

1、启动与检查

重新编译,并上电,可以看到F1c100s Audio Codec 的声卡配置如下:

使用如下命令检查声卡,确实是否正确启动,如下图所示为正常启动:

cat /proc/asound/cards

2、默认声卡配置

使用如下命令打开asound.conf文件输入下方内容,Debian文件系统中可能不存在这个文件,自行创建即可。

vi /etc/asound.conf
defaults.ctl.card 1
defaults.pcm.card 1
defaults.timer.card 1

如果未正确配置默认声卡,播放mp3文件的时候可能报错如下:


 六、音频视频播放测试

1、mplayer与alsa-utils安装

使用如下命令在我们的开发板中(如果已经配置好无线网卡),或者是qemu模拟器中安装两个软件:

sudo apt-get install mplayer
sudo apt-get install alsa-utils

qemu模拟器中安装mplayer报错如下,经过后续测试并不影响使用。

2、音频播放测试

使用如下命令播放准备好的mp3文件,等待输出以下内容后开始播放音乐,按0键增加音量,按9键减小音量。经测试,音频播放正常。

mplayer audio.mp3

3、视频播放测试

本文使用mplayer进行视频播放测试,使用以下命令查看驱mplayer的帮助信息,从帮助信息中可以看出,-vo选项是用来选择视频输出驱动的。

使用命令mplayer -vo help显示支持的视频驱动,本文使用fbdev2进行播放(因为只有fbdev2才能播放,不清楚墨云为什么使用fbdev可以播放)。

由于F1C200s的性能有限(实在是太有限了),视频的分辨率和帧率已经很低很低了,仍然提示系统性能不支持播放较高分辨率的视频,如果在项目中使用,建议直接I2S,外接音频解码芯片。如果你所使用的芯片性能比较差的话mplayer会给你提示如下:

本文选用分辨率400x240、帧率5帧的视频,其音频采样率为24000,音频质量为64k,注意视频分辨率不能大于800x480,也就是屏幕分辨率,使用如下命令播放,同样是按0键增加音量,按9键减小音量。

 mplayer -vo fbdev2 400x240_5_24000_64k.mp4 

经测试视频正常播放,视频正常播放时日志输出如下: 


七、音频输入测试

输入alsamixer命令得到以下图形界面配置,(这里还有一点需要补充,按说应该在上一小节说明的,第二个Headphone选项一定要选择DAC,否则无法正常输出音视频),按下F4进入Capture配置。(F1是帮助)

Mic Boost设置为100,ADC Mixer Mic捕获使能,或者通过amixer -c 1 cset numid=14 on命令使能捕获。

使用areconrd -l命令列出捕获硬件设备列表,很明显我们要使用card 1。

根据arecord录音_zkw_1998的博客-CSDN博客_arecord没有声音所说的内容,并参考如何测试音频驱动比如录音,播放声音?,如下图所示,指定设备为card 1,设置录音格式为wav,录音10秒。

根据上面分析得到录音指令为: 

arecord -D "plughw:1,0" -f S16_LE -r 16000 -d 10 -t wav file.wav

录音完毕,使用mplay file.wav进行播放。经测试,一切正常。

注:音频播放延迟问题解决方法:#27楼解决

V3s linux 4.13 音频播放延迟了,开始以为是线程同步问题,纠结了很久


八、主要参考内容

1.为了精华特意制作F1c200s-MP4播放器,支持硬件H264(开源板子和原理给个精华) / 全志 SOC / WhyCan Forum(哇酷开发者社区)

2. 荔枝派音频驱动 / 全志 SOC / WhyCan Forum(哇酷开发者社区)

3.探讨一下全志芯片的音频接口硬件电路连接应该怎么使用最好 / 全志 SOC / WhyCan Forum(哇酷开发者社区)

4.请教一下V3S怎么外接扬声器 / 全志 SOC / WhyCan Forum(哇酷开发者社区) 

5.白嫖党的胜利!开源F1C200S桌面小音箱!【验证通过】 / 全志 SOC / WhyCan Forum(哇酷开发者社区)

6.V3S CODEC的使用及驱动测试(声音播放功能) / 全志 SOC / WhyCan Forum(哇酷开发者社区) 

7. 请问有没有大神搞定了f1c100s的主线kernel4.19下的声卡驱动?[13楼@wammaw1314搞定声卡驱动,欢迎测试] / 全志 SOC / WhyCan Forum(哇酷开发者社区)

8.[慢更]小白探索如何使用V3s播放音乐  / 全志 SOC / WhyCan Forum(哇酷开发者社区) 

9.mplayer 移植 - Tankiii - 博客园

10.V3s linux 4.13 音频播放延迟了,开始以为是线程同步问题,纠结了很久 (问题由 @Andy1234 解决,欢迎大家验证) / 全志 SOC / WhyCan Forum(哇酷开发者社区)

11.小白自制Linux开发板 八. Linux音频驱动配置 - 淡墨青云 - 博客园

12.各侠大神,v3s BSP内核 如何测试音频驱动比如录音,播放声音? / 全志 SOC / WhyCan Forum(哇酷开发者社区)

13.arecord录音_zkw_1998的博客-CSDN博客_arecord没有声音

14.https://lkml.org/lkml/2018/12/2/259


  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
很抱歉,我作为一个语言模型,无法编写代码,但是我可以给你提供一个简单的掌上驴友的登陆注册界面的代码框架,你可以参考一下: HTML部分: ``` <!DOCTYPE html> <html> <head> <title>掌上驴友</title> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <link rel="stylesheet" type="text/css" href="style.css"> </head> <body> <div class="container"> <div class="form-wrap"> <h1>掌上驴友</h1> <form action="#" method="post"> <input type="text" name="name" placeholder="用户名"> <input type="password" name="password" placeholder="密码"> <input type="submit" value="登录"> </form> <p>还没有账号?<a href="#">立即注册</a></p> </div> </div> </body> </html> ``` CSS部分: ``` /*样式表*/ .container { display: flex; align-items: center; justify-content: center; height: 100vh; background-color: #f3f3f3; } .form-wrap { background-color: #fff; padding: 20px; box-shadow: 0 0 10px rgba(0,0,0,.3); } .form-wrap h1 { text-align: center; margin-bottom: 20px; } .form-wrap input[type="text"], .form-wrap input[type="password"] { display: block; width: 100%; padding: 10px; margin-bottom: 10px; border: none; border-radius: 4px; box-shadow: 0 0 10px rgba(0,0,0,.1) inset; } .form-wrap input[type="submit"] { display: block; width: 100%; padding: 10px; margin-bottom: 10px; border: none; border-radius: 4px; background-color: #2ecc71; color: #fff; cursor: pointer; } .form-wrap input[type="submit"]:hover { background-color: #27ae60; } .form-wrap p { text-align: center; margin-top: 20px; } .form-wrap p a { color: #2ecc71; } .form-wrap p a:hover { color: #27ae60; } ``` 这是一个简单的登陆注册界面的代码框架,你可以根据自己的需求进行修改。注意安全性问题,如密码加密等。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Kashine

你的鼓励将是我创作的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值