娇小w搡bbbb搡bbb,《第一次の人妻》,中国成熟妇女毛茸茸,边啃奶头边躁狠狠躁视频免费观看

ALSA聲卡_從零編寫之調試(基于優龍FS2410開發板,UDA1341聲卡)

發布者:心有所屬最新更新時間:2024-07-11 來源: elecfans關鍵字:調試 手機看文章 掃描二維碼
隨時隨地手機看文章

一、實驗環境

1.1 虛擬機環境

    a) Vmware版本:Vmware Workstation 12.5.7

    b) Ubuntu版本:9.10

    c) 內核版本:2.6.31.14

    d) toolchain版本:arm-linux-gcc 4.3.2

1.2 開發板

    優龍FS2410開發板,UDA1341聲卡

    內核版本:3.4.2

二、調試過程記錄

1. 編譯聲卡驅動,修改語法錯誤

2. 配置內核去掉原來的聲卡驅動

    -> Device Drivers

    -> Sound card support

    -> Advanced Linux Sound Architecture

    -> ALSA for SoC audio support

        < > ASoC support for Samsung // CONFIG_SND_SOC_SAMSUNG 這項去掉勾選后,下面這項會連帶自動消失

        < > SoC I2S Audio support UDA134X wired to a S3C24XX // CONFIG_SND_SOC_SAMSUNG_S3C24XX_UDA134X // s3c24xx_uda134x.c

3. 編譯內核,然后通過nfs把新的內核下載到開發板,并啟動

4. 把新的聲卡驅動通過nfs拷貝到根文件系統里,然后安裝

    insmod /alsa/driver/myalsa/platform/s3c2440_iis.ko

    insmod /alsa/driver/myalsa/platform/s3c2440_dma.ko

    insmod /alsa/driver/myalsa/codec/uda1341.ko

    insmod /alsa/driver/myalsa/machine/s3c2440_uda1341.ko

    mkdir /dev/snd

    cd /dev/snd/

    ln -s /dev/controlC0

    ln -s /dev/pcmC0D0p

    ln -s /dev/pcmC0D0c

    cd /

    為了方便,把以上這些語句放到prepare.sh里:


#!/bin/sh

#insmod alsa/driver/myalsa/platform/s3c2440_iis.ko

#insmod alsa/driver/myalsa/platform/s3c2440_dma.ko #這樣寫的話,執行時會報錯:can’t insert s3c2440_iis.ko,invalid parameter c2440_iis.ko,原因待查

#insmod alsa/driver/myalsa/codec/uda1341.ko        #同上

#insmod alsa/driver/myalsa/machine/s3c2440_uda1341.ko #同上

mkdir -p /dev/snd && cd /dev/snd

cd /alsa/driver/myalsa/platform/  #得按照這種套路寫才行?

insmod s3c2440_iis.ko

insmod s3c2440_dma.ko

cd /alsa/driver/myalsa/codec/

insmod uda1341.ko

#insmod wm8976.ko  #在JZ2440開發板上,codec驅動用wm8976.ko

cd /alsa/driver/myalsa/machine/

insmod s3c2440_uda1341.ko

cd /dev/snd && ln -s /dev/controlC0 && ln -s /dev/pcmC0D0p && ln -s /dev/pcmC0D0c

cd /


    執行prepare.sh,報錯:

        soc-audio: coherent DMA mask is unset

        asoc: platform pcm constructor failed

        asoc: can’t create pcm 100ask_UDA1341:-12

    解決辦法:

        參考內核自帶的soundsocsamsungdma.c 的dma_new,在我們的s3c2440_dma.c的s3c2440_dma_new()中添加:

        if (!card->dev->dma_mask)

            card->dev->dma_mask = &dma_mask;

        if (!card->dev->coherent_dma_mask)

            card->dev->coherent_dma_mask = DMA_BIT_MASK(32);

5. aplay windows.wav后kernel oops了:

        LR指向snd_pcm_info,PC指向0

    猜測是在snd_pcm_info里調用了某個不存在的子函數,推測是在這里出錯:substream->ops->ioctl(substream, SNDRV_PCM_IOCTL1_INFO, info);

    在《第2課第1.1_17節_ALSA聲卡05_ASoC驅動框架》里,曾分析過這個ioctl的賦值是在soc_new_pcm里:

        soc_pcm_ops->ioctl = platform->driver->ops->ioctl;

    遂查看s3c2440_dma_ops,發現確實沒有ioctl,遂參考內核的soundsocsamsungdma.c,加上 .ioctl = snd_pcm_lib_ioctl,

