초기화 할 때 gpio_request 를 하고 값을 셋팅하는 걸 한방에 할 수 있는 방법!
gpio_request_one 을 쓰시라~
int gpio_request_one(unsigned gpio, unsigned long flags, const char *label);
기존의 GPIOF_ 가 다음과 같으므로
* GPIOF_DIR_IN - to configure direction as input
* GPIOF_DIR_OUT - to configure direction as output
* GPIOF_INIT_LOW - as output, set initial level to LOW
* GPIOF_INIT_HIGH - as output, set initial level to HIGH
flags 에는 다음과 같은 값들을 쓸 수 있다. 이름을 보면 대충 뭐하는지 다 알 듯.
* GPIOF_IN - configure as input
* GPIOF_OUT_INIT_LOW - configured as output, initial level LOW
* GPIOF_OUT_INIT_HIGH - configured as output, initial level HIGH
그리고 array 로 만들어서 한방에 할 수도 있다.
static struct gpio leds_gpios[] = {
{ 32, GPIOF_OUT_INIT_HIGH, "Power LED" }, /* default to ON */
{ 33, GPIOF_OUT_INIT_LOW, "Green LED" }, /* default to OFF */
{ 34, GPIOF_OUT_INIT_LOW, "Red LED" }, /* default to OFF */
{ 35, GPIOF_OUT_INIT_LOW, "Blue LED" }, /* default to OFF */
{ ... },
};
err = gpio_request_array(leds_gpios, ARRAY_SIZE(leds_gpios));
if (err)
...
당연히 array 를 free하는 것도 있다.
gpio_free_array(leds_gpios, ARRAY_SIZE(leds_gpios))
request 할 때 맨 뒤의 label 을 만들 때 kasprintf() 를 이용하면 내부에서 kmalloc 해서 잡아준다. 런타임에 label을 정하거나 할 때 유용히 쓸 수 있다.
char *label = kasprintf(GFP_KERNEL, “LED %d”, i);
gpio_request_one(32, GPIOF_OUT_INIT_HIGH, label);
…
gpio_free(32);
kfree(label);
이 문서의 라이센스는 GPL을 따른다(This document is released under the GPL license.)