이번 필기 노트에서는 리눅스에서 echo “명령어” > trigger로 BeagleBone Black LED 제어하는 것이 아니고, C로 코딩해서 구현해보고자 한다.
코드
기초 분석
예제 파일을 분석해보았을 때 입력 인자가 3개가 아니면 구동이 되지 않게 되어있다. 여기서 유저가 입력하는 입력 인자는 2개이다. 왜냐면 첫 인자는 파일의 디렉토리를 의미하기 때문이다. 그 입력 순서를 정하자면 아래와 같다.
1. 파일 디렉토리(./BBB_user_led) 2. 설정 옵션(밝기, 트리거) 3. 설정 값(밝기의 경우 0,1, tirgger의 경우 heartbeat 등을 입력)
옵션 이름이 원한 것과 다른 입력 값이 들어오면 문제 메세지를 발송하고, 맞는다면 해당 옵션에 따른 함수를 구동한다.
Brightness 제어
설정 값은 0 또는 1만 해당되고, 구동할 USER LED의 ON/OFF를 제어한다.
STM에서 UART로 adc data를 sting으로 전송할 때 sprintf 함수를 사용한 것처럼 여기서도 snprintf를 사용한다. 기본적인 비글본블랙 이미지는 led 디바이스 드라이버를 사용한다. 디바이스 경로는 /sys/class/leds에 있으며, 디렉토리 안에서는 /beaglebone:green:usr?와 같이 되어 있다. 여기서 ?에서 0~3사이의 정수 값을 설정하면 해당 led가 제어되는 구조이다. snprintf에서 경로와 brightness 제어로 설정하고 open()함수로 해당 디바이스 파일을 연다. flag는 O_WRONLY로 해당 플레그에 대한 설명은 아래의 링크에서 확인 할 수 있다.
http://man7.org/linux/man-pages/man2/open.2.html
해당 설명을 참고하면 O_WRONLY는 read/write를 하겠다는 의미를 담은 플레그인 것을 알 수 있다.
그 다음 write 함수로 제어할 디바이스 파일(nod)의 위치와 void 형변환 값, 크기를 입력 변수로 설정해서 밝기를 제어한다.
Trigger 제어
Trigger 제어도 기본적인 개념은 비슷하다.
trigger로 사용할 입력이 들어오지 않으면 동작하지 않게 설정이 되어 있다. 그리고 사용할 입력이 맞게 들어오면 제어 함수를 실행한다.
/brightness가 아니고 /trigger로 바뀐 것과 입력 값이 int가 아닌 (char *)형태로 들어온 것을 제외한 것을 제외하곤 함수 내용이 비슷하다.
이클립스로 크로스 컴파일러 환경을 구축하고 ssh로 접속해서 제어 함수를 구동하니 잘 되는 것을 확인할 수 있었지만, USER LED를 직접 제어하지 못하니 못내 아쉬워서 코드를 수정해 보고 구동했다.
구동하기
그래서 코드를 수정해서 구동시켜보았다.
컨트롤할 led를 선택하고 선택할 수 있게 해놓았다.
BeagleBone Black Led 제어가 정상적으로 잘 구동된 것을 볼 수 있다.