Android中LCD背光驱动

2023-10-26

分类: Linux驱动 Android系统 2013-06-17 16:28 287人阅读 评论(0) 收藏 举报

其实Android的底层就是Linux,所以其驱动本质就是Linux驱动,但是这些Linux驱动是服务上层Android的,所以需遵循上Android的一些接口规范。所以涉及到的Android驱动都应应密切关注上层传递的接口。本文介绍的LCD背光驱动就是从上层一直往下层展现,但是笔者毕竟不是专注于Android上层,碍于知识不充裕,所以对上层的东西介绍得相对简单。

1.Android的Setting

Android的设置里面管理了Andoird系统的所有设置,其中当然包括了屏幕亮度设置。
Setting的源码目录在:
mydroid/packages/apps/Settings/src/com/android/settings
亮度设置的java源文件在:
mydroid/packages/apps/Settings/src/com/android/settings/BrightnessPreference.java
打开这个文件看到:
  1. public class BrightnessPreference extends SeekBarDialogPreference implements  
  2.         SeekBar.OnSeekBarChangeListener, CheckBox.OnCheckedChangeListener {  
  3.   
  4.     private SeekBar mSeekBar;  
  5.     private CheckBox mCheckBox;  
  6.   
  7.     private int mOldBrightness;  
  8.     private int mOldAutomatic;  
  9.   
  10.     private boolean mAutomaticAvailable;  
  11.   
  12.     private boolean mRestoredOldState;  
  13.   
  14.     // Backlight range is from 0 - 255. Need to make sure that user   
  15.     // doesn't set the backlight to 0 and get stuck   
  16.     private int mScreenBrightnessDim =  
  17. ...  
public class BrightnessPreference extends SeekBarDialogPreference implements
        SeekBar.OnSeekBarChangeListener, CheckBox.OnCheckedChangeListener {

    private SeekBar mSeekBar;
    private CheckBox mCheckBox;

    private int mOldBrightness;
    private int mOldAutomatic;

    private boolean mAutomaticAvailable;

    private boolean mRestoredOldState;

    // Backlight range is from 0 - 255. Need to make sure that user
    // doesn't set the backlight to 0 and get stuck
    private int mScreenBrightnessDim =
...
Android的最上层已经将背光亮度量化为了[0,255]个等级,并且提示注意不要设置为0,所以在进行最低层的背光驱动编写时,可以合理按这个范围部署背光的亮度。

2.Android的背光JNI层

背光的JNI层源码在:
mydroid/frameworks/base/services/jni/com_android_server_LightsService.cpp
这一层就是调用HAL层的方法,为上一层实现一个设置亮度接口。

3.Android的背光HAL层

Java App和JNI一般是google维护的,所以源码位置相对固定,HAL有产品商开发维护的,所以位置是不固定的,看产品上喜好,笔者使用的TI OMAP4平台,背光的HAL层代码就在:
mydroid/device/ti/xxx_product/liblights/light.c
先浏览欣赏一下light.c先
  1. /* 
  2.  * Copyright (C) 2008 The Android Open Source Project 
  3.  * 
  4.  * Licensed under the Apache License, Version 2.0 (the "License"); 
  5.  * you may not use this file except in compliance with the License. 
  6.  * You may obtain a copy of the License at 
  7.  * 
  8.  *      http://www.apache.org/licenses/LICENSE-2.0 
  9.  * 
  10.  * Unless required by applicable law or agreed to in writing, software 
  11.  * distributed under the License is distributed on an "AS IS" BASIS, 
  12.  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
  13.  * See the License for the specific language governing permissions and 
  14.  * limitations under the License. 
  15.  */  
  16.   
  17.   
  18. #define LOG_TAG "lights"   
  19.   
  20. #include <cutils/log.h>   
  21.   
  22. #include <stdint.h>   
  23. #include <string.h>   
  24. #include <unistd.h>   
  25. #include <errno.h>   
  26. #include <fcntl.h>   
  27. #include <pthread.h>   
  28.   
  29. #include <sys/ioctl.h>   
  30. #include <sys/types.h>   
  31.   
  32. #include <hardware/lights.h>   
  33.   
  34. /******************************************************************************/  
  35.   
  36. static pthread_once_t g_init = PTHREAD_ONCE_INIT;  
  37. static pthread_mutex_t g_lock = PTHREAD_MUTEX_INITIALIZER;  
  38.   
  39. char const*const LCD_FILE  
  40.         = "/sys/class/leds/lcd-backlight/brightness";  
  41. char const*const KEYBOARD_FILE  
  42.         = "/sys/class/leds/keyboard-backlight/brightness";  
  43.   
  44. char const*const CHARGING_LED_FILE  
  45.         = "/sys/class/leds/battery-led/brightness";  
  46.   
  47. /*RGB file descriptors */  
  48. char const*const RED_LED_FILE  
  49.         = "/sys/class/leds/red/brightness";  
  50. char const*const RED_DELAY_ON_FILE  
  51.         = "/sys/class/leds/red/delay_on";  
  52. char const*const RED_DELAY_OFF_FILE  
  53.         = "/sys/class/leds/red/delay_off";  
  54. char const*const GREEN_LED_FILE  
  55.         = "/sys/class/leds/green/brightness";  
  56. char const*const GREEN_DELAY_ON_FILE  
  57.         = "/sys/class/leds/green/delay_on";  
  58. char const*const GREEN_DELAY_OFF_FILE  
  59.         = "/sys/class/leds/green/delay_off";  
  60. char const*const BLUE_LED_FILE  
  61.         = "/sys/class/leds/blue/brightness";  
  62. char const*const BLUE_DELAY_ON_FILE  
  63.         = "/sys/class/leds/blue/delay_on";  
  64. char const*const BLUE_DELAY_OFF_FILE  
  65.         = "/sys/class/leds/blue/delay_off";  
  66. ...  
/*
 * Copyright (C) 2008 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */


#define LOG_TAG "lights"

#include <cutils/log.h>

#include <stdint.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
#include <fcntl.h>
#include <pthread.h>

#include <sys/ioctl.h>
#include <sys/types.h>

#include <hardware/lights.h>

/******************************************************************************/

static pthread_once_t g_init = PTHREAD_ONCE_INIT;
static pthread_mutex_t g_lock = PTHREAD_MUTEX_INITIALIZER;

char const*const LCD_FILE
        = "/sys/class/leds/lcd-backlight/brightness";
char const*const KEYBOARD_FILE
        = "/sys/class/leds/keyboard-backlight/brightness";

char const*const CHARGING_LED_FILE
        = "/sys/class/leds/battery-led/brightness";

/*RGB file descriptors */
char const*const RED_LED_FILE
        = "/sys/class/leds/red/brightness";
char const*const RED_DELAY_ON_FILE
        = "/sys/class/leds/red/delay_on";
char const*const RED_DELAY_OFF_FILE
        = "/sys/class/leds/red/delay_off";
char const*const GREEN_LED_FILE
        = "/sys/class/leds/green/brightness";
char const*const GREEN_DELAY_ON_FILE
        = "/sys/class/leds/green/delay_on";
char const*const GREEN_DELAY_OFF_FILE
        = "/sys/class/leds/green/delay_off";
char const*const BLUE_LED_FILE
        = "/sys/class/leds/blue/brightness";
char const*const BLUE_DELAY_ON_FILE
        = "/sys/class/leds/blue/delay_on";
char const*const BLUE_DELAY_OFF_FILE
        = "/sys/class/leds/blue/delay_off";
...
  1. static int  
  2. set_light_backlight(struct light_device_t* dev,  
  3.         struct light_state_t const* state)  
  4. {  
  5.     int err = 0;  
  6.     int brightness = rgb_to_brightness(state);  
  7.   
  8.     pthread_mutex_lock(&g_lock);  
  9.     err = write_int(LCD_FILE, brightness);  
  10.     pthread_mutex_unlock(&g_lock);  
  11.   
  12.     return err;  
  13. }  
static int
set_light_backlight(struct light_device_t* dev,
        struct light_state_t const* state)
{
    int err = 0;
    int brightness = rgb_to_brightness(state);

    pthread_mutex_lock(&g_lock);
    err = write_int(LCD_FILE, brightness);
    pthread_mutex_unlock(&g_lock);

    return err;
}
这里关注一下LCD背光的sys文件节点:"/sys/class/leds/lcd-backlight/brightness"
疑问1:这个sys接口是谁约定的呢?
疑问2:可不可以改这个接口呢?
疑问3:为什么这里还有其他led的很多sys文件节点呢:
先解释疑问3,因为一个Android设备,不只是有LCD背光的LED,还有可以有其他很多LED(当然也可以没有),所以这里一并实现了这些LED的HAL,产品商可以沿用这些HAL。
先来试验一把:
启动Android设备,在Setting里更改亮度,然后在串口命令行中或“adb shell"中运行命令cat /sys/class/leds/lcd-backlight/brightness,会发现Setting的更改后可以通过cat 显示Setting的更改。所以更加确认了这个"/sys/class/leds/lcd-backlight/brightness"接口是正确的。
因为HAL层是和Linux Kernel交互的,所以这里如果能cat实现读取亮度等级,那么在Linux kernel层就一定实现了sysfs接口。

4.Linux的背光内核层

背光的内核层源码在:driver/leds/led-class.c
这一层由内核开发者去维护,不用我们操心。看看它的init函数
  1. static int __init leds_init(void)  
  2. {  
  3.     leds_class = class_create(THIS_MODULE, "leds");  
  4.     if (IS_ERR(leds_class))  
  5.         return PTR_ERR(leds_class);  
  6.     leds_class->suspend = led_suspend;  
  7.     leds_class->resume = led_resume;  
  8.     leds_class->dev_attrs = led_class_attrs;  
  9.     return 0;  
  10. }  
static int __init leds_init(void)
{
	leds_class = class_create(THIS_MODULE, "leds");
	if (IS_ERR(leds_class))
		return PTR_ERR(leds_class);
	leds_class->suspend = led_suspend;
	leds_class->resume = led_resume;
	leds_class->dev_attrs = led_class_attrs;
	return 0;
}
好明显,正是由于它创建了sys class,名字为”leds“,所以上面的背光sys文件节点"/sys/class/leds/”就有了来由,那么剩下的“../lcd-backlight/brightness"又是怎么来的呢?看看一个注册led设备类的函数.
  1. /** 
  2.  * led_classdev_register - register a new object of led_classdev class. 
  3.  * @parent: The device to register. 
  4.  * @led_cdev: the led_classdev structure for this device. 
  5.  */  
  6. int led_classdev_register(struct device *parent, struct led_classdev *led_cdev)  
  7. {  
  8.     led_cdev->dev = device_create(leds_class, parent, 0, led_cdev,  
  9.                       "%s", led_cdev->name);  
  10.     if (IS_ERR(led_cdev->dev))  
  11.         return PTR_ERR(led_cdev->dev);  
  12.   
  13. #ifdef CONFIG_LEDS_TRIGGERS   
  14.     init_rwsem(&led_cdev->trigger_lock);  
  15. ...  
/**
 * led_classdev_register - register a new object of led_classdev class.
 * @parent: The device to register.
 * @led_cdev: the led_classdev structure for this device.
 */
int led_classdev_register(struct device *parent, struct led_classdev *led_cdev)
{
	led_cdev->dev = device_create(leds_class, parent, 0, led_cdev,
				      "%s", led_cdev->name);
	if (IS_ERR(led_cdev->dev))
		return PTR_ERR(led_cdev->dev);

#ifdef CONFIG_LEDS_TRIGGERS
	init_rwsem(&led_cdev->trigger_lock);
...
这个注册函数的接口最终会被我们要开发的背光驱动调用,这个接口在/sys/class/leds/下又创建了一个设备接口,名字是led_cdev->name。好明显这里的led_cdev->name应该就是”lcd-backlight“,究竟是不是真的这样呢?继续看。
这个led-class.c在实现两个设备属性,看代码:
  1. static struct device_attribute led_class_attrs[] = {  
  2.     __ATTR(brightness, 0644, led_brightness_show, led_brightness_store),  
  3.     __ATTR(max_brightness, 0444, led_max_brightness_show, NULL),  
  4. #ifdef CONFIG_LEDS_TRIGGERS   
  5.     __ATTR(trigger, 0644, led_trigger_show, led_trigger_store),  
  6. #endif   
  7.     __ATTR_NULL,  
  8. };  
static struct device_attribute led_class_attrs[] = {
	__ATTR(brightness, 0644, led_brightness_show, led_brightness_store),
	__ATTR(max_brightness, 0444, led_max_brightness_show, NULL),
#ifdef CONFIG_LEDS_TRIGGERS
	__ATTR(trigger, 0644, led_trigger_show, led_trigger_store),
#endif
	__ATTR_NULL,
};
看到了属性名字为”brightness“,这似乎越来越接近解释"/sys/class/leds/lcd-backlight/brightness"的由来了。

5.Linux的背光驱动层

Linux的背光驱动层就是完全由开发者去实现了,其实这层很简单,无非就是通过pwm实现设置背光。在这一层要注意将背光亮度量化为0~255,这是Android上层约定的。
这一层的采用Linux的platform device/driver 模型。它最终会调用Linux内核层leds-class.c的接口。
看看它的probe函数片段:
  1. struct display_led_data {  
  2.     struct led_classdev pri_display_class_dev;  
  3.     struct led_classdev sec_display_class_dev;  
  4.     struct omap4_disp_led_platform_data *led_pdata;  
  5.     struct mutex pri_disp_lock;  
  6.     struct mutex sec_disp_lock;  
  7. };  
  8. static int omap4_XXX_display_probe(struct platform_device *pdev)  
  9. {  
  10.     int ret;  
  11.     struct display_led_data *info;  
  12.   
  13.     pr_info("%s:Enter\n", __func__);  
  14.   
  15.     if (pdev->dev.platform_data == NULL) {  
  16.         pr_err("%s: platform data required\n", __func__);  
  17.         return -ENODEV;  
  18.     }  
  19.   
  20.     info = kzalloc(sizeof(struct display_led_data), GFP_KERNEL);  
  21.     if (info == NULL) {  
  22.         ret = -ENOMEM;  
  23.         return ret;  
  24.     }  
  25.   
  26.     info->led_pdata = pdev->dev.platform_data;  
  27.     platform_set_drvdata(pdev, info);  
  28.   
  29.     info->pri_display_class_dev.name = "lcd-backlight";  
  30.   
  31.     info->pri_display_class_dev.brightness_set = omap4_xxx_primary_disp_store;  
  32. ...  
  33.   
  34.   
  35.     ret = led_classdev_register(&pdev->dev,  
  36.                     &info->pri_display_class_dev);  
  37.     if (ret < 0) {  
  38.         pr_err("%s: Register led class failed\n", __func__);  
  39.         kfree(info);  
  40.         return ret;  
  41.     }  
  42.   
  43.     if (info->led_pdata->flags & LEDS_CTRL_AS_TWO_DISPLAYS) {  
  44.         pr_info("%s: Configuring the secondary LED\n", __func__);  
  45.         info->sec_display_class_dev.name = "lcd-backlight2";  
  46.         info->sec_display_class_dev.brightness_set =  
  47.             omap4_mirage_secondary_disp_store;  
  48.         info->sec_display_class_dev.max_brightness = LED_OFF;  
  49.         mutex_init(&info->sec_disp_lock);  
  50.   
  51.         ret = led_classdev_register(&pdev->dev,  
  52.                         &info->sec_display_class_dev);  
  53. ...  
struct display_led_data {
	struct led_classdev pri_display_class_dev;
	struct led_classdev sec_display_class_dev;
	struct omap4_disp_led_platform_data *led_pdata;
	struct mutex pri_disp_lock;
	struct mutex sec_disp_lock;
};
static int omap4_XXX_display_probe(struct platform_device *pdev)
{
	int ret;
	struct display_led_data *info;

	pr_info("%s:Enter\n", __func__);

	if (pdev->dev.platform_data == NULL) {
		pr_err("%s: platform data required\n", __func__);
		return -ENODEV;
	}

	info = kzalloc(sizeof(struct display_led_data), GFP_KERNEL);
	if (info == NULL) {
		ret = -ENOMEM;
		return ret;
	}

	info->led_pdata = pdev->dev.platform_data;
	platform_set_drvdata(pdev, info);

	info->pri_display_class_dev.name = "lcd-backlight";

	info->pri_display_class_dev.brightness_set = omap4_xxx_primary_disp_store;
...


	ret = led_classdev_register(&pdev->dev,
				    &info->pri_display_class_dev);
	if (ret < 0) {
		pr_err("%s: Register led class failed\n", __func__);
		kfree(info);
		return ret;
	}

	if (info->led_pdata->flags & LEDS_CTRL_AS_TWO_DISPLAYS) {
		pr_info("%s: Configuring the secondary LED\n", __func__);
		info->sec_display_class_dev.name = "lcd-backlight2";
		info->sec_display_class_dev.brightness_set =
			omap4_mirage_secondary_disp_store;
		info->sec_display_class_dev.max_brightness = LED_OFF;
		mutex_init(&info->sec_disp_lock);

		ret = led_classdev_register(&pdev->dev,
					    &info->sec_display_class_dev);
...

需关注这里设置了info->pri_display_class_dev.name = "lcd-backlight";,然后调用led_classdev_register函数注册,所以完美解释了
led_cdev->name就是 "lcd-backlight",完美解释了"/sys/class/leds/lcd-backlight/brightness"的由来。
另外info->pri_display_class_dev.brightness_set = omap4_xxx_primary_disp_store;中的omap4_xxx_primary_disp_store()就是我们需要实现的设置背光亮度函数,函数里面就是pwm操作。
到这里又有一个疑问4:为什么只实现设置背光亮度的接口,而没有实现读取当前亮度量化值的接口?
其实Android上层自行处理了这个获取亮度量化值的事情,也就是说Android上层设置了亮度是多少,上层会执行保留设置结果。无需再通过下层读取。

6.总结

6.1针对之前的疑问1/2,其实LCD背光的sys接口路径是可以改的,但是需要Linux内核层和Android HAL层配合来改,单单改一方都是会导致Android Setting无法调节背光。
6.2需注意在实现Linux背光驱动时的亮度量化关系,也就是注意上层传递下来的亮度设置范围是0~255。
6.3Android底层的Linux驱动都是服务于上层Java的,在做Android底层的Linux驱动时需要明确和上层的接口依赖关系,否则无法重用google或芯片厂商实现的接口,从而导致功能无法用。
6.4.再一次证明了Android系统服务运行效率极低。设置背光,其实最终就是设置了一下pwm寄存器即可,但是从Android最顶层一层层调用下来,真是“费尽周折”,怪不得Android设备的硬件配置明显远优于ios设备,但是流畅体验性却不明显优于ios设备。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android中LCD背光驱动 的相关文章

  • linux命令中括号的用途是什么[重复]

    这个问题在这里已经有答案了 我在 Linux 终端中运行以下命令 谁能告诉我 Linux 终端中括号和以下命令的用途是什么 echo GET HTTP 1 0 echo 主机 www google com echo 数控 www googl
  • Raspberry 交叉编译 - 执行程序以“分段错误”结束

    我有一个自己编写的程序 我想从我的 x86 机器上为 Raspberry Pi 构建它 我正在使用 eclipse 生成的 makefile 并且无法更改此内容 我已经阅读了 CC for raspi 的教程 Hackaday 链接 htt
  • Linux中使用管道进行进程间通信

    我已经编写了在 linux 中写入数字以进行管道传输的代码 如下所示 但显示错误 任何人都可以帮助我解决这个问题 基本上该程序的问题陈述如下 一个程序将打开一个管道 向管道写入一个数字 其他程序将打开同一管道 读取数字并打印它们 关闭两个管
  • 捕获数据包后会发生什么?

    我一直在阅读关于网卡捕获数据包后会发生什么的内容 我读得越多 我就越困惑 首先 我读过传统上 在网卡捕获数据包后 它会被复制到内核空间中的一个内存块 然后复制到用户空间 供随后处理数据包数据的任何应用程序使用 然后我读到了 DMA 其中 N
  • C:如果文件描述符被删除,阻塞读取应该返回

    我正在以阻塞的方式从设备 文件描述符中读取 可能会发生这样的情况 在不同的线程中 设备被关闭并且文件描述符被删除 不幸的是 读取没有返回或注意到并且一直阻塞 作为一种解决方法 我可以使用 select 作为超时来执行 while 循环 如果
  • 如何将后台作业的输出分配给 bash 变量?

    我想在 bash 中运行后台作业并将其结果分配给一个变量 我不喜欢使用临时文件 并且希望同时运行多个类似的后台任务 root root var echo hello world root root echo var hello world
  • 在 Linux 上访问 main 之外的主要参数

    是否可以访问参数main在外面main 即在共享库构造函数中 在 Linux 上除了通过解析之外 proc self cmdline 您可以通过将构造函数放入 init array部分 功能在 init array 不像 init 使用相同
  • 如何使用 echo 写入非 ASCII 字符?

    如何写非ASCII http en wikipedia org wiki ASCII使用 echo 的字符 是否有转义序列 例如 012或类似的东西 我想使用以下方法将 ASCII 字符附加到文件中 echo gt gt file 如果您关
  • Linux“屏幕”的 Windows 等效项还是其他替代方案?

    我正在寻找一种在 Windows 环境中控制程序的方法 我希望它与 Linux 软件有点相似 screen 我搜索的原因是我需要使用标识符启动一个程序 在 Windows 上 这样我以后就能够关闭该特定程序 而无需关闭其他任何程序 即使实际
  • 错误:命令“c++”失败,退出状态为 1

    所以我尝试按照以下说明安装 Pyv8https andrewwilkinson wordpress com 2012 01 23 integrating python and javascript with pyv8 https andre
  • 在 Linux 上创建线程与进程的开销

    我试图回答在 python 中创建线程与进程有多少开销的问题 我修改了类似问题的代码 该问题基本上运行一个带有两个线程的函数 然后运行带有两个进程的相同函数并报告时间 import time sys NUM RANGE 100000000
  • XAMPP Windows 上的 Php Cron 作业

    嗯 我是这个词的新手CRON 据我所知 这是一个Unix安排特定操作在定义的时间间隔后执行的概念 我需要运行一个php文件 每小时更新一次数据库 但我的困惑在于安排执行 我在用XAMPP用于 Windows 7 上的本地开发测试 我发现了什
  • 为什么docker容器提示“权限被拒绝”?

    我使用以下命令来运行 docker 容器 并从主机映射目录 root database 到容器 tmp install database docker run it name oracle install v root database t
  • 如何列出 nginx 中的所有虚拟主机

    有没有一个命令可以列出 CentOS 上 nginx 下运行的所有虚拟主机或服务器 我想将结果通过管道传输到文本文件以用于报告目的 我正在寻找与我用于 Apache 的命令类似的命令 apachectl S 2 gt 1 grep 端口 8
  • 提高mysql导入速度[关闭]

    Closed 这个问题是与编程或软件开发无关 help closed questions 目前不接受答案 我有一个很大的数据库22GB 我曾经用过进行备份mysqldumpgzip 格式的命令 当我提取 gz 文件时 它会生成 sql文件的
  • 如何将 elf 解释器(ld-linux.so.2/ld-2.17.so)构建为静态库?

    如果我的问题不准确 我深表歉意 因为我没有太多 Linux 相关经验 我目前正在构建一个 Linux 从头开始 主要遵循 linuxfromscratch org 版本的指南 7 3 我遇到了以下问题 当我构建可执行文件时 获取一个称为 E
  • 运行 shell 命令并将输出发送到文件?

    我需要能够通过 php 脚本修改我的 openvpn 身份验证文件 我已将我的 http 用户设置为免通 sudoer 因为这台机器仅在我的家庭网络中可用 我目前有以下命令 echo shell exec sudo echo usernam
  • Grep 递归和计数

    需要在具有大量子目录的目录中搜索文件内的字符串 我在用着 grep c r string here 我怎样才能找到总数量 如何仅输出至少具有一个实例的文件 使用 Bash 的进程替换 这给出了我认为是您想要的输出 如果不是 请澄清问题 gr
  • 用于获取特定用户 ID 和进程数的 Bash 脚本

    我需要 bash 脚本来计算特定用户或所有用户的进程 我们可以输入 0 1 或更多参数 例如 myScript sh root deamon 应该像这样执行 root 92 deamon 8 2 users has total proces
  • 查找并删除超过 x 天的文件或文件夹

    我想删除超过 7 天的文件和文件夹 所以我尝试了 17 07 14 email protected cdn cgi l email protection find tmp mindepth 1 maxdepth 1 ctime 7 exec

随机推荐

  • EasyImage简单图床 - 快速搭建私人图床云盘同时远程访问

    文章目录 1 前言 2 EasyImage网站搭建 2 1 EasyImage下载和安装 2 2 EasyImage网页测试 2 3 cpolar的安装和注册 3 本地网页发布 3 1 Cpolar云端设置 3 2 Cpolar内网穿透本地
  • Hawk-and-Chicken HDU - 3639(tarjan,重点说一下为什么要反向建图)

    题意 大学班级选班长 N 个同学均可以发表意见 若意见为 A B 则表示 A 认为 B 合适 意见具有传递性 即 A 认为 B 合适 B 认为 C 合适 则 A 也认为 C 合适 勤劳的 TT 收集了M条意见 想要知道最高票数 并给出一份候
  • Mysql5.7版本忘记密码(Windows10)

    Mysql5 7版本忘记密码 Windows10 我的localhost一直是记住密码的 不知道为啥突然登录不上了 登录后会提示 1045 Access denied for user root using password YES 修复步
  • 个人小程序实现微信支付

    其实个人小程序是没办法直接调用微信支付的 但是可以间接的去调用 就是通过第三方的服务 如 https www payjx cn 通过调用它得接口 返回一个带支付二维码得结果 这个二维码被微信扫码支付后 通过开发者留得通知地址回调给开发者 就
  • 如何idea建包不让重叠(2022)

    1 去掉这个就可以了
  • Allegro PCB设计小诀窍系列--如何把PCB板上的线变成铜皮

    背景介绍 我们在进行PCB设计时 经常需要从其他软件导入图形 比如用其他软件绘制完成的防静电标识等 Allegro软件对于图形的描述是矢量的 而有很多软件对大块图形的描述是线性的 这就导致这类图形导入到Allegro之后 图形是由一条条的线
  • 独家

    作者 Faizan Shaikh 翻译 季洋 校对 王雨桐 本文约2700字 建议阅读10 分钟 本文将展示如何使用开源工具完成一个人脸识别的算法 引言 计算机视觉和机器学习已经开始腾飞 但是大多数人并不清楚计算机在识别一张图片的时候 它到
  • C语言宏定义嵌套容易出错,难道是C的Bug?

    今天的HDU上面做题 4501题的时候本想嵌套一个宏 简单一点 但是调试好久都不行 就是输出不对 后来改成函数就可以了 define max x y x
  • 8.9数据结构作业

    队列头文件 ifndef HTLINKLIST H define HTLINKLIST H typedef int datatype typedef struct Node union datatype data int len struc
  • vs2017运行显示系统找不到指定的文件_十分钟学会win10系统封装-封装

    Easy Sysprep将封装分为了两个阶段 第一阶段 以完成封装操作为首要目的 第二阶段 以完成对系统的调整为首要目的 将封装与调整分开 减少调整操作对封装操作的影响 保障封装成功率 第一阶段 在C盘目录下新建文件夹Sysprep 拷贝万
  • javaScript获取cookie转换成json

    原始转换 function cookie to json var cookie text document cookie var arr var text to split cookie text split for var i in te
  • AcWing 756. 蛇形矩阵

    题目 输入两个整数n和m 输出一个n行m列的矩阵 将数字 1 到 n m 按照回字蛇形填充至矩阵中 具体矩阵形式可参考样例 输入格式 输入共一行 包含两个整数n和m 输出格式 输出满足要求的矩阵 矩阵占n行 每行包含m个空格隔开的整数 数据
  • 天梯赛 一至十二届题解合集(最简洁规范题解)

    l1和l2已全部更新完毕 l3更新大概1 3 有更好的解法的大佬请在评论区指出 题解 第一届 点我 题解 第二届 点我 题解 第三届 点我 题解 第四届 点我 题解 第五届 点我 题解 第六届 点我 题解 第七届 点我 题解 第八届 点我
  • (网络安全数据集一)美国国家安全漏洞库 NVD-CVE信息解读 和常用漏洞库

    NVD中CVE信息解读 最近要用到这方面的数据 就对NVD中的一小段CVE信息选取做了简单的理解 有错的地方请大佬指正 一个完整的CVE信息 包含 六部分 元数据 漏洞影响软件信息 漏洞问题类型 参考和漏洞介绍 configurations
  • Spring Boot 中的 @SendTo 注解

    Spring Boot 中的 SendTo 注解 在 Spring Boot 中 SendTo 注解是一个非常有用的注解 它可以用于实现 WebSocket 的消息转发功能 本文将介绍 SendTo 注解的原理 使用方法和示例代码 什么是
  • Sophus库:对SO(3)和SE(3)的构建及扰动模型搭建

    简介 使用Eigen库中Geometry模块能够实现对 S O 3 SO 3 SO 3 S
  • 微信开发者工具的版本控制

    注意事项 拉取代码时 应先关闭所有的编辑器代码页面 清理版本管理工具里的工作区 保存到本地 不管什么时候 需要把代码提交到线上的请先拉取一下线上代码 一 提交代码流程 先在 微信开发者工具 的 版本管理 中把代码存储在本地分支上 拉取线上分
  • 用js实现简单的满屏跳动的心

    用js实现简单的满屏跳动的心
  • 实施MES系统的成功率只有50%,你知道为什么吗?

    MES系统可以称之为生产制造产业生产和管理方法实现代化的管理中心 假如可以非常好的执行和运用MES 那么将有益于提升公司的生产率 降低消耗成本 但为什么会有些公司MES执行实际效果不佳呢 原因之一 我国制造业存在管理方法基础的先天发育不足
  • Android中LCD背光驱动

    分类 Linux驱动 Android系统 2013 06 17 16 28 287人阅读 评论 0 收藏 举报 目录 Android的Setting Android的背光JNI层 Android的背光HAL层 Linux的背光内核层 Lin