platform->driver->ops->pointer
所以我們必須提供這個函數(見下文s3c2440_dma_pointer)
*/
if (playback_dma_info.be_running)
{
/* 如果還有數據
* 1. 加載下一個period
* 2. 再次啟動DMA傳輸
*/
load_dma_period();
s3c2440_dma_start();
}
}
3.7 實現s3c2440_dma_pointer
(參考 soundsocsamsungdma.c 的 dma_pointer)
static snd_pcm_uframes_t s3c2440_dma_pointer(struct snd_pcm_substream *substream)
{
unsigned long res;
res = playback_dma_info.dma_ofs; //注:從上文s3c2440_dma2_irq可以看出,playback_dma_info.dma_ofs是以playback_dma_info.buffer_size(即App需要使用的緩沖區大小)為邊界的
/* we seem to be getting the odd error from the pcm library due
* to out-of-bounds pointers. this is maybe due to the dma engine
* not having loaded the new values for the channel before being
* called... (todo - fix )
*/
if (res >= snd_pcm_lib_buffer_bytes(substream)) {
if (res == snd_pcm_lib_buffer_bytes(substream))
res = 0;
}
//snd_pcm_update_hw_ptr0需要我們返回以frame為單位的當前DMA緩沖區中已傳輸的位置
return bytes_to_frames(substream->runtime, res);
}
四、總結
1. 驅動分配DMA緩沖區
soc_probe
snd_soc_register_card
snd_soc_instantiate_cards
snd_soc_instantiate_card
soc_probe_dai_link
soc_new_pcm
s3c2440_dma_platform. pcm_new (即s3c2440_dma_new)
2. app調open,最終調用到s3c2440_dma_open
snd_soc_set_runtime_hwparams(substream, &s3c2440_dma_hardware); //設置屬性
request_irq 注冊中斷
3. app 調用ioctl(SNDRV_PCM_IOCTL_HW_PARAMS),最終調用s3c2440_dma_hw_params
根據params設置DMA
4. app調ioctl(SNDRV_PCM_IOCTL_PREPARE),最終調用s3c2440_dma_prepare
/* 復位各種狀態信息 */
/* 加載第1個period */
load_dma_period();
5. app調用ioctl(SNDRV_PCM_IOCTL_WRITEI_FRAMES)
把數據傳到DMA緩沖區,
啟動傳輸,最終調用s3c2440_dma_trigger(SNDRV_PCM_TRIGGER_START)啟動DMA傳輸
6. 傳輸完一個period后,會觸發中斷,進入s3c2440_dma2_irq
/* 更新hw_ptr等信息,
* 并且判斷:如果buffer里沒有數據了,則調用trigger來停止DMA
* 如果還有數據,則:
* 1. 加載下一個period
* 2. 再次啟動DMA傳輸
*/
五、參考資料
1. 韋東山 嵌入式Linux視頻教程_3期項目實戰之ALSA聲卡:第2課第1.1_17節_ALSA聲卡10_從零編寫之數據傳輸
2. DroidPhone 《Linux ALSA 聲卡驅動》
3. 李蘭溪 S3C24XX DMA框架源碼分析
上一篇:U-Boot移植
下一篇:ALSA聲卡_從零編寫之調試(基于優龍FS2410開發板,UDA1341聲卡)
- 熱門資源推薦
- 熱門放大器推薦
設計資源 培訓 開發板 精華推薦
- NCP110AFCT105T2GEVB:NCP110 WLCSP4 評估板
- AD9200SSOP-EVAL,用于評估 AD9200 完整 10 位、20 MSPS A/D 轉換器的評估板
- 基于DA14580_ADXL362原理圖(小米手環方案)
- 用于儀表的 2.7 至 11V 儀表放大器
- 可調臺燈
- 針對交流性能進行優化的 18 位、250 kSPS 數據采集系統
- 200W Natural Interleaving 轉換模式 PFC 反激 LED 驅動器參考設計
- DC2732A,LTC2949 電流、電壓和演示板高壓電池組的充電監控器
- LT1185CT 折返式電流調節器限制的典型應用電路
- AD8615AUJZ-R2單電源緩沖DAC輸出運算放大器典型應用電路