嵌入式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
包含重要结构体的头文件

  1. kernel/include/sound/soc.h
  2. kernel/include/sound/soc-dai.h
  3. kernel/sound/soc/soc-core.c

codec驱动的几项核心工作:

  1. 映射i2c regmap,方便对DSP进行读写
  2. 按照DSP的规定时序上电
  3. 写入DSP初始化配置
  4. 封装DSP的控制接口
  5. 通过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架构声卡驱动开发相关推荐

  1. 嵌入式linux下复位声卡驱动

    本文博客链接:http://blog.csdn.net/jdh99,作者:jdh,转载请注明. 最近在做一个对讲系统,平台是tiny6410搭载的linux.遇到的问题是对讲一段时间后声卡会挂掉,报出 ...

  2. 嵌入式Linux系统中打印机驱动的移植

    一.开发环境 硬件环境:DM365 打印机型号:HP P1007 虚拟机系统:Red Hat Enterprise Linux 5 交叉编译环境:Ti交叉编译环境安装包 二.详细步骤 1.下载Ghos ...

  3. 嵌入式Linux下彩色LCD驱动的设计与实现

    嵌入式Linux下彩色LCD驱动的设计与实现 转载 摘要:本文介绍了如何在嵌入在开发彩色LCD显示驱动的方法,并对Linux中的显示驱动程序结构和框架作一介绍. 长期以来,在常见的掌上电脑(PDA)等 ...

  4. 全志H2芯片外接tlv320adc3101声卡驱动开发记录

    开发平台:OrangePi CPU:全志 H2+ 虚拟机:Ubuntu 12.04 64位 说明: tlv320adc3101声卡驱动主要使用了tlv320adc3101.c.sunxi-daudio ...

  5. Linux下LED设备驱动开发(LED灯实现闪烁)

    文章目录 一.配置连接说明 二.更新设备树 (1)将led灯引脚添加到pinctrl子系统 (2)设备树中添加LDE灯的设备树节点 (3)编译更新设备树 三.驱动开发与测试 (1)编写设备驱动代码 ( ...

  6. linux 键盘驱动下载,嵌入式Linux系统的键盘驱动实现

    嵌入式Linux系统的键盘驱动实现1引言 Linux由于其具有内核强大且稳定,易于扩展和裁减,丰富的硬件支持等诸多优点,在嵌入式系统中得到了广泛的应用.很多嵌入式Linux系统,特别是一些具有与用户强 ...

  7. linux蓝牙声卡驱动,Linux下安装声卡驱动总结

    Linux下安装声卡驱动总结 发布时间:2008-03-27 01:18:34来源:红联作者:verytow 装了几次Linux OS,当然也装了几次声卡驱动,一般来说都是安装ALSA(Adcance ...

  8. 嵌入式linux系统架构

    嵌入式linux的组成部分? 软件部分:bootloader+linux内核+ c函数库(接口机制 系统调用 中断)+应用程序 + QT 硬件部分:三星2410--arm核+控制器+外围设备 嵌入式l ...

  9. linux open函数_Linux驱动开发 / 字符设备驱动内幕 (1)

    哈喽,我是老吴,继续记录我的学习心得. 一.保持专注的几个技巧 将最重要的事放在早上做. 待在无干扰环境下,比如图书馆. 意识到刚坐下开始投入工作前,有点负面小情绪是特别正常的现象. 让"开 ...

最新文章

  1. (转)C语言位运算详解
  2. Asp.Net 上传大文件专题(3)--从请求流中获取数据并保存为文件[下]
  3. C/C++面试题精选
  4. 2020邮箱账号密码大全_通知 | 复旦大学2020年春季学期研究生选课FAQ
  5. Head.First.Object-Oriented.Design.and.Analysis《深入浅出面向对象的分析与设计》读书笔记(七)...
  6. 阿里文娱首次公开!AI 如何对爆款内容未卜先知?
  7. 关于查看网页源文件不显示源代码(打开的是桌面文件夹)的问题
  8. 演示:扩展ACL的配置与应用技巧
  9. MyBatis学习前篇
  10. 远程命令行添加(删除)注册表键值(远程打开)
  11. aspen怎么做灵敏度分析_灵敏度分析aspen
  12. 软件需求分析——非功能性需求
  13. linux 查找py文件命令_Linux常用命令(一)
  14. 物流快递商家寄件运力查询接口API代码实例
  15. 【3】IMU模块:PA-IMU-460 ROS驱动 + 与GNSS时间同步
  16. Vue手把手带你入门(一) nodejs安装配置以及vue-cli脚手架创建第一个vue项目(超级详细)
  17. 25款很好看的液晶数字字体下载
  18. 大班科学计算机的发明应用教案,大班科学教案:《中国古代四大发明》
  19. PAT乙级1005,用C语言进行编程,继续卡拉兹猜想
  20. 函数式编程与面向对象编程的比较

热门文章

  1. ege寻宝挑战游戏(C、C++)(大一上游戏项目)
  2. 苹果退款回调地址要求
  3. lazy(懒加载)模式和异步加载模式详解
  4. primary key与unique的区别
  5. 我的windows开发环境设定与日常使用指南
  6. 计算机机房电池后备时间规范,IDC机房UPS电池备用时间一般是多长时间?
  7. MVC与MVVM区别
  8. 阿里P9:做了6年架构设计,这次聊聊微服务与分布式事务细节
  9. C语言指针类型的意义
  10. linux安装——管理应用程序