기존 이솝 임베디드 포럼의 지식인 서비스가 게시판 형태로 변경되었습니다.

I2S를 구현하다 문제가 있어 질문 드립니다.

펌웨어 환경에서 I2S0를 이용하여 5.1채널 오디오를 구현하고 있습니다.
이전에 I2S0에 EXT DMA를 이용하여 2채널을 구현했었습니다.
구현은 일정 블럭 사이즈 만큼 반복하여 DMA를 수행하는 방식이었습니다.
여기에 IISMOD[DCE]를 3으로 하여 6채널 모두 사용 하도록 설정하였습니다.
하지면 2채널일 때는 DMA가 계속해서 동작하였는데, 5.1채널은 한번 DMA가 완료 후 다음 DMA를 수행 하면 실행이 안되고 대기 상태입니다.


void __irq ISR_I2Sv5_1_DMAPlayDoneLoop(void)
{
 U32 uDmaIntStatus;
 U32 eIntI2S;
 
 INTC_Disable(I2S0_TX_NUM_PDMA);
 
 // Interrupt Clear
 DMA_GetIntrSrc(&uDmaIntStatus, &oI2S0DmaTXP);
 DMA_ClearIntPending(uDmaIntStatus, &oI2S0DmaTXP);

 g_RemainSize -= g_uTransSize;
 g_TransOffset+= g_uTransSize;
 
 if( g_RemainSize < g_uTransSize ) g_uTransSize = g_RemainSize;

 if( g_RemainSize==0 )
 {
  DMA_StopCh( &oI2S0DmaTXP );
  g_I2S0PlayTXPDone = 1;
  UART_Printf("\n[OUT DMA DONE !]");
 }
 else
 {
  DMA_StartCh(g_TransBase + g_TransOffset, (U32)IIS_TXD, g_uTransSize, &oI2S0DmaTXP);
 }
 
 INTC_ClearVectAddr();
 INTC_Enable(I2S0_TX_NUM_PDMA);
}


2채널일 때 실행 로그입니다.

