まず、実験環境
1.1仮想マシン環境
a) Vmware版本:Vmware Workstation 12.5.7
b)のUbuntuのバージョン:9.10
C)カーネルのバージョン:2.6.31.14
バージョンツールチェーンD):腕のlinux-gccの4.3.2
1.2開発ボード
優れたFS2410開発ボード柳州、UDA1341サウンドカード
カーネルのバージョン:3.4.2
第二には、コードを変更します
2.1修正s3c2440_dma.c
1)静的揮発性構造体s3c_dma_regs * dma_regs。
読みます:
静的な揮発性構造体s3c_dma_regs * dma_regs_ch1。//再生のための
静的な揮発性構造体s3c_dma_regs * dma_regs_ch2。//キャプチャ用
したがって、変形に関連するすべての機能は、タイプsubstream->ストリームに応じて、DMA動作を登録し、対応するdma_regs_chxを選択するために、
2)preallocate_dma_buffer()を追加、修正s3c2440_dma_new()、および捕獲のためにサブ再生サブそれぞれ、DMAバッファを割り当て
3)(s3c2440_dma_openで変更playback_dma_info s3c2440_dma_infoグローバル変数以前に定義された構造体を)に
静的INT s3c2440_dma_open(構造体snd_pcm_substream *サブ)
{
構造体 * PRTD s3c2440_dma_info。
... PRTD = kzalloc(はsizeof(構造体 s3c2440_dma_info)、GFP_KERNEL)。 runtime-> PRIVATE_DATA = PRTD。
...
}
変更機能playback_dma_infoしたがって、すべてのアクセス、substream-> runtime-> PRIVATE_DATAへのアクセス
(デバッグ時に後添加することが発見された)2.2
参考カーネルs3c24xx-i2s.c、修正S3C2440-i2s.c:
)(s3c2440_snd_txctrl()、s3c2440_snd_rxctrl()を追加し、s3c2440_i2s_triggerを変更
静的 INT s3c2440_i2s_trigger(構造体 snd_pcm_substream *サブ、INT CMD、構造体 snd_soc_dai * DAI) { int型 RET = 0。 スイッチ(CMD){ ケース SNDRV_PCM_TRIGGER_START: ケース SNDRV_PCM_TRIGGER_RESUME: ケース SNDRV_PCM_TRIGGER_PAUSE_RELEASE。
// s3c2440_iis_start(); もし(substream->ストリーム== SNDRV_PCM_STREAM_CAPTURE) s3c2440_snd_rxctrl(1)。他 s3c2440_snd_txctrl(1); 休憩 ; ケース SNDRV_PCM_TRIGGER_STOP: ケース:SNDRV_PCM_TRIGGER_SUSPEND 場合 SNDRV_PCM_TRIGGER_PAUSE_PUSH: デフォルト: // s3c2440_iis_stop(); もし(substream->ストリーム== SNDRV_PCM_STREAM_CAPTURE) s3c2440_snd_rxctrl(0)。他 s3c2440_snd_txctrl(0); RET = -EINVAL。休憩 ; } exit_err:リターン RET。 }
第三に、デバッグ
1.コンパイル、ここでは言及されていないドライバをインストールし、以下を参照してください魏東山組込みLinuxビデオチュートリアルALSAの試運転からプロジェクトの_3戦闘フェイズ_書き込みのゼロ(ベース柳州優れたFS2410開発ボード、UDA1341サウンドカード)
2.実行はaplayのwindows.wav、ヘッドフォンは、高周波ノイズです!
/#猫の/ proc /割り込み見える中断DMAを発生しません
CPU0
25:0 S3C S3C2410、WDT
30:26510 S3C2410タイマーティックS3C
35:再生用2 S3Cのmyalsa
...
調査、中s3c2440_dma_hw_params()で追加する必要があります。
prtd-> phy_addr = substream-> dma_buffer.addr。
もともとplayback_dma_info.phy_addr、中s3c2440_dma_new()dma_alloc_writecombine直接出力パラメータが初期化されます。
playback_dma_info.virt_addr =(unsigned int型)dma_alloc_writecombine(pcm->カード- > DEV、s3c2440_dma_hardware.buffer_bytes_max、
&playback_dma_info.phy_addr、GFP_KERNEL)。
再コンパイルは、ドライバをロードし、再度はaplay windows.wavを行い、音を聞くことができ、最終的ヘッドフォン!
3. DOは-d 5 my1.wavをarecordが、5秒後に、何も起こりません!強制Ctrl-Cをした後、報告されました:
記録WAVE '標準入力':符号なし8ビット、レート8000 Hzの、モノラル
^信号割り込みによってCAborted ...
arecord:pcm_read:2031:読み取りエラー:システムコールに割り込み
中断することなく/#猫の/ proc /割り込みDMA
4. devmem2で登録DISRC1(0x4B000040)を確認し、DIDST1(0x4B000048)、IISCON(0x55000000)値:
(注:左の二重矢印を実行することであるarecord 権が実行される前に値をarecord後の値)
/#devmem2 0x4B000040
アドレス0x4B000040(0xb6fba040)の値:0x0の<==> 0x55000010
/#devmem2 0x4B000048
アドレス0x4B000048(0xb6f46048)の値:0x0の<==> 0x33B80000
/#devmem2 0x55000000
アドレス0x55000000(0xb6fc6000)の値: 0x100の<==> 0x122ビット[0] = 0 、すなわちインタフェースを無効にIISは、1の説明は、それに書いていません!
チェックインカーネルを音\ SOC \サムスン\ s3c24xx-i2s.cは、オペレーティングIISCONに加えて、だけでなく、IISMOD、IISFCOを動作させることがわかりました。
そして、参照カーネルs3c24xx-i2s.cは、S3C2440-i2s.cを変更しました:
s3c2440_snd_txctrlを追加()、s3c2440_snd_rxctrl()、その後、s3c2440_i2s_triggerを変更します()。
5.再コンパイル負荷ドライバ、およびarecord 5秒後に正常終了、エラーがない、再び5 my1.wavを-d行います。
IISCONは、の値を参照してください。
/#devmem2 0x55000000
アドレスAT 0x55000000値(0xb6fbd000):0x10B 、説明のビット[0] 1 を手に入れます!
/#猫の/ proc /割り込み
CPU0
25:0 S3C S3C2410、WDT
30:139493 S3C2410タイマーティックS3C
34:1のキャプチャのための私のalsa S3C 指示DMAが発生した割り込み
実行はaplayのmy1.wav、音を再生できます!成功の記録を説明!
6.でJZ2440、WM8976サウンドテストも成功しました。そして、カバー、過去にプログラム、ちょうど必要性のs3c2440_dma.cとs3c2440_iis.cコピーを変更します。
別館:ソース
第四に、参考文献
1.魏東山プロジェクトの戦闘の組込みLinuxビデオチュートリアル_3 ALSAサウンドカード
2.リチウム蘭渓 S3C24XX DMAソースコード解析フレームワーク
3. Linuxの3.4.2カーネルソース
4. S3C2440データシート