6. 再次aplay windows.wav,又kernel oops:

        pc is at copy_from_user

        backtrace:

        snd_pcm_lib_write_transfer

        copy_from_user

   查snd_pcm_lib_write_transfer:


...

else {

char *hwbuf = runtime->dma_area + frames_to_bytes(runtime, hwoff);

if (copy_from_user(hwbuf, buf, frames_to_bytes(runtime, frames)))

    return -EFAULT;

}

    而runtime->dma_area的賦值是在:


(sound/soc/samsung/dma.c)


dma_hw_params


    snd_pcm_set_runtime_buffer(substream, &substream->dma_buffer); //substream->dma_buffer是在dma_new里分配的


        struct snd_pcm_runtime *runtime = substream->runtime;


        runtime->dma_area = bufp->area; 


    查我們的s3c2440_dma_new,發現確實沒有提供這個信息給內核,遂加上:


        buf->area = playback_dma_info.virt_addr;


        buf->bytes = playback_dma_info.buf_max_size;


7. 重新編譯安裝驅動,再次aplay windows.wav,這次沒有oops,但報:aplay: pcm_write:1939:write error: Input/output error


    aplay windows.wav &  讓它后臺運行


    cat /proc/interrupts


    發現中斷一次都沒有發生,難辦了?!


8. 用devmem2來查看相關寄存器有沒有被正確的設置:


   注:我在實驗中沒有用二期課程中的寄存器編輯器ker_wr和regeditor,因為在編譯ker_rw的時候,報了一些錯誤,比如:


     error: asm/arch/regs-gpio.h: No such file or directory


     error: implicit declaration of function 'class_device_create'


     原因應該是原代碼是針對2.6的內核編譯的,和3.4.2內核不兼容。修改了代碼之后,雖然編譯通過,而且也能運行,但讀不出寄存器的值,原因待查。


    / # devmem2 0x4B000080

     /dev/mem opened.

     Memory mapped at address 0xb6f9a000.

     Value at address 0x4B000080 (0xb6f9a080): 0x33B00000 //讀DMA2_BASE_ADDR寄存器, 結果是有值的

     / # devmem2 0x55000000

     /dev/mem opened.

     Memory mapped at address 0xb6f50000.

     Value at address 0x55000000 (0xb6f50000): 0x100  //讀IISCON寄存器,結果都是0 (bit8的1是默認值,代表Left/Right channel index (Read only))


    原因是:s3c2440的IIS的時鐘沒有使能?(排查思路是怎樣的?是憑經驗么?)


    解決辦法:在s3c2440_iis_init()里加入:


    clk = clk_get(NULL, 'iis');


    clk_enable(clk);


    clk_put(clk);


    疑問:為什么裸板程序沒有問題?


    答案:因為裸板程序開始運行時,板子的時鐘都是默認使能的,而linux啟動后,為了省電,默認都是關閉的!


9. 重新編譯安裝驅動,再次aplay windows.wav,仍然沒有聲音,


    cat /proc/interrupts


    中斷還是沒有發生


    / # devmem2 0x55000000

     /dev/mem opened.

     Memory mapped at address 0xb6fd8000.

     Value at address 0x55000000 (0xb6fd8000): 0x1A2 //讀IISCON寄存器,bit0(iis_start)=0,表明iis傳輸沒有啟動

    解決辦法:


    s3c2440_iis.c加入s3c2440_i2s_trigger、s3c2440_iis_start、s3c2440_iis_stop


10. 重新編譯安裝驅動,再次aplay windows.wav,這次終于有聲音了!


image

   最后一個改進:


    雖然能播放聲音,但會有周期性雜音。視頻略去排查過程,直接上結論:load_dma_period()里,要把dma_regs->dcon的bit22設為1:noreload


    不知道排查思路是怎樣的?


    推測是由于period_size比較小,導致音頻數據被分割成了多塊來傳輸,并且由于dcon的bit[22] =0即autoreload模式,所以每次傳完一個period的數據后,dma會自動將src、dst、TC的值加載到CURR_SRC、CURR_DST、CURR_TC,并開始一次新的DMA傳輸(所以如果新的數據還來不及加載到CURR_SRC,則導致相當于重復播放上個period的數據)。而這之后才調用了DMA中斷服務(硬件總是比軟件快),進而load_dma_period()加載下一個period的數據到DMA的CURR_SRC。因此出現了播放時有周期性的雜音。


    如果把s3c2440_dma_hardware修改一下(僅用于實驗),使其能在一個period里播完windows.wav,則也能消除周期性的雜音:


// .buffer_bytes_max = 128*1024,

// .period_bytes_min = PAGE_SIZE,

// .period_bytes_max = PAGE_SIZE*2,

