DVI 문제를 푸는 데, 결정적인 영향을 끼진 것들을 다시 되짚어 본다. 관련 문서를 보았다면, 알겠지만 I2C 인터페이스로 통신하는 DVI 는 어찌보면 엄청 복잡하고 어찌보면 아주 간단하다.

그렇다면, 지금은 되고? 그 동안에는 왜 안되었는지 하나씩 살펴보기로 한다.

알려진 문제점과 해결방법

I2C Ack 신호가 뜨지 않음 디바이스 ID 를 0x70 으로하고, SDA 와 SCK 의 저항을 100 옴으로 수정했다
처음에 R/W 값이 0 으로 읽힘 아직 확실한 원인은 없지만, U36 과 U30 을 붙였더니, 제대로 실행했다

새롭게 알게되어 추가된 사항

다음은 여러가지 실험을 통해서 알게된 사실이다.

어떤 하드웨어이든지 OPERATION(R/W)를 하기전에는 RESET 을 해주어야 한다. Sil178 의 경우, gpio 에 연결되어 있는 dvi_rst 핀으로 RESET 이 가능했다. 여기서 알아두어야 할 것은 pull-down 걸어주어야 한다는 것이다.

내가 Sil178 의 데이터시트를 보면서, 가장 많이 혼동되었던 부분이다. 핀 이름과 레지스터 이름이 같기 때문이다. 특히 PD 핀에 관해서는 High 가 되면 Normal Operation 이고, Low 가 되면, Power Down 이 되면서, I2C 가 활성화 된다고 나와있다. 하지만, 3S STB 를 오실로 스코프로 찍어본 결과, PD 핀은 항상 High 잡혀있었다.

어쩌면 당연한 얘기일 수도 있는 데, 전까지는 어떤 값을 어떤 주소에 R/W 해주어야 하는지 몰랐다. 여기서 잠깐 프로그램에서 세팅 해주는 부분을 보도록 하자!~

err = Write_Dvi(0x08, 0x35);  // BSEL(24bit) 와 PD 레지스터를 1 로 만들어야 함
	if(err != RTN_OK) printf("\nWriteDvi FAIL\n");
 
	err = Write_Dvi(0x09, 0x21);   // 케이블 꼽혔는지 여부를 RSEN bit 로 내보냄
	if(err != RTN_OK) printf("\nWriteDvi FAIL\n");
 
	err = Write_Dvi(0x0a, 0x90);   // De-Skew Setting 을 Default 값으로 세팅
	if(err != RTN_OK) printf("\nWriteDvi FAIL\n");
 
	err = Write_Dvi(0x08, 0x35);  // 처음 세팅을 다시 한번 해줌
	if(err != RTN_OK) printf("\nWriteDvi FAIL\n");

주석을 잘 보고 이해하기 바란다.

위에서 레지스터를 세팅하는 부분에서도 잠깐 나왔지만, DVI 는 RGB 와는 달리 케이블이 단자에 꼽히지 않으면 스트림이 나오지 않는다. 다시 말하자면, DVI 모니터에서의 5V 전압의 상쇄된 3V 가 Sil178 에 들어가지 않으면 제대로 동작하지 않는다.
그런데 여기서 문제가 있다. DVI 케이블을 처음부터 꼽고 끝까지 그대로인 상태라면 문제 없이 동작한다. 하지만 만일 중간에 DVI 케이블이 빠졌다가 다시 꽂혔다고 생각해보자!!
직접 나의 실험을 통해 알아본 결과, 처음에는 잘 나왔지만, 어느 정도 시간을 두고 뺐다가 끼면 화면이 멈춰버리는 현상이 생겼다.
아마도 모니터 케이블이 연결되었을 때(3V 가 Sil178로 들어감), 칩이 RESET 이 안되서 나타나는 문제인 듯 보였다.
앞에서 레지스터 세팅에서 RSEN bit 로 케이블 여부를 판단하도록 했기 때문에, 0x09 번지를 읽어 봄으로써 현재의 케이블 연결 여부를 알 수 있다. 때문에, 루프를 돌면서 체크를 하는 Task 를 하나 만들었다.

void Con_Check(void)
{
	U8 rVal;
 
Check_POLL:
	while(loop_check)
		{
		task_delay(156);
		rVal = Read_Dvi(0x09, &rVal);
		task_delay(156);
		if(rVal & 0x04)
			{
			continue;
			}else{
			printf("\nNOW NOT CONNECT\n");
			loop_check = 0;			
				}
		}
 
	while(!loop_check)
		{
		task_delay(156);
		rVal = Read_Dvi(0x09, &rVal);
		task_delay(156);
		if(rVal & 0x04)
			{
			printf("\nNOW CONNECT\n");
			Reset_Dvi();
			Start_Dvi();
			loop_check = 1;
			goto Check_POLL;
			}else{
			continue;
				}
 
		}
 
}

간단하게 설명을 하자면, 가장 먼저 케이블이 꽂혀있다가, 빠지면 루프를 빠져오고 언제 케이블이 들어오는지 체크하면서 루프를 돈다. 이 때 만일 케이블이 들어오면, Sil178 RESET 루틴이 실행되고, 다시 케이블이 빠지는지 여부를 체크하는 루틴이 루프를 돌게 된다.

마치면서

거의 3개월 넘게 DVI 작업을 했던 것 같다. 지금에 와서 보면, 그 동안 DVI 신호가 나왔음에도 불구하고, DVI 를 볼 수 있는 모니터가 없었던 것 때문에 확인을 못했던 것 같다. 그나마 DVI 를 빨리 해결할 수 있었던 것은 DVI 모니터와 3S STB 이 있었기 때문이었다.

DVI 는 디지털 출력으로서, 영상을 보기 위해서는 DVI 입출력을 지원하는 모니터가 필요하다. 그 동안 DVI 모니터가 없어서 끝단을 오실로 스코프를 이용해서 확인했었다. 지금 와서 생각하는 것이지만, 만일 DVI 모니터가 있었더라면, 개발 시간이 엄청나게 줄었을 것이다.
또한 DVI 에서 들어오는 5 V 전압이 DVI 칩에 영향을 준 것 같다.

우연치 않게, 타사 STB 를 구입하였는 데, 공교롭게도 같은 칩(Sil178)을 사용하고 있었다. 오실로 스코프로 초기화할 때의 각 핀 설정(High 또는 Low)과 입력되는 데이터 값들을 알 수 있었다.

처음에 데이터 시트를 읽었을 때, 가장 많이 혼동되었던 것이 178 의 실제 핀과 레지스터의 이름이 같다는 것이었다. 그 중에서는 가장 중요했던 것은 PD 와 RESET 핀이었다. PD 의 경우,

LOW POWER DOWN MODE
HIGH NORMAL OPERATION

레지스터 세팅을 LOW 로 했다면, 화면이 나오지 않았을 것이다.

  • computer/digitalarena/dvi_결론.txt
  • Last modified: 3 years ago
  • by likewind