休眠流程
应用层通过echo mem > /sys/power/state写入休眠状态,给一张大概流程图

 

这个操作对应在kernel/power/main.c的state这个attr的store操作

static ssize_t state_store(struct kobject *kobj, struct kobj_attribute *attr,
const char *buf, size_t n)
{
suspend_state_t state;
int error;

error = pm_autosleep_lock();
if (error)
return error;

if (pm_autosleep_state() > PM_SUSPEND_ON) {
error = -EBUSY;
goto out;
}

state = decode_state(buf, n);
if (state < PM_SUSPEND_MAX) {
if (state == PM_SUSPEND_MEM)
state = mem_sleep_current;

error = pm_suspend(state);
} else if (state == PM_SUSPEND_MAX) {
error = hibernate();
} else {
error = -EINVAL;
}

out:
pm_autosleep_unlock();
return error ? error : n;
}
应用层通过/sys/power/state写入休眠状态;或者使能autosleep都会调用这个

int pm_suspend(suspend_state_t state)
{
int error;

if (state <= PM_SUSPEND_ON || state >= PM_SUSPEND_MAX)
return -EINVAL;

pr_info("suspend entry (%s)\n", mem_sleep_labels[state]);
error = enter_state(state);
if (error) {
suspend_stats.fail++;
dpm_save_failed_errno(error);
} else {
suspend_stats.success++;
}
pr_info("suspend exit\n");
return error;
}
不同state,进入不同休眠状态

static int enter_state(suspend_state_t state)
{
int error;

trace_suspend_resume(TPS("suspend_enter"), state, true);
if (state == PM_SUSPEND_TO_IDLE) {
#ifdef CONFIG_PM_DEBUG
if (pm_test_level != TEST_NONE && pm_test_level <= TEST_CPUS) {
pr_warn("Unsupported test mode for suspend to idle, please choose none/freezer/devices/platform.\n");
return -EAGAIN;
}
#endif
} else if (!valid_state(state)) {
return -EINVAL;
}
if (!mutex_trylock(&system_transition_mutex))
return -EBUSY;

if (state == PM_SUSPEND_TO_IDLE)
s2idle_begin();

if (sync_on_suspend_enabled) {
trace_suspend_resume(TPS("sync_filesystems"), 0, true);
ksys_sync_helper();
trace_suspend_resume(TPS("sync_filesystems"), 0, false);
}

pm_pr_dbg("Preparing system for sleep (%s)\n", mem_sleep_labels[state]);
pm_suspend_clear_flags();
error = suspend_prepare(state);
if (error)
goto Unlock;

if (suspend_test(TEST_FREEZER))
goto Finish;

trace_suspend_resume(TPS("suspend_enter"), state, false);
pm_pr_dbg("Suspending system (%s)\n", mem_sleep_labels[state]);
pm_restrict_gfp_mask();
error = suspend_devices_and_enter(state);
pm_restore_gfp_mask();

Finish:
events_check_enabled = false;
pm_pr_dbg("Finishing wakeup.\n");
suspend_finish();
Unlock:
mutex_unlock(&system_transition_mutex);
return error;
}
设备进入休眠,被唤醒或者休眠失败,就会走对应的唤醒流程;

挂起console,比如串口,终端等;

挂起devfreq,cpufreq;执行device_suspend

int suspend_devices_and_enter(suspend_state_t state)
{
int error;
bool wakeup = false;

if (!sleep_state_supported(state))
return -ENOSYS;

pm_suspend_target_state = state;

if (state == PM_SUSPEND_TO_IDLE)
pm_set_suspend_no_platform();

error = platform_suspend_begin(state);
if (error)
goto Close;

suspend_console();//挂起console,比如串口,终端等
suspend_test_start();
error = dpm_suspend_start(PMSG_SUSPEND);//挂起devfreq,cpufreq;执行device_suspend
if (error) {
pr_err("Some devices failed to suspend, or early wake event detected\n");
goto Recover_platform;
}
suspend_test_finish("suspend devices");
if (suspend_test(TEST_DEVICES))
goto Recover_platform;

do {
error = suspend_enter(state, &wakeup);//平台休眠
} while (!error && !wakeup && platform_suspend_again(state));

Resume_devices:
suspend_test_start();
dpm_resume_end(PMSG_RESUME);
suspend_test_finish("resume devices");
trace_suspend_resume(TPS("resume_console"), state, true);
resume_console();
trace_suspend_resume(TPS("resume_console"), state, false);

Close:
platform_resume_end(state);
pm_suspend_target_state = PM_SUSPEND_ON;
return error;

Recover_platform:
platform_recover(state);
goto Resume_devices;
}
平台进入休眠;被唤醒或者休眠失败,就会走对应的唤醒流程;

