用gpio来休眠与唤醒orange pi 3(armbian)

1、 linux的几个状态

freeze

standby

mem

disk

可在/sys/power中查看状态

cd到/sys/power之后可以“cat state”查看支持的状态

以root权限使用“echo xxx > /sys/power/state”来改变状态。其中xxx可以是standby,freeze,mem,disk等

 

2、 选择gpio

orange pi 3使用的是allwinner H6 CPU。它所有代唤醒(wakeup)功能的引脚都在PL口上。不同于PA、PB,PC,PD...等端口。这个端口在设备树中的表示也是不同的:

PA~PK口分别用0~10表示。在设备树中通常是这样表示的 :

gpios = <&pio 0 11 GPIO_ACTIVE_HIGH>;  // PA11

gpios = <&pio 3 9 GPIO_ACTIVE_HIGH>;   // PD9

而PL口上通常这样表示

gpios = <&r_pio 0 8 GPIO_ACTIVE_HIGH>;  // PL8

可以看出分别PL口的独特性.另外似乎PM也支持wakeup功能。

再有一个相关的问题就是gpio-keys的键码可参考https://github.com/torvalds/linux/blob/master/include/uapi/linux/input-event-codes.h

这里面定义了KEY_POWER,KEY_WAKEUP等的code。

 

4、 配置设备树

4.1 编写

编写支持gpio-keys的dts文件.不妨叫做gpio-pin-wakeup.dts: 

/dts-v1/;
/plugin/;

/ {
	compatible = "allwinner,sun8i-h3";

	fragment@0 {
		
		target = <&pio>;
		__overlay__ {
			poweroff_pins:poweroff_pins {
        		allwinner,pins = "PA13";
        		allwinner,function = "gpio_out";

			};
		};
	};

	fragment@1 {
	
		target-path = "/";
        	__overlay__ {
            		poweroff: poweroff {
                	compatible = "gpio-poweroff";
                	gpios = <&pio 0 13 1>;
 			};
    		};
	};
};

注意PL10暂不能使用,因为它已经被分配给了BT-WIFI-ON,具体可以查看原理图。事实上如果不改动系统文件,目前只有PL8是可自由使用的。另外似乎PM也可用于唤醒源。但是它也已经被完全占用了。

同时不妨再分配一个sleep按钮,设备树如下:

/dts-v1/;
/plugin/;

/ {
	compatible = "allwinner,sun50i-h6";
	/*
	 * This fragment is needed only for the internal pull-up activation,
	 * external pull-up resistor is highly recommended if using long wires
	 */
	fragment@0 {
		target = <&pio>;
		__overlay__ {
			gpio_but_sleep: gpio_but_sleep {
				pins = "PH3";
				function = "gpio_in";
				bias-pull-up;
			};
		};
	};

	fragment@1 {
		target-path = "/";
		__overlay__ {
			gpio-keys-user {
				/*
				 * Use "gpio-keys" for EINT capable pins, "gpio-keys-polled" for other pins
				 * add "poll-interval" property if using "gpio-keys-polled"
				 */
				compatible = "gpio-keys";
				autorepeat;
				pinctrl-names = "default";
				pinctrl-0 = <&gpio_but_sleep>;

				sleep_button {
					label = "KEY_SLEEP";
					linux,code = <142>; /* KEY_SLEEP, see include/uapi/linux/input-event-codes.h */
					linux,input-type = <1>;     // EV_KEY
					gpios = <&pio 7 3 1>; /* PD15 GPIO_ACTIVE_LOW */ 
					gpio-key;
				};
			};
		};
	};
};

将这个设备树文件叫做gpio-key-sleep.dts

4.2 编译

armbian支持arrmbian-add-overlay,但不幸的是它恰恰不支持H6.现需要自己编写完成dts之后用dtc命令编译成dtbo文件。

dtc -@ -q -I dts -O dtb -o gpio-key-wakeup.dtbo gpio-key-wakeup.dts

dtc -@ -q -I dts -O dtb -o gpio-key-sleep.dtbo gpio-key-sleep.dts

 

4.3 配置armbianEnv.txt

在其中添加一行:

user_overlays=gpio-key-wakeup gpio-key-sleep

5、测试

可进入root权限后使用

cat /sys/power来获取当前支持的几种sleep模式

使用echo xxx > /sys/power/state来进入想要的状态

另外在配置之后还可以使用evtest来测试中断源是否正常.

 

 

6、 流程归纳

首先选择具有中断可作为唤醒源的按键,然后编写设备树dts源文件,编译设备树overlay的dtbo文件,接着将编译好的dtbo文件放到/boot/overlay-user文件夹中。最后修改armbianEnv.txt文件,重启系统。

尽管看似流程简单,中间设计很多细节。竟然搞了两天时间。总在细枝末节上折腾,什么时候才能游刃有余?

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值