如何通过PMC_GPIO唤醒versal linux系统

作者:Davis Zhang,AMD工程师;来源:AMD开发者社区

在功耗敏感的系统里,我们通常会在系统空闲的时候将系统休眠,然后可以通过一些外设的输入来唤醒系统,比如uart、USB和GPIO。Versal系统的休眠唤醒指导页面和MPSoC系统在同一个wiki网页。本文将通过PMC_GPIO作为例子来描述如何唤醒Versal系统。

我们这里采用VPK120板卡作为平台,这个板卡上面没有通过PMC MIO连接GPIO器件,所以我们需要使用PMC EMIO来实现GPIO。我们可以在VPK120 Petalinux BSP里的vivado工程基础上增加PMC_GPIO_EMIO。

1. 首先打开vivado工程进入CIPS core配置界面并使能PMC_GPIO_EMIO,板卡上有两个button器件连接到了两个PL管脚,所以位宽选择为2。这两个button在板卡上分为名为SW4和SW5。

2. 这时CIPS core的界面上会多出PMC_GPIO端口,右键点击这个端口,菜单中选择“Make External Pins”可以把这个接口的两个GPIO信号连接到PL管脚,我们需要在XDC约束文件里增加这两个管脚的约束。

3. 最后完成implementation并导出XSA。附件里有预先做好的block design tcl脚本、顶层wrapper和约束文件。可以用它们直接创建vivado工程。

4. 导出XSA后,可以用下面命令将XSA导入VPK120 petalinux BSP里的petalinux工程。

Petalinux-config –get-hw-description=<directory_to_xsa> --silentconfig

5. 按照上面提到的wiki页面里对GPIO的要求配置kernel,并在“project-spec/meta-user/recipes-bsp/device-tree/files/system-user.dtsi“里增加gpio-keys节点。

/include/ "system-conf.dtsi"
/ {
    gpio-keys {
  compatible = "gpio-keys";


  switch-4 {
                      debounce-interval = <10>;
   label = "sw4";
   gpios = <&gpio1 0x34 0x0>;
   linux,code = <0x8f>;
   wakeup-source;
  };

 };

};

6. 在2023.2版本里,ATF和PLM需要两个patch来支持GPIO唤醒。使用下面方法将两个patch应用到petalinux工程,最后执行petalinux-build命令。 

  1. 将ATF patch "0001-fix-xilinx-map-PMC_GPIO-device-node-to-interrupt-for 1.patch"拷贝到“project-spec/meta-user/recipes-bsp/arm-trusted-firmware/files/”,如果没有这个路径就手动创建。

  2. 执行下面命令创建“arm-trusted-firmware_%.bbappend”文件。

$ vim <plnx-proj-root>/project-spec/meta-user/recipes-bsp/arm-trusted-firmware/arm-trusted-firmware_%.bbappend

C. 将下面内容拷贝到“arm-trusted-firmware_%.bbappend”并保存。

SRC_URI_append = " \

    file://0001-fix-xilinx-map-PMC_GPIO-device-node-to-interrupt-for 1.patch \

"

FILESEXTRAPATHS_prepend := "${THISDIR}/files:"

d. 执行下面命令。

$ petalinux-build -c arm-trusted-firmware -x cleansstate

$ petalinux-build -c arm-trusted-firmware

e. 参考这个wiki页面,将PLM patch文件“0001-xilpm-versal-server-Add-entry-for-PMC_GPIO-in-Wakeup.patch”应用到petalinux工程。

7. 使用下面命令使系统休眠。使用下面命令使能gpio为wakeup source。

$ echo enabled > /sys/devices/platform/gpio-keys/power/wakeup

8. 使用下面命令使系统休眠。

$ echo mem > /sys/power/state

9. 按动板卡上的SW4 button,linux系统就会唤醒。

最新文章

最新文章