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背光驱动 的相关文章

  • 使用 \r 并打印一些文本后如何清除控制台中的一行?

    对于我当前的项目 有一些代码很慢并且我无法使其更快 为了获得一些关于已完成 必须完成多少的反馈 我创建了一个进度片段 您可以在下面看到 当你看到最后一行时 sys stdout write r100 80 n I use 80覆盖最终剩余的
  • 如何使用 Cloud Init 挂载未格式化的 EBS 卷

    Context 我正在使用https wiki jenkins io display JENKINS Amazon EC2 Plugin https wiki jenkins io display JENKINS Amazon EC2 Pl
  • 如何在 Ubuntu 中创建公共 HTML 文件夹?

    简单的问题 但由于某种原因我无法在谷歌上找到确切的答案 我在 Slicehost 上安装了全新的 Ubuntu 并且想在我的主目录中为包含一堆静态 HTML 文件的简单网站创建一个公共目录 我该怎么做呢 只是打字的问题吗mkdir publ
  • 执行“minikube start”命令时出现问题

    malik malik minikube start minikube v1 12 0 on Ubuntu 18 04 Using the docker driver based on existing profile Starting c
  • 如何在linux中以编程方式获取dir的大小?

    我想通过 C 程序获取 linux 中特定目录的确切大小 我尝试使用 statfs path struct statfs 但它没有给出确切的大小 我也尝试过 stat 但它返回任何目录的大小为 4096 请建议我如何获取 dir 的确切大小
  • 使用非规范地址检索内存数据会导致 SIGSEGV 而不是 SIGBUS

    我无法使用以下汇编代码产生 总线错误 这里我使用的内存地址不是合法的 规范地址 那么 我怎样才能触发该错误呢 我在带有 NASM 2 14 02 的 Ubuntu 20 04 LTS 下运行这段代码 但它会导致负载出现 SIGSEGV 分段
  • 如何根据标签将单个 XML 文件拆分为多个

    我有一个带有标签的 XML 文件 我想像这样分割文件
  • 静态方法的 Java 内存模型

    我来自操作系统和 C 语言背景 在代码编译时 世界很简单 需要处理和理解堆栈 堆文本部分等 当我开始学习 Java 时 我确实了解 JVM 和垃圾收集器 我对静态方法感到很有趣 根据我的理解 类的所有实例都会在堆中创建 然后被清理 但是 对
  • 绕过 dev/urandom|random 进行测试

    我想编写一个功能测试用例 用已知的随机数值来测试程序 我已经在单元测试期间用模拟对其进行了测试 但我也希望用于功能测试 当然不是全部 最简单的方法是什么 dev urandom仅覆盖一个进程 有没有办法做类似的事情chroot对于单个文件并
  • Linux/POSIX:为什么 fork() 不分叉*所有*线程

    众所周知 POSIX下创建新进程的默认方式是使用fork 在 Linux 下 这在内部映射到clone 我想知道的是 众所周知 当一个人打电话时fork 子进程是用单个线程创建的 调用的线程fork cf https linux die n
  • 使用os.execlp时,为什么`python`需要`python`作为argv[0]

    代码是这样的 os execlp python python child py other args this works os execlp python child py other args this doesn t work 我读过
  • 我什么时候应该编写 Linux 内核模块?

    有些人出于某种原因想要将 Linux 中的代码从用户空间移动到内核空间 很多时候 原因似乎是代码应该具有特别高的优先级 或者只是 内核空间更快 这对我来说似乎很奇怪 我什么时候应该考虑编写内核模块 有一套标准吗 我怎样才能激励将代码保存在
  • 复制目录内容

    我想将目录 tmp1 的内容复制到另一个目录 tmp2 tmp1 可能包含文件和其他目录 我想使用C C 复制tmp1的内容 包括模式 如果 tmp1 包含目录树 我想递归复制它们 最简单的解决方案是什么 我找到了一个解决方案来打开目录并读
  • ansible unarchive 模块如何查找 tar 二进制文件?

    我正在尝试执行一个 ansible 剧本 该剧本的任务是利用unarchive模块 因为我是在 OSX 上执行此操作 所以我需要使用它gnu tar 而不是bsd tar通常与 OSX 一起提供 因为BSD tar 不受官方支持 https
  • express.js api 应用程序中的内存泄漏

    我正在运行一个express js应用程序 它用作REST API 一个端点启动 puppeteer 并使用多个过程测试我的网站 启动应用程序并持续消耗端点后 我的 docker 容器每小时都会耗尽内存 如下所示 首先 我认为我的 pupp
  • [A-Z] 表示 [A-Za-z] 是怎么回事?

    我已经注意到 至少在我使用的一些基于 Unix 的系统上 ls A Z 已经给了我预期的结果ls A Za z 让我无法轻松获得以大写字母开头的该死的文件列表 我刚刚遇到了同样的事情grep 我无法让它停止与小写字母匹配 A Z 直到我最终
  • 具有多处理功能的 Python 代码无法在 Windows 上运行

    以下简单的绝对初学者代码在 Ubuntu 14 04 Python 2 7 6 和 Cygwin Python 2 7 8 上运行 100 但在 Windows 64 位 Python 2 7 8 上挂起 我使用另一个片段观察到了同样的情况
  • 如何在shell脚本中给出密码?

    在 shell 脚本文件中 我使用一些命令 例如scp and make install要求我输入密码 我运行一个 shell 脚本来编译一个大项目 一段时间后它会要求我输入密码才能使用scp 我需要等待该过程并在此之后提供密码 我只想通过
  • 为 OpenWrt 编写和编译程序

    我有一个在 OpenWRT 下运行的具有 MIPS 架构的嵌入式设备 系统类型 MediaTek MT7628AN ver 1 eco 2机器 WRTnode2P 处理器 0CPU型号 MIPS 24KEc V5 5 我想通过我的电脑 ub
  • 从另一个 python 脚本获取返回信息

    我在 Linux 上 我有一个 python 脚本 我想从另一个 python 脚本调用它 我不想将其作为模块导入 为了一层安全性 现在为了学术练习 因为我想弄清楚这一点 我实际上想让一个脚本使用 os system 或另一个类似的函数 并

随机推荐

  • 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