ALSA声卡笔记2---ASoC驱动框架

1、简单了解一下ASOC

在嵌入式系统里面的声卡驱动为ASOC(ALSA System on Chip) ,它是在ALSA 驱动程序上封装的一层   分为3大部分,Machine,Platform和Codec ,三部分的关系如下图所示:其中Machine是指我们的开发板,Platform是指Soc,而Codec是指编解码器(如uda1341)



(1)machine:单板相关内容,开发板所用的主芯片(Platform是指Soc)、编解码芯片(codec)是哪一个。主芯片里的IIS接口(DAI(全称Digital Audio Interface)接口)接到哪里去.CPU DAI是哪一个,codec DAI是哪一个,DMA是哪个

(2)platform:平台相关内容。IIS(DAI)(设置接口)和DMA(传输数据)

(3)codec:DAI和控制接口(控制音量)

内核带有uda1341的驱动程序,但是没有wm8976的驱动程序

2、以uda1341驱动分析

(1)machine  :对应内核中的S3c24xx_uda134x.c程序 (构造snd_soc_card结构体)

主要关心snd_soc_card结构体里面的snd_soc_dai_link结构体,这个结构体指明了用哪一款platform,用哪一款codec,用里面的哪一个DAI、DMA等。

Machine相关

3、S3c24xx_uda134x.c分析

(1)定义了一个platform_driver结构体

当内核里有同名的平台驱动(platform_driver)结构体和平台设备(platform_device)结构体,probe函数就会被调用


(2)入口函数

通过宏module_plateform_driver定义


在Platform_device.h定义


module_driver()的宏定义,关键字_init表示入口函数,关键字_exit表示出口函数


(3)归纳:注册platform_driver,也就是平台驱动部分

module_platform_driver(xxx);
最终展开后就是如下形式:
static int __init xxx_init(void)
{
        return platform_driver_register(&xxx);
}
module_init(xxx_init);
static void __exit xxx_init(void)
{
        return platform_driver_unregister(&xxx);
}
module_exit(xxx_exit);

由上述定义可知,module_platform_driver()宏的作用就是定义指定名称的平台设备驱动注册函数和平台设备驱动注销函数,并且在函数体内分别通过platform_driver_register()函数和platform_driver_unregister()函数注册和注销该平台设备驱动
有平台驱动(platform_driver)结构体,在内核里会有同名的平台设备(platform_device)结构体

(4)probe函数分析

初始化了一些引脚

分配一个名为soc-audio的平台设备,有平台设备,必定有平台驱动,以soc-audio搜索,在Soc-core.c函数里面有对应的平台驱动



设置平台设备的私有数据,私有数据设置为snd_soc_card结构体



添加平台设备



(5)snd_soc_card结构体

4、Mach-mini440.c分析同名的platform_device结构体(在内核搜索名字))

(1)同名的platform_device结构体


5、Soc-core.c分析

(1)platform_driver结构体,名字对应probe函数的platform_driver结构体。当存在同名的平台设备和平台驱动时,又一probe函数被调用


(2)入口函数

注册平台驱动结构体soc_driver


(3)probe函数

从平台设备里面得到一个snd_soc_card结构体

然后注册snd_soc_card结构体


6、snd_soc_card结构体

(1)snd_soc_card结构体


(2)dai_link(根据名字找到对应的驱动程序)

根据codec_name知道用哪一个编解码芯片

codec_dai_name表示codec芯片里的哪一个接口,有些编解码芯片有多个接口

cpu_dai_name表示2440那一侧的dai接口(IIs接口),

platform_name表示DMA 


(3)operation结构体


platform 相关

I2S相关

7、plarform 划分

(1)分为DMA和CPU DAI两部分,

根据cpu_dai_name找到对应的驱动程序S3c24xx-i2s.c(核心是and_soc_dai_driver结构体,设置CPU这一侧的I2S控制器)

根据platform_name用于指定用哪一个DMA,搜索platform_name(samsang-audio),找到对应的驱动程序Dma.c,(核心是snd_soc_platform_driver结构体)

8、S3c24xx-i2s.c分析

(1)定义平台驱动结构体,有平台驱动结构体,必有平台设备结构体,根据同名搜索在Devs.c里有,有同名时,probe函数被调用


(2)probe函数

注册cpu_dai(Digital Audio Interface)


里面的s3c24xx_i2s_dai结构体

下面的playback用于播放,capture用于录音,最大/最少所支持的通道channels_max和channels_min,采样频率rates,支持的格式formats


还有operation结构体(里面有相关函数)

