코드 한 줄을 입력하지 않고도 Linux에서 LED 드라이버를 실현할 수 있습니다!

풀어 주다: 2023-07-31 17:04:55
앞으로
1580명이 탐색했습니다.

머리말

디바이스 드라이버를 구현하려면 드라이버 코드 한 줄도 작성할 필요가 없습니다. 환상처럼 들리지 않나요?

그러나 이것이 불가능한 것은 아닙니다. 왜냐하면 전 세계 커널 개발자들은 드라이버를 작성할 수 있는 한 기본적으로 드라이버를 작성해 왔기 때문입니다.

오늘 우리는 거인의 어깨 위에 서서 우리가 원하는 기능을 달성하기 위해 커널 개발자가 작성한 드라이버를 사용합니다. 이 기사에서는 LED 드라이버에 대해 설명합니다.

LED 드라이버

imx6ull pro 개발 보드의 온보드 LED를 예로 들어 보겠습니다. 여기에는 제어 가능한 Led2가 온보드되어 있습니다.

코드 한 줄을 입력하지 않고도 Linux에서 LED 드라이버를 실현할 수 있습니다!

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。需要填三个属性:labelgpiosdefault-state

label:lable是出现在sys目录下的名字,即生成/sys/class/leds/led2

gpios:前两个值指定了该LED所连接的GPIO。第三个值可填GPIO_ACTIVE_HIGHGPIO_ACTIVE_LOWGPIO_ACTIVE_HIGH代表高电平点亮LED,GPIO_ACTIVE_LOW代表低电平点亮LED。GPIO_ACTIVE_HIGHGPIO_ACTIVE_LOWGPIO_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

电平还是低电平,注意是点亮LED,细product

🎜🎜default-state🎜:on代表默认情况LED是点亮的,off代表默认LED熄灭🎜

就是gpios属性中指 마음에 드는 点亮LED时的电平🎜

🎜设备树配置好后,编译并更换dtb ,然后重启开发板。可以看到/sys/class/leds/led2目录:🎜
코드 한 줄을 입력하지 않고도 Linux에서 LED 드라이버를 실현할 수 있습니다!

/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中通过echocat的方式控制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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:嵌入式Linux充电站
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!