여기서는
앞의 문서에서도 얘기했듯이 main() 함수부터 어떤식으로 하드웨어를 콘트롤하는지 알아볼 것이다.
일단 main() 함수를 보자!
/*------------------------------------------------------------------------- * Function : main * Main entry point * Input : optional arguments * Output : * Return : * ----------------------------------------------------------------------*/ int main(void) { ST_ErrorCode_t ST_ErrorCode; ST_ErrorCode = BasicInfraStructure_Init(); /* setup basic set of drivers for reporting and I/O */ ----- 1 if (ST_ErrorCode != ST_NO_ERROR) { printf("Basic Init Fail!!!\n"); return 0; } Boot7020(); ----- 2 DDR_INIT(SDRAM_FREQUENCY); ----- 3 ST_ErrorCode = AV_INIT(); ----- 4 if (ST_ErrorCode != ST_NO_ERROR) /* run test application if all went well */ { printf("Back end Init Fail!!!\n"); return 0; } // initEprom(); ----- 5 // UART_Open (&uartHandle); //******************************************************************* (void) task_priority_set(NULL, MIN_USER_PRIORITY);/* don't block anything else */ //******************************************************************** if (ST_ErrorCode == ST_NO_ERROR) /* run test application if all went well */ { U16 i; LoadImageData(); ------ 6 LoadFontData(); ------ 7 OpenGDPViewPort(); ------ 8 ClearWindow2(); ------ 9 timerStart(); ------ 10 nimInit (); ------ 11 PsipInit(); ------ 12 StartUi시스템(); // 반드시 cm 뒤에 시작되어야 한다. ------- 13 KeyServerStart(); ------- 14 cmInitial (); ------- 15 // task_delay(1000*TICKS_10MS); // siStart(); // ciInit(); // task_delay(100*TICKS_10MS); // TEST_VIDEO(); //cmPlayLastVch (); /////////////// Test Function ///////////////////// cmPlayTest ();//pys_LVDS, khk_test // cmPlayTest ();//pys_LVDS, khk_test // cmChangeFrequencyTest(663000000); // printf("Play video!\n"); // TestMessage(); /////////////// Test Function ///////////////////// } task_suspend(0); return (ST_ErrorCode); /* return error code */ }
여기서 유의해야 할 점은 위에서 주석처리가 되어있다고 해서, 무시하고 넘어가면 안된다는 것이다.
함수 옆에 번호가 붙어있다. 번호에 따라 각각의 모듈별로 역할을 분석한다.
세부 분석
차례대로 1번 부터 보자!
1. BasicInfraStructure_Init()
DACS1000 과 5000 에 공통적으로 수행되는 함수로서, 기본적인 디바이스를 init → setup 한다. 여기서는 굳이 언급하지 않겠다.
2. Boot7020()
함수명 | 설명 |
reset7020() | GPIO 핀인 7020_RESET를 LOW → HIGH 로 콘트롤해서 7020 reset 을 시킨다 |
set7020add26() | GPIO 핀인 7020_A26 을 LOW 로 콘트롤해서 DDR 메모리맵을 세팅한다 |
resetcongifebank2() | 5517로 부터 나가는 auxiliary clock 레지스터를 세팅한다 하지만, 현재 회로도에서 연결되어있지 않기 때문에 따로 특별히 세팅을 해줄 필요가 없다 |
set7020mode_16bit() | 5517로 부터 나가는 CONFIG_CONTROL_E 레지스터를 세팅한다(0x0022003f) bank2 주소를 확장한다. EMI_GENCFG 레지스터를 세팅한다(0x000006c1) bank2 를 제외한 다른 bank 주소를 리셋한다 bank0 는 sdram이다. 0x60000000+0x0B0 에 0x1 을 세팅한다(16비트모드 엑세스 지원) |
3. DDR_INIT()
함수명 | 설명 |
stboot_InitClockGen() | 클럭을 설정 |
stboot_InitSDRAM7015() | DDR 클럭을 설정한다(7020 의 세부적인 레지스터에 값을 쓰고 읽는다. DDR 메모리역시) |