本文主要接着讲,ALSA驱动框架中,内核调用到驱动的全过程
十.从内核调用到驱动的全过程
1.Open /dev/dsp
Open操作,通过前面所说的结构图,我们知道,当内核调用open函数时, 首先调用的是soundcore_open,通过__look_for_unit找到chain[3],即dsp这一sound_unit指针,然后重新赋值文件的操作指针为dsp设备文件的操作指针。
这一方法也对其他的文件适用,例如,对于/dev/mixer,调用open操作时,一样调用soundcore_open,然后接下来的操作就是重新定义文件的操作指针为mixer文件的操作指针,并且调用mixer_ops中的open 函数,
以后对文件的操作就是调用更新后的ops了。
这里调用的是pcm_oss.c中的open,具体流程图如下,
具体的,
Cpu_dai.ops->startup 为at91_ssc_startup 该函数主要是设置传输方向的mask(串口只允许单向传输)
Platform->pcm_ops->open 为at91_pcm_open 该函数主要设置at91_pcm_hardware,包括pcm_info,period_bytes_min,period_bytes_max,
periods_min,periods_max,buffer_bytes_max等,
Codec_dai->ops.startup 为NULL
Machine->ops->startup 为epayment_snd_startup,该函数数主要设置cpu_dai的clk为系统时钟AT91_SYSCLK_MCK,设置codec_dai的clk为PCMXXX_SYSCLK,,然后使能codec_dai的clk
2.Open /dev/mixer
Open /dev/mixer的大致过程与上述open /dev/dsp类似,只是后面的操作指针为mixer ops
具体的就是调用mixer_oss.c中的snd_mixer_oss_open,该函数大致就是完成了struct snd_mixer_oss_file *fmixer