linux驱动:音频驱动(一)ALSA

来源:互联网 发布:jstor数据库 编辑:程序博客网 时间:2024/06/10 23:37

一、【基础知识】

1、J2 《--HPR_OUT+HPL_OUT 《--  U13(TLV320AIC3104IRHBR)的HPROUT+HPLOUT

2、驱动源码

IPNC_RDK_V3.8.0.1/Source/ti_tools/ipnc_psp_arago/kernel/sound/soc/codecs/tlv320aic3x.c

3、依赖于I2C驱动

4、声卡驱动框架:ALSA(Advanced Linux Sound Architecture)

5、ALSA网站:http://www.alsa-project.org

6、结构体snd_card描述一个声卡设备

7、结构体snd_device描述子设备

8、声卡设备

lisa@ubuntu:kernel$ls /dev/snd/ -l

总用量 0

drwxr-xr-x  2 root root       60 十二 15 09:10 by-path

crw-rw---T+1 root audio 116,  6 十二 15 09:10 controlC0

crw-rw---T+1 root audio 116,  2 十二 15 09:10 midiC0D0

crw-rw---T+1 root audio 116,  5 十二 15 09:11 pcmC0D0c

crw-rw---T+1 root audio 116,  4 十二 15 09:36 pcmC0D0p

crw-rw---T+1 root audio 116,  3 十二 15 09:10 pcmC0D1p

crw-rw---T+1 root audio 116,  1 十二 15 09:10 seq

crw-rw---T+1 root audio 116, 33 十二 15 09:10 timer

lisa@ubuntu:kernel$ls /dev/snd/by-path/ -l

总用量 0

lrwxrwxrwx1 root root 12 十二 15 09:10pci-0000:02:03.0 -> ../controlC0

9、主设备号

Include/sound/core.h中

#defineCONFIG_SND_MAJOR    116 /* standardconfiguration */

10、sound目录说明:在《深度实践嵌入式。。。》640页

 

二、【驱动框架】

1、创建声卡:snd_card_new(linux 2.6.22以上被snd_card_create代替) --->

2、创建子设备:

snd_device_new(snd_pcm_new、snd_rawmidi_new、snd_ctl_new、snd_timer_new、snd_card_proc_new、snd_jack_new) --->

3、注册声卡:snd_card_register

 

三、【PCM功能】

PCM:脉冲编码调制,将模拟转换成数字

0、结构体包含关系

0.1struct snd_pcm --> snc_pcm_str --> snd_pcm_substream --> (snd_pcm_ops+ snd_pcm_runtime)

0.2snd_pcm_runtime --> snd_pcm_hardware  

 

1、结构体描述PCM:struct snd_pcm

2、注册pcm:snd_pcm_new

3、pcm流与pcm子流:snc_pcm_str、snd_pcm_substream

4、子流中的重要结构体

4.1snd_pcm_ops:pcm流的操作方法需要在具体声卡中实现

4.2snd_pcm_runtime:硬件描述、中断回调、DMA缓冲区及私有数据等成员需要在具体声卡中实现

4.2.1snd_pcm_hardware:硬件描述

5、pcm设备文件的建立

5.1 描述逻辑设备的结构体:snd_minor

5.2 建立过程:

snd_card_register--> snd_pcm_register  -->snd_pcm_new --> snd_pcm_dev_register --> snd_register_device_for_dev  --> (snd_kernel_minor获取设备号+device_create创建设备节点)

 

6、PCM设备文件的访问

6.1 文件操作f_ops的指定

操作集合是snd_pcm_f_ops数组中的一项,定义在sound/core/pcm_native.c中

6.2 注册字符设备

alsa_sound_init--> register_chrdev(major, “alsa”, &snd_fops)

snd_fops中只有一个snd_open函数,该函数根据次设备号从snd_miors数组中取出对应的snd_minor对象,并将文件的操作集合(file->f_op)用该对象的f_ops成员替换,具体到PCM设备(一个snd_minor对象),该文件操作集合就是snd_pcm_f_ops中的相应操作

 

四、【声卡控制项】

1、控制项创建

1.1 描述控制项结构体:snd_kcontorl(include/sound/control.h中)

1.2 创建控制项函数:snd_ctl_new1

1.3 将控制项添加到它所属的声卡中:snd_ctl_add

1.4 控制项回调函数:info、get、put

 

2、 Cotrol设备建立

snd_card_create--> snd_ctl_new --> snd_ctl_dev_register-->snd_register_device_for_dev  -->(snd_kernel_minor获取设备号+device_create创建设备节点)

 

3、Cotrol设备文件的访问

过程与PCM相同,不同点:将文件操作集合替换成snd_ctl_f_ops

0 0
原创粉丝点击