主题 : oss驱动dsp读函数的疑惑 复制链接 | 浏览器收藏 | 打印
Just do it
级别: 侠客
UID: 2754
精华: 4
发帖: 66
金钱: 2435 两
威望: 873 点
贡献值: 40 点
综合积分: 212 分
注册时间: 2008-12-07
最后登录: 2016-04-13
楼主  发表于: 2009-09-09 21:56

 oss驱动dsp读函数的疑惑

最近在浏览shinelk大侠的大侠关于OSS音频驱动,
对于dsp读函数的不理解,请shinelk大侠解释一下,谢了
在写函数中:
smdk2410_audio_write中,
(chunksize = s->fragsize - b->size;
        if (chunksize > count)
            chunksize = count;
        DPRINTK("2: write %d to %d\n", chunksize, s->buf_idx);
        if (copy_from_user(b->start + b->size, buffer, chunksize)) {
    
由于b->size在audio_setup_buf()中被设为0
memset(s->buffers, 0, sizeof(audio_buf_t) * s->nbfrags);
所以第一次进行放音时,数据从用户空间写到音频DMA映射缓冲区,然后被
DMA到声卡。
现在的问题是:
当在但在读函数中smdk2410_audio_read,有点看不懂了,因为初始化b->size为0,
那chunksize为0,怎么进行录音呢?音频缓冲区的数据时codec经过ADC后,
DMA进去的,是不是哪里更新了b->size?

chunksize = b->size;
if (chunksize > count)
chunksize = count;
DPRINTK("read %d from %d\n", chunksize, s->buf_idx);
//---------------------------add by shinelk---------------------------------------
if(audio_channels == 1){
    buf = (b->start + s->fragsize - b->size);
    for(i = 0;i < chunksize/2;i += 2){
        for(j = 0;j < 2;j++)
            tmp[i+j] = *(buf + i*2 +j);
    }
    if (copy_to_user(buffer,tmp,chunksize/2))
级别: 新手上路
UID: 7025
精华: 0
发帖: 29
金钱: 255 两
威望: 114 点
贡献值: 0 点
综合积分: 58 分
注册时间: 2009-06-29
最后登录: 2012-05-03
1楼  发表于: 2009-09-09 23:06
b->size在dma传输完成后的回调函数中被更新,还有一点b->size并不是指缓冲区的大小,而是相对缓冲区的偏移量.
static void audio_dmain_done_callback(struct s3c2410_dma_chan *ch, void *buf, int size, enum s3c2410_dma_buffresult result) {
       audio_buf_t *b = (audio_buf_t *) buf; 
       DPRINTK("audio_dmain_done_callback\n"); 
       b->size = size;
 
      up(&b->sem); 
       wake_up(&b->wait); 

这里有一篇很详细的IIS音频驱动分析:http://blog.mcuol.com/User/hlm15/Article/7702_1.htm
我增加的部分主要是为了符合Android音频输入的格式(8000Hz,16位,单声道).
[ 此帖被shinelk在2009-09-09 23:17重新编辑 ]
Just do it
级别: 侠客
UID: 2754
精华: 4
发帖: 66
金钱: 2435 两
威望: 873 点
贡献值: 40 点
综合积分: 212 分
注册时间: 2008-12-07
最后登录: 2016-04-13
2楼  发表于: 2009-09-10 09:22
恩,懂了,谢谢版主