Realisasikan pemacu LED di bawah Linux tanpa menaip baris kod!

Lepaskan: 2023-07-31 17:04:55
ke hadapan
1589 orang telah melayarinya

Kata Pengantar

Jika anda ingin melaksanakan pemacu peranti, anda tidak perlu menulis satu baris kod pemandu Bukankah ini kedengaran seperti fantasi?

Tetapi ini tidak boleh dicapai, kerana pembangun kernel di seluruh dunia sangat bersemangat selagi mereka boleh menulis pemacu, mereka pada dasarnya telah menulisnya.

Hari ini, kami berdiri di atas bahu gergasi dan menggunakan pemacu yang telah ditulis oleh pembangun kernel untuk mencapai fungsi yang kami mahukan Artikel ini membincangkan pemacu LED.

Pemandu LED

Kami mengambil LED onboard papan pembangunan imx6ull pro sebagai contoh Ia mempunyai Led2 yang boleh dikawal. -perintang atas. Pin lain disambungkan ke

dan mengeluarkan tahap rendah untuk menyalakan LED. Inilah cara untuk mengawal LED ini.
Realisasikan pemacu LED di bawah Linux tanpa menaip baris kod!

Konfigurasi kernel: GPIO5_3,因此GPIO5_3

 Device Drivers  --->
  [*] LED Support  --->
   <*>   LED Class Support
   <*>   LED Support for GPIO connected LEDs
   [*]   LED Trigger support  --->
Salin selepas log masuk
Pemacu LED kami adalah berdasarkan GPIO, jadi kami perlu menghidupkan sokongan pemacu LED kernel. Inti mempunyai dua pemacu yang sepadan, iaitu pemandu GPIO

dan

pemandu LED

Pemandu LED berasaskan GPIO memanggil fungsi yang dieksport oleh pemacu GPIO. Untuk kod pelaksanaan pemacu LED, sila rujuk: drivers/leds/leds-gpio.c Ia melaksanakan kelas led untuk mengawal LED melalui antara muka sysfs.

设备树:

leds{
 compatible = "gpio-leds";
 
        led2{
            label = "led2";
            gpios = <&gpio5 3 GPIO_ACTIVE_LOW>;//GPIO_ACTIVE_LOW,代表低电平点亮LED
            default-state = "on";
        };
}
Salin selepas log masuk

在设备树中创建一个名为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

这里注意了,gpios属性的第三个参数,代表该逜行话话LED灭

这里又注意了,当defalut-state为on时,实际上gpio输凹的甓出的生LED以看到/sys/class/leds/led2目录:🎜

Realisasikan pemacu LED di bawah Linux tanpa menaip baris kod!

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

点亮LED:

echo 0 > /sys/class/leds/led2/brightness
Salin selepas log masuk

熄灭LED:

echo 1 > /sys/class/leds/led2/brightness
Salin selepas log masuk

应用层控制

除了可以在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;
}
Salin selepas log masuk

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

Atas ialah kandungan terperinci Realisasikan pemacu LED di bawah Linux tanpa menaip baris kod!. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
sumber:嵌入式Linux充电站
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!