내가 현재까지 해 본 실험을 바탕으로 한 결과 및 문제점을 기록했다.
여기서 왜 dualboot 가 필요하고, 어떤 식으로 구현이 되는 가에 대해서는 설명하지 않겠다. flash 쪽 문서를 참고하기 바란다.

해 본 실험들

  1. callprog
  2. st 에서 받은 dualboot
  3. 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 파일이다. 어찌보면, 지금까지의 개발은 부팅이 되서 커널이 올라간 상태에서의 개발이었다고 할 수 있다 .
듀얼부팅을 위해서는 부트로더가 반드시 필요하다. 부트로더가 가져야할 기능은 다음과 같다.

☞ 각 디바이스들 초기화

  1. ST_SECTOIN : 전체 메모리맵에서의 각 주소 영역을 지정한다.
  2. ST_BOOT : 커널을 로딩한다.
  3. ST_PIO : GPIO 초기화
  4. ST_UART : 시리얼 디바이스 초기화

최소 위의 것들이 초기화가 되어야 UART 를 통해서, 메세지를 확인할 수 있다. 또한 플래시의 특정 영역에 있는 커널을 메모리로 복사하면서 로딩한다.

앞으로 해봐야 할 실험들

  1. st dualboot program 분석
  • computer/digitalarena/현재_상황_및_문제점.txt
  • Last modified: 3 years ago
  • by likewind