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.
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.
#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!
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