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.
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.Konfigurasi kernel: GPIO5_3
,因此GPIO5_3
Device Drivers ---> [*] LED Support ---> <*> LED Class Support <*> LED Support for GPIO connected LEDs [*] LED Trigger support --->
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. 在设备树中创建一个名为 然后创建一个子节点,名为 label:lable是出现在sys目录下的名字,即生成 gpios:前两个值指定了该LED所连接的GPIO。第三个值可填 这里注意了,gpios属性的第三个参数,代表该gpio点亮LED是需要高电平还是低电平,注意是点亮LED,细品 default-state:on代表默认情况LED是点亮的,off代表默认LED熄灭 这里又注意了,当defalut-state为on时,实际上gpio输出的电平,就是gpios属性中指定的点亮LED时的电平 设备树配置好后,编译并更换dtb,然后重启开发板。可以看到 这里注意了,gpios属性的第三个参数,代表该逜行话话LED灭 这里又注意了,当defalut-state为on时,实际上gpio输凹的甓出的生LED以看到 点亮LED: 熄灭LED: 除了可以在shell中通过 上述应用层代码执行后,led2会闪烁。设备树:
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
。/sys/class/leds/led2
GPIO_ACTIVE_HIGH
或GPIO_ACTIVE_LOW
。GPIO_ACTIVE_HIGH
代表高电平点亮LED,GPIO_ACTIVE_LOW
代表低电平点亮LED。GPIO_ACTIVE_HIGH
或GPIO_ACTIVE_LOW
。GPIO_ACTIVE_HIGH
代表高电平点亮LED,GPIO_ACTIVE_LOW
代表低电平点亮LED。/sys/class/leds/led2
/sys/class/leds/led2
目录:🎜/sys/class/leds/led2/
目录下有一个brightnes
文件,可以通过echo
cat
的方式查看和修改LED的亮度。因为LED连接在GPIO上,所以亮度只有0和1,在本文示例的led2中,0表示点亮,1表示熄灭。echo 0 > /sys/class/leds/led2/brightness
echo 1 > /sys/class/leds/led2/brightness
应用层控制
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;
}
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!