This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

am3358 如何用gpio0_20做休眠唤醒,sdk包是TI_Android_JB_4.2.2_DevKit_4.1.1

Other Parts Discussed in Thread: AM3358, AM3354

am3358 如何用gpio0_20做休眠的唤醒源

  • 请问有没有哪位可以回复下如何实现,谢谢

  • 主要确保你的GPIO0_20的pinmux模式设置是正确的,receive enable的,然后确保这个中断是打开的,进入休眠后,就可以使用该管教唤醒了。

  • Dear  

      如何把gpio0_20设置为receive enable的,谢谢。我是这样设置{"xdma_event_intr1.gpio0_20",    OMAP_MUX_MODE7 | AM33XX_PIN_INPUT }

  • pinmux这样设置应该是ok的。另外,建议你在进入系统了之后通过的devmem2 + 物理地址的方式访问实际物理寄存器的地址,直接查看相关的设置是否生效。

  • 不知道用的命令是否正确,我在命令行嵌入devmem2,说没这个命令,请帮忙更正下,谢谢。

    root@android:/ # devmem2
    /system/bin/sh: devmem2: not found

  • 我不确定在android系统上的情况,目前TI只有Linux的支持,默认的Linux SDK中都有该命令,使用如下:

  •  在linux那个版本,我用这个io是可以唤醒的,但android不行。另外,linux版本上的那个sdk在休眠情况下,用串口也是可以唤醒的,但这个android的不行。板子是一样的。麻烦你帮忙分析下,谢谢。

  • 另外,我用gpio0_20这个io做按键,上报power key是可以让系统休眠的,但是休眠后,按此按键是不能唤醒系统的。说明没休眠前,该io的中断是ok的,而且也把该io注册为device wakeup的。

  • 只有这一个按键不能唤醒,还是说这种情况下你所有的GPIO0的bank都是唤醒有问题的?

  • 所有都不能唤醒,包括串口的tx,rx

  • 这是整个休眠都无法唤醒,不是某个唤醒源的问题吧?

    我建议可以先尝试排除一下是不是休眠固件有问题。因TI为没有android的支持资源,现在已经完全交给adeneo来支持了。http://www.adeneo-embedded.com/

    从我个人的建议来说,我不确定android底层是不是完全一致,但觉得你可以对着看一下sleep33xx.s和firmware的固件是不是和Linux类似的,如果类似的话,你copy可以正常休眠的固件am335x-pm-fireware.bin到android下面,然后clean掉,再编译。PS:一定要clean,再编。

  • 对比下sleep33x.s的东西,差别好大哦。

    sleep33x.rar
  • 楼主,你的问题解决了吗?如何解决的?

    我也碰到了同样的问题,我们的产品是基于TI-Android-ICS-4.0.3_AM335x_3.0.1开发的,该版本只支持mem休眠模式。我们的Power Key连接到gpio0_3,休眠后不能唤醒,现象跟你的一样。

    我尝试移植了TI_Android_JB_4.2.2_DevKit_4.1.1中休眠相关代码,该版本支持mem和standby两种休眠模式,mem模式与Android 4.0.3版本一个样,可以休眠,但不能唤醒;standby模式可以休眠,也可以唤醒,但唤醒后会立即休眠,操作过程中,内核有一半概率会崩溃(Oops),出错位置不固定,但都指向内存页面错误。

  • 没有呢,都不知道如何解决,我把我的配置给支持工程师看,说配置没问题,但是就是不能唤醒。

  • 哈哈,我的standby模式刚刚测试OK了,mem模式还没测试。

    也没做什么,就是把wakelock.c中多余的log开关关闭(我调试时全部打开了),clean build后就没有Oops了。

    唤醒时要长按(约1秒吧)Power Key,短按的话,唤醒后会立即休眠。

  • 那你测试ok后,不知道是否可以共享一下这部分的配置和修改的地方,学习下呢

  • 您好,能不能弄一个详细材料。让我们后续的人,可以学习一下。这个资源,挺重要的

  • 我的情况较复杂,对你们来说不一定适用,不过还是简单说下吧!

    平台信息:AM3354,TI-Android-ICS-4.0.3_AM335x_3.0.1,基于am335xevm,没有电池,我们需要休眠模式不是为了省电,而是为了支持一些特殊的功能。


    Android 4.0.3这个版本只支持DS0 mode,不支持Standby mode。正如前面所说的,DS0只能休眠,无法唤醒。休眠后测得主时钟(OSC0,24MHz)被关闭,DDR_CKE从1.0~1.2VDC降到0.4~0.6VDC,电压不太稳,不知道会不会有问题,休眠后的电压范围也不确定是否正常,不过串口log显示是休眠成功了的。至于GPIO,我用的是GPIO0_3,因为只是临时调试用,所以,简单做如下修改(后面调试Standby Mode也是这样用的):

    -------------------------------------------------------------

    kernel/arch/arm/mach-omap2/board-am335xevm.c

    --> am335x_evm_volume_gpio_buttons[]

    将KEY_VOLUMEDOWN改成KEY_POWER

    device/ti/am335xevm/gpio-keys.kl

    添加

    key 116   POWER   WAKE

    -------------------------------------------------------------

    另外,am335xevm这个平台需要修改hw.nopm属性设置,如下

    -------------------------------------------------------------

    device/ti/am335xevm/init.rc

    # Power Management Patches

        setprop hw.nopm true

    改成

        setprop hw.nopm false

    或者直接注释掉也行。

    -------------------------------------------------------------

    否则Power Key按下不会休眠,详细过程请参考frameworks/base/services/java/com/android/server/PowerManagerService.java中hw.nopm相关代码。

    在折腾了一天后,DS0还是无法唤醒,所以,我移植了TI_Android_JB_4.2.2_DevKit_4.1.1中的休眠相关代码,直接拷贝kernel/arch/arm/mach-omap2/sleep33xx.S过来,然后围绕它来移植,编译通过后再把kernel/firmware/am335x-pm-firmware.bin拷贝过来。


    另外,由于我们使用外部RTC,以前已经在kernel/arch/arm/mach-omap2/board-am335xevm.c中取消了rtc的初始化,但没删除rtc设备注册部份,参考Steven Liu针对Linux平台休眠唤醒的说明,也注释掉rtc设备注册,当然,不一定与它有关,我没回退去验证过,不过也应该要注释掉就保留了。

    -------------------------------------------------------------

    kernel/arch/arm/mach-omap2/omap_hwmod_33xx_data.c

    --> *am33xx_hwmods[]

    --> //&am33xx_rtc_hwmod,

    -------------------------------------------------------------

    最后,做如下修改,让Android默认设置的是Standby Mode

    -------------------------------------------------------------

    hardware/libhardware_legacy/power/power.c

    static const char *off_state = "mem";

    改成

     static const char *off_state = "standby";

    -------------------------------------------------------------

    还有就是,今天尝试测试了DS0 Mode,仍然是只能休眠,不能唤醒。不过Standby Mode已经能满足我们的需求了。

  • 各位在Android 4.2.2中调试DS0 OK后也分享出来下,AM335x平台的Android相关资料太少了,就像前面那位朋友说的,太重要了。

    说起Android 4.0.3真是一个悲催的版本,很多功能支持不全。之前调试WiFi时也是,为了支持P2P和Station的concurrent模式(能一起打开),我把整个WiFi系统全部移植了一遍;后来为了支持Nand Flash的BCH8,又把u-boot全部移植了一遍;现在又是这个Sleep的问题。无赖产品一开始就是基于这个版本开发的,现在也比较稳定了,不想全部重来一遍,不然真想直接使用Android 4.2.2。

  • TI_Android_JB_4.2.2_DevKit_4.1.1的如果是standby很简单,直接改下面这个文件

    TI_Android_JB_4.2.2_DevKit_4.1.1/system/core$ vi libsuspend/autosuspend_earlysuspend.c

    把mem改为standby就行

    //static const char *pwr_state_mem = "mem";

     static const char *pwr_state_mem = "standby";

     

    但发现一个问题,就是Suspending console(s) (use no_console_suspend to debug)后要过一会才能通过按键唤醒。