Embeded linux之reboot

来源:
导读 大家好,我是本期栏目编辑小友,现在为大家讲解Embeded linux之reboot问题。 重新启动命令 内核 sys c

大家好,我是本期栏目编辑小友,现在为大家讲解Embeded linux之reboot问题。

重新启动命令

//内核\sys.c

magic1、magic2、两个(同国际组织)国际组织类型的"魔力数",用于防止误操作。具体在"包含/uapi/linux/reboot.h "中定义。

cmd,重新启动方式。

//包含\ linux \重新启动. h

#定义LINUX _ REOT _ CMD _ RESTART0x 01234567

#定义LINUX _ REBOOT _ CMD _ HALT0xCDEF0123

#定义LINUX _ REOT _ CMD _ CAD _ ON0x 89 abcdef

#定义LINUX _ REOT _ CMD _ CAD _ OFF0x 00000000

#定义LINUX _ REOT _ CMD _ POWER _ OFF0x 4321 FeDC

#定义LINUX _ REOT _ CMD _ RESTART 20x1b2c 3d 4

#定义FCE 2

#定义LINUX _ REBOOT _ CMD _ KEXEC0x 45584543

啊,其它的额外参数。

SYSCALL _ definee 4(重新启动,int,magic1,int,magic2,无符号int,cmd,void __user *,arg)

{

.

开关(cmd)

{

案例LINUX _ REBOOT _ CMD _ RESTART:

内核_重启(空);

打破;

案例LINUX _ REBOOT _ CMD _ CAD _ ON:

c _ A _ D=1;

打破;

案例LINUX _ REBOOT _ CMD _ CAD _ OFF:

c _ A _ D=0;

打破;

案例LINUX _ REBOOT _ CMD _ HALT:

kernel _ halt();

do _ exit(0);

恐慌("无法停止");

案例LINUX _ REBOOT _ CMD _ POWER _ off :

kernel _ power _ off();

do _ exit(0);

打破;

案例LINUX _ REBOOT _ CMD _ RESTART2:

if (strncpy_from_user(缓冲区[0],arg,sizeof(缓冲区)- 1) 0)

{

ret=-EFAULT;

打破;

}

缓冲区[sizeof(buffer)-1]=' 0 ';

内核_重启(缓冲);

打破;

#ifdef CONFIG_KEXEC

案例LINUX _ REBOOT _ CMD _ KEXEC:

ret=kernel _ kexec();

打破;

#endif

# ifdef CONFIG _ HIBERNATION

案例SUSP

ret=休眠();

打破;

#endif

默认值:

ret=-EINVAL;

打破;

.

}

//内核\sys.c

void kernel_restart(char *cmd)

{

.

machine _ restart(cmd);

}

//arch\arm\kernel\process.c

void machine_restart(char *cmd)

{

.

arm_pm_restart(reboot_mode,cmd);

.

}

//arch\arm\kernel\setup.c

void _ _ init setup _ arch(char * * cmd line _ p)

{

struct machine _ desc * mde sc;

.

mde sc=setup _ machine _ FDT(_ _ ATA _ GS _ pointer);

.

if(mde sc-重启)

arm _ pm _ restart=mde sc-restart;

.

}

//arch\arm\mach-hi3516a\core.c

机器_启动(HI3516A,' HI3516A ')。atag_offset=0x100。map_io=hi3516a_map_io。init_early=hi3516a_init_early。init_irq=hi3516a_gic_init_irq。handle_irq=gic_handle_irq。TImer=hi3516a_sys_TImer。init_machine=hi3516a_init。reserve=hi3516a_reserve。restart=hi3516a_restart,

机器_结束

//arch\arm\mach-hi3516a\core.c

void hi3516a_restart(char模式,常量字符*cmd)

{

__raw_writel(~0,IO _ ADDRESS(SYS _ CTRL _ BASE)REG _ SC _ SYSRES);

}

//驱动程序\ MTD \设备\ his fc 350 \ his fc 350 _ hi 3516 a . c

#定义SYS_CTRL_BASE(0x20050000)

//arch \ arm \ mach-hi 3535 \包括\ mach \平台。h

#定义REG_SC_SYSRES0x4

标签:

版权声明:转载此文是出于传递更多信息之目的。若有来源标注错误或侵犯了您的合法权益,请作者持权属证明与本网联系,我们将及时更正、删除,谢谢您的支持与理解。