ST20 OS 에서 디바이스가 어떤 과정으로 초기화되는지 나 나름대로 정리한 내용을 적었다.
내가 다뤄본 ST20 기반의 소스코드(5517ref, 7710ref)를 봤을 때, 앞으로 새로운 chip 이 개발되고 이에 따른 소스코드가 나오더라도 기본적인 루틴(초기 디바이스 초기화)은 변하지 않을 것 같다.

어떤 프로그램이든, 어떤 디바이스를 사용하기 위해서는 초기화(init) 및 할당(open)을 해주어야 한다. 물론 디바이스에 따라서, 어떤 것은 아주 간단하게 초기화할 수 있는 반면에 어떤 것은 특정 디바이스가 먼저 초기화 되어야 하는 것도 있다.

디바이스 초기화 설명

대체로 디바이스는 'init() → open() → 관련 API에 의한 디바이스 Access' 로 초기화 단계를 거친다.
먼저, init() 부터 설명하겠다.
대부분 '디바이스이름_init()' 의 이름으로 함수가 존재한다. 여기서 중요한 것은 init() 함수에 필요한 struct 파라미터를 제대로 맞춰주는 일이다.

특히나 기존의 디바이스 드라이버를 버전 업된 디바이스 드라이버로 포팅할 때는 반드시 include 파일을 확인해서 struct 파라미터가 바뀌었는지 반드시 확인하도록 한다! 좀더 쉬운 이해를 위해 예를 들어 보이겠다.

ST_ErrorCode_t VID_Setup(void)
{
	ST_ErrorCode_t         ST_ErrorCode;
	STVID_InitParams_t     STVID_InitParams;        // 초기화(init)를 위한 struct 
	STVID_OpenParams_t     STVID_OpenParams;        // 할당(open)을 위한 struct
	STVID_ViewPortParams_t STVID_ViewPortParams;
	STVID_MemoryProfile_t  STVID_MemoryProfile;
	//STVID_DisplayAspectRatioConversion_t STVID_darc = DISPLAY_CONVERSION_MODE;
 
	memset(&STVID_InitParams, 0, sizeof(STVID_InitParams) );    /* 모든 init 파라미터 0 으로 초기화 clear every parameter */
         // init 하기 위한 struct 파라미터 지정
	STVID_InitParams.DeviceType                   = STVID_DEVICE_TYPE_7020_MPEG;
	STVID_InitParams.BaseAddress_p                = (void*)ST7020_VID1_OFFSET;
	STVID_InitParams.BaseAddress2_p             = (void *)NULL;
	STVID_InitParams.DeviceBaseAddress_p          = (void*)STI7020_BASE_ADDRESS;
	STVID_InitParams.BitBufferAllocated           = FALSE;
	STVID_InitParams.BitBufferAddress_p           = NULL;
	STVID_InitParams.BitBufferSize                = 0;
	STVID_InitParams.InterruptEvent               = ST7020_VID1_INT;
	STVID_InitParams.InstallVideoInterruptHandler = FALSE;
	STVID_InitParams.InterruptNumber              = 0;
	STVID_InitParams.InterruptLevel               = 0;
	STVID_InitParams.CPUPartition_p               = SystemPartition;
	STVID_InitParams.SharedMemoryBaseAddress_p    = (void*)(SDRAM_WINDOW_BASE_ADDRESS);//+0x1500000);
	STVID_InitParams.AVMEMPartition               = AVMEM_Partition;
	STVID_InitParams.MaxOpen                      = 4;
	STVID_InitParams.UserDataSize                 = 0xFF;
	STVID_InitParams.AVSYNCDriftThreshold         = 2 * (90000 / 50);
 
	strcpy(STVID_InitParams.EvtHandlerName,    EVT_DeviceName[EVT_VTG] ); // EVT 디바이스를 사용
	strcpy(STVID_InitParams.ClockRecoveryName, CLKRV_DeviceName        ); // CLKRV 디바이스 사용
	strcpy(STVID_InitParams.InterruptEventName, INTMRDeviceName);  // INTMR 디바이스 사용
	strcpy( STVID_InitParams.VINName, "");   // VIN 디바이스 사용
 
	STTBX_Print(("VID_Setup(%s)=", VID_DeviceName ));
	ST_ErrorCode = STVID_Init(VID_DeviceName, &STVID_InitParams);
	if (ST_ErrorCode != ST_NO_ERROR)
	{
		STTBX_Print(("%s\n", GetErrorText(ST_ErrorCode) ));
		return( ST_ErrorCode );
	}
		STTBX_Print(("%s\n", STVID_GetRevision() ));

위의 주석을 보면, strcpy 를 사용해서 초기화시 다른 디바이스를 사용하는 것을 알 수 있다.
또한 디바이스를 초기화할 때 보면, DeviceName 을 지정해 주어야 한다.

ST_DeviceName_t PIO_DeviceName[] = {"PIO0","PIO1","PIO2","PIO3","PIO4"};
...
ST_DeviceName_t VID_DeviceName[] = "VID";
...
ST_DeviceName_t VTG_DeviceName[] = "VTG";

앞에서의 예제처럼 초기화시에 ST_DeviceName 이라는 struct 로 디바이스 이름을 지정해주는 것은 나중에 다른 디바이스에서 사용하거나, 나중에 관련 API 에서 handle 로 사용할 때 필요하다.

  • computer/digitalarena/st20_에서의_디바이스_초기화.txt
  • Last modified: 3 years ago
  • by likewind