ALSA声卡笔记1---ALSA驱动框架
1、声卡驱动程序sound.c
(1)入口函数里通过register_chrdev()函数注册file_operations 结构体
(2)file_operations 结构体,里面只有open函数,没有发现读写函数,可知open函数是起中转作用的函数,肯定会找到一个新的file_operations 结构体
(3)调用过程
以minor变量保存传入节点inode结构体的次设备号
以minor为下标在结构体数组中取出一项,让mptr指针指向此项
表示取出mptr结构体指针里的file_operations
结构体调用file_operations
结构体里面的open函数
2、谁来设置snd_minors[]结构体数组
(1)谁来设置snd_minors[]结构体数组
函数里面有数组项snd_minors外,为了mdev或udev能自动创建设备节点,我们有class_create()函数创建类,下面创建设备device_create(),类在Sound_
core.c入口函数里面被创建,sound.c的入口函数里面注册字符设备函数,snd_register_device_for_dev()函数里面创建声卡逻辑设备时有device_create()
(2)snd_register_device_for_dev()函数被谁调用(有两路调用)
一路(声卡设备的控制接口)
另一路(声卡设备的数据接口)
两路分析之---第一路
3、第一路调用分析
(1)snd_register_device()被谁调用(Core.h)
(2)创建声卡设备的控制接口函数snd_ctl_dev_register()被谁调用(control.c)
(3)由上面可知函数snd_ctl_create()在init.c程序的
中被调用
(4)由可知创建一个snd_card结构体
两路分析之---第二路
4、第二路调用分析
(1)创建声卡设备的数据接口函数snd_pcm_dev_register()函数被谁调用(Pcm.c)
(2)创建一个新的PCM设备函数_snd_pcm_new()被谁调用
(3)snd_pcm_new()被谁调用
某个声卡的驱动程序
5、代码框架重新梳理(第1路)
(1)snd_card_create()函数(Init.c)
除了创建一个snd_card结构体外,还会调用snd_ctl_create()
这表示所有声卡里面,必定会有控制接口
(2)创建控制类的逻辑设备snd_ctl_create()函数
里snd_device_new()函数可以看出,对于同一个声卡,里面可能有多个逻辑设备,device应该就是逻辑设备的意思(有control、pcm等),参数SNDRV_DEV_CONTROL表示其类别,最终snd_ctl_dev_register()被调用
(3)snd_ctl_dev_register()函数
里面的snd_register_device()函数注册一个file_operations 结构体snd_ctl_f_ops
(4)snd_register_device()函数
(5)snd_register_device_for_dev()函数
填充结构体数组snd_minors[]
6、代码框架重新梳理(第2路)
(1)snd_pcm_new()调用
(2)_snd_pcm_new()调用 (创建播放流和录音流)
创建声卡的逻辑设备,这个逻辑设备最后会导致snd_pcm_dev_register()函数被调用
(3)snd_pcm_dev_register()函数
(4)snd_pcm_f_ops结构体数组,第0项表示播放,第1项表示录音,在Pcm.c里
7、创建设备节点的名字的取值(第1路)
(1)snd_register_device_for_dev()函数里的device_create()函数,其中“%s”来源于name,这个name是snd_register_device_for_dev()函数传进来的参数
(2)snd_register_device_for_dev()函数被 snd_register_device()函数调用,也就是snd_register_device_for_dev()函数里面的name参数是 snd_register_device()函数传过来的
(3)snd_register_device()函数被 snd_ctl_dev_register()函数调用,由下面可以看出name参数根据可知为controlC%i,C表示Card声卡,其中i值来源于右边的cardnum,这个cardnum来源于snd_card结构体中的成员。而snd_card结构体来源于snd_device结构体的snd_card结构体。
8、创建设备节点的名字的取值(第2路)
(1)snd_register_device_for_dev()函数里的device_create()函数,其中“%s”来源于name,这个name是snd_register_device_for_dev()函数传进来的参数
(2)snd_register_device_for_dev()函数被snd_pcm_dev_register()函数调用
里面的str参数正是name参数,下面有pcmC%iD%ip和pcmC%iD%ic,C表示Card的意思,%i表示哪一个声卡,D表示哪一个声卡下的哪一个逻辑设备,p表示播放,c表示录音
9、总结(如何写alsa声卡驱动)
(1)构造snd_card结构体,snd_card_create()构造snd_card结构体并自动创建控制接口。调用函数snd_ctrl_create
(2)初始化;如snd_pcm_new(),创建逻辑设备(播放设备或录音设备)
(3)注册 snd_card_register
转自:http://blog.csdn.net/qingkongyeyue/article/details/52328991
ALSA声卡笔记1---ALSA驱动框架的更多相关文章
- ALSA声卡笔记3--ASoC驱动重要结构体关系图
1.ASoC中重要的数据结构之间的关联方式 (1)Kernel-2.6.35-ASoC中各个结构的静态关系 ASoC把声卡实现为一个Platform Device,然后利用Platform_devic ...
- ALSA声卡16_编写ALSA声卡应用程序_学习笔记
1.体验 (1)ALSA声卡使用体验:使用arecord录音,使用aplay播放,在Alsa-utils里面) 准备: cd linux-3.4.2 patch -p1 < ../linux-3 ...
- ALSA声卡笔记2---ASoC驱动框架
1.简单了解一下ASOC 在嵌入式系统里面的声卡驱动为ASOC(ALSA System on Chip) ,它是在ALSA 驱动程序上封装的一层 分为3大部分,Machine,Platform和C ...
- ALSA声卡笔记4-----体验声卡
1 .配置内核支持UDA1341 (1)内核 解压内核并打上补丁 配置内核 platform 需要设置哪些配置项,先看一下platform,需要把S3c24xx-i2s.c文件配置上去,dma.c也要 ...
- Linux ALSA声卡驱动之五:移动设备中的ALSA(ASoC)
转自http://blog.csdn.net/droidphone/article/details/7165482 1. ASoC的由来 ASoC--ALSA System on Chip ,是建立 ...
- ALSA声卡驱动中的DAPM详解之七:dapm事件机制(dapm event)
前面的六篇文章,我们已经讨论了dapm关于动态电源管理的有关知识,包括widget的创建和初始化,widget之间的连接以及widget的上下电顺序等等.本章我们准备讨论dapm框架中的另一个机制:事 ...
- ALSA声卡驱动中的DAPM详解之六:精髓所在,牵一发而动全身
设计dapm的主要目的之一,就是希望声卡上的各种部件的电源按需分配,需要的就上电,不需要的就下电,使得整个音频系统总是处于最小的耗电状态,最主要的就是,这一切对用户空间的应用程序是透明的,也就是说,用 ...
- ALSA声卡驱动中的DAPM详解之五:建立widget之间的连接关系
前面我们主要着重于codec.platform.machine驱动程序中如何使用和建立dapm所需要的widget,route,这些是音频驱动开发人员必须要了解的内容,经过前几章的介绍,我们应该知道如 ...
- ALSA声卡驱动中的DAPM详解之四:在驱动程序中初始化并注册widget和route
前几篇文章我们从dapm的数据结构入手,了解了代表音频控件的widget,代表连接路径的route以及用于连接两个widget的path.之前都是一些概念的讲解以及对数据结构中各个字段的说明,从本章开 ...
随机推荐
- WiFi无线网络参数 802.11a/b/g/n 详解
转载自:WiFi无线网络参数 802.11a/b/g/n 详解 如转载侵犯您的版权,请联系:2378264731@qq.com 802.11a/b/g/n,其实指的是无线网络协议,细分为802.11a ...
- 【转】react-native开发混合App-github开源项目
http://www.lcode.org/study-react-native-opensource-one/ http://gold.xitu.io/entry/575f498c128fe10057 ...
- TreeMap实现原理及源码分析
TreeMap是一个有序的key-value集合,基于红黑树(Red-Black tree)实现.该映射根据其键的自然顺序进行排序,或者根据创建时提供的Comparator进行排序. 对于TreeMa ...
- 使用nrm管理npm仓库
使用nrm管理npm仓库 用npm装包的时候,经常碰到太慢或者npm官网被墙的情况,有时候凑合一下就改一下 "~/.npmrc" 文件,但是经常改来改去也挺麻烦的,于是找到了可以使 ...
- Android内存优化(四)解析Memory Monitor、Allocation Tracker和Heap Dump
相关文章 Android性能优化系列 Java虚拟机系列 前言 要想做好内存优化工作,就要掌握两大部分的知识,一部分是知道并理解内存优化相关的原理,另一部分就是善于运用内存分析的工具.本篇就来介绍内存 ...
- Swift中的本地化实现
1. 确保localization中添加了多语言2. 添加localisable.strings文件 3.选择这个文件,勾选多语言即可4.打开localisable.strings文件,添加一些测试字 ...
- iOS如何限制使用SDK的版本? 解决iOS项目的版本兼容问题
更新 2015-11-16 感谢微博好友@zyyy_000的评论,补充了为什么要在+ (void)load方法里面做Method Swizzling. 前言 最近,在做项目时,因为某种原因,突然要 ...
- 让ASP.NET第一次请求不变慢
网页开发者早期最常遇到一个问题,当网站布署到IIS时候,每当IIS或是Application Pool重启后,第一位进入网站的使用者,其体验往往第一个反应就是网站很慢,然后就一直询问IT为什么网站这么 ...
- 很让人受教的提高php代码质量的方法
1.不要使用相对路径 常常会看到: require_once('../../lib/some_class.php'); 该方法有很多缺点: 它首先查找指定的php包含路径, 然后查找当前目录. 因此会 ...
- hihocoder1618 单词接龙
#1618 : 单词接龙 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 给定一个单词字典和一个起始字母.小Hi需要从起始字母开始,每次再加上一个字母,生成长度为2.3. ...