본문 바로가기

Programming/Linux_Kernel

GPIO control 을 user 에 넘기는 세련된 방법


아주 특별한 경우에 있어서 gpio control 을 user application 에 넘기는 경우가 있습니다.

저는 sysfs 를 사용할까 했었는데 더 세련된 방법이 있더군요.

gpio_request(gpio, "Test_Pin");
gpio_cfgpin(gpio, GPIO_OUTPUT);
gpio_direction_output(gpio, 1);
gpio_export(gpio, 1);

바로 gpio_export()
라는 함수입니다.

이 함수를 사용하면

/sys/class/gpio/

위치에 해당 포트에 대한 pin node 가 생성되어서 user 단에서 r/w 가 가능해 집니다.

다만 유의할 점은
gpio_free()
함수를 호출하면 export 된 정보가 사라진 다는 점입니다.
따라서 gpio_free 는 system 종료나 루틴 fail 시에 호출하는것이 적절할 것입니다.

또한 동적으로 하는 방법도 있습니다.

:/sys/class/gpio # ls

export

gpio240

gpio48

gpiochip0

gpiochip229

unexport

 
여기에 다음과 같이 입력하시면 10번 gpio 를 control 할 수 있습니다.

echo 10 > export

해당 pin 에 부합되는 번호는 gpio ball name 의 define 이 있는 파일에 가면 주로 볼 수 있습니다.

< gpio-names.h >
...
#define TEGRA_GPIO_PF6 46

#define TEGRA_GPIO_PF7 47

#define TEGRA_GPIO_PG0 48

#define TEGRA_GPIO_PG1 49

#define TEGRA_GPIO_PG2 50

#define TEGRA_GPIO_PG3 51

#define TEGRA_GPIO_PG4 52

#define TEGRA_GPIO_PG5 53

#define TEGRA_GPIO_PG6 54

#define TEGRA_GPIO_PG7 55
... 

 
참고로 gpio 를 pin num 가 아닌 request 시의 name.. (정확히는 label 이라고 하죠) 으로 sysfs 를 만들 수 있는 패치도 있습니다.
매우 유용해 보이네요.

http://linux.derkeiler.com/Mailing-Lists/Kernel/2009-04/msg09400.html