阅读:8075回复:3
系统指示灯sysled配置
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 { 我们看到status的状态是disabled,我们需要设置为打开,然后正确配置好实际硬件使用的GPIO口,这里可以咨询硬件同事。修改后如下: sysled { 修改后,我们部分编译dts: mark@ubuntu:~/disk2-work/androidP$ make dtbimage 更新dtsimage到板子中(拷贝dtbimage到U盘中,插入板子,然后在uboot命令行下输入): usb_update _aml_dtb dt.img 顺利的话,这个节点会生成在如下位置(为何生成在这里,可以去上面提到的驱动文件中查看代码): /sys/class/leds/led-sys/ 在串口命令行下我们可以看到该目录下有如下内容: console:/sys/class/leds/led-sys # ls -l 其中控制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 设置好权限后,我们在java中可以使用如下方法对节点写操作: private void switchLed(boolean onoff){ 欢迎点赞收藏,回帖评论交流。 |
|
|
沙发#
发布于:2019-07-27 08:14
写的不错
|
|
|
板凳#
发布于: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亮 |
|