am335x reboot 命令分析

本文记录am335x运行reboot命令时,内核中运行过程。

                     Tony Liu, 2016-6-8, Shenzhen

参考链接:
http://blog.csdn.net/wavemcu/article/details/8544333

kernel/sys.c
void kernel_restart(char *cmd)
{kernel_restart_prepare(cmd);                               ---------------+if (!cmd)                                                                 |printk(KERN_EMERG "Restarting system.\n");                            |else                                                                      |printk(KERN_EMERG "Restarting system with command '%s'.\n", cmd);     |kmsg_dump(KMSG_DUMP_RESTART);                                             |machine_restart(cmd);                                 ----------------+   |
}                                                                         |   |
EXPORT_SYMBOL_GPL(kernel_restart);                                        |   ||   |
void kernel_restart_prepare(char *cmd)                     <--------------|---+
{                                                                         |blocking_notifier_call_chain(&reboot_notifier_list, SYS_RESTART, cmd);|system_state = SYSTEM_RESTART;                                        |usermodehelper_disable();                                             |device_shutdown();                                                    |syscore_shutdown();                                                   |
}                                                                         ||
void machine_restart(char *cmd)                        <------------------+
{machine_shutdown();                                      ------------+|arm_pm_restart(reboot_mode, cmd);                        --------------+| |/* Give a grace period for failure to restart of 1s */               | |mdelay(1000);                                                        | || |/* Whoops - the platform was unable to reboot. Tell the user! */     | |printk("Reboot failed -- System halted\n");                          | |while (1);                                                           | |
}                                                                        | || |
void machine_shutdown(void)                                 <------------+ |
{                                                                          |
#ifdef CONFIG_SMP                                                          |smp_send_stop();                                                       |
#endif                                                                     |
}                                                                          ||
void (*arm_pm_restart)(char str, const char *cmd) = arm_machine_restart; <-+
EXPORT_SYMBOL_GPL(arm_pm_restart);void arm_machine_restart(char mode, const char *cmd)
{/* Flush the console to make sure all the relevant messages make it* out to the console drivers */arm_machine_flush_console();/* Disable interrupts first */local_irq_disable();local_fiq_disable();/* Call the architecture specific reboot code. */arch_reset(mode, cmd);                                           ------+
}                                                                          |||
arch/arm/mach-omap2/prcm.c                                                 |
void (*arch_reset)(char, const char *) = omap_prcm_arch_reset;             ||
static void omap_prcm_arch_reset(char mode, const char *cmd)        <------+
{s16 prcm_offs = 0;unsigned int val;if (cpu_is_omap24xx()) {omap2xxx_clk_prepare_for_reboot();prcm_offs = WKUP_MOD;} else if (cpu_is_am33xx()) {prcm_offs = AM33XX_PRM_DEVICE_MOD;//这里设置的是冷启动的方式omap2_prm_set_mod_reg_bits(OMAP4430_RST_GLOBAL_COLD_SW_MASK,prcm_offs, AM33XX_PRM_RSTCTRL_OFFSET);//热启动方式如下//omap2_prm_set_mod_reg_bits(OMAP4430_RST_GLOBAL_WARM_SW_MASK,//            prcm_offs, AM33XX_PRM_RSTCTRL_OFFSET);} else if (cpu_is_omap34xx()) {prcm_offs = OMAP3430_GR_MOD;omap3_ctrl_write_boot_mode((cmd ? (u8)*cmd : 0));} else if (cpu_is_omap44xx()) {omap4_prminst_global_warm_sw_reset(); /* never returns */} else {WARN_ON(1);}/** As per Errata i520, in some cases, user will not be able to* access DDR memory after warm-reset.* This situation occurs while the warm-reset happens during a read* access to DDR memory. In that particular condition, DDR memory* does not respond to a corrupted read command due to the warm* reset occurrence but SDRC is waiting for read completion.* SDRC is not sensitive to the warm reset, but the interconnect is* reset on the fly, thus causing a misalignment between SDRC logic,* interconnect logic and DDR memory state.* WORKAROUND:* Steps to perform before a Warm reset is trigged:* 1. enable self-refresh on idle request* 2. put SDRC in idle* 3. wait until SDRC goes to idle* 4. generate SW reset (Global SW reset)** Steps to be performed after warm reset occurs (in bootloader):* if HW warm reset is the source, apply below steps before any* accesses to SDRAM:* 1. Reset SMS and SDRC and wait till reset is complete* 2. Re-initialize SMS, SDRC and memory** NOTE: Above work around is required only if arch reset is implemented* using Global SW reset(GLOBAL_SW_RST). DPLL3 reset does not need* the WA since it resets SDRC as well as part of cold reset.*//* XXX should be moved to some OMAP2/3 specific code */omap2_prm_set_mod_reg_bits(OMAP_RST_DPLL3_MASK, prcm_offs,OMAP2_RM_RSTCTRL);omap2_prm_read_mod_reg(prcm_offs, OMAP2_RM_RSTCTRL); /* OCP barrier */val = omap2_prm_read_mod_reg(prcm_offs, AM33XX_PRM_RSTTIME_OFFSET);printk(KERN_ALERT "<<Tony>> reset time value 2: %x\n", val);
}

转载于:https://www.cnblogs.com/helloworldtoyou/p/5570151.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/470525.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

论文阅读 - Video Swin Transformer

文章目录1 概述2 模型介绍2.1 整体架构2.1.1 backbone2.1.2 head2.2 模块详述2.2.1 Patch Partition2.2.2 3D Patch Merging2.2.3 W-MSA2.2.4 SW-MSA2.2.5 Relative Position Bias3 模型效果参考资料1 概述 Vision Transformer是transformer应用到图像领域的一个里程碑&#x…

rocketmq queue_RocketMQ 实战(三) - 消息的有序性

■ RocketMQ有序消息的使用1 为什么需要消息的有序性比如用户张三终于挣了一百存在在银行卡里存取款,对应两个异步的短信消息,肯定要保证先存后取吧,不然都没钱怎么发了取钱的消息呢! M1 - 存钱 M2 - 取钱而mq默认发消息到不同q显然是行不通的,会乱序 需要发往同一个q,先进先出…

三十、PHP框架Laravel学习笔记——模型的预加载

一&#xff0e;预加载 预加载&#xff0c;就是解决关联查询中产生的 N1 次查询带来的资源消耗我们要获取所有书籍的作者(或拥有者)&#xff0c;普通查询方案如下&#xff1a; //获取所有书籍列表 $books Book::all(); //遍历每一本书 foreach ($books as $book) { //每一本…

Spring3系列12-Spring AOP AspectJ

本文讲述使用AspectJ框架实现Spring AOP。 再重复一下Spring AOP中的三个概念&#xff0c; Advice&#xff1a;向程序内部注入的代码。Pointcut&#xff1a;注入Advice的位置&#xff0c;切入点&#xff0c;一般为某方法。Advisor&#xff1a;Advice和Pointcut的结合单元&#…

论文阅读:Spatial Transformer Networks

文章目录1 概述2 模型说明2.1 Localisation Network2.2 Parameterised Sampling Grid3 模型效果参考资料1 概述 CNN的机理使得CNN在处理图像时可以做到transition invariant&#xff0c;却没法做到scaling invariant和rotation invariant。即使是现在火热的transformer搭建的图…

dataframe 排序_疯狂Spark之DataFrame创建方式详解一(九)

创建DataFrame的几种方式1、读取json格式的文件创建DataFrame注意&#xff1a;1. json文件中的json数据不能嵌套json格式数据。2. DataFrame是一个一个Row类型的RDD&#xff0c;df.rdd()/df.javaRdd()。3. 可以两种方式读取json格式的文件。4. df.show()默认显示前20行数据。5.…

【原】npm 常用命令详解

今年上半年在学习gulp的使用&#xff0c;对npm的掌握是必不可少的&#xff0c;经常到npm官网查询文档让我感到不爽&#xff0c;还不如整理了一些常用的命令到自己博客上&#xff0c;于是根据自己的理解简单翻译过来&#xff0c;终于有点输出&#xff0c;想学习npm这块的朋友不可…

论文阅读 - CRNN

文章目录1 概述2 模型介绍2.1 输入2.2 Feature extraction2.3 Sequence modeling2.4 Transcription2.4.1 训练部分2.4.2 预测部分3 模型效果参考资料1 概述 CRNN(Convolutional Recurrent Neural Network)是2015年华科的白翔老师团队提出的&#xff0c;直至今日&#xff0c;仍…

python easygui_Python里的easygui库

想要用python开发一些简单的图形界面&#xff0c;于是接触了easygui库&#xff0c;由于这是新手教程&#xff0c;我会把它写的尽量简单&#xff0c;希望大家都能看懂。1.msgboxmsgbox( )有一个标题&#xff0c;内容和一个ok键(是可以更改的)。举个例子&#xff1a;import easyg…

Rust小技巧 - 让函数既可接受String或str,也可以返回String或str

文章目录1 场景说明2 解决方案2.1 允许不同的输入参数2.2 允许不同的输出参数2.3 让调用方来做处理参考资料1 场景说明 假设我们有一个函数foo&#xff0c;它既要允许&str也要允许String作为输入参数。或是既要允许&str也要允许String作为输出。&str和String之间的…

JSP九大内置对象(转载)

JSP中一共预先定义了9个这样的对象&#xff0c;分别为&#xff1a;request、response、session、application、out、pagecontext、config、page、exception 1、request对象 request 对象是 javax.servlet.httpServletRequest类型的对象。 该对象代表了客户端的请求信息&#xf…

recv发送失败 缓冲区太小_从 GFS 失败的架构设计来看一致性的重要性

作者简介 陈东明&#xff0c;饿了么北京技术中心架构组负责人&#xff0c;负责饿了么的产品线架构设计以及饿了么基础架 构研发工作。曾任百度架构师&#xff0c;负责百度即时通讯产品的架构设计。具有丰富的大规模系统构 建和基础架构的研发经验&#xff0c;善于复杂业务需求下…

Rust小技巧 - 把异步函数放进vector当中

文章目录1 场景说明2 解决方案2.1 无借用参数2.2 有借用参数参考资料1 场景说明 有些时候&#xff0c;我们希望将将异步函数放到vector当中&#xff0c;或者说是注册进vector当中&#xff0c;然后在某个地方遍历这个vector来实现对已经注册了的异步函数的调用。 Cargo.toml中…

好用的记事本_分类记事本软件哪个好用?大家推荐一个苹果手机用的分类记事本便签呗...

随着“互联网”的发展&#xff0c;现在都开始在软件上记事备忘了。那么&#xff0c;都有哪些好用的记事本软件可以选择使用呢&#xff1f;大家在选择记事本软件的时候&#xff0c;都有哪些标准呢&#xff1f;不知道大家的标准是什么&#xff0c;小编有一个不能妥协的标准&#…

tch-rs指南 - Tensor的基本操作

文章目录1 概述2 Tensor的基本操作2.1 Tensor的初始化&#xff08;1&#xff09;通过数组创建&#xff08;2&#xff09;通过默认方法创建&#xff08;3&#xff09;通过其他的tensor创建&#xff08;4&#xff09;通过opencv::core::Mat创建2.2 Tensor的属性2.3 Tensor的运算&…

命令行运行jmeter脚本

1、通过gui界面的jmeter创建一份脚本&#xff1b;2、打开cmd,切换到jmeter程序的Bin目录&#xff1b;3、执行jmeter.bat -n -t bookair_0613.jmx -l log_3.jtl&#xff1b;4、使用gui界面添加一个监听器&#xff0c;打开log_3.jtl文件&#xff0c;来分析测试结果。转载于:https…