トップ «前の日記(2011年04月06日) 最新 次の日記(2011年05月13日)» 編集
2003|01|02|03|04|05|06|07|08|09|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|10|12|
2009|02|03|06|07|10|11|12|
2010|01|02|03|04|07|09|10|11|12|
2011|01|03|04|05|06|07|08|10|
2012|01|06|08|09|10|12|
2013|01|02|03|04|07|09|11|12|
2014|01|03|04|05|06|09|
2015|04|
2016|01|08|
ここは旧えびめもです。えびめも2に移行します(2016/12/1)

2011年05月10日

ARM9 SAMSUNG S3C2410

サウンドを再生すると2回目以後、右と左の音声がランダムに入れ替わる不具合はドライバの問題だった。再生を止めるときにLRCK(WS) クロックの状態を無視してDMA転送を止めるため、LRCK(WS)がLowで終わってしまうと次回の再生時にL/Rがひっくり返ってしまう。対策として転送終了時に S3C2410_IISCON_IISEN を 0 にして IIS コントローラをリセットするようにしたところ、毎回 LRCK(WS) は Highで終了するようになった。

SAMSUNG S3C2410: alsa player left and right channel swap bug. DMA stops randomly if LRCKis Low or High. if LRCK is low when DMA transmitting stops. Left and Right channel will swap (Bug) on next sound playing. to disable S3C2410_IISCON_IISEN when s3c24xx_snd_txctrl(0), LRCK will be High.

--- linux-2.6.30.4.orig/sound/soc/s3c24xx/s3c24xx-i2s.c 2009-07-03 08:41:20.000000000 +0900
+++ linux-2.6.30.4/sound/soc/s3c24xx/s3c24xx-i2s.c      2011-05-10 21:53:32.000000000 +0900
@@ -106,20 +106,21 @@
                 * seem to happen when the DMA stops. According to the
                 * Samsung supplied kernel, this should allow the DMA
                 * engine and FIFOs to reset. If this isn't allowed, the
                 * DMA engine will simply freeze randomly.
                 */
 
                iisfcon &= ~S3C2410_IISFCON_TXENABLE;
                iisfcon &= ~S3C2410_IISFCON_TXDMA;
                iiscon  |=  S3C2410_IISCON_TXIDLE;
                iiscon  &= ~S3C2410_IISCON_TXDMAEN;
+               iiscon  &= ~S3C2410_IISCON_IISEN;       // 2011-05-10 EBIHARA
                iismod  &= ~S3C2410_IISMOD_TXMODE;
 
                writel(iiscon,  s3c24xx_i2s.regs + S3C2410_IISCON);
                writel(iisfcon, s3c24xx_i2s.regs + S3C2410_IISFCON);
                writel(iismod,  s3c24xx_i2s.regs + S3C2410_IISMOD);
        }
 
        DBG("w: IISCON: %lx IISMOD: %lx IISFCON: %lx\n", iiscon, iismod, iisfcon);
 }
keyword: s3c2410, s3c24xx, mini2440, alsa, left, right, channel, swap