Realisieren Sie LED-Treiber unter Linux, ohne eine Codezeile eingeben zu müssen!

Freigeben: 2023-07-31 17:04:55
nach vorne
1580 Leute haben es durchsucht

Vorwort

Wenn Sie einen Gerätetreiber implementieren möchten, müssen Sie keine einzige Zeile Treibercode schreiben. Klingt das nicht nach einer Fantasie?

Aber das ist nicht unerreichbar, denn Kernel-Entwickler auf der ganzen Welt sind sehr enthusiastisch, solange sie Treiber schreiben können.

Heute stehen wir auf den Schultern von Giganten und nutzen die von Kernel-Entwicklern geschriebenen Treiber, um die von uns gewünschten Funktionen zu erreichen.

LED-Treiber

Wir nehmen die Onboard-LED des imx6ull pro-Entwicklungsboards als Beispiel. Es verfügt über eine steuerbare Led2 an Bord.

Realisieren Sie LED-Treiber unter Linux, ohne eine Codezeile eingeben zu müssen!

LED2 hat einen Pull -Up-Widerstand. Der andere Pin ist mit GPIO5_3,因此GPIO5_3 verbunden und gibt einen niedrigen Pegel aus, um die LED zum Leuchten zu bringen. So steuern Sie diese LED.

Kernel-Konfiguration:

 Device Drivers  --->
  [*] LED Support  --->
   <*>   LED Class Support
   <*>   LED Support for GPIO connected LEDs
   [*]   LED Trigger support  --->
Nach dem Login kopieren

Unser LED-Treiber basiert auf GPIO, daher müssen wir die Unterstützung des Kernel-LED-Treibers aktivieren.

Der Kernel verfügt über zwei entsprechende Treiber, nämlich GPIO-Treiber und LED-TreiberDer GPIO-basierte LED-Treiber ruft die vom GPIO-Treiber exportierte Funktion auf.

Den LED-Treiber-Implementierungscode finden Sie unter: drivers/leds/leds-gpio.c. Er implementiert eine LED-Klasse zur Steuerung von LEDs über die sysfs-Schnittstelle.

设备树:

leds{
 compatible = "gpio-leds";
 
        led2{
            label = "led2";
            gpios = <&gpio5 3 GPIO_ACTIVE_LOW>;//GPIO_ACTIVE_LOW,代表低电平点亮LED
            default-state = "on";
        };
}
Nach dem Login kopieren

在设备树中创建一个名为leds的节点,compatible"gpio-leds",这样可以匹配到leds-gpio.c的驱动。

然后创建一个子节点,名为led2。需要填三个属性:labelgpiosdefault-state

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

GPIOs Radius: 4px;Rand-rechts: 2px;Rand-links: 2px;Hintergrundfarbe: rgba(27, 31, 35, 0,05);Schriftfamilie: „Operator Mono“, Consolas, Monaco, Menlo, Monospace;word- break: break-all;color: rgb(239, 112, 96);">GPIO_ACTIVE_HIGH或GPIO_ACTIVE_LOWGPIO_ACTIVE_HIGH代表高电平点亮LED,GPIO_ACTIVE_LOW代表低电平点亮LED。

GPIO_ACTIVE_HIGH或GPIO_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/led2default-state

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

/sys/class/leds/led2目录:🎜

Realisieren Sie LED-Treiber unter Linux, ohne eine Codezeile eingeben zu müssen!

/sys/class/leds/led2/目录下有一个brightnes文件,可以通过echo cat的方式查看和修改LED的亮度。因为LED连接在GPIO上,所以亮度只有0和1,在本文示例的led2中,0表示点亮,1表示熄灭。

点亮LED:

echo 0 > /sys/class/leds/led2/brightness
Nach dem Login kopieren

熄灭LED:

echo 1 > /sys/class/leds/led2/brightness
Nach dem Login kopieren

应用层控制

除了可以在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;
}
Nach dem Login kopieren

上述应用层代码执行后,led2会闪烁。

Das obige ist der detaillierte Inhalt vonRealisieren Sie LED-Treiber unter Linux, ohne eine Codezeile eingeben zu müssen!. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:嵌入式Linux充电站
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!