字符设备驱动:LED内核实现方式

1. 环境:

1.1 开发板:正点原子 I.MX6U ALPHA V2.2

1.2 开发PC:Ubuntu20.04

1.3 U-boot:uboot-imx-rel_imx_4.1.15_2.1.0_ga.tar.bz2

1.4 LInux内核:linux-imx-rel_imx_4.1.15_2.1.0_ga.tar.bz2

1.5 rootfs:busybox-1.29.0.tar.bz2制作

1.6 交叉编译工具链:gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf.tar.xz

 

2. 硬件控制说明

2.1 由GPIO1 PIN3控制,高---熄灭, 低---点亮

 

3. 将LED驱动编译进内核,路径:Device Drivers--->LED Support--->LED Support for GPIO connected LEDs

字符设备驱动:LED内核实现方式

 

4. 修改设备树,在根节点"/{}"中增加gpioled子节点,此实验效果为,系统启动完毕,LED就会自动心跳闪烁

 1     gpioled {
 2         compatible = "gpio-leds";    //此属性一定要是gpio-leds,否则驱动无法匹配,即与drivers\leds\leds-gpio.c的of_match_table一致
 3 
 4         //增加LED节点,根据需要增加,这里增加一个
 5         led0 {
 6             label = "red";    //可选项,起一个别名,可用于测试代码或者其他程序打开
 7             gpios = <&gpio1 3 GPIO_ACTIVE_HIGH>;    //给节点赋初值
 8             linux,default-trigger = "heartbeat";    //设置心跳
 9             default-state = "on";                    //设置默认状态为开启
10         };
11     };

 

5. 测试代码

字符设备驱动:LED内核实现方式
 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <sys/types.h>
 4 #include <sys/stat.h>
 5 #include <fcntl.h>
 6 
 7 #define LED_ON                  1
 8 #define LED_OFF                 0
 9 
10 
11 int main(int argc, char **argv)
12 {
13     int fd;
14 
15     fd = open("/sys/class/leds/red/brightness", O_RDWR);
16 
17     printf("fd = %d\n", fd);
18     if(fd < 0)
19     {
20         perror("open fail!\n");
21 
22         exit(1);
23     }
24 
25 #if 0
26 
27     if(strcmp(argv[1], "on") == 0)
28     {
29         if(ioctl(fd, LED_ON) < 0)
30             perror("ioctrl fail:led on\n");
31         else
32             printf("ioctl ok:led on\n");
33     }
34     else if(strcmp(argv[1], "off") == 0)
35     {
36         if(ioctl(fd, LED_OFF) < 0)
37              perror("ioctrl fail:led off\n");
38         else
39             printf("ioctl ok:led off\n");
40     }
41     else
42     {
43         perror("command is invalid!\n");
44     }
45 
46 
47 #else
48      if(strcmp(argv[1], "on") == 0)
49      {
50     
51         if(write(fd, "1", sizeof("1")) < 0)
52         {
53             perror("write fail:led on!\n");
54             exit(1);
55         }
56         else
57         {
58             printf("write ok:led on!\n");
59         }
60      }
61      else if(strcmp(argv[1], "off") == 0)
62      {
63   
64         if(write(fd, "0", sizeof("0")) < 0)
65         {
66             perror("write fail:led off!\n");
67             exit(1);
68         }
69         else
70         {
71             printf("write ok:led off!\n");
72         }
73      }
74      else
75     {
76         perror("command is invalid!\n");
77     }
78 
79 
80 #endif
81 
82     close(fd);
83     return 0;
84 }
View Code

 

总结:

1. 内核需要增加LED驱动的支持

2. 设备树中,在根目录下增加对LED节点,且对其属性进行设置

3. 测试代码,写入的是"1"或“0”字符串,进行控制

 

上一篇:GPIO位带操作点亮LED,且使用按键控制开关


下一篇:STM32F103寄存器方式点亮LED流水灯