uboot中reset命令代码分析

reset

resetting …

cmd/boot.c 
	U_BOOT_CMD(
		reset, 1, 0,	do_reset,
		"Perform RESET of the CPU",
		""
	);
	
   ----> arch/arm/lib/reset.c 
		puts ("resetting ...\n");
		udelay (50000);				/* wait 50 ms */
		do_shutdown();
		disable_interrupts();
		reset_misc();
		reset_cpu(0);     // 关键性操作 
		/*NOTREACHED*/
		

分析一下 do_shutdown操作

arch/arm/lib/process.c 
#include <common.h>

#define CFG_MAX_SHUTDOWN       10

static struct shutdown_ctrl {
	int count;
	void (*shutdown[CFG_MAX_SHUTDOWN])(void);
} shutdown_ctrl = {0, {0}, };

void add_shutdown(void (*shutdown)(void))     // 其他地方往数组集合里增加函数
{
	if (shutdown_ctrl.count >= CFG_MAX_SHUTDOWN) {
		printf("Can't add shutdown function,"
			   "Please increase CFG_MAX_SHUTDOWN count\n");
		return;
	}
	shutdown_ctrl.shutdown[shutdown_ctrl.count++]
		= shutdown;
}

void do_shutdown(void)    
{
	int ix;
	for (ix = 0; ix < shutdown_ctrl.count; ix++)       /// 循环运行数组循环里的函数
		shutdown_ctrl.shutdown[ix]();
}


// add_shutdown(xxx_driver_shutdown);    // spi nor flash 3字节地址使能  

static void xxx_driver_shutdown(void)
{
	
}

分析一下:reset_cpu

arch/arm/cpu/armv8/xxx/reset.S 
	.global reset_cpu
	 reset_cpu:
			 ldr     r1, rstctl                      @ get addr for global reset  
													 @ reg
			 mov     r3, #0x2                        @ full reset pll + mpu
			 str     r3, [r1]                        @ force reset     // 往某个地址写值  类型*p = xxx;
			 mov     r0, r0
	 _loop_forever:
			 b       _loop_forever          //   进入循环 
	 .align 2
	 rstctl:
			 .word  SYS_CTRL_REG_BASE + REG_SC_SYSRES   // 0x11020000 +4 

在这里插入图片描述
在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

今天6点半起床10点半睡觉和今天早晚运动

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值