ALSALinux音效卡驅動的架構,下面基於linux-2.6.32描述下ALSA系統架構。ALSA系統可以分為alsa-lib alsa-driver,而alsa-driver又分為core層和底層硬體層。作為開發者,我們只需移植底層硬體層,根據自己硬體特性,實現底層的移 植。而core層基本屬於ALSA標準框架,不需要自己實現。介紹ALSA框架,下面是大體框架圖。

 

 

     如上圖所示,alsa驅動最終會被上層應用調用,這是通過alsa-lib實現的,alsa-libalsa-driver封裝了許多API,通過這 些API,上層應用可以調用到驅動層。而alsa-lib中的這些API,我們可暫時把他們當做一個黑盒子,裏面具體實現不需要去關注,下面以 linux-2.6.32ALSA調用函數關係說明其架構。先分析ALSA驅動的註冊過程。

一、ALSA驅動的註冊

 

    

 

註冊流程查看上圖,具體的註冊過程不在此贅述。

 

二、打開流程

 

ALSA驅動註冊完畢以後,當應用程式開始調用時,會有一個過程:打開設備、映射、設置硬體參數、準備工作、觸發資料流程。下圖為整個流程。

 

 

 

sep0611的是需要自己實現的底層驅動。

 

三、寫資料流程程

 

 

圖中應用程式通過ALSA-libAPI函數寫入資料,ALSA-lib調用等待函數等待底層 可寫。ALSA-lib通過poll系統調用進入底層驅動並將poll信號加入sleep佇列阻塞進程。硬體的中斷信號觸發底層驅動註冊的中斷處理函數, 中斷處理函數進而調用ALSA-driver中的函數判讀是否該寫。ALSA-driver中的函數再調用底層晶片硬體驅動獲取硬體當前資料大小。 ALSA-driver再判斷空閒資料區的大小,如果滿足條件就喚醒sleep佇列,poll信號從而被喚醒,進而返回給ALSA-libALSA- lib收到信號後再執行往buffer裏寫資料。
ALSA-lib
通過mmap機制將硬體申請的記憶體映射到用戶空間,從而應用程式只需調用ALSA-lib往相應位置寫資料,硬體就可以直接讀取了。如果 映射記憶體裏已有資料,通過DMA傳輸給codeccodec便開始讀取資料並進行解碼播放聲音了。經過測試,基於sep6200ALSA音效卡驅動工作 正常,既可以播放聲音也可以錄製。

 

原文  http://blog.csdn.net/daqing19860729/article/details/7473685

arrow
arrow
    全站熱搜

    立你斯 發表在 痞客邦 留言(0) 人氣()