检查pendind标记,检查休眠锁标记,来进入平台实现的enter函数;

平台休眠的最后,会开启中断,用与响应外部中断,来唤醒系统并继续执行接下来的代码唤醒系统

static int suspend_enter(suspend_state_t state, bool *wakeup)
{
int error;

error = platform_suspend_prepare(state);
if (error)
goto Platform_finish;

error = dpm_suspend_late(PMSG_SUSPEND);
if (error) {
pr_err("late suspend of devices failed\n");
goto Platform_finish;
}
error = platform_suspend_prepare_late(state);
if (error)
goto Devices_early_resume;

error = dpm_suspend_noirq(PMSG_SUSPEND);
if (error) {
pr_err("noirq suspend of devices failed\n");
goto Platform_early_resume;
}
error = platform_suspend_prepare_noirq(state);
if (error)
goto Platform_wake;

if (suspend_test(TEST_PLATFORM))
goto Platform_wake;

if (state == PM_SUSPEND_TO_IDLE) {
s2idle_loop();
goto Platform_wake;
}

error = pm_sleep_disable_secondary_cpus();
if (error || suspend_test(TEST_CPUS))
goto Enable_cpus;

arch_suspend_disable_irqs();
BUG_ON(!irqs_disabled());

system_state = SYSTEM_SUSPEND;

error = syscore_suspend();
if (!error) {
*wakeup = pm_wakeup_pending();//检查能否进休眠
if (!(suspend_test(TEST_CORE) || *wakeup)) {
trace_suspend_resume(TPS("machine_suspend"),
state, true);
error = suspend_ops->enter(state);
trace_suspend_resume(TPS("machine_suspend"),
state, false);
} else if (*wakeup) {
error = -EBUSY;
}
syscore_resume();
}

system_state = SYSTEM_RUNNING;

arch_suspend_enable_irqs();//平台休眠,但是开启中断,用与响应中断,唤醒系统并继续执行接下来的代码唤醒系统
BUG_ON(irqs_disabled());

Enable_cpus:
pm_sleep_enable_secondary_cpus();

Platform_wake:
platform_resume_noirq(state);
dpm_resume_noirq(PMSG_RESUME);

Platform_early_resume:
platform_resume_early(state);

Devices_early_resume:
dpm_resume_early(PMSG_RESUME);

Platform_finish:
platform_resume_finish(state);
return error;
}
两种阻止进入休眠
最终都是通过__pm_stay_awake

应用层
echo abc > /sys/power/wake_lock 来申请一个休眠锁;

使用cat /sys/kernel/debug/wakeup_sources看什么在持有休眠锁;

echo abc > /sys/power/wake_unlock来接触休眠锁

 

内核层
应用请求休眠,系统进入休眠流程,此时如果设备触发了中断,中断处理程序中首先关闭中断,然后调度内核线程去处理work,但假如这个时候此work还未被调度到,系统就进入休眠了,那么这个设备就被永久关闭中断了,再也不能唤醒系统。pm_stay_awake()和pm_relax()的设计就是用来解决这个问题。

pm_stay_awake
pm_wake_lock
__pm_stay_awake
恢复
pm_wake_unlock
__pm_relax
休眠检查
pm_wakeup_pending
示例:休眠后,无法唤醒?
开启打印信息
休眠后系统卡住,组织串口来休眠,并开启相关打印;在Linux内核睡眠过程中,会先调用suspend_console()函数使串口进入睡眠状态,这样会导致后续设备驱动的睡眠过程不可见。可以在boot启动参数中增加no_console_suspend参数,显示设备驱动睡眠日志

