요즘 S3C2440 을 사용하여 프로젝트를 몇개 하고 있다.

가격이 싸서 아직도 많이 사용한다... 경쟁칩은 PXA255, PXA270 그리고 ATMEL 사꺼 정도지만.. PXA 는 단종이고..

기타 칩업체꺼는 많이 사용되지 않으니.... 

가격대 성능비로 아직까지 대적할 MCU 가 그리 많지 않다...

400MHz 라는 속도이상을 필요로하는 곳이라고는 영상쪽과 시큐리티쪽 정도..  아니면 안드로이드..

이런쪽이 아니라면 2440 을 많이 사용한다.

단점이라면 SDRAM 만 지원하므로 차후 가격이 좀 오를것 같다는 것이다. 

그리고 메모리가 256MB 이상이 필요할 경우는 사용하기 힘들다는 정도..

 

프로젝트를 하는 중에 생각지도 않은 사운드쪽 잡음이 속을 썩이고 있다.

사운드장치를 열고 재생하려고 하면 틱 하는 잡음이 발생하는 것이다.

디버깅을 위해 5Hz 사인파을 만들어 재생한 후 파형을 확인하였다.

50Hz 이하의 사인파는 왠만한 오디오장치들은 소리를 내지 못한다. 테스트할때 괜히 1KHz 사인파로 테스트하면

삐 소리에 정신이 혼미해지니 낮은 주파수로 테스트하는 센스를 발휘하자. 머 물론 사람귀로는 20Hz 이하는 묵음이니 ㅎㅎ

 

5Hz 사인파를 재생하여 파형을 확인하니 재생후 48msec 이후에 엉뚱한 데이타가 48msec 동안 출력되는 것이다.

엠프의 특성상 주파수가 급격히 변하면 엄청난 레벨의 잡음을 발생시키므로 이 엉뚱한 데이타 때문에 2번의 잡음이

발생하는 것이었다...

이것이 WM9715 코덱의 문제인지 아니면 S3C2440 의 문제인지 알수가 없었다.

또는 커널의 PCM 드라이버 문제일수도 있다는 생각이 들었다.

삼성 MCU 들의 AC97 장치들은 MCU 마다 별도로 설계되어 있지만 AC97 로 데이타를 전송하는 PCM 파트는 동일한

드라이버를 사용한다.

회사에는 S3C6410 과 WM9715 로 설계한 보드가 있으니 이것을 테스트하여 PCM  드라이버 문제인지를 확인하여 보았다.

음 결과는 비참하다.  S3C6410 과 WM9715 로 설계한 보드도 역시 동일한 잡음이 발행하는 것이었다.

그럼 삼성에서 생산된 MCU 나 드라이버가 문제인가.. 아니다.

그런것이라면 예전에 문제가 되었어야 한다.

아무래도 WM9715 칩이 문제인듯 하다..

(흠 팔고있는 칩이 문제라고 대놓고 말하기는 내가 아직 WM9715에 대한 경험이 부족하긴 하지만 ..)

 

wm9715.PNG

 

S3C2440 과 다른 AC97 코덱칩을 연결한 보드를 구해 테스트해 보니 여기에는 잡음이 없다. 하지만 이 코덱칩도 잡음이 있어

PCM 드라이버를 약간 수정했다고 한다. .. (이잡음은 그냥 버퍼가 초기화 되지 않아 나는 잡음이다.)

WM9715 코덱 드라이버를 최신것으로 업데이트해 보았지만 이런 아예 소리가 안난다..

삽질을 더 해보았지만.. 참담하다.

급히 해결할 수 있는 문제는 아닌듯 하니 아무래도 편법으로 소리를 죽인 후 100msec 이후 정상적인 볼륨으로

복귀하는 것으로 드라이버를 수정하여 사용해서 사용해야 할것 같다.

 

2011/01/05

웨이브 파일을  처음 0.5초 구간에 1KHz 이후는 100Hz 로 구성하여 재생하였더니 .... 놀라운 사실이

 

 에러파형1.png

 

위의 그림은 스코프를 사용하여 출력 파형을 찍은것이다.

화살표가 있는 부분이 에러가 난 부분인데 이파형은 0.5초 이후에 나와야 할 100Hz 파형인 것이다.

결론은 S3C2440 드라이버에 문제가  있다는 결론이다.

 

아마도 커널 드라이버에서 DMA  전송중일때  app 쪽에서 아직 비어있지 않은 버퍼에 데이타를 전송하면서

에러가 나는 듯 하다.

 

위의 글중에 잡음이 없는 S3C2440 보드는 커널 버젼이 낮은것으로 드라이버가 틀리다.

또한 S3C6410 의 PCM (DMA 전송담당) 드라이버는 S3C2440 과 동일한 것을 사용한다.

 

드라이버 삽질하러 가야하는데 마음이 무겁당  emoticon

 

2011/01/13

드디어 에러의 원인을 알아냈고 수정하였다. (아 머리가 찡하다)

이런저런일로 미루어 뒀던 사운드 문제를 다시한번 디버깅하여 처리하였다  emoticon


에러의 원인은 이렇다.


PCM 드라이버는  prepare(), trigger()  함수가 있는데  prepare 함수는 DMA 전송을 위해 준비할것을

준비하라는 것이다. 헌데 2440 PCM 드라이버에서는 있지도 않은 데이타를 DMA 버퍼에

복사(실제복사하지는 않는다)하는 것이었다.  (이때는 DMA 가 정지한 상태라 실제 전송되지는 않는다 )

그리고 어플로 부터 2KB 데이타를 받은 이후 trigger() 함수가 호출되어 DMA 를 시작 시키게 되는데 ..

문제가 있는건 이때 실제 사운드데이타는 2KB 없어 소리가 삐끗하는 것이었다.


다른 PCM 드라이버를 보면  prepare() 함수에서는 버퍼를 준비하지 않는다.

2KB 버퍼로도 재생에 문제가 없어서 그런것인가 의문이지만...


문제를 알았으니 수정해야 한다.

trigger()  함수가 호출될때 DMA를 시작시키지 않고 약간 늦은 시간에서 시작시켰다.

이를 위해 pointer() 함수에서 조건이 맞을때 DMA 를 시작시켰다.

또한 trigger()  함수에서 DMA가 시작되지 않으면 WM9715 와  매칭문제가 발생하여 WM9715에 해당하는

trigger()  함수도 늦은 시간에 시작시켰다.


왠만하여 s3c4xx-pcm.c 만을 수정하려 하였지만 귀챦음이 몰려와 soc-core.c 의 trigger()  함수도 수정하였다.

DAI  (Digital Audio Interface) 를 글만으로는 설명이 좀 어렵지만 .. 이해주시고..

나중에 그림 한컷 올려보도록 하죠 ^^


<끝>