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