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
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. 测试代码
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”字符串,进行控制