사건의 개요

셋톱박스의 소리가 나지 않았다. Testapp와 Src 의 프로그램의 모두 에러없이 실행되고 있었다. 매뉴얼의 적혀있는 레지스터 값과 실제로 실행되고 있는 프로그램에서의 변수 값을 비교해보아도, 동일했다.
문제는 다른 곳에 있었다. 매뉴얼 페이지 page 205 에 사운드 Mute를 설정하는 레지스터의 설명이 나와있다. 진작에 있어야 할 staud 부분에서는 안나오고(?) 엉뚱한 padlogic 에 있던 것이다.
확인 결과, 매뉴얼에 있는 값과 다른 값이 세팅되어 있었다.

확인 및 결과보기

5517 매뉴얼을 보면, page 202 에 EMIBaseAddress 주소가 아래와 같이 표기되어 있다.

EMIBaseAddress 0x2020 0000
InterconnectBaseAddress 0x2001 0000

그런데 우리가 확인해야 할 레지스터(CONFIG_CONTROL_C)의 주소는

InterconnectBaseAddress + 0x08

이다. 실제로 레지스터에 세팅되어 있는 값을 보려면 다음과 같이 해야 한다.

ST_ErrorCode_t TEST_AUD(void)
{
U8 *pRegisterAdd1, *pRegisterAdd2, *pRegisterAdd3, *pRegisterAdd4;  -> 값을 저장할 변수 지정
U8 regVal1, regVal2;   -> 역시 레지스터 값을 저장할 변수 지정
U32 regVal32_1, regVal32_2;
U32 *pRegisterAdd32_1, *pRegisterAdd32_2;
	static char RetCode;
       /*ST_ErrorCode_t ErrCode;*/
	printf("========AUDIO TEST START!!!==============\n");
 
	   task_delay(100000);    -> 일부러 딜레이를 주었다.
 
 
//  *((U8*)(0x0800+0x00fc)) = 0x7f;
//   *((U8*)(0x0800+0x00b2)) = 0xf0;
 
   *((U32*)(0x20010000+0x08)) = 0x0cffd010;
 
		for(;;)
		{
 
	   task_delay(100000);
 
//	   pRegisterAdd1 = (U8*)0x0800+0x004d;
//	   pRegisterAdd2 = (U8*)0x0800+0x004c;
 
//	   regVal1 = *pRegisterAdd1;
//	   regVal2 = *pRegisterAdd2;
 
//	   printf("\n===== pRegisterAdd1 = 0x%x =====\n",regVal1);
//	   printf("\n===== pRegisterAdd2 = 0x%x =====\n",regVal2);
 
	   pRegisterAdd32_1 = (U32*)(0x20010000+0x08);  <- 이 값을 볼 것이다!!!
	   pRegisterAdd32_2 = (U32*)(0x20010000+0x0c);
 
	   regVal32_1 = *pRegisterAdd32_1;
	   regVal32_2 = *pRegisterAdd32_2;
 
	   printf("\n===== pRegisterAdd32_1 = 0x%x =====\n",regVal32_1);
	   printf("\n===== pRegisterAdd32_2 = 0x%x =====\n",regVal32_2);
 
		}
 
	  //  *pRegisterAdd = 4;
 
//	regVal1 = *pRegisterAdd1;
 
	//   printf("\n===== AUD_HEAD3 = 0x%x =====\n",regVal1); 
 
//	AUD_Close(NULL, &RetCode);
 
}

실행 결과는 아래와 같다.

===== pRegisterAdd32_1 = 0xcffe010 =====

나왔다. 0xcffe010 즉, 이를 2진수로 고치면, 1100111111111110000000010000 가 된다.
뒤에서 14번째(0부터 시작하는 것에 주의!!)를 보면 1로 세팅되어 있는 것을 알 수 있다. 1은 곧, Mute 를 의미한다. 우리는 이를 0 으로 세팅해주어야 한다.
다음은 세팅해주는 방법을 보여주겠다.
아래와 같이 작성 한다.

ST_ErrorCode_t TEST_AUD(void)
{
U8 *pRegisterAdd1, *pRegisterAdd2, *pRegisterAdd3, *pRegisterAdd4;  -> 값을 저장할 변수 지정
U8 regVal1, regVal2;   -> 역시 레지스터 값을 저장할 변수 지정
U32 regVal32_1, regVal32_2;
U32 *pRegisterAdd32_1, *pRegisterAdd32_2;
	static char RetCode;
       /*ST_ErrorCode_t ErrCode;*/
	printf("========AUDIO TEST START!!!==============\n");
 
	   task_delay(100000);    -> 일부러 딜레이를 주었다.
 
 
//  *((U8*)(0x0800+0x00fc)) = 0x7f;
//   *((U8*)(0x0800+0x00b2)) = 0xf0;
 
   *((U32*)(0x20010000+0x08)) = 0x0cffd010;  <- 부분에서 주소값을 새롭게 세팅해주는 부분이다.
 
		for(;;)
		{
 
	   task_delay(100000);
 
//	   pRegisterAdd1 = (U8*)0x0800+0x004d;
//	   pRegisterAdd2 = (U8*)0x0800+0x004c;
 
//	   regVal1 = *pRegisterAdd1;
//	   regVal2 = *pRegisterAdd2;
 
//	   printf("\n===== pRegisterAdd1 = 0x%x =====\n",regVal1);
//	   printf("\n===== pRegisterAdd2 = 0x%x =====\n",regVal2);
 
	   pRegisterAdd32_1 = (U32*)(0x20010000+0x08);  <- 새롭게 변경된 값을 볼 것이다!!!
	   pRegisterAdd32_2 = (U32*)(0x20010000+0x0c);
 
	   regVal32_1 = *pRegisterAdd32_1;
	   regVal32_2 = *pRegisterAdd32_2;
 
	   printf("\n===== pRegisterAdd32_1 = 0x%x =====\n",regVal32_1);
	   printf("\n===== pRegisterAdd32_2 = 0x%x =====\n",regVal32_2);
 
		}
 
	  //  *pRegisterAdd = 4;
 
//	regVal1 = *pRegisterAdd1;
 
	//   printf("\n===== AUD_HEAD3 = 0x%x =====\n",regVal1); 
 
//	AUD_Close(NULL, &RetCode);
 
}

실행 결과는 다음과 같다.

===== pRegisterAdd32_1 = 0xcffd010 =====

나왔다. 0xcffd010 를 2진수로 바꾸면 즉, 1100111111111101000000010000 이다.
뒤에서 14번째(0부터 시작하는 점을 주의!!)를 보면, 0으로 세팅이 바뀐 것을 알 수 있다.
그리고 나서 위의 예제를 이용한 Testapp를 돌려보자!!
소리가 나올 것이다!!!

  • computer/digitalarena/사운드_출력_나오게_하기.txt
  • Last modified: 3 years ago
  • by likewind