Android6.0 开关机

本文介绍了在Android 6.0系统中如何通过GPIO进行开关机操作。开机流程涉及GPIO_19按键检测,GPIO6_31控制电源,内核驱动确保稳定状态。关机过程则涉及到长按GPIO_19触发系统逐层关闭,最后通过GPIO6_31切断电源。在内核中,kernel/reboot.c的kernel_power_off函数提供了灵活性,而具体的实现在driver/power/reset/gpio-poweroff.c驱动中完成。
摘要由CSDN通过智能技术生成

通过引脚来控制整版电源,控制方式如下图:

1) GPIO_19 做开关机按键检测

2) GPIO6_31做电源的控制IO


开机思路:当按下按键后mos4459的第四个引脚被拉低->管子导通->整版上电->系统启动->加载内核->内核中编写 驱动把GPIO6_31拉高->npn三极管8050导通->第四个IO继续被拉低,此时就可以松开送。大概就三四秒钟。

关机思路:开机后长按GPIO_19按键,这个按键会持续向上层发生关机信号,android会弹出关机提示,然后系统会一层层的关闭,最后切断电源即控制GPIO6_31拉低。

先讲下关机的实现,先看一个函数,Kernel_imx/kernel/reboot.c中:

SYSCALL_DEFINE4(reboot, int, magic1, int, magic2, unsigned int, cmd,
		void __user *, arg)
{
	struct pid_namespace *pid_ns = task_active_pid_ns(current);
	char buffer[256];
	int ret = 0;

	/* We only trust the superuser with rebooting the system. */
	if (!ns_capable(pid_ns->user_ns, CAP_SYS_BOOT))
		return -EPERM;

	/* For safety, we require "magic" arguments. */
	if (magic1 != LINUX_REBOOT_MAGIC1 ||
			(magic2 != LINUX_REBOOT_MAGIC2 &&
			magic2 != LINUX_REBOOT_MAGIC2A &&
			magic2 != LINUX_REBOOT_MAGIC2B &&
			magic2 != LINUX_REBOOT_MAGIC2C))
		return -EINVAL;

	/*
	 * If pid namespaces are enabled and the current task is in a child
	 * pid_namespace, the command is handled by reboot_pid_ns() which will
	 * call do_exit().
	 */
	ret = reboot_pid_ns(pid_ns, cmd);
	if (ret)
		return ret;

	/* Instead of trying to make the power_off co
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值