S3C2410通過IIS總線與音頻芯片UDA1380進行通信
S3C2410通過IIS(Inter-IC Sound)總線與音頻控制芯片UDA1380進行通信。放音時發(fā)送數(shù)據(jù)到UDA1380的DATAI管腳,錄音時從UDA1380的DATAO管腳接收數(shù)據(jù),其數(shù)據(jù)傳輸方式為DMA方式。
IIS用于傳輸音頻數(shù)據(jù),IIC用于控制1380芯片。
IIS有pclk,sclk,lrclk,sdi,sdo。
PCLK(通俗來說就是聲音的采樣頻率如:44.1K,它的產(chǎn)生是有2410系統(tǒng)時鐘分頻得到的。
具體過程:2410主頻202M,它的APH總線頻率是202/4=50M,在經(jīng)過IIS的PSR(分頻比例因子)得到的一個頻率用于IIS時鐘輸出也可以說是同步)。
這個時鐘是輸出給1380的,對于1380來說它的采樣頻率即:AD的頻率是可以編程控制的。
資料中表明:1可以直接用IIS穿過來的時鐘就是上面解釋的,1可以用PLL分頻后的時鐘來確定AD的頻率,DA同理就是了。
注意:如果是雙聲道,上面的就要變化下了,呵呵各位大哥應(yīng)該都比我明白。
SCLK:在IIS中有2個PSR控制起的,一個用于外部B,另個用于內(nèi)部A(SCLK)形成時鐘用于
PCLK8或者16倍頻 (對把這里有點不敢確定不過應(yīng)該沒錯就是了)
LR就是左右PHE的切換信號了
SD就是數(shù)據(jù)輸出線
//////////////////////////////
IIC就只有2條線了,論壇里面有人分析過了就不說了
////////////////////////////////
呵呵IISIIC,DMA寄存器的意思當(dāng)然要明白拉
///////////////////////////////
DMA
其實三星公司已經(jīng)把很多東西屏蔽了當(dāng)然是為了我門應(yīng)用比較簡單了呵呵,
從程序上來說只要明白幾個函數(shù)就可以了:
{
1,s3c2410_request_dma("I2SSDI", s->dma_ch, NULL, audio_dmain_done_callback
2,s3c2410_free_dma(s->dma_ch);
3,s3c2410_dma_queue_buffer(s->dma_ch, (void *) b,/////////////添加DMA BUF
b->dma_addr, b->size, DMA_BUF_WR);
}
這樣幾個就可以完好DMA了呵呵,
這里有個回掉函數(shù)的感念要引起注意?。?BR>MEANING:驅(qū)動提供的一個函數(shù)結(jié)構(gòu)地址給DMA的,當(dāng)然DMA發(fā)送完或者接受完觸發(fā)這個函數(shù)的響應(yīng)
驅(qū)動程序的分析
FUNCTION:因為很多東西華恒已經(jīng)介紹了就不在寫了
希望喜歡看驅(qū)動的朋友仔細(xì)明白audio_buf_t,audio_stream_t并引起重視;;;
1static void audio_clear_buf(audio_stream_t * s)
如果你明白了audio_buf_t,audio_stream_t就很簡單了,就是把指針?biāo)傅牡刂返膬?nèi)存釋放這里用的是FOR來實現(xiàn)的;;;;
2static int audio_setup_buf這里是用結(jié)構(gòu)提管理的概念實現(xiàn)的內(nèi)河內(nèi)存的申請的,
NOTE:用audio_buf_t來管理一段內(nèi)存,在用audio_stream_t來管理N個audio_buf_t
聽說這樣的好處是提高了音頻給CPU的負(fù)擔(dān)呵呵 鬼知道是不是真的
//////////////////////////
這里有個信號燈的概念要大家注意下:
我們從信號量數(shù)據(jù)結(jié)構(gòu)開始,它定義在include/asm/semaphore.h中:
struct semaphore {
atomic_t count;
int sleepers;
wait_queue_head_t wait;
}
down()操作可以理解為申請資源,up()操作可以理解為釋放資源,因此,信號量實際表示的是資源的數(shù)量以及是否有進程正在等待。在 semaphore結(jié)構(gòu)中,count相當(dāng)于資源計數(shù),為正數(shù)或0時表示可用資源數(shù),-1則表示沒有空閑資源且有等待進程。而等待進程的數(shù)量并不關(guān)心。這種設(shè)計主要是考慮與信號量的原語相一致,當(dāng)某個進程執(zhí)行up()函數(shù)釋放資源,點亮信號燈時,如果count恢復(fù)到0,則表示尚有進程在等待該資源,因此執(zhí)行喚醒操作。一個典型的down()-up()流程是這樣的:
down()-->count做原子減1操作,如果結(jié)果不小于0則表示成功申請,從down()中返回;
-->如果結(jié)果為負(fù)(實際上只可能是-1),則表示需要等待,則調(diào)用__down_fail();
__down_fail()調(diào)用__down(),__down()用C代碼實現(xiàn),要求已不如down()和__down_fail()嚴(yán)格,在此作實際的等待
//////////////////////////
3 void audio_dmaout_done_callback
這個就是當(dāng)DMA接收后要喚醒等待的smdk2410_mixer_read
4static void audio_dmain_done_callback
和上面的一樣
5int audio_sync
為安全保證,當(dāng)系統(tǒng)掉點的時候,強烈執(zhí)行這個函數(shù)來保存RAM TO FLASH
6ssize_t smdk2410_audio_write
這里用到阻塞和信號燈的概念,就是把用戶空間的內(nèi)存數(shù)據(jù)送到DMA傳輸隊列中等待傳輸去把
7 smdk2410_mixer_read和6一樣
8smdk2410_mixer_ioctl
這里主要是利用IIC總線控制,沒什么好說的
判斷COMMAND,在把ARG傳近來和傳出去
9iispsr_value(int s_bit_clock, int sample_rate
通過s3c2410_get_bus_clk獲得總線時鐘,在通過sample_rate來計算比例因子并返回
10audio_set_dsp_speed
通過9返回的值負(fù)給已經(jīng)映射了的寄存器
12init_module
這個華恒書寫的很明白了呵呵
看過之后的感受:
1、內(nèi)存管理重中之重
2、描述對象結(jié)構(gòu)體要仔細(xì)的理解各個與的含義
呵呵感覺有點進步了,不過更多的是悲哀
昨天晚上已經(jīng)實現(xiàn)了MADPLAY的音量控制,不過發(fā)現(xiàn)驅(qū)動中沒有重地音和高音的控制呵呵要自己來寫幾句程序了
評論