.buffer_bytes_max = 1024*1024,

.period_bytes_min = 512*1024,

.period_bytes_max = 512*1024,

    另外,如果用內核自帶的驅動,則不會出現上述問題。經初步分析,因為它利用了dcon的autoload功能,并且設計了一個比較復雜的框架,使得當一個period正在傳輸時,下一個period準備就緒。這樣就能平滑的播放出聲音。


三、參考資料


1. 韋東山 嵌入式Linux視頻教程_3期項目實戰之ALSA聲卡:第2課第1.1_17節_ALSA聲卡11_從零編寫之調試


2. 李蘭溪  S3C24XX DMA框架源碼分析


3. rushzengjianmei  Alsa period_size/periods/buffer_size計算邏輯


關鍵字:調試 引用地址:ALSA聲卡_從零編寫之調試(基于優龍FS2410開發板,UDA1341聲卡)

上一篇:ALSA聲卡_從零編寫之數據傳輸(基于優龍FS2410開發板,UDA1341聲卡)
下一篇:ALSA聲卡_從零編寫之添加錄音功能(基于優龍FS2410開發板,UDA1341聲卡)

推薦閱讀最新更新時間:2025-05-23 05:10

ALSA聲卡09_從零編寫之參數設置_學習筆記
1、參數設置分析 (1)open: soc_pcm_open 依次調用cpu_dai, dma, codec_dai, machine的open或startup函數 只在dma的open函數里添加參數相關的代碼 (2)SNDRV_PCM_IOCTL_HW_PARAMS: soc_pcm_hw_params 依次調用machine,codec_dai,cpu_dai,platform(dma)的hw_params函數 在uda1341.c, s3c2440-iis.c里實現hw_params函數(把裸板程序里面的相關代碼移過來) (s3c2440-dma.c 主要涉及數據傳輸,在下一節實現hw_params函數) (3)
[單片機]
<font color='red'>ALSA</font><font color='red'>聲卡</font>09_從零編寫之參數設置_學習筆記
調試分析之 根據內核報錯信息棧信息分析錯誤
錯誤驅動源文件: 加載錯誤驅動程序 1 root@EasyARM-iMX257 /mnt/nfs/module/37_debug_err_led# echo 1 /dev/errdule/37_debug_err_led# echo 1 /dev/err_led_dev 2 le kernel paging request at virtual address 43fac060 3 pgd = c3b8c000 4 *pgd=00000000 5 Internal error: Oops: 5 PREEMPT 6 Modules linked in: err_led gpio 7 C
[單片機]
mini2440下調試IIC時序問題總結與分析
說明:mini2440平臺,wince6.0系統,vs2005 經過幾個月的學學停停,終于在wince下加入了GPIO模擬的IIC總線,實現了IIC的移植,IIC的芯片是SHT21溫濕度芯片。 之所以搞了這么久沒搞定IIC,是在ADS下很早實現了,可就是添加到系統就總不對!示波器抓取發現時序在芯片復位后就不對了,找來找去都不知道怎么回事!這下就陷入了 糾結中,還是那種死循環的糾結,怎么都繞不出來! 網上發帖,網友們也支了很多招,感謝你們!jonsenwu網友的話提示了我!驅動程序加到系統里面,系統的調度需要時間,驅動程序使用的延時會出現延長的情況!根據他的提示,也進一步向他請教,這里特別感謝他!對驅動程序的優先級進行調整,使其在運
[單片機]
PLC項目調試之信號干擾案例分析
【導讀】PLC項目調試過程中什么七里八怪的問題都有可能遇到,信號干擾就是其中一種,遇到了問題原因還不好查找。今天分享兩個案例,希望對大家有所幫助。 實例A (一)現象說明: 西門子PLC中AO點發出一路4-20mA電流控制信號,輸出至西門子變頻器,無法控制變頻器啟動。 (二)故障查找: (1)疑似AO板卡問題,用萬用表測量4-20mA輸出信號,信號是正常的。 (2)然后懷疑是變頻器控制信號輸入端有了問題,換了一臺同型號變頻器,問題仍然如此。 (3)用一臺手持式信號發射器做4-20mA輸出信號源,輸出標準電流信號至變頻器,這下變頻器啟動了,因而我們排除了模擬量輸出板卡和變頻器的故障。 (4)由此推測是變頻器的干擾信號傳導至
[嵌入式]
PLC項目<font color='red'>調試</font>之信號干擾案例分析
CKS32F103C8T6最小系統板調試記錄——ISP下載(串口下載)
ISP下載,和我們用STC89C52系列單片機一樣。需要兩根信號線。要進行ISP下載,可按照如下檢查: 1.檢查BOOT0=1,BOOT1=0 2.檢查TXD、RXD是否已經交叉連接 3.檢查軟件端口號 4.如果前3步都正確無誤,檢查芯片上的BOOT0,和BOOT1的電壓值。 BOOT0 2V,BOOT1 0.3V。如圖 我買到的最小系統板居然給BOOT0,和BOOT1都串聯了100K的電阻。導致BOOT0上的電壓只有0.9V(正常值應該是2V以上),所以無法切換到ISP模式下載,導致我浪費了幾天時間。-_-
[單片機]
CKS32F103C8T6最小系統板<font color='red'>調試</font>記錄——ISP下載(串口下載)
兆馳半導體新進Unimax設備經調試產出外延片成功點亮,Mini LED擴產提速
江西兆馳半導體有限公司消息顯示,5月27日,該公司新進Unimax設備經調試產出外延片成功點亮,標志著兆馳半導體擴產計劃順利進行,Mini LED擴產提速。 據悉,自簽約以來,兆馳半導體擴產計劃進展順利,首批設備于上月進廠調試,5月27日正式點亮。經此項驗證,后續設備將開始分批交貨進廠,同時與之配套的平片、PSS及芯片設備也將按計劃擴產。 官方消息顯示,此前公布的100萬片產能,預計將在2023年第一季度達成。 本輪擴產所選購的Unimax外延設備是國內領先的外延MOCVD設備,在波長均一性方面表現優秀,為外延片參數更好地匹配Mini/Micro LED新型顯示芯片工藝需求做好充分準備,同時具備更穩定的量產性能。
[手機便攜]
全球最大100MW級全釩液流電池儲能調峰電站進入單體模塊調試階段
  近日,由我所儲能技術研究部(DNL17)李先鋒研究員團隊提供技術支撐的全球最大100MW/400MWh級全釩液流電池儲能電站完成主體工程建設,并進入單體模塊調試階段。   該電站為“200MW/800MWh大連液流電池儲能調峰電站國家示范項目”的一期項目,是國家能源局批復的首個100MW級大型電化學儲能國家示范項目。項目由大連融科儲能技術發展有限公司(以下簡稱“融科儲能”)提供電池系統,大連恒流儲能電站有限公司建設和運營,采用我所自主研發的全釩液流電池儲能技術。   項目預計六月完成并網調試,將對緩解大連市乃至遼寧省電網調峰壓力、提高大連南部地區供電可靠性、加快新能源發展發揮重要作用。同時,該項目將會推進我國大規模儲