remove_cmdline_param(cmdline, "no_console_suspend");
sprintf(cmdline + strlen(cmdline), " no_console_suspend=%d", 1);
修改串口日志打印等级,显示更多调试信息

echo 8 > /proc/sys/kernel/printk
设置pm_print_times参数,可以显示设备驱动睡眠唤醒时间,方便调试时查看哪个函数处理占用时间过长

echo 1 > /sys/power/pm_print_times
设置pm_debug_messages,打印来自系统的调试消息的暂停/休眠内核日志的基础结构

echo 1 > /sys/power/pm_debug_messages
打印信息
PM: pm_system_irq_wakeup: 20 triggered PMIC
pxa2xx-i2c pxa2xx-i2c.2: calling i2c_pxa_suspend_noirq+0x1/0x24 @ 6223, parent: d4000000.apb
i2c: <pxa_i2c-i2c> ICR is modified!
pxa2xx-i2c pxa2xx-i2c.2: i2c_pxa_suspend_noirq+0x1/0x24 returned 0 after 0 usecs
i2c: reset controller!
Workqueue: events chargeic_update_state_work_func
pcie-falcon d4220000.pcie: calling pcie_resume_noirq+0x1/0x1c @ 6223, parent: d4200000.axi
PCIe Host: No link negotiated
pcie-falcon d4220000.pcie: pcie_resume_noirq+0x1/0x1c returned 0 after 114202 usecs
pci 0001:00:00.0: calling pci_pm_resume_noirq+0x1/0xd4 @ 6165, parent: pci0001:00
pxa2xx-i2c pxa2xx-i2c.0: calling i2c_pxa_resume_noirq+0x1/0x38 @ 6223, parent: d4000000.apb
解决办法
i2c还在工作----而且打印了正在工作的函数;确认是充电ic休眠函数没去暂停工作队列;实现PM函数即可修复

#ifdef CONFIG_PM
static int charger_suspend(struct device *dev)
{
cancel_delayed_work_sync(g_info->chg_state_update_work);
return 0;
}

static int charger_resume(struct device *dev)
{
mod_delayed_work(system_wq, g_info->chg_state_update_work,msecs_to_jiffies(1000));
return 0;
}

static const struct dev_pm_ops pm_ops = {
.suspend = charger_suspend,
.resume = charger_resume,
};

#endif
找不到pcie设备----确认供电;如无异常,确认cpu和ddr频率是否恢复;如无异常,确认现象是否跟复位脚异常有关

--- a/drivers/pci/controller/pcie-host.c
+++ b/drivers/pci/controller/pcie-host.c
@@ -646,6 +646,7 @@ static int __maybe_unused pcie_suspend_noirq(struct device *dev)
phy_exit(port->phy);
pm_qos_update_request(&pcie->qos_idle,
PM_QOS_CPUIDLE_BLOCK_DEFAULT_VALUE);
+ gpio_set_value(port->gpio_reset,0);
return 0;
}

@@ -653,10 +654,10 @@ static int __maybe_unused pcie_resume_noirq(struct device *dev)
{
struct pcie *pcie = dev_get_drvdata(dev);
struct pcie_port *port = pcie->port;
-
+ gpio_set_value(port->gpio_reset,1);
+ mdelay(200);
pm_qos_update_request(&pcie->qos_idle, port->lpm_qos);
pcie_enable_port(port);
return 0;
}
修改后系统可被正常唤醒
————————————————

