lizhuming


前言

  • 接下来记录的是 led子系统
  • 目前不涉及驱动源码

linux子系统

  • 在 Linux 系统中
    • 绝大多数硬件设备都有非常成熟的驱动框架
    • 驱动工程师使用这些框架添加与板子相关的硬件支持
      • 建立硬件与Linux内核的联系
    • 内核再通过统一文件系统接口呈现给用户
    • 用户通过对应的设备文件控制硬件。

led子系统

  • led子系统相关描述可在内核源码 Documentation/leds/leds-class.txt 了解。
  • led子系统是一个简单的 linux子系统 ,在目录 /sys/class/leds 下展示该子系统设备。
/sys/class/leds下的目录 对应的LED灯设备
input2::capslock 键盘大写锁定指示灯
input2::numlock 键盘数字键盘指示灯
input2::scrolllock 键盘ScrollLock指示灯
  • 一些属性值

    • brightness
      • brightness 的最大值在 max_brightness 文件中定义。
      • brightness 的值在 brightness 文件中定义。
      • 注意:大部分 led 不支持亮度调节。
    • trigger.
      • 常见的触发方式
        • none:无触发方式
        • disk-activity:硬盘活动
        • nand-disknand:flash活动
        • mtd:mtd设备活动
        • timer:定时器
        • heartbeat:系统心跳
      • 查看触发方式
        • cat triggerx86平台
          • 查看该文件的内容时,该文件会 列出它的所有可用触方式,而当前使用的触发方式会以“[]”符号括起。

      • 修改触发方式
        • 例子:echo none > /sys/class/leds/ledA/trigger
          • none:none触发方式
          • ledA:ledA设备
        • 修改后,便按新的触发方式触发
  • 设计哲学

    • 简单哈哈
  • 推荐命名格式

    • "设备名字:颜色:功能"
  • API(后面分析驱动再介绍

    • led_set_brightness
    • led_set_brightness_sync
    • led_classdev_register
    • led_classdev

led子系统实战-系统调用-ARM平台

  • 先在终端运行

    • 查询触发方式:cat trigger注意图中 []

    • 修改触发方式 (注意图中 []

  • 使用系统调用方式 APP

    • main.c 文件
/** @file         main.c
 *  @brief        简要说明
 *  @details      详细说明
 *  @author       lzm
 *  @date         2020-11-10 17:01:15
 *  @version      v1.0
 *  @copyright    Copyright By lizhuming, All Rights Reserved
 *
 **********************************************************
 *  @LOG 修改日志:
 **********************************************************
*/

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <fcntl.h>

//ARM 开发板 LED 设备的路径
#define RLED_DEV_PATH "/sys/class/leds/red/brightness"
#define GLED_DEV_PATH "/sys/class/leds/green/brightness"
#define BLED_DEV_PATH "/sys/class/leds/blue/brightness"

int main(int argc, char *argv[])
{
    int res = 0;
    int r_fd;
    int g_fd;
    int b_fd;
    
    printf("this is the led demo\n");

    // 获取 LED 设备文件描述符
    r_fd = open(RLED_DEV_PATH, O_WRONLY);
    if(r_fd < 0){
        printf("Fail to open %s device\n",RLED_DEV_PATH);
        exit(1);
    }
    g_fd = open(GLED_DEV_PATH, O_WRONLY);
    if(g_fd < 0){
        printf("Fail to open %s device\n",GLED_DEV_PATH);
        exit(1);
    }
    b_fd = open(BLED_DEV_PATH, O_WRONLY);
    if(b_fd < 0){
        printf("Fail to open %s device\n",BLED_DEV_PATH);
        exit(1);
    }

    while(1){
        write(r_fd, "255", 3);
        sleep(2);
        write(g_fd, "255", 3);
        sleep(1);
        write(r_fd, "0", 1);
        sleep(2);
        write(g_fd, "0", 1);
        sleep(1);
        write(b_fd, "255", 3);
        sleep(1);
        write(b_fd, "0", 1);
        sleep(1);
    }
}

相关文章: