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. 2017.10.23 Arduino Atmel EFM32低功耗监测

    mark:因为最近一直调试(维护)客户的EFM32,和其他系列的Atmel芯片.对atmel不熟悉,做点功课. 1. 自建Arduino 最小系统(原来树莓派都是Atmel的芯片) http://ww ...

  2. vue.js 源代码学习笔记 ----- instance init

    /* @flow */ import config from '../config' import { initProxy } from './proxy' import { initState } ...

  3. css移动元素的几种方法

    一.当然是元素设定为postion: absolute, 然后控制 left, top 位置 二.元素增加overflow属性,然后设置元素的scrollLeft, scrollRight当做滚动条来 ...

  4. windows7 下安装python3.6开发环境

    所有的软件都放在百度云盘里: 链接: https://pan.baidu.com/s/1rux8sDK9thhbZ1qjwQg6kA 密码: iq4c 1. 安装python3.6.5 安装的时候要把 ...

  5. Java泛型常见面试题

    怀着崇拜的心情读完这篇文章,却发现作者不是原创,而不标注转载~所以转载地址不详~ 1. Java中的泛型是什么 ? 使用泛型的好处是什么? 这是在各种Java泛型面试中,一开场你就会被问到的问题中的一 ...

  6. NSPort

    NSPort是一个描述通信通道的抽象类.通信发生在两个NSPort对象之中,这两个NSPort对象通常属于不同的进程或任务.分发对象系统使用NSPort对象来返回或发送NSProtMessage对象. ...

  7. 设计模式 - 代理模式(Proxy Pattern)

    一.引言 在软件开发过程中,有些对象有时候会由于网络或其他的障碍,以至于不能够或者不能直接访问到这些对象,如果直接访问对象给系统带来不必要的复杂性,这时候可以在客户端和目标对象之间增加一层中间层,让代 ...

  8. Android学习笔记之Toast详解

    1. 贴一段Android API-Toast Toast public class Toast  extends Object java.lang.Object ↳ android.widget.T ...

  9. 【解题报告】CF Round #320 (Div. 2)

    Raising Bacteria 题意:盒子里面的细菌每天会数量翻倍,你可以在任意一天放任意多的细菌,最后要使得某天盒子里面的细菌数量等于x,求至少要放多少个细菌 思路:显然,翻倍即为二进制左移一位, ...

  10. appium-java,连接真机启动微信

    1.启动appium 2.设置信息 3.设置IP和端口 4.appium连接手机,微信中打开debugx5.qq.com,信息->TBS settings->是否打开TBS内核Insper ...