이 소스는 이솝소스에서 참조하여 작성한것입니다.
아래의 IIS 레지스터에 write를 하고 read하면 write한 값이 읽히는데
딜레이(10Us)를 주거나 두번째 read를 하면 레지스터값이 reset value로 읽힙니다.
조언 부탁합니다.
void
start_aesop2440_iis_bus_tx(void)
{
unsigned int iiscon=0,iismod=0,iispsr=0,iisfcon=0;
int err;
printk("start_aesop2440_iis_bus_txn");
//44 KHz , 384fs
iispsr = IISPSR_A(iispsr_value(AUDIO_RATE_DEFAULT)) | IISPSR_B(iispsr_value(AUDIO_RATE_DEFAULT));
iiscon = S3C2410_IISCON_TXDMAEN | S3C2410_IISCON_RXIDLE | S3C2410_IISCON_PSCEN |
S3C2410_IISCON_IISEN;
iismod = S3C2410_IISMOD_MASTER | S3C2410_IISMOD_TXMODE | S3C2410_IISMOD_LR_RLOW |
S3C2410_IISMOD_MSB | S3C2410_IISMOD_16BIT | S3C2410_IISMOD_32FS |
#if (S_CLOCK_FREQ == 384)
S3C2410_IISMOD_384FS;
#else
S3C2410_IISMOD_256FS;
#endif
iisfcon = S3C2410_IISFCON_TXDMA | S3C2410_IISFCON_TXENABLE;
if(err = access_ok (VERIFY_READ, regs_iis_base, SZ_1M))
printk("S3C2410_VA_IIS Access Read err [%d]n",err);
if(err = access_ok (VERIFY_WRITE, regs_iis_base, SZ_1M))
printk("S3C2410_VA_IIS Access Write err [%d]n",err);
*(unsigned int *)(regs_iis_base + S3C2410_IISPSR) = iispsr;
printk("S3C2410_IISPSR ==> 0x%08xn",*(unsigned int *)(regs_iis_base + S3C2410_IISPSR));
printk("S3C2410_IISPSR ==> 0x%08xn",*(unsigned int *)(regs_iis_base + S3C2410_IISPSR));
*(unsigned int *)(regs_iis_base + S3C2410_IISMOD) = iismod;
printk("S3C2410_IISMOD ==> 0x%08xn",*(unsigned int *)(regs_iis_base + S3C2410_IISMOD));
printk("S3C2410_IISPSR ==> 0x%08xn",*(unsigned int *)(regs_iis_base + S3C2410_IISPSR));
*(unsigned int *)(regs_iis_base + S3C2410_IISFCON) = iisfcon;
printk("S3C2410_IISFCON ==> 0x%08xn",*(unsigned int *)(regs_iis_base + S3C2410_IISFCON));
printk("S3C2410_IISPSR ==> 0x%08xn",*(unsigned int *)(regs_iis_base + S3C2410_IISPSR));
*(unsigned int *)(regs_iis_base + S3C2410_IISCON) = iiscon;
printk("S3C2410_IISCON ==> 0x%08xn",*(unsigned int *)(regs_iis_base + S3C2410_IISCON));
printk("S3C2410_IISPSR ==> 0x%08xn",*(unsigned int *)(regs_iis_base + S3C2410_IISPSR));
}