디바이스 드라이버를 구현하려면 드라이버 코드 한 줄도 작성할 필요가 없습니다. 환상처럼 들리지 않나요?
그러나 이것이 불가능한 것은 아닙니다. 왜냐하면 전 세계 커널 개발자들은 드라이버를 작성할 수 있는 한 기본적으로 드라이버를 작성해 왔기 때문입니다.
오늘 우리는 거인의 어깨 위에 서서 우리가 원하는 기능을 달성하기 위해 커널 개발자가 작성한 드라이버를 사용합니다. 이 기사에서는 LED 드라이버에 대해 설명합니다.
imx6ull pro 개발 보드의 온보드 LED를 예로 들어 보겠습니다. 여기에는 제어 가능한 Led2가 온보드되어 있습니다.
LED2에는 풀이 있습니다. -up 저항. 다른 핀은 GPIO5_3
,因此GPIO5_3
에 연결되어 LED를 켜기 위해 로우 레벨을 출력합니다. 이 LED를 제어하는 방법은 다음과 같습니다.
Device Drivers ---> [*] LED Support ---> <*> LED Class Support <*> LED Support for GPIO connected LEDs [*] LED Trigger support --->
저희 LED 드라이버는 GPIO를 기반으로 하기 때문에 커널 LED 드라이버 지원을 켜야 합니다.
커널에는 GPIO 드라이버와 LED 드라이버라는 두 개의 해당 드라이버가 있습니다. GPIO 기반 LED 드라이버는 GPIO 드라이버에서 내보낸 함수를 호출합니다.
LED 드라이버 구현 코드는 drivers/leds/leds-gpio.c를 참조하세요. sysfs 인터페이스를 통해 LED를 제어하는 LED 클래스를 구현합니다.
leds{ compatible = "gpio-leds"; led2{ label = "led2"; gpios = <&gpio5 3 GPIO_ACTIVE_LOW>;//GPIO_ACTIVE_LOW,代表低电平点亮LED default-state = "on"; }; }
在设备树中创建一个名为leds
的节点,compatible
为"gpio-leds"
,这样可以匹配到leds-gpio.c
的驱动。
然后创建一个子节点,名为led2
。需要填三个属性:label
、gpios
和default-state
。
label:lable是出现在sys目录下的名字,即生成/sys/class/leds/led2
gpios:前两个值指定了该LED所连接的GPIO。第三个值可填GPIO_ACTIVE_HIGH
GPIO_ACTIVE_LOW
。GPIO_ACTIVE_HIGH
代表高电平点亮LED,GPIO_ACTIVE_LOW
代表低电平点亮LED。GPIO_ACTIVE_HIGH
或GPIO_ACTIVE_LOW
。GPIO_ACTIVE_HIGH
代表高电平点亮LED,GPIO_ACTIVE_LOW
代表低电平点亮LED。
这里注意了,gpios属性的第三个参数,代表该gpio点亮LED是需要高电平还是低电平,注意是点亮LED,细品
default-state:on代表默认情况LED是点亮的,off代表默认LED熄灭
这里又注意了,当defalut-state为on时,实际上gpio输出的电平,就是gpios属性中指定的点亮LED时的电平
设备树配置好后,编译并更换dtb,然后重启开发板。可以看到/sys/class/leds/led2
🎜🎜default-state🎜:on代表默认情况LED是点亮的,off代表默认LED熄灭🎜电平还是低电平,注意是点亮LED,细product
🎜设备树配置好后,编译并更换dtb ,然后重启开发板。可以看到就是gpios属性中指 마음에 드는 点亮LED时的电平🎜
/sys/class/leds/led2
目录:🎜/sys/class/leds/led2/
目录下有一个brightnes
文件,可以通过echo
cat
的方式查看和修改LED的亮度。因为LED连接在GPIO上,所以亮度只有0和1,在本文示例的led2中,0表示点亮,1表示熄灭。
点亮LED:
echo 0 > /sys/class/leds/led2/brightness
熄灭LED:
echo 1 > /sys/class/leds/led2/brightness
除了可以在shell中通过echo
、cat
的方式控制Led,我们也可以在写一个应用层程序来操作/sys/class/leds/
下的节点,应用层代码:
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <errno.h> #include <fcntl.h> #include <string.h> #include <sys/stat.h> #include <sys/types.h> #define LED_DEV_PATH "/sys/class/leds/led%d/brightness" #define ON #define OFF int fs4412_set_led(unsigned int lednum, unsigned int mode) { int fd; int ret; char devpath[128]; char *on = "1\n"; char *off = "0\n"; char *m = NULL; snprintf(devpath, sizeof(devpath), LED_DEV_PATH, lednum); fd = open(devpath, O_WRONLY); if (fd == -1) { perror("fsled->open"); return -1; } if (mode == ON) m = on; else m = off; ret = write(fd, m, strlen(m)); if (ret == -1) { perror("fsled->wrtie"); close(fd); return -1; } close(fd); return 0; } int main(int argc, char *argv[]) { unsigned int lednum = 2; while(1){ fs4412_set_led(lednum, on); usleep(500000); fs4412_set_led(lednum, OFF); usleep(500000); lednum++; if (lednum > 5) lednum = 2; } return 0; }
上述应用层代码执行后,led2会闪烁。
위 내용은 코드 한 줄을 입력하지 않고도 Linux에서 LED 드라이버를 실현할 수 있습니다!의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!