셋톱박스의 소리가 나지 않았다. 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를 돌려보자!!
소리가 나올 것이다!!!