串口唤醒功能主要是从supernova 待机进入PM后,串口接收PC端口发送过来的特定字串,然后将主板唤醒的功能。与IR,KEYPAD,WOL,CEC,MHL 等等基本流程一致,触发源不一样而已。

待机前设置待机参数

    pstPMCfg->stPMWakeCfg.bPmWakeEnableIR = TRUE;
pstPMCfg->stPMWakeCfg.bPmWakeEnableSAR = TRUE;
pstPMCfg->stPMWakeCfg.bPmWakeEnableGPIO0 = FALSE;
pstPMCfg->stPMWakeCfg.bPmWakeEnableGPIO1 = FALSE;
pstPMCfg->stPMWakeCfg.bPmWakeEnableUART1 = TRUE;

bPmWakeEnableUART1 设置为FALSE,开启该口的唤醒功能,然后EnterSleepMode里面设置到PM里面

vendor\mstar\supernova\projects\msrv\control\src\MSrv_Control_common.cpp

mapi_interface::Get_mapi_system()->PowerDown(&stPMCfg,bTrigger);

PM 开启相关参数

开启PM_WK_UART_EN

vendor\mstar\pm\zenonia\Project\Mstar\Source\Configurations\cusProj_config.h

//-----Uart Wakeup---
#ifndef PM_WK_UART_EN
#define PM_WK_UART_EN 1
#endif

开启串口,设置串口波特率

vendor\mstar\pm\zenonia\Project\Mstar\Source\Configurations\cusProj_config.h
vendor\mstar\pm\zenonia\Project\Source\cus_config.h #define UART1_BAUDRATE 19200//38400//9600//38400
#define ENABLE_UART0 ENABLE

开启UART0 口,并设置串口波特率为19200(平台目前不支持115200)

设置UART口的寄存器CLK
vendor\mstar\pm\zenonia\Project\Source\customer.c

void Cus_Sys_ChangeUartForPllClk(U32 u32Mcu_Clk)
{
// Change MCU clock --> Change UART baud rate
#if ENABLE_UART0
ADCON |= 0x80;
S0RELL = (UART_CLKREL(u32Mcu_Clk, UART0_BAUDRATE) & 0xff);
S0RELH = ((UART_CLKREL(u32Mcu_Clk, UART0_BAUDRATE) >> ) & 0x3);
S0CON = 0x50;
PCON |= 0x80;
//S0BUF = (char)"*";
TI0=;
#endif #if ENABLE_UART1
S1RELL = (UART1_CLKREL(u32Mcu_Clk, UART1_BAUDRATE) & 0xff);
S1RELH = ((UART1_CLKREL(u32Mcu_Clk, UART1_BAUDRATE) >> ) & 0x3);
S1CON = 0x90; // mode 1, 8-bit UART, enable receive
S1CON |= BIT1;
#endif #if PM_WK_UART_EN
S1RELL = (UART_CLKREL(u32Mcu_Clk, UART1_BAUDRATE) & 0xff);
S1RELH = ((UART_CLKREL(u32Mcu_Clk, UART1_BAUDRATE) >> ) & 0x3);
S1CON = 0xd0;
PCON |= 0x80;
S1CON |= BIT1;
#endif
}

Cus_Sys_ChangeUartForPllClk 里面设置串口clk,配置好S1CON,PCON 否则后面无法获取到唤醒的字串。

设置唤醒字串
vendor\mstar\pm\zenonia\Project\Mstar\Source\CusProj_Inf.h

#if PM_WK_UART_EN
#define UART_WAKEUP_COMMAND "mstar"
#define UART_RECEIVED_TIMEOUT 0xFFFF
#endif

UART_WAKEUP_COMMAND 设置唤醒字串。

循环监听