hw_params是设置硬件参数函数

set_fmt是设置格式函数

set_clkdiv是设置分频系数


9、Devs.c分析

(1)平台设备结构体

要使平台设备结构体起作用,要有相应的平台驱动


DMA相关

10、Dma.c分析

(1)平台驱动结构体

probe函数只有在有同名的probe_device才会被调用


(2)probe函数

注册一个snd_soc_platform_driver结构体


snd_soc_platform_driver结构体,用于数据传输


snd_pcm_ops结构体,包含相关的操作函数


11、Devs.c分析

(1)平台设备结构体


codec相关

12、codec

根据code_name找到编解码芯片,在udall34x.c,

控制接口:构造snd_soc_codec_driver结构体

DAI:snd_soc_dai_driver结构体

13、udal34x.c分析

(1)平台驱动结构体

里面的probe函数只有在内核有同名的平台设备的时候才被调用


(2)probe函数

注册


根据下面可知上面参数的类型


snd_soc_codec_driver结构体

对应L3接口,读写里面的寄存器


snd_soc_dai_driver结构体

这个名字对应的是snd_soc_card结构体里面的dai_link里的名字成员,具有录音和播放功能,还有一个operation结构体


codec芯片I2S 接口操作函数

digital_mute是静音函数,set_sysclk是设置时钟函数


14、Mach-mini2440.c分析

(1)platform_device结构体



转自:http://blog.csdn.net/qingkongyeyue/article/details/52349120


转载于:https://www.cnblogs.com/alan666/p/8311872.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/571387.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

举例说明语言接触会造成哪些结果_语言学概论全真模拟演练(二)

第一部分选择题(30分)一、单项选择题(本大题共20小题,每小题1分,共20分。在每小题列出的四个备选项中只有一个是符合题目要求的,请将其代码填写在题后的括号内,错选、多选或来选均无分。)1.语言符号可变性的根本原因在于语言符号的…

linux下ceontab不起作用,linux下crontab 不能执行的原因

1.相关sh文件没有x权限2.相关sh文件中,不包含如下的信息:[oracleleiredhat u01]$ cat job.shexport ORACLE_BASE/u01/app/oracleexport ORACLE_HOME/u01/app/oracle/oracle/product/10.2.0/db_1PATH/u01/app/oracle/oracle/product/10.2.0/db_1/bin:$PAT…

drive下载 synology_群晖 Synology Drive 的安装与使用

首先进入“套件中心”,然后在搜索框中输入“drive”,出现的结果中能看到需要安装的套件了,点击“立即安装”即可,剩下就是确认和下一步,如图:当然我们也要安装安装完后该套件会四个选项:立即打开…

dev_open linux,linux 伪终端设备 /dev/ptmx

伪终端(pseudoterminal): ptmx, pts (伪终端master和伪终端slave)./dev/ptmx用于创建伪终端主从设备对.当我们用open打开/dev/ptmx设备后, 返回主设备的文件描述符,并且在/dev/pts/目录下创建一个伪终端从设备.在成功打开/dev/ptmx后, 可以通过函数ptsname()来获取从设备的path…

fetch git pull 切换_git fetch git pull

解析.git文件夹进入正题之前,我们先来看看.git文件夹1.config配置文件[core]repositoryformatversion 0filemode truebare falselogallrefupdates truesharedRepository group[remote "origin"]url https://xxx/xxx/xxx.gitfetch refs/heads/*:ref…

C语言对stm32f103程序,STM32F103WIFI程序C语言

《STM32F103WIFI程序C语言》由会员分享,可在线阅读,更多相关《STM32F103WIFI程序C语言(33页珍藏版)》请在人人文库网上搜索。1、实用标准文案 AP模式 AP的SSID : ATWAP11BG,LAUVAN(SSID),CHI AP的KEY: : ATWAKEYWPA2PSK,AES,22222222 AP模式&…

python之路_自定义属性、json及其他js补充

