이번 필기 노트에서는 리눅스에서 echo “명령어” > trigger로 BeagleBone Black LED 제어하는 것이 아니고, C로 코딩해서 구현해보고자 한다.
코드
기초 분석
예제 파일을 분석해보았을 때 입력 인자가 3개가 아니면 구동이 되지 않게 되어있다. 여기서 유저가 입력하는 입력 인자는 2개이다. 왜냐면 첫 인자는 파일의 디렉토리를 의미하기 때문이다. 그 입력 순서를 정하자면 아래와 같다.
![](https://dkeemin.com/wp-content/uploads/2021/10/image1-2-845x258.png)
1. 파일 디렉토리(./BBB_user_led) 2. 설정 옵션(밝기, 트리거) 3. 설정 값(밝기의 경우 0,1, tirgger의 경우 heartbeat 등을 입력)
![](https://dkeemin.com/wp-content/uploads/2021/10/image2-845x574.png)
옵션 이름이 원한 것과 다른 입력 값이 들어오면 문제 메세지를 발송하고, 맞는다면 해당 옵션에 따른 함수를 구동한다.
Brightness 제어
![](https://dkeemin.com/wp-content/uploads/2021/10/image3-845x653.png)
설정 값은 0 또는 1만 해당되고, 구동할 USER LED의 ON/OFF를 제어한다.
![](https://dkeemin.com/wp-content/uploads/2021/10/image4-845x535.png)
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 제어도 기본적인 개념은 비슷하다.
![](https://dkeemin.com/wp-content/uploads/2021/10/image5-845x396.png)
trigger로 사용할 입력이 들어오지 않으면 동작하지 않게 설정이 되어 있다. 그리고 사용할 입력이 맞게 들어오면 제어 함수를 실행한다.
![](https://dkeemin.com/wp-content/uploads/2021/10/image6-845x523.png)
/brightness가 아니고 /trigger로 바뀐 것과 입력 값이 int가 아닌 (char *)형태로 들어온 것을 제외한 것을 제외하곤 함수 내용이 비슷하다.
이클립스로 크로스 컴파일러 환경을 구축하고 ssh로 접속해서 제어 함수를 구동하니 잘 되는 것을 확인할 수 있었지만, USER LED를 직접 제어하지 못하니 못내 아쉬워서 코드를 수정해 보고 구동했다.
구동하기
그래서 코드를 수정해서 구동시켜보았다.
![](https://dkeemin.com/wp-content/uploads/2021/10/image7.png)
컨트롤할 led를 선택하고 선택할 수 있게 해놓았다.
![](https://dkeemin.com/wp-content/uploads/2021/10/image8.png)
BeagleBone Black Led 제어가 정상적으로 잘 구동된 것을 볼 수 있다.