DMAMOV DST [0h]
DMAMOV CHCTGRL [810205h]
DMAFLUSHP [ah]
DMALP [1][0]
DMALP [0][0]
DMAWFP [0] bs[0], p[20528]
DMALD bs[0, x[1]
DMAST bs[0, x[1]
DMAFLUSHP [ah]
DMALPEND [0] nf[1], bs[0], x[0]
DMALPEND [1] nf[1], bs[0], x[0]
DMALP [0][0]
DMAWFP [0] bs[0], p[20528]
DMALD bs[0, x[1]
DMAST bs[0, x[1]
DMAFLUSHP [ah]
DMALPEND [0] nf[1], bs[0], x[0]
[I2S0 start play]
DMASEV Event[7]
DMAEND
DMA GO
playing started

DmaStatus[ STAT: 200000, PC : 200004d1]
DMA CS[200000h][0h]
DMA SRC[40dad698h], DST[eee30010h]
DMA LoopCnt[0,0]
I2S CON[8040ce05h], MOD[d0000c10h], FIC[0h]

DMASEV Event[7]
DMAEND
DMA GO

...

DMASEV Event[7]
DMAEND
DMA GO
DMASEV Event[7]
DMAEND
DMA GO
DMASEV Event[7]
DMAEND
DMA GO
DMA STOP CH

[OUT DMA DONE !]playing finished
DMA STOP CH

5.1채널일 때 실행 로그입니다.

DMAMOV DST [0h]
DMAMOV CHCTGRL [810205h]
DMAFLUSHP [ah]
DMALP [1][0]
DMALP [0][0]
DMAWFP [0] bs[0], p[20528]
DMALD bs[0, x[1]
DMAST bs[0, x[1]
DMAFLUSHP [ah]
DMALPEND [0] nf[1], bs[0], x[0]
DMALPEND [1] nf[1], bs[0], x[0]
DMALP [0][0]
DMAWFP [0] bs[0], p[20528]
DMALD bs[0, x[1]
DMAST bs[0, x[1]
DMAFLUSHP [ah]
DMALPEND [0] nf[1], bs[0], x[0]
DMASEV Event[7]
DMAEND
DMA GO
playing started

DmaStatus[ STAT: 200000, PC : 200004d1]
DMA CS[200000h][0h]
DMA SRC[40dfaff4h], DST[eee30010h]
DMA LoopCnt[0,0]
I2S CON[8040c605h], MOD[d0030412h], FIC[0h]

DMASEV Event[7]
DMAEND
DMA GO

더이상 진행 안됨

많은 조언 부탁드립니다.


고도리

2013.04.14 05:15:55
*.200.239.210

DMA end까지 확인이 제대로 된 것인가요?

즉, DMA end irq까지 떨어진 것인지?


해보지 않은 쪽이라 정확하게는 답을 하기 힘든데, DMA size나 bit에 따라 다르게 동작할 듯 합니다.

혹시나 다른 세팅이 있는지 확인해 봐야할 듯 하네요.

션한물

2013.04.15 17:58:14
*.114.241.90

답변 감사합니다.

 

DMA END는 한 블럭의 DMA가 완료 되었을 때 인터럽트가 발생 하였으며 로그 중 DMASEV Event[7] 부분 입니다.
한 블럭 수행후 DMA 상태는 주변장치가 READY 될때까지 대기 하고 있는 상태입니다.

 

제가 로그로 출력한 부분은 DMA 수행하는 단계별로 출력을 한것입니다.

안드로이드나 리눅스 환경으로 시작을 안하다 보니 비교할 만한 대상이 없어서 난감 합니다.

 

답변 감사드립니다.

쾌도난마

2013.04.15 20:23:47
*.50.20.11

I2S 와 DMA 의 소통 관계부터 확인 하셔야 할 것 같습니다.


I2S IP 가 DMA 에게 REQ 신호를 쏴 주어야 DMA 가 I2S FIFO 에 DATA 를 쏘는데

I2S IP 가 REQ 신호를 못 보내는 상황이라면? ( FIFO EMPTY, FIFO FULL 등 )

I2S IP 가 분명 ERROR 관련 STATUS 를 표현 할 것으로 예상 됩니다.


I2S 2channel 에서 6channel 로 바꾸셨다고 했는데 어떤 mode 입니까?

I2S DOUT 4개? 아니면 TDM 모드?


이에 관련한 I2S IP SPEC 을 충분히 숙지 하신 이후에 진행 하셔야 하지 않을까 합니다.




션한물

2013.04.18 22:43:50
*.114.241.90

답변 주셔서 감사드립니다.

다른 곳에도 질문을 올렸는데 답변이 없어서 난감 했는데...

 

S5PV210 CPU의 I2S CON[8040c605h], MOD[d0030412h], FIC[0h]

로그중 위의 값이 I2S CONTROL, MODE, FIFO CONTROL 레지스터 값입니다.

위의 값은 TX FIFO EMPY상태를 나타내고 있습니다.

스펙에서는 TX FIFO가 FULL이 아니면 READY 상태라고 되어 있습니다.

참고로 1블럭을 크게 설정 후 재생을 하게되면 그 블럭은 재생이 됩니다.

I2S MULTI AUDIO 방식에서는 TXR 하나에 6채널 데이터를 PUSH하는 방식입니다.

 

스펙을 몇번을 읽고 진행을 해보고 있는데 폴링방식으로는 문제가 없는데 참 난감합니다.

 

다시한번 답변에 감사드립니다. ^^

쾌도난마

2013.04.19 01:51:19
*.50.20.11

로그는 진행 중에 나타나는거 같은데 안될때 레지스터를 한번 읽어 보시고 변한 부분이 없나요? FIC부분..

1블럭을 크게 설정 후 재생.. 이라고 하시면 어느정도의 data 인가요? (16bit * 6(5.1) = 12byte = 1frame) 

음 그러니깐, 256 frame , 512 frame , 1024 frame 이라고 한다면 어떤 크기이든

첫번째 1번은 보내 준다라는 의미 아니신가요?

DMASEV Event[7] 로그 사이에 처리되는 data 양이 얼마나 되는지 궁금해서 질문 드립니다.


궁금한 이유는 다음과 같습니다.

dma 1채널이 보낼 수 있는 양은 한계(count) 가 있는데

(예를 들면 dma count 1024 번 하면 4*1024 = 4KB, 이 dma 는 최대(dma 인터럽트 사이에) 전송 size 는 4KB 이다)

사용하시는 플랫폼의 dma 드라이버가 DMASEV Event[7] 로그 사이 마다

실제 dma register count 를 다 소진하고 나면 위에서 요청한 콜백을 호출 하는지,

dma 드라이버가 유연성이 있어 적절하게 위에서 요청한 size가 맞으면 콜백을 호출 하는지 궁금해서 입니다.

List of Articles
번호 제목 글쓴이 날짜 조회 수sort
6248 우분투 9.04에서 tslib-1.0설치시 에러.. [2] Kevin 2009-10-24 3500
6247 ramdisk를 위한 lib의 작게 하는 방법 [3] 김경호 2006-04-13 3488
6246 컴파일 시 libc 와 관련된 골아픈 질문.. [11] 칼마 2018-02-27 3472
» I2S를 구현하다 문제가 있어 질문 드립니다. [5] 션한물 2013-04-12 3448
6244 [질문] 장시간 사용시에 LCD 문제 [3] 한영민 2007-05-23 3414
6243 [참고] PCI 수정 제안...^^ [1] 이승진 2007-05-11 3414
6242 WinCE 5.0 LCD관련 질문입니다. [4] 김해성 2007-10-06 3388
6241 [v210] SMSC LAN9220 이더넷 문제 [7] 유구무언 2013-06-11 3371
6240 udev 적용문제 확인부탁드립니다. [1] ice179 2014-02-28 3363
6239 [완료] 리눅스 관련 자료는 언제 올라오나요? [4] 임은향 2007-05-14 3361
6238 Android binder 사용 방법 문의 [2] 이윤택 2009-06-11 3335
6237 [re] [요청] LX800에 부팅시 사용되었던 Image file [1] 이제현 2007-08-29 3318
6236 NOR MTD 질문입니다.. [완료] [5] 이홍석 2006-05-06 3312
6235 root 로그인이 안될때. [8] 박상진 2009-05-20 3301
6234 [질문] CPU 성능 테스트는 어떤 프로그램이 적합할까요? [1] 성진호 2007-06-28 3297
6233 Origen보드에 Linaro-Linux 올리기 -- SD카드에 Kernel 이미지 쓰... [1] 다콩 2012-07-19 3283
6232 리눅스 개발환경에 대해(이더넷, OTG) 활용 방안 [1] pedor11 2013-11-06 3274
6231 이솦보드 키패드 처리 방법?[완료] [3] 김대영 2006-04-12 3252
6230 프레임버퍼 디스플레이가 잘 안되는데요 [1] timul1 2014-02-24 3251
6229 [질문]wince 올리는 방법 [6] 김형기 2007-06-26 3249

사용자 로그인