linux驅動:音頻驅動(一)ALSA__linux

來源:互聯網
上載者:User

一、【基礎知識】

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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.