posted @ 2025-02-13 15:59 zxiaocheng 阅读(18) 评论(0) 推荐(0) 编辑
摘要: USB 1.0分为两个版本: USB 1.0 Low Speed 理论最高速率为1.5Mbit/s(0.1875MBytes/s) USB 1.0 Full Speed 理论最高速率为12Mbit/s(1.5MBytes/s) USB 1.1(即USB 1.0 Full Speed)理论最高速率为1 阅读全文
posted @ 2024-05-16 17:07 zxiaocheng 阅读(1439) 评论(0) 推荐(1) 编辑
摘要: 删除一行 sed -i '/CONFIG_SERIAL_MSM=y/d' ../src/kernel/msm-5.4/arch/arm/configs/vendor/test.config 增加一行 sed -i '$aCONFIG_SERIAL_MSM=y' ../src/kernel/msm-5 阅读全文
posted @ 2024-05-16 16:14 zxiaocheng 阅读(11) 评论(0) 推荐(0) 编辑
摘要: shell expr运算 在Shell脚本中,[expr](){"sa":"re_dqa_zy","icon":1}命令用于进行数学运算和字符串操作。以下是一些使用expr进行运算的示例:12 整数运算: 加法:expr 10 + 10 返回20 减法:expr 1500 - 900 返回600 乘 阅读全文
posted @ 2024-05-16 10:24 zxiaocheng 阅读(24) 评论(0) 推荐(0) 编辑
摘要: RS232和TTL唯一不同在于硬件电平表示的逻辑含义不同,TTL电平标准中逻辑高电平定义为1,电压标准为3.3V或5V,逻辑低电平定义为0,电压标准为0V。RS232电平标准相反,逻辑高电平为0,电压范围在-3V到-25V,逻辑低电平为1,电压范围在3V到25V。 TTL的全称为“Transisto 阅读全文
posted @ 2024-03-02 15:41 zxiaocheng 阅读(577) 评论(0) 推荐(0) 编辑
摘要: 转载:http://blog.csdn.net/kangear/article/details/37605811 USB中典型类及子类: 以前接触过UVC,今天接触了CDC-ECM原理上是一样的,定义一套标准协议主从机都遵守了就不需要额外的驱动程序。 简单翻译(其实用Google的多一些)一下usb 阅读全文
posted @ 2024-02-21 17:21 zxiaocheng 阅读(528) 评论(0) 推荐(0) 编辑
摘要: Linux 是一种安全的操作系统,它把所有的系统权限都赋予了一个单一的 root 用户,只给普通用户保留有限的权限。root 用户拥有超级管理员权限,可以安装软件、允许某些服务、管理用户等。 作为普通用户,如果想执行某些只有管理员才有权限的操作,以前只有两种办法:一是通过 sudo 提升权限,如果用 阅读全文
posted @ 2023-11-13 16:31 zxiaocheng 阅读(208) 评论(1) 推荐(0) 编辑
摘要: 简单介绍关于 SELinux 的一些概念 比如说什么是自主访问控制 DAC 和 强制访问控制 MAC;SELinux 安全上下文的概念等等 那么今天咸鱼将单独写一篇文章向大家专门介绍一下 SELinux 初识 SELinux SELinux(Security Enhanced Linux,安全增强型 阅读全文
posted @ 2023-11-08 17:04 zxiaocheng 阅读(83) 评论(0) 推荐(0) 编辑
摘要: 一、SELInux简介 1. Linux传统DAC权限检查通过后才会进行MAC(selinux)权限检查。 2. Google对SELinux进行一定修改后形成SEAndroid,它只是SELinux的一个子集,在Android5.0上强制打开。SEAndroid的安全检查几乎覆盖了所有重要系统资源 阅读全文
posted @ 2023-11-07 19:12 zxiaocheng 阅读(2378) 评论(0) 推荐(0) 编辑
摘要: 1、30天的试用安装 第一次启动source Insight4.0时,我们选择第二个选项,30天试用。 然后点击下一步,输入姓名、公司或组织名称、电子邮件信息,申请30天试用,然后点击下一步,直至安装完成。 2、sourceinsight4.exe 用十六进制编辑器(sublime text)打开s 阅读全文
posted @ 2023-09-28 11:38 zxiaocheng 阅读(3744) 评论(0) 推荐(0) 编辑
摘要: 你可以在vim中可以把文件转换为16进制来显示::%!xxd解释:把所有的行(%)用本地(!)的xxd程序打开。xxd本是linux下一个显示、编辑、转换二进制的命令。返回正常显示::%!xxd -r注意:vim的-b选项是告诉vim打开的是一个二进制文件,不指定的话,会在后面加上 0x0a ,即一 阅读全文
posted @ 2023-09-28 11:21 zxiaocheng 阅读(761) 评论(0) 推荐(0) 编辑
摘要: 4.git status 忽略文件权限变更:git config core.filemode false 3. 查看git的config配置cat .git/config [core] repositoryformatversion = 0 filemode = false #文件的属性 bare 阅读全文
posted @ 2023-07-10 18:25 zxiaocheng 阅读(408) 评论(0) 推荐(0) 编辑
摘要: 【问题】 一个python脚本,本来都运行好好的,然后写了几行代码,而且也都确保每行都对齐了,但是运行的时候,却出现语法错误: IndentationError: unindent does not match any outer indentation level 【解决过程】 1.对于此错误,最 阅读全文
posted @ 2023-02-24 14:18 zxiaocheng 阅读(2190) 评论(0) 推荐(0) 编辑
摘要: 延时函数的两种常用名称是sleep和delay。一般在上位机多见sleep,单片机常用delay。那么sleep和delay的意义有何区别? sleep意为睡眠,即线程挂起,由定时器重新唤醒线程。sleep作用期间,该线程不占用CPU资源。 delay意为延迟,即线程等待,由线程自身进行循环查询,在 阅读全文
posted @ 2022-12-08 11:13 zxiaocheng 阅读(1534) 评论(0) 推荐(0) 编辑
摘要: static DEVICE_ATTR_RW(test); #define DEVICE_ATTR_RW(_name) \ struct device_attribute dev_attr_##_name = __ATTR_RW(_name) struct device_attribute dev_a 阅读全文
posted @ 2022-11-22 17:26 zxiaocheng 阅读(575) 评论(0) 推荐(0) 编辑
摘要: Linux内核中实现工作推后执行的方法有:软中断、tasklet和工作队列(work queue)。 本文介绍工作队列的简单用法。 一、工作任务定义Linux内核中的工作队列包括:共享工作队列和自定义工作队列。区别如下: 1)共享工作队列:将新创建的工作任务添加到Linux内核创建的全局工作队列sy 阅读全文
posted @ 2022-09-16 09:34 zxiaocheng 阅读(982) 评论(0) 推荐(0) 编辑
摘要: 1,手机功耗分析 2,模块功耗主要功耗场景和优化点 3,功耗测试 阅读全文
posted @ 2022-09-13 11:28 zxiaocheng 阅读(245) 评论(0) 推荐(0) 编辑
摘要: 本文就开始讨论功耗的调试步骤和方法。 本文主要的内容如下: 一、明确调试的目标 二、明确调试的内容 三、参照电路框图找出我们需要检测的输出 四、找出或引出需测试的输出 五、功耗测试的步骤流程图 一、明确调试的目标明确调试的目标,即在满足当前的需求情况下,尽最大的可能去降低各种状态下、各路模块的功耗值 阅读全文
posted @ 2022-09-13 11:27 zxiaocheng 阅读(186) 评论(0) 推荐(0) 编辑
摘要: 本文结合该文档简单的总结了AP端功耗问题分析手段。 首先是官方功耗分析流程图: 注意几个关键的名词: Modem 调制解调器芯片 RPM Resource Power Manager是高通MSM平台另外加的一块芯片,控制整个电源相关的shared resources APSS 应用处理器子系统,就是 阅读全文
posted @ 2022-09-13 11:20 zxiaocheng 阅读(355) 评论(0) 推荐(0) 编辑
摘要: 1、底电流调试(Rock Bottom Current Optimization)底电流在手机飞行模式下调试。每个平台的底电流数据可能不一样,具体可以参考release出来的Current Consumption Data文档或者release note。一般情况下的底电流参考数据上限是: 底电流在 阅读全文
posted @ 2022-09-13 11:15 zxiaocheng 阅读(946) 评论(0) 推荐(0) 编辑
摘要: Type-c入门,以及设计相关详解 参考文献 Type-c 的引脚功能 Type-c 的配置处理 逻辑USB –C线上下拉电阻 Type-c 信号介绍--USB各版本的差异 USB Type-C口角色定义 SOURCE到SINK连接 Sink端的结构 Source端的结构 DRP(Dual Role 阅读全文
posted @ 2022-08-10 11:00 zxiaocheng 阅读(3326) 评论(0) 推荐(0) 编辑
摘要: 断言(assert)作为一种软件调试的方法,提供了一种在代码中进行正确性检查的机制,目前很多开发语言都支持这种机制。 它的主要作用是对一个 boolean 表达式进行检查,一个正确运行的程序必须保证这个 boolean 表达式的值为 true,若 boolean 表达式的值为 false,则说明程序 阅读全文
posted @ 2022-07-21 14:59 zxiaocheng 阅读(306) 评论(0) 推荐(0) 编辑
摘要: 启用摄像头支持,最后一步时根据自己需要进行选择摄像头配置。 Device Drivers > <*> Multimedia support > [*] Video capture adapters > [*] V4L USB devices > <*> USB Video Class (UVC) [ 阅读全文
posted @ 2022-07-12 15:07 zxiaocheng 阅读(174) 评论(0) 推荐(0) 编辑
摘要: 一、coresight coresight是ARM公司提出的,用于对复杂的SOC,实现debug和trace的架构。该架构,包含了多个coresight组件。众多的coresight组件,构成了一个coresight系统。我们也可以根据coresight架构,实现自己的coresight组件。每个c 阅读全文
posted @ 2022-07-08 15:09 zxiaocheng 阅读(696) 评论(1) 推荐(0) 编辑
摘要: 一、基础理论概述1. 有三种 preemption model 和适用场景非强占式内核(服务器)强占式内核(低延迟桌面)voluntary kernel preemption(桌面)2. 动态功耗 = C * Freq * Voltage^2 其中Freq 是CPU运行频率,Voltage是CPU核 阅读全文
posted @ 2022-07-06 19:35 zxiaocheng 阅读(854) 评论(0) 推荐(0) 编辑
摘要: 设备树使用手册 Device Tree是一种描述硬件的数据结构,由一系列被命名的结点(node)和属性(property)组成,而结点本身可包含子结点。所谓属性,其实就是成对出现的name和value。在Device Tree中,可描述的信息包括(原先这些信息大多被hard code到kernel中 阅读全文
posted @ 2022-06-28 16:37 zxiaocheng 阅读(819) 评论(0) 推荐(0) 编辑
摘要: 一、Linux系统休眠在嵌入式设备中由于省电功耗等原因我们需要让系统在不忙的时候进入休眠模式,Linux pm core提供给我们wakelock及autoslepp内核休眠机制。autosleep 和 wakelock是并行存在,只有 wakelock 唤醒锁全部释放且 autosleep 为 e 阅读全文
posted @ 2022-06-16 10:06 zxiaocheng 阅读(2995) 评论(0) 推荐(0) 编辑
摘要: ubuntu下ros和conda安装后都会改变python的默认环境,且需要用到的python版本各不相同,安装好后我们可能需要对系统的默认python指定进行微调。 1.首先用ls /usr/bin/python 查找出来系统python2 和 python3的版本 samsu@samsu-pc: 阅读全文
posted @ 2022-05-25 15:47 zxiaocheng 阅读(563) 评论(0) 推荐(0) 编辑
摘要: Type-C协议简介(CC检测原理) 1 简介 越来越多的手机开始采用Type-C作为充电和通信端口,Type-C连接器实物和PIN定义如下图: Type-C连接器中有两个管脚CC1和CC2,他们用于识别连接器的插入方向,以及不同的插入设备。本文介绍CC的基本识别原理。 先介绍几个概念:DFP——D 阅读全文
posted @ 2021-07-09 17:34 zxiaocheng 阅读(9043) 评论(0) 推荐(0) 编辑
摘要: 什么是PMU(PMIC) PMU(power management unit)就是电源管理单元,一种高集成的、针对便携式应用的电源管理方案,即将传统分立的若干类电源管理芯片,如低压差线性稳压器(LDO)、直流直流转换器(DC/DC),但现在它们都被集成到手机的电源管理单元(PMU)中,这样可实现更高 阅读全文
posted @ 2021-06-16 10:03 zxiaocheng 阅读(1062) 评论(0) 推荐(0) 编辑
摘要: 1./opt/yocto-rel/share/downloads/ exists but you do not appear to have write access to it. 这个是没有权限往指定的目录里写, 解决方法:将build目录下对应的工程文件删去(dashboard-lanvende 阅读全文
posted @ 2021-06-08 10:52 zxiaocheng 阅读(1620) 评论(0) 推荐(0) 编辑
摘要: kernel部分: 如需宏控制kernel这部分代码时,参考以下步骤新增kernel config. 1.请在您的driver code所在目录中的Kconfig文件增加您的宏定义 具体怎么写可以参考Kconfig中的其他宏定义 举个例子: config MTK_FB bool “MediaTek 阅读全文
posted @ 2021-04-26 20:30 zxiaocheng 阅读(1049) 评论(0) 推荐(1) 编辑
摘要: 原子位操作 操作函数的参数是一个指针和一个位号 原子位操作定义在文件中。令人感到奇怪的是位操作函数是对普通的内存地址进行操作的。原子位操作在多数情况下是对一个字长的内存访问,因而位号该位于0-31之间(在64位机器上是0-63之间),但是对位号的范围没有限制。 原子操作中的位操作部分函数如下:voi 阅读全文
posted @ 2021-04-13 14:42 zxiaocheng 阅读(5633) 评论(0) 推荐(0) 编辑
摘要: 做底层驱动免不了gpio打交道,所以对其操作和调试进行了一下简单的梳理一、gpio的调试方法 在Linux下,通过sysfs,获取gpio状态,也可以操作gpio。1、获取gpio状态 cd /sys/kernel/debug/ cat gpio2、操作gpio(以gpio99为例) cd /sys 阅读全文
posted @ 2021-03-26 15:11 zxiaocheng 阅读(5343) 评论(0) 推荐(0) 编辑
摘要: 注意:由于 task 和 recipe 是 BitBake 的基础概念。个人觉得翻译成任务和配方不免有误解之处,因此文中基本不对这两个词做翻译。类似的还有 configure。 序言 1.1 关于本教程 如果你阅读本教程,说明你已经知道 BitBake 是一种类似 make 的构建工具,主要用于 O 阅读全文
posted @ 2021-03-16 20:27 zxiaocheng 阅读(12756) 评论(0) 推荐(1) 编辑
摘要: 给命令设置别名,你可以把它当作命令的"小名",但是这样做有什么意义呢?比如笔者刚接触 Linux 时,使用的编辑器是 Vi,但是现在 Vim 的功能明显比 Vi 的功能更加强大,所以现在流行的编辑器变成了 Vim。但是笔者已经习惯了输入 vi 命令,而不习惯输入 vim 命令,别看小小的一个"m"的 阅读全文
posted @ 2021-03-15 10:53 zxiaocheng 阅读(516) 评论(0) 推荐(0) 编辑
摘要: 1.查找txt文件,但是想要排除掉tomcat目录(单目录排除) [root@ky35z 51mn]# find . -path ./tomcat -prune -o -name "*.txt" 注意./tomcat不能写成./tomcat/ 2.查找txt文件,但是想要排除掉tomcat目录和ja 阅读全文
posted @ 2021-03-11 15:43 zxiaocheng 阅读(1097) 评论(0) 推荐(0) 编辑
摘要: mkfs.ubifs 制作UBIFS 镜像 mkfs.ubifs的用法 Usage: mkfs.ubifs [OPTIONS] target Make a UBIFS file system image from an existing directory tree Examples: Build 阅读全文
posted @ 2020-12-02 14:50 zxiaocheng 阅读(2455) 评论(0) 推荐(0) 编辑
摘要: M.2接口,是Intel推出的一种替代MSATA新的接口规范。其实,对于桌面台式机用户来讲,SATA接口已经足以满足大部分用户的需求了,不过考虑到超极本用户的存储需求,Intel才急切的推出了这种新的接口标准。所以,我们在华硕、技嘉、微星等发布的新的9系列主板上都看到了这种新的M.2接口,现已普及。 阅读全文
posted @ 2020-07-01 14:22 zxiaocheng 阅读(2293) 评论(0) 推荐(0) 编辑
摘要: 从接口上看,有: INL-连接音响设备,输入模拟声音信号 MIC-连接麦克风,输入模拟语音信号 DMIC-连接数字麦克风,输入数字音频信号 I2S/PCM-连接CPU,输入数字音频信号 CONTROL INTERFACE-输入控制信号 HP-连接耳机,输出模拟声音信号 SPKOUT-连接喇叭,输出模 阅读全文
posted @ 2020-06-03 14:19 zxiaocheng 阅读(1632) 评论(0) 推荐(0) 编辑
点击右上角即可分享
微信分享提示