HDMI Hot Plug Detect Pin and +5V Pin


  HDMI 의 Pin 및 Pin map에는 Hot Plug Detect(HPD) 핀이 존재 합니다.

이 핀의 목적은 송신부(PC or 셋탑박스 등의 영상 전송 장치)에서 출력 장치인 디스플레이 장치가 접속이 되었는지 감지하는 핀입니다.

이 핀은 수신부가 출력을 내고, 송신부가 수신하는 형태로 동작을 합니다. 인터럽트 핸들링과 유사 혹은 같습니다.


  그러나, 수신측의 HPD Pin은 송신측의 +5V 출력에 풀업이 되어 있어 송신측에도 영향을 받습니다. 규격에서는 송신측에서 +2.0V 이상이면 인식을 하며, 수신측 출력은 +2.4V 이상이여야 합니다. 또한 송신측 +5V는 +4.7이상 유지해야 합니다.



[레벨쉬프트가 들어간 HDMI Tx/Rx 예제]


위의 그림과 같이 송신측 +5V와 수신측 HPD가 풀업 저항으로 연결되어 있습니다.


  문제 발생하는 경우로는, 송신측 +5V가 약할 경우 송신측에서 수신측을 인식하지 못하는 경우가 발생합니다. 이 문제는 수신측이 HPD을 제어하기 때문입니다. 송신측 +5V의 전압이 낮을 경우 수신측에서 송신측을 인식하지 못하는 사태가 발생하고, 그에 따라 수신측은 HPD를 Low 상태로 유지 합니다. 그렇게 될 경우에는 송신측은 출력을 내보내지 않습니다.


  위와 같은 현상이 발생되면, 출력 장치에 따라 출력이 되고 안되고 하는 현상이 발생하기도 합니다.

따라서, 디버깅 및 동작 확인 시 등의 경우에 HPD가 작동하여 DDC를 통해 송수신측이 서로 EDID Data를 주고 받는지, 그 후에 송신측에서 받은 EDID 데이터를 통해 정상적인 Signal이 나오는지에 대한 확인이 필요합니다.

 

  HDMI의 동작 순서에 따라 확인하면, 어떠한 부분에서 문제점이 발생하는지 알 수 있습니다.







참고 : http://wellplay.tistory.com/



// 바이트 배열을 String으로 변환 
private string ByteToString(byte[] strByte) 
{ 
    string str = Encoding.Default.GetString(StrByte); 
    return str; 
}
 // String을 바이트 배열로 변환 
private byte[] StringToByte(string str)
{
    byte[] StrByte = Encoding.UTF8.GetBytes(str); 
    return StrByte; 
}



/*                                                                                                                                                                 

 *     clock_gettime

 * gcc -Wall -o now now.c -lrt [-D_LOCAL_TIME]

 */

#include <stdio.h>

#include <stdlib.h>

#include <time.h>


#define BUFSIZE     64


/*

    1. 현재 시간을 얻어 온다. clock_gettime / gettimeofday

    2. tm으로 변환해 정보를 출력한다. localtime_r / gmtime_r

    3. 문자열로 변환해 출력한다. asctime_r

*/


int main(void)

{

    struct timespec ts;

    struct tm tm;

    struct tm *ret_tm;


    char buf1[BUFSIZE] = { 0 };

    char *ret_asc;

    int ret;



    /* get current time (struct timespec format) */

    ret = clock_gettime (CLOCK_REALTIME, &ts);

    if (ret < 0)

    {

        perror ("clock_gettime");

        return (EXIT_FAILURE);

    }


    /* change it to 'struct tm' format */

#ifdef _LOCAL_TIME

    ret_tm = localtime_r (&ts.tv_sec, &tm);

#else

    ret_tm = gmtime_r (&ts.tv_sec, &tm);

#endif

    if (ret_tm == NULL)

    {

#ifdef _LOCAL_TIME

        perror ("localtime_r");

#else

        perror ("gmtime_r");

#endif

        return (EXIT_FAILURE);

    }


    printf ("mon: %d day: %d, %d:%d:%d\n",

      tm.tm_mon+1, tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec);


    /* make time string */

    ret_asc = asctime_r (&tm, buf1);

    if (ret_asc == NULL)

    {

        perror ("ret_asc");

        return (EXIT_FAILURE);

    }


    printf ("%s\n", buf1);



    return (EXIT_SUCCESS);

}

Setup > Terminal  메뉴에서


coding[receive]:KS5601

coding[transmit]KS5601:

locale:korean

CodePage:949



+ Recent posts