阅读:8075回复:3

系统指示灯sysled配置

楼主#
更多 发布于:2019-07-26 21:20
Amlogic盒子带有系统状态指示灯,指示当前处于开机还是待机状态,在代码中我们叫sysled。硬件上就是一个GPIO口来控制的LED灯。

这部分的驱动是amlogic写好的。我们一般不需要修改。驱动代码在以下目录:
Z:\androidP\common\drivers\amlogic\led

然后我们需要打开它的访问节点,方便我们调试和在JAVA上层来控制led灯,节点的配置在dts文件中,找到对应项目的dts,如S905X项目中使用的是如下文件:
Z:\disk2-work\androidP\common\arch\arm\boot\dts\amlogic\gxl_p212_1g.dts
在dts文件中找到搜索sysled,找到如下代码进行配置:
sysled {
 compatible = "amlogic, sysled";
 dev_name = "sysled";
 status = "disabled";
 led_gpio = <&gpio GPIODV_24 GPIO_ACTIVE_HIGH>;
 led_active_low = <1>;
 };

我们看到status的状态是disabled,我们需要设置为打开,然后正确配置好实际硬件使用的GPIO口,这里可以咨询硬件同事。修改后如下:
sysled {
 compatible = "amlogic, sysled";
 dev_name = "sysled";
 status = "okay";
 led_gpio = <&gpio_ao GPIOAO_9 GPIO_ACTIVE_HIGH>;
 led_active_low = <1>;
 };

修改后,我们部分编译dts:
mark@ubuntu:~/disk2-work/androidP$  make dtbimage

更新dtsimage到板子中(拷贝dtbimage到U盘中,插入板子,然后在uboot命令行下输入):
usb_update _aml_dtb dt.img
res

顺利的话,这个节点会生成在如下位置(为何生成在这里,可以去上面提到的驱动文件中查看代码):
/sys/class/leds/led-sys/
在串口命令行下我们可以看到该目录下有如下内容:
console:/sys/class/leds/led-sys # ls -l
total 0
-rw-rw-rw- 1 root root 4096 2017-01-01 01:00 brightness
lrwxrwxrwx 1 root root    0 2017-01-01 01:12 device -> ../../../sysled
-r--r--r-- 1 root root 4096 2017-01-01 01:12 max_brightness
drwxr-xr-x 2 root root    0 2017-01-01 01:12 power
lrwxrwxrwx 1 root root    0 2017-01-01 01:12 subsystem -> ../../../../../class/leds
-rw-r--r-- 1 root root 4096 2017-01-01 01:12 trigger
-rw-r--r-- 1 root root 4096 2017-01-01 01:12 uevent

其中控制led红绿变化的节点就是brightness,通过读写改节点达到控制led变化:
console:/sys/class/leds/led-sys # echo 0 > brightness              //使led变红灯
console:/sys/class/leds/led-sys # echo 1 > brightness              //使led变绿灯

至此我们实现了串口命令行控制led灯变化,如果我们需要在java代码中来控制led,应该如何做呢。
思路很简单,把节点当做文件去读取就行了。

为了能够各个角色(APP应用)都有权限访问改节点,我们需要修改这个节点的默认权限,在以下位置增加权限设置指令:
Z:\androidP\device\amlogic\common\products\mbox\init.amlogic.system.rc
   #power
    chmod 664 /sys/power/early_suspend_trigger
    chown root system /sys/power/early_suspend_trigger

   #add by mark for sysled control
   chmod 666 /sys/class/leds/led-sys/brightness
    
    #di detect 3D
    chmod 664 /sys/module/di/parameters/det3d_en

设置好权限后,我们在java中可以使用如下方法对节点写操作:
private void  switchLed(boolean onoff){
        File led_file = new File("/sys/class/leds/led-sys/brightness");
        if(!led_file.exists()){
            return;
        }
        try {
            BufferedWriter out = new BufferedWriter(new FileWriter(led_file), 4);
     if(onoff){
               out.write("0");
     }else{
               out.write("1");
     }
            out.flush();
            out.close();
         } catch (IOException e) {
            e.printStackTrace();
         }
}

欢迎点赞收藏,回帖评论交流。

最新喜欢:

