Heim > Artikel > Betrieb und Instandhaltung > Realisieren Sie LED-Treiber unter Linux, ohne eine Codezeile eingeben zu müssen!
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.
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.
Device Drivers ---> [*] LED Support ---> <*> LED Class Support <*> LED Support for GPIO connected LEDs [*] LED Trigger support --->
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"; }; }
在设备树中创建一个名为leds
的节点,compatible
为"gpio-leds"
,这样可以匹配到leds-gpio.c
的驱动。
然后创建一个子节点,名为led2
。需要填三个属性:label
、gpios
和default-state
。
label:lable是出现在sys目录下的名字,即生成/sys/class/leds/led2
GPIO_ACTIVE_LOW
。GPIO_ACTIVE_HIGH
代表高电平点亮LED,GPIO_ACTIVE_LOW
代表低电平点亮LED。
GPIO_ACTIVE_HIGH或<code style='font-size: 14px;overflow-wrap: break-word;padding: 2px 4px;border-radius: 4px;margin-right: 2px;margin-left: 2px;background-color: rgba(27, 31, 35, 0.05);font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace;word-break: break-all;color: rgb(239, 112, 96);'>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,然后重启开发板。可以看到
: on代表默认情况LED是点亮的, off代表默认LED熄灭🎜/sys/class/leds/led2
default-state/sys/class/leds/led2目录:🎜<figure data-tool="mdnice编辑器" style="margin-top: 10px;margin-bottom: 10px;display: flex;flex-direction: column;justify-content: center;align-items: center;"><img src="https://img.php.cn/upload/article/001/275/014/4273c46fe81bea65814fbece8c3741cc-1.png" alt="Realisieren Sie LED-Treiber unter Linux, ohne eine Codezeile eingeben zu müssen!" ></figure></p> <p data-tool="mdnice编辑器" style="padding-top: 8px;padding-bottom: 8px;line-height: 26px;"><code style='font-size: 14px;overflow-wrap: break-word;padding: 2px 4px;border-radius: 4px;margin-right: 2px;margin-left: 2px;background-color: rgba(27, 31, 35, 0.05);font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace;word-break: break-all;color: rgb(239, 112, 96);'>/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会闪烁。
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!