강좌 & 팁
글 수 2,412
2015.04.13 11:56:28 (*.134.169.166)
39692
Ubuntu에서 gpio를 생성/삭제하거나 값을 넣는 방법은 sys-fs에 노드를 만들어
할 수 있다.
1) 생성하는 방법은 gpio port-number값을 /sys/class/gpio/export에 넣는 것이다.
2) 삭제하기 위해서는 같은 값은 /sys/class/gpio/unexport에 넣는다.
gpio-number는 gpio-group-number와 group내의 gpio번호에 의해 계산된다.
예를 들어 GP6_14라면 gpio-group-number은 6번이고, 'gpio번호'는 14이다.
gpio-number = (gpio-group-number - 1)*32 + 'gpio번호' = (6-1)*32 + 14 = 174
gpio 174번 노드를 생성하고자 한다면,
$ echo 174 > /sys/class/gpio/export
$ ls /sys/class/gpio/gpio174
direction
value
gpio174라는 디렉토리가 생성되며, 그 밑에 direction, value라는 파일이 만들어 진다.
gpio를 통해 값을 쓰고 싶다면, direction에 'out'이라는 문자열을 넣는다.
$ echo out > /sys/class/gpio/gpio174/direction
이제 값(0또는 1)을 주기 위해서는 value라는 파일은 이용한다.
$ echo 1 > /sys/class/gpio/gpio174/value
$ echo 0 > /sys/class/gpio/gpio174/value
$ echo 1 > /sys/class/gpio/gpio174/value
이것을 C언어의 stdio를 이용하여 만들어 보도록 한다.
일단 gpio 174번을 등록시키기 위해서 /sys/class/gpio/export파일을 연다.
fp = fopen("/sys/class/gpio/export", "w");
fprintf(fp, "174\n");
fclose(fp);
디렉토리 /sys/class/gpio/gpio174가 만들어 졌을 것이다. 다음으로
174번의 direction을 결정한다.
fp = fopen("/sys/class/gpio/gpio174/direction", "w");
fprintf(fp, "out\n");
fclose(fp);
이제, 다음과 같이 gpio에 값을 보낼 수 있다.
fp = fopen("/sys/class/gpio/gpio174/value", "w");
fprintf(fp, "1\n");
위의 코드로 실행한 결과를 보면, gpio는 실제로 값을 받지 못하게 된다.
원인은 stdio는 기본적으로 buffered-io를 하기 때문이다.
"/sys/class/gpio/gpio174/value"를 연 file-pointer('fp')를
setvbuf()함수를 이용하여 다음과 같이 unbuffered-io로 변경하여 주면 된다.
setvbuf(fp, NULL, _IONBF, 0);
다음 C-프로그램은 174번 gpio포트를 연 후 1초에 한번씩 값을 변경하면서 10회 반복하는
코드이다.