嵌入式linux ASoC架构声卡驱动开发
嵌入式linux ASoC架构声卡驱动开发
文章目录
- 嵌入式linux ASoC架构声卡驱动开发
- 需求分析
- ASoC架构下声卡驱动代码结构
- codec驱动
- snd_soc_register_codec分析
- 平台驱动
- 板驱动
- devm_snd_soc_register_card函数分析
需求分析
基于linux操作系统,使用ASoC框架,将系统中的音频文件从扬声器中播放出来。
首先,各种格式的音频文件,mp3,wav,FLAC,都是将模拟量以一定的规范进行了编码,才能保存下来的,所以对应的你需要一个播放器。播放器会将音频解码成i2s数据,然后向CPU外部传输。
扬声器只能接受模拟信号,所以需要一个数字信号处理芯片(DSP digital signal process)将i2s转换成模拟信号,这个DSP芯片从系统的角度理解就是声卡,除了将数字信号转换成模拟信号,有点DSP还具有放大、调音等功能。
ASoC架构下声卡驱动代码结构
ASoC架构下,添加一块声卡需要三个部分:
- codec驱动,也就是DSP芯片的驱动,负责直接对DSP进行控制的代码在这一部分驱动中。
- 平台驱动,这部分内容和名字一样,只和CPU这个平台有关,只关心CPU内部对i2s信号相关的处理,这部分代码一般由CPU的厂商负责写好。
- board驱动,板级驱动,也就是针对你的开发板部分的代码,这部分代码主要负责将你的CPU和DSP绑定起来。
平台驱动由CPU厂商提供,DSP也可以找到对应厂商给的demo,这两部分都是可以复用的代码,只有板驱动,需要亲力亲为,编写一个dai link将平台驱动和DSP驱动绑定起来,
codec驱动
驱动代码的位置: kernel/sound/soc/codecs
包含重要结构体的头文件:
- kernel/include/sound/soc.h
- kernel/include/sound/soc-dai.h
- kernel/sound/soc/soc-core.c
codec驱动的几项核心工作:
- 映射i2c regmap,方便对DSP进行读写
- 按照DSP的规定时序上电
- 写入DSP初始化配置
- 封装DSP的控制接口
- 通过snd_soc_register_codec将DSP注册进系统
snd_soc_register_codec分析
snd_soc_register_codec函数是codec驱动的核心,他将一个codec结构体和DAI驱动结构体注册进系统,这两个结构体封装了这一片DSP的控制API。
四个参数的说明:
device :
codec设备的i2c驱动实体,用于设备最开始时的probe,保存一些gpio的信息和其他私有数据,以便其他地方能够控制到codec的一些硬件设施。snd_soc_codec_driver结构体
主要包含codec的硬件控制接口和与系统相关的控制接口,比如codec的probe,后续系统注册声卡时会再来调用这个codec的probe函数,在此函数中进行一些具体的初始化操作,比如remove接口,卸载声卡是需要调用remove去释放声卡所占用的资源,remap的获取和读写操作,注册声卡的controls,wedgets,routes,具体的可以看soc.h头文件中的定义。snd_soc_dai_driver
主要包含 codec的dai的控制接口,dai就是Digital Audio Interface,也就是说,这一片DPS芯片的音频控制的相关接口在这里。除了snd_soc_dai的注册移除重启等,通过snd_soc_dai_ops结构体封装的音频操作接口,通过snd_soc_pcm_stream注册声卡的录音播放功能的具体参数,比如录音时的通道数,采样率,都是在此指定。Number of DAIs
DAI的数量
平台驱动
只关心cpu部分的操作,一般由CPU厂家写好这部分代码。
这部分要实现CUP中i2s的具体操作。
板驱动
这部分代码用于描述电路板,用于绑定板子上的CPU和DSP,也就是上面的codec和platform
核心结构体:snd_soc_dai_link
板驱动的核心工作:
绑定平台驱动和codec驱动
devm_snd_soc_register_card函数分析
板驱动通过这个函数注册一块声卡,这个函数第二个参数就是结构体snd_soc_card,这个结构体中填充了关于这块声卡的描述。
声卡里的dai_link成员变量,在这里指定codec和平台驱动的名字,同时snd_soc_ops成员中包含了一些声卡的控制接口,比如传输的带宽,添加dai支持的流媒体格式。
嵌入式linux ASoC架构声卡驱动开发相关推荐
- 嵌入式linux下复位声卡驱动
本文博客链接:http://blog.csdn.net/jdh99,作者:jdh,转载请注明. 最近在做一个对讲系统,平台是tiny6410搭载的linux.遇到的问题是对讲一段时间后声卡会挂掉,报出 ...
- 嵌入式Linux系统中打印机驱动的移植
一.开发环境 硬件环境:DM365 打印机型号:HP P1007 虚拟机系统:Red Hat Enterprise Linux 5 交叉编译环境:Ti交叉编译环境安装包 二.详细步骤 1.下载Ghos ...
- 嵌入式Linux下彩色LCD驱动的设计与实现
嵌入式Linux下彩色LCD驱动的设计与实现 转载 摘要:本文介绍了如何在嵌入在开发彩色LCD显示驱动的方法,并对Linux中的显示驱动程序结构和框架作一介绍. 长期以来,在常见的掌上电脑(PDA)等 ...
- 全志H2芯片外接tlv320adc3101声卡驱动开发记录
开发平台:OrangePi CPU:全志 H2+ 虚拟机:Ubuntu 12.04 64位 说明: tlv320adc3101声卡驱动主要使用了tlv320adc3101.c.sunxi-daudio ...
- Linux下LED设备驱动开发(LED灯实现闪烁)
文章目录 一.配置连接说明 二.更新设备树 (1)将led灯引脚添加到pinctrl子系统 (2)设备树中添加LDE灯的设备树节点 (3)编译更新设备树 三.驱动开发与测试 (1)编写设备驱动代码 ( ...
- linux 键盘驱动下载,嵌入式Linux系统的键盘驱动实现
嵌入式Linux系统的键盘驱动实现1引言 Linux由于其具有内核强大且稳定,易于扩展和裁减,丰富的硬件支持等诸多优点,在嵌入式系统中得到了广泛的应用.很多嵌入式Linux系统,特别是一些具有与用户强 ...
- linux蓝牙声卡驱动,Linux下安装声卡驱动总结
Linux下安装声卡驱动总结 发布时间:2008-03-27 01:18:34来源:红联作者:verytow 装了几次Linux OS,当然也装了几次声卡驱动,一般来说都是安装ALSA(Adcance ...
- 嵌入式linux系统架构
嵌入式linux的组成部分? 软件部分:bootloader+linux内核+ c函数库(接口机制 系统调用 中断)+应用程序 + QT 硬件部分:三星2410--arm核+控制器+外围设备 嵌入式l ...
- linux open函数_Linux驱动开发 / 字符设备驱动内幕 (1)
哈喽,我是老吴,继续记录我的学习心得. 一.保持专注的几个技巧 将最重要的事放在早上做. 待在无干扰环境下,比如图书馆. 意识到刚坐下开始投入工作前,有点负面小情绪是特别正常的现象. 让"开 ...
最新文章
- (转)C语言位运算详解
- Asp.Net 上传大文件专题(3)--从请求流中获取数据并保存为文件[下]
- C/C++面试题精选
- 2020邮箱账号密码大全_通知 | 复旦大学2020年春季学期研究生选课FAQ
- Head.First.Object-Oriented.Design.and.Analysis《深入浅出面向对象的分析与设计》读书笔记(七)...
- 阿里文娱首次公开!AI 如何对爆款内容未卜先知?
- 关于查看网页源文件不显示源代码(打开的是桌面文件夹)的问题
- 演示:扩展ACL的配置与应用技巧
- MyBatis学习前篇
- 远程命令行添加(删除)注册表键值(远程打开)
- aspen怎么做灵敏度分析_灵敏度分析aspen
- 软件需求分析——非功能性需求
- linux 查找py文件命令_Linux常用命令(一)
- 物流快递商家寄件运力查询接口API代码实例
- 【3】IMU模块:PA-IMU-460 ROS驱动 + 与GNSS时间同步
- Vue手把手带你入门(一) nodejs安装配置以及vue-cli脚手架创建第一个vue项目(超级详细)
- 25款很好看的液晶数字字体下载
- 大班科学计算机的发明应用教案,大班科学教案:《中国古代四大发明》
- PAT乙级1005,用C语言进行编程,继续卡拉兹猜想
- 函数式编程与面向对象编程的比较