static int __init audio_init_dma(audio_stream_t * s, char *desc)
{
int ret ;
s3c2410_dmasrc_t source;
int hwcfg;
unsigned long devaddr;
dmach_t channel;
int dcon;
unsigned int flags = 0;
if(s->dma_ch == DMACH_I2S_OUT){//modify by zhb
channel = DMACH_I2S_OUT;
source = S3C2410_DMASRC_MEM;
hwcfg = 3;
devaddr = 0x55000010;
dcon = 0xa0800000;
flags = S3C2410_DMAF_AUTOSTART;
if(s3c24xx_dma_map(channel) != 0)//add by zhb
return 1;//error
s3c2410_dma_devconfig(channel, source, hwcfg, devaddr);
s3c2410_dma_config(channel, 2,
mbt safiri black 新词语“中华丽利坚”的背地, dcon);
s3c2410_dma_set_buffdone_fn(channel, audio_dmaout_done_callback);
s3c2410_dma_setflags(channel, flags);
ret = s3c2410_dma_request(s->dma_ch, &s3c2410iis_dma_out,
mbt sapatu black, NULL);
s3c2410_dma_config(channel, 2, dcon);//add
s->dma_ok = 1;
return ret;
}
else if(s->dma_ch == DMACH_I2S_IN){
channel =DMACH_I2S_IN;
source =S3C2410_DMASRC_HW;
hwcfg =3;
devaddr = 0x55000010;
dcon = 0xa2900000;
flags = S3C2410_DMAF_AUTOSTART;
if(s3c24xx_dma_map(channel) ,
mbt shoes austin texas nZT-女人最大的资本是教养!= 0)//add by zhb
return 1;//error
s3c2410_dma_devconfig(channel,
mbt rocker shoes discount, source, hwcfg, devaddr);
s3c2410_dma_config(channel, 2, dcon);
s3c2410_dma_set_buffdone_fn(channel, audio_dmain_done_callback);
s3c2410_dma_setflags(channel, flags);
ret = s3c2410_dma_request(s->dma_ch, &s3c2410iis_dma_in,
mbt shoes chapa, NULL);
s3c2410_dma_config(channel, 2, dcon);//add
s->dma_ok =1;
return ret ;
}
else
return 1;
}
在ret = s3c2410_dma_request(s->dma_ch, &s3c2410iis_dma_out, NULL);之后增加
s3c2410_dma_config(channel,
mbt women's sport 2, 2, dcon);//add
由于经由s3c2410_dma_request()调用之后,对dma中的存放器dcon进行了赋值,这样就把本来设的dcon中的值冲掉了,因而要从新调用s3c2410_dma_config(channel, 2, dcon)一次.
if(s3c24xx_dma_map(channel) != 0)//add by zhb
return 1;//error
这一句的意思是先对dma通道进行隐射,
mbt karani 吴新涛,否则下面一开端初始化的值不空间存储,只有映射后的通道才有空间.该函数是我在dmarch/arm/plat-s3c24xx/dma.c中增添的,其内容为
arch/arm/plat-s3c24xx/dma.c
int s3c24xx_dma_map(dmach_t channel)
{
struct s3c2410_dma_chan *chan;
chan = s3c2410_dma_map_channel(channel);
if(chan == NULL)
{
printk("can't not map the channel");
return -EBUSY;
}
else return 0;
}
EXPORT_SYMBOL(s3c24xx_dma_map);
还必需extern出来
include/asm-arm/arch-s3c2410/dma.h
extern int s3c24xx_dma_map(dmach_t channel);
还有就是下面的修改在dma.c中有两处
s3c2410_dma_ctrl(chan->number ,
mbt tupu coffee, S3C2410_DMAOP_START);
修正为
s3c2410_dma_ctrl(chan->number | DMACH_LOW_LEVEL, S3C2410_DMAOP_START);