新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > S3C2410通過IIS總線與音頻芯片UDA1380進行通信

        S3C2410通過IIS總線與音頻芯片UDA1380進行通信

        作者: 時間:2013-12-05 來源:網絡 收藏

        通過IIS(Inter-IC Sound)總線與音頻控制芯片進行通信。放音時發送數據到的DATAI管腳,錄音時從的DATAO管腳接收數據,其數據傳輸方式為DMA方式。
        IIS用于傳輸音頻數據,IIC用于控制1380芯片。
        IIS有pclk,sclk,lrclk,sdi,sdo。

        PCLK(通俗來說就是聲音的采樣頻率如:44.1K,它的產生是有2410系統時鐘分頻得到的。
        具體過程:2410主頻202M,它的APH總線頻率是202/4=50M,在經過IIS的PSR(分頻比例因子)得到的一個頻率用于IIS時鐘輸出也可以說是同步)。
        這個時鐘是輸出給1380的,對于1380來說它的采樣頻率即:AD的頻率是可以編程控制的。
        資料中表明:1可以直接用IIS穿過來的時鐘就是上面解釋的,1可以用PLL分頻后的時鐘來確定AD的頻率,DA同理就是了。

        注意:如果是雙聲道,上面的就要變化下了,呵呵各位大哥應該都比我明白。
        SCLK:在IIS中有2個PSR控制起的,一個用于外部B,另個用于內部A(SCLK)形成時鐘用于
        PCLK8或者16倍頻 (對把這里有點不敢確定不過應該沒錯就是了)
        LR就是左右PHE的切換信號了
        SD就是數據輸出線

        //////////////////////////////
        IIC就只有2條線了,論壇里面有人分析過了就不說了
        ////////////////////////////////
        呵呵IISIIC,DMA寄存器的意思當然要明白拉
        ///////////////////////////////
        DMA
        其實三星公司已經把很多東西屏蔽了當然是為了我門應用比較簡單了呵呵,
        從程序上來說只要明白幾個函數就可以了:
        {
        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了呵呵,
        這里有個回掉函數的感念要引起注意啊:
        MEANING:驅動提供的一個函數結構地址給DMA的,當然DMA發送完或者接受完觸發這個函數的響應


        驅動程序的分析
        FUNCTION:因為很多東西華恒已經介紹了就不在寫了
        希望喜歡看驅動的朋友仔細明白audio_buf_t,audio_stream_t并引起重視;;;
        1static void audio_clear_buf(audio_stream_t * s)
        如果你明白了audio_buf_t,audio_stream_t就很簡單了,就是把指針所指的地址的內存釋放這里用的是FOR來實現的;;;;
        2static int audio_setup_buf這里是用結構提管理的概念實現的內河內存的申請的,
        NOTE:用audio_buf_t來管理一段內存,在用audio_stream_t來管理N個audio_buf_t
        聽說這樣的好處是提高了音頻給CPU的負擔呵呵 鬼知道是不是真的
        //////////////////////////
        這里有個信號燈的概念要大家注意下:
        我們從信號量數據結構開始,它定義在include/asm/semaphore.h中:

          struct semaphore {
           atomic_t count;
           int sleepers;
           wait_queue_head_t wait;
          }
          
          down()操作可以理解為申請資源,up()操作可以理解為釋放資源,因此,信號量實際表示的是資源的數量以及是否有進程正在等待。在 semaphore結構中,count相當于資源計數,為正數或0時表示可用資源數,-1則表示沒有空閑資源且有等待進程。而等待進程的數量并不關心。這種設計主要是考慮與信號量的原語相一致,當某個進程執行up()函數釋放資源,點亮信號燈時,如果count恢復到0,則表示尚有進程在等待該資源,因此執行喚醒操作。一個典型的down()-up()流程是這樣的:
          
          down()-->count做原子減1操作,如果結果不小于0則表示成功申請,從down()中返回;
          -->如果結果為負(實際上只可能是-1),則表示需要等待,則調用__down_fail();
          __down_fail()調用__down(),__down()用C代碼實現,要求已不如down()和__down_fail()嚴格,在此作實際的等待
        //////////////////////////
        3 void audio_dmaout_done_callback
        這個就是當DMA接收后要喚醒等待的smdk2410_mixer_read
        4static void audio_dmain_done_callback
        和上面的一樣
        5int audio_sync
        為安全保證,當系統掉點的時候,強烈執行這個函數來保存RAM TO FLASH
        6ssize_t smdk2410_audio_write
        這里用到阻塞和信號燈的概念,就是把用戶空間的內存數據送到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返回的值負給已經映射了的寄存器

        11smdk2410_audio_ioctl
        12init_module
        這個華恒書寫的很明白了呵呵
        看過之后的感受:
        1、內存管理重中之重
        2、描述對象結構體要仔細的理解各個與的含義
        呵呵感覺有點進步了,不過更多的是悲哀
        昨天晚上已經實現了MADPLAY的音量控制,不過發現驅動中沒有重地音和高音的控制呵呵要自己來寫幾句程序了


        關鍵詞: S3C2410 IIS總線 UDA1380

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 台中县| 新田县| 襄汾县| 湘西| 长葛市| 乾安县| 宁强县| 新津县| 香港 | 当涂县| 无棣县| 沁源县| 安吉县| 宁南县| 沾益县| 甘泉县| 治多县| 河北区| 通渭县| 盈江县| 祁连县| 紫云| 林州市| 梅州市| 上饶市| 遵化市| 仁布县| 龙泉市| 宣武区| 保山市| 长春市| 神木县| 奉新县| 犍为县| 勃利县| 安阳市| 花垣县| 会东县| 南充市| 班戈县| 富蕴县|