转载地址:https://blog.csdn.net/u010168781/article/details/54561657
一、【基础知识】
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