BOOLEAN CusProj_InfUart1Polling(void)
{
U8 u8UartWakeupCmd[] = { };
U32 u32UartRxCount = ;
U32 u32UartRxTimeout = ; if(strlen(UART_WAKEUP_COMMAND) == )
return TRUE; while((u32UartRxTimeout < UART_RECEIVED_TIMEOUT) && (u32UartRxCount < strlen(UART_WAKEUP_COMMAND)))
{
//WriteByte(0x0EEC, ReadByte(0x0EEC)&(~BIT1));//swtich gpio_pm[5] to 51's uart_rx1 and gpio_pm[1] to 51's uart_tx1
//WriteByte(0x0EEC, ReadByte(0x0EEC)|(BIT0));//swtich gpio_pm[5] to 51's uart_rx1 and gpio_pm[1] to 51's uart_tx1
if (S1CON & BIT0) // UART1 have received a ascii data
{
//printf("S1BUF = 0x%x\n", S1BUF);
u8UartWakeupCmd[u32UartRxCount++] = S1BUF; if(u32UartRxCount == strlen(UART_WAKEUP_COMMAND))
{
if (strcmp(u8UartWakeupCmd, UART_WAKEUP_COMMAND) == )
{
u32UartRxCount = ;
return TRUE;
}
else
{
S1CON &= ~BIT0; // clear received flag
return FALSE;
}
} S1CON &= ~BIT0; // clear received flag
}
u32UartRxTimeout++;
} if (u32UartRxTimeout >= u32UartRxTimeout)
{
u32UartRxCount = ;
memset(u8UartWakeupCmd, , );
u32UartRxTimeout = ;
} return FALSE;
} void CusProj_InfUart1Isr(void)
{
if( Read2Byte(0x0F0A) & BIT8 ) //gpio_pm_5_fiq_final_status
{
if(CusProj_InfUart1Polling() == TRUE)
{
WriteByte(0x0E6B, (ReadByte(0x0E6B)&(~BIT1)));// disable swtich gpio_pm[5] to HK51's uart_rx1 and gpio_pm[1] to HK51's uart_tx1 MDrv_PM_PowerUp(PM_WKUP_UART); WriteByte(0x0F0A, (ReadByte(0x0F0A))|(BIT6)); //clear PAD_GPIO_PM5
WriteByte(0x0F0A, (ReadByte(0x0F0A))&(~BIT6)); WriteByte(0x0F0A, ReadByte(0x0F0A)&(~BIT7)); //gpio_pm_5_fiq_pol
WriteByte(0x0F0A, ReadByte(0x0F0A)|(BIT4)); //mask gpio_pm_5_fiq_mask
WriteByte(0x0F0A, ReadByte(0x0F0A)& ~(BIT0));// gpio_pm[5] is output enable
while();
}
else
{
WriteByte(0x0F0A, (ReadByte(0x0F0A))|(BIT6)); //clear PAD_GPIO_PM5
WriteByte(0x0F0A, (ReadByte(0x0F0A))&(~BIT6));
}
}
}

CusProj_InfUart1Polling 中通过S1BUF不停读取字串,与唤醒字串匹配后,就开是唤醒

唤醒

MDrv_PM_PowerUp(PM_WKUP_UART);

INTERFACE void MDrv_PM_PowerUp(PM_WkupSrc eWkupSrc);

PM 唤醒源如下:
typedef enum
{
PM_WKUP_NONE = , ///No wakeup event happens
PM_WKUP_IR = , ///Wakeup event IR
PM_WKUP_DVI = , ///Wakeup event DVI
PM_WKUP_DVI2 = , ///Wakeup event DVI2
PM_WKUP_CEC = , ///Wakeup event CEC
PM_WKUP_SAR = , ///Wakeup event SAR
PM_WKUP_ESYNC = , ///Wakeup event ESYNC
PM_WKUP_SYNC = , ///Wakeup event SYNC
PM_WKUP_RTC = , ///Wakeup event RTC
PM_WKUP_RTC2 = , ///Wakeup event RTC2
PM_WKUP_AVLINK = ,///Wakeup event AVLINK
PM_WKUP_UART = , ///Wakeup event UART
PM_WKUP_GPIO = , ///Wakeup event GPIO
PM_WKUP_MHL = , ///Wakeup event MHL
PM_WKUP_WOL = ///Wakeup event WOL
//13~15: reserved
} PM_WkupSrc;

通过PM_WKUP_UART 事件唤醒。

