2010/09/12

mini howto : led framework for linux kernel

linux kernel을 처음 접한지 얼마 되지 않은 F/W 개발자가 led를 제어하려 할때 난감해 하는 경우를 종종 보게 된다. device중에 가장 단순하다 보니 단순히 Processor쪽의 register를 직접 제어해서 port 를 제어하거나, 혹은 gpio 관련 API에 대해 알고 있을 경우 board 관련된 driver를 처음부터 직접 다 만드는 수고를 하게 된다.

하지만, linux kernel은 이러한 case를 충분히 커버할 수 있는 이식성있는 매력적인 code 덩어리이다. led관련 framework과 driver들이 버젓이 존재한다. 직접 led를 제어하는 driver를 개발하거나 혹은 억지로 linux kernel style에 맞지 않는 register 제어는 할 필요가 없는 것이다. 다음과 같은 순서를 따르게 되면, 쉽게 led framework을 사용할 수 있다.

  • configuration 
make menuconfig에서 다음을 추가한다.
  • make the code 
다음 내용을 driver나 관련 code에 삽입한다. include/linux/leds.h를 include한다. 그리고 xxx_brightness_set()은 0에서 255까지의 value를 인자로 받고 그 인자값으로 led의 밝기나 혹은 다른 것들을 제어할 수 있는 함수이다. 내부에서 register나 gpio framework을 이용해 직접적으로 led를 제어하는 code를 생성한다. led_classdev structure를 이용해 name을 설정해주고, brightness_set에 위에 선언된 xxx_brightness_set()에 해당되는 function의 pointer를 지정해준다. 그리고 led_class_register()와 led_classdev_unregister()로 led_classdev의 내용을 kernel에 등록하거나 혹은 제거한다.

  • setting miscellaneous
led를 반짝이고 싶다면 led_classdev structure의 아래 field를 이용한다. default_trigger에 지정될 수 있는 string은 4가지 이며 이 string의 의미에 따라 led가 점멸하는 방식이 달라진다. 이름은 각각 timer, heartbeat, backlight, default-on 이다. 의미하는 바는 직접 해보면 간단하지만, heatbeat를 강추한다. 진짜 심장 판막이 뛰듯이 led를 깜빡인다. 혹은 shell상에서 아래와 같이 string을 입력해도 같은 효과를 줄 수 있다.
  • using gpio framework
led를 직접적으로 제어해줄 code가 필요없다면, board file이나 machine code등에서 직접 led를 platform_device로 등록할 수 있다. configuration 및 선언 방법은 다음과 같다. 2개의 led1과 led2가 각각 XXXX_GPIO_X와 XXXX_GPIO_Y의 gpio에 연결되어 있다. default_trigger로 led1은 heartbeat으로 led2는 default-on으로 세팅해주고 위의 값들을 struct gpio_led에 설정해 준다. gpio_led의 pointer와 gpio_led의 size는 struct gpio_led_platform_dat의 field로 넣어준다. 이 struct가 결국 led 제어가능한 하나의 platform_device로 등록되며 여기에 platform_data로써 등록해주기만 하면 된다. 추후에, linux가 부팅이 되면 "leds-gpio"의 이름으로 되어 있는 leds-gpio.c의 platform driver를 호출하게 되어서 적절하게 동작되어 진다.

No comments:

Post a Comment