내가 현재까지 해 본 실험을 바탕으로 한 결과 및 문제점을 기록했다.
여기서 왜 dualboot 가 필요하고, 어떤 식으로 구현이 되는 가에 대해서는 설명하지 않겠다. flash 쪽 문서를 참고하기 바란다.
해 본 실험들
- callprog
- st 에서 받은 dualboot
- testapps7
우선 먼저 callprog 에 대한 설명이다.
testapps7을 보면, callprog 라는 함수가 있다. 이 함수의 역할은 특정 번지의 주소를 인자로 넣어주면, 그쪽으로 jump 를 하도록 되어 있다.
현재 두개의 프로그램(부트로더와 메인프로그램) 을 서로 다른 플래시 영역에 write 되게끔 hex 파일로 만들었다. 그리고 나서, uart 로 간단한 메세지만 출력될 수 있는 로더 프로그램을 플래시 부트 영역과 0x7fe00000 에 write 했다. 그리고 나서 dacs1000 을 0x7ff00000 에 write 했다.
이때, loader 프로그램 끝에,
int main(void) { int i; ST_ErrorCode_t ST_ErrorCode; STUART_Handle_t uartHandle; //************** Basic Init ********************************** ST_ErrorCode = BasicInfraStructure_Init(); /* setup basic set of drivers for reporting and I/O */ ST_ErrorCode = BasicInfraStructure_Term(); -> 기본적인 서비스들을 모두 끈다. callprog((void *)0x7ff00000); -> 0x7ff00000 번지로 jump 한다. 0x7ff00000 에는 dacs1000 이 있다. // ST_ErrorCode = 시스템_INIT(); // initEprom(); //ST_ErrorCode = OSD_Initializing(); //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 */ { // timerStart(); // nimInit (); // PsipInit(); // StartUi시스템(); // 반드시 cm 뒤에 시작되어야 한다. // KeyServerStart(); // cmInitial (); // task_delay(1000*TICKS_10MS); //siStart(); //ciInit(); // task_delay(100*TICKS_10MS); //cmPlayLastVch (); /////////////// Test Function ///////////////////// // cmTestFun ();//pys_LVDS, khk_test /////////////// Test Function ///////////////////// } task_suspend(0); return (ST_ErrorCode); /* return error code */ }
initfunc.tco 분석
DCU 가 자동으로 실행해주는 역할을 한다. 기본적인 하드웨어(CPU,SDRAM 등) 세팅을 한다. HEX 파일을 만들 때 만드시 추가해서 만들어 주어야 한다. 그렇지 않으면 FLASH 로 부팅이 안된다. 이 함수가 실행이 되고 나서 실행이 되는 부분 5517ref/시스템 아래에 있는 main.c 파일이다. 어찌보면, 지금까지의 개발은 부팅이 되서 커널이 올라간 상태에서의 개발이었다고 할 수 있다 .
듀얼부팅을 위해서는 부트로더가 반드시 필요하다. 부트로더가 가져야할 기능은 다음과 같다.
☞ 각 디바이스들 초기화
- ST_SECTOIN : 전체 메모리맵에서의 각 주소 영역을 지정한다.
- ST_BOOT : 커널을 로딩한다.
- ST_PIO : GPIO 초기화
- ST_UART : 시리얼 디바이스 초기화
최소 위의 것들이 초기화가 되어야 UART 를 통해서, 메세지를 확인할 수 있다. 또한 플래시의 특정 영역에 있는 커널을 메모리로 복사하면서 로딩한다.
앞으로 해봐야 할 실험들
- st dualboot program 분석