Mstar 平台(648)唤醒之串口唤醒的更多相关文章

  1. mstar 平台I2C 配置

    芯片的pin 脚可以用作不同的功能,总结一句就是外设进行状态和数据交换. 最常用的是作为GPIO,设置为输出模式时,通过高低电平来控制一些外围设置:// 如LED,屏的电源,背光的开关,功放的静音等等 ...

  2. Android:Mstar平台 HDMI OUT 静音流程

    一.framework层 1. APP调用 AudioManager 的 adjustStreamVolume() 接口实现在: frameworks\base\services\core\java\ ...

  3. MSTAR 平台

    MApp_Menu.c ZUI_exefunc.h //菜单属性 MApp_ZUI_APItables.h #define GETWNDINFO(hwnd) (&g_GUI_WindowLis ...

  4. android 休眠唤醒机制分析(三) — suspend

    本文转自:http://blog.csdn.net/g_salamander/article/details/7988340 前面我们分析了休眠的第一个阶段即浅度休眠,现在我们继续看休眠的第二个阶段 ...

  5. 【原创】STM32低功耗模式及中断唤醒(基于BMI160及RTC)的研究

    预研目标 六轴静止时,终端进入低功耗模式:六轴震动时,终端正常工作模式,从而极大减少非工作时的电流消耗. 解决方案 机器静止时,依据六轴算法,CPU进入休眠(停止)模式:机器工作时,触发六轴中断唤醒C ...

  6. 【工业串口和网络软件通讯平台(SuperIO)教程】八.SuperIO通讯机制与设备驱动对接的说明

    SuperIO相关资料下载:http://pan.baidu.com/s/1pJ7lZWf 1.1    通讯机制说明 通讯的总体机制采用呼叫应答方式,就是上位机软件主动发送请求数据命令,下位机终端接 ...

  7. Java多线程系列--“基础篇”05之 线程等待与唤醒

    概要 本章,会对线程等待/唤醒方法进行介绍.涉及到的内容包括:1. wait(), notify(), notifyAll()等方法介绍2. wait()和notify()3. wait(long t ...

  8. java多线程系类:基础篇:05线程的等待与唤醒

    概要 本章,会对线程等待/唤醒方法进行介绍.涉及到的内容包括:1. wait(), notify(), notifyAll()等方法介绍2. wait()和notify()3. wait(long t ...

  9. java 多线程—— 线程等待与唤醒

    java 多线程 目录: Java 多线程——基础知识 Java 多线程 —— synchronized关键字 java 多线程——一个定时调度的例子 java 多线程——quartz 定时调度的例子 ...

随机推荐

  1. 解决Ubuntu18.10 网络图标经常消失连不上网问题

    我不知道是什么原因,Ubuntu虚拟机经常会出现无法上网的问题? 此时右上角没有网络标志,Settings->NetWork也只有VPN一项,不知道咋用. 在网上终于找到了方法,亲测有效:htt ...

  2. 上传文本到hdfs上的一些命令

    在hadoop下创建文件夹 bin/hdfs dfs -mkdir -p /usr/hadoop/spark/ touch wc.input  写一些文本进去. 上传到hdfs上  bin/hdfs ...

  3. springboot-发布jar包

    其他参考链接: https://www.cnblogs.com/blog5277/p/5920560.html 环境变量配置: 新建系统变量MAVEN_HOME: 在path中添加: ;%MAVEN_ ...

  4. Spark ML协同过滤推荐算法

    一.简介 协同过滤算法[Collaborative Filtering Recommendation]算法是最经典.最常用的推荐算法.该算法通过分析用户兴趣,在用户群中找到指定用户的相似用户,综合这些 ...

  5. 学习Spring5源码时所遇到的坑

    学习Spring5源码时所遇到的坑 0)本人下载的源码版本是 spring-framework-5.0.2.RELEASE 配置好gradle环境变量之后,cmd进入到spring项目,执行gradl ...

  6. mysql 外键的基本使用

    外键的使用条件: 两个表必须是InnoDB表,MyISAM表暂时不支持外键外键列必须建立了索引,MySQL 4.1.2以后的版本在建立外键时会自动创建索引,但如果在较早的版本则需要显式建立:外键关系的 ...

  7. 网络文件系统-NFS

    1. 什么是NFS NFS是 Network File System 的缩写,即网络文件系统.一种使用于分散式文件系统的协议,有Sun公司开发,于1984年向外公布.功能是通过网络让不同的机器.不同的 ...

  8. dfs 排列组合——找所有子集(重复元素和不重复元素)

    17. 子集 中文 English 给定一个含不同整数的集合,返回其所有的子集. 样例 样例 1: 输入:[0] 输出: [ [], [0] ] 样例 2: 输入:[1,2,3] 输出: [ [3], ...

  9. javascript---call,apply,bind

    对于这三个函数,估计大家都还是很模糊,具体是用来干什么?简而言之,是用来对象冒充的. 首先这三个方法是每个函数都包含的非继承的的方法. 我来搬砖一下,此文引用 http://www.cnblogs.c ...

  10. P5325 【模板】Min_25筛

    题意:定义积性函数f(x)f(x)f(x),且f(p^k)=p^k*(p^k−1)   (p是一个质数),求f(1)+f(2)+...f(n); 思路:板子题.重新打了一份装起来. /* 定义积性函数 ...