[新能源]
日產2000萬顆COF-IC芯片載帶,常州欣盛25億元項目設備調試
據中吳網報道,近日,常州欣盛半導體技術股份有限公司(簡稱“常州欣盛”)占地130畝的新廠房正式建成投用。目前,常州欣盛高清顯示用驅動芯片項目設備已調試到位,達產后日產量將達2000萬顆COF-IC芯片載帶。 常州欣盛高清顯示用驅動芯片項目作為2020年江蘇省重大項目之一,計劃總投資25億元,年度計劃投資10億元。一期年產柔性LCD驅動IC超微電路載帶芯片及封裝測試16.2億顆;二期年產顯示驅動芯片10億顆。 據常州日報3月報道,常州欣盛半導體技術股份有限公司進一步加大投資,啟動高清顯示用驅動芯片項目。該項目技術一舉打破日本長期技術壟斷局面,填補了我國“十三五”集成電路產業COF顯示驅動芯片空白,目前已得到國家集成電路產業投資基
[手機便攜]
小廣播
設計資源 培訓 開發板 精華推薦

最新單片機文章
何立民專欄 單片機及嵌入式寶典

北京航空航天大學教授,20余年來致力于單片機與嵌入式系統推廣工作。

 
EEWorld訂閱號

 
EEWorld服務號

 
汽車開發圈

 
機器人開發圈

電子工程世界版權所有 京ICP證060456號 京ICP備10001474號-1 電信業務審批[2006]字第258號函 京公網安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 祁连县| 万全县| 齐河县| 普陀区| 怀安县| 都兰县| 舞阳县| 巴彦淖尔市| 永济市| 武宣县| 宁海县| 土默特左旗| 梓潼县| 广汉市| 泊头市| 连江县| 江孜县| 平舆县| 阆中市| 启东市| 德昌县| 将乐县| 遂平县| 永兴县| 探索| 曲阜市| 依安县| 措勤县| 兴化市| 毕节市| 十堰市| 大理市| 抚宁县| 淮南市| 汨罗市| 宝鸡市| 高清| 米泉市| 中山市| 滕州市| 泽州县|