一、【基礎知識】
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