Programming/Linux_Kernel
GPIO control 을 user 에 넘기는 세련된 방법
decdream
2010. 12. 14. 16:16
아주 특별한 경우에 있어서 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_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