zhaoyf13zhaoyf... yamyam
If you have nothing to lose, then you can do anything.
沙发#
发布于:2019-07-27 08:14
写的不错
[url]http://190.lsal.cn/195/1329.gif?0728100424873[/url]
板凳#
发布于:2019-11-04 14:51
想问下你们的机器,默认的时候sys_led不会被控制吗,我目前没有找到对应控制的代码,真待机时系统灯会变化,我之前试着把待机灯的class节点名字换了就不会被控制了,说明肯定是用了这个接口,但在其他位置就是没有找到具体控制的代码,你们有谁了解这部分的吗?我目前的解决方法是节点名字换成不是默认的sys_led,然后自己控制,但还是想改了原有的位置,像网络指示灯就是aml自己加到了vendor下面。
地板#
发布于:2021-01-09 11:17
我们是LED三色灯,使用gpio-leds, 修改DTS如下:
        gpio-leds {
                compatible = "gpio-leds";

                led-blue {
                        label = "blue";
                        gpios = <&gpio_ao GPIOAO_5 GPIO_ACTIVE_HIGH>;
                };

                led-green {
                        label = "green";
                        gpios = <&gpio GPIODV_2 GPIO_ACTIVE_HIGH>;
                };

                led-red {
                        label = "red";
                        gpios = <&gpio GPIODV_11 GPIO_ACTIVE_HIGH>;
                };
                led-power {
                        label = "power";
                        gpios = <&gpio_ao GPIOAO_7 GPIO_ACTIVE_LOW>;
                };

        };
T972上面默认没有编译HAL的light模块,要在makefile中加个lights.amlogic,然后在hardware/amlogic/lights/lights.c中加入
+#define LEDLIGHT_RED "/sys/class/leds/red/brightness"
+#define LEDLIGHT_GREEN "/sys/class/leds/green/brightness"
+#define LEDLIGHT_BLUE "/sys/class/leds/blue/brightness"
+
+static pthread_once_t g_init = PTHREAD_ONCE_INIT;
+static pthread_mutex_t g_lock = PTHREAD_MUTEX_INITIALIZER;
+
+
+void init_globals(void)
+{
+    // init the mutex
+    pthread_mutex_init(&g_lock, NULL);
+}
+
+static int write_int(char const* path, int value)
+{
+    int fd;
+    static int already_warned = 0;
+
+    fd = open(path, O_RDWR);
+    if (fd >= 0) {
+        char buffer[32] = {0,};
+        int bytes = snprintf(buffer, sizeof(buffer), "%d\n", value);
+        int amt = write(fd, buffer, bytes);
+        close(fd);
+        return amt == -1 ? -errno : 0;
+    } else {
+        if (already_warned == 0) {
+            ALOGE("write_int failed to open %s\n", path);
+            already_warned = 1;
+        }
+        return -errno;
+    }
+}

+static int set_light_notifications(struct light_device_t* dev __unused, struct light_state_t const* state)
+{
+    pthread_mutex_lock(&g_lock);
+    set_light_locked(state, 0);
+    pthread_mutex_unlock(&g_lock);
+
+    return 0;
+}
+static int set_light_locked(struct light_state_t const* state, int type __unused)
 {
-    /* @Waiting for later implementation. */
-    D( "%s: Not implemented.", __FUNCTION__ );
+    int red, green, blue;
+    int onMS, offMS;
+    unsigned int colorRGB;
+
+    colorRGB = state->color;
+
+    D("set_light_locked mode %d, colorRGB=%08X, onMS=%d, offMS=%d\n", __FUNCTION__, state->flashMode, colorRGB, onMS, offMS);
+
+    red = (colorRGB >> 16) & 0xFF;
+    green = (colorRGB >> 8) & 0xFF;
+    blue = colorRGB & 0xFF;
+
+    write_int(LEDLIGHT_RED, red);
+    write_int(LEDLIGHT_GREEN, green);
+    write_int(LEDLIGHT_BLUE, blue);
 
     return 0;
 }
就能在Java中使用
mAttentionLight = mLightsManager.getLight(LightsManager.LIGHT_ID_ATTENTION);
mAttentionLight.setFlashing(color, Light.LIGHT_FLASH_HARDWARE, (on ? 3 : 0), 0);
控制了.
color为0xRRGGBB, 0灭非0亮
游客

返回顶部