반응형

포팅된 touchscreen을 TSLIB에서 사용하기 위해서, ts_test 등의 tslib를 사용 할 때,

나타나는 현상


/dev/input/event0로에서 'cat /dev/input/event0 | hexdump' 를 통해 정상적 이벤트가 발생됨을 확인을 전제


TSLIB 환경변수 및 ts.conf 또한 정상적으로 세팅 되어있을때,


동작하지 않을경우에는 커널버전 과 TSLIB Protocol 버전 또는


evbit 등의 세팅이 맞지 않을경우이다.


최신의 TSLIB는 뜨지 않으며, 낮은버전을 사용할 경우 발생 하게 되는데

patch work를 통해 확인한 결과는 아래와 같다.


 static int check_fd(struct tslib_input *i)
 {
 	struct tsdev *ts = i->module.dev;
 	int version;
-	u_int32_t bit;
-	u_int64_t absbit;
+	long evbit[BITS_TO_LONGS(EV_CNT)];
+	long absbit[BITS_TO_LONGS(ABS_CNT)];
+	long keybit[BITS_TO_LONGS(KEY_CNT)];
 
-	if (! ((ioctl(ts->fd, EVIOCGVERSION, &version) >= 0) &&
-		(version == EV_VERSION) &&
-		(ioctl(ts->fd, EVIOCGBIT(0, sizeof(bit) * 8), &bit) >= 0) &&
-		(bit & (1 << EV_ABS)) &&
-		(ioctl(ts->fd, EVIOCGBIT(EV_ABS, sizeof(absbit) * 8), &absbit) >= 0) &&
-		(absbit & (1 << ABS_X)) &&
-		(absbit & (1 << ABS_Y)) && (absbit & (1 << ABS_PRESSURE)))) {
-		fprintf(stderr, "selected device is not a touchscreen I understand\n");
+	if (ioctl(ts->fd, EVIOCGVERSION, &version) < 0) {
+		fprintf(stderr, "tslib: Selected device is not a Linux input event device\n");
 		return -1;
 	}
 


위와 같이 input-raw.c 에서 EV_VERSION과 ,evbit과 absbit 등을 ioctl로 확인 후에 touch driver로 인식한다.

이 과정에서 맞지 않을 경우 비정상 종료가 이루어져 driver가 제대로 호출되지 않게 된다.


그에 따라 input driver의 bit세팅값 또는 EV_VERSION을 확인해야 한다.


단적인 예로


낮은버전은 0x010000이여야만 가능하다.


TSLIB가 높은 경우 + 코드와 같이 버전과 관계없이 실행된다.

File - "<kernel home>/include/linux/input.h"

-- #define EV_VERSION              0x010000

++ #define EV_VERSION              0x010001

이외의 상황이라면,

driver의 문제 또는 ts.conf의 값을 변경해야함

반응형
반응형

크로스 컴파일 실행파일 no such file or directory 문제




크로스 컴파일 하여 타겟 보드에 넣었을 때 실행되지 않고,

no such file or directory 가 출력되는 경우에 해결하는 방법입니다.


실행시 no such file or directory가 출력되는 실행파일을 file 명령어를 통해

Shared Library를 확인 합니다.


file 해당파일

ex)

test: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.3, for GNU/Linux 2.6.16, not stripped


file 명령어를 실행하면 그 파일의 ELF 정보 및 사용하는 공유 라이브러리 정보가 나옵니다.


실행파일에서 사용하는 공유라이브러리가 /lib 혹은 /etc/ld.so.conf 파일에 저장되어 있는 경로에 있는지 확인 합니다.


없을 경우에는 타겟보드에 저장된 올바른 라이브러리 파일을 생성하거나 심볼릭 링크를 통해 생성 합니다.



ex) ld-linux.so.3 파일이 없어서 나타나는 경우


/lib 디렉토리내에 ld-linux.so.3가 없어 나타나는 경우에는 대게 arm 라이브러리 중 ld-linux-armhf.so.3가 있습니다.


ld-linux.so.3는 프로그램이 메모리에 적재되는 시점에서 실행에 필요한 라이브러리를 링킹해주는 파일입니다.


이 링킹은 target platform인 Arm 에서는 ld-linux-armhf.so.3가 담당합니다. 그에 따라 복사 또는 파일명 변경이 아닌 심볼릭 링크를 걸어주어야 합니다.



sudo ln -s /lib/ld-linux-armhf.so.3 /lib/ld-linux.so.3


정상적으로 파일을 생성 혹은 링크했다면, 재실행 시 문제되지 않고 정상 실행이 될 것 입니다.

반응형
반응형

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/



반응형
반응형



/*                                                                                                                                                                 

 *     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



반응형
반응형


linux 부팅 시 프로그램이 실행되도록 간단하게 하기



/etc/rc.d/rc.local



/etc/rc.d/rc.local 파을을 열어 제일 뒤쪽에 부팅시 실행시킬 명령어 및 프로그램 등을 추가 입력해 주면 부팅 시 rc.local 스크립트가 실행될 때

같이 실행 되게 됩니다. (터미널에 넣는 명령어를 넣으면 됩니다.)

반응형

'System Programming > Tips' 카테고리의 다른 글

현재시간 얻어오기  (0) 2016.10.04
teraterm 한글 깨짐 및 설정  (0) 2016.09.21
리눅스 압축 / 압축 해제 (zip, tar, tar.gz, tar.bz2)  (0) 2016.09.02
u-boot 분석  (0) 2016.07.11
임베디드 보드 포팅 순서  (0) 2016.07.06

+ Recent posts