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

编程知识 更新时间:2023-04-27 07:42:41

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/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文件,重启系统。

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

 

 

 

更多推荐

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

本文发布于:2023-04-20 14:30:00,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/446fde747fdcd9ab68b7d997f316fbe6.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:orange   gpio   armbian   pi

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!

  • 90399文章数
  • 23314阅读数
  • 0评论数