一、自定义属性 我们知道,在前端页面渲染的过程中,我们可能会需要用到一些后端传来的参数,这种参数的获取我们一般是通过模板语言渲染得到。但是当这些参数是在js文件中被用到(js代码若是单独以文件形式被引用,模板语言…

python中类型错误、计数不采用关键字的错误怎么改_Python设计错误

你要求链接或其他来源,但实际上没有。这些信息散布在许多不同的地方。什么才是真正构成设计错误的因素?您是只考虑语言定义中的语法和语义问题,还是包括诸如平台和标准库问题以及特定实现问题等实用问题?您可以说,从性…

C语言打印日历总结报告,C语言打印日历

应同学的要求,写了个日历,输入年份,输出12个月份的日历表,代码如下 :#includebool isLeap(int year){if((year%40 && year%100!0) || (year%4000))return 1;elsereturn 0;}void printCalendar(int year){int d…

电文的编码和译码c语言实现,电文的编码及译码.doc

数据结构课程设计题目:电文的编码与译码院系:班级:学号:姓名:2014-2015年度 第1学期目录一.题目:电文的编码与译码3二.设计目标3三.问题描述3四.需求分析3五&…

java中二进制怎么说_面试常用:说清楚Java中synchronized和volatile的区别

回顾一下两个关键字:synchronized和volatile1、Java语言为了解决并发编程中存在的原子性、可见性和有序性问题,提供了一系列和并发处理相关的关键字,比如synchronized、volatile、final、concurren包等。2、synchronized通过加锁的方式&#…

python 日记 day4。

1.为何数据要分类 数据是用来表示状态的,不同的状态应该用不同类型的数据来表示。 2.数据类型 数字 字符串 列表 元组 字典 集合 列表:列表相比于字符串,不仅可以储存不同的数据类型,而且可以储存大量数据,32位python的…

c语言复合语句开始标记字符,国家开放大学C语言程序设计A第一次形考任务及答案(2020年整理)(7页)-原创力文档...

;学 海 无 涯 ;;学 海 无 涯 ;学 海 无 涯 ;学 海 无 涯二、判断题(共 60 分,每小题 2 分。叙述正确则回答“是”,否则回答“否”)题目 21C 语言中的每条简单语句以分号作为结束符。对 题目 22C 语言中的每条复合语句以花括号作为结束符。错 题目 23在 C…

搜索不到投屏设备怎么办_电视投屏搜索不到设备解决方案

手机投屏电视想必许多人都用过,但是仍然有些人不会投屏,或者说投屏不成功。今天小编就给大家讲解,手机投屏电视,搜索不到设备怎么解决呢?在解决这个问题之前,我们先了解一下,手机投屏电视需要哪…

准确率(Accuracy), 精确率(Precision), 召回率(Recall)和F1-Measure(对于二分类问题)

首先我们可以计算准确率(accuracy),其定义是: 对于给定的测试数据集,分类器正确分类的样本数与总样本数之比。也就是损失函数是0-1损失时测试数据集上的准确率。 下面在介绍时使用一下例子: 一个班级有20个女生,80个男生。现在一个分类器需要…

js与c语言互相调用,Objc与JS间相互调用

过去3、4年都在进行跨平台的混合应用开发,但一直没有系统梳理跨平台技术的底层原理,趁新工作未正式入职,这里整理一下。跨平台的一种实现是基于webview。所谓webview,实质是在原生app中打开一个内嵌浏览器,具体到iOS平…

swift 拖动按钮_Swift - 单元格滑动按钮库SwipeCellKit使用详解1(基本用法)

在之前的两篇文章中我分别介绍了如何使用 iOS8和 iOS11提供的相关代理方法,来实现 tableView单元格滑动事件按钮:但它们局限性还是比较大的,前者只能实现尾部按钮,且按钮只能使用文字无法使用图片。而后者对系统版本又要求比较高。…

MySQL数据库优化(五)

MySQL配置优化 通过配置my.cnf使数据库达到优化的目的。 1、innodb的缓冲池配置 innodb_buffer_pool_size  通常配置服务器内存的60%~70% 2、innodb log缓存配置 innodb_log_buffer_size  这个不宜配置太大,因为日志缓存每秒刷新一次 3、配置缓冲池个数 innodb_…

qt用c语言编程 pdf下载文件,Qt 使用Poppler实现pdf阅读器的示例代码

开发环境 Qt5.5.1、Qt Creator 3.5.1Qt实现pdf阅读器和MFC实现pdf阅读器,其实原理都是差不多的。注意:这个是MinGW版本的Qt,也就是运行在GCC环境下的库,里面只包含 *.dll 和 *.a 。如果是Vistual Studio版本的Qt ,那么…

redis 分布式锁 看门狗_分布式锁Redisson的使用,看门狗机制

Redisson简介Redisson是一个在Redis的基础上实现的Java驻内存数据网格(In-Memory Data Grid)。它不仅提供了一系列的分布式的Java常用对象,还提供了许多分布式服务。其中包括(BitSet, Set, Multimap, SortedSet, Map, List, Queue, BlockingQueue, Deque, BlockingD…