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驱动框架的更多相关文章

  1. ALSA声卡笔记3--ASoC驱动重要结构体关系图

    1.ASoC中重要的数据结构之间的关联方式 (1)Kernel-2.6.35-ASoC中各个结构的静态关系 ASoC把声卡实现为一个Platform Device,然后利用Platform_devic ...

  2. ALSA声卡16_编写ALSA声卡应用程序_学习笔记

    1.体验 (1)ALSA声卡使用体验:使用arecord录音,使用aplay播放,在Alsa-utils里面) 准备: cd linux-3.4.2 patch -p1 < ../linux-3 ...

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

    1.简单了解一下ASOC 在嵌入式系统里面的声卡驱动为ASOC(ALSA System on Chip) ,它是在ALSA 驱动程序上封装的一层   分为3大部分,Machine,Platform和C ...

  4. ALSA声卡笔记4-----体验声卡

    1 .配置内核支持UDA1341 (1)内核 解压内核并打上补丁 配置内核 platform 需要设置哪些配置项,先看一下platform,需要把S3c24xx-i2s.c文件配置上去,dma.c也要 ...

  5. Linux ALSA声卡驱动之五:移动设备中的ALSA(ASoC)

    转自http://blog.csdn.net/droidphone/article/details/7165482 1.  ASoC的由来 ASoC--ALSA System on Chip ,是建立 ...

  6. ALSA声卡驱动中的DAPM详解之七:dapm事件机制(dapm event)

    前面的六篇文章,我们已经讨论了dapm关于动态电源管理的有关知识,包括widget的创建和初始化,widget之间的连接以及widget的上下电顺序等等.本章我们准备讨论dapm框架中的另一个机制:事 ...

  7. ALSA声卡驱动中的DAPM详解之六:精髓所在,牵一发而动全身

    设计dapm的主要目的之一,就是希望声卡上的各种部件的电源按需分配,需要的就上电,不需要的就下电,使得整个音频系统总是处于最小的耗电状态,最主要的就是,这一切对用户空间的应用程序是透明的,也就是说,用 ...

  8. ALSA声卡驱动中的DAPM详解之五:建立widget之间的连接关系

    前面我们主要着重于codec.platform.machine驱动程序中如何使用和建立dapm所需要的widget,route,这些是音频驱动开发人员必须要了解的内容,经过前几章的介绍,我们应该知道如 ...

  9. ALSA声卡驱动中的DAPM详解之四:在驱动程序中初始化并注册widget和route

    前几篇文章我们从dapm的数据结构入手,了解了代表音频控件的widget,代表连接路径的route以及用于连接两个widget的path.之前都是一些概念的讲解以及对数据结构中各个字段的说明,从本章开 ...

随机推荐

  1. EasyRTMP+EasyRTSPClient实现的多路(支持断线重连)RTSP转RTMP直播推流工具

    本文转自EasyDarwin开源团队成员Kim的博客:http://blog.csdn.net/jinlong0603/article/details/73441405 介绍 EasyRTMP是Eas ...

  2. 跟着小程学微服务-Mock自动化系统的原理及实现

    一.前言 在之前的文章 http://blog.csdn.net/u013970991/article/details/54862772 中已经介绍了"自动化Mock系统0.9版本" ...

  3. DataFrame数据批量做线性回归

    我们通常用pandas读取csv文件为DataFrame数据格式,如下图,是部分县2001年到2009年的某种作物的产量数据.我们希望求得9年的增长趋势,即求一个一元线性回归模型的斜率,这个时候便可以 ...

  4. 实现Python代码发送邮件

    import smtplib from email.mime.text import MIMEText from email.utils import formataddr msg = MIMETex ...

  5. with异常

    with 语句 语法: with 表达式1 [as 变量1], 表达式2 [as 变量2], ...: 语句块 作用: 使用于对资源进行访问的场合,确保使用过程中不管是否发生异常都会执行必要的'清理操 ...

  6. C++调用SQLServer存储过程

    同事手头的C++工程中涉及SQLServer数据库的操作需要优化,说是测试调用存储过程失败,提示: 要了C++的源码: 折腾半天,最终定位问题,问题不在C++的代码,而是SQLServer的存储过程要 ...

  7. Codeforces 311B Cats Transport【斜率优化DP】

    LINK 题目大意 有一些猫,放在一些位置,人一步移动一个位置 给出每个猫出现的时间,每个人可以自由安排其出发时间,沿途已经出现的猫捡起,猫等待的时间是被减去的时间减去出现的时间 猫可以等人,人不能等 ...

  8. python3.x 类和对象

    python同样支持类和对象.在python3.x中没有了经典类,只有新式类,默认创建的就是新式类.具体的新式类与经典类的不同在python3.x中已经没有意义了. 类的定义和实例化 python定义 ...

  9. 重温CLR(十) 字符、字符串和文本处理

    本章将介绍.net中处理字符和字符串的机制 字符 在.NET Framewole中,字符总是表示成16位Unicode代码值,这简化了国际化应用程序的开发. 每个字符都表示成System.Char结构 ...

  10. 《DSP using MATLAB》示例Example7.25

    今天清明放假的第二天,早晨出去吃饭时天气有些阴,十点多开始“清明时节雨纷纷”了. 母亲远在他乡看孙子,挺劳累的.父亲照顾生病的爷爷…… 我打算今天把<DSP using MATLAB>第7 ...